From ac7a9183aa3c1b9a117c5546af3c4acff4301a38 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 24 Jan 2019 00:02:51 +0100 Subject: [PATCH 001/164] - re-applied the changes for p_spec.cpp This is mostly map loader code which really should not operate on the global level. --- src/actor.h | 5 +- src/actorinlines.h | 3 +- src/g_levellocals.h | 1 + src/maploader/maploader.h | 2 + src/p_3dfloors.cpp | 3 +- src/p_acs.cpp | 2 +- src/p_lnspec.cpp | 10 +- src/p_mobj.cpp | 10 -- src/p_spec.cpp | 173 ++++++++++++++++-------------- src/p_spec.h | 13 +-- src/p_tick.cpp | 2 +- src/scripting/vmthunks_actors.cpp | 4 +- 12 files changed, 114 insertions(+), 114 deletions(-) diff --git a/src/actor.h b/src/actor.h index a89f0a744..1c9c053e6 100644 --- a/src/actor.h +++ b/src/actor.h @@ -54,6 +54,7 @@ struct FPortalGroupArray; struct visstyle_t; class FLightDefaults; struct FSection; +struct FLevelLocals; // // NOTES: AActor // @@ -637,8 +638,8 @@ class AActor : public DThinker DECLARE_CLASS_WITH_META (AActor, DThinker, PClassActor) HAS_OBJECT_POINTERS public: - AActor () throw(); - AActor (const AActor &other) throw(); + AActor() = default; + AActor(const AActor &other) = delete; // Calling this would be disastrous. AActor &operator= (const AActor &other); ~AActor (); diff --git a/src/actorinlines.h b/src/actorinlines.h index 091160fca..408835524 100644 --- a/src/actorinlines.h +++ b/src/actorinlines.h @@ -92,4 +92,5 @@ inline double AActor::AttackOffset(double offset) return 8 + offset; } -} \ No newline at end of file +} + diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 1dbb19b4c..21411107f 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -112,6 +112,7 @@ struct FLevelLocals : public FLevelData void SetMusicVolume(float v); void ClearLevelData(); void ClearPortals(); + bool CheckIfExitIsGood(AActor *self, level_info_t *newmap); uint8_t md5[16]; // for savegame validation. If the MD5 does not match the savegame won't be loaded. int time; // time in the hub diff --git a/src/maploader/maploader.h b/src/maploader/maploader.h index 38a68b0fa..38fd636e0 100644 --- a/src/maploader/maploader.h +++ b/src/maploader/maploader.h @@ -96,7 +96,9 @@ class MapLoader { friend class UDMFParser; void *level; // this is to hide the global variable and produce an error for referencing it. +public: FLevelLocals *Level; +private: int firstglvertex; // helpers for loading GL nodes from GWA files. bool format5; diff --git a/src/p_3dfloors.cpp b/src/p_3dfloors.cpp index 5e8d05359..b962c612c 100644 --- a/src/p_3dfloors.cpp +++ b/src/p_3dfloors.cpp @@ -332,8 +332,7 @@ void P_PlayerOnSpecial3DFloor(player_t* player) P_PlayerInSpecialSector(player, rover->model); // Apply flat specials (using the ceiling!) - P_PlayerOnSpecialFlat( - player, rover->model->GetTerrain(rover->top.isceiling)); + P_PlayerOnSpecialFlat(player, rover->model->GetTerrain(rover->top.isceiling)); break; } diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 5c4749dec..fdd61762b 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -9928,7 +9928,7 @@ scriptwait: int flags = STACK(1); sp -= 5; - P_SectorDamage(tag, amount, type, protectClass, flags); + P_SectorDamage(&level, tag, amount, type, protectClass, flags); } break; diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index be79b0079..ed6d44e0a 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -1060,7 +1060,7 @@ FUNC(LS_Generic_Lift) FUNC(LS_Exit_Normal) // Exit_Normal (position) { - if (CheckIfExitIsGood (it, FindLevelInfo(G_GetExitMap()))) + if (level.CheckIfExitIsGood (it, FindLevelInfo(G_GetExitMap()))) { G_ExitLevel (arg0, false); return true; @@ -1071,7 +1071,7 @@ FUNC(LS_Exit_Normal) FUNC(LS_Exit_Secret) // Exit_Secret (position) { - if (CheckIfExitIsGood (it, FindLevelInfo(G_GetSecretExitMap()))) + if (level.CheckIfExitIsGood (it, FindLevelInfo(G_GetSecretExitMap()))) { G_SecretExitLevel (arg0); return true; @@ -1086,7 +1086,7 @@ FUNC(LS_Teleport_NewMap) { level_info_t *info = FindLevelByNum (arg0); - if (info && CheckIfExitIsGood (it, info)) + if (info && level.CheckIfExitIsGood (it, info)) { G_ChangeLevel(info->MapName, arg1, arg2 ? CHANGELEVEL_KEEPFACING : 0); return true; @@ -1181,7 +1181,7 @@ FUNC(LS_TeleportInSector) FUNC(LS_Teleport_EndGame) // Teleport_EndGame () { - if (!backSide && CheckIfExitIsGood (it, NULL)) + if (!backSide && level.CheckIfExitIsGood (it, NULL)) { G_ChangeLevel(NULL, 0, 0); return true; @@ -2252,7 +2252,7 @@ FUNC(LS_Sector_SetCurrent) FUNC(LS_Sector_SetFriction) // Sector_SetFriction (tag, amount) { - P_SetSectorFriction (arg0, arg1, true); + P_SetSectorFriction (&level, arg0, arg1, true); return true; } diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 3aeed82ff..feac7212c 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -401,16 +401,6 @@ void AActor::PostSerialize() -AActor::AActor () throw() -{ -} - -AActor::AActor (const AActor &other) throw() - : DThinker() -{ - memcpy (&snext, &other.snext, (uint8_t *)&this[1] - (uint8_t *)&snext); -} - AActor &AActor::operator= (const AActor &other) { memcpy (&snext, &other.snext, (uint8_t *)&this[1] - (uint8_t *)&snext); diff --git a/src/p_spec.cpp b/src/p_spec.cpp index 4c37e48ea..a4e24560b 100644 --- a/src/p_spec.cpp +++ b/src/p_spec.cpp @@ -107,21 +107,21 @@ EXTERN_CVAR(Bool, cl_predict_specials) // killough 3/7/98: Initialize generalized scrolling void P_SpawnScrollers(FLevelLocals *Level); -static void P_SpawnFriction (); // phares 3/16/98 +static void P_SpawnFriction (FLevelLocals *l); // phares 3/16/98 void P_SpawnPushers (); // phares 3/20/98 // [RH] Check dmflags for noexit and respond accordingly -bool CheckIfExitIsGood (AActor *self, level_info_t *info) +bool FLevelLocals::CheckIfExitIsGood (AActor *self, level_info_t *info) { - cluster_info_t *cluster; + cluster_info_t *clusterdef; // The world can always exit itself. if (self == NULL) return true; - // We must kill all monsters to exit the level. - if ((dmflags2 & DF2_KILL_MONSTERS) && level.killed_monsters != level.total_monsters) + // We must kill all monsters to exit the Level + if ((dmflags2 & DF2_KILL_MONSTERS) && killed_monsters != total_monsters) return false; // Is this a deathmatch game and we're not allowed to exit? @@ -134,15 +134,15 @@ bool CheckIfExitIsGood (AActor *self, level_info_t *info) if (self->health <= 0 && !multiplayer && info != NULL && - info->cluster == level.cluster && - (cluster = FindClusterInfo(level.cluster)) != NULL && - cluster->flags & CLUSTER_HUB) + info->cluster == cluster && + (clusterdef = FindClusterInfo(cluster)) != NULL && + clusterdef->flags & CLUSTER_HUB) { return false; } if (deathmatch && gameaction != ga_completed) { - Printf ("%s exited the level.\n", self->player->userinfo.GetName()); + Printf ("%s exited the level\n", self->player->userinfo.GetName()); } return true; } @@ -253,6 +253,7 @@ DEFINE_ACTION_FUNCTION(_Line, RemoteActivate) bool P_TestActivateLine (line_t *line, AActor *mo, int side, int activationType, DVector3 *optpos) { + auto Level = &level; int lineActivation = line->activation; if (line->flags & ML_FIRSTSIDEONLY && side == 1) @@ -315,7 +316,7 @@ bool P_TestActivateLine (line_t *line, AActor *mo, int side, int activationType, // lax activation checks, monsters can also activate certain lines // even without them being marked as monster activate-able. This is // the default for non-Hexen maps in Hexen format. - if (!(level.flags2 & LEVEL2_LAXMONSTERACTIVATION)) + if (!(Level->flags2 & LEVEL2_LAXMONSTERACTIVATION)) { return false; } @@ -438,6 +439,8 @@ void P_PlayerInSpecialSector (player_t *player, sector_t * sector) // Has hit ground. AActor *ironfeet; + auto Level = &level; + // [RH] Apply any customizable damage if (sector->damageamount > 0) { @@ -459,7 +462,7 @@ void P_PlayerInSpecialSector (player_t *player, sector_t * sector) player->hazardtype = sector->damagetype; player->hazardinterval = sector->damageinterval; } - else if (level.time % sector->damageinterval == 0) + else if (Level->time % sector->damageinterval == 0) { if (!(player->cheats & (CF_GODMODE|CF_GODMODE2))) P_DamageMobj(player->mo, NULL, NULL, sector->damageamount, sector->damagetype); if ((sector->Flags & SECF_ENDLEVEL) && player->health <= 10 && (!deathmatch || !(dmflags & DF_NO_EXIT))) @@ -475,7 +478,7 @@ void P_PlayerInSpecialSector (player_t *player, sector_t * sector) } else if (sector->damageamount < 0) { - if (level.time % sector->damageinterval == 0) + if (Level->time % sector->damageinterval == 0) { P_GiveBody(player->mo, -sector->damageamount, 100); } @@ -484,7 +487,7 @@ void P_PlayerInSpecialSector (player_t *player, sector_t * sector) if (sector->isSecret()) { sector->ClearSecret(); - P_GiveSecret(player->mo, true, true, sector->Index()); + P_GiveSecret(Level, player->mo, true, true, sector->Index()); } } @@ -518,14 +521,14 @@ static void DoSectorDamage(AActor *actor, sector_t *sec, int amount, FName type, P_DamageMobj (actor, NULL, NULL, amount, type, dflags); } -void P_SectorDamage(int tag, int amount, FName type, PClassActor *protectClass, int flags) +void P_SectorDamage(FLevelLocals *Level, int tag, int amount, FName type, PClassActor *protectClass, int flags) { FSectorTagIterator itr(tag); int secnum; while ((secnum = itr.Next()) >= 0) { AActor *actor, *next; - sector_t *sec = &level.sectors[secnum]; + sector_t *sec = &Level->sectors[secnum]; // Do for actors in this sector. for (actor = sec->thinglist; actor != NULL; actor = next) @@ -579,7 +582,7 @@ void P_SectorDamage(int tag, int amount, FName type, PClassActor *protectClass, CVAR(Bool, showsecretsector, false, 0) CVAR(Bool, cl_showsecretmessage, true, CVAR_ARCHIVE) -void P_GiveSecret(AActor *actor, bool printmessage, bool playsound, int sectornum) +void P_GiveSecret(FLevelLocals *Level, AActor *actor, bool printmessage, bool playsound, int sectornum) { if (actor != NULL) { @@ -610,16 +613,16 @@ void P_GiveSecret(AActor *actor, bool printmessage, bool playsound, int sectornu if (playsound) S_Sound (CHAN_AUTO | CHAN_UI, "misc/secret", 1, ATTN_NORM); } } - level.found_secrets++; + Level->found_secrets++; } DEFINE_ACTION_FUNCTION(FLevelLocals, GiveSecret) { - PARAM_PROLOGUE; + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); PARAM_OBJECT(activator, AActor); PARAM_BOOL(printmessage); PARAM_BOOL(playsound); - P_GiveSecret(activator, printmessage, playsound, -1); + P_GiveSecret(self, activator, printmessage, playsound, -1); return 0; } @@ -631,8 +634,10 @@ DEFINE_ACTION_FUNCTION(FLevelLocals, GiveSecret) void P_PlayerOnSpecialFlat (player_t *player, int floorType) { + auto Level = &level; + if (Terrains[floorType].DamageAmount && - !(level.time & Terrains[floorType].DamageTimeMask)) + !(Level->time & Terrains[floorType].DamageTimeMask)) { AActor *ironfeet = NULL; @@ -669,12 +674,12 @@ void P_PlayerOnSpecialFlat (player_t *player, int floorType) // EXTERN_CVAR (Float, timelimit) -void P_UpdateSpecials () +void P_UpdateSpecials (FLevelLocals *Level) { // LEVEL TIMER if (deathmatch && timelimit) { - if (level.maptime >= (int)(timelimit * TICRATE * 60)) + if (Level->maptime >= (int)(timelimit * TICRATE * 60)) { Printf ("%s\n", GStrings("TXT_TIMELIMIT")); G_ExitLevel(0, false); @@ -692,7 +697,8 @@ CUSTOM_CVAR (Bool, forcewater, false, CVAR_ARCHIVE|CVAR_SERVERINFO) { if (gamestate == GS_LEVEL) { - for (auto &sec : level.sectors) + auto Level = &level; + for (auto &sec : Level->sectors) { sector_t *hsec = sec.GetHeightSec(); if (hsec && !(hsec->MoreFlags & SECMF_UNDERWATER)) @@ -721,7 +727,7 @@ public: void Tick (); protected: - static void DoTransfer (int level, int target, bool floor); + void DoTransfer (int level, int target, bool floor); sector_t *Source; int TargetTag; @@ -749,17 +755,18 @@ DLightTransfer::DLightTransfer (sector_t *srcSec, int target, bool copyFloor) CopyFloor = copyFloor; DoTransfer (LastLight = srcSec->lightlevel, target, copyFloor); + auto Level = &level; if (copyFloor) { FSectorTagIterator itr(target); while ((secnum = itr.Next()) >= 0) - level.sectors[secnum].ChangeFlags(sector_t::floor, 0, PLANEF_ABSLIGHTING); + Level->sectors[secnum].ChangeFlags(sector_t::floor, 0, PLANEF_ABSLIGHTING); } else { FSectorTagIterator itr(target); while ((secnum = itr.Next()) >= 0) - level.sectors[secnum].ChangeFlags(sector_t::ceiling, 0, PLANEF_ABSLIGHTING); + Level->sectors[secnum].ChangeFlags(sector_t::ceiling, 0, PLANEF_ABSLIGHTING); } ChangeStatNum (STAT_LIGHTTRANSFER); } @@ -779,17 +786,18 @@ void DLightTransfer::DoTransfer (int llevel, int target, bool floor) { int secnum; + auto Level = &level; if (floor) { FSectorTagIterator itr(target); while ((secnum = itr.Next()) >= 0) - level.sectors[secnum].SetPlaneLight(sector_t::floor, llevel); + Level->sectors[secnum].SetPlaneLight(sector_t::floor, llevel); } else { FSectorTagIterator itr(target); while ((secnum = itr.Next()) >= 0) - level.sectors[secnum].SetPlaneLight(sector_t::ceiling, llevel); + Level->sectors[secnum].SetPlaneLight(sector_t::ceiling, llevel); } } @@ -811,7 +819,7 @@ public: void Tick (); protected: - static void DoTransfer (short level, int target, uint8_t flags); + void DoTransfer (short level, int target, uint8_t flags); sector_t *Source; int TargetID; @@ -850,16 +858,17 @@ DWallLightTransfer::DWallLightTransfer (sector_t *srcSec, int target, uint8_t fl } FLineIdIterator itr(target); + auto Level = &level; while ((linenum = itr.Next()) >= 0) { - if (flags & WLF_SIDE1 && level.lines[linenum].sidedef[0] != NULL) + if (flags & WLF_SIDE1 && Level->lines[linenum].sidedef[0] != NULL) { - level.lines[linenum].sidedef[0]->Flags |= wallflags; + Level->lines[linenum].sidedef[0]->Flags |= wallflags; } - if (flags & WLF_SIDE2 && level.lines[linenum].sidedef[1] != NULL) + if (flags & WLF_SIDE2 && Level->lines[linenum].sidedef[1] != NULL) { - level.lines[linenum].sidedef[1]->Flags |= wallflags; + Level->lines[linenum].sidedef[1]->Flags |= wallflags; } } ChangeStatNum(STAT_LIGHTTRANSFER); @@ -880,10 +889,11 @@ void DWallLightTransfer::DoTransfer (short lightlevel, int target, uint8_t flags { int linenum; + auto Level = &level; FLineIdIterator itr(target); while ((linenum = itr.Next()) >= 0) { - line_t *line = &level.lines[linenum]; + line_t *line = &Level->lines[linenum]; if (flags & WLF_SIDE1 && line->sidedef[0] != NULL) { @@ -936,7 +946,7 @@ static void SetupCeilingPortal (AActor *point) } } -void P_SetupPortals() +void P_SetupPortals(FLevelLocals *Level) { TThinkerIterator it("StackPoint"); AActor *pt; @@ -958,21 +968,21 @@ void P_SetupPortals() } // the semantics here are incredibly lax so the final setup can only be done once all portals have been created, // because later stackpoints will happily overwrite info in older ones, if there are multiple links. - for (auto &s : level.sectorPortals) + for (auto &s : Level->sectorPortals) { if (s.mType == PORTS_STACKEDSECTORTHING && s.mSkybox) { - for (auto &ss : level.sectorPortals) + for (auto &ss : Level->sectorPortals) { if (ss.mType == PORTS_STACKEDSECTORTHING && ss.mSkybox == s.mSkybox->target) { - s.mPartner = unsigned((&ss) - &level.sectorPortals[0]); + s.mPartner = unsigned((&ss) - &Level->sectorPortals[0]); } } } } // Now we can finally set the displacement and delete the stackpoint reference. - for (auto &s : level.sectorPortals) + for (auto &s : Level->sectorPortals) { if (s.mType == PORTS_STACKEDSECTORTHING && s.mSkybox) { @@ -982,7 +992,7 @@ void P_SetupPortals() } } -static void SetPortal(sector_t *sector, int plane, unsigned pnum, double alpha) +static void SetPortal(FLevelLocals *Level, sector_t *sector, int plane, unsigned pnum, double alpha) { // plane: 0=floor, 1=ceiling, 2=both if (plane > 0) @@ -993,7 +1003,7 @@ static void SetPortal(sector_t *sector, int plane, unsigned pnum, double alpha) if (sector->GetAlpha(sector_t::ceiling) == 1.) sector->SetAlpha(sector_t::ceiling, alpha); - if (level.sectorPortals[pnum].mFlags & PORTSF_SKYFLATONLY) + if (Level->sectorPortals[pnum].mFlags & PORTSF_SKYFLATONLY) sector->SetTexture(sector_t::ceiling, skyflatnum); } } @@ -1006,21 +1016,21 @@ static void SetPortal(sector_t *sector, int plane, unsigned pnum, double alpha) if (sector->GetAlpha(sector_t::floor) == 1.) sector->SetAlpha(sector_t::floor, alpha); - if (level.sectorPortals[pnum].mFlags & PORTSF_SKYFLATONLY) + if (Level->sectorPortals[pnum].mFlags & PORTSF_SKYFLATONLY) sector->SetTexture(sector_t::floor, skyflatnum); } } -static void CopyPortal(int sectortag, int plane, unsigned pnum, double alpha, bool tolines) +static void CopyPortal(FLevelLocals *Level, int sectortag, int plane, unsigned pnum, double alpha, bool tolines) { int s; FSectorTagIterator itr(sectortag); while ((s = itr.Next()) >= 0) { - SetPortal(&level.sectors[s], plane, pnum, alpha); + SetPortal(Level, &Level->sectors[s], plane, pnum, alpha); } - for (auto &line : level.lines) + for (auto &line : Level->lines) { // 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 @@ -1031,14 +1041,14 @@ static void CopyPortal(int sectortag, int plane, unsigned pnum, double alpha, bo { if (line.args[0] == 0) { - SetPortal(line.frontsector, plane, pnum, alpha); + SetPortal(Level, line.frontsector, plane, pnum, alpha); } else { FSectorTagIterator itr(line.args[0]); while ((s = itr.Next()) >= 0) { - SetPortal(&level.sectors[s], plane, pnum, alpha); + SetPortal(Level, &Level->sectors[s], plane, pnum, alpha); } } } @@ -1055,7 +1065,7 @@ static void CopyPortal(int sectortag, int plane, unsigned pnum, double alpha, bo FLineIdIterator itr(line.args[0]); while ((s = itr.Next()) >= 0) { - level.lines[s].portaltransferred = pnum; + Level->lines[s].portaltransferred = pnum; } } } @@ -1063,10 +1073,10 @@ 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(FLevelLocals *Level, line_t *line, int sectortag, int plane, int bytealpha, int linked) { if (plane < 0 || plane > 2 || (linked && plane == 2)) return; - for (auto &oline : level.lines) + 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 // which is not a good idea. @@ -1080,7 +1090,7 @@ void P_SpawnPortal(line_t *line, int sectortag, int plane, int bytealpha, int li DVector2 pos1 = line->v1->fPos() + line->Delta() / 2; DVector2 pos2 = oline.v1->fPos() + oline.Delta() / 2; unsigned pnum = P_GetPortal(linked ? PORTS_LINKEDPORTAL : PORTS_PORTAL, plane, line->frontsector, oline.frontsector, pos2 - pos1); - CopyPortal(sectortag, plane, pnum, bytealpha / 255., false); + CopyPortal(Level, sectortag, plane, pnum, bytealpha / 255., false); return; } } @@ -1088,7 +1098,7 @@ void P_SpawnPortal(line_t *line, int sectortag, int plane, int bytealpha, int li // This searches the viewpoint's sector // for a skybox line special, gets its tag and transfers the skybox to all tagged sectors. -void P_SpawnSkybox(AActor *origin) +void P_SpawnSkybox(FLevelLocals *Level, AActor *origin) { sector_t *Sector = origin->Sector; if (Sector == NULL) @@ -1104,7 +1114,7 @@ void P_SpawnSkybox(AActor *origin) { // We found the setup linedef for this skybox, so let's use it for our init. unsigned pnum = P_GetSkyboxPortal(origin); - CopyPortal(refline->args[0], refline->args[2], pnum, 0, true); + CopyPortal(Level, refline->args[0], refline->args[2], pnum, 0, true); return; } } @@ -1140,13 +1150,13 @@ static void P_SetupSectorDamage(sector_t *sector, int damage, int interval, int // void P_SpawnLights(sector_t *sector); -void P_InitSectorSpecial(sector_t *sector, int special) +void P_InitSectorSpecial(FLevelLocals *Level, sector_t *sector, int special) { // [RH] All secret sectors are marked with a BOOM-ish bitfield if (sector->special & SECRET_MASK) { sector->Flags |= SECF_SECRET | SECF_WASSECRET; - level.total_secrets++; + Level->total_secrets++; } if (sector->special & FRICTION_MASK) { @@ -1298,14 +1308,15 @@ void P_InitSectorSpecial(sector_t *sector, int special) void P_SpawnSpecials (MapLoader *ml) { - P_SetupPortals(); + auto Level = ml->Level; + P_SetupPortals(Level); - for (auto &sec : level.sectors) + for (auto &sec : Level->sectors) { if (sec.special == 0) continue; - P_InitSectorSpecial(&sec, sec.special); + P_InitSectorSpecial(Level, &sec, sec.special); } #ifndef NO_EDATA @@ -1315,18 +1326,18 @@ void P_SpawnSpecials (MapLoader *ml) // Init other misc stuff - P_SpawnScrollers(&level); // killough 3/7/98: Add generalized scrollers - P_SpawnFriction(); // phares 3/12/98: New friction model using linedefs + P_SpawnScrollers(Level); // killough 3/7/98: Add generalized scrollers + P_SpawnFriction(Level); // phares 3/12/98: New friction model using linedefs P_SpawnPushers(); // phares 3/20/98: New pusher model using linedefs TThinkerIterator it2("SkyCamCompat"); AActor *pt2; while ((pt2 = it2.Next())) { - P_SpawnSkybox(pt2); + P_SpawnSkybox(Level, pt2); } - for (auto &line : level.lines) + for (auto &line : Level->lines) { switch (line.special) { @@ -1359,7 +1370,7 @@ void P_SpawnSpecials (MapLoader *ml) { sec->MoreFlags |= SECMF_IGNOREHEIGHTSEC; } - else level.HasHeightSecs = true; + else Level->HasHeightSecs = true; if (line.args[1] & 32) { sec->MoreFlags |= SECMF_NOFAKELIGHT; @@ -1367,10 +1378,10 @@ void P_SpawnSpecials (MapLoader *ml) FSectorTagIterator itr(line.args[0]); while ((s = itr.Next()) >= 0) { - level.sectors[s].heightsec = sec; - sec->e->FakeFloor.Sectors.Push(&level.sectors[s]); - level.sectors[s].MoreFlags |= (sec->MoreFlags & SECMF_IGNOREHEIGHTSEC); // copy this to the destination sector for easier checking. - level.sectors[s].AdjustFloorClip(); + Level->sectors[s].heightsec = sec; + sec->e->FakeFloor.Sectors.Push(&Level->sectors[s]); + Level->sectors[s].MoreFlags |= (sec->MoreFlags & SECMF_IGNOREHEIGHTSEC); // copy this to the destination sector for easier checking. + Level->sectors[s].AdjustFloorClip(); } break; } @@ -1420,12 +1431,12 @@ void P_SpawnSpecials (MapLoader *ml) // arg 4 = for the anchor only: alpha if ((line.args[1] == 0 || line.args[1] == 6) && line.args[3] == 0) { - P_SpawnPortal(&line, line.args[0], line.args[2], line.args[4], line.args[1]); + P_SpawnPortal(Level, &line, line.args[0], line.args[2], line.args[4], line.args[1]); } else if (line.args[1] == 3 || line.args[1] == 4) { 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(Level, line.args[0], line.args[2], pnum, 0, true); } break; @@ -1442,7 +1453,7 @@ void P_SpawnSpecials (MapLoader *ml) double grav = line.Delta().Length() / 100.; FSectorTagIterator itr(line.args[0]); while ((s = itr.Next()) >= 0) - level.sectors[s].gravity = grav; + Level->sectors[s].gravity = grav; } break; @@ -1455,7 +1466,7 @@ void P_SpawnSpecials (MapLoader *ml) FSectorTagIterator itr(line.args[0]); while ((s = itr.Next()) >= 0) { - sector_t *sec = &level.sectors[s]; + sector_t *sec = &Level->sectors[s]; sec->damageamount = damage; sec->damagetype = NAME_None; if (sec->damageamount < 20) @@ -1495,7 +1506,7 @@ void P_SpawnSpecials (MapLoader *ml) { FSectorTagIterator itr(line.args[0]); while ((s = itr.Next()) >= 0) - level.sectors[s].sky = (line.Index() + 1) | PL_SKYFLAT; + Level->sectors[s].sky = (line.Index() + 1) | PL_SKYFLAT; break; } } @@ -1559,11 +1570,11 @@ void P_SpawnSpecials (MapLoader *ml) // // Initialize the sectors where friction is increased or decreased -static void P_SpawnFriction(void) +static void P_SpawnFriction(FLevelLocals *Level) { - line_t *l = &level.lines[0]; + line_t *l = &Level->lines[0]; - for (unsigned i = 0 ; i < level.lines.Size() ; i++,l++) + for (unsigned i = 0 ; i < Level->lines.Size() ; i++,l++) { if (l->special == Sector_SetFriction) { @@ -1578,13 +1589,13 @@ static void P_SpawnFriction(void) length = int(l->Delta().Length()); } - P_SetSectorFriction (l->args[0], length, false); + P_SetSectorFriction (Level, l->args[0], length, false); l->special = 0; } } } -void P_SetSectorFriction (int tag, int amount, bool alterFlag) +void P_SetSectorFriction (FLevelLocals *Level, int tag, int amount, bool alterFlag) { int s; double friction, movefactor; @@ -1614,19 +1625,19 @@ void P_SetSectorFriction (int tag, int amount, bool alterFlag) // drag on CPU. New code adjusts friction of sector only once // at level startup, and then uses this friction value. - level.sectors[s].friction = friction; - level.sectors[s].movefactor = movefactor; + Level->sectors[s].friction = friction; + Level->sectors[s].movefactor = movefactor; if (alterFlag) { // When used inside a script, the sectors' friction flags // can be enabled and disabled at will. if (friction == ORIG_FRICTION) { - level.sectors[s].Flags &= ~SECF_FRICTION; + Level->sectors[s].Flags &= ~SECF_FRICTION; } else { - level.sectors[s].Flags |= SECF_FRICTION; + Level->sectors[s].Flags |= SECF_FRICTION; } } } diff --git a/src/p_spec.h b/src/p_spec.h index 0b1e93f8c..6243ab649 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -87,17 +87,12 @@ const double CARRYFACTOR = 3 / 32.; #define DAMAGE_NO_ARMOR 16 -// [RH] If a deathmatch game, checks to see if noexit is enabled. -// If so, it kills the player and returns false. Otherwise, -// it returns true, and the player is allowed to live. -bool CheckIfExitIsGood (AActor *self, level_info_t *info); - class MapLoader; // at map load void P_SpawnSpecials (MapLoader *ml); // every tic -void P_UpdateSpecials (void); +void P_UpdateSpecials (FLevelLocals *); // when needed bool P_ActivateLine (line_t *ld, AActor *mo, int side, int activationType, DVector3 *optpos = NULL); @@ -106,10 +101,10 @@ bool P_PredictLine (line_t *ld, AActor *mo, int side, int activationType); void P_PlayerInSpecialSector (player_t *player, sector_t * sector=NULL); void P_PlayerOnSpecialFlat (player_t *player, int floorType); -void P_SectorDamage(int tag, int amount, FName type, PClassActor *protectClass, int flags); -void P_SetSectorFriction (int tag, int amount, bool alterFlag); +void P_SectorDamage(FLevelLocals *Level, int tag, int amount, FName type, PClassActor *protectClass, int flags); +void P_SetSectorFriction (FLevelLocals *level, int tag, int amount, bool alterFlag); double FrictionToMoveFactor(double friction); -void P_GiveSecret(AActor *actor, bool printmessage, bool playsound, int sectornum); +void P_GiveSecret(FLevelLocals *Level, AActor *actor, bool printmessage, bool playsound, int sectornum); // // getNextSector() diff --git a/src/p_tick.cpp b/src/p_tick.cpp index e4cc536cf..562184edb 100644 --- a/src/p_tick.cpp +++ b/src/p_tick.cpp @@ -144,7 +144,7 @@ void P_Ticker (void) //if added by MC: Freeze mode. if (!bglobal.freeze && !(level.flags2 & LEVEL2_FROZEN)) { - P_UpdateSpecials (); + P_UpdateSpecials (&level); P_RunEffects (); // [RH] Run particle effects } diff --git a/src/scripting/vmthunks_actors.cpp b/src/scripting/vmthunks_actors.cpp index 73b737fcf..ffb845785 100644 --- a/src/scripting/vmthunks_actors.cpp +++ b/src/scripting/vmthunks_actors.cpp @@ -1325,7 +1325,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(AActor, CheckSight, P_CheckSight) static void GiveSecret(AActor *self, bool printmessage, bool playsound) { - P_GiveSecret(self, printmessage, playsound, -1); + P_GiveSecret(&level, self, printmessage, playsound, -1); } DEFINE_ACTION_FUNCTION_NATIVE(AActor, GiveSecret, GiveSecret) @@ -1333,7 +1333,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(AActor, GiveSecret, GiveSecret) PARAM_SELF_PROLOGUE(AActor); PARAM_BOOL(printmessage); PARAM_BOOL(playsound); - P_GiveSecret(self, printmessage, playsound, -1); + GiveSecret(self, printmessage, playsound); return 0; } From 85b5f8d0a0f6e776a1bbb430806f17a9ae4ded96 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 24 Jan 2019 00:22:18 +0100 Subject: [PATCH 002/164] - moved several setup methods into the map loader Code hasn't been moved yet, this only changes the declarations. --- src/maploader/maploader.cpp | 2 +- src/maploader/maploader.h | 20 ++++++- src/maploader/udmf.cpp | 4 +- src/p_lights.cpp | 3 +- src/p_pusher.cpp | 13 +++-- src/p_scroll.cpp | 5 +- src/p_spec.cpp | 106 ++++++++++++++++-------------------- src/p_spec.h | 3 - 8 files changed, 81 insertions(+), 75 deletions(-) diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index a8a892967..2db91c8e4 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -3206,7 +3206,7 @@ void MapLoader::LoadLevel(MapData *map, const char *lumpname, int position) } // set up world state - P_SpawnSpecials(this); + SpawnSpecials(); // disable reflective planes on sloped sectors. for (auto &sec : Level->sectors) diff --git a/src/maploader/maploader.h b/src/maploader/maploader.h index 38fd636e0..d468c5ef2 100644 --- a/src/maploader/maploader.h +++ b/src/maploader/maploader.h @@ -1,6 +1,7 @@ #pragma once #include "nodebuild.h" +#include "p_spec.h" struct EDMapthing { @@ -170,7 +171,24 @@ private: void FixHoles(); void ReportUnpairedMinisegs(); void CalcIndices(); - + + // Specials + void SpawnSpecials(); + void InitSectorSpecial(sector_t *sector, int special); + void SpawnLights(sector_t *sector); + void CreateScroller(EScroll type, double dx, double dy, sector_t *affectee, int accel, EScrollPos scrollpos = EScrollPos::scw_all); + void SpawnScrollers(); + void SpawnFriction(); + void SpawnPushers(); + AActor *GetPushThing (int s); + void SpawnPortal(line_t *line, int sectortag, int plane, int bytealpha, int linked); + void CopyPortal(int sectortag, int plane, unsigned pnum, double alpha, bool tolines); + void SetPortal(sector_t *sector, int plane, unsigned pnum, double alpha); + void SetupPortals(); + void SpawnSkybox(AActor *origin); + void SetupFloorPortal (AActor *point); + void SetupCeilingPortal (AActor *point); + void SetTexture(side_t *side, int position, const char *name, FMissingTextureTracker &track); void SetTexture(sector_t *sector, int index, int position, const char *name, FMissingTextureTracker &track, bool truncate); void SetTexture(side_t *side, int position, uint32_t *blend, const char *name); diff --git a/src/maploader/udmf.cpp b/src/maploader/udmf.cpp index 1918079d6..c574f9ed7 100644 --- a/src/maploader/udmf.cpp +++ b/src/maploader/udmf.cpp @@ -2285,12 +2285,12 @@ public: const double scrollfactor = 1 / 3.2; // I hope this is correct, it's just a guess taken from Eternity's code. if (scroll.type == NAME_Both || scroll.type == NAME_Visual) { - P_CreateScroller(scroll.ceiling ? EScroll::sc_ceiling : EScroll::sc_floor, scroll.x * scrollfactor, scroll.y * scrollfactor, &Level->sectors[scroll.index], 0); + loader->CreateScroller(scroll.ceiling ? EScroll::sc_ceiling : EScroll::sc_floor, scroll.x * scrollfactor, scroll.y * scrollfactor, &Level->sectors[scroll.index], 0); } if (scroll.type == NAME_Both || scroll.type == NAME_Physical) { // sc_carry_ceiling doesn't do anything yet. - P_CreateScroller(scroll.ceiling ? EScroll::sc_carry_ceiling : EScroll::sc_carry, scroll.x * scrollfactor, scroll.y * scrollfactor, &Level->sectors[scroll.index], 0); + loader->CreateScroller(scroll.ceiling ? EScroll::sc_carry_ceiling : EScroll::sc_carry, scroll.x * scrollfactor, scroll.y * scrollfactor, &Level->sectors[scroll.index], 0); } } diff --git a/src/p_lights.cpp b/src/p_lights.cpp index d2f743ad9..4db7e2ce4 100644 --- a/src/p_lights.cpp +++ b/src/p_lights.cpp @@ -37,6 +37,7 @@ #include "doomstat.h" #include "p_maputl.h" #include "g_levellocals.h" +#include "maploader/maploader.h" // State. #include "serializer.h" @@ -997,7 +998,7 @@ void EV_StopLightEffect (int tag) } -void P_SpawnLights(sector_t *sector) +void MapLoader::SpawnLights(sector_t *sector) { switch (sector->special) { diff --git a/src/p_pusher.cpp b/src/p_pusher.cpp index 5861ad636..f8d4920c8 100644 --- a/src/p_pusher.cpp +++ b/src/p_pusher.cpp @@ -36,6 +36,7 @@ #include "d_player.h" #include "g_levellocals.h" #include "actorinlines.h" +#include "maploader/maploader.h" CVAR(Bool, var_pushers, true, CVAR_SERVERINFO); @@ -338,12 +339,12 @@ void DPusher::Tick () // P_GetPushThing() returns a pointer to an MT_PUSH or MT_PULL thing, // NULL otherwise. -AActor *P_GetPushThing (int s) +AActor *MapLoader::GetPushThing (int s) { AActor* thing; sector_t* sec; - sec = &level.sectors[s]; + sec = &Level->sectors[s]; thing = sec->thinglist; while (thing && @@ -360,12 +361,12 @@ AActor *P_GetPushThing (int s) // Initialize the sectors where pushers are present // -void P_SpawnPushers () +void MapLoader::SpawnPushers () { - line_t *l = &level.lines[0]; + line_t *l = &Level->lines[0]; int s; - for (unsigned i = 0; i < level.lines.Size(); i++, l++) + for (unsigned i = 0; i < Level->lines.Size(); i++, l++) { switch (l->special) { @@ -392,7 +393,7 @@ void P_SpawnPushers () FSectorTagIterator itr(l->args[0]); while ((s = itr.Next()) >= 0) { - AActor *thing = P_GetPushThing (s); + AActor *thing = GetPushThing (s); if (thing) { // No MT_P* means no effect // [RH] Allow narrowing it down by tid if (!l->args[1] || l->args[1] == thing->tid) diff --git a/src/p_scroll.cpp b/src/p_scroll.cpp index 05b40cbec..8b00936cd 100644 --- a/src/p_scroll.cpp +++ b/src/p_scroll.cpp @@ -62,6 +62,7 @@ #include "p_lnspec.h" #include "r_data/r_interpolate.h" #include "g_levellocals.h" +#include "maploader/maploader.h" //----------------------------------------------------------------------------- // @@ -421,7 +422,7 @@ DScroller::DScroller (double dx, double dy, const line_t *l, sector_t * control, // //----------------------------------------------------------------------------- -void P_SpawnScrollers(FLevelLocals *Level) +void MapLoader::SpawnScrollers() { line_t *l = &Level->lines[0]; side_t *side; @@ -733,7 +734,7 @@ void SetScroller (FLevelLocals *Level, int tag, EScroll type, double dx, double } } -void P_CreateScroller(EScroll type, double dx, double dy, sector_t *affectee, int accel, EScrollPos scrollpos) +void MapLoader::CreateScroller(EScroll type, double dx, double dy, sector_t *affectee, int accel, EScrollPos scrollpos) { Create(type, dx, dy, nullptr, affectee, nullptr, accel, scrollpos); } diff --git a/src/p_spec.cpp b/src/p_spec.cpp index a4e24560b..58d911414 100644 --- a/src/p_spec.cpp +++ b/src/p_spec.cpp @@ -104,13 +104,6 @@ static FRandom pr_playerinspecialsector ("PlayerInSpecialSector"); EXTERN_CVAR(Bool, cl_predict_specials) - -// killough 3/7/98: Initialize generalized scrolling -void P_SpawnScrollers(FLevelLocals *Level); -static void P_SpawnFriction (FLevelLocals *l); // phares 3/16/98 -void P_SpawnPushers (); // phares 3/20/98 - - // [RH] Check dmflags for noexit and respond accordingly bool FLevelLocals::CheckIfExitIsGood (AActor *self, level_info_t *info) { @@ -916,7 +909,7 @@ void DWallLightTransfer::DoTransfer (short lightlevel, int target, uint8_t flags //--------------------------------------------------------------------------- // Upper stacks go in the top sector. Lower stacks go in the bottom sector. -static void SetupFloorPortal (AActor *point) +void MapLoader::SetupFloorPortal (AActor *point) { NActorIterator it (NAME_LowerStackLookOnly, point->tid); sector_t *Sector = point->Sector; @@ -931,7 +924,7 @@ static void SetupFloorPortal (AActor *point) } } -static void SetupCeilingPortal (AActor *point) +void MapLoader::SetupCeilingPortal (AActor *point) { NActorIterator it (NAME_UpperStackLookOnly, point->tid); sector_t *Sector = point->Sector; @@ -946,7 +939,7 @@ static void SetupCeilingPortal (AActor *point) } } -void P_SetupPortals(FLevelLocals *Level) +void MapLoader::SetupPortals() { TThinkerIterator it("StackPoint"); AActor *pt; @@ -992,7 +985,7 @@ void P_SetupPortals(FLevelLocals *Level) } } -static void SetPortal(FLevelLocals *Level, sector_t *sector, int plane, unsigned pnum, double alpha) +void MapLoader::SetPortal(sector_t *sector, int plane, unsigned pnum, double alpha) { // plane: 0=floor, 1=ceiling, 2=both if (plane > 0) @@ -1021,13 +1014,13 @@ static void SetPortal(FLevelLocals *Level, sector_t *sector, int plane, unsigned } } -static void CopyPortal(FLevelLocals *Level, int sectortag, int plane, unsigned pnum, double alpha, bool tolines) +void MapLoader::CopyPortal(int sectortag, int plane, unsigned pnum, double alpha, bool tolines) { int s; FSectorTagIterator itr(sectortag); while ((s = itr.Next()) >= 0) { - SetPortal(Level, &Level->sectors[s], plane, pnum, alpha); + SetPortal(&Level->sectors[s], plane, pnum, alpha); } for (auto &line : Level->lines) @@ -1041,14 +1034,14 @@ static void CopyPortal(FLevelLocals *Level, int sectortag, int plane, unsigned p { if (line.args[0] == 0) { - SetPortal(Level, line.frontsector, plane, pnum, alpha); + SetPortal(line.frontsector, plane, pnum, alpha); } else { FSectorTagIterator itr(line.args[0]); while ((s = itr.Next()) >= 0) { - SetPortal(Level, &Level->sectors[s], plane, pnum, alpha); + SetPortal(&Level->sectors[s], plane, pnum, alpha); } } } @@ -1073,7 +1066,7 @@ static void CopyPortal(FLevelLocals *Level, int sectortag, int plane, unsigned p } -void P_SpawnPortal(FLevelLocals *Level, line_t *line, int sectortag, int plane, int bytealpha, int linked) +void MapLoader::SpawnPortal(line_t *line, int sectortag, int plane, int bytealpha, int linked) { if (plane < 0 || plane > 2 || (linked && plane == 2)) return; for (auto &oline : Level->lines) @@ -1090,7 +1083,7 @@ void P_SpawnPortal(FLevelLocals *Level, line_t *line, int sectortag, int plane, DVector2 pos1 = line->v1->fPos() + line->Delta() / 2; DVector2 pos2 = oline.v1->fPos() + oline.Delta() / 2; unsigned pnum = P_GetPortal(linked ? PORTS_LINKEDPORTAL : PORTS_PORTAL, plane, line->frontsector, oline.frontsector, pos2 - pos1); - CopyPortal(Level, sectortag, plane, pnum, bytealpha / 255., false); + CopyPortal(sectortag, plane, pnum, bytealpha / 255., false); return; } } @@ -1098,7 +1091,7 @@ void P_SpawnPortal(FLevelLocals *Level, line_t *line, int sectortag, int plane, // This searches the viewpoint's sector // for a skybox line special, gets its tag and transfers the skybox to all tagged sectors. -void P_SpawnSkybox(FLevelLocals *Level, AActor *origin) +void MapLoader::SpawnSkybox(AActor *origin) { sector_t *Sector = origin->Sector; if (Sector == NULL) @@ -1114,7 +1107,7 @@ void P_SpawnSkybox(FLevelLocals *Level, AActor *origin) { // We found the setup linedef for this skybox, so let's use it for our init. unsigned pnum = P_GetSkyboxPortal(origin); - CopyPortal(Level, refline->args[0], refline->args[2], pnum, 0, true); + CopyPortal(refline->args[0], refline->args[2], pnum, 0, true); return; } } @@ -1129,7 +1122,7 @@ void P_SpawnSkybox(FLevelLocals *Level, AActor *origin) // Sets damage properties for one sector. Allows combination of original specials with explicit use of the damage properties // -static void P_SetupSectorDamage(sector_t *sector, int damage, int interval, int leakchance, FName type, int flags) +static void SetupSectorDamage(sector_t *sector, int damage, int interval, int leakchance, FName type, int flags) { // Only set if damage is not yet initialized. This ensures that UDMF takes precedence over sector specials. if (sector->damageamount == 0) @@ -1148,9 +1141,8 @@ static void P_SetupSectorDamage(sector_t *sector, int damage, int interval, int // Sets up everything derived from 'sector->special' for one sector // ('fromload' is necessary to allow conversion upon savegame load.) // -void P_SpawnLights(sector_t *sector); -void P_InitSectorSpecial(FLevelLocals *Level, sector_t *sector, int special) +void MapLoader::InitSectorSpecial(sector_t *sector, int special) { // [RH] All secret sectors are marked with a BOOM-ish bitfield if (sector->special & SECRET_MASK) @@ -1168,33 +1160,33 @@ void P_InitSectorSpecial(FLevelLocals *Level, sector_t *sector, int special) } if ((sector->special & DAMAGE_MASK) == 0x100) { - P_SetupSectorDamage(sector, 5, 32, 0, NAME_Fire, 0); + SetupSectorDamage(sector, 5, 32, 0, NAME_Fire, 0); } else if ((sector->special & DAMAGE_MASK) == 0x200) { - P_SetupSectorDamage(sector, 10, 32, 0, NAME_Slime, 0); + SetupSectorDamage(sector, 10, 32, 0, NAME_Slime, 0); } else if ((sector->special & DAMAGE_MASK) == 0x300) { - P_SetupSectorDamage(sector, 20, 32, 5, NAME_Slime, 0); + SetupSectorDamage(sector, 20, 32, 5, NAME_Slime, 0); } sector->special &= 0xff; // [RH] Normal DOOM special or BOOM specialized? bool keepspecial = false; - P_SpawnLights(sector); + SpawnLights(sector); switch (sector->special) { case dLight_Strobe_Hurt: - P_SetupSectorDamage(sector, 20, 32, 5, NAME_Slime, 0); + SetupSectorDamage(sector, 20, 32, 5, NAME_Slime, 0); break; case dDamage_Hellslime: - P_SetupSectorDamage(sector, 10, 32, 0, NAME_Slime, 0); + SetupSectorDamage(sector, 10, 32, 0, NAME_Slime, 0); break; case dDamage_Nukage: - P_SetupSectorDamage(sector, 5, 32, 0, NAME_Slime, 0); + SetupSectorDamage(sector, 5, 32, 0, NAME_Slime, 0); break; case dSector_DoorCloseIn30: @@ -1202,7 +1194,7 @@ void P_InitSectorSpecial(FLevelLocals *Level, sector_t *sector, int special) break; case dDamage_End: - P_SetupSectorDamage(sector, 20, 32, 256, NAME_None, SECF_ENDGODMODE|SECF_ENDLEVEL); + SetupSectorDamage(sector, 20, 32, 256, NAME_None, SECF_ENDGODMODE|SECF_ENDLEVEL); break; case dSector_DoorRaiseIn5Mins: @@ -1216,42 +1208,42 @@ void P_InitSectorSpecial(FLevelLocals *Level, sector_t *sector, int special) break; case dDamage_SuperHellslime: - P_SetupSectorDamage(sector, 20, 32, 5, NAME_Slime, 0); + SetupSectorDamage(sector, 20, 32, 5, NAME_Slime, 0); break; case dDamage_LavaWimpy: - P_SetupSectorDamage(sector, 5, 16, 256, NAME_Fire, SECF_DMGTERRAINFX); + SetupSectorDamage(sector, 5, 16, 256, NAME_Fire, SECF_DMGTERRAINFX); break; case dDamage_LavaHefty: - P_SetupSectorDamage(sector, 8, 16, 256, NAME_Fire, SECF_DMGTERRAINFX); + SetupSectorDamage(sector, 8, 16, 256, NAME_Fire, SECF_DMGTERRAINFX); break; case dScroll_EastLavaDamage: - P_SetupSectorDamage(sector, 5, 16, 256, NAME_Fire, SECF_DMGTERRAINFX); - P_CreateScroller(EScroll::sc_floor, -4., 0, sector, 0); + SetupSectorDamage(sector, 5, 16, 256, NAME_Fire, SECF_DMGTERRAINFX); + CreateScroller(EScroll::sc_floor, -4., 0, sector, 0); keepspecial = true; break; case hDamage_Sludge: - P_SetupSectorDamage(sector, 4, 32, 0, NAME_Slime, 0); + SetupSectorDamage(sector, 4, 32, 0, NAME_Slime, 0); break; case sLight_Strobe_Hurt: - P_SetupSectorDamage(sector, 5, 32, 0, NAME_Slime, 0); + SetupSectorDamage(sector, 5, 32, 0, NAME_Slime, 0); break; case sDamage_Hellslime: - P_SetupSectorDamage(sector, 2, 32, 0, NAME_Slime, SECF_HAZARD); + SetupSectorDamage(sector, 2, 32, 0, NAME_Slime, SECF_HAZARD); break; case Damage_InstantDeath: // Strife's instant death sector - P_SetupSectorDamage(sector, TELEFRAG_DAMAGE, 1, 256, NAME_InstantDeath, 0); + SetupSectorDamage(sector, TELEFRAG_DAMAGE, 1, 256, NAME_InstantDeath, 0); break; case sDamage_SuperHellslime: - P_SetupSectorDamage(sector, 4, 32, 0, NAME_Slime, SECF_HAZARD); + SetupSectorDamage(sector, 4, 32, 0, NAME_Slime, SECF_HAZARD); break; case Sector_Hidden: @@ -1260,7 +1252,7 @@ void P_InitSectorSpecial(FLevelLocals *Level, sector_t *sector, int special) case Sector_Heal: // CoD's healing sector - P_SetupSectorDamage(sector, -1, 32, 0, NAME_None, 0); + SetupSectorDamage(sector, -1, 32, 0, NAME_None, 0); break; case Sky2: @@ -1286,13 +1278,13 @@ void P_InitSectorSpecial(FLevelLocals *Level, sector_t *sector, int special) int i = sector->special - Scroll_North_Slow; double dx = hexenScrollies[i][0] / 2.; double dy = hexenScrollies[i][1] / 2.; - P_CreateScroller(EScroll::sc_floor, dx, dy, sector, 0); + CreateScroller(EScroll::sc_floor, dx, dy, sector, 0); } else if (sector->special >= Carry_East5 && sector->special <= Carry_East35) { // Heretic scroll special // Only east scrollers also scroll the texture - P_CreateScroller(EScroll::sc_floor, -0.5 * (1 << ((sector->special & 0xff) - Carry_East5)), 0, sector, 0); + CreateScroller(EScroll::sc_floor, -0.5 * (1 << ((sector->special & 0xff) - Carry_East5)), 0, sector, 0); } keepspecial = true; break; @@ -1306,35 +1298,31 @@ void P_InitSectorSpecial(FLevelLocals *Level, sector_t *sector, int special) // After the map has been loaded, scan for specials that spawn thinkers // -void P_SpawnSpecials (MapLoader *ml) +void MapLoader::SpawnSpecials () { - auto Level = ml->Level; - P_SetupPortals(Level); + SetupPortals(); for (auto &sec : Level->sectors) { if (sec.special == 0) continue; - P_InitSectorSpecial(Level, &sec, sec.special); + InitSectorSpecial(&sec, sec.special); } -#ifndef NO_EDATA - ml->ProcessEDSectors(); -#endif - + ProcessEDSectors(); // Init other misc stuff - P_SpawnScrollers(Level); // killough 3/7/98: Add generalized scrollers - P_SpawnFriction(Level); // phares 3/12/98: New friction model using linedefs - P_SpawnPushers(); // phares 3/20/98: New pusher model using linedefs + SpawnScrollers(); // killough 3/7/98: Add generalized scrollers + SpawnFriction(); // phares 3/12/98: New friction model using linedefs + SpawnPushers(); // phares 3/20/98: New pusher model using linedefs TThinkerIterator it2("SkyCamCompat"); AActor *pt2; while ((pt2 = it2.Next())) { - P_SpawnSkybox(Level, pt2); + SpawnSkybox(pt2); } for (auto &line : Level->lines) @@ -1431,12 +1419,12 @@ void P_SpawnSpecials (MapLoader *ml) // arg 4 = for the anchor only: alpha if ((line.args[1] == 0 || line.args[1] == 6) && line.args[3] == 0) { - P_SpawnPortal(Level, &line, line.args[0], line.args[2], line.args[4], line.args[1]); + SpawnPortal(&line, line.args[0], line.args[2], line.args[4], line.args[1]); } else if (line.args[1] == 3 || line.args[1] == 4) { unsigned pnum = P_GetPortal(line.args[1] == 3 ? PORTS_PLANE : PORTS_HORIZON, line.args[2], line.frontsector, NULL, { 0,0 }); - CopyPortal(Level, line.args[0], line.args[2], pnum, 0, true); + CopyPortal(line.args[0], line.args[2], pnum, 0, true); } break; @@ -1514,7 +1502,7 @@ void P_SpawnSpecials (MapLoader *ml) } } // [RH] Start running any open scripts on this map - level.Behaviors.StartTypedScripts (SCRIPT_Open, NULL, false); + Level->Behaviors.StartTypedScripts (SCRIPT_Open, NULL, false); } //////////////////////////////////////////////////////////////////////////// @@ -1570,7 +1558,7 @@ void P_SpawnSpecials (MapLoader *ml) // // Initialize the sectors where friction is increased or decreased -static void P_SpawnFriction(FLevelLocals *Level) +void MapLoader::SpawnFriction() { line_t *l = &Level->lines[0]; diff --git a/src/p_spec.h b/src/p_spec.h index 6243ab649..8e48773cc 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -63,7 +63,6 @@ enum EScrollPos : int scw_all = 7, }; -void P_CreateScroller(EScroll type, double dx, double dy, sector_t *affectee, int accel, EScrollPos scrollpos = EScrollPos::scw_all); //jff 2/23/98 identify the special classes that can share sectors @@ -88,8 +87,6 @@ const double CARRYFACTOR = 3 / 32.; class MapLoader; -// at map load -void P_SpawnSpecials (MapLoader *ml); // every tic void P_UpdateSpecials (FLevelLocals *); From 65750bd7bff7507d41e2451edf051a422689598f Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 24 Jan 2019 00:43:43 +0100 Subject: [PATCH 003/164] Wrap all iterator calls in the map loader into FLevelLocals methods. This should later be done for everything else as well, but the map loader should really be free of global dependencies ASAP. Also replace TThinkerIterator with FThinkerIterator globally because this only adds pointless type checks - with all actor subclasses being scripted this class has become redundant. --- src/actor.h | 16 ---------- src/g_levellocals.h | 49 ++++++++++++++++++++++++++++- src/maploader/maploader.cpp | 63 ++++++++++++++++++++++++++++++++++--- src/maploader/maploader.h | 3 +- src/namedef.h | 2 ++ src/p_acs.cpp | 12 +++---- src/p_lnspec.cpp | 8 ++--- src/p_pusher.cpp | 8 ++--- src/p_scroll.cpp | 14 ++++----- src/p_spec.cpp | 24 +++++++------- src/p_xlat.cpp | 52 +----------------------------- 11 files changed, 144 insertions(+), 107 deletions(-) diff --git a/src/actor.h b/src/actor.h index 1c9c053e6..df85ab42c 100644 --- a/src/actor.h +++ b/src/actor.h @@ -1527,22 +1527,6 @@ private: int id; }; -template -class TActorIterator : public FActorIterator -{ -public: - TActorIterator (int id) : FActorIterator (id) {} - T *Next () - { - AActor *actor; - do - { - actor = FActorIterator::Next (); - } while (actor && !actor->IsKindOf (RUNTIME_CLASS(T))); - return static_cast(actor); - } -}; - class NActorIterator : public FActorIterator { const PClass *type; diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 21411107f..820698649 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -44,6 +44,8 @@ #include "p_local.h" #include "po_man.h" #include "p_acs.h" +#include "p_tags.h" +#include "actor.h" #include "p_destructible.h" #include "r_data/r_sections.h" #include "r_data/r_canvastexture.h" @@ -113,6 +115,51 @@ struct FLevelLocals : public FLevelData void ClearLevelData(); void ClearPortals(); bool CheckIfExitIsGood(AActor *self, level_info_t *newmap); + FSectorTagIterator GetSectorTagIterator(int tag) + { + return FSectorTagIterator(tag); + } + FSectorTagIterator GetSectorTagIterator(int tag, line_t *line) + { + return FSectorTagIterator(tag, line); + } + FLineIdIterator GetLineIdIterator(int tag) + { + return FLineIdIterator(tag); + } + template TThinkerIterator GetThinkerIterator(FName subtype = NAME_None) + { + if (subtype == NAME_None) return TThinkerIterator(); + else return TThinkerIterator(subtype); + } + FActorIterator GetActorIterator(int tid) + { + return FActorIterator(tid); + } + NActorIterator GetActorIterator(FName type, int tid) + { + return NActorIterator(type, tid); + } + bool SectorHasTags(sector_t *sector) + { + return tagManager.SectorHasTags(sector); + } + bool SectorHasTag(sector_t *sector, int tag) + { + return tagManager.SectorHasTag(sector, tag); + } + bool SectorHasTag(int sector, int tag) + { + return tagManager.SectorHasTag(sector, tag); + } + bool LineHasId(int line, int tag) + { + return tagManager.LineHasID(line, tag); + } + sector_t *PointInSector(const DVector2 &pos) + { + return P_PointInSector(pos); + } uint8_t md5[16]; // for savegame validation. If the MD5 does not match the savegame won't be loaded. int time; // time in the hub @@ -328,4 +375,4 @@ inline bool line_t::hitSkyWall(AActor* mo) const backsector->GetTexture(sector_t::ceiling) == skyflatnum && mo->Z() >= backsector->ceilingplane.ZatPoint(mo->PosRelative(this)); } -#endif \ No newline at end of file +#endif diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index 2db91c8e4..2d8542b4c 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -113,8 +113,6 @@ void InitRenderInfo(); extern AActor *SpawnMapThing (int index, FMapThing *mthing, int position); -extern void P_TranslateTeleportThings (void); - EXTERN_CVAR(Bool, am_textured) CVAR (Bool, genblockmap, false, CVAR_SERVERINFO|CVAR_GLOBALCONFIG); @@ -125,6 +123,61 @@ inline bool P_LoadBuildMap(uint8_t *mapdata, size_t len, FMapThing **things, int return false; } +//=========================================================================== +// +// Now that ZDoom again gives the option of using Doom's original teleport +// behavior, only teleport dests in a sector with a 0 tag need to be +// given a TID. And since Doom format maps don't have TIDs, we can safely +// give them TID 1. +// +//=========================================================================== + +void MapLoader::TranslateTeleportThings () +{ + AActor *dest; + auto iterator = Level->GetThinkerIterator(NAME_TeleportDest); + bool foundSomething = false; + + while ( (dest = iterator.Next()) ) + { + if (!Level->SectorHasTags(dest->Sector)) + { + dest->tid = 1; + dest->AddToHash (); + foundSomething = true; + } + } + + if (foundSomething) + { + for (auto &line : Level->lines) + { + if (line.special == Teleport) + { + if (line.args[1] == 0) + { + line.args[0] = 1; + } + } + else if (line.special == Teleport_NoFog) + { + if (line.args[2] == 0) + { + line.args[0] = 1; + } + } + else if (line.special == Teleport_ZombieChanger) + { + if (line.args[1] == 0) + { + line.args[0] = 1; + } + } + } + } +} + + //=========================================================================== // // Sets a sidedef's texture and prints a message if it's not present. @@ -1570,7 +1623,7 @@ void MapLoader::FinishLoadingLineDef(line_t *ld, int alpha) { for (unsigned j = 0; j < Level->lines.Size(); j++) { - if (tagManager.LineHasID(j, ld->args[0])) + if (Level->LineHasId(j, ld->args[0])) { Level->lines[j].alpha = dalpha; if (additive) @@ -2074,7 +2127,7 @@ void MapLoader::ProcessSideTextures(bool checktranmap, side_t *sd, sector_t *sec { for (unsigned s = 0; s < Level->sectors.Size(); s++) { - if (tagManager.SectorHasTag(s, tag)) + if (Level->SectorHasTag(s, tag)) { if (colorgood) { @@ -3198,7 +3251,7 @@ void MapLoader::LoadLevel(MapData *map, const char *lumpname, int position) players[i].health = players[i].mo->health; } if (!map->HasBehavior && !map->isText) - P_TranslateTeleportThings(); // [RH] Assign teleport destination TIDs + TranslateTeleportThings(); // [RH] Assign teleport destination TIDs if (oldvertextable != nullptr) { diff --git a/src/maploader/maploader.h b/src/maploader/maploader.h index d468c5ef2..22793a422 100644 --- a/src/maploader/maploader.h +++ b/src/maploader/maploader.h @@ -188,7 +188,8 @@ private: void SpawnSkybox(AActor *origin); void SetupFloorPortal (AActor *point); void SetupCeilingPortal (AActor *point); - + void TranslateTeleportThings(); + void SetTexture(side_t *side, int position, const char *name, FMissingTextureTracker &track); void SetTexture(sector_t *sector, int index, int position, const char *name, FMissingTextureTracker &track, bool truncate); void SetTexture(side_t *side, int position, uint32_t *blend, const char *name); diff --git a/src/namedef.h b/src/namedef.h index 6d85e8229..e3f596b06 100644 --- a/src/namedef.h +++ b/src/namedef.h @@ -86,6 +86,8 @@ xx(PointPuller) xx(UpperStackLookOnly) xx(LowerStackLookOnly) +xx(StackPoint) +xx(SkyCamCompat) xx(BasicArmorBonus) xx(BasicArmorPickup) diff --git a/src/p_acs.cpp b/src/p_acs.cpp index fdd61762b..c0ecb4579 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -5503,7 +5503,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) } else { - TActorIterator iterator(args[0]); + FActorIterator iterator(args[0]); while ((actor = iterator.Next())) { @@ -5529,7 +5529,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) } else { - TActorIterator iterator(args[0]); + FActorIterator iterator(args[0]); while ( (actor = iterator.Next()) ) { @@ -5568,7 +5568,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) } else { - TActorIterator iterator(args[0]); + FActorIterator iterator(args[0]); while ( (actor = iterator.Next()) ) { @@ -5699,7 +5699,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) if (args[1] == 0) return 1; // [KS] I'm sure the activator can see itself. - TActorIterator dstiter (args[1]); + FActorIterator dstiter (args[1]); while ( (dest = dstiter.Next ()) ) { @@ -5708,13 +5708,13 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) } else { - TActorIterator srciter (args[0]); + FActorIterator srciter (args[0]); while ( (source = srciter.Next ()) ) { if (args[1] != 0) { - TActorIterator dstiter (args[1]); + FActorIterator dstiter (args[1]); while ( (dest = dstiter.Next ()) ) { if (P_CheckSight(source, dest, flags)) return 1; diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index ed6d44e0a..4ac008b07 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -1768,7 +1768,7 @@ FUNC(LS_Thing_Raise) } else { - TActorIterator iterator (arg0); + FActorIterator iterator (arg0); while ( (target = iterator.Next ()) ) { @@ -1795,7 +1795,7 @@ FUNC(LS_Thing_Stop) } else { - TActorIterator iterator (arg0); + FActorIterator iterator (arg0); while ( (target = iterator.Next ()) ) { @@ -1811,7 +1811,7 @@ FUNC(LS_Thing_Stop) FUNC(LS_Thing_SetGoal) // Thing_SetGoal (tid, goal, delay, chasegoal) { - TActorIterator selfiterator (arg0); + FActorIterator selfiterator (arg0); NActorIterator goaliterator (NAME_PatrolPoint, arg1); AActor *self; AActor *goal = goaliterator.Next (); @@ -1861,7 +1861,7 @@ enum FUNC(LS_Thing_SetTranslation) // Thing_SetTranslation (tid, range) { - TActorIterator iterator (arg0); + FActorIterator iterator (arg0); int range; AActor *target; bool ok = false; diff --git a/src/p_pusher.cpp b/src/p_pusher.cpp index f8d4920c8..b920cb99d 100644 --- a/src/p_pusher.cpp +++ b/src/p_pusher.cpp @@ -372,7 +372,7 @@ void MapLoader::SpawnPushers () { case Sector_SetWind: // wind { - FSectorTagIterator itr(l->args[0]); + auto itr = Level->GetSectorTagIterator(l->args[0]); while ((s = itr.Next()) >= 0) Create(DPusher::p_wind, l->args[3] ? l : nullptr, l->args[1], l->args[2], nullptr, s); l->special = 0; @@ -381,7 +381,7 @@ void MapLoader::SpawnPushers () case Sector_SetCurrent: // current { - FSectorTagIterator itr(l->args[0]); + auto itr = Level->GetSectorTagIterator(l->args[0]); while ((s = itr.Next()) >= 0) Create(DPusher::p_current, l->args[3] ? l : nullptr, l->args[1], l->args[2], nullptr, s); l->special = 0; @@ -390,7 +390,7 @@ void MapLoader::SpawnPushers () case PointPush_SetForce: // push/pull if (l->args[0]) { // [RH] Find thing by sector - FSectorTagIterator itr(l->args[0]); + auto itr = Level->GetSectorTagIterator(l->args[0]); while ((s = itr.Next()) >= 0) { AActor *thing = GetPushThing (s); @@ -403,7 +403,7 @@ void MapLoader::SpawnPushers () } } else { // [RH] Find thing by tid AActor *thing; - FActorIterator iterator (l->args[1]); + auto iterator = Level->GetActorIterator(l->args[1]); while ( (thing = iterator.Next ()) ) { diff --git a/src/p_scroll.cpp b/src/p_scroll.cpp index 8b00936cd..edb97cec0 100644 --- a/src/p_scroll.cpp +++ b/src/p_scroll.cpp @@ -433,7 +433,7 @@ void MapLoader::SpawnScrollers() if (line.special == Sector_CopyScroller) { // don't allow copying the scroller if the sector has the same tag as it would just duplicate it. - if (!tagManager.SectorHasTag(line.frontsector, line.args[0])) + if (!Level->SectorHasTag(line.frontsector, line.args[0])) { copyscrollers.Push(line.Index()); } @@ -511,7 +511,7 @@ void MapLoader::SpawnScrollers() case Scroll_Ceiling: { - FSectorTagIterator itr(l->args[0]); + auto itr = Level->GetSectorTagIterator(l->args[0]); while ((s = itr.Next()) >= 0) { Create(EScroll::sc_ceiling, -dx, dy, control, &Level->sectors[s], nullptr, accel); @@ -531,7 +531,7 @@ void MapLoader::SpawnScrollers() case Scroll_Floor: if (l->args[2] != 1) { // scroll the floor texture - FSectorTagIterator itr(l->args[0]); + auto itr = Level->GetSectorTagIterator(l->args[0]); while ((s = itr.Next()) >= 0) { Create (EScroll::sc_floor, -dx, dy, control, &Level->sectors[s], nullptr, accel); @@ -549,7 +549,7 @@ void MapLoader::SpawnScrollers() if (l->args[2] > 0) { // carry objects on the floor - FSectorTagIterator itr(l->args[0]); + auto itr = Level->GetSectorTagIterator(l->args[0]); while ((s = itr.Next()) >= 0) { Create (EScroll::sc_carry, dx, dy, control, &Level->sectors[s], nullptr, accel); @@ -570,7 +570,7 @@ void MapLoader::SpawnScrollers() // (same direction and speed as scrolling floors) case Scroll_Texture_Model: { - FLineIdIterator itr(l->args[0]); + auto itr = Level->GetLineIdIterator(l->args[0]); while ((s = itr.Next()) >= 0) { if (s != (int)i) @@ -713,7 +713,7 @@ void SetScroller (FLevelLocals *Level, int tag, EScroll type, double dx, double { if (scroller->IsType (type)) { - if (tagManager.SectorHasTag(scroller->GetSector(), tag)) + if (Level->SectorHasTag(scroller->GetSector(), tag)) { i++; scroller->SetRate (dx, dy); @@ -727,7 +727,7 @@ void SetScroller (FLevelLocals *Level, int tag, EScroll type, double dx, double } // Need to create scrollers for the sector(s) - FSectorTagIterator itr(tag); + auto itr = Level->GetSectorTagIterator(tag); while ((i = itr.Next()) >= 0) { Create (type, dx, dy, nullptr, &Level->sectors[i], nullptr, 0); diff --git a/src/p_spec.cpp b/src/p_spec.cpp index 58d911414..80191b01d 100644 --- a/src/p_spec.cpp +++ b/src/p_spec.cpp @@ -911,7 +911,7 @@ void DWallLightTransfer::DoTransfer (short lightlevel, int target, uint8_t flags void MapLoader::SetupFloorPortal (AActor *point) { - NActorIterator it (NAME_LowerStackLookOnly, point->tid); + auto it = Level->GetActorIterator(NAME_LowerStackLookOnly, point->tid); sector_t *Sector = point->Sector; auto skyv = it.Next(); if (skyv != nullptr) @@ -926,7 +926,7 @@ void MapLoader::SetupFloorPortal (AActor *point) void MapLoader::SetupCeilingPortal (AActor *point) { - NActorIterator it (NAME_UpperStackLookOnly, point->tid); + auto it = Level->GetActorIterator(NAME_UpperStackLookOnly, point->tid); sector_t *Sector = point->Sector; auto skyv = it.Next(); if (skyv != nullptr) @@ -941,7 +941,7 @@ void MapLoader::SetupCeilingPortal (AActor *point) void MapLoader::SetupPortals() { - TThinkerIterator it("StackPoint"); + auto it = Level->GetThinkerIterator(NAME_StackPoint); AActor *pt; TArray points; @@ -1017,7 +1017,7 @@ void MapLoader::SetPortal(sector_t *sector, int plane, unsigned pnum, double alp void MapLoader::CopyPortal(int sectortag, int plane, unsigned pnum, double alpha, bool tolines) { int s; - FSectorTagIterator itr(sectortag); + auto itr = Level->GetSectorTagIterator(sectortag); while ((s = itr.Next()) >= 0) { SetPortal(&Level->sectors[s], plane, pnum, alpha); @@ -1038,7 +1038,7 @@ void MapLoader::CopyPortal(int sectortag, int plane, unsigned pnum, double alpha } else { - FSectorTagIterator itr(line.args[0]); + auto itr = Level->GetSectorTagIterator(line.args[0]); while ((s = itr.Next()) >= 0) { SetPortal(&Level->sectors[s], plane, pnum, alpha); @@ -1055,7 +1055,7 @@ void MapLoader::CopyPortal(int sectortag, int plane, unsigned pnum, double alpha } else { - FLineIdIterator itr(line.args[0]); + auto itr = Level->GetLineIdIterator(line.args[0]); while ((s = itr.Next()) >= 0) { Level->lines[s].portaltransferred = pnum; @@ -1318,7 +1318,7 @@ void MapLoader::SpawnSpecials () SpawnFriction(); // phares 3/12/98: New friction model using linedefs SpawnPushers(); // phares 3/20/98: New pusher model using linedefs - TThinkerIterator it2("SkyCamCompat"); + auto it2 = Level->GetThinkerIterator(NAME_SkyCamCompat); AActor *pt2; while ((pt2 = it2.Next())) { @@ -1363,7 +1363,7 @@ void MapLoader::SpawnSpecials () { sec->MoreFlags |= SECMF_NOFAKELIGHT; } - FSectorTagIterator itr(line.args[0]); + auto itr = Level->GetSectorTagIterator(line.args[0]); while ((s = itr.Next()) >= 0) { Level->sectors[s].heightsec = sec; @@ -1439,7 +1439,7 @@ void MapLoader::SpawnSpecials () case Init_Gravity: { double grav = line.Delta().Length() / 100.; - FSectorTagIterator itr(line.args[0]); + auto itr = Level->GetSectorTagIterator(line.args[0]); while ((s = itr.Next()) >= 0) Level->sectors[s].gravity = grav; } @@ -1451,7 +1451,7 @@ void MapLoader::SpawnSpecials () case Init_Damage: { int damage = int(line.Delta().Length()); - FSectorTagIterator itr(line.args[0]); + auto itr = Level->GetSectorTagIterator(line.args[0]); while ((s = itr.Next()) >= 0) { sector_t *sec = &Level->sectors[s]; @@ -1492,7 +1492,7 @@ void MapLoader::SpawnSpecials () case Init_TransferSky: { - FSectorTagIterator itr(line.args[0]); + auto itr = Level->GetSectorTagIterator(line.args[0]); while ((s = itr.Next()) >= 0) Level->sectors[s].sky = (line.Index() + 1) | PL_SKYFLAT; break; @@ -1600,7 +1600,7 @@ void P_SetSectorFriction (FLevelLocals *Level, int tag, int amount, bool alterFl // higher friction value actually means 'less friction'. movefactor = FrictionToMoveFactor(friction); - FSectorTagIterator itr(tag); + auto itr = Level->GetSectorTagIterator(tag); while ((s = itr.Next()) >= 0) { // killough 8/28/98: diff --git a/src/p_xlat.cpp b/src/p_xlat.cpp index 315b64c3c..b2e908f3c 100644 --- a/src/p_xlat.cpp +++ b/src/p_xlat.cpp @@ -290,56 +290,6 @@ void P_TranslateLineDef (line_t *ld, maplinedef_t *mld, int lineindexforid) memset (ld->args, 0, sizeof(ld->args)); } -// Now that ZDoom again gives the option of using Doom's original teleport -// behavior, only teleport dests in a sector with a 0 tag need to be -// given a TID. And since Doom format maps don't have TIDs, we can safely -// give them TID 1. - -void P_TranslateTeleportThings () -{ - AActor *dest; - TThinkerIterator iterator(NAME_TeleportDest); - bool foundSomething = false; - - while ( (dest = iterator.Next()) ) - { - if (!tagManager.SectorHasTags(dest->Sector)) - { - dest->tid = 1; - dest->AddToHash (); - foundSomething = true; - } - } - - if (foundSomething) - { - for (auto &line : level.lines) - { - if (line.special == Teleport) - { - if (line.args[1] == 0) - { - line.args[0] = 1; - } - } - else if (line.special == Teleport_NoFog) - { - if (line.args[2] == 0) - { - line.args[0] = 1; - } - } - else if (line.special == Teleport_ZombieChanger) - { - if (line.args[1] == 0) - { - line.args[0] = 1; - } - } - } - } -} - int P_TranslateSectorSpecial (int special) { int mask = 0; @@ -498,4 +448,4 @@ const int* (*XlatExprEval[XEXP_COUNT])(int *dest, const int *xnode, FXlatExprSta Expr_Or, Expr_Xor, Expr_Neg -}; \ No newline at end of file +}; From 9f8dd661893eed34cd359a4b864c8efb00692643 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 24 Jan 2019 01:05:07 +0100 Subject: [PATCH 004/164] - changed Polyobject thinkers to operate on the actual polyobjects instead of indices This also changes the action special interface to pass a Level parameter to the separate functions and makes a few other minor adjustments to the polyobject code. --- src/d_main.cpp | 2 +- src/g_level.cpp | 4 +- src/g_levellocals.h | 9 + src/hwrenderer/scene/hw_drawinfo.cpp | 2 +- src/maploader/polyobjects.cpp | 2 +- src/p_acs.cpp | 8 +- src/p_lnspec.cpp | 158 ++++++------- src/p_lnspec.h | 5 +- src/p_saveg.cpp | 130 +++++------ src/p_saveg.h | 2 +- src/p_setup.cpp | 2 +- src/po_man.cpp | 325 +++++++++++++-------------- src/po_man.h | 26 ++- src/polyrenderer/poly_renderer.cpp | 2 +- src/swrenderer/scene/r_scene.cpp | 2 +- 15 files changed, 331 insertions(+), 348 deletions(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index 82189c72a..d340e7cad 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -525,7 +525,7 @@ CUSTOM_CVAR (Int, compatflags, 0, CVAR_ARCHIVE|CVAR_SERVERINFO) i_compatflags = GetCompatibility(self) | ii_compatflags; if ((old ^ i_compatflags) & COMPATF_POLYOBJ) { - FPolyObj::ClearAllSubsectorLinks(); + level.ClearAllSubsectorLinks(); } } diff --git a/src/g_level.cpp b/src/g_level.cpp index 99be28e05..49047a487 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1656,7 +1656,7 @@ void G_SnapshotLevel () if (arc.OpenWriter(save_formatted)) { SaveVersion = SAVEVER; - G_SerializeLevel(arc, false); + G_SerializeLevel(arc, &level, false); level.info->Snapshot = arc.GetCompressedOutput(); } } @@ -1683,7 +1683,7 @@ void G_UnSnapshotLevel (bool hubLoad) return; } - G_SerializeLevel (arc, hubLoad); + G_SerializeLevel (arc, &level, hubLoad); level.FromSnapshot = true; TThinkerIterator it(NAME_PlayerPawn); diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 820698649..d499c7b5a 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -115,6 +115,8 @@ struct FLevelLocals : public FLevelData void ClearLevelData(); void ClearPortals(); bool CheckIfExitIsGood(AActor *self, level_info_t *newmap); + void FormatMapName(FString &mapname, const char *mapnamecolor); + void ClearAllSubsectorLinks(); FSectorTagIterator GetSectorTagIterator(int tag) { return FSectorTagIterator(tag); @@ -160,6 +162,13 @@ struct FLevelLocals : public FLevelData { return P_PointInSector(pos); } + + FPolyObj *GetPolyobj (int polyNum) + { + auto index = Polyobjects.FindEx([=](const auto &poly) { return poly.tag == polyNum; }); + return index == Polyobjects.Size()? nullptr : &Polyobjects[index]; + } + uint8_t md5[16]; // for savegame validation. If the MD5 does not match the savegame won't be loaded. int time; // time in the hub diff --git a/src/hwrenderer/scene/hw_drawinfo.cpp b/src/hwrenderer/scene/hw_drawinfo.cpp index ca3058243..524cf660f 100644 --- a/src/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/hwrenderer/scene/hw_drawinfo.cpp @@ -424,7 +424,7 @@ void HWDrawInfo::CreateScene() // reset the portal manager screen->mPortalState->StartFrame(); - PO_LinkToSubsectors(); + PO_LinkToSubsectors(&level); ProcessAll.Clock(); diff --git a/src/maploader/polyobjects.cpp b/src/maploader/polyobjects.cpp index 910cf4099..61b2bcb5d 100644 --- a/src/maploader/polyobjects.cpp +++ b/src/maploader/polyobjects.cpp @@ -282,7 +282,7 @@ void MapLoader::TranslateToStartSpot (int tag, const DVector2 &origin) FPolyObj *po; DVector2 delta; - po = PO_GetPolyobj(tag); + po = Level->GetPolyobj(tag); if (po == nullptr) { // didn't match the tag with a polyobj tag Printf(TEXTCOLOR_RED "TranslateToStartSpot: Unable to match polyobj tag: %d\n", tag); diff --git a/src/p_acs.cpp b/src/p_acs.cpp index c0ecb4579..ddf02616c 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -5654,7 +5654,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) const char *seqname = level.Behaviors.LookupString(args[1]); if (seqname != NULL) { - FPolyObj *poly = PO_GetPolyobj(args[0]); + FPolyObj *poly = level.GetPolyobj(args[0]); if (poly != NULL) { SN_StartSequence(poly, seqname, 0); @@ -5665,7 +5665,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) case ACSF_GetPolyobjX: { - FPolyObj *poly = PO_GetPolyobj(args[0]); + FPolyObj *poly = level.GetPolyobj(args[0]); if (poly != NULL) { return DoubleToACS(poly->StartSpot.pos.X); @@ -5675,7 +5675,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) case ACSF_GetPolyobjY: { - FPolyObj *poly = PO_GetPolyobj(args[0]); + FPolyObj *poly = level.GetPolyobj(args[0]); if (poly != NULL) { return DoubleToACS(poly->StartSpot.pos.Y); @@ -6817,7 +6817,7 @@ int DLevelScript::RunScript () case SCRIPT_PolyWait: // Wait for polyobj(s) to stop moving, then enter state running - if (!PO_Busy (statedata)) + if (!PO_Busy (&level, statedata)) { state = SCRIPT_Running; } diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index 4ac008b07..395ea2c1f 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -71,7 +71,7 @@ static const uint8_t ChangeMap[8] = { 0, 1, 5, 3, 7, 2, 6, 0 }; -#define FUNC(a) static int a (line_t *ln, AActor *it, bool backSide, \ +#define FUNC(a) static int a (FLevelLocals *Level, line_t *ln, AActor *it, bool backSide, \ int arg0, int arg1, int arg2, int arg3, int arg4) #define SPEED(a) ((a) / 8.) @@ -141,31 +141,31 @@ FUNC(LS_NOP) FUNC(LS_Polyobj_RotateLeft) // Polyobj_RotateLeft (po, speed, angle) { - return EV_RotatePoly (ln, arg0, arg1, arg2, 1, false); + return EV_RotatePoly (Level, ln, arg0, arg1, arg2, 1, false); } FUNC(LS_Polyobj_RotateRight) // Polyobj_rotateRight (po, speed, angle) { - return EV_RotatePoly (ln, arg0, arg1, arg2, -1, false); + return EV_RotatePoly (Level, ln, arg0, arg1, arg2, -1, false); } FUNC(LS_Polyobj_Move) // Polyobj_Move (po, speed, angle, distance) { - return EV_MovePoly (ln, arg0, SPEED(arg1), BYTEANGLE(arg2), arg3, false); + return EV_MovePoly (Level, ln, arg0, SPEED(arg1), BYTEANGLE(arg2), arg3, false); } FUNC(LS_Polyobj_MoveTimes8) // Polyobj_MoveTimes8 (po, speed, angle, distance) { - return EV_MovePoly (ln, arg0, SPEED(arg1), BYTEANGLE(arg2), arg3 * 8, false); + return EV_MovePoly (Level, ln, arg0, SPEED(arg1), BYTEANGLE(arg2), arg3 * 8, false); } FUNC(LS_Polyobj_MoveTo) // Polyobj_MoveTo (po, speed, x, y) { - return EV_MovePolyTo (ln, arg0, SPEED(arg1), DVector2(arg2, arg3), false); + return EV_MovePolyTo (Level, ln, arg0, SPEED(arg1), DVector2(arg2, arg3), false); } FUNC(LS_Polyobj_MoveToSpot) @@ -174,49 +174,49 @@ FUNC(LS_Polyobj_MoveToSpot) FActorIterator iterator (arg2); AActor *spot = iterator.Next(); if (spot == NULL) return false; - return EV_MovePolyTo (ln, arg0, SPEED(arg1), spot->Pos(), false); + return EV_MovePolyTo (Level, ln, arg0, SPEED(arg1), spot->Pos(), false); } FUNC(LS_Polyobj_DoorSwing) // Polyobj_DoorSwing (po, speed, angle, delay) { - return EV_OpenPolyDoor (ln, arg0, arg1, BYTEANGLE(arg2), arg3, 0, PODOOR_SWING); + return EV_OpenPolyDoor (Level, ln, arg0, arg1, BYTEANGLE(arg2), arg3, 0, PODOOR_SWING); } FUNC(LS_Polyobj_DoorSlide) // Polyobj_DoorSlide (po, speed, angle, distance, delay) { - return EV_OpenPolyDoor (ln, arg0, SPEED(arg1), BYTEANGLE(arg2), arg4, arg3, PODOOR_SLIDE); + return EV_OpenPolyDoor (Level, ln, arg0, SPEED(arg1), BYTEANGLE(arg2), arg4, arg3, PODOOR_SLIDE); } FUNC(LS_Polyobj_OR_RotateLeft) // Polyobj_OR_RotateLeft (po, speed, angle) { - return EV_RotatePoly (ln, arg0, arg1, arg2, 1, true); + return EV_RotatePoly (Level, ln, arg0, arg1, arg2, 1, true); } FUNC(LS_Polyobj_OR_RotateRight) // Polyobj_OR_RotateRight (po, speed, angle) { - return EV_RotatePoly (ln, arg0, arg1, arg2, -1, true); + return EV_RotatePoly (Level, ln, arg0, arg1, arg2, -1, true); } FUNC(LS_Polyobj_OR_Move) // Polyobj_OR_Move (po, speed, angle, distance) { - return EV_MovePoly (ln, arg0, SPEED(arg1), BYTEANGLE(arg2), arg3, true); + return EV_MovePoly (Level, ln, arg0, SPEED(arg1), BYTEANGLE(arg2), arg3, true); } FUNC(LS_Polyobj_OR_MoveTimes8) // Polyobj_OR_MoveTimes8 (po, speed, angle, distance) { - return EV_MovePoly (ln, arg0, SPEED(arg1), BYTEANGLE(arg2), arg3 * 8, true); + return EV_MovePoly (Level, ln, arg0, SPEED(arg1), BYTEANGLE(arg2), arg3 * 8, true); } FUNC(LS_Polyobj_OR_MoveTo) // Polyobj_OR_MoveTo (po, speed, x, y) { - return EV_MovePolyTo (ln, arg0, SPEED(arg1), DVector2(arg2, arg3), true); + return EV_MovePolyTo (Level, ln, arg0, SPEED(arg1), DVector2(arg2, arg3), true); } FUNC(LS_Polyobj_OR_MoveToSpot) @@ -225,13 +225,13 @@ FUNC(LS_Polyobj_OR_MoveToSpot) FActorIterator iterator (arg2); AActor *spot = iterator.Next(); if (spot == NULL) return false; - return EV_MovePolyTo (ln, arg0, SPEED(arg1), spot->Pos(), true); + return EV_MovePolyTo (Level, ln, arg0, SPEED(arg1), spot->Pos(), true); } FUNC(LS_Polyobj_Stop) // Polyobj_Stop (po) { - return EV_StopPoly (arg0); + return EV_StopPoly (Level, arg0); } FUNC(LS_Door_Close) @@ -258,7 +258,7 @@ FUNC(LS_Door_LockedRaise) #if 0 // In Hexen this originally created a thinker running for nearly 4 years. // Let's not do this unless it becomes necessary because this can hang tagwait. - return EV_DoDoor (arg2 || (level.flags2 & LEVEL2_HEXENHACK) ? DDoor::doorRaise : DDoor::doorOpen, ln, it, + return EV_DoDoor (arg2 || (Level->flags2 & LEVEL2_HEXENHACK) ? DDoor::doorRaise : DDoor::doorOpen, ln, it, #else return EV_DoDoor (arg2 ? DDoor::doorRaise : DDoor::doorOpen, ln, it, #endif @@ -1060,7 +1060,7 @@ FUNC(LS_Generic_Lift) FUNC(LS_Exit_Normal) // Exit_Normal (position) { - if (level.CheckIfExitIsGood (it, FindLevelInfo(G_GetExitMap()))) + if (Level->CheckIfExitIsGood (it, FindLevelInfo(G_GetExitMap()))) { G_ExitLevel (arg0, false); return true; @@ -1071,7 +1071,7 @@ FUNC(LS_Exit_Normal) FUNC(LS_Exit_Secret) // Exit_Secret (position) { - if (level.CheckIfExitIsGood (it, FindLevelInfo(G_GetSecretExitMap()))) + if (Level->CheckIfExitIsGood (it, FindLevelInfo(G_GetSecretExitMap()))) { G_SecretExitLevel (arg0); return true; @@ -1086,7 +1086,7 @@ FUNC(LS_Teleport_NewMap) { level_info_t *info = FindLevelByNum (arg0); - if (info && level.CheckIfExitIsGood (it, info)) + if (info && Level->CheckIfExitIsGood (it, info)) { G_ChangeLevel(info->MapName, arg1, arg2 ? CHANGELEVEL_KEEPFACING : 0); return true; @@ -1181,7 +1181,7 @@ FUNC(LS_TeleportInSector) FUNC(LS_Teleport_EndGame) // Teleport_EndGame () { - if (!backSide && level.CheckIfExitIsGood (it, NULL)) + if (!backSide && Level->CheckIfExitIsGood (it, NULL)) { G_ChangeLevel(NULL, 0, 0); return true; @@ -1219,7 +1219,7 @@ FUNC(LS_ThrustThing) } else if (it) { - if (level.flags2 & LEVEL2_HEXENHACK && backSide) + if (Level->flags2 & LEVEL2_HEXENHACK && backSide) { return false; } @@ -1913,7 +1913,7 @@ FUNC(LS_ACS_Execute) if (arg1 == 0) { - mapname = level.MapName; + mapname = Level->MapName; } else if ((info = FindLevelByNum(arg1)) != NULL) { @@ -1936,7 +1936,7 @@ FUNC(LS_ACS_ExecuteAlways) if (arg1 == 0) { - mapname = level.MapName; + mapname = Level->MapName; } else if ((info = FindLevelByNum(arg1)) != NULL) { @@ -1955,7 +1955,7 @@ FUNC(LS_ACS_LockedExecute) if (arg4 && !P_CheckKeys (it, arg4, true)) return false; else - return LS_ACS_Execute (ln, it, backSide, arg0, arg1, arg2, arg3, 0); + return LS_ACS_Execute (Level, ln, it, backSide, arg0, arg1, arg2, arg3, 0); } FUNC(LS_ACS_LockedExecuteDoor) @@ -1964,7 +1964,7 @@ FUNC(LS_ACS_LockedExecuteDoor) if (arg4 && !P_CheckKeys (it, arg4, false)) return false; else - return LS_ACS_Execute (ln, it, backSide, arg0, arg1, arg2, arg3, 0); + return LS_ACS_Execute (Level, ln, it, backSide, arg0, arg1, arg2, arg3, 0); } FUNC(LS_ACS_ExecuteWithResult) @@ -1976,7 +1976,7 @@ FUNC(LS_ACS_ExecuteWithResult) int args[4] = { arg1, arg2, arg3, arg4 }; int flags = (backSide ? ACS_BACKSIDE : 0) | ACS_ALWAYS | ACS_WANTRESULT; - return P_StartScript (it, ln, arg0, level.MapName, args, 4, flags); + return P_StartScript (it, ln, arg0, Level->MapName, args, 4, flags); } FUNC(LS_ACS_Suspend) @@ -1985,7 +1985,7 @@ FUNC(LS_ACS_Suspend) level_info_t *info; if (arg1 == 0) - P_SuspendScript (arg0, level.MapName); + P_SuspendScript (arg0, Level->MapName); else if ((info = FindLevelByNum (arg1)) ) P_SuspendScript (arg0, info->MapName); @@ -1998,7 +1998,7 @@ FUNC(LS_ACS_Terminate) level_info_t *info; if (arg1 == 0) - P_TerminateScript (arg0, level.MapName); + P_TerminateScript (arg0, Level->MapName); else if ((info = FindLevelByNum (arg1)) ) P_TerminateScript (arg0, info->MapName); @@ -2197,7 +2197,7 @@ FUNC(LS_Sector_ChangeSound) FSectorTagIterator itr(arg0); while ((secNum = itr.Next()) >= 0) { - level.sectors[secNum].seqType = arg1; + Level->sectors[secNum].seqType = arg1; rtn = true; } return rtn; @@ -2219,7 +2219,7 @@ FUNC(LS_Sector_ChangeFlags) arg2 &= ~SECF_NOMODIFY; while ((secNum = itr.Next()) >= 0) { - level.sectors[secNum].Flags = (level.sectors[secNum].Flags | arg1) & ~arg2; + Level->sectors[secNum].Flags = (Level->sectors[secNum].Flags | arg1) & ~arg2; rtn = true; } return rtn; @@ -2265,8 +2265,8 @@ FUNC(LS_Sector_SetTranslucent) FSectorTagIterator itr(arg0); while ((secnum = itr.Next()) >= 0) { - level.sectors[secnum].SetAlpha(arg1, clamp(arg2, 0, 255) / 255.); - level.sectors[secnum].ChangeFlags(arg1, ~PLANEF_ADDITIVE, arg3? PLANEF_ADDITIVE:0); + Level->sectors[secnum].SetAlpha(arg1, clamp(arg2, 0, 255) / 255.); + Level->sectors[secnum].ChangeFlags(arg1, ~PLANEF_ADDITIVE, arg3? PLANEF_ADDITIVE:0); } return true; } @@ -2281,7 +2281,7 @@ FUNC(LS_Sector_SetLink) int control = P_FindFirstSectorFromTag(arg0); if (control >= 0) { - return P_AddSectorLinks(&level.sectors[control], arg1, arg2, arg3); + return P_AddSectorLinks(&Level->sectors[control], arg1, arg2, arg3); } } return false; @@ -2401,10 +2401,10 @@ FUNC(LS_Sector_SetDamage) arg3 = 1; } } - level.sectors[secnum].damageamount = (short)arg1; - level.sectors[secnum].damagetype = MODtoDamageType(arg2); - level.sectors[secnum].damageinterval = (short)arg3; - level.sectors[secnum].leakydamage = (short)arg4; + Level->sectors[secnum].damageamount = (short)arg1; + Level->sectors[secnum].damagetype = MODtoDamageType(arg2); + Level->sectors[secnum].damageinterval = (short)arg3; + Level->sectors[secnum].leakydamage = (short)arg4; } return true; } @@ -2421,7 +2421,7 @@ FUNC(LS_Sector_SetGravity) FSectorTagIterator itr(arg0); int secnum; while ((secnum = itr.Next()) >= 0) - level.sectors[secnum].gravity = gravity; + Level->sectors[secnum].gravity = gravity; return true; } @@ -2433,7 +2433,7 @@ FUNC(LS_Sector_SetColor) int secnum; while ((secnum = itr.Next()) >= 0) { - level.sectors[secnum].SetColor(PalEntry(arg1, arg2, arg3), arg4); + Level->sectors[secnum].SetColor(PalEntry(arg1, arg2, arg3), arg4); } return true; @@ -2446,7 +2446,7 @@ FUNC(LS_Sector_SetFade) int secnum; while ((secnum = itr.Next()) >= 0) { - level.sectors[secnum].SetFade(PalEntry(arg1, arg2, arg3)); + Level->sectors[secnum].SetFade(PalEntry(arg1, arg2, arg3)); } return true; } @@ -2461,8 +2461,8 @@ FUNC(LS_Sector_SetCeilingPanning) int secnum; while ((secnum = itr.Next()) >= 0) { - level.sectors[secnum].SetXOffset(sector_t::ceiling, xofs); - level.sectors[secnum].SetYOffset(sector_t::ceiling, yofs); + Level->sectors[secnum].SetXOffset(sector_t::ceiling, xofs); + Level->sectors[secnum].SetYOffset(sector_t::ceiling, yofs); } return true; } @@ -2477,8 +2477,8 @@ FUNC(LS_Sector_SetFloorPanning) int secnum; while ((secnum = itr.Next()) >= 0) { - level.sectors[secnum].SetXOffset(sector_t::floor, xofs); - level.sectors[secnum].SetYOffset(sector_t::floor, yofs); + Level->sectors[secnum].SetXOffset(sector_t::floor, xofs); + Level->sectors[secnum].SetYOffset(sector_t::floor, yofs); } return true; } @@ -2499,9 +2499,9 @@ FUNC(LS_Sector_SetFloorScale) while ((secnum = itr.Next()) >= 0) { if (xscale) - level.sectors[secnum].SetXScale(sector_t::floor, xscale); + Level->sectors[secnum].SetXScale(sector_t::floor, xscale); if (yscale) - level.sectors[secnum].SetYScale(sector_t::floor, yscale); + Level->sectors[secnum].SetYScale(sector_t::floor, yscale); } return true; } @@ -2522,9 +2522,9 @@ FUNC(LS_Sector_SetCeilingScale) while ((secnum = itr.Next()) >= 0) { if (xscale) - level.sectors[secnum].SetXScale(sector_t::ceiling, xscale); + Level->sectors[secnum].SetXScale(sector_t::ceiling, xscale); if (yscale) - level.sectors[secnum].SetYScale(sector_t::ceiling, yscale); + Level->sectors[secnum].SetYScale(sector_t::ceiling, yscale); } return true; } @@ -2544,9 +2544,9 @@ FUNC(LS_Sector_SetFloorScale2) while ((secnum = itr.Next()) >= 0) { if (arg1) - level.sectors[secnum].SetXScale(sector_t::floor, xscale); + Level->sectors[secnum].SetXScale(sector_t::floor, xscale); if (arg2) - level.sectors[secnum].SetYScale(sector_t::floor, yscale); + Level->sectors[secnum].SetYScale(sector_t::floor, yscale); } return true; } @@ -2566,9 +2566,9 @@ FUNC(LS_Sector_SetCeilingScale2) while ((secnum = itr.Next()) >= 0) { if (arg1) - level.sectors[secnum].SetXScale(sector_t::ceiling, xscale); + Level->sectors[secnum].SetXScale(sector_t::ceiling, xscale); if (arg2) - level.sectors[secnum].SetYScale(sector_t::ceiling, yscale); + Level->sectors[secnum].SetYScale(sector_t::ceiling, yscale); } return true; } @@ -2583,8 +2583,8 @@ FUNC(LS_Sector_SetRotation) int secnum; while ((secnum = itr.Next()) >= 0) { - level.sectors[secnum].SetAngle(sector_t::floor, floor); - level.sectors[secnum].SetAngle(sector_t::ceiling, ceiling); + Level->sectors[secnum].SetAngle(sector_t::floor, floor); + Level->sectors[secnum].SetAngle(sector_t::ceiling, ceiling); } return true; } @@ -2631,7 +2631,7 @@ FUNC(LS_Line_SetTextureOffset) int line; while ((line = itr.Next()) >= 0) { - side_t *side = level.lines[line].sidedef[arg3]; + side_t *side = Level->lines[line].sidedef[arg3]; if (side != NULL) { @@ -2686,7 +2686,7 @@ FUNC(LS_Line_SetTextureScale) int line; while ((line = itr.Next()) >= 0) { - side_t *side = level.lines[line].sidedef[arg3]; + side_t *side = Level->lines[line].sidedef[arg3]; if (side != NULL) { if ((arg4&8)==0) @@ -2760,7 +2760,7 @@ FUNC(LS_Line_SetBlocking) int line; while ((line = itr.Next()) >= 0) { - level.lines[line].flags = (level.lines[line].flags & ~clearflags) | setflags; + Level->lines[line].flags = (Level->lines[line].flags & ~clearflags) | setflags; } return true; } @@ -2792,7 +2792,7 @@ FUNC(LS_Line_SetAutomapFlags) int line; while ((line = itr.Next()) >= 0) { - level.lines[line].flags = (level.lines[line].flags & ~clearflags) | setflags; + Level->lines[line].flags = (Level->lines[line].flags & ~clearflags) | setflags; } return true; @@ -2807,7 +2807,7 @@ FUNC(LS_Line_SetAutomapStyle) int line; while ((line = itr.Next()) >= 0) { - level.lines[line].automapstyle = (AutomapLineStyle) arg1; + Level->lines[line].automapstyle = (AutomapLineStyle) arg1; } return true; @@ -2953,7 +2953,7 @@ FUNC(LS_SetPlayerProperty) } else if (it->player - players == consoleplayer) { - level.flags2 |= LEVEL2_ALLMAP; + Level->flags2 |= LEVEL2_ALLMAP; } } else @@ -2968,7 +2968,7 @@ FUNC(LS_SetPlayerProperty) } else if (it->player - players == consoleplayer) { - level.flags2 &= ~LEVEL2_ALLMAP; + Level->flags2 &= ~LEVEL2_ALLMAP; } } } @@ -2993,7 +2993,7 @@ FUNC(LS_SetPlayerProperty) } else if (i == consoleplayer) { - level.flags2 |= LEVEL2_ALLMAP; + Level->flags2 |= LEVEL2_ALLMAP; } } else @@ -3008,7 +3008,7 @@ FUNC(LS_SetPlayerProperty) } else if (i == consoleplayer) { - level.flags2 &= ~LEVEL2_ALLMAP; + Level->flags2 &= ~LEVEL2_ALLMAP; } } } @@ -3107,14 +3107,14 @@ FUNC(LS_TranslucentLine) int linenum; while ((linenum = itr.Next()) >= 0) { - level.lines[linenum].alpha = clamp(arg1, 0, 255) / 255.; + Level->lines[linenum].alpha = clamp(arg1, 0, 255) / 255.; if (arg2 == 0) { - level.lines[linenum].flags &= ~ML_ADDTRANS; + Level->lines[linenum].flags &= ~ML_ADDTRANS; } else if (arg2 == 1) { - level.lines[linenum].flags |= ML_ADDTRANS; + Level->lines[linenum].flags |= ML_ADDTRANS; } else { @@ -3129,7 +3129,7 @@ FUNC(LS_Autosave) { if (gameaction != ga_savegame) { - level.flags2 &= ~LEVEL2_NOAUTOSAVEHINT; + Level->flags2 &= ~LEVEL2_NOAUTOSAVEHINT; Net_WriteByte (DEM_CHECKAUTOSAVE); } return true; @@ -3237,7 +3237,7 @@ FUNC(LS_ClearForceField) int secnum; while ((secnum = itr.Next()) >= 0) { - sector_t *sec = &level.sectors[secnum]; + sector_t *sec = &Level->sectors[secnum]; rtn = true; sec->RemoveForceField(); @@ -3413,9 +3413,9 @@ FUNC(LS_Sector_SetPlaneReflection) while ((secnum = itr.Next()) >= 0) { - sector_t * s = &level.sectors[secnum]; + sector_t * s = &Level->sectors[secnum]; if (!s->floorplane.isSlope()) s->reflect[sector_t::floor] = arg1 / 255.f; - if (!s->ceilingplane.isSlope()) level.sectors[secnum].reflect[sector_t::ceiling] = arg2 / 255.f; + if (!s->ceilingplane.isSlope()) Level->sectors[secnum].reflect[sector_t::ceiling] = arg2 / 255.f; } return true; @@ -3428,15 +3428,15 @@ FUNC(LS_SetGlobalFogParameter) switch (arg0) { case 0: - level.fogdensity = arg1 >> 1; + Level->fogdensity = arg1 >> 1; return true; case 1: - level.outsidefogdensity = arg1 >> 1; + Level->outsidefogdensity = arg1 >> 1; return true; case 2: - level.skyfog = arg1; + Level->skyfog = arg1; return true; default: @@ -3454,7 +3454,7 @@ FUNC(LS_Sector_SetFloorGlow) while ((secnum = itr.Next()) >= 0) { - sector_t * s = &level.sectors[secnum]; + sector_t * s = &Level->sectors[secnum]; s->SetGlowColor(sector_t::floor, color); s->SetGlowHeight(sector_t::floor, float(arg1)); } @@ -3471,7 +3471,7 @@ FUNC(LS_Sector_SetCeilingGlow) while ((secnum = itr.Next()) >= 0) { - sector_t * s = &level.sectors[secnum]; + sector_t * s = &Level->sectors[secnum]; s->SetGlowColor(sector_t::ceiling, color); s->SetGlowHeight(sector_t::ceiling, float(arg1)); } @@ -3489,7 +3489,7 @@ FUNC(LS_Line_SetHealth) while ((l = itr.Next()) >= 0) { - line_t* line = &level.lines[l]; + line_t* line = &Level->lines[l]; line->health = arg1; if (line->healthgroup) P_SetHealthGroupHealth(line->healthgroup, arg1); @@ -3508,7 +3508,7 @@ FUNC(LS_Sector_SetHealth) while ((s = itr.Next()) >= 0) { - sector_t* sector = &level.sectors[s]; + sector_t* sector = &Level->sectors[s]; if (arg1 == SECPART_Ceiling) { sector->healthceiling = arg2; @@ -3937,7 +3937,7 @@ int P_ExecuteSpecial(int num, { if (num >= 0 && num < (int)countof(LineSpecials)) { - return LineSpecials[num](line, activator, backSide, arg1, arg2, arg3, arg4, arg5); + return LineSpecials[num](&level, line, activator, backSide, arg1, arg2, arg3, arg4, arg5); } return 0; } diff --git a/src/p_lnspec.h b/src/p_lnspec.h index 034c5f2b6..05d5dd0c6 100644 --- a/src/p_lnspec.h +++ b/src/p_lnspec.h @@ -187,10 +187,12 @@ typedef enum { struct line_t; class AActor; +struct FLevelLocals; FName MODtoDamageType (int mod); -typedef int (*lnSpecFunc)(struct line_t *line, +typedef int (*lnSpecFunc)(FLevelLocals *Level, + struct line_t *line, class AActor *activator, bool backSide, int arg1, @@ -211,6 +213,7 @@ int P_GetMaxLineSpecial(); int P_FindLineSpecial (const char *string, int *min_args=NULL, int *max_args=NULL); bool P_ActivateThingSpecial(AActor * thing, AActor * trigger, bool death=false); int P_ExecuteSpecial(int num, + //FLevelLocals *lev, must be added later. struct line_t *line, class AActor *activator, bool backSide, diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 714b9bb2d..3e2e78dca 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -248,11 +248,6 @@ FSerializer &Serialize(FSerializer &arc, const char *key, secplane_t &p, secplan FSerializer &Serialize(FSerializer &arc, const char *key, sector_t &p, sector_t *def) { - // save the Scroll data here because it's a lot easier to handle a default. - // Just writing out the full array can massively inflate the archive for no gain. - DVector2 scroll = { 0,0 }, nul = { 0,0 }; - if (arc.isWriting() && level.Scrolls.Size() > 0) scroll = level.Scrolls[p.sectornum]; - if (arc.BeginObject(key)) { arc("floorplane", p.floorplane, def->floorplane) @@ -300,23 +295,12 @@ FSerializer &Serialize(FSerializer &arc, const char *key, sector_t &p, sector_t ("gravity", p.gravity, def->gravity) .Terrain("floorterrain", p.terrainnum[0], &def->terrainnum[0]) .Terrain("ceilingterrain", p.terrainnum[1], &def->terrainnum[1]) - ("scrolls", scroll, nul) ("healthfloor", p.healthfloor, def->healthfloor) ("healthceiling", p.healthceiling, def->healthceiling) ("health3d", p.health3d, def->health3d) // GZDoom exclusive: .Array("reflect", p.reflect, def->reflect, 2, true) .EndObject(); - - if (arc.isReading() && !scroll.isZero()) - { - if (level.Scrolls.Size() == 0) - { - level.Scrolls.Resize(level.sectors.Size()); - memset(&level.Scrolls[0], 0, sizeof(level.Scrolls[0])*level.Scrolls.Size()); - level.Scrolls[p.sectornum] = scroll; - } - } } return arc; } @@ -575,7 +559,7 @@ void P_SerializeSounds(FSerializer &arc) void CopyPlayer(player_t *dst, player_t *src, const char *name); static void ReadOnePlayer(FSerializer &arc, bool skipload); static void ReadMultiplePlayers(FSerializer &arc, int numPlayers, int numPlayersNow, bool skipload); -static void SpawnExtraPlayers(); +static void SpawnExtraPlayers(FLevelLocals *Level); //========================================================================== // @@ -583,7 +567,7 @@ static void SpawnExtraPlayers(); // //========================================================================== -void P_SerializePlayers(FSerializer &arc, bool skipload) +void P_SerializePlayers(FLevelLocals *Level, FSerializer &arc, bool skipload) { int numPlayers, numPlayersNow; int i; @@ -640,7 +624,7 @@ void P_SerializePlayers(FSerializer &arc, bool skipload) } if (!skipload && numPlayersNow > numPlayers) { - SpawnExtraPlayers(); + SpawnExtraPlayers(Level); } // Redo pitch limits, since the spawned player has them at 0. players[consoleplayer].SendPitchLimits(); @@ -891,7 +875,7 @@ void CopyPlayer(player_t *dst, player_t *src, const char *name) // //========================================================================== -static void SpawnExtraPlayers() +static void SpawnExtraPlayers(FLevelLocals *Level) { // If there are more players now than there were in the savegame, // be sure to spawn the extra players. @@ -907,7 +891,7 @@ static void SpawnExtraPlayers() if (playeringame[i] && players[i].mo == NULL) { players[i].playerstate = PST_ENTER; - P_SpawnPlayer(&level.playerstarts[i], i, (level.flags2 & LEVEL2_PRERAISEWEAPON) ? SPF_WEAPONFULLYUP : 0); + P_SpawnPlayer(&Level->playerstarts[i], i, (level.flags2 & LEVEL2_PRERAISEWEAPON) ? SPF_WEAPONFULLYUP : 0); } } } @@ -918,13 +902,13 @@ static void SpawnExtraPlayers() // //============================================================================ -void G_SerializeLevel(FSerializer &arc, bool hubload) +void G_SerializeLevel(FSerializer &arc, FLevelLocals *Level, bool hubload) { - int i = level.totaltime; + int i = Level->totaltime; if (arc.isWriting()) { - arc.Array("checksum", level.md5, 16); + arc.Array("checksum", Level->md5, 16); } else { @@ -933,11 +917,11 @@ void G_SerializeLevel(FSerializer &arc, bool hubload) // deep down in the deserializer or just a crash if the few insufficient safeguards were not triggered. uint8_t chk[16] = { 0 }; arc.Array("checksum", chk, 16); - if (arc.GetSize("linedefs") != level.lines.Size() || - arc.GetSize("sidedefs") != level.sides.Size() || - arc.GetSize("sectors") != level.sectors.Size() || - arc.GetSize("polyobjs") != level.Polyobjects.Size() || - memcmp(chk, level.md5, 16)) + if (arc.GetSize("linedefs") != Level->lines.Size() || + arc.GetSize("sidedefs") != Level->sides.Size() || + arc.GetSize("sectors") != Level->sectors.Size() || + arc.GetSize("polyobjs") != Level->Polyobjects.Size() || + memcmp(chk, Level->md5, 16)) { I_Error("Savegame is from a different level"); } @@ -953,55 +937,57 @@ void G_SerializeLevel(FSerializer &arc, bool hubload) arc("multiplayer", multiplayer); - arc("level.flags", level.flags) - ("level.flags2", level.flags2) - ("level.fadeto", level.fadeto) - ("level.found_secrets", level.found_secrets) - ("level.found_items", level.found_items) - ("level.killed_monsters", level.killed_monsters) - ("level.total_secrets", level.total_secrets) - ("level.total_items", level.total_items) - ("level.total_monsters", level.total_monsters) - ("level.gravity", level.gravity) - ("level.aircontrol", level.aircontrol) - ("level.teamdamage", level.teamdamage) - ("level.maptime", level.maptime) - ("level.totaltime", i) - ("level.skytexture1", level.skytexture1) - ("level.skytexture2", level.skytexture2) - ("level.fogdensity", level.fogdensity) - ("level.outsidefogdensity", level.outsidefogdensity) - ("level.skyfog", level.skyfog) - ("level.deathsequence", level.deathsequence) - ("level.bodyqueslot", level.bodyqueslot) - ("level.spawnindex", level.spawnindex) - .Array("level.bodyque", level.bodyque, level.BODYQUESIZE) - ("level.corpsequeue", level.CorpseQueue) - ("level.spotstate", level.SpotState) - ("level.fragglethinker", level.FraggleScriptThinker) - ("level.acsthinker", level.ACSThinker); - ("level.impactdecalcount", level.ImpactDecalCount); + arc("flags", Level->flags) + ("flags2", Level->flags2) + ("fadeto", Level->fadeto) + ("found_secrets", Level->found_secrets) + ("found_items", Level->found_items) + ("killed_monsters", Level->killed_monsters) + ("total_secrets", Level->total_secrets) + ("total_items", Level->total_items) + ("total_monsters", Level->total_monsters) + ("gravity", Level->gravity) + ("aircontrol", Level->aircontrol) + ("teamdamage", Level->teamdamage) + ("maptime", Level->maptime) + ("totaltime", i) + ("skytexture1", Level->skytexture1) + ("skytexture2", Level->skytexture2) + ("fogdensity", Level->fogdensity) + ("outsidefogdensity", Level->outsidefogdensity) + ("skyfog", Level->skyfog) + ("deathsequence", Level->deathsequence) + ("bodyqueslot", Level->bodyqueslot) + ("spawnindex", Level->spawnindex) + .Array("bodyque", Level->bodyque, Level->BODYQUESIZE) + ("corpsequeue", Level->CorpseQueue) + ("spotstate", Level->SpotState) + ("fragglethinker", Level->FraggleScriptThinker) + ("acsthinker", Level->ACSThinker) + ("impactdecalcount", Level->ImpactDecalCount) + ("scrolls", Level->Scrolls); + // Hub transitions must keep the current total time if (!hubload) - level.totaltime = i; + Level->totaltime = i; if (arc.isReading()) { - sky1texture = level.skytexture1; - sky2texture = level.skytexture2; + sky1texture = Level->skytexture1; + sky2texture = Level->skytexture2; R_InitSkyMap(); G_AirControlChanged(); } - level.Behaviors.SerializeModuleStates(arc); + Level->Behaviors.SerializeModuleStates(arc); // The order here is important: First world state, then portal state, then thinkers, and last polyobjects. - arc("linedefs", level.lines, level.loadlines); - arc("sidedefs", level.sides, level.loadsides); - arc("sectors", level.sectors, level.loadsectors); - arc("zones", level.Zones); - arc("lineportals", level.linePortals); - arc("sectorportals", level.sectorPortals); + arc("linedefs", Level->lines, Level->loadlines); + arc("sidedefs", Level->sides, Level->loadsides); + arc("sectors", Level->sectors, Level->loadsectors); + arc("zones", Level->Zones); + arc("lineportals", Level->linePortals); + arc("sectorportals", Level->sectorPortals); if (arc.isReading()) P_FinalizePortals(); // [ZZ] serialize health groups @@ -1009,18 +995,18 @@ void G_SerializeLevel(FSerializer &arc, bool hubload) // [ZZ] serialize events E_SerializeEvents(arc); DThinker::SerializeThinkers(arc, hubload); - arc("polyobjs", level.Polyobjects); + arc("polyobjs", Level->Polyobjects); SerializeSubsectors(arc, "subsectors"); StatusBar->SerializeMessages(arc); AM_SerializeMarkers(arc); FRemapTable::StaticSerializeTranslations(arc); - level.canvasTextureInfo.Serialize(arc); - P_SerializePlayers(arc, hubload); + Level->canvasTextureInfo.Serialize(arc); + P_SerializePlayers(Level, arc, hubload); P_SerializeSounds(arc); if (arc.isReading()) { - for (auto &sec : level.sectors) + for (auto &sec : Level->sectors) { P_Recalculate3DFloors(&sec); } @@ -1033,5 +1019,5 @@ void G_SerializeLevel(FSerializer &arc, bool hubload) } } AActor::RecreateAllAttachedLights(); - InitPortalGroups(&level); + InitPortalGroups(Level); } diff --git a/src/p_saveg.h b/src/p_saveg.h index 6c4c74f46..b3311c29a 100644 --- a/src/p_saveg.h +++ b/src/p_saveg.h @@ -44,6 +44,6 @@ void P_DestroyThinkers(bool hubLoad); void P_ReadACSDefereds (FSerializer &); void P_WriteACSDefereds (FSerializer &); -void G_SerializeLevel(FSerializer &arc, bool hubLoad); +void G_SerializeLevel(FSerializer &arc, FLevelLocals *Level, bool hubLoad); #endif // __P_SAVEG_H__ diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 3cd879244..1d181be2b 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -338,7 +338,7 @@ void P_FreeLevelData () AActor::ClearTIDHashes(); interpolator.ClearInterpolations(); // [RH] Nothing to interpolate on a fresh level. - FPolyObj::ClearAllSubsectorLinks(); // can't be done as part of the polyobj deletion process. + level.ClearAllSubsectorLinks(); // can't be done as part of the polyobj deletion process. SN_StopAllSequences (); DThinker::DestroyAllThinkers (); tagManager.Clear(); diff --git a/src/po_man.cpp b/src/po_man.cpp index 9643ee6e9..c4bdf717d 100644 --- a/src/po_man.cpp +++ b/src/po_man.cpp @@ -46,12 +46,12 @@ class DRotatePoly : public DPolyAction { DECLARE_CLASS (DRotatePoly, DPolyAction) public: - DRotatePoly (int polyNum); + DRotatePoly (FPolyObj *polyNum); void Tick (); private: DRotatePoly (); - friend bool EV_RotatePoly (line_t *line, int polyNum, int speed, int byteAngle, int direction, bool overRide); + friend bool EV_RotatePoly (FLevelLocals *Level, line_t *line, int polyNum, int speed, int byteAngle, int direction, bool overRide); }; @@ -59,7 +59,7 @@ class DMovePoly : public DPolyAction { DECLARE_CLASS (DMovePoly, DPolyAction) public: - DMovePoly (int polyNum); + DMovePoly (FPolyObj *polyNum); void Serialize(FSerializer &arc); void Tick (); protected: @@ -67,14 +67,14 @@ protected: DAngle m_Angle; DVector2 m_Speedv; - friend bool EV_MovePoly(line_t *line, int polyNum, double speed, DAngle angle, double dist, bool overRide); + friend bool EV_MovePoly(FLevelLocals *Level, line_t *line, int polyNum, double speed, DAngle angle, double dist, bool overRide); }; class DMovePolyTo : public DPolyAction { DECLARE_CLASS(DMovePolyTo, DPolyAction) public: - DMovePolyTo(int polyNum); + DMovePolyTo(FPolyObj *polyNum); void Serialize(FSerializer &arc); void Tick(); protected: @@ -82,7 +82,7 @@ protected: DVector2 m_Speedv; DVector2 m_Target; - friend bool EV_MovePolyTo(line_t *line, int polyNum, double speed, const DVector2 &pos, bool overRide); + friend bool EV_MovePolyTo(FLevelLocals *Level, line_t *line, int polyNum, double speed, const DVector2 &pos, bool overRide); }; @@ -90,7 +90,7 @@ class DPolyDoor : public DMovePoly { DECLARE_CLASS (DPolyDoor, DMovePoly) public: - DPolyDoor (int polyNum, podoortype_t type); + DPolyDoor (FPolyObj *polyNum, podoortype_t type); void Serialize(FSerializer &arc); void Tick (); protected: @@ -101,7 +101,7 @@ protected: podoortype_t m_Type; bool m_Close; - friend bool EV_OpenPolyDoor(line_t *line, int polyNum, double speed, DAngle angle, int delay, double distance, podoortype_t type); + friend bool EV_OpenPolyDoor(FLevelLocals *Level, line_t *line, int polyNum, double speed, DAngle angle, int delay, double distance, podoortype_t type); private: DPolyDoor (); }; @@ -165,7 +165,7 @@ void DPolyAction::Serialize(FSerializer &arc) ("interpolation", m_Interpolation); } -DPolyAction::DPolyAction (int polyNum) +DPolyAction::DPolyAction (FPolyObj *polyNum) { m_PolyObj = polyNum; m_Speed = 0; @@ -175,11 +175,9 @@ DPolyAction::DPolyAction (int polyNum) void DPolyAction::OnDestroy() { - FPolyObj *poly = PO_GetPolyobj (m_PolyObj); - - if (poly->specialdata == this) + if (m_PolyObj->specialdata == this) { - poly->specialdata = NULL; + m_PolyObj->specialdata = nullptr; } StopInterpolation(); @@ -188,23 +186,21 @@ void DPolyAction::OnDestroy() void DPolyAction::Stop() { - FPolyObj *poly = PO_GetPolyobj(m_PolyObj); - SN_StopSequence(poly); + SN_StopSequence(m_PolyObj); Destroy(); } void DPolyAction::SetInterpolation () { - FPolyObj *poly = PO_GetPolyobj (m_PolyObj); - m_Interpolation = poly->SetInterpolation(); + m_Interpolation = m_PolyObj->SetInterpolation(); } void DPolyAction::StopInterpolation () { - if (m_Interpolation != NULL) + if (m_Interpolation != nullptr) { m_Interpolation->DelRef(); - m_Interpolation = NULL; + m_Interpolation = nullptr; } } @@ -220,7 +216,7 @@ DRotatePoly::DRotatePoly () { } -DRotatePoly::DRotatePoly (int polyNum) +DRotatePoly::DRotatePoly (FPolyObj *polyNum) : Super (polyNum) { } @@ -244,7 +240,7 @@ void DMovePoly::Serialize(FSerializer &arc) ("speedv", m_Speedv); } -DMovePoly::DMovePoly (int polyNum) +DMovePoly::DMovePoly (FPolyObj *polyNum) : Super (polyNum) { m_Angle = 0.; @@ -271,7 +267,7 @@ void DMovePolyTo::Serialize(FSerializer &arc) ("target", m_Target); } -DMovePolyTo::DMovePolyTo(int polyNum) +DMovePolyTo::DMovePolyTo(FPolyObj *polyNum) : Super(polyNum) { m_Speedv = m_Target = { 0,0 }; @@ -300,7 +296,7 @@ void DPolyDoor::Serialize(FSerializer &arc) ("close", m_Close); } -DPolyDoor::DPolyDoor (int polyNum, podoortype_t type) +DPolyDoor::DPolyDoor (FPolyObj * polyNum, podoortype_t type) : Super (polyNum), m_Type (type) { m_Direction = 0.; @@ -320,8 +316,7 @@ DPolyDoor::DPolyDoor (int polyNum, podoortype_t type) void DRotatePoly::Tick () { - FPolyObj *poly = PO_GetPolyobj (m_PolyObj); - if (poly == NULL) return; + if (m_PolyObj == nullptr) return; // Don't let non-perpetual polyobjs overshoot their targets. if (m_Dist != -1 && m_Dist < fabs(m_Speed)) @@ -329,7 +324,7 @@ void DRotatePoly::Tick () m_Speed = m_Speed < 0 ? -m_Dist : m_Dist; } - if (poly->RotatePolyobj (m_Speed)) + if (m_PolyObj->RotatePolyobj (m_Speed)) { if (m_Dist == -1) { // perpetual polyobj @@ -338,7 +333,7 @@ void DRotatePoly::Tick () m_Dist -= fabs(m_Speed); if (m_Dist == 0) { - SN_StopSequence (poly); + SN_StopSequence (m_PolyObj); Destroy (); } } @@ -351,22 +346,21 @@ void DRotatePoly::Tick () //========================================================================== -bool EV_RotatePoly (line_t *line, int polyNum, int speed, int byteAngle, - int direction, bool overRide) +bool EV_RotatePoly (FLevelLocals *Level, line_t *line, int polyNum, int speed, int byteAngle, int direction, bool overRide) { - DRotatePoly *pe = NULL; + DRotatePoly *pe = nullptr; FPolyObj *poly; - if ((poly = PO_GetPolyobj(polyNum)) == NULL) + if ((poly = Level->GetPolyobj(polyNum)) == nullptr) { Printf("EV_RotatePoly: Invalid polyobj num: %d\n", polyNum); return false; } FPolyMirrorIterator it(poly); - while ((poly = it.NextMirror()) != NULL) + while ((poly = it.NextMirror()) != nullptr) { - if ((poly->specialdata != NULL || poly->bBlocked) && !overRide) + if ((poly->specialdata != nullptr || poly->bBlocked) && !overRide) { // poly is already in motion break; } @@ -375,7 +369,7 @@ bool EV_RotatePoly (line_t *line, int polyNum, int speed, int byteAngle, // cannot do rotations on linked polyportals. break; } - pe = Create(poly->tag); + pe = Create(poly); poly->specialdata = pe; poly->bBlocked = false; if (byteAngle != 0) @@ -397,7 +391,7 @@ bool EV_RotatePoly (line_t *line, int polyNum, int speed, int byteAngle, SN_StartSequence (poly, poly->seqType, SEQ_DOOR, 0); direction = -direction; // Reverse the direction } - return pe != NULL; // Return true if something started moving. + return pe != nullptr; // Return true if something started moving. } //========================================================================== @@ -408,17 +402,15 @@ bool EV_RotatePoly (line_t *line, int polyNum, int speed, int byteAngle, void DMovePoly::Tick () { - FPolyObj *poly = PO_GetPolyobj (m_PolyObj); - - if (poly != NULL) + if (m_PolyObj != nullptr) { - if (poly->MovePolyobj (m_Speedv)) + if (m_PolyObj->MovePolyobj (m_Speedv)) { double absSpeed = fabs (m_Speed); m_Dist -= absSpeed; if (m_Dist <= 0) { - SN_StopSequence (poly); + SN_StopSequence (m_PolyObj); Destroy (); } else if (m_Dist < absSpeed) @@ -426,7 +418,7 @@ void DMovePoly::Tick () m_Speed = m_Dist * (m_Speed < 0 ? -1 : 1); m_Speedv = m_Angle.ToVector(m_Speed); } - poly->UpdateLinks(); + m_PolyObj->UpdateLinks(); } } } @@ -437,27 +429,26 @@ void DMovePoly::Tick () // //========================================================================== -bool EV_MovePoly (line_t *line, int polyNum, double speed, DAngle angle, - double dist, bool overRide) +bool EV_MovePoly (FLevelLocals *Level, line_t *line, int polyNum, double speed, DAngle angle, double dist, bool overRide) { - DMovePoly *pe = NULL; + DMovePoly *pe = nullptr; FPolyObj *poly; DAngle an = angle; - if ((poly = PO_GetPolyobj(polyNum)) == NULL) + if ((poly = Level->GetPolyobj(polyNum)) == nullptr) { Printf("EV_MovePoly: Invalid polyobj num: %d\n", polyNum); return false; } FPolyMirrorIterator it(poly); - while ((poly = it.NextMirror()) != NULL) + while ((poly = it.NextMirror()) != nullptr) { - if ((poly->specialdata != NULL || poly->bBlocked) && !overRide) + if ((poly->specialdata != nullptr || poly->bBlocked) && !overRide) { // poly is already in motion break; } - pe = Create(poly->tag); + pe = Create(poly); poly->specialdata = pe; poly->bBlocked = false; pe->m_Dist = dist; // Distance @@ -477,7 +468,7 @@ bool EV_MovePoly (line_t *line, int polyNum, double speed, DAngle angle, angle += 180.; // Reverse the angle. } - return pe != NULL; // Return true if something started moving. + return pe != nullptr; // Return true if something started moving. } //========================================================================== @@ -488,25 +479,23 @@ bool EV_MovePoly (line_t *line, int polyNum, double speed, DAngle angle, void DMovePolyTo::Tick () { - FPolyObj *poly = PO_GetPolyobj (m_PolyObj); - - if (poly != NULL) + if (m_PolyObj != nullptr) { - if (poly->MovePolyobj (m_Speedv)) + if (m_PolyObj->MovePolyobj (m_Speedv)) { double absSpeed = fabs (m_Speed); m_Dist -= absSpeed; if (m_Dist <= 0) { - SN_StopSequence (poly); + SN_StopSequence (m_PolyObj); Destroy (); } else if (m_Dist < absSpeed) { m_Speed = m_Dist * (m_Speed < 0 ? -1 : 1); - m_Speedv = m_Target - poly->StartSpot.pos; + m_Speedv = m_Target - m_PolyObj->StartSpot.pos; } - poly->UpdateLinks(); + m_PolyObj->UpdateLinks(); } } } @@ -517,14 +506,14 @@ void DMovePolyTo::Tick () // //========================================================================== -bool EV_MovePolyTo(line_t *line, int polyNum, double speed, const DVector2 &targ, bool overRide) +bool EV_MovePolyTo(FLevelLocals *Level, line_t *line, int polyNum, double speed, const DVector2 &targ, bool overRide) { - DMovePolyTo *pe = NULL; + DMovePolyTo *pe = nullptr; FPolyObj *poly; DVector2 dist; double distlen; - if ((poly = PO_GetPolyobj(polyNum)) == NULL) + if ((poly = Level->GetPolyobj(polyNum)) == nullptr) { Printf("EV_MovePolyTo: Invalid polyobj num: %d\n", polyNum); return false; @@ -533,13 +522,13 @@ bool EV_MovePolyTo(line_t *line, int polyNum, double speed, const DVector2 &targ dist = targ - poly->StartSpot.pos; distlen = dist.MakeUnit(); - while ((poly = it.NextMirror()) != NULL) + while ((poly = it.NextMirror()) != nullptr) { - if ((poly->specialdata != NULL || poly->bBlocked) && !overRide) + if ((poly->specialdata != nullptr || poly->bBlocked) && !overRide) { // poly is already in motion break; } - pe = Create(poly->tag); + pe = Create(poly); poly->specialdata = pe; poly->bBlocked = false; pe->m_Dist = distlen; @@ -552,7 +541,7 @@ bool EV_MovePolyTo(line_t *line, int polyNum, double speed, const DVector2 &targ } dist = -dist; // reverse the direction } - return pe != NULL; // Return true if something started moving. + return pe != nullptr; // Return true if something started moving. } //========================================================================== @@ -563,28 +552,26 @@ bool EV_MovePolyTo(line_t *line, int polyNum, double speed, const DVector2 &targ void DPolyDoor::Tick () { - FPolyObj *poly = PO_GetPolyobj (m_PolyObj); - - if (poly == NULL) return; + if (m_PolyObj == nullptr) return; if (m_Tics) { if (!--m_Tics) { - SN_StartSequence (poly, poly->seqType, SEQ_DOOR, m_Close); + SN_StartSequence (m_PolyObj, m_PolyObj->seqType, SEQ_DOOR, m_Close); } return; } switch (m_Type) { case PODOOR_SLIDE: - if (m_Dist <= 0 || poly->MovePolyobj (m_Speedv)) + if (m_Dist <= 0 || m_PolyObj->MovePolyobj (m_Speedv)) { double absSpeed = fabs (m_Speed); m_Dist -= absSpeed; if (m_Dist <= 0) { - SN_StopSequence (poly); + SN_StopSequence (m_PolyObj); if (!m_Close && m_WaitTics >= 0) { m_Dist = m_TotalDist; @@ -597,15 +584,15 @@ void DPolyDoor::Tick () { // if set to wait infinitely, Hexen kept the dead thinker to block the polyobject from getting activated again but that causes some problems // with the subsectorlinks and the interpolation. Better delete the thinker and use a different means to block it. - if (!m_Close) poly->bBlocked = true; + if (!m_Close) m_PolyObj->bBlocked = true; Destroy (); } } - poly->UpdateLinks(); + m_PolyObj->UpdateLinks(); } else { - if (poly->crush || !m_Close) + if (m_PolyObj->crush || !m_Close) { // continue moving if the poly is a crusher, or is opening return; } @@ -615,19 +602,19 @@ void DPolyDoor::Tick () m_Direction = -m_Direction; m_Speedv = -m_Speedv; m_Close = false; - SN_StartSequence (poly, poly->seqType, SEQ_DOOR, 0); + SN_StartSequence (m_PolyObj, m_PolyObj->seqType, SEQ_DOOR, 0); } } break; case PODOOR_SWING: - if (m_Dist <= 0 || poly->RotatePolyobj (m_Speed)) + if (m_Dist <= 0 || m_PolyObj->RotatePolyobj (m_Speed)) { double absSpeed = fabs (m_Speed); m_Dist -= absSpeed; if (m_Dist <= 0) { - SN_StopSequence (poly); + SN_StopSequence (m_PolyObj); if (!m_Close && m_WaitTics >= 0) { m_Dist = m_TotalDist; @@ -637,14 +624,14 @@ void DPolyDoor::Tick () } else { - if (!m_Close) poly->bBlocked = true; + if (!m_Close) m_PolyObj->bBlocked = true; Destroy (); } } } else { - if(poly->crush || !m_Close) + if(m_PolyObj->crush || !m_Close) { // continue moving if the poly is a crusher, or is opening return; } @@ -653,7 +640,7 @@ void DPolyDoor::Tick () m_Dist = m_TotalDist - m_Dist; m_Speed = -m_Speed; m_Close = false; - SN_StartSequence (poly, poly->seqType, SEQ_DOOR, 0); + SN_StartSequence (m_PolyObj, m_PolyObj->seqType, SEQ_DOOR, 0); } } break; @@ -669,22 +656,22 @@ void DPolyDoor::Tick () // //========================================================================== -bool EV_OpenPolyDoor(line_t *line, int polyNum, double speed, DAngle angle, int delay, double distance, podoortype_t type) +bool EV_OpenPolyDoor(FLevelLocals *Level, line_t *line, int polyNum, double speed, DAngle angle, int delay, double distance, podoortype_t type) { - DPolyDoor *pd = NULL; + DPolyDoor *pd = nullptr; FPolyObj *poly; int swingdir = 1; // ADD: PODOOR_SWINGL, PODOOR_SWINGR - if ((poly = PO_GetPolyobj(polyNum)) == NULL) + if ((poly = Level->GetPolyobj(polyNum)) == nullptr) { Printf("EV_OpenPolyDoor: Invalid polyobj num: %d\n", polyNum); return false; } FPolyMirrorIterator it(poly); - while ((poly = it.NextMirror()) != NULL) + while ((poly = it.NextMirror()) != nullptr) { - if ((poly->specialdata != NULL || poly->bBlocked)) + if ((poly->specialdata != nullptr || poly->bBlocked)) { // poly is already moving break; } @@ -694,7 +681,7 @@ bool EV_OpenPolyDoor(line_t *line, int polyNum, double speed, DAngle angle, int break; } - pd = Create(poly->tag, type); + pd = Create(poly, type); poly->specialdata = pd; if (type == PODOOR_SLIDE) { @@ -717,7 +704,7 @@ bool EV_OpenPolyDoor(line_t *line, int polyNum, double speed, DAngle angle, int } } - return pd != NULL; // Return true if something started moving. + return pd != nullptr; // Return true if something started moving. } //========================================================================== @@ -726,13 +713,13 @@ bool EV_OpenPolyDoor(line_t *line, int polyNum, double speed, DAngle angle, int // //========================================================================== -bool EV_StopPoly(int polynum) +bool EV_StopPoly(FLevelLocals *Level, int polynum) { FPolyObj *poly; - if (NULL != (poly = PO_GetPolyobj(polynum))) + if (nullptr != (poly = Level->GetPolyobj(polynum))) { - if (poly->specialdata != NULL) + if (poly->specialdata != nullptr) { poly->specialdata->Stop(); } @@ -743,23 +730,6 @@ bool EV_StopPoly(int polynum) // ===== Higher Level Poly Interface code ===== -//========================================================================== -// -// PO_GetPolyobj -// -//========================================================================== - -FPolyObj *PO_GetPolyobj (int polyNum) -{ - for(auto &poly : level.Polyobjects) - { - if (poly.tag == polyNum) - { - return &poly; - } - } - return nullptr; -} //========================================================================== @@ -780,9 +750,9 @@ FPolyObj::FPolyObj() seqType = 0; Size = 0; bBlocked = false; - subsectorlinks = NULL; - specialdata = NULL; - interpolation = NULL; + subsectorlinks = nullptr; + specialdata = nullptr; + interpolation = nullptr; } //========================================================================== @@ -796,6 +766,11 @@ int FPolyObj::GetMirror() return MirrorNum; } +FLevelLocals *FPolyObj::GetLevel() const +{ + return &level; +} + //========================================================================== // // ThrustMobj @@ -806,6 +781,7 @@ void FPolyObj::ThrustMobj (AActor *actor, side_t *side) { DAngle thrustAngle; DPolyAction *pe; + auto Level = GetLevel(); double force; @@ -843,11 +819,11 @@ void FPolyObj::ThrustMobj (AActor *actor, side_t *side) DVector2 pos = actor->Vec2Offset(thrust.X, thrust.Y); if (bHurtOnTouch || !P_CheckMove (actor, pos)) { - int newdam = P_DamageMobj (actor, NULL, NULL, crush, NAME_Crush); + int newdam = P_DamageMobj (actor, nullptr, nullptr, crush, NAME_Crush); P_TraceBleed (newdam > 0 ? newdam : crush, actor); } } - if (level.flags2 & LEVEL2_POLYGRIND) actor->CallGrind(false); // crush corpses that get caught in a polyobject's way + if (Level->flags2 & LEVEL2_POLYGRIND) actor->CallGrind(false); // crush corpses that get caught in a polyobject's way } //========================================================================== @@ -860,6 +836,7 @@ void FPolyObj::UpdateLinks() { if (bHasPortals == 2) { + auto Level = GetLevel(); TMap processed; for (unsigned i = 0; i < Linedefs.Size(); i++) { @@ -878,7 +855,7 @@ void FPolyObj::UpdateLinks() { processed[destgroup] = true; DVector2 delta = port->mDisplacement - old; - level.Displacements.MoveGroup(destgroup, delta); + Level->Displacements.MoveGroup(destgroup, delta); } } } @@ -1048,25 +1025,26 @@ void FPolyObj::UnLinkPolyobj () polyblock_t *link; int i, j; int index; + auto Level = GetLevel(); // remove the polyobj from each blockmap section for(j = bbox[BOXBOTTOM]; j <= bbox[BOXTOP]; j++) { - index = j*level.blockmap.bmapwidth; + index = j*Level->blockmap.bmapwidth; for(i = bbox[BOXLEFT]; i <= bbox[BOXRIGHT]; i++) { - if(i >= 0 && i < level.blockmap.bmapwidth && j >= 0 && j < level.blockmap.bmapheight) + if(i >= 0 && i < Level->blockmap.bmapwidth && j >= 0 && j < Level->blockmap.bmapheight) { - link = level.PolyBlockMap[index+i]; - while(link != NULL && link->polyobj != this) + link = Level->PolyBlockMap[index+i]; + while(link != nullptr && link->polyobj != this) { link = link->next; } - if(link == NULL) + if(link == nullptr) { // polyobj not located in the link cell continue; } - link->polyobj = NULL; + link->polyobj = nullptr; } } } @@ -1080,6 +1058,7 @@ void FPolyObj::UnLinkPolyobj () bool FPolyObj::CheckMobjBlocking (side_t *sd) { + auto Level = GetLevel(); static TArray checker; FBlockNode *block; AActor *mobj; @@ -1088,15 +1067,15 @@ bool FPolyObj::CheckMobjBlocking (side_t *sd) line_t *ld; bool blocked; bool performBlockingThrust; - int bmapwidth = level.blockmap.bmapwidth; - int bmapheight = level.blockmap.bmapheight; + int bmapwidth = Level->blockmap.bmapwidth; + int bmapheight = Level->blockmap.bmapheight; ld = sd->linedef; - top = level.blockmap.GetBlockY(ld->bbox[BOXTOP]); - bottom = level.blockmap.GetBlockY(ld->bbox[BOXBOTTOM]); - left = level.blockmap.GetBlockX(ld->bbox[BOXLEFT]); - right = level.blockmap.GetBlockX(ld->bbox[BOXRIGHT]); + top = Level->blockmap.GetBlockY(ld->bbox[BOXTOP]); + bottom = Level->blockmap.GetBlockY(ld->bbox[BOXBOTTOM]); + left = Level->blockmap.GetBlockX(ld->bbox[BOXLEFT]); + right = Level->blockmap.GetBlockX(ld->bbox[BOXRIGHT]); blocked = false; checker.Clear(); @@ -1114,7 +1093,7 @@ bool FPolyObj::CheckMobjBlocking (side_t *sd) { for (i = left; i <= right; i++) { - for (block = level.blockmap.blocklinks[j+i]; block != NULL; block = block->NextActor) + for (block = Level->blockmap.blocklinks[j+i]; block != nullptr; block = block->NextActor) { mobj = block->Me; for (k = (int)checker.Size()-1; k >= 0; --k) @@ -1133,7 +1112,7 @@ bool FPolyObj::CheckMobjBlocking (side_t *sd) open.top = LINEOPEN_MAX; open.bottom = LINEOPEN_MIN; // [TN] Check wether this actor gets blocked by the line. - if (ld->backsector != NULL && + if (ld->backsector != nullptr && !(ld->flags & (ML_BLOCKING|ML_BLOCKEVERYTHING)) && !(ld->flags & ML_BLOCK_PLAYERS && (mobj->player || (mobj->flags8 & MF8_BLOCKASPLAYER))) && !(ld->flags & ML_BLOCKMONSTERS && mobj->flags3 & MF3_ISMONSTER) @@ -1173,7 +1152,7 @@ bool FPolyObj::CheckMobjBlocking (side_t *sd) // We have a two-sided linedef so we should only check one side // so that the thrust from both sides doesn't cancel each other out. // Best use the one facing the player and ignore the back side. - if (ld->sidedef[1] != NULL) + if (ld->sidedef[1] != nullptr) { int side = P_PointOnLineSidePrecise(mobj->Pos(), ld); if (ld->sidedef[side] != sd) @@ -1215,8 +1194,9 @@ void FPolyObj::LinkPolyobj () { polyblock_t **link; polyblock_t *tempLink; - int bmapwidth = level.blockmap.bmapwidth; - int bmapheight = level.blockmap.bmapheight; + auto Level = GetLevel(); + int bmapwidth = Level->blockmap.bmapwidth; + int bmapheight = Level->blockmap.bmapheight; // calculate the polyobj bbox Bounds.ClearBox(); @@ -1229,10 +1209,10 @@ void FPolyObj::LinkPolyobj () vt = Sidedefs[i]->linedef->v2; Bounds.AddToBox(vt->fPos()); } - bbox[BOXRIGHT] = level.blockmap.GetBlockX(Bounds.Right()); - bbox[BOXLEFT] = level.blockmap.GetBlockX(Bounds.Left()); - bbox[BOXTOP] = level.blockmap.GetBlockY(Bounds.Top()); - bbox[BOXBOTTOM] = level.blockmap.GetBlockY(Bounds.Bottom()); + bbox[BOXRIGHT] = Level->blockmap.GetBlockX(Bounds.Right()); + bbox[BOXLEFT] = Level->blockmap.GetBlockX(Bounds.Left()); + bbox[BOXTOP] = Level->blockmap.GetBlockY(Bounds.Top()); + bbox[BOXBOTTOM] = Level->blockmap.GetBlockY(Bounds.Bottom()); // add the polyobj to each blockmap section for(int j = bbox[BOXBOTTOM]*bmapwidth; j <= bbox[BOXTOP]*bmapwidth; j += bmapwidth) @@ -1241,24 +1221,24 @@ void FPolyObj::LinkPolyobj () { if(i >= 0 && i < bmapwidth && j >= 0 && j < bmapheight*bmapwidth) { - link = &level.PolyBlockMap[j+i]; + link = &Level->PolyBlockMap[j+i]; if(!(*link)) { // Create a new link at the current block cell *link = new polyblock_t; - (*link)->next = NULL; - (*link)->prev = NULL; + (*link)->next = nullptr; + (*link)->prev = nullptr; (*link)->polyobj = this; continue; } else { tempLink = *link; - while(tempLink->next != NULL && tempLink->polyobj != NULL) + while(tempLink->next != nullptr && tempLink->polyobj != nullptr) { tempLink = tempLink->next; } } - if(tempLink->polyobj == NULL) + if(tempLink->polyobj == nullptr) { tempLink->polyobj = this; continue; @@ -1266,7 +1246,7 @@ void FPolyObj::LinkPolyobj () else { tempLink->next = new polyblock_t; - tempLink->next->next = NULL; + tempLink->next->next = nullptr; tempLink->next->prev = tempLink; tempLink->next->polyobj = this; } @@ -1290,7 +1270,7 @@ void FPolyObj::RecalcActorFloorCeil(FBoundingBox bounds) const FBlockThingsIterator it(bounds); AActor *actor; - while ((actor = it.Next()) != NULL) + while ((actor = it.Next()) != nullptr) { // skip everything outside the bounding box. if (actor->X() + actor->radius <= bounds.Left() || @@ -1322,7 +1302,7 @@ void FPolyObj::ClosestPoint(const DVector2 &fpos, DVector2 &out, side_t **side) double x = fpos.X, y = fpos.Y; double bestdist = HUGE_VAL; double bestx = 0, besty = 0; - side_t *bestline = NULL; + side_t *bestline = nullptr; for (i = 0; i < Sidedefs.Size(); ++i) { @@ -1370,7 +1350,7 @@ void FPolyObj::ClosestPoint(const DVector2 &fpos, DVector2 &out, side_t **side) } } out = { bestx, besty }; - if (side != NULL) + if (side != nullptr) { *side = bestline; } @@ -1382,12 +1362,12 @@ void FPolyObj::ClosestPoint(const DVector2 &fpos, DVector2 &out, side_t **side) // //========================================================================== -bool PO_Busy (int polyobj) +bool PO_Busy (FLevelLocals *Level, int polyobj) { FPolyObj *poly; - poly = PO_GetPolyobj (polyobj); - return (poly != NULL && poly->specialdata != NULL); + poly = Level->GetPolyobj(polyobj); + return (poly != nullptr && poly->specialdata != nullptr); } @@ -1400,19 +1380,19 @@ bool PO_Busy (int polyobj) void FPolyObj::ClearSubsectorLinks() { - while (subsectorlinks != NULL) + while (subsectorlinks != nullptr) { assert(subsectorlinks->state == 1337); FPolyNode *next = subsectorlinks->snext; - if (subsectorlinks->pnext != NULL) + if (subsectorlinks->pnext != nullptr) { assert(subsectorlinks->pnext->state == 1337); subsectorlinks->pnext->pprev = subsectorlinks->pprev; } - if (subsectorlinks->pprev != NULL) + if (subsectorlinks->pprev != nullptr) { assert(subsectorlinks->pprev->state == 1337); subsectorlinks->pprev->pnext = subsectorlinks->pnext; @@ -1422,7 +1402,7 @@ void FPolyObj::ClearSubsectorLinks() subsectorlinks->subsector->polys = subsectorlinks->pnext; } - if (subsectorlinks->subsector->BSP != NULL) + if (subsectorlinks->subsector->BSP != nullptr) { subsectorlinks->subsector->BSP->bDirty = true; } @@ -1431,12 +1411,12 @@ void FPolyObj::ClearSubsectorLinks() delete subsectorlinks; subsectorlinks = next; } - subsectorlinks = NULL; + subsectorlinks = nullptr; } -void FPolyObj::ClearAllSubsectorLinks() +void FLevelLocals::ClearAllSubsectorLinks() { - for(auto &poly : level.Polyobjects) + for(auto &poly : Polyobjects) { poly.ClearSubsectorLinks(); } @@ -1676,12 +1656,12 @@ static void SplitPoly(FPolyNode *pnode, void *node, float bbox[4]) // Link node to subsector pnode->pnext = sub->polys; - if (pnode->pnext != NULL) + if (pnode->pnext != nullptr) { assert(pnode->pnext->state == 1337); pnode->pnext->pprev = pnode; } - pnode->pprev = NULL; + pnode->pprev = nullptr; sub->polys = pnode; // link node to polyobject @@ -1711,6 +1691,7 @@ static void SplitPoly(FPolyNode *pnode, void *node, float bbox[4]) void FPolyObj::CreateSubsectorLinks() { + auto Level = GetLevel(); FPolyNode *node = NewPolyNode(); // Even though we don't care about it, we need to initialize this // bounding box to something so that Valgrind won't complain about it @@ -1731,7 +1712,7 @@ void FPolyObj::CreateSubsectorLinks() } if (!(i_compatflags & COMPATF_POLYOBJ)) { - SplitPoly(node, level.HeadNode(), dummybbox); + SplitPoly(node, Level->HeadNode(), dummybbox); } else { @@ -1739,12 +1720,12 @@ void FPolyObj::CreateSubsectorLinks() // Link node to subsector node->pnext = sub->polys; - if (node->pnext != NULL) + if (node->pnext != nullptr) { assert(node->pnext->state == 1337); node->pnext->pprev = node; } - node->pprev = NULL; + node->pprev = nullptr; sub->polys = node; // link node to polyobject @@ -1760,9 +1741,9 @@ void FPolyObj::CreateSubsectorLinks() // //========================================================================== -void PO_LinkToSubsectors() +void PO_LinkToSubsectors(FLevelLocals *Level) { - for(auto &poly : level.Polyobjects) + for(auto &poly : Level->Polyobjects) { if (poly.subsectorlinks == nullptr) { @@ -1781,7 +1762,7 @@ static FPolyNode *NewPolyNode() { FPolyNode *node; - if (FreePolyNodes != NULL) + if (FreePolyNodes != nullptr) { node = FreePolyNodes; FreePolyNodes = node->pnext; @@ -1791,11 +1772,11 @@ static FPolyNode *NewPolyNode() node = new FPolyNode; } node->state = 1337; - node->poly = NULL; - node->pnext = NULL; - node->pprev = NULL; - node->subsector = NULL; - node->snext = NULL; + node->poly = nullptr; + node->pnext = nullptr; + node->pprev = nullptr; + node->subsector = nullptr; + node->snext = nullptr; return node; } @@ -1822,7 +1803,7 @@ void ReleaseAllPolyNodes() { FPolyNode *node, *next; - for (node = FreePolyNodes; node != NULL; node = next) + for (node = FreePolyNodes; node != nullptr; node = next) { next = node->pnext; delete node; @@ -1841,7 +1822,7 @@ void ReleaseAllPolyNodes() FPolyMirrorIterator::FPolyMirrorIterator(FPolyObj *poly) { CurPoly = poly; - if (poly != NULL) + if (poly != nullptr) { UsedPolys[0] = poly->tag; NumUsedPolys = 1; @@ -1856,7 +1837,7 @@ FPolyMirrorIterator::FPolyMirrorIterator(FPolyObj *poly) // // FPolyMirrorIterator :: NextMirror // -// Returns the polyobject that mirrors the current one, or NULL if there +// Returns the polyobject that mirrors the current one, or nullptr if there // is no mirroring polyobject, or there is a mirroring polyobject but it was // already returned. // @@ -1866,15 +1847,15 @@ FPolyObj *FPolyMirrorIterator::NextMirror() { FPolyObj *poly = CurPoly, *nextpoly; - if (poly == NULL) + if (poly == nullptr) { - return NULL; + return nullptr; } // Do the work to decide which polyobject to return the next time this // function is called. int mirror = poly->GetMirror(), i; - nextpoly = NULL; + nextpoly = nullptr; // Is there a mirror and we have room to remember it? if (mirror != 0 && NumUsedPolys != countof(UsedPolys)) @@ -1890,8 +1871,8 @@ FPolyObj *FPolyMirrorIterator::NextMirror() if (i == NumUsedPolys) { // No, it has not been returned. UsedPolys[NumUsedPolys++] = mirror; - nextpoly = PO_GetPolyobj(mirror); - if (nextpoly == NULL) + nextpoly = poly->GetLevel()->GetPolyobj(mirror); + if (nextpoly == nullptr) { Printf("Invalid mirror polyobj num %d for polyobj num %d\n", mirror, UsedPolys[i - 1]); } diff --git a/src/po_man.h b/src/po_man.h index 793203272..e9d23ebe8 100644 --- a/src/po_man.h +++ b/src/po_man.h @@ -6,12 +6,14 @@ #include "m_bbox.h" #include "dthinker.h" +struct FPolyObj; + class DPolyAction : public DThinker { DECLARE_CLASS(DPolyAction, DThinker) HAS_OBJECT_POINTERS public: - DPolyAction(int polyNum); + DPolyAction(FPolyObj *polyNum); void Serialize(FSerializer &arc); void OnDestroy() override; void Stop(); @@ -20,7 +22,7 @@ public: void StopInterpolation(); protected: DPolyAction(); - int m_PolyObj; + FPolyObj *m_PolyObj; double m_Speed; double m_Dist; TObjPtr m_Interpolation; @@ -107,6 +109,9 @@ struct FPolyObj void UpdateLinks(); static void ClearAllSubsectorLinks(); + FLevelLocals *GetLevel() const; + + private: void ThrustMobj (AActor *actor, side_t *side); @@ -125,7 +130,7 @@ struct polyblock_t }; -void PO_LinkToSubsectors(); +void PO_LinkToSubsectors(FLevelLocals *Level); // ===== PO_MAN ===== @@ -137,14 +142,13 @@ typedef enum PODOOR_SWING, } podoortype_t; -bool EV_RotatePoly (line_t *line, int polyNum, int speed, int byteAngle, int direction, bool overRide); -bool EV_MovePoly (line_t *line, int polyNum, double speed, DAngle angle, double dist, bool overRide); -bool EV_MovePolyTo (line_t *line, int polyNum, double speed, const DVector2 &pos, bool overRide); -bool EV_OpenPolyDoor (line_t *line, int polyNum, double speed, DAngle angle, int delay, double distance, podoortype_t type); -bool EV_StopPoly (int polyNum); +bool EV_RotatePoly (FLevelLocals *Level, line_t *line, int polyNum, int speed, int byteAngle, int direction, bool overRide); +bool EV_MovePoly (FLevelLocals *Level, line_t *line, int polyNum, double speed, DAngle angle, double dist, bool overRide); +bool EV_MovePolyTo (FLevelLocals *Level, line_t *line, int polyNum, double speed, const DVector2 &pos, bool overRide); +bool EV_OpenPolyDoor (FLevelLocals *Level, line_t *line, int polyNum, double speed, DAngle angle, int delay, double distance, podoortype_t type); +bool EV_StopPoly (FLevelLocals *Level, int polyNum); -bool PO_Busy (int polyobj); -FPolyObj *PO_GetPolyobj(int polyNum); +bool PO_Busy (FLevelLocals *Level, int polyobj); -#endif \ No newline at end of file +#endif diff --git a/src/polyrenderer/poly_renderer.cpp b/src/polyrenderer/poly_renderer.cpp index e878623fd..0556cbe49 100644 --- a/src/polyrenderer/poly_renderer.cpp +++ b/src/polyrenderer/poly_renderer.cpp @@ -134,7 +134,7 @@ void PolyRenderer::RenderActorView(AActor *actor, bool dontmaplines) R_SetupFrame(Viewpoint, Viewwindow, actor); P_FindParticleSubsectors(); - PO_LinkToSubsectors(); + PO_LinkToSubsectors(&level); static bool firstcall = true; if (firstcall) diff --git a/src/swrenderer/scene/r_scene.cpp b/src/swrenderer/scene/r_scene.cpp index 1666eb003..c8baa1d4e 100644 --- a/src/swrenderer/scene/r_scene.cpp +++ b/src/swrenderer/scene/r_scene.cpp @@ -163,7 +163,7 @@ namespace swrenderer P_FindParticleSubsectors(); // Link the polyobjects right before drawing the scene to reduce the amounts of calls to this function - PO_LinkToSubsectors(); + PO_LinkToSubsectors(&level); R_UpdateFuzzPosFrameStart(); From 7e9340f3b7f9853429677ceb6b16fd7cd0fdf27b Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 24 Jan 2019 01:40:09 +0100 Subject: [PATCH 005/164] - removed most global references to the tag manager by routing most access to FLevelocals. --- src/fragglescript/t_func.cpp | 20 ++-- src/fragglescript/t_script.cpp | 2 +- src/g_level.h | 2 +- src/g_levellocals.h | 32 +++++ src/maploader/edata.cpp | 6 +- src/maploader/maploader.cpp | 6 +- src/maploader/maploader.h | 3 + src/maploader/slopes.cpp | 4 +- src/maploader/udmf.cpp | 4 +- src/p_3dfloors.cpp | 210 ++++++++++++++++----------------- src/p_3dmidtex.cpp | 6 +- src/p_acs.cpp | 52 ++++---- src/p_actionfunctions.cpp | 4 +- src/p_ceiling.cpp | 4 +- src/p_doors.cpp | 4 +- src/p_floor.cpp | 16 +-- src/p_lights.cpp | 20 ++-- src/p_linkedsectors.cpp | 6 +- src/p_lnspec.cpp | 62 +++++----- src/p_mobj.cpp | 2 +- src/p_pillar.cpp | 2 +- src/p_plats.cpp | 2 +- src/p_pusher.cpp | 4 +- src/p_scroll.cpp | 6 +- src/p_setup.cpp | 2 +- src/p_setup.h | 1 - src/p_spec.cpp | 18 +-- src/p_tags.cpp | 2 +- src/p_tags.h | 26 ++-- src/p_teleport.cpp | 10 +- src/p_xlat.cpp | 2 +- src/portal.cpp | 8 +- src/umapinfo.cpp | 5 +- 33 files changed, 291 insertions(+), 262 deletions(-) diff --git a/src/fragglescript/t_func.cpp b/src/fragglescript/t_func.cpp index d5b6592c2..931f2bc3a 100644 --- a/src/fragglescript/t_func.cpp +++ b/src/fragglescript/t_func.cpp @@ -1150,7 +1150,7 @@ void FParser::SF_ObjSector(void) } t_return.type = svt_int; - t_return.value.i = mo ? tagManager.GetFirstSectorTag(mo->Sector) : 0; // nullptr check + t_return.value.i = mo ? Level->GetFirstSectorTag(mo->Sector) : 0; // nullptr check } //========================================================================== @@ -1859,7 +1859,7 @@ void FParser::SF_FadeLight(void) destlevel = intvalue(t_argv[1]); speed = t_argc>2 ? intvalue(t_argv[2]) : 1; - FSectorTagIterator it(sectag); + auto it = Level->GetSectorTagIterator(sectag); while ((i = it.Next()) >= 0) { if (!Level->sectors[i].lightingdata) Create(&Level->sectors[i],destlevel,speed); @@ -2097,7 +2097,7 @@ void FParser::SF_LineTrigger() maplinedef_t mld; mld.special=intvalue(t_argv[0]); mld.tag=t_argc > 1 ? intvalue(t_argv[1]) : 0; - P_TranslateLineDef(&line, &mld); + Level->TranslateLineDef(&line, &mld); P_ExecuteSpecial(line.special, NULL, Script->trigger, false, line.args[0],line.args[1],line.args[2],line.args[3],line.args[4]); } @@ -2157,7 +2157,7 @@ void FParser::SF_SetLineBlocking(void) { blocking=blocks[blocking]; int tag=intvalue(t_argv[0]); - FLineIdIterator itr(tag); + auto itr = Level->GetLineIdIterator(tag); int i; while ((i = itr.Next()) >= 0) { @@ -2180,7 +2180,7 @@ void FParser::SF_SetLineMonsterBlocking(void) int blocking = intvalue(t_argv[1]) ? (int)ML_BLOCKMONSTERS : 0; int tag=intvalue(t_argv[0]); - FLineIdIterator itr(tag); + auto itr = Level->GetLineIdIterator(tag); int i; while ((i = itr.Next()) >= 0) { @@ -2237,7 +2237,7 @@ void FParser::SF_SetLineTexture(void) texture = stringvalue(t_argv[3]); texturenum = TexMan.GetTextureID(texture, ETextureType::Wall, FTextureManager::TEXMAN_Overridable); - FLineIdIterator itr(tag); + auto itr = Level->GetLineIdIterator(tag); while ((i = itr.Next()) >= 0) { // bad sidedef, Hexen just SEGV'd here! @@ -2257,7 +2257,7 @@ void FParser::SF_SetLineTexture(void) int sections = intvalue(t_argv[3]); // set all sectors with tag - FLineIdIterator itr(tag); + auto itr = Level->GetLineIdIterator(tag); while ((i = itr.Next()) >= 0) { side_t *sided = Level->lines[i].sidedef[side]; @@ -3792,7 +3792,7 @@ void FParser::SF_KillInSector() while ((mo=it.Next())) { - if (mo->flags3&MF3_ISMONSTER && tagManager.SectorHasTag(mo->Sector, tag)) P_DamageMobj(mo, NULL, NULL, 1000000, NAME_Massacre); + if (mo->flags3&MF3_ISMONSTER && Level->SectorHasTag(mo->Sector, tag)) P_DamageMobj(mo, NULL, NULL, 1000000, NAME_Massacre); } } } @@ -3814,7 +3814,7 @@ void FParser::SF_SetLineTrigger() id=intvalue(t_argv[0]); spec=intvalue(t_argv[1]); if (t_argc>2) tag=intvalue(t_argv[2]); - FLineIdIterator itr(id); + auto itr = Level->GetLineIdIterator(id); while ((i = itr.Next()) >= 0) { maplinedef_t mld; @@ -3822,7 +3822,7 @@ void FParser::SF_SetLineTrigger() mld.tag = tag; mld.flags = 0; int f = Level->lines[i].flags; - P_TranslateLineDef(&Level->lines[i], &mld); + Level->TranslateLineDef(&Level->lines[i], &mld); 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)); diff --git a/src/fragglescript/t_script.cpp b/src/fragglescript/t_script.cpp index 9fb156fee..3311184a7 100644 --- a/src/fragglescript/t_script.cpp +++ b/src/fragglescript/t_script.cpp @@ -456,7 +456,7 @@ bool DFraggleThinker::wait_finished(DRunningScript *script) case wt_tagwait: { int secnum; - FSectorTagIterator itr(script->wait_data); + auto itr = level.GetSectorTagIterator(script->wait_data); while ((secnum = itr.Next()) >= 0) { sector_t *sec = &level.sectors[secnum]; diff --git a/src/g_level.h b/src/g_level.h index 5f2275777..1cbd0f463 100644 --- a/src/g_level.h +++ b/src/g_level.h @@ -254,7 +254,7 @@ enum ELevelFlags : unsigned int struct FSpecialAction { FName Type; // this is initialized before the actors... - uint8_t Action; + int Action; int Args[5]; }; diff --git a/src/g_levellocals.h b/src/g_levellocals.h index d499c7b5a..c73bb0365 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -117,6 +117,8 @@ struct FLevelLocals : public FLevelData bool CheckIfExitIsGood(AActor *self, level_info_t *newmap); void FormatMapName(FString &mapname, const char *mapnamecolor); void ClearAllSubsectorLinks(); + void TranslateLineDef (line_t *ld, maplinedef_t *mld, int lineindexforid = -1); + FSectorTagIterator GetSectorTagIterator(int tag) { return FSectorTagIterator(tag); @@ -154,10 +156,40 @@ struct FLevelLocals : public FLevelData { return tagManager.SectorHasTag(sector, tag); } + int GetFirstSectorTag(const sector_t *sect) const + { + return tagManager.GetFirstSectorTag(sect); + } + int GetFirstSectorTag(int i) const + { + return tagManager.GetFirstSectorTag(i); + } + int GetFirstLineId(const line_t *sect) const + { + return tagManager.GetFirstLineID(sect); + } + bool LineHasId(int line, int tag) { return tagManager.LineHasID(line, tag); } + bool LineHasId(line_t *line, int tag) + { + return tagManager.LineHasID(line, tag); + } + + int FindFirstSectorFromTag(int tag) + { + auto it = GetSectorTagIterator(tag); + return it.Next(); + } + + int FindFirstLineFromID(int tag) + { + auto it = GetLineIdIterator(tag); + return it.Next(); + } + sector_t *PointInSector(const DVector2 &pos) { return P_PointInSector(pos); diff --git a/src/maploader/edata.cpp b/src/maploader/edata.cpp index e35094639..5a6f8547c 100644 --- a/src/maploader/edata.cpp +++ b/src/maploader/edata.cpp @@ -50,7 +50,7 @@ #include "maploader.h" -static void parseLinedef(FScanner &sc, TMap &EDLines) +void MapLoader::parseEDLinedef(FScanner &sc, TMap &EDLines) { EDLinedef ld; bool argsset = false; @@ -159,7 +159,7 @@ static void parseLinedef(FScanner &sc, TMap &EDLines) maplinedef_t mld; mld.special = -ld.special; mld.tag = ld.tag; - P_TranslateLineDef(&line, &mld); + Level->TranslateLineDef(&line, &mld); ld.special = line.special; ld.activation = line.activation; ld.flags = (ld.flags & ~(ML_REPEAT_SPECIAL | ML_FIRSTSIDEONLY)) | (line.flags & (ML_REPEAT_SPECIAL | ML_FIRSTSIDEONLY)); @@ -529,7 +529,7 @@ void MapLoader::InitED() { if (sc.Compare("linedef")) { - parseLinedef(sc, EDLines); + parseEDLinedef(sc, EDLines); } else if (sc.Compare("mapthing")) { diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index 2d8542b4c..1724cdc12 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -1749,7 +1749,7 @@ void MapLoader::LoadLineDefs (MapData * map) mld->special = LittleShort(mld->special); mld->tag = LittleShort(mld->tag); mld->flags = LittleShort(mld->flags); - P_TranslateLineDef (ld, mld, -1); + Level->TranslateLineDef (ld, mld, -1); // do not assign the tag for Extradata lines. if (ld->special != Static_Init || (ld->args[1] != Init_EDLine && ld->args[1] != Init_EDSector)) { @@ -2753,7 +2753,7 @@ void MapLoader::GroupLines (bool buildmap) { if (sector->Lines.Count == 0) { - Printf ("Sector %i (tag %i) has no lines\n", i, tagManager.GetFirstSectorTag(Index(sector))); + Printf ("Sector %i (tag %i) has no lines\n", i, Level->GetFirstSectorTag(Index(sector))); // 0 the sector's tag so that no specials can use it tagManager.RemoveSectorTags(i); } @@ -3241,7 +3241,7 @@ void MapLoader::LoadLevel(MapData *map, const char *lumpname, int position) CopySlopes(); // Spawn 3d floors - must be done before spawning things so it can't be done in P_SpawnSpecials - P_Spawn3DFloors(); + Spawn3DFloors(); SpawnThings(position); diff --git a/src/maploader/maploader.h b/src/maploader/maploader.h index 22793a422..884a827a4 100644 --- a/src/maploader/maploader.h +++ b/src/maploader/maploader.h @@ -141,6 +141,7 @@ private: void ProcessEDMapthing(FMapThing *mt, int recordnum); void ProcessEDLinedef(line_t *line, int recordnum); void ProcessEDSector(sector_t *sec, int recordnum); + void parseEDLinedef(FScanner &sc, TMap &EDLines); // Polyobjects void InitSideLists(); @@ -189,6 +190,8 @@ private: void SetupFloorPortal (AActor *point); void SetupCeilingPortal (AActor *point); void TranslateTeleportThings(); + int Set3DFloor(line_t * line, int param, int param2, int alpha); + void Spawn3DFloors (); void SetTexture(side_t *side, int position, const char *name, FMissingTextureTracker &track); void SetTexture(sector_t *sector, int index, int position, const char *name, FMissingTextureTracker &track, bool truncate); diff --git a/src/maploader/slopes.cpp b/src/maploader/slopes.cpp index 86614cc35..cd6100179 100644 --- a/src/maploader/slopes.cpp +++ b/src/maploader/slopes.cpp @@ -53,7 +53,7 @@ void MapLoader::SlopeLineToPoint (int lineid, const DVector3 &pos, bool slopeCei { int linenum; - FLineIdIterator itr(lineid); + auto itr = Level->GetLineIdIterator(lineid); while ((linenum = itr.Next()) >= 0) { const line_t *line = &Level->lines[linenum]; @@ -123,7 +123,7 @@ void MapLoader::CopyPlane (int tag, sector_t *dest, bool copyCeil) sector_t *source; int secnum; - secnum = P_FindFirstSectorFromTag (tag); + secnum = Level->FindFirstSectorFromTag (tag); if (secnum == -1) { return; diff --git a/src/maploader/udmf.cpp b/src/maploader/udmf.cpp index c574f9ed7..46db16d33 100644 --- a/src/maploader/udmf.cpp +++ b/src/maploader/udmf.cpp @@ -792,7 +792,7 @@ public: mld.flags = 0; mld.special = th->special; mld.tag = th->args[0]; - P_TranslateLineDef(&ld, &mld); + Level->TranslateLineDef(&ld, &mld); th->special = ld.special; memcpy(th->args, ld.args, sizeof (ld.args)); } @@ -1139,7 +1139,7 @@ public: memset(&mld, 0, sizeof(mld)); mld.special = ld->special; mld.tag = ld->args[0]; - P_TranslateLineDef(ld, &mld); + Level->TranslateLineDef(ld, &mld); ld->flags = saved | (ld->flags&(ML_MONSTERSCANACTIVATE|ML_REPEAT_SPECIAL|ML_FIRSTSIDEONLY)); } if (passuse && (ld->activation & SPAC_Use)) diff --git a/src/p_3dfloors.cpp b/src/p_3dfloors.cpp index b962c612c..4167cce3c 100644 --- a/src/p_3dfloors.cpp +++ b/src/p_3dfloors.cpp @@ -46,6 +46,7 @@ #include "p_spec.h" #include "g_levellocals.h" #include "actorinlines.h" +#include "maploader/maploader.h" //========================================================================== // @@ -200,105 +201,6 @@ static void P_Add3DFloor(sector_t* sec, sector_t* sec2, line_t* master, int flag } } -//========================================================================== -// -// Creates all 3D floors defined by one linedef -// -//========================================================================== -static int P_Set3DFloor(line_t * line, int param, int param2, int alpha) -{ - int s; - int flags; - int tag = line->args[0]; - sector_t * sec = line->frontsector, *ss; - - FSectorTagIterator itr(tag); - while ((s = itr.Next()) >= 0) - { - ss = &level.sectors[s]; - - if (param == 0) - { - flags = FF_EXISTS | FF_RENDERALL | FF_SOLID | FF_INVERTSECTOR; - alpha = 255; - for (auto l: sec->Lines) - { - if (l->special == Sector_SetContents && l->frontsector == sec) - { - alpha = clamp(l->args[1], 0, 100); - if (l->args[2] & 1) flags &= ~FF_SOLID; - if (l->args[2] & 2) flags |= FF_SEETHROUGH; - if (l->args[2] & 4) flags |= FF_SHOOTTHROUGH; - if (l->args[2] & 8) flags |= FF_ADDITIVETRANS; - if (alpha != 100) flags |= FF_TRANSLUCENT;//|FF_BOTHPLANES|FF_ALLSIDES; - if (l->args[0]) - { - // Yes, Vavoom's 3D-floor definitions suck! - // The content list changed in r1783 of Vavoom to be unified - // among all its supported games, so it has now ten different - // values instead of just five. - static uint32_t vavoomcolors[] = { VC_EMPTY, - VC_WATER, VC_LAVA, VC_NUKAGE, VC_SLIME, VC_HELLSLIME, - VC_BLOOD, VC_SLUDGE, VC_HAZARD, VC_BOOMWATER }; - flags |= FF_SWIMMABLE | FF_BOTHPLANES | FF_ALLSIDES | FF_FLOOD; - - l->frontsector->Colormap.FadeColor = vavoomcolors[l->args[0]] & VC_COLORMASK; - l->frontsector->Colormap.FogDensity = 0; - } - alpha = (alpha * 255) / 100; - break; - } - } - } - else if (param == 4) - { - flags = FF_EXISTS | FF_RENDERPLANES | FF_INVERTPLANES | FF_NOSHADE | FF_FIX; - if (param2 & 1) flags |= FF_SEETHROUGH; // marker for allowing missing texture checks - alpha = 255; - } - else - { - static const int defflags[] = { 0, - FF_SOLID, - FF_SWIMMABLE | FF_BOTHPLANES | FF_ALLSIDES | FF_SHOOTTHROUGH | FF_SEETHROUGH, - FF_SHOOTTHROUGH | FF_SEETHROUGH, - }; - - flags = defflags[param & 3] | FF_EXISTS | FF_RENDERALL; - - if (param & 4) flags |= FF_ALLSIDES | FF_BOTHPLANES; - if (param & 16) flags ^= FF_SEETHROUGH; - if (param & 32) flags ^= FF_SHOOTTHROUGH; - - if (param2 & 1) flags |= FF_NOSHADE; - if (param2 & 2) flags |= FF_DOUBLESHADOW; - if (param2 & 4) flags |= FF_FOG; - if (param2 & 8) flags |= FF_THINFLOOR; - if (param2 & 16) flags |= FF_UPPERTEXTURE; - if (param2 & 32) flags |= FF_LOWERTEXTURE; - if (param2 & 64) flags |= FF_ADDITIVETRANS | FF_TRANSLUCENT; - // if flooding is used the floor must be non-solid and is automatically made shootthrough and seethrough - if ((param2 & 128) && !(flags & FF_SOLID)) flags |= FF_FLOOD | FF_SEETHROUGH | FF_SHOOTTHROUGH; - if (param2 & 512) flags |= FF_FADEWALLS; - if (param2&1024) flags |= FF_RESET; - FTextureID tex = line->sidedef[0]->GetTexture(side_t::top); - if (!tex.Exists() && alpha < 255) - { - alpha = -tex.GetIndex(); - } - alpha = clamp(alpha, 0, 255); - if (alpha == 0) flags &= ~(FF_RENDERALL | FF_BOTHPLANES | FF_ALLSIDES); - else if (alpha != 255) flags |= FF_TRANSLUCENT; - - } - P_Add3DFloor(ss, sec, line, flags, alpha); - } - // To be 100% safe this should be done even if the alpha by texture value isn't used. - if (!line->sidedef[0]->GetTexture(side_t::top).isValid()) - line->sidedef[0]->SetTexture(side_t::top, FNullTextureID()); - return 1; -} - //========================================================================== // // P_PlayerOnSpecial3DFloor @@ -876,31 +778,129 @@ void P_LineOpening_XFloors (FLineOpening &open, AActor * thing, const line_t *li } } +//========================================================================== +// +// Creates all 3D floors defined by one linedef +// +//========================================================================== +int MapLoader::Set3DFloor(line_t * line, int param, int param2, int alpha) +{ + int s; + int flags; + int tag = line->args[0]; + sector_t * sec = line->frontsector, *ss; + + auto itr = Level->GetSectorTagIterator(tag); + while ((s = itr.Next()) >= 0) + { + ss = &Level->sectors[s]; + + if (param == 0) + { + flags = FF_EXISTS | FF_RENDERALL | FF_SOLID | FF_INVERTSECTOR; + alpha = 255; + for (auto l: sec->Lines) + { + if (l->special == Sector_SetContents && l->frontsector == sec) + { + alpha = clamp(l->args[1], 0, 100); + if (l->args[2] & 1) flags &= ~FF_SOLID; + if (l->args[2] & 2) flags |= FF_SEETHROUGH; + if (l->args[2] & 4) flags |= FF_SHOOTTHROUGH; + if (l->args[2] & 8) flags |= FF_ADDITIVETRANS; + if (alpha != 100) flags |= FF_TRANSLUCENT;//|FF_BOTHPLANES|FF_ALLSIDES; + if (l->args[0]) + { + // Yes, Vavoom's 3D-floor definitions suck! + // The content list changed in r1783 of Vavoom to be unified + // among all its supported games, so it has now ten different + // values instead of just five. + static uint32_t vavoomcolors[] = { VC_EMPTY, + VC_WATER, VC_LAVA, VC_NUKAGE, VC_SLIME, VC_HELLSLIME, + VC_BLOOD, VC_SLUDGE, VC_HAZARD, VC_BOOMWATER }; + flags |= FF_SWIMMABLE | FF_BOTHPLANES | FF_ALLSIDES | FF_FLOOD; + + l->frontsector->Colormap.FadeColor = vavoomcolors[l->args[0]] & VC_COLORMASK; + l->frontsector->Colormap.FogDensity = 0; + } + alpha = (alpha * 255) / 100; + break; + } + } + } + else if (param == 4) + { + flags = FF_EXISTS | FF_RENDERPLANES | FF_INVERTPLANES | FF_NOSHADE | FF_FIX; + if (param2 & 1) flags |= FF_SEETHROUGH; // marker for allowing missing texture checks + alpha = 255; + } + else + { + static const int defflags[] = { 0, + FF_SOLID, + FF_SWIMMABLE | FF_BOTHPLANES | FF_ALLSIDES | FF_SHOOTTHROUGH | FF_SEETHROUGH, + FF_SHOOTTHROUGH | FF_SEETHROUGH, + }; + + flags = defflags[param & 3] | FF_EXISTS | FF_RENDERALL; + + if (param & 4) flags |= FF_ALLSIDES | FF_BOTHPLANES; + if (param & 16) flags ^= FF_SEETHROUGH; + if (param & 32) flags ^= FF_SHOOTTHROUGH; + + if (param2 & 1) flags |= FF_NOSHADE; + if (param2 & 2) flags |= FF_DOUBLESHADOW; + if (param2 & 4) flags |= FF_FOG; + if (param2 & 8) flags |= FF_THINFLOOR; + if (param2 & 16) flags |= FF_UPPERTEXTURE; + if (param2 & 32) flags |= FF_LOWERTEXTURE; + if (param2 & 64) flags |= FF_ADDITIVETRANS | FF_TRANSLUCENT; + // if flooding is used the floor must be non-solid and is automatically made shootthrough and seethrough + if ((param2 & 128) && !(flags & FF_SOLID)) flags |= FF_FLOOD | FF_SEETHROUGH | FF_SHOOTTHROUGH; + if (param2 & 512) flags |= FF_FADEWALLS; + if (param2&1024) flags |= FF_RESET; + FTextureID tex = line->sidedef[0]->GetTexture(side_t::top); + if (!tex.Exists() && alpha < 255) + { + alpha = -tex.GetIndex(); + } + alpha = clamp(alpha, 0, 255); + if (alpha == 0) flags &= ~(FF_RENDERALL | FF_BOTHPLANES | FF_ALLSIDES); + else if (alpha != 255) flags |= FF_TRANSLUCENT; + + } + P_Add3DFloor(ss, sec, line, flags, alpha); + } + // To be 100% safe this should be done even if the alpha by texture value isn't used. + if (!line->sidedef[0]->GetTexture(side_t::top).isValid()) + line->sidedef[0]->SetTexture(side_t::top, FNullTextureID()); + return 1; +} //========================================================================== // // Spawns 3D floors // //========================================================================== -void P_Spawn3DFloors (void) +void MapLoader::Spawn3DFloors () { static int flagvals[] = {512, 2+512, 512+1024}; - for (auto &line : level.lines) + for (auto &line : Level->lines) { switch(line.special) { case ExtraFloor_LightOnly: if (line.args[1] < 0 || line.args[1] > 2) line.args[1] = 0; if (line.args[0] != 0) - P_Set3DFloor(&line, 3, flagvals[line.args[1]], 0); + Set3DFloor(&line, 3, flagvals[line.args[1]], 0); break; case Sector_Set3DFloor: // The flag high-byte/line id is only needed in Hexen format. // UDMF can set both of these parameters without any restriction of the usable values. // 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) { @@ -912,7 +912,7 @@ void P_Spawn3DFloors (void) line.args[4]=0; } } - P_Set3DFloor(&line, line.args[1]&~8, line.args[2], line.args[3]); + Set3DFloor(&line, line.args[1]&~8, line.args[2], line.args[3]); break; default: @@ -922,7 +922,7 @@ void P_Spawn3DFloors (void) line.args[0] = line.args[1] = line.args[2] = line.args[3] = line.args[4] = 0; } - for (auto &sec : level.sectors) + for (auto &sec : Level->sectors) { P_Recalculate3DFloors(&sec); } diff --git a/src/p_3dmidtex.cpp b/src/p_3dmidtex.cpp index 6b54d6558..81fb56c0e 100644 --- a/src/p_3dmidtex.cpp +++ b/src/p_3dmidtex.cpp @@ -149,7 +149,7 @@ void P_Attach3dMidtexLinesToSector(sector_t *sector, int lineid, int tag, bool c if (tag == 0) { - FLineIdIterator itr(lineid); + auto itr = level.GetLineIdIterator(lineid); int line; while ((line = itr.Next()) >= 0) { @@ -165,13 +165,13 @@ void P_Attach3dMidtexLinesToSector(sector_t *sector, int lineid, int tag, bool c } else { - FSectorTagIterator it(tag); + auto it = level.GetSectorTagIterator(tag); int sec; while ((sec = it.Next()) >= 0) { for (auto ln : level.sectors[sec].Lines) { - if (lineid != 0 && !tagManager.LineHasID(ln, lineid)) continue; + if (lineid != 0 && !level.LineHasId(ln, lineid)) continue; if (ln->frontsector == NULL || ln->backsector == NULL || !(ln->flags & ML_3DMIDTEX)) { diff --git a/src/p_acs.cpp b/src/p_acs.cpp index ddf02616c..32e4b685d 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -1838,7 +1838,7 @@ DPlaneWatcher::DPlaneWatcher (AActor *it, line_t *line, int lineSide, bool ceili Args[2] = arg2; Args[3] = arg3; Args[4] = arg4; - secnum = P_FindFirstSectorFromTag (tag); + secnum = level.FindFirstSectorFromTag (tag); if (secnum >= 0) { secplane_t plane; @@ -3609,7 +3609,7 @@ do_count: if (actor->health > 0 && (kind == NULL || actor->IsA (kind))) { - if (tag == -1 || tagManager.SectorHasTag(actor->Sector, tag)) + if (tag == -1 || level.SectorHasTag(actor->Sector, tag)) { // Don't count items in somebody's inventory if (actor->IsMapActor()) @@ -3628,7 +3628,7 @@ do_count: if (actor->health > 0 && (kind == NULL || actor->IsA (kind))) { - if (tag == -1 || tagManager.SectorHasTag(actor->Sector, tag)) + if (tag == -1 || level.SectorHasTag(actor->Sector, tag)) { // Don't count items in somebody's inventory if (actor->IsMapActor()) @@ -3664,7 +3664,7 @@ void DLevelScript::ChangeFlat (int tag, int name, bool floorOrCeiling) flat = TexMan.GetTextureID(flatname, ETextureType::Flat, FTextureManager::TEXMAN_Overridable); - FSectorTagIterator it(tag); + auto it = level.GetSectorTagIterator(tag); while ((secnum = it.Next()) >= 0) { int pos = floorOrCeiling? sector_t::ceiling : sector_t::floor; @@ -3696,7 +3696,7 @@ void DLevelScript::SetLineTexture (int lineid, int side, int position, int name) texture = TexMan.GetTextureID(texname, ETextureType::Wall, FTextureManager::TEXMAN_Overridable); - FLineIdIterator itr(lineid); + auto itr = level.GetLineIdIterator(lineid); while ((linenum = itr.Next()) >= 0) { side_t *sidedef; @@ -4802,7 +4802,7 @@ int DLevelScript::SideFromID(int id, int side) } else { - int line = P_FindFirstLineFromID(id); + int line = level.FindFirstLineFromID(id); if (line == -1) return -1; if (level.lines[line].sidedef[side] == NULL) return -1; return level.lines[line].sidedef[side]->UDMFIndex; @@ -4818,7 +4818,7 @@ int DLevelScript::LineFromID(int id) } else { - return P_FindFirstLineFromID(id); + return level.FindFirstLineFromID(id); } } @@ -5304,10 +5304,10 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) return 0; // Not implemented yet case ACSF_GetSectorUDMFInt: - return GetUDMFInt(UDMF_Sector, P_FindFirstSectorFromTag(args[0]), level.Behaviors.LookupString(args[1])); + return GetUDMFInt(UDMF_Sector, level.FindFirstSectorFromTag(args[0]), level.Behaviors.LookupString(args[1])); case ACSF_GetSectorUDMFFixed: - return DoubleToACS(GetUDMFFloat(UDMF_Sector, P_FindFirstSectorFromTag(args[0]), level.Behaviors.LookupString(args[1]))); + return DoubleToACS(GetUDMFFloat(UDMF_Sector, level.FindFirstSectorFromTag(args[0]), level.Behaviors.LookupString(args[1]))); case ACSF_GetSideUDMFInt: return GetUDMFInt(UDMF_Side, SideFromID(args[0], args[1]), level.Behaviors.LookupString(args[2])); @@ -5639,7 +5639,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) int space = args[2] < CHAN_FLOOR || args[2] > CHAN_INTERIOR ? CHAN_FULLHEIGHT : args[2]; if (seqname != NULL) { - FSectorTagIterator it(args[0]); + auto it = level.GetSectorTagIterator(args[0]); int s; while ((s = it.Next()) >= 0) { @@ -6187,7 +6187,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) if (argCount >= 2) { int line; - FLineIdIterator itr(args[0]); + auto itr = level.GetLineIdIterator(args[0]); while ((line = itr.Next()) >= 0) { level.lines[line].activation = args[1]; @@ -6198,7 +6198,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) case ACSF_GetLineActivation: if (argCount > 0) { - int line = P_FindFirstLineFromID(args[0]); + int line = level.FindFirstLineFromID(args[0]); return line >= 0 ? level.lines[line].activation : 0; } break; @@ -6411,7 +6411,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) case ACSF_SetSectorDamage: if (argCount >= 2) { - FSectorTagIterator it(args[0]); + auto it = level.GetSectorTagIterator(args[0]); int s; while ((s = it.Next()) >= 0) { @@ -6431,7 +6431,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) if (args[1] == sector_t::floor || args[1] == sector_t::ceiling) { int terrain = P_FindTerrain(level.Behaviors.LookupString(args[2])); - FSectorTagIterator it(args[0]); + auto it = level.GetSectorTagIterator(args[0]); int s; while ((s = it.Next()) >= 0) { @@ -6572,7 +6572,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) float height = float(args[5]); if (args[2] == -1) color = -1; - FSectorTagIterator it(args[0]); + auto it = level.GetSectorTagIterator(args[0]); int s; while ((s = it.Next()) >= 0) { @@ -6584,7 +6584,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) case ACSF_SetFogDensity: { - FSectorTagIterator it(args[0]); + auto it = level.GetSectorTagIterator(args[0]); int s; int d = clamp(args[1]/2, 0, 255); while ((s = it.Next()) >= 0) @@ -6644,7 +6644,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) case ACSF_GetSectorHealth: { int part = args[1]; - FSectorTagIterator it(args[0]); + auto it = level.GetSectorTagIterator(args[0]); int s = it.Next(); if (s < 0) return 0; @@ -6670,7 +6670,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) case ACSF_GetLineHealth: { - FLineIdIterator it(args[0]); + auto it = level.GetLineIdIterator(args[0]); int l = it.Next(); if (l < 0) return 0; @@ -6687,7 +6687,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) case ACSF_GetLineX: case ACSF_GetLineY: { - FLineIdIterator it(args[0]); + auto it = level.GetLineIdIterator(args[0]); int lineno = it.Next(); if (lineno < 0) return 0; DVector2 delta = level.lines[lineno].Delta(); @@ -6803,7 +6803,7 @@ int DLevelScript::RunScript () // state running { int secnum; - FSectorTagIterator it(statedata); + auto it = level.GetSectorTagIterator(statedata); while ((secnum = it.Next()) >= 0) { if (level.sectors[secnum].floordata || level.sectors[secnum].ceilingdata) @@ -8911,7 +8911,7 @@ scriptwait: { int lineno; - FLineIdIterator itr(STACK(2)); + auto itr = level.GetLineIdIterator(STACK(2)); while ((lineno = itr.Next()) >= 0) { auto &line = level.lines[lineno]; @@ -8948,7 +8948,7 @@ scriptwait: { int line; - FLineIdIterator itr(STACK(2)); + auto itr = level.GetLineIdIterator(STACK(2)); while ((line = itr.Next()) >= 0) { if (STACK(1)) @@ -8974,7 +8974,7 @@ scriptwait: arg0 = -FName(level.Behaviors.LookupString(arg0)); } - FLineIdIterator itr(STACK(7)); + auto itr = level.GetLineIdIterator(STACK(7)); while ((linenum = itr.Next()) >= 0) { line_t *line = &level.lines[linenum]; @@ -9450,9 +9450,9 @@ scriptwait: double z = 0; if (tag != 0) - secnum = P_FindFirstSectorFromTag (tag); + secnum = level.FindFirstSectorFromTag (tag); else - secnum = P_PointInSector (x, y)->sectornum; + secnum = level.PointInSector (DVector2(x, y))->sectornum; if (secnum >= 0) { @@ -9472,7 +9472,7 @@ scriptwait: case PCD_GETSECTORLIGHTLEVEL: { - int secnum = P_FindFirstSectorFromTag (STACK(1)); + int secnum = level.FindFirstSectorFromTag (STACK(1)); int z = -1; if (secnum >= 0) diff --git a/src/p_actionfunctions.cpp b/src/p_actionfunctions.cpp index 95e667fa2..546573446 100644 --- a/src/p_actionfunctions.cpp +++ b/src/p_actionfunctions.cpp @@ -3288,7 +3288,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_LineEffect) if ((oldjunk.special = special)) // Linedef type { oldjunk.tag = tag; // Sector tag for linedef - P_TranslateLineDef(&junk, &oldjunk); // Turn into native type + level.TranslateLineDef(&junk, &oldjunk); // Turn into native type res = !!P_ExecuteSpecial(junk.special, NULL, self, false, junk.args[0], junk.args[1], junk.args[2], junk.args[3], junk.args[4]); if (res && !(junk.flags & ML_REPEAT_SPECIAL)) // If only once, @@ -4828,7 +4828,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_CheckTerrain) } else if (sec->special == Scroll_StrifeCurrent) { - int anglespeed = tagManager.GetFirstSectorTag(sec) - 100; + int anglespeed = level.GetFirstSectorTag(sec) - 100; double speed = (anglespeed % 10) / 16.; DAngle an = (anglespeed / 10) * (360 / 8.); self->Thrust(an, speed); diff --git a/src/p_ceiling.cpp b/src/p_ceiling.cpp index 4199ccb64..976cc45b4 100644 --- a/src/p_ceiling.cpp +++ b/src/p_ceiling.cpp @@ -520,7 +520,7 @@ bool EV_DoCeiling (DCeiling::ECeiling type, line_t *line, } // affects all sectors with the same tag as the linedef - FSectorTagIterator it(tag); + auto it = level.GetSectorTagIterator(tag); while ((secnum = it.Next()) >= 0) { rtn |= P_CreateCeiling(&level.sectors[secnum], type, line, tag, speed, speed2, height, crush, silent, change, hexencrush); @@ -592,7 +592,7 @@ bool EV_CeilingCrushStop (int tag, bool remove) bool EV_StopCeiling(int tag, line_t *line) { int sec; - FSectorTagIterator it(tag, line); + auto it = level.GetSectorTagIterator(tag, line); while ((sec = it.Next()) >= 0) { if (level.sectors[sec].ceilingdata) diff --git a/src/p_doors.cpp b/src/p_doors.cpp index ec38df326..a90b73b31 100644 --- a/src/p_doors.cpp +++ b/src/p_doors.cpp @@ -490,7 +490,7 @@ bool EV_DoDoor (DDoor::EVlDoor type, line_t *line, AActor *thing, else { // [RH] Remote door - FSectorTagIterator it(tag); + auto it = level.GetSectorTagIterator(tag); while ((secnum = it.Next()) >= 0) { sec = &level.sectors[secnum]; @@ -787,7 +787,7 @@ bool EV_SlidingDoor (line_t *line, AActor *actor, int tag, int speed, int delay, return false; } - FSectorTagIterator it(tag); + auto it = level.GetSectorTagIterator(tag); while ((secnum = it.Next()) >= 0) { sec = &level.sectors[secnum]; diff --git a/src/p_floor.cpp b/src/p_floor.cpp index e36a1aca2..cfcfbe4d5 100644 --- a/src/p_floor.cpp +++ b/src/p_floor.cpp @@ -532,7 +532,7 @@ bool EV_DoFloor (DFloor::EFloor floortype, line_t *line, int tag, bool rtn = false; // check if a manual trigger; if so do just the sector on the backside - FSectorTagIterator it(tag, line); + auto it = level.GetSectorTagIterator(tag, line); while ((secnum = it.Next()) >= 0) { rtn |= P_CreateFloor(&level.sectors[secnum], floortype, line, speed, height, crush, change, hexencrush, hereticlower); @@ -551,7 +551,7 @@ bool EV_DoFloor (DFloor::EFloor floortype, line_t *line, int tag, bool EV_FloorCrushStop (int tag, line_t *line) { int secnum; - FSectorTagIterator it(tag, line); + auto it = level.GetSectorTagIterator(tag, line); while ((secnum = it.Next()) >= 0) { sector_t *sec = &level.sectors[secnum]; @@ -571,7 +571,7 @@ bool EV_FloorCrushStop (int tag, line_t *line) bool EV_StopFloor(int tag, line_t *line) { int sec; - FSectorTagIterator it(tag, line); + auto it = level.GetSectorTagIterator(tag, line); while ((sec = it.Next()) >= 0) { if (level.sectors[sec].floordata) @@ -619,7 +619,7 @@ bool EV_BuildStairs (int tag, DFloor::EStair type, line_t *line, persteptime = int(stairsize / speed); // check if a manual trigger, if so do just the sector on the backside - FSectorTagIterator itr(tag, line); + auto itr = level.GetSectorTagIterator(tag, line); // The compatibility mode doesn't work with a hashing algorithm. // It needs the original linear search method. This was broken in Boom. bool compatible = tag != 0 && (i_compatflags & COMPATF_STAIRINDEX); @@ -794,7 +794,7 @@ bool EV_DoDonut (int tag, line_t *line, double pillarspeed, double slimespeed) rtn = false; - FSectorTagIterator itr(tag, line); + auto itr = level.GetSectorTagIterator(tag, line); while ((secnum = itr.Next()) >= 0) { s1 = &level.sectors[secnum]; // s1 is pillar's sector @@ -1011,7 +1011,7 @@ bool EV_DoElevator (line_t *line, DElevator::EElevator elevtype, secnum = -1; rtn = false; - FSectorTagIterator itr(tag, line); + auto itr = level.GetSectorTagIterator(tag, line); // act on all sectors with the same tag as the triggering linedef while ((secnum = itr.Next()) >= 0) @@ -1106,7 +1106,7 @@ bool EV_DoChange (line_t *line, EChange changetype, int tag) rtn = false; // change all sectors with the same tag as the linedef - FSectorTagIterator it(tag); + auto it = level.GetSectorTagIterator(tag); while ((secnum = it.Next()) >= 0) { sec = &level.sectors[secnum]; @@ -1320,7 +1320,7 @@ bool EV_StartWaggle (int tag, line_t *line, int height, int speed, int offset, retCode = false; - FSectorTagIterator itr(tag, line); + auto itr = level.GetSectorTagIterator(tag, line); while ((sectorIndex = itr.Next()) >= 0) { diff --git a/src/p_lights.cpp b/src/p_lights.cpp index 4db7e2ce4..f36fde90c 100644 --- a/src/p_lights.cpp +++ b/src/p_lights.cpp @@ -327,7 +327,7 @@ DFlicker::DFlicker (sector_t *sector, int upper, int lower) void EV_StartLightFlickering (int tag, int upper, int lower) { int secnum; - FSectorTagIterator it(tag); + auto it = level.GetSectorTagIterator(tag); while ((secnum = it.Next()) >= 0) { Create (&level.sectors[secnum], upper, lower); @@ -504,7 +504,7 @@ DStrobe::DStrobe (sector_t *sector, int utics, int ltics, bool inSync) void EV_StartLightStrobing (int tag, int upper, int lower, int utics, int ltics) { int secnum; - FSectorTagIterator it(tag); + auto it = level.GetSectorTagIterator(tag); while ((secnum = it.Next()) >= 0) { sector_t *sec = &level.sectors[secnum]; @@ -518,7 +518,7 @@ void EV_StartLightStrobing (int tag, int upper, int lower, int utics, int ltics) void EV_StartLightStrobing (int tag, int utics, int ltics) { int secnum; - FSectorTagIterator it(tag); + auto it = level.GetSectorTagIterator(tag); while ((secnum = it.Next()) >= 0) { sector_t *sec = &level.sectors[secnum]; @@ -540,7 +540,7 @@ void EV_StartLightStrobing (int tag, int utics, int ltics) void EV_TurnTagLightsOff (int tag) { int secnum; - FSectorTagIterator it(tag); + auto it = level.GetSectorTagIterator(tag); while ((secnum = it.Next()) >= 0) { sector_t *sector = &level.sectors[secnum]; @@ -569,7 +569,7 @@ void EV_TurnTagLightsOff (int tag) void EV_LightTurnOn (int tag, int bright) { int secnum; - FSectorTagIterator it(tag); + auto it = level.GetSectorTagIterator(tag); while ((secnum = it.Next()) >= 0) { sector_t *sector = &level.sectors[secnum]; @@ -622,7 +622,7 @@ void EV_LightTurnOnPartway (int tag, double frac) // Search all sectors for ones with same tag as activating line int secnum; - FSectorTagIterator it(tag); + auto it = level.GetSectorTagIterator(tag); while ((secnum = it.Next()) >= 0) { sector_t *temp, *sector = &level.sectors[secnum]; @@ -658,7 +658,7 @@ void EV_LightTurnOnPartway (int tag, double frac) void EV_LightChange (int tag, int value) { int secnum; - FSectorTagIterator it(tag); + auto it = level.GetSectorTagIterator(tag); while ((secnum = it.Next()) >= 0) { level.sectors[secnum].SetLightLevel(level.sectors[secnum].lightlevel + value); @@ -824,7 +824,7 @@ void EV_StartLightGlowing (int tag, int upper, int lower, int tics) lower = temp; } - FSectorTagIterator it(tag); + auto it = level.GetSectorTagIterator(tag); while ((secnum = it.Next()) >= 0) { sector_t *sec = &level.sectors[secnum]; @@ -844,7 +844,7 @@ void EV_StartLightGlowing (int tag, int upper, int lower, int tics) void EV_StartLightFading (int tag, int value, int tics) { int secnum; - FSectorTagIterator it(tag); + auto it = level.GetSectorTagIterator(tag); while ((secnum = it.Next()) >= 0) { sector_t *sec = &level.sectors[secnum]; @@ -990,7 +990,7 @@ void EV_StopLightEffect (int tag) while ((effect = iterator.Next()) != NULL) { - if (tagManager.SectorHasTag(effect->GetSector(), tag)) + if (level.SectorHasTag(effect->GetSector(), tag)) { effect->Destroy(); } diff --git a/src/p_linkedsectors.cpp b/src/p_linkedsectors.cpp index 11e520a0d..f50c68b60 100644 --- a/src/p_linkedsectors.cpp +++ b/src/p_linkedsectors.cpp @@ -288,7 +288,7 @@ static void RemoveTaggedSectors(extsector_t::linked::plane &scrollplane, int tag { for(int i = scrollplane.Sectors.Size()-1; i>=0; i--) { - if (tagManager.SectorHasTag(scrollplane.Sectors[i].Sector, tag)) + if (level.SectorHasTag(scrollplane.Sectors[i].Sector, tag)) { scrollplane.Sectors.Delete(i); } @@ -327,7 +327,7 @@ bool P_AddSectorLinks(sector_t *control, int tag, INTBOOL ceiling, int movetype) if (movetype > 0) { int sec; - FSectorTagIterator itr(tag); + auto itr = level.GetSectorTagIterator(tag); while ((sec = itr.Next()) >= 0) { // Don't attach to self (but allow attaching to this sector's oposite plane. @@ -360,7 +360,7 @@ void P_AddSectorLinksByID(sector_t *control, int id, INTBOOL ceiling) { extsector_t::linked::plane &scrollplane = ceiling? control->e->Linked.Ceiling : control->e->Linked.Floor; - FLineIdIterator itr(id); + auto itr = level.GetLineIdIterator(id); int line; while ((line = itr.Next()) >= 0) { diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index 395ea2c1f..cfdf283a9 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -1520,7 +1520,7 @@ FUNC(LS_Thing_Destroy) while (actor) { AActor *temp = iterator.Next (); - if (actor->flags & MF_SHOOTABLE && tagManager.SectorHasTag(actor->Sector, arg2)) + if (actor->flags & MF_SHOOTABLE && Level->SectorHasTag(actor->Sector, arg2)) P_DamageMobj (actor, NULL, it, arg1 ? TELEFRAG_DAMAGE : actor->health, NAME_None); actor = temp; } @@ -1533,7 +1533,7 @@ FUNC(LS_Thing_Destroy) while (actor) { AActor *temp = iterator.Next (); - if (actor->flags & MF_SHOOTABLE && (arg2 == 0 || tagManager.SectorHasTag(actor->Sector, arg2))) + if (actor->flags & MF_SHOOTABLE && (arg2 == 0 || Level->SectorHasTag(actor->Sector, arg2))) P_DamageMobj (actor, NULL, it, arg1 ? TELEFRAG_DAMAGE : actor->health, NAME_None); actor = temp; } @@ -2194,7 +2194,7 @@ FUNC(LS_Sector_ChangeSound) return false; rtn = false; - FSectorTagIterator itr(arg0); + auto itr = Level->GetSectorTagIterator(arg0); while ((secNum = itr.Next()) >= 0) { Level->sectors[secNum].seqType = arg1; @@ -2213,7 +2213,7 @@ FUNC(LS_Sector_ChangeFlags) return false; rtn = false; - FSectorTagIterator itr(arg0); + auto itr = Level->GetSectorTagIterator(arg0); // exclude protected flags arg1 &= ~SECF_NOMODIFY; arg2 &= ~SECF_NOMODIFY; @@ -2262,7 +2262,7 @@ FUNC(LS_Sector_SetTranslucent) if (arg0 != 0) { int secnum; - FSectorTagIterator itr(arg0); + auto itr = Level->GetSectorTagIterator(arg0); while ((secnum = itr.Next()) >= 0) { Level->sectors[secnum].SetAlpha(arg1, clamp(arg2, 0, 255) / 255.); @@ -2278,7 +2278,7 @@ FUNC(LS_Sector_SetLink) { if (arg0 != 0) // control tag == 0 is for static initialization and must not be handled here { - int control = P_FindFirstSectorFromTag(arg0); + int control = level.FindFirstSectorFromTag(arg0); if (control >= 0) { return P_AddSectorLinks(&Level->sectors[control], arg1, arg2, arg3); @@ -2379,7 +2379,7 @@ FUNC(LS_Sector_SetDamage) // problems by adding an unwanted constructor. // Since it doesn't really matter whether the type is translated // here or in P_PlayerInSpecialSector I think it's the best solution. - FSectorTagIterator itr(arg0); + auto itr = Level->GetSectorTagIterator(arg0); int secnum; while ((secnum = itr.Next()) >= 0) { @@ -2418,7 +2418,7 @@ FUNC(LS_Sector_SetGravity) arg2 = 99; gravity = (double)arg1 + (double)arg2 * 0.01; - FSectorTagIterator itr(arg0); + auto itr = Level->GetSectorTagIterator(arg0); int secnum; while ((secnum = itr.Next()) >= 0) Level->sectors[secnum].gravity = gravity; @@ -2429,7 +2429,7 @@ FUNC(LS_Sector_SetGravity) FUNC(LS_Sector_SetColor) // Sector_SetColor (tag, r, g, b, desaturate) { - FSectorTagIterator itr(arg0); + auto itr = Level->GetSectorTagIterator(arg0); int secnum; while ((secnum = itr.Next()) >= 0) { @@ -2442,7 +2442,7 @@ FUNC(LS_Sector_SetColor) FUNC(LS_Sector_SetFade) // Sector_SetFade (tag, r, g, b) { - FSectorTagIterator itr(arg0); + auto itr = Level->GetSectorTagIterator(arg0); int secnum; while ((secnum = itr.Next()) >= 0) { @@ -2457,7 +2457,7 @@ FUNC(LS_Sector_SetCeilingPanning) double xofs = arg1 + arg2 / 100.; double yofs = arg3 + arg4 / 100.; - FSectorTagIterator itr(arg0); + auto itr = Level->GetSectorTagIterator(arg0); int secnum; while ((secnum = itr.Next()) >= 0) { @@ -2473,7 +2473,7 @@ FUNC(LS_Sector_SetFloorPanning) double xofs = arg1 + arg2 / 100.; double yofs = arg3 + arg4 / 100.; - FSectorTagIterator itr(arg0); + auto itr = Level->GetSectorTagIterator(arg0); int secnum; while ((secnum = itr.Next()) >= 0) { @@ -2494,7 +2494,7 @@ FUNC(LS_Sector_SetFloorScale) if (yscale) yscale = 1. / yscale; - FSectorTagIterator itr(arg0); + auto itr = Level->GetSectorTagIterator(arg0); int secnum; while ((secnum = itr.Next()) >= 0) { @@ -2517,7 +2517,7 @@ FUNC(LS_Sector_SetCeilingScale) if (yscale) yscale = 1. / yscale; - FSectorTagIterator itr(arg0); + auto itr = Level->GetSectorTagIterator(arg0); int secnum; while ((secnum = itr.Next()) >= 0) { @@ -2539,7 +2539,7 @@ FUNC(LS_Sector_SetFloorScale2) if (yscale) yscale = 1. / yscale; - FSectorTagIterator itr(arg0); + auto itr = Level->GetSectorTagIterator(arg0); int secnum; while ((secnum = itr.Next()) >= 0) { @@ -2561,7 +2561,7 @@ FUNC(LS_Sector_SetCeilingScale2) if (yscale) yscale = 1. / yscale; - FSectorTagIterator itr(arg0); + auto itr = Level->GetSectorTagIterator(arg0); int secnum; while ((secnum = itr.Next()) >= 0) { @@ -2579,7 +2579,7 @@ FUNC(LS_Sector_SetRotation) DAngle ceiling = (double)arg2; DAngle floor = (double)arg1; - FSectorTagIterator itr(arg0); + auto itr = Level->GetSectorTagIterator(arg0); int secnum; while ((secnum = itr.Next()) >= 0) { @@ -2594,7 +2594,7 @@ FUNC(LS_Line_AlignCeiling) { bool ret = 0; - FLineIdIterator itr(arg0); + auto itr = Level->GetLineIdIterator(arg0); int line; while ((line = itr.Next()) >= 0) { @@ -2608,7 +2608,7 @@ FUNC(LS_Line_AlignFloor) { bool ret = 0; - FLineIdIterator itr(arg0); + auto itr = Level->GetLineIdIterator(arg0); int line; while ((line = itr.Next()) >= 0) { @@ -2627,7 +2627,7 @@ FUNC(LS_Line_SetTextureOffset) if (arg0 == 0 || arg3 < 0 || arg3 > 1) return false; - FLineIdIterator itr(arg0); + auto itr = Level->GetLineIdIterator(arg0); int line; while ((line = itr.Next()) >= 0) { @@ -2682,7 +2682,7 @@ FUNC(LS_Line_SetTextureScale) if (arg0 == 0 || arg3 < 0 || arg3 > 1) return false; - FLineIdIterator itr(arg0); + auto itr = Level->GetLineIdIterator(arg0); int line; while ((line = itr.Next()) >= 0) { @@ -2756,7 +2756,7 @@ FUNC(LS_Line_SetBlocking) if (arg2 & 1) clearflags |= flagtrans[i]; } - FLineIdIterator itr(arg0); + auto itr = Level->GetLineIdIterator(arg0); int line; while ((line = itr.Next()) >= 0) { @@ -2788,7 +2788,7 @@ FUNC(LS_Line_SetAutomapFlags) if (arg2 & 1) clearflags |= flagtrans[i]; } - FLineIdIterator itr(arg0); + auto itr = Level->GetLineIdIterator(arg0); int line; while ((line = itr.Next()) >= 0) { @@ -2803,7 +2803,7 @@ FUNC(LS_Line_SetAutomapStyle) { if (arg1 < AMLS_COUNT && arg1 >= 0) { - FLineIdIterator itr(arg0); + auto itr = Level->GetLineIdIterator(arg0); int line; while ((line = itr.Next()) >= 0) { @@ -3103,7 +3103,7 @@ FUNC(LS_SetPlayerProperty) FUNC(LS_TranslucentLine) // TranslucentLine (id, amount, type) { - FLineIdIterator itr(arg0); + auto itr = Level->GetLineIdIterator(arg0); int linenum; while ((linenum = itr.Next()) >= 0) { @@ -3233,7 +3233,7 @@ FUNC(LS_ClearForceField) { bool rtn = false; - FSectorTagIterator itr(arg0); + auto itr = Level->GetSectorTagIterator(arg0); int secnum; while ((secnum = itr.Next()) >= 0) { @@ -3409,7 +3409,7 @@ FUNC(LS_Sector_SetPlaneReflection) // Sector_SetPlaneReflection (tag, floor, ceiling) { int secnum; - FSectorTagIterator itr(arg0); + auto itr = Level->GetSectorTagIterator(arg0); while ((secnum = itr.Next()) >= 0) { @@ -3450,7 +3450,7 @@ FUNC(LS_Sector_SetFloorGlow) int secnum; PalEntry color(arg2, arg3, arg4); if (arg1 < 0) color = -1; // negative height invalidates the glow. - FSectorTagIterator itr(arg0); + auto itr = Level->GetSectorTagIterator(arg0); while ((secnum = itr.Next()) >= 0) { @@ -3467,7 +3467,7 @@ FUNC(LS_Sector_SetCeilingGlow) int secnum; PalEntry color(arg2, arg3, arg4); if (arg1 < 0) color = -1; // negative height invalidates the glow. - FSectorTagIterator itr(arg0); + auto itr = Level->GetSectorTagIterator(arg0); while ((secnum = itr.Next()) >= 0) { @@ -3481,7 +3481,7 @@ FUNC(LS_Sector_SetCeilingGlow) FUNC(LS_Line_SetHealth) // Line_SetHealth(id, health) { - FLineIdIterator itr(arg0); + auto itr = Level->GetLineIdIterator(arg0); int l; if (arg1 < 0) @@ -3500,7 +3500,7 @@ FUNC(LS_Line_SetHealth) FUNC(LS_Sector_SetHealth) // Sector_SetHealth(id, part, health) { - FSectorTagIterator itr(arg0); + auto itr = Level->GetSectorTagIterator(arg0); int s; if (arg2 < 0) diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index feac7212c..cb8fc943d 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -3776,7 +3776,7 @@ void AActor::Tick () } else if (scrolltype == Scroll_StrifeCurrent) { // Strife scroll special - int anglespeed = tagManager.GetFirstSectorTag(sec) - 100; + int anglespeed = level.GetFirstSectorTag(sec) - 100; double carryspeed = (anglespeed % 10) / (16 * CARRYFACTOR); DAngle angle = ((anglespeed / 10) * 45.); scrollv += angle.ToVector(carryspeed); diff --git a/src/p_pillar.cpp b/src/p_pillar.cpp index 8503c1d7e..5c3453b4f 100644 --- a/src/p_pillar.cpp +++ b/src/p_pillar.cpp @@ -218,7 +218,7 @@ bool EV_DoPillar (DPillar::EPillar type, line_t *line, int tag, bool rtn = false; // check if a manual trigger; if so do just the sector on the backside - FSectorTagIterator itr(tag, line); + auto itr = level.GetSectorTagIterator(tag, line); while ((secnum = itr.Next()) >= 0) { sec = &level.sectors[secnum]; diff --git a/src/p_plats.cpp b/src/p_plats.cpp index 183f759b8..e368fcaa5 100644 --- a/src/p_plats.cpp +++ b/src/p_plats.cpp @@ -244,7 +244,7 @@ bool EV_DoPlat (int tag, line_t *line, DPlat::EPlatType type, double height, // [RH] If tag is zero, use the sector on the back side // of the activating line (if any). - FSectorTagIterator itr(tag, line); + auto itr = level.GetSectorTagIterator(tag, line); while ((secnum = itr.Next()) >= 0) { sec = &level.sectors[secnum]; diff --git a/src/p_pusher.cpp b/src/p_pusher.cpp index b920cb99d..bbe135bd1 100644 --- a/src/p_pusher.cpp +++ b/src/p_pusher.cpp @@ -175,7 +175,7 @@ DPusher::DPusher (DPusher::EPusher type, line_t *l, int magnitude, int angle, int DPusher::CheckForSectorMatch (EPusher type, int tag) { - if (m_Type == type && tagManager.SectorHasTag(m_Affectee, tag)) + if (m_Type == type && level.SectorHasTag(m_Affectee, tag)) return m_Affectee; else return -1; @@ -444,7 +444,7 @@ void AdjustPusher (int tag, int magnitude, int angle, bool wind) int secnum; // Now create pushers for any sectors that don't already have them. - FSectorTagIterator itr(tag); + auto itr = level.GetSectorTagIterator(tag); while ((secnum = itr.Next()) >= 0) { unsigned int i; diff --git a/src/p_scroll.cpp b/src/p_scroll.cpp index edb97cec0..5e24b09d2 100644 --- a/src/p_scroll.cpp +++ b/src/p_scroll.cpp @@ -648,7 +648,7 @@ void SetWallScroller (FLevelLocals *Level, int id, int sidechoice, double dx, do { auto wall = scroller->GetWall (); - if (wall != nullptr && tagManager.LineHasID(wall->linedef, id) && wall->linedef->sidedef[sidechoice] == wall && Where == scroller->GetScrollParts()) + if (wall != nullptr && Level->LineHasId(wall->linedef, id) && wall->linedef->sidedef[sidechoice] == wall && Where == scroller->GetScrollParts()) { scroller->Destroy (); } @@ -669,7 +669,7 @@ void SetWallScroller (FLevelLocals *Level, int id, int sidechoice, double dx, do if (wall != nullptr) { auto line = wall->linedef; - if (tagManager.LineHasID(line, id) && line->sidedef[sidechoice] == wall && Where == scroll->GetScrollParts()) + if (Level->LineHasId(line, id) && line->sidedef[sidechoice] == wall && Where == scroll->GetScrollParts()) { scroll->SetRate(dx, dy); Collection.Push(scroll); @@ -682,7 +682,7 @@ void SetWallScroller (FLevelLocals *Level, int id, int sidechoice, double dx, do int linenum; // Now create scrollers for any walls that don't already have them. - FLineIdIterator itr(id); + auto itr = Level->GetLineIdIterator(id); while ((linenum = itr.Next()) >= 0) { side_t *side = Level->lines[linenum].sidedef[sidechoice]; diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 1d181be2b..295cdcb63 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -275,6 +275,7 @@ void FLevelLocals::ClearLevelData() } ClearPortals(); + tagManager.Clear(); SpotState = nullptr; ACSThinker = nullptr; FraggleScriptThinker = nullptr; @@ -341,7 +342,6 @@ void P_FreeLevelData () level.ClearAllSubsectorLinks(); // can't be done as part of the polyobj deletion process. SN_StopAllSequences (); DThinker::DestroyAllThinkers (); - tagManager.Clear(); level.Behaviors.UnloadModules (); diff --git a/src/p_setup.h b/src/p_setup.h index 1cd67c2ad..a85801a32 100644 --- a/src/p_setup.h +++ b/src/p_setup.h @@ -157,7 +157,6 @@ struct line_t; struct maplinedef_t; void P_LoadTranslator(const char *lumpname); -void P_TranslateLineDef (line_t *ld, maplinedef_t *mld, int lineindexforid = -1); int P_TranslateSectorSpecial (int); int GetUDMFInt(int type, int index, FName key); diff --git a/src/p_spec.cpp b/src/p_spec.cpp index 80191b01d..0611627c8 100644 --- a/src/p_spec.cpp +++ b/src/p_spec.cpp @@ -201,9 +201,9 @@ bool P_ActivateLine (line_t *line, AActor *mo, int side, int activationType, DVe !repeat && // only non-repeatable triggers (specialGeneric_Crusher) && // not for Boom's generalized linedefs special && // not for lines without a special - tagManager.LineHasID(line, line->args[0]) && // Safety check: exclude edited UDMF linedefs or ones that don't map the tag to args[0] + level.LineHasId(line, line->args[0]) && // Safety check: exclude edited UDMF linedefs or ones that don't map the tag to args[0] line->args[0] && // only if there's a tag (which is stored in the first arg) - P_FindFirstSectorFromTag (line->args[0]) == -1) // only if no sector is tagged to this linedef + level.FindFirstSectorFromTag (line->args[0]) == -1) // only if no sector is tagged to this linedef { P_ChangeSwitchTexture (line->sidedef[0], repeat, special); line->special = 0; @@ -516,7 +516,7 @@ static void DoSectorDamage(AActor *actor, sector_t *sec, int amount, FName type, void P_SectorDamage(FLevelLocals *Level, int tag, int amount, FName type, PClassActor *protectClass, int flags) { - FSectorTagIterator itr(tag); + auto itr = Level->GetSectorTagIterator(tag); int secnum; while ((secnum = itr.Next()) >= 0) { @@ -751,13 +751,13 @@ DLightTransfer::DLightTransfer (sector_t *srcSec, int target, bool copyFloor) auto Level = &level; if (copyFloor) { - FSectorTagIterator itr(target); + auto itr = Level->GetSectorTagIterator(target); while ((secnum = itr.Next()) >= 0) Level->sectors[secnum].ChangeFlags(sector_t::floor, 0, PLANEF_ABSLIGHTING); } else { - FSectorTagIterator itr(target); + auto itr = Level->GetSectorTagIterator(target); while ((secnum = itr.Next()) >= 0) Level->sectors[secnum].ChangeFlags(sector_t::ceiling, 0, PLANEF_ABSLIGHTING); } @@ -782,13 +782,13 @@ void DLightTransfer::DoTransfer (int llevel, int target, bool floor) auto Level = &level; if (floor) { - FSectorTagIterator itr(target); + auto itr = Level->GetSectorTagIterator(target); while ((secnum = itr.Next()) >= 0) Level->sectors[secnum].SetPlaneLight(sector_t::floor, llevel); } else { - FSectorTagIterator itr(target); + auto itr = Level->GetSectorTagIterator(target); while ((secnum = itr.Next()) >= 0) Level->sectors[secnum].SetPlaneLight(sector_t::ceiling, llevel); } @@ -850,8 +850,8 @@ DWallLightTransfer::DWallLightTransfer (sector_t *srcSec, int target, uint8_t fl wallflags = WALLF_ABSLIGHTING | WALLF_NOFAKECONTRAST; } - FLineIdIterator itr(target); auto Level = &level; + auto itr = Level->GetLineIdIterator(target); while ((linenum = itr.Next()) >= 0) { if (flags & WLF_SIDE1 && Level->lines[linenum].sidedef[0] != NULL) @@ -883,7 +883,7 @@ void DWallLightTransfer::DoTransfer (short lightlevel, int target, uint8_t flags int linenum; auto Level = &level; - FLineIdIterator itr(target); + auto itr = Level->GetLineIdIterator(target); while ((linenum = itr.Next()) >= 0) { line_t *line = &Level->lines[linenum]; diff --git a/src/p_tags.cpp b/src/p_tags.cpp index 654f0bb40..ab521520c 100644 --- a/src/p_tags.cpp +++ b/src/p_tags.cpp @@ -371,7 +371,7 @@ int FSectorTagIterator::NextCompat(bool compat, int start) for (unsigned i = start + 1; i < level.sectors.Size(); i++) { - if (tagManager.SectorHasTag(i, searchtag)) return i; + if (level.SectorHasTag(i, searchtag)) return i; } return -1; } diff --git a/src/p_tags.h b/src/p_tags.h index 8ce6b3568..f99353d8e 100644 --- a/src/p_tags.h +++ b/src/p_tags.h @@ -13,6 +13,7 @@ struct FTagItem class FSectorTagIterator; class FLineIdIterator; +struct FLevelLocals; class FTagManager { @@ -21,8 +22,12 @@ class FTagManager TAG_HASH_SIZE = 256 }; + // Only the iterators and the map loader, including its helpers may access this. Everything else should go through FLevelLocals's interface. friend class FSectorTagIterator; friend class FLineIdIterator; + friend class MapLoader; + friend struct FLevelLocals; + friend class UDMFParser; TArray allTags; TArray allIDs; @@ -41,7 +46,6 @@ class FTagManager return sect >= 0 && sect < (int)startForLine.Size() && startForLine[sect] >= 0; } -public: void Clear() { allTags.Clear(); @@ -63,6 +67,7 @@ public: bool LineHasID(const line_t *line, int id) const; void HashTags(); +public: // The ones below are called by functions that cannot be declared as friend. void AddSectorTag(int sector, int tag); void AddLineID(int line, int tag); void RemoveSectorTags(int sect); @@ -75,6 +80,7 @@ extern FTagManager tagManager; class FSectorTagIterator { + friend struct FLevelLocals; protected: int searchtag; int start; @@ -104,7 +110,6 @@ protected: } } -public: FSectorTagIterator(int tag) { Init(tag); @@ -115,38 +120,27 @@ public: { Init(tag, line); } - +public: int Next(); int NextCompat(bool compat, int secnum); }; class FLineIdIterator { + friend struct FLevelLocals; protected: int searchtag; int start; -public: FLineIdIterator(int id) { searchtag = id; start = tagManager.IDHashFirst[((unsigned int)id) % FTagManager::TAG_HASH_SIZE]; } +public: int Next(); }; -inline int P_FindFirstSectorFromTag(int tag) -{ - FSectorTagIterator it(tag); - return it.Next(); -} - -inline int P_FindFirstLineFromID(int tag) -{ - FLineIdIterator it(tag); - return it.Next(); -} - #endif diff --git a/src/p_teleport.cpp b/src/p_teleport.cpp index 2dfc754ab..783834c25 100644 --- a/src/p_teleport.cpp +++ b/src/p_teleport.cpp @@ -254,7 +254,7 @@ static AActor *SelectTeleDest (int tid, int tag, bool norandom) int count = 0; while ( (searcher = iterator.Next ()) ) { - if (tag == 0 || tagManager.SectorHasTag(searcher->Sector, tag)) + if (tag == 0 || level.SectorHasTag(searcher->Sector, tag)) { count++; } @@ -293,7 +293,7 @@ static AActor *SelectTeleDest (int tid, int tag, bool norandom) while (count > 0) { searcher = iterator.Next (); - if (tag == 0 || tagManager.SectorHasTag(searcher->Sector, tag)) + if (tag == 0 || level.SectorHasTag(searcher->Sector, tag)) { count--; } @@ -306,7 +306,7 @@ static AActor *SelectTeleDest (int tid, int tag, bool norandom) { int secnum; - FSectorTagIterator itr(tag); + auto itr = level.GetSectorTagIterator(tag); while ((secnum = itr.Next()) >= 0) { // Scanning the snext links of things in the sector will not work, because @@ -430,7 +430,7 @@ bool EV_SilentLineTeleport (line_t *line, int side, AActor *thing, int id, INTBO if (side || thing->flags2 & MF2_NOTELEPORT || !line || line->sidedef[1] == NULL) return false; - FLineIdIterator itr(id); + auto itr = level.GetLineIdIterator(id); while ((i = itr.Next()) >= 0) { if (line->Index() == i) @@ -718,7 +718,7 @@ bool EV_TeleportSector (int tag, int source_tid, int dest_tid, bool fog, int gro int secnum; secnum = -1; - FSectorTagIterator itr(tag); + auto itr = level.GetSectorTagIterator(tag); while ((secnum = itr.Next()) >= 0) { msecnode_t *node; diff --git a/src/p_xlat.cpp b/src/p_xlat.cpp index b2e908f3c..963cff272 100644 --- a/src/p_xlat.cpp +++ b/src/p_xlat.cpp @@ -56,7 +56,7 @@ typedef enum PushMany, } triggertype_e; -void P_TranslateLineDef (line_t *ld, maplinedef_t *mld, int lineindexforid) +void FLevelLocals::TranslateLineDef (line_t *ld, maplinedef_t *mld, int lineindexforid) { uint32_t special = mld->special; short tag = mld->tag; diff --git a/src/portal.cpp b/src/portal.cpp index b8cf9a0e5..434cc7320 100644 --- a/src/portal.cpp +++ b/src/portal.cpp @@ -208,7 +208,7 @@ static line_t *FindDestination(line_t *src, int tag) if (tag) { int lineno = -1; - FLineIdIterator it(tag); + auto it = level.GetLineIdIterator(tag); while ((lineno = it.Next()) >= 0) { @@ -305,11 +305,11 @@ void P_SpawnLinePortal(line_t* line) { // EE-style portals require that the first line ID is identical and the first arg of the two linked linedefs are 0 and 1 respectively. - int mytag = tagManager.GetFirstLineID(line); + int mytag = level.GetFirstLineId(line); for (auto &ln : level.lines) { - if (tagManager.GetFirstLineID(&ln) == mytag && ln.args[0] == 1 && ln.special == Line_SetPortal) + if (level.GetFirstLineId(&ln) == mytag && ln.args[0] == 1 && ln.special == Line_SetPortal) { line->portalindex = level.linePortals.Reserve(1); FLinePortal *port = &level.linePortals.Last(); @@ -483,7 +483,7 @@ bool P_ChangePortal(line_t *ln, int thisid, int destid) int lineno; if (thisid == 0) return ChangePortalLine(ln, destid); - FLineIdIterator it(thisid); + auto it = level.GetLineIdIterator(thisid); bool res = false; while ((lineno = it.Next()) >= 0) { diff --git a/src/umapinfo.cpp b/src/umapinfo.cpp index 3c1517632..eccace0d6 100644 --- a/src/umapinfo.cpp +++ b/src/umapinfo.cpp @@ -271,6 +271,7 @@ static int ParseStandardProperty(FScanner &scanner, UMapEntry *mape) scanner.MustGetValue(false); int tag = scanner.Number; // allow no 0-tag specials here, unless a level exit. +#pragma message("Fixme: This needs to be evaluated at run time") if (tag != 0 || special == 11 || special == 51 || special == 52 || special == 124) { FSpecialAction & bossact = mape->BossActions[mape->BossActions.Reserve(1)]; @@ -278,7 +279,7 @@ static int ParseStandardProperty(FScanner &scanner, UMapEntry *mape) maplinedef_t mld; mld.special = special; mld.tag = tag; - P_TranslateLineDef(&line, &mld); + //level.TranslateLineDef(&line, &mld); bossact = { type, (uint8_t)line.special, {line.args[0], line.args[1],line.args[2],line.args[3],line.args[4]} }; } } @@ -473,4 +474,4 @@ void CommitUMapinfo(level_info_t *defaultinfo) // All done. If we get here again, start fresh. Maps.Clear(); Maps.ShrinkToFit(); -} \ No newline at end of file +} From 97495e1857671006ceee5de99a98ba7aeaa527c1 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 24 Jan 2019 01:53:05 +0100 Subject: [PATCH 006/164] - moved the tag manager into FLevelLocals --- src/fragglescript/t_func.cpp | 61 +++++++++------------------------ src/g_levellocals.h | 8 +++-- src/maploader/compatibility.cpp | 8 ++--- src/maploader/edata.cpp | 2 +- src/maploader/maploader.cpp | 10 +++--- src/maploader/udmf.cpp | 8 ++--- src/p_3dfloors.cpp | 2 +- src/p_tags.cpp | 4 +-- src/p_tags.h | 12 +++---- src/scripting/vmiterators.cpp | 14 ++++---- 10 files changed, 51 insertions(+), 78 deletions(-) diff --git a/src/fragglescript/t_func.cpp b/src/fragglescript/t_func.cpp index 931f2bc3a..4e087519c 100644 --- a/src/fragglescript/t_func.cpp +++ b/src/fragglescript/t_func.cpp @@ -296,33 +296,6 @@ PClassActor *T_ClassType(const svalue_t &arg) return PClass::FindActor(stringvalue(arg)); } -//========================================================================== -// -// Finds a sector from a tag. This has been extended to allow looking for -// sectors directly by passing a negative value -// -//========================================================================== -class FSSectorTagIterator : public FSectorTagIterator -{ -public: - FSSectorTagIterator(int tag) - : FSectorTagIterator(tag) - { - if (tag < 0) - { - searchtag = INT_MIN; - start = tag == -32768? 0 : -tag < (int)level.sectors.Size()? -tag : -1; - } - } -}; - -inline int T_FindFirstSectorFromTag(int tagnum) -{ - FSSectorTagIterator it(tagnum); - return it.Next(); -} - - //========================================================================== // // Get an ammo type @@ -1518,7 +1491,7 @@ void FParser::SF_StartSectorSound(void) tagnum = intvalue(t_argv[0]); int i=-1; - FSSectorTagIterator itr(tagnum); + auto itr = Level->GetSectorTagIterator(tagnum); while ((i = itr.Next()) >= 0) { sector = &Level->sectors[i]; @@ -1555,7 +1528,7 @@ void FParser::SF_FloorHeight(void) // set all sectors with tag - FSSectorTagIterator itr(tagnum); + auto itr = Level->GetSectorTagIterator(tagnum); while ((i = itr.Next()) >= 0) { auto &sec = Level->sectors[i]; @@ -1574,7 +1547,7 @@ void FParser::SF_FloorHeight(void) } else { - secnum = T_FindFirstSectorFromTag(tagnum); + secnum = Level->FindFirstSectorFromTag(tagnum); if(secnum < 0) { script_error("sector not found with tagnum %i\n", tagnum); @@ -1610,7 +1583,7 @@ void FParser::SF_MoveFloor(void) // move all sectors with tag - FSSectorTagIterator itr(tagnum); + auto itr = Level->GetSectorTagIterator(tagnum); while ((secnum = itr.Next()) >= 0) { P_CreateFloor(&Level->sectors[secnum], DFloor::floorMoveToValue, NULL, platspeed, destheight, crush, 0, false, false); @@ -1645,7 +1618,7 @@ void FParser::SF_CeilingHeight(void) dest = floatvalue(t_argv[1]); // set all sectors with tag - FSSectorTagIterator itr(tagnum); + auto itr = Level->GetSectorTagIterator(tagnum); while ((i = itr.Next()) >= 0) { auto &sec = Level->sectors[i]; @@ -1664,7 +1637,7 @@ void FParser::SF_CeilingHeight(void) } else { - secnum = T_FindFirstSectorFromTag(tagnum); + secnum = Level->FindFirstSectorFromTag(tagnum); if(secnum < 0) { script_error("sector not found with tagnum %i\n", tagnum); @@ -1702,7 +1675,7 @@ void FParser::SF_MoveCeiling(void) silent=t_argc>4 ? intvalue(t_argv[4]):1; // move all sectors with tag - FSSectorTagIterator itr(tagnum); + auto itr = Level->GetSectorTagIterator(tagnum); while ((secnum = itr.Next()) >= 0) { P_CreateCeiling(&Level->sectors[secnum], DCeiling::ceilMoveToValue, NULL, tagnum, platspeed, platspeed, destheight, crush, silent | 4, 0, DCeiling::ECrushMode::crushDoom); @@ -1727,7 +1700,7 @@ void FParser::SF_LightLevel(void) tagnum = intvalue(t_argv[0]); // argv is sector tag - secnum = T_FindFirstSectorFromTag(tagnum); + secnum = Level->FindFirstSectorFromTag(tagnum); if(secnum < 0) { @@ -1741,7 +1714,7 @@ void FParser::SF_LightLevel(void) int i = -1; // set all sectors with tag - FSSectorTagIterator itr(tagnum); + auto itr = Level->GetSectorTagIterator(tagnum); while ((i = itr.Next()) >= 0) { Level->sectors[i].SetLightLevel(intvalue(t_argv[1])); @@ -1882,7 +1855,7 @@ void FParser::SF_FloorTexture(void) tagnum = intvalue(t_argv[0]); // argv is sector tag - secnum = T_FindFirstSectorFromTag(tagnum); + secnum = Level->FindFirstSectorFromTag(tagnum); if(secnum < 0) { script_error("sector not found with tagnum %i\n", tagnum); return;} @@ -1895,7 +1868,7 @@ void FParser::SF_FloorTexture(void) FTextureID picnum = TexMan.GetTextureID(t_argv[1].string, ETextureType::Flat, FTextureManager::TEXMAN_Overridable); // set all sectors with tag - FSSectorTagIterator itr(tagnum); + auto itr = Level->GetSectorTagIterator(tagnum); while ((i = itr.Next()) >= 0) { Level->sectors[i].SetTexture(sector_t::floor, picnum); @@ -1934,7 +1907,7 @@ void FParser::SF_SectorColormap(void) tagnum = intvalue(t_argv[0]); // argv is sector tag - secnum = T_FindFirstSectorFromTag(tagnum); + secnum = Level->FindFirstSectorFromTag(tagnum); if(secnum < 0) { script_error("sector not found with tagnum %i\n", tagnum); return;} @@ -1945,7 +1918,7 @@ void FParser::SF_SectorColormap(void) { uint32_t cm = R_ColormapNumForName(t_argv[1].value.s); - FSSectorTagIterator itr(tagnum); + auto itr = Level->GetSectorTagIterator(tagnum); while ((i = itr.Next()) >= 0) { sectors[i].midmap=cm; @@ -1972,7 +1945,7 @@ void FParser::SF_CeilingTexture(void) tagnum = intvalue(t_argv[0]); // argv is sector tag - secnum = T_FindFirstSectorFromTag(tagnum); + secnum = Level->FindFirstSectorFromTag(tagnum); if(secnum < 0) { script_error("sector not found with tagnum %i\n", tagnum); return;} @@ -1985,7 +1958,7 @@ void FParser::SF_CeilingTexture(void) FTextureID picnum = TexMan.GetTextureID(t_argv[1].string, ETextureType::Flat, FTextureManager::TEXMAN_Overridable); // set all sectors with tag - FSSectorTagIterator itr(tagnum); + auto itr = Level->GetSectorTagIterator(tagnum); while ((i = itr.Next()) >= 0) { Level->sectors[i].SetTexture(sector_t::ceiling, picnum); @@ -3700,7 +3673,7 @@ void FParser::SF_SetColor(void) { tagnum = intvalue(t_argv[0]); - secnum = T_FindFirstSectorFromTag(tagnum); + secnum = Level->FindFirstSectorFromTag(tagnum); if(secnum < 0) { @@ -3721,7 +3694,7 @@ void FParser::SF_SetColor(void) else return; // set all sectors with tag - FSSectorTagIterator itr(tagnum); + auto itr = Level->GetSectorTagIterator(tagnum); while ((i = itr.Next()) >= 0) { Level->sectors[i].SetColor(color, 0); diff --git a/src/g_levellocals.h b/src/g_levellocals.h index c73bb0365..4f1b46cc2 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -103,6 +103,8 @@ struct FLevelData TArray AllPlayerStarts; FBehaviorContainer Behaviors; + FTagManager tagManager; + }; struct FLevelLocals : public FLevelData @@ -121,15 +123,15 @@ struct FLevelLocals : public FLevelData FSectorTagIterator GetSectorTagIterator(int tag) { - return FSectorTagIterator(tag); + return FSectorTagIterator(tagManager, tag); } FSectorTagIterator GetSectorTagIterator(int tag, line_t *line) { - return FSectorTagIterator(tag, line); + return FSectorTagIterator(tagManager, tag, line); } FLineIdIterator GetLineIdIterator(int tag) { - return FLineIdIterator(tag); + return FLineIdIterator(tagManager, tag); } template TThinkerIterator GetThinkerIterator(FName subtype = NAME_None) { diff --git a/src/maploader/compatibility.cpp b/src/maploader/compatibility.cpp index e59357731..ae1114871 100644 --- a/src/maploader/compatibility.cpp +++ b/src/maploader/compatibility.cpp @@ -394,7 +394,7 @@ DEFINE_ACTION_FUNCTION(DLevelCompatibility, ClearSectorTags) { PARAM_SELF_PROLOGUE(DLevelCompatibility); PARAM_INT(sector); - tagManager.RemoveSectorTags(sector); + self->Level->tagManager.RemoveSectorTags(sector); return 0; } @@ -406,7 +406,7 @@ DEFINE_ACTION_FUNCTION(DLevelCompatibility, AddSectorTag) if ((unsigned)sector < self->Level->sectors.Size()) { - tagManager.AddSectorTag(sector, tag); + self->Level->tagManager.AddSectorTag(sector, tag); } return 0; } @@ -415,7 +415,7 @@ DEFINE_ACTION_FUNCTION(DLevelCompatibility, ClearLineIDs) { PARAM_SELF_PROLOGUE(DLevelCompatibility); PARAM_INT(line); - tagManager.RemoveLineIDs(line); + self->Level->tagManager.RemoveLineIDs(line); return 0; } @@ -427,7 +427,7 @@ DEFINE_ACTION_FUNCTION(DLevelCompatibility, AddLineID) if ((unsigned)line < self->Level->lines.Size()) { - tagManager.AddLineID(line, tag); + self->Level->tagManager.AddLineID(line, tag); } return 0; } diff --git a/src/maploader/edata.cpp b/src/maploader/edata.cpp index 5a6f8547c..77ae9fa31 100644 --- a/src/maploader/edata.cpp +++ b/src/maploader/edata.cpp @@ -583,7 +583,7 @@ void MapLoader::ProcessEDLinedef(line_t *ld, int recordnum) ld->flags = (ld->flags&~fmask) | eld->flags; ld->setAlpha(eld->alpha); memcpy(ld->args, eld->args, sizeof(ld->args)); - tagManager.AddLineID(Index(ld), eld->tag); + Level->tagManager.AddLineID(Index(ld), eld->tag); } void MapLoader::ProcessEDSector(sector_t *sec, int recordnum) diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index 1724cdc12..e5aedbacd 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -1111,7 +1111,7 @@ void MapLoader::LoadSectors (MapData *map, FMissingTextureTracker &missingtex) ss->special = LittleShort(ms->special); else // [RH] Translate to new sector special ss->special = P_TranslateSectorSpecial (LittleShort(ms->special)); - tagManager.AddSectorTag(i, LittleShort(ms->tag)); + Level->tagManager.AddSectorTag(i, LittleShort(ms->tag)); ss->thinglist = nullptr; ss->touching_thinglist = nullptr; // phares 3/14/98 ss->sectorportal_thinglist = nullptr; @@ -1529,7 +1529,7 @@ void MapLoader::SetLineID (int i, line_t *ld) } if (setid != -1) { - tagManager.AddLineID(i, setid); + Level->tagManager.AddLineID(i, setid); } } } @@ -1753,7 +1753,7 @@ void MapLoader::LoadLineDefs (MapData * map) // do not assign the tag for Extradata lines. if (ld->special != Static_Init || (ld->args[1] != Init_EDLine && ld->args[1] != Init_EDSector)) { - tagManager.AddLineID(i, mld->tag); + Level->tagManager.AddLineID(i, mld->tag); } #ifndef NO_EDATA if (ld->special == Static_Init && ld->args[1] == Init_EDLine) @@ -2755,7 +2755,7 @@ void MapLoader::GroupLines (bool buildmap) { Printf ("Sector %i (tag %i) has no lines\n", i, Level->GetFirstSectorTag(Index(sector))); // 0 the sector's tag so that no specials can use it - tagManager.RemoveSectorTags(i); + Level->tagManager.RemoveSectorTags(i); } else { @@ -2810,7 +2810,7 @@ void MapLoader::GroupLines (bool buildmap) } // killough 1/30/98: Create xref tables for tags - tagManager.HashTags(); + Level->tagManager.HashTags(); if (!buildmap) { diff --git a/src/maploader/udmf.cpp b/src/maploader/udmf.cpp index 46db16d33..690bf4a68 100644 --- a/src/maploader/udmf.cpp +++ b/src/maploader/udmf.cpp @@ -856,7 +856,7 @@ public: case NAME_Id: lineid = CheckInt(key); - tagManager.AddLineID(index, lineid); + Level->tagManager.AddLineID(index, lineid); continue; case NAME_Sidefront: @@ -1127,7 +1127,7 @@ public: // scan the string as long as valid numbers can be found while (sc.CheckNumber()) { - if (sc.Number != 0) tagManager.AddLineID(index, sc.Number); + if (sc.Number != 0) Level->tagManager.AddLineID(index, sc.Number); } } @@ -1513,7 +1513,7 @@ public: continue; case NAME_Id: - tagManager.AddSectorTag(index, CheckInt(key)); + Level->tagManager.AddSectorTag(index, CheckInt(key)); continue; default: @@ -1908,7 +1908,7 @@ public: // scan the string as long as valid numbers can be found while (sc.CheckNumber()) { - if (sc.Number != 0) tagManager.AddSectorTag(index, sc.Number); + if (sc.Number != 0) Level->tagManager.AddSectorTag(index, sc.Number); } } diff --git a/src/p_3dfloors.cpp b/src/p_3dfloors.cpp index 4167cce3c..c4b2d4cb1 100644 --- a/src/p_3dfloors.cpp +++ b/src/p_3dfloors.cpp @@ -904,7 +904,7 @@ void MapLoader::Spawn3DFloors () { if (line.args[1]&8) { - tagManager.AddLineID(line.Index(), line.args[4]); + Level->tagManager.AddLineID(line.Index(), line.args[4]); } else { diff --git a/src/p_tags.cpp b/src/p_tags.cpp index ab521520c..bd012094d 100644 --- a/src/p_tags.cpp +++ b/src/p_tags.cpp @@ -39,8 +39,6 @@ #include "g_levellocals.h" #include "vm.h" -FTagManager tagManager; - //----------------------------------------------------------------------------- // // @@ -318,7 +316,7 @@ void FTagManager::DumpTags() CCMD(dumptags) { - tagManager.DumpTags(); + level.tagManager.DumpTags(); } //----------------------------------------------------------------------------- diff --git a/src/p_tags.h b/src/p_tags.h index f99353d8e..aadeb8e7a 100644 --- a/src/p_tags.h +++ b/src/p_tags.h @@ -76,16 +76,15 @@ public: // The ones below are called by functions that cannot be declared as fri void DumpTags(); }; -extern FTagManager tagManager; - class FSectorTagIterator { friend struct FLevelLocals; protected: int searchtag; int start; + FTagManager &tagManager; - FSectorTagIterator() + FSectorTagIterator(FTagManager &tm) : tagManager(tm) { // For DSectorTagIterator } @@ -110,13 +109,13 @@ protected: } } - FSectorTagIterator(int tag) + FSectorTagIterator(FTagManager &tm, int tag) : tagManager(tm) { Init(tag); } // Special constructor for actions that treat tag 0 as 'back of activation line' - FSectorTagIterator(int tag, line_t *line) + FSectorTagIterator(FTagManager &tm, int tag, line_t *line) : tagManager(tm) { Init(tag, line); } @@ -131,8 +130,9 @@ class FLineIdIterator protected: int searchtag; int start; + FTagManager &tagManager; - FLineIdIterator(int id) + FLineIdIterator(FTagManager &tm, int id) : tagManager(tm) { searchtag = id; start = tagManager.IDHashFirst[((unsigned int)id) % FTagManager::TAG_HASH_SIZE]; diff --git a/src/scripting/vmiterators.cpp b/src/scripting/vmiterators.cpp index 65d359c32..897f6671a 100644 --- a/src/scripting/vmiterators.cpp +++ b/src/scripting/vmiterators.cpp @@ -243,7 +243,7 @@ class DSectorTagIterator : public DObject, public FSectorTagIterator { DECLARE_ABSTRACT_CLASS(DSectorTagIterator, DObject); public: - DSectorTagIterator(int tag, line_t *line) + DSectorTagIterator(FTagManager &tm, int tag, line_t *line) : FSectorTagIterator(tm) { if (line == nullptr) Init(tag); else Init(tag, line); @@ -254,7 +254,7 @@ IMPLEMENT_CLASS(DSectorTagIterator, true, false); static DSectorTagIterator *CreateSTI(int tag, line_t *line) { - return Create(tag, line); + return Create(level.tagManager, tag, line); } DEFINE_ACTION_FUNCTION_NATIVE(DSectorTagIterator, Create, CreateSTI) @@ -262,7 +262,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(DSectorTagIterator, Create, CreateSTI) PARAM_PROLOGUE; PARAM_INT(tag); PARAM_POINTER(line, line_t); - ACTION_RETURN_POINTER(Create(tag, line)); + ACTION_RETURN_POINTER(CreateSTI(tag, line)); } int NextSTI(DSectorTagIterator *self) @@ -299,8 +299,8 @@ class DLineIdIterator : public DObject, public FLineIdIterator { DECLARE_ABSTRACT_CLASS(DLineIdIterator, DObject); public: - DLineIdIterator(int tag) - : FLineIdIterator(tag) + DLineIdIterator(FTagManager &tm, int tag) + : FLineIdIterator(tm, tag) { } }; @@ -310,14 +310,14 @@ IMPLEMENT_CLASS(DLineIdIterator, true, false); static DLineIdIterator *CreateLTI(int tag) { - return Create(tag); + return Create(level.tagManager, tag); } DEFINE_ACTION_FUNCTION_NATIVE(DLineIdIterator, Create, CreateLTI) { PARAM_PROLOGUE; PARAM_INT(tag); - ACTION_RETURN_POINTER(Create(tag)); + ACTION_RETURN_POINTER(CreateLTI(tag)); } int NextLTI(DLineIdIterator *self) From 1f2162fea8cbcca91934d87c6e377c168fe8e3e1 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 24 Jan 2019 02:17:10 +0100 Subject: [PATCH 007/164] - moved the scripted creation functions for tag iterators to LevelLocals The old static methods are now deprecated, this was done to clarify the relationships at play here. --- src/p_setup.cpp | 3 +-- src/scripting/vmiterators.cpp | 20 ++++++++++---------- wadsrc/static/zscript/base.txt | 3 +++ wadsrc/static/zscript/mapdata.txt | 10 ++++++++-- 4 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 295cdcb63..c2975314b 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -276,6 +276,7 @@ void FLevelLocals::ClearLevelData() ClearPortals(); tagManager.Clear(); + Behaviors.UnloadModules(); SpotState = nullptr; ACSThinker = nullptr; FraggleScriptThinker = nullptr; @@ -343,8 +344,6 @@ void P_FreeLevelData () SN_StopAllSequences (); DThinker::DestroyAllThinkers (); - level.Behaviors.UnloadModules (); - P_FreeStrifeConversations (); level.ClearLevelData(); } diff --git a/src/scripting/vmiterators.cpp b/src/scripting/vmiterators.cpp index 897f6671a..dca90e1dc 100644 --- a/src/scripting/vmiterators.cpp +++ b/src/scripting/vmiterators.cpp @@ -252,17 +252,17 @@ public: IMPLEMENT_CLASS(DSectorTagIterator, true, false); -static DSectorTagIterator *CreateSTI(int tag, line_t *line) +static DSectorTagIterator *CreateSTI(FLevelLocals *Level, int tag, line_t *line) { - return Create(level.tagManager, tag, line); + return Create(Level->tagManager, tag, line); } -DEFINE_ACTION_FUNCTION_NATIVE(DSectorTagIterator, Create, CreateSTI) +DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, CreateSectorTagIterator, CreateSTI) { - PARAM_PROLOGUE; + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); PARAM_INT(tag); PARAM_POINTER(line, line_t); - ACTION_RETURN_POINTER(CreateSTI(tag, line)); + ACTION_RETURN_POINTER(CreateSTI(self, tag, line)); } int NextSTI(DSectorTagIterator *self) @@ -308,16 +308,16 @@ public: IMPLEMENT_CLASS(DLineIdIterator, true, false); -static DLineIdIterator *CreateLTI(int tag) +static DLineIdIterator *CreateLTI(FLevelLocals *Level, int tag) { - return Create(level.tagManager, tag); + return Create(Level->tagManager, tag); } -DEFINE_ACTION_FUNCTION_NATIVE(DLineIdIterator, Create, CreateLTI) +DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, CreateLineIDIterator, CreateLTI) { - PARAM_PROLOGUE; + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); PARAM_INT(tag); - ACTION_RETURN_POINTER(CreateLTI(tag)); + ACTION_RETURN_POINTER(CreateLTI(self, tag)); } int NextLTI(DLineIdIterator *self) diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index 584863e58..fcfc22b54 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -706,6 +706,9 @@ struct LevelLocals native native void ChangeSky( TextureID sky1, TextureID sky2 ); + native SectorTagIterator CreateSectorTagIterator(int tag, line defline = null); + native LineIdIterator CreateLineIdIterator(int tag); + String TimeFormatted(bool totals = false) { int sec = Thinker.Tics2Seconds(totals? totaltime : time); diff --git a/wadsrc/static/zscript/mapdata.txt b/wadsrc/static/zscript/mapdata.txt index 53a6b4bad..c7a7a51fd 100644 --- a/wadsrc/static/zscript/mapdata.txt +++ b/wadsrc/static/zscript/mapdata.txt @@ -531,13 +531,19 @@ struct Sector native play class SectorTagIterator : Object native { - native static SectorTagIterator Create(int tag, line defline = null); + deprecated("3.8") static SectorTagIterator Create(int tag, line defline = null) + { + return level.CreateSectorTagIterator(tag, defline); + } native int Next(); native int NextCompat(bool compat, int secnum); } class LineIdIterator : Object native { - native static LineIdIterator Create(int tag); + deprecated("3.8") static LineIdIterator Create(int tag) + { + return level.CreateLineIdIterator(tag); + } native int Next(); } From 4c250a58ca12984ce953bac57b23752b179f95ee Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 24 Jan 2019 18:50:22 +0100 Subject: [PATCH 008/164] - reroute all uses of FActorIterator and NActorIterator through FLevelLocals. --- src/am_map.cpp | 2 +- src/c_cmds.cpp | 2 +- src/g_levellocals.h | 4 +++ src/g_shared/a_quake.cpp | 3 +- src/p_acs.cpp | 77 ++++++++++++++++++++-------------------- src/p_enemy.cpp | 10 +++--- src/p_lnspec.cpp | 48 ++++++++++++------------- src/p_teleport.cpp | 20 +++++------ src/p_things.cpp | 12 +++---- 9 files changed, 91 insertions(+), 87 deletions(-) diff --git a/src/am_map.cpp b/src/am_map.cpp index 95d978054..f50903c66 100644 --- a/src/am_map.cpp +++ b/src/am_map.cpp @@ -3206,7 +3206,7 @@ void AM_drawAuthorMarkers () tex = TexMan.GetTexture(picnum); } } - FActorIterator it (mark->args[0]); + auto it = level.GetActorIterator(mark->args[0]); AActor *marked = mark->args[0] == 0 ? mark : it.Next(); while (marked != NULL) diff --git a/src/c_cmds.cpp b/src/c_cmds.cpp index 2aa941913..0c2606832 100644 --- a/src/c_cmds.cpp +++ b/src/c_cmds.cpp @@ -1175,7 +1175,7 @@ static void PrintSecretString(const char *string, bool thislevel) { long tid = (long)strtoll(string+2, (char**)&string, 10); if (*string == ';') string++; - FActorIterator it(tid); + auto it = level.GetActorIterator(tid); AActor *actor; bool foundone = false; if (thislevel) diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 4f1b46cc2..e2cc447b4 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -142,6 +142,10 @@ struct FLevelLocals : public FLevelData { return FActorIterator(tid); } + FActorIterator GetActorIterator(int tid, AActor *start) + { + return FActorIterator(tid, start); + } NActorIterator GetActorIterator(FName type, int tid) { return NActorIterator(type, tid); diff --git a/src/g_shared/a_quake.cpp b/src/g_shared/a_quake.cpp index c81e1ff28..a0c95c91a 100644 --- a/src/g_shared/a_quake.cpp +++ b/src/g_shared/a_quake.cpp @@ -31,6 +31,7 @@ #include "serializer.h" #include "d_player.h" #include "r_utility.h" +#include "g_levellocals.h" static FRandom pr_quake ("Quake"); @@ -401,7 +402,7 @@ bool P_StartQuakeXYZ(AActor *activator, int tid, int intensityX, int intensityY, } else { - FActorIterator iterator (tid); + auto iterator = level.GetActorIterator(tid); while ( (center = iterator.Next ()) ) { res = true; diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 32e4b685d..ef56df435 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -3603,7 +3603,7 @@ int DLevelScript::ThingCount (int type, int stringid, int tid, int tag) do_count: if (tid) { - FActorIterator iterator (tid); + auto iterator = level.GetActorIterator(tid); while ( (actor = iterator.Next ()) ) { if (actor->health > 0 && @@ -3779,7 +3779,7 @@ int DLevelScript::DoSpawnSpot (int type, int spot, int tid, int angle, bool forc if (spot != 0) { - FActorIterator iterator (spot); + auto iterator = level.GetActorIterator(spot); AActor *aspot; while ( (aspot = iterator.Next ()) ) @@ -3800,7 +3800,7 @@ int DLevelScript::DoSpawnSpotFacing (int type, int spot, int tid, bool force) if (spot != 0) { - FActorIterator iterator (spot); + auto iterator = level.GetActorIterator(spot); AActor *aspot; while ( (aspot = iterator.Next ()) ) @@ -3984,7 +3984,7 @@ AActor *SingleActorFromTID (int tid, AActor *defactor) } else { - FActorIterator iterator (tid); + auto iterator = level.GetActorIterator(tid); return iterator.Next(); } } @@ -4069,7 +4069,7 @@ void DLevelScript::SetActorProperty (int tid, int property, int value) else { AActor *actor; - FActorIterator iterator (tid); + auto iterator = level.GetActorIterator(tid); while ((actor = iterator.Next()) != NULL) { @@ -4566,7 +4566,7 @@ int DLevelScript::DoClassifyActor(int tid) } else { - FActorIterator it(tid); + auto it = level.GetActorIterator(tid); actor = it.Next(); } if (actor == NULL) @@ -5050,7 +5050,7 @@ static void SetActorAngle(AActor *activator, int tid, int angle, bool interpolat } else { - FActorIterator iterator(tid); + auto iterator = level.GetActorIterator(tid); AActor *actor; while ((actor = iterator.Next())) @@ -5072,7 +5072,7 @@ static void SetActorPitch(AActor *activator, int tid, int angle, bool interpolat } else { - FActorIterator iterator(tid); + auto iterator = level.GetActorIterator(tid); AActor *actor; while ((actor = iterator.Next())) @@ -5094,7 +5094,7 @@ static void SetActorRoll(AActor *activator, int tid, int angle, bool interpolate } else { - FActorIterator iterator(tid); + auto iterator = level.GetActorIterator(tid); AActor *actor; while ((actor = iterator.Next())) @@ -5121,7 +5121,7 @@ static void SetActorTeleFog(AActor *activator, int tid, FString telefogsrc, FStr } else { - FActorIterator iterator(tid); + auto iterator = level.GetActorIterator(tid); AActor *actor; PClassActor * src = PClass::FindActor(telefogsrc); @@ -5149,7 +5149,7 @@ static int SwapActorTeleFog(AActor *activator, int tid) } else { - FActorIterator iterator(tid); + auto iterator = level.GetActorIterator(tid); AActor *actor; while ((actor = iterator.Next())) @@ -5503,7 +5503,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) } else { - FActorIterator iterator(args[0]); + auto iterator = level.GetActorIterator(args[0]); while ((actor = iterator.Next())) { @@ -5529,7 +5529,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) } else { - FActorIterator iterator(args[0]); + auto iterator = level.GetActorIterator(args[0]); while ( (actor = iterator.Next()) ) { @@ -5568,7 +5568,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) } else { - FActorIterator iterator(args[0]); + auto iterator = level.GetActorIterator(args[0]); while ( (actor = iterator.Next()) ) { @@ -5621,7 +5621,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) } else { - FActorIterator it(args[0]); + auto it = level.GetActorIterator(args[0]); AActor *actor; while ( (actor = it.Next()) ) @@ -5699,8 +5699,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) if (args[1] == 0) return 1; // [KS] I'm sure the activator can see itself. - FActorIterator dstiter (args[1]); - + auto dstiter = level.GetActorIterator(args[1]); while ( (dest = dstiter.Next ()) ) { if (P_CheckSight(source, dest, flags)) return 1; @@ -5708,13 +5707,13 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) } else { - FActorIterator srciter (args[0]); + auto srciter = level.GetActorIterator(args[0]); while ( (source = srciter.Next ()) ) { if (args[1] != 0) { - FActorIterator dstiter (args[1]); + auto dstiter = level.GetActorIterator(args[1]); while ( (dest = dstiter.Next ()) ) { if (P_CheckSight(source, dest, flags)) return 1; @@ -5856,7 +5855,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) else { AActor *source; - FActorIterator it(args[0]); + auto it = level.GetActorIterator(args[0]); while ((source = it.Next()) != NULL) { @@ -5887,7 +5886,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) } if (sid != 0 || funcIndex == ACSF_PlayActorSound) { - FActorIterator it(args[0]); + auto it = level.GetActorIterator(args[0]); AActor *spot; int chan = argCount > 2 ? args[2] : CHAN_BODY; @@ -5933,7 +5932,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) } else { - FActorIterator it(args[0]); + auto it = level.GetActorIterator(args[0]); AActor *spot; while ((spot = it.Next()) != NULL) @@ -5956,7 +5955,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) } else { - FActorIterator it(args[0]); + auto it = level.GetActorIterator(args[0]); AActor *spot; while ((spot = it.Next()) != NULL) @@ -6074,7 +6073,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) } else { - FActorIterator it(args[0]); + auto it = level.GetActorIterator(args[0]); AActor *actor; while ((actor = it.Next()) != NULL) @@ -6110,7 +6109,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) } else { - FActorIterator it(args[0]); + auto it = level.GetActorIterator(args[0]); AActor *actor; while ((actor = it.Next()) != NULL) @@ -6144,7 +6143,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) } else { - FActorIterator it(args[0]); + auto it = level.GetActorIterator(args[0]); AActor *actor; while ((actor = it.Next()) != NULL) @@ -6321,7 +6320,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) } } - FActorIterator iterator(args[0]); + auto iterator = level.GetActorIterator(args[0]); bool canraiseall = true; while ((actor = iterator.Next())) { @@ -6531,7 +6530,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) } else { - FActorIterator it(tid); + auto it = level.GetActorIterator(tid); while ((actor = it.Next()) != nullptr) { // Don't log errors when affecting many actors because things might share a TID but not share the flag @@ -6555,7 +6554,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) } else { - FActorIterator it(tid); + auto it = level.GetActorIterator(tid); while ((actor = it.Next()) != nullptr) { actor->SetTranslation(trname); @@ -9005,7 +9004,7 @@ scriptwait: if (STACK(7) != 0) { - FActorIterator iterator (STACK(7)); + auto iterator = level.GetActorIterator(STACK(7)); AActor *actor; while ( (actor = iterator.Next ()) ) @@ -9035,7 +9034,7 @@ scriptwait: lookup = level.Behaviors.LookupString (STACK(2)); if (lookup != NULL) { - FActorIterator iterator (STACK(3)); + auto iterator = level.GetActorIterator(STACK(3)); AActor *spot; while ( (spot = iterator.Next ()) ) @@ -9116,7 +9115,7 @@ scriptwait: } else { - FActorIterator it(STACK(1)); + auto it = level.GetActorIterator(STACK(1)); AActor *actor; for (actor = it.Next(); actor != NULL; actor = it.Next()) { @@ -9144,7 +9143,7 @@ scriptwait: } else { - FActorIterator it(STACK(3)); + auto it = level.GetActorIterator(STACK(3)); AActor *actor; for (actor = it.Next(); actor != NULL; actor = it.Next()) { @@ -9181,7 +9180,7 @@ scriptwait: } else { - FActorIterator it(STACK(3)); + auto it = level.GetActorIterator(STACK(3)); AActor *actor; for (actor = it.Next(); actor != NULL; actor = it.Next()) { @@ -9229,7 +9228,7 @@ scriptwait: } else { - FActorIterator it(STACK(2)); + auto it = level.GetActorIterator(STACK(2)); AActor *actor; for (actor = it.Next(); actor != NULL; actor = it.Next()) { @@ -9801,7 +9800,7 @@ scriptwait: } else { - FActorIterator it (STACK(3)); + auto it = level.GetActorIterator(STACK(3)); camera = it.Next (); } @@ -9854,7 +9853,7 @@ scriptwait: } else { - FActorIterator iterator (STACK(3)); + auto iterator = level.GetActorIterator(STACK(3)); AActor *actor; int count = 0; @@ -10025,7 +10024,7 @@ scriptwait: } else { - FActorIterator iterator (tag); + auto iterator = level.GetActorIterator(tag); AActor *actor; while ( (actor = iterator.Next ()) ) @@ -10051,7 +10050,7 @@ scriptwait: } else { - FActorIterator iterator (tag); + auto iterator = level.GetActorIterator(tag); AActor *actor; while ( (actor = iterator.Next ()) ) diff --git a/src/p_enemy.cpp b/src/p_enemy.cpp index 50e4d2140..8550eb7b6 100644 --- a/src/p_enemy.cpp +++ b/src/p_enemy.cpp @@ -1339,7 +1339,7 @@ int P_LookForTID (AActor *actor, INTBOOL allaround, FLookExParams *params) actor->LastLookActor = nullptr; } - FActorIterator iterator (actor->TIDtoHate, actor->LastLookActor); + auto iterator = level.GetActorIterator(actor->TIDtoHate, actor->LastLookActor); int c = (pr_look3() & 31) + 7; // Look for between 7 and 38 hatees at a time while ((other = iterator.Next()) != actor->LastLookActor) { @@ -1760,7 +1760,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_Look) // [RH] Set goal now if appropriate if (self->special == Thing_SetGoal && self->args[0] == 0) { - NActorIterator iterator (NAME_PatrolPoint, self->args[1]); + auto iterator = level.GetActorIterator(NAME_PatrolPoint, self->args[1]); self->special = 0; self->goal = iterator.Next (); self->reactiontime = self->args[2] * TICRATE + level.maptime; @@ -1889,7 +1889,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_LookEx) // [RH] Set goal now if appropriate if (self->special == Thing_SetGoal && self->args[0] == 0) { - NActorIterator iterator(NAME_PatrolPoint, self->args[1]); + auto iterator = level.GetActorIterator(NAME_PatrolPoint, self->args[1]); self->special = 0; self->goal = iterator.Next (); self->reactiontime = self->args[2] * TICRATE + level.maptime; @@ -2372,8 +2372,8 @@ void A_DoChase (AActor *actor, bool fastchase, FState *meleestate, FState *missi if (result) { // reached the goal - NActorIterator iterator (NAME_PatrolPoint, actor->goal->args[0]); - NActorIterator specit (NAME_PatrolSpecial, actor->goal->tid); + auto iterator = level.GetActorIterator(NAME_PatrolPoint, actor->goal->args[0]); + auto specit = level.GetActorIterator(NAME_PatrolSpecial, actor->goal->tid); AActor *spec; // Execute the specials of any PatrolSpecials with the same TID diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index cfdf283a9..eb58f6125 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -171,7 +171,7 @@ FUNC(LS_Polyobj_MoveTo) FUNC(LS_Polyobj_MoveToSpot) // Polyobj_MoveToSpot (po, speed, tid) { - FActorIterator iterator (arg2); + auto iterator = Level->GetActorIterator(arg2); AActor *spot = iterator.Next(); if (spot == NULL) return false; return EV_MovePolyTo (Level, ln, arg0, SPEED(arg1), spot->Pos(), false); @@ -222,7 +222,7 @@ FUNC(LS_Polyobj_OR_MoveTo) FUNC(LS_Polyobj_OR_MoveToSpot) // Polyobj_OR_MoveToSpot (po, speed, tid) { - FActorIterator iterator (arg2); + auto iterator = Level->GetActorIterator(arg2); AActor *spot = iterator.Next(); if (spot == NULL) return false; return EV_MovePolyTo (Level, ln, arg0, SPEED(arg1), spot->Pos(), true); @@ -1210,7 +1210,7 @@ FUNC(LS_ThrustThing) { if (arg3 != 0) { - FActorIterator iterator (arg3); + auto iterator = Level->GetActorIterator(arg3); while ((it = iterator.Next()) != NULL) { ThrustThingHelper (it, BYTEANGLE(arg0), arg1, arg2); @@ -1241,7 +1241,7 @@ FUNC(LS_ThrustThingZ) // [BC] if (arg0 != 0) { - FActorIterator iterator (arg0); + auto iterator = Level->GetActorIterator(arg0); while ( (victim = iterator.Next ()) ) { @@ -1281,7 +1281,7 @@ FUNC(LS_Thing_SetSpecial) // [BC] else { AActor *actor; - FActorIterator iterator (arg0); + auto iterator = Level->GetActorIterator(arg0); while ( (actor = iterator.Next ()) ) { @@ -1308,7 +1308,7 @@ FUNC(LS_Thing_ChangeTID) } else { - FActorIterator iterator (arg0); + auto iterator = Level->GetActorIterator(arg0); AActor *actor, *next; next = iterator.Next (); @@ -1424,7 +1424,7 @@ FUNC(LS_Thing_Activate) if (arg0 != 0) { AActor *actor; - FActorIterator iterator (arg0); + auto iterator = Level->GetActorIterator(arg0); int count = 0; actor = iterator.Next (); @@ -1454,7 +1454,7 @@ FUNC(LS_Thing_Deactivate) if (arg0 != 0) { AActor *actor; - FActorIterator iterator (arg0); + auto iterator = Level->GetActorIterator(arg0); int count = 0; actor = iterator.Next (); @@ -1483,7 +1483,7 @@ FUNC(LS_Thing_Remove) { if (arg0 != 0) { - FActorIterator iterator (arg0); + auto iterator = Level->GetActorIterator(arg0); AActor *actor; actor = iterator.Next (); @@ -1527,7 +1527,7 @@ FUNC(LS_Thing_Destroy) } else { - FActorIterator iterator (arg0); + auto iterator = Level->GetActorIterator(arg0); actor = iterator.Next (); while (actor) @@ -1565,9 +1565,9 @@ FUNC(LS_Thing_ProjectileGravity) FUNC(LS_Thing_Hate) // Thing_Hate (hater, hatee, group/"xray"?) { - FActorIterator haterIt (arg0); - AActor *hater, *hatee = NULL; - FActorIterator hateeIt (arg1); + AActor *hater, *hatee = nullptr; + auto haterIt = Level->GetActorIterator(arg0); + auto hateeIt = Level->GetActorIterator(arg1); bool nothingToHate = false; if (arg1 != 0) @@ -1768,7 +1768,7 @@ FUNC(LS_Thing_Raise) } else { - FActorIterator iterator (arg0); + auto iterator = Level->GetActorIterator(arg0); while ( (target = iterator.Next ()) ) { @@ -1795,7 +1795,7 @@ FUNC(LS_Thing_Stop) } else { - FActorIterator iterator (arg0); + auto iterator = Level->GetActorIterator(arg0); while ( (target = iterator.Next ()) ) { @@ -1811,8 +1811,8 @@ FUNC(LS_Thing_Stop) FUNC(LS_Thing_SetGoal) // Thing_SetGoal (tid, goal, delay, chasegoal) { - FActorIterator selfiterator (arg0); - NActorIterator goaliterator (NAME_PatrolPoint, arg1); + auto selfiterator = Level->GetActorIterator(arg0); + auto goaliterator = Level->GetActorIterator(NAME_PatrolPoint, arg1); AActor *self; AActor *goal = goaliterator.Next (); bool ok = false; @@ -1861,7 +1861,7 @@ enum FUNC(LS_Thing_SetTranslation) // Thing_SetTranslation (tid, range) { - FActorIterator iterator (arg0); + auto iterator = Level->GetActorIterator(arg0); int range; AActor *target; bool ok = false; @@ -2278,7 +2278,7 @@ FUNC(LS_Sector_SetLink) { if (arg0 != 0) // control tag == 0 is for static initialization and must not be handled here { - int control = level.FindFirstSectorFromTag(arg0); + int control = Level->FindFirstSectorFromTag(arg0); if (control >= 0) { return P_AddSectorLinks(&Level->sectors[control], arg1, arg2, arg3); @@ -2822,7 +2822,7 @@ FUNC(LS_ChangeCamera) AActor *camera; if (arg0 != 0) { - FActorIterator iterator (arg0); + auto iterator = Level->GetActorIterator(arg0); camera = iterator.Next (); } else @@ -3159,7 +3159,7 @@ FUNC(LS_NoiseAlert) } else { - FActorIterator iter (arg0); + auto iter = Level->GetActorIterator(arg0); target = iter.Next(); } @@ -3173,7 +3173,7 @@ FUNC(LS_NoiseAlert) } else { - FActorIterator iter (arg1); + auto iter = Level->GetActorIterator(arg1); emitter = iter.Next(); } @@ -3333,7 +3333,7 @@ FUNC(LS_GlassBreak) FUNC(LS_StartConversation) // StartConversation (tid, facetalker) { - FActorIterator iterator (arg0); + auto iterator = Level->GetActorIterator(arg0); AActor *target = iterator.Next(); @@ -3384,7 +3384,7 @@ FUNC(LS_Thing_SetConversation) if (arg0 != 0) { - FActorIterator iterator (arg0); + auto iterator = Level->GetActorIterator(arg0); while ((it = iterator.Next()) != NULL) { it->ConversationRoot = dlg_index; diff --git a/src/p_teleport.cpp b/src/p_teleport.cpp index 783834c25..844d462b0 100644 --- a/src/p_teleport.cpp +++ b/src/p_teleport.cpp @@ -250,7 +250,7 @@ static AActor *SelectTeleDest (int tid, int tag, bool norandom) if (tid != 0) { - NActorIterator iterator (NAME_TeleportDest, tid); + auto iterator = level.GetActorIterator(NAME_TeleportDest, tid); int count = 0; while ( (searcher = iterator.Next ()) ) { @@ -268,12 +268,12 @@ static AActor *SelectTeleDest (int tid, int tag, bool norandom) if (tag == 0) { // Try to find a matching map spot (fixes Hexen MAP10) - NActorIterator it2 (NAME_MapSpot, tid); + auto it2 = level.GetActorIterator(NAME_MapSpot, tid); searcher = it2.Next (); - if (searcher == NULL) + if (searcher == nullptr) { // Try to find a matching non-blocking spot of any type (fixes Caldera MAP13) - FActorIterator it3 (tid); + auto it3 = level.GetActorIterator(tid); searcher = it3.Next (); while (searcher != NULL && (searcher->flags & MF_SOLID)) { @@ -607,7 +607,7 @@ bool EV_TeleportOther (int other_tid, int dest_tid, bool fog) if (other_tid != 0 && dest_tid != 0) { AActor *victim; - FActorIterator iterator (other_tid); + auto iterator = level.GetActorIterator(other_tid); while ( (victim = iterator.Next ()) ) { @@ -642,7 +642,7 @@ bool EV_TeleportGroup (int group_tid, AActor *victim, int source_tid, int dest_t { AActor *sourceOrigin, *destOrigin; { - FActorIterator iterator (source_tid); + auto iterator = level.GetActorIterator(source_tid); sourceOrigin = iterator.Next (); } if (sourceOrigin == NULL) @@ -651,7 +651,7 @@ bool EV_TeleportGroup (int group_tid, AActor *victim, int source_tid, int dest_t } { - NActorIterator iterator (NAME_TeleportDest, dest_tid); + auto iterator = level.GetActorIterator(NAME_TeleportDest, dest_tid); destOrigin = iterator.Next (); } if (destOrigin == NULL) @@ -669,7 +669,7 @@ bool EV_TeleportGroup (int group_tid, AActor *victim, int source_tid, int dest_t } else { - FActorIterator iterator (group_tid); + auto iterator = level.GetActorIterator(group_tid); // For each actor with tid matching arg0, move it to the same // position relative to destOrigin as it is relative to sourceOrigin @@ -697,7 +697,7 @@ bool EV_TeleportSector (int tag, int source_tid, int dest_tid, bool fog, int gro { AActor *sourceOrigin, *destOrigin; { - FActorIterator iterator (source_tid); + auto iterator = level.GetActorIterator(source_tid); sourceOrigin = iterator.Next (); } if (sourceOrigin == NULL) @@ -705,7 +705,7 @@ bool EV_TeleportSector (int tag, int source_tid, int dest_tid, bool fog, int gro return false; } { - NActorIterator iterator (NAME_TeleportDest, dest_tid); + auto iterator = level.GetActorIterator(NAME_TeleportDest, dest_tid); destOrigin = iterator.Next (); } if (destOrigin == NULL) diff --git a/src/p_things.cpp b/src/p_things.cpp index b03397239..1f9d6ed26 100644 --- a/src/p_things.cpp +++ b/src/p_things.cpp @@ -57,7 +57,7 @@ bool P_Thing_Spawn (int tid, AActor *source, int type, DAngle angle, bool fog, i int rtn = 0; PClassActor *kind; AActor *spot, *mobj; - FActorIterator iterator (tid); + auto iterator = level.GetActorIterator(tid); kind = P_GetSpawnableType(type); @@ -150,10 +150,10 @@ bool P_Thing_Move (int tid, AActor *source, int mapspot, bool fog) if (tid != 0) { - FActorIterator iterator1(tid); + auto iterator1 = level.GetActorIterator(tid); source = iterator1.Next(); } - FActorIterator iterator2 (mapspot); + auto iterator2 = level.GetActorIterator(mapspot); target = iterator2.Next (); if (source != NULL && target != NULL) @@ -263,7 +263,7 @@ bool P_Thing_Projectile (int tid, AActor *source, int type, const char *type_nam int rtn = 0; PClassActor *kind; AActor *spot, *mobj, *targ = forcedest; - FActorIterator iterator (tid); + auto iterator = level.GetActorIterator(tid); int defflags3; if (type_name == NULL) @@ -297,7 +297,7 @@ bool P_Thing_Projectile (int tid, AActor *source, int type, const char *type_nam } while (spot != NULL) { - FActorIterator tit (dest); + auto tit = level.GetActorIterator(dest); if (dest == 0 || (targ = tit.Next())) { @@ -396,7 +396,7 @@ bool P_Thing_Projectile (int tid, AActor *source, int type, const char *type_nam int P_Thing_Damage (int tid, AActor *whofor0, int amount, FName type) { - FActorIterator iterator (tid); + auto iterator = level.GetActorIterator(tid); int count = 0; AActor *actor; From 0e5986769e7fab39da37a6f45f52511c5f7632c7 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 24 Jan 2019 19:28:40 +0100 Subject: [PATCH 009/164] - moved the tid hash into FLevelLocals and adjusted the interface to the iterators. --- src/actor.h | 34 +++++++++---------- src/g_levellocals.h | 15 ++++++-- src/p_acs.cpp | 4 +-- src/p_mobj.cpp | 32 ++++++----------- src/p_setup.cpp | 4 +-- src/scripting/vmiterators.cpp | 14 ++++---- src/scripting/vmthunks_actors.cpp | 11 ++++-- wadsrc/static/zscript/actor.txt | 5 ++- wadsrc/static/zscript/base.txt | 11 ++++-- wadsrc/static/zscript/hexen/dragon.txt | 6 ++-- wadsrc/static/zscript/hexen/korax.txt | 4 +-- .../static/zscript/scriptutil/scriptutil.txt | 8 ++--- wadsrc/static/zscript/shared/camera.txt | 4 +-- wadsrc/static/zscript/shared/movingcamera.txt | 10 +++--- wadsrc/static/zscript/shared/skies.txt | 2 +- 15 files changed, 85 insertions(+), 79 deletions(-) diff --git a/src/actor.h b/src/actor.h index df85ab42c..7f1b1ea3f 100644 --- a/src/actor.h +++ b/src/actor.h @@ -1241,19 +1241,16 @@ public: // ThingIDs - static void ClearTIDHashes (); void AddToHash (); void RemoveFromHash (); private: - static AActor *TIDHash[128]; static inline int TIDHASH (int key) { return key & 127; } public: static FSharedStringArena mStringPropertyData; private: friend class FActorIterator; - friend bool P_IsTIDUsed(int tid); bool FixMapthingPos(); @@ -1496,19 +1493,21 @@ public: class FActorIterator { + friend struct FLevelLocals; +protected: + FActorIterator (AActor **hash, int i) : TIDHash(hash), base (nullptr), id (i) + { + } + FActorIterator (AActor **hash, int i, AActor *start) : TIDHash(hash), base (start), id (i) + { + } public: - FActorIterator (int i) : base (NULL), id (i) - { - } - FActorIterator (int i, AActor *start) : base (start), id (i) - { - } AActor *Next () { if (id == 0) - return NULL; + return nullptr; if (!base) - base = AActor::TIDHash[id & 127]; + base = TIDHash[id & 127]; else base = base->inext; @@ -1523,21 +1522,23 @@ public: } private: + AActor **TIDHash; AActor *base; int id; }; class NActorIterator : public FActorIterator { + friend struct FLevelLocals; const PClass *type; +protected: + NActorIterator (AActor **hash, const PClass *cls, int id) : FActorIterator (hash, id) { type = cls; } + NActorIterator (AActor **hash, FName cls, int id) : FActorIterator (hash, id) { type = PClass::FindClass(cls); } public: - NActorIterator (const PClass *cls, int id) : FActorIterator (id) { type = cls; } - NActorIterator (FName cls, int id) : FActorIterator (id) { type = PClass::FindClass(cls); } - NActorIterator (const char *cls, int id) : FActorIterator (id) { type = PClass::FindClass(cls); } AActor *Next () { AActor *actor; - if (type == NULL) return NULL; + if (type == nullptr) return nullptr; do { actor = FActorIterator::Next (); @@ -1546,9 +1547,6 @@ public: } }; -bool P_IsTIDUsed(int tid); -int P_FindUniqueTID(int start_tid, int limit); - PClassActor *ClassForSpawn(FName classname); inline AActor *Spawn(PClassActor *type) diff --git a/src/g_levellocals.h b/src/g_levellocals.h index e2cc447b4..22e952f5e 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -104,6 +104,7 @@ struct FLevelData FBehaviorContainer Behaviors; FTagManager tagManager; + AActor *TIDHash[128]; }; @@ -120,6 +121,8 @@ struct FLevelLocals : public FLevelData void FormatMapName(FString &mapname, const char *mapnamecolor); void ClearAllSubsectorLinks(); void TranslateLineDef (line_t *ld, maplinedef_t *mld, int lineindexforid = -1); + bool IsTIDUsed(int tid); + int FindUniqueTID(int start_tid, int limit); FSectorTagIterator GetSectorTagIterator(int tag) { @@ -140,15 +143,15 @@ struct FLevelLocals : public FLevelData } FActorIterator GetActorIterator(int tid) { - return FActorIterator(tid); + return FActorIterator(TIDHash, tid); } FActorIterator GetActorIterator(int tid, AActor *start) { - return FActorIterator(tid, start); + return FActorIterator(TIDHash, tid, start); } NActorIterator GetActorIterator(FName type, int tid) { - return NActorIterator(type, tid); + return NActorIterator(TIDHash, type, tid); } bool SectorHasTags(sector_t *sector) { @@ -208,6 +211,12 @@ struct FLevelLocals : public FLevelData } + void ClearTIDHashes () + { + memset(TIDHash, 0, sizeof(TIDHash)); + } + + uint8_t 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 diff --git a/src/p_acs.cpp b/src/p_acs.cpp index ef56df435..22c20cb32 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -5751,10 +5751,10 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) break; case ACSF_UniqueTID: - return P_FindUniqueTID(argCount > 0 ? args[0] : 0, (argCount > 1 && args[1] >= 0) ? args[1] : 0); + return level.FindUniqueTID(argCount > 0 ? args[0] : 0, (argCount > 1 && args[1] >= 0) ? args[1] : 0); case ACSF_IsTIDUsed: - return P_IsTIDUsed(args[0]); + return level.IsTIDUsed(args[0]); case ACSF_Sqrt: return xs_FloorToInt(g_sqrt(double(args[0]))); diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index cb8fc943d..10d17b30c 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -2886,19 +2886,6 @@ void P_NightmareRespawn (AActor *mobj) } -AActor *AActor::TIDHash[128]; - -// -// P_ClearTidHashes -// -// Clears the tid hashtable. -// - -void AActor::ClearTIDHashes () -{ - memset(TIDHash, 0, sizeof(TIDHash)); -} - // // P_AddMobjToHash // @@ -2916,10 +2903,11 @@ void AActor::AddToHash () else { int hash = TIDHASH (tid); + auto &slot = level.TIDHash[hash]; - inext = TIDHash[hash]; - iprev = &TIDHash[hash]; - TIDHash[hash] = this; + inext = slot; + iprev = &slot; + slot = this; if (inext) { inext->iprev = &inext; @@ -2956,9 +2944,9 @@ void AActor::RemoveFromHash () // //========================================================================== -bool P_IsTIDUsed(int tid) +bool FLevelLocals::IsTIDUsed(int tid) { - AActor *probe = AActor::TIDHash[tid & 127]; + AActor *probe = TIDHash[tid & 127]; while (probe != NULL) { if (probe->tid == tid) @@ -2981,7 +2969,7 @@ bool P_IsTIDUsed(int tid) // //========================================================================== -int P_FindUniqueTID(int start_tid, int limit) +int FLevelLocals::FindUniqueTID(int start_tid, int limit) { int tid; @@ -2997,7 +2985,7 @@ int P_FindUniqueTID(int start_tid, int limit) } for (tid = start_tid; tid <= limit; ++tid) { - if (tid != 0 && !P_IsTIDUsed(tid)) + if (tid != 0 && !IsTIDUsed(tid)) { return tid; } @@ -3019,7 +3007,7 @@ int P_FindUniqueTID(int start_tid, int limit) { // Use a positive starting TID. tid = pr_uniquetid.GenRand32() & INT_MAX; - tid = P_FindUniqueTID(tid == 0 ? 1 : tid, 5); + tid = FindUniqueTID(tid == 0 ? 1 : tid, 5); if (tid != 0) { return tid; @@ -3033,7 +3021,7 @@ int P_FindUniqueTID(int start_tid, int limit) CCMD(utid) { Printf("%d\n", - P_FindUniqueTID(argv.argc() > 1 ? atoi(argv[1]) : 0, + level.FindUniqueTID(argv.argc() > 1 ? atoi(argv[1]) : 0, (argv.argc() > 2 && atoi(argv[2]) >= 0) ? atoi(argv[2]) : 0)); } diff --git a/src/p_setup.cpp b/src/p_setup.cpp index c2975314b..0412eae9d 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -276,6 +276,7 @@ void FLevelLocals::ClearLevelData() ClearPortals(); tagManager.Clear(); + ClearTIDHashes(); Behaviors.UnloadModules(); SpotState = nullptr; ACSThinker = nullptr; @@ -336,9 +337,6 @@ void P_FreeLevelData () R_FreePastViewers(); P_ClearUDMFKeys(); - // [RH] Clear all ThingID hash chains. - AActor::ClearTIDHashes(); - interpolator.ClearInterpolations(); // [RH] Nothing to interpolate on a fresh level. level.ClearAllSubsectorLinks(); // can't be done as part of the polyobj deletion process. SN_StopAllSequences (); diff --git a/src/scripting/vmiterators.cpp b/src/scripting/vmiterators.cpp index dca90e1dc..f543ee59a 100644 --- a/src/scripting/vmiterators.cpp +++ b/src/scripting/vmiterators.cpp @@ -342,25 +342,25 @@ class DActorIterator : public DObject, public NActorIterator DECLARE_ABSTRACT_CLASS(DActorIterator, DObject) public: - DActorIterator(PClassActor *cls = nullptr, int tid = 0) - : NActorIterator(cls, tid) + DActorIterator(AActor **hash, PClassActor *cls = nullptr, int tid = 0) + : NActorIterator(hash, cls, tid) { } }; IMPLEMENT_CLASS(DActorIterator, true, false); -static DActorIterator *CreateActI(int tid, PClassActor *type) +static DActorIterator *CreateActI(FLevelLocals *Level, int tid, PClassActor *type) { - return Create(type, tid); + return Create(Level->TIDHash, type, tid); } -DEFINE_ACTION_FUNCTION_NATIVE(DActorIterator, Create, CreateActI) +DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, CreateActorIterator, CreateActI) { - PARAM_PROLOGUE; + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); PARAM_INT(tid); PARAM_CLASS(type, AActor); - ACTION_RETURN_OBJECT(Create(type, tid)); + ACTION_RETURN_OBJECT(CreateActI(self, tid, type)); } static AActor *NextActI(DActorIterator *self) diff --git a/src/scripting/vmthunks_actors.cpp b/src/scripting/vmthunks_actors.cpp index ffb845785..01fb90f84 100644 --- a/src/scripting/vmthunks_actors.cpp +++ b/src/scripting/vmthunks_actors.cpp @@ -893,12 +893,17 @@ DEFINE_ACTION_FUNCTION_NATIVE(AActor, GetFloorTerrain, GetFloorTerrain) ACTION_RETURN_POINTER(GetFloorTerrain(self)); } -DEFINE_ACTION_FUNCTION_NATIVE(AActor, FindUniqueTid, P_FindUniqueTID) +static int P_FindUniqueTID(FLevelLocals *Level, int start, int limit) { - PARAM_PROLOGUE; + return Level->FindUniqueTID(start, limit); +} + +DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, FindUniqueTid, P_FindUniqueTID) +{ + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); PARAM_INT(start); PARAM_INT(limit); - ACTION_RETURN_INT(P_FindUniqueTID(start, limit)); + ACTION_RETURN_INT(P_FindUniqueTID(self, start, limit)); } static void RemoveFromHash(AActor *self) diff --git a/wadsrc/static/zscript/actor.txt b/wadsrc/static/zscript/actor.txt index b113d1277..a4be48651 100644 --- a/wadsrc/static/zscript/actor.txt +++ b/wadsrc/static/zscript/actor.txt @@ -584,7 +584,10 @@ class Actor : Thinker native native static int ApplyDamageFactors(class itemcls, Name damagetype, int damage, int defdamage); native void RemoveFromHash(); native void ChangeTid(int newtid); - native static int FindUniqueTid(int start = 0, int limit = 0); + deprecated("3.8") static int FindUniqueTid(int start = 0, int limit = 0) + { + return level.FindUniqueTid(start, limit); + } native void SetShade(color col); native clearscope int GetRenderStyle() const; native clearscope bool CheckKeys(int locknum, bool remote, bool quiet = false); diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index fcfc22b54..d83d90916 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -480,8 +480,11 @@ class ThinkerIterator : Object native } class ActorIterator : Object native -{ - native static ActorIterator Create(int tid, class type = "Actor"); +{ + deprecated("3.8") static ActorIterator Create(int tid, class type = "Actor") + { + return level.CreateActorIterator(tid, type); + } native Actor Next(); native void Reinit(); } @@ -691,6 +694,7 @@ struct LevelLocals native native bool IsFreelookAllowed() const; native void StartIntermission(Name type, int state) const; native SpotState GetSpotState(bool create = true); + native int FindUniqueTid(int start = 0, int limit = 0); native static clearscope bool IsPointInMap(vector3 p); @@ -708,7 +712,8 @@ struct LevelLocals native native SectorTagIterator CreateSectorTagIterator(int tag, line defline = null); native LineIdIterator CreateLineIdIterator(int tag); - + native ActorIterator CreateActorIterator(int tid, class type = "Actor"); + String TimeFormatted(bool totals = false) { int sec = Thinker.Tics2Seconds(totals? totaltime : time); diff --git a/wadsrc/static/zscript/hexen/dragon.txt b/wadsrc/static/zscript/hexen/dragon.txt index bf5d91b16..164d76dee 100644 --- a/wadsrc/static/zscript/hexen/dragon.txt +++ b/wadsrc/static/zscript/hexen/dragon.txt @@ -135,7 +135,7 @@ class Dragon : Actor { continue; } - ActorIterator iter = ActorIterator.Create(targ.args[i]); + ActorIterator iter = Level.CreateActorIterator(targ.args[i]); mo = iter.Next (); if (mo == null) { @@ -171,7 +171,7 @@ class Dragon : Actor { i = (random[DragonSeek]() >> 2) % 5; } while(!targ.args[i]); - ActorIterator iter = ActorIterator.Create(targ.args[i]); + ActorIterator iter = Level.CreateActorIterator(targ.args[i]); tracer = iter.Next (); } } @@ -186,7 +186,7 @@ class Dragon : Actor void A_DragonInitFlight() { - ActorIterator iter = ActorIterator.Create(tid); + ActorIterator iter = Level.CreateActorIterator(tid); do { // find the first tid identical to the dragon's tid diff --git a/wadsrc/static/zscript/hexen/korax.txt b/wadsrc/static/zscript/hexen/korax.txt index 8c711ad8f..6141b9b27 100644 --- a/wadsrc/static/zscript/hexen/korax.txt +++ b/wadsrc/static/zscript/hexen/korax.txt @@ -129,7 +129,7 @@ class Korax : Actor { if ((!special2) && (health <= (SpawnHealth()/2))) { - ActorIterator it = ActorIterator.Create(KORAX_FIRST_TELEPORT_TID); + ActorIterator it = Level.CreateActorIterator(KORAX_FIRST_TELEPORT_TID); Actor spot = it.Next (); if (spot != null) { @@ -158,7 +158,7 @@ class Korax : Actor { if (random[KoraxChase]() < 10) { - ActorIterator it = ActorIterator.Create(KORAX_TELEPORT_TID); + ActorIterator it = Level.CreateActorIterator(KORAX_TELEPORT_TID); Actor spot; if (tracer != null) diff --git a/wadsrc/static/zscript/scriptutil/scriptutil.txt b/wadsrc/static/zscript/scriptutil/scriptutil.txt index b7fae4352..26f1a2b9d 100644 --- a/wadsrc/static/zscript/scriptutil/scriptutil.txt +++ b/wadsrc/static/zscript/scriptutil/scriptutil.txt @@ -151,11 +151,11 @@ class ScriptUtil play // //========================================================================== - static void SetMarineWeapon(Actor activator, int tid, int marineweapontype) + static void SetMarineWeapon(LevelLocals Level, Actor activator, int tid, int marineweapontype) { if (tid != 0) { - let it = ActorIterator.Create(tid, 'ScriptedMarine'); + let it = Level.CreateActorIterator(tid, 'ScriptedMarine'); ScriptedMarine marine; while ((marine = ScriptedMarine(it.Next())) != NULL) @@ -179,13 +179,13 @@ class ScriptUtil play // //========================================================================== - static void SetMarineSprite(Actor activator, int tid, class type) + static void SetMarineSprite(LevelLocals Level, Actor activator, int tid, class type) { if (type != NULL) { if (tid != 0) { - let it = ActorIterator.Create(tid, 'ScriptedMarine'); + let it = Level.CreateActorIterator(tid, 'ScriptedMarine'); ScriptedMarine marine; while ((marine = ScriptedMarine(it.Next())) != NULL) diff --git a/wadsrc/static/zscript/shared/camera.txt b/wadsrc/static/zscript/shared/camera.txt index f19d90d25..91923b133 100644 --- a/wadsrc/static/zscript/shared/camera.txt +++ b/wadsrc/static/zscript/shared/camera.txt @@ -66,7 +66,7 @@ class AimingCamera : SecurityCamera MaxPitchChange = double(changepitch / TICRATE); Range /= TICRATE; - ActorIterator it = ActorIterator.Create(args[3]); + ActorIterator it = Level.CreateActorIterator(args[3]); tracer = it.Next (); if (tracer == NULL) { @@ -82,7 +82,7 @@ class AimingCamera : SecurityCamera { if (tracer == NULL && args[3] != 0) { // Recheck, in case something with this TID was created since the last time. - ActorIterator it = ActorIterator.Create(args[3]); + ActorIterator it = Level.CreateActorIterator(args[3]); tracer = it.Next (); } if (tracer != NULL) diff --git a/wadsrc/static/zscript/shared/movingcamera.txt b/wadsrc/static/zscript/shared/movingcamera.txt index 59a2ee728..8fb092ddb 100644 --- a/wadsrc/static/zscript/shared/movingcamera.txt +++ b/wadsrc/static/zscript/shared/movingcamera.txt @@ -74,7 +74,7 @@ class InterpolationPoint : Actor me.bVisited = true; - let iterator = ActorIterator.Create(me.args[3] + 256 * me.args[4], "InterpolationPoint"); + let iterator = Level.CreateActorIterator(me.args[3] + 256 * me.args[4], "InterpolationPoint"); me.Next = InterpolationPoint(iterator.Next ()); if (me.Next == me) // Don't link to self @@ -186,7 +186,7 @@ class PathFollower : Actor override void PostBeginPlay () { // Find first node of path - let iterator = ActorIterator.Create(args[0] + 256 * args[1], "InterpolationPoint"); + let iterator = Level.CreateActorIterator(args[0] + 256 * args[1], "InterpolationPoint"); let node = InterpolationPoint(iterator.Next ()); InterpolationPoint prevnode; @@ -310,7 +310,7 @@ class PathFollower : Actor void NewNode () { - let iterator = ActorIterator.Create(CurrNode.tid, "InterpolationSpecial"); + let iterator = Level.CreateActorIterator(CurrNode.tid, "InterpolationSpecial"); InterpolationSpecial spec; while ( (spec = InterpolationSpecial(iterator.Next ())) ) @@ -440,7 +440,7 @@ class ActorMover : PathFollower { Super.PostBeginPlay (); - let iterator = ActorIterator.Create(args[3]); + let iterator = Level.CreateActorIterator(args[3]); tracer = iterator.Next (); if (tracer == null) @@ -552,7 +552,7 @@ class MovingCamera : PathFollower Activator = null; if (args[3] != 0) { - let iterator = ActorIterator.Create(args[3]); + let iterator = Level.CreateActorIterator(args[3]); tracer = iterator.Next (); if (tracer == null) { diff --git a/wadsrc/static/zscript/shared/skies.txt b/wadsrc/static/zscript/shared/skies.txt index 0bb0a78ef..825db9175 100644 --- a/wadsrc/static/zscript/shared/skies.txt +++ b/wadsrc/static/zscript/shared/skies.txt @@ -109,7 +109,7 @@ class SkyPicker : Actor } else { - let it = ActorIterator.Create(args[0], "SkyViewpoint"); + let it = Level.CreateActorIterator(args[0], "SkyViewpoint"); box = it.Next (); } From 0a6b6173de57e29ca2de61b823ddf57202f9822b Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 9 Jan 2019 02:03:26 +0100 Subject: [PATCH 010/164] - Moved Strife conversation data into FLevelLocals. --- src/g_level.cpp | 4 ++ src/g_levellocals.h | 14 ++++++ src/maploader/maploader.cpp | 2 +- src/p_conversation.cpp | 91 +++++++++++++++---------------------- src/p_conversation.h | 11 ++--- src/p_lnspec.cpp | 4 +- src/p_mobj.cpp | 8 ++-- src/p_setup.cpp | 11 ++++- src/p_usdf.cpp | 24 ++++++---- src/serializer.cpp | 4 +- 10 files changed, 91 insertions(+), 82 deletions(-) diff --git a/src/g_level.cpp b/src/g_level.cpp index 49047a487..5e8780f58 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -79,6 +79,7 @@ #include "events.h" #include "i_music.h" #include "a_dynlight.h" +#include "p_conversation.h" #include "gi.h" @@ -759,6 +760,9 @@ void G_DoCompleted (void) if (automapactive) AM_Stop (); + + // Close the conversation menu if open. + P_FreeStrifeConversations (); wminfo.finished_ep = level.cluster - 1; wminfo.LName0 = TexMan.CheckForTexture(level.info->PName, ETextureType::MiscPatch); diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 22e952f5e..a88a789be 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -53,6 +53,10 @@ class DACSThinker; class DFraggleThinker; class DSpotState; +struct FStrifeDialogueNode; + +typedef TMap FDialogueIDMap; // maps dialogue IDs to dialogue array index (for ACS) +typedef TMap FDialogueMap; // maps actor class names to dialogue array index struct FLevelData { @@ -105,9 +109,15 @@ struct FLevelData FBehaviorContainer Behaviors; FTagManager tagManager; AActor *TIDHash[128]; + + TArray StrifeDialogues; + FDialogueIDMap DialogueRoots; + FDialogueMap ClassRoots; + }; + struct FLevelLocals : public FLevelData { void Tick(); @@ -123,6 +133,10 @@ struct FLevelLocals : public FLevelData void TranslateLineDef (line_t *ld, maplinedef_t *mld, int lineindexforid = -1); bool IsTIDUsed(int tid); int FindUniqueTID(int start_tid, int limit); + int GetConversation(int conv_id); + int GetConversation(FName classname); + void SetConversation(int convid, PClassActor *Class, int dlgindex); + int FindNode (const FStrifeDialogueNode *node); FSectorTagIterator GetSectorTagIterator(int tag) { diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index e5aedbacd..0dd419091 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -3046,7 +3046,7 @@ void MapLoader::LoadLevel(MapData *map, const char *lumpname, int position) LoadMapinfoACSLump(); - P_LoadStrifeConversations(map, lumpname); + P_LoadStrifeConversations(Level, map, lumpname); FMissingTextureTracker missingtex; diff --git a/src/p_conversation.cpp b/src/p_conversation.cpp index 5bb9dec50..e65321d8c 100644 --- a/src/p_conversation.cpp +++ b/src/p_conversation.cpp @@ -96,28 +96,21 @@ struct TeaserSpeech static FRandom pr_randomspeech("RandomSpeech"); -TArray StrifeDialogues; - -typedef TMap FDialogueIDMap; // maps dialogue IDs to dialogue array index (for ACS) -typedef TMap FDialogueMap; // maps actor class names to dialogue array index - FClassMap StrifeTypes; -static FDialogueIDMap DialogueRoots; -static FDialogueMap ClassRoots; static int ConversationMenuY; -static int ConversationPauseTic; +// These two should be moved to player_t... +static FStrifeDialogueNode *PrevNode; static int StaticLastReply; -static bool LoadScriptFile(int lumpnum, FileReader &lump, int numnodes, bool include, int type); -static FStrifeDialogueNode *ReadRetailNode (FileReader &lump, uint32_t &prevSpeakerType); -static FStrifeDialogueNode *ReadTeaserNode (FileReader &lump, uint32_t &prevSpeakerType); +static bool LoadScriptFile(FLevelLocals *Level, int lumpnum, FileReader &lump, int numnodes, bool include, int type); +static FStrifeDialogueNode *ReadRetailNode (FLevelLocals *Level, FileReader &lump, uint32_t &prevSpeakerType); +static FStrifeDialogueNode *ReadTeaserNode (FLevelLocals *Level, FileReader &lump, uint32_t &prevSpeakerType); static void ParseReplies (FStrifeDialogueReply **replyptr, Response *responses); static bool DrawConversationMenu (); static void PickConversationReply (int replyindex); static void TerminalResponse (const char *str); -static FStrifeDialogueNode *PrevNode; //============================================================================ // @@ -137,7 +130,7 @@ void ClearStrifeTypes() StrifeTypes.Clear(); } -void SetConversation(int convid, PClassActor *Class, int dlgindex) +void FLevelLocals::SetConversation(int convid, PClassActor *Class, int dlgindex) { if (convid != -1) { @@ -156,14 +149,14 @@ PClassActor *GetStrifeType (int typenum) else return *ptype; } -int GetConversation(int conv_id) +int FLevelLocals::GetConversation(int conv_id) { int *pindex = DialogueRoots.CheckKey(conv_id); if (pindex == NULL) return -1; else return *pindex; } -int GetConversation(FName classname) +int FLevelLocals::GetConversation(FName classname) { int *pindex = ClassRoots.CheckKey(classname); if (pindex == NULL) return -1; @@ -178,12 +171,11 @@ int GetConversation(FName classname) // //============================================================================ -void P_LoadStrifeConversations (MapData *map, const char *mapname) +void P_LoadStrifeConversations (FLevelLocals *Level, MapData *map, const char *mapname) { - P_FreeStrifeConversations (); if (map->Size(ML_CONVERSATION) > 0) { - LoadScriptFile (map->lumpnum, map->Reader(ML_CONVERSATION), map->Size(ML_CONVERSATION), false, 0); + LoadScriptFile (Level, map->lumpnum, map->Reader(ML_CONVERSATION), map->Size(ML_CONVERSATION), false, 0); } else { @@ -192,8 +184,8 @@ void P_LoadStrifeConversations (MapData *map, const char *mapname) char scriptname_b[9] = { 'S','C','R','I','P','T',mapname[3],mapname[4],0 }; char scriptname_t[9] = { 'D','I','A','L','O','G',mapname[3],mapname[4],0 }; - if ( LoadScriptFile(scriptname_t, false, 2) - || LoadScriptFile(scriptname_b, false, 1)) + if ( LoadScriptFile(Level, scriptname_t, false, 2) + || LoadScriptFile(Level, scriptname_b, false, 1)) { return; } @@ -201,13 +193,13 @@ void P_LoadStrifeConversations (MapData *map, const char *mapname) if (gameinfo.Dialogue.IsNotEmpty()) { - if (LoadScriptFile(gameinfo.Dialogue, false, 0)) + if (LoadScriptFile(Level, gameinfo.Dialogue, false, 0)) { return; } } - LoadScriptFile("SCRIPT00", false, 1); + LoadScriptFile(Level, "SCRIPT00", false, 1); } } @@ -219,7 +211,7 @@ void P_LoadStrifeConversations (MapData *map, const char *mapname) // //============================================================================ -bool LoadScriptFile (const char *name, bool include, int type) +bool LoadScriptFile (FLevelLocals *Level, const char *name, bool include, int type) { int lumpnum = Wads.CheckNumForName (name); const bool found = lumpnum >= 0 @@ -236,11 +228,11 @@ bool LoadScriptFile (const char *name, bool include, int type) } FileReader lump = Wads.ReopenLumpReader (lumpnum); - bool res = LoadScriptFile(lumpnum, lump, Wads.LumpLength(lumpnum), include, type); + bool res = LoadScriptFile(Level, lumpnum, lump, Wads.LumpLength(lumpnum), include, type); return res; } -static bool LoadScriptFile(int lumpnum, FileReader &lump, int numnodes, bool include, int type) +static bool LoadScriptFile(FLevelLocals *Level, int lumpnum, FileReader &lump, int numnodes, bool include, int type) { int i; uint32_t prevSpeakerType; @@ -261,13 +253,13 @@ static bool LoadScriptFile(int lumpnum, FileReader &lump, int numnodes, bool inc if (!isbinary) { - P_ParseUSDF(lumpnum, lump, numnodes); + P_ParseUSDF(Level, lumpnum, lump, numnodes); } else { if (!include) { - LoadScriptFile("SCRIPT00", true, 1); + LoadScriptFile(Level, "SCRIPT00", true, 1); } if (!(gameinfo.flags & GI_SHAREWARE)) { @@ -297,13 +289,13 @@ static bool LoadScriptFile(int lumpnum, FileReader &lump, int numnodes, bool inc { if (!(gameinfo.flags & GI_SHAREWARE)) { - node = ReadRetailNode (lump, prevSpeakerType); + node = ReadRetailNode (Level, lump, prevSpeakerType); } else { - node = ReadTeaserNode (lump, prevSpeakerType); + node = ReadTeaserNode (Level, lump, prevSpeakerType); } - node->ThisNodeNum = StrifeDialogues.Push(node); + node->ThisNodeNum = Level->StrifeDialogues.Push(node); } } return true; @@ -317,7 +309,7 @@ static bool LoadScriptFile(int lumpnum, FileReader &lump, int numnodes, bool inc // //============================================================================ -static FStrifeDialogueNode *ReadRetailNode (FileReader &lump, uint32_t &prevSpeakerType) +static FStrifeDialogueNode *ReadRetailNode (FLevelLocals *Level, FileReader &lump, uint32_t &prevSpeakerType) { FStrifeDialogueNode *node; Speech speech; @@ -343,9 +335,9 @@ static FStrifeDialogueNode *ReadRetailNode (FileReader &lump, uint32_t &prevSpea { if (type != NULL) { - ClassRoots[type->TypeName] = StrifeDialogues.Size(); + Level->ClassRoots[type->TypeName] = Level->StrifeDialogues.Size(); } - DialogueRoots[speech.SpeakerType] = StrifeDialogues.Size(); + Level->DialogueRoots[speech.SpeakerType] = Level->StrifeDialogues.Size(); prevSpeakerType = speech.SpeakerType; } @@ -393,7 +385,7 @@ static FStrifeDialogueNode *ReadRetailNode (FileReader &lump, uint32_t &prevSpea // //============================================================================ -static FStrifeDialogueNode *ReadTeaserNode (FileReader &lump, uint32_t &prevSpeakerType) +static FStrifeDialogueNode *ReadTeaserNode (FLevelLocals *Level, FileReader &lump, uint32_t &prevSpeakerType) { FStrifeDialogueNode *node; TeaserSpeech speech; @@ -418,9 +410,9 @@ static FStrifeDialogueNode *ReadTeaserNode (FileReader &lump, uint32_t &prevSpea { if (type != NULL) { - ClassRoots[type->TypeName] = StrifeDialogues.Size(); + Level->ClassRoots[type->TypeName] = Level->StrifeDialogues.Size(); } - DialogueRoots[speech.SpeakerType] = StrifeDialogues.Size(); + Level->DialogueRoots[speech.SpeakerType] = Level->StrifeDialogues.Size(); prevSpeakerType = speech.SpeakerType; } @@ -581,7 +573,7 @@ FStrifeDialogueNode::~FStrifeDialogueNode () // //============================================================================ -static int FindNode (const FStrifeDialogueNode *node) +int FLevelLocals::FindNode (const FStrifeDialogueNode *node) { int rootnode = 0; @@ -725,16 +717,6 @@ DEFINE_ACTION_FUNCTION(DConversationMenu, SendConversationReply) void P_FreeStrifeConversations () { - FStrifeDialogueNode *node; - - while (StrifeDialogues.Pop (node)) - { - delete node; - } - - DialogueRoots.Clear(); - ClassRoots.Clear(); - PrevNode = NULL; if (CurrentMenu != NULL && CurrentMenu->IsKindOf("ConversationMenu")) { @@ -756,7 +738,8 @@ void P_StartConversation (AActor *npc, AActor *pc, bool facetalker, bool saveang int i; // Make sure this is actually a player. - if (pc->player == NULL) return; + if (pc == nullptr || pc->player == nullptr || npc == nullptr) return; + auto Level = &level; // [CW] If an NPC is talking to a PC already, then don't let // anyone else talk to the NPC. @@ -818,7 +801,7 @@ void P_StartConversation (AActor *npc, AActor *pc, bool facetalker, bool saveang if (jump && CurNode->ItemCheckNode > 0) { int root = pc->player->ConversationNPC->ConversationRoot; - CurNode = StrifeDialogues[root + CurNode->ItemCheckNode - 1]; + CurNode = Level->StrifeDialogues[root + CurNode->ItemCheckNode - 1]; } else { @@ -904,14 +887,14 @@ static void HandleReply(player_t *player, bool isconsole, int nodenum, int reply AActor *npc; bool takestuff; int i; - - if (player->ConversationNPC == NULL || (unsigned)nodenum >= StrifeDialogues.Size()) + auto Level = &level; + if (player->ConversationNPC == nullptr || (unsigned)nodenum >= Level->StrifeDialogues.Size()) { return; } // Find the reply. - node = StrifeDialogues[nodenum]; + node = Level->StrifeDialogues[nodenum]; for (i = 0, reply = node->Children; reply != NULL && i != replynum; ++i, reply = reply->Next) { } npc = player->ConversationNPC; @@ -1041,9 +1024,9 @@ static void HandleReply(player_t *player, bool isconsole, int nodenum, int reply const bool isNegative = reply->NextNode < 0; const unsigned next = (unsigned)(rootnode + (isNegative ? -1 : 1) * reply->NextNode - 1); - if (next < StrifeDialogues.Size()) + if (next < Level->StrifeDialogues.Size()) { - npc->Conversation = StrifeDialogues[next]; + npc->Conversation = Level->StrifeDialogues[next]; if (isNegative) { diff --git a/src/p_conversation.h b/src/p_conversation.h index 2a516e06e..ace3e4788 100644 --- a/src/p_conversation.h +++ b/src/p_conversation.h @@ -57,19 +57,14 @@ struct FStrifeDialogueReply bool NeedsGold = false; }; -extern TArray StrifeDialogues; - struct MapData; void SetStrifeType(int convid, PClassActor *Class); -void SetConversation(int convid, PClassActor *Class, int dlgindex); PClassActor *GetStrifeType (int typenum); -int GetConversation(int conv_id); -int GetConversation(FName classname); -bool LoadScriptFile (const char *name, bool include, int type = 0); +bool LoadScriptFile (FLevelLocals *Level, const char *name, bool include, int type = 0); -void P_LoadStrifeConversations (MapData *map, const char *mapname); +void P_LoadStrifeConversations (FLevelLocals *Level, MapData *map, const char *mapname); void P_FreeStrifeConversations (); void P_StartConversation (AActor *npc, AActor *pc, bool facetalker, bool saveangle); @@ -78,7 +73,7 @@ void P_ResumeConversation (); void P_ConversationCommand (int netcode, int player, uint8_t **stream); class FileReader; -bool P_ParseUSDF(int lumpnum, FileReader &lump, int lumplen); +bool P_ParseUSDF(FLevelLocals *Level, int lumpnum, FileReader &lump, int lumplen); #endif diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index eb58f6125..b369ffceb 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -3377,9 +3377,9 @@ FUNC(LS_Thing_SetConversation) if (arg1 != 0) { - dlg_index = GetConversation(arg1); + dlg_index = Level->GetConversation(arg1); if (dlg_index == -1) return false; - node = StrifeDialogues[dlg_index]; + node = Level->StrifeDialogues[dlg_index]; } if (arg0 != 0) diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 10d17b30c..e0f58fe73 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -4374,10 +4374,10 @@ AActor *AActor::StaticSpawn (PClassActor *type, const DVector3 &pos, replace_t a actor->SpawnOrder = level.spawnindex++; // Set default dialogue - actor->ConversationRoot = GetConversation(actor->GetClass()->TypeName); + actor->ConversationRoot = level.GetConversation(actor->GetClass()->TypeName); if (actor->ConversationRoot != -1) { - actor->Conversation = StrifeDialogues[actor->ConversationRoot]; + actor->Conversation = level.StrifeDialogues[actor->ConversationRoot]; } else { @@ -5462,11 +5462,11 @@ AActor *P_SpawnMapThing (FMapThing *mthing, int position) if (mthing->Conversation > 0) { // Make sure that this does not partially overwrite the default dialogue settings. - int root = GetConversation(mthing->Conversation); + int root = level.GetConversation(mthing->Conversation); if (root != -1) { mobj->ConversationRoot = root; - mobj->Conversation = StrifeDialogues[mobj->ConversationRoot]; + mobj->Conversation = level.StrifeDialogues[mobj->ConversationRoot]; } } diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 0412eae9d..eebefbfdc 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -263,6 +263,16 @@ void FLevelLocals::ClearLevelData() total_monsters = total_items = total_secrets = killed_monsters = found_items = found_secrets = wminfo.maxfrags = 0; + + FStrifeDialogueNode *node; + + while (StrifeDialogues.Pop (node)) + { + delete node; + } + + DialogueRoots.Clear(); + ClassRoots.Clear(); // delete allocated data in the level arrays. if (sectors.Size() > 0) @@ -342,7 +352,6 @@ void P_FreeLevelData () SN_StopAllSequences (); DThinker::DestroyAllThinkers (); - P_FreeStrifeConversations (); level.ClearLevelData(); } diff --git a/src/p_usdf.cpp b/src/p_usdf.cpp index 9520c869c..cf579e790 100644 --- a/src/p_usdf.cpp +++ b/src/p_usdf.cpp @@ -40,12 +40,15 @@ #include "actor.h" #include "a_pickups.h" #include "w_wad.h" +#include "g_levellocals.h" #define Zd 1 #define St 2 class USDFParser : public UDMFParserBase { + FLevelLocals *Level; + //=========================================================================== // // Checks an actor type (different representation depending on namespace) @@ -300,7 +303,7 @@ class USDFParser : public UDMFParserBase FStrifeDialogueNode *node = new FStrifeDialogueNode; FStrifeDialogueReply **replyptr = &node->Children; - node->ThisNodeNum = StrifeDialogues.Push(node); + node->ThisNodeNum = Level->StrifeDialogues.Push(node); node->ItemCheckNode = -1; FString SpeakerName; @@ -403,7 +406,7 @@ class USDFParser : public UDMFParserBase PClassActor *type = nullptr; int dlgid = -1; FName clsid = NAME_None; - unsigned int startpos = StrifeDialogues.Size(); + unsigned int startpos = Level->StrifeDialogues.Size(); while (!sc.CheckToken('}')) { @@ -455,11 +458,11 @@ class USDFParser : public UDMFParserBase sc.ScriptMessage("No valid actor type defined in conversation."); return false; } - SetConversation(dlgid, type, startpos); - for(;startpos < StrifeDialogues.Size(); startpos++) + Level->SetConversation(dlgid, type, startpos); + for(;startpos < Level->StrifeDialogues.Size(); startpos++) { - StrifeDialogues[startpos]->SpeakerType = type; - StrifeDialogues[startpos]->MenuClassName = clsid; + Level->StrifeDialogues[startpos]->SpeakerType = type; + Level->StrifeDialogues[startpos]->MenuClassName = clsid; } return true; } @@ -471,8 +474,9 @@ class USDFParser : public UDMFParserBase //=========================================================================== public: - bool Parse(int lumpnum, FileReader &lump, int lumplen) + bool Parse(FLevelLocals *l, int lumpnum, FileReader &lump, int lumplen) { + Level = l; sc.OpenMem(Wads.GetLumpFullName(lumpnum), lump.Read(lumplen)); sc.SetCMode(true); // Namespace must be the first field because everything else depends on it. @@ -512,7 +516,7 @@ public: { sc.MustGetToken('='); sc.MustGetToken(TK_StringConst); - LoadScriptFile(sc.String, true); + LoadScriptFile(Level, sc.String, true); sc.MustGetToken(';'); } else @@ -526,13 +530,13 @@ public: -bool P_ParseUSDF(int lumpnum, FileReader &lump, int lumplen) +bool P_ParseUSDF(FLevelLocals *l, int lumpnum, FileReader &lump, int lumplen) { USDFParser parse; try { - if (!parse.Parse(lumpnum, lump, lumplen)) + if (!parse.Parse(l, lumpnum, lump, lumplen)) { // clean up the incomplete dialogue structures here return false; diff --git a/src/serializer.cpp b/src/serializer.cpp index 73e8e8eb4..3f390bf1c 100644 --- a/src/serializer.cpp +++ b/src/serializer.cpp @@ -1968,13 +1968,13 @@ template<> FSerializer &Serialize(FSerializer &arc, const char *key, FStrifeDial } else if (val->IsUint()) { - if (val->GetUint() >= StrifeDialogues.Size()) + if (val->GetUint() >= level.StrifeDialogues.Size()) { node = nullptr; } else { - node = StrifeDialogues[val->GetUint()]; + node = level.StrifeDialogues[val->GetUint()]; } } else From 4d55c28b60202df08d17202a6f04c95238a46968 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 24 Jan 2019 20:27:34 +0100 Subject: [PATCH 011/164] - moved a large batch of code from p_spec.cpp and a few other files into the maploader folder. --- src/CMakeLists.txt | 1 + src/maploader/specials.cpp | 1309 ++++++++++++++++++++++++++++++++++++ src/p_3dfloors.cpp | 152 +---- src/p_3dfloors.h | 2 + src/p_lights.cpp | 186 +---- src/p_pusher.cpp | 141 +--- src/p_scroll.cpp | 265 +------- src/p_spec.cpp | 676 +------------------ src/p_spec_thinkers.h | 253 +++++++ 9 files changed, 1579 insertions(+), 1406 deletions(-) create mode 100644 src/maploader/specials.cpp create mode 100644 src/p_spec_thinkers.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 73d64cf7e..6e71eaa73 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1074,6 +1074,7 @@ set (PCH_SOURCES hwrenderer/utility/hw_shaderpatcher.cpp hwrenderer/utility/hw_vrmodes.cpp maploader/edata.cpp + maploader/specials.cpp maploader/maploader.cpp maploader/slopes.cpp maploader/glnodes.cpp diff --git a/src/maploader/specials.cpp b/src/maploader/specials.cpp new file mode 100644 index 000000000..38ace4b68 --- /dev/null +++ b/src/maploader/specials.cpp @@ -0,0 +1,1309 @@ +//----------------------------------------------------------------------------- +// +// Copyright 1993-1996 id Software +// Copyright 1994-1996 Raven Software +// Copyright 1998-1998 Chi Hoang, Lee Killough, Jim Flynn, Rand Phares, Ty Halderman +// Copyright 1999-2016 Randy Heit +// Copyright 2002-2016 Christoph Oelckers +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see http://www.gnu.org/licenses/ +// +//----------------------------------------------------------------------------- +// +// DESCRIPTION: +// Implements special effects: +// Texture animation, height or lighting changes +// according to adjacent sectors, respective +// utility functions, etc. +// Line Tag handling. Line and Sector triggers. +// Implements donut linedef triggers +// Initializes and implements BOOM linedef triggers for +// Scrollers/Conveyors +// Friction +// Wind/Current +// +//----------------------------------------------------------------------------- + +/* For code that originates from ZDoom the following applies: +** +**--------------------------------------------------------------------------- +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** +** 1. Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** 3. The name of the author may not be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**--------------------------------------------------------------------------- +** +*/ + +#include + +#include "templates.h" +#include "doomdef.h" +#include "doomstat.h" +#include "d_event.h" +#include "g_level.h" +#include "gstrings.h" +#include "events.h" + +#include "m_random.h" + +#include "p_local.h" +#include "p_spec.h" +#include "p_blockmap.h" +#include "p_lnspec.h" +#include "p_terrain.h" +#include "p_acs.h" +#include "p_3dmidtex.h" + +#include "g_game.h" + +#include "a_sharedglobal.h" +#include "a_keys.h" +#include "c_dispatch.h" +#include "r_sky.h" +#include "d_player.h" +#include "g_levellocals.h" +#include "actorinlines.h" +#include "vm.h" +#include "p_setup.h" + +#include "c_console.h" +#include "p_spec_thinkers.h" +#include "maploader/maploader.h" + +EXTERN_CVAR(Bool, forcewater) + +//----------------------------------------------------------------------------- +// +// Portals +// +//----------------------------------------------------------------------------- + +//--------------------------------------------------------------------------- + +//----------------------------------------------------------------------------- +// +// Lower stacks go in the bottom sector. +// +//----------------------------------------------------------------------------- + +void MapLoader::SetupFloorPortal (AActor *point) +{ + auto it = Level->GetActorIterator(NAME_LowerStackLookOnly, point->tid); + sector_t *Sector = point->Sector; + auto skyv = it.Next(); + if (skyv != nullptr) + { + skyv->target = point; + if (Sector->GetAlpha(sector_t::floor) == 1.) + Sector->SetAlpha(sector_t::floor, clamp(point->args[0], 0, 255) / 255.); + + Sector->Portals[sector_t::floor] = P_GetStackPortal(skyv, sector_t::floor); + } +} + +//----------------------------------------------------------------------------- +// +// Upper stacks go in the top sector. +// +//----------------------------------------------------------------------------- + +void MapLoader::SetupCeilingPortal (AActor *point) +{ + auto it = Level->GetActorIterator(NAME_UpperStackLookOnly, point->tid); + sector_t *Sector = point->Sector; + auto skyv = it.Next(); + if (skyv != nullptr) + { + skyv->target = point; + if (Sector->GetAlpha(sector_t::ceiling) == 1.) + Sector->SetAlpha(sector_t::ceiling, clamp(point->args[0], 0, 255) / 255.); + + Sector->Portals[sector_t::ceiling] = P_GetStackPortal(skyv, sector_t::ceiling); + } +} + +//----------------------------------------------------------------------------- +// +// +// +//----------------------------------------------------------------------------- + +void MapLoader::SetupPortals() +{ + auto it = Level->GetThinkerIterator(NAME_StackPoint); + AActor *pt; + TArray points; + + while ((pt = it.Next())) + { + FName nm = pt->GetClass()->TypeName; + if (nm == NAME_UpperStackLookOnly) + { + SetupFloorPortal(pt); + } + else if (nm == NAME_LowerStackLookOnly) + { + SetupCeilingPortal(pt); + } + pt->special1 = 0; + points.Push(pt); + } + // the semantics here are incredibly lax so the final setup can only be done once all portals have been created, + // because later stackpoints will happily overwrite info in older ones, if there are multiple links. + for (auto &s : Level->sectorPortals) + { + if (s.mType == PORTS_STACKEDSECTORTHING && s.mSkybox) + { + for (auto &ss : Level->sectorPortals) + { + if (ss.mType == PORTS_STACKEDSECTORTHING && ss.mSkybox == s.mSkybox->target) + { + s.mPartner = unsigned((&ss) - &Level->sectorPortals[0]); + } + } + } + } + // Now we can finally set the displacement and delete the stackpoint reference. + for (auto &s : Level->sectorPortals) + { + if (s.mType == PORTS_STACKEDSECTORTHING && s.mSkybox) + { + s.mDisplacement = s.mSkybox->Pos() - s.mSkybox->target->Pos(); + s.mSkybox = nullptr; + } + } +} + +//----------------------------------------------------------------------------- +// +// +// +//----------------------------------------------------------------------------- + +void MapLoader::SetPortal(sector_t *sector, int plane, unsigned pnum, double alpha) +{ + // plane: 0=floor, 1=ceiling, 2=both + if (plane > 0) + { + if (sector->GetPortalType(sector_t::ceiling) == PORTS_SKYVIEWPOINT) + { + sector->Portals[sector_t::ceiling] = pnum; + if (sector->GetAlpha(sector_t::ceiling) == 1.) + sector->SetAlpha(sector_t::ceiling, alpha); + + if (Level->sectorPortals[pnum].mFlags & PORTSF_SKYFLATONLY) + sector->SetTexture(sector_t::ceiling, skyflatnum); + } + } + if (plane == 2 || plane == 0) + { + if (sector->GetPortalType(sector_t::floor) == PORTS_SKYVIEWPOINT) + { + sector->Portals[sector_t::floor] = pnum; + } + if (sector->GetAlpha(sector_t::floor) == 1.) + sector->SetAlpha(sector_t::floor, alpha); + + if (Level->sectorPortals[pnum].mFlags & PORTSF_SKYFLATONLY) + sector->SetTexture(sector_t::floor, skyflatnum); + } +} + +//----------------------------------------------------------------------------- +// +// +// +//----------------------------------------------------------------------------- + +void MapLoader::CopyPortal(int sectortag, int plane, unsigned pnum, double alpha, bool tolines) +{ + int s; + auto itr = Level->GetSectorTagIterator(sectortag); + while ((s = itr.Next()) >= 0) + { + SetPortal(&Level->sectors[s], plane, pnum, alpha); + } + + for (auto &line : Level->lines) + { + // 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 + if (line.special == Sector_SetPortal && + line.args[1] == 1 && + (line.args[2] == plane || line.args[2] == 3) && + line.args[3] == sectortag) + { + if (line.args[0] == 0) + { + SetPortal(line.frontsector, plane, pnum, alpha); + } + else + { + auto itr = Level->GetSectorTagIterator(line.args[0]); + while ((s = itr.Next()) >= 0) + { + SetPortal(&Level->sectors[s], plane, pnum, alpha); + } + } + } + if (tolines && line.special == Sector_SetPortal && + line.args[1] == 5 && + line.args[3] == sectortag) + { + if (line.args[0] == 0) + { + line.portaltransferred = pnum; + } + else + { + auto itr = Level->GetLineIdIterator(line.args[0]); + while ((s = itr.Next()) >= 0) + { + Level->lines[s].portaltransferred = pnum; + } + } + } + } +} + +//----------------------------------------------------------------------------- +// +// +// +//----------------------------------------------------------------------------- + +void MapLoader::SpawnPortal(line_t *line, int sectortag, int plane, int bytealpha, int linked) +{ + if (plane < 0 || plane > 2 || (linked && plane == 2)) return; + 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 + // which is not a good idea. + if (oline.special == Sector_SetPortal && + oline.args[0] == sectortag && + oline.args[1] == linked && + oline.args[2] == plane && + oline.args[3] == 1) + { + // beware of overflows. + DVector2 pos1 = line->v1->fPos() + line->Delta() / 2; + DVector2 pos2 = oline.v1->fPos() + oline.Delta() / 2; + unsigned pnum = P_GetPortal(linked ? PORTS_LINKEDPORTAL : PORTS_PORTAL, plane, line->frontsector, oline.frontsector, pos2 - pos1); + CopyPortal(sectortag, plane, pnum, bytealpha / 255., false); + return; + } + } +} + +//----------------------------------------------------------------------------- +// +// This searches the viewpoint's sector +// for a skybox line special, gets its tag and transfers the skybox to all tagged sectors. +// +//----------------------------------------------------------------------------- + +void MapLoader::SpawnSkybox(AActor *origin) +{ + sector_t *Sector = origin->Sector; + if (Sector == NULL) + { + Printf("Sector not initialized for SkyCamCompat\n"); + origin->Sector = Sector = P_PointInSector(origin->Pos()); + } + if (Sector) + { + for(auto refline : Sector->Lines) + { + if (refline->special == Sector_SetPortal && refline->args[1] == 2) + { + // We found the setup linedef for this skybox, so let's use it for our init. + unsigned pnum = P_GetSkyboxPortal(origin); + CopyPortal(refline->args[0], refline->args[2], pnum, 0, true); + return; + } + } + } +} + +//----------------------------------------------------------------------------- +// +// P_SetSectorDamage +// +// Sets damage properties for one sector. Allows combination of original specials with explicit use of the damage properties +// +//----------------------------------------------------------------------------- + +static void SetupSectorDamage(sector_t *sector, int damage, int interval, int leakchance, FName type, int flags) +{ + // Only set if damage is not yet initialized. This ensures that UDMF takes precedence over sector specials. + if (sector->damageamount == 0) + { + sector->damageamount = damage; + sector->damageinterval = MAX(1, interval); + sector->leakydamage = leakchance; + sector->damagetype = type; + sector->Flags = (sector->Flags & ~SECF_DAMAGEFLAGS) | (flags & SECF_DAMAGEFLAGS); + } +} + +//----------------------------------------------------------------------------- +// +// P_InitSectorSpecial +// +// Sets up everything derived from 'sector->special' for one sector +// ('fromload' is necessary to allow conversion upon savegame load.) +// +//----------------------------------------------------------------------------- + +void MapLoader::InitSectorSpecial(sector_t *sector, int special) +{ + // [RH] All secret sectors are marked with a BOOM-ish bitfield + if (sector->special & SECRET_MASK) + { + sector->Flags |= SECF_SECRET | SECF_WASSECRET; + Level->total_secrets++; + } + if (sector->special & FRICTION_MASK) + { + sector->Flags |= SECF_FRICTION; + } + if (sector->special & PUSH_MASK) + { + sector->Flags |= SECF_PUSH; + } + if ((sector->special & DAMAGE_MASK) == 0x100) + { + SetupSectorDamage(sector, 5, 32, 0, NAME_Fire, 0); + } + else if ((sector->special & DAMAGE_MASK) == 0x200) + { + SetupSectorDamage(sector, 10, 32, 0, NAME_Slime, 0); + } + else if ((sector->special & DAMAGE_MASK) == 0x300) + { + SetupSectorDamage(sector, 20, 32, 5, NAME_Slime, 0); + } + sector->special &= 0xff; + + // [RH] Normal DOOM special or BOOM specialized? + bool keepspecial = false; + SpawnLights(sector); + switch (sector->special) + { + case dLight_Strobe_Hurt: + SetupSectorDamage(sector, 20, 32, 5, NAME_Slime, 0); + break; + + case dDamage_Hellslime: + SetupSectorDamage(sector, 10, 32, 0, NAME_Slime, 0); + break; + + case dDamage_Nukage: + SetupSectorDamage(sector, 5, 32, 0, NAME_Slime, 0); + break; + + case dSector_DoorCloseIn30: + Create(sector, DDoor::doorWaitClose, 2, 0, 0, 30 * TICRATE); + break; + + case dDamage_End: + SetupSectorDamage(sector, 20, 32, 256, NAME_None, SECF_ENDGODMODE|SECF_ENDLEVEL); + break; + + case dSector_DoorRaiseIn5Mins: + Create (sector, DDoor::doorWaitRaise, 2, TICRATE*30/7, 0, 5*60*TICRATE); + break; + + case dFriction_Low: + sector->friction = FRICTION_LOW; + sector->movefactor = 0x269/65536.; + sector->Flags |= SECF_FRICTION; + break; + + case dDamage_SuperHellslime: + SetupSectorDamage(sector, 20, 32, 5, NAME_Slime, 0); + break; + + case dDamage_LavaWimpy: + SetupSectorDamage(sector, 5, 16, 256, NAME_Fire, SECF_DMGTERRAINFX); + break; + + case dDamage_LavaHefty: + SetupSectorDamage(sector, 8, 16, 256, NAME_Fire, SECF_DMGTERRAINFX); + break; + + case dScroll_EastLavaDamage: + SetupSectorDamage(sector, 5, 16, 256, NAME_Fire, SECF_DMGTERRAINFX); + CreateScroller(EScroll::sc_floor, -4., 0, sector, 0); + keepspecial = true; + break; + + case hDamage_Sludge: + SetupSectorDamage(sector, 4, 32, 0, NAME_Slime, 0); + break; + + case sLight_Strobe_Hurt: + SetupSectorDamage(sector, 5, 32, 0, NAME_Slime, 0); + break; + + case sDamage_Hellslime: + SetupSectorDamage(sector, 2, 32, 0, NAME_Slime, SECF_HAZARD); + break; + + case Damage_InstantDeath: + // Strife's instant death sector + SetupSectorDamage(sector, TELEFRAG_DAMAGE, 1, 256, NAME_InstantDeath, 0); + break; + + case sDamage_SuperHellslime: + SetupSectorDamage(sector, 4, 32, 0, NAME_Slime, SECF_HAZARD); + break; + + case Sector_Hidden: + sector->MoreFlags |= SECMF_HIDDEN; + break; + + case Sector_Heal: + // CoD's healing sector + SetupSectorDamage(sector, -1, 32, 0, NAME_None, 0); + break; + + case Sky2: + sector->sky = PL_SKYFLAT; + break; + + default: + if (sector->special >= Scroll_North_Slow && sector->special <= Scroll_SouthWest_Fast) + { // Hexen scroll special + static const int8_t hexenScrollies[24][2] = + { + { 0, 1 }, { 0, 2 }, { 0, 4 }, + { -1, 0 }, { -2, 0 }, { -4, 0 }, + { 0, -1 }, { 0, -2 }, { 0, -4 }, + { 1, 0 }, { 2, 0 }, { 4, 0 }, + { 1, 1 }, { 2, 2 }, { 4, 4 }, + { -1, 1 }, { -2, 2 }, { -4, 4 }, + { -1, -1 }, { -2, -2 }, { -4, -4 }, + { 1, -1 }, { 2, -2 }, { 4, -4 } + }; + + + int i = sector->special - Scroll_North_Slow; + double dx = hexenScrollies[i][0] / 2.; + double dy = hexenScrollies[i][1] / 2.; + CreateScroller(EScroll::sc_floor, dx, dy, sector, 0); + } + else if (sector->special >= Carry_East5 && sector->special <= Carry_East35) + { + // Heretic scroll special + // Only east scrollers also scroll the texture + CreateScroller(EScroll::sc_floor, -0.5 * (1 << ((sector->special & 0xff) - Carry_East5)), 0, sector, 0); + } + keepspecial = true; + break; + } + if (!keepspecial) sector->special = 0; +} + +//----------------------------------------------------------------------------- +// +// P_SpawnSpecials +// +// After the map has been loaded, scan for specials that spawn thinkers +// +//----------------------------------------------------------------------------- + +void MapLoader::SpawnSpecials () +{ + SetupPortals(); + + for (auto &sec : Level->sectors) + { + if (sec.special == 0) + continue; + + InitSectorSpecial(&sec, sec.special); + } + + ProcessEDSectors(); + + // Init other misc stuff + + SpawnScrollers(); // killough 3/7/98: Add generalized scrollers + SpawnFriction(); // phares 3/12/98: New friction model using linedefs + SpawnPushers(); // phares 3/20/98: New pusher model using linedefs + + auto it2 = Level->GetThinkerIterator(NAME_SkyCamCompat); + AActor *pt2; + while ((pt2 = it2.Next())) + { + SpawnSkybox(pt2); + } + + for (auto &line : Level->lines) + { + switch (line.special) + { + int s; + sector_t *sec; + + // killough 3/7/98: + // support for drawn heights coming from different sector + case Transfer_Heights: + { + sec = line.frontsector; + + if (line.args[1] & 2) + { + sec->MoreFlags |= SECMF_FAKEFLOORONLY; + } + if (line.args[1] & 4) + { + sec->MoreFlags |= SECMF_CLIPFAKEPLANES; + } + if (line.args[1] & 8) + { + sec->MoreFlags |= SECMF_UNDERWATER; + } + else if (forcewater) + { + sec->MoreFlags |= SECMF_FORCEDUNDERWATER; + } + if (line.args[1] & 16) + { + sec->MoreFlags |= SECMF_IGNOREHEIGHTSEC; + } + else Level->HasHeightSecs = true; + if (line.args[1] & 32) + { + sec->MoreFlags |= SECMF_NOFAKELIGHT; + } + auto itr = Level->GetSectorTagIterator(line.args[0]); + while ((s = itr.Next()) >= 0) + { + Level->sectors[s].heightsec = sec; + sec->e->FakeFloor.Sectors.Push(&Level->sectors[s]); + Level->sectors[s].MoreFlags |= (sec->MoreFlags & SECMF_IGNOREHEIGHTSEC); // copy this to the destination sector for easier checking. + Level->sectors[s].AdjustFloorClip(); + } + break; + } + + // killough 3/16/98: Add support for setting + // floor lighting independently (e.g. lava) + case Transfer_FloorLight: + Create (line.frontsector, line.args[0], true); + break; + + // killough 4/11/98: Add support for setting + // ceiling lighting independently + case Transfer_CeilingLight: + Create (line.frontsector, line.args[0], false); + break; + + // [Graf Zahl] Add support for setting lighting + // per wall independently + case Transfer_WallLight: + Create (line.frontsector, line.args[0], line.args[1]); + break; + + case Sector_Attach3dMidtex: + P_Attach3dMidtexLinesToSector(line.frontsector, line.args[0], line.args[1], !!line.args[2]); + break; + + case Sector_SetLink: + if (line.args[0] == 0) + { + P_AddSectorLinks(line.frontsector, line.args[1], line.args[2], line.args[3]); + } + break; + + case Sector_SetPortal: + // arg 0 = sector tag + // arg 1 = type + // - 0: normal (handled here) + // - 1: copy (handled by the portal they copy) + // - 2: EE-style skybox (handled by the camera object) + // - 3: EE-style flat portal (GZDoom HW renderer only for now) + // - 4: EE-style horizon portal (GZDoom HW renderer only for now) + // - 5: copy portal to line (GZDoom HW renderer only for now) + // - 6: linked portal + // other values reserved for later use + // arg 2 = 0:floor, 1:ceiling, 2:both + // arg 3 = 0: anchor, 1: reference line + // arg 4 = for the anchor only: alpha + if ((line.args[1] == 0 || line.args[1] == 6) && line.args[3] == 0) + { + SpawnPortal(&line, line.args[0], line.args[2], line.args[4], line.args[1]); + } + else if (line.args[1] == 3 || line.args[1] == 4) + { + 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); + } + break; + + case Line_SetPortal: + P_SpawnLinePortal(&line); + break; + + // [RH] ZDoom Static_Init settings + case Static_Init: + switch (line.args[1]) + { + case Init_Gravity: + { + double grav = line.Delta().Length() / 100.; + auto itr = Level->GetSectorTagIterator(line.args[0]); + while ((s = itr.Next()) >= 0) + Level->sectors[s].gravity = grav; + } + break; + + //case Init_Color: + // handled in P_LoadSideDefs2() + + case Init_Damage: + { + int damage = int(line.Delta().Length()); + auto itr = Level->GetSectorTagIterator(line.args[0]); + while ((s = itr.Next()) >= 0) + { + sector_t *sec = &Level->sectors[s]; + sec->damageamount = damage; + sec->damagetype = NAME_None; + if (sec->damageamount < 20) + { + sec->leakydamage = 0; + sec->damageinterval = 32; + } + else if (sec->damageamount < 50) + { + sec->leakydamage = 5; + sec->damageinterval = 32; + } + else + { + sec->leakydamage = 256; + sec->damageinterval = 1; + } + } + } + break; + + case Init_SectorLink: + if (line.args[3] == 0) + P_AddSectorLinksByID(line.frontsector, line.args[0], line.args[2]); + break; + + // killough 10/98: + // + // Support for sky textures being transferred from sidedefs. + // Allows scrolling and other effects (but if scrolling is + // used, then the same sector tag needs to be used for the + // sky sector, the sky-transfer linedef, and the scroll-effect + // linedef). Still requires user to use F_SKY1 for the floor + // or ceiling texture, to distinguish floor and ceiling sky. + + case Init_TransferSky: + { + auto itr = Level->GetSectorTagIterator(line.args[0]); + while ((s = itr.Next()) >= 0) + Level->sectors[s].sky = (line.Index() + 1) | PL_SKYFLAT; + break; + } + } + break; + } + } + // [RH] Start running any open scripts on this map + Level->Behaviors.StartTypedScripts (SCRIPT_Open, NULL, false); +} + +//----------------------------------------------------------------------------- +// +// +// +//----------------------------------------------------------------------------- + +void MapLoader::SpawnFriction() +{ + line_t *l = &Level->lines[0]; + + for (unsigned i = 0 ; i < Level->lines.Size() ; i++,l++) + { + if (l->special == Sector_SetFriction) + { + int length; + + if (l->args[1]) + { // [RH] Allow setting friction amount from parameter + length = l->args[1] <= 200 ? l->args[1] : 200; + } + else + { + length = int(l->Delta().Length()); + } + + P_SetSectorFriction (Level, l->args[0], length, false); + l->special = 0; + } + } +} + +//========================================================================== +// +// Creates all 3D floors defined by one linedef +// +//========================================================================== + +int MapLoader::Set3DFloor(line_t * line, int param, int param2, int alpha) +{ + int s; + int flags; + int tag = line->args[0]; + sector_t * sec = line->frontsector, *ss; + + auto itr = Level->GetSectorTagIterator(tag); + while ((s = itr.Next()) >= 0) + { + ss = &Level->sectors[s]; + + if (param == 0) + { + flags = FF_EXISTS | FF_RENDERALL | FF_SOLID | FF_INVERTSECTOR; + alpha = 255; + for (auto l: sec->Lines) + { + if (l->special == Sector_SetContents && l->frontsector == sec) + { + alpha = clamp(l->args[1], 0, 100); + if (l->args[2] & 1) flags &= ~FF_SOLID; + if (l->args[2] & 2) flags |= FF_SEETHROUGH; + if (l->args[2] & 4) flags |= FF_SHOOTTHROUGH; + if (l->args[2] & 8) flags |= FF_ADDITIVETRANS; + if (alpha != 100) flags |= FF_TRANSLUCENT;//|FF_BOTHPLANES|FF_ALLSIDES; + if (l->args[0]) + { + // Yes, Vavoom's 3D-floor definitions suck! + // The content list changed in r1783 of Vavoom to be unified + // among all its supported games, so it has now ten different + // values instead of just five. + static uint32_t vavoomcolors[] = { VC_EMPTY, + VC_WATER, VC_LAVA, VC_NUKAGE, VC_SLIME, VC_HELLSLIME, + VC_BLOOD, VC_SLUDGE, VC_HAZARD, VC_BOOMWATER }; + flags |= FF_SWIMMABLE | FF_BOTHPLANES | FF_ALLSIDES | FF_FLOOD; + + l->frontsector->Colormap.FadeColor = vavoomcolors[l->args[0]] & VC_COLORMASK; + l->frontsector->Colormap.FogDensity = 0; + } + alpha = (alpha * 255) / 100; + break; + } + } + } + else if (param == 4) + { + flags = FF_EXISTS | FF_RENDERPLANES | FF_INVERTPLANES | FF_NOSHADE | FF_FIX; + if (param2 & 1) flags |= FF_SEETHROUGH; // marker for allowing missing texture checks + alpha = 255; + } + else + { + static const int defflags[] = { 0, + FF_SOLID, + FF_SWIMMABLE | FF_BOTHPLANES | FF_ALLSIDES | FF_SHOOTTHROUGH | FF_SEETHROUGH, + FF_SHOOTTHROUGH | FF_SEETHROUGH, + }; + + flags = defflags[param & 3] | FF_EXISTS | FF_RENDERALL; + + if (param & 4) flags |= FF_ALLSIDES | FF_BOTHPLANES; + if (param & 16) flags ^= FF_SEETHROUGH; + if (param & 32) flags ^= FF_SHOOTTHROUGH; + + if (param2 & 1) flags |= FF_NOSHADE; + if (param2 & 2) flags |= FF_DOUBLESHADOW; + if (param2 & 4) flags |= FF_FOG; + if (param2 & 8) flags |= FF_THINFLOOR; + if (param2 & 16) flags |= FF_UPPERTEXTURE; + if (param2 & 32) flags |= FF_LOWERTEXTURE; + if (param2 & 64) flags |= FF_ADDITIVETRANS | FF_TRANSLUCENT; + // if flooding is used the floor must be non-solid and is automatically made shootthrough and seethrough + if ((param2 & 128) && !(flags & FF_SOLID)) flags |= FF_FLOOD | FF_SEETHROUGH | FF_SHOOTTHROUGH; + if (param2 & 512) flags |= FF_FADEWALLS; + if (param2&1024) flags |= FF_RESET; + FTextureID tex = line->sidedef[0]->GetTexture(side_t::top); + if (!tex.Exists() && alpha < 255) + { + alpha = -tex.GetIndex(); + } + alpha = clamp(alpha, 0, 255); + if (alpha == 0) flags &= ~(FF_RENDERALL | FF_BOTHPLANES | FF_ALLSIDES); + else if (alpha != 255) flags |= FF_TRANSLUCENT; + + } + P_Add3DFloor(ss, sec, line, flags, alpha); + } + // To be 100% safe this should be done even if the alpha by texture value isn't used. + if (!line->sidedef[0]->GetTexture(side_t::top).isValid()) + line->sidedef[0]->SetTexture(side_t::top, FNullTextureID()); + return 1; +} + +//========================================================================== +// +// Spawns 3D floors +// +//========================================================================== + +void MapLoader::Spawn3DFloors () +{ + static int flagvals[] = {512, 2+512, 512+1024}; + + for (auto &line : Level->lines) + { + switch(line.special) + { + case ExtraFloor_LightOnly: + if (line.args[1] < 0 || line.args[1] > 2) line.args[1] = 0; + if (line.args[0] != 0) + Set3DFloor(&line, 3, flagvals[line.args[1]], 0); + break; + + case Sector_Set3DFloor: + // The flag high-byte/line id is only needed in Hexen format. + // UDMF can set both of these parameters without any restriction of the usable values. + // 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 (line.args[1]&8) + { + Level->tagManager.AddLineID(line.Index(), line.args[4]); + } + else + { + line.args[0]+=256*line.args[4]; + line.args[4]=0; + } + } + Set3DFloor(&line, line.args[1]&~8, line.args[2], line.args[3]); + break; + + default: + continue; + } + line.special=0; + line.args[0] = line.args[1] = line.args[2] = line.args[3] = line.args[4] = 0; + } + + for (auto &sec : Level->sectors) + { + P_Recalculate3DFloors(&sec); + } +} + +//========================================================================== +// +// Spawns light effects +// +//========================================================================== + +void MapLoader::SpawnLights(sector_t *sector) +{ + const int STROBEBRIGHT = 5; + const int FASTDARK = 15; + const int SLOWDARK = TICRATE; + + switch (sector->special) + { + case Light_Phased: + Create(sector, 48, 63 - (sector->lightlevel & 63)); + break; + + // [RH] Hexen-like phased lighting + case LightSequenceStart: + Create(sector); + break; + + case dLight_Flicker: + Create(sector); + break; + + case dLight_StrobeFast: + Create(sector, STROBEBRIGHT, FASTDARK, false); + break; + + case dLight_StrobeSlow: + Create(sector, STROBEBRIGHT, SLOWDARK, false); + break; + + case dLight_Strobe_Hurt: + Create(sector, STROBEBRIGHT, FASTDARK, false); + break; + + case dLight_Glow: + Create(sector); + break; + + case dLight_StrobeSlowSync: + Create(sector, STROBEBRIGHT, SLOWDARK, true); + break; + + case dLight_StrobeFastSync: + Create(sector, STROBEBRIGHT, FASTDARK, true); + break; + + case dLight_FireFlicker: + Create(sector); + break; + + case dScroll_EastLavaDamage: + Create(sector, STROBEBRIGHT, FASTDARK, false); + break; + + case sLight_Strobe_Hurt: + Create(sector, STROBEBRIGHT, FASTDARK, false); + break; + + default: + break; + } +} + +///////////////////////////// +// +// P_GetPushThing() returns a pointer to an MT_PUSH or MT_PULL thing, +// NULL otherwise. + +AActor *MapLoader::GetPushThing(int s) +{ + AActor* thing; + sector_t* sec; + + sec = &Level->sectors[s]; + thing = sec->thinglist; + + while (thing && + thing->GetClass()->TypeName != NAME_PointPusher && + thing->GetClass()->TypeName != NAME_PointPuller) + { + thing = thing->snext; + } + return thing; +} + +///////////////////////////// +// +// Initialize the sectors where pushers are present +// + +void MapLoader::SpawnPushers() +{ + line_t *l = &Level->lines[0]; + int s; + + for (unsigned i = 0; i < Level->lines.Size(); i++, l++) + { + switch (l->special) + { + case Sector_SetWind: // wind + { + auto itr = Level->GetSectorTagIterator(l->args[0]); + while ((s = itr.Next()) >= 0) + Create(DPusher::p_wind, l->args[3] ? l : nullptr, l->args[1], l->args[2], nullptr, s); + l->special = 0; + break; + } + + case Sector_SetCurrent: // current + { + auto itr = Level->GetSectorTagIterator(l->args[0]); + while ((s = itr.Next()) >= 0) + Create(DPusher::p_current, l->args[3] ? l : nullptr, l->args[1], l->args[2], nullptr, s); + l->special = 0; + break; + } + + case PointPush_SetForce: // push/pull + if (l->args[0]) { // [RH] Find thing by sector + auto itr = Level->GetSectorTagIterator(l->args[0]); + while ((s = itr.Next()) >= 0) + { + AActor *thing = GetPushThing(s); + if (thing) { // No MT_P* means no effect + // [RH] Allow narrowing it down by tid + if (!l->args[1] || l->args[1] == thing->tid) + Create(DPusher::p_push, l->args[3] ? l : NULL, l->args[2], + 0, thing, s); + } + } + } + else { // [RH] Find thing by tid + AActor *thing; + auto iterator = Level->GetActorIterator(l->args[1]); + + while ((thing = iterator.Next())) + { + if (thing->GetClass()->TypeName == NAME_PointPusher || + thing->GetClass()->TypeName == NAME_PointPuller) + { + Create(DPusher::p_push, l->args[3] ? l : NULL, l->args[2], 0, thing, thing->Sector->Index()); + } + } + } + l->special = 0; + break; + } + } +} + +//----------------------------------------------------------------------------- +// +// Initialize the scrollers +// +//----------------------------------------------------------------------------- + +void MapLoader::SpawnScrollers() +{ + auto SCROLLTYPE = [](int i) { return EScrollPos((i <= 0) || (i & ~7) ? 7 : i); }; + + line_t *l = &Level->lines[0]; + side_t *side; + TArray copyscrollers; + + for (auto &line : Level->lines) + { + if (line.special == Sector_CopyScroller) + { + // don't allow copying the scroller if the sector has the same tag as it would just duplicate it. + if (!Level->SectorHasTag(line.frontsector, line.args[0])) + { + copyscrollers.Push(line.Index()); + } + line.special = 0; + } + } + + for (unsigned i = 0; i < Level->lines.Size(); i++, l++) + { + double dx; // direction and speed of scrolling + double dy; + sector_t *control = nullptr; + int accel = 0; // no control sector or acceleration + int special = l->special; + + // Check for undefined parameters that are non-zero and output messages for them. + // We don't report for specials we don't understand. + FLineSpecial *spec = P_GetLineSpecialInfo(special); + if (spec != nullptr) + { + int max = spec->map_args; + for (unsigned arg = max; arg < countof(l->args); ++arg) + { + if (l->args[arg] != 0) + { + Printf("Line %d (type %d:%s), arg %u is %d (should be 0)\n", + i, special, spec->name, arg + 1, l->args[arg]); + } + } + } + + // killough 3/7/98: Types 245-249 are same as 250-254 except that the + // first side's sector's heights cause scrolling when they change, and + // this linedef controls the direction and speed of the scrolling. The + // most complicated linedef since donuts, but powerful :) + // + // killough 3/15/98: Add acceleration. Types 214-218 are the same but + // are accelerative. + + // [RH] Assume that it's a scroller and zero the line's special. + l->special = 0; + + dx = dy = 0; // Shut up, GCC + + if (special == Scroll_Ceiling || + special == Scroll_Floor || + special == Scroll_Texture_Model) + { + if (l->args[1] & 3) + { + // if 1, then displacement + // if 2, then accelerative (also if 3) + control = l->sidedef[0]->sector; + if (l->args[1] & 2) + accel = 1; + } + if (special == Scroll_Texture_Model || l->args[1] & 4) + { + // The line housing the special controls the + // direction and speed of scrolling. + dx = l->Delta().X / 32.; + dy = l->Delta().Y / 32.; + } + else + { + // The speed and direction are parameters to the special. + dx = (l->args[3] - 128) / 32.; + dy = (l->args[4] - 128) / 32.; + } + } + + switch (special) + { + int s; + + case Scroll_Ceiling: + { + auto itr = Level->GetSectorTagIterator(l->args[0]); + while ((s = itr.Next()) >= 0) + { + Create(EScroll::sc_ceiling, -dx, dy, control, &Level->sectors[s], nullptr, accel); + } + for (unsigned j = 0; j < copyscrollers.Size(); j++) + { + line_t *line = &Level->lines[copyscrollers[j]]; + + if (line->args[0] == l->args[0] && (line->args[1] & 1)) + { + Create(EScroll::sc_ceiling, -dx, dy, control, line->frontsector, nullptr, accel); + } + } + break; + } + + case Scroll_Floor: + if (l->args[2] != 1) + { // scroll the floor texture + auto itr = Level->GetSectorTagIterator(l->args[0]); + while ((s = itr.Next()) >= 0) + { + Create(EScroll::sc_floor, -dx, dy, control, &Level->sectors[s], nullptr, accel); + } + for (unsigned j = 0; j < copyscrollers.Size(); j++) + { + line_t *line = &Level->lines[copyscrollers[j]]; + + if (line->args[0] == l->args[0] && (line->args[1] & 2)) + { + Create(EScroll::sc_floor, -dx, dy, control, line->frontsector, nullptr, accel); + } + } + } + + if (l->args[2] > 0) + { // carry objects on the floor + auto itr = Level->GetSectorTagIterator(l->args[0]); + while ((s = itr.Next()) >= 0) + { + Create(EScroll::sc_carry, dx, dy, control, &Level->sectors[s], nullptr, accel); + } + for (unsigned j = 0; j < copyscrollers.Size(); j++) + { + line_t *line = &Level->lines[copyscrollers[j]]; + + if (line->args[0] == l->args[0] && (line->args[1] & 4)) + { + Create(EScroll::sc_carry, dx, dy, control, line->frontsector, nullptr, accel); + } + } + } + break; + + // killough 3/1/98: scroll wall according to linedef + // (same direction and speed as scrolling floors) + case Scroll_Texture_Model: + { + auto itr = Level->GetLineIdIterator(l->args[0]); + while ((s = itr.Next()) >= 0) + { + if (s != (int)i) + Create(dx, dy, &Level->lines[s], control, accel); + } + break; + } + + case Scroll_Texture_Offsets: + // killough 3/2/98: scroll according to sidedef offsets + side = Level->lines[i].sidedef[0]; + Create(EScroll::sc_side, -side->GetTextureXOffset(side_t::mid), + side->GetTextureYOffset(side_t::mid), nullptr, nullptr, side, accel, SCROLLTYPE(l->args[0])); + break; + + case Scroll_Texture_Left: + l->special = special; // Restore the special, for compat_useblocking's benefit. + side = Level->lines[i].sidedef[0]; + Create(EScroll::sc_side, l->args[0] / 64., 0, nullptr, nullptr, side, accel, SCROLLTYPE(l->args[1])); + break; + + case Scroll_Texture_Right: + l->special = special; + side = Level->lines[i].sidedef[0]; + Create(EScroll::sc_side, -l->args[0] / 64., 0, nullptr, nullptr, side, accel, SCROLLTYPE(l->args[1])); + break; + + case Scroll_Texture_Up: + l->special = special; + side = Level->lines[i].sidedef[0]; + Create(EScroll::sc_side, 0, l->args[0] / 64., nullptr, nullptr, side, accel, SCROLLTYPE(l->args[1])); + break; + + case Scroll_Texture_Down: + l->special = special; + side = Level->lines[i].sidedef[0]; + Create(EScroll::sc_side, 0, -l->args[0] / 64., nullptr, nullptr, side, accel, SCROLLTYPE(l->args[1])); + break; + + case Scroll_Texture_Both: + side = Level->lines[i].sidedef[0]; + if (l->args[0] == 0) { + dx = (l->args[1] - l->args[2]) / 64.; + dy = (l->args[4] - l->args[3]) / 64.; + Create(EScroll::sc_side, dx, dy, nullptr, nullptr, side, accel); + } + break; + + default: + // [RH] It wasn't a scroller after all, so restore the special. + l->special = special; + break; + } + } +} + + +void MapLoader::CreateScroller(EScroll type, double dx, double dy, sector_t *affectee, int accel, EScrollPos scrollpos) +{ + Create(type, dx, dy, nullptr, affectee, nullptr, accel, scrollpos); +} diff --git a/src/p_3dfloors.cpp b/src/p_3dfloors.cpp index c4b2d4cb1..e71038fda 100644 --- a/src/p_3dfloors.cpp +++ b/src/p_3dfloors.cpp @@ -106,7 +106,7 @@ void F3DFloor::UpdateColormap(FColormap &map) // Add one 3D floor to the sector // //========================================================================== -static void P_Add3DFloor(sector_t* sec, sector_t* sec2, line_t* master, int flags, int alpha) +void P_Add3DFloor(sector_t* sec, sector_t* sec2, line_t* master, int flags, int alpha) { F3DFloor* ffloor; unsigned i; @@ -778,156 +778,6 @@ void P_LineOpening_XFloors (FLineOpening &open, AActor * thing, const line_t *li } } -//========================================================================== -// -// Creates all 3D floors defined by one linedef -// -//========================================================================== -int MapLoader::Set3DFloor(line_t * line, int param, int param2, int alpha) -{ - int s; - int flags; - int tag = line->args[0]; - sector_t * sec = line->frontsector, *ss; - - auto itr = Level->GetSectorTagIterator(tag); - while ((s = itr.Next()) >= 0) - { - ss = &Level->sectors[s]; - - if (param == 0) - { - flags = FF_EXISTS | FF_RENDERALL | FF_SOLID | FF_INVERTSECTOR; - alpha = 255; - for (auto l: sec->Lines) - { - if (l->special == Sector_SetContents && l->frontsector == sec) - { - alpha = clamp(l->args[1], 0, 100); - if (l->args[2] & 1) flags &= ~FF_SOLID; - if (l->args[2] & 2) flags |= FF_SEETHROUGH; - if (l->args[2] & 4) flags |= FF_SHOOTTHROUGH; - if (l->args[2] & 8) flags |= FF_ADDITIVETRANS; - if (alpha != 100) flags |= FF_TRANSLUCENT;//|FF_BOTHPLANES|FF_ALLSIDES; - if (l->args[0]) - { - // Yes, Vavoom's 3D-floor definitions suck! - // The content list changed in r1783 of Vavoom to be unified - // among all its supported games, so it has now ten different - // values instead of just five. - static uint32_t vavoomcolors[] = { VC_EMPTY, - VC_WATER, VC_LAVA, VC_NUKAGE, VC_SLIME, VC_HELLSLIME, - VC_BLOOD, VC_SLUDGE, VC_HAZARD, VC_BOOMWATER }; - flags |= FF_SWIMMABLE | FF_BOTHPLANES | FF_ALLSIDES | FF_FLOOD; - - l->frontsector->Colormap.FadeColor = vavoomcolors[l->args[0]] & VC_COLORMASK; - l->frontsector->Colormap.FogDensity = 0; - } - alpha = (alpha * 255) / 100; - break; - } - } - } - else if (param == 4) - { - flags = FF_EXISTS | FF_RENDERPLANES | FF_INVERTPLANES | FF_NOSHADE | FF_FIX; - if (param2 & 1) flags |= FF_SEETHROUGH; // marker for allowing missing texture checks - alpha = 255; - } - else - { - static const int defflags[] = { 0, - FF_SOLID, - FF_SWIMMABLE | FF_BOTHPLANES | FF_ALLSIDES | FF_SHOOTTHROUGH | FF_SEETHROUGH, - FF_SHOOTTHROUGH | FF_SEETHROUGH, - }; - - flags = defflags[param & 3] | FF_EXISTS | FF_RENDERALL; - - if (param & 4) flags |= FF_ALLSIDES | FF_BOTHPLANES; - if (param & 16) flags ^= FF_SEETHROUGH; - if (param & 32) flags ^= FF_SHOOTTHROUGH; - - if (param2 & 1) flags |= FF_NOSHADE; - if (param2 & 2) flags |= FF_DOUBLESHADOW; - if (param2 & 4) flags |= FF_FOG; - if (param2 & 8) flags |= FF_THINFLOOR; - if (param2 & 16) flags |= FF_UPPERTEXTURE; - if (param2 & 32) flags |= FF_LOWERTEXTURE; - if (param2 & 64) flags |= FF_ADDITIVETRANS | FF_TRANSLUCENT; - // if flooding is used the floor must be non-solid and is automatically made shootthrough and seethrough - if ((param2 & 128) && !(flags & FF_SOLID)) flags |= FF_FLOOD | FF_SEETHROUGH | FF_SHOOTTHROUGH; - if (param2 & 512) flags |= FF_FADEWALLS; - if (param2&1024) flags |= FF_RESET; - FTextureID tex = line->sidedef[0]->GetTexture(side_t::top); - if (!tex.Exists() && alpha < 255) - { - alpha = -tex.GetIndex(); - } - alpha = clamp(alpha, 0, 255); - if (alpha == 0) flags &= ~(FF_RENDERALL | FF_BOTHPLANES | FF_ALLSIDES); - else if (alpha != 255) flags |= FF_TRANSLUCENT; - - } - P_Add3DFloor(ss, sec, line, flags, alpha); - } - // To be 100% safe this should be done even if the alpha by texture value isn't used. - if (!line->sidedef[0]->GetTexture(side_t::top).isValid()) - line->sidedef[0]->SetTexture(side_t::top, FNullTextureID()); - return 1; -} - -//========================================================================== -// -// Spawns 3D floors -// -//========================================================================== -void MapLoader::Spawn3DFloors () -{ - static int flagvals[] = {512, 2+512, 512+1024}; - - for (auto &line : Level->lines) - { - switch(line.special) - { - case ExtraFloor_LightOnly: - if (line.args[1] < 0 || line.args[1] > 2) line.args[1] = 0; - if (line.args[0] != 0) - Set3DFloor(&line, 3, flagvals[line.args[1]], 0); - break; - - case Sector_Set3DFloor: - // The flag high-byte/line id is only needed in Hexen format. - // UDMF can set both of these parameters without any restriction of the usable values. - // 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 (line.args[1]&8) - { - Level->tagManager.AddLineID(line.Index(), line.args[4]); - } - else - { - line.args[0]+=256*line.args[4]; - line.args[4]=0; - } - } - Set3DFloor(&line, line.args[1]&~8, line.args[2], line.args[3]); - break; - - default: - continue; - } - line.special=0; - line.args[0] = line.args[1] = line.args[2] = line.args[3] = line.args[4] = 0; - } - - for (auto &sec : Level->sectors) - { - P_Recalculate3DFloors(&sec); - } -} - //========================================================================== // diff --git a/src/p_3dfloors.h b/src/p_3dfloors.h index d0f4f500a..5a8abb807 100644 --- a/src/p_3dfloors.h +++ b/src/p_3dfloors.h @@ -136,4 +136,6 @@ void P_LineOpening_XFloors (FLineOpening &open, AActor * thing, const line_t *li secplane_t P_FindFloorPlane(sector_t * sector, const DVector3 &pos); int P_Find3DFloor(sector_t * sec, const DVector3 &pos, bool above, bool floor, double &cmpz); +void P_Add3DFloor(sector_t* sec, sector_t* sec2, line_t* master, int flags, int alpha); + #endif \ No newline at end of file diff --git a/src/p_lights.cpp b/src/p_lights.cpp index f36fde90c..43bd6beff 100644 --- a/src/p_lights.cpp +++ b/src/p_lights.cpp @@ -38,6 +38,7 @@ #include "p_maputl.h" #include "g_levellocals.h" #include "maploader/maploader.h" +#include "p_spec_thinkers.h" // State. #include "serializer.h" @@ -48,132 +49,6 @@ static FRandom pr_strobeflash ("StrobeFlash"); static FRandom pr_fireflicker ("FireFlicker"); -class DFireFlicker : public DLighting -{ - DECLARE_CLASS(DFireFlicker, DLighting) -public: - DFireFlicker(sector_t *sector); - DFireFlicker(sector_t *sector, int upper, int lower); - void Serialize(FSerializer &arc); - void Tick(); -protected: - int m_Count; - int m_MaxLight; - int m_MinLight; -private: - DFireFlicker(); -}; - -class DFlicker : public DLighting -{ - DECLARE_CLASS(DFlicker, DLighting) -public: - DFlicker(sector_t *sector, int upper, int lower); - void Serialize(FSerializer &arc); - void Tick(); -protected: - int m_Count; - int m_MaxLight; - int m_MinLight; -private: - DFlicker(); -}; - -class DLightFlash : public DLighting -{ - DECLARE_CLASS(DLightFlash, DLighting) -public: - DLightFlash(sector_t *sector); - DLightFlash(sector_t *sector, int min, int max); - void Serialize(FSerializer &arc); - void Tick(); -protected: - int m_Count; - int m_MaxLight; - int m_MinLight; - int m_MaxTime; - int m_MinTime; -private: - DLightFlash(); -}; - -class DStrobe : public DLighting -{ - DECLARE_CLASS(DStrobe, DLighting) -public: - DStrobe(sector_t *sector, int utics, int ltics, bool inSync); - DStrobe(sector_t *sector, int upper, int lower, int utics, int ltics); - void Serialize(FSerializer &arc); - void Tick(); -protected: - int m_Count; - int m_MinLight; - int m_MaxLight; - int m_DarkTime; - int m_BrightTime; -private: - DStrobe(); -}; - -class DGlow : public DLighting -{ - DECLARE_CLASS(DGlow, DLighting) -public: - DGlow(sector_t *sector); - void Serialize(FSerializer &arc); - void Tick(); -protected: - int m_MinLight; - int m_MaxLight; - int m_Direction; -private: - DGlow(); -}; - -// [RH] Glow from Light_Glow and Light_Fade specials -class DGlow2 : public DLighting -{ - DECLARE_CLASS(DGlow2, DLighting) -public: - DGlow2(sector_t *sector, int start, int end, int tics, bool oneshot); - void Serialize(FSerializer &arc); - void Tick(); -protected: - int m_Start; - int m_End; - int m_MaxTics; - int m_Tics; - bool m_OneShot; -private: - DGlow2(); -}; - -// [RH] Phased light thinker -class DPhased : public DLighting -{ - DECLARE_CLASS(DPhased, DLighting) -public: - DPhased(sector_t *sector); - DPhased(sector_t *sector, int baselevel, int phase); - // These are for internal use only but the Create template needs access to them. - DPhased(); - DPhased(sector_t *sector, int baselevel); - - void Serialize(FSerializer &arc); - void Tick(); -protected: - uint8_t m_BaseLevel; - uint8_t m_Phase; -private: - int PhaseHelper(sector_t *sector, int index, int light, sector_t *prev); -}; - -#define GLOWSPEED 8 -#define STROBEBRIGHT 5 -#define FASTDARK 15 -#define SLOWDARK TICRATE - - //----------------------------------------------------------------------------- // // @@ -694,6 +569,7 @@ void DGlow::Serialize(FSerializer &arc) void DGlow::Tick () { + const int GLOWSPEED = 8; int newlight = m_Sector->lightlevel; switch (m_Direction) @@ -998,61 +874,3 @@ void EV_StopLightEffect (int tag) } -void MapLoader::SpawnLights(sector_t *sector) -{ - switch (sector->special) - { - case Light_Phased: - Create(sector, 48, 63 - (sector->lightlevel & 63)); - break; - - // [RH] Hexen-like phased lighting - case LightSequenceStart: - Create(sector); - break; - - case dLight_Flicker: - Create(sector); - break; - - case dLight_StrobeFast: - Create(sector, STROBEBRIGHT, FASTDARK, false); - break; - - case dLight_StrobeSlow: - Create(sector, STROBEBRIGHT, SLOWDARK, false); - break; - - case dLight_Strobe_Hurt: - Create(sector, STROBEBRIGHT, FASTDARK, false); - break; - - case dLight_Glow: - Create(sector); - break; - - case dLight_StrobeSlowSync: - Create(sector, STROBEBRIGHT, SLOWDARK, true); - break; - - case dLight_StrobeFastSync: - Create(sector, STROBEBRIGHT, FASTDARK, true); - break; - - case dLight_FireFlicker: - Create(sector); - break; - - case dScroll_EastLavaDamage: - Create(sector, STROBEBRIGHT, FASTDARK, false); - break; - - case sLight_Strobe_Hurt: - Create(sector, STROBEBRIGHT, FASTDARK, false); - break; - - default: - break; - } -} - diff --git a/src/p_pusher.cpp b/src/p_pusher.cpp index bbe135bd1..b8d079dda 100644 --- a/src/p_pusher.cpp +++ b/src/p_pusher.cpp @@ -36,49 +36,11 @@ #include "d_player.h" #include "g_levellocals.h" #include "actorinlines.h" +#include "p_spec_thinkers.h" #include "maploader/maploader.h" CVAR(Bool, var_pushers, true, CVAR_SERVERINFO); -// phares 3/20/98: added new model of Pushers for push/pull effects - -class DPusher : public DThinker -{ - DECLARE_CLASS (DPusher, DThinker) - HAS_OBJECT_POINTERS -public: - enum EPusher - { - p_push, - p_pull, - p_wind, - p_current - }; - - DPusher (); - DPusher (EPusher type, line_t *l, int magnitude, int angle, AActor *source, int affectee); - void Serialize(FSerializer &arc); - int CheckForSectorMatch (EPusher type, int tag); - void ChangeValues (int magnitude, int angle) - { - DAngle ang = angle * (360. / 256.); - m_PushVec = ang.ToVector(magnitude); - m_Magnitude = magnitude; - } - - void Tick (); - -protected: - EPusher m_Type; - TObjPtr m_Source;// Point source if point pusher - DVector2 m_PushVec; - double m_Magnitude; // Vector strength for point pusher - double m_Radius; // Effective radius for point pusher - int m_Affectee; // Number of affected sector - - friend bool PIT_PushThing (AActor *thing); -}; - IMPLEMENT_CLASS(DPusher, false, true) IMPLEMENT_POINTERS_START(DPusher) @@ -334,113 +296,28 @@ void DPusher::Tick () } } -///////////////////////////// -// -// P_GetPushThing() returns a pointer to an MT_PUSH or MT_PULL thing, -// NULL otherwise. -AActor *MapLoader::GetPushThing (int s) +void AdjustPusher(int tag, int magnitude, int angle, bool wind) { - AActor* thing; - sector_t* sec; + DPusher::EPusher type = wind ? DPusher::p_wind : DPusher::p_current; - sec = &Level->sectors[s]; - thing = sec->thinglist; - - while (thing && - thing->GetClass()->TypeName != NAME_PointPusher && - thing->GetClass()->TypeName != NAME_PointPuller) - { - thing = thing->snext; - } - return thing; -} - -///////////////////////////// -// -// Initialize the sectors where pushers are present -// - -void MapLoader::SpawnPushers () -{ - line_t *l = &Level->lines[0]; - int s; - - for (unsigned i = 0; i < Level->lines.Size(); i++, l++) - { - switch (l->special) - { - case Sector_SetWind: // wind - { - auto itr = Level->GetSectorTagIterator(l->args[0]); - while ((s = itr.Next()) >= 0) - Create(DPusher::p_wind, l->args[3] ? l : nullptr, l->args[1], l->args[2], nullptr, s); - l->special = 0; - break; - } - - case Sector_SetCurrent: // current - { - auto itr = Level->GetSectorTagIterator(l->args[0]); - while ((s = itr.Next()) >= 0) - Create(DPusher::p_current, l->args[3] ? l : nullptr, l->args[1], l->args[2], nullptr, s); - l->special = 0; - break; - } - - case PointPush_SetForce: // push/pull - if (l->args[0]) { // [RH] Find thing by sector - auto itr = Level->GetSectorTagIterator(l->args[0]); - while ((s = itr.Next()) >= 0) - { - AActor *thing = GetPushThing (s); - if (thing) { // No MT_P* means no effect - // [RH] Allow narrowing it down by tid - if (!l->args[1] || l->args[1] == thing->tid) - Create (DPusher::p_push, l->args[3] ? l : NULL, l->args[2], - 0, thing, s); - } - } - } else { // [RH] Find thing by tid - AActor *thing; - auto iterator = Level->GetActorIterator(l->args[1]); - - while ( (thing = iterator.Next ()) ) - { - if (thing->GetClass()->TypeName == NAME_PointPusher || - thing->GetClass()->TypeName == NAME_PointPuller) - { - Create (DPusher::p_push, l->args[3] ? l : NULL, l->args[2], 0, thing, thing->Sector->Index()); - } - } - } - l->special = 0; - break; - } - } -} - -void AdjustPusher (int tag, int magnitude, int angle, bool wind) -{ - DPusher::EPusher type = wind? DPusher::p_wind : DPusher::p_current; - // Find pushers already attached to the sector, and change their parameters. TArray Collection; { TThinkerIterator iterator; FThinkerCollection collect; - while ( (collect.Obj = iterator.Next ()) ) + while ((collect.Obj = iterator.Next())) { - if ((collect.RefNum = ((DPusher *)collect.Obj)->CheckForSectorMatch (type, tag)) >= 0) + if ((collect.RefNum = ((DPusher *)collect.Obj)->CheckForSectorMatch(type, tag)) >= 0) { - ((DPusher *)collect.Obj)->ChangeValues (magnitude, angle); - Collection.Push (collect); + ((DPusher *)collect.Obj)->ChangeValues(magnitude, angle); + Collection.Push(collect); } } } - size_t numcollected = Collection.Size (); + size_t numcollected = Collection.Size(); int secnum; // Now create pushers for any sectors that don't already have them. @@ -455,7 +332,7 @@ void AdjustPusher (int tag, int magnitude, int angle, bool wind) } if (i == numcollected) { - Create (type, nullptr, magnitude, angle, nullptr, secnum); + Create(type, nullptr, magnitude, angle, nullptr, secnum); } } } diff --git a/src/p_scroll.cpp b/src/p_scroll.cpp index 5e24b09d2..649b8afe8 100644 --- a/src/p_scroll.cpp +++ b/src/p_scroll.cpp @@ -63,50 +63,7 @@ #include "r_data/r_interpolate.h" #include "g_levellocals.h" #include "maploader/maploader.h" - -//----------------------------------------------------------------------------- -// -// killough 3/7/98: Add generalized scroll effects -// -//----------------------------------------------------------------------------- - -class DScroller : public DThinker -{ - DECLARE_CLASS (DScroller, DThinker) - HAS_OBJECT_POINTERS -public: - - DScroller(EScroll type, double dx, double dy, sector_t *control, sector_t *sec, side_t *side, int accel, EScrollPos scrollpos = EScrollPos::scw_all); - DScroller (double dx, double dy, const line_t *l, sector_t *control, int accel, EScrollPos scrollpos = EScrollPos::scw_all); - void OnDestroy() override; - - void Serialize(FSerializer &arc); - void Tick (); - - bool AffectsWall (side_t * wall) const { return m_Side == wall; } - side_t *GetWall () const { return m_Side; } - sector_t *GetSector() const { return m_Sector; } - void SetRate (double dx, double dy) { m_dx = dx; m_dy = dy; } - bool IsType (EScroll type) const { return type == m_Type; } - EScrollPos GetScrollParts() const { return m_Parts; } - -protected: - EScroll m_Type; // Type of scroll effect - double m_dx, m_dy; // (dx,dy) scroll speeds - sector_t *m_Sector; // Affected sector - side_t *m_Side; // ... or side - sector_t *m_Controller; // Control sector (nullptr if none) used to control scrolling - double m_LastHeight; // Last known height of control sector - double m_vdx, m_vdy; // Accumulated velocity if accelerative - int m_Accel; // Whether it's accelerative - EScrollPos m_Parts; // Which parts of a sidedef are being scrolled? - TObjPtr m_Interpolations[3]; - -private: - DScroller () - { - } -}; +#include "p_spec_thinkers.h" IMPLEMENT_CLASS(DScroller, false, true) @@ -412,221 +369,6 @@ DScroller::DScroller (double dx, double dy, const line_t *l, sector_t * control, } } -// Amount (dx,dy) vector linedef is shifted right to get scroll amount -#define SCROLL_SHIFT 5 -#define SCROLLTYPE(i) EScrollPos(((i) <= 0) || ((i) & ~7) ? 7 : (i)) - -//----------------------------------------------------------------------------- -// -// Initialize the scrollers -// -//----------------------------------------------------------------------------- - -void MapLoader::SpawnScrollers() -{ - line_t *l = &Level->lines[0]; - side_t *side; - TArray copyscrollers; - - for (auto &line : Level->lines) - { - if (line.special == Sector_CopyScroller) - { - // don't allow copying the scroller if the sector has the same tag as it would just duplicate it. - if (!Level->SectorHasTag(line.frontsector, line.args[0])) - { - copyscrollers.Push(line.Index()); - } - line.special = 0; - } - } - - for (unsigned i = 0; i < Level->lines.Size(); i++, l++) - { - double dx; // direction and speed of scrolling - double dy; - sector_t *control = nullptr; - int accel = 0; // no control sector or acceleration - int special = l->special; - - // Check for undefined parameters that are non-zero and output messages for them. - // We don't report for specials we don't understand. - FLineSpecial *spec = P_GetLineSpecialInfo(special); - if (spec != nullptr) - { - int max = spec->map_args; - for (unsigned arg = max; arg < countof(l->args); ++arg) - { - if (l->args[arg] != 0) - { - Printf("Line %d (type %d:%s), arg %u is %d (should be 0)\n", - i, special, spec->name, arg+1, l->args[arg]); - } - } - } - - // killough 3/7/98: Types 245-249 are same as 250-254 except that the - // first side's sector's heights cause scrolling when they change, and - // this linedef controls the direction and speed of the scrolling. The - // most complicated linedef since donuts, but powerful :) - // - // killough 3/15/98: Add acceleration. Types 214-218 are the same but - // are accelerative. - - // [RH] Assume that it's a scroller and zero the line's special. - l->special = 0; - - dx = dy = 0; // Shut up, GCC - - if (special == Scroll_Ceiling || - special == Scroll_Floor || - special == Scroll_Texture_Model) - { - if (l->args[1] & 3) - { - // if 1, then displacement - // if 2, then accelerative (also if 3) - control = l->sidedef[0]->sector; - if (l->args[1] & 2) - accel = 1; - } - if (special == Scroll_Texture_Model || l->args[1] & 4) - { - // The line housing the special controls the - // direction and speed of scrolling. - dx = l->Delta().X / 32.; - dy = l->Delta().Y / 32.; - } - else - { - // The speed and direction are parameters to the special. - dx = (l->args[3] - 128) / 32.; - dy = (l->args[4] - 128) / 32.; - } - } - - switch (special) - { - int s; - - case Scroll_Ceiling: - { - auto itr = Level->GetSectorTagIterator(l->args[0]); - while ((s = itr.Next()) >= 0) - { - Create(EScroll::sc_ceiling, -dx, dy, control, &Level->sectors[s], nullptr, accel); - } - for (unsigned j = 0; j < copyscrollers.Size(); j++) - { - line_t *line = &Level->lines[copyscrollers[j]]; - - if (line->args[0] == l->args[0] && (line->args[1] & 1)) - { - Create(EScroll::sc_ceiling, -dx, dy, control, line->frontsector, nullptr, accel); - } - } - break; - } - - case Scroll_Floor: - if (l->args[2] != 1) - { // scroll the floor texture - auto itr = Level->GetSectorTagIterator(l->args[0]); - while ((s = itr.Next()) >= 0) - { - Create (EScroll::sc_floor, -dx, dy, control, &Level->sectors[s], nullptr, accel); - } - for(unsigned j = 0;j < copyscrollers.Size(); j++) - { - line_t *line = &Level->lines[copyscrollers[j]]; - - if (line->args[0] == l->args[0] && (line->args[1] & 2)) - { - Create(EScroll::sc_floor, -dx, dy, control, line->frontsector, nullptr, accel); - } - } - } - - if (l->args[2] > 0) - { // carry objects on the floor - auto itr = Level->GetSectorTagIterator(l->args[0]); - while ((s = itr.Next()) >= 0) - { - Create (EScroll::sc_carry, dx, dy, control, &Level->sectors[s], nullptr, accel); - } - for(unsigned j = 0;j < copyscrollers.Size(); j++) - { - line_t *line = &Level->lines[copyscrollers[j]]; - - if (line->args[0] == l->args[0] && (line->args[1] & 4)) - { - Create (EScroll::sc_carry, dx, dy, control, line->frontsector, nullptr, accel); - } - } - } - break; - - // killough 3/1/98: scroll wall according to linedef - // (same direction and speed as scrolling floors) - case Scroll_Texture_Model: - { - auto itr = Level->GetLineIdIterator(l->args[0]); - while ((s = itr.Next()) >= 0) - { - if (s != (int)i) - Create(dx, dy, &Level->lines[s], control, accel); - } - break; - } - - case Scroll_Texture_Offsets: - // killough 3/2/98: scroll according to sidedef offsets - side = Level->lines[i].sidedef[0]; - Create (EScroll::sc_side, -side->GetTextureXOffset(side_t::mid), - side->GetTextureYOffset(side_t::mid), nullptr, nullptr, side, accel, SCROLLTYPE(l->args[0])); - break; - - case Scroll_Texture_Left: - l->special = special; // Restore the special, for compat_useblocking's benefit. - side = Level->lines[i].sidedef[0]; - Create (EScroll::sc_side, l->args[0] / 64., 0, nullptr, nullptr, side, accel, SCROLLTYPE(l->args[1])); - break; - - case Scroll_Texture_Right: - l->special = special; - side = Level->lines[i].sidedef[0]; - Create (EScroll::sc_side, -l->args[0] / 64., 0, nullptr, nullptr, side, accel, SCROLLTYPE(l->args[1])); - break; - - case Scroll_Texture_Up: - l->special = special; - side = Level->lines[i].sidedef[0]; - Create (EScroll::sc_side, 0, l->args[0] / 64., nullptr, nullptr, side, accel, SCROLLTYPE(l->args[1])); - break; - - case Scroll_Texture_Down: - l->special = special; - side = Level->lines[i].sidedef[0]; - Create (EScroll::sc_side, 0, -l->args[0] / 64., nullptr, nullptr, side, accel, SCROLLTYPE(l->args[1])); - break; - - case Scroll_Texture_Both: - side = Level->lines[i].sidedef[0]; - if (l->args[0] == 0) { - dx = (l->args[1] - l->args[2]) / 64.; - dy = (l->args[4] - l->args[3]) / 64.; - Create (EScroll::sc_side, dx, dy, nullptr, nullptr, side, accel); - } - break; - - default: - // [RH] It wasn't a scroller after all, so restore the special. - l->special = special; - break; - } - } -} - //----------------------------------------------------------------------------- // // Modify a wall scroller @@ -733,8 +475,3 @@ void SetScroller (FLevelLocals *Level, int tag, EScroll type, double dx, double Create (type, dx, dy, nullptr, &Level->sectors[i], nullptr, 0); } } - -void MapLoader::CreateScroller(EScroll type, double dx, double dy, sector_t *affectee, int accel, EScrollPos scrollpos) -{ - Create(type, dx, dy, nullptr, affectee, nullptr, accel, scrollpos); -} diff --git a/src/p_spec.cpp b/src/p_spec.cpp index 0611627c8..d84f36074 100644 --- a/src/p_spec.cpp +++ b/src/p_spec.cpp @@ -98,7 +98,7 @@ #include "p_setup.h" #include "c_console.h" -#include "maploader/maploader.h" +#include "p_spec_thinkers.h" static FRandom pr_playerinspecialsector ("PlayerInSpecialSector"); @@ -709,25 +709,6 @@ CUSTOM_CVAR (Bool, forcewater, false, CVAR_ARCHIVE|CVAR_SERVERINFO) } } -class DLightTransfer : public DThinker -{ - DECLARE_CLASS (DLightTransfer, DThinker) - - DLightTransfer() {} -public: - DLightTransfer (sector_t *srcSec, int target, bool copyFloor); - void Serialize(FSerializer &arc); - void Tick (); - -protected: - void DoTransfer (int level, int target, bool floor); - - sector_t *Source; - int TargetTag; - bool CopyFloor; - short LastLight; -}; - IMPLEMENT_CLASS(DLightTransfer, false, false) void DLightTransfer::Serialize(FSerializer &arc) @@ -795,31 +776,6 @@ void DLightTransfer::DoTransfer (int llevel, int target, bool floor) } -class DWallLightTransfer : public DThinker -{ - enum - { - WLF_SIDE1=1, - WLF_SIDE2=2, - WLF_NOFAKECONTRAST=4 - }; - - DECLARE_CLASS (DWallLightTransfer, DThinker) - DWallLightTransfer() {} -public: - DWallLightTransfer (sector_t *srcSec, int target, uint8_t flags); - void Serialize(FSerializer &arc); - void Tick (); - -protected: - void DoTransfer (short level, int target, uint8_t flags); - - sector_t *Source; - int TargetID; - short LastLight; - uint8_t Flags; -}; - IMPLEMENT_CLASS(DWallLightTransfer, false, false) void DWallLightTransfer::Serialize(FSerializer &arc) @@ -900,611 +856,6 @@ void DWallLightTransfer::DoTransfer (short lightlevel, int target, uint8_t flags } } -//----------------------------------------------------------------------------- -// -// Portals -// -//----------------------------------------------------------------------------- - -//--------------------------------------------------------------------------- -// Upper stacks go in the top sector. Lower stacks go in the bottom sector. - -void MapLoader::SetupFloorPortal (AActor *point) -{ - auto it = Level->GetActorIterator(NAME_LowerStackLookOnly, point->tid); - sector_t *Sector = point->Sector; - auto skyv = it.Next(); - if (skyv != nullptr) - { - skyv->target = point; - if (Sector->GetAlpha(sector_t::floor) == 1.) - Sector->SetAlpha(sector_t::floor, clamp(point->args[0], 0, 255) / 255.); - - Sector->Portals[sector_t::floor] = P_GetStackPortal(skyv, sector_t::floor); - } -} - -void MapLoader::SetupCeilingPortal (AActor *point) -{ - auto it = Level->GetActorIterator(NAME_UpperStackLookOnly, point->tid); - sector_t *Sector = point->Sector; - auto skyv = it.Next(); - if (skyv != nullptr) - { - skyv->target = point; - if (Sector->GetAlpha(sector_t::ceiling) == 1.) - Sector->SetAlpha(sector_t::ceiling, clamp(point->args[0], 0, 255) / 255.); - - Sector->Portals[sector_t::ceiling] = P_GetStackPortal(skyv, sector_t::ceiling); - } -} - -void MapLoader::SetupPortals() -{ - auto it = Level->GetThinkerIterator(NAME_StackPoint); - AActor *pt; - TArray points; - - while ((pt = it.Next())) - { - FName nm = pt->GetClass()->TypeName; - if (nm == NAME_UpperStackLookOnly) - { - SetupFloorPortal(pt); - } - else if (nm == NAME_LowerStackLookOnly) - { - SetupCeilingPortal(pt); - } - pt->special1 = 0; - points.Push(pt); - } - // the semantics here are incredibly lax so the final setup can only be done once all portals have been created, - // because later stackpoints will happily overwrite info in older ones, if there are multiple links. - for (auto &s : Level->sectorPortals) - { - if (s.mType == PORTS_STACKEDSECTORTHING && s.mSkybox) - { - for (auto &ss : Level->sectorPortals) - { - if (ss.mType == PORTS_STACKEDSECTORTHING && ss.mSkybox == s.mSkybox->target) - { - s.mPartner = unsigned((&ss) - &Level->sectorPortals[0]); - } - } - } - } - // Now we can finally set the displacement and delete the stackpoint reference. - for (auto &s : Level->sectorPortals) - { - if (s.mType == PORTS_STACKEDSECTORTHING && s.mSkybox) - { - s.mDisplacement = s.mSkybox->Pos() - s.mSkybox->target->Pos(); - s.mSkybox = nullptr; - } - } -} - -void MapLoader::SetPortal(sector_t *sector, int plane, unsigned pnum, double alpha) -{ - // plane: 0=floor, 1=ceiling, 2=both - if (plane > 0) - { - if (sector->GetPortalType(sector_t::ceiling) == PORTS_SKYVIEWPOINT) - { - sector->Portals[sector_t::ceiling] = pnum; - if (sector->GetAlpha(sector_t::ceiling) == 1.) - sector->SetAlpha(sector_t::ceiling, alpha); - - if (Level->sectorPortals[pnum].mFlags & PORTSF_SKYFLATONLY) - sector->SetTexture(sector_t::ceiling, skyflatnum); - } - } - if (plane == 2 || plane == 0) - { - if (sector->GetPortalType(sector_t::floor) == PORTS_SKYVIEWPOINT) - { - sector->Portals[sector_t::floor] = pnum; - } - if (sector->GetAlpha(sector_t::floor) == 1.) - sector->SetAlpha(sector_t::floor, alpha); - - if (Level->sectorPortals[pnum].mFlags & PORTSF_SKYFLATONLY) - sector->SetTexture(sector_t::floor, skyflatnum); - } -} - -void MapLoader::CopyPortal(int sectortag, int plane, unsigned pnum, double alpha, bool tolines) -{ - int s; - auto itr = Level->GetSectorTagIterator(sectortag); - while ((s = itr.Next()) >= 0) - { - SetPortal(&Level->sectors[s], plane, pnum, alpha); - } - - for (auto &line : Level->lines) - { - // 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 - if (line.special == Sector_SetPortal && - line.args[1] == 1 && - (line.args[2] == plane || line.args[2] == 3) && - line.args[3] == sectortag) - { - if (line.args[0] == 0) - { - SetPortal(line.frontsector, plane, pnum, alpha); - } - else - { - auto itr = Level->GetSectorTagIterator(line.args[0]); - while ((s = itr.Next()) >= 0) - { - SetPortal(&Level->sectors[s], plane, pnum, alpha); - } - } - } - if (tolines && line.special == Sector_SetPortal && - line.args[1] == 5 && - line.args[3] == sectortag) - { - if (line.args[0] == 0) - { - line.portaltransferred = pnum; - } - else - { - auto itr = Level->GetLineIdIterator(line.args[0]); - while ((s = itr.Next()) >= 0) - { - Level->lines[s].portaltransferred = pnum; - } - } - } - } -} - - -void MapLoader::SpawnPortal(line_t *line, int sectortag, int plane, int bytealpha, int linked) -{ - if (plane < 0 || plane > 2 || (linked && plane == 2)) return; - 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 - // which is not a good idea. - if (oline.special == Sector_SetPortal && - oline.args[0] == sectortag && - oline.args[1] == linked && - oline.args[2] == plane && - oline.args[3] == 1) - { - // beware of overflows. - DVector2 pos1 = line->v1->fPos() + line->Delta() / 2; - DVector2 pos2 = oline.v1->fPos() + oline.Delta() / 2; - unsigned pnum = P_GetPortal(linked ? PORTS_LINKEDPORTAL : PORTS_PORTAL, plane, line->frontsector, oline.frontsector, pos2 - pos1); - CopyPortal(sectortag, plane, pnum, bytealpha / 255., false); - return; - } - } -} - -// This searches the viewpoint's sector -// for a skybox line special, gets its tag and transfers the skybox to all tagged sectors. -void MapLoader::SpawnSkybox(AActor *origin) -{ - sector_t *Sector = origin->Sector; - if (Sector == NULL) - { - Printf("Sector not initialized for SkyCamCompat\n"); - origin->Sector = Sector = P_PointInSector(origin->Pos()); - } - if (Sector) - { - for(auto refline : Sector->Lines) - { - if (refline->special == Sector_SetPortal && refline->args[1] == 2) - { - // We found the setup linedef for this skybox, so let's use it for our init. - unsigned pnum = P_GetSkyboxPortal(origin); - CopyPortal(refline->args[0], refline->args[2], pnum, 0, true); - return; - } - } - } -} - - - -// -// P_SetSectorDamage -// -// Sets damage properties for one sector. Allows combination of original specials with explicit use of the damage properties -// - -static void SetupSectorDamage(sector_t *sector, int damage, int interval, int leakchance, FName type, int flags) -{ - // Only set if damage is not yet initialized. This ensures that UDMF takes precedence over sector specials. - if (sector->damageamount == 0) - { - sector->damageamount = damage; - sector->damageinterval = MAX(1, interval); - sector->leakydamage = leakchance; - sector->damagetype = type; - sector->Flags = (sector->Flags & ~SECF_DAMAGEFLAGS) | (flags & SECF_DAMAGEFLAGS); - } -} - -// -// P_InitSectorSpecial -// -// Sets up everything derived from 'sector->special' for one sector -// ('fromload' is necessary to allow conversion upon savegame load.) -// - -void MapLoader::InitSectorSpecial(sector_t *sector, int special) -{ - // [RH] All secret sectors are marked with a BOOM-ish bitfield - if (sector->special & SECRET_MASK) - { - sector->Flags |= SECF_SECRET | SECF_WASSECRET; - Level->total_secrets++; - } - if (sector->special & FRICTION_MASK) - { - sector->Flags |= SECF_FRICTION; - } - if (sector->special & PUSH_MASK) - { - sector->Flags |= SECF_PUSH; - } - if ((sector->special & DAMAGE_MASK) == 0x100) - { - SetupSectorDamage(sector, 5, 32, 0, NAME_Fire, 0); - } - else if ((sector->special & DAMAGE_MASK) == 0x200) - { - SetupSectorDamage(sector, 10, 32, 0, NAME_Slime, 0); - } - else if ((sector->special & DAMAGE_MASK) == 0x300) - { - SetupSectorDamage(sector, 20, 32, 5, NAME_Slime, 0); - } - sector->special &= 0xff; - - // [RH] Normal DOOM special or BOOM specialized? - bool keepspecial = false; - SpawnLights(sector); - switch (sector->special) - { - case dLight_Strobe_Hurt: - SetupSectorDamage(sector, 20, 32, 5, NAME_Slime, 0); - break; - - case dDamage_Hellslime: - SetupSectorDamage(sector, 10, 32, 0, NAME_Slime, 0); - break; - - case dDamage_Nukage: - SetupSectorDamage(sector, 5, 32, 0, NAME_Slime, 0); - break; - - case dSector_DoorCloseIn30: - Create(sector, DDoor::doorWaitClose, 2, 0, 0, 30 * TICRATE); - break; - - case dDamage_End: - SetupSectorDamage(sector, 20, 32, 256, NAME_None, SECF_ENDGODMODE|SECF_ENDLEVEL); - break; - - case dSector_DoorRaiseIn5Mins: - Create (sector, DDoor::doorWaitRaise, 2, TICRATE*30/7, 0, 5*60*TICRATE); - break; - - case dFriction_Low: - sector->friction = FRICTION_LOW; - sector->movefactor = 0x269/65536.; - sector->Flags |= SECF_FRICTION; - break; - - case dDamage_SuperHellslime: - SetupSectorDamage(sector, 20, 32, 5, NAME_Slime, 0); - break; - - case dDamage_LavaWimpy: - SetupSectorDamage(sector, 5, 16, 256, NAME_Fire, SECF_DMGTERRAINFX); - break; - - case dDamage_LavaHefty: - SetupSectorDamage(sector, 8, 16, 256, NAME_Fire, SECF_DMGTERRAINFX); - break; - - case dScroll_EastLavaDamage: - SetupSectorDamage(sector, 5, 16, 256, NAME_Fire, SECF_DMGTERRAINFX); - CreateScroller(EScroll::sc_floor, -4., 0, sector, 0); - keepspecial = true; - break; - - case hDamage_Sludge: - SetupSectorDamage(sector, 4, 32, 0, NAME_Slime, 0); - break; - - case sLight_Strobe_Hurt: - SetupSectorDamage(sector, 5, 32, 0, NAME_Slime, 0); - break; - - case sDamage_Hellslime: - SetupSectorDamage(sector, 2, 32, 0, NAME_Slime, SECF_HAZARD); - break; - - case Damage_InstantDeath: - // Strife's instant death sector - SetupSectorDamage(sector, TELEFRAG_DAMAGE, 1, 256, NAME_InstantDeath, 0); - break; - - case sDamage_SuperHellslime: - SetupSectorDamage(sector, 4, 32, 0, NAME_Slime, SECF_HAZARD); - break; - - case Sector_Hidden: - sector->MoreFlags |= SECMF_HIDDEN; - break; - - case Sector_Heal: - // CoD's healing sector - SetupSectorDamage(sector, -1, 32, 0, NAME_None, 0); - break; - - case Sky2: - sector->sky = PL_SKYFLAT; - break; - - default: - if (sector->special >= Scroll_North_Slow && sector->special <= Scroll_SouthWest_Fast) - { // Hexen scroll special - static const int8_t hexenScrollies[24][2] = - { - { 0, 1 }, { 0, 2 }, { 0, 4 }, - { -1, 0 }, { -2, 0 }, { -4, 0 }, - { 0, -1 }, { 0, -2 }, { 0, -4 }, - { 1, 0 }, { 2, 0 }, { 4, 0 }, - { 1, 1 }, { 2, 2 }, { 4, 4 }, - { -1, 1 }, { -2, 2 }, { -4, 4 }, - { -1, -1 }, { -2, -2 }, { -4, -4 }, - { 1, -1 }, { 2, -2 }, { 4, -4 } - }; - - - int i = sector->special - Scroll_North_Slow; - double dx = hexenScrollies[i][0] / 2.; - double dy = hexenScrollies[i][1] / 2.; - CreateScroller(EScroll::sc_floor, dx, dy, sector, 0); - } - else if (sector->special >= Carry_East5 && sector->special <= Carry_East35) - { - // Heretic scroll special - // Only east scrollers also scroll the texture - CreateScroller(EScroll::sc_floor, -0.5 * (1 << ((sector->special & 0xff) - Carry_East5)), 0, sector, 0); - } - keepspecial = true; - break; - } - if (!keepspecial) sector->special = 0; -} - -// -// P_SpawnSpecials -// -// After the map has been loaded, scan for specials that spawn thinkers -// - -void MapLoader::SpawnSpecials () -{ - SetupPortals(); - - for (auto &sec : Level->sectors) - { - if (sec.special == 0) - continue; - - InitSectorSpecial(&sec, sec.special); - } - - ProcessEDSectors(); - - // Init other misc stuff - - SpawnScrollers(); // killough 3/7/98: Add generalized scrollers - SpawnFriction(); // phares 3/12/98: New friction model using linedefs - SpawnPushers(); // phares 3/20/98: New pusher model using linedefs - - auto it2 = Level->GetThinkerIterator(NAME_SkyCamCompat); - AActor *pt2; - while ((pt2 = it2.Next())) - { - SpawnSkybox(pt2); - } - - for (auto &line : Level->lines) - { - switch (line.special) - { - int s; - sector_t *sec; - - // killough 3/7/98: - // support for drawn heights coming from different sector - case Transfer_Heights: - { - sec = line.frontsector; - - if (line.args[1] & 2) - { - sec->MoreFlags |= SECMF_FAKEFLOORONLY; - } - if (line.args[1] & 4) - { - sec->MoreFlags |= SECMF_CLIPFAKEPLANES; - } - if (line.args[1] & 8) - { - sec->MoreFlags |= SECMF_UNDERWATER; - } - else if (forcewater) - { - sec->MoreFlags |= SECMF_FORCEDUNDERWATER; - } - if (line.args[1] & 16) - { - sec->MoreFlags |= SECMF_IGNOREHEIGHTSEC; - } - else Level->HasHeightSecs = true; - if (line.args[1] & 32) - { - sec->MoreFlags |= SECMF_NOFAKELIGHT; - } - auto itr = Level->GetSectorTagIterator(line.args[0]); - while ((s = itr.Next()) >= 0) - { - Level->sectors[s].heightsec = sec; - sec->e->FakeFloor.Sectors.Push(&Level->sectors[s]); - Level->sectors[s].MoreFlags |= (sec->MoreFlags & SECMF_IGNOREHEIGHTSEC); // copy this to the destination sector for easier checking. - Level->sectors[s].AdjustFloorClip(); - } - break; - } - - // killough 3/16/98: Add support for setting - // floor lighting independently (e.g. lava) - case Transfer_FloorLight: - Create (line.frontsector, line.args[0], true); - break; - - // killough 4/11/98: Add support for setting - // ceiling lighting independently - case Transfer_CeilingLight: - Create (line.frontsector, line.args[0], false); - break; - - // [Graf Zahl] Add support for setting lighting - // per wall independently - case Transfer_WallLight: - Create (line.frontsector, line.args[0], line.args[1]); - break; - - case Sector_Attach3dMidtex: - P_Attach3dMidtexLinesToSector(line.frontsector, line.args[0], line.args[1], !!line.args[2]); - break; - - case Sector_SetLink: - if (line.args[0] == 0) - { - P_AddSectorLinks(line.frontsector, line.args[1], line.args[2], line.args[3]); - } - break; - - case Sector_SetPortal: - // arg 0 = sector tag - // arg 1 = type - // - 0: normal (handled here) - // - 1: copy (handled by the portal they copy) - // - 2: EE-style skybox (handled by the camera object) - // - 3: EE-style flat portal (GZDoom HW renderer only for now) - // - 4: EE-style horizon portal (GZDoom HW renderer only for now) - // - 5: copy portal to line (GZDoom HW renderer only for now) - // - 6: linked portal - // other values reserved for later use - // arg 2 = 0:floor, 1:ceiling, 2:both - // arg 3 = 0: anchor, 1: reference line - // arg 4 = for the anchor only: alpha - if ((line.args[1] == 0 || line.args[1] == 6) && line.args[3] == 0) - { - SpawnPortal(&line, line.args[0], line.args[2], line.args[4], line.args[1]); - } - else if (line.args[1] == 3 || line.args[1] == 4) - { - 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); - } - break; - - case Line_SetPortal: - P_SpawnLinePortal(&line); - break; - - // [RH] ZDoom Static_Init settings - case Static_Init: - switch (line.args[1]) - { - case Init_Gravity: - { - double grav = line.Delta().Length() / 100.; - auto itr = Level->GetSectorTagIterator(line.args[0]); - while ((s = itr.Next()) >= 0) - Level->sectors[s].gravity = grav; - } - break; - - //case Init_Color: - // handled in P_LoadSideDefs2() - - case Init_Damage: - { - int damage = int(line.Delta().Length()); - auto itr = Level->GetSectorTagIterator(line.args[0]); - while ((s = itr.Next()) >= 0) - { - sector_t *sec = &Level->sectors[s]; - sec->damageamount = damage; - sec->damagetype = NAME_None; - if (sec->damageamount < 20) - { - sec->leakydamage = 0; - sec->damageinterval = 32; - } - else if (sec->damageamount < 50) - { - sec->leakydamage = 5; - sec->damageinterval = 32; - } - else - { - sec->leakydamage = 256; - sec->damageinterval = 1; - } - } - } - break; - - case Init_SectorLink: - if (line.args[3] == 0) - P_AddSectorLinksByID(line.frontsector, line.args[0], line.args[2]); - break; - - // killough 10/98: - // - // Support for sky textures being transferred from sidedefs. - // Allows scrolling and other effects (but if scrolling is - // used, then the same sector tag needs to be used for the - // sky sector, the sky-transfer linedef, and the scroll-effect - // linedef). Still requires user to use F_SKY1 for the floor - // or ceiling texture, to distinguish floor and ceiling sky. - - case Init_TransferSky: - { - auto itr = Level->GetSectorTagIterator(line.args[0]); - while ((s = itr.Next()) >= 0) - Level->sectors[s].sky = (line.Index() + 1) | PL_SKYFLAT; - break; - } - } - break; - } - } - // [RH] Start running any open scripts on this map - Level->Behaviors.StartTypedScripts (SCRIPT_Open, NULL, false); -} - //////////////////////////////////////////////////////////////////////////// // // FRICTION EFFECTS @@ -1558,31 +909,6 @@ void MapLoader::SpawnSpecials () // // Initialize the sectors where friction is increased or decreased -void MapLoader::SpawnFriction() -{ - line_t *l = &Level->lines[0]; - - for (unsigned i = 0 ; i < Level->lines.Size() ; i++,l++) - { - if (l->special == Sector_SetFriction) - { - int length; - - if (l->args[1]) - { // [RH] Allow setting friction amount from parameter - length = l->args[1] <= 200 ? l->args[1] : 200; - } - else - { - length = int(l->Delta().Length()); - } - - P_SetSectorFriction (Level, l->args[0], length, false); - l->special = 0; - } - } -} - void P_SetSectorFriction (FLevelLocals *Level, int tag, int amount, bool alterFlag) { int s; diff --git a/src/p_spec_thinkers.h b/src/p_spec_thinkers.h new file mode 100644 index 000000000..dc1a5b3cc --- /dev/null +++ b/src/p_spec_thinkers.h @@ -0,0 +1,253 @@ +#pragma once + +#include "p_spec.h" +#include "r_defs.h" + +class DLightTransfer : public DThinker +{ + DECLARE_CLASS (DLightTransfer, DThinker) + + DLightTransfer() {} +public: + DLightTransfer (sector_t *srcSec, int target, bool copyFloor); + void Serialize(FSerializer &arc); + void Tick (); + +protected: + void DoTransfer (int level, int target, bool floor); + + sector_t *Source; + int TargetTag; + bool CopyFloor; + short LastLight; +}; + +class DWallLightTransfer : public DThinker +{ + enum + { + WLF_SIDE1=1, + WLF_SIDE2=2, + WLF_NOFAKECONTRAST=4 + }; + + DECLARE_CLASS (DWallLightTransfer, DThinker) + DWallLightTransfer() {} +public: + DWallLightTransfer (sector_t *srcSec, int target, uint8_t flags); + void Serialize(FSerializer &arc); + void Tick (); + +protected: + void DoTransfer (short level, int target, uint8_t flags); + + sector_t *Source; + int TargetID; + short LastLight; + uint8_t Flags; +}; + + +class DFireFlicker : public DLighting +{ + DECLARE_CLASS(DFireFlicker, DLighting) +public: + DFireFlicker(sector_t *sector); + DFireFlicker(sector_t *sector, int upper, int lower); + void Serialize(FSerializer &arc); + void Tick(); +protected: + int m_Count; + int m_MaxLight; + int m_MinLight; +private: + DFireFlicker(); +}; + +class DFlicker : public DLighting +{ + DECLARE_CLASS(DFlicker, DLighting) +public: + DFlicker(sector_t *sector, int upper, int lower); + void Serialize(FSerializer &arc); + void Tick(); +protected: + int m_Count; + int m_MaxLight; + int m_MinLight; +private: + DFlicker(); +}; + +class DLightFlash : public DLighting +{ + DECLARE_CLASS(DLightFlash, DLighting) +public: + DLightFlash(sector_t *sector); + DLightFlash(sector_t *sector, int min, int max); + void Serialize(FSerializer &arc); + void Tick(); +protected: + int m_Count; + int m_MaxLight; + int m_MinLight; + int m_MaxTime; + int m_MinTime; +private: + DLightFlash(); +}; + +class DStrobe : public DLighting +{ + DECLARE_CLASS(DStrobe, DLighting) +public: + DStrobe(sector_t *sector, int utics, int ltics, bool inSync); + DStrobe(sector_t *sector, int upper, int lower, int utics, int ltics); + void Serialize(FSerializer &arc); + void Tick(); +protected: + int m_Count; + int m_MinLight; + int m_MaxLight; + int m_DarkTime; + int m_BrightTime; +private: + DStrobe(); +}; + +class DGlow : public DLighting +{ + DECLARE_CLASS(DGlow, DLighting) +public: + DGlow(sector_t *sector); + void Serialize(FSerializer &arc); + void Tick(); +protected: + int m_MinLight; + int m_MaxLight; + int m_Direction; +private: + DGlow(); +}; + +// [RH] Glow from Light_Glow and Light_Fade specials +class DGlow2 : public DLighting +{ + DECLARE_CLASS(DGlow2, DLighting) +public: + DGlow2(sector_t *sector, int start, int end, int tics, bool oneshot); + void Serialize(FSerializer &arc); + void Tick(); +protected: + int m_Start; + int m_End; + int m_MaxTics; + int m_Tics; + bool m_OneShot; +private: + DGlow2(); +}; + +// [RH] Phased light thinker +class DPhased : public DLighting +{ + DECLARE_CLASS(DPhased, DLighting) +public: + DPhased(sector_t *sector); + DPhased(sector_t *sector, int baselevel, int phase); + // These are for internal use only but the Create template needs access to them. + DPhased(); + DPhased(sector_t *sector, int baselevel); + + void Serialize(FSerializer &arc); + void Tick(); +protected: + uint8_t m_BaseLevel; + uint8_t m_Phase; +private: + int PhaseHelper(sector_t *sector, int index, int light, sector_t *prev); +}; + +// phares 3/20/98: added new model of Pushers for push/pull effects + +class DPusher : public DThinker +{ + DECLARE_CLASS (DPusher, DThinker) + HAS_OBJECT_POINTERS +public: + enum EPusher + { + p_push, + p_pull, + p_wind, + p_current + }; + + DPusher (); + DPusher (EPusher type, line_t *l, int magnitude, int angle, AActor *source, int affectee); + void Serialize(FSerializer &arc); + int CheckForSectorMatch (EPusher type, int tag); + void ChangeValues (int magnitude, int angle) + { + DAngle ang = angle * (360. / 256.); + m_PushVec = ang.ToVector(magnitude); + m_Magnitude = magnitude; + } + + void Tick (); + +protected: + EPusher m_Type; + TObjPtr m_Source;// Point source if point pusher + DVector2 m_PushVec; + double m_Magnitude; // Vector strength for point pusher + double m_Radius; // Effective radius for point pusher + int m_Affectee; // Number of affected sector + + friend bool PIT_PushThing (AActor *thing); +}; + +//----------------------------------------------------------------------------- +// +// killough 3/7/98: Add generalized scroll effects +// +//----------------------------------------------------------------------------- + +class DScroller : public DThinker +{ + DECLARE_CLASS (DScroller, DThinker) + HAS_OBJECT_POINTERS +public: + + DScroller(EScroll type, double dx, double dy, sector_t *control, sector_t *sec, side_t *side, int accel, EScrollPos scrollpos = EScrollPos::scw_all); + DScroller (double dx, double dy, const line_t *l, sector_t *control, int accel, EScrollPos scrollpos = EScrollPos::scw_all); + void OnDestroy() override; + + void Serialize(FSerializer &arc); + void Tick (); + + bool AffectsWall (side_t * wall) const { return m_Side == wall; } + side_t *GetWall () const { return m_Side; } + sector_t *GetSector() const { return m_Sector; } + void SetRate (double dx, double dy) { m_dx = dx; m_dy = dy; } + bool IsType (EScroll type) const { return type == m_Type; } + EScrollPos GetScrollParts() const { return m_Parts; } + +protected: + EScroll m_Type; // Type of scroll effect + double m_dx, m_dy; // (dx,dy) scroll speeds + sector_t *m_Sector; // Affected sector + side_t *m_Side; // ... or side + sector_t *m_Controller; // Control sector (nullptr if none) used to control scrolling + double m_LastHeight; // Last known height of control sector + double m_vdx, m_vdy; // Accumulated velocity if accelerative + int m_Accel; // Whether it's accelerative + EScrollPos m_Parts; // Which parts of a sidedef are being scrolled? + TObjPtr m_Interpolations[3]; + +private: + DScroller () + { + } +}; + From 7418ebef560922938eee4b173e54ab55771fc492 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 24 Jan 2019 20:33:25 +0100 Subject: [PATCH 012/164] - use default constructors for the thinkers to avoid empty non-inlined functions. --- src/p_lights.cpp | 32 -------------------------------- src/p_pusher.cpp | 4 ---- src/p_spec.h | 2 +- src/p_spec_thinkers.h | 24 +++++++++++------------- 4 files changed, 12 insertions(+), 50 deletions(-) diff --git a/src/p_lights.cpp b/src/p_lights.cpp index 43bd6beff..365ea8265 100644 --- a/src/p_lights.cpp +++ b/src/p_lights.cpp @@ -57,10 +57,6 @@ static FRandom pr_fireflicker ("FireFlicker"); IMPLEMENT_CLASS(DLighting, false, false) -DLighting::DLighting () -{ -} - DLighting::DLighting (sector_t *sector) : DSectorEffect (sector) { @@ -75,10 +71,6 @@ DLighting::DLighting (sector_t *sector) IMPLEMENT_CLASS(DFireFlicker, false, false) -DFireFlicker::DFireFlicker () -{ -} - void DFireFlicker::Serialize(FSerializer &arc) { Super::Serialize (arc); @@ -142,10 +134,6 @@ DFireFlicker::DFireFlicker (sector_t *sector, int upper, int lower) IMPLEMENT_CLASS(DFlicker, false, false) -DFlicker::DFlicker () -{ -} - void DFlicker::Serialize(FSerializer &arc) { Super::Serialize (arc); @@ -218,10 +206,6 @@ void EV_StartLightFlickering (int tag, int upper, int lower) IMPLEMENT_CLASS(DLightFlash, false, false) -DLightFlash::DLightFlash () -{ -} - void DLightFlash::Serialize(FSerializer &arc) { Super::Serialize (arc); @@ -293,10 +277,6 @@ DLightFlash::DLightFlash (sector_t *sector, int min, int max) IMPLEMENT_CLASS(DStrobe, false, false) -DStrobe::DStrobe () -{ -} - void DStrobe::Serialize(FSerializer &arc) { Super::Serialize (arc); @@ -549,10 +529,6 @@ void EV_LightChange (int tag, int value) IMPLEMENT_CLASS(DGlow, false, false) -DGlow::DGlow () -{ -} - void DGlow::Serialize(FSerializer &arc) { Super::Serialize (arc); @@ -619,10 +595,6 @@ DGlow::DGlow (sector_t *sector) IMPLEMENT_CLASS(DGlow2, false, false) -DGlow2::DGlow2 () -{ -} - void DGlow2::Serialize(FSerializer &arc) { Super::Serialize (arc); @@ -752,10 +724,6 @@ void EV_StartLightFading (int tag, int value, int tics) IMPLEMENT_CLASS(DPhased, false, false) -DPhased::DPhased () -{ -} - void DPhased::Serialize(FSerializer &arc) { Super::Serialize (arc); diff --git a/src/p_pusher.cpp b/src/p_pusher.cpp index b8d079dda..0ebb29351 100644 --- a/src/p_pusher.cpp +++ b/src/p_pusher.cpp @@ -47,10 +47,6 @@ IMPLEMENT_POINTERS_START(DPusher) IMPLEMENT_POINTER(m_Source) IMPLEMENT_POINTERS_END -DPusher::DPusher () -{ -} - void DPusher::Serialize(FSerializer &arc) { Super::Serialize (arc); diff --git a/src/p_spec.h b/src/p_spec.h index 8e48773cc..957ac9703 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -127,7 +127,7 @@ class DLighting : public DSectorEffect public: DLighting(sector_t *sector); protected: - DLighting(); + DLighting() = default; }; void EV_StartLightFlickering (int tag, int upper, int lower); diff --git a/src/p_spec_thinkers.h b/src/p_spec_thinkers.h index dc1a5b3cc..fe5ad9e07 100644 --- a/src/p_spec_thinkers.h +++ b/src/p_spec_thinkers.h @@ -7,7 +7,7 @@ class DLightTransfer : public DThinker { DECLARE_CLASS (DLightTransfer, DThinker) - DLightTransfer() {} + DLightTransfer() = default; public: DLightTransfer (sector_t *srcSec, int target, bool copyFloor); void Serialize(FSerializer &arc); @@ -32,7 +32,7 @@ class DWallLightTransfer : public DThinker }; DECLARE_CLASS (DWallLightTransfer, DThinker) - DWallLightTransfer() {} + DWallLightTransfer() = default; public: DWallLightTransfer (sector_t *srcSec, int target, uint8_t flags); void Serialize(FSerializer &arc); @@ -61,7 +61,7 @@ protected: int m_MaxLight; int m_MinLight; private: - DFireFlicker(); + DFireFlicker() = default; }; class DFlicker : public DLighting @@ -76,7 +76,7 @@ protected: int m_MaxLight; int m_MinLight; private: - DFlicker(); + DFlicker() = default; }; class DLightFlash : public DLighting @@ -94,7 +94,7 @@ protected: int m_MaxTime; int m_MinTime; private: - DLightFlash(); + DLightFlash() = default; }; class DStrobe : public DLighting @@ -112,7 +112,7 @@ protected: int m_DarkTime; int m_BrightTime; private: - DStrobe(); + DStrobe() = default; }; class DGlow : public DLighting @@ -127,7 +127,7 @@ protected: int m_MaxLight; int m_Direction; private: - DGlow(); + DGlow() = default; }; // [RH] Glow from Light_Glow and Light_Fade specials @@ -145,7 +145,7 @@ protected: int m_Tics; bool m_OneShot; private: - DGlow2(); + DGlow2() = default; }; // [RH] Phased light thinker @@ -156,7 +156,7 @@ public: DPhased(sector_t *sector); DPhased(sector_t *sector, int baselevel, int phase); // These are for internal use only but the Create template needs access to them. - DPhased(); + DPhased() = default; DPhased(sector_t *sector, int baselevel); void Serialize(FSerializer &arc); @@ -183,7 +183,7 @@ public: p_current }; - DPusher (); + DPusher () = default; DPusher (EPusher type, line_t *l, int magnitude, int angle, AActor *source, int affectee); void Serialize(FSerializer &arc); int CheckForSectorMatch (EPusher type, int tag); @@ -246,8 +246,6 @@ protected: TObjPtr m_Interpolations[3]; private: - DScroller () - { - } + DScroller () = default; }; From 2623fbb54bce5429c73881ad982e8db39427a9f2 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 24 Jan 2019 20:40:31 +0100 Subject: [PATCH 013/164] - deleted unused mus2midi.cpp file. --- src/mus2midi.cpp | 309 ------------------------------------- src/sound/i_music.cpp | 1 - src/{ => sound}/mus2midi.h | 0 3 files changed, 310 deletions(-) delete mode 100644 src/mus2midi.cpp rename src/{ => sound}/mus2midi.h (100%) diff --git a/src/mus2midi.cpp b/src/mus2midi.cpp deleted file mode 100644 index 09abdeb19..000000000 --- a/src/mus2midi.cpp +++ /dev/null @@ -1,309 +0,0 @@ -/* -** mus2midi.cpp -** Simple converter from MUS to MIDI format -** -**--------------------------------------------------------------------------- -** Copyright 1998-2006 Randy Heit -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions -** are met: -** -** 1. Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in the -** documentation and/or other materials provided with the distribution. -** 3. The name of the author may not be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -**--------------------------------------------------------------------------- -** -** MUS files are essentially format 0 MIDI files with some -** space-saving modifications. Conversion is quite straight-forward. -** If you were to hook a main() into this that calls ProduceMIDI, -** you could create a self-contained MUS->MIDI converter. -*/ - - -#include - -#include "m_swap.h" -#include "mus2midi.h" -#include "doomdef.h" - -static const uint8_t StaticMIDIhead[] = -{ 'M','T','h','d', 0, 0, 0, 6, -0, 0, // format 0: only one track -0, 1, // yes, there is really only one track -0, 70, // 70 divisions -'M','T','r','k', 0, 0, 0, 0, -// The first event sets the tempo to 500,000 microsec/quarter note -0, 255, 81, 3, 0x07, 0xa1, 0x20 -}; - -extern int MUSHeaderSearch(const uint8_t *head, int len); - -static const uint8_t CtrlTranslate[15] = -{ - 0, // program change - 0, // bank select - 1, // modulation pot - 7, // volume - 10, // pan pot - 11, // expression pot - 91, // reverb depth - 93, // chorus depth - 64, // sustain pedal - 67, // soft pedal - 120, // all sounds off - 123, // all notes off - 126, // mono - 127, // poly - 121, // reset all controllers -}; - -static size_t ReadVarLen (const uint8_t *buf, int *time_out) -{ - int time = 0; - size_t ofs = 0; - uint8_t t; - - do - { - t = buf[ofs++]; - time = (time << 7) | (t & 127); - } while (t & 128); - *time_out = time; - return ofs; -} - -static size_t WriteVarLen (TArray &file, int time) -{ - long buffer; - size_t ofs; - - buffer = time & 0x7f; - while ((time >>= 7) > 0) - { - buffer = (buffer << 8) | 0x80 | (time & 0x7f); - } - for (ofs = 0;;) - { - file.Push(uint8_t(buffer & 0xff)); - if (buffer & 0x80) - buffer >>= 8; - else - break; - } - return ofs; -} - -bool ProduceMIDI (const uint8_t *musBuf, int len, TArray &outFile) -{ - uint8_t midStatus, midArgs, mid1, mid2; - size_t mus_p, maxmus_p; - uint8_t event; - int deltaTime; - const MUSHeader *musHead; - uint8_t status; - uint8_t chanUsed[16]; - uint8_t lastVel[16]; - long trackLen; - bool no_op; - - // Find the header - int offset = MUSHeaderSearch(musBuf, len); - - if (offset < 0 || offset + (int)sizeof(MUSHeader) >= len) - return false; - - musBuf += offset; - len -= offset; - musHead = (const MUSHeader *)musBuf; - - // Do some validation of the MUS file - if (LittleShort(musHead->NumChans) > 15) - return false; - - // Prep for conversion - outFile.Clear(); - outFile.Reserve(sizeof(StaticMIDIhead)); - memcpy(&outFile[0], StaticMIDIhead, sizeof(StaticMIDIhead)); - - musBuf += LittleShort(musHead->SongStart); - mus_p = 0; - maxmus_p = LittleShort(musHead->SongLen); - if ((size_t)len - LittleShort(musHead->SongStart) < maxmus_p) - { - maxmus_p = len - LittleShort(musHead->SongStart); - } - - memset (lastVel, 100, 16); - memset (chanUsed, 0, 16); - event = 0; - deltaTime = 0; - status = 0; - - while (mus_p < maxmus_p && (event & 0x70) != MUS_SCOREEND) - { - int channel; - uint8_t t = 0; - - event = musBuf[mus_p++]; - - if ((event & 0x70) != MUS_SCOREEND) - { - t = musBuf[mus_p++]; - } - channel = event & 15; - if (channel == 15) - { - channel = 9; - } - else if (channel >= 9) - { - channel++; - } - - if (!chanUsed[channel]) - { - // This is the first time this channel has been used, - // so sets its volume to 127. - chanUsed[channel] = 1; - outFile.Push(0); - outFile.Push(0xB0 | channel); - outFile.Push(7); - outFile.Push(127); - } - - midStatus = channel; - midArgs = 0; // Most events have two args (0 means 2, 1 means 1) - no_op = false; - - switch (event & 0x70) - { - case MUS_NOTEOFF: - midStatus |= MIDI_NOTEON; - mid1 = t & 127; - mid2 = 0; - break; - - case MUS_NOTEON: - midStatus |= MIDI_NOTEON; - mid1 = t & 127; - if (t & 128) - { - lastVel[channel] = musBuf[mus_p++] & 127; - } - mid2 = lastVel[channel]; - break; - - case MUS_PITCHBEND: - midStatus |= MIDI_PITCHBEND; - mid1 = (t & 1) << 6; - mid2 = (t >> 1) & 127; - break; - - case MUS_SYSEVENT: - if (t < 10 || t > 14) - { - no_op = true; - } - else - { - midStatus |= MIDI_CTRLCHANGE; - mid1 = CtrlTranslate[t]; - mid2 = t == 12 /* Mono */ ? LittleShort(musHead->NumChans) : 0; - } - break; - - case MUS_CTRLCHANGE: - if (t == 0) - { // program change - midArgs = 1; - midStatus |= MIDI_PRGMCHANGE; - mid1 = musBuf[mus_p++] & 127; - mid2 = 0; // Assign mid2 just to make GCC happy - } - else if (t > 0 && t < 10) - { - midStatus |= MIDI_CTRLCHANGE; - mid1 = CtrlTranslate[t]; - mid2 = musBuf[mus_p++]; - } - else - { - no_op = true; - } - break; - - case MUS_SCOREEND: - midStatus = MIDI_META; - mid1 = MIDI_META_EOT; - mid2 = 0; - break; - - default: - return false; - } - - if (no_op) - { - // A system-specific event with no data is a no-op. - midStatus = MIDI_META; - mid1 = MIDI_META_SSPEC; - mid2 = 0; - } - - WriteVarLen (outFile, deltaTime); - - if (midStatus != status) - { - status = midStatus; - outFile.Push(status); - } - outFile.Push(mid1); - if (midArgs == 0) - { - outFile.Push(mid2); - } - if (event & 128) - { - mus_p += ReadVarLen (&musBuf[mus_p], &deltaTime); - } - else - { - deltaTime = 0; - } - } - - // fill in track length - trackLen = outFile.Size() - 22; - outFile[18] = uint8_t((trackLen >> 24) & 255); - outFile[19] = uint8_t((trackLen >> 16) & 255); - outFile[20] = uint8_t((trackLen >> 8) & 255); - outFile[21] = uint8_t(trackLen & 255); - return true; -} - -bool ProduceMIDI(const uint8_t *musBuf, int len, FILE *outFile) -{ - TArray work; - if (ProduceMIDI(musBuf, len, work)) - { - return fwrite(&work[0], 1, work.Size(), outFile) == work.Size(); - } - return false; -} diff --git a/src/sound/i_music.cpp b/src/sound/i_music.cpp index f69116a15..877c03e39 100644 --- a/src/sound/i_music.cpp +++ b/src/sound/i_music.cpp @@ -35,7 +35,6 @@ #ifndef _WIN32 #include #include -#include "mus2midi.h" #endif #include diff --git a/src/mus2midi.h b/src/sound/mus2midi.h similarity index 100% rename from src/mus2midi.h rename to src/sound/mus2midi.h From 3cef56249dee03068ced261a00b3ee21f06efc15 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 25 Jan 2019 00:30:55 +0100 Subject: [PATCH 014/164] - moved most functions of portals.cpp into FLevelLocals. Much of this is used during level init and needs to be independent of the current level. --- src/actor.h | 74 +---- src/actorinlines.h | 68 ++++ src/b_func.cpp | 2 +- src/g_levellocals.h | 61 ++++ src/maploader/maploader.cpp | 2 +- src/maploader/maploader.h | 1 + src/maploader/specials.cpp | 94 +++++- src/p_effect.cpp | 2 +- src/p_lnspec.cpp | 2 +- src/p_map.cpp | 18 +- src/p_maputl.cpp | 10 +- src/p_maputl.h | 26 +- src/p_saveg.cpp | 2 +- src/p_teleport.cpp | 2 +- src/p_trace.cpp | 2 +- src/portal.cpp | 434 ++++++++++--------------- src/portal.h | 10 - src/scripting/vmthunks.cpp | 6 +- wadsrc/static/zscript/base.txt | 1 + wadsrc/static/zscript/mapdata.txt | 4 +- wadsrc/static/zscript/shared/skies.txt | 2 +- 21 files changed, 420 insertions(+), 403 deletions(-) diff --git a/src/actor.h b/src/actor.h index 7f1b1ea3f..778ed611e 100644 --- a/src/actor.h +++ b/src/actor.h @@ -900,74 +900,12 @@ public: return other->PosRelative(this) - Pos(); } - DVector2 Vec2Offset(double dx, double dy, bool absolute = false) - { - if (absolute) - { - return { X() + dx, Y() + dy }; - } - else - { - return P_GetOffsetPosition(X(), Y(), dx, dy); - } - } - - - DVector3 Vec2OffsetZ(double dx, double dy, double atz, bool absolute = false) - { - if (absolute) - { - return{ X() + dx, Y() + dy, atz }; - } - else - { - DVector2 v = P_GetOffsetPosition(X(), Y(), dx, dy); - return DVector3(v, atz); - } - } - - DVector2 Vec2Angle(double length, DAngle angle, bool absolute = false) - { - if (absolute) - { - return{ X() + length * angle.Cos(), Y() + length * angle.Sin() }; - } - else - { - return P_GetOffsetPosition(X(), Y(), length*angle.Cos(), length*angle.Sin()); - } - } - - DVector3 Vec3Offset(double dx, double dy, double dz, bool absolute = false) - { - if (absolute) - { - return { X() + dx, Y() + dy, Z() + dz }; - } - else - { - DVector2 v = P_GetOffsetPosition(X(), Y(), dx, dy); - return DVector3(v, Z() + dz); - } - } - - DVector3 Vec3Offset(const DVector3 &ofs, bool absolute = false) - { - return Vec3Offset(ofs.X, ofs.Y, ofs.Z, absolute); - } - - DVector3 Vec3Angle(double length, DAngle angle, double dz, bool absolute = false) - { - if (absolute) - { - return{ X() + length * angle.Cos(), Y() + length * angle.Sin(), Z() + dz }; - } - else - { - DVector2 v = P_GetOffsetPosition(X(), Y(), length*angle.Cos(), length*angle.Sin()); - return DVector3(v, Z() + dz); - } - } + DVector2 Vec2Offset(double dx, double dy, bool absolute = false); + DVector3 Vec2OffsetZ(double dx, double dy, double atz, bool absolute = false); + DVector2 AActor::Vec2Angle(double length, DAngle angle, bool absolute = false); + DVector3 Vec3Offset(double dx, double dy, double dz, bool absolute = false); + DVector3 Vec3Offset(const DVector3 &ofs, bool absolute = false); + DVector3 Vec3Angle(double length, DAngle angle, double dz, bool absolute = false); void ClearInterpolation(); diff --git a/src/actorinlines.h b/src/actorinlines.h index 408835524..7346d6d76 100644 --- a/src/actorinlines.h +++ b/src/actorinlines.h @@ -94,3 +94,71 @@ inline double AActor::AttackOffset(double offset) } +inline DVector2 AActor::Vec2Offset(double dx, double dy, bool absolute) +{ + if (absolute) + { + return { X() + dx, Y() + dy }; + } + else + { + return level.GetPortalOffsetPosition(X(), Y(), dx, dy); + } +} + + +inline DVector3 AActor::Vec2OffsetZ(double dx, double dy, double atz, bool absolute) +{ + if (absolute) + { + return{ X() + dx, Y() + dy, atz }; + } + else + { + DVector2 v = level.GetPortalOffsetPosition(X(), Y(), dx, dy); + return DVector3(v, atz); + } +} + +inline DVector2 AActor::Vec2Angle(double length, DAngle angle, bool absolute) +{ + if (absolute) + { + return{ X() + length * angle.Cos(), Y() + length * angle.Sin() }; + } + else + { + return level.GetPortalOffsetPosition(X(), Y(), length*angle.Cos(), length*angle.Sin()); + } +} + +inline DVector3 AActor::Vec3Offset(double dx, double dy, double dz, bool absolute) +{ + if (absolute) + { + return { X() + dx, Y() + dy, Z() + dz }; + } + else + { + DVector2 v = level.GetPortalOffsetPosition(X(), Y(), dx, dy); + return DVector3(v, Z() + dz); + } +} + +inline DVector3 AActor::Vec3Offset(const DVector3 &ofs, bool absolute) +{ + return Vec3Offset(ofs.X, ofs.Y, ofs.Z, absolute); +} + +inline DVector3 AActor::Vec3Angle(double length, DAngle angle, double dz, bool absolute) +{ + if (absolute) + { + return{ X() + length * angle.Cos(), Y() + length * angle.Sin(), Z() + dz }; + } + else + { + DVector2 v = level.GetPortalOffsetPosition(X(), Y(), length*angle.Cos(), length*angle.Sin()); + return DVector3(v, Z() + dz); + } +} diff --git a/src/b_func.cpp b/src/b_func.cpp index 0613cacae..36bbcf5c2 100644 --- a/src/b_func.cpp +++ b/src/b_func.cpp @@ -73,7 +73,7 @@ bool DBot::Reachable (AActor *rtarget) double estimated_dist = player->mo->Distance2D(rtarget); bool reachable = true; - FPathTraverse it(player->mo->X()+player->mo->Vel.X, player->mo->Y()+player->mo->Vel.Y, rtarget->X(), rtarget->Y(), PT_ADDLINES|PT_ADDTHINGS); + FPathTraverse it(&level, player->mo->X()+player->mo->Vel.X, player->mo->Y()+player->mo->Vel.Y, rtarget->X(), rtarget->Y(), PT_ADDLINES|PT_ADDTHINGS); intercept_t *in; while ((in = it.Next())) { diff --git a/src/g_levellocals.h b/src/g_levellocals.h index a88a789be..521fffa0d 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -50,6 +50,38 @@ #include "r_data/r_sections.h" #include "r_data/r_canvastexture.h" +//============================================================================ +// +// This is used to mark processed portals for some collection functions. +// +//============================================================================ + +struct FPortalBits +{ + TArray data; + + void setSize(int num) + { + data.Resize((num + 31) / 32); + clear(); + } + + void clear() + { + memset(&data[0], 0, data.Size() * sizeof(uint32_t)); + } + + void setBit(int group) + { + data[group >> 5] |= (1 << (group & 31)); + } + + int getBit(int group) + { + return data[group >> 5] & (1 << (group & 31)); + } +}; + class DACSThinker; class DFraggleThinker; class DSpotState; @@ -120,6 +152,8 @@ struct FLevelData struct FLevelLocals : public FLevelData { + friend class MapLoader; + void Tick(); void Mark(); void AddScroller(int secnum); @@ -138,6 +172,33 @@ struct FLevelLocals : public FLevelData void SetConversation(int convid, PClassActor *Class, int dlgindex); int FindNode (const FStrifeDialogueNode *node); +private: + line_t *FindPortalDestination(line_t *src, int tag); + void BuildPortalBlockmap(); + void UpdatePortal(FLinePortal *port); + void CollectLinkedPortals(); + void CreateLinkedPortals(); + bool ChangePortalLine(line_t *line, int destid); + void AddDisplacementForPortal(FSectorPortal *portal); + void AddDisplacementForPortal(FLinePortal *portal); + bool ConnectPortalGroups(); +public: + void FinalizePortals(); + bool ChangePortal(line_t *ln, int thisid, int destid); + unsigned GetSkyboxPortal(AActor *actor); + unsigned GetPortal(int type, int plane, sector_t *orgsec, sector_t *destsec, const DVector2 &displacement); + unsigned GetStackPortal(AActor *point, int plane); + DVector2 GetPortalOffsetPosition(double x, double y, double dx, double dy); + bool CollectConnectedGroups(int startgroup, const DVector3 &position, double upperz, double checkradius, FPortalGroupArray &out); + +private: + // Work data for CollectConnectedGroups. + FPortalBits processMask; + TArray foundPortals; + TArray groupsToCheck; + +public: + FSectorTagIterator GetSectorTagIterator(int tag) { return FSectorTagIterator(tagManager, tag); diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index 0dd419091..c3f207927 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -3290,5 +3290,5 @@ void MapLoader::LoadLevel(MapData *map, const char *lumpname, int position) if (reloop) LoopSidedefs(false); PO_Init(); // Initialize the polyobjs if (!Level->IsReentering()) - P_FinalizePortals(); // finalize line portals after polyobjects have been initialized. This info is needed for properly flagging them. + Level->FinalizePortals(); // finalize line portals after polyobjects have been initialized. This info is needed for properly flagging them. } diff --git a/src/maploader/maploader.h b/src/maploader/maploader.h index 884a827a4..ba2f192bd 100644 --- a/src/maploader/maploader.h +++ b/src/maploader/maploader.h @@ -185,6 +185,7 @@ private: void SpawnPortal(line_t *line, int sectortag, int plane, int bytealpha, int linked); void CopyPortal(int sectortag, int plane, unsigned pnum, double alpha, bool tolines); void SetPortal(sector_t *sector, int plane, unsigned pnum, double alpha); + void SpawnLinePortal(line_t* line); void SetupPortals(); void SpawnSkybox(AActor *origin); void SetupFloorPortal (AActor *point); diff --git a/src/maploader/specials.cpp b/src/maploader/specials.cpp index 38ace4b68..4f42a017f 100644 --- a/src/maploader/specials.cpp +++ b/src/maploader/specials.cpp @@ -109,7 +109,87 @@ EXTERN_CVAR(Bool, forcewater) // //----------------------------------------------------------------------------- -//--------------------------------------------------------------------------- +//============================================================================ +// +// Spawns a single line portal +// +//============================================================================ + +void MapLoader::SpawnLinePortal(line_t* line) +{ + // portal destination is special argument #0 + line_t* dst = nullptr; + + if (line->args[2] >= PORTT_VISUAL && line->args[2] <= PORTT_LINKED) + { + dst = Level->FindPortalDestination(line, line->args[0]); + + line->portalindex = Level->linePortals.Reserve(1); + FLinePortal *port = &Level->linePortals.Last(); + + memset(port, 0, sizeof(FLinePortal)); + port->mOrigin = line; + port->mDestination = dst; + port->mType = uint8_t(line->args[2]); // range check is done above. + + if (port->mType == PORTT_LINKED) + { + // Linked portals have no z-offset ever. + port->mAlign = PORG_ABSOLUTE; + } + else + { + port->mAlign = uint8_t(line->args[3] >= PORG_ABSOLUTE && line->args[3] <= PORG_CEILING ? line->args[3] : PORG_ABSOLUTE); + if (port->mType == PORTT_INTERACTIVE && port->mAlign != PORG_ABSOLUTE) + { + // Due to the way z is often handled, these pose a major issue for parts of the code that needs to transparently handle interactive portals. + Printf(TEXTCOLOR_RED "Warning: z-offsetting not allowed for interactive portals. Changing line %d to teleport-portal!\n", line->Index()); + port->mType = PORTT_TELEPORT; + } + } + port->mDefFlags = port->mType == PORTT_VISUAL ? PORTF_VISIBLE : + port->mType == PORTT_TELEPORT ? PORTF_TYPETELEPORT : + PORTF_TYPEINTERACTIVE; + } + else if (line->args[2] == PORTT_LINKEDEE && line->args[0] == 0) + { + // EE-style portals require that the first line ID is identical and the first arg of the two linked linedefs are 0 and 1 respectively. + + int mytag = Level->GetFirstLineId(line); + + for (auto &ln : Level->lines) + { + if (Level->GetFirstLineId(&ln) == mytag && ln.args[0] == 1 && ln.special == Line_SetPortal) + { + line->portalindex = Level->linePortals.Reserve(1); + FLinePortal *port = &Level->linePortals.Last(); + + memset(port, 0, sizeof(FLinePortal)); + port->mOrigin = line; + port->mDestination = &ln; + port->mType = PORTT_LINKED; + port->mAlign = PORG_ABSOLUTE; + port->mDefFlags = PORTF_TYPEINTERACTIVE; + + // we need to create the backlink here, too. + ln.portalindex = Level->linePortals.Reserve(1); + port = &Level->linePortals.Last(); + + memset(port, 0, sizeof(FLinePortal)); + port->mOrigin = &ln; + port->mDestination = line; + port->mType = PORTT_LINKED; + port->mAlign = PORG_ABSOLUTE; + port->mDefFlags = PORTF_TYPEINTERACTIVE; + } + } + } + else + { + // undefined type + return; + } +} //----------------------------------------------------------------------------- // @@ -128,7 +208,7 @@ void MapLoader::SetupFloorPortal (AActor *point) if (Sector->GetAlpha(sector_t::floor) == 1.) Sector->SetAlpha(sector_t::floor, clamp(point->args[0], 0, 255) / 255.); - Sector->Portals[sector_t::floor] = P_GetStackPortal(skyv, sector_t::floor); + Sector->Portals[sector_t::floor] = Level->GetStackPortal(skyv, sector_t::floor); } } @@ -149,7 +229,7 @@ void MapLoader::SetupCeilingPortal (AActor *point) if (Sector->GetAlpha(sector_t::ceiling) == 1.) Sector->SetAlpha(sector_t::ceiling, clamp(point->args[0], 0, 255) / 255.); - Sector->Portals[sector_t::ceiling] = P_GetStackPortal(skyv, sector_t::ceiling); + Sector->Portals[sector_t::ceiling] = Level->GetStackPortal(skyv, sector_t::ceiling); } } @@ -319,7 +399,7 @@ void MapLoader::SpawnPortal(line_t *line, int sectortag, int plane, int bytealph // beware of overflows. DVector2 pos1 = line->v1->fPos() + line->Delta() / 2; DVector2 pos2 = oline.v1->fPos() + oline.Delta() / 2; - unsigned pnum = P_GetPortal(linked ? PORTS_LINKEDPORTAL : PORTS_PORTAL, plane, line->frontsector, oline.frontsector, pos2 - pos1); + unsigned pnum = Level->GetPortal(linked ? PORTS_LINKEDPORTAL : PORTS_PORTAL, plane, line->frontsector, oline.frontsector, pos2 - pos1); CopyPortal(sectortag, plane, pnum, bytealpha / 255., false); return; } @@ -348,7 +428,7 @@ void MapLoader::SpawnSkybox(AActor *origin) if (refline->special == Sector_SetPortal && refline->args[1] == 2) { // We found the setup linedef for this skybox, so let's use it for our init. - unsigned pnum = P_GetSkyboxPortal(origin); + unsigned pnum = Level->GetSkyboxPortal(origin); CopyPortal(refline->args[0], refline->args[2], pnum, 0, true); return; } @@ -669,13 +749,13 @@ void MapLoader::SpawnSpecials () } else if (line.args[1] == 3 || line.args[1] == 4) { - unsigned pnum = P_GetPortal(line.args[1] == 3 ? PORTS_PLANE : PORTS_HORIZON, line.args[2], line.frontsector, NULL, { 0,0 }); + unsigned pnum = Level->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); } break; case Line_SetPortal: - P_SpawnLinePortal(&line); + SpawnLinePortal(&line); break; // [RH] ZDoom Static_Init settings diff --git a/src/p_effect.cpp b/src/p_effect.cpp index da43890c5..93724d962 100644 --- a/src/p_effect.cpp +++ b/src/p_effect.cpp @@ -264,7 +264,7 @@ void P_ThinkParticles () } // Handle crossing a line portal - DVector2 newxy = P_GetOffsetPosition(particle->Pos.X, particle->Pos.Y, particle->Vel.X, particle->Vel.Y); + DVector2 newxy = level.GetPortalOffsetPosition(particle->Pos.X, particle->Pos.Y, particle->Vel.X, particle->Vel.Y); particle->Pos.X = newxy.X; particle->Pos.Y = newxy.Y; particle->Pos.Z += particle->Vel.Z; diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index b369ffceb..e67ed311c 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -3402,7 +3402,7 @@ FUNC(LS_Thing_SetConversation) FUNC(LS_Line_SetPortalTarget) // Line_SetPortalTarget(thisid, destid) { - return P_ChangePortal(ln, arg0, arg1); + return Level->ChangePortal(ln, arg0, arg1); } FUNC(LS_Sector_SetPlaneReflection) diff --git a/src/p_map.cpp b/src/p_map.cpp index 8801b1791..9b52b897e 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -2928,7 +2928,7 @@ void FSlide::HitSlideLine(line_t* ld) void FSlide::SlideTraverse(const DVector2 &start, const DVector2 &end) { FLineOpening open; - FPathTraverse it(start.X, start.Y, end.X, end.Y, PT_ADDLINES); + FPathTraverse it(&level, start.X, start.Y, end.X, end.Y, PT_ADDLINES); intercept_t *in; while ((in = it.Next())) @@ -3285,7 +3285,7 @@ const secplane_t * P_CheckSlopeWalk(AActor *actor, DVector2 &move) bool FSlide::BounceTraverse(const DVector2 &start, const DVector2 &end) { FLineOpening open; - FPathTraverse it(start.X, start.Y, end.X, end.Y, PT_ADDLINES); + FPathTraverse it(&level, start.X, start.Y, end.X, end.Y, PT_ADDLINES); intercept_t *in; while ((in = it.Next())) @@ -3977,7 +3977,7 @@ struct aim_t if (ceilingportalstate) EnterSectorPortal(sector_t::ceiling, 0, lastsector, toppitch, MIN(0., bottompitch)); if (floorportalstate) EnterSectorPortal(sector_t::floor, 0, lastsector, MAX(0., toppitch), bottompitch); - FPathTraverse it(startpos.X, startpos.Y, aimtrace.X, aimtrace.Y, PT_ADDLINES | PT_ADDTHINGS | PT_COMPATIBLE | PT_DELTA, startfrac); + FPathTraverse it(&level, startpos.X, startpos.Y, aimtrace.X, aimtrace.Y, PT_ADDLINES | PT_ADDTHINGS | PT_COMPATIBLE | PT_DELTA, startfrac); intercept_t *in; if (aimdebug) @@ -4539,7 +4539,7 @@ AActor *P_LineAttack(AActor *t1, DAngle angle, double distance, // position a bit closer for puffs if (nointeract || trace.HitType != TRACE_HitWall || ((trace.Line->special != Line_Horizon) || spawnSky)) { - DVector2 pos = P_GetOffsetPosition(trace.HitPos.X, trace.HitPos.Y, -trace.HitVector.X * 4, -trace.HitVector.Y * 4); + DVector2 pos = level.GetPortalOffsetPosition(trace.HitPos.X, trace.HitPos.Y, -trace.HitVector.X * 4, -trace.HitVector.Y * 4); puff = P_SpawnPuff(t1, pufftype, DVector3(pos, trace.HitPos.Z - trace.HitVector.Z * 4), trace.SrcAngleFromTarget, trace.SrcAngleFromTarget - 90, 0, puffFlags); puff->radius = 1/65536.; @@ -4590,7 +4590,7 @@ AActor *P_LineAttack(AActor *t1, DAngle angle, double distance, // position a bit closer for puffs/blood if using compatibility mode. if (i_compatflags & COMPATF_HITSCAN) { - DVector2 ofs = P_GetOffsetPosition(bleedpos.X, bleedpos.Y, -10 * trace.HitVector.X, -10 * trace.HitVector.Y); + DVector2 ofs = level.GetPortalOffsetPosition(bleedpos.X, bleedpos.Y, -10 * trace.HitVector.X, -10 * trace.HitVector.Y); bleedpos.X = ofs.X; bleedpos.Y = ofs.Y; bleedpos.Z -= -10 * trace.HitVector.Z; @@ -5101,7 +5101,7 @@ static ETraceStatus ProcessRailHit(FTraceResults &res, void *userdata) newhit.HitAngle = res.SrcAngleFromTarget; if (i_compatflags & COMPATF_HITSCAN) { - DVector2 ofs = P_GetOffsetPosition(newhit.HitPos.X, newhit.HitPos.Y, -10 * res.HitVector.X, -10 * res.HitVector.Y); + DVector2 ofs = level.GetPortalOffsetPosition(newhit.HitPos.X, newhit.HitPos.Y, -10 * res.HitVector.X, -10 * res.HitVector.Y); newhit.HitPos.X = ofs.X; newhit.HitPos.Y = ofs.Y; newhit.HitPos.Z -= -10 * res.HitVector.Z; @@ -5376,7 +5376,7 @@ bool P_TalkFacing(AActor *player) bool P_UseTraverse(AActor *usething, const DVector2 &start, const DVector2 &end, bool &foundline) { - FPathTraverse it(start.X, start.Y, end.X, end.Y, PT_ADDLINES | PT_ADDTHINGS); + FPathTraverse it(&level, start.X, start.Y, end.X, end.Y, PT_ADDLINES | PT_ADDTHINGS); intercept_t *in; DVector3 xpos = { start.X, start.Y, usething->Z() }; @@ -5519,7 +5519,7 @@ bool P_UseTraverse(AActor *usething, const DVector2 &start, const DVector2 &end, bool P_NoWayTraverse(AActor *usething, const DVector2 &start, const DVector2 &end) { - FPathTraverse it(start.X, start.Y, end.X, end.Y, PT_ADDLINES); + FPathTraverse it(&level, start.X, start.Y, end.X, end.Y, PT_ADDLINES); intercept_t *in; while ((in = it.Next())) @@ -5596,7 +5596,7 @@ int P_UsePuzzleItem(AActor *PuzzleItemUser, int PuzzleItemType) start = PuzzleItemUser->GetPortalTransition(PuzzleItemUser->Height / 2); end = PuzzleItemUser->Angles.Yaw.ToVector(usedist); - FPathTraverse it(start.X, start.Y, end.X, end.Y, PT_DELTA | PT_ADDLINES | PT_ADDTHINGS); + FPathTraverse it(&level, start.X, start.Y, end.X, end.Y, PT_DELTA | PT_ADDLINES | PT_ADDTHINGS); intercept_t *in; while ((in = it.Next())) diff --git a/src/p_maputl.cpp b/src/p_maputl.cpp index 678f3fbdd..cf4b3cf03 100644 --- a/src/p_maputl.cpp +++ b/src/p_maputl.cpp @@ -504,7 +504,7 @@ void AActor::LinkToWorld(FLinkContext *ctx, bool spawningmapthing, sector_t *sec { FPortalGroupArray check; - P_CollectConnectedGroups(Sector->PortalGroup, Pos(), Top(), radius, check); + level.CollectConnectedGroups(Sector->PortalGroup, Pos(), Top(), radius, check); BlockNode = NULL; FBlockNode **alink = &this->BlockNode; @@ -714,7 +714,7 @@ FMultiBlockLinesIterator::FMultiBlockLinesIterator(FPortalGroupArray &check, AAc : checklist(check) { checkpoint = origin->Pos(); - if (!check.inited) P_CollectConnectedGroups(origin->Sector->PortalGroup, checkpoint, origin->Top(), checkradius, checklist); + if (!check.inited) level.CollectConnectedGroups(origin->Sector->PortalGroup, checkpoint, origin->Top(), checkradius, checklist); checkpoint.Z = checkradius == -1? origin->radius : checkradius; basegroup = origin->Sector->PortalGroup; startsector = origin->Sector; @@ -728,7 +728,7 @@ FMultiBlockLinesIterator::FMultiBlockLinesIterator(FPortalGroupArray &check, dou if (newsec == NULL) newsec = P_PointInSector(checkx, checky); startsector = newsec; basegroup = newsec->PortalGroup; - if (!check.inited) P_CollectConnectedGroups(basegroup, checkpoint, checkz + checkh, checkradius, checklist); + if (!check.inited) level.CollectConnectedGroups(basegroup, checkpoint, checkz + checkh, checkradius, checklist); checkpoint.Z = checkradius; Reset(); } @@ -1056,7 +1056,7 @@ FMultiBlockThingsIterator::FMultiBlockThingsIterator(FPortalGroupArray &check, A : checklist(check) { checkpoint = origin->Pos(); - if (!check.inited) P_CollectConnectedGroups(origin->Sector->PortalGroup, checkpoint, origin->Top(), checkradius, checklist); + if (!check.inited) level.CollectConnectedGroups(origin->Sector->PortalGroup, checkpoint, origin->Top(), checkradius, checklist); checkpoint.Z = checkradius == -1? origin->radius : checkradius; basegroup = origin->Sector->PortalGroup; Reset(); @@ -1070,7 +1070,7 @@ FMultiBlockThingsIterator::FMultiBlockThingsIterator(FPortalGroupArray &check, d checkpoint.Z = checkz; if (newsec == NULL) newsec = P_PointInSector(checkx, checky); basegroup = newsec->PortalGroup; - if (!check.inited) P_CollectConnectedGroups(basegroup, checkpoint, checkz + checkh, checkradius, checklist); + if (!check.inited) level.CollectConnectedGroups(basegroup, checkpoint, checkz + checkh, checkradius, checklist); checkpoint.Z = checkradius; Reset(); } diff --git a/src/p_maputl.h b/src/p_maputl.h index 23e3f3ed6..c8b5cd9ff 100644 --- a/src/p_maputl.h +++ b/src/p_maputl.h @@ -358,6 +358,7 @@ class FPathTraverse protected: static TArray intercepts; + FLevelLocals *Level; divline_t trace; double Startfrac; unsigned int intercept_index; @@ -366,13 +367,17 @@ protected: virtual void AddLineIntercepts(int bx, int by); virtual void AddThingIntercepts(int bx, int by, FBlockThingsIterator &it, bool compatible); - FPathTraverse() {} + FPathTraverse(FLevelLocals *l) + { + Level = l; + } public: intercept_t *Next(); - FPathTraverse(double x1, double y1, double x2, double y2, int flags, double startfrac = 0) + FPathTraverse(FLevelLocals *l, double x1, double y1, double x2, double y2, int flags, double startfrac = 0) { + Level = l; init(x1, y1, x2, y2, flags, startfrac); } void init(double x1, double y1, double x2, double y2, int flags, double startfrac = 0); @@ -392,23 +397,6 @@ public: }; -//============================================================================ -// -// A traverser that uses the portal blockmap -// This should be in portal.h but that'd create circular dependencies. -// -//============================================================================ - -class FLinePortalTraverse : public FPathTraverse -{ - void AddLineIntercepts(int bx, int by); - -public: - FLinePortalTraverse() - { - } -}; - // // P_MAPUTL // diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 3e2e78dca..c6eb7e925 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -988,7 +988,7 @@ void G_SerializeLevel(FSerializer &arc, FLevelLocals *Level, bool hubload) arc("zones", Level->Zones); arc("lineportals", Level->linePortals); arc("sectorportals", Level->sectorPortals); - if (arc.isReading()) P_FinalizePortals(); + if (arc.isReading()) Level->FinalizePortals(); // [ZZ] serialize health groups P_SerializeHealthGroups(arc); diff --git a/src/p_teleport.cpp b/src/p_teleport.cpp index 844d462b0..117245c67 100644 --- a/src/p_teleport.cpp +++ b/src/p_teleport.cpp @@ -186,7 +186,7 @@ bool P_Teleport (AActor *thing, DVector3 pos, DAngle angle, int flags) if (!predicting) { DVector2 vector = angle.ToVector(20); - DVector2 fogpos = P_GetOffsetPosition(pos.X, pos.Y, vector.X, vector.Y); + DVector2 fogpos = level.GetPortalOffsetPosition(pos.X, pos.Y, vector.X, vector.Y); P_SpawnTeleportFog(thing, DVector3(fogpos, thing->Z()), false, true); } diff --git a/src/p_trace.cpp b/src/p_trace.cpp index d2f3e71f4..b4a33ade9 100644 --- a/src/p_trace.cpp +++ b/src/p_trace.cpp @@ -777,7 +777,7 @@ bool FTraceInfo::TraceTraverse (int ptflags) // Do a 3D floor check in the starting sector Setup3DFloors(); - FPathTraverse it(Start.X, Start.Y, Vec.X * MaxDist, Vec.Y * MaxDist, ptflags | PT_DELTA, startfrac); + FPathTraverse it(&level, Start.X, Start.Y, Vec.X * MaxDist, Vec.Y * MaxDist, ptflags | PT_DELTA, startfrac); intercept_t *in; int lastsplashsector = -1; diff --git a/src/portal.cpp b/src/portal.cpp index 434cc7320..fd6eb503c 100644 --- a/src/portal.cpp +++ b/src/portal.cpp @@ -64,72 +64,40 @@ DEFINE_FIELD(FSectorPortal, mDisplacement); DEFINE_FIELD(FSectorPortal, mPlaneZ); DEFINE_FIELD(FSectorPortal, mSkybox); -//============================================================================ -// -// This is used to mark processed portals for some collection functions. -// -//============================================================================ - -struct FPortalBits -{ - TArray data; - - void setSize(int num) - { - data.Resize((num + 31) / 32); - clear(); - } - - void clear() - { - memset(&data[0], 0, data.Size()*sizeof(uint32_t)); - } - - void setBit(int group) - { - data[group >> 5] |= (1 << (group & 31)); - } - - int getBit(int group) - { - return data[group >> 5] & (1 << (group & 31)); - } -}; - //============================================================================ // // BuildBlockmap // //============================================================================ -static void BuildBlockmap() +void FLevelLocals::BuildPortalBlockmap() { - auto bmapwidth = level.blockmap.bmapwidth; - auto bmapheight = level.blockmap.bmapheight; + auto bmapwidth = blockmap.bmapwidth; + auto bmapheight = blockmap.bmapheight; - level.PortalBlockmap.Clear(); - level.PortalBlockmap.Create(bmapwidth, bmapheight); + PortalBlockmap.Clear(); + PortalBlockmap.Create(bmapwidth, bmapheight); for (int y = 0; y < bmapheight; y++) { for (int x = 0; x < bmapwidth; x++) { - int *list = level.blockmap.GetLines(x, y); - FPortalBlock &block = level.PortalBlockmap(x, y); + int *list = blockmap.GetLines(x, y); + FPortalBlock &block = PortalBlockmap(x, y); while (*list != -1) { - line_t *ld = &level.lines[*list++]; + line_t *ld = &lines[*list++]; FLinePortal *port = ld->getPortal(); if (port && port->mType != PORTT_VISUAL) { - level.PortalBlockmap.containsLines = true; + PortalBlockmap.containsLines = true; block.portallines.Push(ld); block.neighborContainsLines = true; if (ld->getPortal()->mType == PORTT_LINKED) block.containsLinkedPortals = true; - if (x > 0) level.PortalBlockmap(x - 1, y).neighborContainsLines = true; - if (y > 0) level.PortalBlockmap(x, y - 1).neighborContainsLines = true; - if (x < level.PortalBlockmap.dx - 1) level.PortalBlockmap(x + 1, y).neighborContainsLines = true; - if (y < level.PortalBlockmap.dy - 1) level.PortalBlockmap(x, y + 1).neighborContainsLines = true; + if (x > 0) PortalBlockmap(x - 1, y).neighborContainsLines = true; + if (y > 0) PortalBlockmap(x, y - 1).neighborContainsLines = true; + if (x < PortalBlockmap.dx - 1) PortalBlockmap(x + 1, y).neighborContainsLines = true; + if (y < PortalBlockmap.dy - 1) PortalBlockmap(x, y + 1).neighborContainsLines = true; } else { @@ -140,7 +108,7 @@ static void BuildBlockmap() yes |= ld->backsector->PortalIsLinked(sector_t::ceiling) || ld->backsector->PortalIsLinked(sector_t::floor); } block.containsLinkedPortals |= yes; - level.PortalBlockmap.hasLinkedSectorPortals |= yes; + PortalBlockmap.hasLinkedSectorPortals |= yes; } } @@ -148,6 +116,23 @@ static void BuildBlockmap() } } +//============================================================================ +// +// A traverser that uses the portal blockmap +// +//============================================================================ + +class FLinePortalTraverse : public FPathTraverse +{ + void AddLineIntercepts(int bx, int by); + +public: + FLinePortalTraverse(FLevelLocals *l) : FPathTraverse(l) + { + } +}; + + //=========================================================================== // // FLinePortalTraverse :: AddLineIntercepts. @@ -158,9 +143,9 @@ static void BuildBlockmap() void FLinePortalTraverse::AddLineIntercepts(int bx, int by) { - if (by < 0 || by >= level.PortalBlockmap.dy || bx < 0 || bx >= level.PortalBlockmap.dx) return; + if (by < 0 || by >= Level->PortalBlockmap.dy || bx < 0 || bx >= Level->PortalBlockmap.dx) return; - FPortalBlock &block = level.PortalBlockmap(bx, by); + FPortalBlock &block = Level->PortalBlockmap(bx, by); for (unsigned i = 0; i= 0) { - if (&level.lines[lineno] != src) + if (&lines[lineno] != src) { - return &level.lines[lineno]; + return &lines[lineno]; } } } @@ -228,7 +213,7 @@ static line_t *FindDestination(line_t *src, int tag) // //============================================================================ -static void SetRotation(FLinePortal *port) +static void SetPortalRotation(FLinePortal *port) { if (port != nullptr && port->mDestination != nullptr) { @@ -259,95 +244,13 @@ static void SetRotation(FLinePortal *port) } } -//============================================================================ -// -// Spawns a single line portal -// -//============================================================================ - -void P_SpawnLinePortal(line_t* line) -{ - // portal destination is special argument #0 - line_t* dst = nullptr; - - if (line->args[2] >= PORTT_VISUAL && line->args[2] <= PORTT_LINKED) - { - dst = FindDestination(line, line->args[0]); - - line->portalindex = level.linePortals.Reserve(1); - FLinePortal *port = &level.linePortals.Last(); - - memset(port, 0, sizeof(FLinePortal)); - port->mOrigin = line; - port->mDestination = dst; - port->mType = uint8_t(line->args[2]); // range check is done above. - - if (port->mType == PORTT_LINKED) - { - // Linked portals have no z-offset ever. - port->mAlign = PORG_ABSOLUTE; - } - else - { - port->mAlign = uint8_t(line->args[3] >= PORG_ABSOLUTE && line->args[3] <= PORG_CEILING ? line->args[3] : PORG_ABSOLUTE); - if (port->mType == PORTT_INTERACTIVE && port->mAlign != PORG_ABSOLUTE) - { - // Due to the way z is often handled, these pose a major issue for parts of the code that needs to transparently handle interactive portals. - Printf(TEXTCOLOR_RED "Warning: z-offsetting not allowed for interactive portals. Changing line %d to teleport-portal!\n", line->Index()); - port->mType = PORTT_TELEPORT; - } - } - port->mDefFlags = port->mType == PORTT_VISUAL ? PORTF_VISIBLE : - port->mType == PORTT_TELEPORT ? PORTF_TYPETELEPORT : - PORTF_TYPEINTERACTIVE; - } - else if (line->args[2] == PORTT_LINKEDEE && line->args[0] == 0) - { - // EE-style portals require that the first line ID is identical and the first arg of the two linked linedefs are 0 and 1 respectively. - - int mytag = level.GetFirstLineId(line); - - for (auto &ln : level.lines) - { - if (level.GetFirstLineId(&ln) == mytag && ln.args[0] == 1 && ln.special == Line_SetPortal) - { - line->portalindex = level.linePortals.Reserve(1); - FLinePortal *port = &level.linePortals.Last(); - - memset(port, 0, sizeof(FLinePortal)); - port->mOrigin = line; - port->mDestination = &ln; - port->mType = PORTT_LINKED; - port->mAlign = PORG_ABSOLUTE; - port->mDefFlags = PORTF_TYPEINTERACTIVE; - - // we need to create the backlink here, too. - ln.portalindex = level.linePortals.Reserve(1); - port = &level.linePortals.Last(); - - memset(port, 0, sizeof(FLinePortal)); - port->mOrigin = &ln; - port->mDestination = line; - port->mType = PORTT_LINKED; - port->mAlign = PORG_ABSOLUTE; - port->mDefFlags = PORTF_TYPEINTERACTIVE; - } - } - } - else - { - // undefined type - return; - } -} - //============================================================================ // // Update a line portal's state after all have been spawned // //============================================================================ -void P_UpdatePortal(FLinePortal *port) +void FLevelLocals::UpdatePortal(FLinePortal *port) { if (port->mType != PORTT_VISUAL && port->mOrigin->backsector == nullptr && !(port->mOrigin->sidedef[0]->Flags & WALLF_POLYOBJ)) { @@ -378,7 +281,7 @@ void P_UpdatePortal(FLinePortal *port) port->mFlags = port->mDefFlags; if (port->mType == PORTT_LINKED) { - if (level.linePortals[port->mDestination->portalindex].mType != PORTT_LINKED) + if (linePortals[port->mDestination->portalindex].mType != PORTT_LINKED) { port->mType = PORTT_INTERACTIVE; // linked portals must be two-way. } @@ -390,7 +293,7 @@ void P_UpdatePortal(FLinePortal *port) } // Cache the angle between the two linedefs, for rotating. - SetRotation(port); + SetPortalRotation(port); } //============================================================================ @@ -400,15 +303,15 @@ void P_UpdatePortal(FLinePortal *port) // //============================================================================ -void P_CollectLinkedPortals() +void FLevelLocals::CollectLinkedPortals() { - level.linkedPortals.Clear(); - for (unsigned i = 0; i < level.linePortals.Size(); i++) + linkedPortals.Clear(); + for (unsigned i = 0; i < linePortals.Size(); i++) { - FLinePortal * port = &level.linePortals[i]; + FLinePortal * port = &linePortals[i]; if (port->mType == PORTT_LINKED) { - level.linkedPortals.Push(port); + linkedPortals.Push(port); } } } @@ -419,16 +322,16 @@ void P_CollectLinkedPortals() // //============================================================================ -void P_FinalizePortals() +void FLevelLocals::FinalizePortals() { - for (unsigned i = 0; i < level.linePortals.Size(); i++) + for (unsigned i = 0; i < linePortals.Size(); i++) { - FLinePortal * port = &level.linePortals[i]; - P_UpdatePortal(port); + FLinePortal * port = &linePortals[i]; + UpdatePortal(port); } - P_CollectLinkedPortals(); - BuildBlockmap(); - P_CreateLinkedPortals(); + CollectLinkedPortals(); + BuildPortalBlockmap(); + CreateLinkedPortals(); } //============================================================================ @@ -437,20 +340,20 @@ void P_FinalizePortals() // //============================================================================ -static bool ChangePortalLine(line_t *line, int destid) +bool FLevelLocals::ChangePortalLine(line_t *line, int destid) { - if (line->portalindex >= level.linePortals.Size()) return false; - FLinePortal *port = &level.linePortals[line->portalindex]; + if (line->portalindex >= linePortals.Size()) return false; + FLinePortal *port = &linePortals[line->portalindex]; if (port->mType == PORTT_LINKED) return false; // linked portals cannot be changed. if (destid == 0) port->mDestination = nullptr; - port->mDestination = FindDestination(line, destid); + port->mDestination = FindPortalDestination(line, destid); if (port->mDestination == nullptr) { port->mFlags = 0; } else if (port->mType == PORTT_INTERACTIVE) { - FLinePortal *portd = port->mDestination->portalindex < level.linePortals.Size()? &level.linePortals[port->mDestination->portalindex] : nullptr; + FLinePortal *portd = port->mDestination->portalindex < linePortals.Size()? &linePortals[port->mDestination->portalindex] : nullptr; if (portd != nullptr && portd->mType == PORTT_INTERACTIVE && portd->mDestination == line) { // this is a 2-way interactive portal @@ -461,13 +364,13 @@ static bool ChangePortalLine(line_t *line, int destid) { port->mFlags = port->mDefFlags; } - SetRotation(portd); + SetPortalRotation(portd); } else { port->mFlags = port->mDefFlags; } - SetRotation(port); + SetPortalRotation(port); return true; } @@ -478,16 +381,16 @@ static bool ChangePortalLine(line_t *line, int destid) // //============================================================================ -bool P_ChangePortal(line_t *ln, int thisid, int destid) +bool FLevelLocals::ChangePortal(line_t *ln, int thisid, int destid) { int lineno; if (thisid == 0) return ChangePortalLine(ln, destid); - auto it = level.GetLineIdIterator(thisid); + auto it = GetLineIdIterator(thisid); bool res = false; while ((lineno = it.Next()) >= 0) { - res |= ChangePortalLine(&level.lines[lineno], destid); + res |= ChangePortalLine(&lines[lineno], destid); } return res; } @@ -553,7 +456,7 @@ void P_TranslatePortalXY(line_t* src, double& x, double& y) if (!src) return; FLinePortal *port = src->getPortal(); if (!port) return; - if (port->mFlags & PORTF_POLYOBJ) SetRotation(port); // update the angle for polyportals. + if (port->mFlags & PORTF_POLYOBJ) SetPortalRotation(port); // update the angle for polyportals. // offsets from line double nposx = x - src->v1->fX(); @@ -581,7 +484,7 @@ void P_TranslatePortalVXVY(line_t* src, double &velx, double &vely) if (!src) return; FLinePortal *port = src->getPortal(); if (!port) return; - if (port->mFlags & PORTF_POLYOBJ) SetRotation(port); // update the angle for polyportals. + if (port->mFlags & PORTF_POLYOBJ) SetPortalRotation(port); // update the angle for polyportals. double orig_velx = velx; double orig_vely = vely; @@ -600,7 +503,7 @@ void P_TranslatePortalAngle(line_t* src, DAngle& angle) if (!src) return; FLinePortal *port = src->getPortal(); if (!port) return; - if (port->mFlags & PORTF_POLYOBJ) SetRotation(port); // update the angle for polyportals. + if (port->mFlags & PORTF_POLYOBJ) SetPortalRotation(port); // update the angle for polyportals. angle = (angle + port->mAngleDiff).Normalized360(); } @@ -642,27 +545,27 @@ void P_TranslatePortalZ(line_t* src, double& z) // //============================================================================ -unsigned P_GetSkyboxPortal(AActor *actor) +unsigned FLevelLocals::GetSkyboxPortal(AActor *actor) { if (actor == nullptr) return 1; // this means a regular sky. - for (unsigned i = 0;iGetClass()->IsDescendantOf("SkyCamCompat") ? 0 : PORTSF_SKYFLATONLY; - level.sectorPortals[i].mSkybox = actor; - level.sectorPortals[i].mDestination = actor->Sector; + unsigned i = sectorPortals.Reserve(1); + memset(§orPortals[i], 0, sizeof(sectorPortals[i])); + sectorPortals[i].mType = PORTS_SKYVIEWPOINT; + sectorPortals[i].mFlags = actor->GetClass()->IsDescendantOf("SkyCamCompat") ? 0 : PORTSF_SKYFLATONLY; + sectorPortals[i].mSkybox = actor; + sectorPortals[i].mDestination = actor->Sector; return i; } -DEFINE_ACTION_FUNCTION(FSectorPortal, GetSkyboxPortal) +DEFINE_ACTION_FUNCTION(FLevelLocals, GetSkyboxPortal) { - PARAM_PROLOGUE; + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); PARAM_OBJECT(actor, AActor); - ACTION_RETURN_INT(P_GetSkyboxPortal(actor)); + ACTION_RETURN_INT(self->GetSkyboxPortal(actor)); } //============================================================================ // @@ -672,16 +575,16 @@ DEFINE_ACTION_FUNCTION(FSectorPortal, GetSkyboxPortal) // //============================================================================ -unsigned P_GetPortal(int type, int plane, sector_t *from, sector_t *to, const DVector2 &displacement) +unsigned FLevelLocals::GetPortal(int type, int plane, sector_t *from, sector_t *to, const DVector2 &displacement) { - unsigned i = level.sectorPortals.Reserve(1); - memset(&level.sectorPortals[i], 0, sizeof(level.sectorPortals[i])); - level.sectorPortals[i].mType = type; - level.sectorPortals[i].mPlane = plane; - level.sectorPortals[i].mOrigin = from; - level.sectorPortals[i].mDestination = to; - level.sectorPortals[i].mDisplacement = displacement; - level.sectorPortals[i].mPlaneZ = type == PORTS_LINKEDPORTAL? from->GetPlaneTexZ(plane) : FLT_MAX; + unsigned i = sectorPortals.Reserve(1); + memset(§orPortals[i], 0, sizeof(sectorPortals[i])); + sectorPortals[i].mType = type; + sectorPortals[i].mPlane = plane; + sectorPortals[i].mOrigin = from; + sectorPortals[i].mDestination = to; + sectorPortals[i].mDisplacement = displacement; + sectorPortals[i].mPlaneZ = type == PORTS_LINKEDPORTAL? from->GetPlaneTexZ(plane) : FLT_MAX; return i; } @@ -693,47 +596,47 @@ unsigned P_GetPortal(int type, int plane, sector_t *from, sector_t *to, const DV // //============================================================================ -unsigned P_GetStackPortal(AActor *point, int plane) +unsigned FLevelLocals::GetStackPortal(AActor *point, int plane) { - unsigned i = level.sectorPortals.Reserve(1); - memset(&level.sectorPortals[i], 0, sizeof(level.sectorPortals[i])); - level.sectorPortals[i].mType = PORTS_STACKEDSECTORTHING; - level.sectorPortals[i].mPlane = plane; - level.sectorPortals[i].mOrigin = point->target->Sector; - level.sectorPortals[i].mDestination = point->Sector; - level.sectorPortals[i].mPlaneZ = FLT_MAX; - level.sectorPortals[i].mSkybox = point; + unsigned i = sectorPortals.Reserve(1); + memset(§orPortals[i], 0, sizeof(sectorPortals[i])); + sectorPortals[i].mType = PORTS_STACKEDSECTORTHING; + sectorPortals[i].mPlane = plane; + sectorPortals[i].mOrigin = point->target->Sector; + sectorPortals[i].mDestination = point->Sector; + sectorPortals[i].mPlaneZ = FLT_MAX; + sectorPortals[i].mSkybox = point; return i; } //============================================================================ // -// P_GetOffsetPosition +// level.GetPortalOffsetPosition // // Offsets a given coordinate if the trace from the origin crosses an // interactive line-to-line portal. // //============================================================================ -DVector2 P_GetOffsetPosition(double x, double y, double dx, double dy) +DVector2 FLevelLocals::GetPortalOffsetPosition(double x, double y, double dx, double dy) { DVector2 dest(x + dx, y + dy); - if (level.PortalBlockmap.containsLines) + if (PortalBlockmap.containsLines) { double actx = x, acty = y; // Try some easily discoverable early-out first. If we know that the trace cannot possibly find a portal, this saves us from calling the traverser completely for vast parts of the map. if (dx < 128 && dy < 128) { - int blockx = level.blockmap.GetBlockX(actx); - int blocky = level.blockmap.GetBlockY(acty); - if (blockx < 0 || blocky < 0 || blockx >= level.PortalBlockmap.dx || blocky >= level.PortalBlockmap.dy || !level.PortalBlockmap(blockx, blocky).neighborContainsLines) return dest; + int blockx = blockmap.GetBlockX(actx); + int blocky = blockmap.GetBlockY(acty); + if (blockx < 0 || blocky < 0 || blockx >= PortalBlockmap.dx || blocky >= PortalBlockmap.dy || !PortalBlockmap(blockx, blocky).neighborContainsLines) return dest; } bool repeat; do { - FLinePortalTraverse it; + FLinePortalTraverse it(this); it.init(actx, acty, dx, dy, PT_ADDLINES|PT_DELTA); intercept_t *in; @@ -777,11 +680,6 @@ DVector2 P_GetOffsetPosition(double x, double y, double dx, double dy) return dest; } -static void GetOffsetPosition(double x, double y, double dx, double dy, DVector2 *result) -{ - *result = P_GetOffsetPosition(x, y, dx, dy); -} - //============================================================================ // // CollectSectors @@ -829,7 +727,7 @@ static bool CollectSectors(int groupid, sector_t *origin) // //============================================================================ -static void AddDisplacementForPortal(FSectorPortal *portal) +void FLevelLocals::AddDisplacementForPortal(FSectorPortal *portal) { int thisgroup = portal->mOrigin->PortalGroup; int othergroup = portal->mDestination->PortalGroup; @@ -839,14 +737,14 @@ static void AddDisplacementForPortal(FSectorPortal *portal) portal->mType = PORTS_PORTAL; return; } - if (thisgroup <= 0 || thisgroup >= level.Displacements.size || othergroup <= 0 || othergroup >= level.Displacements.size) + if (thisgroup <= 0 || thisgroup >= Displacements.size || othergroup <= 0 || othergroup >= Displacements.size) { Printf("Portal between sectors %d and %d has invalid group and will be disabled\n", portal->mOrigin->sectornum, portal->mDestination->sectornum); portal->mType = PORTS_PORTAL; return; } - FDisplacement & disp = level.Displacements(thisgroup, othergroup); + FDisplacement & disp = Displacements(thisgroup, othergroup); if (!disp.isSet) { disp.pos = portal->mDisplacement; @@ -864,24 +762,24 @@ static void AddDisplacementForPortal(FSectorPortal *portal) } -static void AddDisplacementForPortal(FLinePortal *portal) +void FLevelLocals::AddDisplacementForPortal(FLinePortal *portal) { int thisgroup = portal->mOrigin->frontsector->PortalGroup; int othergroup = portal->mDestination->frontsector->PortalGroup; if (thisgroup == othergroup) { Printf("Portal between lines %d and %d has both sides in same group\n", portal->mOrigin->Index(), portal->mDestination->Index()); - portal->mType = level.linePortals[portal->mDestination->portalindex].mType = PORTT_TELEPORT; + portal->mType = linePortals[portal->mDestination->portalindex].mType = PORTT_TELEPORT; return; } - if (thisgroup <= 0 || thisgroup >= level.Displacements.size || othergroup <= 0 || othergroup >= level.Displacements.size) + if (thisgroup <= 0 || thisgroup >= Displacements.size || othergroup <= 0 || othergroup >= Displacements.size) { Printf("Portal between lines %d and %d has invalid group\n", portal->mOrigin->Index(), portal->mDestination->Index()); - portal->mType = level.linePortals[portal->mDestination->portalindex].mType = PORTT_TELEPORT; + portal->mType = linePortals[portal->mDestination->portalindex].mType = PORTT_TELEPORT; return; } - FDisplacement & disp = level.Displacements(thisgroup, othergroup); + FDisplacement & disp = Displacements(thisgroup, othergroup); if (!disp.isSet) { disp.pos = portal->mDisplacement; @@ -892,7 +790,7 @@ static void AddDisplacementForPortal(FLinePortal *portal) if (disp.pos != portal->mDisplacement) { Printf("Portal between lines %d and %d has displacement mismatch\n", portal->mOrigin->Index(), portal->mDestination->Index()); - portal->mType = level.linePortals[portal->mDestination->portalindex].mType = PORTT_TELEPORT; + portal->mType = linePortals[portal->mDestination->portalindex].mType = PORTT_TELEPORT; return; } } @@ -906,7 +804,7 @@ static void AddDisplacementForPortal(FLinePortal *portal) // //============================================================================ -static bool ConnectGroups() +bool FLevelLocals::ConnectPortalGroups() { // Now uint8_t indirect = 1; @@ -915,19 +813,19 @@ static bool ConnectGroups() do { changed = false; - for (int x = 1; x < level.Displacements.size; x++) + for (int x = 1; x < Displacements.size; x++) { - for (int y = 1; y < level.Displacements.size; y++) + for (int y = 1; y < Displacements.size; y++) { - FDisplacement &dispxy = level.Displacements(x, y); + FDisplacement &dispxy = Displacements(x, y); if (dispxy.isSet) { - for (int z = 1; z < level.Displacements.size; z++) + for (int z = 1; z < Displacements.size; z++) { - FDisplacement &dispyz = level.Displacements(y, z); + FDisplacement &dispyz = Displacements(y, z); if (dispyz.isSet) { - FDisplacement &dispxz = level.Displacements(x, z); + FDisplacement &dispxz = Displacements(x, z); if (dispxz.isSet) { if (dispxy.pos.X + dispyz.pos.X != dispxz.pos.X || dispxy.pos.Y + dispyz.pos.Y != dispxz.pos.Y) @@ -966,13 +864,13 @@ static bool ConnectGroups() // //============================================================================ -void P_CreateLinkedPortals() +void FLevelLocals::CreateLinkedPortals() { TArray orgs; int id = 1; bool bogus = false; - for(auto &s : level.sectorPortals) + for(auto &s : sectorPortals) { if (s.mType == PORTS_LINKEDPORTAL) { @@ -982,7 +880,7 @@ void P_CreateLinkedPortals() id = 1; if (orgs.Size() != 0) { - for (auto &sec : level.sectors) + for (auto &sec : sectors) { for (int j = 0; j < 2; j++) { @@ -1006,27 +904,27 @@ void P_CreateLinkedPortals() if (CollectSectors(id, orgs[i]->mDestination)) id++; } } - for (unsigned i = 0; i < level.linePortals.Size(); i++) + for (unsigned i = 0; i < linePortals.Size(); i++) { - if (level.linePortals[i].mType == PORTT_LINKED) + if (linePortals[i].mType == PORTT_LINKED) { - if (level.linePortals[i].mDestination == nullptr) + if (linePortals[i].mDestination == nullptr) { - Printf("Linked portal on line %d is unconnected and will be disabled\n", level.linePortals[i].mOrigin->Index()); - level.linePortals[i].mOrigin->portalindex = UINT_MAX; - level.linePortals[i].mType = PORTT_VISUAL; + Printf("Linked portal on line %d is unconnected and will be disabled\n", linePortals[i].mOrigin->Index()); + linePortals[i].mOrigin->portalindex = UINT_MAX; + linePortals[i].mType = PORTT_VISUAL; } else { - if (CollectSectors(id, level.linePortals[i].mOrigin->frontsector)) id++; - if (CollectSectors(id, level.linePortals[i].mDestination->frontsector)) id++; + if (CollectSectors(id, linePortals[i].mOrigin->frontsector)) id++; + if (CollectSectors(id, linePortals[i].mDestination->frontsector)) id++; } } } - level.Displacements.Create(id); + Displacements.Create(id); // Check for leftover sectors that connect to a portal - for (auto &sec : level.sectors) + for (auto &sec : sectors) { for (int j = 0; j < 2; j++) { @@ -1041,34 +939,34 @@ void P_CreateLinkedPortals() { AddDisplacementForPortal(orgs[i]); } - for (unsigned i = 0; i < level.linePortals.Size(); i++) + for (unsigned i = 0; i < linePortals.Size(); i++) { - if (level.linePortals[i].mType == PORTT_LINKED) + if (linePortals[i].mType == PORTT_LINKED) { - AddDisplacementForPortal(&level.linePortals[i]); + AddDisplacementForPortal(&linePortals[i]); } } - for (int x = 1; x < level.Displacements.size; x++) + for (int x = 1; x < Displacements.size; x++) { - for (int y = x + 1; y < level.Displacements.size; y++) + for (int y = x + 1; y < Displacements.size; y++) { - FDisplacement &dispxy = level.Displacements(x, y); - FDisplacement &dispyx = level.Displacements(y, x); + FDisplacement &dispxy = Displacements(x, y); + FDisplacement &dispyx = Displacements(y, x); if (dispxy.isSet && dispyx.isSet && (dispxy.pos.X != -dispyx.pos.X || dispxy.pos.Y != -dispyx.pos.Y)) { int sec1 = -1, sec2 = -1; - for (unsigned i = 0; i < level.sectors.Size() && (sec1 == -1 || sec2 == -1); i++) + for (unsigned i = 0; i < sectors.Size() && (sec1 == -1 || sec2 == -1); i++) { - if (sec1 == -1 && level.sectors[i].PortalGroup == x) sec1 = i; - if (sec2 == -1 && level.sectors[i].PortalGroup == y) sec2 = i; + if (sec1 == -1 && sectors[i].PortalGroup == x) sec1 = i; + if (sec2 == -1 && sectors[i].PortalGroup == y) sec2 = i; } Printf("Link offset mismatch between sectors %d and %d\n", sec1, sec2); bogus = true; } // mark everything that connects to a one-sided line - for (auto &line : level.lines) + for (auto &line : lines) { if (line.backsector == nullptr && line.frontsector->PortalGroup == 0) { @@ -1076,7 +974,7 @@ void P_CreateLinkedPortals() } } // and now print a message for everything that still wasn't processed. - for (auto &sec : level.sectors) + for (auto &sec : sectors) { if (sec.PortalGroup == 0) { @@ -1086,19 +984,19 @@ void P_CreateLinkedPortals() } } } - bogus |= ConnectGroups(); + bogus |= ConnectPortalGroups(); if (bogus) { // todo: disable all portals whose offsets do not match the associated groups } // reject would just get in the way when checking sight through portals. - if (level.Displacements.size > 1) + if (Displacements.size > 1) { - level.rejectmatrix.Reset(); + rejectmatrix.Reset(); } // finally we must flag all planes which are obstructed by the sector's own ceiling or floor. - for (auto &sec : level.sectors) + for (auto &sec : sectors) { sec.CheckPortalPlane(sector_t::floor); sec.CheckPortalPlane(sector_t::ceiling); @@ -1134,7 +1032,7 @@ void P_CreateLinkedPortals() if (sec.PortalIsLinked(sector_t::floor)) sec.planes[sector_t::floor].Flags |= PLANEF_LINKED; if (sec.PortalIsLinked(sector_t::ceiling)) sec.planes[sector_t::ceiling].Flags |= PLANEF_LINKED; } - if (level.linkedPortals.Size() > 0) + if (linkedPortals.Size() > 0) { // We need to relink all actors that may touch a linked line portal TThinkerIterator it; @@ -1144,7 +1042,7 @@ void P_CreateLinkedPortals() if (!(actor->flags & MF_NOBLOCKMAP)) { FPortalGroupArray check(FPortalGroupArray::PGA_NoSectorPortals); - P_CollectConnectedGroups(actor->Sector->PortalGroup, actor->Pos(), actor->Top(), actor->radius, check); + CollectConnectedGroups(actor->Sector->PortalGroup, actor->Pos(), actor->Top(), actor->radius, check); if (check.Size() > 0) { FLinkContext ctx; @@ -1164,25 +1062,19 @@ void P_CreateLinkedPortals() // //============================================================================ -bool P_CollectConnectedGroups(int startgroup, const DVector3 &position, double upperz, double checkradius, FPortalGroupArray &out) +bool FLevelLocals::CollectConnectedGroups(int startgroup, const DVector3 &position, double upperz, double checkradius, FPortalGroupArray &out) { - // Keep this temporary work stuff static. This function can never be called recursively - // and this would have to be reallocated for each call otherwise. - static FPortalBits processMask; - static TArray foundPortals; - static TArray groupsToCheck; - bool retval = false; out.inited = true; - processMask.setSize(level.Displacements.size); - if (level.Displacements.size == 1) + processMask.setSize(Displacements.size); + if (Displacements.size == 1) { processMask.setBit(startgroup); return false; } - if (level.linkedPortals.Size() != 0) + if (linkedPortals.Size() != 0) { processMask.clear(); foundPortals.Clear(); @@ -1191,17 +1083,17 @@ bool P_CollectConnectedGroups(int startgroup, const DVector3 &position, double u processMask.setBit(thisgroup); //out.Add(thisgroup); - for (unsigned i = 0; i < level.linkedPortals.Size(); i++) + for (unsigned i = 0; i < linkedPortals.Size(); i++) { - line_t *ld = level.linkedPortals[i]->mOrigin; + line_t *ld = linkedPortals[i]->mOrigin; int othergroup = ld->frontsector->PortalGroup; - FDisplacement &disp = level.Displacements(thisgroup, othergroup); + FDisplacement &disp = Displacements(thisgroup, othergroup); if (!disp.isSet) continue; // no connection. FBoundingBox box(position.X + disp.pos.X, position.Y + disp.pos.Y, checkradius); - if (!box.inRange(ld) || box.BoxOnLineSide(level.linkedPortals[i]->mOrigin) != -1) continue; // not touched - foundPortals.Push(level.linkedPortals[i]); + if (!box.inRange(ld) || box.BoxOnLineSide(linkedPortals[i]->mOrigin) != -1) continue; // not touched + foundPortals.Push(linkedPortals[i]); } bool foundone = true; while (foundone) @@ -1228,7 +1120,7 @@ bool P_CollectConnectedGroups(int startgroup, const DVector3 &position, double u while (!wsec->PortalBlocksMovement(sector_t::ceiling) && upperz > wsec->GetPortalPlaneZ(sector_t::ceiling)) { int othergroup = wsec->GetOppositePortalGroup(sector_t::ceiling); - DVector2 pos = level.Displacements.getOffset(startgroup, othergroup) + position; + DVector2 pos = Displacements.getOffset(startgroup, othergroup) + position; if (processMask.getBit(othergroup)) break; processMask.setBit(othergroup); out.Add(othergroup | FPortalGroupArray::UPPER); @@ -1239,21 +1131,21 @@ bool P_CollectConnectedGroups(int startgroup, const DVector3 &position, double u while (!wsec->PortalBlocksMovement(sector_t::floor) && position.Z < wsec->GetPortalPlaneZ(sector_t::floor)) { int othergroup = wsec->GetOppositePortalGroup(sector_t::floor); - DVector2 pos = level.Displacements.getOffset(startgroup, othergroup) + position; + DVector2 pos = Displacements.getOffset(startgroup, othergroup) + position; if (processMask.getBit(othergroup)) break; processMask.setBit(othergroup); out.Add(othergroup | FPortalGroupArray::LOWER); wsec = P_PointInSector(pos); // get lower sector at the exact spot we want to check and repeat retval = true; } - if (out.method == FPortalGroupArray::PGA_Full3d && level.PortalBlockmap.hasLinkedSectorPortals) + if (out.method == FPortalGroupArray::PGA_Full3d && PortalBlockmap.hasLinkedSectorPortals) { groupsToCheck.Clear(); groupsToCheck.Push(startgroup); int thisgroup = startgroup; for (unsigned i = 0; i < groupsToCheck.Size();i++) { - DVector2 disp = level.Displacements.getOffset(startgroup, thisgroup & ~FPortalGroupArray::FLAT); + DVector2 disp = Displacements.getOffset(startgroup, thisgroup & ~FPortalGroupArray::FLAT); FBoundingBox box(position.X + disp.X, position.Y + disp.Y, checkradius); FBlockLinesIterator it(box); line_t *ld; diff --git a/src/portal.h b/src/portal.h index 9aefb3a58..cb9d5c7a8 100644 --- a/src/portal.h +++ b/src/portal.h @@ -263,15 +263,6 @@ struct FSectorPortalGroup // //============================================================================ -void P_SpawnLinePortal(line_t* line); -void P_FinalizePortals(); -bool P_ChangePortal(line_t *ln, int thisid, int destid); -void P_CreateLinkedPortals(); -bool P_CollectConnectedGroups(int startgroup, const DVector3 &position, double upperz, double checkradius, FPortalGroupArray &out); -void P_CollectLinkedPortals(); -unsigned P_GetSkyboxPortal(AActor *actor); -unsigned P_GetPortal(int type, int plane, sector_t *orgsec, sector_t *destsec, const DVector2 &displacement); -unsigned P_GetStackPortal(AActor *point, int plane); /* code ported from prototype */ @@ -280,7 +271,6 @@ void P_TranslatePortalXY(line_t* src, double& vx, double& vy); void P_TranslatePortalVXVY(line_t* src, double &velx, double &vely); void P_TranslatePortalAngle(line_t* src, DAngle& angle); void P_TranslatePortalZ(line_t* src, double& vz); -DVector2 P_GetOffsetPosition(double x, double y, double dx, double dy); struct FLevelLocals; void InitPortalGroups(FLevelLocals *Level); diff --git a/src/scripting/vmthunks.cpp b/src/scripting/vmthunks.cpp index 9ed1f3286..d90e3b008 100644 --- a/src/scripting/vmthunks.cpp +++ b/src/scripting/vmthunks.cpp @@ -2585,7 +2585,7 @@ static void Vec2Offset(double x, double y, double dx, double dy, bool absolute, } else { - *result = P_GetOffsetPosition(x, y, dx, dy); + *result = level.GetPortalOffsetPosition(x, y, dx, dy); } } @@ -2610,7 +2610,7 @@ static void Vec2OffsetZ(double x, double y, double dx, double dy, double atz, bo } else { - DVector2 v = P_GetOffsetPosition(x, y, dx, dy); + DVector2 v = level.GetPortalOffsetPosition(x, y, dx, dy); *result = (DVector3(v, atz)); } } @@ -2637,7 +2637,7 @@ static void Vec3Offset(double x, double y, double z, double dx, double dy, doubl } else { - DVector2 v = P_GetOffsetPosition(x, y, dx, dy); + DVector2 v = level.GetPortalOffsetPosition(x, y, dx, dy); *result = (DVector3(v, z + dz)); } } diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index d83d90916..61d713e6b 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -695,6 +695,7 @@ struct LevelLocals native native void StartIntermission(Name type, int state) const; native SpotState GetSpotState(bool create = true); native int FindUniqueTid(int start = 0, int limit = 0); + native uint GetSkyboxPortal(Actor actor); native static clearscope bool IsPointInMap(vector3 p); diff --git a/wadsrc/static/zscript/mapdata.txt b/wadsrc/static/zscript/mapdata.txt index c7a7a51fd..9d056ffed 100644 --- a/wadsrc/static/zscript/mapdata.txt +++ b/wadsrc/static/zscript/mapdata.txt @@ -25,9 +25,7 @@ struct SectorPortal native play native Sector mDestination; native Vector2 mDisplacement; native double mPlaneZ; - native Actor mSkybox; - - native static uint GetSkyboxPortal(Actor actor); + native Actor mSkybox; }; diff --git a/wadsrc/static/zscript/shared/skies.txt b/wadsrc/static/zscript/shared/skies.txt index 825db9175..f80ed8304 100644 --- a/wadsrc/static/zscript/shared/skies.txt +++ b/wadsrc/static/zscript/shared/skies.txt @@ -119,7 +119,7 @@ class SkyPicker : Actor } else { - int boxindex = SectorPortal.GetSkyboxPortal(box); + int boxindex = level.GetSkyboxPortal(box); // Do not override special portal types, only regular skies. if (0 == (args[1] & 2)) { From f4081c33a66b06753130c44c31d5d676fdac36d1 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 25 Jan 2019 00:42:55 +0100 Subject: [PATCH 015/164] - give line_t a GetLevel function. The portal getters need this, even though currently it only gets the global level. --- src/g_levellocals.h | 14 +++++++++----- src/r_defs.h | 1 + 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 521fffa0d..06aeea6a2 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -473,31 +473,35 @@ inline bool sector_t::PortalIsLinked(int plane) return (GetPortalType(plane) == PORTS_LINKEDPORTAL); } +inline FLevelLocals *line_t::GetLevel() const +{ + return &level; +} inline FLinePortal *line_t::getPortal() const { - return portalindex >= level.linePortals.Size() ? (FLinePortal*)NULL : &level.linePortals[portalindex]; + return portalindex >= GetLevel()->linePortals.Size() ? (FLinePortal*)nullptr : &GetLevel()->linePortals[portalindex]; } // returns true if the portal is crossable by actors inline bool line_t::isLinePortal() const { - return portalindex >= level.linePortals.Size() ? false : !!(level.linePortals[portalindex].mFlags & PORTF_PASSABLE); + return portalindex >= GetLevel()->linePortals.Size() ? false : !!(GetLevel()->linePortals[portalindex].mFlags & PORTF_PASSABLE); } // returns true if the portal needs to be handled by the renderer inline bool line_t::isVisualPortal() const { - return portalindex >= level.linePortals.Size() ? false : !!(level.linePortals[portalindex].mFlags & PORTF_VISIBLE); + return portalindex >= GetLevel()->linePortals.Size() ? false : !!(GetLevel()->linePortals[portalindex].mFlags & PORTF_VISIBLE); } inline line_t *line_t::getPortalDestination() const { - return portalindex >= level.linePortals.Size() ? (line_t*)NULL : level.linePortals[portalindex].mDestination; + return portalindex >= GetLevel()->linePortals.Size() ? (line_t*)nullptr : GetLevel()->linePortals[portalindex].mDestination; } inline int line_t::getPortalAlignment() const { - return portalindex >= level.linePortals.Size() ? 0 : level.linePortals[portalindex].mAlign; + return portalindex >= GetLevel()->linePortals.Size() ? 0 : GetLevel()->linePortals[portalindex].mAlign; } inline bool line_t::hitSkyWall(AActor* mo) const diff --git a/src/r_defs.h b/src/r_defs.h index a7cdb5c87..0823251bc 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -1408,6 +1408,7 @@ struct line_t FSectorPortal *GetTransferredPortal(); void AdjustLine(); + inline FLevelLocals *GetLevel() const; inline FLinePortal *getPortal() const; inline bool isLinePortal() const; inline bool isVisualPortal() const; From 0124cecc15a388d31b797a7aba12e4b546d3d400 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 25 Jan 2019 01:19:35 +0100 Subject: [PATCH 016/164] - added missing #include. --- src/p_effect.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/p_effect.cpp b/src/p_effect.cpp index 93724d962..d6543b16e 100644 --- a/src/p_effect.cpp +++ b/src/p_effect.cpp @@ -47,6 +47,7 @@ #include "r_utility.h" #include "g_levellocals.h" #include "vm.h" +#include "actorinlines.h" CVAR (Int, cl_rockettrails, 1, CVAR_ARCHIVE); CVAR (Bool, r_rail_smartspiral, 0, CVAR_ARCHIVE); From ba114f6f238d70d10333d4b1d1b396fac088f219 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 25 Jan 2019 01:26:16 +0100 Subject: [PATCH 017/164] - give the hardware renderer's drawinfo its own level pointer --- src/actor.h | 2 +- src/dthinker.cpp | 2 +- src/gl/renderer/gl_scene.cpp | 5 ++-- src/hwrenderer/data/flatvertices.cpp | 16 +++++----- src/hwrenderer/data/flatvertices.h | 6 ++-- src/hwrenderer/data/hw_vertexbuilder.cpp | 8 ++--- src/hwrenderer/data/hw_vertexbuilder.h | 2 +- src/hwrenderer/scene/hw_bsp.cpp | 6 ++-- src/hwrenderer/scene/hw_decal.cpp | 6 ++-- src/hwrenderer/scene/hw_drawinfo.cpp | 37 ++++++++++++++---------- src/hwrenderer/scene/hw_drawinfo.h | 8 ++--- src/hwrenderer/scene/hw_drawlist.cpp | 4 +-- src/hwrenderer/scene/hw_fakeflat.cpp | 5 ++-- src/hwrenderer/scene/hw_flats.cpp | 10 +++---- src/hwrenderer/scene/hw_portal.cpp | 8 ++--- src/hwrenderer/scene/hw_portal.h | 2 +- src/hwrenderer/scene/hw_renderhacks.cpp | 22 +++++++------- src/hwrenderer/scene/hw_renderstate.cpp | 4 +-- src/hwrenderer/scene/hw_sky.cpp | 16 +++++----- src/hwrenderer/scene/hw_skydome.cpp | 5 ++-- src/hwrenderer/scene/hw_skydome.h | 5 ++-- src/hwrenderer/scene/hw_skyportal.cpp | 10 +++---- src/hwrenderer/scene/hw_spritelight.cpp | 4 +-- src/hwrenderer/scene/hw_sprites.cpp | 24 +++++++-------- src/hwrenderer/scene/hw_walls.cpp | 18 ++++++------ src/hwrenderer/scene/hw_weapon.cpp | 8 ++--- src/hwrenderer/utility/hw_clock.cpp | 3 +- src/hwrenderer/utility/hw_lighting.cpp | 22 +++++++------- src/maploader/maploader.cpp | 2 +- src/p_setup.cpp | 29 +++++++++++++++++++ src/p_spec.cpp | 26 +---------------- src/r_utility.cpp | 1 + src/r_utility.h | 3 ++ 33 files changed, 172 insertions(+), 157 deletions(-) diff --git a/src/actor.h b/src/actor.h index 778ed611e..afed3a51f 100644 --- a/src/actor.h +++ b/src/actor.h @@ -902,7 +902,7 @@ public: DVector2 Vec2Offset(double dx, double dy, bool absolute = false); DVector3 Vec2OffsetZ(double dx, double dy, double atz, bool absolute = false); - DVector2 AActor::Vec2Angle(double length, DAngle angle, bool absolute = false); + DVector2 Vec2Angle(double length, DAngle angle, bool absolute = false); DVector3 Vec3Offset(double dx, double dy, double dz, bool absolute = false); DVector3 Vec3Offset(const DVector3 &ofs, bool absolute = false); DVector3 Vec3Angle(double length, DAngle angle, double dz, bool absolute = false); diff --git a/src/dthinker.cpp b/src/dthinker.cpp index 0c4105479..439685438 100644 --- a/src/dthinker.cpp +++ b/src/dthinker.cpp @@ -625,7 +625,7 @@ void DThinker::RunThinkers () auto next = light->next; light->Tick(); light = next; - } + } } else { diff --git a/src/gl/renderer/gl_scene.cpp b/src/gl/renderer/gl_scene.cpp index f19bf1018..52c461288 100644 --- a/src/gl/renderer/gl_scene.cpp +++ b/src/gl/renderer/gl_scene.cpp @@ -39,6 +39,7 @@ #include "p_local.h" #include "serializer.h" #include "g_levellocals.h" +#include "actorinlines.h" #include "r_data/models/models.h" #include "hwrenderer/dynlights/hw_dynlightdata.h" #include "hwrenderer/utility/hw_clock.h" @@ -175,7 +176,7 @@ sector_t * FGLRenderer::RenderViewpoint (FRenderViewpoint &mainvp, AActor * came } - auto di = HWDrawInfo::StartDrawInfo(nullptr, mainvp, nullptr); + auto di = HWDrawInfo::StartDrawInfo(mainvp.ViewLevel, nullptr, mainvp, nullptr); auto &vp = di->Viewpoint; di->Set3DViewport(gl_RenderState); @@ -221,4 +222,4 @@ sector_t * FGLRenderer::RenderViewpoint (FRenderViewpoint &mainvp, AActor * came return mainvp.sector; } -} \ No newline at end of file +} diff --git a/src/hwrenderer/data/flatvertices.cpp b/src/hwrenderer/data/flatvertices.cpp index 6ba517bdf..d185240fb 100644 --- a/src/hwrenderer/data/flatvertices.cpp +++ b/src/hwrenderer/data/flatvertices.cpp @@ -232,9 +232,9 @@ int FFlatVertexBuffer::CreateIndexedVertices(int h, sector_t *sec, const secplan // //========================================================================== -void FFlatVertexBuffer::CreateIndexedFlatVertices() +void FFlatVertexBuffer::CreateIndexedFlatVertices(TArray §ors) { - auto verts = BuildVertices(); + auto verts = BuildVertices(sectors); int i = 0; /* @@ -259,7 +259,7 @@ void FFlatVertexBuffer::CreateIndexedFlatVertices() for (int h = sector_t::floor; h <= sector_t::ceiling; h++) { - for (auto &sec : level.sectors) + for (auto &sec : sectors) { CreateIndexedVertices(h, &sec, sec.GetSecPlane(h), h == sector_t::floor, verts); } @@ -267,7 +267,7 @@ void FFlatVertexBuffer::CreateIndexedFlatVertices() // We need to do a final check for Vavoom water and FF_FIX sectors. // No new vertices are needed here. The planes come from the actual sector - for (auto &sec : level.sectors) + for (auto &sec : sectors) { for (auto ff : sec.e->XFloor.ffloors) { @@ -310,10 +310,10 @@ void FFlatVertexBuffer::UpdatePlaneVertices(sector_t *sec, int plane) // //========================================================================== -void FFlatVertexBuffer::CreateVertices() +void FFlatVertexBuffer::CreateVertices(TArray §ors) { vbo_shadowdata.Resize(NUM_RESERVED); - CreateIndexedFlatVertices(); + CreateIndexedFlatVertices(sectors); } //========================================================================== @@ -390,10 +390,10 @@ void FFlatVertexBuffer::Copy(int start, int count) // //========================================================================== -void FFlatVertexBuffer::CreateVBO() +void FFlatVertexBuffer::CreateVBO(TArray §ors) { vbo_shadowdata.Resize(mNumReserved); - FFlatVertexBuffer::CreateVertices(); + FFlatVertexBuffer::CreateVertices(sectors); mCurIndex = mIndex = vbo_shadowdata.Size(); Copy(0, mIndex); mIndexBuffer->SetData(ibo_data.Size() * sizeof(uint32_t), &ibo_data[0]); diff --git a/src/hwrenderer/data/flatvertices.h b/src/hwrenderer/data/flatvertices.h index 890e5580c..1a1588c71 100644 --- a/src/hwrenderer/data/flatvertices.h +++ b/src/hwrenderer/data/flatvertices.h @@ -84,7 +84,7 @@ public: return std::make_pair(mVertexBuffer, mIndexBuffer); } - void CreateVBO(); + void CreateVBO(TArray §ors); void Copy(int start, int count); FFlatVertex *GetBuffer(int index) const @@ -119,11 +119,11 @@ private: int CreateIndexedSectionVertices(subsector_t *sub, const secplane_t &plane, int floor, VertexContainer &cont); int CreateIndexedSectorVertices(sector_t *sec, const secplane_t &plane, int floor, VertexContainer &cont); int CreateIndexedVertices(int h, sector_t *sec, const secplane_t &plane, int floor, VertexContainers &cont); - void CreateIndexedFlatVertices(); + void CreateIndexedFlatVertices(TArray §ors); void UpdatePlaneVertices(sector_t *sec, int plane); protected: - void CreateVertices(); + void CreateVertices(TArray §ors); void CheckPlanes(sector_t *sector); public: void CheckUpdate(sector_t *sector); diff --git a/src/hwrenderer/data/hw_vertexbuilder.cpp b/src/hwrenderer/data/hw_vertexbuilder.cpp index 6a0542cdf..f4e4c6c36 100644 --- a/src/hwrenderer/data/hw_vertexbuilder.cpp +++ b/src/hwrenderer/data/hw_vertexbuilder.cpp @@ -137,12 +137,12 @@ static void CreateVerticesForSector(sector_t *sec, VertexContainer &gen) } -TArray BuildVertices() +TArray BuildVertices(TArray §ors) { - TArray verticesPerSector(level.sectors.Size(), true); - for (unsigned i=0; i verticesPerSector(sectors.Size(), true); + for (unsigned i=0; i< sectors.Size(); i++) { - CreateVerticesForSector(&level.sectors[i], verticesPerSector[i]); + CreateVerticesForSector(§ors[i], verticesPerSector[i]); } return verticesPerSector; } diff --git a/src/hwrenderer/data/hw_vertexbuilder.h b/src/hwrenderer/data/hw_vertexbuilder.h index 60ed770b8..8ab7d21d8 100644 --- a/src/hwrenderer/data/hw_vertexbuilder.h +++ b/src/hwrenderer/data/hw_vertexbuilder.h @@ -64,6 +64,6 @@ struct VertexContainer using VertexContainers = TArray; -VertexContainers BuildVertices(); +VertexContainers BuildVertices(TArray §ors); diff --git a/src/hwrenderer/scene/hw_bsp.cpp b/src/hwrenderer/scene/hw_bsp.cpp index d7f47f78e..7ecbccaf2 100644 --- a/src/hwrenderer/scene/hw_bsp.cpp +++ b/src/hwrenderer/scene/hw_bsp.cpp @@ -686,7 +686,7 @@ void HWDrawInfo::DoSubsector(subsector_t * sub) fakesector = hw_FakeFlat(sector, in_area, false); } - uint8_t &srf = section_renderflags[level.sections.SectionIndex(sub->section)]; + uint8_t &srf = section_renderflags[Level->sections.SectionIndex(sub->section)]; if (!(srf & SSRF_PROCESSED)) { srf |= SSRF_PROCESSED; @@ -761,9 +761,9 @@ void HWDrawInfo::DoSubsector(subsector_t * sub) void HWDrawInfo::RenderBSPNode (void *node) { - if (level.nodes.Size() == 0) + if (Level->nodes.Size() == 0) { - DoSubsector (&level.subsectors[0]); + DoSubsector (&Level->subsectors[0]); return; } while (!((size_t)node & 1)) // Keep going until found a subsector diff --git a/src/hwrenderer/scene/hw_decal.cpp b/src/hwrenderer/scene/hw_decal.cpp index d3c28735c..01c69de3f 100644 --- a/src/hwrenderer/scene/hw_decal.cpp +++ b/src/hwrenderer/scene/hw_decal.cpp @@ -49,7 +49,7 @@ void GLDecal::DrawDecal(HWDrawInfo *di, FRenderState &state) auto tex = gltexture; // calculate dynamic light effect. - if (level.HasDynamicLights && !di->isFullbrightScene() && gl_light_sprites) + if (di->Level->HasDynamicLights && !di->isFullbrightScene() && gl_light_sprites) { // Note: This should be replaced with proper shader based lighting. double x, y; @@ -107,7 +107,7 @@ void GLDecal::DrawDecal(HWDrawInfo *di, FRenderState &state) thiscm.FadeColor = Colormap.FadeColor; thiscm.CopyFrom3DLight(&lightlist[k]); di->SetColor(state, thisll, rellight, di->isFullbrightScene(), thiscm, alpha); - if (level.flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING) thiscm.Decolorize(); + if (di->Level->flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING) thiscm.Decolorize(); di->SetFog(state, thisll, rellight, di->isFullbrightScene(), &thiscm, false); state.SetSplitPlanes(lightlist[k].plane, lowplane); @@ -397,7 +397,7 @@ void GLWall::ProcessDecal(HWDrawInfo *di, DBaseDecal *decal, const FVector3 &nor gldecal->Colormap = Colormap; - if (level.flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING) + if (di->Level->flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING) { gldecal->Colormap.Decolorize(); } diff --git a/src/hwrenderer/scene/hw_drawinfo.cpp b/src/hwrenderer/scene/hw_drawinfo.cpp index 524cf660f..8856fc9e2 100644 --- a/src/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/hwrenderer/scene/hw_drawinfo.cpp @@ -85,13 +85,14 @@ HWDrawInfo *FDrawInfoList::GetNew() mList.Pop(di); return di; } - return new HWDrawInfo; + return new HWDrawInfo(); } void FDrawInfoList::Release(HWDrawInfo * di) { di->DrawScene = nullptr; di->ClearBuffers(); + di->Level = nullptr; mList.Push(di); } @@ -101,10 +102,11 @@ void FDrawInfoList::Release(HWDrawInfo * di) // //========================================================================== -HWDrawInfo *HWDrawInfo::StartDrawInfo(HWDrawInfo *parent, FRenderViewpoint &parentvp, HWViewpointUniforms *uniforms) +HWDrawInfo *HWDrawInfo::StartDrawInfo(FLevelLocals *lev, HWDrawInfo *parent, FRenderViewpoint &parentvp, HWViewpointUniforms *uniforms) { HWDrawInfo *di = di_list.GetNew(); if (parent) di->DrawScene = parent->DrawScene; + di->Level = lev; di->StartScene(parentvp, uniforms); return di; } @@ -125,7 +127,7 @@ void HWDrawInfo::StartScene(FRenderViewpoint &parentvp, HWViewpointUniforms *uni mClipper = &staticClipper; Viewpoint = parentvp; - lightmode = level.lightMode; + lightmode = Level->lightMode; if (uniforms) { VPUniforms = *uniforms; @@ -193,16 +195,19 @@ void HWDrawInfo::ClearBuffers() HandledSubsectors.Clear(); spriteindex = 0; - CurrentMapSections.Resize(level.NumMapSections); - CurrentMapSections.Zero(); + if (Level) + { + CurrentMapSections.Resize(Level->NumMapSections); + CurrentMapSections.Zero(); - section_renderflags.Resize(level.sections.allSections.Size()); - ss_renderflags.Resize(level.subsectors.Size()); - no_renderflags.Resize(level.subsectors.Size()); + section_renderflags.Resize(Level->sections.allSections.Size()); + ss_renderflags.Resize(Level->subsectors.Size()); + no_renderflags.Resize(Level->subsectors.Size()); - memset(§ion_renderflags[0], 0, level.sections.allSections.Size() * sizeof(section_renderflags[0])); - memset(&ss_renderflags[0], 0, level.subsectors.Size() * sizeof(ss_renderflags[0])); - memset(&no_renderflags[0], 0, level.nodes.Size() * sizeof(no_renderflags[0])); + memset(§ion_renderflags[0], 0, Level->sections.allSections.Size() * sizeof(section_renderflags[0])); + memset(&ss_renderflags[0], 0, Level->subsectors.Size() * sizeof(ss_renderflags[0])); + memset(&no_renderflags[0], 0, Level->nodes.Size() * sizeof(no_renderflags[0])); + } Decals[0].Clear(); Decals[1].Clear(); @@ -245,7 +250,7 @@ void HWDrawInfo::SetViewArea() } else { - in_area = level.HasHeightSecs ? area_default : area_normal; // depends on exposed lower sectors, if map contains heightsecs. + in_area = Level->HasHeightSecs ? area_default : area_normal; // depends on exposed lower sectors, if map contains heightsecs. } } @@ -335,7 +340,7 @@ angle_t HWDrawInfo::FrustumAngle() void HWDrawInfo::SetViewMatrix(const FRotator &angles, float vx, float vy, float vz, bool mirror, bool planemirror) { float mult = mirror ? -1.f : 1.f; - float planemult = planemirror ? -level.info->pixelstretch : level.info->pixelstretch; + float planemult = planemirror ? -Level->info->pixelstretch : Level->info->pixelstretch; VPUniforms.mViewMatrix.loadIdentity(); VPUniforms.mViewMatrix.rotate(angles.Roll.Degrees, 0.0f, 0.0f, 1.0f); @@ -424,7 +429,7 @@ void HWDrawInfo::CreateScene() // reset the portal manager screen->mPortalState->StartFrame(); - PO_LinkToSubsectors(&level); + PO_LinkToSubsectors(Level); ProcessAll.Clock(); @@ -432,7 +437,7 @@ void HWDrawInfo::CreateScene() screen->mVertexData->Map(); screen->mLights->Map(); - RenderBSP(level.HeadNode()); + RenderBSP(Level->HeadNode()); // And now the crappy hacks that have to be done to avoid rendering anomalies. // These cannot be multithreaded when the time comes because all these depend @@ -551,7 +556,7 @@ void HWDrawInfo::RenderPortal(HWPortal *p, FRenderState &state, bool usestencil) { auto gp = static_cast(p); gp->SetupStencil(this, state, usestencil); - auto new_di = StartDrawInfo(this, Viewpoint, &VPUniforms); + auto new_di = StartDrawInfo(this->Level, this, Viewpoint, &VPUniforms); new_di->mCurrentPortal = gp; state.SetLightIndex(-1); gp->DrawContents(new_di, state); diff --git a/src/hwrenderer/scene/hw_drawinfo.h b/src/hwrenderer/scene/hw_drawinfo.h index bf625d5d1..9738cbe44 100644 --- a/src/hwrenderer/scene/hw_drawinfo.h +++ b/src/hwrenderer/scene/hw_drawinfo.h @@ -97,11 +97,6 @@ enum DrawListType struct HWDrawInfo { - virtual ~HWDrawInfo() - { - ClearBuffers(); - } - struct wallseg { float x1, y1, z1, x2, y2, z2; @@ -142,6 +137,7 @@ struct HWDrawInfo int vpIndex; ELightMode lightmode; + FLevelLocals *Level; HWDrawInfo * outer = nullptr; int FullbrightFlags; std::atomic spriteindex; @@ -243,7 +239,7 @@ public: void RenderBSPNode(void *node); void RenderBSP(void *node); - static HWDrawInfo *StartDrawInfo(HWDrawInfo *parent, FRenderViewpoint &parentvp, HWViewpointUniforms *uniforms); + static HWDrawInfo *StartDrawInfo(FLevelLocals *lev, HWDrawInfo *parent, FRenderViewpoint &parentvp, HWViewpointUniforms *uniforms); void StartScene(FRenderViewpoint &parentvp, HWViewpointUniforms *uniforms); void ClearBuffers(); HWDrawInfo *EndDrawInfo(); diff --git a/src/hwrenderer/scene/hw_drawlist.cpp b/src/hwrenderer/scene/hw_drawlist.cpp index 5b19288c1..f50c49b8b 100644 --- a/src/hwrenderer/scene/hw_drawlist.cpp +++ b/src/hwrenderer/scene/hw_drawlist.cpp @@ -289,7 +289,7 @@ void HWDrawList::SortWallIntoPlane(SortNode * head, SortNode * sort) float newtexv = ws->tcs[GLWall::UPLFT].v + ((ws->tcs[GLWall::LOLFT].v - ws->tcs[GLWall::UPLFT].v) / (ws->zbottom[0] - ws->ztop[0])) * (fh->z - ws->ztop[0]); // I make the very big assumption here that translucent walls in sloped sectors - // and 3D-floors never coexist in the same level. If that were the case this + // and 3D-floors never coexist in the same level - If that were the case this // code would become extremely more complicated. if (!ceiling) { @@ -709,7 +709,7 @@ void HWDrawList::Sort(HWDrawInfo *di) //========================================================================== // -// Sorting the drawitems first by texture and then by light level. +// Sorting the drawitems first by texture and then by light level // //========================================================================== diff --git a/src/hwrenderer/scene/hw_fakeflat.cpp b/src/hwrenderer/scene/hw_fakeflat.cpp index 510e7d48a..030c09f8e 100644 --- a/src/hwrenderer/scene/hw_fakeflat.cpp +++ b/src/hwrenderer/scene/hw_fakeflat.cpp @@ -196,8 +196,9 @@ static sector_t *allocateSector(sector_t *sec) { if (fakesectorbuffer == nullptr) { - fakesectorbuffer = (sector_t**)FakeSectorAllocator.Alloc(level.sectors.Size() * sizeof(sector_t*)); - memset(fakesectorbuffer, 0, level.sectors.Size() * sizeof(sector_t*)); + unsigned numsectors = level.sectors.Size(); + fakesectorbuffer = (sector_t**)FakeSectorAllocator.Alloc(numsectors * sizeof(sector_t*)); + memset(fakesectorbuffer, 0, numsectors * sizeof(sector_t*)); } auto sectornum = sec->sectornum; fakesectorbuffer[sectornum] = (sector_t*)FakeSectorAllocator.Alloc(sizeof(sector_t)); diff --git a/src/hwrenderer/scene/hw_flats.cpp b/src/hwrenderer/scene/hw_flats.cpp index a72122a48..d4bc79ee2 100644 --- a/src/hwrenderer/scene/hw_flats.cpp +++ b/src/hwrenderer/scene/hw_flats.cpp @@ -141,7 +141,7 @@ void GLFlat::SetupLights(HWDrawInfo *di, FLightNode * node, FDynLightData &light Plane p; lightdata.Clear(); - if (renderstyle == STYLE_Add && !level.lightadditivesurfaces) + if (renderstyle == STYLE_Add && !di->Level->lightadditivesurfaces) { dynlightindex = -1; return; // no lights on additively blended surfaces. @@ -182,7 +182,7 @@ void GLFlat::SetupLights(HWDrawInfo *di, FLightNode * node, FDynLightData &light void GLFlat::DrawSubsectors(HWDrawInfo *di, FRenderState &state) { - if (level.HasDynamicLights && screen->BuffersArePersistent() && !di->isFullbrightScene()) + if (di->Level->HasDynamicLights && screen->BuffersArePersistent() && !di->isFullbrightScene()) { SetupLights(di, section->lighthead, lightdata, sector->PortalGroup); } @@ -377,7 +377,7 @@ inline void GLFlat::PutFlat(HWDrawInfo *di, bool fog) } else if (!screen->BuffersArePersistent()) { - if (level.HasDynamicLights && gltexture != nullptr && !di->isFullbrightScene() && !(hacktype & (SSRF_PLANEHACK|SSRF_FLOODHACK)) ) + if (di->Level->HasDynamicLights && gltexture != nullptr && !di->isFullbrightScene() && !(hacktype & (SSRF_PLANEHACK|SSRF_FLOODHACK)) ) { SetupLights(di, section->lighthead, lightdata, sector->PortalGroup); } @@ -484,13 +484,13 @@ void GLFlat::ProcessSector(HWDrawInfo *di, sector_t * frontsector, int which) #endif // Get the real sector for this one. - sector = &level.sectors[frontsector->sectornum]; + sector = &di->Level->sectors[frontsector->sectornum]; extsector_t::xfloor &x = sector->e->XFloor; dynlightindex = -1; hacktype = (which & (SSRF_PLANEHACK|SSRF_FLOODHACK)); uint8_t sink; - uint8_t &srf = hacktype? sink : di->section_renderflags[level.sections.SectionIndex(section)]; + uint8_t &srf = hacktype? sink : di->section_renderflags[di->Level->sections.SectionIndex(section)]; const auto &vp = di->Viewpoint; // diff --git a/src/hwrenderer/scene/hw_portal.cpp b/src/hwrenderer/scene/hw_portal.cpp index c31cda01b..457f0fb4d 100644 --- a/src/hwrenderer/scene/hw_portal.cpp +++ b/src/hwrenderer/scene/hw_portal.cpp @@ -733,7 +733,7 @@ const char *HWSkyboxPortal::GetName() { return "Skybox"; } static uint8_t SetCoverage(HWDrawInfo *di, void *node) { - if (level.nodes.Size() == 0) + if (di->Level->nodes.Size() == 0) { return 0; } @@ -759,12 +759,12 @@ void HWSectorStackPortal::SetupCoverage(HWDrawInfo *di) int plane = origin->plane; for (int j = 0; jportalcoverage[plane].sscount; j++) { - subsector_t *dsub = &::level.subsectors[sub->portalcoverage[plane].subsectors[j]]; + subsector_t *dsub = &di->Level->subsectors[sub->portalcoverage[plane].subsectors[j]]; di->CurrentMapSections.Set(dsub->mapsection); di->ss_renderflags[dsub->Index()] |= SSRF_SEEN; } } - SetCoverage(di, ::level.HeadNode()); + SetCoverage(di, di->Level->HeadNode()); } //----------------------------------------------------------------------------- @@ -1020,7 +1020,7 @@ void HWEEHorizonPortal::DrawContents(HWDrawInfo *di, FRenderState &state) sector->GetTexture(sector_t::ceiling) == skyflatnum) { GLSkyInfo skyinfo; - skyinfo.init(sector->sky, 0); + skyinfo.init(di, sector->sky, 0); HWSkyPortal sky(screen->mSkyData, mState, &skyinfo, true); sky.DrawContents(di, state); } diff --git a/src/hwrenderer/scene/hw_portal.h b/src/hwrenderer/scene/hw_portal.h index 879420c10..f5efdca28 100644 --- a/src/hwrenderer/scene/hw_portal.h +++ b/src/hwrenderer/scene/hw_portal.h @@ -28,7 +28,7 @@ struct GLSkyInfo { return !!memcmp(this, &inf, sizeof(*this)); } - void init(int sky1, PalEntry fadecolor); + void init(HWDrawInfo *di, int sky1, PalEntry fadecolor); }; struct GLHorizonInfo diff --git a/src/hwrenderer/scene/hw_renderhacks.cpp b/src/hwrenderer/scene/hw_renderhacks.cpp index b2467a5eb..65a3da607 100644 --- a/src/hwrenderer/scene/hw_renderhacks.cpp +++ b/src/hwrenderer/scene/hw_renderhacks.cpp @@ -55,28 +55,28 @@ void HWDrawInfo::DispatchRenderHacks() glflat.section = nullptr; while (ofi.NextPair(pair)) { - auto sec = hw_FakeFlat(&level.sectors[pair->Key], in_area, false); + auto sec = hw_FakeFlat(&Level->sectors[pair->Key], in_area, false); glflat.ProcessSector(this, sec, SSRF_RENDERFLOOR | SSRF_PLANEHACK); } TMap::Iterator oci(otherCeilingPlanes); while (oci.NextPair(pair)) { - auto sec = hw_FakeFlat(&level.sectors[pair->Key], in_area, false); + auto sec = hw_FakeFlat(&Level->sectors[pair->Key], in_area, false); glflat.ProcessSector(this, sec, SSRF_RENDERCEILING | SSRF_PLANEHACK); } TMap::Iterator ffi(floodFloorSegs); while (ffi.NextPair(fpair)) { - auto sec = hw_FakeFlat(&level.sectors[fpair->Key], in_area, false); + auto sec = hw_FakeFlat(&Level->sectors[fpair->Key], in_area, false); glflat.ProcessSector(this, sec, SSRF_RENDERFLOOR | SSRF_FLOODHACK); } TMap::Iterator fci(floodCeilingSegs); while (fci.NextPair(fpair)) { - auto sec = hw_FakeFlat(&level.sectors[fpair->Key], in_area, false); + auto sec = hw_FakeFlat(&Level->sectors[fpair->Key], in_area, false); glflat.ProcessSector(this, sec, SSRF_RENDERCEILING | SSRF_FLOODHACK); } } @@ -108,7 +108,7 @@ static gl_floodrendernode *NewFloodRenderNode() int HWDrawInfo::SetupLightsForOtherPlane(subsector_t * sub, FDynLightData &lightdata, const secplane_t *plane) { - if (level.HasDynamicLights && !isFullbrightScene()) + if (Level->HasDynamicLights && !isFullbrightScene()) { Plane p; @@ -170,8 +170,8 @@ void HWDrawInfo::AddOtherFloorPlane(int sector, gl_subsectorrendernode * node) auto pNode = otherFloorPlanes.CheckKey(sector); node->next = pNode? *pNode : nullptr; - node->lightindex = SetupLightsForOtherPlane(node->sub, lightdata, &level.sectors[sector].floorplane); - node->vertexindex = CreateOtherPlaneVertices(node->sub, &level.sectors[sector].floorplane); + node->lightindex = SetupLightsForOtherPlane(node->sub, lightdata, &Level->sectors[sector].floorplane); + node->vertexindex = CreateOtherPlaneVertices(node->sub, &Level->sectors[sector].floorplane); otherFloorPlanes[sector] = node; } @@ -180,8 +180,8 @@ void HWDrawInfo::AddOtherCeilingPlane(int sector, gl_subsectorrendernode * node) auto pNode = otherCeilingPlanes.CheckKey(sector); node->next = pNode? *pNode : nullptr; - node->lightindex = SetupLightsForOtherPlane(node->sub, lightdata, &level.sectors[sector].ceilingplane); - node->vertexindex = CreateOtherPlaneVertices(node->sub, &level.sectors[sector].ceilingplane); + node->lightindex = SetupLightsForOtherPlane(node->sub, lightdata, &Level->sectors[sector].ceilingplane); + node->vertexindex = CreateOtherPlaneVertices(node->sub, &Level->sectors[sector].ceilingplane); otherCeilingPlanes[sector] = node; } @@ -837,7 +837,7 @@ void HWDrawInfo::PrepareLowerGap(seg_t * seg) void HWDrawInfo::PrepareUnhandledMissingTextures() { - if (!level.notexturefill) + if (!Level->notexturefill) { validcount++; for (int i = MissingUpperSegs.Size() - 1; i >= 0; i--) @@ -894,7 +894,7 @@ void HWDrawInfo::PrepareUnhandledMissingTextures() void HWDrawInfo::AddHackedSubsector(subsector_t * sub) { - if (!(level.maptype == MAPTYPE_HEXEN)) + if (!(Level->maptype == MAPTYPE_HEXEN)) { SubsectorHackInfo sh={sub, 0}; SubsectorHacks.Push (sh); diff --git a/src/hwrenderer/scene/hw_renderstate.cpp b/src/hwrenderer/scene/hw_renderstate.cpp index 6f4bc036d..ec183e3fb 100644 --- a/src/hwrenderer/scene/hw_renderstate.cpp +++ b/src/hwrenderer/scene/hw_renderstate.cpp @@ -100,7 +100,7 @@ void HWDrawInfo::SetFog(FRenderState &state, int lightlevel, int rellight, bool PalEntry fogcolor; float fogdensity; - if (level.flags&LEVEL_HASFADETABLE) + if (Level->flags&LEVEL_HASFADETABLE) { fogdensity = 70; fogcolor = 0x808080; @@ -150,7 +150,7 @@ void HWDrawInfo::SetFog(FRenderState &state, int lightlevel, int rellight, bool state.SetFog(fogcolor, fogdensity); // Korshun: fullbright fog like in software renderer. - if (isSoftwareLighting() && cmap->BlendFactor == 0 && level.brightfog && fogdensity != 0 && fogcolor != 0) + if (isSoftwareLighting() && cmap->BlendFactor == 0 && Level->brightfog && fogdensity != 0 && fogcolor != 0) { state.SetSoftLightLevel(255); } diff --git a/src/hwrenderer/scene/hw_sky.cpp b/src/hwrenderer/scene/hw_sky.cpp index d2a8c41c5..a446facc2 100644 --- a/src/hwrenderer/scene/hw_sky.cpp +++ b/src/hwrenderer/scene/hw_sky.cpp @@ -41,16 +41,16 @@ CVAR(Bool,gl_noskyboxes, false, 0) // //========================================================================== -void GLSkyInfo::init(int sky1, PalEntry FadeColor) +void GLSkyInfo::init(HWDrawInfo *di, int sky1, PalEntry FadeColor) { memset(this, 0, sizeof(*this)); if ((sky1 & PL_SKYFLAT) && (sky1 & (PL_SKYFLAT - 1))) { - const line_t *l = &level.lines[(sky1&(PL_SKYFLAT - 1)) - 1]; + const line_t *l = &di->Level->lines[(sky1&(PL_SKYFLAT - 1)) - 1]; const side_t *s = l->sidedef[0]; int pos; - if (level.flags & LEVEL_SWAPSKIES && s->GetTexture(side_t::bottom).isValid()) + if (di->Level->flags & LEVEL_SWAPSKIES && s->GetTexture(side_t::bottom).isValid()) { pos = side_t::bottom; } @@ -70,14 +70,14 @@ void GLSkyInfo::init(int sky1, PalEntry FadeColor) else { normalsky: - if (level.flags&LEVEL_DOUBLESKY) + if (di->Level->flags&LEVEL_DOUBLESKY) { texture[1] = FMaterial::ValidateTexture(sky1texture, false, true); x_offset[1] = hw_sky1pos; doublesky = true; } - if ((level.flags&LEVEL_SWAPSKIES || (sky1 == PL_SKYFLAT) || (level.flags&LEVEL_DOUBLESKY)) && + if ((di->Level->flags&LEVEL_SWAPSKIES || (sky1 == PL_SKYFLAT) || (di->Level->flags&LEVEL_DOUBLESKY)) && sky2texture != sky1texture) // If both skies are equal use the scroll offset of the first! { texture[0] = FMaterial::ValidateTexture(sky2texture, false, true); @@ -92,7 +92,7 @@ void GLSkyInfo::init(int sky1, PalEntry FadeColor) x_offset[0] = hw_sky1pos; } } - if (level.skyfog > 0) + if (di->Level->skyfog > 0) { fadecolor = FadeColor; fadecolor.a = 0; @@ -119,7 +119,7 @@ void GLWall::SkyPlane(HWDrawInfo *di, sector_t *sector, int plane, bool allowref if ((sportal == nullptr && sector->GetTexture(plane) == skyflatnum) || (gl_noskyboxes && sportal != nullptr && sportal->mType == PORTS_SKYVIEWPOINT)) { GLSkyInfo skyinfo; - skyinfo.init(sector->sky, Colormap.FadeColor); + skyinfo.init(di, sector->sky, Colormap.FadeColor); ptype = PORTALTYPE_SKY; sky = &skyinfo; PutPortal(di, ptype, plane); @@ -189,7 +189,7 @@ void GLWall::SkyLine(HWDrawInfo *di, sector_t *fs, line_t *line) } else { - skyinfo.init(fs->sky, Colormap.FadeColor); + skyinfo.init(di, fs->sky, Colormap.FadeColor); ptype = PORTALTYPE_SKY; sky = &skyinfo; } diff --git a/src/hwrenderer/scene/hw_skydome.cpp b/src/hwrenderer/scene/hw_skydome.cpp index f0436ca53..262ded1ed 100644 --- a/src/hwrenderer/scene/hw_skydome.cpp +++ b/src/hwrenderer/scene/hw_skydome.cpp @@ -66,6 +66,7 @@ #include "hwrenderer/textures/hw_material.h" #include "hw_skydome.h" #include "hw_renderstate.h" +#include "hw_drawinfo.h" #include "hwrenderer/data/buffers.h" //----------------------------------------------------------------------------- @@ -281,7 +282,7 @@ void FSkyVertexBuffer::CreateDome() // //----------------------------------------------------------------------------- -void FSkyVertexBuffer::SetupMatrices(FMaterial *tex, float x_offset, float y_offset, bool mirror, int mode, VSMatrix &modelMatrix, VSMatrix &textureMatrix) +void FSkyVertexBuffer::SetupMatrices(HWDrawInfo *di, FMaterial *tex, float x_offset, float y_offset, bool mirror, int mode, VSMatrix &modelMatrix, VSMatrix &textureMatrix) { int texw = tex->TextureWidth(); int texh = tex->TextureHeight(); @@ -291,7 +292,7 @@ void FSkyVertexBuffer::SetupMatrices(FMaterial *tex, float x_offset, float y_off float xscale = texw < 1024.f ? floor(1024.f / float(texw)) : 1.f; float yscale = 1.f; - if (texh <= 128 && (level.flags & LEVEL_FORCETILEDSKY)) + if (texh <= 128 && (di->Level->flags & LEVEL_FORCETILEDSKY)) { modelMatrix.translate(0.f, (-40 + tex->tex->GetSkyOffset() + skyoffset)*skyoffsetfactor, 0.f); modelMatrix.scale(1.f, 1.2f * 1.17f, 1.f); diff --git a/src/hwrenderer/scene/hw_skydome.h b/src/hwrenderer/scene/hw_skydome.h index ed130084c..8f2c9ca8d 100644 --- a/src/hwrenderer/scene/hw_skydome.h +++ b/src/hwrenderer/scene/hw_skydome.h @@ -6,6 +6,8 @@ class FMaterial; class FRenderState; class IVertexBuffer; +struct HWSkyPortal; +struct HWDrawInfo; struct FSkyVertex { @@ -34,7 +36,6 @@ struct FSkyVertex }; -struct HWSkyPortal; class FSkyVertexBuffer { friend struct HWSkyPortal; @@ -68,7 +69,7 @@ public: FSkyVertexBuffer(); ~FSkyVertexBuffer(); - void SetupMatrices(FMaterial *tex, float x_offset, float y_offset, bool mirror, int mode, VSMatrix &modelmatrix, VSMatrix &textureMatrix); + void SetupMatrices(HWDrawInfo *di, FMaterial *tex, float x_offset, float y_offset, bool mirror, int mode, VSMatrix &modelmatrix, VSMatrix &textureMatrix); std::pair GetBufferObjects() const { return std::make_pair(mVertexBuffer, nullptr); diff --git a/src/hwrenderer/scene/hw_skyportal.cpp b/src/hwrenderer/scene/hw_skyportal.cpp index 88e9c6a83..bba4b60ee 100644 --- a/src/hwrenderer/scene/hw_skyportal.cpp +++ b/src/hwrenderer/scene/hw_skyportal.cpp @@ -58,7 +58,7 @@ void HWSkyPortal::RenderDome(HWDrawInfo *di, FRenderState &state, FMaterial * te state.EnableModelMatrix(true); state.EnableTextureMatrix(true); - vertexBuffer->SetupMatrices(tex, x_offset, y_offset, mirror, mode, state.mModelMatrix, state.mTextureMatrix); + vertexBuffer->SetupMatrices(di, tex, x_offset, y_offset, mirror, mode, state.mModelMatrix, state.mTextureMatrix); } int rc = vertexBuffer->mRows + 1; @@ -104,9 +104,9 @@ void HWSkyPortal::RenderBox(HWDrawInfo *di, FRenderState &state, FTextureID texn state.mModelMatrix.loadIdentity(); if (!sky2) - state.mModelMatrix.rotate(-180.0f+x_offset, ::level.info->skyrotatevector.X, ::level.info->skyrotatevector.Z, ::level.info->skyrotatevector.Y); + state.mModelMatrix.rotate(-180.0f+x_offset, di->Level->info->skyrotatevector.X, di->Level->info->skyrotatevector.Z, di->Level->info->skyrotatevector.Y); else - state.mModelMatrix.rotate(-180.0f+x_offset, ::level.info->skyrotatevector2.X, ::level.info->skyrotatevector2.Z, ::level.info->skyrotatevector2.Y); + state.mModelMatrix.rotate(-180.0f+x_offset, di->Level->info->skyrotatevector2.X, di->Level->info->skyrotatevector2.Z, di->Level->info->skyrotatevector2.Y); if (sb->faces[5]) { @@ -203,10 +203,10 @@ void HWSkyPortal::DrawContents(HWDrawInfo *di, FRenderState &state) RenderDome(di, state, origin->texture[1], origin->x_offset[1], origin->y_offset, false, FSkyVertexBuffer::SKYMODE_SECONDLAYER); } - if (::level.skyfog>0 && !di->isFullbrightScene() && (origin->fadecolor & 0xffffff) != 0) + if (di->Level->skyfog>0 && !di->isFullbrightScene() && (origin->fadecolor & 0xffffff) != 0) { PalEntry FadeColor = origin->fadecolor; - FadeColor.a = clamp(::level.skyfog, 0, 255); + FadeColor.a = clamp(di->Level->skyfog, 0, 255); state.EnableTexture(false); state.SetObjectColor(FadeColor); diff --git a/src/hwrenderer/scene/hw_spritelight.cpp b/src/hwrenderer/scene/hw_spritelight.cpp index f3058cf53..8023f6272 100644 --- a/src/hwrenderer/scene/hw_spritelight.cpp +++ b/src/hwrenderer/scene/hw_spritelight.cpp @@ -67,13 +67,13 @@ void HWDrawInfo::GetDynSpriteLight(AActor *self, float x, float y, float z, FLig // This is a performance critical section of code where we cannot afford to let the compiler decide whether to inline the function or not. // This will do the calculations explicitly rather than calling one of AActor's utility functions. - if (level.Displacements.size > 0) + if (Level->Displacements.size > 0) { int fromgroup = light->Sector->PortalGroup; int togroup = portalgroup; if (fromgroup == togroup || fromgroup == 0 || togroup == 0) goto direct; - DVector2 offset = level.Displacements.getOffset(fromgroup, togroup); + DVector2 offset = Level->Displacements.getOffset(fromgroup, togroup); L = FVector3(x - (float)(light->X() + offset.X), y - (float)(light->Y() + offset.Y), z - (float)light->Z()); } else diff --git a/src/hwrenderer/scene/hw_sprites.cpp b/src/hwrenderer/scene/hw_sprites.cpp index b7d8fb581..49ced7dfe 100644 --- a/src/hwrenderer/scene/hw_sprites.cpp +++ b/src/hwrenderer/scene/hw_sprites.cpp @@ -127,7 +127,7 @@ void GLSprite::DrawSprite(HWDrawInfo *di, FRenderState &state, bool translucent) state.AlphaFunc(Alpha_GEqual, gl_mask_sprite_threshold); state.SetColor(0.2f, 0.2f, 0.2f, fuzzalpha, Colormap.Desaturation); additivefog = true; - lightlist = nullptr; // the fuzz effect does not use the sector's light level so splitting is not needed. + lightlist = nullptr; // the fuzz effect does not use the sector's light di->Level-> so splitting is not needed. } else if (RenderStyle.BlendOp == STYLEOP_Add && RenderStyle.DestAlpha == STYLEALPHA_One) { @@ -142,7 +142,7 @@ void GLSprite::DrawSprite(HWDrawInfo *di, FRenderState &state, bool translucent) } if (RenderStyle.BlendOp != STYLEOP_Shadow) { - if (level.HasDynamicLights && !di->isFullbrightScene() && !fullbright) + if (di->Level->HasDynamicLights && !di->isFullbrightScene() && !fullbright) { if (dynlightindex == -1) // only set if we got no light buffer index. This covers all cases where sprite lighting is used. { @@ -224,7 +224,7 @@ void GLSprite::DrawSprite(HWDrawInfo *di, FRenderState &state, bool translucent) FColormap thiscm; thiscm.CopyFog(Colormap); thiscm.CopyFrom3DLight(&(*lightlist)[i]); - if (level.flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING) + if (di->Level->flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING) { thiscm.Decolorize(); } @@ -459,7 +459,7 @@ bool GLSprite::CalculateVertices(HWDrawInfo *di, FVector3 *v, DVector3 *vp) inline void GLSprite::PutSprite(HWDrawInfo *di, bool translucent) { // That's a lot of checks... - if (modelframe && !modelframe->isVoxel && RenderStyle.BlendOp != STYLEOP_Shadow && gl_light_sprites && level.HasDynamicLights && !di->isFullbrightScene() && !fullbright) + if (modelframe && !modelframe->isVoxel && RenderStyle.BlendOp != STYLEOP_Shadow && gl_light_sprites && di->Level->HasDynamicLights && !di->isFullbrightScene() && !fullbright) { hw_GetDynModelLight(actor, lightdata); dynlightindex = screen->mLights->UploadLights(lightdata); @@ -528,7 +528,7 @@ void GLSprite::SplitSprite(HWDrawInfo *di, sector_t * frontsector, bool transluc copySprite.lightlevel = hw_ClampLight(*lightlist[i].p_lightlevel); copySprite.Colormap.CopyLight(lightlist[i].extra_colormap); - if (level.flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING) + if (di->Level->flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING) { copySprite.Colormap.Decolorize(); } @@ -696,13 +696,13 @@ void GLSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t // [RH] Interpolate the sprite's position to make it look smooth DVector3 thingpos = thing->InterpolatedPosition(vp.TicFrac); - if (thruportal == 1) thingpos += level.Displacements.getOffset(thing->Sector->PortalGroup, sector->PortalGroup); + if (thruportal == 1) thingpos += di->Level->Displacements.getOffset(thing->Sector->PortalGroup, sector->PortalGroup); // Some added checks if the camera actor is not supposed to be seen. It can happen that some portal setup has this actor in view in which case it may not be skipped here if (thing == camera && !vp.showviewer) { DVector3 thingorigin = thing->Pos(); - if (thruportal == 1) thingorigin += level.Displacements.getOffset(thing->Sector->PortalGroup, sector->PortalGroup); + if (thruportal == 1) thingorigin += di->Level->Displacements.getOffset(thing->Sector->PortalGroup, sector->PortalGroup); if (fabs(thingorigin.X - vp.ActorPos.X) < 2 && fabs(thingorigin.Y - vp.ActorPos.Y) < 2) return; } // Thing is invisible if close to the camera. @@ -773,7 +773,7 @@ void GLSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t x = thingpos.X; z = thingpos.Z; y = thingpos.Y; - if (spritetype == RF_FACESPRITE) z -= thing->Floorclip; // wall and flat sprites are to be considered level geometry so this may not apply. + if (spritetype == RF_FACESPRITE) z -= thing->Floorclip; // wall and flat sprites are to be considered di->Level-> geometry so this may not apply. // [RH] Make floatbobbing a renderer-only effect. if (thing->flags2 & MF2_FLOATBOB) @@ -946,7 +946,7 @@ void GLSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t Colormap = rendersector->Colormap; if (fullbright) { - if (rendersector == &level.sectors[rendersector->sectornum] || in_area != area_below) + if (rendersector == &di->Level->sectors[rendersector->sectornum] || in_area != area_below) // under water areas keep their color for fullbright objects { // Only make the light white but keep everything else (fog, desaturation and Boom colormap.) @@ -960,7 +960,7 @@ void GLSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t Colormap.LightColor.b = (3 * Colormap.LightColor.b + 0xff) / 4; } } - else if (level.flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING) + else if (di->Level->flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING) { Colormap.Decolorize(); } @@ -1143,7 +1143,7 @@ void GLSprite::ProcessParticle (HWDrawInfo *di, particle_t *particle, sector_t * break; } } - if (level.flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING) + if (di->Level->flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING) { Colormap.Decolorize(); // ZDoom never applies colored light to particles. } @@ -1198,7 +1198,7 @@ void GLSprite::ProcessParticle (HWDrawInfo *di, particle_t *particle, sector_t * const auto &vp = di->Viewpoint; double timefrac = vp.TicFrac; - if (paused || bglobal.freeze || (level.flags2 & LEVEL2_FROZEN)) + if (paused || bglobal.freeze || (di->Level->flags2 & LEVEL2_FROZEN)) timefrac = 0.; float xvf = (particle->Vel.X) * timefrac; float yvf = (particle->Vel.Y) * timefrac; diff --git a/src/hwrenderer/scene/hw_walls.cpp b/src/hwrenderer/scene/hw_walls.cpp index c11037894..905e70b11 100644 --- a/src/hwrenderer/scene/hw_walls.cpp +++ b/src/hwrenderer/scene/hw_walls.cpp @@ -281,7 +281,7 @@ void GLWall::DrawWall(HWDrawInfo *di, FRenderState &state, bool translucent) { if (screen->BuffersArePersistent()) { - if (level.HasDynamicLights && !di->isFullbrightScene() && gltexture != nullptr) + if (di->Level->HasDynamicLights && !di->isFullbrightScene() && gltexture != nullptr) { SetupLights(di, lightdata); } @@ -322,7 +322,7 @@ void GLWall::SetupLights(HWDrawInfo *di, FDynLightData &lightdata) { lightdata.Clear(); - if (RenderStyle == STYLE_Add && !level.lightadditivesurfaces) return; // no lights on additively blended surfaces. + if (RenderStyle == STYLE_Add && !di->Level->lightadditivesurfaces) return; // no lights on additively blended surfaces. // check for wall types which cannot have dynamic lights on them (portal types never get here so they don't need to be checked.) switch (type) @@ -456,7 +456,7 @@ void GLWall::PutWall(HWDrawInfo *di, bool translucent) if (!screen->BuffersArePersistent()) { - if (level.HasDynamicLights && !di->isFullbrightScene() && gltexture != nullptr) + if (di->Level->HasDynamicLights && !di->isFullbrightScene() && gltexture != nullptr) { SetupLights(di, lightdata); } @@ -567,7 +567,7 @@ void GLWall::PutPortal(HWDrawInfo *di, int ptype, int plane) if (!portal) { line_t *otherside = lineportal->lines[0]->mDestination; - if (otherside != nullptr && otherside->portalindex < level.linePortals.Size()) + if (otherside != nullptr && otherside->portalindex < di->Level->linePortals.Size()) { di->ProcessActorsInPortal(otherside->getPortal()->mGroup, di->in_area); } @@ -604,7 +604,7 @@ void GLWall::PutPortal(HWDrawInfo *di, int ptype, int plane) void GLWall::Put3DWall(HWDrawInfo *di, lightlist_t * lightlist, bool translucent) { - // only modify the light level if it doesn't originate from the seg's frontsector. This is to account for light transferring effects + // only modify the light di->Level-> if it doesn't originate from the seg's frontsector. This is to account for light transferring effects if (lightlist->p_lightlevel != &seg->sidedef->sector->lightlevel) { lightlevel = hw_ClampLight(*lightlist->p_lightlevel); @@ -1516,7 +1516,7 @@ void GLWall::BuildFFBlock(HWDrawInfo *di, seg_t * seg, F3DFloor * rover, light = P_GetPlaneLight(rover->target, rover->top.plane, true); Colormap.Clear(); Colormap.LightColor = light->extra_colormap.FadeColor; - // the fog plane defines the light level, not the front sector + // the fog plane defines the light di->Level->, not the front sector lightlevel = hw_ClampLight(*light->p_lightlevel); gltexture = NULL; type = RENDERWALL_FFBLOCK; @@ -1867,8 +1867,8 @@ void GLWall::Process(HWDrawInfo *di, seg_t *seg, sector_t * frontsector, sector_ else { // Need these for aligning the textures - realfront = &level.sectors[frontsector->sectornum]; - realback = backsector ? &level.sectors[backsector->sectornum] : NULL; + realfront = &di->Level->sectors[frontsector->sectornum]; + realback = backsector ? &di->Level->sectors[backsector->sectornum] : NULL; segfront = frontsector; segback = backsector; } @@ -1928,7 +1928,7 @@ void GLWall::Process(HWDrawInfo *di, seg_t *seg, sector_t * frontsector, sector_ int rel = 0; int orglightlevel = hw_ClampLight(frontsector->lightlevel); - bool foggy = (!Colormap.FadeColor.isBlack() || level.flags&LEVEL_HASFADETABLE); // fog disables fake contrast + bool foggy = (!Colormap.FadeColor.isBlack() || di->Level->flags&LEVEL_HASFADETABLE); // fog disables fake contrast lightlevel = hw_ClampLight(seg->sidedef->GetLightLevel(foggy, orglightlevel, false, &rel)); if (orglightlevel >= 253) // with the software renderer fake contrast won't be visible above this. { diff --git a/src/hwrenderer/scene/hw_weapon.cpp b/src/hwrenderer/scene/hw_weapon.cpp index 787bf539e..96bd52b63 100644 --- a/src/hwrenderer/scene/hw_weapon.cpp +++ b/src/hwrenderer/scene/hw_weapon.cpp @@ -237,7 +237,7 @@ WeaponLighting HWDrawInfo::GetWeaponLighting(sector_t *viewsector, const DVector l.lightlevel = hw_ClampLight(fakesec->lightlevel); // calculate colormap for weapon sprites - if (viewsector->e->XFloor.ffloors.Size() && !(level.flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING)) + if (viewsector->e->XFloor.ffloors.Size() && !(Level->flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING)) { TArray & lightlist = viewsector->e->XFloor.lightlist; for (unsigned i = 0; iColormap; - if (level.flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING) l.cm.ClearColor(); + if (Level->flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING) l.cm.ClearColor(); } l.lightlevel = CalcLightLevel(l.lightlevel, getExtraLight(), true, 0); @@ -289,7 +289,7 @@ WeaponLighting HWDrawInfo::GetWeaponLighting(sector_t *viewsector, const DVector } // Korshun: fullbright fog in opengl, render weapon sprites fullbright (but don't cancel out the light color!) - if (level.brightfog && ((level.flags&LEVEL_HASFADETABLE) || l.cm.FadeColor != 0)) + if (Level->brightfog && ((Level->flags&LEVEL_HASFADETABLE) || l.cm.FadeColor != 0)) { l.lightlevel = 255; } @@ -530,7 +530,7 @@ void HWDrawInfo::PreparePlayerSprites(sector_t * viewsector, area_t in_area) hudsprite.dynrgb[0] = hudsprite.dynrgb[1] = hudsprite.dynrgb[2] = 0; hudsprite.lightindex = -1; // set the lighting parameters - if (hudsprite.RenderStyle.BlendOp != STYLEOP_Shadow && level.HasDynamicLights && !isFullbrightScene() && gl_light_sprites) + if (hudsprite.RenderStyle.BlendOp != STYLEOP_Shadow && Level->HasDynamicLights && !isFullbrightScene() && gl_light_sprites) { if (!hudModelStep) { diff --git a/src/hwrenderer/utility/hw_clock.cpp b/src/hwrenderer/utility/hw_clock.cpp index 179776a65..2ac4c48f0 100644 --- a/src/hwrenderer/utility/hw_clock.cpp +++ b/src/hwrenderer/utility/hw_clock.cpp @@ -167,8 +167,9 @@ void CheckBench() FString compose; auto &vp = r_viewpoint; + auto Level = vp.ViewLevel; compose.Format("Map %s: \"%s\",\nx = %1.4f, y = %1.4f, z = %1.4f, angle = %1.4f, pitch = %1.4f\n", - level.MapName.GetChars(), level.LevelName.GetChars(), vp.Pos.X, vp.Pos.Y, vp.Pos.Z, vp.Angles.Yaw.Degrees, vp.Angles.Pitch.Degrees); + Level->MapName.GetChars(), Level->LevelName.GetChars(), vp.Pos.X, vp.Pos.Y, vp.Pos.Z, vp.Angles.Yaw.Degrees, vp.Angles.Pitch.Degrees); AppendRenderStats(compose); AppendRenderTimes(compose); diff --git a/src/hwrenderer/utility/hw_lighting.cpp b/src/hwrenderer/utility/hw_lighting.cpp index 499d947ab..e1845b51a 100644 --- a/src/hwrenderer/utility/hw_lighting.cpp +++ b/src/hwrenderer/utility/hw_lighting.cpp @@ -164,7 +164,7 @@ PalEntry HWDrawInfo::CalcLightColor(int light, PalEntry pe, int blendfactor) // This is what Legacy's GL render does. // 2. black fog means no fog and always uses the distfogtable based on the level's fog density setting // 3. If outside fog is defined and the current fog color is the same as the outside fog -// the engine always uses the outside fog density to make the fog uniform across the level. +// the engine always uses the outside fog density to make the fog uniform across the Level-> // If the outside fog's density is undefined it uses the level's fog density and if that is // not defined it uses a default of 70. // 4. If a global fog density is specified it is being used for all fog on the level @@ -182,7 +182,7 @@ float HWDrawInfo::GetFogDensity(int lightlevel, PalEntry fogcolor, int sectorfog if (lightmode == ELightMode::DoomLegacy) { // uses approximations of Legacy's default settings. - density = level.fogdensity ? (float)level.fogdensity : 18; + density = Level->fogdensity ? (float)Level->fogdensity : 18; } else if (sectorfogdensity != 0) { @@ -192,7 +192,7 @@ float HWDrawInfo::GetFogDensity(int lightlevel, PalEntry fogcolor, int sectorfog else if ((fogcolor.d & 0xffffff) == 0) { // case 2: black fog - if ((!isSoftwareLighting() || blendfactor > 0) && !(level.flags3 & LEVEL3_NOLIGHTFADE)) + if ((!isSoftwareLighting() || blendfactor > 0) && !(Level->flags3 & LEVEL3_NOLIGHTFADE)) { density = distfogtable[lightmode != ELightMode::LinearStandard][hw_ClampLight(lightlevel)]; } @@ -201,15 +201,15 @@ float HWDrawInfo::GetFogDensity(int lightlevel, PalEntry fogcolor, int sectorfog density = 0; } } - else if (level.outsidefogdensity != 0 && APART(level.info->outsidefog) != 0xff && (fogcolor.d & 0xffffff) == (level.info->outsidefog & 0xffffff)) + else if (Level->outsidefogdensity != 0 && APART(Level->info->outsidefog) != 0xff && (fogcolor.d & 0xffffff) == (Level->info->outsidefog & 0xffffff)) { // case 3. outsidefogdensity has already been set as needed - density = (float)level.outsidefogdensity; + density = (float)Level->outsidefogdensity; } - else if (level.fogdensity != 0) + else if (Level->fogdensity != 0) { // case 4: level has fog density set - density = (float)level.fogdensity; + density = (float)Level->fogdensity; } else if (lightlevel < 248) { @@ -249,10 +249,10 @@ bool HWDrawInfo::CheckFog(sector_t *frontsector, sector_t *backsector) else if (fogcolor.a != 0) { } - else if (level.outsidefogdensity != 0 && APART(level.info->outsidefog) != 0xff && (fogcolor.d & 0xffffff) == (level.info->outsidefog & 0xffffff)) + else if (Level->outsidefogdensity != 0 && APART(Level->info->outsidefog) != 0xff && (fogcolor.d & 0xffffff) == (Level->info->outsidefog & 0xffffff)) { } - else if (level.fogdensity!=0 || lightmode == ELightMode::DoomLegacy) + else if (Level->fogdensity!=0 || lightmode == ELightMode::DoomLegacy) { // case 3: level has fog density set } @@ -267,11 +267,11 @@ bool HWDrawInfo::CheckFog(sector_t *frontsector, sector_t *backsector) if ((fogcolor.d & 0xffffff) == 0) { } - else if (level.outsidefogdensity != 0 && APART(level.info->outsidefog) != 0xff && (fogcolor.d & 0xffffff) == (level.info->outsidefog & 0xffffff)) + else if (Level->outsidefogdensity != 0 && APART(Level->info->outsidefog) != 0xff && (fogcolor.d & 0xffffff) == (Level->info->outsidefog & 0xffffff)) { return false; } - else if (level.fogdensity!=0 || lightmode == ELightMode::DoomLegacy) + else if (Level->fogdensity!=0 || lightmode == ELightMode::DoomLegacy) { // case 3: level has fog density set return false; diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index c3f207927..aa234a33b 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -3276,7 +3276,7 @@ void MapLoader::LoadLevel(MapData *map, const char *lumpname, int position) InitRenderInfo(); // create hardware independent renderer resources for the level. This must be done BEFORE the PolyObj Spawn!!! P_ClearDynamic3DFloorData(); // CreateVBO must be run on the plain 3D floor data. - screen->mVertexData->CreateVBO(); + screen->mVertexData->CreateVBO(Level->sectors); for (auto &sec : Level->sectors) { diff --git a/src/p_setup.cpp b/src/p_setup.cpp index eebefbfdc..0fff24c55 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -643,3 +643,32 @@ CCMD(listmapsections) } } +//========================================================================== +// +// +// +//========================================================================== + +CUSTOM_CVAR(Bool, forcewater, false, CVAR_ARCHIVE | CVAR_SERVERINFO) +{ + if (gamestate == GS_LEVEL) + { + auto Level = &level; + for (auto &sec : Level->sectors) + { + sector_t *hsec = sec.GetHeightSec(); + if (hsec && !(hsec->MoreFlags & SECMF_UNDERWATER)) + { + if (self) + { + hsec->MoreFlags |= SECMF_FORCEDUNDERWATER; + } + else + { + hsec->MoreFlags &= ~SECMF_FORCEDUNDERWATER; + } + } + } + } +} + diff --git a/src/p_spec.cpp b/src/p_spec.cpp index d84f36074..3d07180c1 100644 --- a/src/p_spec.cpp +++ b/src/p_spec.cpp @@ -103,6 +103,7 @@ static FRandom pr_playerinspecialsector ("PlayerInSpecialSector"); EXTERN_CVAR(Bool, cl_predict_specials) +EXTERN_CVAR(Bool, forcewater) // [RH] Check dmflags for noexit and respond accordingly bool FLevelLocals::CheckIfExitIsGood (AActor *self, level_info_t *info) @@ -680,35 +681,10 @@ void P_UpdateSpecials (FLevelLocals *Level) } } - - // // SPECIAL SPAWNING // -CUSTOM_CVAR (Bool, forcewater, false, CVAR_ARCHIVE|CVAR_SERVERINFO) -{ - if (gamestate == GS_LEVEL) - { - auto Level = &level; - for (auto &sec : Level->sectors) - { - sector_t *hsec = sec.GetHeightSec(); - if (hsec && !(hsec->MoreFlags & SECMF_UNDERWATER)) - { - if (self) - { - hsec->MoreFlags |= SECMF_FORCEDUNDERWATER; - } - else - { - hsec->MoreFlags &= ~SECMF_FORCEDUNDERWATER; - } - } - } - } -} - IMPLEMENT_CLASS(DLightTransfer, false, false) void DLightTransfer::Serialize(FSerializer &arc) diff --git a/src/r_utility.cpp b/src/r_utility.cpp index 9117fc01f..26d8d4f6d 100644 --- a/src/r_utility.cpp +++ b/src/r_utility.cpp @@ -1034,6 +1034,7 @@ void R_SetupFrame (FRenderViewpoint &viewpoint, FViewWindow &viewwindow, AActor viewpoint.HWAngles.Pitch = RAD2DEG((float)asin(angy / alen)); viewpoint.HWAngles.Roll.Degrees = (float)viewpoint.Angles.Roll.Degrees; // copied for convenience. + viewpoint.ViewLevel = &level; // ViewActor only gets set, if the camera actor should not be rendered if (actor->player && actor->player - players == consoleplayer && diff --git a/src/r_utility.h b/src/r_utility.h index 1eb93096a..53218615f 100644 --- a/src/r_utility.h +++ b/src/r_utility.h @@ -13,6 +13,8 @@ struct FViewWindow; // There a 0-31, i.e. 32 LUT in the COLORMAP lump. #define NUMCOLORMAPS 32 +struct FLevelLocals; + struct FRenderViewpoint { FRenderViewpoint(); @@ -24,6 +26,7 @@ struct FRenderViewpoint FRotator HWAngles; // Actual rotation angles for the hardware renderer DVector2 ViewVector; // HWR only: direction the camera is facing. AActor *ViewActor; // either the same as camera or nullptr + FLevelLocals *ViewLevel; // The level this viewpoint is on. DVector3 Path[2]; // View path for portal calculations double Cos; // cos(Angles.Yaw) From 4e052f285799ab2bd7cc08b376ef2797beab16ef Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 25 Jan 2019 18:16:18 +0100 Subject: [PATCH 018/164] - use a separate variable pointing to the current level for the UI code. UI always runs on the primary level, so this does not need the ability to operate on multiple levels. Additionally, this can later be set to null when running play code so that scope violations result in an abort. --- src/g_level.cpp | 3 +- src/g_levellocals.h | 3 +- src/g_statusbar/sbar.h | 1 - src/g_statusbar/sbarinfo.cpp | 2 +- src/g_statusbar/sbarinfo_commands.cpp | 68 +++++++++---------- src/g_statusbar/shared_sbar.cpp | 19 ------ src/nodebuild_extract.cpp | 10 +-- src/portal.cpp | 2 +- src/scripting/vmthunks.cpp | 21 +++++- src/scripting/zscript/zcc_compile.cpp | 6 +- src/v_2ddrawer.cpp | 2 +- wadsrc/static/zscript/base.txt | 1 + .../static/zscript/menu/conversationmenu.txt | 2 +- wadsrc/static/zscript/menu/readthis.txt | 6 +- wadsrc/static/zscript/statusbar/alt_hud.txt | 30 ++++---- wadsrc/static/zscript/statusbar/doom_sbar.txt | 4 +- wadsrc/static/zscript/statusbar/harm_sbar.txt | 2 +- .../static/zscript/statusbar/heretic_sbar.txt | 4 +- .../static/zscript/statusbar/hexen_sbar.txt | 2 +- wadsrc/static/zscript/statusbar/statusbar.txt | 20 +++--- .../static/zscript/statusbar/strife_sbar.txt | 2 +- 21 files changed, 107 insertions(+), 103 deletions(-) diff --git a/src/g_level.cpp b/src/g_level.cpp index 5e8780f58..0345fd449 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -153,7 +153,8 @@ extern bool sendpause, sendsave, sendturn180, SendLand; void *statcopy; // for statistics driver -FLevelLocals level; // info about current level +FLevelLocals level; // info about current level +FLevelLocals *currentUILevel = &level; // level for which to display the user interface. //========================================================================== diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 06aeea6a2..ded9a40fe 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -413,9 +413,9 @@ public: } }; -#ifndef NO_DEFINE_LEVEL extern FLevelLocals level; +extern FLevelLocals *currentUILevel; // level for which to display the user interface. This will always be the one the current consoleplayer is in. inline FSectorPortal *line_t::GetTransferredPortal() { @@ -510,4 +510,3 @@ inline bool line_t::hitSkyWall(AActor* mo) const backsector->GetTexture(sector_t::ceiling) == skyflatnum && mo->Z() >= backsector->ceilingplane.ZatPoint(mo->PosRelative(this)); } -#endif diff --git a/src/g_statusbar/sbar.h b/src/g_statusbar/sbar.h index d07292b6b..a91452e3f 100644 --- a/src/g_statusbar/sbar.h +++ b/src/g_statusbar/sbar.h @@ -516,7 +516,6 @@ DBaseStatusBar *CreateCustomStatusBar(int script=0); // Crosshair stuff ---------------------------------------------------------- -void ST_FormatMapName(FString &mapname, const char *mapnamecolor = ""); void ST_LoadCrosshair(bool alwaysload=false); void ST_Clear(); void ST_CreateStatusBar(bool bTitleLevel); diff --git a/src/g_statusbar/sbarinfo.cpp b/src/g_statusbar/sbarinfo.cpp index 7b1184cec..9da0e107e 100644 --- a/src/g_statusbar/sbarinfo.cpp +++ b/src/g_statusbar/sbarinfo.cpp @@ -1075,7 +1075,7 @@ public: lastHud = hud; // Handle inventory bar drawing - if(CPlayer->inventorytics > 0 && !(level.flags & LEVEL_NOINVENTORYBAR) && (state == HUD_StatusBar || state == HUD_Fullscreen)) + if(CPlayer->inventorytics > 0 && !(currentUILevel->flags & LEVEL_NOINVENTORYBAR) && (state == HUD_StatusBar || state == HUD_Fullscreen)) { SBarInfoMainBlock *inventoryBar = state == HUD_StatusBar ? script->huds[STBAR_INVENTORY] : script->huds[STBAR_INVENTORYFULLSCREEN]; if(inventoryBar != lastInventoryBar) diff --git a/src/g_statusbar/sbarinfo_commands.cpp b/src/g_statusbar/sbarinfo_commands.cpp index cc0c8a5cf..dd21c089f 100644 --- a/src/g_statusbar/sbarinfo_commands.cpp +++ b/src/g_statusbar/sbarinfo_commands.cpp @@ -850,26 +850,26 @@ class CommandDrawString : public SBarInfoCommand switch(strValue) { case LEVELNAME: - if(level.lumpnum != cache) + if(currentUILevel->lumpnum != cache) { - cache = level.lumpnum; - str = level.LevelName; + cache = currentUILevel->lumpnum; + str = currentUILevel->LevelName; RealignString(); } break; case LEVELLUMP: - if(level.lumpnum != cache) + if(currentUILevel->lumpnum != cache) { - cache = level.lumpnum; - str = level.MapName; + cache = currentUILevel->lumpnum; + str = currentUILevel->MapName; str.ToUpper(); RealignString(); } break; case SKILLNAME: - if(level.lumpnum != cache) // Can only change skill between level. + if(currentUILevel->lumpnum != cache) // Can only change skill between currentUILevel-> { - cache = level.lumpnum; + cache = currentUILevel->lumpnum; str = G_SkillName(); RealignString(); } @@ -904,7 +904,7 @@ class CommandDrawString : public SBarInfoCommand if(ACS_GlobalVars[valueArgument] != cache) { cache = ACS_GlobalVars[valueArgument]; - str = level.Behaviors.LookupString(ACS_GlobalVars[valueArgument]); + str = currentUILevel->Behaviors.LookupString(ACS_GlobalVars[valueArgument]); RealignString(); } break; @@ -912,13 +912,13 @@ class CommandDrawString : public SBarInfoCommand if(ACS_GlobalArrays[valueArgument][consoleplayer] != cache) { cache = ACS_GlobalArrays[valueArgument][consoleplayer]; - str = level.Behaviors.LookupString(ACS_GlobalArrays[valueArgument][consoleplayer]); + str = currentUILevel->Behaviors.LookupString(ACS_GlobalArrays[valueArgument][consoleplayer]); RealignString(); } break; case TIME: { - int sec = Tics2Seconds(level.time); + int sec = Tics2Seconds(currentUILevel->time); str.Format("%02d:%02d:%02d", sec / 3600, (sec % 3600) / 60, sec % 60); break; } @@ -1389,25 +1389,25 @@ class CommandDrawNumber : public CommandDrawString num = statusBar->CPlayer->fragcount; break; case KILLS: - num = level.killed_monsters; + num = currentUILevel->killed_monsters; break; case MONSTERS: - num = level.total_monsters; + num = currentUILevel->total_monsters; break; case ITEMS: - num = level.found_items; + num = currentUILevel->found_items; break; case TOTALITEMS: - num = level.total_items; + num = currentUILevel->total_items; break; case SECRETS: - num = level.found_secrets; + num = currentUILevel->found_secrets; break; case SCORE: num = statusBar->CPlayer->mo->Score; break; case TOTALSECRETS: - num = level.total_secrets; + num = currentUILevel->total_secrets; break; case ARMORCLASS: case SAVEPERCENT: @@ -1459,9 +1459,9 @@ class CommandDrawNumber : public CommandDrawString case AIRTIME: { if(statusBar->CPlayer->mo->waterlevel < 3) - num = level.airsupply/TICRATE; + num = currentUILevel->airsupply/TICRATE; else - num = clamp((statusBar->CPlayer->air_finished - level.time + (TICRATE-1))/TICRATE, 0, INT_MAX); + num = clamp((statusBar->CPlayer->air_finished - currentUILevel->time + (TICRATE-1))/TICRATE, 0, INT_MAX); break; } case SELECTEDINVENTORY: @@ -1502,7 +1502,7 @@ class CommandDrawNumber : public CommandDrawString } default: break; } - if(interpolationSpeed != 0 && (!hudChanged || level.time == 1)) + if(interpolationSpeed != 0 && (!hudChanged || currentUILevel->time == 1)) { if(num < drawValue) drawValue -= clamp((drawValue - num) >> 2, 1, interpolationSpeed); @@ -1691,7 +1691,7 @@ class CommandDrawSelectedInventory : public CommandDrawImage, private CommandDra if(alternateOnEmpty) SBarInfoCommandFlowControl::Draw(block, statusBar); - if(statusBar->CPlayer->mo->PointerVar(NAME_InvSel) != NULL && !(level.flags & LEVEL_NOINVENTORYBAR)) + if(statusBar->CPlayer->mo->PointerVar(NAME_InvSel) != NULL && !(currentUILevel->flags & LEVEL_NOINVENTORYBAR)) { if(artiflash && statusBar->wrapper->artiflashTick) { @@ -1791,7 +1791,7 @@ class CommandDrawSelectedInventory : public CommandDrawImage, private CommandDra { SBarInfoCommandFlowControl::Tick(block, statusBar, hudChanged); - SetTruth(statusBar->CPlayer->mo->PointerVar(NAME_InvSel) == NULL || (level.flags & LEVEL_NOINVENTORYBAR), block, statusBar); + SetTruth(statusBar->CPlayer->mo->PointerVar(NAME_InvSel) == NULL || (currentUILevel->flags & LEVEL_NOINVENTORYBAR), block, statusBar); CommandDrawImage::Tick(block, statusBar, hudChanged); CommandDrawNumber::Tick(block, statusBar, hudChanged); @@ -1910,7 +1910,7 @@ class CommandInventoryBarNotVisible : public SBarInfoCommandFlowControl { SBarInfoCommandFlowControl::Tick(block, statusBar, hudChanged); - SetTruth(statusBar->CPlayer->inventorytics <= 0 || (level.flags & LEVEL_NOINVENTORYBAR), block, statusBar); + SetTruth(statusBar->CPlayer->inventorytics <= 0 || (currentUILevel->flags & LEVEL_NOINVENTORYBAR), block, statusBar); } }; @@ -2727,16 +2727,16 @@ class CommandDrawBar : public SBarInfoCommand max = fraglimit; break; case KILLS: - value = level.killed_monsters; - max = level.total_monsters; + value = currentUILevel->killed_monsters; + max = currentUILevel->total_monsters; break; case ITEMS: - value = level.found_items; - max = level.total_items; + value = currentUILevel->found_items; + max = currentUILevel->total_items; break; case SECRETS: - value = level.found_secrets; - max = level.total_secrets; + value = currentUILevel->found_secrets; + max = currentUILevel->total_secrets; break; case INVENTORY: { @@ -2751,8 +2751,8 @@ class CommandDrawBar : public SBarInfoCommand break; } case AIRTIME: - value = clamp(statusBar->CPlayer->air_finished - level.time, 0, INT_MAX); - max = level.airsupply; + value = clamp(statusBar->CPlayer->air_finished - currentUILevel->time, 0, INT_MAX); + max = currentUILevel->airsupply; break; case POWERUPTIME: { @@ -2798,7 +2798,7 @@ class CommandDrawBar : public SBarInfoCommand } else value = 0; - if(interpolationSpeed != 0 && (!hudChanged || level.time == 1)) + if(interpolationSpeed != 0 && (!hudChanged || currentUILevel->time == 1)) { // [BL] Since we used a percentage (in order to get the most fluid animation) // we need to establish a cut off point so the last pixel won't hang as the animation slows @@ -3192,7 +3192,7 @@ class CommandDrawGem : public SBarInfoCommand goalValue = reverse ? 100 - goalValue : goalValue; - if(interpolationSpeed != 0 && (!hudChanged || level.time == 1)) // At the start force an animation + if(interpolationSpeed != 0 && (!hudChanged || currentUILevel->time == 1)) // At the start force an animation { if(goalValue < drawValue) drawValue -= clamp((drawValue - goalValue) >> 2, 1, interpolationSpeed); @@ -3202,7 +3202,7 @@ class CommandDrawGem : public SBarInfoCommand else drawValue = goalValue; - if(wiggle && level.time & 1) + if(wiggle && currentUILevel->time & 1) chainWiggle = pr_chainwiggle() & 1; } protected: diff --git a/src/g_statusbar/shared_sbar.cpp b/src/g_statusbar/shared_sbar.cpp index f9ccf7978..378af905f 100644 --- a/src/g_statusbar/shared_sbar.cpp +++ b/src/g_statusbar/shared_sbar.cpp @@ -133,25 +133,6 @@ CUSTOM_CVAR(Int, am_showmaplabel, 2, CVAR_ARCHIVE) CVAR (Bool, idmypos, false, 0); -//--------------------------------------------------------------------------- -// -// Format the map name, include the map label if wanted -// -//--------------------------------------------------------------------------- - -void ST_FormatMapName(FString &mapname, const char *mapnamecolor) -{ - cluster_info_t *cluster = FindClusterInfo (level.cluster); - bool ishub = (cluster != NULL && (cluster->flags & CLUSTER_HUB)); - - mapname = ""; - if (am_showmaplabel == 1 || (am_showmaplabel == 2 && !ishub)) - { - mapname << level.MapName << ": "; - } - mapname << mapnamecolor << level.LevelName; -} - //--------------------------------------------------------------------------- // // Load crosshair definitions diff --git a/src/nodebuild_extract.cpp b/src/nodebuild_extract.cpp index 4d7aaf586..441275dc6 100644 --- a/src/nodebuild_extract.cpp +++ b/src/nodebuild_extract.cpp @@ -52,11 +52,11 @@ #undef DD #endif -void FNodeBuilder::Extract (FLevelLocals &level) +void FNodeBuilder::Extract (FLevelLocals &theLevel) { int i; - auto &outVerts = level.vertexes; + auto &outVerts = theLevel.vertexes; int vertCount = Vertices.Size (); outVerts.Alloc(vertCount); @@ -65,12 +65,12 @@ void FNodeBuilder::Extract (FLevelLocals &level) outVerts[i].set(Vertices[i].x, Vertices[i].y); } - auto &outSubs = level.subsectors; + auto &outSubs = theLevel.subsectors; auto subCount = Subsectors.Size(); outSubs.Alloc(subCount); memset(&outSubs[0], 0, subCount * sizeof(subsector_t)); - auto &outNodes = level.nodes; + auto &outNodes = theLevel.nodes; auto nodeCount = Nodes.Size (); outNodes.Alloc(nodeCount); @@ -103,7 +103,7 @@ void FNodeBuilder::Extract (FLevelLocals &level) } } - auto &outSegs = level.segs; + auto &outSegs = theLevel.segs; if (GLNodes) { TArray segs (Segs.Size()*5/4); diff --git a/src/portal.cpp b/src/portal.cpp index fd6eb503c..d008e4fcc 100644 --- a/src/portal.cpp +++ b/src/portal.cpp @@ -612,7 +612,7 @@ unsigned FLevelLocals::GetStackPortal(AActor *point, int plane) //============================================================================ // -// level.GetPortalOffsetPosition +// GetPortalOffsetPosition // // Offsets a given coordinate if the trace from the origin crosses an // interactive line-to-line portal. diff --git a/src/scripting/vmthunks.cpp b/src/scripting/vmthunks.cpp index d90e3b008..34b9f40d8 100644 --- a/src/scripting/vmthunks.cpp +++ b/src/scripting/vmthunks.cpp @@ -2496,10 +2496,28 @@ DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, GetSpotState, GetSpotState) ACTION_RETURN_POINTER(GetSpotState(self, create)); } + +//--------------------------------------------------------------------------- +// +// Format the map name, include the map label if wanted +// +//--------------------------------------------------------------------------- + +EXTERN_CVAR(Int, am_showmaplabel) + static void FormatMapName(FLevelLocals *self, int cr, FString *result) { char mapnamecolor[3] = { '\34', char(cr + 'A'), 0 }; - ST_FormatMapName(*result, mapnamecolor); + + cluster_info_t *cluster = FindClusterInfo(self->cluster); + bool ishub = (cluster != nullptr && (cluster->flags & CLUSTER_HUB)); + + *result = ""; + if (am_showmaplabel == 1 || (am_showmaplabel == 2 && !ishub)) + { + *result << self->MapName << ": "; + } + *result << mapnamecolor << self->LevelName; } DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, FormatMapName, FormatMapName) @@ -2696,6 +2714,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(_AltHUD, GetLatency, Net_GetLatency) // //========================================================================== DEFINE_GLOBAL(level); +DEFINE_GLOBAL(currentUILevel); DEFINE_FIELD(FLevelLocals, sectors) DEFINE_FIELD(FLevelLocals, lines) DEFINE_FIELD(FLevelLocals, sides) diff --git a/src/scripting/zscript/zcc_compile.cpp b/src/scripting/zscript/zcc_compile.cpp index 7d9ff78d8..c963c0dd1 100644 --- a/src/scripting/zscript/zcc_compile.cpp +++ b/src/scripting/zscript/zcc_compile.cpp @@ -1369,11 +1369,15 @@ bool ZCCCompiler::CompileFields(PContainerType *type, TArrayName).GetChars(), type->TypeName.GetChars(), type->TypeName.GetChars()); } - else + else if (type != nullptr) { auto f = type->AddField(name->Name, thisfieldtype, varflags); if (field->Flags & (ZCC_Version | ZCC_Deprecated)) f->mVersion = field->Version; } + else + { + Error(field, "Cannot declare non-native global variables. Tried to declare %s", FName(name->Name).GetChars()); + } } name = static_cast(name->SiblingNext); } while (name != field->Names); diff --git a/src/v_2ddrawer.cpp b/src/v_2ddrawer.cpp index cfff94b32..21b860b9d 100644 --- a/src/v_2ddrawer.cpp +++ b/src/v_2ddrawer.cpp @@ -428,7 +428,7 @@ void F2DDrawer::AddPoly(FTexture *texture, FVector2 *points, int npoints, // is necessary in order to best reproduce Doom's original lighting. double fadelevel; - if (vid_rendermode != 4 || level.lightMode == ELightMode::Doom || level.lightMode == ELightMode::ZDoomSoftware || level.lightMode == ELightMode::DoomSoftware) + if (vid_rendermode != 4 || currentUILevel->lightMode == ELightMode::Doom || currentUILevel->lightMode == ELightMode::ZDoomSoftware || currentUILevel->lightMode == ELightMode::DoomSoftware) { double map = (NUMCOLORMAPS * 2.) - ((lightlevel + 12) * (NUMCOLORMAPS / 128.)); fadelevel = clamp((map - 12) / NUMCOLORMAPS, 0.0, 1.0); diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index 61d713e6b..5263aebf8 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -45,6 +45,7 @@ struct _ native // These are the global variables, the struct is only here to av native ui BaseStatusBar StatusBar; native readonly Weapon WP_NOCHANGE; native int LocalViewPitch; + native ui readonly LevelLocals currentUILevel; } diff --git a/wadsrc/static/zscript/menu/conversationmenu.txt b/wadsrc/static/zscript/menu/conversationmenu.txt index 3474753e8..271381ae3 100644 --- a/wadsrc/static/zscript/menu/conversationmenu.txt +++ b/wadsrc/static/zscript/menu/conversationmenu.txt @@ -509,7 +509,7 @@ class ConversationMenu : Menu override void Ticker() { // [CW] Freeze the game depending on MAPINFO options. - if (ConversationPauseTic < gametic && !multiplayer && !level.no_dlg_freeze) + if (ConversationPauseTic < gametic && !multiplayer && !currentUILevel.no_dlg_freeze) { menuactive = Menu.On; } diff --git a/wadsrc/static/zscript/menu/readthis.txt b/wadsrc/static/zscript/menu/readthis.txt index 604fb489e..d1581d967 100644 --- a/wadsrc/static/zscript/menu/readthis.txt +++ b/wadsrc/static/zscript/menu/readthis.txt @@ -57,9 +57,9 @@ class ReadThisMenu : GenericMenu TextureID tex, prevpic; // Did the mapper choose a custom help page via MAPINFO? - if (level.F1Pic.Length() != 0) + if (currentUILevel.F1Pic.Length() != 0) { - tex = TexMan.CheckForTexture(level.F1Pic, TexMan.Type_MiscPatch); + tex = TexMan.CheckForTexture(currentUILevel.F1Pic, TexMan.Type_MiscPatch); mScreen = 1; } @@ -98,7 +98,7 @@ class ReadThisMenu : GenericMenu MenuSound("menu/choose"); mScreen++; mInfoTic = gametic; - if (level.F1Pic.Length() != 0 || mScreen > gameinfo.infoPages.Size()) + if (currentUILevel.F1Pic.Length() != 0 || mScreen > gameinfo.infoPages.Size()) { Close(); } diff --git a/wadsrc/static/zscript/statusbar/alt_hud.txt b/wadsrc/static/zscript/statusbar/alt_hud.txt index ccc9b568d..99a62603a 100644 --- a/wadsrc/static/zscript/statusbar/alt_hud.txt +++ b/wadsrc/static/zscript/statusbar/alt_hud.txt @@ -205,17 +205,17 @@ class AltHud ui // work in cooperative hub games if (hud_showsecrets) { - DrawStatLine(x, y, "S:", String.Format("%i/%i ", multiplayer? CPlayer.secretcount : level.found_secrets, level.total_secrets)); + DrawStatLine(x, y, "S:", String.Format("%i/%i ", multiplayer? CPlayer.secretcount : currentUILevel.found_secrets, currentUILevel.total_secrets)); } if (hud_showitems) { - DrawStatLine(x, y, "I:", String.Format("%i/%i ", multiplayer? CPlayer.itemcount : level.found_items, level.total_items)); + DrawStatLine(x, y, "I:", String.Format("%i/%i ", multiplayer? CPlayer.itemcount : currentUILevel.found_items, currentUILevel.total_items)); } if (hud_showmonsters) { - DrawStatLine(x, y, "K:", String.Format("%i/%i ", multiplayer? CPlayer.killcount : level.killed_monsters, level.total_monsters)); + DrawStatLine(x, y, "K:", String.Format("%i/%i ", multiplayer? CPlayer.killcount : currentUILevel.killed_monsters, currentUILevel.total_monsters)); } } } @@ -739,18 +739,18 @@ class AltHud ui } else { - pos.xy = Level.GetAutomapPosition(); + pos.xy = currentUILevel.GetAutomapPosition(); pos.z = Sector.PointInSector(pos.xy).floorplane.ZatPoint(pos.xy); } int xpos = hudwidth - SmallFont.StringWidth("X: -00000")-6; int ypos = 18; - screen.DrawText(SmallFont, hudcolor_titl, hudwidth - 6 - SmallFont.StringWidth(level.MapName), ypos, level.MapName, + screen.DrawText(SmallFont, hudcolor_titl, hudwidth - 6 - SmallFont.StringWidth(currentUILevel.MapName), ypos, currentUILevel.MapName, DTA_KeepRatio, true, DTA_VirtualWidth, hudwidth, DTA_VirtualHeight, hudheight); - screen.DrawText(SmallFont, hudcolor_titl, hudwidth - 6 - SmallFont.StringWidth(level.LevelName), ypos + h, level.LevelName, + screen.DrawText(SmallFont, hudcolor_titl, hudwidth - 6 - SmallFont.StringWidth(currentUILevel.LevelName), ypos + h, currentUILevel.LevelName, DTA_KeepRatio, true, DTA_VirtualWidth, hudwidth, DTA_VirtualHeight, hudheight); @@ -793,10 +793,10 @@ class AltHud ui { int timeTicks = hud_showtime < 4 - ? level.maptime + ? currentUILevel.maptime : (hud_showtime < 6 - ? level.time - : level.totaltime); + ? currentUILevel.time + : currentUILevel.totaltime); timeSeconds = Thinker.Tics2Seconds(timeTicks); } else @@ -815,7 +815,7 @@ class AltHud ui if (showMillis) { - int millis = (level.time % Thinker.TICRATE) * (1000 / Thinker.TICRATE); + int millis = (currentUILevel.time % Thinker.TICRATE) * (1000 / Thinker.TICRATE); timeString = String.Format("%02i:%02i:%02i.%03i", hours, minutes, seconds, millis); } else if (showSeconds) @@ -946,23 +946,23 @@ class AltHud ui if (am_showtotaltime) { - DrawTimeString(SmallFont, hudcolor_ttim, level.totaltime, hudwidth-2, bottom, 1); + DrawTimeString(SmallFont, hudcolor_ttim, currentUILevel.totaltime, hudwidth-2, bottom, 1); bottom -= fonth; } if (am_showtime) { - if (level.clusterflags & level.CLUSTER_HUB) + if (currentUILevel.clusterflags & currentUILevel.CLUSTER_HUB) { - DrawTimeString(SmallFont, hudcolor_time, level.time, hudwidth-2, bottom, 1); + DrawTimeString(SmallFont, hudcolor_time, currentUILevel.time, hudwidth-2, bottom, 1); bottom -= fonth; } // Single level time for hubs - DrawTimeString(SmallFont, hudcolor_ltim, level.maptime, hudwidth-2, bottom, 1); + DrawTimeString(SmallFont, hudcolor_ltim, currentUILevel.maptime, hudwidth-2, bottom, 1); } - screen.DrawText(SmallFont, 0, 1, hudheight - fonth - 1, level.FormatMapName(hudcolor_titl), + screen.DrawText(SmallFont, 0, 1, hudheight - fonth - 1, currentUILevel.FormatMapName(hudcolor_titl), DTA_KeepRatio, true, DTA_VirtualWidth, hudwidth, DTA_VirtualHeight, hudheight); diff --git a/wadsrc/static/zscript/statusbar/doom_sbar.txt b/wadsrc/static/zscript/statusbar/doom_sbar.txt index 7eddf319e..eb775d7f9 100644 --- a/wadsrc/static/zscript/statusbar/doom_sbar.txt +++ b/wadsrc/static/zscript/statusbar/doom_sbar.txt @@ -105,7 +105,7 @@ class DoomStatusBar : BaseStatusBar DrawImage("STFBANY", (143, 168), DI_ITEM_OFFSETS|DI_TRANSLATABLE); } - if (CPlayer.mo.InvSel != null && !level.NoInventoryBar) + if (CPlayer.mo.InvSel != null && !currentUILevel.NoInventoryBar) { DrawInventoryIcon(CPlayer.mo.InvSel, (160, 198)); if (CPlayer.mo.InvSel.Amount > 1) @@ -153,7 +153,7 @@ class DoomStatusBar : BaseStatusBar DrawString(mHUDFont, FormatNumber(ammotype2.Amount, 3), (-30, invY), DI_TEXT_ALIGN_RIGHT); invY -= 20; } - if (!isInventoryBarVisible() && !level.NoInventoryBar && CPlayer.mo.InvSel != null) + if (!isInventoryBarVisible() && !currentUILevel.NoInventoryBar && CPlayer.mo.InvSel != null) { DrawInventoryIcon(CPlayer.mo.InvSel, (-14, invY + 17)); DrawString(mHUDFont, FormatNumber(CPlayer.mo.InvSel.Amount, 3), (-30, invY), DI_TEXT_ALIGN_RIGHT); diff --git a/wadsrc/static/zscript/statusbar/harm_sbar.txt b/wadsrc/static/zscript/statusbar/harm_sbar.txt index ebed03f92..bb800ccc4 100644 --- a/wadsrc/static/zscript/statusbar/harm_sbar.txt +++ b/wadsrc/static/zscript/statusbar/harm_sbar.txt @@ -60,7 +60,7 @@ class HarmonyStatusBar : DoomStatusBar DrawString(mHUDFont, FormatNumber(ammotype2.Amount, 3), (-30, invY), DI_TEXT_ALIGN_RIGHT); invY -= 20; } - if (!isInventoryBarVisible() && !level.NoInventoryBar && CPlayer.mo.InvSel != null) + if (!isInventoryBarVisible() && !currentUILevel.NoInventoryBar && CPlayer.mo.InvSel != null) { DrawInventoryIcon(CPlayer.mo.InvSel, (-14, invY + 17)); DrawString(mHUDFont, FormatNumber(CPlayer.mo.InvSel.Amount, 3), (-30, invY), DI_TEXT_ALIGN_RIGHT); diff --git a/wadsrc/static/zscript/statusbar/heretic_sbar.txt b/wadsrc/static/zscript/statusbar/heretic_sbar.txt index 8d490444e..edcfd13c7 100644 --- a/wadsrc/static/zscript/statusbar/heretic_sbar.txt +++ b/wadsrc/static/zscript/statusbar/heretic_sbar.txt @@ -43,7 +43,7 @@ class HereticStatusBar : BaseStatusBar mHealthInterpolator.Update(CPlayer.health); // wiggle the chain if it moves - if (level.time & 1) + if (currentUILevel.time & 1) { wiggle = (mHealthInterpolator.GetValue() != CPlayer.health) && Random[ChainWiggle](0, 1); } @@ -200,7 +200,7 @@ class HereticStatusBar : BaseStatusBar y -= 40; } - if (!isInventoryBarVisible() && !level.NoInventoryBar && CPlayer.mo.InvSel != null) + if (!isInventoryBarVisible() && !currentUILevel.NoInventoryBar && CPlayer.mo.InvSel != null) { // This code was changed to always fit the item into the box, regardless of alignment or sprite size. // Heretic's ARTIBOX is 30x30 pixels. diff --git a/wadsrc/static/zscript/statusbar/hexen_sbar.txt b/wadsrc/static/zscript/statusbar/hexen_sbar.txt index 35475a258..033982e20 100644 --- a/wadsrc/static/zscript/statusbar/hexen_sbar.txt +++ b/wadsrc/static/zscript/statusbar/hexen_sbar.txt @@ -74,7 +74,7 @@ class HexenStatusBar : BaseStatusBar DrawString(mHUDFont, FormatNumber(CPlayer.FragCount, 3), (70, -16)); } - if (!isInventoryBarVisible() && !level.NoInventoryBar && CPlayer.mo.InvSel != null) + if (!isInventoryBarVisible() && !currentUILevel.NoInventoryBar && CPlayer.mo.InvSel != null) { // This code was changed to always fit the item into the box, regardless of alignment or sprite size. // Heretic's ARTIBOX is 30x30 pixels. diff --git a/wadsrc/static/zscript/statusbar/statusbar.txt b/wadsrc/static/zscript/statusbar/statusbar.txt index a55af690e..cd16ed94d 100644 --- a/wadsrc/static/zscript/statusbar/statusbar.txt +++ b/wadsrc/static/zscript/statusbar/statusbar.txt @@ -597,9 +597,9 @@ class BaseStatusBar native ui int GetAirTime() { if(CPlayer.mo.waterlevel < 3) - return level.airsupply; + return currentUILevel.airsupply; else - return max(CPlayer.air_finished - level.time, 0); + return max(CPlayer.air_finished - currentUILevel.time, 0); } int GetSelectedInventoryAmount() @@ -654,7 +654,7 @@ class BaseStatusBar native ui bool isInventoryBarVisible() { if (CPlayer == null) return false; - return (CPlayer.inventorytics > 0 && !level.NoInventoryBar); + return (CPlayer.inventorytics > 0 && !currentUILevel.NoInventoryBar); } //============================================================================ @@ -850,13 +850,13 @@ class BaseStatusBar native ui let width = SmallFont.StringWidth("00:00:00"); if (am_showtime) { - printtext = level.TimeFormatted(); - DrawString(mSmallFont, level.TimeFormatted(), (-textdist-width, y), 0, crdefault); + printtext = currentUILevel.TimeFormatted(); + DrawString(mSmallFont, currentUILevel.TimeFormatted(), (-textdist-width, y), 0, crdefault); y += height; } if (am_showtotaltime) { - DrawString(mSmallFont, level.TimeFormatted(true), (-textdist-width, y), 0, crdefault); + DrawString(mSmallFont, currentUILevel.TimeFormatted(true), (-textdist-width, y), 0, crdefault); } if (!deathmatch) @@ -866,25 +866,25 @@ class BaseStatusBar native ui // Draw monster count if (am_showmonsters) { - DrawString(mSmallFont, String.Format("%s\34%c %d/%d", Stringtable.Localize("$AM_MONSTERS"), crdefault+65, level.killed_monsters, level.total_monsters), (textdist, y), 0, highlight); + DrawString(mSmallFont, String.Format("%s\34%c %d/%d", Stringtable.Localize("$AM_MONSTERS"), crdefault+65, currentUILevel.killed_monsters, currentUILevel.total_monsters), (textdist, y), 0, highlight); y += height; } // Draw secret count if (am_showsecrets) { - DrawString(mSmallFont, String.Format("%s\34%c %d/%d", Stringtable.Localize("$AM_SECRETS"), crdefault+65, level.found_secrets, level.total_secrets), (textdist, y), 0, highlight); + DrawString(mSmallFont, String.Format("%s\34%c %d/%d", Stringtable.Localize("$AM_SECRETS"), crdefault+65, currentUILevel.found_secrets, currentUILevel.total_secrets), (textdist, y), 0, highlight); y += height; } // Draw item count if (am_showitems) { - DrawString(mSmallFont, String.Format("%s\34%c %d/%d", Stringtable.Localize("$AM_ITEMS"), crdefault+65, level.found_items, level.total_items), (textdist, y), 0, highlight); + DrawString(mSmallFont, String.Format("%s\34%c %d/%d", Stringtable.Localize("$AM_ITEMS"), crdefault+65, currentUILevel.found_items, currentUILevel.total_items), (textdist, y), 0, highlight); } } - String mapname = level.FormatMapName(crdefault); + String mapname = currentUILevel.FormatMapName(crdefault); BrokenLines lines = SmallFont.BreakLines(mapname, int(SCREENWIDTH / scale.X)); int numlines = lines.Count(); int finalwidth = int(SmallFont.StringWidth(lines.StringAt(numlines-1)) * scale.X); diff --git a/wadsrc/static/zscript/statusbar/strife_sbar.txt b/wadsrc/static/zscript/statusbar/strife_sbar.txt index 866c4a32a..1a1a12e5a 100644 --- a/wadsrc/static/zscript/statusbar/strife_sbar.txt +++ b/wadsrc/static/zscript/statusbar/strife_sbar.txt @@ -427,7 +427,7 @@ class StrifeStatusBar : BaseStatusBar case POP_Log: { // Draw the latest log message. - screen.DrawText(SmallFont2, Font.CR_UNTRANSLATED, left + 210 * xscale, top + 8 * yscale, Level.TimeFormatted(), + screen.DrawText(SmallFont2, Font.CR_UNTRANSLATED, left + 210 * xscale, top + 8 * yscale, currentUILevel.TimeFormatted(), DTA_CleanNoMove, true); if (CPlayer.LogText.Length() > 0) From 20989a0b41da6cb01072e256604c34b48a535837 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 25 Jan 2019 19:04:40 +0100 Subject: [PATCH 019/164] - use a local variable to access the level in DLevelScript. This was a relatively cheap change but removes a significant batch of references to the global variable, only making the entry points to the ACS interpreter relevant. --- src/g_levellocals.h | 5 + src/p_acs.cpp | 715 +++++++++++++++++++------------------- src/p_actionfunctions.cpp | 5 +- 3 files changed, 361 insertions(+), 364 deletions(-) diff --git a/src/g_levellocals.h b/src/g_levellocals.h index ded9a40fe..3fb9b3d12 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -228,6 +228,11 @@ public: { return NActorIterator(TIDHash, type, tid); } + AActor *SingleActorFromTID(int tid, AActor *defactor) + { + return tid == 0 ? defactor : GetActorIterator(tid).Next(); + } + bool SectorHasTags(sector_t *sector) { return tagManager.SectorHasTags(sector); diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 22c20cb32..0063059fd 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -694,6 +694,8 @@ public: GlobalACSStrings.LockStringArray(levelnum, &Localvars[0], Localvars.Size()); } + FLevelLocals *Level; + protected: DLevelScript *next, *prev; int script; @@ -735,22 +737,21 @@ protected: void Unlink(); void PutLast(); void PutFirst(); - static int Random(int min, int max); - static int ThingCount(int type, int stringid, int tid, int tag); - static void ChangeFlat(int tag, int name, bool floorOrCeiling); - static int CountPlayers(); - static void SetLineTexture(int lineid, int side, int position, int name); - static int DoSpawn(int type, const DVector3 &pos, int tid, DAngle angle, bool force); - static int DoSpawn(int type, int x, int y, int z, int tid, int angle, bool force); - static bool DoCheckActorTexture(int tid, AActor *activator, int string, bool floor); + int Random(int min, int max); + int ThingCount(int type, int stringid, int tid, int tag); + void ChangeFlat(int tag, int name, bool floorOrCeiling); + int CountPlayers(); + void SetLineTexture(int lineid, int side, int position, int name); + int DoSpawn(int type, const DVector3 &pos, int tid, DAngle angle, bool force); + int DoSpawn(int type, int x, int y, int z, int tid, int angle, bool force); + bool DoCheckActorTexture(int tid, AActor *activator, int string, bool floor); int DoSpawnSpot(int type, int spot, int tid, int angle, bool forced); int DoSpawnSpotFacing(int type, int spot, int tid, bool forced); int DoClassifyActor(int tid); int CallFunction(int argCount, int funcIndex, int32_t *args); void DoFadeTo(int r, int g, int b, int a, int time); - void DoFadeRange(int r1, int g1, int b1, int a1, - int r2, int g2, int b2, int a2, int time); + void DoFadeRange(int r1, int g1, int b1, int a1, int r2, int g2, int b2, int a2, int time); void DoSetFont(int fontnum); void SetActorProperty(int tid, int property, int value); void DoSetActorProperty(AActor *actor, int property, int value); @@ -760,6 +761,18 @@ protected: int LineFromID(int id); int SideFromID(int id, int side); + int ScriptCall(AActor *activator, unsigned argc, int32_t *args); + int DoSetMaster(AActor *self, AActor *master); + void SetUserVariable(AActor *self, FName varname, int index, int value); + void DoSetCVar(FBaseCVar *cvar, int value, bool is_string, bool force = false); + int SetUserCVar(int playernum, const char *cvarname, int value, bool is_string); + int SetCVar(AActor *activator, const char *cvarname, int value, bool is_string); + void SetActorAngle(AActor *activator, int tid, int angle, bool interpolate); + void SetActorPitch(AActor *activator, int tid, int angle, bool interpolate); + void SetActorRoll(AActor *activator, int tid, int angle, bool interpolate); + void SetActorTeleFog(AActor *activator, int tid, FString telefogsrc, FString telefogdest); + int SwapActorTeleFog(AActor *activator, int tid); + private: DLevelScript(); @@ -1802,7 +1815,7 @@ class DPlaneWatcher : public DThinker HAS_OBJECT_POINTERS public: DPlaneWatcher (AActor *it, line_t *line, int lineSide, bool ceiling, - int tag, int height, int special, + sector_t *sec, int height, int special, int arg0, int arg1, int arg2, int arg3, int arg4); void Tick (); void Serialize(FSerializer &arc); @@ -1816,7 +1829,7 @@ private: bool LineSide; bool bCeiling; - DPlaneWatcher() {} + DPlaneWatcher() = default; }; IMPLEMENT_CLASS(DPlaneWatcher, false, true) @@ -1826,41 +1839,30 @@ IMPLEMENT_POINTERS_START(DPlaneWatcher) IMPLEMENT_POINTERS_END DPlaneWatcher::DPlaneWatcher (AActor *it, line_t *line, int lineSide, bool ceiling, - int tag, int height, int special, - int arg0, int arg1, int arg2, int arg3, int arg4) + sector_t *sec, int height, int special, int arg0, int arg1, int arg2, int arg3, int arg4) : Special (special), Activator (it), Line (line), LineSide (!!lineSide), bCeiling (ceiling) { - int secnum; + secplane_t plane; Args[0] = arg0; Args[1] = arg1; Args[2] = arg2; Args[3] = arg3; Args[4] = arg4; - secnum = level.FindFirstSectorFromTag (tag); - if (secnum >= 0) - { - secplane_t plane; - Sector = &level.sectors[secnum]; - if (bCeiling) - { - plane = Sector->ceilingplane; - } - else - { - plane = Sector->floorplane; - } - LastD = plane.fD(); - plane.ChangeHeight (height); - WatchD = plane.fD(); + Sector = sec; + if (bCeiling) + { + plane = Sector->ceilingplane; } else { - Sector = NULL; - WatchD = LastD = 0; + plane = Sector->floorplane; } + LastD = plane.fD(); + plane.ChangeHeight (height); + WatchD = plane.fD(); } void DPlaneWatcher::Serialize(FSerializer &arc) @@ -3266,7 +3268,8 @@ void FBehavior::StartTypedScripts (uint16_t type, AActor *activator, bool always ptr, this, &arg1, 1, always ? ACS_ALWAYS : 0); if (nullptr != runningScript && runNow) { - runningScript->RunScript (); + runningScript->Level = &level; + runningScript->RunScript(); } } } @@ -3386,7 +3389,8 @@ void DACSThinker::Tick () while (script) { DLevelScript *next = script->next; - script->RunScript (); + script->Level = &level; + script->RunScript(); script = next; } @@ -3587,7 +3591,7 @@ int DLevelScript::ThingCount (int type, int stringid, int tid, int tag) } else if (stringid >= 0) { - const char *type_name = level.Behaviors.LookupString (stringid); + const char *type_name = Level->Behaviors.LookupString (stringid); if (type_name == NULL) return 0; @@ -3603,13 +3607,13 @@ int DLevelScript::ThingCount (int type, int stringid, int tid, int tag) do_count: if (tid) { - auto iterator = level.GetActorIterator(tid); + auto iterator = Level->GetActorIterator(tid); while ( (actor = iterator.Next ()) ) { if (actor->health > 0 && (kind == NULL || actor->IsA (kind))) { - if (tag == -1 || level.SectorHasTag(actor->Sector, tag)) + if (tag == -1 || Level->SectorHasTag(actor->Sector, tag)) { // Don't count items in somebody's inventory if (actor->IsMapActor()) @@ -3628,7 +3632,7 @@ do_count: if (actor->health > 0 && (kind == NULL || actor->IsA (kind))) { - if (tag == -1 || level.SectorHasTag(actor->Sector, tag)) + if (tag == -1 || Level->SectorHasTag(actor->Sector, tag)) { // Don't count items in somebody's inventory if (actor->IsMapActor()) @@ -3657,18 +3661,18 @@ void DLevelScript::ChangeFlat (int tag, int name, bool floorOrCeiling) { FTextureID flat; int secnum = -1; - const char *flatname = level.Behaviors.LookupString (name); + const char *flatname = Level->Behaviors.LookupString (name); if (flatname == NULL) return; flat = TexMan.GetTextureID(flatname, ETextureType::Flat, FTextureManager::TEXMAN_Overridable); - auto it = level.GetSectorTagIterator(tag); + auto it = Level->GetSectorTagIterator(tag); while ((secnum = it.Next()) >= 0) { int pos = floorOrCeiling? sector_t::ceiling : sector_t::floor; - level.sectors[secnum].SetTexture(pos, flat); + Level->sectors[secnum].SetTexture(pos, flat); } } @@ -3687,7 +3691,7 @@ void DLevelScript::SetLineTexture (int lineid, int side, int position, int name) { FTextureID texture; int linenum = -1; - const char *texname = level.Behaviors.LookupString (name); + const char *texname = Level->Behaviors.LookupString (name); if (texname == nullptr) return; @@ -3696,12 +3700,12 @@ void DLevelScript::SetLineTexture (int lineid, int side, int position, int name) texture = TexMan.GetTextureID(texname, ETextureType::Wall, FTextureManager::TEXMAN_Overridable); - auto itr = level.GetLineIdIterator(lineid); + auto itr = Level->GetLineIdIterator(lineid); while ((linenum = itr.Next()) >= 0) { side_t *sidedef; - sidedef = level.lines[linenum].sidedef[side]; + sidedef = Level->lines[linenum].sidedef[side]; if (sidedef == nullptr) continue; @@ -3725,7 +3729,7 @@ void DLevelScript::SetLineTexture (int lineid, int side, int position, int name) int DLevelScript::DoSpawn (int type, const DVector3 &pos, int tid, DAngle angle, bool force) { - PClassActor *info = PClass::FindActor(level.Behaviors.LookupString (type)); + PClassActor *info = PClass::FindActor(Level->Behaviors.LookupString (type)); AActor *actor = NULL; int spawncount = 0; @@ -3734,7 +3738,7 @@ int DLevelScript::DoSpawn (int type, const DVector3 &pos, int tid, DAngle angle, info = info->GetReplacement (); if ((GetDefaultByType (info)->flags3 & MF3_ISMONSTER) && - ((dmflags & DF_NO_MONSTERS) || (level.flags2 & LEVEL2_NOMONSTERS))) + ((dmflags & DF_NO_MONSTERS) || (Level->flags2 & LEVEL2_NOMONSTERS))) { return 0; } @@ -3779,7 +3783,7 @@ int DLevelScript::DoSpawnSpot (int type, int spot, int tid, int angle, bool forc if (spot != 0) { - auto iterator = level.GetActorIterator(spot); + auto iterator = Level->GetActorIterator(spot); AActor *aspot; while ( (aspot = iterator.Next ()) ) @@ -3800,7 +3804,7 @@ int DLevelScript::DoSpawnSpotFacing (int type, int spot, int tid, bool force) if (spot != 0) { - auto iterator = level.GetActorIterator(spot); + auto iterator = Level->GetActorIterator(spot); AActor *aspot; while ( (aspot = iterator.Next ()) ) @@ -3894,7 +3898,7 @@ showme: void DLevelScript::DoSetFont (int fontnum) { - const char *fontname = level.Behaviors.LookupString (fontnum); + const char *fontname = Level->Behaviors.LookupString (fontnum); activefont = V_GetFont (fontname); if (activefont == NULL) { @@ -3902,7 +3906,7 @@ void DLevelScript::DoSetFont (int fontnum) } } -int DoSetMaster (AActor *self, AActor *master) +int DLevelScript::DoSetMaster (AActor *self, AActor *master) { AActor *defs; if (self->flags3&MF3_ISMONSTER) @@ -3913,9 +3917,9 @@ int DoSetMaster (AActor *self, AActor *master) { self->FriendPlayer = 0; self->master = master; - level.total_monsters -= self->CountsAsKill(); + Level->total_monsters -= self->CountsAsKill(); self->flags = (self->flags & ~MF_FRIENDLY) | (master->flags & MF_FRIENDLY); - level.total_monsters += self->CountsAsKill(); + Level->total_monsters += self->CountsAsKill(); // Don't attack your new master if (self->target == self->master) self->target = nullptr; if (self->lastenemy == self->master) self->lastenemy = nullptr; @@ -3926,7 +3930,7 @@ int DoSetMaster (AActor *self, AActor *master) { // [KS] Be friendly to this player self->master = nullptr; - level.total_monsters -= self->CountsAsKill(); + Level->total_monsters -= self->CountsAsKill(); self->flags|=MF_FRIENDLY; self->SetFriendPlayer(master->player); @@ -3952,9 +3956,9 @@ int DoSetMaster (AActor *self, AActor *master) self->FriendPlayer = 0; // Go back to whatever friendliness we usually have... defs = self->GetDefault(); - level.total_monsters -= self->CountsAsKill(); + Level->total_monsters -= self->CountsAsKill(); self->flags = (self->flags & ~MF_FRIENDLY) | (defs->flags & MF_FRIENDLY); - level.total_monsters += self->CountsAsKill(); + Level->total_monsters += self->CountsAsKill(); // ...And re-side with our friends. if (self->target && !self->IsHostile (self->target)) self->target = nullptr; if (self->lastenemy && !self->IsHostile (self->lastenemy)) self->lastenemy = nullptr; @@ -3976,18 +3980,6 @@ int DoGetMasterTID (AActor *self) else return 0; } -AActor *SingleActorFromTID (int tid, AActor *defactor) -{ - if (tid == 0) - { - return defactor; - } - else - { - auto iterator = level.GetActorIterator(tid); - return iterator.Next(); - } -} enum { @@ -4069,7 +4061,7 @@ void DLevelScript::SetActorProperty (int tid, int property, int value) else { AActor *actor; - auto iterator = level.GetActorIterator(tid); + auto iterator = Level->GetActorIterator(tid); while ((actor = iterator.Next()) != NULL) { @@ -4167,7 +4159,7 @@ void DLevelScript::DoSetActorProperty (AActor *actor, int property, int value) break; case APROP_Friendly: - if (actor->CountsAsKill()) level.total_monsters--; + if (actor->CountsAsKill()) Level->total_monsters--; if (value) { actor->flags |= MF_FRIENDLY; @@ -4176,7 +4168,7 @@ void DLevelScript::DoSetActorProperty (AActor *actor, int property, int value) { actor->flags &= ~MF_FRIENDLY; } - if (actor->CountsAsKill()) level.total_monsters++; + if (actor->CountsAsKill()) Level->total_monsters++; break; @@ -4192,27 +4184,27 @@ void DLevelScript::DoSetActorProperty (AActor *actor, int property, int value) break; case APROP_SeeSound: - actor->SeeSound = level.Behaviors.LookupString(value); + actor->SeeSound = Level->Behaviors.LookupString(value); break; case APROP_AttackSound: - actor->AttackSound = level.Behaviors.LookupString(value); + actor->AttackSound = Level->Behaviors.LookupString(value); break; case APROP_PainSound: - actor->PainSound = level.Behaviors.LookupString(value); + actor->PainSound = Level->Behaviors.LookupString(value); break; case APROP_DeathSound: - actor->DeathSound = level.Behaviors.LookupString(value); + actor->DeathSound = Level->Behaviors.LookupString(value); break; case APROP_ActiveSound: - actor->ActiveSound = level.Behaviors.LookupString(value); + actor->ActiveSound = Level->Behaviors.LookupString(value); break; case APROP_Species: - actor->Species = level.Behaviors.LookupString(value); + actor->Species = Level->Behaviors.LookupString(value); break; case APROP_Score: @@ -4220,7 +4212,7 @@ void DLevelScript::DoSetActorProperty (AActor *actor, int property, int value) break; case APROP_NameTag: - actor->SetTag(level.Behaviors.LookupString(value)); + actor->SetTag(Level->Behaviors.LookupString(value)); break; case APROP_DamageFactor: @@ -4233,7 +4225,7 @@ void DLevelScript::DoSetActorProperty (AActor *actor, int property, int value) case APROP_MasterTID: AActor *other; - other = SingleActorFromTID (value, NULL); + other = Level->SingleActorFromTID (value, NULL); DoSetMaster (actor, other); break; @@ -4298,7 +4290,7 @@ void DLevelScript::DoSetActorProperty (AActor *actor, int property, int value) break; case APROP_DamageType: - actor->DamageType = level.Behaviors.LookupString(value); + actor->DamageType = Level->Behaviors.LookupString(value); break; default: @@ -4309,7 +4301,7 @@ void DLevelScript::DoSetActorProperty (AActor *actor, int property, int value) int DLevelScript::GetActorProperty (int tid, int property) { - AActor *actor = SingleActorFromTID (tid, activator); + AActor *actor = Level->SingleActorFromTID (tid, activator); if (actor == NULL) { @@ -4407,7 +4399,7 @@ int DLevelScript::GetActorProperty (int tid, int property) int DLevelScript::CheckActorProperty (int tid, int property, int value) { - AActor *actor = SingleActorFromTID (tid, activator); + AActor *actor = Level->SingleActorFromTID (tid, activator); const char *string = NULL; if (actor == NULL) { @@ -4473,17 +4465,17 @@ int DLevelScript::CheckActorProperty (int tid, int property, int value) case APROP_DamageType: string = actor->DamageType; break; } if (string == NULL) string = ""; - return (!stricmp(string, level.Behaviors.LookupString(value))); + return (!stricmp(string, Level->Behaviors.LookupString(value))); } bool DLevelScript::DoCheckActorTexture(int tid, AActor *activator, int string, bool floor) { - AActor *actor = SingleActorFromTID(tid, activator); + AActor *actor = Level->SingleActorFromTID(tid, activator); if (actor == NULL) { return 0; } - FTextureID tex = TexMan.CheckForTexture(level.Behaviors.LookupString(string), ETextureType::Flat, + FTextureID tex = TexMan.CheckForTexture(Level->Behaviors.LookupString(string), ETextureType::Flat, FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_TryAny|FTextureManager::TEXMAN_DontCreate); if (!tex.Exists()) @@ -4566,7 +4558,7 @@ int DLevelScript::DoClassifyActor(int tid) } else { - auto it = level.GetActorIterator(tid); + auto it = Level->GetActorIterator(tid); actor = it.Next(); } if (actor == NULL) @@ -4802,10 +4794,10 @@ int DLevelScript::SideFromID(int id, int side) } else { - int line = level.FindFirstLineFromID(id); + int line = Level->FindFirstLineFromID(id); if (line == -1) return -1; - if (level.lines[line].sidedef[side] == NULL) return -1; - return level.lines[line].sidedef[side]->UDMFIndex; + if (Level->lines[line].sidedef[side] == NULL) return -1; + return Level->lines[line].sidedef[side]->UDMFIndex; } } @@ -4818,7 +4810,7 @@ int DLevelScript::LineFromID(int id) } else { - return level.FindFirstLineFromID(id); + return Level->FindFirstLineFromID(id); } } @@ -4862,7 +4854,7 @@ bool GetVarAddrType(AActor *self, FName varname, int index, void *&addr, PType * return true; } -static void SetUserVariable(AActor *self, FName varname, int index, int value) +void DLevelScript::SetUserVariable(AActor *self, FName varname, int index, int value) { void *addr; PType *type; @@ -4871,7 +4863,7 @@ static void SetUserVariable(AActor *self, FName varname, int index, int value) { if (type == TypeString) { - FString str = level.Behaviors.LookupString(value); + FString str = Level->Behaviors.LookupString(value); type->InitializeValue(addr, &str); } else if (type->isFloat()) @@ -4913,7 +4905,7 @@ static int GetUserVariable(AActor *self, FName varname, int index) } // Converts fixed- to floating-point as required. -static void DoSetCVar(FBaseCVar *cvar, int value, bool is_string, bool force=false) +void DLevelScript::DoSetCVar(FBaseCVar *cvar, int value, bool is_string, bool force) { UCVarValue val; ECVarType type; @@ -4927,7 +4919,7 @@ static void DoSetCVar(FBaseCVar *cvar, int value, bool is_string, bool force=fal } if (is_string) { - val.String = level.Behaviors.LookupString(value); + val.String = Level->Behaviors.LookupString(value); type = CVAR_String; } else if (cvar->GetRealType() == CVAR_Float) @@ -4976,7 +4968,7 @@ static int DoGetCVar(FBaseCVar *cvar, bool is_string) } } -static int SetUserCVar(int playernum, const char *cvarname, int value, bool is_string) +int DLevelScript::SetUserCVar(int playernum, const char *cvarname, int value, bool is_string) { if ((unsigned)playernum >= MAXPLAYERS || !playeringame[playernum]) { @@ -5006,7 +4998,7 @@ static int SetUserCVar(int playernum, const char *cvarname, int value, bool is_s return 1; } -static int SetCVar(AActor *activator, const char *cvarname, int value, bool is_string) +int DLevelScript::SetCVar(AActor *activator, const char *cvarname, int value, bool is_string) { FBaseCVar *cvar = FindCVar(cvarname, NULL); // Only mod-created cvars may be set. @@ -5038,7 +5030,7 @@ static bool DoSpawnDecal(AActor *actor, const FDecalTemplate *tpl, int flags, DA angle, distance, !!(flags & SDF_PERMANENT)); } -static void SetActorAngle(AActor *activator, int tid, int angle, bool interpolate) +void DLevelScript::SetActorAngle(AActor *activator, int tid, int angle, bool interpolate) { DAngle an = ACSToAngle(angle); if (tid == 0) @@ -5050,7 +5042,7 @@ static void SetActorAngle(AActor *activator, int tid, int angle, bool interpolat } else { - auto iterator = level.GetActorIterator(tid); + auto iterator = Level->GetActorIterator(tid); AActor *actor; while ((actor = iterator.Next())) @@ -5060,7 +5052,7 @@ static void SetActorAngle(AActor *activator, int tid, int angle, bool interpolat } } -static void SetActorPitch(AActor *activator, int tid, int angle, bool interpolate) +void DLevelScript::SetActorPitch(AActor *activator, int tid, int angle, bool interpolate) { DAngle an = ACSToAngle(angle).Normalized180(); if (tid == 0) @@ -5072,7 +5064,7 @@ static void SetActorPitch(AActor *activator, int tid, int angle, bool interpolat } else { - auto iterator = level.GetActorIterator(tid); + auto iterator = Level->GetActorIterator(tid); AActor *actor; while ((actor = iterator.Next())) @@ -5082,7 +5074,7 @@ static void SetActorPitch(AActor *activator, int tid, int angle, bool interpolat } } -static void SetActorRoll(AActor *activator, int tid, int angle, bool interpolate) +void DLevelScript::SetActorRoll(AActor *activator, int tid, int angle, bool interpolate) { DAngle an = ACSToAngle(angle); if (tid == 0) @@ -5094,7 +5086,7 @@ static void SetActorRoll(AActor *activator, int tid, int angle, bool interpolate } else { - auto iterator = level.GetActorIterator(tid); + auto iterator = Level->GetActorIterator(tid); AActor *actor; while ((actor = iterator.Next())) @@ -5104,7 +5096,7 @@ static void SetActorRoll(AActor *activator, int tid, int angle, bool interpolate } } -static void SetActorTeleFog(AActor *activator, int tid, FString telefogsrc, FString telefogdest) +void DLevelScript::SetActorTeleFog(AActor *activator, int tid, FString telefogsrc, FString telefogdest) { // Set the actor's telefog to the specified actor. Handle "" as "don't // change" since "None" should work just fine for disabling the fog (given @@ -5121,7 +5113,7 @@ static void SetActorTeleFog(AActor *activator, int tid, FString telefogsrc, FStr } else { - auto iterator = level.GetActorIterator(tid); + auto iterator = Level->GetActorIterator(tid); AActor *actor; PClassActor * src = PClass::FindActor(telefogsrc); @@ -5136,7 +5128,7 @@ static void SetActorTeleFog(AActor *activator, int tid, FString telefogsrc, FStr } } -static int SwapActorTeleFog(AActor *activator, int tid) +int DLevelScript::SwapActorTeleFog(AActor *activator, int tid) { int count = 0; if (tid == 0) @@ -5149,7 +5141,7 @@ static int SwapActorTeleFog(AActor *activator, int tid) } else { - auto iterator = level.GetActorIterator(tid); + auto iterator = Level->GetActorIterator(tid); AActor *actor; while ((actor = iterator.Next())) @@ -5164,13 +5156,13 @@ static int SwapActorTeleFog(AActor *activator, int tid) return count; } -static int ScriptCall(AActor *activator, unsigned argc, int32_t *args) + int DLevelScript::ScriptCall(AActor *activator, unsigned argc, int32_t *args) { int retval = 0; if (argc >= 2) { - auto clsname = level.Behaviors.LookupString(args[0]); - auto funcname = level.Behaviors.LookupString(args[1]); + auto clsname = Level->Behaviors.LookupString(args[0]); + auto funcname = Level->Behaviors.LookupString(args[1]); auto cls = PClass::FindClass(clsname); if (!cls) @@ -5219,16 +5211,16 @@ static int ScriptCall(AActor *activator, unsigned argc, int32_t *args) } else if (argtype == TypeName) { - params.Push(FName(level.Behaviors.LookupString(args[i])).GetIndex()); + params.Push(FName(Level->Behaviors.LookupString(args[i])).GetIndex()); } else if (argtype == TypeString) { - strings.Push(level.Behaviors.LookupString(args[i])); + strings.Push(Level->Behaviors.LookupString(args[i])); params.Push(&strings.Last()); } else if (argtype == TypeSound) { - params.Push(int(FSoundID(level.Behaviors.LookupString(args[i])))); + params.Push(int(FSoundID(Level->Behaviors.LookupString(args[i])))); } else { @@ -5294,43 +5286,43 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) switch(funcIndex) { case ACSF_GetLineUDMFInt: - return GetUDMFInt(UDMF_Line, LineFromID(args[0]), level.Behaviors.LookupString(args[1])); + return GetUDMFInt(UDMF_Line, LineFromID(args[0]), Level->Behaviors.LookupString(args[1])); case ACSF_GetLineUDMFFixed: - return DoubleToACS(GetUDMFFloat(UDMF_Line, LineFromID(args[0]), level.Behaviors.LookupString(args[1]))); + return DoubleToACS(GetUDMFFloat(UDMF_Line, LineFromID(args[0]), Level->Behaviors.LookupString(args[1]))); case ACSF_GetThingUDMFInt: case ACSF_GetThingUDMFFixed: return 0; // Not implemented yet case ACSF_GetSectorUDMFInt: - return GetUDMFInt(UDMF_Sector, level.FindFirstSectorFromTag(args[0]), level.Behaviors.LookupString(args[1])); + return GetUDMFInt(UDMF_Sector, Level->FindFirstSectorFromTag(args[0]), Level->Behaviors.LookupString(args[1])); case ACSF_GetSectorUDMFFixed: - return DoubleToACS(GetUDMFFloat(UDMF_Sector, level.FindFirstSectorFromTag(args[0]), level.Behaviors.LookupString(args[1]))); + return DoubleToACS(GetUDMFFloat(UDMF_Sector, Level->FindFirstSectorFromTag(args[0]), Level->Behaviors.LookupString(args[1]))); case ACSF_GetSideUDMFInt: - return GetUDMFInt(UDMF_Side, SideFromID(args[0], args[1]), level.Behaviors.LookupString(args[2])); + return GetUDMFInt(UDMF_Side, SideFromID(args[0], args[1]), Level->Behaviors.LookupString(args[2])); case ACSF_GetSideUDMFFixed: - return DoubleToACS(GetUDMFFloat(UDMF_Side, SideFromID(args[0], args[1]), level.Behaviors.LookupString(args[2]))); + return DoubleToACS(GetUDMFFloat(UDMF_Side, SideFromID(args[0], args[1]), Level->Behaviors.LookupString(args[2]))); case ACSF_GetActorVelX: - actor = SingleActorFromTID(args[0], activator); + actor = Level->SingleActorFromTID(args[0], activator); return actor != NULL? DoubleToACS(actor->Vel.X) : 0; case ACSF_GetActorVelY: - actor = SingleActorFromTID(args[0], activator); + actor = Level->SingleActorFromTID(args[0], activator); return actor != NULL? DoubleToACS(actor->Vel.Y) : 0; case ACSF_GetActorVelZ: - actor = SingleActorFromTID(args[0], activator); + actor = Level->SingleActorFromTID(args[0], activator); return actor != NULL? DoubleToACS(actor->Vel.Z) : 0; case ACSF_SetPointer: if (activator) { - AActor *ptr = SingleActorFromTID(args[1], activator); + AActor *ptr = Level->SingleActorFromTID(args[1], activator); if (argCount > 2) { ptr = COPY_AAPTR(ptr, args[2]); @@ -5344,17 +5336,17 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) case ACSF_SetActivator: if (argCount > 1 && args[1] != AAPTR_DEFAULT) // condition (x != AAPTR_DEFAULT) is essentially condition (x). { - activator = COPY_AAPTR(SingleActorFromTID(args[0], activator), args[1]); + activator = COPY_AAPTR(Level->SingleActorFromTID(args[0], activator), args[1]); } else { - activator = SingleActorFromTID(args[0], NULL); + activator = Level->SingleActorFromTID(args[0], NULL); } return activator != NULL; case ACSF_SetActivatorToTarget: // [KS] I revised this a little bit - actor = SingleActorFromTID(args[0], activator); + actor = Level->SingleActorFromTID(args[0], activator); if (actor != NULL) { if (actor->player != NULL && actor->player->playerstate == PST_LIVE) @@ -5376,7 +5368,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) return 0; case ACSF_GetActorViewHeight: - actor = SingleActorFromTID(args[0], activator); + actor = Level->SingleActorFromTID(args[0], activator); if (actor != NULL) { if (actor->player != NULL) @@ -5392,7 +5384,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) case ACSF_GetChar: { - const char *p = level.Behaviors.LookupString(args[0]); + const char *p = Level->Behaviors.LookupString(args[0]); if (p != NULL && args[1] >= 0 && args[1] < int(strlen(p))) { return p[args[1]]; @@ -5411,7 +5403,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) } else { - return players[args[0]].air_finished - level.time; + return players[args[0]].air_finished - Level->time; } } @@ -5423,15 +5415,15 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) } else { - players[args[0]].air_finished = args[1] + level.time; + players[args[0]].air_finished = args[1] + Level->time; return 1; } } case ACSF_SetSkyScrollSpeed: { - if (args[0] == 1) level.skyspeed1 = ACSToFloat(args[1]); - else if (args[0] == 2) level.skyspeed2 = ACSToFloat(args[1]); + if (args[0] == 1) Level->skyspeed1 = ACSToFloat(args[1]); + else if (args[0] == 2) Level->skyspeed2 = ACSToFloat(args[1]); return 1; } @@ -5443,7 +5435,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) } else { - FName p(level.Behaviors.LookupString(args[0])); + FName p(Level->Behaviors.LookupString(args[0])); auto armor = players[args[1]].mo->FindInventory(NAME_BasicArmor); if (armor && armor->NameVar(NAME_ArmorType) == p) return armor->IntVar(NAME_Amount); } @@ -5503,7 +5495,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) } else { - auto iterator = level.GetActorIterator(args[0]); + auto iterator = Level->GetActorIterator(args[0]); while ((actor = iterator.Next())) { @@ -5516,7 +5508,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) case ACSF_SetUserVariable: { int cnt = 0; - FName varname(level.Behaviors.LookupString(args[1]), true); + FName varname(Level->Behaviors.LookupString(args[1]), true); if (varname != NAME_None) { if (args[0] == 0) @@ -5529,7 +5521,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) } else { - auto iterator = level.GetActorIterator(args[0]); + auto iterator = Level->GetActorIterator(args[0]); while ( (actor = iterator.Next()) ) { @@ -5543,10 +5535,10 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) case ACSF_GetUserVariable: { - FName varname(level.Behaviors.LookupString(args[1]), true); + FName varname(Level->Behaviors.LookupString(args[1]), true); if (varname != NAME_None) { - AActor *a = SingleActorFromTID(args[0], activator); + AActor *a = Level->SingleActorFromTID(args[0], activator); return a != NULL ? GetUserVariable(a, varname, 0) : 0; } return 0; @@ -5555,7 +5547,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) case ACSF_SetUserArray: { int cnt = 0; - FName varname(level.Behaviors.LookupString(args[1]), true); + FName varname(Level->Behaviors.LookupString(args[1]), true); if (varname != NAME_None) { if (args[0] == 0) @@ -5568,7 +5560,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) } else { - auto iterator = level.GetActorIterator(args[0]); + auto iterator = Level->GetActorIterator(args[0]); while ( (actor = iterator.Next()) ) { @@ -5582,34 +5574,34 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) case ACSF_GetUserArray: { - FName varname(level.Behaviors.LookupString(args[1]), true); + FName varname(Level->Behaviors.LookupString(args[1]), true); if (varname != NAME_None) { - AActor *a = SingleActorFromTID(args[0], activator); + AActor *a = Level->SingleActorFromTID(args[0], activator); return a != NULL ? GetUserVariable(a, varname, args[2]) : 0; } return 0; } case ACSF_Radius_Quake2: - P_StartQuake(activator, args[0], args[1], args[2], args[3], args[4], level.Behaviors.LookupString(args[5])); + P_StartQuake(activator, args[0], args[1], args[2], args[3], args[4], Level->Behaviors.LookupString(args[5])); break; case ACSF_CheckActorClass: { - AActor *a = SingleActorFromTID(args[0], activator); - return a == NULL ? false : a->GetClass()->TypeName == FName(level.Behaviors.LookupString(args[1])); + AActor *a = Level->SingleActorFromTID(args[0], activator); + return a == NULL ? false : a->GetClass()->TypeName == FName(Level->Behaviors.LookupString(args[1])); } case ACSF_GetActorClass: { - AActor *a = SingleActorFromTID(args[0], activator); + AActor *a = Level->SingleActorFromTID(args[0], activator); return GlobalACSStrings.AddString(a == NULL ? "None" : a->GetClass()->TypeName.GetChars()); } case ACSF_SoundSequenceOnActor: { - const char *seqname = level.Behaviors.LookupString(args[1]); + const char *seqname = Level->Behaviors.LookupString(args[1]); if (seqname != NULL) { if (args[0] == 0) @@ -5621,7 +5613,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) } else { - auto it = level.GetActorIterator(args[0]); + auto it = Level->GetActorIterator(args[0]); AActor *actor; while ( (actor = it.Next()) ) @@ -5635,15 +5627,15 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) case ACSF_SoundSequenceOnSector: { - const char *seqname = level.Behaviors.LookupString(args[1]); + const char *seqname = Level->Behaviors.LookupString(args[1]); int space = args[2] < CHAN_FLOOR || args[2] > CHAN_INTERIOR ? CHAN_FULLHEIGHT : args[2]; if (seqname != NULL) { - auto it = level.GetSectorTagIterator(args[0]); + auto it = Level->GetSectorTagIterator(args[0]); int s; while ((s = it.Next()) >= 0) { - SN_StartSequence(&level.sectors[s], args[2], seqname, 0); + SN_StartSequence(&Level->sectors[s], args[2], seqname, 0); } } } @@ -5651,10 +5643,10 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) case ACSF_SoundSequenceOnPolyobj: { - const char *seqname = level.Behaviors.LookupString(args[1]); + const char *seqname = Level->Behaviors.LookupString(args[1]); if (seqname != NULL) { - FPolyObj *poly = level.GetPolyobj(args[0]); + FPolyObj *poly = Level->GetPolyobj(args[0]); if (poly != NULL) { SN_StartSequence(poly, seqname, 0); @@ -5665,7 +5657,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) case ACSF_GetPolyobjX: { - FPolyObj *poly = level.GetPolyobj(args[0]); + FPolyObj *poly = Level->GetPolyobj(args[0]); if (poly != NULL) { return DoubleToACS(poly->StartSpot.pos.X); @@ -5675,7 +5667,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) case ACSF_GetPolyobjY: { - FPolyObj *poly = level.GetPolyobj(args[0]); + FPolyObj *poly = Level->GetPolyobj(args[0]); if (poly != NULL) { return DoubleToACS(poly->StartSpot.pos.Y); @@ -5699,7 +5691,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) if (args[1] == 0) return 1; // [KS] I'm sure the activator can see itself. - auto dstiter = level.GetActorIterator(args[1]); + auto dstiter = Level->GetActorIterator(args[1]); while ( (dest = dstiter.Next ()) ) { if (P_CheckSight(source, dest, flags)) return 1; @@ -5707,13 +5699,13 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) } else { - auto srciter = level.GetActorIterator(args[0]); + auto srciter = Level->GetActorIterator(args[0]); while ( (source = srciter.Next ()) ) { if (args[1] != 0) { - auto dstiter = level.GetActorIterator(args[1]); + auto dstiter = Level->GetActorIterator(args[1]); while ( (dest = dstiter.Next ()) ) { if (P_CheckSight(source, dest, flags)) return 1; @@ -5739,7 +5731,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) case ACSF_ACS_NamedExecuteWithResult: case ACSF_ACS_NamedExecuteAlways: { - int scriptnum = -FName(level.Behaviors.LookupString(args[0])); + int scriptnum = -FName(Level->Behaviors.LookupString(args[0])); int arg1 = argCount > 1 ? args[1] : 0; int arg2 = argCount > 2 ? args[2] : 0; int arg3 = argCount > 3 ? args[3] : 0; @@ -5751,10 +5743,10 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) break; case ACSF_UniqueTID: - return level.FindUniqueTID(argCount > 0 ? args[0] : 0, (argCount > 1 && args[1] >= 0) ? args[1] : 0); + return Level->FindUniqueTID(argCount > 0 ? args[0] : 0, (argCount > 1 && args[1] >= 0) ? args[1] : 0); case ACSF_IsTIDUsed: - return level.IsTIDUsed(args[0]); + return Level->IsTIDUsed(args[0]); case ACSF_Sqrt: return xs_FloorToInt(g_sqrt(double(args[0]))); @@ -5781,49 +5773,49 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) case ACSF_GetCVarString: if (argCount == 1) { - return DoGetCVar(GetCVar(activator, level.Behaviors.LookupString(args[0])), true); + return DoGetCVar(GetCVar(activator, Level->Behaviors.LookupString(args[0])), true); } break; case ACSF_SetCVar: if (argCount == 2) { - return SetCVar(activator, level.Behaviors.LookupString(args[0]), args[1], false); + return SetCVar(activator, Level->Behaviors.LookupString(args[0]), args[1], false); } break; case ACSF_SetCVarString: if (argCount == 2) { - return SetCVar(activator, level.Behaviors.LookupString(args[0]), args[1], true); + return SetCVar(activator, Level->Behaviors.LookupString(args[0]), args[1], true); } break; case ACSF_GetUserCVar: if (argCount == 2) { - return DoGetCVar(GetUserCVar(args[0], level.Behaviors.LookupString(args[1])), false); + return DoGetCVar(GetUserCVar(args[0], Level->Behaviors.LookupString(args[1])), false); } break; case ACSF_GetUserCVarString: if (argCount == 2) { - return DoGetCVar(GetUserCVar(args[0], level.Behaviors.LookupString(args[1])), true); + return DoGetCVar(GetUserCVar(args[0], Level->Behaviors.LookupString(args[1])), true); } break; case ACSF_SetUserCVar: if (argCount == 3) { - return SetUserCVar(args[0], level.Behaviors.LookupString(args[1]), args[2], false); + return SetUserCVar(args[0], Level->Behaviors.LookupString(args[1]), args[2], false); } break; case ACSF_SetUserCVarString: if (argCount == 3) { - return SetUserCVar(args[0], level.Behaviors.LookupString(args[1]), args[2], true); + return SetUserCVar(args[0], Level->Behaviors.LookupString(args[1]), args[2], true); } break; @@ -5833,8 +5825,8 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) DAngle angle = ACSToAngle(args[1]); DAngle pitch = ACSToAngle(args[2]); int damage = args[3]; - FName pufftype = argCount > 4 && args[4]? FName(level.Behaviors.LookupString(args[4])) : NAME_BulletPuff; - FName damagetype = argCount > 5 && args[5]? FName(level.Behaviors.LookupString(args[5])) : NAME_None; + FName pufftype = argCount > 4 && args[4]? FName(Level->Behaviors.LookupString(args[4])) : NAME_BulletPuff; + FName damagetype = argCount > 5 && args[5]? FName(Level->Behaviors.LookupString(args[5])) : NAME_None; double range = argCount > 6 && args[6]? ACSToDouble(args[6]) : MISSILERANGE; int flags = argCount > 7 && args[7]? args[7] : 0; int pufftid = argCount > 8 && args[8]? args[8] : 0; @@ -5855,7 +5847,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) else { AActor *source; - auto it = level.GetActorIterator(args[0]); + auto it = Level->GetActorIterator(args[0]); while ((source = it.Next()) != NULL) { @@ -5878,7 +5870,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) if (funcIndex == ACSF_PlaySound) { - const char *lookup = level.Behaviors.LookupString(args[1]); + const char *lookup = Level->Behaviors.LookupString(args[1]); if (lookup != NULL) { sid = lookup; @@ -5886,7 +5878,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) } if (sid != 0 || funcIndex == ACSF_PlayActorSound) { - auto it = level.GetActorIterator(args[0]); + auto it = Level->GetActorIterator(args[0]); AActor *spot; int chan = argCount > 2 ? args[2] : CHAN_BODY; @@ -5932,7 +5924,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) } else { - auto it = level.GetActorIterator(args[0]); + auto it = Level->GetActorIterator(args[0]); AActor *spot; while ((spot = it.Next()) != NULL) @@ -5955,7 +5947,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) } else { - auto it = level.GetActorIterator(args[0]); + auto it = Level->GetActorIterator(args[0]); AActor *spot; while ((spot = it.Next()) != NULL) @@ -5976,8 +5968,8 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) { return 0; } - a = level.Behaviors.LookupString(args[0]); - b = level.Behaviors.LookupString(args[1]); + a = Level->Behaviors.LookupString(args[0]); + b = Level->Behaviors.LookupString(args[1]); // Don't crash on invalid strings. if (a == NULL) a = ""; @@ -5999,7 +5991,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) case ACSF_StrRight: if (argCount >= 2) { - const char *oldstr = level.Behaviors.LookupString(args[0]); + const char *oldstr = Level->Behaviors.LookupString(args[0]); if (oldstr == NULL || *oldstr == '\0') { return GlobalACSStrings.AddString(""); @@ -6019,7 +6011,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) case ACSF_StrMid: if (argCount >= 3) { - const char *oldstr = level.Behaviors.LookupString(args[0]); + const char *oldstr = Level->Behaviors.LookupString(args[0]); if (oldstr == NULL || *oldstr == '\0') { return GlobalACSStrings.AddString(""); @@ -6056,7 +6048,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) // Returns number of decals spawned (not including spreading) { int count = 0; - const FDecalTemplate *tpl = DecalLibrary.GetDecalByName(level.Behaviors.LookupString(args[1])); + const FDecalTemplate *tpl = DecalLibrary.GetDecalByName(Level->Behaviors.LookupString(args[1])); if (tpl != NULL) { int flags = (argCount > 2) ? args[2] : 0; @@ -6073,7 +6065,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) } else { - auto it = level.GetActorIterator(args[0]); + auto it = Level->GetActorIterator(args[0]); AActor *actor; while ((actor = it.Next()) != NULL) @@ -6088,11 +6080,11 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) case ACSF_CheckFont: // bool CheckFont(str fontname) - return V_GetFont(level.Behaviors.LookupString(args[0])) != NULL; + return V_GetFont(Level->Behaviors.LookupString(args[0])) != NULL; case ACSF_DropItem: { - const char *type = level.Behaviors.LookupString(args[1]); + const char *type = Level->Behaviors.LookupString(args[1]); int amount = argCount >= 3? args[2] : -1; int chance = argCount >= 4? args[3] : 256; PClassActor *cls = PClass::FindActor(type); @@ -6109,7 +6101,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) } else { - auto it = level.GetActorIterator(args[0]); + auto it = Level->GetActorIterator(args[0]); AActor *actor; while ((actor = it.Next()) != NULL) @@ -6125,7 +6117,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) case ACSF_DropInventory: { - const char *type = level.Behaviors.LookupString(args[1]); + const char *type = Level->Behaviors.LookupString(args[1]); AActor *inv; if (type != NULL) @@ -6143,7 +6135,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) } else { - auto it = level.GetActorIterator(args[0]); + auto it = Level->GetActorIterator(args[0]); AActor *actor; while ((actor = it.Next()) != NULL) @@ -6161,17 +6153,17 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) case ACSF_CheckFlag: { - AActor *actor = SingleActorFromTID(args[0], activator); + AActor *actor = Level->SingleActorFromTID(args[0], activator); if (actor != NULL) { - return !!CheckActorFlag(actor, level.Behaviors.LookupString(args[1])); + return !!CheckActorFlag(actor, Level->Behaviors.LookupString(args[1])); } break; } case ACSF_QuakeEx: { - return P_StartQuakeXYZ(activator, args[0], args[1], args[2], args[3], args[4], args[5], args[6], level.Behaviors.LookupString(args[7]), + return P_StartQuakeXYZ(activator, args[0], args[1], args[2], args[3], args[4], args[5], args[6], Level->Behaviors.LookupString(args[7]), argCount > 8 ? args[8] : 0, argCount > 9 ? ACSToDouble(args[9]) : 1.0, argCount > 10 ? ACSToDouble(args[10]) : 1.0, @@ -6186,10 +6178,10 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) if (argCount >= 2) { int line; - auto itr = level.GetLineIdIterator(args[0]); + auto itr = Level->GetLineIdIterator(args[0]); while ((line = itr.Next()) >= 0) { - level.lines[line].activation = args[1]; + Level->lines[line].activation = args[1]; } } break; @@ -6197,22 +6189,22 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) case ACSF_GetLineActivation: if (argCount > 0) { - int line = level.FindFirstLineFromID(args[0]); - return line >= 0 ? level.lines[line].activation : 0; + int line = Level->FindFirstLineFromID(args[0]); + return line >= 0 ? Level->lines[line].activation : 0; } break; case ACSF_GetActorPowerupTics: if (argCount >= 2) { - PClassActor *powerupclass = PClass::FindActor(level.Behaviors.LookupString(args[1])); + PClassActor *powerupclass = PClass::FindActor(Level->Behaviors.LookupString(args[1])); if (powerupclass == NULL || !powerupclass->IsDescendantOf(NAME_Powerup)) { - Printf("'%s' is not a type of Powerup.\n", level.Behaviors.LookupString(args[1])); + Printf("'%s' is not a type of Powerup.\n", Level->Behaviors.LookupString(args[1])); return 0; } - AActor *actor = SingleActorFromTID(args[0], activator); + AActor *actor = Level->SingleActorFromTID(args[0], activator); if (actor != NULL) { auto powerup = actor->FindInventory(powerupclass); @@ -6239,7 +6231,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) case ACSF_SetActorTeleFog: if (argCount >= 3) { - SetActorTeleFog(activator, args[0], level.Behaviors.LookupString(args[1]), level.Behaviors.LookupString(args[2])); + SetActorTeleFog(activator, args[0], Level->Behaviors.LookupString(args[1]), Level->Behaviors.LookupString(args[2])); } break; case ACSF_SwapActorTeleFog: @@ -6251,7 +6243,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) case ACSF_PickActor: if (argCount >= 5) { - actor = SingleActorFromTID(args[0], activator); + actor = Level->SingleActorFromTID(args[0], activator); if (actor == NULL) { return 0; @@ -6304,8 +6296,8 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) case 3: tid1 = args[2]; } - actor = SingleActorFromTID(tid1, activator); - AActor * actor2 = tid2 == tid1 ? actor : SingleActorFromTID(tid2, activator); + actor = Level->SingleActorFromTID(tid1, activator); + AActor * actor2 = tid2 == tid1 ? actor : Level->SingleActorFromTID(tid2, activator); return COPY_AAPTR(actor, args[0]) == COPY_AAPTR(actor2, args[1]); } @@ -6314,13 +6306,13 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) case ACSF_CanRaiseActor: if (argCount >= 1) { if (args[0] == 0) { - actor = SingleActorFromTID(args[0], activator); + actor = Level->SingleActorFromTID(args[0], activator); if (actor != NULL) { return P_Thing_CanRaise(actor); } } - auto iterator = level.GetActorIterator(args[0]); + auto iterator = Level->GetActorIterator(args[0]); bool canraiseall = true; while ((actor = iterator.Next())) { @@ -6344,7 +6336,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) break; case ACSF_GetActorRoll: - actor = SingleActorFromTID(args[0], activator); + actor = Level->SingleActorFromTID(args[0], activator); return actor != NULL? AngleToACS(actor->Angles.Roll) : 0; // [ZK] A_Warp in ACS @@ -6360,7 +6352,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) AActor* const reference = ((flags & WARPF_USEPTR) && (AAPTR_DEFAULT != dest)) ? COPY_AAPTR(activator, dest) - : SingleActorFromTID(dest, activator); + : Level->SingleActorFromTID(dest, activator); if (nullptr == reference) { @@ -6383,7 +6375,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) if (argCount > 6) { - const char* const statename = level.Behaviors.LookupString(args[6]); + const char* const statename = Level->Behaviors.LookupString(args[6]); if (nullptr != statename) { @@ -6400,24 +6392,24 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) return true; } case ACSF_GetMaxInventory: - actor = SingleActorFromTID(args[0], activator); + actor = Level->SingleActorFromTID(args[0], activator); if (actor != NULL) { - return CheckInventory(actor, level.Behaviors.LookupString(args[1]), true); + return CheckInventory(actor, Level->Behaviors.LookupString(args[1]), true); } break; case ACSF_SetSectorDamage: if (argCount >= 2) { - auto it = level.GetSectorTagIterator(args[0]); + auto it = Level->GetSectorTagIterator(args[0]); int s; while ((s = it.Next()) >= 0) { - sector_t *sec = &level.sectors[s]; + sector_t *sec = &Level->sectors[s]; sec->damageamount = args[1]; - sec->damagetype = argCount >= 3 ? FName(level.Behaviors.LookupString(args[2])) : FName(NAME_None); + sec->damagetype = argCount >= 3 ? FName(Level->Behaviors.LookupString(args[2])) : FName(NAME_None); sec->damageinterval = argCount >= 4 ? clamp(args[3], 1, INT_MAX) : 32; sec->leakydamage = argCount >= 5 ? args[4] : 0; } @@ -6429,12 +6421,12 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) { if (args[1] == sector_t::floor || args[1] == sector_t::ceiling) { - int terrain = P_FindTerrain(level.Behaviors.LookupString(args[2])); - auto it = level.GetSectorTagIterator(args[0]); + int terrain = P_FindTerrain(Level->Behaviors.LookupString(args[2])); + auto it = Level->GetSectorTagIterator(args[0]); int s; while ((s = it.Next()) >= 0) { - level.sectors[s].terrainnum[args[1]] = terrain; + Level->sectors[s].terrainnum[args[1]] = terrain; } } } @@ -6473,14 +6465,14 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) break; case ACSF_SetMusicVolume: - level.SetMusicVolume(ACSToFloat(args[0])); + Level->SetMusicVolume(ACSToFloat(args[0])); break; case ACSF_CheckProximity: { // [zombie] ACS version of A_CheckProximity - actor = SingleActorFromTID(args[0], activator); - PClass *classname = PClass::FindClass(level.Behaviors.LookupString(args[1])); + actor = Level->SingleActorFromTID(args[0], activator); + PClass *classname = PClass::FindClass(Level->Behaviors.LookupString(args[1])); double distance = ACSToDouble(args[2]); int count = argCount >= 4 ? args[3] : 1; int flags = argCount >= 5 ? args[4] : 0; @@ -6490,8 +6482,8 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) case ACSF_CheckActorState: { - actor = SingleActorFromTID(args[0], activator); - const char *statename = level.Behaviors.LookupString(args[1]); + actor = Level->SingleActorFromTID(args[0], activator); + const char *statename = Level->Behaviors.LookupString(args[1]); bool exact = (argCount > 2) ? !!args[2] : false; if (actor && statename) { @@ -6502,23 +6494,23 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) case ACSF_CheckClass: { - const char *clsname = level.Behaviors.LookupString(args[0]); + const char *clsname = Level->Behaviors.LookupString(args[0]); return !!PClass::FindActor(clsname); } case ACSF_DamageActor: // [arookas] wrapper around P_DamageMobj { // (target, ptr_select1, inflictor, ptr_select2, amount, damagetype) - AActor* target = COPY_AAPTR(SingleActorFromTID(args[0], activator), args[1]); - AActor* inflictor = COPY_AAPTR(SingleActorFromTID(args[2], activator), args[3]); - FName damagetype(level.Behaviors.LookupString(args[5])); + AActor* target = COPY_AAPTR(Level->SingleActorFromTID(args[0], activator), args[1]); + AActor* inflictor = COPY_AAPTR(Level->SingleActorFromTID(args[2], activator), args[3]); + FName damagetype(Level->Behaviors.LookupString(args[5])); return P_DamageMobj(target, inflictor, inflictor, args[4], damagetype); } case ACSF_SetActorFlag: { int tid = args[0]; - FString flagname = level.Behaviors.LookupString(args[1]); + FString flagname = Level->Behaviors.LookupString(args[1]); bool flagvalue = !!args[2]; int count = 0; // Return value; number of actors affected if (tid == 0) @@ -6530,7 +6522,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) } else { - auto it = level.GetActorIterator(tid); + auto it = Level->GetActorIterator(tid); while ((actor = it.Next()) != nullptr) { // Don't log errors when affecting many actors because things might share a TID but not share the flag @@ -6546,7 +6538,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) case ACSF_SetTranslation: { int tid = args[0]; - const char *trname = level.Behaviors.LookupString(args[1]); + const char *trname = Level->Behaviors.LookupString(args[1]); if (tid == 0) { if (activator != nullptr) @@ -6554,7 +6546,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) } else { - auto it = level.GetActorIterator(tid); + auto it = Level->GetActorIterator(tid); while ((actor = it.Next()) != nullptr) { actor->SetTranslation(trname); @@ -6571,31 +6563,31 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) float height = float(args[5]); if (args[2] == -1) color = -1; - auto it = level.GetSectorTagIterator(args[0]); + auto it = Level->GetSectorTagIterator(args[0]); int s; while ((s = it.Next()) >= 0) { - level.sectors[s].planes[which].GlowColor = color; - level.sectors[s].planes[which].GlowHeight = height; + Level->sectors[s].planes[which].GlowColor = color; + Level->sectors[s].planes[which].GlowHeight = height; } break; } case ACSF_SetFogDensity: { - auto it = level.GetSectorTagIterator(args[0]); + auto it = Level->GetSectorTagIterator(args[0]); int s; int d = clamp(args[1]/2, 0, 255); while ((s = it.Next()) >= 0) { - level.sectors[s].SetFogDensity(d); + Level->sectors[s].SetFogDensity(d); } break; } case ACSF_GetActorFloorTexture: { - auto a = SingleActorFromTID(args[0], activator); + auto a = Level->SingleActorFromTID(args[0], activator); if (a != nullptr) { return GlobalACSStrings.AddString(TexMan.GetTexture(a->floorpic)->GetName()); @@ -6609,7 +6601,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) case ACSF_GetActorFloorTerrain: { - auto a = SingleActorFromTID(args[0], activator); + auto a = Level->SingleActorFromTID(args[0], activator); if (a != nullptr) { return GlobalACSStrings.AddString(Terrains[a->floorterrain].Name); @@ -6622,7 +6614,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) } case ACSF_StrArg: - return -FName(level.Behaviors.LookupString(args[0])); + return -FName(Level->Behaviors.LookupString(args[0])); case ACSF_Floor: return args[0] & ~0xffff; @@ -6637,17 +6629,17 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) return ScriptCall(activator, argCount, args); case ACSF_StartSlideshow: - G_StartSlideshow(FName(level.Behaviors.LookupString(args[0]))); + G_StartSlideshow(FName(Level->Behaviors.LookupString(args[0]))); break; case ACSF_GetSectorHealth: { int part = args[1]; - auto it = level.GetSectorTagIterator(args[0]); + auto it = Level->GetSectorTagIterator(args[0]); int s = it.Next(); if (s < 0) return 0; - sector_t* ss = &level.sectors[s]; + sector_t* ss = &Level->sectors[s]; FHealthGroup* grp; if (part == SECPART_Ceiling) { @@ -6669,11 +6661,11 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) case ACSF_GetLineHealth: { - auto it = level.GetLineIdIterator(args[0]); + auto it = Level->GetLineIdIterator(args[0]); int l = it.Next(); if (l < 0) return 0; - line_t* ll = &level.lines[l]; + line_t* ll = &Level->lines[l]; if (ll->healthgroup > 0) { FHealthGroup* grp = P_GetHealthGroup(ll->healthgroup); @@ -6686,10 +6678,10 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) case ACSF_GetLineX: case ACSF_GetLineY: { - auto it = level.GetLineIdIterator(args[0]); + auto it = Level->GetLineIdIterator(args[0]); int lineno = it.Next(); if (lineno < 0) return 0; - DVector2 delta = level.lines[lineno].Delta(); + DVector2 delta = Level->lines[lineno].Delta(); double result = delta[funcIndex - ACSF_GetLineX] * ACSToDouble(args[1]); if (args[2]) { @@ -6762,12 +6754,12 @@ static bool CharArrayParms(int &capacity, int &offset, int &a, FACSStackMemory& PClass *DLevelScript::GetClassForIndex(int index) const { - return PClass::FindActor(level.Behaviors.LookupString(index)); + return PClass::FindActor(Level->Behaviors.LookupString(index)); } -int DLevelScript::RunScript () +int DLevelScript::RunScript() { - DACSThinker *controller = level.ACSThinker; + DACSThinker *controller = Level->ACSThinker; ACSLocalVariables locals(Localvars); ACSLocalArrays noarrays; ACSLocalArrays *localarrays = &noarrays; @@ -6786,7 +6778,7 @@ int DLevelScript::RunScript () } // Hexen truncates all special arguments to bytes (only when using an old MAPINFO and old ACS format - const int specialargmask = ((level.flags2 & LEVEL2_HEXENHACK) && activeBehavior->GetFormat() == ACS_Old) ? 255 : ~0; + const int specialargmask = ((Level->flags2 & LEVEL2_HEXENHACK) && activeBehavior->GetFormat() == ACS_Old) ? 255 : ~0; switch (state) { @@ -6802,10 +6794,10 @@ int DLevelScript::RunScript () // state running { int secnum; - auto it = level.GetSectorTagIterator(statedata); + auto it = Level->GetSectorTagIterator(statedata); while ((secnum = it.Next()) >= 0) { - if (level.sectors[secnum].floordata || level.sectors[secnum].ceilingdata) + if (Level->sectors[secnum].floordata || Level->sectors[secnum].ceilingdata) return resultValue; } @@ -7140,7 +7132,7 @@ int DLevelScript::RunScript () if(pcd == PCD_CALLSTACK) { funcnum = STACK(1); - module = level.Behaviors.GetModule(funcnum>>LIBRARYID_SHIFT); + module = Level->Behaviors.GetModule(funcnum>>LIBRARYID_SHIFT); --sp; funcnum &= 0xFFFF; // Clear out tag @@ -8312,7 +8304,7 @@ scriptwait: goto scriptwait; case PCD_SCRIPTWAITNAMED: - statedata = -FName(level.Behaviors.LookupString(STACK(1))); + statedata = -FName(Level->Behaviors.LookupString(STACK(1))); sp--; goto scriptwait; @@ -8375,7 +8367,7 @@ scriptwait: case PCD_PRINTSTRING: case PCD_PRINTLOCALIZED: - lookup = level.Behaviors.LookupString (STACK(1)); + lookup = Level->Behaviors.LookupString (STACK(1)); if (pcd == PCD_PRINTLOCALIZED) { lookup = GStrings(lookup); @@ -8425,12 +8417,12 @@ scriptwait: switch (STACK(1)) { case PRINTNAME_LEVELNAME: - work += level.LevelName; + work += Level->LevelName; break; case PRINTNAME_LEVEL: { - FString uppername = level.MapName; + FString uppername = Level->MapName; uppername.ToUpper(); work += uppername; break; @@ -8438,7 +8430,7 @@ scriptwait: case PRINTNAME_NEXTLEVEL: { - FString uppername = level.NextMap; + FString uppername = Level->NextMap; uppername.ToUpper(); work += uppername; break; @@ -8446,7 +8438,7 @@ scriptwait: case PRINTNAME_NEXTSECRET: { - FString uppername = level.NextSecretMap; + FString uppername = Level->NextSecretMap; uppername.ToUpper(); work += uppername; break; @@ -8563,7 +8555,7 @@ scriptwait: // [GRB] Print key name(s) for a command case PCD_PRINTBIND: - lookup = level.Behaviors.LookupString (STACK(1)); + lookup = Level->Behaviors.LookupString (STACK(1)); if (lookup != NULL) { int key1 = 0, key2 = 0; @@ -8604,7 +8596,7 @@ scriptwait: if (pcd == PCD_ENDPRINTBOLD || screen == NULL || screen->CheckLocalView (consoleplayer)) { - if (pcd == PCD_ENDPRINTBOLD && (gameinfo.correctprintbold || (level.flags2 & LEVEL2_HEXENHACK))) + if (pcd == PCD_ENDPRINTBOLD && (gameinfo.correctprintbold || (Level->flags2 & LEVEL2_HEXENHACK))) C_MidPrintBold(activefont, work); else C_MidPrint (activefont, work); @@ -8650,7 +8642,7 @@ scriptwait: if (type & HUDMSG_COLORSTRING) { - color = V_FindFontColor(level.Behaviors.LookupString(Stack[optstart-4])); + color = V_FindFontColor(Level->Behaviors.LookupString(Stack[optstart-4])); } else { @@ -8795,7 +8787,7 @@ scriptwait: break; case PCD_MUSICCHANGE: - lookup = level.Behaviors.LookupString (STACK(2)); + lookup = Level->Behaviors.LookupString (STACK(2)); if (lookup != NULL) { S_ChangeMusic (lookup, STACK(1)); @@ -8809,11 +8801,11 @@ scriptwait: // [BC] End ST PCD's case PCD_TIMER: - PushToStack (level.time); + PushToStack (Level->time); break; case PCD_SECTORSOUND: - lookup = level.Behaviors.LookupString (STACK(2)); + lookup = Level->Behaviors.LookupString (STACK(2)); if (lookup != NULL) { if (activationline) @@ -8838,7 +8830,7 @@ scriptwait: break; case PCD_AMBIENTSOUND: - lookup = level.Behaviors.LookupString (STACK(2)); + lookup = Level->Behaviors.LookupString (STACK(2)); if (lookup != NULL) { S_Sound (CHAN_AUTO, @@ -8849,7 +8841,7 @@ scriptwait: break; case PCD_LOCALAMBIENTSOUND: - lookup = level.Behaviors.LookupString (STACK(2)); + lookup = Level->Behaviors.LookupString (STACK(2)); if (lookup != NULL && activator->CheckLocalView (consoleplayer)) { S_Sound (CHAN_AUTO, @@ -8860,7 +8852,7 @@ scriptwait: break; case PCD_ACTIVATORSOUND: - lookup = level.Behaviors.LookupString (STACK(2)); + lookup = Level->Behaviors.LookupString (STACK(2)); if (lookup != NULL) { if (activator != NULL) @@ -8880,7 +8872,7 @@ scriptwait: break; case PCD_SOUNDSEQUENCE: - lookup = level.Behaviors.LookupString (STACK(1)); + lookup = Level->Behaviors.LookupString (STACK(1)); if (lookup != NULL) { if (activationline != NULL) @@ -8898,8 +8890,8 @@ scriptwait: case PCD_REPLACETEXTURES: { - const char *fromname = level.Behaviors.LookupString(STACK(3)); - const char *toname = level.Behaviors.LookupString(STACK(2)); + const char *fromname = Level->Behaviors.LookupString(STACK(3)); + const char *toname = Level->Behaviors.LookupString(STACK(2)); P_ReplaceTextures(fromname, toname, STACK(1)); sp -= 3; @@ -8910,10 +8902,10 @@ scriptwait: { int lineno; - auto itr = level.GetLineIdIterator(STACK(2)); + auto itr = Level->GetLineIdIterator(STACK(2)); while ((lineno = itr.Next()) >= 0) { - auto &line = level.lines[lineno]; + auto &line = Level->lines[lineno]; switch (STACK(1)) { case BLOCK_NOTHING: @@ -8947,13 +8939,13 @@ scriptwait: { int line; - auto itr = level.GetLineIdIterator(STACK(2)); + auto itr = Level->GetLineIdIterator(STACK(2)); while ((line = itr.Next()) >= 0) { if (STACK(1)) - level.lines[line].flags |= ML_BLOCKMONSTERS; + Level->lines[line].flags |= ML_BLOCKMONSTERS; else - level.lines[line].flags &= ~ML_BLOCKMONSTERS; + Level->lines[line].flags &= ~ML_BLOCKMONSTERS; } sp -= 2; @@ -8970,13 +8962,13 @@ scriptwait: if (specnum >= -ACSF_ACS_NamedExecuteAlways && specnum <= -ACSF_ACS_NamedExecute) { specnum = NamedACSToNormalACS[-specnum - ACSF_ACS_NamedExecute]; - arg0 = -FName(level.Behaviors.LookupString(arg0)); + arg0 = -FName(Level->Behaviors.LookupString(arg0)); } - auto itr = level.GetLineIdIterator(STACK(7)); + auto itr = Level->GetLineIdIterator(STACK(7)); while ((linenum = itr.Next()) >= 0) { - line_t *line = &level.lines[linenum]; + line_t *line = &Level->lines[linenum]; line->special = specnum; line->args[0] = arg0; line->args[1] = STACK(4); @@ -8999,12 +8991,12 @@ scriptwait: if (specnum >= -ACSF_ACS_NamedExecuteAlways && specnum <= -ACSF_ACS_NamedExecute) { specnum = NamedACSToNormalACS[-specnum - ACSF_ACS_NamedExecute]; - arg0 = -FName(level.Behaviors.LookupString(arg0)); + arg0 = -FName(Level->Behaviors.LookupString(arg0)); } if (STACK(7) != 0) { - auto iterator = level.GetActorIterator(STACK(7)); + auto iterator = Level->GetActorIterator(STACK(7)); AActor *actor; while ( (actor = iterator.Next ()) ) @@ -9031,10 +9023,10 @@ scriptwait: break; case PCD_THINGSOUND: - lookup = level.Behaviors.LookupString (STACK(2)); + lookup = Level->Behaviors.LookupString (STACK(2)); if (lookup != NULL) { - auto iterator = level.GetActorIterator(STACK(3)); + auto iterator = Level->GetActorIterator(STACK(3)); AActor *spot; while ( (spot = iterator.Next ()) ) @@ -9058,23 +9050,23 @@ scriptwait: break; case PCD_SETGRAVITY: - level.gravity = ACSToDouble(STACK(1)); + Level->gravity = ACSToDouble(STACK(1)); sp--; break; case PCD_SETGRAVITYDIRECT: - level.gravity = ACSToDouble(uallong(pc[0])); + Level->gravity = ACSToDouble(uallong(pc[0])); pc++; break; case PCD_SETAIRCONTROL: - level.aircontrol = ACSToDouble(STACK(1)); + Level->aircontrol = ACSToDouble(STACK(1)); sp--; G_AirControlChanged (); break; case PCD_SETAIRCONTROLDIRECT: - level.aircontrol = ACSToDouble(uallong(pc[0])); + Level->aircontrol = ACSToDouble(uallong(pc[0])); pc++; G_AirControlChanged (); break; @@ -9115,7 +9107,7 @@ scriptwait: } else { - auto it = level.GetActorIterator(STACK(1)); + auto it = Level->GetActorIterator(STACK(1)); AActor *actor; for (actor = it.Next(); actor != NULL; actor = it.Next()) { @@ -9127,7 +9119,7 @@ scriptwait: case PCD_GIVEINVENTORY: { - int typeindex = FName(level.Behaviors.LookupString(STACK(2))).GetIndex(); + int typeindex = FName(Level->Behaviors.LookupString(STACK(2))).GetIndex(); ScriptUtil::Exec(NAME_GiveInventory, ScriptUtil::Pointer, activator, ScriptUtil::Int, typeindex, ScriptUtil::Int, STACK(1), ScriptUtil::End); sp -= 2; break; @@ -9135,15 +9127,15 @@ scriptwait: case PCD_GIVEACTORINVENTORY: { - int typeindex = FName(level.Behaviors.LookupString(STACK(2))).GetIndex(); - FName type = FName(level.Behaviors.LookupString(STACK(2))); + int typeindex = FName(Level->Behaviors.LookupString(STACK(2))).GetIndex(); + FName type = FName(Level->Behaviors.LookupString(STACK(2))); if (STACK(3) == 0) { ScriptUtil::Exec(NAME_GiveInventory, ScriptUtil::Pointer, nullptr, ScriptUtil::Int, typeindex, ScriptUtil::Int, STACK(1), ScriptUtil::End); } else { - auto it = level.GetActorIterator(STACK(3)); + auto it = Level->GetActorIterator(STACK(3)); AActor *actor; for (actor = it.Next(); actor != NULL; actor = it.Next()) { @@ -9156,7 +9148,7 @@ scriptwait: case PCD_GIVEINVENTORYDIRECT: { - int typeindex = FName(level.Behaviors.LookupString(TAGSTR(uallong(pc[0])))).GetIndex(); + int typeindex = FName(Level->Behaviors.LookupString(TAGSTR(uallong(pc[0])))).GetIndex(); ScriptUtil::Exec(NAME_GiveInventory, ScriptUtil::Pointer, activator, ScriptUtil::Int, typeindex, ScriptUtil::Int, uallong(pc[1]), ScriptUtil::End); pc += 2; break; @@ -9164,7 +9156,7 @@ scriptwait: case PCD_TAKEINVENTORY: { - int typeindex = FName(level.Behaviors.LookupString(STACK(2))).GetIndex(); + int typeindex = FName(Level->Behaviors.LookupString(STACK(2))).GetIndex(); ScriptUtil::Exec(NAME_TakeInventory, ScriptUtil::Pointer, activator, ScriptUtil::Int, typeindex, ScriptUtil::Int, STACK(1), ScriptUtil::End); sp -= 2; break; @@ -9172,15 +9164,15 @@ scriptwait: case PCD_TAKEACTORINVENTORY: { - int typeindex = FName(level.Behaviors.LookupString(STACK(2))).GetIndex(); - FName type = FName(level.Behaviors.LookupString(STACK(2))); + int typeindex = FName(Level->Behaviors.LookupString(STACK(2))).GetIndex(); + FName type = FName(Level->Behaviors.LookupString(STACK(2))); if (STACK(3) == 0) { ScriptUtil::Exec(NAME_TakeInventory, ScriptUtil::Pointer, nullptr, ScriptUtil::Int, typeindex, ScriptUtil::Int, STACK(1), ScriptUtil::End); } else { - auto it = level.GetActorIterator(STACK(3)); + auto it = Level->GetActorIterator(STACK(3)); AActor *actor; for (actor = it.Next(); actor != NULL; actor = it.Next()) { @@ -9193,42 +9185,42 @@ scriptwait: case PCD_TAKEINVENTORYDIRECT: { - int typeindex = FName(level.Behaviors.LookupString(TAGSTR(uallong(pc[0])))).GetIndex(); + int typeindex = FName(Level->Behaviors.LookupString(TAGSTR(uallong(pc[0])))).GetIndex(); ScriptUtil::Exec(NAME_TakeInventory, ScriptUtil::Pointer, activator, ScriptUtil::Int, typeindex, ScriptUtil::Int, uallong(pc[1]), ScriptUtil::End); pc += 2; break; } case PCD_CHECKINVENTORY: - STACK(1) = CheckInventory (activator, level.Behaviors.LookupString (STACK(1)), false); + STACK(1) = CheckInventory (activator, Level->Behaviors.LookupString (STACK(1)), false); break; case PCD_CHECKACTORINVENTORY: - STACK(2) = CheckInventory (SingleActorFromTID(STACK(2), NULL), - level.Behaviors.LookupString (STACK(1)), false); + STACK(2) = CheckInventory (Level->SingleActorFromTID(STACK(2), NULL), + Level->Behaviors.LookupString (STACK(1)), false); sp--; break; case PCD_CHECKINVENTORYDIRECT: - PushToStack (CheckInventory (activator, level.Behaviors.LookupString (TAGSTR(uallong(pc[0]))), false)); + PushToStack (CheckInventory (activator, Level->Behaviors.LookupString (TAGSTR(uallong(pc[0]))), false)); pc += 1; break; case PCD_USEINVENTORY: - STACK(1) = UseInventory (activator, level.Behaviors.LookupString (STACK(1))); + STACK(1) = UseInventory (activator, Level->Behaviors.LookupString (STACK(1))); break; case PCD_USEACTORINVENTORY: { int ret = 0; - const char *type = level.Behaviors.LookupString(STACK(1)); + const char *type = Level->Behaviors.LookupString(STACK(1)); if (STACK(2) == 0) { ret = UseInventory(NULL, type); } else { - auto it = level.GetActorIterator(STACK(2)); + auto it = Level->GetActorIterator(STACK(2)); AActor *actor; for (actor = it.Next(); actor != NULL; actor = it.Next()) { @@ -9258,7 +9250,7 @@ scriptwait: case PCD_GETAMMOCAPACITY: if (activator != NULL) { - PClass *type = PClass::FindClass (level.Behaviors.LookupString (STACK(1))); + PClass *type = PClass::FindClass (Level->Behaviors.LookupString (STACK(1))); if (type != NULL && type->ParentClass == PClass::FindActor(NAME_Ammo)) { @@ -9286,7 +9278,7 @@ scriptwait: case PCD_SETAMMOCAPACITY: if (activator != NULL) { - PClassActor *type = PClass::FindActor (level.Behaviors.LookupString (STACK(2))); + PClassActor *type = PClass::FindActor (Level->Behaviors.LookupString (STACK(2))); if (type != NULL && type->ParentClass == PClass::FindActor(NAME_Ammo)) { @@ -9310,19 +9302,19 @@ scriptwait: break; case PCD_SETMUSIC: - S_ChangeMusic (level.Behaviors.LookupString (STACK(3)), STACK(2)); + S_ChangeMusic (Level->Behaviors.LookupString (STACK(3)), STACK(2)); sp -= 3; break; case PCD_SETMUSICDIRECT: - S_ChangeMusic (level.Behaviors.LookupString (TAGSTR(uallong(pc[0]))), uallong(pc[1])); + S_ChangeMusic (Level->Behaviors.LookupString (TAGSTR(uallong(pc[0]))), uallong(pc[1])); pc += 3; break; case PCD_LOCALSETMUSIC: if (activator == players[consoleplayer].mo) { - S_ChangeMusic (level.Behaviors.LookupString (STACK(3)), STACK(2)); + S_ChangeMusic (Level->Behaviors.LookupString (STACK(3)), STACK(2)); } sp -= 3; break; @@ -9330,7 +9322,7 @@ scriptwait: case PCD_LOCALSETMUSICDIRECT: if (activator == players[consoleplayer].mo) { - S_ChangeMusic (level.Behaviors.LookupString (TAGSTR(uallong(pc[0]))), uallong(pc[1])); + S_ChangeMusic (Level->Behaviors.LookupString (TAGSTR(uallong(pc[0]))), uallong(pc[1])); } pc += 3; break; @@ -9368,7 +9360,7 @@ scriptwait: case PCD_SETACTORPOSITION: { bool result = false; - AActor *actor = SingleActorFromTID (STACK(5), activator); + AActor *actor = Level->SingleActorFromTID (STACK(5), activator); if (actor != NULL) result = P_MoveThing(actor, DVector3(ACSToDouble(STACK(4)), ACSToDouble(STACK(3)), ACSToDouble(STACK(2))), !!STACK(1)); sp -= 4; @@ -9380,7 +9372,7 @@ scriptwait: case PCD_GETACTORY: case PCD_GETACTORZ: { - AActor *actor = SingleActorFromTID(STACK(1), activator); + AActor *actor = Level->SingleActorFromTID(STACK(1), activator); if (actor == NULL) { STACK(1) = 0; @@ -9398,28 +9390,28 @@ scriptwait: case PCD_GETACTORFLOORZ: { - AActor *actor = SingleActorFromTID(STACK(1), activator); + AActor *actor = Level->SingleActorFromTID(STACK(1), activator); STACK(1) = actor == NULL ? 0 : DoubleToACS(actor->floorz); } break; case PCD_GETACTORCEILINGZ: { - AActor *actor = SingleActorFromTID(STACK(1), activator); + AActor *actor = Level->SingleActorFromTID(STACK(1), activator); STACK(1) = actor == NULL ? 0 : DoubleToACS(actor->ceilingz); } break; case PCD_GETACTORANGLE: { - AActor *actor = SingleActorFromTID(STACK(1), activator); + AActor *actor = Level->SingleActorFromTID(STACK(1), activator); STACK(1) = actor == NULL ? 0 : AngleToACS(actor->Angles.Yaw); } break; case PCD_GETACTORPITCH: { - AActor *actor = SingleActorFromTID(STACK(1), activator); + AActor *actor = Level->SingleActorFromTID(STACK(1), activator); STACK(1) = actor == NULL ? 0 : PitchToACS(actor->Angles.Pitch); } break; @@ -9449,19 +9441,19 @@ scriptwait: double z = 0; if (tag != 0) - secnum = level.FindFirstSectorFromTag (tag); + secnum = Level->FindFirstSectorFromTag (tag); else - secnum = level.PointInSector (DVector2(x, y))->sectornum; + secnum = Level->PointInSector (DVector2(x, y))->sectornum; if (secnum >= 0) { if (pcd == PCD_GETSECTORFLOORZ) { - z = level.sectors[secnum].floorplane.ZatPoint (x, y); + z = Level->sectors[secnum].floorplane.ZatPoint (x, y); } else { - z = level.sectors[secnum].ceilingplane.ZatPoint (x, y); + z = Level->sectors[secnum].ceilingplane.ZatPoint (x, y); } } sp -= 2; @@ -9471,28 +9463,30 @@ scriptwait: case PCD_GETSECTORLIGHTLEVEL: { - int secnum = level.FindFirstSectorFromTag (STACK(1)); + int secnum = Level->FindFirstSectorFromTag (STACK(1)); int z = -1; if (secnum >= 0) { - z = level.sectors[secnum].lightlevel; + z = Level->sectors[secnum].lightlevel; } STACK(1) = z; } break; case PCD_SETFLOORTRIGGER: - Create (activator, activationline, backSide, false, STACK(8), - STACK(7), STACK(6), STACK(5), STACK(4), STACK(3), STACK(2), STACK(1)); - sp -= 8; - break; - case PCD_SETCEILINGTRIGGER: - Create (activator, activationline, backSide, true, STACK(8), - STACK(7), STACK(6), STACK(5), STACK(4), STACK(3), STACK(2), STACK(1)); + { + int secnum = Level->FindFirstSectorFromTag(STACK(8)); + if (secnum >= 0) + { + Create(activator, activationline, backSide, pcd == PCD_SETCEILINGTRIGGER, &Level->sectors[secnum], + STACK(7), STACK(6), STACK(5), STACK(4), STACK(3), STACK(2), STACK(1)); + } + sp -= 8; break; + } case PCD_STARTTRANSLATION: { @@ -9619,7 +9613,7 @@ scriptwait: } else { - STACK(1) = activator->player->ReadyWeapon->GetClass()->TypeName == FName(level.Behaviors.LookupString (STACK(1)), true); + STACK(1) = activator->player->ReadyWeapon->GetClass()->TypeName == FName(Level->Behaviors.LookupString (STACK(1)), true); } break; @@ -9715,14 +9709,14 @@ scriptwait: case PCD_SPAWNPROJECTILE: // Same, but takes an actor name instead of a spawn ID. - P_Thing_Projectile(STACK(7), activator, 0, level.Behaviors.LookupString(STACK(6)), STACK(5) * (360. / 256.), + P_Thing_Projectile(STACK(7), activator, 0, Level->Behaviors.LookupString(STACK(6)), STACK(5) * (360. / 256.), STACK(4) / 8., STACK(3) / 8., 0, NULL, STACK(2), STACK(1), false); sp -= 7; break; case PCD_STRLEN: { - const char *str = level.Behaviors.LookupString(STACK(1)); + const char *str = Level->Behaviors.LookupString(STACK(1)); if (str != NULL) { STACK(1) = int32_t(strlen(str)); @@ -9740,7 +9734,7 @@ scriptwait: break; case PCD_GETCVAR: - STACK(1) = DoGetCVar(GetCVar(activator, level.Behaviors.LookupString(STACK(1))), false); + STACK(1) = DoGetCVar(GetCVar(activator, Level->Behaviors.LookupString(STACK(1))), false); break; case PCD_SETHUDSIZE: @@ -9756,16 +9750,16 @@ scriptwait: case PCD_GETLEVELINFO: switch (STACK(1)) { - case LEVELINFO_PAR_TIME: STACK(1) = level.partime; break; - case LEVELINFO_SUCK_TIME: STACK(1) = level.sucktime; break; - case LEVELINFO_CLUSTERNUM: STACK(1) = level.cluster; break; - case LEVELINFO_LEVELNUM: STACK(1) = level.levelnum; break; - case LEVELINFO_TOTAL_SECRETS: STACK(1) = level.total_secrets; break; - case LEVELINFO_FOUND_SECRETS: STACK(1) = level.found_secrets; break; - case LEVELINFO_TOTAL_ITEMS: STACK(1) = level.total_items; break; - case LEVELINFO_FOUND_ITEMS: STACK(1) = level.found_items; break; - case LEVELINFO_TOTAL_MONSTERS: STACK(1) = level.total_monsters; break; - case LEVELINFO_KILLED_MONSTERS: STACK(1) = level.killed_monsters; break; + case LEVELINFO_PAR_TIME: STACK(1) = Level->partime; break; + case LEVELINFO_SUCK_TIME: STACK(1) = Level->sucktime; break; + case LEVELINFO_CLUSTERNUM: STACK(1) = Level->cluster; break; + case LEVELINFO_LEVELNUM: STACK(1) = Level->levelnum; break; + case LEVELINFO_TOTAL_SECRETS: STACK(1) = Level->total_secrets; break; + case LEVELINFO_FOUND_SECRETS: STACK(1) = Level->found_secrets; break; + case LEVELINFO_TOTAL_ITEMS: STACK(1) = Level->total_items; break; + case LEVELINFO_FOUND_ITEMS: STACK(1) = Level->found_items; break; + case LEVELINFO_TOTAL_MONSTERS: STACK(1) = Level->total_monsters; break; + case LEVELINFO_KILLED_MONSTERS: STACK(1) = Level->killed_monsters; break; default: STACK(1) = 0; break; } break; @@ -9774,15 +9768,15 @@ scriptwait: { const char *sky1name, *sky2name; - sky1name = level.Behaviors.LookupString (STACK(2)); - sky2name = level.Behaviors.LookupString (STACK(1)); + sky1name = Level->Behaviors.LookupString (STACK(2)); + sky2name = Level->Behaviors.LookupString (STACK(1)); if (sky1name[0] != 0) { - sky1texture = level.skytexture1 = TexMan.GetTextureID(sky1name, ETextureType::Wall, FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_ReturnFirst); + sky1texture = Level->skytexture1 = TexMan.GetTextureID(sky1name, ETextureType::Wall, FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_ReturnFirst); } if (sky2name[0] != 0) { - sky2texture = level.skytexture2 = TexMan.GetTextureID(sky2name, ETextureType::Wall, FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_ReturnFirst); + sky2texture = Level->skytexture2 = TexMan.GetTextureID(sky2name, ETextureType::Wall, FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_ReturnFirst); } R_InitSkyMap (); sp -= 2; @@ -9791,7 +9785,7 @@ scriptwait: case PCD_SETCAMERATOTEXTURE: { - const char *picname = level.Behaviors.LookupString (STACK(2)); + const char *picname = Level->Behaviors.LookupString (STACK(2)); AActor *camera; if (STACK(3) == 0) @@ -9800,7 +9794,7 @@ scriptwait: } else { - auto it = level.GetActorIterator(STACK(3)); + auto it = Level->GetActorIterator(STACK(3)); camera = it.Next (); } @@ -9813,7 +9807,7 @@ scriptwait: } else { - level.canvasTextureInfo.Add(camera, picnum, STACK(1)); + Level->canvasTextureInfo.Add(camera, picnum, STACK(1)); } } sp -= 3; @@ -9832,7 +9826,7 @@ scriptwait: case PCD_SETACTORSTATE: { - const char *statename = level.Behaviors.LookupString (STACK(2)); + const char *statename = Level->Behaviors.LookupString (STACK(2)); FState *state; if (STACK(3) == 0) @@ -9853,7 +9847,7 @@ scriptwait: } else { - auto iterator = level.GetActorIterator(STACK(3)); + auto iterator = Level->GetActorIterator(STACK(3)); AActor *actor; int count = 0; @@ -9912,7 +9906,7 @@ scriptwait: case PCD_CHANGELEVEL: { - G_ChangeLevel(level.Behaviors.LookupString(STACK(4)), STACK(3), STACK(2), STACK(1)); + G_ChangeLevel(Level->Behaviors.LookupString(STACK(4)), STACK(3), STACK(2), STACK(1)); sp -= 4; } break; @@ -9921,8 +9915,8 @@ scriptwait: { int tag = STACK(5); int amount = STACK(4); - FName type = level.Behaviors.LookupString(STACK(3)); - FName protection = FName (level.Behaviors.LookupString(STACK(2)), true); + FName type = Level->Behaviors.LookupString(STACK(3)); + FName protection = FName (Level->Behaviors.LookupString(STACK(2)), true); PClassActor *protectClass = PClass::FindActor (protection); int flags = STACK(1); sp -= 5; @@ -9932,7 +9926,7 @@ scriptwait: break; case PCD_THINGDAMAGE2: - STACK(3) = P_Thing_Damage (STACK(3), activator, STACK(2), FName(level.Behaviors.LookupString(STACK(1)))); + STACK(3) = P_Thing_Damage (STACK(3), activator, STACK(2), FName(Level->Behaviors.LookupString(STACK(1)))); sp -= 2; break; @@ -9948,7 +9942,7 @@ scriptwait: case PCD_GETACTORLIGHTLEVEL: { - AActor *actor = SingleActorFromTID(STACK(1), activator); + AActor *actor = Level->SingleActorFromTID(STACK(1), activator); if (actor != NULL) { sector_t *sector = actor->Sector; @@ -9979,7 +9973,7 @@ scriptwait: case PCD_SETMUGSHOTSTATE: if (!multiplayer || (activator != nullptr && activator->CheckLocalView(consoleplayer))) { - StatusBar->SetMugShotState(level.Behaviors.LookupString(STACK(1))); + StatusBar->SetMugShotState(Level->Behaviors.LookupString(STACK(1))); } sp--; break; @@ -10006,15 +10000,15 @@ scriptwait: case PCD_MORPHACTOR: { int tag = STACK(7); - FName playerclass_name = level.Behaviors.LookupString(STACK(6)); + FName playerclass_name = Level->Behaviors.LookupString(STACK(6)); auto playerclass = PClass::FindActor (playerclass_name); - FName monsterclass_name = level.Behaviors.LookupString(STACK(5)); + FName monsterclass_name = Level->Behaviors.LookupString(STACK(5)); PClassActor *monsterclass = PClass::FindActor(monsterclass_name); int duration = STACK(4); int style = STACK(3); - FName morphflash_name = level.Behaviors.LookupString(STACK(2)); + FName morphflash_name = Level->Behaviors.LookupString(STACK(2)); PClassActor *morphflash = PClass::FindActor(morphflash_name); - FName unmorphflash_name = level.Behaviors.LookupString(STACK(1)); + FName unmorphflash_name = Level->Behaviors.LookupString(STACK(1)); PClassActor *unmorphflash = PClass::FindActor(unmorphflash_name); int changes = 0; @@ -10024,7 +10018,7 @@ scriptwait: } else { - auto iterator = level.GetActorIterator(tag); + auto iterator = Level->GetActorIterator(tag); AActor *actor; while ( (actor = iterator.Next ()) ) @@ -10050,7 +10044,7 @@ scriptwait: } else { - auto iterator = level.GetActorIterator(tag); + auto iterator = Level->GetActorIterator(tag); AActor *actor; while ( (actor = iterator.Next ()) ) @@ -10094,7 +10088,7 @@ scriptwait: index += STACK(6); - lookup = level.Behaviors.LookupString (STACK(2)); + lookup = Level->Behaviors.LookupString (STACK(2)); if (!lookup) { // no data, operation complete @@ -10404,6 +10398,7 @@ int P_StartScript (AActor *who, line_t *where, int script, const char *map, cons { if (flags & ACS_WANTRESULT) { + runningScript->Level = &level; return runningScript->RunScript(); } return true; diff --git a/src/p_actionfunctions.cpp b/src/p_actionfunctions.cpp index 546573446..b9bf2603a 100644 --- a/src/p_actionfunctions.cpp +++ b/src/p_actionfunctions.cpp @@ -70,9 +70,6 @@ #include "actorinlines.h" #include "types.h" -AActor *SingleActorFromTID(int tid, AActor *defactor); - - static FRandom pr_camissile ("CustomActorfire"); static FRandom pr_cabullet ("CustomBullet"); static FRandom pr_cwjump ("CustomWpJump"); @@ -3444,7 +3441,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_Warp) if ((flags & WARPF_USETID)) { - reference = SingleActorFromTID(destination_selector, self); + reference = level.SingleActorFromTID(destination_selector, self); } else { From 28761b4c3358cb3765be704fb1b66f3d703fed05 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 25 Jan 2019 19:46:03 +0100 Subject: [PATCH 020/164] - made G_InitLevelLocals a member function of FLevelLocals. This was another cheap one with a good number of removed references. --- src/g_level.cpp | 110 ++++++++++++++++++++++---------------------- src/g_level.h | 2 - src/g_levellocals.h | 1 + 3 files changed, 56 insertions(+), 57 deletions(-) diff --git a/src/g_level.cpp b/src/g_level.cpp index 0345fd449..7b41cbd26 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -947,7 +947,7 @@ void G_DoLoadLevel (int position, bool autosave, bool newGame) else lastposition = position; - G_InitLevelLocals (); + level.Init(); StatusBar->DetachAllMessages (); // Force 'teamplay' to 'true' if need be. @@ -1450,95 +1450,95 @@ int G_FinishTravel () // //========================================================================== -void G_InitLevelLocals () +void FLevelLocals::Init() { level_info_t *info; BaseBlendA = 0.0f; // Remove underwater blend effect, if any - level.gravity = sv_gravity * 35/TICRATE; - level.aircontrol = sv_aircontrol; - level.teamdamage = teamdamage; - level.flags = 0; - level.flags2 = 0; - level.flags3 = 0; + gravity = sv_gravity * 35/TICRATE; + aircontrol = sv_aircontrol; + teamdamage = teamdamage; + flags = 0; + flags2 = 0; + flags3 = 0; - info = FindLevelInfo (level.MapName); + info = FindLevelInfo (MapName); - level.info = info; - level.skyspeed1 = info->skyspeed1; - level.skyspeed2 = info->skyspeed2; - level.skytexture1 = TexMan.GetTextureID(info->SkyPic1, ETextureType::Wall, FTextureManager::TEXMAN_Overridable | FTextureManager::TEXMAN_ReturnFirst); - level.skytexture2 = TexMan.GetTextureID(info->SkyPic2, ETextureType::Wall, FTextureManager::TEXMAN_Overridable | FTextureManager::TEXMAN_ReturnFirst); - level.fadeto = info->fadeto; - level.cdtrack = info->cdtrack; - level.cdid = info->cdid; - level.FromSnapshot = false; - if (level.fadeto == 0) + info = info; + skyspeed1 = info->skyspeed1; + skyspeed2 = info->skyspeed2; + skytexture1 = TexMan.GetTextureID(info->SkyPic1, ETextureType::Wall, FTextureManager::TEXMAN_Overridable | FTextureManager::TEXMAN_ReturnFirst); + skytexture2 = TexMan.GetTextureID(info->SkyPic2, ETextureType::Wall, FTextureManager::TEXMAN_Overridable | FTextureManager::TEXMAN_ReturnFirst); + fadeto = info->fadeto; + cdtrack = info->cdtrack; + cdid = info->cdid; + FromSnapshot = false; + if (fadeto == 0) { if (strnicmp (info->FadeTable, "COLORMAP", 8) != 0) { - level.flags |= LEVEL_HASFADETABLE; + flags |= LEVEL_HASFADETABLE; } } - level.airsupply = info->airsupply*TICRATE; - level.outsidefog = info->outsidefog; - level.WallVertLight = info->WallVertLight*2; - level.WallHorizLight = info->WallHorizLight*2; + airsupply = info->airsupply*TICRATE; + outsidefog = info->outsidefog; + WallVertLight = info->WallVertLight*2; + WallHorizLight = info->WallHorizLight*2; if (info->gravity != 0.f) { - level.gravity = info->gravity * 35/TICRATE; + gravity = info->gravity * 35/TICRATE; } if (info->aircontrol != 0.f) { - level.aircontrol = info->aircontrol; + aircontrol = info->aircontrol; } if (info->teamdamage != 0.f) { - level.teamdamage = info->teamdamage; + teamdamage = info->teamdamage; } G_AirControlChanged (); cluster_info_t *clus = FindClusterInfo (info->cluster); - level.partime = info->partime; - level.sucktime = info->sucktime; - level.cluster = info->cluster; - level.clusterflags = clus ? clus->flags : 0; - level.flags |= info->flags; - level.flags2 |= info->flags2; - level.flags3 |= info->flags3; - level.levelnum = info->levelnum; - level.Music = info->Music; - level.musicorder = info->musicorder; - level.MusicVolume = 1.f; - level.HasHeightSecs = false; + partime = info->partime; + sucktime = info->sucktime; + cluster = info->cluster; + clusterflags = clus ? clus->flags : 0; + flags |= info->flags; + flags2 |= info->flags2; + flags3 |= info->flags3; + levelnum = info->levelnum; + Music = info->Music; + musicorder = info->musicorder; + MusicVolume = 1.f; + HasHeightSecs = false; - level.LevelName = level.info->LookupLevelName(); - level.NextMap = info->NextMap; - level.NextSecretMap = info->NextSecretMap; - level.F1Pic = info->F1Pic; - level.hazardcolor = info->hazardcolor; - level.hazardflash = info->hazardflash; + LevelName = info->LookupLevelName(); + NextMap = info->NextMap; + NextSecretMap = info->NextSecretMap; + F1Pic = info->F1Pic; + hazardcolor = info->hazardcolor; + hazardflash = info->hazardflash; // GL fog stuff modifiable by SetGlobalFogParameter. - level.fogdensity = info->fogdensity; - level.outsidefogdensity = info->outsidefogdensity; - level.skyfog = info->skyfog; - level.deathsequence = info->deathsequence; + fogdensity = info->fogdensity; + outsidefogdensity = info->outsidefogdensity; + skyfog = info->skyfog; + deathsequence = info->deathsequence; - level.pixelstretch = info->pixelstretch; + pixelstretch = info->pixelstretch; compatflags.Callback(); compatflags2.Callback(); - level.DefaultEnvironment = info->DefaultEnvironment; + DefaultEnvironment = info->DefaultEnvironment; - level.lightMode = info->lightmode == ELightMode::NotSet? (ELightMode)*gl_lightmode : info->lightmode; - level.brightfog = info->brightfog < 0? gl_brightfog : !!info->brightfog; - level.lightadditivesurfaces = info->lightadditivesurfaces < 0 ? gl_lightadditivesurfaces : !!info->lightadditivesurfaces; - level.notexturefill = info->notexturefill < 0 ? gl_notexturefill : !!info->notexturefill; + lightMode = info->lightmode == ELightMode::NotSet? (ELightMode)*gl_lightmode : info->lightmode; + brightfog = info->brightfog < 0? gl_brightfog : !!info->brightfog; + lightadditivesurfaces = info->lightadditivesurfaces < 0 ? gl_lightadditivesurfaces : !!info->lightadditivesurfaces; + notexturefill = info->notexturefill < 0 ? gl_notexturefill : !!info->notexturefill; FLightDefaults::SetAttenuationForLevel(); } diff --git a/src/g_level.h b/src/g_level.h index 1cbd0f463..4c7a91dc1 100644 --- a/src/g_level.h +++ b/src/g_level.h @@ -477,8 +477,6 @@ int G_FinishTravel (); void G_DoLoadLevel (int position, bool autosave, bool newGame); -void G_InitLevelLocals (void); - void G_AirControlChanged (); cluster_info_t *FindClusterInfo (int cluster); diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 3fb9b3d12..63c6be177 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -171,6 +171,7 @@ struct FLevelLocals : public FLevelData int GetConversation(FName classname); void SetConversation(int convid, PClassActor *Class, int dlgindex); int FindNode (const FStrifeDialogueNode *node); + void Init(); private: line_t *FindPortalDestination(line_t *src, int tag); From 10feb446fab5fc362119993178c3021ef36fd51d Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 26 Jan 2019 08:28:45 +0100 Subject: [PATCH 021/164] - made most of the EV_* functions part of FLevelLocals. --- src/fragglescript/t_func.cpp | 14 +- src/g_levellocals.h | 23 ++ src/p_acs.cpp | 4 +- src/p_ceiling.cpp | 47 ++-- src/p_doors.cpp | 20 +- src/p_enemy.cpp | 39 +-- src/p_floor.cpp | 87 +++---- src/p_lnspec.cpp | 228 +++++++++--------- src/p_pillar.cpp | 10 +- src/p_plats.cpp | 50 ++-- src/p_spec.h | 95 ++------ wadsrc/static/zscript/base.txt | 14 +- .../static/zscript/strife/thingstoblowup.txt | 2 +- 13 files changed, 282 insertions(+), 351 deletions(-) diff --git a/src/fragglescript/t_func.cpp b/src/fragglescript/t_func.cpp index 4e087519c..00162b3a4 100644 --- a/src/fragglescript/t_func.cpp +++ b/src/fragglescript/t_func.cpp @@ -1586,7 +1586,7 @@ void FParser::SF_MoveFloor(void) auto itr = Level->GetSectorTagIterator(tagnum); while ((secnum = itr.Next()) >= 0) { - P_CreateFloor(&Level->sectors[secnum], DFloor::floorMoveToValue, NULL, platspeed, destheight, crush, 0, false, false); + Level->CreateFloor(&Level->sectors[secnum], DFloor::floorMoveToValue, NULL, platspeed, destheight, crush, 0, false, false); } } } @@ -1678,7 +1678,7 @@ void FParser::SF_MoveCeiling(void) auto itr = Level->GetSectorTagIterator(tagnum); while ((secnum = itr.Next()) >= 0) { - P_CreateCeiling(&Level->sectors[secnum], DCeiling::ceilMoveToValue, NULL, tagnum, platspeed, platspeed, destheight, crush, silent | 4, 0, DCeiling::ECrushMode::crushDoom); + Level->CreateCeiling(&Level->sectors[secnum], DCeiling::ceilMoveToValue, NULL, tagnum, platspeed, platspeed, destheight, crush, silent | 4, 0, DCeiling::ECrushMode::crushDoom); } } } @@ -2015,7 +2015,7 @@ void FParser::SF_OpenDoor(void) if(t_argc > 2) speed = intvalue(t_argv[2]); else speed = 1; // 1= normal speed - EV_DoDoor(wait_time ? DDoor::doorRaise : DDoor::doorOpen, NULL, NULL, sectag, 2. * clamp(speed, 1, 127), wait_time, 0, 0); + Level->EV_DoDoor(wait_time ? DDoor::doorRaise : DDoor::doorOpen, NULL, NULL, sectag, 2. * clamp(speed, 1, 127), wait_time, 0, 0); } } @@ -2040,7 +2040,7 @@ void FParser::SF_CloseDoor(void) if(t_argc > 1) speed = intvalue(t_argv[1]); else speed = 1; // 1= normal speed - EV_DoDoor(DDoor::doorClose, NULL, NULL, sectag, 2.*clamp(speed, 1, 127), 0, 0, 0); + Level->EV_DoDoor(DDoor::doorClose, NULL, NULL, sectag, 2.*clamp(speed, 1, 127), 0, 0, 0); } } @@ -3617,8 +3617,8 @@ void FParser::SF_ThingCount(void) // If we want to count map items we must consider actor replacement pClass = pClass->GetReplacement(); -again: - TThinkerIterator it; + again: + auto it = Level->GetThinkerIterator(); if (t_argc<2 || intvalue(t_argv[1])==0 || pClass->IsDescendantOf(NAME_Inventory)) { @@ -3759,7 +3759,7 @@ void FParser::SF_KillInSector() { if (CheckArgs(1)) { - TThinkerIterator it; + auto it = Level->GetThinkerIterator(); AActor * mo; int tag=intvalue(t_argv[0]); diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 63c6be177..f8b90b858 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -45,6 +45,7 @@ #include "po_man.h" #include "p_acs.h" #include "p_tags.h" +#include "p_spec.h" #include "actor.h" #include "p_destructible.h" #include "r_data/r_sections.h" @@ -192,6 +193,28 @@ public: DVector2 GetPortalOffsetPosition(double x, double y, double dx, double dy); bool CollectConnectedGroups(int startgroup, const DVector3 &position, double upperz, double checkradius, FPortalGroupArray &out); + void ActivateInStasisPlat(int tag); + bool CreateCeiling(sector_t *sec, DCeiling::ECeiling type, line_t *line, int tag, double speed, double speed2, double height, int crush, int silent, int change, DCeiling::ECrushMode hexencrush); + void ActivateInStasisCeiling(int tag); + bool CreateFloor(sector_t *sec, DFloor::EFloor floortype, line_t *line, double speed, double height, int crush, int change, bool hexencrush, bool hereticlower); + + bool EV_DoPlat(int tag, line_t *line, DPlat::EPlatType type, double height, double speed, int delay, int lip, int change); + void EV_StopPlat(int tag, bool remove); + bool EV_DoPillar(DPillar::EPillar type, line_t *line, int tag, double speed, double height, double height2, int crush, bool hexencrush); + bool EV_DoDoor(DDoor::EVlDoor type, line_t *line, AActor *thing, int tag, double speed, int delay, int lock, int lightTag, bool boomgen = false, int topcountdown = 0); + bool EV_SlidingDoor(line_t *line, AActor *thing, int tag, int speed, int delay, DAnimatedDoor::EADType type); + bool EV_DoCeiling(DCeiling::ECeiling type, line_t *line, int tag, double speed, double speed2, double height, int crush, int silent, int change, DCeiling::ECrushMode hexencrush = DCeiling::ECrushMode::crushDoom); + bool EV_CeilingCrushStop(int tag, bool remove); + bool EV_StopCeiling(int tag, line_t *line); + bool EV_BuildStairs(int tag, DFloor::EStair type, line_t *line, double stairsize, double speed, int delay, int reset, int igntxt, int usespecials); + bool EV_DoFloor(DFloor::EFloor floortype, line_t *line, int tag, double speed, double height, int crush, int change, bool hexencrush, bool hereticlower = false); + bool EV_FloorCrushStop(int tag, line_t *line); + bool EV_StopFloor(int tag, line_t *line); + bool EV_DoDonut(int tag, line_t *line, double pillarspeed, double slimespeed); + bool EV_DoElevator(line_t *line, DElevator::EElevator type, double speed, double height, int tag); + bool EV_StartWaggle(int tag, line_t *line, int height, int speed, int offset, int timer, bool ceiling); + bool EV_DoChange(line_t *line, EChange changetype, int tag); + private: // Work data for CollectConnectedGroups. FPortalBits processMask; diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 0063059fd..0cdaad45b 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -3626,7 +3626,7 @@ do_count: } else { - TThinkerIterator iterator; + auto iterator = Level->GetThinkerIterator(); while ( (actor = iterator.Next ()) ) { if (actor->health > 0 && @@ -9340,7 +9340,7 @@ scriptwait: case PCD_CANCELFADE: { - TThinkerIterator iterator; + auto iterator = Level->GetThinkerIterator(); DFlashFader *fader; while ( (fader = iterator.Next()) ) diff --git a/src/p_ceiling.cpp b/src/p_ceiling.cpp index 976cc45b4..99744de51 100644 --- a/src/p_ceiling.cpp +++ b/src/p_ceiling.cpp @@ -47,10 +47,6 @@ IMPLEMENT_CLASS(DCeiling, false, false) -DCeiling::DCeiling () -{ -} - //============================================================================ // // @@ -235,7 +231,7 @@ DCeiling::DCeiling (sector_t *sec, double speed1, double speed2, int silent) // //============================================================================ -bool P_CreateCeiling(sector_t *sec, DCeiling::ECeiling type, line_t *line, int tag, +bool FLevelLocals::CreateCeiling(sector_t *sec, DCeiling::ECeiling type, line_t *line, int tag, double speed, double speed2, double height, int crush, int silent, int change, DCeiling::ECrushMode hexencrush) { @@ -465,9 +461,9 @@ bool P_CreateCeiling(sector_t *sec, DCeiling::ECeiling type, line_t *line, int t return ceiling != NULL; } -DEFINE_ACTION_FUNCTION(DCeiling, CreateCeiling) +DEFINE_ACTION_FUNCTION(FLevelLocals, CreateCeiling) { - PARAM_PROLOGUE; + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); PARAM_POINTER_NOT_NULL(sec, sector_t); PARAM_INT(type); PARAM_POINTER(ln, line_t); @@ -478,7 +474,7 @@ DEFINE_ACTION_FUNCTION(DCeiling, CreateCeiling) PARAM_INT(silent); PARAM_INT(change); PARAM_INT(crushmode); - ACTION_RETURN_BOOL(P_CreateCeiling(sec, (DCeiling::ECeiling)type, ln, 0, speed, speed2, height, crush, silent, change, (DCeiling::ECrushMode)crushmode)); + ACTION_RETURN_BOOL(self->CreateCeiling(sec, (DCeiling::ECeiling)type, ln, 0, speed, speed2, height, crush, silent, change, (DCeiling::ECrushMode)crushmode)); } //============================================================================ @@ -490,7 +486,7 @@ DEFINE_ACTION_FUNCTION(DCeiling, CreateCeiling) // //============================================================================ -bool EV_DoCeiling (DCeiling::ECeiling type, line_t *line, +bool FLevelLocals::EV_DoCeiling (DCeiling::ECeiling type, line_t *line, int tag, double speed, double speed2, double height, int crush, int silent, int change, DCeiling::ECrushMode hexencrush) { @@ -508,22 +504,22 @@ bool EV_DoCeiling (DCeiling::ECeiling type, line_t *line, secnum = sec->sectornum; // [RH] Hack to let manual crushers be retriggerable, too tag ^= secnum | 0x1000000; - P_ActivateInStasisCeiling (tag); - return P_CreateCeiling(sec, type, line, tag, speed, speed2, height, crush, silent, change, hexencrush); + ActivateInStasisCeiling (tag); + return CreateCeiling(sec, type, line, tag, speed, speed2, height, crush, silent, change, hexencrush); } // Reactivate in-stasis ceilings...for certain types. // This restarts a crusher after it has been stopped if (type == DCeiling::ceilCrushAndRaise) { - P_ActivateInStasisCeiling (tag); + ActivateInStasisCeiling (tag); } // affects all sectors with the same tag as the linedef - auto it = level.GetSectorTagIterator(tag); + auto it = GetSectorTagIterator(tag); while ((secnum = it.Next()) >= 0) { - rtn |= P_CreateCeiling(&level.sectors[secnum], type, line, tag, speed, speed2, height, crush, silent, change, hexencrush); + rtn |= CreateCeiling(§ors[secnum], type, line, tag, speed, speed2, height, crush, silent, change, hexencrush); } return rtn; } @@ -536,10 +532,10 @@ bool EV_DoCeiling (DCeiling::ECeiling type, line_t *line, // //============================================================================ -void P_ActivateInStasisCeiling (int tag) +void FLevelLocals::ActivateInStasisCeiling (int tag) { DCeiling *scan; - TThinkerIterator iterator; + auto iterator = GetThinkerIterator(); while ( (scan = iterator.Next ()) ) { @@ -559,13 +555,12 @@ void P_ActivateInStasisCeiling (int tag) // //============================================================================ -bool EV_CeilingCrushStop (int tag, bool remove) +bool FLevelLocals::EV_CeilingCrushStop (int tag, bool remove) { bool rtn = false; - DCeiling *scan; - TThinkerIterator iterator; + auto iterator = GetThinkerIterator(); - scan = iterator.Next(); + auto scan = iterator.Next(); while (scan != nullptr) { DCeiling *next = iterator.Next(); @@ -589,17 +584,17 @@ bool EV_CeilingCrushStop (int tag, bool remove) return rtn; } -bool EV_StopCeiling(int tag, line_t *line) +bool FLevelLocals::EV_StopCeiling(int tag, line_t *line) { int sec; - auto it = level.GetSectorTagIterator(tag, line); + auto it = GetSectorTagIterator(tag, line); while ((sec = it.Next()) >= 0) { - if (level.sectors[sec].ceilingdata) + if (sectors[sec].ceilingdata) { - SN_StopSequence(&level.sectors[sec], CHAN_CEILING); - level.sectors[sec].ceilingdata->Destroy(); - level.sectors[sec].ceilingdata = nullptr; + SN_StopSequence(§ors[sec], CHAN_CEILING); + sectors[sec].ceilingdata->Destroy(); + sectors[sec].ceilingdata = nullptr; } } return true; diff --git a/src/p_doors.cpp b/src/p_doors.cpp index a90b73b31..2fbdd19f3 100644 --- a/src/p_doors.cpp +++ b/src/p_doors.cpp @@ -47,10 +47,6 @@ IMPLEMENT_CLASS(DDoor, false, false) -DDoor::DDoor () -{ -} - void DDoor::Serialize(FSerializer &arc) { Super::Serialize (arc); @@ -417,7 +413,7 @@ DDoor::DDoor (sector_t *sec, EVlDoor type, double speed, int delay, int lightTag // //============================================================================ -bool EV_DoDoor (DDoor::EVlDoor type, line_t *line, AActor *thing, +bool FLevelLocals::EV_DoDoor (DDoor::EVlDoor type, line_t *line, AActor *thing, int tag, double speed, int delay, int lock, int lightTag, bool boomgen, int topcountdown) { bool rtn = false; @@ -490,10 +486,10 @@ bool EV_DoDoor (DDoor::EVlDoor type, line_t *line, AActor *thing, else { // [RH] Remote door - auto it = level.GetSectorTagIterator(tag); + auto it = GetSectorTagIterator(tag); while ((secnum = it.Next()) >= 0) { - sec = &level.sectors[secnum]; + sec = §ors[secnum]; // if the ceiling is already moving, don't start the door action if (sec->PlaneMoving(sector_t::ceiling)) continue; @@ -514,10 +510,6 @@ bool EV_DoDoor (DDoor::EVlDoor type, line_t *line, AActor *thing, IMPLEMENT_CLASS(DAnimatedDoor, false, false) -DAnimatedDoor::DAnimatedDoor () -{ -} - DAnimatedDoor::DAnimatedDoor (sector_t *sec) : DMovingCeiling (sec, false) { @@ -748,7 +740,7 @@ DAnimatedDoor::DAnimatedDoor (sector_t *sec, line_t *line, int speed, int delay, // //============================================================================ -bool EV_SlidingDoor (line_t *line, AActor *actor, int tag, int speed, int delay, DAnimatedDoor::EADType type) +bool FLevelLocals::EV_SlidingDoor (line_t *line, AActor *actor, int tag, int speed, int delay, DAnimatedDoor::EADType type) { sector_t *sec; int secnum; @@ -787,10 +779,10 @@ bool EV_SlidingDoor (line_t *line, AActor *actor, int tag, int speed, int delay, return false; } - auto it = level.GetSectorTagIterator(tag); + auto it = GetSectorTagIterator(tag); while ((secnum = it.Next()) >= 0) { - sec = &level.sectors[secnum]; + sec = §ors[secnum]; if (sec->ceilingdata != NULL) { continue; diff --git a/src/p_enemy.cpp b/src/p_enemy.cpp index 8550eb7b6..773313323 100644 --- a/src/p_enemy.cpp +++ b/src/p_enemy.cpp @@ -3074,9 +3074,10 @@ void A_BossDeath(AActor *self) // Do generic special death actions first bool checked = false; - for (unsigned i = 0; i < level.info->specialactions.Size(); i++) + auto Level = &level; + for (unsigned i = 0; i < Level->info->specialactions.Size(); i++) { - FSpecialAction *sa = &level.info->specialactions[i]; + FSpecialAction *sa = &Level->info->specialactions[i]; if (type == sa->Type || mytype == sa->Type) { @@ -3094,7 +3095,7 @@ void A_BossDeath(AActor *self) // [RH] These all depend on the presence of level flags now // rather than being hard-coded to specific levels/episodes. - if ((level.flags & (LEVEL_MAP07SPECIAL| + if ((Level->flags & (LEVEL_MAP07SPECIAL| LEVEL_BRUISERSPECIAL| LEVEL_CYBORGSPECIAL| LEVEL_SPIDERSPECIAL| @@ -3104,13 +3105,13 @@ void A_BossDeath(AActor *self) return; if ((i_compatflags & COMPATF_ANYBOSSDEATH) || ( // [GZ] Added for UAC_DEAD - ((level.flags & LEVEL_MAP07SPECIAL) && (type == NAME_Fatso || type == NAME_Arachnotron)) || - ((level.flags & LEVEL_BRUISERSPECIAL) && (type == NAME_BaronOfHell)) || - ((level.flags & LEVEL_CYBORGSPECIAL) && (type == NAME_Cyberdemon)) || - ((level.flags & LEVEL_SPIDERSPECIAL) && (type == NAME_SpiderMastermind)) || - ((level.flags & LEVEL_HEADSPECIAL) && (type == NAME_Ironlich)) || - ((level.flags & LEVEL_MINOTAURSPECIAL) && (type == NAME_Minotaur)) || - ((level.flags & LEVEL_SORCERER2SPECIAL) && (type == NAME_Sorcerer2)) + ((Level->flags & LEVEL_MAP07SPECIAL) && (type == NAME_Fatso || type == NAME_Arachnotron)) || + ((Level->flags & LEVEL_BRUISERSPECIAL) && (type == NAME_BaronOfHell)) || + ((Level->flags & LEVEL_CYBORGSPECIAL) && (type == NAME_Cyberdemon)) || + ((Level->flags & LEVEL_SPIDERSPECIAL) && (type == NAME_SpiderMastermind)) || + ((Level->flags & LEVEL_HEADSPECIAL) && (type == NAME_Ironlich)) || + ((Level->flags & LEVEL_MINOTAURSPECIAL) && (type == NAME_Minotaur)) || + ((Level->flags & LEVEL_SORCERER2SPECIAL) && (type == NAME_Sorcerer2)) )) ; else @@ -3122,43 +3123,43 @@ void A_BossDeath(AActor *self) } // victory! - if (level.flags & LEVEL_SPECKILLMONSTERS) + if (Level->flags & LEVEL_SPECKILLMONSTERS) { // Kill any remaining monsters P_Massacre (); } - if (level.flags & LEVEL_MAP07SPECIAL) + if (Level->flags & LEVEL_MAP07SPECIAL) { if (type == NAME_Fatso) { - EV_DoFloor (DFloor::floorLowerToLowest, NULL, 666, 1., 0, -1, 0, false); + Level->EV_DoFloor (DFloor::floorLowerToLowest, NULL, 666, 1., 0, -1, 0, false); return; } if (type == NAME_Arachnotron) { - EV_DoFloor (DFloor::floorRaiseByTexture, NULL, 667, 1., 0, -1, 0, false); + Level->EV_DoFloor (DFloor::floorRaiseByTexture, NULL, 667, 1., 0, -1, 0, false); return; } } else { - switch (level.flags & LEVEL_SPECACTIONSMASK) + switch (Level->flags & LEVEL_SPECACTIONSMASK) { case LEVEL_SPECLOWERFLOOR: - EV_DoFloor (DFloor::floorLowerToLowest, NULL, 666, 1., 0, -1, 0, false); + Level->EV_DoFloor (DFloor::floorLowerToLowest, NULL, 666, 1., 0, -1, 0, false); return; case LEVEL_SPECLOWERFLOORTOHIGHEST: - EV_DoFloor (DFloor::floorLowerToHighest, NULL, 666, 1., 0, -1, 0, false); + Level->EV_DoFloor (DFloor::floorLowerToHighest, NULL, 666, 1., 0, -1, 0, false); return; case LEVEL_SPECOPENDOOR: - EV_DoDoor (DDoor::doorOpen, NULL, NULL, 666, 8., 0, 0, 0); + Level->EV_DoDoor (DDoor::doorOpen, NULL, NULL, 666, 8., 0, 0, 0); return; } } - // [RH] If noexit, then don't end the level. + // [RH] If noexit, then don't end the Level-> if ((deathmatch || alwaysapplydmflags) && (dmflags & DF_NO_EXIT)) return; diff --git a/src/p_floor.cpp b/src/p_floor.cpp index cfcfbe4d5..c818670d3 100644 --- a/src/p_floor.cpp +++ b/src/p_floor.cpp @@ -73,10 +73,6 @@ static void StartFloorSound (sector_t *sec) IMPLEMENT_CLASS(DFloor, false, false) -DFloor::DFloor () -{ -} - void DFloor::Serialize(FSerializer &arc) { Super::Serialize (arc); @@ -270,7 +266,7 @@ DFloor::DFloor (sector_t *sec) // //========================================================================== -bool P_CreateFloor(sector_t *sec, DFloor::EFloor floortype, line_t *line, +bool FLevelLocals::CreateFloor(sector_t *sec, DFloor::EFloor floortype, line_t *line, double speed, double height, int crush, int change, bool hexencrush, bool hereticlower) { bool rtn; @@ -502,9 +498,9 @@ bool P_CreateFloor(sector_t *sec, DFloor::EFloor floortype, line_t *line, return true; } -DEFINE_ACTION_FUNCTION(DFloor, CreateFloor) +DEFINE_ACTION_FUNCTION(FLevelLocals, CreateFloor) { - PARAM_PROLOGUE; + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); PARAM_POINTER_NOT_NULL(sec, sector_t); PARAM_INT(floortype); PARAM_POINTER(ln, line_t); @@ -514,7 +510,7 @@ DEFINE_ACTION_FUNCTION(DFloor, CreateFloor) PARAM_INT(change); PARAM_BOOL(hereticlower); PARAM_BOOL(hexencrush); - ACTION_RETURN_BOOL(P_CreateFloor(sec, (DFloor::EFloor)floortype, ln, speed, height, crush, change, hexencrush, hereticlower)); + ACTION_RETURN_BOOL(self->CreateFloor(sec, (DFloor::EFloor)floortype, ln, speed, height, crush, change, hexencrush, hereticlower)); } //========================================================================== @@ -525,17 +521,17 @@ DEFINE_ACTION_FUNCTION(DFloor, CreateFloor) // //========================================================================== -bool EV_DoFloor (DFloor::EFloor floortype, line_t *line, int tag, +bool FLevelLocals::EV_DoFloor (DFloor::EFloor floortype, line_t *line, int tag, double speed, double height, int crush, int change, bool hexencrush, bool hereticlower) { int secnum; bool rtn = false; // check if a manual trigger; if so do just the sector on the backside - auto it = level.GetSectorTagIterator(tag, line); + auto it = GetSectorTagIterator(tag, line); while ((secnum = it.Next()) >= 0) { - rtn |= P_CreateFloor(&level.sectors[secnum], floortype, line, speed, height, crush, change, hexencrush, hereticlower); + rtn |= CreateFloor(§ors[secnum], floortype, line, speed, height, crush, change, hexencrush, hereticlower); } return rtn; } @@ -548,13 +544,13 @@ bool EV_DoFloor (DFloor::EFloor floortype, line_t *line, int tag, // //========================================================================== -bool EV_FloorCrushStop (int tag, line_t *line) +bool FLevelLocals::EV_FloorCrushStop (int tag, line_t *line) { int secnum; - auto it = level.GetSectorTagIterator(tag, line); + auto it = GetSectorTagIterator(tag, line); while ((secnum = it.Next()) >= 0) { - sector_t *sec = &level.sectors[secnum]; + sector_t *sec = §ors[secnum]; if (sec->floordata && sec->floordata->IsKindOf (RUNTIME_CLASS(DFloor)) && barrier_cast(sec->floordata)->m_Type == DFloor::floorRaiseAndCrush) @@ -568,17 +564,17 @@ bool EV_FloorCrushStop (int tag, line_t *line) } // same as above but stops any floor mover that was active on the given sector. -bool EV_StopFloor(int tag, line_t *line) +bool FLevelLocals::EV_StopFloor(int tag, line_t *line) { int sec; - auto it = level.GetSectorTagIterator(tag, line); + auto it = GetSectorTagIterator(tag, line); while ((sec = it.Next()) >= 0) { - if (level.sectors[sec].floordata) + if (sectors[sec].floordata) { - SN_StopSequence(&level.sectors[sec], CHAN_FLOOR); - level.sectors[sec].floordata->Destroy(); - level.sectors[sec].floordata = nullptr; + SN_StopSequence(§ors[sec], CHAN_FLOOR); + sectors[sec].floordata->Destroy(); + sectors[sec].floordata = nullptr; } } return true; @@ -593,9 +589,7 @@ bool EV_StopFloor(int tag, line_t *line) // //========================================================================== -bool EV_BuildStairs (int tag, DFloor::EStair type, line_t *line, - double stairsize, double speed, int delay, int reset, int igntxt, - int usespecials) +bool FLevelLocals::EV_BuildStairs (int tag, DFloor::EStair type, line_t *line, double stairsize, double speed, int delay, int reset, int igntxt, int usespecials) { int secnum = -1; int osecnum; //jff 3/4/98 save old loop index @@ -619,13 +613,13 @@ bool EV_BuildStairs (int tag, DFloor::EStair type, line_t *line, persteptime = int(stairsize / speed); // check if a manual trigger, if so do just the sector on the backside - auto itr = level.GetSectorTagIterator(tag, line); + auto itr = GetSectorTagIterator(tag, line); // The compatibility mode doesn't work with a hashing algorithm. // It needs the original linear search method. This was broken in Boom. bool compatible = tag != 0 && (i_compatflags & COMPATF_STAIRINDEX); while ((secnum = itr.NextCompat(compatible, secnum)) >= 0) { - sec = &level.sectors[secnum]; + sec = §ors[secnum]; // ALREADY MOVING? IF SO, KEEP GOING... //jff 2/26/98 add special lockout condition to wait for entire @@ -770,7 +764,7 @@ bool EV_BuildStairs (int tag, DFloor::EStair type, line_t *line, } while (ok); // [RH] make sure the first sector doesn't point to a previous one, otherwise // it can infinite loop when the first sector stops moving. - level.sectors[osecnum].prevsec = -1; + sectors[osecnum].prevsec = -1; } return rtn; } @@ -781,7 +775,7 @@ bool EV_BuildStairs (int tag, DFloor::EStair type, line_t *line, // //========================================================================== -bool EV_DoDonut (int tag, line_t *line, double pillarspeed, double slimespeed) +bool FLevelLocals::EV_DoDonut (int tag, line_t *line, double pillarspeed, double slimespeed) { sector_t* s1; sector_t* s2; @@ -794,10 +788,10 @@ bool EV_DoDonut (int tag, line_t *line, double pillarspeed, double slimespeed) rtn = false; - auto itr = level.GetSectorTagIterator(tag, line); + auto itr = GetSectorTagIterator(tag, line); while ((secnum = itr.Next()) >= 0) { - s1 = &level.sectors[secnum]; // s1 is pillar's sector + s1 = §ors[secnum]; // s1 is pillar's sector // ALREADY MOVING? IF SO, KEEP GOING... if (s1->PlaneMoving(sector_t::floor)) @@ -864,10 +858,6 @@ IMPLEMENT_POINTERS_START(DElevator) IMPLEMENT_POINTER(m_Interp_Ceiling) IMPLEMENT_POINTERS_END -DElevator::DElevator () -{ -} - DElevator::DElevator (sector_t *sec) : Super (sec) { @@ -994,7 +984,7 @@ void DElevator::StartFloorSound () // //========================================================================== -bool EV_DoElevator (line_t *line, DElevator::EElevator elevtype, +bool FLevelLocals::EV_DoElevator (line_t *line, DElevator::EElevator elevtype, double speed, double height, int tag) { int secnum; @@ -1011,12 +1001,12 @@ bool EV_DoElevator (line_t *line, DElevator::EElevator elevtype, secnum = -1; rtn = false; - auto itr = level.GetSectorTagIterator(tag, line); + auto itr = GetSectorTagIterator(tag, line); // act on all sectors with the same tag as the triggering linedef while ((secnum = itr.Next()) >= 0) { - sec = &level.sectors[secnum]; + sec = §ors[secnum]; // If either floor or ceiling is already activated, skip it if (sec->PlaneMoving(sector_t::floor) || sec->ceilingdata) //jff 2/22/98 continue; // the loop used to break at the end if tag were 0, but would miss that step if "continue" occured [FDARI] @@ -1097,7 +1087,7 @@ bool EV_DoElevator (line_t *line, DElevator::EElevator elevtype, // //========================================================================== -bool EV_DoChange (line_t *line, EChange changetype, int tag) +bool FLevelLocals::EV_DoChange (line_t *line, EChange changetype, int tag) { int secnum; bool rtn; @@ -1106,10 +1096,10 @@ bool EV_DoChange (line_t *line, EChange changetype, int tag) rtn = false; // change all sectors with the same tag as the linedef - auto it = level.GetSectorTagIterator(tag); + auto it = GetSectorTagIterator(tag); while ((secnum = it.Next()) >= 0) { - sec = &level.sectors[secnum]; + sec = §ors[secnum]; rtn = true; @@ -1151,10 +1141,6 @@ IMPLEMENT_CLASS(DWaggleBase, false, false) IMPLEMENT_CLASS(DFloorWaggle, false, false) IMPLEMENT_CLASS(DCeilingWaggle, false, false) -DWaggleBase::DWaggleBase () -{ -} - void DWaggleBase::Serialize(FSerializer &arc) { Super::Serialize (arc); @@ -1266,10 +1252,6 @@ void DWaggleBase::DoWaggle (bool ceiling) // //========================================================================== -DFloorWaggle::DFloorWaggle () -{ -} - DFloorWaggle::DFloorWaggle (sector_t *sec) : Super (sec) { @@ -1288,10 +1270,6 @@ void DFloorWaggle::Tick () // //========================================================================== -DCeilingWaggle::DCeilingWaggle () -{ -} - DCeilingWaggle::DCeilingWaggle (sector_t *sec) : Super (sec) { @@ -1310,8 +1288,7 @@ void DCeilingWaggle::Tick () // //========================================================================== -bool EV_StartWaggle (int tag, line_t *line, int height, int speed, int offset, - int timer, bool ceiling) +bool FLevelLocals::EV_StartWaggle (int tag, line_t *line, int height, int speed, int offset, int timer, bool ceiling) { int sectorIndex; sector_t *sector; @@ -1320,11 +1297,11 @@ bool EV_StartWaggle (int tag, line_t *line, int height, int speed, int offset, retCode = false; - auto itr = level.GetSectorTagIterator(tag, line); + auto itr = GetSectorTagIterator(tag, line); while ((sectorIndex = itr.Next()) >= 0) { - sector = &level.sectors[sectorIndex]; + sector = §ors[sectorIndex]; if ((!ceiling && sector->PlaneMoving(sector_t::floor)) || (ceiling && sector->PlaneMoving(sector_t::ceiling))) { // Already busy with another thinker diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index e67ed311c..9d184d54f 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -237,19 +237,19 @@ FUNC(LS_Polyobj_Stop) FUNC(LS_Door_Close) // Door_Close (tag, speed, lighttag) { - return EV_DoDoor (DDoor::doorClose, ln, it, arg0, SPEED(arg1), 0, 0, arg2); + return Level->EV_DoDoor (DDoor::doorClose, ln, it, arg0, SPEED(arg1), 0, 0, arg2); } FUNC(LS_Door_Open) // Door_Open (tag, speed, lighttag) { - return EV_DoDoor (DDoor::doorOpen, ln, it, arg0, SPEED(arg1), 0, 0, arg2); + return Level->EV_DoDoor (DDoor::doorOpen, ln, it, arg0, SPEED(arg1), 0, 0, arg2); } FUNC(LS_Door_Raise) // Door_Raise (tag, speed, delay, lighttag) { - return EV_DoDoor (DDoor::doorRaise, ln, it, arg0, SPEED(arg1), TICS(arg2), 0, arg3); + return Level->EV_DoDoor (DDoor::doorRaise, ln, it, arg0, SPEED(arg1), TICS(arg2), 0, arg3); } FUNC(LS_Door_LockedRaise) @@ -258,9 +258,9 @@ FUNC(LS_Door_LockedRaise) #if 0 // In Hexen this originally created a thinker running for nearly 4 years. // Let's not do this unless it becomes necessary because this can hang tagwait. - return EV_DoDoor (arg2 || (Level->flags2 & LEVEL2_HEXENHACK) ? DDoor::doorRaise : DDoor::doorOpen, ln, it, + return Level->EV_DoDoor (arg2 || (Level->flags2 & LEVEL2_HEXENHACK) ? DDoor::doorRaise : DDoor::doorOpen, ln, it, #else - return EV_DoDoor (arg2 ? DDoor::doorRaise : DDoor::doorOpen, ln, it, + return Level->EV_DoDoor (arg2 ? DDoor::doorRaise : DDoor::doorOpen, ln, it, #endif arg0, SPEED(arg1), TICS(arg2), arg3, arg4); } @@ -268,19 +268,19 @@ FUNC(LS_Door_LockedRaise) FUNC(LS_Door_CloseWaitOpen) // Door_CloseWaitOpen (tag, speed, delay, lighttag) { - return EV_DoDoor (DDoor::doorCloseWaitOpen, ln, it, arg0, SPEED(arg1), OCTICS(arg2), 0, arg3); + return Level->EV_DoDoor (DDoor::doorCloseWaitOpen, ln, it, arg0, SPEED(arg1), OCTICS(arg2), 0, arg3); } FUNC(LS_Door_WaitRaise) // Door_WaitRaise(tag, speed, delay, wait, lighttag) { - return EV_DoDoor(DDoor::doorWaitRaise, ln, it, arg0, SPEED(arg1), TICS(arg2), 0, arg4, false, TICS(arg3)); + return Level->EV_DoDoor(DDoor::doorWaitRaise, ln, it, arg0, SPEED(arg1), TICS(arg2), 0, arg4, false, TICS(arg3)); } FUNC(LS_Door_WaitClose) // Door_WaitRaise(tag, speed, wait, lighttag) { - return EV_DoDoor(DDoor::doorWaitClose, ln, it, arg0, SPEED(arg1), 0, 0, arg3, false, TICS(arg2)); + return Level->EV_DoDoor(DDoor::doorWaitClose, ln, it, arg0, SPEED(arg1), 0, 0, arg3, false, TICS(arg2)); } FUNC(LS_Door_Animated) @@ -289,13 +289,13 @@ FUNC(LS_Door_Animated) if (arg3 != 0 && !P_CheckKeys (it, arg3, arg0 != 0)) return false; - return EV_SlidingDoor (ln, it, arg0, arg1, arg2, DAnimatedDoor::adOpenClose); + return Level->EV_SlidingDoor (ln, it, arg0, arg1, arg2, DAnimatedDoor::adOpenClose); } FUNC(LS_Door_AnimatedClose) // Door_AnimatedClose (tag, speed) { - return EV_SlidingDoor(ln, it, arg0, arg1, -1, DAnimatedDoor::adClose); + return Level->EV_SlidingDoor(ln, it, arg0, arg1, -1, DAnimatedDoor::adClose); } FUNC(LS_Generic_Door) @@ -326,203 +326,203 @@ FUNC(LS_Generic_Door) tag = arg0; lightTag = 0; } - return EV_DoDoor (type, ln, it, tag, SPEED(arg1), OCTICS(arg3), arg4, lightTag, boomgen); + return Level->EV_DoDoor (type, ln, it, tag, SPEED(arg1), OCTICS(arg3), arg4, lightTag, boomgen); } FUNC(LS_Floor_LowerByValue) // Floor_LowerByValue (tag, speed, height, change) { - return EV_DoFloor (DFloor::floorLowerByValue, ln, arg0, SPEED(arg1), arg2, -1, CHANGE(arg3), false); + return Level->EV_DoFloor (DFloor::floorLowerByValue, ln, arg0, SPEED(arg1), arg2, -1, CHANGE(arg3), false); } FUNC(LS_Floor_LowerToLowest) // Floor_LowerToLowest (tag, speed, change) { - return EV_DoFloor (DFloor::floorLowerToLowest, ln, arg0, SPEED(arg1), 0, -1, CHANGE(arg2), false); + return Level->EV_DoFloor (DFloor::floorLowerToLowest, ln, arg0, SPEED(arg1), 0, -1, CHANGE(arg2), false); } FUNC(LS_Floor_LowerToHighest) // Floor_LowerToHighest (tag, speed, adjust, hereticlower) { - return EV_DoFloor (DFloor::floorLowerToHighest, ln, arg0, SPEED(arg1), (arg2-128), -1, 0, false, arg3==1); + return Level->EV_DoFloor (DFloor::floorLowerToHighest, ln, arg0, SPEED(arg1), (arg2-128), -1, 0, false, arg3==1); } FUNC(LS_Floor_LowerToHighestEE) // Floor_LowerToHighestEE (tag, speed, change) { - return EV_DoFloor (DFloor::floorLowerToHighest, ln, arg0, SPEED(arg1), 0, -1, CHANGE(arg2), false); + return Level->EV_DoFloor (DFloor::floorLowerToHighest, ln, arg0, SPEED(arg1), 0, -1, CHANGE(arg2), false); } FUNC(LS_Floor_LowerToNearest) // Floor_LowerToNearest (tag, speed, change) { - return EV_DoFloor (DFloor::floorLowerToNearest, ln, arg0, SPEED(arg1), 0, -1, CHANGE(arg2), false); + return Level->EV_DoFloor (DFloor::floorLowerToNearest, ln, arg0, SPEED(arg1), 0, -1, CHANGE(arg2), false); } FUNC(LS_Floor_RaiseByValue) // Floor_RaiseByValue (tag, speed, height, change, crush) { - return EV_DoFloor (DFloor::floorRaiseByValue, ln, arg0, SPEED(arg1), arg2, CRUSH(arg4), CHANGE(arg3), true); + return Level->EV_DoFloor (DFloor::floorRaiseByValue, ln, arg0, SPEED(arg1), arg2, CRUSH(arg4), CHANGE(arg3), true); } FUNC(LS_Floor_RaiseToHighest) // Floor_RaiseToHighest (tag, speed, change, crush) { - return EV_DoFloor (DFloor::floorRaiseToHighest, ln, arg0, SPEED(arg1), 0, CRUSH(arg3), CHANGE(arg2), true); + return Level->EV_DoFloor (DFloor::floorRaiseToHighest, ln, arg0, SPEED(arg1), 0, CRUSH(arg3), CHANGE(arg2), true); } FUNC(LS_Floor_RaiseToNearest) // Floor_RaiseToNearest (tag, speed, change, crush) { - return EV_DoFloor (DFloor::floorRaiseToNearest, ln, arg0, SPEED(arg1), 0, CRUSH(arg3), CHANGE(arg2), true); + return Level->EV_DoFloor (DFloor::floorRaiseToNearest, ln, arg0, SPEED(arg1), 0, CRUSH(arg3), CHANGE(arg2), true); } FUNC(LS_Floor_RaiseToLowest) // Floor_RaiseToLowest (tag, change, crush) { // This is merely done for completeness as it's a rather pointless addition. - return EV_DoFloor (DFloor::floorRaiseToLowest, ln, arg0, 2., 0, CRUSH(arg3), CHANGE(arg2), true); + return Level->EV_DoFloor (DFloor::floorRaiseToLowest, ln, arg0, 2., 0, CRUSH(arg3), CHANGE(arg2), true); } FUNC(LS_Floor_RaiseAndCrush) // Floor_RaiseAndCrush (tag, speed, crush, crushmode) { - return EV_DoFloor (DFloor::floorRaiseAndCrush, ln, arg0, SPEED(arg1), 0, arg2, 0, CRUSHTYPE(arg3)); + return Level->EV_DoFloor (DFloor::floorRaiseAndCrush, ln, arg0, SPEED(arg1), 0, arg2, 0, CRUSHTYPE(arg3)); } FUNC(LS_Floor_RaiseAndCrushDoom) // Floor_RaiseAndCrushDoom (tag, speed, crush, crushmode) { - return EV_DoFloor (DFloor::floorRaiseAndCrushDoom, ln, arg0, SPEED(arg1), 0, arg2, 0, CRUSHTYPE(arg3)); + return Level->EV_DoFloor (DFloor::floorRaiseAndCrushDoom, ln, arg0, SPEED(arg1), 0, arg2, 0, CRUSHTYPE(arg3)); } FUNC(LS_Floor_RaiseByValueTimes8) // FLoor_RaiseByValueTimes8 (tag, speed, height, change, crush) { - return EV_DoFloor (DFloor::floorRaiseByValue, ln, arg0, SPEED(arg1), arg2*8, CRUSH(arg4), CHANGE(arg3), true); + return Level->EV_DoFloor (DFloor::floorRaiseByValue, ln, arg0, SPEED(arg1), arg2*8, CRUSH(arg4), CHANGE(arg3), true); } FUNC(LS_Floor_LowerByValueTimes8) // Floor_LowerByValueTimes8 (tag, speed, height, change) { - return EV_DoFloor (DFloor::floorLowerByValue, ln, arg0, SPEED(arg1), arg2*8, -1, CHANGE(arg3), false); + return Level->EV_DoFloor (DFloor::floorLowerByValue, ln, arg0, SPEED(arg1), arg2*8, -1, CHANGE(arg3), false); } FUNC(LS_Floor_CrushStop) // Floor_CrushStop (tag) { - return EV_FloorCrushStop (arg0, ln); + return Level->EV_FloorCrushStop (arg0, ln); } FUNC(LS_Floor_LowerInstant) // Floor_LowerInstant (tag, unused, height, change) { - return EV_DoFloor (DFloor::floorLowerInstant, ln, arg0, 0., arg2*8, -1, CHANGE(arg3), false); + return Level->EV_DoFloor (DFloor::floorLowerInstant, ln, arg0, 0., arg2*8, -1, CHANGE(arg3), false); } FUNC(LS_Floor_RaiseInstant) // Floor_RaiseInstant (tag, unused, height, change, crush) { - return EV_DoFloor (DFloor::floorRaiseInstant, ln, arg0, 0., arg2*8, CRUSH(arg4), CHANGE(arg3), true); + return Level->EV_DoFloor (DFloor::floorRaiseInstant, ln, arg0, 0., arg2*8, CRUSH(arg4), CHANGE(arg3), true); } FUNC(LS_Floor_ToCeilingInstant) // Floor_ToCeilingInstant (tag, change, crush, gap) { - return EV_DoFloor (DFloor::floorLowerToCeiling, ln, arg0, 0, arg3, CRUSH(arg2), CHANGE(arg1), true); + return Level->EV_DoFloor (DFloor::floorLowerToCeiling, ln, arg0, 0, arg3, CRUSH(arg2), CHANGE(arg1), true); } FUNC(LS_Floor_MoveToValueTimes8) // Floor_MoveToValueTimes8 (tag, speed, height, negative, change) { - return EV_DoFloor (DFloor::floorMoveToValue, ln, arg0, SPEED(arg1), + return Level->EV_DoFloor (DFloor::floorMoveToValue, ln, arg0, SPEED(arg1), arg2*8*(arg3?-1:1), -1, CHANGE(arg4), false); } FUNC(LS_Floor_MoveToValue) // Floor_MoveToValue (tag, speed, height, negative, change) { - return EV_DoFloor (DFloor::floorMoveToValue, ln, arg0, SPEED(arg1), + return Level->EV_DoFloor (DFloor::floorMoveToValue, ln, arg0, SPEED(arg1), arg2*(arg3?-1:1), -1, CHANGE(arg4), false); } FUNC(LS_Floor_MoveToValueAndCrush) // Floor_MoveToValueAndCrush (tag, speed, height, crush, crushmode) { - return EV_DoFloor(DFloor::floorMoveToValue, ln, arg0, SPEED(arg1), + return Level->EV_DoFloor(DFloor::floorMoveToValue, ln, arg0, SPEED(arg1), arg2, CRUSH(arg3) -1, 0, CRUSHTYPE(arg4), false); } FUNC(LS_Floor_RaiseToLowestCeiling) // Floor_RaiseToLowestCeiling (tag, speed, change, crush) { - return EV_DoFloor (DFloor::floorRaiseToLowestCeiling, ln, arg0, SPEED(arg1), 0, CRUSH(arg3), CHANGE(arg2), true); + return Level->EV_DoFloor (DFloor::floorRaiseToLowestCeiling, ln, arg0, SPEED(arg1), 0, CRUSH(arg3), CHANGE(arg2), true); } FUNC(LS_Floor_LowerToLowestCeiling) // Floor_LowerToLowestCeiling (tag, speed, change) { - return EV_DoFloor (DFloor::floorLowerToLowestCeiling, ln, arg0, SPEED(arg1), arg4, -1, CHANGE(arg2), true); + return Level->EV_DoFloor (DFloor::floorLowerToLowestCeiling, ln, arg0, SPEED(arg1), arg4, -1, CHANGE(arg2), true); } FUNC(LS_Floor_RaiseByTexture) // Floor_RaiseByTexture (tag, speed, change, crush) { - return EV_DoFloor (DFloor::floorRaiseByTexture, ln, arg0, SPEED(arg1), 0, CRUSH(arg3), CHANGE(arg2), true); + return Level->EV_DoFloor (DFloor::floorRaiseByTexture, ln, arg0, SPEED(arg1), 0, CRUSH(arg3), CHANGE(arg2), true); } FUNC(LS_Floor_LowerByTexture) // Floor_LowerByTexture (tag, speed, change, crush) { - return EV_DoFloor (DFloor::floorLowerByTexture, ln, arg0, SPEED(arg1), 0, -1, CHANGE(arg2), true); + return Level->EV_DoFloor (DFloor::floorLowerByTexture, ln, arg0, SPEED(arg1), 0, -1, CHANGE(arg2), true); } FUNC(LS_Floor_RaiseToCeiling) // Floor_RaiseToCeiling (tag, speed, change, crush, gap) { - return EV_DoFloor (DFloor::floorRaiseToCeiling, ln, arg0, SPEED(arg1), arg4, CRUSH(arg3), CHANGE(arg2), true); + return Level->EV_DoFloor (DFloor::floorRaiseToCeiling, ln, arg0, SPEED(arg1), arg4, CRUSH(arg3), CHANGE(arg2), true); } FUNC(LS_Floor_RaiseByValueTxTy) // Floor_RaiseByValueTxTy (tag, speed, height) { - return EV_DoFloor (DFloor::floorRaiseAndChange, ln, arg0, SPEED(arg1), arg2, -1, 0, false); + return Level->EV_DoFloor (DFloor::floorRaiseAndChange, ln, arg0, SPEED(arg1), arg2, -1, 0, false); } FUNC(LS_Floor_LowerToLowestTxTy) // Floor_LowerToLowestTxTy (tag, speed) { - return EV_DoFloor (DFloor::floorLowerAndChange, ln, arg0, SPEED(arg1), arg2, -1, 0, false); + return Level->EV_DoFloor (DFloor::floorLowerAndChange, ln, arg0, SPEED(arg1), arg2, -1, 0, false); } FUNC(LS_Floor_Waggle) // Floor_Waggle (tag, amplitude, frequency, delay, time) { - return EV_StartWaggle (arg0, ln, arg1, arg2, arg3, arg4, false); + return Level->EV_StartWaggle (arg0, ln, arg1, arg2, arg3, arg4, false); } FUNC(LS_Ceiling_Waggle) // Ceiling_Waggle (tag, amplitude, frequency, delay, time) { - return EV_StartWaggle (arg0, ln, arg1, arg2, arg3, arg4, true); + return Level->EV_StartWaggle (arg0, ln, arg1, arg2, arg3, arg4, true); } FUNC(LS_Floor_TransferTrigger) // Floor_TransferTrigger (tag) { - return EV_DoChange (ln, trigChangeOnly, arg0); + return Level->EV_DoChange (ln, trigChangeOnly, arg0); } FUNC(LS_Floor_TransferNumeric) // Floor_TransferNumeric (tag) { - return EV_DoChange (ln, numChangeOnly, arg0); + return Level->EV_DoChange (ln, numChangeOnly, arg0); } FUNC(LS_Floor_Donut) // Floor_Donut (pillartag, pillarspeed, slimespeed) { - return EV_DoDonut (arg0, ln, SPEED(arg1), SPEED(arg2)); + return Level->EV_DoDonut (arg0, ln, SPEED(arg1), SPEED(arg2)); } FUNC(LS_Generic_Floor) @@ -557,7 +557,7 @@ FUNC(LS_Generic_Floor) } } - return EV_DoFloor (type, ln, arg0, SPEED(arg1), arg2, + return Level->EV_DoFloor (type, ln, arg0, SPEED(arg1), arg2, (arg4 & 16) ? 20 : -1, arg4 & 7, false); } @@ -565,70 +565,70 @@ FUNC(LS_Generic_Floor) FUNC(LS_Floor_Stop) // Floor_Stop (tag) { - return EV_StopFloor(arg0, ln); + return Level->EV_StopFloor(arg0, ln); } FUNC(LS_Stairs_BuildDown) // Stair_BuildDown (tag, speed, height, delay, reset) { - return EV_BuildStairs (arg0, DFloor::buildDown, ln, + return Level->EV_BuildStairs (arg0, DFloor::buildDown, ln, arg2, SPEED(arg1), TICS(arg3), arg4, 0, DFloor::stairUseSpecials); } FUNC(LS_Stairs_BuildUp) // Stairs_BuildUp (tag, speed, height, delay, reset) { - return EV_BuildStairs (arg0, DFloor::buildUp, ln, + return Level->EV_BuildStairs (arg0, DFloor::buildUp, ln, arg2, SPEED(arg1), TICS(arg3), arg4, 0, DFloor::stairUseSpecials); } FUNC(LS_Stairs_BuildDownSync) // Stairs_BuildDownSync (tag, speed, height, reset) { - return EV_BuildStairs (arg0, DFloor::buildDown, ln, + return Level->EV_BuildStairs (arg0, DFloor::buildDown, ln, arg2, SPEED(arg1), 0, arg3, 0, DFloor::stairUseSpecials|DFloor::stairSync); } FUNC(LS_Stairs_BuildUpSync) // Stairs_BuildUpSync (tag, speed, height, reset) { - return EV_BuildStairs (arg0, DFloor::buildUp, ln, + return Level->EV_BuildStairs (arg0, DFloor::buildUp, ln, arg2, SPEED(arg1), 0, arg3, 0, DFloor::stairUseSpecials|DFloor::stairSync); } FUNC(LS_Stairs_BuildUpDoom) // Stairs_BuildUpDoom (tag, speed, height, delay, reset) { - return EV_BuildStairs (arg0, DFloor::buildUp, ln, + return Level->EV_BuildStairs (arg0, DFloor::buildUp, ln, arg2, SPEED(arg1), TICS(arg3), arg4, 0, 0); } FUNC(LS_Stairs_BuildUpDoomCrush) // Stairs_BuildUpDoom (tag, speed, height, delay, reset) { - return EV_BuildStairs(arg0, DFloor::buildUp, ln, + return Level->EV_BuildStairs(arg0, DFloor::buildUp, ln, arg2, SPEED(arg1), TICS(arg3), arg4, 0, DFloor::stairCrush); } FUNC(LS_Stairs_BuildDownDoom) // Stair_BuildDownDoom (tag, speed, height, delay, reset) { - return EV_BuildStairs (arg0, DFloor::buildDown, ln, + return Level->EV_BuildStairs (arg0, DFloor::buildDown, ln, arg2, SPEED(arg1), TICS(arg3), arg4, 0, 0); } FUNC(LS_Stairs_BuildDownDoomSync) // Stairs_BuildDownDoomSync (tag, speed, height, reset) { - return EV_BuildStairs (arg0, DFloor::buildDown, ln, + return Level->EV_BuildStairs (arg0, DFloor::buildDown, ln, arg2, SPEED(arg1), 0, arg3, 0, DFloor::stairSync); } FUNC(LS_Stairs_BuildUpDoomSync) // Stairs_BuildUpDoomSync (tag, speed, height, reset) { - return EV_BuildStairs (arg0, DFloor::buildUp, ln, + return Level->EV_BuildStairs (arg0, DFloor::buildUp, ln, arg2, SPEED(arg1), 0, arg3, 0, DFloor::stairSync); } @@ -637,7 +637,7 @@ FUNC(LS_Generic_Stairs) // Generic_Stairs (tag, speed, step, dir/igntxt, reset) { DFloor::EStair type = (arg3 & 1) ? DFloor::buildUp : DFloor::buildDown; - bool res = EV_BuildStairs (arg0, type, ln, + bool res = Level->EV_BuildStairs (arg0, type, ln, arg2, SPEED(arg1), 0, arg4, arg3 & 2, 0); if (res && ln && (ln->flags & ML_REPEAT_SPECIAL) && ln->special == Generic_Stairs) @@ -650,61 +650,61 @@ FUNC(LS_Generic_Stairs) FUNC(LS_Pillar_Build) // Pillar_Build (tag, speed, height) { - return EV_DoPillar (DPillar::pillarBuild, ln, arg0, SPEED(arg1), arg2, 0, -1, false); + return Level->EV_DoPillar (DPillar::pillarBuild, ln, arg0, SPEED(arg1), arg2, 0, -1, false); } FUNC(LS_Pillar_BuildAndCrush) // Pillar_BuildAndCrush (tag, speed, height, crush, crushtype) { - return EV_DoPillar (DPillar::pillarBuild, ln, arg0, SPEED(arg1), arg2, 0, arg3, CRUSHTYPE(arg4)); + return Level->EV_DoPillar (DPillar::pillarBuild, ln, arg0, SPEED(arg1), arg2, 0, arg3, CRUSHTYPE(arg4)); } FUNC(LS_Pillar_Open) // Pillar_Open (tag, speed, f_height, c_height) { - return EV_DoPillar (DPillar::pillarOpen, ln, arg0, SPEED(arg1), arg2, arg3, -1, false); + return Level->EV_DoPillar (DPillar::pillarOpen, ln, arg0, SPEED(arg1), arg2, arg3, -1, false); } FUNC(LS_Ceiling_LowerByValue) // Ceiling_LowerByValue (tag, speed, height, change, crush) { - return EV_DoCeiling (DCeiling::ceilLowerByValue, ln, arg0, SPEED(arg1), 0, arg2, CRUSH(arg4), 0, CHANGE(arg3)); + return Level->EV_DoCeiling (DCeiling::ceilLowerByValue, ln, arg0, SPEED(arg1), 0, arg2, CRUSH(arg4), 0, CHANGE(arg3)); } FUNC(LS_Ceiling_RaiseByValue) // Ceiling_RaiseByValue (tag, speed, height, change) { - return EV_DoCeiling (DCeiling::ceilRaiseByValue, ln, arg0, SPEED(arg1), 0, arg2, CRUSH(arg4), 0, CHANGE(arg3)); + return Level->EV_DoCeiling (DCeiling::ceilRaiseByValue, ln, arg0, SPEED(arg1), 0, arg2, CRUSH(arg4), 0, CHANGE(arg3)); } FUNC(LS_Ceiling_LowerByValueTimes8) // Ceiling_LowerByValueTimes8 (tag, speed, height, change, crush) { - return EV_DoCeiling (DCeiling::ceilLowerByValue, ln, arg0, SPEED(arg1), 0, arg2*8, -1, 0, CHANGE(arg3)); + return Level->EV_DoCeiling (DCeiling::ceilLowerByValue, ln, arg0, SPEED(arg1), 0, arg2*8, -1, 0, CHANGE(arg3)); } FUNC(LS_Ceiling_RaiseByValueTimes8) // Ceiling_RaiseByValueTimes8 (tag, speed, height, change) { - return EV_DoCeiling (DCeiling::ceilRaiseByValue, ln, arg0, SPEED(arg1), 0, arg2*8, -1, 0, CHANGE(arg3)); + return Level->EV_DoCeiling (DCeiling::ceilRaiseByValue, ln, arg0, SPEED(arg1), 0, arg2*8, -1, 0, CHANGE(arg3)); } FUNC(LS_Ceiling_CrushAndRaise) // Ceiling_CrushAndRaise (tag, speed, crush, crushtype) { - return EV_DoCeiling (DCeiling::ceilCrushAndRaise, ln, arg0, SPEED(arg1), SPEED(arg1)/2, 8, arg2, 0, 0, CRUSHTYPE(arg3, false)); + return Level->EV_DoCeiling (DCeiling::ceilCrushAndRaise, ln, arg0, SPEED(arg1), SPEED(arg1)/2, 8, arg2, 0, 0, CRUSHTYPE(arg3, false)); } FUNC(LS_Ceiling_LowerAndCrush) // Ceiling_LowerAndCrush (tag, speed, crush, crushtype) { - return EV_DoCeiling (DCeiling::ceilLowerAndCrush, ln, arg0, SPEED(arg1), SPEED(arg1), 8, arg2, 0, 0, CRUSHTYPE(arg3, arg1 == 8)); + return Level->EV_DoCeiling (DCeiling::ceilLowerAndCrush, ln, arg0, SPEED(arg1), SPEED(arg1), 8, arg2, 0, 0, CRUSHTYPE(arg3, arg1 == 8)); } FUNC(LS_Ceiling_LowerAndCrushDist) // Ceiling_LowerAndCrush (tag, speed, crush, dist, crushtype) { - return EV_DoCeiling (DCeiling::ceilLowerAndCrush, ln, arg0, SPEED(arg1), SPEED(arg1), arg3, arg2, 0, 0, CRUSHTYPE(arg4, arg1 == 8)); + return Level->EV_DoCeiling (DCeiling::ceilLowerAndCrush, ln, arg0, SPEED(arg1), SPEED(arg1), arg3, arg2, 0, 0, CRUSHTYPE(arg4, arg1 == 8)); } FUNC(LS_Ceiling_CrushStop) @@ -723,160 +723,160 @@ FUNC(LS_Ceiling_CrushStop) remove = gameinfo.gametype == GAME_Hexen; break; } - return EV_CeilingCrushStop (arg0, remove); + return Level->EV_CeilingCrushStop (arg0, remove); } FUNC(LS_Ceiling_CrushRaiseAndStay) // Ceiling_CrushRaiseAndStay (tag, speed, crush, crushtype) { - return EV_DoCeiling (DCeiling::ceilCrushRaiseAndStay, ln, arg0, SPEED(arg1), SPEED(arg1)/2, 8, arg2, 0, 0, CRUSHTYPE(arg3, false)); + return Level->EV_DoCeiling (DCeiling::ceilCrushRaiseAndStay, ln, arg0, SPEED(arg1), SPEED(arg1)/2, 8, arg2, 0, 0, CRUSHTYPE(arg3, false)); } FUNC(LS_Ceiling_MoveToValueTimes8) // Ceiling_MoveToValueTimes8 (tag, speed, height, negative, change) { - return EV_DoCeiling (DCeiling::ceilMoveToValue, ln, arg0, SPEED(arg1), 0, + return Level->EV_DoCeiling (DCeiling::ceilMoveToValue, ln, arg0, SPEED(arg1), 0, arg2*8*((arg3) ? -1 : 1), -1, 0, CHANGE(arg4)); } FUNC(LS_Ceiling_MoveToValue) // Ceiling_MoveToValue (tag, speed, height, negative, change) { - return EV_DoCeiling (DCeiling::ceilMoveToValue, ln, arg0, SPEED(arg1), 0, + return Level->EV_DoCeiling (DCeiling::ceilMoveToValue, ln, arg0, SPEED(arg1), 0, arg2*((arg3) ? -1 : 1), -1, 0, CHANGE(arg4)); } FUNC(LS_Ceiling_MoveToValueAndCrush) // Ceiling_MoveToValueAndCrush (tag, speed, height, crush, crushmode) { - return EV_DoCeiling (DCeiling::ceilMoveToValue, ln, arg0, SPEED(arg1), 0, + return Level->EV_DoCeiling (DCeiling::ceilMoveToValue, ln, arg0, SPEED(arg1), 0, arg2, CRUSH(arg3), 0, 0, CRUSHTYPE(arg4, arg1 == 8)); } FUNC(LS_Ceiling_LowerToHighestFloor) // Ceiling_LowerToHighestFloor (tag, speed, change, crush, gap) { - return EV_DoCeiling (DCeiling::ceilLowerToHighestFloor, ln, arg0, SPEED(arg1), 0, arg4, CRUSH(arg3), 0, CHANGE(arg2)); + return Level->EV_DoCeiling (DCeiling::ceilLowerToHighestFloor, ln, arg0, SPEED(arg1), 0, arg4, CRUSH(arg3), 0, CHANGE(arg2)); } FUNC(LS_Ceiling_LowerInstant) // Ceiling_LowerInstant (tag, unused, height, change, crush) { - return EV_DoCeiling (DCeiling::ceilLowerInstant, ln, arg0, 0, 0, arg2*8, CRUSH(arg4), 0, CHANGE(arg3)); + return Level->EV_DoCeiling (DCeiling::ceilLowerInstant, ln, arg0, 0, 0, arg2*8, CRUSH(arg4), 0, CHANGE(arg3)); } FUNC(LS_Ceiling_RaiseInstant) // Ceiling_RaiseInstant (tag, unused, height, change) { - return EV_DoCeiling (DCeiling::ceilRaiseInstant, ln, arg0, 0, 0, arg2*8, -1, 0, CHANGE(arg3)); + return Level->EV_DoCeiling (DCeiling::ceilRaiseInstant, ln, arg0, 0, 0, arg2*8, -1, 0, CHANGE(arg3)); } FUNC(LS_Ceiling_CrushRaiseAndStayA) // Ceiling_CrushRaiseAndStayA (tag, dnspeed, upspeed, damage, crushtype) { - return EV_DoCeiling (DCeiling::ceilCrushRaiseAndStay, ln, arg0, SPEED(arg1), SPEED(arg2), 0, arg3, 0, 0, CRUSHTYPE(arg4, false)); + return Level->EV_DoCeiling (DCeiling::ceilCrushRaiseAndStay, ln, arg0, SPEED(arg1), SPEED(arg2), 0, arg3, 0, 0, CRUSHTYPE(arg4, false)); } FUNC(LS_Ceiling_CrushRaiseAndStaySilA) // Ceiling_CrushRaiseAndStaySilA (tag, dnspeed, upspeed, damage, crushtype) { - return EV_DoCeiling (DCeiling::ceilCrushRaiseAndStay, ln, arg0, SPEED(arg1), SPEED(arg2), 0, arg3, 1, 0, CRUSHTYPE(arg4, false)); + return Level->EV_DoCeiling (DCeiling::ceilCrushRaiseAndStay, ln, arg0, SPEED(arg1), SPEED(arg2), 0, arg3, 1, 0, CRUSHTYPE(arg4, false)); } FUNC(LS_Ceiling_CrushAndRaiseA) // Ceiling_CrushAndRaiseA (tag, dnspeed, upspeed, damage, crushtype) { - return EV_DoCeiling (DCeiling::ceilCrushAndRaise, ln, arg0, SPEED(arg1), SPEED(arg2), 0, arg3, 0, 0, CRUSHTYPE(arg4, arg1 == 8 && arg2 == 8)); + return Level->EV_DoCeiling (DCeiling::ceilCrushAndRaise, ln, arg0, SPEED(arg1), SPEED(arg2), 0, arg3, 0, 0, CRUSHTYPE(arg4, arg1 == 8 && arg2 == 8)); } FUNC(LS_Ceiling_CrushAndRaiseDist) // Ceiling_CrushAndRaiseDist (tag, dist, speed, damage, crushtype) { - return EV_DoCeiling (DCeiling::ceilCrushAndRaise, ln, arg0, SPEED(arg2), SPEED(arg2), arg1, arg3, 0, 0, CRUSHTYPE(arg4, arg2 == 8)); + return Level->EV_DoCeiling (DCeiling::ceilCrushAndRaise, ln, arg0, SPEED(arg2), SPEED(arg2), arg1, arg3, 0, 0, CRUSHTYPE(arg4, arg2 == 8)); } FUNC(LS_Ceiling_CrushAndRaiseSilentA) // Ceiling_CrushAndRaiseSilentA (tag, dnspeed, upspeed, damage, crushtype) { - return EV_DoCeiling (DCeiling::ceilCrushAndRaise, ln, arg0, SPEED(arg1), SPEED(arg2), 0, arg3, 1, 0, CRUSHTYPE(arg4, arg1 == 8 && arg2 == 8)); + return Level->EV_DoCeiling (DCeiling::ceilCrushAndRaise, ln, arg0, SPEED(arg1), SPEED(arg2), 0, arg3, 1, 0, CRUSHTYPE(arg4, arg1 == 8 && arg2 == 8)); } FUNC(LS_Ceiling_CrushAndRaiseSilentDist) // Ceiling_CrushAndRaiseSilentDist (tag, dist, upspeed, damage, crushtype) { - return EV_DoCeiling (DCeiling::ceilCrushAndRaise, ln, arg0, SPEED(arg2), SPEED(arg2), arg1, arg3, 1, 0, CRUSHTYPE(arg4, arg2 == 8)); + return Level->EV_DoCeiling (DCeiling::ceilCrushAndRaise, ln, arg0, SPEED(arg2), SPEED(arg2), arg1, arg3, 1, 0, CRUSHTYPE(arg4, arg2 == 8)); } FUNC(LS_Ceiling_RaiseToNearest) // Ceiling_RaiseToNearest (tag, speed, change) { - return EV_DoCeiling (DCeiling::ceilRaiseToNearest, ln, arg0, SPEED(arg1), 0, 0, -1, CHANGE(arg2), 0); + return Level->EV_DoCeiling (DCeiling::ceilRaiseToNearest, ln, arg0, SPEED(arg1), 0, 0, -1, CHANGE(arg2), 0); } FUNC(LS_Ceiling_RaiseToHighest) // Ceiling_RaiseToHighest (tag, speed, change) { - return EV_DoCeiling (DCeiling::ceilRaiseToHighest, ln, arg0, SPEED(arg1), 0, 0, -1, CHANGE(arg2), 0); + return Level->EV_DoCeiling (DCeiling::ceilRaiseToHighest, ln, arg0, SPEED(arg1), 0, 0, -1, CHANGE(arg2), 0); } FUNC(LS_Ceiling_RaiseToLowest) // Ceiling_RaiseToLowest (tag, speed, change) { - return EV_DoCeiling (DCeiling::ceilRaiseToLowest, ln, arg0, SPEED(arg1), 0, 0, -1, CHANGE(arg2), 0); + return Level->EV_DoCeiling (DCeiling::ceilRaiseToLowest, ln, arg0, SPEED(arg1), 0, 0, -1, CHANGE(arg2), 0); } FUNC(LS_Ceiling_RaiseToHighestFloor) // Ceiling_RaiseToHighestFloor (tag, speed, change) { - return EV_DoCeiling (DCeiling::ceilRaiseToHighestFloor, ln, arg0, SPEED(arg1), 0, 0, -1, CHANGE(arg2), 0); + return Level->EV_DoCeiling (DCeiling::ceilRaiseToHighestFloor, ln, arg0, SPEED(arg1), 0, 0, -1, CHANGE(arg2), 0); } FUNC(LS_Ceiling_RaiseByTexture) // Ceiling_RaiseByTexture (tag, speed, change) { - return EV_DoCeiling (DCeiling::ceilRaiseByTexture, ln, arg0, SPEED(arg1), 0, 0, -1, CHANGE(arg2), 0); + return Level->EV_DoCeiling (DCeiling::ceilRaiseByTexture, ln, arg0, SPEED(arg1), 0, 0, -1, CHANGE(arg2), 0); } FUNC(LS_Ceiling_LowerToLowest) // Ceiling_LowerToLowest (tag, speed, change, crush) { - return EV_DoCeiling (DCeiling::ceilLowerToLowest, ln, arg0, SPEED(arg1), 0, 0, CRUSH(arg3), 0, CHANGE(arg2)); + return Level->EV_DoCeiling (DCeiling::ceilLowerToLowest, ln, arg0, SPEED(arg1), 0, 0, CRUSH(arg3), 0, CHANGE(arg2)); } FUNC(LS_Ceiling_LowerToNearest) // Ceiling_LowerToNearest (tag, speed, change, crush) { - return EV_DoCeiling (DCeiling::ceilLowerToNearest, ln, arg0, SPEED(arg1), 0, 0, CRUSH(arg3), 0, CHANGE(arg2)); + return Level->EV_DoCeiling (DCeiling::ceilLowerToNearest, ln, arg0, SPEED(arg1), 0, 0, CRUSH(arg3), 0, CHANGE(arg2)); } FUNC(LS_Ceiling_ToHighestInstant) // Ceiling_ToHighestInstant (tag, change, crush) { - return EV_DoCeiling (DCeiling::ceilLowerToHighest, ln, arg0, 2, 0, 0, CRUSH(arg2), 0, CHANGE(arg1)); + return Level->EV_DoCeiling (DCeiling::ceilLowerToHighest, ln, arg0, 2, 0, 0, CRUSH(arg2), 0, CHANGE(arg1)); } FUNC(LS_Ceiling_ToFloorInstant) // Ceiling_ToFloorInstant (tag, change, crush, gap) { - return EV_DoCeiling (DCeiling::ceilRaiseToFloor, ln, arg0, 2, 0, arg3, CRUSH(arg2), 0, CHANGE(arg1)); + return Level->EV_DoCeiling (DCeiling::ceilRaiseToFloor, ln, arg0, 2, 0, arg3, CRUSH(arg2), 0, CHANGE(arg1)); } FUNC(LS_Ceiling_LowerToFloor) // Ceiling_LowerToFloor (tag, speed, change, crush, gap) { - return EV_DoCeiling (DCeiling::ceilLowerToFloor, ln, arg0, SPEED(arg1), 0, arg4, CRUSH(arg3), 0, CHANGE(arg2)); + return Level->EV_DoCeiling (DCeiling::ceilLowerToFloor, ln, arg0, SPEED(arg1), 0, arg4, CRUSH(arg3), 0, CHANGE(arg2)); } FUNC(LS_Ceiling_LowerByTexture) // Ceiling_LowerByTexture (tag, speed, change, crush) { - return EV_DoCeiling (DCeiling::ceilLowerByTexture, ln, arg0, SPEED(arg1), 0, 0, CRUSH(arg3), 0, CHANGE(arg2)); + return Level->EV_DoCeiling (DCeiling::ceilLowerByTexture, ln, arg0, SPEED(arg1), 0, 0, CRUSH(arg3), 0, CHANGE(arg2)); } FUNC(LS_Ceiling_Stop) // Ceiling_Stop (tag) { - return EV_StopCeiling(arg0, ln); + return Level->EV_StopCeiling(arg0, ln); } @@ -907,14 +907,14 @@ FUNC(LS_Generic_Ceiling) } } - return EV_DoCeiling (type, ln, arg0, SPEED(arg1), SPEED(arg1), arg2, + return Level->EV_DoCeiling (type, ln, arg0, SPEED(arg1), SPEED(arg1), arg2, (arg4 & 16) ? 20 : -1, 0, arg4 & 7); } FUNC(LS_Generic_Crusher) // Generic_Crusher (tag, dnspeed, upspeed, silent, damage) { - return EV_DoCeiling (DCeiling::ceilCrushAndRaise, ln, arg0, SPEED(arg1), + return Level->EV_DoCeiling (DCeiling::ceilCrushAndRaise, ln, arg0, SPEED(arg1), SPEED(arg2), 0, arg4, arg3 ? 2 : 0, 0, (arg1 <= 24 && arg2 <= 24)? DCeiling::ECrushMode::crushSlowdown : DCeiling::ECrushMode::crushDoom); } @@ -922,20 +922,20 @@ FUNC(LS_Generic_Crusher2) // Generic_Crusher2 (tag, dnspeed, upspeed, silent, damage) { // same as above but uses Hexen's crushing method. - return EV_DoCeiling (DCeiling::ceilCrushAndRaise, ln, arg0, SPEED(arg1), + return Level->EV_DoCeiling (DCeiling::ceilCrushAndRaise, ln, arg0, SPEED(arg1), SPEED(arg2), 0, arg4, arg3 ? 2 : 0, 0, DCeiling::ECrushMode::crushHexen); } FUNC(LS_Plat_PerpetualRaise) // Plat_PerpetualRaise (tag, speed, delay) { - return EV_DoPlat (arg0, ln, DPlat::platPerpetualRaise, 0, SPEED(arg1), TICS(arg2), 8, 0); + return Level->EV_DoPlat (arg0, ln, DPlat::platPerpetualRaise, 0, SPEED(arg1), TICS(arg2), 8, 0); } FUNC(LS_Plat_PerpetualRaiseLip) // Plat_PerpetualRaiseLip (tag, speed, delay, lip) { - return EV_DoPlat (arg0, ln, DPlat::platPerpetualRaise, 0, SPEED(arg1), TICS(arg2), arg3, 0); + return Level->EV_DoPlat (arg0, ln, DPlat::platPerpetualRaise, 0, SPEED(arg1), TICS(arg2), arg3, 0); } FUNC(LS_Plat_Stop) @@ -954,20 +954,20 @@ FUNC(LS_Plat_Stop) remove = gameinfo.gametype == GAME_Hexen; break; } - EV_StopPlat(arg0, remove); + Level->EV_StopPlat(arg0, remove); return true; } FUNC(LS_Plat_DownWaitUpStay) // Plat_DownWaitUpStay (tag, speed, delay) { - return EV_DoPlat (arg0, ln, DPlat::platDownWaitUpStay, 0, SPEED(arg1), TICS(arg2), 8, 0); + return Level->EV_DoPlat (arg0, ln, DPlat::platDownWaitUpStay, 0, SPEED(arg1), TICS(arg2), 8, 0); } FUNC(LS_Plat_DownWaitUpStayLip) // Plat_DownWaitUpStayLip (tag, speed, delay, lip, floor-sound?) { - return EV_DoPlat (arg0, ln, + return Level->EV_DoPlat (arg0, ln, arg4 ? DPlat::platDownWaitUpStayStone : DPlat::platDownWaitUpStay, 0, SPEED(arg1), TICS(arg2), arg3, 0); } @@ -975,25 +975,25 @@ FUNC(LS_Plat_DownWaitUpStayLip) FUNC(LS_Plat_DownByValue) // Plat_DownByValue (tag, speed, delay, height) { - return EV_DoPlat (arg0, ln, DPlat::platDownByValue, arg3*8, SPEED(arg1), TICS(arg2), 0, 0); + return Level->EV_DoPlat (arg0, ln, DPlat::platDownByValue, arg3*8, SPEED(arg1), TICS(arg2), 0, 0); } FUNC(LS_Plat_UpByValue) // Plat_UpByValue (tag, speed, delay, height) { - return EV_DoPlat (arg0, ln, DPlat::platUpByValue, arg3*8, SPEED(arg1), TICS(arg2), 0, 0); + return Level->EV_DoPlat (arg0, ln, DPlat::platUpByValue, arg3*8, SPEED(arg1), TICS(arg2), 0, 0); } FUNC(LS_Plat_UpWaitDownStay) // Plat_UpWaitDownStay (tag, speed, delay) { - return EV_DoPlat (arg0, ln, DPlat::platUpWaitDownStay, 0, SPEED(arg1), TICS(arg2), 0, 0); + return Level->EV_DoPlat (arg0, ln, DPlat::platUpWaitDownStay, 0, SPEED(arg1), TICS(arg2), 0, 0); } FUNC(LS_Plat_UpNearestWaitDownStay) // Plat_UpNearestWaitDownStay (tag, speed, delay) { - return EV_DoPlat (arg0, ln, DPlat::platUpNearestWaitDownStay, 0, SPEED(arg1), TICS(arg2), 0, 0); + return Level->EV_DoPlat (arg0, ln, DPlat::platUpNearestWaitDownStay, 0, SPEED(arg1), TICS(arg2), 0, 0); } FUNC(LS_Plat_RaiseAndStayTx0) @@ -1015,19 +1015,19 @@ FUNC(LS_Plat_RaiseAndStayTx0) } - return EV_DoPlat (arg0, ln, type, 0, SPEED(arg1), 0, 0, 1); + return Level->EV_DoPlat (arg0, ln, type, 0, SPEED(arg1), 0, 0, 1); } FUNC(LS_Plat_UpByValueStayTx) // Plat_UpByValueStayTx (tag, speed, height) { - return EV_DoPlat (arg0, ln, DPlat::platUpByValueStay, arg2*8, SPEED(arg1), 0, 0, 2); + return Level->EV_DoPlat (arg0, ln, DPlat::platUpByValueStay, arg2*8, SPEED(arg1), 0, 0, 2); } FUNC(LS_Plat_ToggleCeiling) // Plat_ToggleCeiling (tag) { - return EV_DoPlat (arg0, ln, DPlat::platToggle, 0, 0, 0, 0, 0); + return Level->EV_DoPlat (arg0, ln, DPlat::platToggle, 0, 0, 0, 0, 0); } FUNC(LS_Generic_Lift) @@ -1054,7 +1054,7 @@ FUNC(LS_Generic_Lift) break; } - return EV_DoPlat (arg0, ln, type, arg4*8, SPEED(arg1), OCTICS(arg2), 0, 0); + return Level->EV_DoPlat (arg0, ln, type, arg4*8, SPEED(arg1), OCTICS(arg2), 0, 0); } FUNC(LS_Exit_Normal) @@ -2024,26 +2024,26 @@ FUNC(LS_FS_Execute) FUNC(LS_FloorAndCeiling_LowerByValue) // FloorAndCeiling_LowerByValue (tag, speed, height) { - return EV_DoElevator (ln, DElevator::elevateLower, SPEED(arg1), arg2, arg0); + return Level->EV_DoElevator (ln, DElevator::elevateLower, SPEED(arg1), arg2, arg0); } FUNC(LS_FloorAndCeiling_RaiseByValue) // FloorAndCeiling_RaiseByValue (tag, speed, height) { - return EV_DoElevator (ln, DElevator::elevateRaise, SPEED(arg1), arg2, arg0); + return Level->EV_DoElevator (ln, DElevator::elevateRaise, SPEED(arg1), arg2, arg0); } FUNC(LS_FloorAndCeiling_LowerRaise) // FloorAndCeiling_LowerRaise (tag, fspeed, cspeed, boomemu) { - bool res = EV_DoCeiling (DCeiling::ceilRaiseToHighest, ln, arg0, SPEED(arg2), 0, 0, 0, 0, 0); + bool res = Level->EV_DoCeiling (DCeiling::ceilRaiseToHighest, ln, arg0, SPEED(arg2), 0, 0, 0, 0, 0); // The switch based Boom equivalents of FloorandCeiling_LowerRaise do incorrect checks // which cause the floor only to move when the ceiling fails to do so. // To avoid problems with maps that have incorrect args this only uses a // more or less unintuitive value for the fourth arg to trigger Boom's broken behavior if (arg3 != 1998 || !res) // (1998 for the year in which Boom was released... :P) { - res |= EV_DoFloor (DFloor::floorLowerToLowest, ln, arg0, SPEED(arg1), 0, -1, 0, false); + res |= Level->EV_DoFloor (DFloor::floorLowerToLowest, ln, arg0, SPEED(arg1), 0, -1, 0, false); } return res; } @@ -2051,19 +2051,19 @@ FUNC(LS_FloorAndCeiling_LowerRaise) FUNC(LS_Elevator_MoveToFloor) // Elevator_MoveToFloor (tag, speed) { - return EV_DoElevator (ln, DElevator::elevateCurrent, SPEED(arg1), 0, arg0); + return Level->EV_DoElevator (ln, DElevator::elevateCurrent, SPEED(arg1), 0, arg0); } FUNC(LS_Elevator_RaiseToNearest) // Elevator_RaiseToNearest (tag, speed) { - return EV_DoElevator (ln, DElevator::elevateUp, SPEED(arg1), 0, arg0); + return Level->EV_DoElevator (ln, DElevator::elevateUp, SPEED(arg1), 0, arg0); } FUNC(LS_Elevator_LowerToNearest) // Elevator_LowerToNearest (tag, speed) { - return EV_DoElevator (ln, DElevator::elevateDown, SPEED(arg1), 0, arg0); + return Level->EV_DoElevator (ln, DElevator::elevateDown, SPEED(arg1), 0, arg0); } FUNC(LS_Light_ForceLightning) diff --git a/src/p_pillar.cpp b/src/p_pillar.cpp index 5c3453b4f..a681bee23 100644 --- a/src/p_pillar.cpp +++ b/src/p_pillar.cpp @@ -48,10 +48,6 @@ IMPLEMENT_POINTERS_START(DPillar) IMPLEMENT_POINTER(m_Interp_Ceiling) IMPLEMENT_POINTERS_END -DPillar::DPillar () -{ -} - void DPillar::OnDestroy() { if (m_Interp_Ceiling != nullptr) @@ -210,7 +206,7 @@ DPillar::DPillar (sector_t *sector, EPillar type, double speed, } } -bool EV_DoPillar (DPillar::EPillar type, line_t *line, int tag, +bool FLevelLocals::EV_DoPillar (DPillar::EPillar type, line_t *line, int tag, double speed, double height, double height2, int crush, bool hexencrush) { int secnum; @@ -218,10 +214,10 @@ bool EV_DoPillar (DPillar::EPillar type, line_t *line, int tag, bool rtn = false; // check if a manual trigger; if so do just the sector on the backside - auto itr = level.GetSectorTagIterator(tag, line); + auto itr = GetSectorTagIterator(tag, line); while ((secnum = itr.Next()) >= 0) { - sec = &level.sectors[secnum]; + sec = §ors[secnum]; if (sec->PlaneMoving(sector_t::floor) || sec->PlaneMoving(sector_t::ceiling)) continue; diff --git a/src/p_plats.cpp b/src/p_plats.cpp index e368fcaa5..2a39ef323 100644 --- a/src/p_plats.cpp +++ b/src/p_plats.cpp @@ -41,10 +41,6 @@ static FRandom pr_doplat ("DoPlat"); IMPLEMENT_CLASS(DPlat, false, false) -DPlat::DPlat () -{ -} - void DPlat::Serialize(FSerializer &arc) { Super::Serialize (arc); @@ -204,6 +200,21 @@ void DPlat::Tick () } } +void DPlat::Reactivate() +{ + if (m_Type == platToggle) //jff 3/14/98 reactivate toggle type + m_Status = m_OldStatus == up ? down : up; + else + m_Status = m_OldStatus; +} + + +void DPlat::Stop() +{ + m_OldStatus = m_Status; + m_Status = in_stasis; +} + DPlat::DPlat (sector_t *sector) : DMovingFloor (sector) { @@ -214,8 +225,7 @@ DPlat::DPlat (sector_t *sector) // [RH] Changed amount to height and added delay, // lip, change, tag, and speed parameters. // -bool EV_DoPlat (int tag, line_t *line, DPlat::EPlatType type, double height, - double speed, int delay, int lip, int change) +bool FLevelLocals::EV_DoPlat (int tag, line_t *line, DPlat::EPlatType type, double height, double speed, int delay, int lip, int change) { DPlat *plat; int secnum; @@ -233,7 +243,7 @@ bool EV_DoPlat (int tag, line_t *line, DPlat::EPlatType type, double height, case DPlat::platToggle: rtn = true; case DPlat::platPerpetualRaise: - P_ActivateInStasis (tag); + ActivateInStasisPlat (tag); break; default: @@ -244,10 +254,10 @@ bool EV_DoPlat (int tag, line_t *line, DPlat::EPlatType type, double height, // [RH] If tag is zero, use the sector on the back side // of the activating line (if any). - auto itr = level.GetSectorTagIterator(tag, line); + auto itr = GetSectorTagIterator(tag, line); while ((secnum = itr.Next()) >= 0) { - sec = &level.sectors[secnum]; + sec = §ors[secnum]; if (sec->PlaneMoving(sector_t::floor)) { @@ -392,18 +402,10 @@ bool EV_DoPlat (int tag, line_t *line, DPlat::EPlatType type, double height, return rtn; } -void DPlat::Reactivate () -{ - if (m_Type == platToggle) //jff 3/14/98 reactivate toggle type - m_Status = m_OldStatus == up ? down : up; - else - m_Status = m_OldStatus; -} - -void P_ActivateInStasis (int tag) +void FLevelLocals::ActivateInStasisPlat (int tag) { DPlat *scan; - TThinkerIterator iterator; + auto iterator = GetThinkerIterator(); while ( (scan = iterator.Next ()) ) { @@ -412,16 +414,10 @@ void P_ActivateInStasis (int tag) } } -void DPlat::Stop () -{ - m_OldStatus = m_Status; - m_Status = in_stasis; -} - -void EV_StopPlat (int tag, bool remove) +void FLevelLocals::EV_StopPlat (int tag, bool remove) { DPlat *scan; - TThinkerIterator iterator; + auto iterator = GetThinkerIterator(); scan = iterator.Next(); while (scan != nullptr) diff --git a/src/p_spec.h b/src/p_spec.h index 957ac9703..ab9514d88 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -210,19 +210,11 @@ protected: void Stop (); private: - DPlat (); + DPlat() = default; - friend bool EV_DoPlat (int tag, line_t *line, EPlatType type, - double height, double speed, int delay, int lip, int change); - friend void EV_StopPlat (int tag, bool remove); - friend void P_ActivateInStasis (int tag); + friend struct FLevelLocals; }; -bool EV_DoPlat (int tag, line_t *line, DPlat::EPlatType type, - double height, double speed, int delay, int lip, int change); -void EV_StopPlat (int tag, bool remove); -void P_ActivateInStasis (int tag); - // // [RH] // P_PILLAR @@ -259,11 +251,9 @@ protected: TObjPtr m_Interp_Floor; private: - DPillar (); + DPillar() = default; }; -bool EV_DoPillar (DPillar::EPillar type, line_t *line, int tag, - double speed, double height, double height2, int crush, bool hexencrush); // // P_DOORS @@ -307,19 +297,12 @@ protected: void DoorSound (bool raise, class DSeqNode *curseq=NULL) const; - friend bool EV_DoDoor (DDoor::EVlDoor type, line_t *line, AActor *thing, - int tag, double speed, int delay, int lock, - int lightTag, bool boomgen, int topcountdown); private: - DDoor (); + friend struct FLevelLocals; + DDoor() = default; }; -bool EV_DoDoor (DDoor::EVlDoor type, line_t *line, AActor *thing, - int tag, double speed, int delay, int lock, - int lightTag, bool boomgen = false, int topcountdown = 0); - - class DAnimatedDoor : public DMovingCeiling { DECLARE_CLASS (DAnimatedDoor, DMovingCeiling) @@ -357,15 +340,13 @@ protected: int m_Delay; bool m_SetBlocking1, m_SetBlocking2; - friend bool EV_SlidingDoor (line_t *line, AActor *thing, int tag, int speed, int delay, EADType type); + friend struct FLevelLocals; private: - DAnimatedDoor (); + DAnimatedDoor() = default; }; -bool EV_SlidingDoor (line_t *line, AActor *thing, int tag, int speed, int delay, DAnimatedDoor::EADType type); - // -// P_CEILNG +// P_CEILING // // [RH] Changed these @@ -441,22 +422,11 @@ protected: void PlayCeilingSound (); private: - DCeiling (); + DCeiling() = default; + friend struct FLevelLocals; - friend bool P_CreateCeiling(sector_t *sec, DCeiling::ECeiling type, line_t *line, int tag, double speed, double speed2, double height, int crush, int silent, int change, DCeiling::ECrushMode hexencrush); - friend bool EV_CeilingCrushStop (int tag, bool remove); - friend void P_ActivateInStasisCeiling (int tag); }; -bool P_CreateCeiling(sector_t *sec, DCeiling::ECeiling type, line_t *line, int tag, double speed, double speed2, double height, int crush, int silent, int change, DCeiling::ECrushMode hexencrush); -bool EV_DoCeiling (DCeiling::ECeiling type, line_t *line, int tag, double speed, double speed2, double height, int crush, int silent, int change, DCeiling::ECrushMode hexencrush = DCeiling::ECrushMode::crushDoom); - -bool EV_CeilingCrushStop (int tag, bool remove); -bool EV_StopCeiling(int tag, line_t *line); -void P_ActivateInStasisCeiling (int tag); - - - // // P_FLOOR // @@ -544,30 +514,12 @@ public: void StartFloorSound (); void SetFloorChangeType (sector_t *sec, int change); + friend struct FLevelLocals; - friend bool EV_BuildStairs (int tag, DFloor::EStair type, line_t *line, - double stairsize, double speed, int delay, int reset, int igntxt, - int usespecials); - friend bool EV_DoFloor (DFloor::EFloor floortype, line_t *line, int tag, - double speed, double height, int crush, int change, bool hexencrush, bool hereticlower); - friend bool EV_DoDonut (int tag, line_t *line, double pillarspeed, double slimespeed); private: - DFloor (); + DFloor() = default; }; -bool P_CreateFloor(sector_t *sec, DFloor::EFloor floortype, line_t *line, - double speed, double height, int crush, int change, bool hexencrush, bool hereticlower); - -bool EV_BuildStairs (int tag, DFloor::EStair type, line_t *line, - double stairsize, double speed, int delay, int reset, int igntxt, - int usespecials); -bool EV_DoFloor(DFloor::EFloor floortype, line_t *line, int tag, - double speed, double height, int crush, int change, bool hexencrush, bool hereticlower = false); - -bool EV_FloorCrushStop (int tag, line_t *line); -bool EV_StopFloor(int tag, line_t *line); -bool EV_DoDonut (int tag, line_t *line, double pillarspeed, double slimespeed); - class DElevator : public DMover { DECLARE_CLASS (DElevator, DMover) @@ -599,13 +551,11 @@ protected: TObjPtr m_Interp_Floor; void StartFloorSound (); - - friend bool EV_DoElevator (line_t *line, DElevator::EElevator type, double speed, double height, int tag); + friend struct FLevelLocals; private: - DElevator (); + DElevator() = default; }; -bool EV_DoElevator (line_t *line, DElevator::EElevator type, double speed, double height, int tag); class DWaggleBase : public DMover { @@ -626,16 +576,11 @@ protected: int m_Ticker; int m_State; - friend bool EV_StartWaggle (int tag, line_t *line, int height, int speed, - int offset, int timer, bool ceiling); - + friend struct FLevelLocals; void DoWaggle (bool ceiling); - DWaggleBase (); + DWaggleBase() = default; }; -bool EV_StartWaggle (int tag, line_t *line, int height, int speed, - int offset, int timer, bool ceiling); - class DFloorWaggle : public DWaggleBase { DECLARE_CLASS (DFloorWaggle, DWaggleBase) @@ -643,7 +588,7 @@ public: DFloorWaggle (sector_t *sec); void Tick (); private: - DFloorWaggle (); + DFloorWaggle() = default; }; class DCeilingWaggle : public DWaggleBase @@ -653,7 +598,7 @@ public: DCeilingWaggle (sector_t *sec); void Tick (); private: - DCeilingWaggle (); + DCeilingWaggle() = default; }; //jff 3/15/98 pure texture/type change for better generalized support @@ -663,10 +608,6 @@ enum EChange numChangeOnly, }; -bool EV_DoChange (line_t *line, EChange changetype, int tag); - - - // // P_TELEPT // diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index 5263aebf8..d31692b9f 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -721,6 +721,10 @@ struct LevelLocals native int sec = Thinker.Tics2Seconds(totals? totaltime : time); return String.Format("%02d:%02d:%02d", sec / 3600, (sec % 3600) / 60, sec % 60); } + + native bool CreateCeiling(sector sec, int type, line ln, double speed, double speed2, double height = 0, int crush = -1, int silent = 0, int change = 0, int crushmode = crushDoom); + native bool CreateFloor(sector sec, EFloor floortype, line ln, double speed, double height = 0, int crush = -1, int change = 0, bool crushmode = false, bool hereticlower = false); + } struct StringTable native @@ -922,7 +926,10 @@ class Floor : MovingFloor native genFloorChg }; - native static bool CreateFloor(sector sec, EFloor floortype, line ln, double speed, double height = 0, int crush = -1, int change = 0, bool crushmode = false, bool hereticlower = false); + deprecated("3.8") static bool CreateFloor(sector sec, EFloor floortype, line ln, double speed, double height = 0, int crush = -1, int change = 0, bool crushmode = false, bool hereticlower = false) + { + return level.CreateFloor(sec, floortype, ln, speed, height, crush, change, crushmode, hereticlower); + } } class Ceiling : MovingCeiling native @@ -965,7 +972,10 @@ class Ceiling : MovingCeiling native crushSlowdown = 2 } - native static bool CreateCeiling(sector sec, int type, line ln, double speed, double speed2, double height = 0, int crush = -1, int silent = 0, int change = 0, int crushmode = crushDoom); + deprecated("3.8") static bool CreateCeiling(sector sec, int type, line ln, double speed, double speed2, double height = 0, int crush = -1, int silent = 0, int change = 0, int crushmode = crushDoom) + { + return level.CreateCeiling(sec, type, ln, speed, speed2, height, crush, silent, change, crushmode); + } } diff --git a/wadsrc/static/zscript/strife/thingstoblowup.txt b/wadsrc/static/zscript/strife/thingstoblowup.txt index 8c17f8802..b3c6d636c 100644 --- a/wadsrc/static/zscript/strife/thingstoblowup.txt +++ b/wadsrc/static/zscript/strife/thingstoblowup.txt @@ -213,7 +213,7 @@ class PowerCrystal : Actor sec.Flags |= Sector.SECF_SILENTMOVE; sec.lightlevel = 0; // Do this right with proper checks instead of just hacking the floor height. - Floor.CreateFloor(sec, Floor.floorLowerToLowest, null, 65536.); + level.CreateFloor(sec, Floor.floorLowerToLowest, null, 65536.); for (int i = 0; i < 8; ++i) From fb86f397a0537ea552497de3fb4d682d42179d4f Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 26 Jan 2019 09:01:40 +0100 Subject: [PATCH 022/164] - Level as member variable in the sight checker. --- src/g_levellocals.h | 11 ++++++++++ src/p_sight.cpp | 51 +++++++++++++++++++++++---------------------- 2 files changed, 37 insertions(+), 25 deletions(-) diff --git a/src/g_levellocals.h b/src/g_levellocals.h index f8b90b858..4ca5c831a 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -321,6 +321,17 @@ public: } + bool CheckReject(sector_t *s1, sector_t *s2) + { + if (rejectmatrix.Size() > 0) + { + int pnum = int(s1->Index()) * sectors.Size() + int(s2->Index()); + return !(rejectmatrix[pnum >> 3] & (1 << (pnum & 7))); + } + return true; + } + + uint8_t 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 diff --git a/src/p_sight.cpp b/src/p_sight.cpp index ba4c97719..376651a6e 100644 --- a/src/p_sight.cpp +++ b/src/p_sight.cpp @@ -92,6 +92,7 @@ static TArray portals(32); class SightCheck { + FLevelLocals *Level; DVector3 sightstart; DVector2 sightend; double Startfrac; @@ -116,6 +117,11 @@ class SightCheck bool LineBlocksSight(line_t *ld); public: + SightCheck(FLevelLocals *l) + { + Level = l; + } + bool P_SightPathTraverse (); void init(AActor * t1, AActor * t2, sector_t *startsector, SightTask *task, int flags) @@ -407,7 +413,7 @@ bool SightCheck::LineBlocksSight(line_t *ld) { return true; } - if (ld->args[1] != 0 && ld->args[1] != level.levelnum) + if (ld->args[1] != 0 && ld->args[1] != Level->levelnum) { return true; } @@ -477,14 +483,14 @@ int SightCheck::P_SightBlockLinesIterator (int x, int y) polyblock_t *polyLink; unsigned int i; - offset = y*level.blockmap.bmapwidth+x; + offset = y* Level->blockmap.bmapwidth+x; // if any of the previous blocks may contain a portal we may abort the collection of lines here, but we may not abort the sight check. // (We still try to delay activating this for as long as possible.) - portalfound = portalfound || level.PortalBlockmap(x, y).containsLinkedPortals; + portalfound = portalfound || Level->PortalBlockmap(x, y).containsLinkedPortals; - polyLink = level.PolyBlockMap[offset]; - portalfound |= (polyLink && level.PortalBlockmap.hasLinkedPolyPortals); + polyLink = Level->PolyBlockMap[offset]; + portalfound |= (polyLink && Level->PortalBlockmap.hasLinkedPolyPortals); while (polyLink) { if (polyLink->polyobj) @@ -505,9 +511,9 @@ int SightCheck::P_SightBlockLinesIterator (int x, int y) polyLink = polyLink->next; } - for (list = level.blockmap.GetLines(x, y); *list != -1; list++) + for (list = Level->blockmap.GetLines(x, y); *list != -1; list++) { - if (!P_SightCheckLine (&level.lines[*list])) + if (!P_SightCheckLine (&Level->lines[*list])) { if (!portalfound) return 0; else res = -1; @@ -661,13 +667,13 @@ bool SightCheck::P_SightPathTraverse () portals.Push({ 0, topslope, bottomslope, sector_t::floor, lastsector->GetOppositePortalGroup(sector_t::floor) }); } - x1 -= level.blockmap.bmaporgx; - y1 -= level.blockmap.bmaporgy; + x1 -= Level->blockmap.bmaporgx; + y1 -= Level->blockmap.bmaporgy; xt1 = x1 / FBlockmap::MAPBLOCKUNITS; yt1 = y1 / FBlockmap::MAPBLOCKUNITS; - x2 -= level.blockmap.bmaporgx; - y2 -= level.blockmap.bmaporgy; + x2 -= Level->blockmap.bmaporgx; + y2 -= Level->blockmap.bmaporgy; xt2 = x2 / FBlockmap::MAPBLOCKUNITS; yt2 = y2 / FBlockmap::MAPBLOCKUNITS; @@ -747,7 +753,7 @@ bool SightCheck::P_SightPathTraverse () { // end traversing when reaching the end of the blockmap // an early out is not possible because with portals a trace can easily land outside the map's bounds. - if (!level.blockmap.isValidBlock(mapx, mapy)) + if (!Level->blockmap.isValidBlock(mapx, mapy)) { break; } @@ -839,22 +845,17 @@ int P_CheckSight (AActor *t1, AActor *t2, int flags) bool res; - assert (t1 != NULL); - assert (t2 != NULL); - if (t1 == NULL || t2 == NULL) + assert (t1 != nullptr); + assert (t2 != nullptr); + if (t1 == nullptr || t2 == nullptr) { return false; } - const sector_t *s1 = t1->Sector; - const sector_t *s2 = t2->Sector; - int pnum = int(s1->Index()) * level.sectors.Size() + int(s2->Index()); - -// -// check for trivial rejection -// - if (level.rejectmatrix.Size() > 0 && - (level.rejectmatrix[pnum>>3] & (1 << (pnum & 7)))) + // + // check for trivial rejection + // + if (!level.CheckReject(t1->Sector, t2->Sector)) { sightcounts[0]++; res = false; // can't possibly be connected @@ -911,7 +912,7 @@ sightcounts[0]++; SightTask task = { 0, topslope, bottomslope, -1, sec->PortalGroup }; - SightCheck s; + SightCheck s(&level); s.init(t1, t2, sec, &task, flags); res = s.P_SightPathTraverse (); if (!res) From 625e9f2525dfb6c5149244cc03e9178dab83baee Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 26 Jan 2019 12:22:02 +0100 Subject: [PATCH 023/164] - the sector variables are still needed. --- src/p_sight.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/p_sight.cpp b/src/p_sight.cpp index 376651a6e..fd85a9a08 100644 --- a/src/p_sight.cpp +++ b/src/p_sight.cpp @@ -852,10 +852,12 @@ int P_CheckSight (AActor *t1, AActor *t2, int flags) return false; } + auto s1 = t1->Sector; + auto s2 = t2->Sector; // // check for trivial rejection // - if (!level.CheckReject(t1->Sector, t2->Sector)) + if (!level.CheckReject(s1, s2)) { sightcounts[0]++; res = false; // can't possibly be connected From 05830455e7f3dd3d68d9f3c7c496d7dfd726bcaf Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 26 Jan 2019 15:21:20 +0100 Subject: [PATCH 024/164] - made the automap an object. This simplifies handling a lot because it allows to make the level the owner of its map. --- src/am_map.cpp | 1433 ++++++++++--------- src/am_map.h | 53 +- src/d_main.cpp | 2 +- src/g_game.cpp | 6 +- src/g_level.cpp | 8 +- src/g_levellocals.h | 8 +- src/namedef.h | 1 + src/p_saveg.cpp | 21 +- src/p_setup.cpp | 49 +- src/p_setup.h | 2 +- src/scripting/vmthunks.cpp | 11 +- src/v_video.cpp | 5 +- wadsrc/static/zscript/base.txt | 8 +- wadsrc/static/zscript/statusbar/alt_hud.txt | 5 - 14 files changed, 830 insertions(+), 782 deletions(-) diff --git a/src/am_map.cpp b/src/am_map.cpp index f50903c66..28f9d4d63 100644 --- a/src/am_map.cpp +++ b/src/am_map.cpp @@ -26,6 +26,7 @@ //----------------------------------------------------------------------------- #include +#include #include "doomdef.h" #include "templates.h" @@ -65,28 +66,99 @@ #include "earcut.hpp" +//============================================================================= +// +// Global state +// +//============================================================================= + +enum +{ + AM_NUMMARKPOINTS = 10, +}; + +// C++ cannot do static const floats in a class, so these need to be global... +static const double PLAYERRADIUS = 16.; // player radius for automap checking +static const double M_ZOOMIN = (1.02); // how much zoom-in per tic - goes to 2x in 1 second +static const double M_ZOOMOUT = (1 / 1.02); // how much zoom-out per tic - pulls out to 0.5x in 1 second + +static FTextureID marknums[AM_NUMMARKPOINTS]; // numbers used for marking by the automap +bool automapactive = false; + +//============================================================================= +// +// Types +// +//============================================================================= + +struct fpoint_t +{ + int x, y; +}; + +struct fline_t +{ + fpoint_t a, b; +}; + +struct mpoint_t +{ + double x, y; +}; + +struct mline_t +{ + mpoint_t a, b; +}; + +struct islope_t +{ + double slp, islp; +}; + //============================================================================= // // CVARs // //============================================================================= -CVAR (Int, am_rotate, 0, CVAR_ARCHIVE); -CVAR (Int, am_overlay, 0, CVAR_ARCHIVE); -CVAR (Bool, am_showsecrets, true, CVAR_ARCHIVE); -CVAR (Bool, am_showmonsters, true, CVAR_ARCHIVE); -CVAR (Bool, am_showitems, false, CVAR_ARCHIVE); -CVAR (Bool, am_showtime, true, CVAR_ARCHIVE); -CVAR (Bool, am_showtotaltime, false, CVAR_ARCHIVE); -CVAR (Int, am_colorset, 0, CVAR_ARCHIVE); -CVAR (Bool, am_customcolors, true, CVAR_ARCHIVE); -CVAR (Int, am_map_secrets, 1, CVAR_ARCHIVE); -CVAR (Int, am_drawmapback, 1, CVAR_ARCHIVE); -CVAR (Bool, am_showkeys, true, CVAR_ARCHIVE); -CVAR (Int, am_showtriggerlines, 0, CVAR_ARCHIVE); -CVAR (Int, am_showthingsprites, 0, CVAR_ARCHIVE); +CVAR(Bool, am_textured, false, CVAR_ARCHIVE) +CVAR(Int, am_showsubsector, -1, 0); -CUSTOM_CVAR (Int, am_emptyspacemargin, 0, CVAR_ARCHIVE) + +CUSTOM_CVAR(Int, am_showalllines, -1, CVAR_NOINITCALL) // This is a cheat so don't save it. +{ + if (currentUILevel && currentUILevel->automap) + currentUILevel->automap->UpdateShowAllLines(); +} + +EXTERN_CVAR(Bool, sv_cheats) +CUSTOM_CVAR(Int, am_cheat, 0, 0) +{ + // No automap cheat in net games when cheats are disabled! + if (netgame && !sv_cheats && self != 0) + { + self = 0; + } +} + + +CVAR(Int, am_rotate, 0, CVAR_ARCHIVE); +CVAR(Int, am_overlay, 0, CVAR_ARCHIVE); +CVAR(Bool, am_showsecrets, true, CVAR_ARCHIVE); +CVAR(Bool, am_showmonsters, true, CVAR_ARCHIVE); +CVAR(Bool, am_showitems, false, CVAR_ARCHIVE); +CVAR(Bool, am_showtime, true, CVAR_ARCHIVE); +CVAR(Bool, am_showtotaltime, false, CVAR_ARCHIVE); +CVAR(Int, am_colorset, 0, CVAR_ARCHIVE); +CVAR(Bool, am_customcolors, true, CVAR_ARCHIVE); +CVAR(Int, am_map_secrets, 1, CVAR_ARCHIVE); +CVAR(Int, am_drawmapback, 1, CVAR_ARCHIVE); +CVAR(Bool, am_showkeys, true, CVAR_ARCHIVE); +CVAR(Int, am_showtriggerlines, 0, CVAR_ARCHIVE); +CVAR(Int, am_showthingsprites, 0, CVAR_ARCHIVE); + +CUSTOM_CVAR(Int, am_emptyspacemargin, 0, CVAR_ARCHIVE) { if (self < 0) { @@ -97,12 +169,86 @@ CUSTOM_CVAR (Int, am_emptyspacemargin, 0, CVAR_ARCHIVE) self = 90; } - if (nullptr != StatusBar) + if (nullptr != StatusBar && currentUILevel && currentUILevel->automap) { - AM_NewResolution(); + currentUILevel->automap->NewResolution(); } } +//============================================================================= +// +// map functions +// +//============================================================================= + +CVAR(Bool, am_followplayer, true, CVAR_ARCHIVE) +CVAR(Bool, am_portaloverlay, true, CVAR_ARCHIVE) +CVAR(Bool, am_showgrid, false, CVAR_ARCHIVE) +CVAR(Float, am_zoomdir, 0, CVAR_ARCHIVE) + +CCMD(am_togglefollow) +{ + am_followplayer = !am_followplayer; + if (currentUILevel && currentUILevel->automap) + currentUILevel->automap->ResetFollowLocation(); + Printf("%s\n", GStrings(am_followplayer ? "AMSTR_FOLLOWON" : "AMSTR_FOLLOWOFF")); +} + +CCMD(am_togglegrid) +{ + am_showgrid = !am_showgrid; + Printf("%s\n", GStrings(am_showgrid ? "AMSTR_GRIDON" : "AMSTR_GRIDOFF")); +} + +CCMD(am_toggletexture) +{ + am_textured = !am_textured; + Printf("%s\n", GStrings(am_textured ? "AMSTR_TEXON" : "AMSTR_TEXOFF")); +} + +CCMD(am_setmark) +{ + if (currentUILevel && currentUILevel->automap) + { + int m = currentUILevel->automap->addMark(); + if (m >= 0) + { + Printf("%s %d\n", GStrings("AMSTR_MARKEDSPOT"), m); + } + } +} + +CCMD(am_clearmarks) +{ + if (currentUILevel && currentUILevel->automap && currentUILevel->automap->clearMarks()) + { + Printf("%s\n", GStrings("AMSTR_MARKSCLEARED")); + } +} + +CCMD(am_gobig) +{ + if (currentUILevel && currentUILevel->automap) + currentUILevel->automap->GoBig(); +} + +CCMD(togglemap) +{ + if (gameaction == ga_nothing) + { + gameaction = ga_togglemap; + } +} + +CCMD(am_zoom) +{ + if (argv.argc() >= 2) + { + am_zoomdir = (float)atof(argv[1]); + } +} + + //============================================================================= // // Automap colors @@ -223,7 +369,7 @@ static const char *ColorNames[] = { "UnexploredSecretColor", "PortalColor", "AlmostBackgroundColor", - NULL + nullptr }; struct AMColorset @@ -521,12 +667,61 @@ void AM_ClearColorsets() AMModOverlay.defined = false; AMMod.defined = false; } + //============================================================================= // // // //============================================================================= +static void AM_initColors(bool overlayed) +{ + if (overlayed) + { + if (am_customcolors && AMModOverlay.defined) + { + AMColors = AMModOverlay; + } + else + { + AMColors.initFromCVars(cv_overlay); + } + } + else if (am_customcolors && AMMod.defined) + { + AMColors = AMMod; + } + else switch (am_colorset) + { + default: + /* Use the custom colors in the am_* cvars */ + AMColors.initFromCVars(cv_standard); + break; + + case 1: // Doom + // Use colors corresponding to the original Doom's + AMColors.initFromColors(DoomColors, false); + break; + + case 2: // Strife + // Use colors corresponding to the original Strife's + AMColors.initFromColors(StrifeColors, false); + break; + + case 3: // Raven + // Use colors corresponding to the original Raven's + AMColors.initFromColors(RavenColors, true); + break; + + } +} + +//============================================================================= +// +// custom color parser +// +//============================================================================= + void FMapInfoParser::ParseAMColors(bool overlay) { bool colorset = false; @@ -578,7 +773,7 @@ void FMapInfoParser::ParseAMColors(bool overlay) else { int i; - for (i = 0; ColorNames[i] != NULL; i++) + for (i = 0; ColorNames[i] != nullptr; i++) { if (nextKey.CompareNoCase(ColorNames[i]) == 0) { @@ -586,13 +781,13 @@ void FMapInfoParser::ParseAMColors(bool overlay) FString color = sc.String; FString colorName = V_GetColorStringByName(color); if(!colorName.IsEmpty()) color = colorName; - int colorval = V_GetColorFromString(NULL, color); + int colorval = V_GetColorFromString(nullptr, color); cset.c[i].FromRGB(RPART(colorval), GPART(colorval), BPART(colorval)); colorset = true; break; } } - if (ColorNames[i]== NULL) + if (ColorNames[i]== nullptr) { sc.ScriptError("Unknown key '%s'", nextKey.GetChars()); } @@ -600,136 +795,6 @@ void FMapInfoParser::ParseAMColors(bool overlay) } } -//============================================================================= -// -// -// -//============================================================================= - -// scale on entry -#define INITSCALEMTOF .2 -// used by MTOF to scale from map-to-frame-buffer coords -static double scale_mtof = INITSCALEMTOF; -// used by FTOM to scale from frame-buffer-to-map coords (=1/scale_mtof) -static double scale_ftom; - -// translates between frame-buffer and map distances -inline double FTOM(double x) -{ - return x * scale_ftom; -} - -inline double MTOF(double x) -{ - return x * scale_mtof; -} - -static int bigstate = 0; -static bool textured = 1; // internal toggle for texture mode -static int MapPortalGroup; - -CUSTOM_CVAR(Bool, am_textured, false, CVAR_ARCHIVE) -{ - textured |= self; -} - -CVAR(Int, am_showsubsector, -1, 0); - - -// Disable the ML_DONTDRAW line flag if x% of all lines in a map are flagged with it -// (To counter annoying mappers who think they are smart by making the automap unusable) -bool am_showallenabled; - -CUSTOM_CVAR (Int, am_showalllines, -1, 0) // This is a cheat so don't save it. -{ - int flagged = 0; - int total = 0; - if (self > 0 && level.lines.Size() > 0) - { - for(auto &line : level.lines) - { - // disregard intra-sector lines - if (line.frontsector == line.backsector) continue; - - // disregard control sectors for deep water - if (line.frontsector->e->FakeFloor.Sectors.Size() > 0) continue; - - // disregard control sectors for 3D-floors - if (line.frontsector->e->XFloor.attached.Size() > 0) continue; - - total++; - if (line.flags & ML_DONTDRAW) flagged++; - } - am_showallenabled = (flagged * 100 / total >= self); - } - else if (self == 0) - { - am_showallenabled = true; - } - else - { - am_showallenabled = false; - } -} - -EXTERN_CVAR (Bool, sv_cheats) -CUSTOM_CVAR (Int, am_cheat, 0, 0) -{ - // No automap cheat in net games when cheats are disabled! - if (netgame && !sv_cheats && self != 0) - { - self = 0; - } -} - - - -#define AM_NUMMARKPOINTS 10 - -// player radius for automap checking -#define PLAYERRADIUS 16. - -// how much the automap moves window per tic in frame-buffer coordinates -// moves 140 pixels at 320x200 in 1 second -#define F_PANINC (140/TICRATE) -// how much zoom-in per tic -// goes to 2x in 1 second -#define M_ZOOMIN (1.02) -// how much zoom-out per tic -// pulls out to 0.5x in 1 second -#define M_ZOOMOUT (1/1.02) - -// translates between frame-buffer and map coordinates -#define CXMTOF(x) int(MTOF((x)-m_x)/* - f_x*/) -#define CYMTOF(y) int(f_h - MTOF((y)-m_y)/* + f_y*/) - -struct fpoint_t -{ - int x, y; -}; - -struct fline_t -{ - fpoint_t a, b; -}; - -struct mpoint_t -{ - double x, y; -}; - -struct mline_t -{ - mpoint_t a, b; -}; - -struct islope_t -{ - double slp, islp; -}; - - - //============================================================================= // // The vector graphics for the automap. @@ -743,169 +808,11 @@ static TArray CheatMapArrow; static TArray CheatKey; static TArray EasyKey; -#define L(a,b,c,d) { {(a), (b)}, {(c), (d)} } -static mline_t triangle_guy[] = { - L (-.867,-.5, .867,-.5), - L (.867,-.5, 0,1), - L (0,1, -.867,-.5) -}; -#define NUMTRIANGLEGUYLINES (sizeof(triangle_guy)/sizeof(mline_t)) - -static mline_t thintriangle_guy[] = { - L (-.5,-.7, 1,0), - L (1,0, -.5,.7), - L (-.5,.7, -.5,-.7) -}; -#define NUMTHINTRIANGLEGUYLINES (sizeof(thintriangle_guy)/sizeof(mline_t)) - -static mline_t square_guy[] = { - L (0,1,1,0), - L (1,0,0,-1), - L (0,-1,-1,0), - L (-1,0,0,1) -}; -#define NUMSQUAREGUYLINES (sizeof(square_guy)/sizeof(mline_t)) - -//============================================================================= -// -// -// -//============================================================================= - -static int grid = 0; - -bool automapactive = false; - -// location of window on screen -static int f_x; -static int f_y; - -// size of window on screen -static int f_w; -static int f_h; - -static int amclock; - -static mpoint_t m_paninc; // how far the window pans each tic (map coords) -static double mtof_zoommul; // how far the window zooms in each tic (map coords) -static double am_zoomdir; - -static double m_x, m_y; // LL x,y where the window is on the map (map coords) -static double m_x2, m_y2; // UR x,y where the window is on the map (map coords) - -// -// width/height of window on map (map coords) -// -static double m_w; -static double m_h; - -// based on level size -static double min_x, min_y, max_x, max_y; - -static double max_w; // max_x-min_x, -static double max_h; // max_y-min_y - -// based on player size -static double min_w; -static double min_h; - - -static double min_scale_mtof; // used to tell when to stop zooming out -static double max_scale_mtof; // used to tell when to stop zooming in - -// old stuff for recovery later -static double old_m_w, old_m_h; -static double old_m_x, old_m_y; - -// old location used by the Follower routine -static mpoint_t f_oldloc; - -static FTextureID marknums[10]; // numbers used for marking by the automap -static mpoint_t markpoints[AM_NUMMARKPOINTS]; // where the points are -static int markpointnum = 0; // next point to be assigned - -static FTextureID mapback; // the automap background -static double mapystart=0; // y-value for the start of the map bitmap...used in the parallax stuff. -static double mapxstart=0; //x-value for the bitmap. - -static bool stopped = true; - -static void AM_calcMinMaxMtoF(); - -static void DrawMarker (FTexture *tex, double x, double y, int yadjust, - INTBOOL flip, double xscale, double yscale, int translation, double alpha, uint32_t fillcolor, FRenderStyle renderstyle); - -void AM_rotatePoint (double *x, double *y); -void AM_rotate (double *x, double *y, DAngle an); -void AM_doFollowPlayer (); - - -//============================================================================= -// -// map functions -// -//============================================================================= - -bool AM_addMark (); -bool AM_clearMarks (); -void AM_saveScaleAndLoc (); -void AM_restoreScaleAndLoc (); -void AM_minOutWindowScale (); - - -CVAR(Bool, am_followplayer, true, CVAR_ARCHIVE) -CVAR(Bool, am_portaloverlay, true, CVAR_ARCHIVE) - - -CCMD(am_togglefollow) -{ - am_followplayer = !am_followplayer; - f_oldloc.x = FLT_MAX; - Printf ("%s\n", GStrings(am_followplayer ? "AMSTR_FOLLOWON" : "AMSTR_FOLLOWOFF")); -} - -CCMD(am_togglegrid) -{ - grid = !grid; - Printf ("%s\n", GStrings(grid ? "AMSTR_GRIDON" : "AMSTR_GRIDOFF")); -} - -CCMD(am_toggletexture) -{ - if (am_textured) - { - textured = !textured; - Printf ("%s\n", GStrings(textured ? "AMSTR_TEXON" : "AMSTR_TEXOFF")); - } -} - -CCMD(am_setmark) -{ - if (AM_addMark()) - { - Printf ("%s %d\n", GStrings("AMSTR_MARKEDSPOT"), markpointnum); - } -} - -CCMD(am_clearmarks) -{ - if (AM_clearMarks()) - { - Printf ("%s\n", GStrings("AMSTR_MARKSCLEARED")); - } -} - -CCMD(am_gobig) -{ - bigstate = !bigstate; - if (bigstate) - { - AM_saveScaleAndLoc(); - AM_minOutWindowScale(); - } - else - AM_restoreScaleAndLoc(); -} +static std::array thintriangle_guy = { { + {-.5,-.7, 1,0}, + {1,0, -.5,.7}, + {-.5,.7, -.5,-.7} +} }; //============================================================================= // @@ -913,9 +820,9 @@ CCMD(am_gobig) // //============================================================================= -void AM_ParseArrow(TArray &Arrow, const char *lumpname) +static void AM_ParseArrow(TArray &Arrow, const char *lumpname) { - const int R = int((8*PLAYERRADIUS)/7); + const int R = int((8 * PLAYERRADIUS) / 7); FScanner sc; int lump = Wads.CheckNumForFullName(lumpname, true); if (lump >= 0) @@ -960,22 +867,192 @@ void AM_StaticInit() char namebuf[9]; - for (int i = 0; i < 10; i++) + for (int i = 0; i < AM_NUMMARKPOINTS; i++) { - mysnprintf (namebuf, countof(namebuf), "AMMNUM%d", i); - marknums[i] = TexMan.CheckForTexture (namebuf, ETextureType::MiscPatch); + mysnprintf(namebuf, countof(namebuf), "AMMNUM%d", i); + marknums[i] = TexMan.CheckForTexture(namebuf, ETextureType::MiscPatch); } - markpointnum = 0; - mapback.SetInvalid(); } + +//============================================================================= +// +// the actual automap class definition +// +//============================================================================= + +IMPLEMENT_CLASS(DAutomapBase, true, false); + +class DAutomap :public DAutomapBase +{ + DECLARE_CLASS(DAutomap, DAutomapBase) + + enum + { + F_PANINC = 140 / TICRATE, // how much the automap moves window per tic in frame-buffer coordinates moves 140 pixels at 320x200 in 1 second + }; + + //FLevelLocals *Level; + // scale on entry + // used by MTOF to scale from map-to-frame-buffer coords + double scale_mtof = .2; + // used by FTOM to scale from frame-buffer-to-map coords (=1/scale_mtof) + double scale_ftom; + + int bigstate; + int MapPortalGroup; + + // Disable the ML_DONTDRAW line flag if x% of all lines in a map are flagged with it + // (To counter annoying mappers who think they are smart by making the automap unusable) + bool am_showallenabled; + + // location of window on screen + int f_x; + int f_y; + + // size of window on screen + int f_w; + int f_h; + + int amclock; + + mpoint_t m_paninc; // how far the window pans each tic (map coords) + double mtof_zoommul; // how far the window zooms in each tic (map coords) + + double m_x, m_y; // LL x,y where the window is on the map (map coords) + double m_x2, m_y2; // UR x,y where the window is on the map (map coords) + + // + // width/height of window on map (map coords) + // + double m_w; + double m_h; + + // based on level size + double min_x, min_y, max_x, max_y; + + double max_w; // max_x-min_x, + double max_h; // max_y-min_y + + // based on player size + double min_w; + double min_h; + + + double min_scale_mtof; // used to tell when to stop zooming out + double max_scale_mtof; // used to tell when to stop zooming in + + // old stuff for recovery later + double old_m_w, old_m_h; + double old_m_x, old_m_y; + + // old location used by the Follower routine + mpoint_t f_oldloc; + + mpoint_t markpoints[AM_NUMMARKPOINTS]; // where the points are + int markpointnum = 0; // next point to be assigned + + FTextureID mapback; // the automap background + double mapystart = 0; // y-value for the start of the map bitmap...used in the parallax stuff. + double mapxstart = 0; //x-value for the bitmap. + + TArray points; + + // translates between frame-buffer and map distances + double FTOM(double x) + { + return x * scale_ftom; + } + + double MTOF(double x) + { + return x * scale_mtof; + } + + // translates between frame-buffer and map coordinates + int CXMTOF(double x) + { + return int(MTOF((x)-m_x)/* - f_x*/); + } + + int CYMTOF(double y) + { + return int(f_h - MTOF((y)-m_y)/* + f_y*/); + } + + void calcMinMaxMtoF(); + + void DrawMarker(FTexture *tex, double x, double y, int yadjust, + INTBOOL flip, double xscale, double yscale, int translation, double alpha, uint32_t fillcolor, FRenderStyle renderstyle); + + void rotatePoint(double *x, double *y); + void rotate(double *x, double *y, DAngle an); + void doFollowPlayer(); + void saveScaleAndLoc(); + void restoreScaleAndLoc(); + void minOutWindowScale(); + void activateNewScale(); + void findMinMaxBoundaries(); + void ClipRotatedExtents(double pivotx, double pivoty); + void ScrollParchment(double dmapx, double dmapy); + void changeWindowLoc(); + void maxOutWindowScale(); + void changeWindowScale(); + void clearFB(const AMColor &color); + bool clipMline(mline_t *ml, fline_t *fl); + void drawMline(mline_t *ml, const AMColor &color); + void drawMline(mline_t *ml, int colorindex); + void drawGrid(int color); + void drawSubsectors(); + void drawSeg(seg_t *seg, const AMColor &color); + void drawPolySeg(FPolySeg *seg, const AMColor &color); + void showSS(); + void drawWalls(bool allmap); + void drawLineCharacter(const mline_t *lineguy, size_t lineguylines, double scale, DAngle angle, const AMColor &color, double x, double y); + void drawPlayers(); + void drawKeys(); + void drawThings(); + void drawMarks(); + void drawAuthorMarkers(); + void drawCrosshair(const AMColor &color); + + +public: + bool Responder(event_t* ev, bool last) override; + void Ticker(void) override; + void Drawer(int bottom) override; + void NewResolution() override; + void LevelInit() override; + void UpdateShowAllLines() override; + void Serialize(FSerializer &arc) override; + void GoBig() override; + void ResetFollowLocation() override; + int addMark() override; + bool clearMarks() override; + DVector2 GetPosition() override; + void startDisplay() override; + +}; + +IMPLEMENT_CLASS(DAutomap, false, false) + + +//============================================================================= +// +// +// +//============================================================================= + + + + //============================================================================= // // called by the coordinate drawer // //============================================================================= -DVector2 AM_GetPosition() +DVector2 DAutomap::GetPosition() { return DVector2((m_x + m_w / 2), (m_y + m_h / 2)); } @@ -986,7 +1063,7 @@ DVector2 AM_GetPosition() // //============================================================================= -void AM_activateNewScale () +void DAutomap::activateNewScale () { m_x += m_w/2; m_y += m_h/2; @@ -1004,7 +1081,7 @@ void AM_activateNewScale () // //============================================================================= -void AM_saveScaleAndLoc () +void DAutomap::saveScaleAndLoc () { old_m_x = m_x; old_m_y = m_y; @@ -1018,7 +1095,7 @@ void AM_saveScaleAndLoc () // //============================================================================= -void AM_restoreScaleAndLoc () +void DAutomap::restoreScaleAndLoc () { m_w = old_m_w; m_h = old_m_h; @@ -1046,16 +1123,17 @@ void AM_restoreScaleAndLoc () // //============================================================================= -bool AM_addMark () +int DAutomap::addMark () { if (marknums[0].isValid()) { + auto m = markpointnum; markpoints[markpointnum].x = m_x + m_w/2; markpoints[markpointnum].y = m_y + m_h/2; markpointnum = (markpointnum + 1) % AM_NUMMARKPOINTS; - return true; + return m; } - return false; + return -1; } //============================================================================= @@ -1065,12 +1143,12 @@ bool AM_addMark () // //============================================================================= -static void AM_findMinMaxBoundaries () +void DAutomap::findMinMaxBoundaries () { min_x = min_y = FLT_MAX; max_x = max_y = FIXED_MIN; - for (auto &vert : level.vertexes) + for (auto &vert : Level->vertexes) { if (vert.fX() < min_x) min_x = vert.fX(); @@ -1089,7 +1167,7 @@ static void AM_findMinMaxBoundaries () min_w = 2*PLAYERRADIUS; // const? never changed? min_h = 2*PLAYERRADIUS; - AM_calcMinMaxMtoF(); + calcMinMaxMtoF(); } //============================================================================= @@ -1098,7 +1176,7 @@ static void AM_findMinMaxBoundaries () // //============================================================================= -static void AM_calcMinMaxMtoF() +void DAutomap::calcMinMaxMtoF() { const double safe_frame = 1.0 - am_emptyspacemargin / 100.0; double a = safe_frame * (SCREENWIDTH / max_w); @@ -1114,7 +1192,7 @@ static void AM_calcMinMaxMtoF() // //============================================================================= -static void AM_ClipRotatedExtents (double pivotx, double pivoty) +void DAutomap::ClipRotatedExtents (double pivotx, double pivoty) { if (am_rotate == 0 || (am_rotate == 2 && !viewactive)) { @@ -1128,51 +1206,6 @@ static void AM_ClipRotatedExtents (double pivotx, double pivoty) else if (m_y + m_h/2 < min_y) m_y = min_y - m_h/2; } - else - { -#if 0 - double rmin_x, rmin_y, rmax_x, rmax_y; - double xs[5], ys[5]; - int i; - - xs[0] = min_x; ys[0] = min_y; - xs[1] = max_x; ys[1] = min_y; - xs[2] = max_x; ys[2] = max_y; - xs[3] = min_x; ys[3] = max_y; - xs[4] = m_x + m_w/2; ys[4] = m_y + m_h/2; - rmin_x = rmin_y = FLT_MAX; - rmax_x = rmax_y = FIXED_MIN; - - for (i = 0; i < 5; ++i) - { - xs[i] -= pivotx; - ys[i] -= pivoty; - AM_rotate (&xs[i], &ys[i], 90. - players[consoleplayer].camera->Angles.Yaw); - - if (i == 5) - break; -// xs[i] += pivotx; -// ys[i] += pivoty; - - if (xs[i] < rmin_x) rmin_x = xs[i]; - if (xs[i] > rmax_x) rmax_x = xs[i]; - if (ys[i] < rmin_y) rmin_y = ys[i]; - if (ys[i] > rmax_y) rmax_y = ys[i]; - } - if (rmax_x < 0) - xs[4] = -rmax_x; - else if (rmin_x > 0) - xs[4] = -rmin_x; - -// if (ys[4] > rmax_y) -// ys[4] = rmax_y; -// else if (ys[4] < rmin_y) -// ys[4] = rmin_y; - AM_rotate (&xs[4], &ys[4], 270. - players[consoleplayer].camera->Angles.Yaw); - m_x = xs[4] + pivotx - m_w/2; - m_y = ys[4] + pivoty - m_h/2; -#endif - } m_x2 = m_x + m_w; m_y2 = m_y + m_h; @@ -1184,7 +1217,7 @@ static void AM_ClipRotatedExtents (double pivotx, double pivoty) // //============================================================================= -static void AM_ScrollParchment (double dmapx, double dmapy) +void DAutomap::ScrollParchment (double dmapx, double dmapy) { mapxstart = mapxstart - dmapx * scale_mtof; mapystart = mapystart - dmapy * scale_mtof; @@ -1196,7 +1229,7 @@ static void AM_ScrollParchment (double dmapx, double dmapy) { FTexture *backtex = TexMan.GetTexture(mapback); - if (backtex != NULL) + if (backtex != nullptr) { int pwidth = backtex->GetDisplayWidth(); int pheight = backtex->GetDisplayHeight(); @@ -1219,7 +1252,7 @@ static void AM_ScrollParchment (double dmapx, double dmapy) // //============================================================================= -void AM_changeWindowLoc () +void DAutomap::changeWindowLoc () { if (m_paninc.x || m_paninc.y) { @@ -1237,14 +1270,14 @@ void AM_changeWindowLoc () oincy = incy = m_paninc.y * SCREENHEIGHT / 200; if (am_rotate == 1 || (am_rotate == 2 && viewactive)) { - AM_rotate(&incx, &incy, players[consoleplayer].camera->Angles.Yaw - 90.); + rotate(&incx, &incy, players[consoleplayer].camera->Angles.Yaw - 90.); } m_x += incx; m_y += incy; - AM_ClipRotatedExtents (oldmx + m_w/2, oldmy + m_h/2); - AM_ScrollParchment (m_x != oldmx ? oincx : 0, m_y != oldmy ? -oincy : 0); + ClipRotatedExtents (oldmx + m_w/2, oldmy + m_h/2); + ScrollParchment (m_x != oldmx ? oincx : 0, m_y != oldmy ? -oincy : 0); } @@ -1254,21 +1287,10 @@ void AM_changeWindowLoc () // //============================================================================= -void AM_initVariables () +void DAutomap::startDisplay() { int pnum; - automapactive = true; - - // Reset AM buttons - Button_AM_PanLeft.Reset(); - Button_AM_PanRight.Reset(); - Button_AM_PanUp.Reset(); - Button_AM_PanDown.Reset(); - Button_AM_ZoomIn.Reset(); - Button_AM_ZoomOut.Reset(); - - f_oldloc.x = FLT_MAX; amclock = 0; @@ -1286,7 +1308,7 @@ void AM_initVariables () assert(pnum >= 0 && pnum < MAXPLAYERS); m_x = players[pnum].camera->X() - m_w/2; m_y = players[pnum].camera->Y() - m_h/2; - AM_changeWindowLoc(); + changeWindowLoc(); // for saving & restoring old_m_x = m_x; @@ -1301,55 +1323,7 @@ void AM_initVariables () // //============================================================================= -static void AM_initColors (bool overlayed) -{ - if (overlayed) - { - if (am_customcolors && AMModOverlay.defined) - { - AMColors = AMModOverlay; - } - else - { - AMColors.initFromCVars(cv_overlay); - } - } - else if (am_customcolors && AMMod.defined) - { - AMColors = AMMod; - } - else switch(am_colorset) - { - default: - /* Use the custom colors in the am_* cvars */ - AMColors.initFromCVars(cv_standard); - break; - - case 1: // Doom - // Use colors corresponding to the original Doom's - AMColors.initFromColors(DoomColors, false); - break; - - case 2: // Strife - // Use colors corresponding to the original Strife's - AMColors.initFromColors(StrifeColors, false); - break; - - case 3: // Raven - // Use colors corresponding to the original Raven's - AMColors.initFromColors(RavenColors, true); - break; - - } -} - -//============================================================================= -// -// -// -//============================================================================= - -bool AM_clearMarks () +bool DAutomap::clearMarks () { for (int i = AM_NUMMARKPOINTS-1; i >= 0; i--) markpoints[i].x = -1; // means empty @@ -1363,63 +1337,35 @@ bool AM_clearMarks () // //============================================================================= -void AM_LevelInit () +void DAutomap::LevelInit () { - if (level.info->MapBackground.Len() == 0) + if (Level->info->MapBackground.Len() == 0) { mapback = TexMan.CheckForTexture("AUTOPAGE", ETextureType::MiscPatch); } else { - mapback = TexMan.CheckForTexture(level.info->MapBackground, ETextureType::MiscPatch); + mapback = TexMan.CheckForTexture(Level->info->MapBackground, ETextureType::MiscPatch); } - AM_clearMarks(); + clearMarks(); - AM_findMinMaxBoundaries(); + findMinMaxBoundaries(); scale_mtof = min_scale_mtof / 0.7; if (scale_mtof > max_scale_mtof) scale_mtof = min_scale_mtof; scale_ftom = 1 / scale_mtof; - am_showalllines.Callback(); + UpdateShowAllLines(); } -//============================================================================= -// -// -// -//============================================================================= - -void AM_Stop () -{ - automapactive = false; - stopped = true; - viewactive = true; -} - -//============================================================================= -// -// -// -//============================================================================= - -void AM_Start () -{ - if (!stopped) AM_Stop(); - stopped = false; - AM_initVariables(); -} - - - //============================================================================= // // set the window scale to the maximum size // //============================================================================= -void AM_minOutWindowScale () +void DAutomap::minOutWindowScale () { scale_mtof = min_scale_mtof; scale_ftom = 1/ scale_mtof; @@ -1431,7 +1377,7 @@ void AM_minOutWindowScale () // //============================================================================= -void AM_maxOutWindowScale () +void DAutomap::maxOutWindowScale () { scale_mtof = max_scale_mtof; scale_ftom = 1 / scale_mtof; @@ -1443,7 +1389,7 @@ void AM_maxOutWindowScale () // //============================================================================= -void AM_NewResolution() +void DAutomap::NewResolution() { double oldmin = min_scale_mtof; @@ -1451,73 +1397,26 @@ void AM_NewResolution() { return; // [SP] Not in a game, exit! } - AM_calcMinMaxMtoF(); + calcMinMaxMtoF(); scale_mtof = scale_mtof * min_scale_mtof / oldmin; scale_ftom = 1 / scale_mtof; if (scale_mtof < min_scale_mtof) - AM_minOutWindowScale(); + minOutWindowScale(); else if (scale_mtof > max_scale_mtof) - AM_maxOutWindowScale(); + maxOutWindowScale(); f_w = screen->GetWidth(); f_h = StatusBar->GetTopOfStatusbar(); - AM_activateNewScale(); + activateNewScale(); } -//============================================================================= -// -// -// -//============================================================================= - -CCMD (togglemap) -{ - if (gameaction == ga_nothing) - { - gameaction = ga_togglemap; - } -} - -//============================================================================= -// -// -// -//============================================================================= - -void AM_ToggleMap () -{ - if (gamestate != GS_LEVEL) - return; - - // Don't activate the automap if we're not allowed to use it. - if (dmflags2 & DF2_NO_AUTOMAP) - return; - - if (!automapactive) - { - AM_Start (); - viewactive = (am_overlay != 0.f); - } - else - { - if (am_overlay==1 && viewactive) - { - viewactive = false; - } - else - { - AM_Stop (); - } - } -} - //============================================================================= // // Handle events (user inputs) in automap mode // //============================================================================= -bool AM_Responder (event_t *ev, bool last) +bool DAutomap::Responder (event_t *ev, bool last) { if (automapactive && (ev->type == EV_KeyDown || ev->type == EV_KeyUp)) { @@ -1528,7 +1427,7 @@ bool AM_Responder (event_t *ev, bool last) if (!strnicmp(defbind, "+am_pan", 7)) return false; } - bool res = C_DoKey(ev, &AutomapBindings, NULL); + bool res = C_DoKey(ev, &AutomapBindings, nullptr); if (res && ev->type == EV_KeyUp && !last) { // If this is a release event we also need to check if it released a button in the main Bindings @@ -1548,7 +1447,7 @@ bool AM_Responder (event_t *ev, bool last) // //============================================================================= -void AM_changeWindowScale () +void DAutomap::changeWindowScale () { double mtof_zoommul; @@ -1579,17 +1478,9 @@ void AM_changeWindowScale () scale_ftom = 1 / scale_mtof; if (scale_mtof < min_scale_mtof) - AM_minOutWindowScale(); + minOutWindowScale(); else if (scale_mtof > max_scale_mtof) - AM_maxOutWindowScale(); -} - -CCMD(am_zoom) -{ - if (argv.argc() >= 2) - { - am_zoomdir = atof(argv[1]); - } + maxOutWindowScale(); } //============================================================================= @@ -1598,7 +1489,7 @@ CCMD(am_zoom) // //============================================================================= -void AM_doFollowPlayer () +void DAutomap::doFollowPlayer () { double sx, sy; auto cam = players[consoleplayer].camera; @@ -1619,9 +1510,9 @@ void AM_doFollowPlayer () sy = (f_oldloc.y - ampos.Y); if (am_rotate == 1 || (am_rotate == 2 && viewactive)) { - AM_rotate(&sx, &sy, cam->Angles.Yaw - 90); + rotate(&sx, &sy, cam->Angles.Yaw - 90); } - AM_ScrollParchment(sx, sy); + ScrollParchment(sx, sy); f_oldloc.x = ampos.X; f_oldloc.y = ampos.Y; @@ -1635,7 +1526,7 @@ void AM_doFollowPlayer () // //============================================================================= -void AM_Ticker () +void DAutomap::Ticker () { if (!automapactive) return; @@ -1644,7 +1535,7 @@ void AM_Ticker () if (am_followplayer) { - AM_doFollowPlayer(); + doFollowPlayer(); } else { @@ -1657,11 +1548,11 @@ void AM_Ticker () // Change the zoom if necessary if (Button_AM_ZoomIn.bDown || Button_AM_ZoomOut.bDown || am_zoomdir != 0) - AM_changeWindowScale(); + changeWindowScale(); // Change x,y location //if (m_paninc.x || m_paninc.y) - AM_changeWindowLoc(); + changeWindowLoc(); } @@ -1671,7 +1562,7 @@ void AM_Ticker () // //============================================================================= -void AM_clearFB (const AMColor &color) +void DAutomap::clearFB (const AMColor &color) { bool drawback = mapback.isValid() && am_drawmapback != 0; if (am_drawmapback == 2) @@ -1690,7 +1581,7 @@ void AM_clearFB (const AMColor &color) else { FTexture *backtex = TexMan.GetTexture(mapback); - if (backtex != NULL) + if (backtex != nullptr) { int pwidth = backtex->GetDisplayWidth(); int pheight = backtex->GetDisplayHeight(); @@ -1719,7 +1610,7 @@ void AM_clearFB (const AMColor &color) // //============================================================================= -bool AM_clipMline (mline_t *ml, fline_t *fl) +bool DAutomap::clipMline (mline_t *ml, fline_t *fl) { enum { LEFT =1, @@ -1736,12 +1627,14 @@ bool AM_clipMline (mline_t *ml, fline_t *fl) int dx; int dy; -#define DOOUTCODE(oc, mx, my) \ - (oc) = 0; \ - if ((my) < 0) (oc) |= TOP; \ - else if ((my) >= f_h) (oc) |= BOTTOM; \ - if ((mx) < 0) (oc) |= LEFT; \ - else if ((mx) >= f_w) (oc) |= RIGHT; + auto DOOUTCODE = [this](int &oc, double mx, double my) + { + oc = 0; + if (my < 0) oc |= TOP; + else if (my >= f_h) oc |= BOTTOM; + if (mx < 0) oc |= LEFT; + else if (mx >= f_w) oc |= RIGHT; + }; // do trivial rejects and outcodes if (ml->a.y > m_y2) @@ -1837,8 +1730,6 @@ bool AM_clipMline (mline_t *ml, fline_t *fl) return true; } -#undef DOOUTCODE - //============================================================================= // @@ -1846,19 +1737,19 @@ bool AM_clipMline (mline_t *ml, fline_t *fl) // //============================================================================= -void AM_drawMline (mline_t *ml, const AMColor &color) +void DAutomap::drawMline (mline_t *ml, const AMColor &color) { fline_t fl; - if (AM_clipMline (ml, &fl)) + if (clipMline (ml, &fl)) { screen->DrawLine (f_x + fl.a.x, f_y + fl.a.y, f_x + fl.b.x, f_y + fl.b.y, color.Index, color.RGB); } } -inline void AM_drawMline (mline_t *ml, int colorindex) +void DAutomap::drawMline (mline_t *ml, int colorindex) { - AM_drawMline(ml, AMColors[colorindex]); + drawMline(ml, AMColors[colorindex]); } //============================================================================= @@ -1867,15 +1758,15 @@ inline void AM_drawMline (mline_t *ml, int colorindex) // //============================================================================= -void AM_drawGrid (int color) +void DAutomap::drawGrid (int color) { double x, y; double start, end; mline_t ml; double minlen, extx, exty; double minx, miny; - auto bmaporgx = level.blockmap.bmaporgx; - auto bmaporgy = level.blockmap.bmaporgy; + auto bmaporgx = Level->blockmap.bmaporgx; + auto bmaporgy = Level->blockmap.bmaporgy; // [RH] Calculate a minimum for how long the grid lines should be so that // they cover the screen at any rotation. @@ -1901,10 +1792,10 @@ void AM_drawGrid (int color) ml.b.y = ml.a.y + minlen; if (am_rotate == 1 || (am_rotate == 2 && viewactive)) { - AM_rotatePoint (&ml.a.x, &ml.a.y); - AM_rotatePoint (&ml.b.x, &ml.b.y); + rotatePoint (&ml.a.x, &ml.a.y); + rotatePoint (&ml.b.x, &ml.b.y); } - AM_drawMline(&ml, color); + drawMline(&ml, color); } // Figure out start of horizontal gridlines @@ -1921,10 +1812,10 @@ void AM_drawGrid (int color) ml.b.y = y; if (am_rotate == 1 || (am_rotate == 2 && viewactive)) { - AM_rotatePoint (&ml.a.x, &ml.a.y); - AM_rotatePoint (&ml.b.x, &ml.b.y); + rotatePoint (&ml.a.x, &ml.a.y); + rotatePoint (&ml.b.x, &ml.b.y); } - AM_drawMline (&ml, color); + drawMline (&ml, color); } } @@ -2052,9 +1943,8 @@ sector_t * AM_FakeFlat(AActor *viewer, sector_t * sec, sector_t * dest) // //============================================================================= -void AM_drawSubsectors() +void DAutomap::drawSubsectors() { - static TArray points; std::vector indices; double scale = scale_mtof; DAngle rotation; @@ -2066,7 +1956,7 @@ void AM_drawSubsectors() PalEntry flatcolor; mpoint_t originpt; - auto &subsectors = level.subsectors; + auto &subsectors = Level->subsectors; for (unsigned i = 0; i < subsectors.Size(); ++i) { auto sub = &subsectors[i]; @@ -2093,7 +1983,7 @@ void AM_drawSubsectors() sub->firstline[j].v1->fY() }; if (am_rotate == 1 || (am_rotate == 2 && viewactive)) { - AM_rotatePoint(&pt.x, &pt.y); + rotatePoint(&pt.x, &pt.y); } points[j].X = float(f_x + ((pt.x - m_x) * scale)); points[j].Y = float(f_y + (f_h - (pt.y - m_y) * scale)); @@ -2184,13 +2074,13 @@ void AM_drawSubsectors() // Apply the floor's rotation to the texture origin. if (rotation != 0) { - AM_rotate(&originpt.x, &originpt.y, rotation); + rotate(&originpt.x, &originpt.y, rotation); } // Apply the automap's rotation to the texture origin. if (am_rotate == 1 || (am_rotate == 2 && viewactive)) { rotation = rotation + 90. - players[consoleplayer].camera->Angles.Yaw; - AM_rotatePoint(&originpt.x, &originpt.y); + rotatePoint(&originpt.x, &originpt.y); } originx = f_x + ((originpt.x - m_x) * scale); originy = f_y + (f_h - (originpt.y - m_y) * scale); @@ -2206,7 +2096,7 @@ void AM_drawSubsectors() colormap.Desaturation = 255 - (255 - colormap.Desaturation) / 4; } // make table based fog visible on the automap as well. - if (level.flags & LEVEL_HASFADETABLE) + if (Level->flags & LEVEL_HASFADETABLE) { colormap.FadeColor = PalEntry(0, 128, 128, 128); } @@ -2259,7 +2149,7 @@ static int AM_CheckSecret(line_t *line) { if (AMColors.isValid(AMColors.SecretSectorColor)) { - if (line->frontsector != NULL) + if (line->frontsector != nullptr) { if (line->frontsector->wasSecret()) { @@ -2267,7 +2157,7 @@ static int AM_CheckSecret(line_t *line) if (am_map_secrets==2 && !(line->flags & ML_SECRET)) return 2; } } - if (line->backsector != NULL) + if (line->backsector != nullptr) { if (line->backsector->wasSecret()) { @@ -2286,7 +2176,7 @@ static int AM_CheckSecret(line_t *line) // //============================================================================= -void AM_drawSeg(seg_t *seg, const AMColor &color) +void DAutomap::drawSeg(seg_t *seg, const AMColor &color) { mline_t l; l.a.x = seg->v1->fX(); @@ -2296,13 +2186,13 @@ void AM_drawSeg(seg_t *seg, const AMColor &color) if (am_rotate == 1 || (am_rotate == 2 && viewactive)) { - AM_rotatePoint (&l.a.x, &l.a.y); - AM_rotatePoint (&l.b.x, &l.b.y); + rotatePoint (&l.a.x, &l.a.y); + rotatePoint (&l.b.x, &l.b.y); } - AM_drawMline(&l, color); + drawMline(&l, color); } -void AM_drawPolySeg(FPolySeg *seg, const AMColor &color) +void DAutomap::drawPolySeg(FPolySeg *seg, const AMColor &color) { mline_t l; l.a.x = seg->v1.pos.X; @@ -2312,38 +2202,38 @@ void AM_drawPolySeg(FPolySeg *seg, const AMColor &color) if (am_rotate == 1 || (am_rotate == 2 && viewactive)) { - AM_rotatePoint (&l.a.x, &l.a.y); - AM_rotatePoint (&l.b.x, &l.b.y); + rotatePoint (&l.a.x, &l.a.y); + rotatePoint (&l.b.x, &l.b.y); } - AM_drawMline(&l, color); + drawMline(&l, color); } -void AM_showSS() +void DAutomap::showSS() { - if (am_showsubsector >= 0 && (unsigned)am_showsubsector < level.subsectors.Size()) + if (am_showsubsector >= 0 && (unsigned)am_showsubsector < Level->subsectors.Size()) { AMColor yellow; yellow.FromRGB(255,255,0); AMColor red; red.FromRGB(255,0,0); - subsector_t *sub = &level.subsectors[am_showsubsector]; + subsector_t *sub = &Level->subsectors[am_showsubsector]; for (unsigned int i = 0; i < sub->numlines; i++) { - AM_drawSeg(sub->firstline + i, yellow); + drawSeg(sub->firstline + i, yellow); } - for (auto &poly : level.Polyobjects) + for (auto &poly : Level->Polyobjects) { FPolyNode *pnode = poly.subsectorlinks; - while (pnode != NULL) + while (pnode != nullptr) { if (pnode->subsector == sub) { for (unsigned j = 0; j < pnode->segs.Size(); j++) { - AM_drawPolySeg(&pnode->segs[j], red); + drawPolySeg(&pnode->segs[j], red); } } pnode = pnode->snext; @@ -2441,15 +2331,15 @@ bool AM_checkSectorActions (sector_t *sector, bool (*function)(int, int *), int // [TP] Check whether there's a boundary on the provided line for a special that satisfies the provided function. // It's a boundary if the line can activate the special or the line's bordering sectors can activate it. // If found, specialptr and argsptr will be filled with special and args if given. -bool AM_checkSpecialBoundary (line_t &line, bool (*function)(int, int *), int *specialptr = NULL, int **argsptr = NULL) +bool AM_checkSpecialBoundary (line_t &line, bool (*function)(int, int *), int *specialptr = nullptr, int **argsptr = nullptr) { - if (specialptr == NULL) + if (specialptr == nullptr) { static int sink; specialptr = &sink; } - if (argsptr == NULL) + if (argsptr == nullptr) { static int *sink; argsptr = &sink; @@ -2466,7 +2356,7 @@ bool AM_checkSpecialBoundary (line_t &line, bool (*function)(int, int *), int *s // Check sector actions in the line's front sector -- the action has to be use-activated in order to // show up if this is a one-sided line, because the player cannot trigger sector actions by crossing // a one-sided line (since that's impossible, duh). - if (AM_checkSectorActions(line.frontsector, function, specialptr, argsptr, line.backsector == NULL)) + if (AM_checkSectorActions(line.frontsector, function, specialptr, argsptr, line.backsector == nullptr)) return true; // If it has a back sector, check sector actions in that. @@ -2500,7 +2390,7 @@ bool AM_isTriggerBoundary (line_t &line) return am_showtriggerlines == 1? AM_checkSpecialBoundary(line, [](int special, int *) { FLineSpecial *spec = P_GetLineSpecialInfo(special); - return spec != NULL + return spec != nullptr && spec->max_args >= 0 && special != Door_Open && special != Door_Close @@ -2511,14 +2401,14 @@ bool AM_isTriggerBoundary (line_t &line) }) : AM_checkSpecialBoundary(line, [](int special, int *) { FLineSpecial *spec = P_GetLineSpecialInfo(special); - return spec != NULL + return spec != nullptr && spec->max_args >= 0; }); } -bool AM_isLockBoundary (line_t &line, int *lockptr = NULL) +bool AM_isLockBoundary (line_t &line, int *lockptr = nullptr) { - if (lockptr == NULL) + if (lockptr == nullptr) { static int sink; lockptr = &sink; @@ -2571,19 +2461,19 @@ bool AM_isLockBoundary (line_t &line, int *lockptr = NULL) // //============================================================================= -void AM_drawWalls (bool allmap) +void DAutomap::drawWalls (bool allmap) { static mline_t l; int lock, color; - int numportalgroups = am_portaloverlay ? level.Displacements.size : 0; + int numportalgroups = am_portaloverlay ? Level->Displacements.size : 0; for (int p = numportalgroups - 1; p >= -1; p--) { if (p == MapPortalGroup) continue; - for (auto &line : level.lines) + for (auto &line : Level->lines) { int pg; @@ -2600,7 +2490,7 @@ void AM_drawWalls (bool allmap) bool portalmode = numportalgroups > 0 && pg != MapPortalGroup; if (pg == p) { - offset = level.Displacements.getOffset(pg, MapPortalGroup); + offset = Level->Displacements.getOffset(pg, MapPortalGroup); } else if (p == -1 && (pg == MapPortalGroup || !am_portaloverlay)) { @@ -2615,8 +2505,8 @@ void AM_drawWalls (bool allmap) if (am_rotate == 1 || (am_rotate == 2 && viewactive)) { - AM_rotatePoint(&l.a.x, &l.a.y); - AM_rotatePoint(&l.b.x, &l.b.y); + rotatePoint(&l.a.x, &l.a.y); + rotatePoint(&l.b.x, &l.b.y); } if (am_cheat != 0 || (line.flags & ML_MAPPED)) @@ -2632,37 +2522,37 @@ void AM_drawWalls (bool allmap) if (line.automapstyle > AMLS_Default && line.automapstyle < AMLS_COUNT && (am_cheat == 0 || am_cheat >= 4)) { - AM_drawMline(&l, AUTOMAP_LINE_COLORS[line.automapstyle]); + drawMline(&l, AUTOMAP_LINE_COLORS[line.automapstyle]); continue; } if (portalmode) { - AM_drawMline(&l, AMColors.PortalColor); + drawMline(&l, AMColors.PortalColor); } else if (AM_CheckSecret(&line) == 1) { // map secret sectors like Boom - AM_drawMline(&l, AMColors.SecretSectorColor); + drawMline(&l, AMColors.SecretSectorColor); } else if (AM_CheckSecret(&line) == 2) { - AM_drawMline(&l, AMColors.UnexploredSecretColor); + drawMline(&l, AMColors.UnexploredSecretColor); } else if (line.flags & ML_SECRET) { // secret door - if (am_cheat != 0 && line.backsector != NULL) - AM_drawMline(&l, AMColors.SecretWallColor); + if (am_cheat != 0 && line.backsector != nullptr) + drawMline(&l, AMColors.SecretWallColor); else - AM_drawMline(&l, AMColors.WallColor); + drawMline(&l, AMColors.WallColor); } else if (AM_isTeleportBoundary(line) && AMColors.isValid(AMColors.IntraTeleportColor)) { // intra-level teleporters - AM_drawMline(&l, AMColors.IntraTeleportColor); + drawMline(&l, AMColors.IntraTeleportColor); } else if (AM_isExitBoundary(line) && AMColors.isValid(AMColors.InterTeleportColor)) { // inter-level/game-ending teleporters - AM_drawMline(&l, AMColors.InterTeleportColor); + drawMline(&l, AMColors.InterTeleportColor); } else if (AM_isLockBoundary(line, &lock)) { @@ -2675,40 +2565,40 @@ void AM_drawWalls (bool allmap) if (color >= 0) c.FromRGB(RPART(color), GPART(color), BPART(color)); else c = AMColors[AMColors.LockedColor]; - AM_drawMline(&l, c); + drawMline(&l, c); } else { - AM_drawMline(&l, AMColors.LockedColor); // locked special + drawMline(&l, AMColors.LockedColor); // locked special } } else if (am_showtriggerlines && AMColors.isValid(AMColors.SpecialWallColor) && AM_isTriggerBoundary(line)) { - AM_drawMline(&l, AMColors.SpecialWallColor); // wall with special non-door action the player can do + drawMline(&l, AMColors.SpecialWallColor); // wall with special non-door action the player can do } - else if (line.backsector == NULL) + else if (line.backsector == nullptr) { - AM_drawMline(&l, AMColors.WallColor); // one-sided wall + drawMline(&l, AMColors.WallColor); // one-sided wall } else if (line.backsector->floorplane != line.frontsector->floorplane) { - AM_drawMline(&l, AMColors.FDWallColor); // floor level change + drawMline(&l, AMColors.FDWallColor); // floor level change } else if (line.backsector->ceilingplane != line.frontsector->ceilingplane) { - AM_drawMline(&l, AMColors.CDWallColor); // ceiling level change + drawMline(&l, AMColors.CDWallColor); // ceiling level change } else if (AM_Check3DFloors(&line)) { - AM_drawMline(&l, AMColors.EFWallColor); // Extra floor border + drawMline(&l, AMColors.EFWallColor); // Extra floor border } else if (am_cheat > 0 && am_cheat < 4) { - AM_drawMline(&l, AMColors.TSWallColor); + drawMline(&l, AMColors.TSWallColor); } } else if (allmap || (line.flags & ML_REVEALED)) @@ -2720,7 +2610,7 @@ void AM_drawWalls (bool allmap) continue; } } - AM_drawMline(&l, AMColors.NotSeenColor); + drawMline(&l, AMColors.NotSeenColor); } } } @@ -2734,7 +2624,7 @@ void AM_drawWalls (bool allmap) // //============================================================================= -void AM_rotate(double *xp, double *yp, DAngle a) +void DAutomap::rotate(double *xp, double *yp, DAngle a) { static DAngle angle_saved = 0.; static double sinrot = 0; @@ -2762,13 +2652,13 @@ void AM_rotate(double *xp, double *yp, DAngle a) // //============================================================================= -void AM_rotatePoint (double *x, double *y) +void DAutomap::rotatePoint (double *x, double *y) { double pivotx = m_x + m_w/2; double pivoty = m_y + m_h/2; *x -= pivotx; *y -= pivoty; - AM_rotate (x, y, -players[consoleplayer].camera->Angles.Yaw + 90.); + rotate (x, y, -players[consoleplayer].camera->Angles.Yaw + 90.); *x += pivotx; *y += pivoty; } @@ -2779,15 +2669,7 @@ void AM_rotatePoint (double *x, double *y) // //============================================================================= -void -AM_drawLineCharacter -( const mline_t *lineguy, - int lineguylines, - double scale, - DAngle angle, - const AMColor &color, - double x, - double y ) +void DAutomap::drawLineCharacter(const mline_t *lineguy, size_t lineguylines, double scale, DAngle angle, const AMColor &color, double x, double y) { int i; mline_t l; @@ -2802,7 +2684,7 @@ AM_drawLineCharacter } if (angle != 0) - AM_rotate(&l.a.x, &l.a.y, angle); + rotate(&l.a.x, &l.a.y, angle); l.a.x += x; l.a.y += y; @@ -2816,12 +2698,12 @@ AM_drawLineCharacter } if (angle != 0) - AM_rotate(&l.b.x, &l.b.y, angle); + rotate(&l.b.x, &l.b.y, angle); l.b.x += x; l.b.y += y; - AM_drawMline(&l, color); + drawMline(&l, color); } } @@ -2831,7 +2713,7 @@ AM_drawLineCharacter // //============================================================================= -void AM_drawPlayers () +void DAutomap::drawPlayers () { if (am_cheat >= 2 && am_cheat != 4 && am_showthingsprites > 0) { @@ -2855,7 +2737,7 @@ void AM_drawPlayers () if (am_rotate == 1 || (am_rotate == 2 && viewactive)) { angle = 90.; - AM_rotatePoint (&pt.x, &pt.y); + rotatePoint (&pt.x, &pt.y); } else { @@ -2872,7 +2754,7 @@ void AM_drawPlayers () arrow = &MapArrow[0]; numarrowlines = MapArrow.Size(); } - AM_drawLineCharacter(arrow, numarrowlines, 0, angle, AMColors[AMColors.YourColor], pt.x, pt.y); + drawLineCharacter(arrow, numarrowlines, 0, angle, AMColors[AMColors.YourColor], pt.x, pt.y); return; } @@ -2881,7 +2763,7 @@ void AM_drawPlayers () player_t *p = &players[i]; AMColor color; - if (!playeringame[i] || p->mo == NULL) + if (!playeringame[i] || p->mo == nullptr) { continue; } @@ -2905,13 +2787,13 @@ void AM_drawPlayers () { float h, s, v, r, g, b; - D_GetPlayerColor (i, &h, &s, &v, NULL); + D_GetPlayerColor (i, &h, &s, &v, nullptr); HSVtoRGB (&r, &g, &b, h, s, v); color.FromRGB(clamp (int(r*255.f),0,255), clamp (int(g*255.f),0,255), clamp (int(b*255.f),0,255)); } - if (p->mo != NULL) + if (p->mo != nullptr) { DVector3 pos = p->mo->PosRelative(MapPortalGroup); pt.x = pos.X; @@ -2921,11 +2803,11 @@ void AM_drawPlayers () if (am_rotate == 1 || (am_rotate == 2 && viewactive)) { - AM_rotatePoint (&pt.x, &pt.y); + rotatePoint (&pt.x, &pt.y); angle -= players[consoleplayer].camera->Angles.Yaw - 90.; } - AM_drawLineCharacter(&MapArrow[0], MapArrow.Size(), 0, angle, color, pt.x, pt.y); + drawLineCharacter(&MapArrow[0], MapArrow.Size(), 0, angle, color, pt.x, pt.y); } } } @@ -2936,7 +2818,7 @@ void AM_drawPlayers () // //============================================================================= -void AM_drawKeys () +void DAutomap::drawKeys () { AMColor color; mpoint_t p; @@ -2945,7 +2827,7 @@ void AM_drawKeys () TThinkerIterator it(NAME_Key); AActor *key; - while ((key = it.Next()) != NULL) + while ((key = it.Next()) != nullptr) { DVector3 pos = key->PosRelative(MapPortalGroup); p.x = pos.X; @@ -2955,7 +2837,7 @@ void AM_drawKeys () if (am_rotate == 1 || (am_rotate == 2 && viewactive)) { - AM_rotatePoint (&p.x, &p.y); + rotatePoint (&p.x, &p.y); angle += -players[consoleplayer].camera->Angles.Yaw + 90.; } @@ -2968,7 +2850,7 @@ void AM_drawKeys () if (c >= 0) color.FromRGB(RPART(c), GPART(c), BPART(c)); else color = AMColors[AMColors.ThingColor_CountItem]; - AM_drawLineCharacter(&EasyKey[0], EasyKey.Size(), 0, 0., color, p.x, p.y); + drawLineCharacter(&EasyKey[0], EasyKey.Size(), 0, 0., color, p.x, p.y); } } } @@ -2978,14 +2860,14 @@ void AM_drawKeys () // // //============================================================================= -void AM_drawThings () +void DAutomap::drawThings () { AMColor color; AActor* t; mpoint_t p; DAngle angle; - for (auto &sec : level.sectors) + for (auto &sec : Level->sectors) { t = sec.thinglist; while (t) @@ -2998,12 +2880,12 @@ void AM_drawThings () if (am_showthingsprites > 0 && t->sprite > 0) { - FTexture *texture = NULL; + FTexture *texture = nullptr; spriteframe_t *frame; int rotation = 0; // try all modes backwards until a valid texture has been found. - for(int show = am_showthingsprites; show > 0 && texture == NULL; show--) + for(int show = am_showthingsprites; show > 0 && texture == nullptr; show--) { const spritedef_t& sprite = sprites[t->sprite]; const size_t spriteIndex = sprite.spriteframes + (show > 1 ? t->frame : 0); @@ -3021,7 +2903,7 @@ void AM_drawThings () texture = TexMan.GetTexture(textureID, true); } - if (texture == NULL) goto drawTriangle; // fall back to standard display if no sprite can be found. + if (texture == nullptr) goto drawTriangle; // fall back to standard display if no sprite can be found. const double spriteXScale = (t->Scale.X * (10. / 16.) * scale_mtof); const double spriteYScale = (t->Scale.Y * (10. / 16.) * scale_mtof); @@ -3036,7 +2918,7 @@ void AM_drawThings () if (am_rotate == 1 || (am_rotate == 2 && viewactive)) { - AM_rotatePoint (&p.x, &p.y); + rotatePoint (&p.x, &p.y); angle += -players[consoleplayer].camera->Angles.Yaw + 90.; } @@ -3067,7 +2949,7 @@ void AM_drawThings () if (c >= 0) color.FromRGB(RPART(c), GPART(c), BPART(c)); else color = AMColors[AMColors.ThingColor_CountItem]; - AM_drawLineCharacter(&CheatKey[0], CheatKey.Size(), 0, 0., color, p.x, p.y); + drawLineCharacter(&CheatKey[0], CheatKey.Size(), 0, 0., color, p.x, p.y); color.Index = -1; } else @@ -3083,7 +2965,7 @@ void AM_drawThings () if (color.Index != -1) { - AM_drawLineCharacter(thintriangle_guy, NUMTHINTRIANGLEGUYLINES, 16, angle, color, p.x, p.y); + drawLineCharacter(thintriangle_guy.data(), thintriangle_guy.size(), 16, angle, color, p.x, p.y); } if (am_cheat == 3 || am_cheat == 6) @@ -3096,7 +2978,7 @@ void AM_drawThings () { { -1, 1 }, { -1, -1 } }, }; - AM_drawLineCharacter (box, 4, t->radius, angle - t->Angles.Yaw, color, p.x, p.y); + drawLineCharacter (box, 4, t->radius, angle - t->Angles.Yaw, color, p.x, p.y); } } } @@ -3111,16 +2993,16 @@ void AM_drawThings () // //============================================================================= -static void DrawMarker (FTexture *tex, double x, double y, int yadjust, +void DAutomap::DrawMarker (FTexture *tex, double x, double y, int yadjust, INTBOOL flip, double xscale, double yscale, int translation, double alpha, uint32_t fillcolor, FRenderStyle renderstyle) { - if (tex == NULL || !tex->isValid()) + if (tex == nullptr || !tex->isValid()) { return; } if (am_rotate == 1 || (am_rotate == 2 && viewactive)) { - AM_rotatePoint (&x, &y); + rotatePoint (&x, &y); } screen->DrawTexture (tex, CXMTOF(x) + f_x, CYMTOF(y) + yadjust + f_y, DTA_DestWidthF, tex->GetDisplayWidthDouble() * CleanXfac * xscale, @@ -3143,7 +3025,7 @@ static void DrawMarker (FTexture *tex, double x, double y, int yadjust, // //============================================================================= -void AM_drawMarks () +void DAutomap::drawMarks () { for (int i = 0; i < AM_NUMMARKPOINTS; i++) { @@ -3161,15 +3043,15 @@ void AM_drawMarks () // //============================================================================= -void AM_drawAuthorMarkers () +void DAutomap::drawAuthorMarkers () { // [RH] Draw any actors derived from AMapMarker on the automap. // If args[0] is 0, then the actor's sprite is drawn at its own location. // Otherwise, its sprite is drawn at the location of any actors whose TIDs match args[0]. - TThinkerIterator it ("MapMarker", STAT_MAPMARKER); + auto it = Level->GetThinkerIterator(NAME_MapMarker, STAT_MAPMARKER); AActor *mark; - while ((mark = it.Next()) != NULL) + while ((mark = it.Next()) != nullptr) { if (mark->flags2 & MF2_DORMANT) { @@ -3206,17 +3088,17 @@ void AM_drawAuthorMarkers () tex = TexMan.GetTexture(picnum); } } - auto it = level.GetActorIterator(mark->args[0]); + auto it = Level->GetActorIterator(mark->args[0]); AActor *marked = mark->args[0] == 0 ? mark : it.Next(); - while (marked != NULL) + while (marked != nullptr) { if (mark->args[1] == 0 || (mark->args[1] == 1 && (marked->subsector->flags & SSECMF_DRAWN))) { DrawMarker (tex, marked->X(), marked->Y(), 0, flip, mark->Scale.X, mark->Scale.Y, mark->Translation, mark->Alpha, mark->fillcolor, mark->RenderStyle); } - marked = mark->args[0] != 0 ? it.Next() : NULL; + marked = mark->args[0] != 0 ? it.Next() : nullptr; } } } @@ -3227,7 +3109,7 @@ void AM_drawAuthorMarkers () // //============================================================================= -void AM_drawCrosshair (const AMColor &color) +void DAutomap::drawCrosshair (const AMColor &color) { screen->DrawPixel(f_w/2, (f_h+1)/2, color.Index, color.RGB); } @@ -3238,12 +3120,12 @@ void AM_drawCrosshair (const AMColor &color) // //============================================================================= -void AM_Drawer (int bottom) +void DAutomap::Drawer (int bottom) { if (!automapactive) return; - bool allmap = (level.flags2 & LEVEL2_ALLMAP) != 0; + bool allmap = (Level->flags2 & LEVEL2_ALLMAP) != 0; bool allthings = allmap && players[consoleplayer].mo->FindInventory(NAME_PowerScanner, true) != nullptr; if (am_portaloverlay) @@ -3264,7 +3146,7 @@ void AM_Drawer (int bottom) f_w = screen->GetWidth (); f_h = bottom; - AM_clearFB(AMColors[AMColors.Background]); + clearFB(AMColors[AMColors.Background]); } else { @@ -3273,29 +3155,28 @@ void AM_Drawer (int bottom) f_w = viewwidth; f_h = viewheight; } - AM_activateNewScale(); + activateNewScale(); - if (am_textured && textured && !viewactive) - AM_drawSubsectors(); + if (am_textured && !viewactive) + drawSubsectors(); - if (grid) - AM_drawGrid(AMColors.GridColor); + if (am_showgrid) + drawGrid(AMColors.GridColor); - AM_drawWalls(allmap); - AM_drawPlayers(); + drawWalls(allmap); + drawPlayers(); if (G_SkillProperty(SKILLP_EasyKey)) - AM_drawKeys(); + drawKeys(); if ((am_cheat >= 2 && am_cheat != 4) || allthings) - AM_drawThings(); + drawThings(); - AM_drawAuthorMarkers(); + drawAuthorMarkers(); if (!viewactive) - AM_drawCrosshair(AMColors[AMColors.XHairColor]); + drawCrosshair(AMColors[AMColors.XHairColor]); - AM_drawMarks(); - - AM_showSS(); + drawMarks(); + showSS(); } //============================================================================= @@ -3304,14 +3185,154 @@ void AM_Drawer (int bottom) // //============================================================================= -void AM_SerializeMarkers(FSerializer &arc) +void DAutomap::Serialize(FSerializer &arc) { - if (arc.BeginObject("automarkers")) + // This only stores those variables which do not get set each time the automap is either activated or drawn. + // Especially the screen coordinates can not be brought over because the display settings may have changed. + arc("markpointnum", markpointnum) + .Array("markpoints", &markpoints[0].x, AM_NUMMARKPOINTS * 2) // write as a double array. + ("scale_mtof", scale_mtof) + ("scale_ftom", scale_ftom) + ("bigstate", bigstate) + ("min_x", min_x) + ("min_y", min_y) + ("max_x", max_x) + ("max_y", max_y) + ("min_w", min_w) + ("min_h", min_h) + ("max_w", max_w) + ("max_h", max_h) + ("min_scale_mtof", min_scale_mtof) + ("max_scale_mtof", max_scale_mtof) + ("mapback", mapback); + +} + + +//============================================================================= +// +// +// +//============================================================================= + +void DAutomap::UpdateShowAllLines() +{ + int val = am_showalllines; + int flagged = 0; + int total = 0; + if (val > 0 && Level->lines.Size() > 0) { - arc("markpointnum", markpointnum) - .Array("markpoints", &markpoints[0].x, AM_NUMMARKPOINTS*2) // write as a double array. - ("scale_mtof", scale_mtof) - ("scale_ftom", scale_ftom) - .EndObject(); + for (auto &line : Level->lines) + { + // disregard intra-sector lines + if (line.frontsector == line.backsector) continue; + + // disregard control sectors for deep water + if (line.frontsector->e->FakeFloor.Sectors.Size() > 0) continue; + + // disregard control sectors for 3D-floors + if (line.frontsector->e->XFloor.attached.Size() > 0) continue; + + total++; + if (line.flags & ML_DONTDRAW) flagged++; + } + am_showallenabled = (flagged * 100 / total >= val); + } + else if (val == 0) + { + am_showallenabled = true; + } + else + { + am_showallenabled = false; } } + +void DAutomap::GoBig() +{ + bigstate = !bigstate; + if (bigstate) + { + saveScaleAndLoc(); + minOutWindowScale(); + } + else + restoreScaleAndLoc(); +} + +void DAutomap::ResetFollowLocation() +{ + f_oldloc.x = FLT_MAX; +} + + +//============================================================================= +// +// +// +//============================================================================= + +void AM_Stop() +{ + automapactive = false; + viewactive = true; +} + +//============================================================================= +// +// +// +//============================================================================= + +void AM_ToggleMap() +{ + if (gamestate != GS_LEVEL) + return; + + // Don't activate the automap if we're not allowed to use it. + if (dmflags2 & DF2_NO_AUTOMAP) + return; + + // ... or if there is no automap. + if (!currentUILevel || !currentUILevel->automap) + return; + + if (!automapactive) + { + // Reset AM buttons + Button_AM_PanLeft.Reset(); + Button_AM_PanRight.Reset(); + Button_AM_PanUp.Reset(); + Button_AM_PanDown.Reset(); + Button_AM_ZoomIn.Reset(); + Button_AM_ZoomOut.Reset(); + + currentUILevel->automap->startDisplay(); + automapactive = true; + viewactive = (am_overlay != 0.f); + } + else + { + if (am_overlay == 1 && viewactive) + { + viewactive = false; + } + else + { + AM_Stop(); + } + } +} + +//============================================================================= +// +// +// +//============================================================================= + +DAutomapBase *AM_Create(FLevelLocals *Level) +{ + auto am = Create(); + am->Level = Level; + return am; +} diff --git a/src/am_map.h b/src/am_map.h index 22bb34670..3665e4438 100644 --- a/src/am_map.h +++ b/src/am_map.h @@ -22,31 +22,44 @@ #ifndef __AMMAP_H__ #define __AMMAP_H__ +#include "dobject.h" + struct event_t; class FSerializer; +struct FLevelLocals; +class DAutomapBase : public DObject +{ + DECLARE_ABSTRACT_CLASS(DAutomapBase, DObject); +public: + FLevelLocals *Level; // temporary location so that it can be set from the outside. + + // Called by main loop. + virtual bool Responder(event_t* ev, bool last) = 0; + + // Called by main loop. + virtual void Ticker(void) = 0; + + // Called by main loop, + // called instead of view drawer if automap active. + virtual void Drawer(int bottom) = 0; + + virtual void NewResolution() = 0; + virtual void LevelInit() = 0; + virtual void UpdateShowAllLines() = 0; + virtual void GoBig() = 0; + virtual void ResetFollowLocation() = 0; + virtual int addMark() = 0; + virtual bool clearMarks() = 0; + virtual DVector2 GetPosition() = 0; + virtual void startDisplay() = 0; + +}; void AM_StaticInit(); void AM_ClearColorsets(); // reset data for a restart. - -// Called by main loop. -bool AM_Responder (event_t* ev, bool last); - -// Called by main loop. -void AM_Ticker (void); - -// Called by main loop, -// called instead of view drawer if automap active. -void AM_Drawer (int bottom); - -// Called to force the automap to quit -// if the level is completed while it is up. -void AM_Stop (void); - -void AM_NewResolution (); -void AM_ToggleMap (); -void AM_LevelInit (); -void AM_SerializeMarkers(FSerializer &arc); - +DAutomapBase *AM_Create(FLevelLocals *Level); +void AM_Stop(); +void AM_ToggleMap(); #endif diff --git a/src/d_main.cpp b/src/d_main.cpp index d340e7cad..70363a70a 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -758,7 +758,7 @@ void D_Display () screen->DrawBlend(viewsec); if (automapactive) { - AM_Drawer (hud_althud? viewheight : StatusBar->GetTopOfStatusbar()); + currentUILevel->automap->Drawer (hud_althud? viewheight : StatusBar->GetTopOfStatusbar()); } // for timing the statusbar code. diff --git a/src/g_game.cpp b/src/g_game.cpp index a6b009aae..6c1f32227 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -955,7 +955,7 @@ bool G_Responder (event_t *ev) { if (ST_Responder (ev)) return true; // status window ate it - if (!viewactive && AM_Responder (ev, false)) + if (!viewactive && currentUILevel->automap->Responder (ev, false)) return true; // automap ate it } else if (gamestate == GS_FINALE) @@ -986,7 +986,7 @@ bool G_Responder (event_t *ev) // the events *last* so that any bound keys get precedence. if (gamestate == GS_LEVEL && viewactive) - return AM_Responder (ev, true); + return currentUILevel->automap->Responder (ev, true); return (ev->type == EV_KeyDown || ev->type == EV_Mouse); @@ -1179,7 +1179,7 @@ void G_Ticker () { case GS_LEVEL: P_Ticker (); - AM_Ticker (); + currentUILevel->automap->Ticker (); break; case GS_TITLELEVEL: diff --git a/src/g_level.cpp b/src/g_level.cpp index 7b41cbd26..211304069 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1019,9 +1019,8 @@ void G_DoLoadLevel (int position, bool autosave, bool newGame) E_NewGame(EventHandlerType::Global); } - P_SetupLevel (level.MapName, position, newGame); + P_SetupLevel (&level, position, newGame); - AM_LevelInit(); // [RH] Start lightning, if MAPINFO tells us to if (level.flags & LEVEL_STARTLIGHTNING) @@ -1126,6 +1125,7 @@ void G_DoLoadLevel (int position, bool autosave, bool newGame) { I_Error("no start for player %d found.", pnumerr); } + P_ResetSightCounters(true); } @@ -1452,8 +1452,6 @@ int G_FinishTravel () void FLevelLocals::Init() { - level_info_t *info; - BaseBlendA = 0.0f; // Remove underwater blend effect, if any gravity = sv_gravity * 35/TICRATE; @@ -1465,7 +1463,6 @@ void FLevelLocals::Init() info = FindLevelInfo (MapName); - info = info; skyspeed1 = info->skyspeed1; skyspeed2 = info->skyspeed2; skytexture1 = TexMan.GetTextureID(info->SkyPic1, ETextureType::Wall, FTextureManager::TEXMAN_Overridable | FTextureManager::TEXMAN_ReturnFirst); @@ -1976,6 +1973,7 @@ void FLevelLocals::Mark() GC::Mark(SpotState); GC::Mark(FraggleScriptThinker); GC::Mark(ACSThinker); + GC::Mark(automap); canvasTextureInfo.Mark(); for (auto &c : CorpseQueue) { diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 4ca5c831a..8cd4aa0ad 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -87,6 +87,7 @@ class DACSThinker; class DFraggleThinker; class DSpotState; struct FStrifeDialogueNode; +class DAutomapBase; typedef TMap FDialogueIDMap; // maps dialogue IDs to dialogue array index (for ACS) typedef TMap FDialogueMap; // maps actor class names to dialogue array index @@ -235,10 +236,10 @@ public: { return FLineIdIterator(tagManager, tag); } - template TThinkerIterator GetThinkerIterator(FName subtype = NAME_None) + template TThinkerIterator GetThinkerIterator(FName subtype = NAME_None, int statnum = MAX_STATNUM+1) { - if (subtype == NAME_None) return TThinkerIterator(); - else return TThinkerIterator(subtype); + if (subtype == NAME_None) return TThinkerIterator(statnum); + else return TThinkerIterator(subtype, statnum); } FActorIterator GetActorIterator(int tid) { @@ -357,6 +358,7 @@ public: static const int BODYQUESIZE = 32; TObjPtr bodyque[BODYQUESIZE]; + TObjPtr automap; int bodyqueslot; int NumMapSections; diff --git a/src/namedef.h b/src/namedef.h index e3f596b06..8e1aaceda 100644 --- a/src/namedef.h +++ b/src/namedef.h @@ -1075,3 +1075,4 @@ xx(lightflags) xx(lighttype) xx(InternalDynamicLight) xx(_a_chase_default) +xx(MapMarker) \ No newline at end of file diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index c6eb7e925..529865a2f 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -965,7 +965,8 @@ void G_SerializeLevel(FSerializer &arc, FLevelLocals *Level, bool hubload) ("fragglethinker", Level->FraggleScriptThinker) ("acsthinker", Level->ACSThinker) ("impactdecalcount", Level->ImpactDecalCount) - ("scrolls", Level->Scrolls); + ("scrolls", Level->Scrolls) + ("automap", Level->automap); // Hub transitions must keep the current total time @@ -988,7 +989,10 @@ void G_SerializeLevel(FSerializer &arc, FLevelLocals *Level, bool hubload) arc("zones", Level->Zones); arc("lineportals", Level->linePortals); arc("sectorportals", Level->sectorPortals); - if (arc.isReading()) Level->FinalizePortals(); + if (arc.isReading()) + { + Level->FinalizePortals(); + } // [ZZ] serialize health groups P_SerializeHealthGroups(arc); @@ -998,12 +1002,12 @@ void G_SerializeLevel(FSerializer &arc, FLevelLocals *Level, bool hubload) arc("polyobjs", Level->Polyobjects); SerializeSubsectors(arc, "subsectors"); StatusBar->SerializeMessages(arc); - AM_SerializeMarkers(arc); FRemapTable::StaticSerializeTranslations(arc); Level->canvasTextureInfo.Serialize(arc); P_SerializePlayers(Level, arc, hubload); P_SerializeSounds(arc); + // Regenerate some data that wasn't saved if (arc.isReading()) { for (auto &sec : Level->sectors) @@ -1012,12 +1016,17 @@ void G_SerializeLevel(FSerializer &arc, FLevelLocals *Level, bool hubload) } for (int i = 0; i < MAXPLAYERS; ++i) { - if (playeringame[i] && players[i].mo != NULL) + if (playeringame[i] && players[i].mo != nullptr) { FWeaponSlots::SetupWeaponSlots(players[i].mo); } } + AActor::RecreateAllAttachedLights(); + InitPortalGroups(Level); + + Level->automap->Level = Level; // Temporary workaround. At the moment this cannot be deserialized yet. + Level->automap->UpdateShowAllLines(); + } - AActor::RecreateAllAttachedLights(); - InitPortalGroups(Level); + } diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 0fff24c55..6459065fb 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -71,6 +71,7 @@ #include "a_specialspot.h" #include "maploader/maploader.h" #include "p_acs.h" +#include "am_map.h" #include "fragglescript/t_script.h" void P_ClearUDMFKeys(); @@ -260,6 +261,8 @@ void FLevelLocals::ClearPortals() void FLevelLocals::ClearLevelData() { + ClearAllSubsectorLinks(); // can't be done as part of the polyobj deletion process. + total_monsters = total_items = total_secrets = killed_monsters = found_items = found_secrets = wminfo.maxfrags = 0; @@ -348,7 +351,6 @@ void P_FreeLevelData () P_ClearUDMFKeys(); interpolator.ClearInterpolations(); // [RH] Nothing to interpolate on a fresh level. - level.ClearAllSubsectorLinks(); // can't be done as part of the polyobj deletion process. SN_StopAllSequences (); DThinker::DestroyAllThinkers (); @@ -363,20 +365,20 @@ void P_FreeLevelData () // //=========================================================================== -void P_SetupLevel(const char *lumpname, int position, bool newGame) +void P_SetupLevel(FLevelLocals *Level, int position, bool newGame) { int i; - level.ShaderStartTime = I_msTimeFS(); // indicate to the shader system that the level just started + Level->ShaderStartTime = I_msTimeFS(); // indicate to the shader system that the level just started // This is motivated as follows: - level.maptype = MAPTYPE_UNKNOWN; + Level->maptype = MAPTYPE_UNKNOWN; wminfo.partime = 180; if (!savegamerestore) { - level.SetMusicVolume(level.MusicVolume); + Level->SetMusicVolume(Level->MusicVolume); for (i = 0; i < MAXPLAYERS; ++i) { players[i].killcount = players[i].secretcount @@ -411,10 +413,10 @@ void P_SetupLevel(const char *lumpname, int position, bool newGame) // Free all level data from the previous map P_FreeLevelData(); - MapData *map = P_OpenMapData(lumpname, true); + MapData *map = P_OpenMapData(Level->MapName, true); if (map == nullptr) { - I_Error("Unable to open map '%s'\n", lumpname); + I_Error("Unable to open map '%s'\n", Level->MapName.GetChars()); } // [ZZ] init per-map static handlers. we need to call this before everything is set up because otherwise scripts don't receive PlayerEntered event @@ -422,17 +424,17 @@ void P_SetupLevel(const char *lumpname, int position, bool newGame) E_InitStaticHandlers(true); // generate a checksum for the level, to be included and checked with savegames. - map->GetChecksum(level.md5); + map->GetChecksum(Level->md5); // find map num - level.lumpnum = map->lumpnum; + Level->lumpnum = map->lumpnum; if (newGame) { E_NewGame(EventHandlerType::PerMap); } - MapLoader loader(&level); - loader.LoadLevel(map, lumpname, position); + MapLoader loader(Level); + loader.LoadLevel(map, Level->MapName.GetChars(), position); delete map; // if deathmatch, randomly spawn the active players @@ -448,7 +450,7 @@ void P_SetupLevel(const char *lumpname, int position, bool newGame) } } // the same, but for random single/coop player starts - else if (level.flags2 & LEVEL2_RANDOMPLAYERSTARTS) + else if (Level->flags2 & LEVEL2_RANDOMPLAYERSTARTS) { for (i = 0; i < MAXPLAYERS; ++i) { @@ -456,14 +458,14 @@ void P_SetupLevel(const char *lumpname, int position, bool newGame) { players[i].mo = nullptr; FPlayerStart *mthing = G_PickPlayerStart(i); - P_SpawnPlayer(mthing, i, (level.flags2 & LEVEL2_PRERAISEWEAPON) ? SPF_WEAPONFULLYUP : 0); + P_SpawnPlayer(mthing, i, (Level->flags2 & LEVEL2_PRERAISEWEAPON) ? SPF_WEAPONFULLYUP : 0); } } } // [SP] move unfriendly players around // horribly hacky - yes, this needs rewritten. - if (level.deathmatchstarts.Size() > 0) + if (Level->deathmatchstarts.Size() > 0) { for (i = 0; i < MAXPLAYERS; ++i) { @@ -522,7 +524,7 @@ void P_SetupLevel(const char *lumpname, int position, bool newGame) // This check was previously done at run time each time the heightsec was checked. // However, since 3D floors are static data, we can easily precalculate this and store it in the sector's flags for quick access. - for (auto &s : level.sectors) + for (auto &s : Level->sectors) { if (s.heightsec != nullptr) { @@ -537,17 +539,18 @@ void P_SetupLevel(const char *lumpname, int position, bool newGame) } } - P_ResetSightCounters(true); - // 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. // Note that we want binary identity here, so assignment is not sufficient because it won't initialize any padding bytes. // Note that none of these structures may contain non POD fields anyway. - level.loadsectors.Resize(level.sectors.Size()); - memcpy(&level.loadsectors[0], &level.sectors[0], level.sectors.Size() * sizeof(level.sectors[0])); - level.loadlines.Resize(level.lines.Size()); - memcpy(&level.loadlines[0], &level.lines[0], level.lines.Size() * sizeof(level.lines[0])); - level.loadsides.Resize(level.sides.Size()); - memcpy(&level.loadsides[0], &level.sides[0], level.sides.Size() * sizeof(level.sides[0])); + Level->loadsectors.Resize(Level->sectors.Size()); + memcpy(&Level->loadsectors[0], &Level->sectors[0], Level->sectors.Size() * sizeof(Level->sectors[0])); + Level->loadlines.Resize(Level->lines.Size()); + memcpy(&Level->loadlines[0], &Level->lines[0], Level->lines.Size() * sizeof(Level->lines[0])); + Level->loadsides.Resize(Level->sides.Size()); + memcpy(&Level->loadsides[0], &Level->sides[0], Level->sides.Size() * sizeof(Level->sides[0])); + + Level->automap = AM_Create(Level); + Level->automap->LevelInit(); } // diff --git a/src/p_setup.h b/src/p_setup.h index a85801a32..8588ada68 100644 --- a/src/p_setup.h +++ b/src/p_setup.h @@ -146,7 +146,7 @@ bool P_CheckMapData(const char * mapname); // [RH] The only parameter used is mapname, so I removed playermask and skill. // On September 1, 1998, I added the position to indicate which set // of single-player start spots should be spawned in the level. -void P_SetupLevel (const char *mapname, int position, bool newGame); +void P_SetupLevel (FLevelLocals *Level, int position, bool newGame); void P_FreeLevelData(); diff --git a/src/scripting/vmthunks.cpp b/src/scripting/vmthunks.cpp index 34b9f40d8..0db6a86b9 100644 --- a/src/scripting/vmthunks.cpp +++ b/src/scripting/vmthunks.cpp @@ -46,6 +46,7 @@ #include "d_player.h" #include "p_setup.h" #include "i_music.h" +#include "am_map.h" DVector2 AM_GetPosition(); int Net_GetLatency(int *ld, int *ad); @@ -2529,15 +2530,17 @@ DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, FormatMapName, FormatMapName) ACTION_RETURN_STRING(rets); } -static void GetAutomapPosition(DVector2 *pos) +static void GetAutomapPosition(FLevelLocals *self, DVector2 *pos) { - *pos = AM_GetPosition(); + *pos = self->automap->GetPosition(); } DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, GetAutomapPosition, GetAutomapPosition) { - PARAM_PROLOGUE; - ACTION_RETURN_VEC2(AM_GetPosition()); + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); + DVector2 result; + GetAutomapPosition(self, &result); + ACTION_RETURN_VEC2(result); } static int ZGetUDMFInt(FLevelLocals *self, int type, int index, int key) diff --git a/src/v_video.cpp b/src/v_video.cpp index 61e79b585..6e0299bbb 100644 --- a/src/v_video.cpp +++ b/src/v_video.cpp @@ -66,6 +66,8 @@ #include "r_videoscale.h" #include "i_time.h" #include "version.h" +#include "g_levellocals.h" +#include "am_map.h" EXTERN_CVAR(Bool, cl_capfps) EXTERN_CVAR(Int, menu_resolution_custom_width) @@ -592,7 +594,8 @@ void V_OutputResized (int width, int height) C_NewModeAdjust(); // Reload crosshair if transitioned to a different size ST_LoadCrosshair(true); - AM_NewResolution(); + if (currentUILevel && currentUILevel->automap) + currentUILevel->automap->NewResolution(); } void V_CalcCleanFacs (int designwidth, int designheight, int realwidth, int realheight, int *cleanx, int *cleany, int *_cx1, int *_cx2) diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index d31692b9f..775a38488 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -687,7 +687,7 @@ struct LevelLocals native native static void StartSlideshow(Name whichone = 'none'); native static void WorldDone(); native static void RemoveAllBots(bool fromlist); - native static Vector2 GetAutomapPosition(); + native ui Vector2 GetAutomapPosition(); native void SetInterMusic(String nextmap); native String FormatMapName(int mapnamecolor); native bool IsJumpingAllowed() const; @@ -722,8 +722,8 @@ struct LevelLocals native return String.Format("%02d:%02d:%02d", sec / 3600, (sec % 3600) / 60, sec % 60); } - native bool CreateCeiling(sector sec, int type, line ln, double speed, double speed2, double height = 0, int crush = -1, int silent = 0, int change = 0, int crushmode = crushDoom); - native bool CreateFloor(sector sec, EFloor floortype, line ln, double speed, double height = 0, int crush = -1, int change = 0, bool crushmode = false, bool hereticlower = false); + native bool CreateCeiling(sector sec, int type, line ln, double speed, double speed2, double height = 0, int crush = -1, int silent = 0, int change = 0, int crushmode = 0 /*Floor.crushDoom*/); + native bool CreateFloor(sector sec, int floortype, line ln, double speed, double height = 0, int crush = -1, int change = 0, bool crushmode = false, bool hereticlower = false); } @@ -926,7 +926,7 @@ class Floor : MovingFloor native genFloorChg }; - deprecated("3.8") static bool CreateFloor(sector sec, EFloor floortype, line ln, double speed, double height = 0, int crush = -1, int change = 0, bool crushmode = false, bool hereticlower = false) + deprecated("3.8") static bool CreateFloor(sector sec, int floortype, line ln, double speed, double height = 0, int crush = -1, int change = 0, bool crushmode = false, bool hereticlower = false) { return level.CreateFloor(sec, floortype, ln, speed, height, crush, change, crushmode, hereticlower); } diff --git a/wadsrc/static/zscript/statusbar/alt_hud.txt b/wadsrc/static/zscript/statusbar/alt_hud.txt index 99a62603a..93b21cdda 100644 --- a/wadsrc/static/zscript/statusbar/alt_hud.txt +++ b/wadsrc/static/zscript/statusbar/alt_hud.txt @@ -31,11 +31,6 @@ ** */ -/* - -DVector2 AM_GetPosition(); -*/ - class AltHud ui { TextureID tnt1a0; From 0e5320cb3a0ce747e73273309c4d86f893ef5574 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sat, 26 Jan 2019 17:22:35 +0200 Subject: [PATCH 025/164] - fixed linking of optimized targets Undefined symbols for architecture x86_64: "AActor::Vec3Angle(double, TAngle, double, bool)", referenced from: Net_DoCommand(int, unsigned char**, int) in d_net.cpp.o --- src/d_net.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/d_net.cpp b/src/d_net.cpp index 2fc7c81c3..f5ef8aef0 100644 --- a/src/d_net.cpp +++ b/src/d_net.cpp @@ -61,6 +61,7 @@ #include "a_keys.h" #include "intermission/intermission.h" #include "g_levellocals.h" +#include "actorinlines.h" #include "events.h" #include "i_time.h" #include "vm.h" From fe06c49e3429fa5727d97e031f64e7687f401206 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 26 Jan 2019 17:54:58 +0100 Subject: [PATCH 026/164] - fixed: DAutomap::Serialize needs to call its super method. --- src/am_map.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/am_map.cpp b/src/am_map.cpp index 28f9d4d63..3116dc5be 100644 --- a/src/am_map.cpp +++ b/src/am_map.cpp @@ -3187,6 +3187,7 @@ void DAutomap::Drawer (int bottom) void DAutomap::Serialize(FSerializer &arc) { + Super::Serialize(arc); // This only stores those variables which do not get set each time the automap is either activated or drawn. // Especially the screen coordinates can not be brought over because the display settings may have changed. arc("markpointnum", markpointnum) From e5139cc3259bb3766fb58e1e152e43d284ce0f9f Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 26 Jan 2019 17:55:15 +0100 Subject: [PATCH 027/164] - moved all EV_Light* functions and G_SerializeLevel into FLevelLocals --- src/g_level.cpp | 4 +- src/g_levellocals.h | 16 ++ src/p_doors.cpp | 4 +- src/p_lights.cpp | 512 ++++++++++++++++++++++---------------------- src/p_lnspec.cpp | 22 +- src/p_saveg.cpp | 133 ++++++------ src/p_saveg.h | 2 - src/p_spec.h | 15 -- 8 files changed, 353 insertions(+), 355 deletions(-) diff --git a/src/g_level.cpp b/src/g_level.cpp index 211304069..f2e935700 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1658,7 +1658,7 @@ void G_SnapshotLevel () if (arc.OpenWriter(save_formatted)) { SaveVersion = SAVEVER; - G_SerializeLevel(arc, &level, false); + level.Serialize(arc, false); level.info->Snapshot = arc.GetCompressedOutput(); } } @@ -1685,7 +1685,7 @@ void G_UnSnapshotLevel (bool hubLoad) return; } - G_SerializeLevel (arc, &level, hubLoad); + level.Serialize (arc, hubLoad); level.FromSnapshot = true; TThinkerIterator it(NAME_PlayerPawn); diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 8cd4aa0ad..b9787f45c 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -216,6 +216,22 @@ public: bool EV_StartWaggle(int tag, line_t *line, int height, int speed, int offset, int timer, bool ceiling); bool EV_DoChange(line_t *line, EChange changetype, int tag); + void EV_StartLightFlickering(int tag, int upper, int lower); + void EV_StartLightStrobing(int tag, int upper, int lower, int utics, int ltics); + void EV_StartLightStrobing(int tag, int utics, int ltics); + void EV_TurnTagLightsOff(int tag); + void EV_LightTurnOn(int tag, int bright); + void EV_LightTurnOnPartway(int tag, double frac); + void EV_LightChange(int tag, int value); + void EV_StartLightGlowing(int tag, int upper, int lower, int tics); + void EV_StartLightFading(int tag, int value, int tics); + void EV_StopLightEffect(int tag); + + void RecalculateDrawnSubsectors(); + FSerializer &SerializeSubsectors(FSerializer &arc, const char *key); + void SpawnExtraPlayers(); + void Serialize(FSerializer &arc, bool hubload); + private: // Work data for CollectConnectedGroups. FPortalBits processMask; diff --git a/src/p_doors.cpp b/src/p_doors.cpp index 2fbdd19f3..b43ad17a7 100644 --- a/src/p_doors.cpp +++ b/src/p_doors.cpp @@ -132,7 +132,7 @@ void DDoor::Tick () // killough 10/98: implement gradual lighting effects if (m_LightTag != 0 && m_TopDist != -m_Sector->floorplane.fD()) { - EV_LightTurnOnPartway (m_LightTag, + level.EV_LightTurnOnPartway (m_LightTag, (m_Sector->ceilingplane.fD() + m_Sector->floorplane.fD()) / (m_TopDist + m_Sector->floorplane.fD())); } @@ -178,7 +178,7 @@ void DDoor::Tick () // killough 10/98: implement gradual lighting effects if (m_LightTag != 0 && m_TopDist != -m_Sector->floorplane.fD()) { - EV_LightTurnOnPartway (m_LightTag, + level.EV_LightTurnOnPartway (m_LightTag, (m_Sector->ceilingplane.fD() + m_Sector->floorplane.fD()) / (m_TopDist + m_Sector->floorplane.fD())); } diff --git a/src/p_lights.cpp b/src/p_lights.cpp index 365ea8265..636bc4899 100644 --- a/src/p_lights.cpp +++ b/src/p_lights.cpp @@ -181,23 +181,6 @@ DFlicker::DFlicker (sector_t *sector, int upper, int lower) m_Count = (pr_flicker()&64)+1; } -//----------------------------------------------------------------------------- -// -// -// -//----------------------------------------------------------------------------- - -void EV_StartLightFlickering (int tag, int upper, int lower) -{ - int secnum; - auto it = level.GetSectorTagIterator(tag); - while ((secnum = it.Next()) >= 0) - { - Create (&level.sectors[secnum], upper, lower); - } -} - - //----------------------------------------------------------------------------- // // BROKEN LIGHT FLASHING @@ -349,178 +332,7 @@ DStrobe::DStrobe (sector_t *sector, int utics, int ltics, bool inSync) -//----------------------------------------------------------------------------- -// -// Start strobing lights (usually from a trigger) -// [RH] Made it more configurable. -// -//----------------------------------------------------------------------------- -void EV_StartLightStrobing (int tag, int upper, int lower, int utics, int ltics) -{ - int secnum; - auto it = level.GetSectorTagIterator(tag); - while ((secnum = it.Next()) >= 0) - { - sector_t *sec = &level.sectors[secnum]; - if (sec->lightingdata) - continue; - - Create (sec, upper, lower, utics, ltics); - } -} - -void EV_StartLightStrobing (int tag, int utics, int ltics) -{ - int secnum; - auto it = level.GetSectorTagIterator(tag); - while ((secnum = it.Next()) >= 0) - { - sector_t *sec = &level.sectors[secnum]; - if (sec->lightingdata) - continue; - - Create (sec, utics, ltics, false); - } -} - - -//----------------------------------------------------------------------------- -// -// TURN LINE'S TAG LIGHTS OFF -// [RH] Takes a tag instead of a line -// -//----------------------------------------------------------------------------- - -void EV_TurnTagLightsOff (int tag) -{ - int secnum; - auto it = level.GetSectorTagIterator(tag); - while ((secnum = it.Next()) >= 0) - { - sector_t *sector = &level.sectors[secnum]; - int min = sector->lightlevel; - - for (auto ln : sector->Lines) - { - sector_t *tsec = getNextSector (ln, sector); - if (!tsec) - continue; - if (tsec->lightlevel < min) - min = tsec->lightlevel; - } - sector->SetLightLevel(min); - } -} - - -//----------------------------------------------------------------------------- -// -// TURN LINE'S TAG LIGHTS ON -// [RH] Takes a tag instead of a line -// -//----------------------------------------------------------------------------- - -void EV_LightTurnOn (int tag, int bright) -{ - int secnum; - auto it = level.GetSectorTagIterator(tag); - while ((secnum = it.Next()) >= 0) - { - sector_t *sector = &level.sectors[secnum]; - int tbright = bright; //jff 5/17/98 search for maximum PER sector - - // bright = -1 means to search ([RH] Not 0) - // for highest light level - // surrounding sector - if (bright < 0) - { - for (auto ln : sector->Lines) - { - sector_t *temp = getNextSector(ln, sector); - - if (!temp) - continue; - - if (temp->lightlevel > tbright) - tbright = temp->lightlevel; - } - } - sector->SetLightLevel(tbright); - - //jff 5/17/98 unless compatibility optioned - //then maximum near ANY tagged sector - if (i_compatflags & COMPATF_LIGHT) - { - bright = tbright; - } - } -} - -//----------------------------------------------------------------------------- -// -// killough 10/98 -// -// EV_LightTurnOnPartway -// -// Turn sectors tagged to line lights on to specified or max neighbor level -// -// Passed the tag of sector(s) to light and a light level fraction between 0 and 1. -// Sets the light to min on 0, max on 1, and interpolates in-between. -// Used for doors with gradual lighting effects. -// -//----------------------------------------------------------------------------- - -void EV_LightTurnOnPartway (int tag, double frac) -{ - frac = clamp(frac, 0., 1.); - - // Search all sectors for ones with same tag as activating line - int secnum; - auto it = level.GetSectorTagIterator(tag); - while ((secnum = it.Next()) >= 0) - { - sector_t *temp, *sector = &level.sectors[secnum]; - int bright = 0, min = sector->lightlevel; - - for (auto ln : sector->Lines) - { - if ((temp = getNextSector (ln, sector)) != nullptr) - { - if (temp->lightlevel > bright) - { - bright = temp->lightlevel; - } - if (temp->lightlevel < min) - { - min = temp->lightlevel; - } - } - } - sector->SetLightLevel(int(frac * bright + (1 - frac) * min)); - } -} - - -//----------------------------------------------------------------------------- -// -// [RH] New function to adjust tagged sectors' light levels -// by a relative amount. Light levels are clipped to -// be within range for sector_t::lightlevel. -// -//----------------------------------------------------------------------------- - -void EV_LightChange (int tag, int value) -{ - int secnum; - auto it = level.GetSectorTagIterator(tag); - while ((secnum = it.Next()) >= 0) - { - level.sectors[secnum].SetLightLevel(level.sectors[secnum].lightlevel + value); - } -} - - //----------------------------------------------------------------------------- // // Spawn glowing light @@ -649,72 +461,6 @@ DGlow2::DGlow2 (sector_t *sector, int start, int end, int tics, bool oneshot) m_OneShot = oneshot; } -//----------------------------------------------------------------------------- -// -// -// -//----------------------------------------------------------------------------- - -void EV_StartLightGlowing (int tag, int upper, int lower, int tics) -{ - int secnum; - - // If tics is non-positive, then we can't really do anything. - if (tics <= 0) - { - return; - } - - if (upper < lower) - { - int temp = upper; - upper = lower; - lower = temp; - } - - auto it = level.GetSectorTagIterator(tag); - while ((secnum = it.Next()) >= 0) - { - sector_t *sec = &level.sectors[secnum]; - if (sec->lightingdata) - continue; - - Create (sec, upper, lower, tics, false); - } -} - -//----------------------------------------------------------------------------- -// -// -// -//----------------------------------------------------------------------------- - -void EV_StartLightFading (int tag, int value, int tics) -{ - int secnum; - auto it = level.GetSectorTagIterator(tag); - while ((secnum = it.Next()) >= 0) - { - sector_t *sec = &level.sectors[secnum]; - if (sec->lightingdata) - continue; - - if (tics <= 0) - { - sec->SetLightLevel(value); - } - else - { - // No need to fade if lightlevel is already at desired value. - if (sec->lightlevel == value) - continue; - - Create (sec, sec->lightlevel, value, tics, true); - } - } -} - - //----------------------------------------------------------------------------- // // [RH] Phased lighting ala Hexen, but implemented without the help of the Hexen source @@ -819,6 +565,260 @@ DPhased::DPhased (sector_t *sector, int baselevel, int phase) m_Phase = phase; } +//----------------------------------------------------------------------------- +// +// +// +//----------------------------------------------------------------------------- + +void FLevelLocals::EV_StartLightFlickering(int tag, int upper, int lower) +{ + int secnum; + auto it = GetSectorTagIterator(tag); + while ((secnum = it.Next()) >= 0) + { + Create(§ors[secnum], upper, lower); + } +} + + +//----------------------------------------------------------------------------- +// +// Start strobing lights (usually from a trigger) +// [RH] Made it more configurable. +// +//----------------------------------------------------------------------------- + +void FLevelLocals::EV_StartLightStrobing(int tag, int upper, int lower, int utics, int ltics) +{ + int secnum; + auto it = GetSectorTagIterator(tag); + while ((secnum = it.Next()) >= 0) + { + sector_t *sec = §ors[secnum]; + if (sec->lightingdata) + continue; + + Create(sec, upper, lower, utics, ltics); + } +} + +void FLevelLocals::EV_StartLightStrobing(int tag, int utics, int ltics) +{ + int secnum; + auto it = GetSectorTagIterator(tag); + while ((secnum = it.Next()) >= 0) + { + sector_t *sec = §ors[secnum]; + if (sec->lightingdata) + continue; + + Create(sec, utics, ltics, false); + } +} + + +//----------------------------------------------------------------------------- +// +// TURN LINE'S TAG LIGHTS OFF +// [RH] Takes a tag instead of a line +// +//----------------------------------------------------------------------------- + +void FLevelLocals::EV_TurnTagLightsOff(int tag) +{ + int secnum; + auto it = GetSectorTagIterator(tag); + while ((secnum = it.Next()) >= 0) + { + sector_t *sector = §ors[secnum]; + int min = sector->lightlevel; + + for (auto ln : sector->Lines) + { + sector_t *tsec = getNextSector(ln, sector); + if (!tsec) + continue; + if (tsec->lightlevel < min) + min = tsec->lightlevel; + } + sector->SetLightLevel(min); + } +} + + +//----------------------------------------------------------------------------- +// +// TURN LINE'S TAG LIGHTS ON +// [RH] Takes a tag instead of a line +// +//----------------------------------------------------------------------------- + +void FLevelLocals::EV_LightTurnOn(int tag, int bright) +{ + int secnum; + auto it = GetSectorTagIterator(tag); + while ((secnum = it.Next()) >= 0) + { + sector_t *sector = §ors[secnum]; + int tbright = bright; //jff 5/17/98 search for maximum PER sector + + // bright = -1 means to search ([RH] Not 0) + // for highest light level + // surrounding sector + if (bright < 0) + { + for (auto ln : sector->Lines) + { + sector_t *temp = getNextSector(ln, sector); + + if (!temp) + continue; + + if (temp->lightlevel > tbright) + tbright = temp->lightlevel; + } + } + sector->SetLightLevel(tbright); + + //jff 5/17/98 unless compatibility optioned + //then maximum near ANY tagged sector + if (i_compatflags & COMPATF_LIGHT) + { + bright = tbright; + } + } +} + +//----------------------------------------------------------------------------- +// +// killough 10/98 +// +// EV_LightTurnOnPartway +// +// Turn sectors tagged to line lights on to specified or max neighbor level +// +// Passed the tag of sector(s) to light and a light level fraction between 0 and 1. +// Sets the light to min on 0, max on 1, and interpolates in-between. +// Used for doors with gradual lighting effects. +// +//----------------------------------------------------------------------------- + +void FLevelLocals::EV_LightTurnOnPartway(int tag, double frac) +{ + frac = clamp(frac, 0., 1.); + + // Search all sectors for ones with same tag as activating line + int secnum; + auto it = GetSectorTagIterator(tag); + while ((secnum = it.Next()) >= 0) + { + sector_t *temp, *sector = §ors[secnum]; + int bright = 0, min = sector->lightlevel; + + for (auto ln : sector->Lines) + { + if ((temp = getNextSector(ln, sector)) != nullptr) + { + if (temp->lightlevel > bright) + { + bright = temp->lightlevel; + } + if (temp->lightlevel < min) + { + min = temp->lightlevel; + } + } + } + sector->SetLightLevel(int(frac * bright + (1 - frac) * min)); + } +} + + +//----------------------------------------------------------------------------- +// +// [RH] New function to adjust tagged sectors' light levels +// by a relative amount. Light levels are clipped to +// be within range for sector_t::light +// +//----------------------------------------------------------------------------- + +void FLevelLocals::EV_LightChange(int tag, int value) +{ + int secnum; + auto it = GetSectorTagIterator(tag); + while ((secnum = it.Next()) >= 0) + { + sectors[secnum].SetLightLevel(sectors[secnum].lightlevel + value); + } +} + +//----------------------------------------------------------------------------- +// +// +// +//----------------------------------------------------------------------------- + +void FLevelLocals::EV_StartLightGlowing(int tag, int upper, int lower, int tics) +{ + int secnum; + + // If tics is non-positive, then we can't really do anything. + if (tics <= 0) + { + return; + } + + if (upper < lower) + { + int temp = upper; + upper = lower; + lower = temp; + } + + auto it = GetSectorTagIterator(tag); + while ((secnum = it.Next()) >= 0) + { + sector_t *sec = §ors[secnum]; + if (sec->lightingdata) + continue; + + Create(sec, upper, lower, tics, false); + } +} + +//----------------------------------------------------------------------------- +// +// +// +//----------------------------------------------------------------------------- + +void FLevelLocals::EV_StartLightFading(int tag, int value, int tics) +{ + int secnum; + auto it = GetSectorTagIterator(tag); + while ((secnum = it.Next()) >= 0) + { + sector_t *sec = §ors[secnum]; + if (sec->lightingdata) + continue; + + if (tics <= 0) + { + sec->SetLightLevel(value); + } + else + { + // No need to fade if lightlevel is already at desired value. + if (sec->lightlevel == value) + continue; + + Create(sec, sec->lightlevel, value, tics, true); + } + } +} + + //============================================================================ // // EV_StopLightEffect @@ -827,14 +827,14 @@ DPhased::DPhased (sector_t *sector, int baselevel, int phase) // //============================================================================ -void EV_StopLightEffect (int tag) +void FLevelLocals::EV_StopLightEffect (int tag) { TThinkerIterator iterator; DLighting *effect; while ((effect = iterator.Next()) != NULL) { - if (level.SectorHasTag(effect->GetSector(), tag)) + if (SectorHasTag(effect->GetSector(), tag)) { effect->Destroy(); } diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index 9d184d54f..a68bf9f34 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -2076,77 +2076,77 @@ FUNC(LS_Light_ForceLightning) FUNC(LS_Light_RaiseByValue) // Light_RaiseByValue (tag, value) { - EV_LightChange (arg0, arg1); + Level->EV_LightChange (arg0, arg1); return true; } FUNC(LS_Light_LowerByValue) // Light_LowerByValue (tag, value) { - EV_LightChange (arg0, -arg1); + Level->EV_LightChange (arg0, -arg1); return true; } FUNC(LS_Light_ChangeToValue) // Light_ChangeToValue (tag, value) { - EV_LightTurnOn (arg0, arg1); + Level->EV_LightTurnOn (arg0, arg1); return true; } FUNC(LS_Light_Fade) // Light_Fade (tag, value, tics); { - EV_StartLightFading (arg0, arg1, TICS(arg2)); + Level->EV_StartLightFading (arg0, arg1, TICS(arg2)); return true; } FUNC(LS_Light_Glow) // Light_Glow (tag, upper, lower, tics) { - EV_StartLightGlowing (arg0, arg1, arg2, TICS(arg3)); + Level->EV_StartLightGlowing (arg0, arg1, arg2, TICS(arg3)); return true; } FUNC(LS_Light_Flicker) // Light_Flicker (tag, upper, lower) { - EV_StartLightFlickering (arg0, arg1, arg2); + Level->EV_StartLightFlickering (arg0, arg1, arg2); return true; } FUNC(LS_Light_Strobe) // Light_Strobe (tag, upper, lower, u-tics, l-tics) { - EV_StartLightStrobing (arg0, arg1, arg2, TICS(arg3), TICS(arg4)); + Level->EV_StartLightStrobing (arg0, arg1, arg2, TICS(arg3), TICS(arg4)); return true; } FUNC(LS_Light_StrobeDoom) // Light_StrobeDoom (tag, u-tics, l-tics) { - EV_StartLightStrobing (arg0, TICS(arg1), TICS(arg2)); + Level->EV_StartLightStrobing (arg0, TICS(arg1), TICS(arg2)); return true; } FUNC(LS_Light_MinNeighbor) // Light_MinNeighbor (tag) { - EV_TurnTagLightsOff (arg0); + Level->EV_TurnTagLightsOff (arg0); return true; } FUNC(LS_Light_MaxNeighbor) // Light_MaxNeighbor (tag) { - EV_LightTurnOn (arg0, -1); + Level->EV_LightTurnOn (arg0, -1); return true; } FUNC(LS_Light_Stop) // Light_Stop (tag) { - EV_StopLightEffect (arg0); + Level->EV_StopLightEffect (arg0); return true; } diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 529865a2f..689ebc750 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -314,9 +314,9 @@ FSerializer &Serialize(FSerializer &arc, const char *key, sector_t &p, sector_t // //========================================================================== -void RecalculateDrawnSubsectors() +void FLevelLocals::RecalculateDrawnSubsectors() { - for (auto &sub : level.subsectors) + for (auto &sub : subsectors) { for (unsigned int j = 0; j encoded(1 + (numsubsectors + 5) / 6); @@ -350,7 +350,7 @@ FSerializer &SerializeSubsectors(FSerializer &arc, const char *key) by = 0; for (unsigned j = 0; j < 6; j++) { - if (i + j < numsubsectors && (level.subsectors[i + j].flags & SSECMF_DRAWN)) + if (i + j < numsubsectors && (subsectors[i + j].flags & SSECMF_DRAWN)) { by |= (1 << j); } @@ -366,7 +366,7 @@ FSerializer &SerializeSubsectors(FSerializer &arc, const char *key) str = &encoded[0]; if (arc.BeginArray(key)) { - auto numvertexes = level.vertexes.Size(); + auto numvertexes = vertexes.Size(); arc(nullptr, numvertexes) (nullptr, numsubsectors) .StringPtr(nullptr, str) @@ -384,7 +384,7 @@ FSerializer &SerializeSubsectors(FSerializer &arc, const char *key) .StringPtr(nullptr, str) .EndArray(); - if (num_verts == (int)level.vertexes.Size() && num_subs == (int)numsubsectors) + if (num_verts == (int)vertexes.Size() && num_subs == (int)numsubsectors) { success = true; int sub = 0; @@ -405,7 +405,7 @@ FSerializer &SerializeSubsectors(FSerializer &arc, const char *key) { if (sub + s < (int)numsubsectors && (by & (1 << s))) { - level.subsectors[sub + s].flags |= SSECMF_DRAWN; + subsectors[sub + s].flags |= SSECMF_DRAWN; } } sub += 6; @@ -559,7 +559,6 @@ void P_SerializeSounds(FSerializer &arc) void CopyPlayer(player_t *dst, player_t *src, const char *name); static void ReadOnePlayer(FSerializer &arc, bool skipload); static void ReadMultiplePlayers(FSerializer &arc, int numPlayers, int numPlayersNow, bool skipload); -static void SpawnExtraPlayers(FLevelLocals *Level); //========================================================================== // @@ -624,7 +623,7 @@ void P_SerializePlayers(FLevelLocals *Level, FSerializer &arc, bool skipload) } if (!skipload && numPlayersNow > numPlayers) { - SpawnExtraPlayers(Level); + Level->SpawnExtraPlayers(); } // Redo pitch limits, since the spawned player has them at 0. players[consoleplayer].SendPitchLimits(); @@ -875,7 +874,7 @@ void CopyPlayer(player_t *dst, player_t *src, const char *name) // //========================================================================== -static void SpawnExtraPlayers(FLevelLocals *Level) +void FLevelLocals::SpawnExtraPlayers() { // If there are more players now than there were in the savegame, // be sure to spawn the extra players. @@ -891,7 +890,7 @@ static void SpawnExtraPlayers(FLevelLocals *Level) if (playeringame[i] && players[i].mo == NULL) { players[i].playerstate = PST_ENTER; - P_SpawnPlayer(&Level->playerstarts[i], i, (level.flags2 & LEVEL2_PRERAISEWEAPON) ? SPF_WEAPONFULLYUP : 0); + P_SpawnPlayer(&playerstarts[i], i, (flags2 & LEVEL2_PRERAISEWEAPON) ? SPF_WEAPONFULLYUP : 0); } } } @@ -902,13 +901,13 @@ static void SpawnExtraPlayers(FLevelLocals *Level) // //============================================================================ -void G_SerializeLevel(FSerializer &arc, FLevelLocals *Level, bool hubload) +void FLevelLocals::Serialize(FSerializer &arc, bool hubload) { - int i = Level->totaltime; + int i = totaltime; if (arc.isWriting()) { - arc.Array("checksum", Level->md5, 16); + arc.Array("checksum", md5, 16); } else { @@ -917,11 +916,11 @@ void G_SerializeLevel(FSerializer &arc, FLevelLocals *Level, bool hubload) // deep down in the deserializer or just a crash if the few insufficient safeguards were not triggered. uint8_t chk[16] = { 0 }; arc.Array("checksum", chk, 16); - if (arc.GetSize("linedefs") != Level->lines.Size() || - arc.GetSize("sidedefs") != Level->sides.Size() || - arc.GetSize("sectors") != Level->sectors.Size() || - arc.GetSize("polyobjs") != Level->Polyobjects.Size() || - memcmp(chk, Level->md5, 16)) + if (arc.GetSize("linedefs") != lines.Size() || + arc.GetSize("sidedefs") != sides.Size() || + arc.GetSize("sectors") != sectors.Size() || + arc.GetSize("polyobjs") != Polyobjects.Size() || + memcmp(chk, md5, 16)) { I_Error("Savegame is from a different level"); } @@ -937,61 +936,61 @@ void G_SerializeLevel(FSerializer &arc, FLevelLocals *Level, bool hubload) arc("multiplayer", multiplayer); - arc("flags", Level->flags) - ("flags2", Level->flags2) - ("fadeto", Level->fadeto) - ("found_secrets", Level->found_secrets) - ("found_items", Level->found_items) - ("killed_monsters", Level->killed_monsters) - ("total_secrets", Level->total_secrets) - ("total_items", Level->total_items) - ("total_monsters", Level->total_monsters) - ("gravity", Level->gravity) - ("aircontrol", Level->aircontrol) - ("teamdamage", Level->teamdamage) - ("maptime", Level->maptime) + arc("flags", flags) + ("flags2", flags2) + ("fadeto", fadeto) + ("found_secrets", found_secrets) + ("found_items", found_items) + ("killed_monsters", killed_monsters) + ("total_secrets", total_secrets) + ("total_items", total_items) + ("total_monsters", total_monsters) + ("gravity", gravity) + ("aircontrol", aircontrol) + ("teamdamage", teamdamage) + ("maptime", maptime) ("totaltime", i) - ("skytexture1", Level->skytexture1) - ("skytexture2", Level->skytexture2) - ("fogdensity", Level->fogdensity) - ("outsidefogdensity", Level->outsidefogdensity) - ("skyfog", Level->skyfog) - ("deathsequence", Level->deathsequence) - ("bodyqueslot", Level->bodyqueslot) - ("spawnindex", Level->spawnindex) - .Array("bodyque", Level->bodyque, Level->BODYQUESIZE) - ("corpsequeue", Level->CorpseQueue) - ("spotstate", Level->SpotState) - ("fragglethinker", Level->FraggleScriptThinker) - ("acsthinker", Level->ACSThinker) - ("impactdecalcount", Level->ImpactDecalCount) - ("scrolls", Level->Scrolls) - ("automap", Level->automap); + ("skytexture1", skytexture1) + ("skytexture2", skytexture2) + ("fogdensity", fogdensity) + ("outsidefogdensity", outsidefogdensity) + ("skyfog", skyfog) + ("deathsequence", deathsequence) + ("bodyqueslot", bodyqueslot) + ("spawnindex", spawnindex) + .Array("bodyque", bodyque, BODYQUESIZE) + ("corpsequeue", CorpseQueue) + ("spotstate", SpotState) + ("fragglethinker", FraggleScriptThinker) + ("acsthinker", ACSThinker) + ("impactdecalcount", ImpactDecalCount) + ("scrolls", Scrolls) + ("automap", automap); // Hub transitions must keep the current total time if (!hubload) - Level->totaltime = i; + totaltime = i; if (arc.isReading()) { - sky1texture = Level->skytexture1; - sky2texture = Level->skytexture2; + sky1texture = skytexture1; + sky2texture = skytexture2; R_InitSkyMap(); G_AirControlChanged(); } - Level->Behaviors.SerializeModuleStates(arc); + Behaviors.SerializeModuleStates(arc); // The order here is important: First world state, then portal state, then thinkers, and last polyobjects. - arc("linedefs", Level->lines, Level->loadlines); - arc("sidedefs", Level->sides, Level->loadsides); - arc("sectors", Level->sectors, Level->loadsectors); - arc("zones", Level->Zones); - arc("lineportals", Level->linePortals); - arc("sectorportals", Level->sectorPortals); + arc("linedefs", lines, loadlines); + arc("sidedefs", sides, loadsides); + arc("sectors", sectors, loadsectors); + arc("zones", Zones); + arc("lineportals", linePortals); + arc("sectorportals", sectorPortals); if (arc.isReading()) { - Level->FinalizePortals(); + FinalizePortals(); } // [ZZ] serialize health groups @@ -999,18 +998,18 @@ void G_SerializeLevel(FSerializer &arc, FLevelLocals *Level, bool hubload) // [ZZ] serialize events E_SerializeEvents(arc); DThinker::SerializeThinkers(arc, hubload); - arc("polyobjs", Level->Polyobjects); + arc("polyobjs", Polyobjects); SerializeSubsectors(arc, "subsectors"); StatusBar->SerializeMessages(arc); FRemapTable::StaticSerializeTranslations(arc); - Level->canvasTextureInfo.Serialize(arc); - P_SerializePlayers(Level, arc, hubload); + canvasTextureInfo.Serialize(arc); + P_SerializePlayers(this, arc, hubload); P_SerializeSounds(arc); // Regenerate some data that wasn't saved if (arc.isReading()) { - for (auto &sec : Level->sectors) + for (auto &sec : sectors) { P_Recalculate3DFloors(&sec); } @@ -1022,10 +1021,10 @@ void G_SerializeLevel(FSerializer &arc, FLevelLocals *Level, bool hubload) } } AActor::RecreateAllAttachedLights(); - InitPortalGroups(Level); + InitPortalGroups(this); - Level->automap->Level = Level; // Temporary workaround. At the moment this cannot be deserialized yet. - Level->automap->UpdateShowAllLines(); + automap->Level = this; // Temporary workaround. At the moment this cannot be deserialized yet. + automap->UpdateShowAllLines(); } diff --git a/src/p_saveg.h b/src/p_saveg.h index b3311c29a..186c5d21a 100644 --- a/src/p_saveg.h +++ b/src/p_saveg.h @@ -44,6 +44,4 @@ void P_DestroyThinkers(bool hubLoad); void P_ReadACSDefereds (FSerializer &); void P_WriteACSDefereds (FSerializer &); -void G_SerializeLevel(FSerializer &arc, FLevelLocals *Level, bool hubLoad); - #endif // __P_SAVEG_H__ diff --git a/src/p_spec.h b/src/p_spec.h index ab9514d88..9fa04582d 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -130,21 +130,6 @@ protected: DLighting() = default; }; -void EV_StartLightFlickering (int tag, int upper, int lower); -void EV_StartLightStrobing (int tag, int upper, int lower, int utics, int ltics); -void EV_StartLightStrobing (int tag, int utics, int ltics); -void EV_TurnTagLightsOff (int tag); -void EV_LightTurnOn (int tag, int bright); -void EV_LightTurnOnPartway (int tag, double frac); // killough 10/98 -void EV_LightChange (int tag, int value); -void EV_StopLightEffect (int tag); - -void P_SpawnGlowingLight (sector_t *sector); - -void EV_StartLightGlowing (int tag, int upper, int lower, int tics); -void EV_StartLightFading (int tag, int value, int tics); - - // // P_SWITCH // From 9b1b6db85d73e84c4c445920d4c7f09c51282bff Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 26 Jan 2019 21:23:19 +0100 Subject: [PATCH 028/164] - added a pseudo-serializer for FLevelLocals pointers. This doesn't really write out any info for the pointer, if the level does not match it just errors out. This is both for quick detection of badly used level data and for automatic restoring of the pointer from the serializer's working level. This also removed the temporary workarounds in DAutomap and DLevelScript to restore these pointers when a savegame is loaded. --- src/am_map.cpp | 3 +- src/g_game.cpp | 8 ++-- src/g_level.cpp | 38 ++++++++--------- src/g_level.h | 2 - src/g_levellocals.h | 4 ++ src/menu/loadsavemenu.cpp | 4 +- src/p_acs.cpp | 88 +++++++++++++++++---------------------- src/p_acs.h | 4 +- src/p_saveg.cpp | 1 - src/p_spec.h | 1 - src/serializer.cpp | 84 +++++++++++++++++++++++++++++++++---- src/serializer.h | 5 +++ 12 files changed, 152 insertions(+), 90 deletions(-) diff --git a/src/am_map.cpp b/src/am_map.cpp index 3116dc5be..8d0fbecfe 100644 --- a/src/am_map.cpp +++ b/src/am_map.cpp @@ -3205,7 +3205,8 @@ void DAutomap::Serialize(FSerializer &arc) ("max_h", max_h) ("min_scale_mtof", min_scale_mtof) ("max_scale_mtof", max_scale_mtof) - ("mapback", mapback); + ("mapback", mapback) + ("level", Level); } diff --git a/src/g_game.cpp b/src/g_game.cpp index 6c1f32227..cfc8c3789 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -1811,7 +1811,7 @@ void G_DoLoadGame () SaveVersion = 0; void *data = info->CacheLump(); - FSerializer arc; + FSerializer arc(nullptr); if (!arc.OpenReader((const char *)data, info->LumpSize)) { Printf("Failed to access savegame info\n"); @@ -2129,7 +2129,7 @@ void G_DoSaveGame (bool okForQuicksave, FString filename, const char *descriptio insave = true; try { - G_SnapshotLevel(); + level.SnapshotLevel(); } catch(CRecoverableError &err) { @@ -2152,8 +2152,8 @@ void G_DoSaveGame (bool okForQuicksave, FString filename, const char *descriptio } BufferWriter savepic; - FSerializer savegameinfo; // this is for displayable info about the savegame - FSerializer savegameglobals; // and this for non-level related info that must be saved. + FSerializer savegameinfo(nullptr); // this is for displayable info about the savegame + FSerializer savegameglobals(nullptr); // and this for non-level related info that must be saved. savegameinfo.OpenWriter(true); savegameglobals.OpenWriter(save_formatted); diff --git a/src/g_level.cpp b/src/g_level.cpp index f2e935700..acb6eaec6 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -856,7 +856,7 @@ void G_DoCompleted (void) { // Remember the level's state for re-entry. if (!(level.flags2 & LEVEL2_FORGETSTATE)) { - G_SnapshotLevel (); + level.SnapshotLevel (); // Do not free any global strings this level might reference // while it's not loaded. level.Behaviors.LockLevelVarStrings(level.levelnum); @@ -1060,7 +1060,7 @@ void G_DoLoadLevel (int position, bool autosave, bool newGame) level.starttime = gametic; - G_UnSnapshotLevel (!savegamerestore); // [RH] Restore the state of the level. + level.UnSnapshotLevel (!savegamerestore); // [RH] Restore the state of the level. int pnumerr = G_FinishTravel (); if (!level.FromSnapshot) @@ -1109,7 +1109,7 @@ void G_DoLoadLevel (int position, bool autosave, bool newGame) E_WorldLoadedUnsafe(); // regular world load (savegames are handled internally) E_WorldLoaded(); - P_DoDeferedScripts (); // [RH] Do script actions that were triggered on another map. + level.DoDeferedScripts (); // [RH] Do script actions that were triggered on another map. if (demoplayback || oldgs == GS_STARTUP || oldgs == GS_TITLELEVEL) C_HideConsole (); @@ -1647,19 +1647,19 @@ void G_AirControlChanged () // //========================================================================== -void G_SnapshotLevel () +void FLevelLocals::SnapshotLevel () { - level.info->Snapshot.Clean(); + info->Snapshot.Clean(); - if (level.info->isValid()) + if (info->isValid()) { - FSerializer arc; + FSerializer arc(this); if (arc.OpenWriter(save_formatted)) { SaveVersion = SAVEVER; - level.Serialize(arc, false); - level.info->Snapshot = arc.GetCompressedOutput(); + Serialize(arc, false); + info->Snapshot = arc.GetCompressedOutput(); } } } @@ -1671,24 +1671,24 @@ void G_SnapshotLevel () // //========================================================================== -void G_UnSnapshotLevel (bool hubLoad) +void FLevelLocals::UnSnapshotLevel (bool hubLoad) { - if (level.info->Snapshot.mBuffer == nullptr) + if (info->Snapshot.mBuffer == nullptr) return; - if (level.info->isValid()) + if (info->isValid()) { - FSerializer arc; - if (!arc.OpenReader(&level.info->Snapshot)) + FSerializer arc(this); + if (!arc.OpenReader(&info->Snapshot)) { I_Error("Failed to load savegame"); return; } - level.Serialize (arc, hubLoad); - level.FromSnapshot = true; + Serialize (arc, hubLoad); + FromSnapshot = true; - TThinkerIterator it(NAME_PlayerPawn); + auto it = GetThinkerIterator(NAME_PlayerPawn); AActor *pawn, *next; next = it.Next(); @@ -1716,11 +1716,11 @@ void G_UnSnapshotLevel (bool hubLoad) arc.Close(); } // No reason to keep the snapshot around once the level's been entered. - level.info->Snapshot.Clean(); + info->Snapshot.Clean(); if (hubLoad) { // Unlock ACS global strings that were locked when the snapshot was made. - level.Behaviors.UnlockLevelVarStrings(level.levelnum); + Behaviors.UnlockLevelVarStrings(level.levelnum); } } diff --git a/src/g_level.h b/src/g_level.h index 4c7a91dc1..5e42fcc44 100644 --- a/src/g_level.h +++ b/src/g_level.h @@ -490,8 +490,6 @@ void G_ParseMapInfo (FString basemapinfo); void G_ClearSnapshots (void); void P_RemoveDefereds (); -void G_SnapshotLevel (void); -void G_UnSnapshotLevel (bool keepPlayers); void G_ReadSnapshots (FResourceFile *); void G_WriteSnapshots (TArray &, TArray &); void G_WriteVisited(FSerializer &arc); diff --git a/src/g_levellocals.h b/src/g_levellocals.h index b9787f45c..feaa54128 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -186,6 +186,9 @@ private: void AddDisplacementForPortal(FLinePortal *portal); bool ConnectPortalGroups(); public: + void SnapshotLevel(); + void UnSnapshotLevel(bool hubLoad); + void FinalizePortals(); bool ChangePortal(line_t *ln, int thisid, int destid); unsigned GetSkyboxPortal(AActor *actor); @@ -198,6 +201,7 @@ public: bool CreateCeiling(sector_t *sec, DCeiling::ECeiling type, line_t *line, int tag, double speed, double speed2, double height, int crush, int silent, int change, DCeiling::ECrushMode hexencrush); void ActivateInStasisCeiling(int tag); bool CreateFloor(sector_t *sec, DFloor::EFloor floortype, line_t *line, double speed, double height, int crush, int change, bool hexencrush, bool hereticlower); + void DoDeferedScripts(); bool EV_DoPlat(int tag, line_t *line, DPlat::EPlatType type, double height, double speed, int delay, int lip, int change); void EV_StopPlat(int tag, bool remove); diff --git a/src/menu/loadsavemenu.cpp b/src/menu/loadsavemenu.cpp index 6361e8e4f..e023f1f88 100644 --- a/src/menu/loadsavemenu.cpp +++ b/src/menu/loadsavemenu.cpp @@ -180,7 +180,7 @@ void FSavegameManager::ReadSaveStrings() continue; } void *data = info->CacheLump(); - FSerializer arc; + FSerializer arc(nullptr); if (arc.OpenReader((const char *)data, info->LumpSize)) { int savever = 0; @@ -469,7 +469,7 @@ unsigned FSavegameManager::ExtractSaveData(int index) return index; } void *data = info->CacheLump(); - FSerializer arc; + FSerializer arc(nullptr); if (arc.OpenReader((const char *)data, info->LumpSize)) { FString time, pcomment, comment; diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 0cdaad45b..3f61326b6 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -671,9 +671,8 @@ public: SCRIPT_ModulusBy0, }; - DLevelScript(AActor *who, line_t *where, int num, const ScriptPtr *code, FBehavior *module, + DLevelScript(FLevelLocals *l, AActor *who, line_t *where, int num, const ScriptPtr *code, FBehavior *module, const int *args, int argcount, int flags); - ~DLevelScript(); void Serialize(FSerializer &arc); int RunScript(); @@ -780,7 +779,7 @@ private: friend class DACSThinker; }; -static DLevelScript *P_GetScriptGoing (AActor *who, line_t *where, int num, const ScriptPtr *code, FBehavior *module, +static DLevelScript *P_GetScriptGoing (FLevelLocals *Level, AActor *who, line_t *where, int num, const ScriptPtr *code, FBehavior *module, const int *args, int argcount, int flags); @@ -3264,11 +3263,10 @@ void FBehavior::StartTypedScripts (uint16_t type, AActor *activator, bool always ptr = &Scripts[i]; if (ptr->Type == type) { - DLevelScript *runningScript = P_GetScriptGoing (activator, NULL, ptr->Number, + DLevelScript *runningScript = P_GetScriptGoing (&level, activator, NULL, ptr->Number, ptr, this, &arg1, 1, always ? ACS_ALWAYS : 0); if (nullptr != runningScript && runNow) { - runningScript->Level = &level; runningScript->RunScript(); } } @@ -3389,7 +3387,6 @@ void DACSThinker::Tick () while (script) { DLevelScript *next = script->next; - script->Level = &level; script->RunScript(); script = next; } @@ -3460,11 +3457,12 @@ void DLevelScript::Serialize(FSerializer &arc) ("cliprectwidth", ClipRectWidth) ("cliprectheight", ClipRectHeight) ("wrapwidth", WrapWidth) - ("inmodulescriptnum", InModuleScriptNumber); + ("inmodulescriptnum", InModuleScriptNumber) + ("level", Level); if (arc.isReading()) { - activeBehavior = level.Behaviors.GetModule(lib); + activeBehavior = Level->Behaviors.GetModule(lib); if (nullptr == activeBehavior) { @@ -3477,19 +3475,12 @@ void DLevelScript::Serialize(FSerializer &arc) DLevelScript::DLevelScript () { - next = prev = nullptr; - if (level.ACSThinker == nullptr) - level.ACSThinker = Create(); activefont = SmallFont; } -DLevelScript::~DLevelScript () -{ -} - void DLevelScript::Unlink () { - DACSThinker *controller = level.ACSThinker; + DACSThinker *controller = Level->ACSThinker; if (controller->LastScript == this) { @@ -3515,7 +3506,7 @@ void DLevelScript::Unlink () void DLevelScript::Link () { - DACSThinker *controller = level.ACSThinker; + DACSThinker *controller = Level->ACSThinker; next = controller->Scripts; GC::WriteBarrier(this, next); @@ -3535,7 +3526,7 @@ void DLevelScript::Link () void DLevelScript::PutLast () { - DACSThinker *controller = level.ACSThinker; + DACSThinker *controller = Level->ACSThinker; if (controller->LastScript == this) return; @@ -3557,7 +3548,7 @@ void DLevelScript::PutLast () void DLevelScript::PutFirst () { - DACSThinker *controller = level.ACSThinker; + DACSThinker *controller = Level->ACSThinker; if (controller->Scripts == this) return; @@ -10218,10 +10209,10 @@ scriptwait: #undef PushtoStack -static DLevelScript *P_GetScriptGoing (AActor *who, line_t *where, int num, const ScriptPtr *code, FBehavior *module, +static DLevelScript *P_GetScriptGoing (FLevelLocals *l, AActor *who, line_t *where, int num, const ScriptPtr *code, FBehavior *module, const int *args, int argcount, int flags) { - DACSThinker *controller = level.ACSThinker; + DACSThinker *controller = l->ACSThinker; DLevelScript **running; if (controller && !(flags & ACS_ALWAYS) && (running = controller->RunningScripts.CheckKey(num)) != NULL) @@ -10234,15 +10225,16 @@ static DLevelScript *P_GetScriptGoing (AActor *who, line_t *where, int num, cons return NULL; } - return Create (who, where, num, code, module, args, argcount, flags); + return Create (l, who, where, num, code, module, args, argcount, flags); } -DLevelScript::DLevelScript (AActor *who, line_t *where, int num, const ScriptPtr *code, FBehavior *module, +DLevelScript::DLevelScript (FLevelLocals *l, AActor *who, line_t *where, int num, const ScriptPtr *code, FBehavior *module, const int *args, int argcount, int flags) : activeBehavior (module) { - if (level.ACSThinker == nullptr) - level.ACSThinker = Create(); + Level = l; + if (Level->ACSThinker == nullptr) + Level->ACSThinker = Create(); script = num; assert(code->VarCount >= code->ArgCount); @@ -10270,11 +10262,11 @@ DLevelScript::DLevelScript (AActor *who, line_t *where, int num, const ScriptPtr // goes by while they're in their default state. if (!(flags & ACS_ALWAYS)) - level.ACSThinker->RunningScripts[num] = this; + Level->ACSThinker->RunningScripts[num] = this; Link(); - if (level.flags2 & LEVEL2_HEXENHACK) + if (Level->flags2 & LEVEL2_HEXENHACK) { PutLast(); } @@ -10282,9 +10274,8 @@ DLevelScript::DLevelScript (AActor *who, line_t *where, int num, const ScriptPtr DPrintf(DMSG_SPAMMY, "%s started.\n", ScriptPresentation(num).GetChars()); } -static void SetScriptState (int script, DLevelScript::EScriptState state) +void SetScriptState (DACSThinker *controller, int script, DLevelScript::EScriptState state) { - DACSThinker *controller = level.ACSThinker; DLevelScript **running; if (controller != NULL && (running = controller->RunningScripts.CheckKey(script)) != NULL) @@ -10293,23 +10284,23 @@ static void SetScriptState (int script, DLevelScript::EScriptState state) } } -void P_DoDeferedScripts () +void FLevelLocals::DoDeferedScripts () { const ScriptPtr *scriptdata; FBehavior *module; // Handle defered scripts in this step, too - for(int i = level.info->deferred.Size()-1; i>=0; i--) + for(int i = info->deferred.Size()-1; i>=0; i--) { - acsdefered_t *def = &level.info->deferred[i]; + acsdefered_t *def = &info->deferred[i]; switch (def->type) { case acsdefered_t::defexecute: case acsdefered_t::defexealways: - scriptdata = level.Behaviors.FindScript (def->script, module); + scriptdata = Behaviors.FindScript (def->script, module); if (scriptdata) { - P_GetScriptGoing ((unsigned)def->playernum < MAXPLAYERS && + P_GetScriptGoing (this, (unsigned)def->playernum < MAXPLAYERS && playeringame[def->playernum] ? players[def->playernum].mo : NULL, NULL, def->script, scriptdata, module, @@ -10323,17 +10314,17 @@ void P_DoDeferedScripts () break; case acsdefered_t::defsuspend: - SetScriptState (def->script, DLevelScript::SCRIPT_Suspended); + SetScriptState (ACSThinker, def->script, DLevelScript::SCRIPT_Suspended); DPrintf (DMSG_SPAMMY, "Deferred suspend of %s\n", ScriptPresentation(def->script).GetChars()); break; case acsdefered_t::defterminate: - SetScriptState (def->script, DLevelScript::SCRIPT_PleaseRemove); + SetScriptState (ACSThinker, def->script, DLevelScript::SCRIPT_PleaseRemove); DPrintf (DMSG_SPAMMY, "Deferred terminate of %s\n", ScriptPresentation(def->script).GetChars()); break; } } - level.info->deferred.Clear(); + info->deferred.Clear(); } static void addDefered (level_info_t *i, acsdefered_t::EType type, int script, const int *args, int argcount, AActor *who) @@ -10392,13 +10383,12 @@ int P_StartScript (AActor *who, line_t *where, int script, const char *map, cons return false; } } - DLevelScript *runningScript = P_GetScriptGoing (who, where, script, + DLevelScript *runningScript = P_GetScriptGoing (&level, who, where, script, scriptdata, module, args, argcount, flags); if (runningScript != NULL) { if (flags & ACS_WANTRESULT) { - runningScript->Level = &level; return runningScript->RunScript(); } return true; @@ -10428,7 +10418,7 @@ void P_SuspendScript (int script, const char *map) if (strnicmp (level.MapName, map, 8)) addDefered (FindLevelInfo (map), acsdefered_t::defsuspend, script, NULL, 0, NULL); else - SetScriptState (script, DLevelScript::SCRIPT_Suspended); + SetScriptState (level.ACSThinker, script, DLevelScript::SCRIPT_Suspended); } void P_TerminateScript (int script, const char *map) @@ -10436,7 +10426,7 @@ void P_TerminateScript (int script, const char *map) if (strnicmp (level.MapName, map, 8)) addDefered (FindLevelInfo (map), acsdefered_t::defterminate, script, NULL, 0, NULL); else - SetScriptState (script, DLevelScript::SCRIPT_PleaseRemove); + SetScriptState (level.ACSThinker, script, DLevelScript::SCRIPT_PleaseRemove); } FSerializer &Serialize(FSerializer &arc, const char *key, acsdefered_t &defer, acsdefered_t *def) @@ -10515,11 +10505,11 @@ void ACSProfileInfo::AddRun(unsigned int num_instr) } } -void ArrangeScriptProfiles(TArray &profiles) +void FBehaviorContainer::ArrangeScriptProfiles(TArray &profiles) { - for (unsigned int mod_num = 0; mod_num < level.Behaviors.StaticModules.Size(); ++mod_num) + for (unsigned int mod_num = 0; mod_num < StaticModules.Size(); ++mod_num) { - FBehavior *module = level.Behaviors.StaticModules[mod_num]; + FBehavior *module = StaticModules[mod_num]; ProfileCollector prof; prof.Module = module; for (int i = 0; i < module->NumScripts; ++i) @@ -10531,11 +10521,11 @@ void ArrangeScriptProfiles(TArray &profiles) } } -void ArrangeFunctionProfiles(TArray &profiles) +void FBehaviorContainer::ArrangeFunctionProfiles(TArray &profiles) { - for (unsigned int mod_num = 0; mod_num < level.Behaviors.StaticModules.Size(); ++mod_num) + for (unsigned int mod_num = 0; mod_num < StaticModules.Size(); ++mod_num) { - FBehavior *module = level.Behaviors.StaticModules[mod_num]; + FBehavior *module = StaticModules[mod_num]; ProfileCollector prof; prof.Module = module; for (int i = 0; i < module->NumFunctions; ++i) @@ -10692,8 +10682,8 @@ CCMD(acsprofile) assert(countof(sort_names) == countof(sort_match_len)); - ArrangeScriptProfiles(ScriptProfiles); - ArrangeFunctionProfiles(FuncProfiles); + level.Behaviors.ArrangeScriptProfiles(ScriptProfiles); + level.Behaviors.ArrangeFunctionProfiles(FuncProfiles); if (argv.argc() > 1) { diff --git a/src/p_acs.h b/src/p_acs.h index f3c724353..21cb61e62 100644 --- a/src/p_acs.h +++ b/src/p_acs.h @@ -420,8 +420,6 @@ private: void MarkMapVarStrings() const; void LockMapVarStrings(int levelnum) const; - friend void ArrangeScriptProfiles(TArray &profiles); - friend void ArrangeFunctionProfiles(TArray &profiles); friend struct FBehaviorContainer; }; @@ -443,6 +441,8 @@ struct FBehaviorContainer const char *LookupString(uint32_t index); void StartTypedScripts(uint16_t type, AActor *activator, bool always, int arg1 = 0, bool runNow = false); void StopMyScripts(AActor *actor); + void ArrangeScriptProfiles(TArray &profiles); + void ArrangeFunctionProfiles(TArray &profiles); }; diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 689ebc750..56ac0f6c8 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -1023,7 +1023,6 @@ void FLevelLocals::Serialize(FSerializer &arc, bool hubload) AActor::RecreateAllAttachedLights(); InitPortalGroups(this); - automap->Level = this; // Temporary workaround. At the moment this cannot be deserialized yet. automap->UpdateShowAllLines(); } diff --git a/src/p_spec.h b/src/p_spec.h index 9fa04582d..9de805f43 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -630,7 +630,6 @@ bool EV_TeleportSector (int tag, int source_tid, int dest_tid, bool fog, int gro int P_StartScript (AActor *who, line_t *where, int script, const char *map, const int *args, int argcount, int flags); void P_SuspendScript (int script, const char *map); void P_TerminateScript (int script, const char *map); -void P_DoDeferedScripts (void); // // [RH] p_quake.c diff --git a/src/serializer.cpp b/src/serializer.cpp index 3f390bf1c..94bb57f78 100644 --- a/src/serializer.cpp +++ b/src/serializer.cpp @@ -1450,27 +1450,32 @@ FSerializer &SerializePointer(FSerializer &arc, const char *key, T *&value, T ** template<> FSerializer &Serialize(FSerializer &arc, const char *key, FPolyObj *&value, FPolyObj **defval) { - return SerializePointer(arc, key, value, defval, level.Polyobjects.Data()); + if (arc.Level == nullptr) I_Error("Trying to serialize polyobject without a valid level"); + return SerializePointer(arc, key, value, defval, arc.Level->Polyobjects.Data()); } template<> FSerializer &Serialize(FSerializer &arc, const char *key, const FPolyObj *&value, const FPolyObj **defval) { - return SerializePointer(arc, key, value, defval, level.Polyobjects.Data()); + if (arc.Level == nullptr) I_Error("Trying to serialize polyobject without a valid level"); + return SerializePointer(arc, key, value, defval, arc.Level->Polyobjects.Data()); } template<> FSerializer &Serialize(FSerializer &arc, const char *key, side_t *&value, side_t **defval) { - return SerializePointer(arc, key, value, defval, &level.sides[0]); + if (arc.Level == nullptr) I_Error("Trying to serialize SIDEDEF without a valid level"); + return SerializePointer(arc, key, value, defval, &arc.Level->sides[0]); } template<> FSerializer &Serialize(FSerializer &arc, const char *key, sector_t *&value, sector_t **defval) { - return SerializePointer(arc, key, value, defval, &level.sectors[0]); + if (arc.Level == nullptr) I_Error("Trying to serialize sector without a valid level"); + return SerializePointer(arc, key, value, defval, &arc.Level->sectors[0]); } template<> FSerializer &Serialize(FSerializer &arc, const char *key, const sector_t *&value, const sector_t **defval) { - return SerializePointer(arc, key, value, defval, &level.sectors[0]); + if (arc.Level == nullptr) I_Error("Trying to serialize sector without a valid level"); + return SerializePointer(arc, key, value, defval, &arc.Level->sectors[0]); } template<> FSerializer &Serialize(FSerializer &arc, const char *key, player_t *&value, player_t **defval) @@ -1480,12 +1485,14 @@ template<> FSerializer &Serialize(FSerializer &arc, const char *key, player_t *& template<> FSerializer &Serialize(FSerializer &arc, const char *key, line_t *&value, line_t **defval) { - return SerializePointer(arc, key, value, defval, &level.lines[0]); + if (arc.Level == nullptr) I_Error("Trying to serialize linedef without a valid level"); + return SerializePointer(arc, key, value, defval, &arc.Level->lines[0]); } template<> FSerializer &Serialize(FSerializer &arc, const char *key, vertex_t *&value, vertex_t **defval) { - return SerializePointer(arc, key, value, defval, &level.vertexes[0]); + if (arc.Level == nullptr) I_Error("Trying to serialize verte without a valid level"); + return SerializePointer(arc, key, value, defval, &arc.Level->vertexes[0]); } //========================================================================== @@ -1968,13 +1975,13 @@ template<> FSerializer &Serialize(FSerializer &arc, const char *key, FStrifeDial } else if (val->IsUint()) { - if (val->GetUint() >= level.StrifeDialogues.Size()) + if (val->GetUint() >= arc.Level->StrifeDialogues.Size()) { node = nullptr; } else { - node = level.StrifeDialogues[val->GetUint()]; + node = arc.Level->StrifeDialogues[val->GetUint()]; } } else @@ -2128,6 +2135,65 @@ template<> FSerializer &Serialize(FSerializer &arc, const char *key, char *&pstr return arc; } +//========================================================================== +// +// This is a bit of a cheat because it never actually writes out the pointer. +// The rules for levels are that they must be self-contained. +// No level and no pbject that is part of a level may reference a different level. +// +// When writing, this merely checks if the rules are obeyed and if not errors out. +// When reading, it assumes that the object was properly written and restores +// the reference from the owning level. +// +// The only exception are null pointers which are allowed +// +//========================================================================== + +template<> FSerializer &Serialize(FSerializer &arc, const char *key, FLevelLocals *&lev, FLevelLocals **def) +{ + if (arc.isWriting()) + { + if (!arc.w->inObject() || lev == nullptr) + { + arc.WriteKey(key); + if (lev == nullptr) + { + arc.w->Null(); + } + else + { + // This MUST be the currently serialized level. Anything else will error out here as a sanity check. + if (arc.Level == nullptr || lev != arc.Level) + { + I_Error("Attempt to serialize invalid level reference"); + } + if (!arc.w->inObject()) + { + arc.w->Bool(true); // In the unlikely case this is used in an array, write a filler. + } + } + } + } + else + { + auto val = arc.r->FindKey(key); + if (val != nullptr) + { + assert(val->IsNull() || val->IsBool()); + if (val->IsNull()) + { + lev = nullptr; + } + else + { + lev = arc.Level; + } + } + else lev = arc.Level; + } + return arc; +} + //========================================================================== // // diff --git a/src/serializer.h b/src/serializer.h index 7f8af9b8b..d7d2a1e1a 100644 --- a/src/serializer.h +++ b/src/serializer.h @@ -65,6 +65,7 @@ class FSerializer public: FWriter *w = nullptr; FReader *r = nullptr; + FLevelLocals *Level; unsigned ArraySize(); void WriteKey(const char *key); @@ -72,6 +73,9 @@ public: public: + FSerializer(FLevelLocals *l) : Level(l) + {} + ~FSerializer() { mErrors = 0; // The destructor may not throw an exception so silence the error checker. @@ -262,6 +266,7 @@ template<> FSerializer &Serialize(FSerializer &arc, const char *key, FString *&p template<> FSerializer &Serialize(FSerializer &arc, const char *key, FDoorAnimation *&pstr, FDoorAnimation **def); template<> FSerializer &Serialize(FSerializer &arc, const char *key, char *&pstr, char **def); template<> FSerializer &Serialize(FSerializer &arc, const char *key, FFont *&font, FFont **def); +template<> FSerializer &Serialize(FSerializer &arc, const char *key, FLevelLocals *&font, FLevelLocals **def); FSerializer &Serialize(FSerializer &arc, const char *key, FState *&state, FState **def, bool *retcode); template<> inline FSerializer &Serialize(FSerializer &arc, const char *key, FState *&state, FState **def) From df4c7d8f568ff829931ca645098db20e4b1d37c2 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 26 Jan 2019 23:36:22 +0100 Subject: [PATCH 029/164] - initialize the impact decal counter for each level. --- src/g_level.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/g_level.cpp b/src/g_level.cpp index acb6eaec6..c36823300 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1460,6 +1460,7 @@ void FLevelLocals::Init() flags = 0; flags2 = 0; flags3 = 0; + ImpactDecalCount = 0; info = FindLevelInfo (MapName); From 8323524014e306bf63cf2cfe8ad3509ae1c2c7f7 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 27 Jan 2019 01:49:20 +0100 Subject: [PATCH 030/164] - give thinkers a 'level' member and change linking to the chain to happen outside the constructor. --- src/b_bot.cpp | 1 - src/b_bot.h | 1 + src/b_game.cpp | 2 +- src/c_dispatch.cpp | 5 ++- src/decallib.cpp | 25 ++++++----- src/dsectoreffect.cpp | 7 ---- src/dsectoreffect.h | 3 +- src/dthinker.cpp | 27 +++++------- src/dthinker.h | 10 ++++- src/fragglescript/t_func.cpp | 2 +- src/fragglescript/t_load.cpp | 2 +- src/fragglescript/t_script.cpp | 1 - src/fragglescript/t_script.h | 2 +- src/g_level.cpp | 2 +- src/g_levellocals.h | 24 ++++++++++- src/g_shared/a_decals.cpp | 61 +++++++-------------------- src/g_shared/a_lightning.cpp | 11 +++-- src/g_shared/a_lightning.h | 1 + src/g_shared/a_quake.cpp | 16 +------ src/g_shared/a_sharedglobal.h | 20 ++++----- src/m_cheat.cpp | 2 +- src/maploader/specials.cpp | 70 +++++++++++++++---------------- src/p_acs.cpp | 9 ++-- src/p_acs.h | 1 + src/p_actionfunctions.cpp | 2 +- src/p_ceiling.cpp | 2 +- src/p_doors.cpp | 8 ++-- src/p_floor.cpp | 16 +++---- src/p_lights.cpp | 24 ++++------- src/p_lnspec.cpp | 5 +-- src/p_map.cpp | 4 +- src/p_mobj.cpp | 4 +- src/p_pillar.cpp | 2 +- src/p_plats.cpp | 2 +- src/p_pusher.cpp | 6 +-- src/p_scroll.cpp | 6 +-- src/p_setup.cpp | 2 +- src/p_spec.cpp | 2 - src/p_spec.h | 1 + src/p_spec_thinkers.h | 10 +++-- src/p_switch.cpp | 2 +- src/po_man.cpp | 10 ++--- src/scripting/backend/codegen.cpp | 16 ++++--- 43 files changed, 201 insertions(+), 228 deletions(-) diff --git a/src/b_bot.cpp b/src/b_bot.cpp index f02184282..9bddac1ad 100644 --- a/src/b_bot.cpp +++ b/src/b_bot.cpp @@ -64,7 +64,6 @@ IMPLEMENT_POINTERS_END DEFINE_FIELD(DBot, dest) DBot::DBot () -: DThinker(STAT_BOT) { Clear (); } diff --git a/src/b_bot.h b/src/b_bot.h index 393650cf4..0d28f796c 100644 --- a/src/b_bot.h +++ b/src/b_bot.h @@ -166,6 +166,7 @@ class DBot : public DThinker DECLARE_CLASS(DBot,DThinker) HAS_OBJECT_POINTERS public: + static const int DEFAULT_STAT = STAT_BOT; DBot (); void Clear (); diff --git a/src/b_game.cpp b/src/b_game.cpp index 516986e71..f8eca50a5 100644 --- a/src/b_game.cpp +++ b/src/b_game.cpp @@ -405,7 +405,7 @@ bool FCajunMaster::DoAddBot (uint8_t *info, botskill_t skill) D_ReadUserInfoStrings (bnum, &info, false); multiplayer = true; //Prevents cheating and so on; emulates real netgame (almost). - players[bnum].Bot = Create(); + players[bnum].Bot = level.CreateThinker(); players[bnum].Bot->player = &players[bnum]; players[bnum].Bot->skill = skill; playeringame[bnum] = true; diff --git a/src/c_dispatch.cpp b/src/c_dispatch.cpp index b046f4467..25ffc4b8a 100644 --- a/src/c_dispatch.cpp +++ b/src/c_dispatch.cpp @@ -54,6 +54,7 @@ #include "serializer.h" #include "menu/menu.h" #include "vm.h" +#include "g_levellocals.h" // MACROS ------------------------------------------------------------------ @@ -656,7 +657,7 @@ void C_DoCommand (const char *cmd, int keynum) } else { - Create (com, beg); + currentUILevel->CreateThinker (com, beg); } } } @@ -752,7 +753,7 @@ void AddCommandString (char *cmd, int keynum) // Note that deferred commands lose track of which key // (if any) they were pressed from. *brkpt = ';'; - Create (brkpt, tics, UnsafeExecutionContext); + currentUILevel->CreateThinker (brkpt, tics, UnsafeExecutionContext); } return; } diff --git a/src/decallib.cpp b/src/decallib.cpp index 945fc9a09..9a3cd15cd 100644 --- a/src/decallib.cpp +++ b/src/decallib.cpp @@ -109,11 +109,12 @@ struct DDecalThinker : public DThinker DECLARE_CLASS (DDecalThinker, DThinker) HAS_OBJECT_POINTERS public: - DDecalThinker (DBaseDecal *decal) : DThinker (STAT_DECALTHINKER), TheDecal (decal) {} + static const int DEFAULT_STAT = STAT_DECALTHINKER; + DDecalThinker (DBaseDecal *decal) : TheDecal (decal) {} void Serialize(FSerializer &arc); TObjPtr TheDecal; protected: - DDecalThinker () : DThinker (STAT_DECALTHINKER) {} + DDecalThinker() = default; }; IMPLEMENT_CLASS(DDecalThinker, false, true) @@ -1201,9 +1202,10 @@ void DDecalFader::Tick () DThinker *FDecalFaderAnim::CreateThinker (DBaseDecal *actor, side_t *wall) const { - DDecalFader *fader = Create (actor); + auto Level = actor->Level; + DDecalFader *fader = Level->CreateThinker (actor); - fader->TimeToStartDecay = level.maptime + DecayStart; + fader->TimeToStartDecay = Level->maptime + DecayStart; fader->TimeToEndDecay = fader->TimeToStartDecay + DecayTime; fader->StartTrans = -1; return fader; @@ -1227,9 +1229,10 @@ void DDecalStretcher::Serialize(FSerializer &arc) DThinker *FDecalStretcherAnim::CreateThinker (DBaseDecal *actor, side_t *wall) const { - DDecalStretcher *thinker = Create (actor); + auto Level = actor->Level; + DDecalStretcher *thinker = Level->CreateThinker (actor); - thinker->TimeToStart = level.maptime + StretchStart; + thinker->TimeToStart = Level->maptime + StretchStart; thinker->TimeToStop = thinker->TimeToStart + StretchTime; if (GoalX >= 0) @@ -1313,9 +1316,10 @@ void DDecalSlider::Serialize(FSerializer &arc) DThinker *FDecalSliderAnim::CreateThinker (DBaseDecal *actor, side_t *wall) const { - DDecalSlider *thinker = Create (actor); + auto Level = actor->Level; + DDecalSlider *thinker = Level->CreateThinker (actor); - thinker->TimeToStart = level.maptime + SlideStart; + thinker->TimeToStart = Level->maptime + SlideStart; thinker->TimeToStop = thinker->TimeToStart + SlideTime; /*thinker->DistX = DistX;*/ thinker->DistY = DistY; @@ -1432,9 +1436,10 @@ void DDecalColorer::Tick () DThinker *FDecalColorerAnim::CreateThinker (DBaseDecal *actor, side_t *wall) const { - DDecalColorer *Colorer = Create(actor); + auto Level = actor->Level; + DDecalColorer *Colorer = Level->CreateThinker(actor); - Colorer->TimeToStartDecay = level.maptime + DecayStart; + Colorer->TimeToStartDecay = Level->maptime + DecayStart; Colorer->TimeToEndDecay = Colorer->TimeToStartDecay + DecayTime; Colorer->StartColor = 0xff000000; Colorer->GoalColor = GoalColor; diff --git a/src/dsectoreffect.cpp b/src/dsectoreffect.cpp index c3711f3f7..755253148 100644 --- a/src/dsectoreffect.cpp +++ b/src/dsectoreffect.cpp @@ -36,12 +36,6 @@ IMPLEMENT_CLASS(DSectorEffect, false, false) -DSectorEffect::DSectorEffect () -: DThinker(STAT_SECTOREFFECT) -{ - m_Sector = nullptr; -} - void DSectorEffect::OnDestroy() { if (m_Sector) @@ -63,7 +57,6 @@ void DSectorEffect::OnDestroy() } DSectorEffect::DSectorEffect (sector_t *sector) - : DThinker(STAT_SECTOREFFECT) { m_Sector = sector; } diff --git a/src/dsectoreffect.h b/src/dsectoreffect.h index e583a85cd..a3ccc718c 100644 --- a/src/dsectoreffect.h +++ b/src/dsectoreffect.h @@ -8,6 +8,7 @@ class DSectorEffect : public DThinker { DECLARE_CLASS (DSectorEffect, DThinker) public: + static const int DEFAULT_STAT = STAT_SECTOREFFECT; DSectorEffect (sector_t *sector); @@ -19,7 +20,7 @@ public: sector_t *m_Sector; protected: - DSectorEffect(); + DSectorEffect() = default; }; diff --git a/src/dthinker.cpp b/src/dthinker.cpp index 439685438..dc7ffdd6b 100644 --- a/src/dthinker.cpp +++ b/src/dthinker.cpp @@ -70,8 +70,8 @@ void FThinkerList::AddTail(DThinker *thinker) assert(!(thinker->ObjectFlags & OF_EuthanizeMe)); if (Sentinel == NULL) { - Sentinel = Create(DThinker::NO_LINK); - Sentinel->ObjectFlags |= OF_Sentinel; + Sentinel = Create(); + Sentinel->ObjectFlags = OF_Sentinel; Sentinel->NextThinker = Sentinel; Sentinel->PrevThinker = Sentinel; GC::WriteBarrier(Sentinel); @@ -232,21 +232,10 @@ void DThinker::SerializeThinkers(FSerializer &arc, bool hubLoad) // //========================================================================== -DThinker::DThinker (int statnum) throw() +DThinker::DThinker () throw() { - NextThinker = NULL; - PrevThinker = NULL; - if (bSerialOverride) - { // The serializer will insert us into the right list - return; - } - - ObjectFlags |= OF_JustSpawned; - if ((unsigned)statnum > MAX_STATNUM) - { - statnum = MAX_STATNUM; - } - FreshThinkers[statnum].AddTail (this); + NextThinker = nullptr; + PrevThinker = nullptr; } DThinker::DThinker(no_link_type foo) throw() @@ -270,6 +259,12 @@ void DThinker::OnDestroy () Super::OnDestroy(); } +void DThinker::Serialize(FSerializer &arc) +{ + Super::Serialize(arc); + arc("level", Level); +} + //========================================================================== // // diff --git a/src/dthinker.h b/src/dthinker.h index 921a7fc4e..548eb6bd0 100644 --- a/src/dthinker.h +++ b/src/dthinker.h @@ -44,6 +44,7 @@ struct pspdef_s; struct FState; class DThinker; class FSerializer; +struct FLevelLocals; class FThinkerIterator; @@ -65,7 +66,8 @@ class DThinker : public DObject { DECLARE_CLASS (DThinker, DObject) public: - DThinker (int statnum = STAT_DEFAULT) throw(); + static const int DEFAULT_STAT = STAT_DEFAULT; + DThinker () throw(); void OnDestroy () override; virtual ~DThinker (); virtual void Tick (); @@ -73,6 +75,7 @@ public: virtual void PostBeginPlay (); // Called just before the first tick virtual void CallPostBeginPlay(); // different in actor. virtual void PostSerialize(); + void Serialize(FSerializer &arc) override; size_t PropagateMark(); void ChangeStatNum (int statnum); @@ -111,6 +114,11 @@ private: friend class FSerializer; DThinker *NextThinker, *PrevThinker; + +public: + FLevelLocals *Level; + + friend struct FLevelLocals; // Needs access to FreshThinkers until the thinker storage gets refactored. }; class FThinkerIterator diff --git a/src/fragglescript/t_func.cpp b/src/fragglescript/t_func.cpp index 00162b3a4..99be0b2b7 100644 --- a/src/fragglescript/t_func.cpp +++ b/src/fragglescript/t_func.cpp @@ -1835,7 +1835,7 @@ void FParser::SF_FadeLight(void) auto it = Level->GetSectorTagIterator(sectag); while ((i = it.Next()) >= 0) { - if (!Level->sectors[i].lightingdata) Create(&Level->sectors[i],destlevel,speed); + if (!Level->sectors[i].lightingdata) Level->CreateThinker(&Level->sectors[i],destlevel,speed); } } } diff --git a/src/fragglescript/t_load.cpp b/src/fragglescript/t_load.cpp index 930c69682..2bad1ddec 100644 --- a/src/fragglescript/t_load.cpp +++ b/src/fragglescript/t_load.cpp @@ -262,7 +262,7 @@ bool FScriptLoader::ParseInfo(MapData * map) I_Error("Only one FraggleThinker is allowed to exist at a time.\nCheck your code."); } - auto th = Create(); + auto th = Level->CreateThinker(); th->LevelScript->data = copystring(scriptsrc.GetChars()); Level->FraggleScriptThinker = th; diff --git a/src/fragglescript/t_script.cpp b/src/fragglescript/t_script.cpp index 3311184a7..b8caaaff1 100644 --- a/src/fragglescript/t_script.cpp +++ b/src/fragglescript/t_script.cpp @@ -366,7 +366,6 @@ IMPLEMENT_POINTERS_END //========================================================================== DFraggleThinker::DFraggleThinker() -: DThinker(STAT_SCRIPTS) { GlobalScript = Create(); GC::WriteBarrier(this, GlobalScript); diff --git a/src/fragglescript/t_script.h b/src/fragglescript/t_script.h index 11c0c0ba4..7b21940bb 100644 --- a/src/fragglescript/t_script.h +++ b/src/fragglescript/t_script.h @@ -688,7 +688,7 @@ class DFraggleThinker : public DThinker DECLARE_CLASS(DFraggleThinker, DThinker) HAS_OBJECT_POINTERS public: - + static const int DEFAULT_STAT = STAT_SCRIPTS; int zoom = 1; AActor *trigger_obj; // this is a transient pointer not being subjected to GC. TObjPtr GlobalScript; diff --git a/src/g_level.cpp b/src/g_level.cpp index c36823300..633096c54 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1119,7 +1119,7 @@ void G_DoLoadLevel (int position, bool autosave, bool newGame) // [RH] Always save the game when entering a new level. if (autosave && !savegamerestore && disableautosave < 1) { - DAutosaver GCCNOWARN *dummy = Create(); + level.CreateThinker(); } if (pnumerr > 0) { diff --git a/src/g_levellocals.h b/src/g_levellocals.h index feaa54128..8844cdba9 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -202,6 +202,7 @@ public: void ActivateInStasisCeiling(int tag); bool CreateFloor(sector_t *sec, DFloor::EFloor floortype, line_t *line, double speed, double height, int crush, int change, bool hexencrush, bool hereticlower); void DoDeferedScripts(); + void AdjustPusher(int tag, int magnitude, int angle, bool wind); bool EV_DoPlat(int tag, line_t *line, DPlat::EPlatType type, double height, double speed, int delay, int lip, int change); void EV_StopPlat(int tag, bool remove); @@ -352,6 +353,27 @@ public: return true; } + template + T* CreateThinker(Args&&... args) + { + auto thinker = Create(std::forward(args)...); + auto statnum = T::DEFAULT_STAT; + thinker->ObjectFlags |= OF_JustSpawned; + DThinker::FreshThinkers[statnum].AddTail(thinker); + thinker->Level = this; + return thinker; + } + + DThinker *CreateThinker(PClass *cls, int statnum = STAT_DEFAULT) + { + DThinker *thinker = static_cast(cls->CreateNew()); + assert(thinker->IsKindOf(RUNTIME_CLASS(DThinker))); + thinker->ObjectFlags |= OF_JustSpawned; + DThinker::FreshThinkers[statnum].AddTail(thinker); + thinker->Level = this; + return thinker; + } + uint8_t md5[16]; // for savegame validation. If the MD5 does not match the savegame won't be loaded. int time; // time in the hub @@ -378,7 +400,7 @@ public: static const int BODYQUESIZE = 32; TObjPtr bodyque[BODYQUESIZE]; - TObjPtr automap; + TObjPtr automap = nullptr; int bodyqueslot; int NumMapSections; diff --git a/src/g_shared/a_decals.cpp b/src/g_shared/a_decals.cpp index e73788363..e644d8c00 100644 --- a/src/g_shared/a_decals.cpp +++ b/src/g_shared/a_decals.cpp @@ -67,44 +67,23 @@ IMPLEMENT_POINTERS_END IMPLEMENT_CLASS(DImpactDecal, false, false) -DBaseDecal::DBaseDecal () -: DThinker(STAT_DECAL), - WallNext(0), WallPrev(0), LeftDistance(0), Z(0), ScaleX(1.), ScaleY(1.), Alpha(1.), - AlphaColor(0), Translation(0), RenderFlags(0) -{ - RenderStyle = STYLE_None; - PicNum.SetInvalid(); -} - DBaseDecal::DBaseDecal (double z) -: DThinker(STAT_DECAL), - WallNext(0), WallPrev(0), LeftDistance(0), Z(z), ScaleX(1.), ScaleY(1.), Alpha(1.), +: WallNext(0), WallPrev(0), LeftDistance(0), Z(z), ScaleX(1.), ScaleY(1.), Alpha(1.), AlphaColor(0), Translation(0), RenderFlags(0), Side(nullptr), Sector(nullptr) { RenderStyle = STYLE_None; PicNum.SetInvalid(); } -DBaseDecal::DBaseDecal (int statnum, double z) -: DThinker(statnum), - WallNext(nullptr), WallPrev(nullptr), LeftDistance(0), Z(z), ScaleX(1.), ScaleY(1.), Alpha(1.), - AlphaColor(0), Translation(0), RenderFlags(0), Side(nullptr), Sector(nullptr) -{ - RenderStyle = STYLE_None; - PicNum.SetInvalid(); -} - DBaseDecal::DBaseDecal (const AActor *basis) -: DThinker(STAT_DECAL), - WallNext(nullptr), WallPrev(nullptr), LeftDistance(0), Z(basis->Z()), ScaleX(basis->Scale.X), ScaleY(basis->Scale.Y), +: WallNext(nullptr), WallPrev(nullptr), LeftDistance(0), Z(basis->Z()), ScaleX(basis->Scale.X), ScaleY(basis->Scale.Y), Alpha(basis->Alpha), AlphaColor(basis->fillcolor), Translation(basis->Translation), PicNum(basis->picnum), RenderFlags(basis->renderflags), RenderStyle(basis->RenderStyle), Side(nullptr), Sector(nullptr) { } DBaseDecal::DBaseDecal (const DBaseDecal *basis) -: DThinker(STAT_DECAL), - WallNext(nullptr), WallPrev(nullptr), LeftDistance(basis->LeftDistance), Z(basis->Z), ScaleX(basis->ScaleX), +: WallNext(nullptr), WallPrev(nullptr), LeftDistance(basis->LeftDistance), Z(basis->Z), ScaleX(basis->ScaleX), ScaleY(basis->ScaleY), Alpha(basis->Alpha), AlphaColor(basis->AlphaColor), Translation(basis->Translation), PicNum(basis->PicNum), RenderFlags(basis->RenderFlags), RenderStyle(basis->RenderStyle), Side(nullptr), Sector(nullptr) { @@ -521,7 +500,7 @@ void DBaseDecal::Spread (const FDecalTemplate *tpl, side_t *wall, double x, doub DBaseDecal *DBaseDecal::CloneSelf (const FDecalTemplate *tpl, double ix, double iy, double iz, side_t *wall, F3DFloor * ffloor) const { - DBaseDecal *decal = Create(iz); + DBaseDecal *decal = Level->CreateThinker(iz); if (decal != NULL) { if (decal->StickToWall (wall, ix, iy, ffloor).isValid()) @@ -559,16 +538,6 @@ CUSTOM_CVAR (Int, cl_maxdecals, 1024, CVAR_ARCHIVE) } } -DImpactDecal::DImpactDecal () -: DBaseDecal (STAT_AUTODECAL, 0.) -{ -} - -DImpactDecal::DImpactDecal (double z) -: DBaseDecal (STAT_AUTODECAL, z) -{ -} - void DImpactDecal::CheckMax () { if (++level.ImpactDecalCount >= cl_maxdecals) @@ -582,7 +551,7 @@ void DImpactDecal::CheckMax () } } -DImpactDecal *DImpactDecal::StaticCreate (const char *name, const DVector3 &pos, side_t *wall, F3DFloor * ffloor, PalEntry color) +DImpactDecal *DImpactDecal::StaticCreate (FLevelLocals *Level, const char *name, const DVector3 &pos, side_t *wall, F3DFloor * ffloor, PalEntry color) { if (cl_maxdecals > 0) { @@ -590,13 +559,13 @@ DImpactDecal *DImpactDecal::StaticCreate (const char *name, const DVector3 &pos, if (tpl != NULL && (tpl = tpl->GetDecal()) != NULL) { - return StaticCreate (tpl, pos, wall, ffloor, color); + return StaticCreate (Level, tpl, pos, wall, ffloor, color); } } return NULL; } -DImpactDecal *DImpactDecal::StaticCreate (const FDecalTemplate *tpl, const DVector3 &pos, side_t *wall, F3DFloor * ffloor, PalEntry color) +DImpactDecal *DImpactDecal::StaticCreate (FLevelLocals *Level, const FDecalTemplate *tpl, const DVector3 &pos, side_t *wall, F3DFloor * ffloor, PalEntry color) { DImpactDecal *decal = NULL; if (tpl != NULL && cl_maxdecals > 0 && !(wall->Flags & WALLF_NOAUTODECALS)) @@ -610,9 +579,9 @@ DImpactDecal *DImpactDecal::StaticCreate (const FDecalTemplate *tpl, const DVect // apply the custom color as well. if (tpl->ShadeColor != tpl_low->ShadeColor) lowercolor=0; else lowercolor = color; - StaticCreate (tpl_low, pos, wall, ffloor, lowercolor); + StaticCreate (Level, tpl_low, pos, wall, ffloor, lowercolor); } - decal = Create(pos.Z); + decal = Level->CreateThinker(pos.Z); if (decal == NULL) { return NULL; @@ -648,7 +617,7 @@ DBaseDecal *DImpactDecal::CloneSelf (const FDecalTemplate *tpl, double ix, doubl return NULL; } - DImpactDecal *decal = Create(iz); + DImpactDecal *decal = Level->CreateThinker(iz); if (decal != NULL) { if (decal->StickToWall (wall, ix, iy, ffloor).isValid()) @@ -709,12 +678,12 @@ void SprayDecal(AActor *shooter, const char *name, double distance) { if (trace.HitType == TRACE_HitWall) { - DImpactDecal::StaticCreate(name, trace.HitPos, trace.Line->sidedef[trace.Side], NULL); + DImpactDecal::StaticCreate(shooter->Level, name, trace.HitPos, trace.Line->sidedef[trace.Side], NULL); } } } -DBaseDecal *ShootDecal(const FDecalTemplate *tpl, AActor *basisactor, sector_t *sec, double x, double y, double z, DAngle angle, double tracedist, bool permanent) +DBaseDecal *ShootDecal(FLevelLocals *Level, const FDecalTemplate *tpl, sector_t *sec, double x, double y, double z, DAngle angle, double tracedist, bool permanent) { if (tpl == NULL || (tpl = tpl->GetDecal()) == NULL) { @@ -731,7 +700,7 @@ DBaseDecal *ShootDecal(const FDecalTemplate *tpl, AActor *basisactor, sector_t * { if (permanent) { - decal = Create(trace.HitPos.Z); + decal = Level->CreateThinker(trace.HitPos.Z); wall = trace.Line->sidedef[trace.Side]; decal->StickToWall(wall, trace.HitPos.X, trace.HitPos.Y, trace.ffloor); tpl->ApplyToDecal(decal, wall); @@ -744,7 +713,7 @@ DBaseDecal *ShootDecal(const FDecalTemplate *tpl, AActor *basisactor, sector_t * } else { - return DImpactDecal::StaticCreate(tpl, trace.HitPos, trace.Line->sidedef[trace.Side], NULL); + return DImpactDecal::StaticCreate(Level, tpl, trace.HitPos, trace.Line->sidedef[trace.Side], NULL); } } return NULL; @@ -779,7 +748,7 @@ DEFINE_ACTION_FUNCTION(ADecal, SpawnDecal) // Look for a wall within 64 units behind the actor. If none can be // found, then no decal is created, and this actor is destroyed // without effectively doing anything. - if (NULL == ShootDecal(tpl, self, self->Sector, self->X(), self->Y(), self->Z(), self->Angles.Yaw + 180, 64., true)) + if (!ShootDecal(self->Level, tpl, self->Sector, self->X(), self->Y(), self->Z(), self->Angles.Yaw + 180, 64., true)) { DPrintf (DMSG_WARNING, "Could not find a wall to stick decal to at (%f,%f)\n", self->X(), self->Y()); } diff --git a/src/g_shared/a_lightning.cpp b/src/g_shared/a_lightning.cpp index cebc3c8ef..0c599a798 100644 --- a/src/g_shared/a_lightning.cpp +++ b/src/g_shared/a_lightning.cpp @@ -42,7 +42,6 @@ static FRandom pr_lightning ("Lightning"); IMPLEMENT_CLASS(DLightningThinker, false, false) DLightningThinker::DLightningThinker () - : DThinker (STAT_LIGHTNING) { Stopped = false; LightningFlashCount = 0; @@ -232,20 +231,20 @@ void P_StartLightning () } DLightningThinker *lightning = LocateLightning (); - if (lightning == NULL) + if (lightning == nullptr) { - Create(); + level.CreateThinker(); } } void P_ForceLightning (int mode) { DLightningThinker *lightning = LocateLightning (); - if (lightning == NULL) + if (lightning == nullptr) { - lightning = Create(); + lightning = level.CreateThinker(); } - if (lightning != NULL) + if (lightning != nullptr) { lightning->ForceLightning (mode); } diff --git a/src/g_shared/a_lightning.h b/src/g_shared/a_lightning.h index 62a260474..9375fb7ac 100644 --- a/src/g_shared/a_lightning.h +++ b/src/g_shared/a_lightning.h @@ -11,6 +11,7 @@ class DLightningThinker : public DThinker { DECLARE_CLASS (DLightningThinker, DThinker); public: + static const int DEFAULT_STAT = STAT_LIGHTNING; DLightningThinker (); ~DLightningThinker (); void Serialize(FSerializer &arc); diff --git a/src/g_shared/a_quake.cpp b/src/g_shared/a_quake.cpp index a0c95c91a..d2467a925 100644 --- a/src/g_shared/a_quake.cpp +++ b/src/g_shared/a_quake.cpp @@ -41,17 +41,6 @@ IMPLEMENT_POINTERS_START(DEarthquake) IMPLEMENT_POINTER(m_Spot) IMPLEMENT_POINTERS_END -//========================================================================== -// -// DEarthquake :: DEarthquake private constructor -// -//========================================================================== - -DEarthquake::DEarthquake() -: DThinker(STAT_EARTHQUAKE) -{ -} - //========================================================================== // // DEarthquake :: DEarthquake public constructor @@ -62,7 +51,6 @@ DEarthquake::DEarthquake(AActor *center, int intensityX, int intensityY, int int int damrad, int tremrad, FSoundID quakesound, int flags, double waveSpeedX, double waveSpeedY, double waveSpeedZ, int falloff, int highpoint, double rollIntensity, double rollWave) - : DThinker(STAT_EARTHQUAKE) { m_QuakeSFX = quakesound; m_Spot = center; @@ -395,7 +383,7 @@ bool P_StartQuakeXYZ(AActor *activator, int tid, int intensityX, int intensityY, { if (activator != NULL) { - Create(activator, intensityX, intensityY, intensityZ, duration, damrad, tremrad, + level.CreateThinker(activator, intensityX, intensityY, intensityZ, duration, damrad, tremrad, quakesfx, flags, waveSpeedX, waveSpeedY, waveSpeedZ, falloff, highpoint, rollIntensity, rollWave); return true; } @@ -406,7 +394,7 @@ bool P_StartQuakeXYZ(AActor *activator, int tid, int intensityX, int intensityY, while ( (center = iterator.Next ()) ) { res = true; - Create(center, intensityX, intensityY, intensityZ, duration, damrad, tremrad, + level.CreateThinker(center, intensityX, intensityY, intensityZ, duration, damrad, tremrad, quakesfx, flags, waveSpeedX, waveSpeedY, waveSpeedZ, falloff, highpoint, rollIntensity, rollWave); } } diff --git a/src/g_shared/a_sharedglobal.h b/src/g_shared/a_sharedglobal.h index 327ff3d7a..01823a051 100644 --- a/src/g_shared/a_sharedglobal.h +++ b/src/g_shared/a_sharedglobal.h @@ -11,7 +11,7 @@ struct F3DFloor; class DBaseDecal; struct SpreadInfo; -class DBaseDecal *ShootDecal(const FDecalTemplate *tpl, AActor *basisactor, sector_t *sec, double x, double y, double z, DAngle angle, double tracedist, bool permanent); +DBaseDecal *ShootDecal(FLevelLocals *Level, const FDecalTemplate *tpl, sector_t *sec, double x, double y, double z, DAngle angle, double tracedist, bool permanent); void SprayDecal(AActor *shooter, const char *name,double distance = 172.); class DBaseDecal : public DThinker @@ -19,9 +19,8 @@ class DBaseDecal : public DThinker DECLARE_CLASS (DBaseDecal, DThinker) HAS_OBJECT_POINTERS public: - DBaseDecal (); - DBaseDecal(double z); - DBaseDecal(int statnum, double z); + static const int DEFAULT_STAT = STAT_DECAL; + DBaseDecal(double z = 0); DBaseDecal (const AActor *actor); DBaseDecal (const DBaseDecal *basis); @@ -61,20 +60,18 @@ class DImpactDecal : public DBaseDecal { DECLARE_CLASS (DImpactDecal, DBaseDecal) public: - DImpactDecal(double z); + static const int DEFAULT_STAT = STAT_AUTODECAL; + DImpactDecal(double z = 0) : DBaseDecal(z) {} DImpactDecal (side_t *wall, const FDecalTemplate *templ); - static DImpactDecal *StaticCreate(const char *name, const DVector3 &pos, side_t *wall, F3DFloor * ffloor, PalEntry color = 0); - static DImpactDecal *StaticCreate(const FDecalTemplate *tpl, const DVector3 &pos, side_t *wall, F3DFloor * ffloor, PalEntry color = 0); + static DImpactDecal *StaticCreate(FLevelLocals *Level, const char *name, const DVector3 &pos, side_t *wall, F3DFloor * ffloor, PalEntry color = 0); + static DImpactDecal *StaticCreate(FLevelLocals *Level, const FDecalTemplate *tpl, const DVector3 &pos, side_t *wall, F3DFloor * ffloor, PalEntry color = 0); void BeginPlay (); protected: DBaseDecal *CloneSelf(const FDecalTemplate *tpl, double x, double y, double z, side_t *wall, F3DFloor * ffloor) const; void CheckMax (); - -private: - DImpactDecal(); }; class DFlashFader : public DThinker @@ -126,6 +123,7 @@ class DEarthquake : public DThinker DECLARE_CLASS (DEarthquake, DThinker) HAS_OBJECT_POINTERS public: + static const int DEFAULT_STAT = STAT_EARTHQUAKE; DEarthquake(AActor *center, int intensityX, int intensityY, int intensityZ, int duration, int damrad, int tremrad, FSoundID quakesfx, int flags, double waveSpeedX, double waveSpeedY, double waveSpeedZ, int falloff, int highpoint, double rollIntensity, double rollWave); @@ -151,7 +149,7 @@ public: static int StaticGetQuakeIntensities(double ticFrac, AActor *viewer, FQuakeJiggers &jiggers); private: - DEarthquake (); + DEarthquake() = default; }; #endif //__A_SHAREDGLOBAL_H__ diff --git a/src/m_cheat.cpp b/src/m_cheat.cpp index 1ce0fac07..0de6758d0 100644 --- a/src/m_cheat.cpp +++ b/src/m_cheat.cpp @@ -636,7 +636,7 @@ void cht_Suicide (player_t *plyr) // the initial tick. if (plyr->mo != NULL) { - DSuicider *suicide = Create(); + DSuicider *suicide = plyr->mo->Level->CreateThinker(); suicide->Pawn = plyr->mo; GC::WriteBarrier(suicide, suicide->Pawn); } diff --git a/src/maploader/specials.cpp b/src/maploader/specials.cpp index 4f42a017f..7177de655 100644 --- a/src/maploader/specials.cpp +++ b/src/maploader/specials.cpp @@ -514,7 +514,7 @@ void MapLoader::InitSectorSpecial(sector_t *sector, int special) break; case dSector_DoorCloseIn30: - Create(sector, DDoor::doorWaitClose, 2, 0, 0, 30 * TICRATE); + Level->CreateThinker(sector, DDoor::doorWaitClose, 2, 0, 0, 30 * TICRATE); break; case dDamage_End: @@ -522,7 +522,7 @@ void MapLoader::InitSectorSpecial(sector_t *sector, int special) break; case dSector_DoorRaiseIn5Mins: - Create (sector, DDoor::doorWaitRaise, 2, TICRATE*30/7, 0, 5*60*TICRATE); + Level->CreateThinker (sector, DDoor::doorWaitRaise, 2, TICRATE*30/7, 0, 5*60*TICRATE); break; case dFriction_Low: @@ -703,19 +703,19 @@ void MapLoader::SpawnSpecials () // killough 3/16/98: Add support for setting // floor lighting independently (e.g. lava) case Transfer_FloorLight: - Create (line.frontsector, line.args[0], true); + Level->CreateThinker (line.frontsector, line.args[0], true); break; // killough 4/11/98: Add support for setting // ceiling lighting independently case Transfer_CeilingLight: - Create (line.frontsector, line.args[0], false); + Level->CreateThinker (line.frontsector, line.args[0], false); break; // [Graf Zahl] Add support for setting lighting // per wall independently case Transfer_WallLight: - Create (line.frontsector, line.args[0], line.args[1]); + Level->CreateThinker (line.frontsector, line.args[0], line.args[1]); break; case Sector_Attach3dMidtex: @@ -1029,52 +1029,52 @@ void MapLoader::SpawnLights(sector_t *sector) switch (sector->special) { case Light_Phased: - Create(sector, 48, 63 - (sector->lightlevel & 63)); + Level->CreateThinker(sector, 48, 63 - (sector->lightlevel & 63)); break; // [RH] Hexen-like phased lighting case LightSequenceStart: - Create(sector); + Level->CreateThinker(sector); break; case dLight_Flicker: - Create(sector); + Level->CreateThinker(sector); break; case dLight_StrobeFast: - Create(sector, STROBEBRIGHT, FASTDARK, false); + Level->CreateThinker(sector, STROBEBRIGHT, FASTDARK, false); break; case dLight_StrobeSlow: - Create(sector, STROBEBRIGHT, SLOWDARK, false); + Level->CreateThinker(sector, STROBEBRIGHT, SLOWDARK, false); break; case dLight_Strobe_Hurt: - Create(sector, STROBEBRIGHT, FASTDARK, false); + Level->CreateThinker(sector, STROBEBRIGHT, FASTDARK, false); break; case dLight_Glow: - Create(sector); + Level->CreateThinker(sector); break; case dLight_StrobeSlowSync: - Create(sector, STROBEBRIGHT, SLOWDARK, true); + Level->CreateThinker(sector, STROBEBRIGHT, SLOWDARK, true); break; case dLight_StrobeFastSync: - Create(sector, STROBEBRIGHT, FASTDARK, true); + Level->CreateThinker(sector, STROBEBRIGHT, FASTDARK, true); break; case dLight_FireFlicker: - Create(sector); + Level->CreateThinker(sector); break; case dScroll_EastLavaDamage: - Create(sector, STROBEBRIGHT, FASTDARK, false); + Level->CreateThinker(sector, STROBEBRIGHT, FASTDARK, false); break; case sLight_Strobe_Hurt: - Create(sector, STROBEBRIGHT, FASTDARK, false); + Level->CreateThinker(sector, STROBEBRIGHT, FASTDARK, false); break; default: @@ -1122,7 +1122,7 @@ void MapLoader::SpawnPushers() { auto itr = Level->GetSectorTagIterator(l->args[0]); while ((s = itr.Next()) >= 0) - Create(DPusher::p_wind, l->args[3] ? l : nullptr, l->args[1], l->args[2], nullptr, s); + Level->CreateThinker(DPusher::p_wind, l->args[3] ? l : nullptr, l->args[1], l->args[2], nullptr, s); l->special = 0; break; } @@ -1131,7 +1131,7 @@ void MapLoader::SpawnPushers() { auto itr = Level->GetSectorTagIterator(l->args[0]); while ((s = itr.Next()) >= 0) - Create(DPusher::p_current, l->args[3] ? l : nullptr, l->args[1], l->args[2], nullptr, s); + Level->CreateThinker(DPusher::p_current, l->args[3] ? l : nullptr, l->args[1], l->args[2], nullptr, s); l->special = 0; break; } @@ -1145,7 +1145,7 @@ void MapLoader::SpawnPushers() if (thing) { // No MT_P* means no effect // [RH] Allow narrowing it down by tid if (!l->args[1] || l->args[1] == thing->tid) - Create(DPusher::p_push, l->args[3] ? l : NULL, l->args[2], + Level->CreateThinker(DPusher::p_push, l->args[3] ? l : NULL, l->args[2], 0, thing, s); } } @@ -1159,7 +1159,7 @@ void MapLoader::SpawnPushers() if (thing->GetClass()->TypeName == NAME_PointPusher || thing->GetClass()->TypeName == NAME_PointPuller) { - Create(DPusher::p_push, l->args[3] ? l : NULL, l->args[2], 0, thing, thing->Sector->Index()); + Level->CreateThinker(DPusher::p_push, l->args[3] ? l : NULL, l->args[2], 0, thing, thing->Sector->Index()); } } } @@ -1269,7 +1269,7 @@ void MapLoader::SpawnScrollers() auto itr = Level->GetSectorTagIterator(l->args[0]); while ((s = itr.Next()) >= 0) { - Create(EScroll::sc_ceiling, -dx, dy, control, &Level->sectors[s], nullptr, accel); + Level->CreateThinker(EScroll::sc_ceiling, -dx, dy, control, &Level->sectors[s], nullptr, accel); } for (unsigned j = 0; j < copyscrollers.Size(); j++) { @@ -1277,7 +1277,7 @@ void MapLoader::SpawnScrollers() if (line->args[0] == l->args[0] && (line->args[1] & 1)) { - Create(EScroll::sc_ceiling, -dx, dy, control, line->frontsector, nullptr, accel); + Level->CreateThinker(EScroll::sc_ceiling, -dx, dy, control, line->frontsector, nullptr, accel); } } break; @@ -1289,7 +1289,7 @@ void MapLoader::SpawnScrollers() auto itr = Level->GetSectorTagIterator(l->args[0]); while ((s = itr.Next()) >= 0) { - Create(EScroll::sc_floor, -dx, dy, control, &Level->sectors[s], nullptr, accel); + Level->CreateThinker(EScroll::sc_floor, -dx, dy, control, &Level->sectors[s], nullptr, accel); } for (unsigned j = 0; j < copyscrollers.Size(); j++) { @@ -1297,7 +1297,7 @@ void MapLoader::SpawnScrollers() if (line->args[0] == l->args[0] && (line->args[1] & 2)) { - Create(EScroll::sc_floor, -dx, dy, control, line->frontsector, nullptr, accel); + Level->CreateThinker(EScroll::sc_floor, -dx, dy, control, line->frontsector, nullptr, accel); } } } @@ -1307,7 +1307,7 @@ void MapLoader::SpawnScrollers() auto itr = Level->GetSectorTagIterator(l->args[0]); while ((s = itr.Next()) >= 0) { - Create(EScroll::sc_carry, dx, dy, control, &Level->sectors[s], nullptr, accel); + Level->CreateThinker(EScroll::sc_carry, dx, dy, control, &Level->sectors[s], nullptr, accel); } for (unsigned j = 0; j < copyscrollers.Size(); j++) { @@ -1315,7 +1315,7 @@ void MapLoader::SpawnScrollers() if (line->args[0] == l->args[0] && (line->args[1] & 4)) { - Create(EScroll::sc_carry, dx, dy, control, line->frontsector, nullptr, accel); + Level->CreateThinker(EScroll::sc_carry, dx, dy, control, line->frontsector, nullptr, accel); } } } @@ -1329,7 +1329,7 @@ void MapLoader::SpawnScrollers() while ((s = itr.Next()) >= 0) { if (s != (int)i) - Create(dx, dy, &Level->lines[s], control, accel); + Level->CreateThinker(dx, dy, &Level->lines[s], control, accel); } break; } @@ -1337,32 +1337,32 @@ void MapLoader::SpawnScrollers() case Scroll_Texture_Offsets: // killough 3/2/98: scroll according to sidedef offsets side = Level->lines[i].sidedef[0]; - Create(EScroll::sc_side, -side->GetTextureXOffset(side_t::mid), + Level->CreateThinker(EScroll::sc_side, -side->GetTextureXOffset(side_t::mid), side->GetTextureYOffset(side_t::mid), nullptr, nullptr, side, accel, SCROLLTYPE(l->args[0])); break; case Scroll_Texture_Left: l->special = special; // Restore the special, for compat_useblocking's benefit. side = Level->lines[i].sidedef[0]; - Create(EScroll::sc_side, l->args[0] / 64., 0, nullptr, nullptr, side, accel, SCROLLTYPE(l->args[1])); + Level->CreateThinker(EScroll::sc_side, l->args[0] / 64., 0, nullptr, nullptr, side, accel, SCROLLTYPE(l->args[1])); break; case Scroll_Texture_Right: l->special = special; side = Level->lines[i].sidedef[0]; - Create(EScroll::sc_side, -l->args[0] / 64., 0, nullptr, nullptr, side, accel, SCROLLTYPE(l->args[1])); + Level->CreateThinker(EScroll::sc_side, -l->args[0] / 64., 0, nullptr, nullptr, side, accel, SCROLLTYPE(l->args[1])); break; case Scroll_Texture_Up: l->special = special; side = Level->lines[i].sidedef[0]; - Create(EScroll::sc_side, 0, l->args[0] / 64., nullptr, nullptr, side, accel, SCROLLTYPE(l->args[1])); + Level->CreateThinker(EScroll::sc_side, 0, l->args[0] / 64., nullptr, nullptr, side, accel, SCROLLTYPE(l->args[1])); break; case Scroll_Texture_Down: l->special = special; side = Level->lines[i].sidedef[0]; - Create(EScroll::sc_side, 0, -l->args[0] / 64., nullptr, nullptr, side, accel, SCROLLTYPE(l->args[1])); + Level->CreateThinker(EScroll::sc_side, 0, -l->args[0] / 64., nullptr, nullptr, side, accel, SCROLLTYPE(l->args[1])); break; case Scroll_Texture_Both: @@ -1370,7 +1370,7 @@ void MapLoader::SpawnScrollers() if (l->args[0] == 0) { dx = (l->args[1] - l->args[2]) / 64.; dy = (l->args[4] - l->args[3]) / 64.; - Create(EScroll::sc_side, dx, dy, nullptr, nullptr, side, accel); + Level->CreateThinker(EScroll::sc_side, dx, dy, nullptr, nullptr, side, accel); } break; @@ -1385,5 +1385,5 @@ void MapLoader::SpawnScrollers() void MapLoader::CreateScroller(EScroll type, double dx, double dy, sector_t *affectee, int accel, EScrollPos scrollpos) { - Create(type, dx, dy, nullptr, affectee, nullptr, accel, scrollpos); + Level->CreateThinker(type, dx, dy, nullptr, affectee, nullptr, accel, scrollpos); } diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 3f61326b6..6047ac87c 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -3300,7 +3300,6 @@ IMPLEMENT_POINTERS_START(DACSThinker) IMPLEMENT_POINTERS_END DACSThinker::DACSThinker () -: DThinker(STAT_SCRIPTS) { Scripts = nullptr; LastScript = nullptr; @@ -3880,7 +3879,7 @@ showme: fa1 = viewer->BlendA; } } - Create (fr1, fg1, fb1, fa1, fr2, fg2, fb2, fa2, ftime, viewer->mo); + Level->CreateThinker (fr1, fg1, fb1, fa1, fr2, fg2, fb2, fa2, ftime, viewer->mo); } } } @@ -5016,7 +5015,7 @@ static bool DoSpawnDecal(AActor *actor, const FDecalTemplate *tpl, int flags, DA { angle += actor->Angles.Yaw; } - return NULL != ShootDecal(tpl, actor, actor->Sector, actor->X(), actor->Y(), + return nullptr != ShootDecal(actor->Level, tpl, actor->Sector, actor->X(), actor->Y(), actor->Center() - actor->Floorclip + actor->GetBobOffset() + zofs, angle, distance, !!(flags & SDF_PERMANENT)); } @@ -9471,7 +9470,7 @@ scriptwait: int secnum = Level->FindFirstSectorFromTag(STACK(8)); if (secnum >= 0) { - Create(activator, activationline, backSide, pcd == PCD_SETCEILINGTRIGGER, &Level->sectors[secnum], + Level->CreateThinker(activator, activationline, backSide, pcd == PCD_SETCEILINGTRIGGER, &Level->sectors[secnum], STACK(7), STACK(6), STACK(5), STACK(4), STACK(3), STACK(2), STACK(1)); } @@ -10234,7 +10233,7 @@ DLevelScript::DLevelScript (FLevelLocals *l, AActor *who, line_t *where, int num { Level = l; if (Level->ACSThinker == nullptr) - Level->ACSThinker = Create(); + Level->ACSThinker = Level->CreateThinker(); script = num; assert(code->VarCount >= code->ArgCount); diff --git a/src/p_acs.h b/src/p_acs.h index 21cb61e62..c209ca16d 100644 --- a/src/p_acs.h +++ b/src/p_acs.h @@ -453,6 +453,7 @@ class DACSThinker : public DThinker DECLARE_CLASS(DACSThinker, DThinker) HAS_OBJECT_POINTERS public: + static const int DEFAULT_STAT = STAT_SCRIPTS; DACSThinker(); ~DACSThinker(); diff --git a/src/p_actionfunctions.cpp b/src/p_actionfunctions.cpp index b9bf2603a..6e7d3db8a 100644 --- a/src/p_actionfunctions.cpp +++ b/src/p_actionfunctions.cpp @@ -1835,7 +1835,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_SetBlend) // if (color2.a == 0) // color2 = color; - Create(color.r/255.f, color.g/255.f, color.b/255.f, float(alpha), + self->Level->CreateThinker(color.r/255.f, color.g/255.f, color.b/255.f, float(alpha), color2.r/255.f, color2.g/255.f, color2.b/255.f, float(alpha2), float(tics)/TICRATE, self, true); return 0; diff --git a/src/p_ceiling.cpp b/src/p_ceiling.cpp index 99744de51..015fe5882 100644 --- a/src/p_ceiling.cpp +++ b/src/p_ceiling.cpp @@ -244,7 +244,7 @@ bool FLevelLocals::CreateCeiling(sector_t *sec, DCeiling::ECeiling type, line_t } // new door thinker - DCeiling *ceiling = Create (sec, speed, speed2, silent & ~4); + DCeiling *ceiling = CreateThinker (sec, speed, speed2, silent & ~4); vertex_t *spot = sec->Lines[0]->v1; switch (type) diff --git a/src/p_doors.cpp b/src/p_doors.cpp index b43ad17a7..e07e736a1 100644 --- a/src/p_doors.cpp +++ b/src/p_doors.cpp @@ -480,7 +480,7 @@ bool FLevelLocals::EV_DoDoor (DDoor::EVlDoor type, line_t *line, AActor *thing, } return false; } - if (Create (sec, type, speed, delay, lightTag, topcountdown)) + if (CreateThinker (sec, type, speed, delay, lightTag, topcountdown)) rtn = true; } else @@ -494,7 +494,7 @@ bool FLevelLocals::EV_DoDoor (DDoor::EVlDoor type, line_t *line, AActor *thing, if (sec->PlaneMoving(sector_t::ceiling)) continue; - if (Create(sec, type, speed, delay, lightTag, topcountdown)) + if (CreateThinker(sec, type, speed, delay, lightTag, topcountdown)) rtn = true; } @@ -773,7 +773,7 @@ bool FLevelLocals::EV_SlidingDoor (line_t *line, AActor *actor, int tag, int spe FDoorAnimation *anim = TexMan.FindAnimatedDoor (line->sidedef[0]->GetTexture(side_t::top)); if (anim != NULL) { - Create(sec, line, speed, delay, anim, type); + CreateThinker(sec, line, speed, delay, anim, type); return true; } return false; @@ -798,7 +798,7 @@ bool FLevelLocals::EV_SlidingDoor (line_t *line, AActor *actor, int tag, int spe if (anim != NULL) { rtn = true; - Create(sec, line, speed, delay, anim, type); + CreateThinker(sec, line, speed, delay, anim, type); break; } } diff --git a/src/p_floor.cpp b/src/p_floor.cpp index c818670d3..825282263 100644 --- a/src/p_floor.cpp +++ b/src/p_floor.cpp @@ -283,7 +283,7 @@ bool FLevelLocals::CreateFloor(sector_t *sec, DFloor::EFloor floortype, line_t * // new floor thinker rtn = true; - floor = Create(sec); + floor = CreateThinker(sec); floor->m_Type = floortype; floor->m_Crush = crush; floor->m_Hexencrush = hexencrush; @@ -631,7 +631,7 @@ bool FLevelLocals::EV_BuildStairs (int tag, DFloor::EStair type, line_t *line, d // new floor thinker rtn = true; - floor = Create (sec); + floor = CreateThinker (sec); floor->m_Direction = (type == DFloor::buildUp) ? 1 : -1; stairstep = stairsize * floor->m_Direction; floor->m_Type = DFloor::buildStair; //jff 3/31/98 do not leave uninited @@ -734,7 +734,7 @@ bool FLevelLocals::EV_BuildStairs (int tag, DFloor::EStair type, line_t *line, d secnum = newsecnum; // create and initialize a thinker for the next step - floor = Create (sec); + floor = CreateThinker (sec); floor->StartFloorSound (); floor->m_Direction = (type == DFloor::buildUp) ? 1 : -1; floor->m_FloorDestDist = sec->floorplane.PointToDist (DVector2(0, 0), height); @@ -813,7 +813,7 @@ bool FLevelLocals::EV_DoDonut (int tag, line_t *line, double pillarspeed, double s3 = ln->backsector; // Spawn rising slime - floor = Create (s2); + floor = CreateThinker (s2); floor->m_Type = DFloor::donutRaise; floor->m_Crush = -1; floor->m_Hexencrush = false; @@ -828,7 +828,7 @@ bool FLevelLocals::EV_DoDonut (int tag, line_t *line, double pillarspeed, double floor->StartFloorSound (); // Spawn lowering donut-hole - floor = Create (s1); + floor = CreateThinker (s1); floor->m_Type = DFloor::floorLowerToNearest; floor->m_Crush = -1; floor->m_Hexencrush = false; @@ -1013,7 +1013,7 @@ bool FLevelLocals::EV_DoElevator (line_t *line, DElevator::EElevator elevtype, // create and initialize new elevator thinker rtn = true; - elevator = Create (sec); + elevator = CreateThinker (sec); elevator->m_Type = elevtype; elevator->m_Speed = speed; elevator->StartFloorSound (); @@ -1310,12 +1310,12 @@ bool FLevelLocals::EV_StartWaggle (int tag, line_t *line, int height, int speed, retCode = true; if (ceiling) { - waggle = Create (sector); + waggle = CreateThinker (sector); waggle->m_OriginalDist = sector->ceilingplane.fD(); } else { - waggle = Create (sector); + waggle = CreateThinker (sector); waggle->m_OriginalDist = sector->floorplane.fD(); } waggle->m_Accumulator = offset; diff --git a/src/p_lights.cpp b/src/p_lights.cpp index 636bc4899..96ef415c1 100644 --- a/src/p_lights.cpp +++ b/src/p_lights.cpp @@ -60,7 +60,6 @@ IMPLEMENT_CLASS(DLighting, false, false) DLighting::DLighting (sector_t *sector) : DSectorEffect (sector) { - ChangeStatNum (STAT_LIGHT); } //----------------------------------------------------------------------------- @@ -525,7 +524,7 @@ int DPhased::PhaseHelper (sector_t *sector, int index, int light, sector_t *prev m_BaseLevel = baselevel; } else - l = Create (sector, baselevel); + l = Level->CreateThinker (sector, baselevel); int numsteps = PhaseHelper (sector->NextSpecialSector ( sector->special == LightSequenceSpecial1 ? @@ -545,17 +544,10 @@ int DPhased::PhaseHelper (sector_t *sector, int index, int light, sector_t *prev // //----------------------------------------------------------------------------- -DPhased::DPhased (sector_t *sector, int baselevel) - : DLighting (sector) -{ - m_BaseLevel = baselevel; -} - -DPhased::DPhased (sector_t *sector) - : DLighting (sector) +void DPhased::Propagate() { validcount++; - PhaseHelper (sector, 0, 0, NULL); + PhaseHelper (m_Sector, 0, 0, nullptr); } DPhased::DPhased (sector_t *sector, int baselevel, int phase) @@ -577,7 +569,7 @@ void FLevelLocals::EV_StartLightFlickering(int tag, int upper, int lower) auto it = GetSectorTagIterator(tag); while ((secnum = it.Next()) >= 0) { - Create(§ors[secnum], upper, lower); + CreateThinker(§ors[secnum], upper, lower); } } @@ -599,7 +591,7 @@ void FLevelLocals::EV_StartLightStrobing(int tag, int upper, int lower, int utic if (sec->lightingdata) continue; - Create(sec, upper, lower, utics, ltics); + CreateThinker(sec, upper, lower, utics, ltics); } } @@ -613,7 +605,7 @@ void FLevelLocals::EV_StartLightStrobing(int tag, int utics, int ltics) if (sec->lightingdata) continue; - Create(sec, utics, ltics, false); + CreateThinker(sec, utics, ltics, false); } } @@ -783,7 +775,7 @@ void FLevelLocals::EV_StartLightGlowing(int tag, int upper, int lower, int tics) if (sec->lightingdata) continue; - Create(sec, upper, lower, tics, false); + CreateThinker(sec, upper, lower, tics, false); } } @@ -813,7 +805,7 @@ void FLevelLocals::EV_StartLightFading(int tag, int value, int tics) if (sec->lightlevel == value) continue; - Create(sec, sec->lightlevel, value, tics, true); + CreateThinker(sec, sec->lightlevel, value, tics, true); } } } diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index a68bf9f34..a2e25d87e 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -2227,7 +2227,6 @@ FUNC(LS_Sector_ChangeFlags) -void AdjustPusher(int tag, int magnitude, int angle, bool wind); FUNC(LS_Sector_SetWind) // Sector_SetWind (tag, amount, angle) @@ -2235,7 +2234,7 @@ FUNC(LS_Sector_SetWind) if (arg3) return false; - AdjustPusher (arg0, arg1, arg2, true); + Level->AdjustPusher (arg0, arg1, arg2, true); return true; } @@ -2245,7 +2244,7 @@ FUNC(LS_Sector_SetCurrent) if (arg3) return false; - AdjustPusher (arg0, arg1, arg2, false); + Level->AdjustPusher (arg0, arg1, arg2, false); return true; } diff --git a/src/p_map.cpp b/src/p_map.cpp index 9b52b897e..9bfe40486 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -4952,7 +4952,7 @@ void P_TraceBleed(int damage, const DVector3 &pos, AActor *actor, DAngle angle, bloodcolor.a = 1; } - DImpactDecal::StaticCreate(bloodType, bleedtrace.HitPos, + DImpactDecal::StaticCreate(actor->Level, bloodType, bleedtrace.HitPos, bleedtrace.Line->sidedef[bleedtrace.Side], bleedtrace.ffloor, bloodcolor); } } @@ -6751,7 +6751,7 @@ void SpawnShootDecal(AActor *t1, const FTraceResults &trace) } if (decalbase != NULL) { - DImpactDecal::StaticCreate(decalbase->GetDecal(), + DImpactDecal::StaticCreate(t1->Level, decalbase->GetDecal(), trace.HitPos, trace.Line->sidedef[trace.Side], trace.ffloor); } } diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index e0f58fe73..4283e0be0 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -1415,7 +1415,7 @@ void P_ExplodeMissile (AActor *mo, line_t *line, AActor *target, bool onsky) } } - DImpactDecal::StaticCreate(base->GetDecal(), linepos, line->sidedef[side], ffloor); + DImpactDecal::StaticCreate(mo->Level, base->GetDecal(), linepos, line->sidedef[side], ffloor); } } } @@ -4369,7 +4369,7 @@ AActor *AActor::StaticSpawn (PClassActor *type, const DVector3 &pos, replace_t a AActor *actor; - actor = static_cast(const_cast(type)->CreateNew ()); + actor = static_cast(level.CreateThinker(type)); actor->SpawnTime = level.totaltime; actor->SpawnOrder = level.spawnindex++; diff --git a/src/p_pillar.cpp b/src/p_pillar.cpp index a681bee23..ae29629f8 100644 --- a/src/p_pillar.cpp +++ b/src/p_pillar.cpp @@ -234,7 +234,7 @@ bool FLevelLocals::EV_DoPillar (DPillar::EPillar type, line_t *line, int tag, continue; rtn = true; - Create (sec, type, speed, height, height2, crush, hexencrush); + CreateThinker (sec, type, speed, height, height2, crush, hexencrush); } return rtn; } diff --git a/src/p_plats.cpp b/src/p_plats.cpp index 2a39ef323..993c5cbcb 100644 --- a/src/p_plats.cpp +++ b/src/p_plats.cpp @@ -266,7 +266,7 @@ bool FLevelLocals::EV_DoPlat (int tag, line_t *line, DPlat::EPlatType type, doub // Find lowest & highest floors around sector rtn = true; - plat = Create (sec); + plat = CreateThinker (sec); plat->m_Type = type; plat->m_Crush = -1; diff --git a/src/p_pusher.cpp b/src/p_pusher.cpp index 0ebb29351..7b38aab3f 100644 --- a/src/p_pusher.cpp +++ b/src/p_pusher.cpp @@ -293,14 +293,14 @@ void DPusher::Tick () } -void AdjustPusher(int tag, int magnitude, int angle, bool wind) +void FLevelLocals::AdjustPusher(int tag, int magnitude, int angle, bool wind) { DPusher::EPusher type = wind ? DPusher::p_wind : DPusher::p_current; // Find pushers already attached to the sector, and change their parameters. TArray Collection; { - TThinkerIterator iterator; + auto iterator = GetThinkerIterator(); FThinkerCollection collect; while ((collect.Obj = iterator.Next())) @@ -328,7 +328,7 @@ void AdjustPusher(int tag, int magnitude, int angle, bool wind) } if (i == numcollected) { - Create(type, nullptr, magnitude, angle, nullptr, secnum); + CreateThinker(type, nullptr, magnitude, angle, nullptr, secnum); } } } diff --git a/src/p_scroll.cpp b/src/p_scroll.cpp index 649b8afe8..0923d8d60 100644 --- a/src/p_scroll.cpp +++ b/src/p_scroll.cpp @@ -247,7 +247,6 @@ void DScroller::Tick () //----------------------------------------------------------------------------- DScroller::DScroller (EScroll type, double dx, double dy, sector_t *ctrl, sector_t *sec, side_t *side, int accel, EScrollPos scrollpos) - : DThinker (STAT_SCROLLER) { m_Type = type; m_dx = dx; @@ -329,7 +328,6 @@ void DScroller::OnDestroy () //----------------------------------------------------------------------------- DScroller::DScroller (double dx, double dy, const line_t *l, sector_t * control, int accel, EScrollPos scrollpos) - : DThinker (STAT_SCROLLER) { double x = fabs(l->Delta().X), y = fabs(l->Delta().Y), d; if (y > x) d = x, x = y, y = d; @@ -432,7 +430,7 @@ void SetWallScroller (FLevelLocals *Level, int id, int sidechoice, double dx, do { if (Collection.FindEx([=](const DScroller *element) { return element->GetWall() == side; }) == Collection.Size()) { - Create (EScroll::sc_side, dx, dy, nullptr, nullptr, side, 0, Where); + Level->CreateThinker (EScroll::sc_side, dx, dy, nullptr, nullptr, side, 0, Where); } } } @@ -472,6 +470,6 @@ void SetScroller (FLevelLocals *Level, int tag, EScroll type, double dx, double auto itr = Level->GetSectorTagIterator(tag); while ((i = itr.Next()) >= 0) { - Create (type, dx, dy, nullptr, &Level->sectors[i], nullptr, 0); + Level->CreateThinker (type, dx, dy, nullptr, &Level->sectors[i], nullptr, 0); } } diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 6459065fb..c4ddfa2be 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -333,7 +333,7 @@ void FLevelLocals::ClearLevelData() AllPlayerStarts.Clear(); memset(playerstarts, 0, sizeof(playerstarts)); Scrolls.Clear(); - + if (automap) automap->Destroy(); } //========================================================================== diff --git a/src/p_spec.cpp b/src/p_spec.cpp index 3d07180c1..71f1093fe 100644 --- a/src/p_spec.cpp +++ b/src/p_spec.cpp @@ -718,7 +718,6 @@ DLightTransfer::DLightTransfer (sector_t *srcSec, int target, bool copyFloor) while ((secnum = itr.Next()) >= 0) Level->sectors[secnum].ChangeFlags(sector_t::ceiling, 0, PLANEF_ABSLIGHTING); } - ChangeStatNum (STAT_LIGHTTRANSFER); } void DLightTransfer::Tick () @@ -796,7 +795,6 @@ DWallLightTransfer::DWallLightTransfer (sector_t *srcSec, int target, uint8_t fl Level->lines[linenum].sidedef[1]->Flags |= wallflags; } } - ChangeStatNum(STAT_LIGHTTRANSFER); } void DWallLightTransfer::Tick () diff --git a/src/p_spec.h b/src/p_spec.h index 9de805f43..de9e291f5 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -125,6 +125,7 @@ class DLighting : public DSectorEffect { DECLARE_CLASS(DLighting, DSectorEffect) public: + static const int DEFAULT_STAT = STAT_LIGHT; DLighting(sector_t *sector); protected: DLighting() = default; diff --git a/src/p_spec_thinkers.h b/src/p_spec_thinkers.h index fe5ad9e07..3647a1314 100644 --- a/src/p_spec_thinkers.h +++ b/src/p_spec_thinkers.h @@ -9,6 +9,7 @@ class DLightTransfer : public DThinker DLightTransfer() = default; public: + static const int DEFAULT_STAT = STAT_LIGHTTRANSFER; DLightTransfer (sector_t *srcSec, int target, bool copyFloor); void Serialize(FSerializer &arc); void Tick (); @@ -34,6 +35,7 @@ class DWallLightTransfer : public DThinker DECLARE_CLASS (DWallLightTransfer, DThinker) DWallLightTransfer() = default; public: + static const int DEFAULT_STAT = STAT_LIGHTTRANSFER; DWallLightTransfer (sector_t *srcSec, int target, uint8_t flags); void Serialize(FSerializer &arc); void Tick (); @@ -153,11 +155,10 @@ class DPhased : public DLighting { DECLARE_CLASS(DPhased, DLighting) public: - DPhased(sector_t *sector); - DPhased(sector_t *sector, int baselevel, int phase); + DPhased(sector_t *sector, int baselevel = 0, int phase = 0); // These are for internal use only but the Create template needs access to them. DPhased() = default; - DPhased(sector_t *sector, int baselevel); + void Propagate(); void Serialize(FSerializer &arc); void Tick(); @@ -218,7 +219,8 @@ class DScroller : public DThinker DECLARE_CLASS (DScroller, DThinker) HAS_OBJECT_POINTERS public: - + static const int DEFAULT_STAT = STAT_SCROLLER; + DScroller(EScroll type, double dx, double dy, sector_t *control, sector_t *sec, side_t *side, int accel, EScrollPos scrollpos = EScrollPos::scw_all); DScroller (double dx, double dy, const line_t *l, sector_t *control, int accel, EScrollPos scrollpos = EScrollPos::scw_all); void OnDestroy() override; diff --git a/src/p_switch.cpp b/src/p_switch.cpp index ec1d717ec..3911c141d 100644 --- a/src/p_switch.cpp +++ b/src/p_switch.cpp @@ -98,7 +98,7 @@ static bool P_StartButton (side_t *side, int Where, FSwitchDef *Switch, const DV } } - Create (side, Where, Switch, pos, useagain); + level.CreateThinker (side, Where, Switch, pos, useagain); return true; } diff --git a/src/po_man.cpp b/src/po_man.cpp index c4bdf717d..44e451dc5 100644 --- a/src/po_man.cpp +++ b/src/po_man.cpp @@ -369,7 +369,7 @@ bool EV_RotatePoly (FLevelLocals *Level, line_t *line, int polyNum, int speed, i // cannot do rotations on linked polyportals. break; } - pe = Create(poly); + pe = Level->CreateThinker(poly); poly->specialdata = pe; poly->bBlocked = false; if (byteAngle != 0) @@ -448,7 +448,7 @@ bool EV_MovePoly (FLevelLocals *Level, line_t *line, int polyNum, double speed, { // poly is already in motion break; } - pe = Create(poly); + pe = Level->CreateThinker(poly); poly->specialdata = pe; poly->bBlocked = false; pe->m_Dist = dist; // Distance @@ -528,7 +528,7 @@ bool EV_MovePolyTo(FLevelLocals *Level, line_t *line, int polyNum, double speed, { // poly is already in motion break; } - pe = Create(poly); + pe = Level->CreateThinker(poly); poly->specialdata = pe; poly->bBlocked = false; pe->m_Dist = distlen; @@ -681,7 +681,7 @@ bool EV_OpenPolyDoor(FLevelLocals *Level, line_t *line, int polyNum, double spee break; } - pd = Create(poly, type); + pd = Level->CreateThinker(poly, type); poly->specialdata = pd; if (type == PODOOR_SLIDE) { @@ -1223,7 +1223,7 @@ void FPolyObj::LinkPolyobj () { link = &Level->PolyBlockMap[j+i]; if(!(*link)) - { // Create a new link at the current block cell + { // CreateThinker a new link at the current block cell *link = new polyblock_t; (*link)->next = nullptr; (*link)->prev = nullptr; diff --git a/src/scripting/backend/codegen.cpp b/src/scripting/backend/codegen.cpp index cb007c2f4..4beb56d67 100644 --- a/src/scripting/backend/codegen.cpp +++ b/src/scripting/backend/codegen.cpp @@ -47,6 +47,7 @@ #include "v_text.h" #include "w_wad.h" #include "doomstat.h" +#include "g_levellocals.h" extern FRandom pr_exrandom; FMemArena FxAlloc(65536); @@ -5173,18 +5174,21 @@ static DObject *BuiltinNew(PClass *cls, int outerside, int backwardscompatible) ThrowAbortException(X_OTHER, "Cannot create actors with 'new'"); return nullptr; } - if (vm_warnthinkercreation && cls->IsDescendantOf(NAME_Thinker)) + if ((vm_warnthinkercreation || !backwardscompatible) && cls->IsDescendantOf(NAME_Thinker)) { // This must output a diagnostic warning - //ThrowAbortException(X_OTHER, "Cannot create actors with 'new'"); - //return nullptr; + Printf("Using 'new' to create thinkers is deprecated."); } // [ZZ] validate readonly and between scope construction if (outerside) FScopeBarrier::ValidateNew(cls, outerside - 1); - auto object = cls->CreateNew(); - if (backwardscompatible && object->IsKindOf(NAME_Thinker)) + DObject *object; + if (!cls->IsDescendantOf(NAME_Thinker)) { - // Todo: Link thinker to current primary level. + object = cls->CreateNew(); + } + else + { + object = level.CreateThinker(cls); } return object; } From e7aa10b5c84ff9aec25eeb5d04c43be02e98826e Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 27 Jan 2019 13:08:54 +0100 Subject: [PATCH 031/164] - changed thinker initialization to occur in a Construct function instead of the constructor itself. This was done to ensure that this code only runs when the thinker itself is fully set up. With a constructor there is no control about such things, if some common initialization needs to be done it has to be in the base constructor, but that makes the entire approach chosen here to ensure proper linking into the thinker chains impossible. ZDoom originally did it that way, which resulted in a very inflexible system and required some awful hacks to let the serializer work with it - the corresponding bSerialOverride flag is now gone. The only thinker class still having a constructor is DFraggleThinker, because it contains non-serializable data that needs to be initialized in a piece of code that always runs, regardless of whether the object is created explicitly or from a savegame. --- src/b_bot.cpp | 2 +- src/b_bot.h | 2 +- src/decallib.cpp | 35 ++++++++++++---------- src/dobjtype.cpp | 5 ---- src/dsectoreffect.cpp | 14 ++++----- src/dsectoreffect.h | 17 ++++------- src/dthinker.cpp | 12 -------- src/dthinker.h | 8 +---- src/fragglescript/t_func.cpp | 7 ++--- src/fragglescript/t_script.cpp | 28 ++++++++++++------ src/fragglescript/t_script.h | 3 +- src/g_level.cpp | 1 + src/g_levellocals.h | 19 +++++------- src/g_shared/a_decals.cpp | 35 +++++++++++++++------- src/g_shared/a_flashfader.cpp | 6 ++-- src/g_shared/a_lightning.cpp | 2 +- src/g_shared/a_lightning.h | 2 +- src/g_shared/a_quake.cpp | 2 +- src/g_shared/a_sharedglobal.h | 39 ++++++++++++------------- src/m_cheat.cpp | 1 + src/p_acs.cpp | 19 +++++------- src/p_acs.h | 6 ++-- src/p_ceiling.cpp | 8 ++--- src/p_doors.cpp | 25 ++++++++++------ src/p_floor.cpp | 20 ++++++------- src/p_lights.cpp | 45 +++++++++++++---------------- src/p_pillar.cpp | 5 ++-- src/p_plats.cpp | 4 +-- src/p_pusher.cpp | 2 +- src/p_scroll.cpp | 4 +-- src/p_spec.cpp | 4 +-- src/p_spec.h | 53 +++++++++------------------------- src/p_spec_thinkers.h | 50 ++++++++++---------------------- src/p_switch.cpp | 18 ++---------- src/po_man.cpp | 53 +++++++++------------------------- src/po_man.h | 3 +- src/serializer.cpp | 3 -- 37 files changed, 235 insertions(+), 327 deletions(-) diff --git a/src/b_bot.cpp b/src/b_bot.cpp index 9bddac1ad..9ff12a8ab 100644 --- a/src/b_bot.cpp +++ b/src/b_bot.cpp @@ -63,7 +63,7 @@ IMPLEMENT_POINTERS_END DEFINE_FIELD(DBot, dest) -DBot::DBot () +void DBot::Construct() { Clear (); } diff --git a/src/b_bot.h b/src/b_bot.h index 0d28f796c..71b8252f8 100644 --- a/src/b_bot.h +++ b/src/b_bot.h @@ -167,7 +167,7 @@ class DBot : public DThinker HAS_OBJECT_POINTERS public: static const int DEFAULT_STAT = STAT_BOT; - DBot (); + void Construct (); void Clear (); void Serialize(FSerializer &arc); diff --git a/src/decallib.cpp b/src/decallib.cpp index 9a3cd15cd..8a984ecd7 100644 --- a/src/decallib.cpp +++ b/src/decallib.cpp @@ -110,11 +110,12 @@ struct DDecalThinker : public DThinker HAS_OBJECT_POINTERS public: static const int DEFAULT_STAT = STAT_DECALTHINKER; - DDecalThinker (DBaseDecal *decal) : TheDecal (decal) {} + void Construct(DBaseDecal *decal) + { + TheDecal = decal; + } void Serialize(FSerializer &arc); TObjPtr TheDecal; -protected: - DDecalThinker() = default; }; IMPLEMENT_CLASS(DDecalThinker, false, true) @@ -142,15 +143,16 @@ class DDecalFader : public DDecalThinker { DECLARE_CLASS (DDecalFader, DDecalThinker) public: - DDecalFader (DBaseDecal *decal) : DDecalThinker (decal) {} + void Construct(DBaseDecal *decal) + { + Super::Construct(decal); + } void Serialize(FSerializer &arc); void Tick (); int TimeToStartDecay; int TimeToEndDecay; double StartTrans; -private: - DDecalFader () {} }; struct FDecalColorerAnim : public FDecalAnimator @@ -167,7 +169,10 @@ class DDecalColorer : public DDecalThinker { DECLARE_CLASS (DDecalColorer, DDecalThinker) public: - DDecalColorer (DBaseDecal *decal) : DDecalThinker (decal) {} + void Construct(DBaseDecal *decal) + { + Super::Construct(decal); + } void Serialize(FSerializer &arc); void Tick (); @@ -175,8 +180,6 @@ public: int TimeToEndDecay; PalEntry StartColor; PalEntry GoalColor; -private: - DDecalColorer () {} }; struct FDecalStretcherAnim : public FDecalAnimator @@ -193,7 +196,10 @@ class DDecalStretcher : public DDecalThinker { DECLARE_CLASS (DDecalStretcher, DDecalThinker) public: - DDecalStretcher (DBaseDecal *decal) : DDecalThinker (decal) {} + void Construct(DBaseDecal *decal) + { + Super::Construct(decal); + } void Serialize(FSerializer &arc); void Tick (); @@ -206,8 +212,6 @@ public: bool bStretchX; bool bStretchY; bool bStarted; -private: - DDecalStretcher () {} }; struct FDecalSliderAnim : public FDecalAnimator @@ -224,7 +228,10 @@ class DDecalSlider : public DDecalThinker { DECLARE_CLASS (DDecalSlider, DDecalThinker) public: - DDecalSlider (DBaseDecal *decal) : DDecalThinker (decal) {} + void Construct(DBaseDecal *decal) + { + Super::Construct(decal); + } void Serialize(FSerializer &arc); void Tick (); @@ -235,8 +242,6 @@ public: double StartX; double StartY; bool bStarted; -private: - DDecalSlider () {} }; struct FDecalCombinerAnim : public FDecalAnimator diff --git a/src/dobjtype.cpp b/src/dobjtype.cpp index 2e7a006b1..96a135a03 100644 --- a/src/dobjtype.cpp +++ b/src/dobjtype.cpp @@ -562,12 +562,7 @@ void PClass::InitializeDefaults() assert(Defaults == nullptr); Defaults = (uint8_t *)M_Malloc(Size); - // run the constructor on the defaults to set the vtbl pointer which is needed to run class-aware functions on them. - // Temporarily setting bSerialOverride prevents linking into the thinker chains. - auto s = DThinker::bSerialOverride; - DThinker::bSerialOverride = true; ConstructNative(Defaults); - DThinker::bSerialOverride = s; // We must unlink the defaults from the class list because it's just a static block of data to the engine. DObject *optr = (DObject*)Defaults; GC::Root = optr->ObjNext; diff --git a/src/dsectoreffect.cpp b/src/dsectoreffect.cpp index 755253148..adc9c5f0a 100644 --- a/src/dsectoreffect.cpp +++ b/src/dsectoreffect.cpp @@ -56,7 +56,7 @@ void DSectorEffect::OnDestroy() Super::OnDestroy(); } -DSectorEffect::DSectorEffect (sector_t *sector) +void DSectorEffect::Construct(sector_t *sector) { m_Sector = sector; } @@ -81,9 +81,9 @@ IMPLEMENT_POINTERS_START(DMover) IMPLEMENT_POINTER(interpolation) IMPLEMENT_POINTERS_END -DMover::DMover (sector_t *sector) - : DSectorEffect (sector) +void DMover::Construct (sector_t *sector) { + Super::Construct(sector); interpolation = nullptr; } @@ -111,9 +111,9 @@ void DMover::StopInterpolation(bool force) IMPLEMENT_CLASS(DMovingFloor, true, false) -DMovingFloor::DMovingFloor (sector_t *sector) - : DMover (sector) +void DMovingFloor::Construct(sector_t *sector) { + Super::Construct(sector); sector->floordata = this; interpolation = sector->SetInterpolation(sector_t::FloorMove, true); } @@ -121,9 +121,9 @@ DMovingFloor::DMovingFloor (sector_t *sector) IMPLEMENT_CLASS(DMovingCeiling, true, false) -DMovingCeiling::DMovingCeiling (sector_t *sector, bool interpolate) - : DMover (sector) +void DMovingCeiling::Construct(sector_t *sector, bool interpolate) { + Super::Construct(sector); sector->ceilingdata = this; if (interpolate) interpolation = sector->SetInterpolation(sector_t::CeilingMove, true); } diff --git a/src/dsectoreffect.h b/src/dsectoreffect.h index a3ccc718c..cbaff9efc 100644 --- a/src/dsectoreffect.h +++ b/src/dsectoreffect.h @@ -9,7 +9,7 @@ class DSectorEffect : public DThinker DECLARE_CLASS (DSectorEffect, DThinker) public: static const int DEFAULT_STAT = STAT_SECTOREFFECT; - DSectorEffect (sector_t *sector); + void Construct(sector_t *sector); void Serialize(FSerializer &arc); @@ -18,10 +18,6 @@ public: sector_t *GetSector() const { return m_Sector; } sector_t *m_Sector; - -protected: - DSectorEffect() = default; - }; class DMover : public DSectorEffect @@ -29,15 +25,14 @@ class DMover : public DSectorEffect DECLARE_ABSTRACT_CLASS (DMover, DSectorEffect) HAS_OBJECT_POINTERS protected: - DMover (sector_t *sector); + void Construct(sector_t *sector); TObjPtr interpolation; public: void StopInterpolation(bool force = false); protected: - DMover () {} - + void Serialize(FSerializer &arc); void OnDestroy() override; }; @@ -46,16 +41,14 @@ class DMovingFloor : public DMover { DECLARE_ABSTRACT_CLASS (DMovingFloor, DMover) protected: - DMovingFloor (sector_t *sector); - DMovingFloor() {} + void Construct(sector_t *sector); }; class DMovingCeiling : public DMover { DECLARE_ABSTRACT_CLASS (DMovingCeiling, DMover) protected: - DMovingCeiling (sector_t *sector, bool interpolate = true); - DMovingCeiling () {} + void Construct(sector_t *sector, bool interpolate = true); }; #endif //__DSECTOREFFECT_H__ diff --git a/src/dthinker.cpp b/src/dthinker.cpp index dc7ffdd6b..959d9f3e9 100644 --- a/src/dthinker.cpp +++ b/src/dthinker.cpp @@ -56,7 +56,6 @@ DThinker *NextToThink; FThinkerList DThinker::Thinkers[MAX_STATNUM+2]; FThinkerList DThinker::FreshThinkers[MAX_STATNUM+1]; -bool DThinker::bSerialOverride = false; //========================================================================== // @@ -232,17 +231,6 @@ void DThinker::SerializeThinkers(FSerializer &arc, bool hubLoad) // //========================================================================== -DThinker::DThinker () throw() -{ - NextThinker = nullptr; - PrevThinker = nullptr; -} - -DThinker::DThinker(no_link_type foo) throw() -{ - foo; // Avoid unused argument warnings. -} - DThinker::~DThinker () { assert(NextThinker == nullptr && PrevThinker == nullptr); diff --git a/src/dthinker.h b/src/dthinker.h index 548eb6bd0..c90c8b536 100644 --- a/src/dthinker.h +++ b/src/dthinker.h @@ -67,7 +67,6 @@ class DThinker : public DObject DECLARE_CLASS (DThinker, DObject) public: static const int DEFAULT_STAT = STAT_DEFAULT; - DThinker () throw(); void OnDestroy () override; virtual ~DThinker (); virtual void Tick (); @@ -92,11 +91,6 @@ public: static void MarkRoots(); static DThinker *FirstThinker (int statnum); - static bool bSerialOverride; - - // only used internally but Create needs access. - enum no_link_type { NO_LINK }; - DThinker(no_link_type) throw(); private: static void DestroyThinkersInList (FThinkerList &list); static bool DoDestroyThinkersInList(FThinkerList &list); @@ -113,7 +107,7 @@ private: friend class DObject; friend class FSerializer; - DThinker *NextThinker, *PrevThinker; + DThinker *NextThinker = nullptr, *PrevThinker = nullptr; public: FLevelLocals *Level; diff --git a/src/fragglescript/t_func.cpp b/src/fragglescript/t_func.cpp index 99be0b2b7..90513d97d 100644 --- a/src/fragglescript/t_func.cpp +++ b/src/fragglescript/t_func.cpp @@ -1741,11 +1741,9 @@ class DLightLevel : public DLighting unsigned char destlevel; unsigned char speed; - DLightLevel() = default; - public: - DLightLevel(sector_t * s,int destlevel,int speed); + void Construct(sector_t * s,int destlevel,int speed); void Serialize(FSerializer &arc); void Tick (); void OnDestroy() { Super::OnDestroy(); m_Sector->lightingdata = nullptr; } @@ -1806,8 +1804,9 @@ void DLightLevel::Tick() //========================================================================== // //========================================================================== -DLightLevel::DLightLevel(sector_t * s,int _destlevel,int _speed) : DLighting(s) +void DLightLevel::Construct(sector_t * s,int _destlevel,int _speed) { + Super::Construct(s); destlevel=_destlevel; speed=_speed; s->lightingdata=this; diff --git a/src/fragglescript/t_script.cpp b/src/fragglescript/t_script.cpp index b8caaaff1..47f0a1bf3 100644 --- a/src/fragglescript/t_script.cpp +++ b/src/fragglescript/t_script.cpp @@ -361,7 +361,11 @@ IMPLEMENT_POINTERS_END //========================================================================== // +// This thinker is a little unusual from all the rest, because it +// needs to construct some non-serializable data. // +// This cannot be done in Construct, but requires an actual constructor, +// so that even a deserialized ionstance is fully set up. // //========================================================================== @@ -369,15 +373,6 @@ DFraggleThinker::DFraggleThinker() { GlobalScript = Create(); GC::WriteBarrier(this, GlobalScript); - // do not create resources which will be filled in by the serializer if being called from there. - if (!bSerialOverride) - { - RunningScripts = Create(); - GC::WriteBarrier(this, RunningScripts); - LevelScript = Create(); - LevelScript->parent = GlobalScript; - GC::WriteBarrier(this, LevelScript); - } InitFunctions(); } @@ -387,6 +382,21 @@ DFraggleThinker::DFraggleThinker() // //========================================================================== +void DFraggleThinker::Construct() +{ + RunningScripts = Create(); + GC::WriteBarrier(this, RunningScripts); + LevelScript = Create(); + LevelScript->parent = GlobalScript; + GC::WriteBarrier(this, LevelScript); +} + +//========================================================================== +// +// +// +//========================================================================== + void DFraggleThinker::OnDestroy() { DRunningScript *p = RunningScripts; diff --git a/src/fragglescript/t_script.h b/src/fragglescript/t_script.h index 7b21940bb..3887f736d 100644 --- a/src/fragglescript/t_script.h +++ b/src/fragglescript/t_script.h @@ -696,7 +696,8 @@ public: TObjPtr RunningScripts; TArray > SpawnedThings; - DFraggleThinker(); + DFraggleThinker(); // This class needs a real constructor because it has non-serializable content. + void Construct(); void OnDestroy() override; diff --git a/src/g_level.cpp b/src/g_level.cpp index 633096c54..727abc4d0 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -909,6 +909,7 @@ class DAutosaver : public DThinker { DECLARE_CLASS (DAutosaver, DThinker) public: + void Construct() {} void Tick (); }; diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 8844cdba9..e427b15bb 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -353,17 +353,6 @@ public: return true; } - template - T* CreateThinker(Args&&... args) - { - auto thinker = Create(std::forward(args)...); - auto statnum = T::DEFAULT_STAT; - thinker->ObjectFlags |= OF_JustSpawned; - DThinker::FreshThinkers[statnum].AddTail(thinker); - thinker->Level = this; - return thinker; - } - DThinker *CreateThinker(PClass *cls, int statnum = STAT_DEFAULT) { DThinker *thinker = static_cast(cls->CreateNew()); @@ -374,6 +363,14 @@ public: return thinker; } + template + T* CreateThinker(Args&&... args) + { + auto thinker = static_cast(CreateThinker(RUNTIME_CLASS(T), T::DEFAULT_STAT)); + thinker->Construct(std::forward(args)...); + return thinker; + } + uint8_t md5[16]; // for savegame validation. If the MD5 does not match the savegame won't be loaded. int time; // time in the hub diff --git a/src/g_shared/a_decals.cpp b/src/g_shared/a_decals.cpp index e644d8c00..a2283852c 100644 --- a/src/g_shared/a_decals.cpp +++ b/src/g_shared/a_decals.cpp @@ -67,26 +67,39 @@ IMPLEMENT_POINTERS_END IMPLEMENT_CLASS(DImpactDecal, false, false) -DBaseDecal::DBaseDecal (double z) -: WallNext(0), WallPrev(0), LeftDistance(0), Z(z), ScaleX(1.), ScaleY(1.), Alpha(1.), - AlphaColor(0), Translation(0), RenderFlags(0), Side(nullptr), Sector(nullptr) +void DBaseDecal::Construct(double z) { + Z = z; RenderStyle = STYLE_None; PicNum.SetInvalid(); } -DBaseDecal::DBaseDecal (const AActor *basis) -: WallNext(nullptr), WallPrev(nullptr), LeftDistance(0), Z(basis->Z()), ScaleX(basis->Scale.X), ScaleY(basis->Scale.Y), - Alpha(basis->Alpha), AlphaColor(basis->fillcolor), Translation(basis->Translation), PicNum(basis->picnum), - RenderFlags(basis->renderflags), RenderStyle(basis->RenderStyle), Side(nullptr), Sector(nullptr) +void DBaseDecal::Construct(const AActor *basis) { + Z = basis->Z(); + ScaleX = basis->Scale.X; + ScaleY = basis->Scale.Y; + Alpha = basis->Alpha; + AlphaColor = basis->fillcolor; + Translation = basis->Translation; + PicNum = basis->picnum; + RenderFlags = basis->renderflags; + RenderStyle = basis->RenderStyle; } -DBaseDecal::DBaseDecal (const DBaseDecal *basis) -: WallNext(nullptr), WallPrev(nullptr), LeftDistance(basis->LeftDistance), Z(basis->Z), ScaleX(basis->ScaleX), - ScaleY(basis->ScaleY), Alpha(basis->Alpha), AlphaColor(basis->AlphaColor), Translation(basis->Translation), - PicNum(basis->PicNum), RenderFlags(basis->RenderFlags), RenderStyle(basis->RenderStyle), Side(nullptr), Sector(nullptr) +void DBaseDecal::Construct(const DBaseDecal *basis) { + LeftDistance = basis->LeftDistance; + Z = basis->Z; + ScaleX = basis->ScaleX; + ScaleY = basis->ScaleY; + Alpha = basis->Alpha; + AlphaColor = basis->AlphaColor; + Translation = basis->Translation; + PicNum = basis->PicNum; + RenderFlags = basis->RenderFlags; + RenderStyle = basis->RenderStyle; + } void DBaseDecal::OnDestroy () diff --git a/src/g_shared/a_flashfader.cpp b/src/g_shared/a_flashfader.cpp index 5c20205f3..c93ef7ef4 100644 --- a/src/g_shared/a_flashfader.cpp +++ b/src/g_shared/a_flashfader.cpp @@ -43,11 +43,13 @@ IMPLEMENT_POINTERS_START(DFlashFader) IMPLEMENT_POINTER(ForWho) IMPLEMENT_POINTERS_END -DFlashFader::DFlashFader (float r1, float g1, float b1, float a1, +void DFlashFader::Construct (float r1, float g1, float b1, float a1, float r2, float g2, float b2, float a2, float time, AActor *who, bool terminate) - : TotalTics ((int)(time*TICRATE)), RemainingTics(TotalTics), ForWho (who) { + TotalTics = (int)(time*TICRATE); + RemainingTics = TotalTics; + ForWho = who; Blends[0][0]=r1; Blends[0][1]=g1; Blends[0][2]=b1; Blends[0][3]=a1; Blends[1][0]=r2; Blends[1][1]=g2; Blends[1][2]=b2; Blends[1][3]=a2; Terminate = terminate; diff --git a/src/g_shared/a_lightning.cpp b/src/g_shared/a_lightning.cpp index 0c599a798..27af34e6e 100644 --- a/src/g_shared/a_lightning.cpp +++ b/src/g_shared/a_lightning.cpp @@ -41,7 +41,7 @@ static FRandom pr_lightning ("Lightning"); IMPLEMENT_CLASS(DLightningThinker, false, false) -DLightningThinker::DLightningThinker () +void DLightningThinker::Construct() { Stopped = false; LightningFlashCount = 0; diff --git a/src/g_shared/a_lightning.h b/src/g_shared/a_lightning.h index 9375fb7ac..13ebd2468 100644 --- a/src/g_shared/a_lightning.h +++ b/src/g_shared/a_lightning.h @@ -12,7 +12,7 @@ class DLightningThinker : public DThinker DECLARE_CLASS (DLightningThinker, DThinker); public: static const int DEFAULT_STAT = STAT_LIGHTNING; - DLightningThinker (); + void Construct(); ~DLightningThinker (); void Serialize(FSerializer &arc); void Tick (); diff --git a/src/g_shared/a_quake.cpp b/src/g_shared/a_quake.cpp index d2467a925..098e6d893 100644 --- a/src/g_shared/a_quake.cpp +++ b/src/g_shared/a_quake.cpp @@ -47,7 +47,7 @@ IMPLEMENT_POINTERS_END // //========================================================================== -DEarthquake::DEarthquake(AActor *center, int intensityX, int intensityY, int intensityZ, int duration, +void DEarthquake::Construct(AActor *center, int intensityX, int intensityY, int intensityZ, int duration, int damrad, int tremrad, FSoundID quakesound, int flags, double waveSpeedX, double waveSpeedY, double waveSpeedZ, int falloff, int highpoint, double rollIntensity, double rollWave) diff --git a/src/g_shared/a_sharedglobal.h b/src/g_shared/a_sharedglobal.h index 01823a051..c97fd237c 100644 --- a/src/g_shared/a_sharedglobal.h +++ b/src/g_shared/a_sharedglobal.h @@ -20,9 +20,9 @@ class DBaseDecal : public DThinker HAS_OBJECT_POINTERS public: static const int DEFAULT_STAT = STAT_DECAL; - DBaseDecal(double z = 0); - DBaseDecal (const AActor *actor); - DBaseDecal (const DBaseDecal *basis); + void Construct(double z = 0); + void Construct(const AActor *actor); + void Construct(const DBaseDecal *basis); void Serialize(FSerializer &arc); void OnDestroy() override; @@ -33,19 +33,19 @@ public: void Spread (const FDecalTemplate *tpl, side_t *wall, double x, double y, double z, F3DFloor * ffloor); void GetXY (side_t *side, double &x, double &y) const; - DBaseDecal *WallNext, *WallPrev; + DBaseDecal *WallNext = nullptr, *WallPrev = nullptr; - double LeftDistance; + double LeftDistance = 0; double Z; - double ScaleX, ScaleY; - double Alpha; - uint32_t AlphaColor; - int Translation; + double ScaleX = 1, ScaleY = 1; + double Alpha = 1; + uint32_t AlphaColor = 0; + int Translation = 0; FTextureID PicNum; - uint32_t RenderFlags; + uint32_t RenderFlags = 0; FRenderStyle RenderStyle; - side_t *Side; - sector_t *Sector; + side_t *Side = nullptr; + sector_t *Sector = nullptr; protected: virtual DBaseDecal *CloneSelf(const FDecalTemplate *tpl, double x, double y, double z, side_t *wall, F3DFloor * ffloor) const; @@ -61,8 +61,11 @@ class DImpactDecal : public DBaseDecal DECLARE_CLASS (DImpactDecal, DBaseDecal) public: static const int DEFAULT_STAT = STAT_AUTODECAL; - DImpactDecal(double z = 0) : DBaseDecal(z) {} - DImpactDecal (side_t *wall, const FDecalTemplate *templ); + void Construct(double z = 0) + { + Super::Construct(z); + } + void Construct(side_t *wall, const FDecalTemplate *templ); static DImpactDecal *StaticCreate(FLevelLocals *Level, const char *name, const DVector3 &pos, side_t *wall, F3DFloor * ffloor, PalEntry color = 0); static DImpactDecal *StaticCreate(FLevelLocals *Level, const FDecalTemplate *tpl, const DVector3 &pos, side_t *wall, F3DFloor * ffloor, PalEntry color = 0); @@ -79,7 +82,7 @@ class DFlashFader : public DThinker DECLARE_CLASS (DFlashFader, DThinker) HAS_OBJECT_POINTERS public: - DFlashFader (float r1, float g1, float b1, float a1, + void Construct(float r1, float g1, float b1, float a1, float r2, float g2, float b2, float a2, float time, AActor *who, bool terminate = false); void OnDestroy() override; @@ -96,7 +99,6 @@ protected: TObjPtr ForWho; bool Terminate; void SetBlend (float time); - DFlashFader() = default; }; enum @@ -124,7 +126,7 @@ class DEarthquake : public DThinker HAS_OBJECT_POINTERS public: static const int DEFAULT_STAT = STAT_EARTHQUAKE; - DEarthquake(AActor *center, int intensityX, int intensityY, int intensityZ, int duration, + void Construct(AActor *center, int intensityX, int intensityY, int intensityZ, int duration, int damrad, int tremrad, FSoundID quakesfx, int flags, double waveSpeedX, double waveSpeedY, double waveSpeedZ, int falloff, int highpoint, double rollIntensity, double rollWave); @@ -147,9 +149,6 @@ public: double GetFalloff(double dist) const; static int StaticGetQuakeIntensities(double ticFrac, AActor *viewer, FQuakeJiggers &jiggers); - -private: - DEarthquake() = default; }; #endif //__A_SHAREDGLOBAL_H__ diff --git a/src/m_cheat.cpp b/src/m_cheat.cpp index 0de6758d0..3890e2ea8 100644 --- a/src/m_cheat.cpp +++ b/src/m_cheat.cpp @@ -597,6 +597,7 @@ class DSuicider : public DThinker public: TObjPtr Pawn; + void Construct() {} void Tick() { Pawn->flags |= MF_SHOOTABLE; diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 6047ac87c..2ebdfd0b4 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -1813,7 +1813,7 @@ class DPlaneWatcher : public DThinker DECLARE_CLASS (DPlaneWatcher, DThinker) HAS_OBJECT_POINTERS public: - DPlaneWatcher (AActor *it, line_t *line, int lineSide, bool ceiling, + void Construct(AActor *it, line_t *line, int lineSide, bool ceiling, sector_t *sec, int height, int special, int arg0, int arg1, int arg2, int arg3, int arg4); void Tick (); @@ -1837,13 +1837,17 @@ IMPLEMENT_POINTERS_START(DPlaneWatcher) IMPLEMENT_POINTER(Activator) IMPLEMENT_POINTERS_END -DPlaneWatcher::DPlaneWatcher (AActor *it, line_t *line, int lineSide, bool ceiling, +void DPlaneWatcher::Construct(AActor *it, line_t *line, int lineSide, bool ceiling, sector_t *sec, int height, int special, int arg0, int arg1, int arg2, int arg3, int arg4) - : Special (special), - Activator (it), Line (line), LineSide (!!lineSide), bCeiling (ceiling) { secplane_t plane; + Special = special; + Activator = it; + Line = line; + LineSide = !!lineSide; + bCeiling = ceiling; + Args[0] = arg0; Args[1] = arg1; Args[2] = arg2; @@ -3299,13 +3303,6 @@ IMPLEMENT_POINTERS_START(DACSThinker) IMPLEMENT_POINTER(Scripts) IMPLEMENT_POINTERS_END -DACSThinker::DACSThinker () -{ - Scripts = nullptr; - LastScript = nullptr; - RunningScripts.Clear(); -} - DACSThinker::~DACSThinker () { Scripts = nullptr; diff --git a/src/p_acs.h b/src/p_acs.h index c209ca16d..5f106fbb1 100644 --- a/src/p_acs.h +++ b/src/p_acs.h @@ -454,7 +454,7 @@ class DACSThinker : public DThinker HAS_OBJECT_POINTERS public: static const int DEFAULT_STAT = STAT_SCRIPTS; - DACSThinker(); + void Construct() {} ~DACSThinker(); void Serialize(FSerializer &arc); @@ -467,8 +467,8 @@ public: void StopScriptsFor(AActor *actor); private: - DLevelScript *LastScript; - DLevelScript *Scripts; // List of all running scripts + DLevelScript *LastScript = nullptr; + DLevelScript *Scripts = nullptr; // List of all running scripts friend class DLevelScript; friend class FBehavior; diff --git a/src/p_ceiling.cpp b/src/p_ceiling.cpp index 015fe5882..b9c168ed9 100644 --- a/src/p_ceiling.cpp +++ b/src/p_ceiling.cpp @@ -204,14 +204,14 @@ void DCeiling::Tick () // //============================================================================ -DCeiling::DCeiling (sector_t *sec) - : DMovingCeiling (sec) +void DCeiling::Construct(sector_t *sec) { + Super::Construct(sec); } -DCeiling::DCeiling (sector_t *sec, double speed1, double speed2, int silent) - : DMovingCeiling (sec) +void DCeiling::Construct(sector_t *sec, double speed1, double speed2, int silent) { + Super::Construct(sec); m_Crush = -1; m_CrushMode = ECrushMode::crushDoom; m_Speed = m_Speed1 = speed1; diff --git a/src/p_doors.cpp b/src/p_doors.cpp index e07e736a1..a0bc8af66 100644 --- a/src/p_doors.cpp +++ b/src/p_doors.cpp @@ -328,9 +328,9 @@ void DDoor::DoorSound(bool raise, DSeqNode *curseq) const } } -DDoor::DDoor (sector_t *sector) - : DMovingCeiling (sector) +void DDoor::Construct(sector_t *sector) { + Super::Construct(sector); } //============================================================================ @@ -339,13 +339,19 @@ DDoor::DDoor (sector_t *sector) // //============================================================================ -DDoor::DDoor (sector_t *sec, EVlDoor type, double speed, int delay, int lightTag, int topcountdown) - : DMovingCeiling (sec), - m_Type (type), m_Speed (speed), m_TopWait (delay), m_TopCountdown(topcountdown), m_LightTag (lightTag) +void DDoor::Construct(sector_t *sec, EVlDoor type, double speed, int delay, int lightTag, int topcountdown) { vertex_t *spot; double height; + Super::Construct(sec); + + m_Type = type; + m_Speed = speed; + m_TopWait = delay; + m_TopCountdown = topcountdown; + m_LightTag = lightTag; + if (i_compatflags & COMPATF_NODOORLIGHT) { m_LightTag = 0; @@ -510,9 +516,9 @@ bool FLevelLocals::EV_DoDoor (DDoor::EVlDoor type, line_t *line, AActor *thing, IMPLEMENT_CLASS(DAnimatedDoor, false, false) -DAnimatedDoor::DAnimatedDoor (sector_t *sec) - : DMovingCeiling (sec, false) +void DAnimatedDoor::Construct(sector_t *sec) { + Super::Construct(sec, false); } void DAnimatedDoor::Serialize(FSerializer &arc) @@ -675,12 +681,13 @@ void DAnimatedDoor::Tick () // //============================================================================ -DAnimatedDoor::DAnimatedDoor (sector_t *sec, line_t *line, int speed, int delay, FDoorAnimation *anim, DAnimatedDoor::EADType type) - : DMovingCeiling (sec, false) +void DAnimatedDoor::Construct(sector_t *sec, line_t *line, int speed, int delay, FDoorAnimation *anim, DAnimatedDoor::EADType type) { double topdist; FTextureID picnum; + Super::Construct(sec, false); + m_DoorAnim = anim; m_Line1 = line; diff --git a/src/p_floor.cpp b/src/p_floor.cpp index 825282263..45357bf8c 100644 --- a/src/p_floor.cpp +++ b/src/p_floor.cpp @@ -255,9 +255,9 @@ void DFloor::StartFloorSound () // //========================================================================== -DFloor::DFloor (sector_t *sec) - : DMovingFloor (sec) +void DFloor::Construct(sector_t *sec) { + Super::Construct(sec); } //========================================================================== @@ -858,9 +858,9 @@ IMPLEMENT_POINTERS_START(DElevator) IMPLEMENT_POINTER(m_Interp_Ceiling) IMPLEMENT_POINTERS_END -DElevator::DElevator (sector_t *sec) - : Super (sec) +void DElevator::Construct(sector_t *sec) { + Super::Construct(sec); sec->floordata = this; sec->ceilingdata = this; m_Interp_Floor = sec->SetInterpolation(sector_t::FloorMove, true); @@ -1164,9 +1164,9 @@ void DWaggleBase::Serialize(FSerializer &arc) #define WGLSTATE_STABLE 2 #define WGLSTATE_REDUCE 3 -DWaggleBase::DWaggleBase (sector_t *sec) - : Super (sec) +void DWaggleBase::Construct(sector_t *sec) { + Super::Construct(sec); } //========================================================================== @@ -1252,9 +1252,9 @@ void DWaggleBase::DoWaggle (bool ceiling) // //========================================================================== -DFloorWaggle::DFloorWaggle (sector_t *sec) - : Super (sec) +void DFloorWaggle::Construct(sector_t *sec) { + Super::Construct(sec); sec->floordata = this; interpolation = sec->SetInterpolation(sector_t::FloorMove, true); } @@ -1270,9 +1270,9 @@ void DFloorWaggle::Tick () // //========================================================================== -DCeilingWaggle::DCeilingWaggle (sector_t *sec) - : Super (sec) +void DCeilingWaggle::Construct(sector_t *sec) { + Super::Construct(sec); sec->ceilingdata = this; interpolation = sec->SetInterpolation(sector_t::CeilingMove, true); } diff --git a/src/p_lights.cpp b/src/p_lights.cpp index 96ef415c1..d5fb201cd 100644 --- a/src/p_lights.cpp +++ b/src/p_lights.cpp @@ -57,11 +57,6 @@ static FRandom pr_fireflicker ("FireFlicker"); IMPLEMENT_CLASS(DLighting, false, false) -DLighting::DLighting (sector_t *sector) - : DSectorEffect (sector) -{ -} - //----------------------------------------------------------------------------- // // FIRELIGHT FLICKER @@ -109,17 +104,17 @@ void DFireFlicker::Tick () // //----------------------------------------------------------------------------- -DFireFlicker::DFireFlicker (sector_t *sector) - : DLighting (sector) +void DFireFlicker::Construct(sector_t *sector) { + Super::Construct(sector); m_MaxLight = sector->lightlevel; m_MinLight = sector_t::ClampLight(FindMinSurroundingLight(sector, sector->lightlevel) + 16); m_Count = 4; } -DFireFlicker::DFireFlicker (sector_t *sector, int upper, int lower) - : DLighting (sector) +void DFireFlicker::Construct(sector_t *sector, int upper, int lower) { + Super::Construct(sector); m_MaxLight = sector_t::ClampLight(upper); m_MinLight = sector_t::ClampLight(lower); m_Count = 4; @@ -171,9 +166,9 @@ void DFlicker::Tick () // //----------------------------------------------------------------------------- -DFlicker::DFlicker (sector_t *sector, int upper, int lower) - : DLighting (sector) +void DFlicker::Construct(sector_t *sector, int upper, int lower) { + Super::Construct(sector); m_MaxLight = sector_t::ClampLight(upper); m_MinLight = sector_t::ClampLight(lower); sector->lightlevel = m_MaxLight; @@ -228,9 +223,9 @@ void DLightFlash::Tick () // //----------------------------------------------------------------------------- -DLightFlash::DLightFlash (sector_t *sector) - : DLighting (sector) +void DLightFlash::Construct(sector_t *sector) { + Super::Construct(sector); // Find light levels like Doom. m_MaxLight = sector->lightlevel; m_MinLight = FindMinSurroundingLight (sector, sector->lightlevel); @@ -239,9 +234,9 @@ DLightFlash::DLightFlash (sector_t *sector) m_Count = (pr_lightflash() & m_MaxTime) + 1; } -DLightFlash::DLightFlash (sector_t *sector, int min, int max) - : DLighting (sector) +void DLightFlash::Construct (sector_t *sector, int min, int max) { + Super::Construct(sector); // Use specified light levels. m_MaxLight = sector_t::ClampLight(max); m_MinLight = sector_t::ClampLight(min); @@ -298,9 +293,9 @@ void DStrobe::Tick () // //----------------------------------------------------------------------------- -DStrobe::DStrobe (sector_t *sector, int upper, int lower, int utics, int ltics) - : DLighting (sector) +void DStrobe::Construct(sector_t *sector, int upper, int lower, int utics, int ltics) { + Super::Construct(sector); m_DarkTime = ltics; m_BrightTime = utics; m_MaxLight = sector_t::ClampLight(upper); @@ -314,9 +309,9 @@ DStrobe::DStrobe (sector_t *sector, int upper, int lower, int utics, int ltics) // //----------------------------------------------------------------------------- -DStrobe::DStrobe (sector_t *sector, int utics, int ltics, bool inSync) - : DLighting (sector) +void DStrobe::Construct(sector_t *sector, int utics, int ltics, bool inSync) { + Super::Construct(sector); m_DarkTime = ltics; m_BrightTime = utics; @@ -390,9 +385,9 @@ void DGlow::Tick () // //----------------------------------------------------------------------------- -DGlow::DGlow (sector_t *sector) - : DLighting (sector) +void DGlow::Construct(sector_t *sector) { + Super::Construct(sector); m_MinLight = FindMinSurroundingLight (sector, sector->lightlevel); m_MaxLight = sector->lightlevel; m_Direction = -1; @@ -450,9 +445,9 @@ void DGlow2::Tick () // //----------------------------------------------------------------------------- -DGlow2::DGlow2 (sector_t *sector, int start, int end, int tics, bool oneshot) - : DLighting (sector) +void DGlow2::Construct(sector_t *sector, int start, int end, int tics, bool oneshot) { + Super::Construct(sector); m_Start = sector_t::ClampLight(start); m_End = sector_t::ClampLight(end); m_MaxTics = tics; @@ -550,9 +545,9 @@ void DPhased::Propagate() PhaseHelper (m_Sector, 0, 0, nullptr); } -DPhased::DPhased (sector_t *sector, int baselevel, int phase) - : DLighting (sector) +void DPhased::Construct (sector_t *sector, int baselevel, int phase) { + Super::Construct(sector); m_BaseLevel = baselevel; m_Phase = phase; } diff --git a/src/p_pillar.cpp b/src/p_pillar.cpp index ae29629f8..ee9bb6e50 100644 --- a/src/p_pillar.cpp +++ b/src/p_pillar.cpp @@ -114,10 +114,9 @@ void DPillar::Tick () } } -DPillar::DPillar (sector_t *sector, EPillar type, double speed, - double floordist, double ceilingdist, int crush, bool hexencrush) - : DMover (sector) +void DPillar::Construct(sector_t *sector, EPillar type, double speed, double floordist, double ceilingdist, int crush, bool hexencrush) { + Super::Construct(sector); double newheight; vertex_t *spot; diff --git a/src/p_plats.cpp b/src/p_plats.cpp index 993c5cbcb..2b1e3e253 100644 --- a/src/p_plats.cpp +++ b/src/p_plats.cpp @@ -215,9 +215,9 @@ void DPlat::Stop() m_Status = in_stasis; } -DPlat::DPlat (sector_t *sector) - : DMovingFloor (sector) +void DPlat::Construct (sector_t *sector) { + Super::Construct(sector); } // diff --git a/src/p_pusher.cpp b/src/p_pusher.cpp index 7b38aab3f..0859429e4 100644 --- a/src/p_pusher.cpp +++ b/src/p_pusher.cpp @@ -110,7 +110,7 @@ void DPusher::Serialize(FSerializer &arc) // // Add a push thinker to the thinker list -DPusher::DPusher (DPusher::EPusher type, line_t *l, int magnitude, int angle, +void DPusher::Construct (DPusher::EPusher type, line_t *l, int magnitude, int angle, AActor *source, int affectee) { m_Source = source; diff --git a/src/p_scroll.cpp b/src/p_scroll.cpp index 0923d8d60..b48160ab5 100644 --- a/src/p_scroll.cpp +++ b/src/p_scroll.cpp @@ -246,7 +246,7 @@ void DScroller::Tick () // //----------------------------------------------------------------------------- -DScroller::DScroller (EScroll type, double dx, double dy, sector_t *ctrl, sector_t *sec, side_t *side, int accel, EScrollPos scrollpos) +void DScroller::Construct (EScroll type, double dx, double dy, sector_t *ctrl, sector_t *sec, side_t *side, int accel, EScrollPos scrollpos) { m_Type = type; m_dx = dx; @@ -327,7 +327,7 @@ void DScroller::OnDestroy () // //----------------------------------------------------------------------------- -DScroller::DScroller (double dx, double dy, const line_t *l, sector_t * control, int accel, EScrollPos scrollpos) +void DScroller::Construct(double dx, double dy, const line_t *l, sector_t * control, int accel, EScrollPos scrollpos) { double x = fabs(l->Delta().X), y = fabs(l->Delta().Y), d; if (y > x) d = x, x = y, y = d; diff --git a/src/p_spec.cpp b/src/p_spec.cpp index 71f1093fe..0c81a2de0 100644 --- a/src/p_spec.cpp +++ b/src/p_spec.cpp @@ -696,7 +696,7 @@ void DLightTransfer::Serialize(FSerializer &arc) ("copyfloor", CopyFloor); } -DLightTransfer::DLightTransfer (sector_t *srcSec, int target, bool copyFloor) +void DLightTransfer::Construct(sector_t *srcSec, int target, bool copyFloor) { int secnum; @@ -762,7 +762,7 @@ void DWallLightTransfer::Serialize(FSerializer &arc) ("flags", Flags); } -DWallLightTransfer::DWallLightTransfer (sector_t *srcSec, int target, uint8_t flags) +void DWallLightTransfer::Construct(sector_t *srcSec, int target, uint8_t flags) { int linenum; int wallflags; diff --git a/src/p_spec.h b/src/p_spec.h index de9e291f5..23414c33f 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -126,9 +126,6 @@ class DLighting : public DSectorEffect DECLARE_CLASS(DLighting, DSectorEffect) public: static const int DEFAULT_STAT = STAT_LIGHT; - DLighting(sector_t *sector); -protected: - DLighting() = default; }; // @@ -176,7 +173,7 @@ public: void Tick (); bool IsLift() const { return m_Type == platDownWaitUpStay || m_Type == platDownWaitUpStayStone; } - DPlat(sector_t *sector); + void Construct(sector_t *sector); protected: @@ -195,9 +192,6 @@ protected: void Reactivate (); void Stop (); -private: - DPlat() = default; - friend struct FLevelLocals; }; @@ -218,8 +212,7 @@ public: }; - DPillar (sector_t *sector, EPillar type, double speed, double height, - double height2, int crush, bool hexencrush); + void Construct (sector_t *sector, EPillar type, double speed, double height, double height2, int crush, bool hexencrush); void Serialize(FSerializer &arc); void Tick (); @@ -235,9 +228,6 @@ protected: bool m_Hexencrush; TObjPtr m_Interp_Ceiling; TObjPtr m_Interp_Floor; - -private: - DPillar() = default; }; @@ -258,8 +248,8 @@ public: doorWaitClose, }; - DDoor (sector_t *sector); - DDoor (sector_t *sec, EVlDoor type, double speed, int delay, int lightTag, int topcountdown); + void Construct(sector_t *sector); + void Construct(sector_t *sec, EVlDoor type, double speed, int delay, int lightTag, int topcountdown); void Serialize(FSerializer &arc); void Tick (); @@ -285,8 +275,6 @@ protected: private: friend struct FLevelLocals; - DDoor() = default; - }; class DAnimatedDoor : public DMovingCeiling @@ -300,8 +288,8 @@ public: adClose }; - DAnimatedDoor (sector_t *sector); - DAnimatedDoor (sector_t *sec, line_t *line, int speed, int delay, FDoorAnimation *anim, EADType type); + void Construct(sector_t *sector); + void Construct(sector_t *sec, line_t *line, int speed, int delay, FDoorAnimation *anim, EADType type); void Serialize(FSerializer &arc); void Tick (); @@ -327,8 +315,6 @@ protected: bool m_SetBlocking1, m_SetBlocking2; friend struct FLevelLocals; -private: - DAnimatedDoor() = default; }; // @@ -379,8 +365,8 @@ public: }; - DCeiling (sector_t *sec); - DCeiling (sector_t *sec, double speed1, double speed2, int silent); + void Construct(sector_t *sec); + void Construct(sector_t *sec, double speed1, double speed2, int silent); void Serialize(FSerializer &arc); void Tick (); @@ -407,10 +393,7 @@ protected: void PlayCeilingSound (); -private: - DCeiling() = default; friend struct FLevelLocals; - }; // @@ -474,7 +457,7 @@ public: stairCrush = 4, }; - DFloor (sector_t *sec); + void Construct(sector_t *sec); void Serialize(FSerializer &arc); void Tick (); @@ -501,9 +484,6 @@ public: void StartFloorSound (); void SetFloorChangeType (sector_t *sec, int change); friend struct FLevelLocals; - -private: - DFloor() = default; }; class DElevator : public DMover @@ -521,7 +501,7 @@ public: elevateLower }; - DElevator (sector_t *sec); + void Construct(sector_t *sec); void OnDestroy() override; void Serialize(FSerializer &arc); @@ -538,8 +518,6 @@ protected: void StartFloorSound (); friend struct FLevelLocals; -private: - DElevator() = default; }; @@ -548,7 +526,7 @@ class DWaggleBase : public DMover DECLARE_CLASS (DWaggleBase, DMover) HAS_OBJECT_POINTERS public: - DWaggleBase (sector_t *sec); + void Construct(sector_t *sec); void Serialize(FSerializer &arc); @@ -564,27 +542,22 @@ protected: friend struct FLevelLocals; void DoWaggle (bool ceiling); - DWaggleBase() = default; }; class DFloorWaggle : public DWaggleBase { DECLARE_CLASS (DFloorWaggle, DWaggleBase) public: - DFloorWaggle (sector_t *sec); + void Construct(sector_t *sec); void Tick (); -private: - DFloorWaggle() = default; }; class DCeilingWaggle : public DWaggleBase { DECLARE_CLASS (DCeilingWaggle, DWaggleBase) public: - DCeilingWaggle (sector_t *sec); + void Construct(sector_t *sec); void Tick (); -private: - DCeilingWaggle() = default; }; //jff 3/15/98 pure texture/type change for better generalized support diff --git a/src/p_spec_thinkers.h b/src/p_spec_thinkers.h index 3647a1314..dfa4038ea 100644 --- a/src/p_spec_thinkers.h +++ b/src/p_spec_thinkers.h @@ -7,10 +7,9 @@ class DLightTransfer : public DThinker { DECLARE_CLASS (DLightTransfer, DThinker) - DLightTransfer() = default; public: static const int DEFAULT_STAT = STAT_LIGHTTRANSFER; - DLightTransfer (sector_t *srcSec, int target, bool copyFloor); + void Construct(sector_t *srcSec, int target, bool copyFloor); void Serialize(FSerializer &arc); void Tick (); @@ -33,10 +32,9 @@ class DWallLightTransfer : public DThinker }; DECLARE_CLASS (DWallLightTransfer, DThinker) - DWallLightTransfer() = default; public: static const int DEFAULT_STAT = STAT_LIGHTTRANSFER; - DWallLightTransfer (sector_t *srcSec, int target, uint8_t flags); + void Construct(sector_t *srcSec, int target, uint8_t flags); void Serialize(FSerializer &arc); void Tick (); @@ -54,39 +52,35 @@ class DFireFlicker : public DLighting { DECLARE_CLASS(DFireFlicker, DLighting) public: - DFireFlicker(sector_t *sector); - DFireFlicker(sector_t *sector, int upper, int lower); + void Construct(sector_t *sector); + void Construct(sector_t *sector, int upper, int lower); void Serialize(FSerializer &arc); void Tick(); protected: int m_Count; int m_MaxLight; int m_MinLight; -private: - DFireFlicker() = default; }; class DFlicker : public DLighting { DECLARE_CLASS(DFlicker, DLighting) public: - DFlicker(sector_t *sector, int upper, int lower); + void Construct(sector_t *sector, int upper, int lower); void Serialize(FSerializer &arc); void Tick(); protected: int m_Count; int m_MaxLight; int m_MinLight; -private: - DFlicker() = default; }; class DLightFlash : public DLighting { DECLARE_CLASS(DLightFlash, DLighting) public: - DLightFlash(sector_t *sector); - DLightFlash(sector_t *sector, int min, int max); + void Construct(sector_t *sector); + void Construct(sector_t *sector, int min, int max); void Serialize(FSerializer &arc); void Tick(); protected: @@ -95,16 +89,14 @@ protected: int m_MinLight; int m_MaxTime; int m_MinTime; -private: - DLightFlash() = default; }; class DStrobe : public DLighting { DECLARE_CLASS(DStrobe, DLighting) public: - DStrobe(sector_t *sector, int utics, int ltics, bool inSync); - DStrobe(sector_t *sector, int upper, int lower, int utics, int ltics); + void Construct(sector_t *sector, int utics, int ltics, bool inSync); + void Construct(sector_t *sector, int upper, int lower, int utics, int ltics); void Serialize(FSerializer &arc); void Tick(); protected: @@ -113,23 +105,19 @@ protected: int m_MaxLight; int m_DarkTime; int m_BrightTime; -private: - DStrobe() = default; }; class DGlow : public DLighting { DECLARE_CLASS(DGlow, DLighting) public: - DGlow(sector_t *sector); + void Construct(sector_t *sector); void Serialize(FSerializer &arc); void Tick(); protected: int m_MinLight; int m_MaxLight; int m_Direction; -private: - DGlow() = default; }; // [RH] Glow from Light_Glow and Light_Fade specials @@ -137,7 +125,7 @@ class DGlow2 : public DLighting { DECLARE_CLASS(DGlow2, DLighting) public: - DGlow2(sector_t *sector, int start, int end, int tics, bool oneshot); + void Construct(sector_t *sector, int start, int end, int tics, bool oneshot); void Serialize(FSerializer &arc); void Tick(); protected: @@ -146,8 +134,6 @@ protected: int m_MaxTics; int m_Tics; bool m_OneShot; -private: - DGlow2() = default; }; // [RH] Phased light thinker @@ -155,9 +141,9 @@ class DPhased : public DLighting { DECLARE_CLASS(DPhased, DLighting) public: - DPhased(sector_t *sector, int baselevel = 0, int phase = 0); + void Construct(sector_t *sector, int baselevel = 0, int phase = 0); // These are for internal use only but the Create template needs access to them. - DPhased() = default; + void Construct(); void Propagate(); void Serialize(FSerializer &arc); @@ -184,8 +170,7 @@ public: p_current }; - DPusher () = default; - DPusher (EPusher type, line_t *l, int magnitude, int angle, AActor *source, int affectee); + void Construct(EPusher type, line_t *l, int magnitude, int angle, AActor *source, int affectee); void Serialize(FSerializer &arc); int CheckForSectorMatch (EPusher type, int tag); void ChangeValues (int magnitude, int angle) @@ -221,8 +206,8 @@ class DScroller : public DThinker public: static const int DEFAULT_STAT = STAT_SCROLLER; - DScroller(EScroll type, double dx, double dy, sector_t *control, sector_t *sec, side_t *side, int accel, EScrollPos scrollpos = EScrollPos::scw_all); - DScroller (double dx, double dy, const line_t *l, sector_t *control, int accel, EScrollPos scrollpos = EScrollPos::scw_all); + void Construct(EScroll type, double dx, double dy, sector_t *control, sector_t *sec, side_t *side, int accel, EScrollPos scrollpos = EScrollPos::scw_all); + void Construct(double dx, double dy, const line_t *l, sector_t *control, int accel, EScrollPos scrollpos = EScrollPos::scw_all); void OnDestroy() override; void Serialize(FSerializer &arc); @@ -246,8 +231,5 @@ protected: int m_Accel; // Whether it's accelerative EScrollPos m_Parts; // Which parts of a sidedef are being scrolled? TObjPtr m_Interpolations[3]; - -private: - DScroller () = default; }; diff --git a/src/p_switch.cpp b/src/p_switch.cpp index 3911c141d..ac58e8cc0 100644 --- a/src/p_switch.cpp +++ b/src/p_switch.cpp @@ -56,8 +56,7 @@ class DActiveButton : public DThinker { DECLARE_CLASS (DActiveButton, DThinker) public: - DActiveButton (); - DActiveButton (side_t *, int, FSwitchDef *, const DVector2 &pos, bool flippable); + void Construct(side_t *, int, FSwitchDef *, const DVector2 &pos, bool flippable); void Serialize(FSerializer &arc); void Tick (); @@ -320,20 +319,7 @@ bool P_ChangeSwitchTexture (side_t *side, int useAgain, uint8_t special, bool *q IMPLEMENT_CLASS(DActiveButton, false, false) -DActiveButton::DActiveButton () -{ - m_Side = NULL; - m_Part = -1; - m_SwitchDef = 0; - m_Timer = 0; - m_Pos = { 0,0 }; - bFlippable = false; - bReturning = false; - m_Frame = 0; -} - -DActiveButton::DActiveButton (side_t *side, int Where, FSwitchDef *Switch, - const DVector2 &pos, bool useagain) +void DActiveButton::Construct (side_t *side, int Where, FSwitchDef *Switch, const DVector2 &pos, bool useagain) { m_Side = side; m_Part = int8_t(Where); diff --git a/src/po_man.cpp b/src/po_man.cpp index 44e451dc5..b5d90f364 100644 --- a/src/po_man.cpp +++ b/src/po_man.cpp @@ -46,10 +46,8 @@ class DRotatePoly : public DPolyAction { DECLARE_CLASS (DRotatePoly, DPolyAction) public: - DRotatePoly (FPolyObj *polyNum); + void Construct(FPolyObj *polyNum); void Tick (); -private: - DRotatePoly (); friend bool EV_RotatePoly (FLevelLocals *Level, line_t *line, int polyNum, int speed, int byteAngle, int direction, bool overRide); }; @@ -59,11 +57,10 @@ class DMovePoly : public DPolyAction { DECLARE_CLASS (DMovePoly, DPolyAction) public: - DMovePoly (FPolyObj *polyNum); + void Construct(FPolyObj *polyNum); void Serialize(FSerializer &arc); void Tick (); protected: - DMovePoly (); DAngle m_Angle; DVector2 m_Speedv; @@ -74,11 +71,10 @@ class DMovePolyTo : public DPolyAction { DECLARE_CLASS(DMovePolyTo, DPolyAction) public: - DMovePolyTo(FPolyObj *polyNum); + void Construct(FPolyObj *polyNum); void Serialize(FSerializer &arc); void Tick(); protected: - DMovePolyTo(); DVector2 m_Speedv; DVector2 m_Target; @@ -90,7 +86,7 @@ class DPolyDoor : public DMovePoly { DECLARE_CLASS (DPolyDoor, DMovePoly) public: - DPolyDoor (FPolyObj *polyNum, podoortype_t type); + void Construct(FPolyObj *polyNum, podoortype_t type); void Serialize(FSerializer &arc); void Tick (); protected: @@ -102,8 +98,6 @@ protected: bool m_Close; friend bool EV_OpenPolyDoor(FLevelLocals *Level, line_t *line, int polyNum, double speed, DAngle angle, int delay, double distance, podoortype_t type); -private: - DPolyDoor (); }; class FPolyMirrorIterator @@ -152,10 +146,6 @@ IMPLEMENT_POINTERS_START(DPolyAction) IMPLEMENT_POINTER(m_Interpolation) IMPLEMENT_POINTERS_END -DPolyAction::DPolyAction () -{ -} - void DPolyAction::Serialize(FSerializer &arc) { Super::Serialize (arc); @@ -165,7 +155,7 @@ void DPolyAction::Serialize(FSerializer &arc) ("interpolation", m_Interpolation); } -DPolyAction::DPolyAction (FPolyObj *polyNum) +void DPolyAction::Construct(FPolyObj *polyNum) { m_PolyObj = polyNum; m_Speed = 0; @@ -212,13 +202,9 @@ void DPolyAction::StopInterpolation () IMPLEMENT_CLASS(DRotatePoly, false, false) -DRotatePoly::DRotatePoly () -{ -} - -DRotatePoly::DRotatePoly (FPolyObj *polyNum) - : Super (polyNum) +void DRotatePoly::Construct(FPolyObj *polyNum) { + Super::Construct(polyNum); } //========================================================================== @@ -229,10 +215,6 @@ DRotatePoly::DRotatePoly (FPolyObj *polyNum) IMPLEMENT_CLASS(DMovePoly, false, false) -DMovePoly::DMovePoly () -{ -} - void DMovePoly::Serialize(FSerializer &arc) { Super::Serialize (arc); @@ -240,9 +222,9 @@ void DMovePoly::Serialize(FSerializer &arc) ("speedv", m_Speedv); } -DMovePoly::DMovePoly (FPolyObj *polyNum) - : Super (polyNum) +void DMovePoly::Construct(FPolyObj *polyNum) { + Super::Construct(polyNum); m_Angle = 0.; m_Speedv = { 0,0 }; } @@ -256,10 +238,6 @@ DMovePoly::DMovePoly (FPolyObj *polyNum) IMPLEMENT_CLASS(DMovePolyTo, false, false) -DMovePolyTo::DMovePolyTo() -{ -} - void DMovePolyTo::Serialize(FSerializer &arc) { Super::Serialize(arc); @@ -267,9 +245,9 @@ void DMovePolyTo::Serialize(FSerializer &arc) ("target", m_Target); } -DMovePolyTo::DMovePolyTo(FPolyObj *polyNum) - : Super(polyNum) +void DMovePolyTo::Construct(FPolyObj *polyNum) { + Super::Construct(polyNum); m_Speedv = m_Target = { 0,0 }; } @@ -281,10 +259,6 @@ DMovePolyTo::DMovePolyTo(FPolyObj *polyNum) IMPLEMENT_CLASS(DPolyDoor, false, false) -DPolyDoor::DPolyDoor () -{ -} - void DPolyDoor::Serialize(FSerializer &arc) { Super::Serialize (arc); @@ -296,9 +270,10 @@ void DPolyDoor::Serialize(FSerializer &arc) ("close", m_Close); } -DPolyDoor::DPolyDoor (FPolyObj * polyNum, podoortype_t type) - : Super (polyNum), m_Type (type) +void DPolyDoor::Construct (FPolyObj * polyNum, podoortype_t type) { + Super::Construct(polyNum); + m_Type = type; m_Direction = 0.; m_TotalDist = 0; m_Tics = 0; diff --git a/src/po_man.h b/src/po_man.h index e9d23ebe8..70f437443 100644 --- a/src/po_man.h +++ b/src/po_man.h @@ -13,7 +13,7 @@ class DPolyAction : public DThinker DECLARE_CLASS(DPolyAction, DThinker) HAS_OBJECT_POINTERS public: - DPolyAction(FPolyObj *polyNum); + void Construct(FPolyObj *polyNum); void Serialize(FSerializer &arc); void OnDestroy() override; void Stop(); @@ -21,7 +21,6 @@ public: void StopInterpolation(); protected: - DPolyAction(); FPolyObj *m_PolyObj; double m_Speed; double m_Dist; diff --git a/src/serializer.cpp b/src/serializer.cpp index 94bb57f78..b88ae0ba5 100644 --- a/src/serializer.cpp +++ b/src/serializer.cpp @@ -987,7 +987,6 @@ void FSerializer::ReadObjects(bool hubtravel) // Do not link any thinker that's being created here. This will be done by deserializing the thinker list later. try { - DThinker::bSerialOverride = true; r->mDObjects.Resize(ArraySize()); for (auto &p : r->mDObjects) { @@ -1052,7 +1051,6 @@ void FSerializer::ReadObjects(bool hubtravel) } EndArray(); - DThinker::bSerialOverride = false; assert(!founderrors); if (founderrors) { @@ -1070,7 +1068,6 @@ void FSerializer::ReadObjects(bool hubtravel) r->mDObjects.Clear(); // make sure this flag gets unset, even if something in here throws an error. - DThinker::bSerialOverride = false; throw; } } From 84baa5bb4d29ac708aa2023f2c7f97d285fcb08b Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 27 Jan 2019 14:33:02 +0100 Subject: [PATCH 032/164] - deprecated the global 'level' variable. This will currently output 9 warnings for the UDMF property getters. To silence these a bit more work is needed. --- src/scripting/backend/codegen.cpp | 14 +++++++++++++- src/scripting/vmthunks_actors.cpp | 1 + wadsrc/static/zscript/base.txt | 4 +++- 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/scripting/backend/codegen.cpp b/src/scripting/backend/codegen.cpp index 4beb56d67..2a854d346 100644 --- a/src/scripting/backend/codegen.cpp +++ b/src/scripting/backend/codegen.cpp @@ -6132,9 +6132,21 @@ FxExpression *FxIdentifier::Resolve(FCompileContext& ctx) { if (sym->mVersion <= ctx.Version) { - ScriptPosition.Message(MSG_WARNING, "Accessing deprecated global variable %s - deprecated since %d.%d.%d", sym->SymbolName.GetChars(), vsym->mVersion.major, vsym->mVersion.minor, vsym->mVersion.revision); + if (!(ctx.Function->Variants[0].Flags & VARF_Deprecated) && Wads.GetLumpFile(ctx.Lump) == 0) + { + ScriptPosition.Message(MSG_WARNING, "Accessing deprecated global variable %s - deprecated since %d.%d.%d", sym->SymbolName.GetChars(), vsym->mVersion.major, vsym->mVersion.minor, vsym->mVersion.revision); + } + else + { + // Allow use of deprecated symbols in deprecated functions of the internal code. This is meant to allow deprecated code to remain as it was, + // even if it depends on some deprecated symbol. + // The main motivation here is to keep the deprecated static functions accessing the global level variable as they were. + // Print these only if debug output is active and at the highest verbosity level. + ScriptPosition.Message(MSG_DEBUGMSG, TEXTCOLOR_BLUE "Accessing deprecated global variable %s - deprecated since %d.%d.%d", sym->SymbolName.GetChars(), vsym->mVersion.major, vsym->mVersion.minor, vsym->mVersion.revision); + } } } + newex = new FxGlobalVariable(static_cast(sym), ScriptPosition); goto foundit; diff --git a/src/scripting/vmthunks_actors.cpp b/src/scripting/vmthunks_actors.cpp index 01fb90f84..d52e6e28e 100644 --- a/src/scripting/vmthunks_actors.cpp +++ b/src/scripting/vmthunks_actors.cpp @@ -1681,6 +1681,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(APlayerPawn, GetPrintableDisplayName, GetPrintable +DEFINE_FIELD(DThinker, Level) DEFINE_FIELD(AActor, snext) DEFINE_FIELD(AActor, player) DEFINE_FIELD_NAMED(AActor, __Pos, pos) diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index 775a38488..d449bfd34 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -7,7 +7,7 @@ struct _ native // These are the global variables, the struct is only here to av native readonly Array<@Team> Teams; native int validcount; native readonly bool multiplayer; - native play @LevelLocals level; + deprecated("3.8") native play @LevelLocals level; native @KeyBindings Bindings; native @KeyBindings AutomapBindings; native play @DehInfo deh; @@ -461,6 +461,8 @@ class Thinker : Object native play } const TICRATE = 35; + + native LevelLocals Level; virtual native void Tick(); virtual native void PostBeginPlay(); From 73ea59179c064c6c2f8a5f0d0d2f0306dede23e0 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 27 Jan 2019 14:48:35 +0100 Subject: [PATCH 033/164] - fixed some deprecation warnings about 'level'. --- wadsrc/static/zscript/shared/player.txt | 2 +- wadsrc/static/zscript/statscreen/statscreen.txt | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/wadsrc/static/zscript/shared/player.txt b/wadsrc/static/zscript/shared/player.txt index cdcfccf13..5b5ffe06f 100644 --- a/wadsrc/static/zscript/shared/player.txt +++ b/wadsrc/static/zscript/shared/player.txt @@ -2765,7 +2765,7 @@ struct PlayerInfo native play // self is what internally is known as player_t return gamestate == GS_TITLELEVEL || (cheats & CF_TOTALLYFROZEN) || - (level.frozen && timefreezer == 0); + (mo && mo.Level.frozen && timefreezer == 0); } void Uncrouch() diff --git a/wadsrc/static/zscript/statscreen/statscreen.txt b/wadsrc/static/zscript/statscreen/statscreen.txt index a8d8e25ed..552f2112b 100644 --- a/wadsrc/static/zscript/statscreen/statscreen.txt +++ b/wadsrc/static/zscript/statscreen/statscreen.txt @@ -407,7 +407,7 @@ class StatusScreen abstract play version("2.5") //Added by mc if (deathmatch) { - level.RemoveAllBots (consoleplayer != Net_Arbitrator); + currentUILevel.RemoveAllBots (consoleplayer != Net_Arbitrator); } } @@ -467,7 +467,7 @@ class StatusScreen abstract play version("2.5") if (cnt == 0) { End(); - level.WorldDone(); + currentUILevel.WorldDone(); } } @@ -483,7 +483,7 @@ class StatusScreen abstract play version("2.5") { // Last map in episode - there is no next location! End(); - level.WorldDone(); + currentUILevel.WorldDone(); return; } @@ -614,7 +614,7 @@ class StatusScreen abstract play version("2.5") virtual void StartMusic() { - level.SetInterMusic(wbs.next); + currentUILevel.SetInterMusic(wbs.next); } //==================================================================== @@ -712,7 +712,7 @@ class StatusScreen abstract play version("2.5") Par = TexMan.CheckForTexture("WIPAR", TexMan.Type_MiscPatch); // "par" // Use the local level structure which can be overridden by hubs - lnametexts[0] = level.LevelName; + lnametexts[0] = currentUILevel.LevelName; lnametexts[1] = wbstartstruct.nextname; bg = InterBackground.Create(wbs); From 2ed2202caa16af81fcd763a5898376e34d1a21c4 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 27 Jan 2019 14:49:51 +0100 Subject: [PATCH 034/164] - removed all remaining references to level and TThinkerIterator from p_enemy.cpp. --- src/d_net.cpp | 9 ++------- src/g_levellocals.h | 1 + src/m_cheat.cpp | 2 +- src/p_enemy.cpp | 38 +++++++++++++++++++------------------- src/p_lnspec.cpp | 4 ++-- 5 files changed, 25 insertions(+), 29 deletions(-) diff --git a/src/d_net.cpp b/src/d_net.cpp index f5ef8aef0..a5b144b86 100644 --- a/src/d_net.cpp +++ b/src/d_net.cpp @@ -2080,11 +2080,6 @@ uint8_t *FDynamicBuffer::GetData (int *len) } -static int KillAll(PClassActor *cls) -{ - return P_Massacre(false, cls); -} - static int RemoveClass(const PClass *cls) { AActor *actor; @@ -2564,11 +2559,11 @@ void Net_DoCommand (int type, uint8_t **stream, int player) if (cls != NULL) { - killcount = KillAll(cls); + killcount = currentUILevel->Massacre(false, cls->TypeName); PClassActor *cls_rep = cls->GetReplacement(); if (cls != cls_rep) { - killcount += KillAll(cls_rep); + killcount += currentUILevel->Massacre(false, cls_rep->TypeName); } Printf ("Killed %d monsters of type %s.\n",killcount, s); } diff --git a/src/g_levellocals.h b/src/g_levellocals.h index e427b15bb..e85877f78 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -203,6 +203,7 @@ public: bool CreateFloor(sector_t *sec, DFloor::EFloor floortype, line_t *line, double speed, double height, int crush, int change, bool hexencrush, bool hereticlower); void DoDeferedScripts(); void AdjustPusher(int tag, int magnitude, int angle, bool wind); + int Massacre(bool baddies = false, FName cls = NAME_None); bool EV_DoPlat(int tag, line_t *line, DPlat::EPlatType type, double height, double speed, int delay, int lip, int change); void EV_StopPlat(int tag, bool remove); diff --git a/src/m_cheat.cpp b/src/m_cheat.cpp index 3890e2ea8..3effff3ea 100644 --- a/src/m_cheat.cpp +++ b/src/m_cheat.cpp @@ -319,7 +319,7 @@ void cht_DoCheat (player_t *player, int cheat) case CHT_MASSACRE: case CHT_MASSACRE2: { - int killcount = P_Massacre (cheat == CHT_MASSACRE2); + int killcount = currentUILevel->Massacre (cheat == CHT_MASSACRE2); // killough 3/22/98: make more intelligent about plural // Ty 03/27/98 - string(s) *not* externalized mysnprintf (msgbuild, countof(msgbuild), "%d %s%s Killed", killcount, diff --git a/src/p_enemy.cpp b/src/p_enemy.cpp index 773313323..aa8eb93d1 100644 --- a/src/p_enemy.cpp +++ b/src/p_enemy.cpp @@ -1201,7 +1201,7 @@ int P_LookForMonsters (AActor *actor) { int count; AActor *mo; - TThinkerIterator iterator; + auto iterator = actor->Level->GetThinkerIterator(); if (!P_CheckSight (players[0].mo, actor, SF_SEEPASTBLOCKEVERYTHING)) { // Player can't see monster @@ -1258,7 +1258,7 @@ AActor *LookForTIDInBlock (AActor *lookee, int index, void *extparams) AActor *link; AActor *other; - for (block = level.blockmap.blocklinks[index]; block != NULL; block = block->NextActor) + for (block = lookee->Level->blockmap.blocklinks[index]; block != NULL; block = block->NextActor) { link = block->Me; @@ -1339,7 +1339,7 @@ int P_LookForTID (AActor *actor, INTBOOL allaround, FLookExParams *params) actor->LastLookActor = nullptr; } - auto iterator = level.GetActorIterator(actor->TIDtoHate, actor->LastLookActor); + auto iterator = actor->Level->GetActorIterator(actor->TIDtoHate, actor->LastLookActor); int c = (pr_look3() & 31) + 7; // Look for between 7 and 38 hatees at a time while ((other = iterator.Next()) != actor->LastLookActor) { @@ -1429,7 +1429,7 @@ AActor *LookForEnemiesInBlock (AActor *lookee, int index, void *extparam) AActor *other; FLookExParams *params = (FLookExParams *)extparam; - for (block = level.blockmap.blocklinks[index]; block != NULL; block = block->NextActor) + for (block = lookee->Level->blockmap.blocklinks[index]; block != NULL; block = block->NextActor) { link = block->Me; @@ -1760,10 +1760,10 @@ DEFINE_ACTION_FUNCTION(AActor, A_Look) // [RH] Set goal now if appropriate if (self->special == Thing_SetGoal && self->args[0] == 0) { - auto iterator = level.GetActorIterator(NAME_PatrolPoint, self->args[1]); + auto iterator = self->Level->GetActorIterator(NAME_PatrolPoint, self->args[1]); self->special = 0; self->goal = iterator.Next (); - self->reactiontime = self->args[2] * TICRATE + level.maptime; + self->reactiontime = self->args[2] * TICRATE + self->Level->maptime; if (self->args[3] == 0) self->flags5 &= ~MF5_CHASEGOAL; else self->flags5 |= MF5_CHASEGOAL; } @@ -1838,7 +1838,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_Look) // [RH] Don't start chasing after a goal if it isn't time yet. if (self->target == self->goal) { - if (self->reactiontime > level.maptime) + if (self->reactiontime > self->Level->maptime) self->target = nullptr; } else if (self->SeeSound) @@ -1889,10 +1889,10 @@ DEFINE_ACTION_FUNCTION(AActor, A_LookEx) // [RH] Set goal now if appropriate if (self->special == Thing_SetGoal && self->args[0] == 0) { - auto iterator = level.GetActorIterator(NAME_PatrolPoint, self->args[1]); + auto iterator = self->Level->GetActorIterator(NAME_PatrolPoint, self->args[1]); self->special = 0; self->goal = iterator.Next (); - self->reactiontime = self->args[2] * TICRATE + level.maptime; + self->reactiontime = self->args[2] * TICRATE + self->Level->maptime; if (self->args[3] == 0) self->flags5 &= ~MF5_CHASEGOAL; else @@ -2020,7 +2020,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_LookEx) // [RH] Don't start chasing after a goal if it isn't time yet. if (self->target == self->goal) { - if (self->reactiontime > level.maptime) + if (self->reactiontime > self->Level->maptime) self->target = nullptr; } else if (self->SeeSound && !(flags & LOF_NOSEESOUND)) @@ -2150,7 +2150,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_Look2) if (targ && (targ->flags & MF_SHOOTABLE)) { - if ((level.flags & LEVEL_NOALLIES) || + if ((self->Level->flags & LEVEL_NOALLIES) || (self->flags & MF_FRIENDLY) != (targ->flags & MF_FRIENDLY)) { if (self->flags & MF_AMBUSH) @@ -2372,8 +2372,8 @@ void A_DoChase (AActor *actor, bool fastchase, FState *meleestate, FState *missi if (result) { // reached the goal - auto iterator = level.GetActorIterator(NAME_PatrolPoint, actor->goal->args[0]); - auto specit = level.GetActorIterator(NAME_PatrolSpecial, actor->goal->tid); + auto iterator = actor->Level->GetActorIterator(NAME_PatrolPoint, actor->goal->args[0]); + auto specit = actor->Level->GetActorIterator(NAME_PatrolSpecial, actor->goal->tid); AActor *spec; // Execute the specials of any PatrolSpecials with the same TID @@ -2390,7 +2390,7 @@ void A_DoChase (AActor *actor, bool fastchase, FState *meleestate, FState *missi if (newgoal != NULL && actor->goal == actor->target) { delay = newgoal->args[1]; - actor->reactiontime = delay * TICRATE + level.maptime; + actor->reactiontime = delay * TICRATE + actor->Level->maptime; } else { @@ -3044,7 +3044,7 @@ int CheckBossDeath (AActor *actor) return false; // no one left alive, so do not end game // Make sure all bosses are dead - TThinkerIterator iterator; + auto iterator = actor->Level->GetThinkerIterator(); AActor *other; while ( (other = iterator.Next ()) ) @@ -3074,7 +3074,7 @@ void A_BossDeath(AActor *self) // Do generic special death actions first bool checked = false; - auto Level = &level; + auto Level = self->Level; for (unsigned i = 0; i < Level->info->specialactions.Size(); i++) { FSpecialAction *sa = &Level->info->specialactions[i]; @@ -3125,7 +3125,7 @@ void A_BossDeath(AActor *self) // victory! if (Level->flags & LEVEL_SPECKILLMONSTERS) { // Kill any remaining monsters - P_Massacre (); + Level->Massacre (); } if (Level->flags & LEVEL_MAP07SPECIAL) { @@ -3174,7 +3174,7 @@ void A_BossDeath(AActor *self) // //---------------------------------------------------------------------------- -int P_Massacre (bool baddies, PClassActor *cls) +int FLevelLocals::Massacre (bool baddies, FName cls) { // jff 02/01/98 'em' cheat - kill all monsters // partially taken from Chi's .46 port @@ -3184,7 +3184,7 @@ int P_Massacre (bool baddies, PClassActor *cls) int killcount = 0; AActor *actor; - TThinkerIterator iterator(cls? cls : RUNTIME_CLASS(AActor)); + auto iterator = GetThinkerIterator(cls); while ( (actor = iterator.Next ()) ) { diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index a2e25d87e..aed5c8a32 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -1510,11 +1510,11 @@ FUNC(LS_Thing_Destroy) if (arg0 == 0 && arg2 == 0) { - P_Massacre (); + Level->Massacre (); } else if (arg0 == 0) { - TThinkerIterator iterator; + auto iterator = Level->GetThinkerIterator(); actor = iterator.Next (); while (actor) From 5aa379e50ef874145a4e7fba627e80f8350b4ab4 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 27 Jan 2019 14:53:08 +0100 Subject: [PATCH 035/164] - removed all remaining references to level and TThinkerIterator from p_enemy.cpp. --- src/p_actionfunctions.cpp | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/p_actionfunctions.cpp b/src/p_actionfunctions.cpp index 4b648c243..15cdf32ae 100644 --- a/src/p_actionfunctions.cpp +++ b/src/p_actionfunctions.cpp @@ -2022,7 +2022,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_Respawn) } if (self->CountsAsKill()) { - level.total_monsters++; + self->Level->total_monsters++; } } else @@ -2620,9 +2620,9 @@ DEFINE_ACTION_FUNCTION(AActor, A_ChangeCountFlags) PARAM_INT(item); PARAM_INT(secret); - if (self->CountsAsKill() && self->health > 0) --level.total_monsters; - if (self->flags & MF_COUNTITEM) --level.total_items; - if (self->flags5 & MF5_COUNTSECRET) --level.total_secrets; + if (self->CountsAsKill() && self->health > 0) --self->Level->total_monsters; + if (self->flags & MF_COUNTITEM) --self->Level->total_items; + if (self->flags5 & MF5_COUNTSECRET) --self->Level->total_secrets; if (kill != -1) { @@ -2641,9 +2641,9 @@ DEFINE_ACTION_FUNCTION(AActor, A_ChangeCountFlags) if (secret == 0) self->flags5 &= ~MF5_COUNTSECRET; else self->flags5 |= MF5_COUNTSECRET; } - if (self->CountsAsKill() && self->health > 0) ++level.total_monsters; - if (self->flags & MF_COUNTITEM) ++level.total_items; - if (self->flags5 & MF5_COUNTSECRET) ++level.total_secrets; + if (self->CountsAsKill() && self->health > 0) ++self->Level->total_monsters; + if (self->flags & MF_COUNTITEM) ++self->Level->total_items; + if (self->flags5 & MF5_COUNTSECRET) ++self->Level->total_secrets; return 0; } @@ -2674,7 +2674,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_RaiseChildren) PARAM_SELF_PROLOGUE(AActor); PARAM_INT(flags); - TThinkerIterator it; + auto it = self->Level->GetThinkerIterator(); AActor *mo; while ((mo = it.Next()) != NULL) @@ -2697,7 +2697,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_RaiseSiblings) PARAM_SELF_PROLOGUE(AActor); PARAM_INT(flags); - TThinkerIterator it; + auto it = self->Level->GetThinkerIterator(); AActor *mo; if (self->master != NULL) @@ -3298,7 +3298,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_LineEffect) if ((oldjunk.special = special)) // Linedef type { oldjunk.tag = tag; // Sector tag for linedef - level.TranslateLineDef(&junk, &oldjunk); // Turn into native type + self->Level->TranslateLineDef(&junk, &oldjunk); // Turn into native type res = !!P_ExecuteSpecial(junk.special, NULL, self, false, junk.args[0], junk.args[1], junk.args[2], junk.args[3], junk.args[4]); if (res && !(junk.flags & ML_REPEAT_SPECIAL)) // If only once, @@ -3454,7 +3454,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_Warp) if ((flags & WARPF_USETID)) { - reference = level.SingleActorFromTID(destination_selector, self); + reference = self->Level->SingleActorFromTID(destination_selector, self); } else { @@ -3702,7 +3702,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_RadiusGive) int given = 0; if (flags & RGF_MISSILES) { - TThinkerIterator it; + auto it = self->Level->GetThinkerIterator(); while ((thing = it.Next()) && ((unlimited) || (given < limit))) { given += DoRadiusGive(self, thing, item, amount, distance, flags, filter, species, mindist); @@ -3931,7 +3931,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_DamageChildren) AActor *source = COPY_AAPTR(self, src); AActor *inflictor = COPY_AAPTR(self, inflict); - TThinkerIterator it; + auto it = self->Level->GetThinkerIterator(); AActor *mo; while ( (mo = it.Next()) ) @@ -3961,7 +3961,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_DamageSiblings) AActor *source = COPY_AAPTR(self, src); AActor *inflictor = COPY_AAPTR(self, inflict); - TThinkerIterator it; + auto it = self->Level->GetThinkerIterator(); AActor *mo; if (self->master != NULL) @@ -4112,7 +4112,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_KillChildren) AActor *source = COPY_AAPTR(self, src); AActor *inflictor = COPY_AAPTR(self, inflict); - TThinkerIterator it; + auto it = self->Level->GetThinkerIterator(); AActor *mo; while ( (mo = it.Next()) ) @@ -4143,7 +4143,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_KillSiblings) AActor *source = COPY_AAPTR(self, src); AActor *inflictor = COPY_AAPTR(self, inflict); - TThinkerIterator it; + auto it = self->Level->GetThinkerIterator(); AActor *mo; if (self->master != NULL) @@ -4271,7 +4271,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_RemoveChildren) PARAM_CLASS(filter, AActor); PARAM_NAME(species); - TThinkerIterator it; + auto it = self->Level->GetThinkerIterator(); AActor *mo; while ((mo = it.Next()) != NULL) @@ -4297,7 +4297,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_RemoveSiblings) PARAM_CLASS(filter, AActor); PARAM_NAME(species); - TThinkerIterator it; + auto it = self->Level->GetThinkerIterator(); AActor *mo; if (self->master != NULL) @@ -4838,7 +4838,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_CheckTerrain) } else if (sec->special == Scroll_StrifeCurrent) { - int anglespeed = level.GetFirstSectorTag(sec) - 100; + int anglespeed = self->Level->GetFirstSectorTag(sec) - 100; double speed = (anglespeed % 10) / 16.; DAngle an = (anglespeed / 10) * (360 / 8.); self->Thrust(an, speed); From c94f0f47a26fb414777ddd6022282156b11a9419 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 27 Jan 2019 15:02:37 +0100 Subject: [PATCH 036/164] - removed all remaining references to level and TThinkerIterator from p_floor.cpp, p_lights.cpp, p_pusher.cpp and p_scroll.cpp. --- src/p_floor.cpp | 10 +++++----- src/p_lights.cpp | 4 ++-- src/p_pusher.cpp | 6 +++--- src/p_scroll.cpp | 10 +++++----- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/p_floor.cpp b/src/p_floor.cpp index 45357bf8c..4f6e087b1 100644 --- a/src/p_floor.cpp +++ b/src/p_floor.cpp @@ -188,19 +188,19 @@ void DFloor::Tick () sector_t *sec = m_Sector; sec->stairlock = -1; // thinker done, promote lock to -1 - while (sec->prevsec != -1 && level.sectors[sec->prevsec].stairlock != -2) - sec = &level.sectors[sec->prevsec]; // search for a non-done thinker + while (sec->prevsec != -1 && Level->sectors[sec->prevsec].stairlock != -2) + sec = &Level->sectors[sec->prevsec]; // search for a non-done thinker if (sec->prevsec == -1) // if all thinkers previous are done { sec = m_Sector; // search forward - while (sec->nextsec != -1 && level.sectors[sec->nextsec].stairlock != -2) - sec = &level.sectors[sec->nextsec]; + while (sec->nextsec != -1 && Level->sectors[sec->nextsec].stairlock != -2) + sec = &Level->sectors[sec->nextsec]; if (sec->nextsec == -1) // if all thinkers ahead are done too { while (sec->prevsec != -1) // clear all locks { sec->stairlock = 0; - sec = &level.sectors[sec->prevsec]; + sec = &Level->sectors[sec->prevsec]; } sec->stairlock = 0; } diff --git a/src/p_lights.cpp b/src/p_lights.cpp index d5fb201cd..7dce5215f 100644 --- a/src/p_lights.cpp +++ b/src/p_lights.cpp @@ -816,10 +816,10 @@ void FLevelLocals::EV_StartLightFading(int tag, int value, int tics) void FLevelLocals::EV_StopLightEffect (int tag) { - TThinkerIterator iterator; + auto iterator = GetThinkerIterator(NAME_None, STAT_LIGHTNING); DLighting *effect; - while ((effect = iterator.Next()) != NULL) + while ((effect = iterator.Next()) != nullptr) { if (SectorHasTag(effect->GetSector(), tag)) { diff --git a/src/p_pusher.cpp b/src/p_pusher.cpp index 0859429e4..c06ee2c1f 100644 --- a/src/p_pusher.cpp +++ b/src/p_pusher.cpp @@ -133,7 +133,7 @@ void DPusher::Construct (DPusher::EPusher type, line_t *l, int magnitude, int an int DPusher::CheckForSectorMatch (EPusher type, int tag) { - if (m_Type == type && level.SectorHasTag(m_Affectee, tag)) + if (m_Type == type && Level->SectorHasTag(m_Affectee, tag)) return m_Affectee; else return -1; @@ -155,7 +155,7 @@ void DPusher::Tick () if (!var_pushers) return; - sec = &level.sectors[m_Affectee]; + sec = &Level->sectors[m_Affectee]; // Be sure the special sector type is still turned on. If so, proceed. // Else, bail out; the sector type has been changed on us. @@ -317,7 +317,7 @@ void FLevelLocals::AdjustPusher(int tag, int magnitude, int angle, bool wind) int secnum; // Now create pushers for any sectors that don't already have them. - auto itr = level.GetSectorTagIterator(tag); + auto itr = GetSectorTagIterator(tag); while ((secnum = itr.Next()) >= 0) { unsigned int i; diff --git a/src/p_scroll.cpp b/src/p_scroll.cpp index b48160ab5..c62aafe6f 100644 --- a/src/p_scroll.cpp +++ b/src/p_scroll.cpp @@ -213,7 +213,7 @@ void DScroller::Tick () // [RH] Don't actually carry anything here. That happens later. case EScroll::sc_carry: - level.Scrolls[m_Sector->Index()] += { dx, dy }; + Level->Scrolls[m_Sector->Index()] += { dx, dy }; // mark all potentially affected things here so that the very expensive calculation loop in AActor::Tick does not need to run for actors which do not touch a scrolling sector. for (auto n = m_Sector->touching_thinglist; n; n = n->m_snext) { @@ -267,7 +267,7 @@ void DScroller::Construct (EScroll type, double dx, double dy, sector_t *ctrl, { case EScroll::sc_carry: assert(sec != nullptr); - level.AddScroller (sec->Index()); + Level->AddScroller (sec->Index()); break; case EScroll::sc_side: @@ -381,7 +381,7 @@ void SetWallScroller (FLevelLocals *Level, int id, int sidechoice, double dx, do if (dx == 0 && dy == 0) { // Special case: Remove the scroller, because the deltas are both 0. - TThinkerIterator iterator (STAT_SCROLLER); + auto iterator = Level->GetThinkerIterator(NAME_None, STAT_SCROLLER); DScroller *scroller; while ( (scroller = iterator.Next ()) ) @@ -400,7 +400,7 @@ void SetWallScroller (FLevelLocals *Level, int id, int sidechoice, double dx, do // their rates. TArray Collection; { - TThinkerIterator iterator (STAT_SCROLLER); + auto iterator = Level->GetThinkerIterator(NAME_None, STAT_SCROLLER); DScroller *scroll; while ( (scroll = iterator.Next ()) ) @@ -439,7 +439,7 @@ void SetWallScroller (FLevelLocals *Level, int id, int sidechoice, double dx, do void SetScroller (FLevelLocals *Level, int tag, EScroll type, double dx, double dy) { - TThinkerIterator iterator (STAT_SCROLLER); + auto iterator = Level->GetThinkerIterator(NAME_None, STAT_SCROLLER); DScroller *scroller; int i; From 73696e278139b40148179a161ca9d9403c657f4d Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 27 Jan 2019 16:08:22 +0100 Subject: [PATCH 037/164] - handled most level references in actorinlines.h and p_mobj.cpp. --- src/actorinlines.h | 22 ++++---- src/g_levellocals.h | 9 ++++ src/maploader/maploader.cpp | 3 +- src/p_local.h | 2 - src/p_mobj.cpp | 105 ++++++++++++++++++------------------ src/p_pspr.cpp | 4 +- 6 files changed, 76 insertions(+), 69 deletions(-) diff --git a/src/actorinlines.h b/src/actorinlines.h index 7346d6d76..a253ecc7f 100644 --- a/src/actorinlines.h +++ b/src/actorinlines.h @@ -8,22 +8,22 @@ inline DVector3 AActor::PosRelative(int portalgroup) const { - return Pos() + level.Displacements.getOffset(Sector->PortalGroup, portalgroup); + return Pos() + Level->Displacements.getOffset(Sector->PortalGroup, portalgroup); } inline DVector3 AActor::PosRelative(const AActor *other) const { - return Pos() + level.Displacements.getOffset(Sector->PortalGroup, other->Sector->PortalGroup); + return Pos() + Level->Displacements.getOffset(Sector->PortalGroup, other->Sector->PortalGroup); } inline DVector3 AActor::PosRelative(sector_t *sec) const { - return Pos() + level.Displacements.getOffset(Sector->PortalGroup, sec->PortalGroup); + return Pos() + Level->Displacements.getOffset(Sector->PortalGroup, sec->PortalGroup); } inline DVector3 AActor::PosRelative(const line_t *line) const { - return Pos() + level.Displacements.getOffset(Sector->PortalGroup, line->frontsector->PortalGroup); + return Pos() + Level->Displacements.getOffset(Sector->PortalGroup, line->frontsector->PortalGroup); } inline DVector3 PosRelative(const DVector3 &pos, line_t *line, sector_t *refsec = NULL) @@ -61,7 +61,7 @@ inline double AActor::GetBobOffset(double ticfrac) const { return 0; } - return BobSin(FloatBobPhase + level.maptime + ticfrac) * FloatBobStrength; + return BobSin(FloatBobPhase + Level->maptime + ticfrac) * FloatBobStrength; } inline double AActor::GetCameraHeight() const @@ -78,7 +78,7 @@ inline FDropItem *AActor::GetDropItems() const inline double AActor::GetGravity() const { if (flags & MF_NOGRAVITY) return 0; - return level.gravity * Sector->gravity * Gravity * 0.00125; + return Level->gravity * Sector->gravity * Gravity * 0.00125; } inline double AActor::AttackOffset(double offset) @@ -102,7 +102,7 @@ inline DVector2 AActor::Vec2Offset(double dx, double dy, bool absolute) } else { - return level.GetPortalOffsetPosition(X(), Y(), dx, dy); + return Level->GetPortalOffsetPosition(X(), Y(), dx, dy); } } @@ -115,7 +115,7 @@ inline DVector3 AActor::Vec2OffsetZ(double dx, double dy, double atz, bool absol } else { - DVector2 v = level.GetPortalOffsetPosition(X(), Y(), dx, dy); + DVector2 v = Level->GetPortalOffsetPosition(X(), Y(), dx, dy); return DVector3(v, atz); } } @@ -128,7 +128,7 @@ inline DVector2 AActor::Vec2Angle(double length, DAngle angle, bool absolute) } else { - return level.GetPortalOffsetPosition(X(), Y(), length*angle.Cos(), length*angle.Sin()); + return Level->GetPortalOffsetPosition(X(), Y(), length*angle.Cos(), length*angle.Sin()); } } @@ -140,7 +140,7 @@ inline DVector3 AActor::Vec3Offset(double dx, double dy, double dz, bool absolut } else { - DVector2 v = level.GetPortalOffsetPosition(X(), Y(), dx, dy); + DVector2 v = Level->GetPortalOffsetPosition(X(), Y(), dx, dy); return DVector3(v, Z() + dz); } } @@ -158,7 +158,7 @@ inline DVector3 AActor::Vec3Angle(double length, DAngle angle, double dz, bool a } else { - DVector2 v = level.GetPortalOffsetPosition(X(), Y(), length*angle.Cos(), length*angle.Sin()); + DVector2 v = Level->GetPortalOffsetPosition(X(), Y(), length*angle.Cos(), length*angle.Sin()); return DVector3(v, Z() + dz); } } diff --git a/src/g_levellocals.h b/src/g_levellocals.h index e85877f78..9bf138635 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -204,6 +204,9 @@ public: void DoDeferedScripts(); void AdjustPusher(int tag, int magnitude, int angle, bool wind); int Massacre(bool baddies = false, FName cls = NAME_None); + AActor *SpawnMapThing(FMapThing *mthing, int position); + AActor *SpawnMapThing(int index, FMapThing *mt, int position); + AActor *SpawnPlayer(FPlayerStart *mthing, int playernum, int flags); bool EV_DoPlat(int tag, line_t *line, DPlat::EPlatType type, double height, double speed, int delay, int lip, int change); void EV_StopPlat(int tag, bool remove); @@ -592,3 +595,9 @@ inline bool line_t::hitSkyWall(AActor* mo) const backsector->GetTexture(sector_t::ceiling) == skyflatnum && mo->Z() >= backsector->ceilingplane.ZatPoint(mo->PosRelative(this)); } + +// Work for later. +inline AActor *P_SpawnPlayer(FPlayerStart *mthing, int playernum, int flags = 0) +{ + return level.SpawnPlayer(mthing, playernum, flags); +} diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index aa234a33b..0f6917ac2 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -111,7 +111,6 @@ void BloodCrypt (void *data, int key, int len); void P_ClearUDMFKeys(); void InitRenderInfo(); -extern AActor *SpawnMapThing (int index, FMapThing *mthing, int position); EXTERN_CVAR(Bool, am_textured) @@ -1448,7 +1447,7 @@ void MapLoader::SpawnThings (int position) for (int i=0; i < numthings; i++) { - AActor *actor = SpawnMapThing (i, &MapThingsConverted[i], position); + AActor *actor = Level->SpawnMapThing (i, &MapThingsConverted[i], position); unsigned *udi = MapThingsUserDataIndex.CheckKey((unsigned)i); if (udi != nullptr) { diff --git a/src/p_local.h b/src/p_local.h index fbec34e4a..7b64fb807 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -97,8 +97,6 @@ void P_PredictionLerpReset(); #define SPF_TEMPPLAYER 1 // spawning a short-lived dummy player #define SPF_WEAPONFULLYUP 2 // spawn with weapon already raised -AActor *P_SpawnPlayer (FPlayerStart *mthing, int playernum, int flags=0); - int P_FaceMobj (AActor *source, AActor *target, DAngle *delta); bool P_SeekerMissile (AActor *actor, double thresh, double turnMax, bool precise = false, bool usecurspeed=false); diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 4283e0be0..cea306841 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -774,7 +774,7 @@ void AActor::ClearInventory() void AActor::CopyFriendliness (AActor *other, bool changeTarget, bool resetHealth) { - level.total_monsters -= CountsAsKill(); + Level->total_monsters -= CountsAsKill(); TIDtoHate = other->TIDtoHate; LastLookActor = other->LastLookActor; LastLookPlayerNumber = other->LastLookPlayerNumber; @@ -789,7 +789,7 @@ void AActor::CopyFriendliness (AActor *other, bool changeTarget, bool resetHealt LastHeard = target = other->target; } if (resetHealth) health = SpawnHealth(); - level.total_monsters += CountsAsKill(); + Level->total_monsters += CountsAsKill(); } DEFINE_ACTION_FUNCTION(AActor, CopyFriendliness) @@ -2215,15 +2215,16 @@ explode: (!(mo->flags2 & MF2_FLY) || !(mo->flags & MF_NOGRAVITY)) && !mo->waterlevel) { // [RH] Friction when falling is available for larger aircontrols - if (player != NULL && level.airfriction != 1.) + auto airfriction = mo->Level->airfriction; + if (player != NULL && airfriction != 1.) { - mo->Vel.X *= level.airfriction; - mo->Vel.Y *= level.airfriction; + mo->Vel.X *= airfriction; + mo->Vel.Y *= airfriction; if (player->mo == mo) // Not voodoo dolls { - player->Vel.X *= level.airfriction; - player->Vel.Y *= level.airfriction; + player->Vel.X *= airfriction; + player->Vel.Y *= airfriction; } } return Oldfloorz; @@ -2326,7 +2327,7 @@ void P_MonsterFallingDamage (AActor *mo) int damage; double vel; - if (!(level.flags2 & LEVEL2_MONSTERFALLINGDAMAGE)) + if (!(mo->Level->flags2 & LEVEL2_MONSTERFALLINGDAMAGE)) return; if (mo->floorsector->Flags & SECF_NOFALLINGDAMAGE) return; @@ -2474,7 +2475,7 @@ void P_ZMovement (AActor *mo, double oldfloorz) { if (!mo->IsNoClip2()) { - mo->AddZ(DAngle(360 / 80.f * level.maptime).Sin() / 8); + mo->AddZ(DAngle(360 / 80.f * mo->Level->maptime).Sin() / 8); } if (!(mo->flags8 & MF8_NOFRICTION)) @@ -2903,7 +2904,7 @@ void AActor::AddToHash () else { int hash = TIDHASH (tid); - auto &slot = level.TIDHash[hash]; + auto &slot = Level->TIDHash[hash]; inext = slot; iprev = &slot; @@ -3504,7 +3505,7 @@ void AActor::Tick () if (!(flags5 & MF5_NOTIMEFREEZE)) { //Added by MC: Freeze mode. - if (bglobal.freeze || level.flags2 & LEVEL2_FROZEN) + if (bglobal.freeze || Level->flags2 & LEVEL2_FROZEN) { // Boss cubes shouldn't be accelerated by timefreeze if (flags6 & MF6_BOSSCUBE) @@ -3565,7 +3566,7 @@ void AActor::Tick () } // Apply freeze mode. - if ((level.flags2 & LEVEL2_FROZEN) && (player == NULL || player->timefreezer == 0)) + if ((Level->flags2 & LEVEL2_FROZEN) && (player == NULL || player->timefreezer == 0)) { return; } @@ -3682,7 +3683,7 @@ void AActor::Tick () // [RH] Consider carrying sectors here DVector2 cumm(0, 0); - if ((((flags8 & MF8_INSCROLLSEC) && level.Scrolls.Size() > 0) || player != NULL) && !(flags & MF_NOCLIP) && !(flags & MF_NOSECTOR)) + if ((((flags8 & MF8_INSCROLLSEC) && Level->Scrolls.Size() > 0) || player != NULL) && !(flags & MF_NOCLIP) && !(flags & MF_NOSECTOR)) { double height, waterheight; // killough 4/4/98: add waterheight const msecnode_t *node; @@ -3706,9 +3707,9 @@ void AActor::Tick () sector_t *sec = node->m_sector; DVector2 scrollv; - if (level.Scrolls.Size() > unsigned(sec->Index())) + if (Level->Scrolls.Size() > unsigned(sec->Index())) { - scrollv = level.Scrolls[sec->Index()]; + scrollv = Level->Scrolls[sec->Index()]; } else { @@ -3764,7 +3765,7 @@ void AActor::Tick () } else if (scrolltype == Scroll_StrifeCurrent) { // Strife scroll special - int anglespeed = level.GetFirstSectorTag(sec) - 100; + int anglespeed = Level->GetFirstSectorTag(sec) - 100; double carryspeed = (anglespeed % 10) / (16 * CARRYFACTOR); DAngle angle = ((anglespeed / 10) * 45.); scrollv += angle.ToVector(carryspeed); @@ -3909,7 +3910,7 @@ void AActor::Tick () { if (player) { - if (Vel.Z < level.gravity * Sector->gravity * (-1./100)// -655.36f) + if (Vel.Z < Level->gravity * Sector->gravity * (-1./100)// -655.36f) && !(flags&MF_NOGRAVITY)) { PlayerLandedOnThing (this, onmo); @@ -3937,12 +3938,12 @@ void AActor::Tick () if ((onmo->flags6 & MF6_BUMPSPECIAL) && ((player != NULL) || ((onmo->activationtype & THINGSPEC_MonsterTrigger) && (flags3 & MF3_ISMONSTER)) || ((onmo->activationtype & THINGSPEC_MissileTrigger) && (flags & MF_MISSILE)) - ) && (level.maptime > onmo->lastbump)) // Leave the bumper enough time to go away + ) && (Level->maptime > onmo->lastbump)) // Leave the bumper enough time to go away { if (player == NULL || !(player->cheats & CF_PREDICTING)) { if (P_ActivateThingSpecial(onmo, this)) - onmo->lastbump = level.maptime + TICRATE; + onmo->lastbump = Level->maptime + TICRATE; } } if (Vel.Z != 0 && (BounceFlags & BOUNCE_Actors)) @@ -3983,7 +3984,7 @@ void AActor::Tick () } // Check for poison damage, but only once per PoisonPeriod tics (or once per second if none). - if (PoisonDurationReceived && (level.time % (PoisonPeriodReceived ? PoisonPeriodReceived : TICRATE) == 0)) + if (PoisonDurationReceived && (Level->time % (PoisonPeriodReceived ? PoisonPeriodReceived : TICRATE) == 0)) { P_DamageMobj(this, NULL, Poisoner, PoisonDamageReceived, PoisonDamageTypeReceived ? PoisonDamageTypeReceived : (FName)NAME_Poison, 0); @@ -4037,7 +4038,7 @@ void AActor::Tick () if (movecount < respawn_monsters) return; - if (level.time & 31) + if (Level->time & 31) return; if (pr_nightmarerespawn() > 4) @@ -4883,7 +4884,7 @@ EXTERN_CVAR(Float, fov) extern bool demonew; -AActor *P_SpawnPlayer (FPlayerStart *mthing, int playernum, int flags) +AActor *FLevelLocals::SpawnPlayer (FPlayerStart *mthing, int playernum, int flags) { player_t *p; AActor *mobj, *oldactor; @@ -4969,7 +4970,7 @@ AActor *P_SpawnPlayer (FPlayerStart *mthing, int playernum, int flags) mobj = Spawn (p->cls, spawn, NO_REPLACE); - if (level.flags & LEVEL_USEPLAYERSTARTZ) + if (flags & LEVEL_USEPLAYERSTARTZ) { if (spawn.Z == ONFLOORZ) mobj->AddZ(mthing->pos.Z); @@ -4995,7 +4996,7 @@ AActor *P_SpawnPlayer (FPlayerStart *mthing, int playernum, int flags) VMValue params[] = { mobj, oldactor }; VMCall(func, params, 2, nullptr, 0); } - level.Behaviors.StopMyScripts (oldactor); // cancel all ENTER/RESPAWN scripts for the voodoo doll + Behaviors.StopMyScripts (oldactor); // cancel all ENTER/RESPAWN scripts for the voodoo doll } // [GRB] Reset skin @@ -5078,7 +5079,7 @@ AActor *P_SpawnPlayer (FPlayerStart *mthing, int playernum, int flags) VMCall(func, params, 1, nullptr, 0); } } - else if ((multiplayer || (level.flags2 & LEVEL2_ALLOWRESPAWN) || sv_singleplayerrespawn || + else if ((multiplayer || (flags2 & LEVEL2_ALLOWRESPAWN) || sv_singleplayerrespawn || !!G_SkillProperty(SKILLP_PlayerRespawn)) && state == PST_REBORN && oldactor != NULL) { // Special inventory handling for respawning in coop IFVM(PlayerPawn, FilterCoopRespawnInventory) @@ -5124,7 +5125,7 @@ AActor *P_SpawnPlayer (FPlayerStart *mthing, int playernum, int flags) { if (state == PST_ENTER || (state == PST_LIVE && !savegamerestore)) { - level.Behaviors.StartTypedScripts (SCRIPT_Enter, p->mo, true); + Behaviors.StartTypedScripts (SCRIPT_Enter, p->mo, true); } else if (state == PST_REBORN) { @@ -5140,7 +5141,7 @@ AActor *P_SpawnPlayer (FPlayerStart *mthing, int playernum, int flags) { if (th->LastHeard == oldactor) th->LastHeard = nullptr; } - for(auto &sec : level.sectors) + for(auto &sec : sectors) { if (sec.SoundTarget == oldactor) sec.SoundTarget = nullptr; } @@ -5148,7 +5149,7 @@ AActor *P_SpawnPlayer (FPlayerStart *mthing, int playernum, int flags) DObject::StaticPointerSubstitution (oldactor, p->mo); E_PlayerRespawned(int(p - players)); - level.Behaviors.StartTypedScripts (SCRIPT_Respawn, p->mo, true); + Behaviors.StartTypedScripts (SCRIPT_Respawn, p->mo, true); } } return mobj; @@ -5161,7 +5162,7 @@ AActor *P_SpawnPlayer (FPlayerStart *mthing, int playernum, int flags) // already be in host byte order. // // [RH] position is used to weed out unwanted start spots -AActor *P_SpawnMapThing (FMapThing *mthing, int position) +AActor *FLevelLocals::SpawnMapThing (FMapThing *mthing, int position) { PClassActor *i; int mask; @@ -5207,7 +5208,7 @@ AActor *P_SpawnMapThing (FMapThing *mthing, int position) { // count deathmatch start positions FPlayerStart start(mthing, 0); - level.deathmatchstarts.Push(start); + deathmatchstarts.Push(start); return NULL; } @@ -5235,7 +5236,7 @@ AActor *P_SpawnMapThing (FMapThing *mthing, int position) } } - if (pnum == -1 || (level.flags & LEVEL_FILTERSTARTS)) + if (pnum == -1 || (flags & LEVEL_FILTERSTARTS)) { // check for appropriate game type if (deathmatch) @@ -5300,10 +5301,10 @@ AActor *P_SpawnMapThing (FMapThing *mthing, int position) // save spots for respawning in network games FPlayerStart start(mthing, pnum+1); - level.playerstarts[pnum] = start; - if (level.flags2 & LEVEL2_RANDOMPLAYERSTARTS) + playerstarts[pnum] = start; + if (flags2 & LEVEL2_RANDOMPLAYERSTARTS) { // When using random player starts, all starts count - level.AllPlayerStarts.Push(start); + AllPlayerStarts.Push(start); } else { // When not using random player starts, later single player @@ -5311,22 +5312,22 @@ AActor *P_SpawnMapThing (FMapThing *mthing, int position) // ones are for voodoo dolls and not likely to be ideal for // spawning regular players. unsigned i; - for (i = 0; i < level.AllPlayerStarts.Size(); ++i) + for (i = 0; i < AllPlayerStarts.Size(); ++i) { - if (level.AllPlayerStarts[i].type == pnum+1) + if (AllPlayerStarts[i].type == pnum+1) { - level.AllPlayerStarts[i] = start; + AllPlayerStarts[i] = start; break; } } - if (i == level.AllPlayerStarts.Size()) + if (i == AllPlayerStarts.Size()) { - level.AllPlayerStarts.Push(start); + AllPlayerStarts.Push(start); } } - if (!deathmatch && !(level.flags2 & LEVEL2_RANDOMPLAYERSTARTS)) + if (!deathmatch && !(flags2 & LEVEL2_RANDOMPLAYERSTARTS)) { - return P_SpawnPlayer(&start, pnum, (level.flags2 & LEVEL2_PRERAISEWEAPON) ? SPF_WEAPONFULLYUP : 0); + return P_SpawnPlayer(&start, pnum, (flags2 & LEVEL2_PRERAISEWEAPON) ? SPF_WEAPONFULLYUP : 0); } return NULL; } @@ -5386,7 +5387,7 @@ AActor *P_SpawnMapThing (FMapThing *mthing, int position) } // don't spawn any monsters if -nomonsters - if (((level.flags2 & LEVEL2_NOMONSTERS) || (dmflags & DF_NO_MONSTERS)) && info->flags3 & MF3_ISMONSTER ) + if (((flags2 & LEVEL2_NOMONSTERS) || (dmflags & DF_NO_MONSTERS)) && info->flags3 & MF3_ISMONSTER ) { return NULL; } @@ -5462,11 +5463,11 @@ AActor *P_SpawnMapThing (FMapThing *mthing, int position) if (mthing->Conversation > 0) { // Make sure that this does not partially overwrite the default dialogue settings. - int root = level.GetConversation(mthing->Conversation); + int root = GetConversation(mthing->Conversation); if (root != -1) { mobj->ConversationRoot = root; - mobj->Conversation = level.StrifeDialogues[mobj->ConversationRoot]; + mobj->Conversation = StrifeDialogues[mobj->ConversationRoot]; } } @@ -5538,16 +5539,16 @@ AActor *P_SpawnMapThing (FMapThing *mthing, int position) //=========================================================================== CVAR(Bool, dumpspawnedthings, false, 0) -AActor *SpawnMapThing(int index, FMapThing *mt, int position) +AActor *FLevelLocals::SpawnMapThing(int index, FMapThing *mt, int position) { - AActor *spawned = P_SpawnMapThing(mt, position); + AActor *spawned = SpawnMapThing(mt, position); if (dumpspawnedthings) { Printf("%5d: (%5f, %5f, %5f), doomednum = %5d, flags = %04x, type = %s\n", index, mt->pos.X, mt->pos.Y, mt->pos.Z, mt->EdNum, mt->flags, spawned ? spawned->GetClass()->TypeName.GetChars() : "(none)"); } - T_AddSpawnedThing(&level, spawned); + T_AddSpawnedThing(this, spawned); return spawned; } @@ -6667,7 +6668,7 @@ AActor *P_SpawnPlayerMissile (AActor *source, double x, double y, double z, if (source->player != NULL && !nofreeaim && - level.IsFreelookAllowed() && + source->Level->IsFreelookAllowed() && source->player->userinfo.GetAimDist() <= 0.5) { break; @@ -6677,7 +6678,7 @@ AActor *P_SpawnPlayerMissile (AActor *source, double x, double y, double z, if (pLineTarget->linetarget == NULL) { an = angle; - if (nofreeaim || !level.IsFreelookAllowed()) + if (nofreeaim || !source->Level->IsFreelookAllowed()) { pitch = 0.; } @@ -7188,19 +7189,19 @@ void AActor::ClearCounters() { if (CountsAsKill() && health > 0) { - level.total_monsters--; + Level->total_monsters--; flags &= ~MF_COUNTKILL; } // Same, for items if (flags & MF_COUNTITEM) { - level.total_items--; + Level->total_items--; flags &= ~MF_COUNTITEM; } // And finally for secrets if (flags5 & MF5_COUNTSECRET) { - level.total_secrets--; + Level->total_secrets--; flags5 &= ~MF5_COUNTSECRET; } } diff --git a/src/p_pspr.cpp b/src/p_pspr.cpp index 5b5881940..4a1100b2e 100644 --- a/src/p_pspr.cpp +++ b/src/p_pspr.cpp @@ -965,8 +965,8 @@ DAngle P_BulletSlope (AActor *mo, FTranslatedLineTarget *pLineTarget, int aimfla an = mo->Angles.Yaw + angdiff[i]; pitch = P_AimLineAttack (mo, an, 16.*64, pLineTarget, 0., aimflags); - if (mo->player != NULL && - level.IsFreelookAllowed() && + if (mo->player != nullptr && + mo->Level->IsFreelookAllowed() && mo->player->userinfo.GetAimDist() <= 0.5) { break; From c8cd11422a3384025fc0c2d23f66366703564e3d Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 27 Jan 2019 16:09:05 +0100 Subject: [PATCH 038/164] - translate UMAPINFO specials at execution time, not load time. At load time the context for translation does not exist. --- src/p_enemy.cpp | 16 ++++++++++++++-- src/umapinfo.cpp | 10 +++------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/p_enemy.cpp b/src/p_enemy.cpp index aa8eb93d1..bc1341d1f 100644 --- a/src/p_enemy.cpp +++ b/src/p_enemy.cpp @@ -3087,8 +3087,20 @@ void A_BossDeath(AActor *self) } checked = true; - P_ExecuteSpecial(sa->Action, NULL, self, false, - sa->Args[0], sa->Args[1], sa->Args[2], sa->Args[3], sa->Args[4]); + if (sa->Action & 0x40000000) + { + // This is a Doom format special from UMAPINFO. It must be translated here, because at parsing time there is not sufficient context to do it. + maplinedef_t ml; + ml.special = sa->Action & 0x3fffffff; + ml.tag = sa->Args[0]; + line_t line; + self->Level->TranslateLineDef(&line, &ml); + P_ExecuteSpecial(line.special, NULL, self, false, line.args[0], line.args[1], line.args[2], line.args[3], line.args[4]); + } + else + { + P_ExecuteSpecial(sa->Action, NULL, self, false, sa->Args[0], sa->Args[1], sa->Args[2], sa->Args[3], sa->Args[4]); + } } } diff --git a/src/umapinfo.cpp b/src/umapinfo.cpp index eccace0d6..c981fc44f 100644 --- a/src/umapinfo.cpp +++ b/src/umapinfo.cpp @@ -274,14 +274,10 @@ static int ParseStandardProperty(FScanner &scanner, UMapEntry *mape) #pragma message("Fixme: This needs to be evaluated at run time") if (tag != 0 || special == 11 || special == 51 || special == 52 || special == 124) { + // This cannot be evaluated here because this needs to be done in the context of the level being used. FSpecialAction & bossact = mape->BossActions[mape->BossActions.Reserve(1)]; - line_t line; - maplinedef_t mld; - mld.special = special; - mld.tag = tag; - //level.TranslateLineDef(&line, &mld); - bossact = { type, (uint8_t)line.special, {line.args[0], line.args[1],line.args[2],line.args[3],line.args[4]} }; - } + bossact = { type, special | 0x40000000, tag }; + }; } } else From ae544fa21f7ac21bb854d950b6c594d39a0749da Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 27 Jan 2019 16:15:32 +0100 Subject: [PATCH 039/164] - removed a few direct uses of TThinkerIterator. --- src/p_mobj.cpp | 2 +- src/portal.cpp | 2 +- src/statistics.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index cea306841..e87760ae0 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -5136,7 +5136,7 @@ AActor *FLevelLocals::SpawnPlayer (FPlayerStart *mthing, int playernum, int flag // monsters who last targeted this player will wake up immediately // after the player has respawned. AActor *th; - TThinkerIterator it; + auto it = GetThinkerIterator(); while ((th = it.Next())) { if (th->LastHeard == oldactor) th->LastHeard = nullptr; diff --git a/src/portal.cpp b/src/portal.cpp index d008e4fcc..b4764c608 100644 --- a/src/portal.cpp +++ b/src/portal.cpp @@ -1035,7 +1035,7 @@ void FLevelLocals::CreateLinkedPortals() if (linkedPortals.Size() > 0) { // We need to relink all actors that may touch a linked line portal - TThinkerIterator it; + auto it = Level->GetThinkerIterator(); AActor *actor; while ((actor = it.Next())) { diff --git a/src/statistics.cpp b/src/statistics.cpp index 477ba72ad..2c155f5fb 100644 --- a/src/statistics.cpp +++ b/src/statistics.cpp @@ -413,7 +413,7 @@ static void StoreLevelStats(FLevelLocals *Level) // Check for living monsters. On some maps it can happen // that the counter misses some. - TThinkerIterator it; + auto it = Level->GetThinkerIterator(); AActor *ac; int mc = 0; From 522cc855ad9d67d54636b4d3916e0cde5e23afbb Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 27 Jan 2019 16:59:50 +0100 Subject: [PATCH 040/164] - a few more. --- src/p_user.cpp | 11 +++++------ src/portal.cpp | 2 +- src/serializer.cpp | 6 +++--- src/st_stuff.cpp | 2 +- src/umapinfo.cpp | 1 - src/v_blend.cpp | 13 +++++++------ src/v_palette.cpp | 3 +-- 7 files changed, 18 insertions(+), 20 deletions(-) diff --git a/src/p_user.cpp b/src/p_user.cpp index 55f643783..88f47db38 100644 --- a/src/p_user.cpp +++ b/src/p_user.cpp @@ -693,7 +693,7 @@ bool player_t::Resurrect() // fire E_PlayerRespawned and start the ACS SCRIPT_Respawn. E_PlayerRespawned(int(this - players)); // - level.Behaviors.StartTypedScripts(SCRIPT_Respawn, mo, true); + mo->Level->Behaviors.StartTypedScripts(SCRIPT_Respawn, mo, true); return true; } @@ -890,7 +890,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_PlayerScream) } // Handle the different player death screams - if ((((level.flags >> 15) | (dmflags)) & + if ((((self->Level->flags >> 15) | (dmflags)) & (DF_FORCE_FALLINGZD | DF_FORCE_FALLINGHX)) && self->Vel.Z <= -39) { @@ -1009,7 +1009,7 @@ void P_FallingDamage (AActor *actor) int damage; double vel; - damagestyle = ((level.flags >> 15) | (dmflags)) & + damagestyle = ((actor->Level->flags >> 15) | (dmflags)) & (DF_FORCE_FALLINGZD | DF_FORCE_FALLINGHX); if (damagestyle == 0) @@ -1110,7 +1110,7 @@ void P_CheckMusicChange(player_t *player) { if (player->MUSINFOactor->args[0] != 0) { - FName *music = level.info->MusicMap.CheckKey(player->MUSINFOactor->args[0]); + FName *music = player->MUSINFOactor->Level->info->MusicMap.CheckKey(player->MUSINFOactor->args[0]); if (music != NULL) { @@ -1248,7 +1248,6 @@ void P_PredictionLerpReset() bool P_LerpCalculate(AActor *pmo, PredictPos from, PredictPos to, PredictPos &result, float scale) { - //DVector2 pfrom = level.Displacements.getOffset(from.portalgroup, to.portalgroup); DVector3 vecFrom = from.pos; DVector3 vecTo = to.pos; DVector3 vecResult; @@ -1683,7 +1682,7 @@ bool P_IsPlayerTotallyFrozen(const player_t *player) return gamestate == GS_TITLELEVEL || player->cheats & CF_TOTALLYFROZEN || - ((level.flags2 & LEVEL2_FROZEN) && player->timefreezer == 0); + ((player->mo->Level->flags2 & LEVEL2_FROZEN) && player->timefreezer == 0); } diff --git a/src/portal.cpp b/src/portal.cpp index b4764c608..7b10f1d9b 100644 --- a/src/portal.cpp +++ b/src/portal.cpp @@ -1035,7 +1035,7 @@ void FLevelLocals::CreateLinkedPortals() if (linkedPortals.Size() > 0) { // We need to relink all actors that may touch a linked line portal - auto it = Level->GetThinkerIterator(); + auto it = GetThinkerIterator(); AActor *actor; while ((actor = it.Next())) { diff --git a/src/serializer.cpp b/src/serializer.cpp index b88ae0ba5..7fccd7475 100644 --- a/src/serializer.cpp +++ b/src/serializer.cpp @@ -2136,11 +2136,11 @@ template<> FSerializer &Serialize(FSerializer &arc, const char *key, char *&pstr // // This is a bit of a cheat because it never actually writes out the pointer. // The rules for levels are that they must be self-contained. -// No level and no pbject that is part of a level may reference a different level. +// No level and no pbject that is part of a level may reference a different one. // // When writing, this merely checks if the rules are obeyed and if not errors out. // When reading, it assumes that the object was properly written and restores -// the reference from the owning level. +// the reference from the owning level // // The only exception are null pointers which are allowed // @@ -2159,7 +2159,7 @@ template<> FSerializer &Serialize(FSerializer &arc, const char *key, FLevelLocal } else { - // This MUST be the currently serialized level. Anything else will error out here as a sanity check. + // This MUST be the currently serialized level, anything else will error out here as a sanity check. if (arc.Level == nullptr || lev != arc.Level) { I_Error("Attempt to serialize invalid level reference"); diff --git a/src/st_stuff.cpp b/src/st_stuff.cpp index fe96d6265..821317138 100644 --- a/src/st_stuff.cpp +++ b/src/st_stuff.cpp @@ -489,7 +489,7 @@ static bool Cht_ChangeStartSpot (cheatseq_t *cheat) { char cmd[64]; - mysnprintf (cmd, countof(cmd), "changemap %s %c", level.MapName.GetChars(), cheat->Args[0]); + mysnprintf (cmd, countof(cmd), "changemap %s %c", currentUILevel->MapName.GetChars(), cheat->Args[0]); C_DoCommand (cmd); return true; } diff --git a/src/umapinfo.cpp b/src/umapinfo.cpp index c981fc44f..324b1a0e1 100644 --- a/src/umapinfo.cpp +++ b/src/umapinfo.cpp @@ -271,7 +271,6 @@ static int ParseStandardProperty(FScanner &scanner, UMapEntry *mape) scanner.MustGetValue(false); int tag = scanner.Number; // allow no 0-tag specials here, unless a level exit. -#pragma message("Fixme: This needs to be evaluated at run time") if (tag != 0 || special == 11 || special == 51 || special == 52 || special == 124) { // This cannot be evaluated here because this needs to be done in the context of the level being used. diff --git a/src/v_blend.cpp b/src/v_blend.cpp index 94a40b832..6e6f31c90 100644 --- a/src/v_blend.cpp +++ b/src/v_blend.cpp @@ -93,6 +93,7 @@ void V_AddBlend (float r, float g, float b, float a, float v_blend[4]) void V_AddPlayerBlend (player_t *CPlayer, float blend[4], float maxinvalpha, int maxpainblend) { int cnt; + auto Level = CPlayer->mo->Level; // [RH] All powerups can affect the screen blending now for (AActor *item = CPlayer->mo->Inventory; item != NULL; item = item->Inventory) @@ -175,18 +176,18 @@ void V_AddPlayerBlend (player_t *CPlayer, float blend[4], float maxinvalpha, int { if (CPlayer->hazardcount > 16*TICRATE || (CPlayer->hazardcount & 8)) { - float r = ((level.hazardflash & 0xff0000) >> 16) / 255.f; - float g = ((level.hazardflash & 0xff00) >> 8) / 255.f; - float b = ((level.hazardflash & 0xff)) / 255.f; + float r = ((Level->hazardflash & 0xff0000) >> 16) / 255.f; + float g = ((Level->hazardflash & 0xff00) >> 8) / 255.f; + float b = ((Level->hazardflash & 0xff)) / 255.f; V_AddBlend (r, g, b, 0.125f, blend); } } else { cnt= MIN(CPlayer->hazardcount/8, 64); - float r = ((level.hazardcolor & 0xff0000) >> 16) / 255.f; - float g = ((level.hazardcolor & 0xff00) >> 8) / 255.f; - float b = ((level.hazardcolor & 0xff)) / 255.f; + float r = ((Level->hazardcolor & 0xff0000) >> 16) / 255.f; + float g = ((Level->hazardcolor & 0xff00) >> 8) / 255.f; + float b = ((Level->hazardcolor & 0xff)) / 255.f; V_AddBlend (r, g, b, cnt/93.2571428571f, blend); } } diff --git a/src/v_palette.cpp b/src/v_palette.cpp index 814d7e7fa..e598fa290 100644 --- a/src/v_palette.cpp +++ b/src/v_palette.cpp @@ -79,8 +79,7 @@ CUSTOM_CVAR (Float, Gamma, 1.f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CCMD (bumpgamma) { - // [RH] Gamma correction tables are now generated - // on the fly for *any* gamma level. + // [RH] Gamma correction tables are now generated on the fly for *any* gamma level // Q: What are reasonable limits to use here? float newgamma = Gamma + 0.1f; From 4f540c1703a390d065e16c74fff7c0476dba2270 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 27 Jan 2019 17:12:03 +0100 Subject: [PATCH 041/164] - give the sector a level reference. --- src/maploader/maploader.cpp | 1 + src/maploader/udmf.cpp | 1 + src/r_defs.h | 3 +-- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index 0f6917ac2..c603f18dc 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -1098,6 +1098,7 @@ void MapLoader::LoadSectors (MapData *map, FMissingTextureTracker &missingtex) for (unsigned i = 0; i < numsectors; i++, ss++, ms++) { ss->e = §ors[0].e[i]; + ss->Level = Level; if (!map->HasBehavior) ss->Flags |= SECF_FLOORDROP; ss->SetPlaneTexZ(sector_t::floor, (double)LittleShort(ms->floorheight)); ss->floorplane.set(0, 0, 1., -ss->GetPlaneTexZ(sector_t::floor)); diff --git a/src/maploader/udmf.cpp b/src/maploader/udmf.cpp index 690bf4a68..ea23dabb1 100644 --- a/src/maploader/udmf.cpp +++ b/src/maploader/udmf.cpp @@ -1445,6 +1445,7 @@ public: FName scroll_floor_type = NAME_None; memset(sec, 0, sizeof(*sec)); + sec->Level = Level; sec->lightlevel = 160; sec->SetXScale(sector_t::floor, 1.); // [RH] floor and ceiling scaling sec->SetYScale(sector_t::floor, 1.); diff --git a/src/r_defs.h b/src/r_defs.h index 0823251bc..91f248f85 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -264,7 +264,6 @@ public: // Stores things/mobjs. // class DSectorEffect; -struct sector_t; struct FRemapTable; enum @@ -453,7 +452,6 @@ public: #include "p_3dfloors.h" struct subsector_t; -struct sector_t; struct side_t; extern bool gl_plane_reflection_i; @@ -652,6 +650,7 @@ struct sector_t splane planes[2]; + FLevelLocals *Level; extsector_t * e; // This stores data that requires construction/destruction. Such data must not be copied by R_FakeFlat. secplane_t floorplane, ceilingplane; // [RH] store floor and ceiling planes instead of heights From 8c542e9be8437b406af04ddf8331992bdbefccd0 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 27 Jan 2019 17:21:36 +0100 Subject: [PATCH 042/164] - removed level references in the software renderers. --- src/maploader/maploader.cpp | 2 +- src/polyrenderer/poly_renderer.cpp | 8 +++++--- src/polyrenderer/poly_renderer.h | 1 + src/polyrenderer/scene/poly_cull.cpp | 12 ++++++------ src/polyrenderer/scene/poly_light.cpp | 2 +- src/polyrenderer/scene/poly_particle.cpp | 2 +- src/polyrenderer/scene/poly_plane.cpp | 2 +- src/polyrenderer/scene/poly_playersprite.cpp | 4 ++-- src/polyrenderer/scene/poly_portal.cpp | 4 ++-- src/polyrenderer/scene/poly_scene.cpp | 18 +++++++++--------- src/polyrenderer/scene/poly_sky.cpp | 12 ++++++------ src/r_renderer.h | 3 ++- src/swrenderer/drawers/r_draw_pal.cpp | 2 +- src/swrenderer/line/r_wallsetup.cpp | 4 ++-- src/swrenderer/plane/r_flatplane.cpp | 3 ++- src/swrenderer/plane/r_skyplane.cpp | 15 +++++++++------ src/swrenderer/plane/r_slopeplane.cpp | 3 ++- src/swrenderer/r_swrenderer.cpp | 10 +++++----- src/swrenderer/r_swrenderer.h | 2 +- src/swrenderer/scene/r_light.cpp | 7 ++++--- src/swrenderer/scene/r_light.h | 4 ++-- src/swrenderer/scene/r_opaque_pass.cpp | 19 ++++++++++--------- src/swrenderer/scene/r_opaque_pass.h | 2 +- src/swrenderer/scene/r_portal.cpp | 10 ++++++---- src/swrenderer/scene/r_scene.cpp | 2 +- src/swrenderer/things/r_model.cpp | 5 +++-- src/swrenderer/things/r_particle.cpp | 2 +- src/swrenderer/things/r_playersprite.cpp | 3 ++- src/swrenderer/things/r_visiblespritelist.cpp | 5 +++-- src/swrenderer/viewport/r_viewport.cpp | 2 +- src/swrenderer/viewport/r_viewport.h | 6 ++++++ 31 files changed, 99 insertions(+), 77 deletions(-) diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index c603f18dc..7b0c241f6 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -3283,7 +3283,7 @@ void MapLoader::LoadLevel(MapData *map, const char *lumpname, int position) P_Recalculate3DFloors(&sec); } - SWRenderer->SetColormap(); //The SW renderer needs to do some special setup for the level's default colormap. + SWRenderer->SetColormap(Level); //The SW renderer needs to do some special setup for the level's default colormap. InitPortalGroups(Level); P_InitHealthGroups(); diff --git a/src/polyrenderer/poly_renderer.cpp b/src/polyrenderer/poly_renderer.cpp index 0556cbe49..8cc8aa616 100644 --- a/src/polyrenderer/poly_renderer.cpp +++ b/src/polyrenderer/poly_renderer.cpp @@ -34,6 +34,7 @@ #include "st_stuff.h" #include "g_levellocals.h" #include "p_effect.h" +#include "actorinlines.h" #include "polyrenderer/scene/poly_light.h" #include "swrenderer/scene/r_scene.h" #include "swrenderer/drawers/r_draw_rgba.h" @@ -131,8 +132,9 @@ void PolyRenderer::RenderActorView(AActor *actor, bool dontmaplines) NetUpdate(); DontMapLines = dontmaplines; - + R_SetupFrame(Viewpoint, Viewwindow, actor); + Level = Viewpoint.ViewLevel; P_FindParticleSubsectors(); PO_LinkToSubsectors(&level); @@ -222,7 +224,7 @@ PolyPortalViewpoint PolyRenderer::SetupPerspectiveMatrix(bool mirror) // We have to scale the pitch to account for the pixel stretching, because the playsim doesn't know about this and treats it as 1:1. double radPitch = Viewpoint.Angles.Pitch.Normalized180().Radians(); double angx = cos(radPitch); - double angy = sin(radPitch) * level.info->pixelstretch; + double angy = sin(radPitch) * PolyRenderer::Instance()->Level->info->pixelstretch; double alen = sqrt(angx*angx + angy*angy); float adjustedPitch = (float)asin(angy / alen); float adjustedViewAngle = (float)(Viewpoint.Angles.Yaw - 90).Radians(); @@ -238,7 +240,7 @@ PolyPortalViewpoint PolyRenderer::SetupPerspectiveMatrix(bool mirror) Mat4f::Rotate((float)Viewpoint.Angles.Roll.Radians(), 0.0f, 0.0f, 1.0f) * Mat4f::Rotate(adjustedPitch, 1.0f, 0.0f, 0.0f) * Mat4f::Rotate(adjustedViewAngle, 0.0f, -1.0f, 0.0f) * - Mat4f::Scale(1.0f, level.info->pixelstretch, 1.0f) * + Mat4f::Scale(1.0f, PolyRenderer::Instance()->Level->info->pixelstretch, 1.0f) * Mat4f::SwapYZ() * Mat4f::Translate((float)-Viewpoint.Pos.X, (float)-Viewpoint.Pos.Y, (float)-Viewpoint.Pos.Z); diff --git a/src/polyrenderer/poly_renderer.h b/src/polyrenderer/poly_renderer.h index 34b880e1c..949196af9 100644 --- a/src/polyrenderer/poly_renderer.h +++ b/src/polyrenderer/poly_renderer.h @@ -68,6 +68,7 @@ public: FRenderViewpoint Viewpoint; PolyLightVisibility Light; RenderPolyScene Scene; + FLevelLocals *Level; private: void RenderActorView(AActor *actor, bool dontmaplines); diff --git a/src/polyrenderer/scene/poly_cull.cpp b/src/polyrenderer/scene/poly_cull.cpp index 6668e2f2b..1428a5931 100644 --- a/src/polyrenderer/scene/poly_cull.cpp +++ b/src/polyrenderer/scene/poly_cull.cpp @@ -32,18 +32,18 @@ void PolyCull::CullScene(sector_t *portalSector, line_t *portalLine) { for (uint32_t sub : PvsSubsectors) SubsectorDepths[sub] = 0xffffffff; - SubsectorDepths.resize(level.subsectors.Size(), 0xffffffff); + SubsectorDepths.resize(PolyRenderer::Instance()->Level->subsectors.Size(), 0xffffffff); for (uint32_t sector : SeenSectors) SectorSeen[sector] = false; - SectorSeen.resize(level.sectors.Size()); + SectorSeen.resize(PolyRenderer::Instance()->Level->sectors.Size()); PvsSubsectors.clear(); SeenSectors.clear(); NextPvsLineStart = 0; PvsLineStart.clear(); - PvsLineVisible.resize(level.segs.Size()); + PvsLineVisible.resize(PolyRenderer::Instance()->Level->segs.Size()); PortalSector = portalSector; PortalLine = portalLine; @@ -78,10 +78,10 @@ void PolyCull::CullScene(sector_t *portalSector, line_t *portalLine) FirstSkyHeight = true; MaxCeilingHeight = 0.0; MinFloorHeight = 0.0; - if (level.nodes.Size() == 0) - CullSubsector(&level.subsectors[0]); + if (PolyRenderer::Instance()->Level->nodes.Size() == 0) + CullSubsector(&PolyRenderer::Instance()->Level->subsectors[0]); else - CullNode(level.HeadNode()); + CullNode(PolyRenderer::Instance()->Level->HeadNode()); } void PolyCull::CullNode(void *node) diff --git a/src/polyrenderer/scene/poly_light.cpp b/src/polyrenderer/scene/poly_light.cpp index e0854fdce..e7ebf4c1e 100644 --- a/src/polyrenderer/scene/poly_light.cpp +++ b/src/polyrenderer/scene/poly_light.cpp @@ -34,7 +34,7 @@ void PolyLightVisibility::SetVisibility(FViewWindow &viewwindow, float vis) fixed_t PolyLightVisibility::LightLevelToShade(int lightlevel, bool foggy) { - bool nolightfade = !foggy && ((level.flags3 & LEVEL3_NOLIGHTFADE)); + bool nolightfade = !foggy && ((PolyRenderer::Instance()->Level->flags3 & LEVEL3_NOLIGHTFADE)); if (nolightfade) { return (MAX(255 - lightlevel, 0) * NUMCOLORMAPS) << (FRACBITS - 8); diff --git a/src/polyrenderer/scene/poly_particle.cpp b/src/polyrenderer/scene/poly_particle.cpp index 73617ebce..d7db9be84 100644 --- a/src/polyrenderer/scene/poly_particle.cpp +++ b/src/polyrenderer/scene/poly_particle.cpp @@ -35,7 +35,7 @@ EXTERN_CVAR(Int, gl_particles_style) void RenderPolyParticle::Render(PolyRenderThread *thread, particle_t *particle, subsector_t *sub, uint32_t stencilValue) { double timefrac = r_viewpoint.TicFrac; - if (paused || bglobal.freeze || (level.flags2 & LEVEL2_FROZEN)) + if (paused || bglobal.freeze || (PolyRenderer::Instance()->Level->flags2 & LEVEL2_FROZEN)) timefrac = 0.; DVector3 pos = particle->Pos + (particle->Vel * timefrac); double psize = particle->size / 8.0; diff --git a/src/polyrenderer/scene/poly_plane.cpp b/src/polyrenderer/scene/poly_plane.cpp index 27a3f2efa..1a1ceb0e0 100644 --- a/src/polyrenderer/scene/poly_plane.cpp +++ b/src/polyrenderer/scene/poly_plane.cpp @@ -246,7 +246,7 @@ void RenderPolyPlane::RenderSkyWalls(PolyRenderThread *thread, PolyDrawArgs &arg void RenderPolyPlane::SetLightLevel(PolyRenderThread *thread, PolyDrawArgs &args, const PolyTransferHeights &fakeflat, bool ceiling) { - bool foggy = level.fadeto || fakeflat.FrontSector->Colormap.FadeColor || (level.flags & LEVEL_HASFADETABLE); + bool foggy = PolyRenderer::Instance()->Level->fadeto || fakeflat.FrontSector->Colormap.FadeColor || (PolyRenderer::Instance()->Level->flags & LEVEL_HASFADETABLE); int lightlevel = ceiling ? fakeflat.CeilingLightLevel : fakeflat.FloorLightLevel; int actualextralight = foggy ? 0 : PolyRenderer::Instance()->Viewpoint.extralight << 4; diff --git a/src/polyrenderer/scene/poly_playersprite.cpp b/src/polyrenderer/scene/poly_playersprite.cpp index 93cfca926..600953508 100644 --- a/src/polyrenderer/scene/poly_playersprite.cpp +++ b/src/polyrenderer/scene/poly_playersprite.cpp @@ -106,7 +106,7 @@ void RenderPolyPlayerSprites::Render(PolyRenderThread *thread) } // [RH] set foggy flag - bool foggy = (level.fadeto || basecolormap->Fade || (level.flags & LEVEL_HASFADETABLE)); + bool foggy = (PolyRenderer::Instance()->Level->fadeto || basecolormap->Fade || (PolyRenderer::Instance()->Level->flags & LEVEL_HASFADETABLE)); // get light level lightnum = ((floorlight + ceilinglight) >> 1) + (foggy ? 0 : viewpoint.extralight << 4); @@ -458,7 +458,7 @@ void RenderPolyPlayerSprites::RenderSprite(PolyRenderThread *thread, DPSprite *p fixed_t RenderPolyPlayerSprites::LightLevelToShade(int lightlevel, bool foggy) { - bool nolightfade = !foggy && ((level.flags3 & LEVEL3_NOLIGHTFADE)); + bool nolightfade = !foggy && ((PolyRenderer::Instance()->Level->flags3 & LEVEL3_NOLIGHTFADE)); if (nolightfade) { return (MAX(255 - lightlevel, 0) * NUMCOLORMAPS) << (FRACBITS - 8); diff --git a/src/polyrenderer/scene/poly_portal.cpp b/src/polyrenderer/scene/poly_portal.cpp index a4a7ec467..ea9b2b949 100644 --- a/src/polyrenderer/scene/poly_portal.cpp +++ b/src/polyrenderer/scene/poly_portal.cpp @@ -91,13 +91,13 @@ void PolyDrawSectorPortal::SaveGlobals() viewpoint.SetViewAngle(viewwindow); Portal->mFlags |= PORTSF_INSKYBOX; - if (Portal->mPartner > 0) level.sectorPortals[Portal->mPartner].mFlags |= PORTSF_INSKYBOX; + if (Portal->mPartner > 0) PolyRenderer::Instance()->Level->sectorPortals[Portal->mPartner].mFlags |= PORTSF_INSKYBOX; } void PolyDrawSectorPortal::RestoreGlobals() { Portal->mFlags &= ~PORTSF_INSKYBOX; - if (Portal->mPartner > 0) level.sectorPortals[Portal->mPartner].mFlags &= ~PORTSF_INSKYBOX; + if (Portal->mPartner > 0) PolyRenderer::Instance()->Level->sectorPortals[Portal->mPartner].mFlags &= ~PORTSF_INSKYBOX; auto &viewpoint = PolyRenderer::Instance()->Viewpoint; const auto &viewwindow = PolyRenderer::Instance()->Viewwindow; diff --git a/src/polyrenderer/scene/poly_scene.cpp b/src/polyrenderer/scene/poly_scene.cpp index f92c73762..a351f57c7 100644 --- a/src/polyrenderer/scene/poly_scene.cpp +++ b/src/polyrenderer/scene/poly_scene.cpp @@ -70,7 +70,7 @@ void RenderPolyScene::Render(PolyPortalViewpoint *viewpoint) const auto &rviewpoint = PolyRenderer::Instance()->Viewpoint; for (uint32_t sectorIndex : Cull.SeenSectors) { - sector_t *sector = &level.sectors[sectorIndex]; + sector_t *sector = &PolyRenderer::Instance()->Level->sectors[sectorIndex]; for (AActor *thing = sector->thinglist; thing != nullptr; thing = thing->snext) { if (!RenderPolySprite::IsThingCulled(thing)) @@ -132,7 +132,7 @@ void RenderPolyScene::RenderSectors() int end = thread->End; for (int i = start; i < end; i++) { - RenderSubsector(thread, &level.subsectors[subsectors[i]], i); + RenderSubsector(thread, &PolyRenderer::Instance()->Level->subsectors[subsectors[i]], i); } }, [&](PolyRenderThread *thread) { @@ -254,15 +254,15 @@ int RenderPolyScene::PointOnSide(const DVector2 &pos, const node_t *node) void RenderPolyScene::AddSprite(PolyRenderThread *thread, AActor *thing, double sortDistance, const DVector2 &left, const DVector2 &right) { - if (level.nodes.Size() == 0) + if (PolyRenderer::Instance()->Level->nodes.Size() == 0) { - subsector_t *sub = &level.subsectors[0]; + subsector_t *sub = &PolyRenderer::Instance()->Level->subsectors[0]; if (Cull.SubsectorDepths[sub->Index()] != 0xffffffff) thread->TranslucentObjects.push_back(thread->FrameMemory->NewObject(thing, sub, Cull.SubsectorDepths[sub->Index()], sortDistance, 0.0f, 1.0f, CurrentViewpoint->StencilValue)); } else { - AddSprite(thread, thing, sortDistance, left, right, 0.0, 1.0, level.HeadNode()); + AddSprite(thread, thing, sortDistance, left, right, 0.0, 1.0, PolyRenderer::Instance()->Level->HeadNode()); } } @@ -303,15 +303,15 @@ void RenderPolyScene::AddSprite(PolyRenderThread *thread, AActor *thing, double void RenderPolyScene::AddModel(PolyRenderThread *thread, AActor *thing, double sortDistance, DVector2 pos) { - if (level.nodes.Size() == 0) + if (PolyRenderer::Instance()->Level->nodes.Size() == 0) { - subsector_t *sub = &level.subsectors[0]; + subsector_t *sub = &PolyRenderer::Instance()->Level->subsectors[0]; if (Cull.SubsectorDepths[sub->Index()] != 0xffffffff) thread->TranslucentObjects.push_back(thread->FrameMemory->NewObject(thing, sub, Cull.SubsectorDepths[sub->Index()], sortDistance, 0.0f, 1.0f, CurrentViewpoint->StencilValue)); } else { - void *node = level.HeadNode(); + void *node = PolyRenderer::Instance()->Level->HeadNode(); while (!((size_t)node & 1)) // Keep going until found a subsector { @@ -444,7 +444,7 @@ PolyTransferHeights::PolyTransferHeights(subsector_t *sub) : Subsector(sub) // If player's view height is underneath fake floor, lower the // drawn ceiling to be just under the floor height, and replace - // the drawn floor and ceiling textures, and light level, with + // the drawn floor and ceiling textures, and light PolyRenderer::Instance()->Level->, with // the control sector's. // // Similar for ceiling, only reflected. diff --git a/src/polyrenderer/scene/poly_sky.cpp b/src/polyrenderer/scene/poly_sky.cpp index 4e3e2fbfd..b279746c0 100644 --- a/src/polyrenderer/scene/poly_sky.cpp +++ b/src/polyrenderer/scene/poly_sky.cpp @@ -229,7 +229,7 @@ Mat4f PolySkyDome::GLSkyMath() float xscale = texw < 1024.f ? floor(1024.f / float(texw)) : 1.f; float yscale = 1.f; - if (texh <= 128 && (level.flags & LEVEL_FORCETILEDSKY)) + if (texh <= 128 && (PolyRenderer::Instance()->Level->flags & LEVEL_FORCETILEDSKY)) { modelMatrix = modelMatrix * Mat4f::Translate(0.f, 0.f, (-40 + tex->GetSkyOffset() + skyoffset)*skyoffsetfactor); modelMatrix = modelMatrix * Mat4f::Scale(1.f, 1.f, 1.2f * 1.17f); @@ -307,7 +307,7 @@ void PolySkySetup::Update() } else if (skyheight > 200) { - skytexturemid = (200 - skyheight) * sskytex1->GetScale().Y + ((r_skymode == 2 && !(level.flags & LEVEL_FORCETILEDSKY)) ? skytex1->GetSkyOffset() : 0); + skytexturemid = (200 - skyheight) * sskytex1->GetScale().Y + ((r_skymode == 2 && !(PolyRenderer::Instance()->Level->flags & LEVEL_FORCETILEDSKY)) ? skytex1->GetSkyOffset() : 0); } if (viewwidth != 0 && viewheight != 0) @@ -337,7 +337,7 @@ void PolySkySetup::Update() FTextureID sky1tex, sky2tex; double frontdpos = 0, backdpos = 0; - if ((level.flags & LEVEL_SWAPSKIES) && !(level.flags & LEVEL_DOUBLESKY)) + if ((PolyRenderer::Instance()->Level->flags & LEVEL_SWAPSKIES) && !(PolyRenderer::Instance()->Level->flags & LEVEL_DOUBLESKY)) { sky1tex = sky2texture; } @@ -355,7 +355,7 @@ void PolySkySetup::Update() { // use sky1 sky1: frontskytex = GetSWTex(sky1tex); - if (level.flags & LEVEL_DOUBLESKY) + if (PolyRenderer::Instance()->Level->flags & LEVEL_DOUBLESKY) backskytex = GetSWTex(sky2tex); else backskytex = nullptr; @@ -376,7 +376,7 @@ void PolySkySetup::Update() else { // MBF's linedef-controlled skies // Sky Linedef - const line_t *l = &level.lines[(sectorSky & ~PL_SKYFLAT) - 1]; + const line_t *l = &PolyRenderer::Instance()->Level->lines[(sectorSky & ~PL_SKYFLAT) - 1]; // Sky transferred from first sidedef const side_t *s = l->sidedef[0]; @@ -384,7 +384,7 @@ void PolySkySetup::Update() // Texture comes from upper texture of reference sidedef // [RH] If swapping skies, then use the lower sidedef - if (level.flags & LEVEL_SWAPSKIES && s->GetTexture(side_t::bottom).isValid()) + if (PolyRenderer::Instance()->Level->flags & LEVEL_SWAPSKIES && s->GetTexture(side_t::bottom).isValid()) { pos = side_t::bottom; } diff --git a/src/r_renderer.h b/src/r_renderer.h index 46fd9a430..126d7a2ee 100644 --- a/src/r_renderer.h +++ b/src/r_renderer.h @@ -14,6 +14,7 @@ struct sector_t; class FCanvasTexture; class FileWriter; class DCanvas; +struct FLevelLocals; struct FRenderer { @@ -32,7 +33,7 @@ struct FRenderer virtual void DrawRemainingPlayerSprites() = 0; // set up the colormap for a newly loaded level. - virtual void SetColormap() = 0; + virtual void SetColormap(FLevelLocals *) = 0; virtual void SetClearColor(int color) = 0; diff --git a/src/swrenderer/drawers/r_draw_pal.cpp b/src/swrenderer/drawers/r_draw_pal.cpp index 5be7ba5cc..e6280e197 100644 --- a/src/swrenderer/drawers/r_draw_pal.cpp +++ b/src/swrenderer/drawers/r_draw_pal.cpp @@ -69,7 +69,7 @@ EXTERN_CVAR(Int, gl_particles_style) table seemed to be quite ultimate. The computation of the RGB for each pixel is accelerated by using two - 1k tables for each translucency level. + 1k tables for each translucency level The xth element of one of these tables contains the r, g and b values for the colour x, weighted for the current translucency level (for example, the weighted rgb values for background colour at 75% translucency are 1/4 diff --git a/src/swrenderer/line/r_wallsetup.cpp b/src/swrenderer/line/r_wallsetup.cpp index 87c491b67..168e8425f 100644 --- a/src/swrenderer/line/r_wallsetup.cpp +++ b/src/swrenderer/line/r_wallsetup.cpp @@ -266,7 +266,7 @@ namespace swrenderer if (!lit) { basecolormap = GetColorTable(frontsector->Colormap, frontsector->SpecialColors[sector_t::walltop]); - foggy = level.fadeto || frontsector->Colormap.FadeColor || (level.flags & LEVEL_HASFADETABLE); + foggy = frontsector->Level->fadeto || frontsector->Colormap.FadeColor || (frontsector->Level->flags & LEVEL_HASFADETABLE); if (!(lineseg->sidedef->Flags & WALLF_POLYOBJ)) lightlevel = lineseg->sidedef->GetLightLevel(foggy, frontsector->lightlevel); @@ -276,7 +276,7 @@ namespace swrenderer else { basecolormap = GetColorTable(lit->extra_colormap, frontsector->SpecialColors[sector_t::walltop]); - foggy = level.fadeto || basecolormap->Fade || (level.flags & LEVEL_HASFADETABLE); + foggy = frontsector->Level->fadeto || basecolormap->Fade || (frontsector->Level->flags & LEVEL_HASFADETABLE); lightlevel = lineseg->sidedef->GetLightLevel(foggy, *lit->p_lightlevel, lit->lightsource != nullptr); } } diff --git a/src/swrenderer/plane/r_flatplane.cpp b/src/swrenderer/plane/r_flatplane.cpp index 11f8fef86..b75d5c545 100644 --- a/src/swrenderer/plane/r_flatplane.cpp +++ b/src/swrenderer/plane/r_flatplane.cpp @@ -135,7 +135,8 @@ namespace swrenderer planeheight = fabs(pl->height.Zat0() - Thread->Viewport->viewpoint.Pos.Z); // [RH] set foggy flag - foggy = (level.fadeto || colormap->Fade || (level.flags & LEVEL_HASFADETABLE)); + auto Level = Thread->Viewport->Level(); + foggy = (Level->fadeto || colormap->Fade || (Level->flags & LEVEL_HASFADETABLE)); lightlevel = pl->lightlevel; CameraLight *cameraLight = CameraLight::Instance(); diff --git a/src/swrenderer/plane/r_skyplane.cpp b/src/swrenderer/plane/r_skyplane.cpp index 24653860d..d441f28e4 100644 --- a/src/swrenderer/plane/r_skyplane.cpp +++ b/src/swrenderer/plane/r_skyplane.cpp @@ -70,6 +70,7 @@ namespace swrenderer RenderSkyPlane::RenderSkyPlane(RenderThread *thread) { Thread = thread; + auto Level = Thread->Viewport->Level(); auto skytex1 = TexMan.GetPalettedTexture(sky1texture, true); auto skytex2 = TexMan.GetPalettedTexture(sky2texture, true); @@ -87,7 +88,7 @@ namespace swrenderer } else if (skyheight > 200) { - skytexturemid = (200 - skyheight) * sskytex1->GetScale().Y + ((r_skymode == 2 && !(level.flags & LEVEL_FORCETILEDSKY)) ? skytex1->GetSkyOffset() : 0); + skytexturemid = (200 - skyheight) * sskytex1->GetScale().Y + ((r_skymode == 2 && !(Level->flags & LEVEL_FORCETILEDSKY)) ? skytex1->GetSkyOffset() : 0); } if (viewwidth != 0 && viewheight != 0) @@ -118,8 +119,9 @@ namespace swrenderer { FTextureID sky1tex, sky2tex; double frontdpos = 0, backdpos = 0; + auto Level = Thread->Viewport->Level(); - if ((level.flags & LEVEL_SWAPSKIES) && !(level.flags & LEVEL_DOUBLESKY)) + if ((Level->flags & LEVEL_SWAPSKIES) && !(Level->flags & LEVEL_DOUBLESKY)) { sky1tex = sky2texture; } @@ -137,7 +139,7 @@ namespace swrenderer { // use sky1 sky1: frontskytex = GetSWTex(sky1tex); - if (level.flags & LEVEL_DOUBLESKY) + if (Level->flags & LEVEL_DOUBLESKY) backskytex = GetSWTex(sky2tex); else backskytex = NULL; @@ -158,7 +160,7 @@ namespace swrenderer else { // MBF's linedef-controlled skies // Sky Linedef - const line_t *l = &level.lines[(pl->sky & ~PL_SKYFLAT) - 1]; + const line_t *l = &Level->lines[(pl->sky & ~PL_SKYFLAT) - 1]; // Sky transferred from first sidedef const side_t *s = l->sidedef[0]; @@ -166,7 +168,7 @@ namespace swrenderer // Texture comes from upper texture of reference sidedef // [RH] If swapping skies, then use the lower sidedef - if (level.flags & LEVEL_SWAPSKIES && s->GetTexture(side_t::bottom).isValid()) + if (Level->flags & LEVEL_SWAPSKIES && s->GetTexture(side_t::bottom).isValid()) { pos = side_t::bottom; } @@ -224,6 +226,7 @@ namespace swrenderer { RenderPortal *renderportal = Thread->Portal.get(); auto viewport = Thread->Viewport.get(); + auto Level = viewport->Level(); double uv_stepd = skyiscale * yrepeat; double v = (texturemid + uv_stepd * (y1 - viewport->CenterY + 0.5)) / frontskytex->GetHeight(); @@ -256,7 +259,7 @@ namespace swrenderer drawerargs.SetTextureVPos(uv_pos); drawerargs.SetDest(viewport, start_x, y1); drawerargs.SetCount(y2 - y1); - drawerargs.SetFadeSky(r_skymode == 2 && !(level.flags & LEVEL_FORCETILEDSKY)); + drawerargs.SetFadeSky(r_skymode == 2 && !(Level->flags & LEVEL_FORCETILEDSKY)); drawerargs.SetSolidTop(frontskytex->GetSkyCapColor(false)); drawerargs.SetSolidBottom(frontskytex->GetSkyCapColor(true)); diff --git a/src/swrenderer/plane/r_slopeplane.cpp b/src/swrenderer/plane/r_slopeplane.cpp index 3c7dcb72d..c143e86c3 100644 --- a/src/swrenderer/plane/r_slopeplane.cpp +++ b/src/swrenderer/plane/r_slopeplane.cpp @@ -174,7 +174,8 @@ namespace swrenderer // [RH] set foggy flag basecolormap = colormap; - foggy = level.fadeto || basecolormap->Fade || (level.flags & LEVEL_HASFADETABLE); + auto Level = viewport->Level(); + foggy = Level->fadeto || basecolormap->Fade || (Level->flags & LEVEL_HASFADETABLE); planelightfloat = (Thread->Light->SlopePlaneGlobVis(foggy) * lxscale * lyscale) / (fabs(pl->height.ZatPoint(Thread->Viewport->viewpoint.Pos) - Thread->Viewport->viewpoint.Pos.Z)) / 65536.f; diff --git a/src/swrenderer/r_swrenderer.cpp b/src/swrenderer/r_swrenderer.cpp index 341426532..93802f4c8 100644 --- a/src/swrenderer/r_swrenderer.cpp +++ b/src/swrenderer/r_swrenderer.cpp @@ -202,7 +202,7 @@ void FSoftwareRenderer::RenderView(player_t *player, DCanvas *target, void *vide r_viewwindow = mScene.MainThread()->Viewport->viewwindow; } - level.canvasTextureInfo.UpdateAll([&](AActor *camera, FCanvasTexture *camtex, double fov) + r_viewpoint.ViewLevel->canvasTextureInfo.UpdateAll([&](AActor *camera, FCanvasTexture *camtex, double fov) { RenderTextureView(camtex, camera, fov); }); @@ -296,15 +296,15 @@ void FSoftwareRenderer::RenderTextureView (FCanvasTexture *camtex, AActor *viewp r_viewwindow = cameraViewwindow; } -void FSoftwareRenderer::SetColormap() +void FSoftwareRenderer::SetColormap(FLevelLocals *Level) { // This just sets the default colormap for the spftware renderer. NormalLight.Maps = realcolormaps.Maps; NormalLight.ChangeColor(PalEntry(255, 255, 255), 0); - NormalLight.ChangeFade(level.fadeto); - if (level.fadeto == 0) + NormalLight.ChangeFade(Level->fadeto); + if (Level->fadeto == 0) { - SetDefaultColormap(level.info->FadeTable); + SetDefaultColormap(Level->info->FadeTable); } } diff --git a/src/swrenderer/r_swrenderer.h b/src/swrenderer/r_swrenderer.h index 61d0044ff..84627f2cd 100644 --- a/src/swrenderer/r_swrenderer.h +++ b/src/swrenderer/r_swrenderer.h @@ -23,7 +23,7 @@ struct FSoftwareRenderer : public FRenderer void SetClearColor(int color) override; void RenderTextureView (FCanvasTexture *tex, AActor *viewpoint, double fov); - void SetColormap() override; + void SetColormap(FLevelLocals *Level) override; void Init() override; private: diff --git a/src/swrenderer/scene/r_light.cpp b/src/swrenderer/scene/r_light.cpp index 73a9e84d7..0834a990c 100644 --- a/src/swrenderer/scene/r_light.cpp +++ b/src/swrenderer/scene/r_light.cpp @@ -39,6 +39,7 @@ #include "g_level.h" #include "r_utility.h" #include "d_player.h" +#include "g_levellocals.h" #include "swrenderer/scene/r_light.h" #include "swrenderer/viewport/r_viewport.h" @@ -139,12 +140,12 @@ namespace swrenderer TiltVisibility = float(vis * viewport->viewwindow.FocalTangent * (16.f * 320.f) / viewwidth); - NoLightFade = !!(level.flags3 & LEVEL3_NOLIGHTFADE); + NoLightFade = !!(viewport->Level()->flags3 & LEVEL3_NOLIGHTFADE); } - fixed_t LightVisibility::LightLevelToShadeImpl(int lightlevel, bool foggy) + fixed_t LightVisibility::LightLevelToShadeImpl(RenderViewport *viewport, int lightlevel, bool foggy) { - bool nolightfade = !foggy && ((level.flags3 & LEVEL3_NOLIGHTFADE)); + bool nolightfade = !foggy && ((viewport->Level()->flags3 & LEVEL3_NOLIGHTFADE)); if (nolightfade) { return (MAX(255 - lightlevel, 0) * NUMCOLORMAPS) << (FRACBITS - 8); diff --git a/src/swrenderer/scene/r_light.h b/src/swrenderer/scene/r_light.h index 5c2938cec..d2d2a383d 100644 --- a/src/swrenderer/scene/r_light.h +++ b/src/swrenderer/scene/r_light.h @@ -87,7 +87,7 @@ namespace swrenderer double SlopePlaneGlobVis(bool foggy) const { return (NoLightFade && !foggy) ? 0.0f : TiltVisibility; } - static fixed_t LightLevelToShade(int lightlevel, bool foggy, RenderViewport *viewport) { return LightLevelToShadeImpl(lightlevel + ActualExtraLight(foggy, viewport), foggy); } + static fixed_t LightLevelToShade(int lightlevel, bool foggy, RenderViewport *viewport) { return LightLevelToShadeImpl(viewport, lightlevel + ActualExtraLight(foggy, viewport), foggy); } static int ActualExtraLight(bool fog, RenderViewport *viewport) { return fog ? 0 : viewport->viewpoint.extralight << 4; } @@ -96,7 +96,7 @@ namespace swrenderer double SpriteGlobVis(bool foggy) const { return (NoLightFade && !foggy) ? 0.0f : WallVisibility; } double FlatPlaneGlobVis(bool foggy) const { return (NoLightFade && !foggy) ? 0.0f : FloorVisibility; } - static fixed_t LightLevelToShadeImpl(int lightlevel, bool foggy); + static fixed_t LightLevelToShadeImpl(RenderViewport *viewport, int lightlevel, bool foggy); double BaseVisibility = 0.0; double WallVisibility = 0.0; diff --git a/src/swrenderer/scene/r_opaque_pass.cpp b/src/swrenderer/scene/r_opaque_pass.cpp index 115d37daf..79d3112b2 100644 --- a/src/swrenderer/scene/r_opaque_pass.cpp +++ b/src/swrenderer/scene/r_opaque_pass.cpp @@ -492,9 +492,10 @@ namespace swrenderer PvsSubsectors.push_back(sub->Index()); } + auto Level = sub->sector->Level; #ifdef RANGECHECK - if (outersubsector && (unsigned)sub->Index() >= level.subsectors.Size()) - I_Error("RenderSubsector: ss %i with numss = %u", sub->Index(), level.subsectors.Size()); + if (outersubsector && (unsigned)sub->Index() >= Level->subsectors.Size()) + I_Error("RenderSubsector: ss %i with numss = %u", sub->Index(), Level->subsectors.Size()); #endif if (sub->polys) @@ -515,7 +516,7 @@ namespace swrenderer sector_t *frontsector = FakeFlat(sub->sector, &tempsec, &floorlightlevel, &ceilinglightlevel, nullptr, 0, 0, 0, 0); // [RH] set foggy flag - bool foggy = level.fadeto || frontsector->Colormap.FadeColor || (level.flags & LEVEL_HASFADETABLE); + bool foggy = Level->fadeto || frontsector->Colormap.FadeColor || (Level->flags & LEVEL_HASFADETABLE); // kg3D - fake lights CameraLight *cameraLight = CameraLight::Instance(); @@ -611,7 +612,7 @@ namespace swrenderer AddSprites(sub->sector, frontsector->GetTexture(sector_t::ceiling) == skyflatnum ? ceilinglightlevel : floorlightlevel, FakeSide, foggy, GetColorTable(frontsector->Colormap, frontsector->SpecialColors[sector_t::sprites], true)); // [RH] Add particles - if ((unsigned int)(sub->Index()) < level.subsectors.Size()) + if ((unsigned int)(sub->Index()) < Level->subsectors.Size()) { // Only do it for the main BSP. int lightlevel = (floorlightlevel + ceilinglightlevel) / 2; for (int i = ParticlesInSubsec[sub->Index()]; i != NO_PARTICLE; i = Particles[i].snext) @@ -817,21 +818,21 @@ namespace swrenderer } } - void RenderOpaquePass::RenderScene() + void RenderOpaquePass::RenderScene(FLevelLocals *Level) { if (Thread->MainThread) WallCycles.Clock(); for (uint32_t sub : PvsSubsectors) SubsectorDepths[sub] = 0xffffffff; - SubsectorDepths.resize(level.subsectors.Size(), 0xffffffff); + SubsectorDepths.resize(Level->subsectors.Size(), 0xffffffff); PvsSubsectors.clear(); SeenSpriteSectors.clear(); SeenActors.clear(); InSubsector = nullptr; - RenderBSPNode(level.HeadNode()); // The head node is the last node output. + RenderBSPNode(Level->HeadNode()); // The head node is the last node output. if (Thread->MainThread) WallCycles.Unclock(); @@ -845,9 +846,9 @@ namespace swrenderer void RenderOpaquePass::RenderBSPNode(void *node) { - if (level.nodes.Size() == 0) + if (Thread->Viewport->Level()->nodes.Size() == 0) { - RenderSubsector(&level.subsectors[0]); + RenderSubsector(&Thread->Viewport->Level()->subsectors[0]); return; } while (!((size_t)node & 1)) // Keep going until found a subsector diff --git a/src/swrenderer/scene/r_opaque_pass.h b/src/swrenderer/scene/r_opaque_pass.h index a02b1d6dd..4bd18bdd7 100644 --- a/src/swrenderer/scene/r_opaque_pass.h +++ b/src/swrenderer/scene/r_opaque_pass.h @@ -64,7 +64,7 @@ namespace swrenderer RenderOpaquePass(RenderThread *thread); void ClearClip(); - void RenderScene(); + void RenderScene(FLevelLocals *Level); void ResetFakingUnderwater() { r_fakingunderwater = false; } sector_t *FakeFlat(sector_t *sec, sector_t *tempsec, int *floorlightlevel, int *ceilinglightlevel, seg_t *backline, int backx1, int backx2, double frontcz1, double frontcz2); diff --git a/src/swrenderer/scene/r_portal.cpp b/src/swrenderer/scene/r_portal.cpp index 61fc4fc3a..d78930e41 100644 --- a/src/swrenderer/scene/r_portal.cpp +++ b/src/swrenderer/scene/r_portal.cpp @@ -167,8 +167,10 @@ namespace swrenderer continue; } + auto Level = Thread->Viewport->Level(); + SetInSkyBox(port); - if (port->mPartner > 0) SetInSkyBox(&level.sectorPortals[port->mPartner]); + if (port->mPartner > 0) SetInSkyBox(&Level->sectorPortals[port->mPartner]); Thread->Viewport->viewpoint.camera = nullptr; Thread->Viewport->viewpoint.sector = port->mDestination; assert(Thread->Viewport->viewpoint.sector != nullptr); @@ -221,12 +223,12 @@ namespace swrenderer memcpy(draw_segment->sprtopclip, ceilingclip + pl->left, (pl->right - pl->left) * sizeof(short)); drawseglist->Push(draw_segment); - Thread->OpaquePass->RenderScene(); + Thread->OpaquePass->RenderScene(Thread->Viewport->Level()); Thread->Clip3D->ResetClip(); // reset clips (floor/ceiling) planes->Render(); ClearInSkyBox(port); - if (port->mPartner > 0) SetInSkyBox(&level.sectorPortals[port->mPartner]); + if (port->mPartner > 0) SetInSkyBox(&Level->sectorPortals[port->mPartner]); } // Draw all the masked textures in a second pass, in the reverse order they @@ -438,7 +440,7 @@ namespace swrenderer memcpy(ceilingclip + pds->x1, &pds->ceilingclip[0], pds->len * sizeof(*ceilingclip)); memcpy(floorclip + pds->x1, &pds->floorclip[0], pds->len * sizeof(*floorclip)); - Thread->OpaquePass->RenderScene(); + Thread->OpaquePass->RenderScene(Thread->Viewport->Level()); Thread->Clip3D->ResetClip(); // reset clips (floor/ceiling) if (!savedvisibility && viewpoint.camera) viewpoint.camera->renderflags &= ~RF_INVISIBLE; diff --git a/src/swrenderer/scene/r_scene.cpp b/src/swrenderer/scene/r_scene.cpp index c8baa1d4e..0678607a2 100644 --- a/src/swrenderer/scene/r_scene.cpp +++ b/src/swrenderer/scene/r_scene.cpp @@ -292,7 +292,7 @@ namespace swrenderer if (thread->X2 < viewwidth) thread->ClipSegments->Clip(thread->X2, viewwidth, true, &visitor); - thread->OpaquePass->RenderScene(); + thread->OpaquePass->RenderScene(thread->Viewport->Level()); thread->Clip3D->ResetClip(); // reset clips (floor/ceiling) if (thread->MainThread) diff --git a/src/swrenderer/things/r_model.cpp b/src/swrenderer/things/r_model.cpp index c7cda6025..6dca4cbf3 100644 --- a/src/swrenderer/things/r_model.cpp +++ b/src/swrenderer/things/r_model.cpp @@ -273,10 +273,11 @@ namespace swrenderer { // Calculate the WorldToView matrix as it would have looked like without yshearing: const auto &Viewpoint = Thread->Viewport->viewpoint; + auto Level = Thread->Viewport->Level(); const auto &Viewwindow = Thread->Viewport->viewwindow; double radPitch = Viewpoint.Angles.Pitch.Normalized180().Radians(); double angx = cos(radPitch); - double angy = sin(radPitch) * level.info->pixelstretch; + double angy = sin(radPitch) * Level->info->pixelstretch; double alen = sqrt(angx*angx + angy*angy); float adjustedPitch = (float)asin(angy / alen); float adjustedViewAngle = (float)(Viewpoint.Angles.Yaw - 90).Radians(); @@ -286,7 +287,7 @@ namespace swrenderer Mat4f altWorldToView = Mat4f::Rotate(adjustedPitch, 1.0f, 0.0f, 0.0f) * Mat4f::Rotate(adjustedViewAngle, 0.0f, -1.0f, 0.0f) * - Mat4f::Scale(1.0f, level.info->pixelstretch, 1.0f) * + Mat4f::Scale(1.0f, Level->info->pixelstretch, 1.0f) * Mat4f::SwapYZ() * Mat4f::Translate((float)-Viewpoint.Pos.X, (float)-Viewpoint.Pos.Y, (float)-Viewpoint.Pos.Z); diff --git a/src/swrenderer/things/r_particle.cpp b/src/swrenderer/things/r_particle.cpp index 07d460b42..ed961da96 100644 --- a/src/swrenderer/things/r_particle.cpp +++ b/src/swrenderer/things/r_particle.cpp @@ -79,7 +79,7 @@ namespace swrenderer sector_t* heightsec = NULL; double timefrac = r_viewpoint.TicFrac; - if (paused || bglobal.freeze || (level.flags2 & LEVEL2_FROZEN)) + if (paused || bglobal.freeze || (sector->Level->flags2 & LEVEL2_FROZEN)) timefrac = 0.; double ippx = particle->Pos.X + particle->Vel.X * timefrac; diff --git a/src/swrenderer/things/r_playersprite.cpp b/src/swrenderer/things/r_playersprite.cpp index fd1b8adf8..812d2df37 100644 --- a/src/swrenderer/things/r_playersprite.cpp +++ b/src/swrenderer/things/r_playersprite.cpp @@ -134,7 +134,8 @@ namespace swrenderer } // [RH] set foggy flag - bool foggy = (level.fadeto || basecolormap->Fade || (level.flags & LEVEL_HASFADETABLE)); + auto Level = Thread->Viewport->Level(); + bool foggy = (Level->fadeto || basecolormap->Fade || (Level->flags & LEVEL_HASFADETABLE)); // get light level int lightlevel = (floorlight + ceilinglight) >> 1; diff --git a/src/swrenderer/things/r_visiblespritelist.cpp b/src/swrenderer/things/r_visiblespritelist.cpp index f6181b506..108fdb1c7 100644 --- a/src/swrenderer/things/r_visiblespritelist.cpp +++ b/src/swrenderer/things/r_visiblespritelist.cpp @@ -110,9 +110,10 @@ namespace swrenderer uint32_t VisibleSpriteList::FindSubsectorDepth(RenderThread *thread, const DVector2 &worldPos) { - if (level.nodes.Size() == 0) + auto Level = thread->Viewport->Level(); + if (Level->nodes.Size() == 0) { - subsector_t *sub = &level.subsectors[0]; + subsector_t *sub = &Level->subsectors[0]; return thread->OpaquePass->GetSubsectorDepth(sub->Index()); } else diff --git a/src/swrenderer/viewport/r_viewport.cpp b/src/swrenderer/viewport/r_viewport.cpp index e3cfc1548..2e39b1d3d 100644 --- a/src/swrenderer/viewport/r_viewport.cpp +++ b/src/swrenderer/viewport/r_viewport.cpp @@ -135,7 +135,7 @@ namespace swrenderer virtwidth = virtwidth * AspectMultiplier(viewwindow.WidescreenRatio) / 48; } - double ypixelstretch = (level.info) ? level.info->pixelstretch : 1.2; + double ypixelstretch = (Level()->info) ? Level()->info->pixelstretch : 1.2; BaseYaspectMul = 320.0 * virtheight2 / (r_Yaspect * virtwidth2); YaspectMul = 320.0 * virtheight / (r_Yaspect * virtwidth) * ypixelstretch / 1.2; diff --git a/src/swrenderer/viewport/r_viewport.h b/src/swrenderer/viewport/r_viewport.h index 69adc5778..93400f3e4 100644 --- a/src/swrenderer/viewport/r_viewport.h +++ b/src/swrenderer/viewport/r_viewport.h @@ -5,6 +5,7 @@ #include #include "v_video.h" #include "r_defs.h" +#include "actorinlines.h" #include "polyrenderer/math/gpu_types.h" #define MINZ double((2048*4) / double(1 << 20)) @@ -80,6 +81,11 @@ namespace swrenderer return (CenterY - screenY - 0.5) / FocalLengthY * viewZ; } + FLevelLocals *Level() + { + return viewpoint.ViewLevel; + } + private: void InitTextureMapping(); void SetupBuffer(); From 06ba8c4c0004517743cd10ab1ba1441c3c602982 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 27 Jan 2019 17:35:50 +0100 Subject: [PATCH 043/164] - 50 more simple replacements of 'level' --- src/g_levellocals.h | 10 +++--- src/p_3dmidtex.cpp | 31 ++++++++++--------- src/p_doors.cpp | 4 +-- src/p_interaction.cpp | 23 +++++++------- src/p_linkedsectors.cpp | 14 +++++---- src/p_sight.cpp | 2 +- src/p_spec.cpp | 8 +++-- src/p_switch.cpp | 2 +- src/swrenderer/things/r_visiblespritelist.cpp | 2 +- 9 files changed, 50 insertions(+), 46 deletions(-) diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 9bf138635..20542b966 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -509,27 +509,27 @@ inline FSectorPortal *line_t::GetTransferredPortal() inline FSectorPortal *sector_t::GetPortal(int plane) { - return &level.sectorPortals[Portals[plane]]; + return &Level->sectorPortals[Portals[plane]]; } inline double sector_t::GetPortalPlaneZ(int plane) { - return level.sectorPortals[Portals[plane]].mPlaneZ; + return Level->sectorPortals[Portals[plane]].mPlaneZ; } inline DVector2 sector_t::GetPortalDisplacement(int plane) { - return level.sectorPortals[Portals[plane]].mDisplacement; + return Level->sectorPortals[Portals[plane]].mDisplacement; } inline int sector_t::GetPortalType(int plane) { - return level.sectorPortals[Portals[plane]].mType; + return Level->sectorPortals[Portals[plane]].mType; } inline int sector_t::GetOppositePortalGroup(int plane) { - return level.sectorPortals[Portals[plane]].mDestination->PortalGroup; + return Level->sectorPortals[Portals[plane]].mDestination->PortalGroup; } inline bool sector_t::PortalBlocksView(int plane) diff --git a/src/p_3dmidtex.cpp b/src/p_3dmidtex.cpp index 81fb56c0e..64485522c 100644 --- a/src/p_3dmidtex.cpp +++ b/src/p_3dmidtex.cpp @@ -119,15 +119,16 @@ void P_Attach3dMidtexLinesToSector(sector_t *sector, int lineid, int tag, bool c // invalid set of parameters return; } + auto Level = sector->Level; 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. - uint8_t *found_lines = new uint8_t[(level.lines.Size()+7)/8]; - uint8_t *found_sectors = new uint8_t[(level.sectors.Size()+7)/8]; + uint8_t *found_lines = new uint8_t[(Level->lines.Size()+7)/8]; + uint8_t *found_sectors = new uint8_t[(Level->sectors.Size()+7)/8]; - memset(found_lines, 0, sizeof (uint8_t) * ((level.lines.Size()+7)/8)); - memset(found_sectors, 0, sizeof (uint8_t) * ((level.sectors.Size()+7)/8)); + memset(found_lines, 0, sizeof (uint8_t) * ((Level->lines.Size()+7)/8)); + memset(found_sectors, 0, sizeof (uint8_t) * ((Level->sectors.Size()+7)/8)); // mark all lines and sectors that are already attached to this one // and clear the arrays. The old data will be re-added automatically @@ -149,11 +150,11 @@ void P_Attach3dMidtexLinesToSector(sector_t *sector, int lineid, int tag, bool c if (tag == 0) { - auto itr = level.GetLineIdIterator(lineid); + auto itr = Level->GetLineIdIterator(lineid); int line; while ((line = itr.Next()) >= 0) { - line_t *ln = &level.lines[line]; + line_t *ln = &Level->lines[line]; if (ln->frontsector == NULL || ln->backsector == NULL || !(ln->flags & ML_3DMIDTEX)) { @@ -165,13 +166,13 @@ void P_Attach3dMidtexLinesToSector(sector_t *sector, int lineid, int tag, bool c } else { - auto it = level.GetSectorTagIterator(tag); + auto it = Level->GetSectorTagIterator(tag); int sec; while ((sec = it.Next()) >= 0) { - for (auto ln : level.sectors[sec].Lines) + for (auto ln : Level->sectors[sec].Lines) { - if (lineid != 0 && !level.LineHasId(ln, lineid)) continue; + if (lineid != 0 && !Level->LineHasId(ln, lineid)) continue; if (ln->frontsector == NULL || ln->backsector == NULL || !(ln->flags & ML_3DMIDTEX)) { @@ -185,28 +186,28 @@ void P_Attach3dMidtexLinesToSector(sector_t *sector, int lineid, int tag, bool c } - for(unsigned i=0; i < level.lines.Size(); i++) + for(unsigned i=0; i < Level->lines.Size(); i++) { if (found_lines[i>>3] & (1 << (i&7))) { - auto &line = level.lines[i]; + auto &line = Level->lines[i]; scrollplane.AttachedLines.Push(&line); v = line.frontsector->Index(); - assert(v < (int)level.sectors.Size()); + assert(v < (int)Level->sectors.Size()); found_sectors[v>>3] |= 1 << (v&7); v = line.backsector->Index(); - assert(v < (int)level.sectors.Size()); + assert(v < (int)Level->sectors.Size()); found_sectors[v>>3] |= 1 << (v&7); } } - for (unsigned i=0; i < level.sectors.Size(); i++) + for (unsigned i=0; i < Level->sectors.Size(); i++) { if (found_sectors[i>>3] & (1 << (i&7))) { - scrollplane.AttachedSectors.Push(&level.sectors[i]); + scrollplane.AttachedSectors.Push(&Level->sectors[i]); } } diff --git a/src/p_doors.cpp b/src/p_doors.cpp index a0bc8af66..00b4f214e 100644 --- a/src/p_doors.cpp +++ b/src/p_doors.cpp @@ -132,7 +132,7 @@ void DDoor::Tick () // killough 10/98: implement gradual lighting effects if (m_LightTag != 0 && m_TopDist != -m_Sector->floorplane.fD()) { - level.EV_LightTurnOnPartway (m_LightTag, + Level->EV_LightTurnOnPartway (m_LightTag, (m_Sector->ceilingplane.fD() + m_Sector->floorplane.fD()) / (m_TopDist + m_Sector->floorplane.fD())); } @@ -178,7 +178,7 @@ void DDoor::Tick () // killough 10/98: implement gradual lighting effects if (m_LightTag != 0 && m_TopDist != -m_Sector->floorplane.fD()) { - level.EV_LightTurnOnPartway (m_LightTag, + Level->EV_LightTurnOnPartway (m_LightTag, (m_Sector->ceilingplane.fD() + m_Sector->floorplane.fD()) / (m_TopDist + m_Sector->floorplane.fD())); } diff --git a/src/p_interaction.cpp b/src/p_interaction.cpp index ec2854c6a..a4916e5cf 100644 --- a/src/p_interaction.cpp +++ b/src/p_interaction.cpp @@ -352,7 +352,7 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOf // [JM] Fire KILL type scripts for actor. Not needed for players, since they have the "DEATH" script type. if (!player && !(flags7 & MF7_NOKILLSCRIPTS) && ((flags7 & MF7_USEKILLSCRIPTS) || gameinfo.forcekillscripts)) { - level.Behaviors.StartTypedScripts(SCRIPT_Kill, this, true, 0, true); + Level->Behaviors.StartTypedScripts(SCRIPT_Kill, this, true, 0, true); } flags &= ~(MF_SHOOTABLE|MF_FLOAT|MF_SKULLFLY); @@ -387,7 +387,7 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOf } if (CountsAsKill()) - level.killed_monsters++; + Level->killed_monsters++; if (source && source->player) { @@ -399,7 +399,7 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOf // Don't count any frags at level start, because they're just telefrags // resulting from insufficient deathmatch starts, and it wouldn't be // fair to count them toward a player's score. - if (player && level.maptime) + if (player && Level->maptime) { source->player->frags[player - players]++; if (player == source->player) // [RH] Cumulative frag count @@ -492,7 +492,7 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOf source->player->multicount++; if (source->player->lastkilltime > 0) { - if (source->player->lastkilltime < level.time - 3*TICRATE) + if (source->player->lastkilltime < Level->time - 3*TICRATE) { source->player->multicount = 1; } @@ -535,7 +535,7 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOf } } } - source->player->lastkilltime = level.time; + source->player->lastkilltime = Level->time; } // [RH] Implement fraglimit @@ -563,10 +563,10 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOf E_PlayerDied(int(player - players)); // Death script execution, care of Skull Tag - level.Behaviors.StartTypedScripts (SCRIPT_Death, this, true); + Level->Behaviors.StartTypedScripts (SCRIPT_Death, this, true); // [RH] Force a delay between death and respawn - player->respawn_time = level.time + TICRATE; + player->respawn_time = Level->time + TICRATE; //Added by MC: Respawn bots if (bglobal.botnum && !demoplayback) @@ -617,8 +617,7 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOf } // [RH] If this is the unmorphed version of another monster, destroy this - // actor, because the morphed version is the one that will stick around in - // the level. + // actor, because the morphed version is the one that will stick around. if (flags & MF_UNMORPHED) { Destroy (); @@ -1247,7 +1246,7 @@ static int DamageMobj (AActor *target, AActor *inflictor, AActor *source, int da //Use the original damage to check for telefrag amount. Don't let the now-amplified damagetypes do it. if (!telefragDamage || (target->flags7 & MF7_LAXTELEFRAGDMG)) { // Still allow telefragging :-( - damage = (int)(damage * level.teamdamage); + damage = (int)(damage * target->Level->teamdamage); if (damage <= 0) { return (damage < 0) ? -1 : 0; @@ -1681,7 +1680,7 @@ bool P_PoisonPlayer (player_t *player, AActor *poisoner, AActor *source, int poi } if (source != NULL && source->player != player && player->mo->IsTeammate (source)) { - poison = (int)(poison * level.teamdamage); + poison = (int)(poison * player->mo->Level->teamdamage); } if (poison > 0) { @@ -1802,7 +1801,7 @@ void P_PoisonDamage (player_t *player, AActor *source, int damage, bool playPain return; } } - if (!(level.time&63) && playPainSound) + if (!(target->Level->time&63) && playPainSound) { FState *painstate = target->FindState(NAME_Pain, player->poisonpaintype); if (painstate != NULL) diff --git a/src/p_linkedsectors.cpp b/src/p_linkedsectors.cpp index f50c68b60..5d327643e 100644 --- a/src/p_linkedsectors.cpp +++ b/src/p_linkedsectors.cpp @@ -288,7 +288,8 @@ static void RemoveTaggedSectors(extsector_t::linked::plane &scrollplane, int tag { for(int i = scrollplane.Sectors.Size()-1; i>=0; i--) { - if (level.SectorHasTag(scrollplane.Sectors[i].Sector, tag)) + auto sec = scrollplane.Sectors[i].Sector; + if (sec->Level->SectorHasTag(sec, tag)) { scrollplane.Sectors.Delete(i); } @@ -313,6 +314,7 @@ bool P_AddSectorLinks(sector_t *control, int tag, INTBOOL ceiling, int movetype) if ((ceiling && control->PlaneMoving(sector_t::ceiling)) || (!ceiling && control->PlaneMoving(sector_t::floor))) return false; + auto Level = control->Level; // Make sure we have only valid combinations movetype &= LINK_FLAGMASK; if ((movetype & LINK_FLOORMIRROR) == LINK_FLOORMIRRORFLAG) movetype &= ~LINK_FLOORMIRRORFLAG; @@ -327,16 +329,16 @@ bool P_AddSectorLinks(sector_t *control, int tag, INTBOOL ceiling, int movetype) if (movetype > 0) { int sec; - auto itr = level.GetSectorTagIterator(tag); + auto itr = Level->GetSectorTagIterator(tag); while ((sec = itr.Next()) >= 0) { // Don't attach to self (but allow attaching to this sector's oposite plane. - if (control == &level.sectors[sec]) + if (control == &Level->sectors[sec]) { if (ceiling == sector_t::floor && movetype & LINK_FLOOR) continue; if (ceiling == sector_t::ceiling && movetype & LINK_CEILING) continue; } - AddSingleSector(scrollplane, &level.sectors[sec], movetype); + AddSingleSector(scrollplane, &Level->sectors[sec], movetype); } } else @@ -360,11 +362,11 @@ void P_AddSectorLinksByID(sector_t *control, int id, INTBOOL ceiling) { extsector_t::linked::plane &scrollplane = ceiling? control->e->Linked.Ceiling : control->e->Linked.Floor; - auto itr = level.GetLineIdIterator(id); + auto itr = control->Level->GetLineIdIterator(id); int line; while ((line = itr.Next()) >= 0) { - line_t *ld = &level.lines[line]; + line_t *ld = &control->Level->lines[line]; if (ld->special == Static_Init && ld->args[1] == Init_SectorLink) { diff --git a/src/p_sight.cpp b/src/p_sight.cpp index fd85a9a08..41ecd23e8 100644 --- a/src/p_sight.cpp +++ b/src/p_sight.cpp @@ -857,7 +857,7 @@ int P_CheckSight (AActor *t1, AActor *t2, int flags) // // check for trivial rejection // - if (!level.CheckReject(s1, s2)) + if (!t1->Level->CheckReject(s1, s2)) { sightcounts[0]++; res = false; // can't possibly be connected diff --git a/src/p_spec.cpp b/src/p_spec.cpp index 0c81a2de0..f60e61468 100644 --- a/src/p_spec.cpp +++ b/src/p_spec.cpp @@ -164,6 +164,8 @@ bool P_ActivateLine (line_t *line, AActor *mo, int side, int activationType, DVe return false; } + auto Level = line->GetLevel(); + // [MK] Use WorldLinePreActivated to decide if activation should continue bool shouldactivate = true; E_WorldLinePreActivated(line, mo, activationType, &shouldactivate); @@ -198,13 +200,13 @@ bool P_ActivateLine (line_t *line, AActor *mo, int side, int activationType, DVe } // some old WADs use this method to create walls that change the texture when shot. else if (activationType == SPAC_Impact && // only for shootable triggers - (level.flags2 & LEVEL2_DUMMYSWITCHES) && // this is only a compatibility setting for an old hack! + (Level->flags2 & LEVEL2_DUMMYSWITCHES) && // this is only a compatibility setting for an old hack! !repeat && // only non-repeatable triggers (specialGeneric_Crusher) && // not for Boom's generalized linedefs special && // not for lines without a special - level.LineHasId(line, line->args[0]) && // Safety check: exclude edited UDMF linedefs or ones that don't map the tag to args[0] + Level->LineHasId(line, line->args[0]) && // Safety check: exclude edited UDMF linedefs or ones that don't map the tag to args[0] line->args[0] && // only if there's a tag (which is stored in the first arg) - level.FindFirstSectorFromTag (line->args[0]) == -1) // only if no sector is tagged to this linedef + Level->FindFirstSectorFromTag (line->args[0]) == -1) // only if no sector is tagged to this linedef { P_ChangeSwitchTexture (line->sidedef[0], repeat, special); line->special = 0; diff --git a/src/p_switch.cpp b/src/p_switch.cpp index ac58e8cc0..667ff1e3e 100644 --- a/src/p_switch.cpp +++ b/src/p_switch.cpp @@ -97,7 +97,7 @@ static bool P_StartButton (side_t *side, int Where, FSwitchDef *Switch, const DV } } - level.CreateThinker (side, Where, Switch, pos, useagain); + side->sector->Level->CreateThinker (side, Where, Switch, pos, useagain); return true; } diff --git a/src/swrenderer/things/r_visiblespritelist.cpp b/src/swrenderer/things/r_visiblespritelist.cpp index 108fdb1c7..8c3935a4b 100644 --- a/src/swrenderer/things/r_visiblespritelist.cpp +++ b/src/swrenderer/things/r_visiblespritelist.cpp @@ -118,7 +118,7 @@ namespace swrenderer } else { - return FindSubsectorDepth(thread, worldPos, level.HeadNode()); + return FindSubsectorDepth(thread, worldPos, Level->HeadNode()); } } From b4a95ccaa992db45b7a9c703506c9f655ee3fda4 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 27 Jan 2019 19:16:14 +0100 Subject: [PATCH 044/164] - roughly 50 more, mostly search and replace. --- src/g_level.cpp | 5 ---- src/g_levellocals.h | 2 ++ src/g_shared/a_action.cpp | 4 +-- src/g_shared/a_dynlight.cpp | 21 ++++++++------- src/g_shared/a_dynlight.h | 1 + src/g_shared/a_lightning.cpp | 38 +++++++++++++-------------- src/g_shared/a_lightning.h | 2 -- src/p_lnspec.cpp | 2 +- src/p_map.cpp | 26 +++++++++--------- src/p_setup.cpp | 7 +++++ src/scripting/thingdef_properties.cpp | 13 ++++----- src/scripting/vmthunks.cpp | 18 ++++++++----- 12 files changed, 74 insertions(+), 65 deletions(-) diff --git a/src/g_level.cpp b/src/g_level.cpp index 727abc4d0..aca407802 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1023,11 +1023,6 @@ void G_DoLoadLevel (int position, bool autosave, bool newGame) P_SetupLevel (&level, position, newGame); - // [RH] Start lightning, if MAPINFO tells us to - if (level.flags & LEVEL_STARTLIGHTNING) - { - P_StartLightning (); - } gameaction = ga_nothing; diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 20542b966..ac416ee70 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -207,6 +207,8 @@ public: AActor *SpawnMapThing(FMapThing *mthing, int position); AActor *SpawnMapThing(int index, FMapThing *mt, int position); AActor *SpawnPlayer(FPlayerStart *mthing, int playernum, int flags); + void StartLightning(); + void ForceLightning(int mode); bool EV_DoPlat(int tag, line_t *line, DPlat::EPlatType type, double height, double speed, int delay, int lip, int change); void EV_StopPlat(int tag, bool remove); diff --git a/src/g_shared/a_action.cpp b/src/g_shared/a_action.cpp index 99814cdf8..43500b7c5 100644 --- a/src/g_shared/a_action.cpp +++ b/src/g_shared/a_action.cpp @@ -111,7 +111,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_QueueCorpse) if (sv_corpsequeuesize > 0) { - auto &corpsequeue = level.CorpseQueue; + auto &corpsequeue = self->Level->CorpseQueue; while (corpsequeue.Size() >= (unsigned)sv_corpsequeuesize) { AActor *corpse = corpsequeue[0]; @@ -128,7 +128,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_DeQueueCorpse) { PARAM_SELF_PROLOGUE(AActor); - auto &corpsequeue = level.CorpseQueue; + auto &corpsequeue = self->Level->CorpseQueue; auto index = corpsequeue.FindEx([=](auto &element) { return element == self; }); if (index < corpsequeue.Size()) { diff --git a/src/g_shared/a_dynlight.cpp b/src/g_shared/a_dynlight.cpp index 1510fc834..07e245983 100644 --- a/src/g_shared/a_dynlight.cpp +++ b/src/g_shared/a_dynlight.cpp @@ -100,7 +100,7 @@ DEFINE_CLASS_PROPERTY(type, S, DynamicLight) // //========================================================================== -static FDynamicLight *GetLight() +static FDynamicLight *GetLight(FLevelLocals *Level) { FDynamicLight *ret; if (FreeList.Size()) @@ -109,11 +109,12 @@ static FDynamicLight *GetLight() } else ret = (FDynamicLight*)DynLightArena.Alloc(sizeof(FDynamicLight)); memset(ret, 0, sizeof(*ret)); - ret->next = level.lights; - level.lights = ret; + ret->next = Level->lights; + Level->lights = ret; if (ret->next) ret->next->prev = ret; ret->visibletoplayer = true; ret->mShadowmapIndex = 1024; + ret->Level = Level; ret->Pos.X = -10000000; // not a valid coordinate. return ret; } @@ -128,7 +129,7 @@ static FDynamicLight *GetLight() void AttachLight(AActor *self) { - auto light = GetLight(); + auto light = GetLight(self->Level); light->pSpotInnerAngle = &self->AngleVar(NAME_SpotInnerAngle); light->pSpotOuterAngle = &self->AngleVar(NAME_SpotOuterAngle); @@ -221,9 +222,9 @@ DEFINE_ACTION_FUNCTION_NATIVE(ADynamicLight, SetOffset, SetOffset) void FDynamicLight::ReleaseLight() { - assert(prev != nullptr || this == level.lights); + assert(prev != nullptr || this == Level->lights); if (prev != nullptr) prev->next = next; - else level.lights = next; + else Level->lights = next; if (next != nullptr) next->prev = prev; next = prev = nullptr; FreeList.Push(this); @@ -245,7 +246,7 @@ void FDynamicLight::Activate() { float pulseTime = float(specialf1 / TICRATE); - m_lastUpdate = level.maptime; + m_lastUpdate = Level->maptime; if (!swapped) m_cycler.SetParams(float(GetSecondaryIntensity()), float(GetIntensity()), pulseTime); else m_cycler.SetParams(float(GetIntensity()), float(GetSecondaryIntensity()), pulseTime); m_cycler.ShouldCycle(true); @@ -294,9 +295,9 @@ void FDynamicLight::Tick() { case PulseLight: { - float diff = (level.maptime - m_lastUpdate) / (float)TICRATE; + float diff = (Level->maptime - m_lastUpdate) / (float)TICRATE; - m_lastUpdate = level.maptime; + m_lastUpdate = Level->maptime; m_cycler.Update(diff); m_currentRadius = float(m_cycler.GetVal()); break; @@ -760,7 +761,7 @@ void AActor::AttachLight(unsigned int count, const FLightDefaults *lightdef) } else { - light = GetLight(); + light = GetLight(Level); light->SetActor(this, true); AttachedLights.Push(light); } diff --git a/src/g_shared/a_dynlight.h b/src/g_shared/a_dynlight.h index 7b0c47956..f0f287ef6 100644 --- a/src/g_shared/a_dynlight.h +++ b/src/g_shared/a_dynlight.h @@ -233,6 +233,7 @@ public: double specialf1; FDynamicLight *next, *prev; sector_t *Sector; + FLevelLocals *Level; TObjPtr target; FLightNode * touching_sides; FLightNode * touching_sector; diff --git a/src/g_shared/a_lightning.cpp b/src/g_shared/a_lightning.cpp index 27af34e6e..e1610e6ee 100644 --- a/src/g_shared/a_lightning.cpp +++ b/src/g_shared/a_lightning.cpp @@ -47,7 +47,7 @@ void DLightningThinker::Construct() LightningFlashCount = 0; NextLightningFlash = ((pr_lightning()&15)+5)*35; // don't flash at level start - LightningLightLevels.Resize(level.sectors.Size()); + LightningLightLevels.Resize(Level->sectors.Size()); fillshort(&LightningLightLevels[0], LightningLightLevels.Size(), SHRT_MAX); } @@ -88,8 +88,8 @@ void DLightningThinker::LightningFlash () LightningFlashCount--; if (LightningFlashCount) { // reduce the brightness of the flash - tempSec = &level.sectors[0]; - for (i = level.sectors.Size(), j = 0; i > 0; ++j, --i, ++tempSec) + tempSec = &Level->sectors[0]; + for (i = Level->sectors.Size(), j = 0; i > 0; ++j, --i, ++tempSec) { // [RH] Checking this sector's applicability to lightning now // is not enough to know if we should lower its light level, @@ -104,24 +104,24 @@ void DLightningThinker::LightningFlash () } else { // remove the alternate lightning flash special - tempSec = &level.sectors[0]; - for (i = level.sectors.Size(), j = 0; i > 0; ++j, --i, ++tempSec) + tempSec = &Level->sectors[0]; + for (i = Level->sectors.Size(), j = 0; i > 0; ++j, --i, ++tempSec) { if (LightningLightLevels[j] != SHRT_MAX) { tempSec->SetLightLevel(LightningLightLevels[j]); } } - fillshort(&LightningLightLevels[0], level.sectors.Size(), SHRT_MAX); - level.flags &= ~LEVEL_SWAPSKIES; + fillshort(&LightningLightLevels[0], Level->sectors.Size(), SHRT_MAX); + Level->flags &= ~LEVEL_SWAPSKIES; } return; } LightningFlashCount = (pr_lightning()&7)+8; flashLight = 200+(pr_lightning()&31); - tempSec = &level.sectors[0]; - for (i = level.sectors.Size(), j = 0; i > 0; ++j, --i, ++tempSec) + tempSec = &Level->sectors[0]; + for (i = Level->sectors.Size(), j = 0; i > 0; ++j, --i, ++tempSec) { // allow combination of the lightning sector specials with bit masks int special = tempSec->special; @@ -151,12 +151,12 @@ void DLightningThinker::LightningFlash () } } - level.flags |= LEVEL_SWAPSKIES; // set alternate sky + Level->flags |= LEVEL_SWAPSKIES; // set alternate sky S_Sound (CHAN_AUTO, "world/thunder", 1.0, ATTN_NONE); // [ZZ] just in case E_WorldLightning(); // start LIGHTNING scripts - level.Behaviors.StartTypedScripts (SCRIPT_Lightning, NULL, false); // [RH] Run lightning scripts + Level->Behaviors.StartTypedScripts (SCRIPT_Lightning, NULL, false); // [RH] Run lightning scripts // Calculate the next lighting flash if (!NextLightningFlash) @@ -167,7 +167,7 @@ void DLightningThinker::LightningFlash () } else { - if (pr_lightning() < 128 && !(level.time&32)) + if (pr_lightning() < 128 && !(Level->time&32)) { NextLightningFlash = ((pr_lightning()&7)+2)*35; } @@ -202,16 +202,16 @@ static DLightningThinker *LocateLightning () return iterator.Next (); } -void P_StartLightning () +void FLevelLocals::StartLightning () { const bool isOriginalHexen = (gameinfo.gametype == GAME_Hexen) - && (level.flags2 & LEVEL2_HEXENHACK); + && (flags2 & LEVEL2_HEXENHACK); if (isOriginalHexen) { bool hasLightning = false; - for (const sector_t §or : level.sectors) + for (const sector_t §or : sectors) { hasLightning = sector.GetTexture(sector_t::ceiling) == skyflatnum || sector.special == Light_IndoorLightning1 @@ -225,7 +225,7 @@ void P_StartLightning () if (!hasLightning) { - level.flags &= ~LEVEL_STARTLIGHTNING; + flags &= ~LEVEL_STARTLIGHTNING; return; } } @@ -233,16 +233,16 @@ void P_StartLightning () DLightningThinker *lightning = LocateLightning (); if (lightning == nullptr) { - level.CreateThinker(); + CreateThinker(); } } -void P_ForceLightning (int mode) +void FLevelLocals::ForceLightning (int mode) { DLightningThinker *lightning = LocateLightning (); if (lightning == nullptr) { - lightning = level.CreateThinker(); + lightning = CreateThinker(); } if (lightning != nullptr) { diff --git a/src/g_shared/a_lightning.h b/src/g_shared/a_lightning.h index 13ebd2468..89992f620 100644 --- a/src/g_shared/a_lightning.h +++ b/src/g_shared/a_lightning.h @@ -28,7 +28,5 @@ protected: TArray LightningLightLevels; }; -void P_StartLightning (); -void P_ForceLightning (int mode); #endif //__A_LIGHTNING_H__ diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index aed5c8a32..a29580fb9 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -2069,7 +2069,7 @@ FUNC(LS_Elevator_LowerToNearest) FUNC(LS_Light_ForceLightning) // Light_ForceLightning (mode) { - P_ForceLightning (arg0); + Level->ForceLightning (arg0); return true; } diff --git a/src/p_map.cpp b/src/p_map.cpp index 9bfe40486..7fb261ce7 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -413,7 +413,7 @@ bool P_TeleportMove(AActor* thing, const DVector3 &pos, bool telefrag, bool modi spechit.Clear(); // this is needed so that no more specials get activated after crossing a teleporter. - bool StompAlwaysFrags = ((thing->flags2 & MF2_TELESTOMP) || (level.flags & LEVEL_MONSTERSTELEFRAG) || telefrag) && !(thing->flags7 & MF7_NOTELESTOMP); + bool StompAlwaysFrags = ((thing->flags2 & MF2_TELESTOMP) || (thing->Level->flags & LEVEL_MONSTERSTELEFRAG) || telefrag) && !(thing->flags7 & MF7_NOTELESTOMP); // P_LineOpening requires the thing's z to be the destination z in order to work. double savedz = thing->Z(); @@ -975,7 +975,7 @@ bool PIT_CheckLine(FMultiBlockLinesIterator &mit, FMultiBlockLinesIterator::Chec // better than Strife's handling of rails, which lets you jump into rails // from either side. How long until somebody reports this as a bug and I'm // forced to say, "It's not a bug. It's a feature?" Ugh. - (!(level.flags2 & LEVEL2_RAILINGHACK) || + (!(tm.thing->Level->flags2 & LEVEL2_RAILINGHACK) || open.bottom == tm.thing->Sector->floorplane.ZatPoint(ref))) { open.bottom += 32; @@ -1365,10 +1365,10 @@ bool PIT_CheckThing(FMultiBlockThingsIterator &it, FMultiBlockThingsIterator::Ch if ((thing->flags6 & MF6_BUMPSPECIAL) && ((tm.thing->player != NULL) || ((thing->activationtype & THINGSPEC_MonsterTrigger) && (tm.thing->flags3 & MF3_ISMONSTER)) || ((thing->activationtype & THINGSPEC_MissileTrigger) && (tm.thing->flags & MF_MISSILE)) - ) && (level.maptime > thing->lastbump)) // Leave the bumper enough time to go away + ) && (thing->Level->maptime > thing->lastbump)) // Leave the bumper enough time to go away { if (P_ActivateThingSpecial(thing, tm.thing)) - thing->lastbump = level.maptime + TICRATE; + thing->lastbump = thing->Level->maptime + TICRATE; } } @@ -2041,7 +2041,7 @@ void P_FakeZMovement(AActor *mo) } if (mo->player && mo->flags&MF_NOGRAVITY && (mo->Z() > mo->floorz) && !mo->IsNoClip2()) { - mo->AddZ(DAngle(4.5 * level.maptime).Sin()); + mo->AddZ(DAngle(4.5 * mo->Level->maptime).Sin()); } // @@ -2111,7 +2111,7 @@ static void CheckForPushSpecial(line_t *line, int side, AActor *mobj, DVector2 * } else if (mobj->flags2 & MF2_IMPACT) { - if ((level.flags2 & LEVEL2_MISSILESACTIVATEIMPACT) || + if ((mobj->Level->flags2 & LEVEL2_MISSILESACTIVATEIMPACT) || !(mobj->flags & MF_MISSILE) || (mobj->target == NULL)) { @@ -4269,7 +4269,7 @@ DAngle P_AimLineAttack(AActor *t1, DAngle angle, double distance, FTranslatedLin // can't shoot outside view angles if (vrange == 0) { - if (t1->player == NULL || !level.IsFreelookAllowed()) + if (t1->player == NULL || !t1->Level->IsFreelookAllowed()) { vrange = 35.; } @@ -4539,7 +4539,7 @@ AActor *P_LineAttack(AActor *t1, DAngle angle, double distance, // position a bit closer for puffs if (nointeract || trace.HitType != TRACE_HitWall || ((trace.Line->special != Line_Horizon) || spawnSky)) { - DVector2 pos = level.GetPortalOffsetPosition(trace.HitPos.X, trace.HitPos.Y, -trace.HitVector.X * 4, -trace.HitVector.Y * 4); + DVector2 pos = t1->Level->GetPortalOffsetPosition(trace.HitPos.X, trace.HitPos.Y, -trace.HitVector.X * 4, -trace.HitVector.Y * 4); puff = P_SpawnPuff(t1, pufftype, DVector3(pos, trace.HitPos.Z - trace.HitVector.Z * 4), trace.SrcAngleFromTarget, trace.SrcAngleFromTarget - 90, 0, puffFlags); puff->radius = 1/65536.; @@ -4590,7 +4590,7 @@ AActor *P_LineAttack(AActor *t1, DAngle angle, double distance, // position a bit closer for puffs/blood if using compatibility mode. if (i_compatflags & COMPATF_HITSCAN) { - DVector2 ofs = level.GetPortalOffsetPosition(bleedpos.X, bleedpos.Y, -10 * trace.HitVector.X, -10 * trace.HitVector.Y); + DVector2 ofs = t1->Level->GetPortalOffsetPosition(bleedpos.X, bleedpos.Y, -10 * trace.HitVector.X, -10 * trace.HitVector.Y); bleedpos.X = ofs.X; bleedpos.Y = ofs.Y; bleedpos.Z -= -10 * trace.HitVector.Z; @@ -5101,7 +5101,7 @@ static ETraceStatus ProcessRailHit(FTraceResults &res, void *userdata) newhit.HitAngle = res.SrcAngleFromTarget; if (i_compatflags & COMPATF_HITSCAN) { - DVector2 ofs = level.GetPortalOffsetPosition(newhit.HitPos.X, newhit.HitPos.Y, -10 * res.HitVector.X, -10 * res.HitVector.Y); + DVector2 ofs = res.Actor->Level->GetPortalOffsetPosition(newhit.HitPos.X, newhit.HitPos.Y, -10 * res.HitVector.X, -10 * res.HitVector.Y); newhit.HitPos.X = ofs.X; newhit.HitPos.Y = ofs.Y; newhit.HitPos.Z -= -10 * res.HitVector.Z; @@ -6167,7 +6167,7 @@ void P_DoCrunch(AActor *thing, FChangePosition *cpos) if (!(thing && thing->CallGrind(true) && cpos)) return; cpos->nofit = true; - if ((cpos->crushchange > 0) && !(level.maptime & 3)) + if ((cpos->crushchange > 0) && !(thing->Level->maptime & 3)) { int newdam = P_DamageMobj(thing, NULL, NULL, cpos->crushchange, NAME_Crush); @@ -6829,14 +6829,14 @@ bool P_ActivateThingSpecial(AActor * thing, AActor * trigger, bool death) { res = !!P_ExecuteSpecial(thing->special, NULL, // TriggerActs overrides the level flag, which only concerns thing activated by death - (((death && level.flags & LEVEL_ACTOWNSPECIAL && !(thing->activationtype & THINGSPEC_TriggerActs)) + (((death && thing->Level->flags & LEVEL_ACTOWNSPECIAL && !(thing->activationtype & THINGSPEC_TriggerActs)) || (thing->activationtype & THINGSPEC_ThingActs)) // Who triggers? ? thing : trigger), false, thing->args[0], thing->args[1], thing->args[2], thing->args[3], thing->args[4]); // Clears the special if it was run on thing's death or if flag is set. // Note that Hexen originally did not clear the special which some original maps depend on (e.g. the bell in HEXDD.) - if ((death && !(level.flags2 & LEVEL2_HEXENHACK)) || (thing->activationtype & THINGSPEC_ClearSpecial && res)) thing->special = 0; + if ((death && !(thing->Level->flags2 & LEVEL2_HEXENHACK)) || (thing->activationtype & THINGSPEC_ClearSpecial && res)) thing->special = 0; } // Returns the result diff --git a/src/p_setup.cpp b/src/p_setup.cpp index c4ddfa2be..311a7cb4e 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -551,6 +551,13 @@ void P_SetupLevel(FLevelLocals *Level, int position, bool newGame) Level->automap = AM_Create(Level); Level->automap->LevelInit(); + + // [RH] Start lightning, if MAPINFO tells us to + if (Level->flags & LEVEL_STARTLIGHTNING) + { + Level->StartLightning(); + } + } // diff --git a/src/scripting/thingdef_properties.cpp b/src/scripting/thingdef_properties.cpp index d494ff835..17a546a94 100644 --- a/src/scripting/thingdef_properties.cpp +++ b/src/scripting/thingdef_properties.cpp @@ -148,6 +148,7 @@ bool ModActorFlag(AActor *actor, const FString &flagname, bool set, bool printer if (actor != NULL) { + auto Level = actor->Level; const char *dot = strchr(flagname, '.'); FFlagDef *fd; PClassActor *cls = actor->GetClass(); @@ -166,9 +167,9 @@ bool ModActorFlag(AActor *actor, const FString &flagname, bool set, bool printer { found = true; - if (actor->CountsAsKill() && actor->health > 0) --level.total_monsters; - if (actor->flags & MF_COUNTITEM) --level.total_items; - if (actor->flags5 & MF5_COUNTSECRET) --level.total_secrets; + if (actor->CountsAsKill() && actor->health > 0) --Level->total_monsters; + if (actor->flags & MF_COUNTITEM) --Level->total_items; + if (actor->flags5 & MF5_COUNTSECRET) --Level->total_secrets; if (fd->structoffset == -1) { @@ -187,9 +188,9 @@ bool ModActorFlag(AActor *actor, const FString &flagname, bool set, bool printer if (linkchange) actor->LinkToWorld(&ctx); } - if (actor->CountsAsKill() && actor->health > 0) ++level.total_monsters; - if (actor->flags & MF_COUNTITEM) ++level.total_items; - if (actor->flags5 & MF5_COUNTSECRET) ++level.total_secrets; + if (actor->CountsAsKill() && actor->health > 0) ++Level->total_monsters; + if (actor->flags & MF_COUNTITEM) ++Level->total_items; + if (actor->flags5 & MF5_COUNTSECRET) ++Level->total_secrets; } else if (printerror) { diff --git a/src/scripting/vmthunks.cpp b/src/scripting/vmthunks.cpp index 0db6a86b9..bcd250c83 100644 --- a/src/scripting/vmthunks.cpp +++ b/src/scripting/vmthunks.cpp @@ -1166,7 +1166,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(_Sector, RemoveForceField, RemoveForceField) static void SetEnvironmentID(sector_t *self, int envnum) { - level.Zones[self->ZoneNumber].Environment = S_FindEnvironment(envnum); + self->Level->Zones[self->ZoneNumber].Environment = S_FindEnvironment(envnum); } DEFINE_ACTION_FUNCTION_NATIVE(_Sector, SetEnvironmentID, SetEnvironmentID) @@ -1179,7 +1179,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(_Sector, RemoveForceField, RemoveForceField) static void SetEnvironment(sector_t *self, const FString &env) { - level.Zones[self->ZoneNumber].Environment = S_FindEnvironment(env); + self->Level->Zones[self->ZoneNumber].Environment = S_FindEnvironment(env); } DEFINE_ACTION_FUNCTION_NATIVE(_Sector, SetEnvironment, SetEnvironment) @@ -2352,19 +2352,21 @@ DEFINE_ACTION_FUNCTION_NATIVE(DBaseStatusBar, SetClipRect, SBar_SetClipRect) static void GetGlobalACSString(int index, FString *result) { - *result = level.Behaviors.LookupString(ACS_GlobalVars[index]); + *result = currentUILevel->Behaviors.LookupString(ACS_GlobalVars[index]); } DEFINE_ACTION_FUNCTION_NATIVE(DBaseStatusBar, GetGlobalACSString, GetGlobalACSString) { PARAM_PROLOGUE; PARAM_INT(index); - ACTION_RETURN_STRING(level.Behaviors.LookupString(ACS_GlobalVars[index])); + FString res; + GetGlobalACSString(index, &res); + ACTION_RETURN_STRING(res); } static void GetGlobalACSArrayString(int arrayno, int index, FString *result) { - *result = level.Behaviors.LookupString(ACS_GlobalVars[index]); + *result = currentUILevel->Behaviors.LookupString(ACS_GlobalVars[index]); } DEFINE_ACTION_FUNCTION_NATIVE(DBaseStatusBar, GetGlobalACSArrayString, GetGlobalACSArrayString) @@ -2372,7 +2374,9 @@ DEFINE_ACTION_FUNCTION_NATIVE(DBaseStatusBar, GetGlobalACSArrayString, GetGlobal PARAM_PROLOGUE; PARAM_INT(arrayno); PARAM_INT(index); - ACTION_RETURN_STRING(level.Behaviors.LookupString(ACS_GlobalArrays[arrayno][index])); + FString res; + GetGlobalACSArrayString(arrayno, index, &res); + ACTION_RETURN_STRING(res); } static int GetGlobalACSValue(int index) @@ -2592,7 +2596,7 @@ DEFINE_ACTION_FUNCTION(FLevelLocals, GetChecksum) for (int j = 0; j < 16; ++j) { - sprintf(md5string + j * 2, "%02x", level.md5[j]); + sprintf(md5string + j * 2, "%02x", self->md5[j]); } ACTION_RETURN_STRING((const char*)md5string); From 4d98c10ea367e9532df801fc6d82b59353d5ccf4 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 27 Jan 2019 19:32:38 +0100 Subject: [PATCH 045/164] - let the sound code use the current UI level. This is what should be audible. To prevent other levels from playing sound, all entry points check whether the sound playing entity belongs to the current UI level. --- src/p_effect.cpp | 2 +- src/p_mobj.cpp | 4 ++-- src/p_switch.cpp | 4 ++-- src/r_defs.h | 5 ++++ src/s_sound.cpp | 61 +++++++++++++++++++++++++----------------------- src/s_sound.h | 3 ++- 6 files changed, 44 insertions(+), 35 deletions(-) diff --git a/src/p_effect.cpp b/src/p_effect.cpp index d6543b16e..c9e7d70d4 100644 --- a/src/p_effect.cpp +++ b/src/p_effect.cpp @@ -701,7 +701,7 @@ void P_DrawRailTrail(AActor *source, TArray &portalhits, int color1, { if (shortest == NULL || shortest->sounddist > seg.sounddist) shortest = &seg; } - S_Sound (DVector3(shortest->soundpos, r_viewpoint.Pos.Z), CHAN_WEAPON, sound, 1, ATTN_NORM); + S_Sound (source->Level, DVector3(shortest->soundpos, r_viewpoint.Pos.Z), CHAN_WEAPON, sound, 1, ATTN_NORM); } } } diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index e87760ae0..9a3b747cd 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -6058,7 +6058,7 @@ foundone: } else { - S_Sound(pos, CHAN_ITEM, smallsplash ? + S_Sound(thing->Level, pos, CHAN_ITEM, smallsplash ? splash->SmallSplashSound : splash->NormalSplashSound, 1, ATTN_IDLE); } @@ -6266,7 +6266,7 @@ void P_PlaySpawnSound(AActor *missile, AActor *spawner) // If there is no spawner use the spawn position. // But not in a silenced sector. if (!(missile->Sector->Flags & SECF_SILENT)) - S_Sound (missile->Pos(), CHAN_WEAPON, missile->SeeSound, 1, ATTN_NORM); + S_Sound (missile->Level, missile->Pos(), CHAN_WEAPON, missile->SeeSound, 1, ATTN_NORM); } } } diff --git a/src/p_switch.cpp b/src/p_switch.cpp index 667ff1e3e..918a76d60 100644 --- a/src/p_switch.cpp +++ b/src/p_switch.cpp @@ -302,7 +302,7 @@ bool P_ChangeSwitchTexture (side_t *side, int useAgain, uint8_t special, bool *q } if (playsound) { - S_Sound (DVector3(pt, 0), CHAN_VOICE|CHAN_LISTENERZ, sound, 1, ATTN_STATIC); + S_Sound (side->GetLevel(), DVector3(pt, 0), CHAN_VOICE|CHAN_LISTENERZ, sound, 1, ATTN_STATIC); } if (quest != NULL) { @@ -398,7 +398,7 @@ void DActiveButton::Tick () if (def != NULL) { m_Frame = -1; - S_Sound (DVector3(m_Pos, 0), CHAN_VOICE|CHAN_LISTENERZ, + S_Sound (Level, DVector3(m_Pos, 0), CHAN_VOICE|CHAN_LISTENERZ, def->Sound != 0 ? FSoundID(def->Sound) : FSoundID("switches/normbutn"), 1, ATTN_STATIC); bFlippable = false; diff --git a/src/r_defs.h b/src/r_defs.h index 91f248f85..e22fd3f62 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -1195,6 +1195,11 @@ struct side_t Light = l; } + FLevelLocals *GetLevel() + { + return sector->Level; + } + FTextureID GetTexture(int which) const { return textures[which].texture; diff --git a/src/s_sound.cpp b/src/s_sound.cpp index 535956583..6dbb6ff88 100644 --- a/src/s_sound.cpp +++ b/src/s_sound.cpp @@ -140,7 +140,7 @@ static bool MusicPaused; // whether music is paused MusPlayingInfo mus_playing; // music currently being played static FString LastSong; // last music that was played static FPlayList *PlayList; -static int RestartEvictionsAt; // do not restart evicted channels before this level.time +static int RestartEvictionsAt; // do not restart evicted channels before this time // PUBLIC DATA DEFINITIONS ------------------------------------------------- @@ -402,16 +402,16 @@ void S_Start () FString LocalSndSeq; // To be certain better check whether level is valid! - if (level.info) + if (currentUILevel->info) { - LocalSndInfo = level.info->SoundInfo; - LocalSndSeq = level.info->SndSeq; + LocalSndInfo = currentUILevel->info->SoundInfo; + LocalSndSeq = currentUILevel->info->SndSeq; } bool parse_ss = false; // This level uses a different local SNDINFO - if (LastLocalSndInfo.CompareNoCase(LocalSndInfo) != 0 || !level.info) + if (LastLocalSndInfo.CompareNoCase(LocalSndInfo) != 0 || !currentUILevel->info) { // First delete the old sound list for(unsigned i = 1; i < S_sfx.Size(); i++) @@ -456,10 +456,10 @@ void S_Start () // Don't start the music if loading a savegame, because the music is stored there. // Don't start the music if revisiting a level in a hub for the same reason. - if (!level.IsReentering()) + if (!currentUILevel->IsReentering()) { - if (level.cdtrack == 0 || !S_ChangeCDMusic (level.cdtrack, level.cdid)) - S_ChangeMusic (level.Music, level.musicorder); + if (currentUILevel->cdtrack == 0 || !S_ChangeCDMusic (currentUILevel->cdtrack, currentUILevel->cdid)) + S_ChangeMusic (currentUILevel->Music, currentUILevel->musicorder); } } @@ -499,7 +499,7 @@ void S_PrecacheLevel () FSoundID(snd).MarkUsed(); } // Precache all extra sounds requested by this map. - for (auto snd : level.info->PrecacheSounds) + for (auto snd : currentUILevel->info->PrecacheSounds) { FSoundID(snd).MarkUsed(); } @@ -706,7 +706,7 @@ static void CalcPosVel(int type, const AActor *actor, const sector_t *sector, if(type == SOURCE_Unattached) { sector_t *sec = P_PointInSector(pt[0], pt[2]); - DVector2 disp = level.Displacements.getOffset(pgroup, sec->PortalGroup); + DVector2 disp = currentUILevel->Displacements.getOffset(pgroup, sec->PortalGroup); pos->X = pt[0] - (float)disp.X; pos->Y = !(chanflags & CHAN_LISTENERZ) ? pt[1] : (float)listenpos.Z; pos->Z = pt[2] - (float)disp.Y; @@ -723,7 +723,7 @@ static void CalcPosVel(int type, const AActor *actor, const sector_t *sector, //assert(actor != NULL); if (actor != NULL) { - DVector2 disp = level.Displacements.getOffset(pgroup, actor->Sector->PortalGroup); + DVector2 disp = currentUILevel->Displacements.getOffset(pgroup, actor->Sector->PortalGroup); DVector3 posi = actor->Pos() - disp; *pos = { (float)posi.X, (float)posi.Z, (float)posi.Y }; } @@ -733,7 +733,7 @@ static void CalcPosVel(int type, const AActor *actor, const sector_t *sector, assert(sector != NULL); if (sector != NULL) { - DVector2 disp = level.Displacements.getOffset(pgroup, sector->PortalGroup); + DVector2 disp = currentUILevel->Displacements.getOffset(pgroup, sector->PortalGroup); if (chanflags & CHAN_AREA) { // listener must be reversely offset to calculate the proper sound origin. @@ -755,7 +755,7 @@ static void CalcPosVel(int type, const AActor *actor, const sector_t *sector, assert(poly != NULL); if (poly != NULL) { - DVector2 disp = level.Displacements.getOffset(pgroup, poly->CenterSubsector->sector->PortalGroup); + DVector2 disp = currentUILevel->Displacements.getOffset(pgroup, poly->CenterSubsector->sector->PortalGroup); CalcPolyobjSoundOrg(listenpos + disp, poly, *pos); pos->X -= (float)disp.X; pos->Z -= (float)disp.Y; @@ -916,7 +916,7 @@ static void CalcPolyobjSoundOrg(const DVector3 &listenpos, const FPolyObj *poly, // // S_StartSound // -// 0 attenuation means full volume over whole level. +// 0 attenuation means full volume over whole currentUILevel-> // 0 < attenuation means to scale the distance by that amount when // calculating volume. // @@ -1337,9 +1337,9 @@ DEFINE_ACTION_FUNCTION(DObject, S_Sound) void S_Sound (AActor *ent, int channel, FSoundID sound_id, float volume, float attenuation) { - if (ent == NULL || ent->Sector->Flags & SECF_SILENT) + if (ent == nullptr || ent->Sector->Flags & SECF_SILENT || ent->Level != currentUILevel) return; - S_StartSound (ent, NULL, NULL, NULL, channel, sound_id, volume, attenuation); + S_StartSound (ent, nullptr, nullptr, nullptr, channel, sound_id, volume, attenuation); } //========================================================================== @@ -1352,7 +1352,7 @@ void S_Sound (AActor *ent, int channel, FSoundID sound_id, float volume, float a void S_SoundMinMaxDist(AActor *ent, int channel, FSoundID sound_id, float volume, float mindist, float maxdist) { - if (ent == NULL || ent->Sector->Flags & SECF_SILENT) + if (ent == nullptr || ent->Sector->Flags & SECF_SILENT || ent->Level != currentUILevel) return; FRolloffInfo rolloff; @@ -1360,7 +1360,7 @@ void S_SoundMinMaxDist(AActor *ent, int channel, FSoundID sound_id, float volume rolloff.RolloffType = ROLLOFF_Linear; rolloff.MinDistance = mindist; rolloff.MaxDistance = maxdist; - S_StartSound(ent, NULL, NULL, NULL, channel, sound_id, volume, 1, &rolloff); + S_StartSound(ent, nullptr, nullptr, nullptr, channel, sound_id, volume, 1, &rolloff); } //========================================================================== @@ -1371,7 +1371,8 @@ void S_SoundMinMaxDist(AActor *ent, int channel, FSoundID sound_id, float volume void S_Sound (const FPolyObj *poly, int channel, FSoundID sound_id, float volume, float attenuation) { - S_StartSound (NULL, NULL, poly, NULL, channel, sound_id, volume, attenuation); + if (poly->GetLevel() != currentUILevel) return; + S_StartSound (nullptr, nullptr, poly, nullptr, channel, sound_id, volume, attenuation); } //========================================================================== @@ -1380,11 +1381,12 @@ void S_Sound (const FPolyObj *poly, int channel, FSoundID sound_id, float volume // //========================================================================== -void S_Sound(const DVector3 &pos, int channel, FSoundID sound_id, float volume, float attenuation) +void S_Sound(FLevelLocals *Level, const DVector3 &pos, int channel, FSoundID sound_id, float volume, float attenuation) { + if (Level != currentUILevel) return; // The sound system switches Y and Z around. FVector3 p((float)pos.X, (float)pos.Z, (float)pos.Y); - S_StartSound (NULL, NULL, NULL, &p, channel, sound_id, volume, attenuation); + S_StartSound (nullptr, nullptr, nullptr, &p, channel, sound_id, volume, attenuation); } //========================================================================== @@ -1395,7 +1397,8 @@ void S_Sound(const DVector3 &pos, int channel, FSoundID sound_id, float volume, void S_Sound (const sector_t *sec, int channel, FSoundID sfxid, float volume, float attenuation) { - S_StartSound (NULL, sec, NULL, NULL, channel, sfxid, volume, attenuation); + if (sec->Level != currentUILevel) return; + S_StartSound (nullptr, sec, nullptr, nullptr, channel, sfxid, volume, attenuation); } //========================================================================== @@ -1408,7 +1411,7 @@ void S_Sound (const sector_t *sec, int channel, FSoundID sfxid, float volume, fl void S_PlaySound(AActor *a, int chan, FSoundID sid, float vol, float atten, bool local) { - if (a == nullptr) + if (a == nullptr || a->Sector->Flags & SECF_SILENT || a->Level != currentUILevel) return; if (!local) @@ -2182,7 +2185,7 @@ void S_UpdateSounds (AActor *listenactor) GSnd->UpdateListener(&listener); GSnd->UpdateSounds(); - if (level.time >= RestartEvictionsAt) + if (currentUILevel->time >= RestartEvictionsAt) { RestartEvictionsAt = 0; S_RestoreEvictedChannels(); @@ -2208,8 +2211,8 @@ static void S_SetListener(SoundListener &listener, AActor *listenactor) listener.velocity.Zero(); listener.position = listenactor->SoundPos(); listener.underwater = listenactor->waterlevel == 3; - assert(level.Zones.Size() > listenactor->Sector->ZoneNumber); - listener.Environment = level.Zones[listenactor->Sector->ZoneNumber].Environment; + assert(currentUILevel->Zones.Size() > listenactor->Sector->ZoneNumber); + listener.Environment = currentUILevel->Zones[listenactor->Sector->ZoneNumber].Environment; listener.valid = true; } else @@ -2487,7 +2490,7 @@ void S_SerializeSounds(FSerializer &arc) // playing before the wipe, and depending on the synchronization // between the main thread and the mixer thread at the time, the // sounds might be heard briefly before pausing for the wipe. - RestartEvictionsAt = level.time + 2; + RestartEvictionsAt = currentUILevel->time + 2; } GSnd->Sync(false); GSnd->UpdateSounds(); @@ -2577,8 +2580,8 @@ bool S_ChangeMusic (const char *musicname, int order, bool looping, bool force) { if (gamestate == GS_LEVEL || gamestate == GS_TITLELEVEL) { - musicname = level.Music; - order = level.musicorder; + musicname = currentUILevel->Music; + order = currentUILevel->musicorder; } else { diff --git a/src/s_sound.h b/src/s_sound.h index 7b971c046..a5f3c17a0 100644 --- a/src/s_sound.h +++ b/src/s_sound.h @@ -34,6 +34,7 @@ class AActor; class FScanner; class FSerializer; +struct FLevelLocals; // // SoundFX struct. @@ -228,7 +229,7 @@ void S_Sound (AActor *ent, int channel, FSoundID sfxid, float volume, float atte void S_SoundMinMaxDist (AActor *ent, int channel, FSoundID sfxid, float volume, float mindist, float maxdist); void S_Sound (const FPolyObj *poly, int channel, FSoundID sfxid, float volume, float attenuation); void S_Sound (const sector_t *sec, int channel, FSoundID sfxid, float volume, float attenuation); -void S_Sound(const DVector3 &pos, int channel, FSoundID sfxid, float volume, float attenuation); +void S_Sound(FLevelLocals *Level, const DVector3 &pos, int channel, FSoundID sfxid, float volume, float attenuation); // [Nash] Used by ACS and DECORATE void S_PlaySound(AActor *a, int chan, FSoundID sid, float vol, float atten, bool local); From 11c453a71f0c803b6426fb9290bc3b4d20cc3b99 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 27 Jan 2019 21:03:25 +0100 Subject: [PATCH 046/164] - fix handling of the global script in FraggleScript. Depending on serialization order is not a good idea here, so now it's no longer stored as a parent in the main level script but explicitly checked for when looking for a variable. --- src/fragglescript/t_oper.cpp | 11 ++++++----- src/fragglescript/t_parse.cpp | 4 ++-- src/fragglescript/t_script.cpp | 18 +++++++----------- src/fragglescript/t_script.h | 4 ++-- src/fragglescript/t_variable.cpp | 10 ++++++++-- 5 files changed, 25 insertions(+), 22 deletions(-) diff --git a/src/fragglescript/t_oper.cpp b/src/fragglescript/t_oper.cpp index 3208eb9e6..8b4368db7 100644 --- a/src/fragglescript/t_oper.cpp +++ b/src/fragglescript/t_oper.cpp @@ -31,6 +31,7 @@ /* includes ************************/ #include "t_script.h" +#include "g_levellocals.h" #define evaluate_leftnright(a, b, c) {\ @@ -84,7 +85,7 @@ void FParser::OPequals(svalue_t &result, int start, int n, int stop) { DFsVariable *var; - var = Script->FindVariable(Tokens[start]); + var = Script->FindVariable(Tokens[start], Level->FraggleScriptThinker->GlobalScript); if(var) { @@ -478,7 +479,7 @@ void FParser::OPincrement(svalue_t &result, int start, int n, int stop) { DFsVariable *var; - var = Script->FindVariable(Tokens[stop]); + var = Script->FindVariable(Tokens[stop], Level->FraggleScriptThinker->GlobalScript); if(!var) { script_error("unknown variable '%s'\n", Tokens[stop]); @@ -503,7 +504,7 @@ void FParser::OPincrement(svalue_t &result, int start, int n, int stop) svalue_t newvalue; DFsVariable *var; - var = Script->FindVariable(Tokens[start]); + var = Script->FindVariable(Tokens[start], Level->FraggleScriptThinker->GlobalScript); if(!var) { script_error("unknown variable '%s'\n", Tokens[start]); @@ -541,7 +542,7 @@ void FParser::OPdecrement(svalue_t &result, int start, int n, int stop) { DFsVariable *var; - var = Script->FindVariable(Tokens[stop]); + var = Script->FindVariable(Tokens[stop], Level->FraggleScriptThinker->GlobalScript); if(!var) { script_error("unknown variable '%s'\n", Tokens[stop]); @@ -567,7 +568,7 @@ void FParser::OPdecrement(svalue_t &result, int start, int n, int stop) svalue_t newvalue; DFsVariable *var; - var = Script->FindVariable(Tokens[start]); + var = Script->FindVariable(Tokens[start], Level->FraggleScriptThinker->GlobalScript); if(!var) { script_error("unknown variable '%s'\n", Tokens[start]); diff --git a/src/fragglescript/t_parse.cpp b/src/fragglescript/t_parse.cpp index d7747b1bc..16cfdda49 100644 --- a/src/fragglescript/t_parse.cpp +++ b/src/fragglescript/t_parse.cpp @@ -34,7 +34,7 @@ #include #include "t_script.h" #include "v_text.h" - +#include "g_levellocals.h""" CVAR(Bool, script_debug, false, 0) @@ -561,7 +561,7 @@ void FParser::SimpleEvaluate(svalue_t &returnvar, int n) break; case name_: - var = Script->FindVariable(Tokens[n]); + var = Script->FindVariable(Tokens[n], Level->FraggleScriptThinker->GlobalScript); if(!var) { script_error("unknown variable '%s'\n", Tokens[n]); diff --git a/src/fragglescript/t_script.cpp b/src/fragglescript/t_script.cpp index 47f0a1bf3..818323eef 100644 --- a/src/fragglescript/t_script.cpp +++ b/src/fragglescript/t_script.cpp @@ -176,8 +176,6 @@ void DFsScript::OnDestroy() void DFsScript::Serialize(FSerializer &arc) { Super::Serialize(arc); - // don't save a reference to the global script, which contains unserializable data. - if (parent == level.FraggleScriptThinker->GlobalScript) parent = nullptr; arc("data", data) ("scriptnum", scriptnum) @@ -188,8 +186,6 @@ void DFsScript::Serialize(FSerializer &arc) .Array("sections", sections, SECTIONSLOTS) .Array("variables", variables, VARIABLESLOTS) .Array("children", children, MAXSCRIPTS); - - if (parent == nullptr) parent = level.FraggleScriptThinker->GlobalScript; } //========================================================================== @@ -200,7 +196,7 @@ void DFsScript::Serialize(FSerializer &arc) // //========================================================================== -void DFsScript::ParseScript(char *position) +void DFsScript::ParseScript(char *position, AActor **pTrigger) { if (position == nullptr) { @@ -215,7 +211,7 @@ void DFsScript::ParseScript(char *position) return; } - level.FraggleScriptThinker->trigger_obj = trigger; // set trigger + *pTrigger = trigger; // set trigger variable. try { @@ -387,7 +383,7 @@ void DFraggleThinker::Construct() RunningScripts = Create(); GC::WriteBarrier(this, RunningScripts); LevelScript = Create(); - LevelScript->parent = GlobalScript; + LevelScript->parent = nullptr; GC::WriteBarrier(this, LevelScript); } @@ -465,10 +461,10 @@ bool DFraggleThinker::wait_finished(DRunningScript *script) case wt_tagwait: { int secnum; - auto itr = level.GetSectorTagIterator(script->wait_data); + auto itr = Level->GetSectorTagIterator(script->wait_data); while ((secnum = itr.Next()) >= 0) { - sector_t *sec = &level.sectors[secnum]; + sector_t *sec = &Level->sectors[secnum]; if(sec->floordata || sec->ceilingdata || sec->lightingdata) return false; // not finished } @@ -532,7 +528,7 @@ void DFraggleThinker::Tick() next = current->next; // save before freeing // continue the script - current->script->ParseScript (current->script->data + current->save_point); + current->script->ParseScript (current->script->data + current->save_point, &trigger_obj); // free current->Destroy(); @@ -623,7 +619,7 @@ void T_PreprocessScripts(FLevelLocals *Level) th->LevelScript->trigger = players[0].mo; th->LevelScript->Preprocess(); - th->LevelScript->ParseScript(); + th->LevelScript->ParseScript(nullptr, &th->trigger_obj); } } diff --git a/src/fragglescript/t_script.h b/src/fragglescript/t_script.h index 3887f736d..6d09d0d01 100644 --- a/src/fragglescript/t_script.h +++ b/src/fragglescript/t_script.h @@ -341,7 +341,7 @@ public: void NewFunction(const char *name, void (FParser::*handler)()); DFsVariable *VariableForName(const char *name); - DFsVariable *FindVariable(const char *name); + DFsVariable *FindVariable(const char *name, DFsScript *global); void ClearVariables(bool complete= false); DFsVariable *NewLabel(char *labelptr); char *LabelValue(const svalue_t &v); @@ -363,7 +363,7 @@ public: void DryRunScript(); void Preprocess(); void ParseInclude(char *lumpname); - void ParseScript(char *rover = NULL); + void ParseScript(char *rover, AActor **pTrigger); void ParseData(char *rover, char *data, char *end); }; diff --git a/src/fragglescript/t_variable.cpp b/src/fragglescript/t_variable.cpp index 25776970e..c73bf14fc 100644 --- a/src/fragglescript/t_variable.cpp +++ b/src/fragglescript/t_variable.cpp @@ -364,7 +364,7 @@ DFsVariable *DFsScript::VariableForName(const char *name) // //========================================================================== -DFsVariable *DFsScript::FindVariable(const char *name) +DFsVariable *DFsScript::FindVariable(const char *name, DFsScript *GlobalScript) { DFsVariable *var; DFsScript *current = this; @@ -374,7 +374,13 @@ DFsVariable *DFsScript::FindVariable(const char *name) // check this script if ((var = current->VariableForName(name))) return var; - current = current->parent; // try the parent of this one + + // Since the global script cannot be serialized, we cannot store a pointer to it, because this cannot be safely restored during deserialization. + // To compensate we need to check the relationship explicitly here. + if (current->parent == nullptr && current != GlobalScript) + current = GlobalScript; + else + current = current->parent; // try the parent of this one } return NULL; // no variable From b4acb857ade5ce655e508f37a85ce9f3495ae106 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sun, 27 Jan 2019 21:59:19 +0100 Subject: [PATCH 047/164] - the final batch of easy level replacements. What's left will require a bit more work... --- src/c_bind.cpp | 1 - src/c_cmds.cpp | 20 +++++------ src/c_console.cpp | 2 +- src/fragglescript/t_func.cpp | 4 +-- src/g_level.cpp | 30 ++++++++-------- src/g_level.h | 2 -- src/g_levellocals.h | 18 ++++++++++ src/g_shared/a_quake.cpp | 12 +++---- src/maploader/maploader.cpp | 2 +- src/p_3dfloors.cpp | 4 +-- src/p_3dfloors.h | 1 - src/p_acs.cpp | 16 ++++----- src/p_actionfunctions.cpp | 4 +-- src/p_conversation.cpp | 2 +- src/p_lnspec.cpp | 40 ++++++++++----------- src/p_local.h | 7 ---- src/p_maputl.cpp | 36 +++++++++---------- src/p_mobj.cpp | 64 +++++++++++++++++++--------------- src/p_saveg.cpp | 14 ++++---- src/p_secnodes.cpp | 10 +++--- src/p_sectors.cpp | 32 ++++++++--------- src/p_spec.h | 10 ++---- src/p_teleport.cpp | 50 +++++++++++++------------- src/p_things.cpp | 31 ++++++++-------- src/p_user.cpp | 4 +-- src/r_data/a_dynlightdata.cpp | 2 +- src/r_data/r_canvastexture.cpp | 2 +- src/r_data/r_translate.cpp | 2 +- src/scripting/vmthunks.cpp | 10 +++--- wadsrc/static/zscript/base.txt | 6 +++- 30 files changed, 226 insertions(+), 212 deletions(-) diff --git a/src/c_bind.cpp b/src/c_bind.cpp index f2758ab13..0427d5c45 100644 --- a/src/c_bind.cpp +++ b/src/c_bind.cpp @@ -753,7 +753,6 @@ bool C_DoKey (event_t *ev, FKeyBindings *binds, FKeyBindings *doublebinds) dclickmask = 1 << (ev->data1 & 7); dclick = false; - // This used level.time which didn't work outside a level. nowtime = (unsigned)I_msTime(); if (doublebinds != NULL && int(DClickTime[ev->data1] - nowtime) > 0 && ev->type == EV_KeyDown) { diff --git a/src/c_cmds.cpp b/src/c_cmds.cpp index 4edf8e6ca..b9ec1228f 100644 --- a/src/c_cmds.cpp +++ b/src/c_cmds.cpp @@ -1099,9 +1099,9 @@ CCMD(nextmap) return; } - if (level.NextMap.Len() > 0 && level.NextMap.Compare("enDSeQ", 6)) + if (currentUILevel->NextMap.Len() > 0 && currentUILevel->NextMap.Compare("enDSeQ", 6)) { - G_DeferedInitNew(level.NextMap); + G_DeferedInitNew(currentUILevel->NextMap); } else { @@ -1123,9 +1123,9 @@ CCMD(nextsecret) return; } - if (level.NextSecretMap.Len() > 0 && level.NextSecretMap.Compare("enDSeQ", 6)) + if (currentUILevel->NextSecretMap.Len() > 0 && currentUILevel->NextSecretMap.Compare("enDSeQ", 6)) { - G_DeferedInitNew(level.NextSecretMap); + G_DeferedInitNew(currentUILevel->NextSecretMap); } else { @@ -1170,10 +1170,10 @@ static void PrintSecretString(const char *string, bool thislevel) { auto secnum = (unsigned)strtoull(string+2, (char**)&string, 10); if (*string == ';') string++; - if (thislevel && secnum < level.sectors.Size()) + if (thislevel && secnum < currentUILevel->sectors.Size()) { - if (level.sectors[secnum].isSecret()) colstr = TEXTCOLOR_RED; - else if (level.sectors[secnum].wasSecret()) colstr = TEXTCOLOR_GREEN; + if (currentUILevel->sectors[secnum].isSecret()) colstr = TEXTCOLOR_RED; + else if (currentUILevel->sectors[secnum].wasSecret()) colstr = TEXTCOLOR_GREEN; else colstr = TEXTCOLOR_ORANGE; } } @@ -1181,7 +1181,7 @@ static void PrintSecretString(const char *string, bool thislevel) { long tid = (long)strtoll(string+2, (char**)&string, 10); if (*string == ';') string++; - auto it = level.GetActorIterator(tid); + auto it = currentUILevel->GetActorIterator(tid); AActor *actor; bool foundone = false; if (thislevel) @@ -1214,8 +1214,8 @@ static void PrintSecretString(const char *string, bool thislevel) CCMD(secret) { - const char *mapname = argv.argc() < 2? level.MapName.GetChars() : argv[1]; - bool thislevel = !stricmp(mapname, level.MapName); + const char *mapname = argv.argc() < 2? currentUILevel->MapName.GetChars() : argv[1]; + bool thislevel = !stricmp(mapname, currentUILevel->MapName); bool foundsome = false; int lumpno=Wads.CheckNumForName("SECRETS"); diff --git a/src/c_console.cpp b/src/c_console.cpp index 8d2d1dfca..d72b29465 100644 --- a/src/c_console.cpp +++ b/src/c_console.cpp @@ -1243,7 +1243,7 @@ void C_FullConsole () if (gamestate != GS_STARTUP) { gamestate = GS_FULLCONSOLE; - level.Music = ""; + currentUILevel->Music = ""; S_Start (); P_FreeLevelData (); V_SetBlend (0,0,0,0); diff --git a/src/fragglescript/t_func.cpp b/src/fragglescript/t_func.cpp index 90513d97d..2797191bc 100644 --- a/src/fragglescript/t_func.cpp +++ b/src/fragglescript/t_func.cpp @@ -1040,7 +1040,7 @@ void FParser::SF_Teleport(void) } if(mo) - EV_Teleport(0, tag, NULL, 0, mo, TELF_DESTFOG | TELF_SOURCEFOG); + Level->EV_Teleport(0, tag, NULL, 0, mo, TELF_DESTFOG | TELF_SOURCEFOG); } } @@ -1069,7 +1069,7 @@ void FParser::SF_SilentTeleport(void) } if(mo) - EV_Teleport(0, tag, NULL, 0, mo, TELF_KEEPORIENTATION); + Level->EV_Teleport(0, tag, NULL, 0, mo, TELF_KEEPORIENTATION); } } diff --git a/src/g_level.cpp b/src/g_level.cpp index aca407802..4f57af68a 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -885,7 +885,7 @@ void G_DoCompleted (void) ((level.flags & LEVEL_NOINTERMISSION) || ((nextcluster == thiscluster) && (thiscluster->flags & CLUSTER_HUB) && !(thiscluster->flags & CLUSTER_ALLOWINTERMISSION)))) { - G_WorldDone (); + level.WorldDone (); return; } @@ -1131,17 +1131,17 @@ void G_DoLoadLevel (int position, bool autosave, bool newGame) // //========================================================================== -void G_WorldDone (void) +void FLevelLocals::WorldDone (void) { cluster_info_t *nextcluster; cluster_info_t *thiscluster; gameaction = ga_worlddone; - if (level.flags & LEVEL_CHANGEMAPCHEAT) + if (flags & LEVEL_CHANGEMAPCHEAT) return; - thiscluster = FindClusterInfo (level.cluster); + thiscluster = FindClusterInfo (cluster); if (strncmp (nextlevel, "enDSeQ", 6) == 0) { @@ -1160,7 +1160,7 @@ void G_WorldDone (void) } } - auto ext = level.info->ExitMapTexts.CheckKey(level.flags3 & LEVEL3_EXITSECRETUSED ? NAME_Secret : NAME_Normal); + auto ext = info->ExitMapTexts.CheckKey(flags3 & LEVEL3_EXITSECRETUSED ? NAME_Secret : NAME_Normal); if (ext != nullptr && (ext->mDefined & FExitText::DEF_TEXT)) { F_StartFinale(ext->mDefined & FExitText::DEF_MUSIC ? ext->mMusic : gameinfo.finaleMusic, @@ -1188,9 +1188,9 @@ void G_WorldDone (void) { FExitText *ext = nullptr; - if (level.flags3 & LEVEL3_EXITSECRETUSED) ext = level.info->ExitMapTexts.CheckKey(NAME_Secret); - else if (level.flags3 & LEVEL3_EXITNORMALUSED) ext = level.info->ExitMapTexts.CheckKey(NAME_Normal); - if (ext == nullptr) ext = level.info->ExitMapTexts.CheckKey(nextlevel); + if (flags3 & LEVEL3_EXITSECRETUSED) ext = info->ExitMapTexts.CheckKey(NAME_Secret); + else if (flags3 & LEVEL3_EXITNORMALUSED) ext = info->ExitMapTexts.CheckKey(NAME_Normal); + if (ext == nullptr) ext = info->ExitMapTexts.CheckKey(nextlevel); if (ext != nullptr) { @@ -1211,7 +1211,7 @@ void G_WorldDone (void) nextcluster = FindClusterInfo (FindLevelInfo (nextlevel)->cluster); - if (nextcluster->cluster != level.cluster && !deathmatch) + if (nextcluster->cluster != cluster && !deathmatch) { // Only start the finale if the next level's cluster is different // than the current one and we're not in deathmatch. @@ -1241,7 +1241,7 @@ void G_WorldDone (void) DEFINE_ACTION_FUNCTION(FLevelLocals, WorldDone) { - G_WorldDone(); + currentUILevel->WorldDone(); return 0; } @@ -1492,7 +1492,7 @@ void FLevelLocals::Init() teamdamage = info->teamdamage; } - G_AirControlChanged (); + AirControlChanged (); cluster_info_t *clus = FindClusterInfo (info->cluster); @@ -1625,16 +1625,16 @@ FString CalcMapName (int episode, int level) // //========================================================================== -void G_AirControlChanged () +void FLevelLocals::AirControlChanged () { - if (level.aircontrol <= 1/256.) + if (aircontrol <= 1/256.) { - level.airfriction = 1.; + airfriction = 1.; } else { // Friction is inversely proportional to the amount of control - level.airfriction = level.aircontrol * -0.0941 + 1.0004; + airfriction = aircontrol * -0.0941 + 1.0004; } } diff --git a/src/g_level.h b/src/g_level.h index 5e42fcc44..9686a4e5c 100644 --- a/src/g_level.h +++ b/src/g_level.h @@ -477,8 +477,6 @@ int G_FinishTravel (); void G_DoLoadLevel (int position, bool autosave, bool newGame); -void G_AirControlChanged (); - cluster_info_t *FindClusterInfo (int cluster); level_info_t *FindLevelInfo (const char *mapname, bool allowdefault=true); level_info_t *FindLevelByNum (int num); diff --git a/src/g_levellocals.h b/src/g_levellocals.h index ac416ee70..79012fb58 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -209,6 +209,18 @@ public: AActor *SpawnPlayer(FPlayerStart *mthing, int playernum, int flags); void StartLightning(); void ForceLightning(int mode); + void ClearDynamic3DFloorData(); + void WorldDone(void); + void AirControlChanged(); + AActor *SelectTeleDest(int tid, int tag, bool norandom); + bool AlignFlat(int linenum, int side, int fc); + void ReplaceTextures(const char *fromname, const char *toname, int flags); + + bool EV_Thing_Spawn(int tid, AActor *source, int type, DAngle angle, bool fog, int newtid); + bool EV_Thing_Move(int tid, AActor *source, int mapspot, bool fog); + bool EV_Thing_Projectile(int tid, AActor *source, int type, const char *type_name, DAngle angle, + double speed, double vspeed, int dest, AActor *forcedest, int gravity, int newtid, bool leadTarget); + int EV_Thing_Damage(int tid, AActor *whofor0, int amount, FName type); bool EV_DoPlat(int tag, line_t *line, DPlat::EPlatType type, double height, double speed, int delay, int lip, int change); void EV_StopPlat(int tag, bool remove); @@ -238,6 +250,12 @@ public: void EV_StartLightFading(int tag, int value, int tics); void EV_StopLightEffect(int tag); + bool EV_Teleport(int tid, int tag, line_t *line, int side, AActor *thing, int flags); + bool EV_SilentLineTeleport(line_t *line, int side, AActor *thing, int id, INTBOOL reverse); + bool EV_TeleportOther(int other_tid, int dest_tid, bool fog); + bool EV_TeleportGroup(int group_tid, AActor *victim, int source_tid, int dest_tid, bool moveSource, bool fog); + bool EV_TeleportSector(int tag, int source_tid, int dest_tid, bool fog, int group_tid); + void RecalculateDrawnSubsectors(); FSerializer &SerializeSubsectors(FSerializer &arc, const char *key); void SpawnExtraPlayers(); diff --git a/src/g_shared/a_quake.cpp b/src/g_shared/a_quake.cpp index 098e6d893..892ba586b 100644 --- a/src/g_shared/a_quake.cpp +++ b/src/g_shared/a_quake.cpp @@ -367,7 +367,7 @@ int DEarthquake::StaticGetQuakeIntensities(double ticFrac, AActor *victim, FQuak // //========================================================================== -bool P_StartQuakeXYZ(AActor *activator, int tid, int intensityX, int intensityY, int intensityZ, int duration, +bool P_StartQuakeXYZ(FLevelLocals *Level, AActor *activator, int tid, int intensityX, int intensityY, int intensityZ, int duration, int damrad, int tremrad, FSoundID quakesfx, int flags, double waveSpeedX, double waveSpeedY, double waveSpeedZ, int falloff, int highpoint, double rollIntensity, double rollWave) @@ -383,18 +383,18 @@ bool P_StartQuakeXYZ(AActor *activator, int tid, int intensityX, int intensityY, { if (activator != NULL) { - level.CreateThinker(activator, intensityX, intensityY, intensityZ, duration, damrad, tremrad, + Level->CreateThinker(activator, intensityX, intensityY, intensityZ, duration, damrad, tremrad, quakesfx, flags, waveSpeedX, waveSpeedY, waveSpeedZ, falloff, highpoint, rollIntensity, rollWave); return true; } } else { - auto iterator = level.GetActorIterator(tid); + auto iterator = Level->GetActorIterator(tid); while ( (center = iterator.Next ()) ) { res = true; - level.CreateThinker(center, intensityX, intensityY, intensityZ, duration, damrad, tremrad, + Level->CreateThinker(center, intensityX, intensityY, intensityZ, duration, damrad, tremrad, quakesfx, flags, waveSpeedX, waveSpeedY, waveSpeedZ, falloff, highpoint, rollIntensity, rollWave); } } @@ -402,7 +402,7 @@ bool P_StartQuakeXYZ(AActor *activator, int tid, int intensityX, int intensityY, return res; } -bool P_StartQuake(AActor *activator, int tid, int intensity, int duration, int damrad, int tremrad, FSoundID quakesfx) +bool P_StartQuake(FLevelLocals *Level, AActor *activator, int tid, int intensity, int duration, int damrad, int tremrad, FSoundID quakesfx) { //Maintains original behavior by passing 0 to intensityZ, flags, and everything else after QSFX. - return P_StartQuakeXYZ(activator, tid, intensity, intensity, 0, duration, damrad, tremrad, quakesfx, 0, 0, 0, 0, 0, 0, 0, 0); + return P_StartQuakeXYZ(Level, activator, tid, intensity, intensity, 0, duration, damrad, tremrad, quakesfx, 0, 0, 0, 0, 0, 0, 0, 0); } diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index 7b0c241f6..b3695754e 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -3275,7 +3275,7 @@ void MapLoader::LoadLevel(MapData *map, const char *lumpname, int position) } InitRenderInfo(); // create hardware independent renderer resources for the level. This must be done BEFORE the PolyObj Spawn!!! - P_ClearDynamic3DFloorData(); // CreateVBO must be run on the plain 3D floor data. + Level->ClearDynamic3DFloorData(); // CreateVBO must be run on the plain 3D floor data. screen->mVertexData->CreateVBO(Level->sectors); for (auto &sec : Level->sectors) diff --git a/src/p_3dfloors.cpp b/src/p_3dfloors.cpp index e71038fda..4da592cf4 100644 --- a/src/p_3dfloors.cpp +++ b/src/p_3dfloors.cpp @@ -558,9 +558,9 @@ void P_Recalculate3DFloors(sector_t * sector) // //========================================================================== -void P_ClearDynamic3DFloorData() +void FLevelLocals::ClearDynamic3DFloorData() { - for (auto &sec : level.sectors) + for (auto &sec : sectors) { TArray & ffloors = sec.e->XFloor.ffloors; diff --git a/src/p_3dfloors.h b/src/p_3dfloors.h index 5a8abb807..fc82b7550 100644 --- a/src/p_3dfloors.h +++ b/src/p_3dfloors.h @@ -123,7 +123,6 @@ void P_Recalculate3DFloors(sector_t *); void P_RecalculateAttached3DFloors(sector_t * sec); void P_RecalculateLights(sector_t *sector); void P_RecalculateAttachedLights(sector_t *sector); -void P_ClearDynamic3DFloorData(); lightlist_t * P_GetPlaneLight(sector_t * , secplane_t * plane, bool underside); void P_Spawn3DFloors( void ); diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 2ebdfd0b4..e589d8d07 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -5571,7 +5571,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) } case ACSF_Radius_Quake2: - P_StartQuake(activator, args[0], args[1], args[2], args[3], args[4], Level->Behaviors.LookupString(args[5])); + P_StartQuake(Level, activator, args[0], args[1], args[2], args[3], args[4], Level->Behaviors.LookupString(args[5])); break; case ACSF_CheckActorClass: @@ -6150,7 +6150,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) case ACSF_QuakeEx: { - return P_StartQuakeXYZ(activator, args[0], args[1], args[2], args[3], args[4], args[5], args[6], Level->Behaviors.LookupString(args[7]), + return P_StartQuakeXYZ(Level, activator, args[0], args[1], args[2], args[3], args[4], args[5], args[6], Level->Behaviors.LookupString(args[7]), argCount > 8 ? args[8] : 0, argCount > 9 ? ACSToDouble(args[9]) : 1.0, argCount > 10 ? ACSToDouble(args[10]) : 1.0, @@ -8880,7 +8880,7 @@ scriptwait: const char *fromname = Level->Behaviors.LookupString(STACK(3)); const char *toname = Level->Behaviors.LookupString(STACK(2)); - P_ReplaceTextures(fromname, toname, STACK(1)); + Level->ReplaceTextures(fromname, toname, STACK(1)); sp -= 3; break; } @@ -9049,13 +9049,13 @@ scriptwait: case PCD_SETAIRCONTROL: Level->aircontrol = ACSToDouble(STACK(1)); sp--; - G_AirControlChanged (); + Level->AirControlChanged (); break; case PCD_SETAIRCONTROLDIRECT: Level->aircontrol = ACSToDouble(uallong(pc[0])); pc++; - G_AirControlChanged (); + Level->AirControlChanged (); break; case PCD_SPAWN: @@ -9689,14 +9689,14 @@ scriptwait: // Like Thing_Projectile(Gravity) specials, but you can give the // projectile a TID. // Thing_Projectile2 (tid, type, angle, speed, vspeed, gravity, newtid); - P_Thing_Projectile(STACK(7), activator, STACK(6), NULL, STACK(5) * (360. / 256.), + Level->EV_Thing_Projectile(STACK(7), activator, STACK(6), NULL, STACK(5) * (360. / 256.), STACK(4) / 8., STACK(3) / 8., 0, NULL, STACK(2), STACK(1), false); sp -= 7; break; case PCD_SPAWNPROJECTILE: // Same, but takes an actor name instead of a spawn ID. - P_Thing_Projectile(STACK(7), activator, 0, Level->Behaviors.LookupString(STACK(6)), STACK(5) * (360. / 256.), + Level->EV_Thing_Projectile(STACK(7), activator, 0, Level->Behaviors.LookupString(STACK(6)), STACK(5) * (360. / 256.), STACK(4) / 8., STACK(3) / 8., 0, NULL, STACK(2), STACK(1), false); sp -= 7; break; @@ -9913,7 +9913,7 @@ scriptwait: break; case PCD_THINGDAMAGE2: - STACK(3) = P_Thing_Damage (STACK(3), activator, STACK(2), FName(Level->Behaviors.LookupString(STACK(1)))); + STACK(3) = Level->EV_Thing_Damage (STACK(3), activator, STACK(2), FName(Level->Behaviors.LookupString(STACK(1)))); sp -= 2; break; diff --git a/src/p_actionfunctions.cpp b/src/p_actionfunctions.cpp index 15cdf32ae..347b6ee01 100644 --- a/src/p_actionfunctions.cpp +++ b/src/p_actionfunctions.cpp @@ -3178,7 +3178,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_Quake) PARAM_INT (tremrad); PARAM_SOUND (sound); - P_StartQuake(self, 0, intensity, duration, damrad, tremrad, sound); + P_StartQuake(self->Level, self, 0, intensity, duration, damrad, tremrad, sound); return 0; } @@ -3208,7 +3208,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_QuakeEx) PARAM_INT(highpoint); PARAM_FLOAT(rollIntensity); PARAM_FLOAT(rollWave); - P_StartQuakeXYZ(self, 0, intensityX, intensityY, intensityZ, duration, damrad, tremrad, sound, flags, mulWaveX, mulWaveY, mulWaveZ, falloff, highpoint, + P_StartQuakeXYZ(self->Level, self, 0, intensityX, intensityY, intensityZ, duration, damrad, tremrad, sound, flags, mulWaveX, mulWaveY, mulWaveZ, falloff, highpoint, rollIntensity, rollWave); return 0; } diff --git a/src/p_conversation.cpp b/src/p_conversation.cpp index e65321d8c..ed25f3c9c 100644 --- a/src/p_conversation.cpp +++ b/src/p_conversation.cpp @@ -1064,7 +1064,7 @@ static void HandleReply(player_t *player, bool isconsole, int nodenum, int reply if (isconsole) { - I_SetMusicVolume (level.MusicVolume); + I_SetMusicVolume (player->mo->Level->MusicVolume); } } diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index a29580fb9..ceebb43ee 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -1103,7 +1103,7 @@ FUNC(LS_Teleport) { flags |= TELF_SOURCEFOG; } - return EV_Teleport (arg0, arg1, ln, backSide, it, flags); + return Level->EV_Teleport (arg0, arg1, ln, backSide, it, flags); } FUNC( LS_Teleport_NoStop ) @@ -1114,7 +1114,7 @@ FUNC( LS_Teleport_NoStop ) { flags |= TELF_SOURCEFOG; } - return EV_Teleport( arg0, arg1, ln, backSide, it, flags); + return Level->EV_Teleport( arg0, arg1, ln, backSide, it, flags); } FUNC(LS_Teleport_NoFog) @@ -1144,7 +1144,7 @@ FUNC(LS_Teleport_NoFog) { flags |= TELF_KEEPHEIGHT; } - return EV_Teleport (arg0, arg2, ln, backSide, it, flags); + return Level->EV_Teleport (arg0, arg2, ln, backSide, it, flags); } FUNC(LS_Teleport_ZombieChanger) @@ -1153,7 +1153,7 @@ FUNC(LS_Teleport_ZombieChanger) // This is practically useless outside of Strife, but oh well. if (it != NULL) { - EV_Teleport (arg0, arg1, ln, backSide, it, 0); + Level->EV_Teleport (arg0, arg1, ln, backSide, it, 0); if (it->health >= 0) it->SetState (it->FindState(NAME_Pain)); return true; } @@ -1163,19 +1163,19 @@ FUNC(LS_Teleport_ZombieChanger) FUNC(LS_TeleportOther) // TeleportOther (other_tid, dest_tid, fog?) { - return EV_TeleportOther (arg0, arg1, arg2?true:false); + return Level->EV_TeleportOther (arg0, arg1, arg2?true:false); } FUNC(LS_TeleportGroup) // TeleportGroup (group_tid, source_tid, dest_tid, move_source?, fog?) { - return EV_TeleportGroup (arg0, it, arg1, arg2, arg3?true:false, arg4?true:false); + return Level->EV_TeleportGroup (arg0, it, arg1, arg2, arg3?true:false, arg4?true:false); } FUNC(LS_TeleportInSector) // TeleportInSector (tag, source_tid, dest_tid, bFog, group_tid) { - return EV_TeleportSector (arg0, arg1, arg2, arg3?true:false, arg4); + return Level->EV_TeleportSector (arg0, arg1, arg2, arg3?true:false, arg4); } FUNC(LS_Teleport_EndGame) @@ -1192,7 +1192,7 @@ FUNC(LS_Teleport_EndGame) FUNC(LS_Teleport_Line) // Teleport_Line (thisid, destid, reversed) { - return EV_SilentLineTeleport (ln, backSide, it, arg1, arg2); + return Level->EV_SilentLineTeleport (ln, backSide, it, arg1, arg2); } static void ThrustThingHelper(AActor *it, DAngle angle, double force, INTBOOL nolimit) @@ -1544,21 +1544,21 @@ FUNC(LS_Thing_Destroy) FUNC(LS_Thing_Damage) // Thing_Damage (tid, amount, MOD) { - P_Thing_Damage (arg0, it, arg1, MODtoDamageType (arg2)); + Level->EV_Thing_Damage (arg0, it, arg1, MODtoDamageType (arg2)); return true; } FUNC(LS_Thing_Projectile) // Thing_Projectile (tid, type, angle, speed, vspeed) { - return P_Thing_Projectile (arg0, it, arg1, NULL, BYTEANGLE(arg2), SPEED(arg3), + return Level->EV_Thing_Projectile (arg0, it, arg1, NULL, BYTEANGLE(arg2), SPEED(arg3), SPEED(arg4), 0, NULL, 0, 0, false); } FUNC(LS_Thing_ProjectileGravity) // Thing_ProjectileGravity (tid, type, angle, speed, vspeed) { - return P_Thing_Projectile (arg0, it, arg1, NULL, BYTEANGLE(arg2), SPEED(arg3), + return Level->EV_Thing_Projectile (arg0, it, arg1, NULL, BYTEANGLE(arg2), SPEED(arg3), SPEED(arg4), 0, NULL, 1, 0, false); } @@ -1728,32 +1728,32 @@ FUNC(LS_Thing_Hate) FUNC(LS_Thing_ProjectileAimed) // Thing_ProjectileAimed (tid, type, speed, target, newtid) { - return P_Thing_Projectile (arg0, it, arg1, NULL, 0., SPEED(arg2), 0, arg3, it, 0, arg4, false); + return Level->EV_Thing_Projectile (arg0, it, arg1, NULL, 0., SPEED(arg2), 0, arg3, it, 0, arg4, false); } FUNC(LS_Thing_ProjectileIntercept) // Thing_ProjectileIntercept (tid, type, speed, target, newtid) { - return P_Thing_Projectile (arg0, it, arg1, NULL, 0., SPEED(arg2), 0, arg3, it, 0, arg4, true); + return Level->EV_Thing_Projectile (arg0, it, arg1, NULL, 0., SPEED(arg2), 0, arg3, it, 0, arg4, true); } // [BC] added newtid for next two FUNC(LS_Thing_Spawn) // Thing_Spawn (tid, type, angle, newtid) { - return P_Thing_Spawn (arg0, it, arg1, BYTEANGLE(arg2), true, arg3); + return Level->EV_Thing_Spawn (arg0, it, arg1, BYTEANGLE(arg2), true, arg3); } FUNC(LS_Thing_SpawnNoFog) // Thing_SpawnNoFog (tid, type, angle, newtid) { - return P_Thing_Spawn (arg0, it, arg1, BYTEANGLE(arg2), false, arg3); + return Level->EV_Thing_Spawn (arg0, it, arg1, BYTEANGLE(arg2), false, arg3); } FUNC(LS_Thing_SpawnFacing) // Thing_SpawnFacing (tid, type, nofog, newtid) { - return P_Thing_Spawn (arg0, it, arg1, 1000000., arg2 ? false : true, arg3); + return Level->EV_Thing_Spawn (arg0, it, arg1, 1000000., arg2 ? false : true, arg3); } FUNC(LS_Thing_Raise) @@ -1850,7 +1850,7 @@ FUNC(LS_Thing_SetGoal) FUNC(LS_Thing_Move) // [BC] // Thing_Move (tid, mapspot, nofog) { - return P_Thing_Move (arg0, it, arg1, arg2 ? false : true); + return Level->EV_Thing_Move (arg0, it, arg1, arg2 ? false : true); } enum @@ -2153,7 +2153,7 @@ FUNC(LS_Light_Stop) FUNC(LS_Radius_Quake) // Radius_Quake (intensity, duration, damrad, tremrad, tid) { - return P_StartQuake (it, arg4, arg0, arg1, arg2*64, arg3*64, "world/quake"); + return P_StartQuake (Level, it, arg4, arg0, arg1, arg2*64, arg3*64, "world/quake"); } FUNC(LS_UsePuzzleItem) @@ -2597,7 +2597,7 @@ FUNC(LS_Line_AlignCeiling) int line; while ((line = itr.Next()) >= 0) { - ret |= P_AlignFlat (line, !!arg1, 1); + ret |= Level->AlignFlat (line, !!arg1, 1); } return ret; } @@ -2611,7 +2611,7 @@ FUNC(LS_Line_AlignFloor) int line; while ((line = itr.Next()) >= 0) { - ret |= P_AlignFlat (line, !!arg1, 0); + ret |= Level->AlignFlat (line, !!arg1, 0); } return ret; } diff --git a/src/p_local.h b/src/p_local.h index 7b64fb807..e19581467 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -143,14 +143,7 @@ AActor *P_SpawnSubMissile (AActor *source, PClassActor *type, AActor *target); / extern FClassMap SpawnableThings; extern FClassMap StrifeTypes; -bool P_Thing_Spawn (int tid, AActor *source, int type, DAngle angle, bool fog, int newtid); -bool P_Thing_Projectile (int tid, AActor *source, int type, const char * type_name, DAngle angle, - double speed, double vspeed, int dest, AActor *forcedest, int gravity, int newtid, - bool leadTarget); - bool P_MoveThing(AActor *source, const DVector3 &pos, bool fog); -bool P_Thing_Move (int tid, AActor *source, int mapspot, bool fog); -int P_Thing_Damage (int tid, AActor *whofor0, int amount, FName type); void P_Thing_SetVelocity(AActor *actor, const DVector3 &vec, bool add, bool setbob); void P_RemoveThing(AActor * actor); bool P_Thing_Raise(AActor *thing, AActor *raiser, int flags = 0); diff --git a/src/p_maputl.cpp b/src/p_maputl.cpp index cf4b3cf03..4d748aa72 100644 --- a/src/p_maputl.cpp +++ b/src/p_maputl.cpp @@ -356,17 +356,17 @@ bool AActor::FixMapthingPos() { sector_t *secstart = P_PointInSectorBuggy(X(), Y()); - int blockx = level.blockmap.GetBlockX(X()); - int blocky = level.blockmap.GetBlockY(Y()); + int blockx = Level->blockmap.GetBlockX(X()); + int blocky = Level->blockmap.GetBlockY(Y()); bool success = false; - if (level.blockmap.isValidBlock(blockx, blocky)) + if (Level->blockmap.isValidBlock(blockx, blocky)) { int *list; - for (list = level.blockmap.GetLines(blockx, blocky); *list != -1; ++list) + for (list = Level->blockmap.GetLines(blockx, blocky); *list != -1; ++list) { - line_t *ldef = &level.lines[*list]; + line_t *ldef = &Level->lines[*list]; if (ldef->frontsector == ldef->backsector) { // Skip two-sided lines inside a single sector @@ -504,7 +504,7 @@ void AActor::LinkToWorld(FLinkContext *ctx, bool spawningmapthing, sector_t *sec { FPortalGroupArray check; - level.CollectConnectedGroups(Sector->PortalGroup, Pos(), Top(), radius, check); + Level->CollectConnectedGroups(Sector->PortalGroup, Pos(), Top(), radius, check); BlockNode = NULL; FBlockNode **alink = &this->BlockNode; @@ -512,25 +512,25 @@ void AActor::LinkToWorld(FLinkContext *ctx, bool spawningmapthing, sector_t *sec { DVector3 pos = i==-1? Pos() : PosRelative(check[i] & ~FPortalGroupArray::FLAT); - int x1 = level.blockmap.GetBlockX(pos.X - radius); - int x2 = level.blockmap.GetBlockX(pos.X + radius); - int y1 = level.blockmap.GetBlockY(pos.Y - radius); - int y2 = level.blockmap.GetBlockY(pos.Y + radius); + int x1 = Level->blockmap.GetBlockX(pos.X - radius); + int x2 = Level->blockmap.GetBlockX(pos.X + radius); + int y1 = Level->blockmap.GetBlockY(pos.Y - radius); + int y2 = Level->blockmap.GetBlockY(pos.Y + radius); - if (x1 >= level.blockmap.bmapwidth || x2 < 0 || y1 >= level.blockmap.bmapheight || y2 < 0) + if (x1 >= Level->blockmap.bmapwidth || x2 < 0 || y1 >= Level->blockmap.bmapheight || y2 < 0) { // thing is off the map } else { // [RH] Link into every block this actor touches, not just the center one x1 = MAX(0, x1); y1 = MAX(0, y1); - x2 = MIN(level.blockmap.bmapwidth - 1, x2); - y2 = MIN(level.blockmap.bmapheight - 1, y2); + x2 = MIN(Level->blockmap.bmapwidth - 1, x2); + y2 = MIN(Level->blockmap.bmapheight - 1, y2); for (int y = y1; y <= y2; ++y) { for (int x = x1; x <= x2; ++x) { - FBlockNode **link = &level.blockmap.blocklinks[y*level.blockmap.bmapwidth + x]; + FBlockNode **link = &Level->blockmap.blocklinks[y*Level->blockmap.bmapwidth + x]; FBlockNode *node = FBlockNode::Create(this, x, y, this->Sector->PortalGroup); // Link in to block @@ -1459,13 +1459,13 @@ void FPathTraverse::init(double x1, double y1, double x2, double y2, int flags, y2 += y1; } - x1 -= level.blockmap.bmaporgx; - y1 -= level.blockmap.bmaporgy; + x1 -= Level->blockmap.bmaporgx; + y1 -= Level->blockmap.bmaporgy; xt1 = x1 / FBlockmap::MAPBLOCKUNITS; yt1 = y1 / FBlockmap::MAPBLOCKUNITS; - x2 -= level.blockmap.bmaporgx; - y2 -= level.blockmap.bmaporgy; + x2 -= Level->blockmap.bmaporgx; + y2 -= Level->blockmap.bmaporgy; xt2 = x2 / FBlockmap::MAPBLOCKUNITS; yt2 = y2 / FBlockmap::MAPBLOCKUNITS; diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 9a3b747cd..fc2c43f02 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -4331,7 +4331,7 @@ bool AActor::UpdateWaterLevel(bool dosplash) else if (oldlevel == 3 && waterlevel < 3) { // Our head just came up. - if (player->air_finished > level.time) + if (player->air_finished > Level->time) { // We hadn't run out of air yet. S_Sound(this, CHAN_VOICE, "*surface", 1, ATTN_NORM); @@ -4356,29 +4356,17 @@ DEFINE_ACTION_FUNCTION(AActor, UpdateWaterLevel) // //========================================================================== -AActor *AActor::StaticSpawn (PClassActor *type, const DVector3 &pos, replace_t allowreplacement, bool SpawningMapThing) +void ConstructActor(AActor *actor, const DVector3 &pos, bool SpawningMapThing) { - if (type == NULL) - { - I_Error ("Tried to spawn a class-less actor\n"); - } - - if (allowreplacement) - { - type = type->GetReplacement(); - } - - AActor *actor; - - actor = static_cast(level.CreateThinker(type)); - actor->SpawnTime = level.totaltime; - actor->SpawnOrder = level.spawnindex++; + auto Level = actor->Level; + actor->SpawnTime = Level->totaltime; + actor->SpawnOrder = Level->spawnindex++; // Set default dialogue - actor->ConversationRoot = level.GetConversation(actor->GetClass()->TypeName); + actor->ConversationRoot = Level->GetConversation(actor->GetClass()->TypeName); if (actor->ConversationRoot != -1) { - actor->Conversation = level.StrifeDialogues[actor->ConversationRoot]; + actor->Conversation = Level->StrifeDialogues[actor->ConversationRoot]; } else { @@ -4440,7 +4428,7 @@ AActor *AActor::StaticSpawn (PClassActor *type, const DVector3 &pos, replace_t a actor->SetZ(actor->ceilingz - actor->Height); } - if (SpawningMapThing || !type->IsDescendantOf (NAME_PlayerPawn)) + if (SpawningMapThing || !actor->IsKindOf (NAME_PlayerPawn)) { // Check if there's something solid to stand on between the current position and the // current sector's floor. For map spawns this must be delayed until after setting the @@ -4516,30 +4504,50 @@ AActor *AActor::StaticSpawn (PClassActor *type, const DVector3 &pos, replace_t a actor->CallBeginPlay (); if (actor->ObjectFlags & OF_EuthanizeMe) { - return NULL; + return; } } - if (level.flags & LEVEL_NOALLIES && !actor->player) + if (Level->flags & LEVEL_NOALLIES && !actor->player) { actor->flags &= ~MF_FRIENDLY; } // [RH] Count monsters whenever they are spawned. if (actor->CountsAsKill()) { - level.total_monsters++; + Level->total_monsters++; } // [RH] Same, for items if (actor->flags & MF_COUNTITEM) { - level.total_items++; + Level->total_items++; } // And for secrets if (actor->flags5 & MF5_COUNTSECRET) { - level.total_secrets++; + Level->total_secrets++; } // force scroller check in the first tic. actor->flags8 |= MF8_INSCROLLSEC; +} + + +AActor *AActor::StaticSpawn(PClassActor *type, const DVector3 &pos, replace_t allowreplacement, bool SpawningMapThing) +{ + if (type == NULL) + { + I_Error("Tried to spawn a class-less actor\n"); + } + + if (allowreplacement) + { + type = type->GetReplacement(); + } + + AActor *actor; + + actor = static_cast(level.CreateThinker(type)); + + ConstructActor(actor, pos, SpawningMapThing); return actor; } @@ -4604,7 +4612,7 @@ void AActor::HandleSpawnFlags () if (flags & MF_COUNTKILL) { flags &= ~MF_COUNTKILL; - level.total_monsters--; + Level->total_monsters--; } } if (SpawnFlags & MTF_SHADOW) @@ -4623,7 +4631,7 @@ void AActor::HandleSpawnFlags () { //Printf("Secret %s in sector %i!\n", GetTag(), Sector->sectornum); flags5 |= MF5_COUNTSECRET; - level.total_secrets++; + Level->total_secrets++; } } } @@ -7122,7 +7130,7 @@ void AActor::Revive() // [RH] If it's a monster, it gets to count as another kill if (CountsAsKill()) { - level.total_monsters++; + Level->total_monsters++; } // [ZZ] resurrect hook diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 56ac0f6c8..7972d06d3 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -525,13 +525,13 @@ FSerializer &Serialize(FSerializer &arc, const char *key, zone_t &z, zone_t *def // //========================================================================== -void P_SerializeSounds(FSerializer &arc) +void P_SerializeSounds(FLevelLocals *Level, FSerializer &arc) { S_SerializeSounds(arc); DSeqNode::SerializeSequences (arc); const char *name = NULL; uint8_t order; - float musvol = level.MusicVolume; + float musvol = Level->MusicVolume; if (arc.isWriting()) { @@ -544,9 +544,9 @@ void P_SerializeSounds(FSerializer &arc) if (arc.isReading()) { if (!S_ChangeMusic(name, order)) - if (level.cdtrack == 0 || !S_ChangeCDMusic(level.cdtrack, level.cdid)) - S_ChangeMusic(level.Music, level.musicorder); - level.SetMusicVolume(musvol); + if (Level->cdtrack == 0 || !S_ChangeCDMusic(Level->cdtrack, Level->cdid)) + S_ChangeMusic(Level->Music, Level->musicorder); + Level->SetMusicVolume(musvol); } } @@ -977,7 +977,7 @@ void FLevelLocals::Serialize(FSerializer &arc, bool hubload) sky1texture = skytexture1; sky2texture = skytexture2; R_InitSkyMap(); - G_AirControlChanged(); + AirControlChanged(); } Behaviors.SerializeModuleStates(arc); @@ -1004,7 +1004,7 @@ void FLevelLocals::Serialize(FSerializer &arc, bool hubload) FRemapTable::StaticSerializeTranslations(arc); canvasTextureInfo.Serialize(arc); P_SerializePlayers(this, arc, hubload); - P_SerializeSounds(arc); + P_SerializeSounds(this, arc); // Regenerate some data that wasn't saved if (arc.isReading()) diff --git a/src/p_secnodes.cpp b/src/p_secnodes.cpp index 4f7bd0ffe..4400960ad 100644 --- a/src/p_secnodes.cpp +++ b/src/p_secnodes.cpp @@ -386,16 +386,16 @@ void AActor::UpdateRenderSectorList() { // Only check if the map contains line portals ClearRenderLineList(); - if (level.PortalBlockmap.containsLines && Pos().XY() != OldRenderPos.XY()) + if (Level->PortalBlockmap.containsLines && Pos().XY() != OldRenderPos.XY()) { - int bx = level.blockmap.GetBlockX(X()); - int by = level.blockmap.GetBlockY(Y()); + int bx = Level->blockmap.GetBlockX(X()); + int by = Level->blockmap.GetBlockY(Y()); FBoundingBox bb(X(), Y(), MIN(radius*1.5, 128.)); // Don't go further than 128 map units, even for large actors // Are there any portals near the actor's position? - if (level.blockmap.isValidBlock(bx, by) && level.PortalBlockmap(bx, by).neighborContainsLines) + if (Level->blockmap.isValidBlock(bx, by) && Level->PortalBlockmap(bx, by).neighborContainsLines) { // Go through the entire list. In most cases this is faster than setting up a blockmap iterator - for (auto &p : level.linePortals) + for (auto &p : Level->linePortals) { if (p.mType == PORTT_VISUAL) continue; if (bb.inRange(p.mOrigin) && bb.BoxOnLineSide(p.mOrigin)) diff --git a/src/p_sectors.cpp b/src/p_sectors.cpp index 3a43fbfa1..6001a3fe3 100644 --- a/src/p_sectors.cpp +++ b/src/p_sectors.cpp @@ -623,7 +623,7 @@ double FindHighestFloorPoint (const sector_t *sector, vertex_t **v) { if (v != NULL) { - if (sector->Lines.Size() == 0) *v = &level.vertexes[0]; + if (sector->Lines.Size() == 0) *v = §or->Level->vertexes[0]; else *v = sector->Lines[0]->v1; } return -sector->floorplane.fD(); @@ -663,7 +663,7 @@ double FindLowestCeilingPoint (const sector_t *sector, vertex_t **v) { if (v != nullptr) { - if (sector->Lines.Size() == 0) *v = &level.vertexes[0]; + if (sector->Lines.Size() == 0) *v = §or->Level->vertexes[0]; else *v = sector->Lines[0]->v1; } return sector->ceilingplane.fD(); @@ -1358,9 +1358,9 @@ bool secplane_t::CopyPlaneIfValid (secplane_t *dest, const secplane_t *opp) cons // //========================================================================== -bool P_AlignFlat (int linenum, int side, int fc) +bool FLevelLocals::AlignFlat (int linenum, int side, int fc) { - line_t *line = &level.lines[linenum]; + line_t *line = &lines[linenum]; sector_t *sec = side ? line->backsector : line->frontsector; if (!sec) @@ -1388,7 +1388,7 @@ bool P_AlignFlat (int linenum, int side, int fc) // //========================================================================== -void P_ReplaceTextures(const char *fromname, const char *toname, int flags) +void FLevelLocals::ReplaceTextures(const char *fromname, const char *toname, int flags) { FTextureID picnum1, picnum2; @@ -1400,7 +1400,7 @@ void P_ReplaceTextures(const char *fromname, const char *toname, int flags) picnum1 = TexMan.GetTextureID(fromname, ETextureType::Wall, FTextureManager::TEXMAN_Overridable); picnum2 = TexMan.GetTextureID(toname, ETextureType::Wall, FTextureManager::TEXMAN_Overridable); - for (auto &side : level.sides) + for (auto &side : sides) { for (int j = 0; j<3; j++) { @@ -1417,7 +1417,7 @@ void P_ReplaceTextures(const char *fromname, const char *toname, int flags) picnum1 = TexMan.GetTextureID(fromname, ETextureType::Flat, FTextureManager::TEXMAN_Overridable); picnum2 = TexMan.GetTextureID(toname, ETextureType::Flat, FTextureManager::TEXMAN_Overridable); - for (auto &sec : level.sectors) + for (auto &sec : sectors) { if (!(flags & NOT_FLOOR) && sec.GetTexture(sector_t::floor) == picnum1) sec.SetTexture(sector_t::floor, picnum2); @@ -1440,9 +1440,9 @@ void subsector_t::BuildPolyBSP() assert((BSP == NULL || BSP->bDirty) && "BSP computed more than once"); // Set up level information for the node builder. - PolyNodeLevel.Sides = &level.sides[0]; - PolyNodeLevel.NumSides = level.sides.Size(); - PolyNodeLevel.Lines = &level.lines[0]; + PolyNodeLevel.Sides = §or->Level->sides[0]; + PolyNodeLevel.NumSides = sector->Level->sides.Size(); + PolyNodeLevel.Lines = §or->Level->lines[0]; PolyNodeLevel.NumLines = numlines; // is this correct??? // Feed segs to the nodebuilder and build the nodes. @@ -1528,26 +1528,26 @@ int side_t::GetLightLevel (bool foggy, int baselight, bool is3dlight, int *pfake *pfakecontrast = 0; } - if (!foggy || level.flags3 & LEVEL3_FORCEFAKECONTRAST) // Don't do relative lighting in foggy sectors + if (!foggy || sector->Level->flags3 & LEVEL3_FORCEFAKECONTRAST) // Don't do relative lighting in foggy sectors { if (!(Flags & WALLF_NOFAKECONTRAST) && r_fakecontrast != 0) { DVector2 delta = linedef->Delta(); int rel; - if (((level.flags2 & LEVEL2_SMOOTHLIGHTING) || (Flags & WALLF_SMOOTHLIGHTING) || r_fakecontrast == 2) && + if (((sector->Level->flags2 & LEVEL2_SMOOTHLIGHTING) || (Flags & WALLF_SMOOTHLIGHTING) || r_fakecontrast == 2) && delta.X != 0) { rel = xs_RoundToInt // OMG LEE KILLOUGH LIVES! :/ ( - level.WallHorizLight + sector->Level->WallHorizLight + fabs(atan(delta.Y / delta.X) / 1.57079) - * (level.WallVertLight - level.WallHorizLight) + * (sector->Level->WallVertLight - sector->Level->WallHorizLight) ); } else { - rel = delta.X == 0 ? level.WallVertLight : - delta.Y == 0 ? level.WallHorizLight : 0; + rel = delta.X == 0 ? sector->Level->WallVertLight : + delta.Y == 0 ? sector->Level->WallHorizLight : 0; } if (pfakecontrast != NULL) { diff --git a/src/p_spec.h b/src/p_spec.h index 23414c33f..d959bf6ba 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -583,13 +583,7 @@ enum //Spawns teleport fog. Pass the actor to pluck TeleFogFromType and TeleFogToType. 'from' determines if this is the fog to spawn at the old position (true) or new (false). void P_SpawnTeleportFog(AActor *mobj, const DVector3 &pos, bool beforeTele = true, bool setTarget = false); - bool P_Teleport(AActor *thing, DVector3 pos, DAngle angle, int flags); -bool EV_Teleport (int tid, int tag, line_t *line, int side, AActor *thing, int flags); -bool EV_SilentLineTeleport (line_t *line, int side, AActor *thing, int id, INTBOOL reverse); -bool EV_TeleportOther (int other_tid, int dest_tid, bool fog); -bool EV_TeleportGroup (int group_tid, AActor *victim, int source_tid, int dest_tid, bool moveSource, bool fog); -bool EV_TeleportSector (int tag, int source_tid, int dest_tid, bool fog, int group_tid); // @@ -608,7 +602,7 @@ void P_TerminateScript (int script, const char *map); // // [RH] p_quake.c // -bool P_StartQuakeXYZ(AActor *activator, int tid, int intensityX, int intensityY, int intensityZ, int duration, int damrad, int tremrad, FSoundID quakesfx, int flags, double waveSpeedX, double waveSpeedY, double waveSpeedZ, int falloff, int highpoint, double rollIntensity, double rollWave); -bool P_StartQuake(AActor *activator, int tid, int intensity, int duration, int damrad, int tremrad, FSoundID quakesfx); +bool P_StartQuakeXYZ(FLevelLocals *Level, AActor *activator, int tid, int intensityX, int intensityY, int intensityZ, int duration, int damrad, int tremrad, FSoundID quakesfx, int flags, double waveSpeedX, double waveSpeedY, double waveSpeedZ, int falloff, int highpoint, double rollIntensity, double rollWave); +bool P_StartQuake(FLevelLocals *Level, AActor *activator, int tid, int intensity, int duration, int damrad, int tremrad, FSoundID quakesfx); #endif diff --git a/src/p_teleport.cpp b/src/p_teleport.cpp index 117245c67..4c423bdc8 100644 --- a/src/p_teleport.cpp +++ b/src/p_teleport.cpp @@ -186,7 +186,7 @@ bool P_Teleport (AActor *thing, DVector3 pos, DAngle angle, int flags) if (!predicting) { DVector2 vector = angle.ToVector(20); - DVector2 fogpos = level.GetPortalOffsetPosition(pos.X, pos.Y, vector.X, vector.Y); + DVector2 fogpos = thing->Level->GetPortalOffsetPosition(pos.X, pos.Y, vector.X, vector.Y); P_SpawnTeleportFog(thing, DVector3(fogpos, thing->Z()), false, true); } @@ -235,7 +235,7 @@ DEFINE_ACTION_FUNCTION(AActor, Teleport) ACTION_RETURN_BOOL(P_Teleport(self, DVector3(x, y, z), an, flags)); } -static AActor *SelectTeleDest (int tid, int tag, bool norandom) +AActor *FLevelLocals::SelectTeleDest (int tid, int tag, bool norandom) { AActor *searcher; @@ -250,11 +250,11 @@ static AActor *SelectTeleDest (int tid, int tag, bool norandom) if (tid != 0) { - auto iterator = level.GetActorIterator(NAME_TeleportDest, tid); + auto iterator = GetActorIterator(NAME_TeleportDest, tid); int count = 0; while ( (searcher = iterator.Next ()) ) { - if (tag == 0 || level.SectorHasTag(searcher->Sector, tag)) + if (tag == 0 || SectorHasTag(searcher->Sector, tag)) { count++; } @@ -268,12 +268,12 @@ static AActor *SelectTeleDest (int tid, int tag, bool norandom) if (tag == 0) { // Try to find a matching map spot (fixes Hexen MAP10) - auto it2 = level.GetActorIterator(NAME_MapSpot, tid); + auto it2 = GetActorIterator(NAME_MapSpot, tid); searcher = it2.Next (); if (searcher == nullptr) { // Try to find a matching non-blocking spot of any type (fixes Caldera MAP13) - auto it3 = level.GetActorIterator(tid); + auto it3 = GetActorIterator(tid); searcher = it3.Next (); while (searcher != NULL && (searcher->flags & MF_SOLID)) { @@ -293,7 +293,7 @@ static AActor *SelectTeleDest (int tid, int tag, bool norandom) while (count > 0) { searcher = iterator.Next (); - if (tag == 0 || level.SectorHasTag(searcher->Sector, tag)) + if (tag == 0 || SectorHasTag(searcher->Sector, tag)) { count--; } @@ -306,7 +306,7 @@ static AActor *SelectTeleDest (int tid, int tag, bool norandom) { int secnum; - auto itr = level.GetSectorTagIterator(tag); + auto itr = GetSectorTagIterator(tag); while ((secnum = itr.Next()) >= 0) { // Scanning the snext links of things in the sector will not work, because @@ -319,7 +319,7 @@ static AActor *SelectTeleDest (int tid, int tag, bool norandom) TThinkerIterator it2(NAME_TeleportDest); while ((searcher = it2.Next()) != NULL) { - if (searcher->Sector == &level.sectors[secnum]) + if (searcher->Sector == §ors[secnum]) { return searcher; } @@ -330,7 +330,7 @@ static AActor *SelectTeleDest (int tid, int tag, bool norandom) return NULL; } -bool EV_Teleport (int tid, int tag, line_t *line, int side, AActor *thing, int flags) +bool FLevelLocals::EV_Teleport (int tid, int tag, line_t *line, int side, AActor *thing, int flags) { AActor *searcher; double z; @@ -422,7 +422,7 @@ bool EV_Teleport (int tid, int tag, line_t *line, int side, AActor *thing, int f // [RH] Modified to support different source and destination ids. // [RH] Modified some more to be accurate. -bool EV_SilentLineTeleport (line_t *line, int side, AActor *thing, int id, INTBOOL reverse) +bool FLevelLocals::EV_SilentLineTeleport (line_t *line, int side, AActor *thing, int id, INTBOOL reverse) { int i; line_t *l; @@ -430,13 +430,13 @@ bool EV_SilentLineTeleport (line_t *line, int side, AActor *thing, int id, INTBO if (side || thing->flags2 & MF2_NOTELEPORT || !line || line->sidedef[1] == NULL) return false; - auto itr = level.GetLineIdIterator(id); + auto itr = GetLineIdIterator(id); while ((i = itr.Next()) >= 0) { if (line->Index() == i) continue; - if ((l=&level.lines[i]) != line && l->backsector) + if ((l=&lines[i]) != line && l->backsector) { // Get the thing's position along the source linedef double pos; @@ -600,14 +600,14 @@ bool EV_SilentLineTeleport (line_t *line, int side, AActor *thing, int id, INTBO } // [RH] Teleport anything matching other_tid to dest_tid -bool EV_TeleportOther (int other_tid, int dest_tid, bool fog) +bool FLevelLocals::EV_TeleportOther (int other_tid, int dest_tid, bool fog) { bool didSomething = false; if (other_tid != 0 && dest_tid != 0) { AActor *victim; - auto iterator = level.GetActorIterator(other_tid); + auto iterator = GetActorIterator(other_tid); while ( (victim = iterator.Next ()) ) { @@ -619,7 +619,7 @@ bool EV_TeleportOther (int other_tid, int dest_tid, bool fog) return didSomething; } -static bool DoGroupForOne (AActor *victim, AActor *source, AActor *dest, bool floorz, bool fog) +bool DoGroupForOne (AActor *victim, AActor *source, AActor *dest, bool floorz, bool fog) { DAngle an = dest->Angles.Yaw - source->Angles.Yaw; DVector2 off = victim->Pos() - source->Pos(); @@ -638,11 +638,11 @@ static bool DoGroupForOne (AActor *victim, AActor *source, AActor *dest, bool fl // [RH] Teleport a group of actors centered around source_tid so // that they become centered around dest_tid instead. -bool EV_TeleportGroup (int group_tid, AActor *victim, int source_tid, int dest_tid, bool moveSource, bool fog) +bool FLevelLocals::EV_TeleportGroup (int group_tid, AActor *victim, int source_tid, int dest_tid, bool moveSource, bool fog) { AActor *sourceOrigin, *destOrigin; { - auto iterator = level.GetActorIterator(source_tid); + auto iterator = GetActorIterator(source_tid); sourceOrigin = iterator.Next (); } if (sourceOrigin == NULL) @@ -651,7 +651,7 @@ bool EV_TeleportGroup (int group_tid, AActor *victim, int source_tid, int dest_t } { - auto iterator = level.GetActorIterator(NAME_TeleportDest, dest_tid); + auto iterator = GetActorIterator(NAME_TeleportDest, dest_tid); destOrigin = iterator.Next (); } if (destOrigin == NULL) @@ -669,7 +669,7 @@ bool EV_TeleportGroup (int group_tid, AActor *victim, int source_tid, int dest_t } else { - auto iterator = level.GetActorIterator(group_tid); + auto iterator = GetActorIterator(group_tid); // For each actor with tid matching arg0, move it to the same // position relative to destOrigin as it is relative to sourceOrigin @@ -693,11 +693,11 @@ bool EV_TeleportGroup (int group_tid, AActor *victim, int source_tid, int dest_t // [RH] Teleport a group of actors in a sector. Source_tid is used as a // reference point so that they end up in the same position relative to // dest_tid. Group_tid can be used to not teleport all actors in the sector. -bool EV_TeleportSector (int tag, int source_tid, int dest_tid, bool fog, int group_tid) +bool FLevelLocals::EV_TeleportSector (int tag, int source_tid, int dest_tid, bool fog, int group_tid) { AActor *sourceOrigin, *destOrigin; { - auto iterator = level.GetActorIterator(source_tid); + auto iterator = GetActorIterator(source_tid); sourceOrigin = iterator.Next (); } if (sourceOrigin == NULL) @@ -705,7 +705,7 @@ bool EV_TeleportSector (int tag, int source_tid, int dest_tid, bool fog, int gro return false; } { - auto iterator = level.GetActorIterator(NAME_TeleportDest, dest_tid); + auto iterator = GetActorIterator(NAME_TeleportDest, dest_tid); destOrigin = iterator.Next (); } if (destOrigin == NULL) @@ -718,11 +718,11 @@ bool EV_TeleportSector (int tag, int source_tid, int dest_tid, bool fog, int gro int secnum; secnum = -1; - auto itr = level.GetSectorTagIterator(tag); + auto itr = GetSectorTagIterator(tag); while ((secnum = itr.Next()) >= 0) { msecnode_t *node; - const sector_t * const sec = &level.sectors[secnum]; + const sector_t * const sec = §ors[secnum]; for (node = sec->touching_thinglist; node; ) { diff --git a/src/p_things.cpp b/src/p_things.cpp index 1f9d6ed26..a65ff70b8 100644 --- a/src/p_things.cpp +++ b/src/p_things.cpp @@ -52,12 +52,12 @@ FClassMap SpawnableThings; static FRandom pr_leadtarget ("LeadTarget"); -bool P_Thing_Spawn (int tid, AActor *source, int type, DAngle angle, bool fog, int newtid) +bool FLevelLocals::EV_Thing_Spawn (int tid, AActor *source, int type, DAngle angle, bool fog, int newtid) { int rtn = 0; PClassActor *kind; AActor *spot, *mobj; - auto iterator = level.GetActorIterator(tid); + auto iterator = GetActorIterator(tid); kind = P_GetSpawnableType(type); @@ -68,7 +68,7 @@ bool P_Thing_Spawn (int tid, AActor *source, int type, DAngle angle, bool fog, i kind = kind->GetReplacement(); if ((GetDefaultByType(kind)->flags3 & MF3_ISMONSTER) && - ((dmflags & DF_NO_MONSTERS) || (level.flags2 & LEVEL2_NOMONSTERS))) + ((dmflags & DF_NO_MONSTERS) || (flags2 & LEVEL2_NOMONSTERS))) return false; if (tid == 0) @@ -144,16 +144,16 @@ bool P_MoveThing(AActor *source, const DVector3 &pos, bool fog) } } -bool P_Thing_Move (int tid, AActor *source, int mapspot, bool fog) +bool FLevelLocals::EV_Thing_Move (int tid, AActor *source, int mapspot, bool fog) { AActor *target; if (tid != 0) { - auto iterator1 = level.GetActorIterator(tid); + auto iterator1 = GetActorIterator(tid); source = iterator1.Next(); } - auto iterator2 = level.GetActorIterator(mapspot); + auto iterator2 = GetActorIterator(mapspot); target = iterator2.Next (); if (source != NULL && target != NULL) @@ -256,14 +256,14 @@ DEFINE_ACTION_FUNCTION(AActor, VelIntercept) return 0; } -bool P_Thing_Projectile (int tid, AActor *source, int type, const char *type_name, DAngle angle, +bool FLevelLocals::EV_Thing_Projectile (int tid, AActor *source, int type, const char *type_name, DAngle angle, double speed, double vspeed, int dest, AActor *forcedest, int gravity, int newtid, bool leadTarget) { int rtn = 0; PClassActor *kind; AActor *spot, *mobj, *targ = forcedest; - auto iterator = level.GetActorIterator(tid); + auto iterator = GetActorIterator(tid); int defflags3; if (type_name == NULL) @@ -284,7 +284,7 @@ bool P_Thing_Projectile (int tid, AActor *source, int type, const char *type_nam defflags3 = GetDefaultByType(kind)->flags3; if ((defflags3 & MF3_ISMONSTER) && - ((dmflags & DF_NO_MONSTERS) || (level.flags2 & LEVEL2_NOMONSTERS))) + ((dmflags & DF_NO_MONSTERS) || (flags2 & LEVEL2_NOMONSTERS))) return false; if (tid == 0) @@ -297,7 +297,7 @@ bool P_Thing_Projectile (int tid, AActor *source, int type, const char *type_nam } while (spot != NULL) { - auto tit = level.GetActorIterator(dest); + auto tit = GetActorIterator(dest); if (dest == 0 || (targ = tit.Next())) { @@ -394,9 +394,9 @@ bool P_Thing_Projectile (int tid, AActor *source, int type, const char *type_nam return rtn != 0; } -int P_Thing_Damage (int tid, AActor *whofor0, int amount, FName type) +int FLevelLocals::EV_Thing_Damage (int tid, AActor *whofor0, int amount, FName type) { - auto iterator = level.GetActorIterator(tid); + auto iterator = GetActorIterator(tid); int count = 0; AActor *actor; @@ -876,6 +876,7 @@ int P_Thing_Warp(AActor *caller, AActor *reference, double xofs, double yofs, do } DVector3 old = caller->Pos(); + auto Level = caller->Level; int oldpgroup = caller->Sector->PortalGroup; zofs += reference->Height * heightoffset; @@ -957,15 +958,15 @@ int P_Thing_Warp(AActor *caller, AActor *reference, double xofs, double yofs, do if (flags & WARPF_WARPINTERPOLATION) { // This just translates the movement but doesn't change the vector - DVector3 displacedold = old + level.Displacements.getOffset(oldpgroup, caller->Sector->PortalGroup); + DVector3 displacedold = old + Level->Displacements.getOffset(oldpgroup, caller->Sector->PortalGroup); caller->Prev += caller->Pos() - displacedold; caller->PrevPortalGroup = caller->Sector->PortalGroup; } else if (flags & WARPF_COPYINTERPOLATION) { // Map both positions of the reference actor to the current portal group - DVector3 displacedold = old + level.Displacements.getOffset(reference->PrevPortalGroup, caller->Sector->PortalGroup); - DVector3 displacedref = old + level.Displacements.getOffset(reference->Sector->PortalGroup, caller->Sector->PortalGroup); + DVector3 displacedold = old + Level->Displacements.getOffset(reference->PrevPortalGroup, caller->Sector->PortalGroup); + DVector3 displacedref = old + Level->Displacements.getOffset(reference->Sector->PortalGroup, caller->Sector->PortalGroup); caller->Prev = caller->Pos() + displacedold - displacedref; caller->PrevPortalGroup = caller->Sector->PortalGroup; } diff --git a/src/p_user.cpp b/src/p_user.cpp index 88f47db38..7e6ec3c0d 100644 --- a/src/p_user.cpp +++ b/src/p_user.cpp @@ -993,8 +993,8 @@ void P_CheckPlayerSprite(AActor *actor, int &spritenum, DVector2 &scale) CUSTOM_CVAR (Float, sv_aircontrol, 0.00390625f, CVAR_SERVERINFO|CVAR_NOSAVE) { - level.aircontrol = self; - G_AirControlChanged (); + currentUILevel->aircontrol = self; + currentUILevel->AirControlChanged (); } //========================================================================== diff --git a/src/r_data/a_dynlightdata.cpp b/src/r_data/a_dynlightdata.cpp index acddbe906..f0b66f972 100644 --- a/src/r_data/a_dynlightdata.cpp +++ b/src/r_data/a_dynlightdata.cpp @@ -89,7 +89,7 @@ void FLightDefaults::ApplyProperties(FDynamicLight * light) const { float pulseTime = float(m_Param / TICRATE); - light->m_lastUpdate = level.maptime; + light->m_lastUpdate = light->Level->maptime; if (m_swapped) light->m_cycler.SetParams(float(m_Args[LIGHT_SECONDARY_INTENSITY]), float(m_Args[LIGHT_INTENSITY]), pulseTime, oldtype == PulseLight); else light->m_cycler.SetParams(float(m_Args[LIGHT_INTENSITY]), float(m_Args[LIGHT_SECONDARY_INTENSITY]), pulseTime, oldtype == PulseLight); light->m_cycler.ShouldCycle(true); diff --git a/src/r_data/r_canvastexture.cpp b/src/r_data/r_canvastexture.cpp index a64f50b87..4a159170f 100644 --- a/src/r_data/r_canvastexture.cpp +++ b/src/r_data/r_canvastexture.cpp @@ -102,7 +102,7 @@ void SetCameraToTexture(AActor *viewpoint, const FString &texturename, double fo FTexture *tex = TexMan.GetTexture(textureid); if (tex && tex->isCanvas()) { - level.canvasTextureInfo.Add(viewpoint, textureid, fov); + viewpoint->Level->canvasTextureInfo.Add(viewpoint, textureid, fov); } } } diff --git a/src/r_data/r_translate.cpp b/src/r_data/r_translate.cpp index cb3cd28fd..e6a85c929 100644 --- a/src/r_data/r_translate.cpp +++ b/src/r_data/r_translate.cpp @@ -919,7 +919,7 @@ void R_InitTranslationTables () // Each player corpse has its own translation so they won't change // color if the player who created them changes theirs. - for (i = 0; i < level.BODYQUESIZE; ++i) + for (i = 0; i < FLevelLocals::BODYQUESIZE; ++i) { PushIdentityTable(TRANSLATION_PlayerCorpses); } diff --git a/src/scripting/vmthunks.cpp b/src/scripting/vmthunks.cpp index bcd250c83..ee7f3a89d 100644 --- a/src/scripting/vmthunks.cpp +++ b/src/scripting/vmthunks.cpp @@ -1621,18 +1621,18 @@ DEFINE_ACTION_FUNCTION_NATIVE(_Sector, RemoveForceField, RemoveForceField) //===================================================================================== // This is needed to convert the strings to char pointers. - static void ReplaceTextures(const FString &from, const FString &to, int flags) + static void ReplaceTextures(FLevelLocals *self, const FString &from, const FString &to, int flags) { - P_ReplaceTextures(from, to, flags); + self->ReplaceTextures(from, to, flags); } -DEFINE_ACTION_FUNCTION_NATIVE(_TexMan, ReplaceTextures, ReplaceTextures) +DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, ReplaceTextures, ReplaceTextures) { - PARAM_PROLOGUE; + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); PARAM_STRING(from); PARAM_STRING(to); PARAM_INT(flags); - P_ReplaceTextures(from, to, flags); + self->ReplaceTextures(from, to, flags); return 0; } diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index d449bfd34..5e52f3e5a 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -92,7 +92,10 @@ struct TexMan }; native static TextureID CheckForTexture(String name, int usetype, int flags = TryAny); - native static void ReplaceTextures(String from, String to, int flags); + deprecated("3.8") static void ReplaceTextures(String from, String to, int flags) + { + level.ReplaceTextures(from, to, flags); + } native static String GetName(TextureID tex); native static int, int GetSize(TextureID tex); native static Vector2 GetScaledSize(TextureID tex); @@ -699,6 +702,7 @@ struct LevelLocals native native SpotState GetSpotState(bool create = true); native int FindUniqueTid(int start = 0, int limit = 0); native uint GetSkyboxPortal(Actor actor); + native void ReplaceTextures(String from, String to, int flags); native static clearscope bool IsPointInMap(vector3 p); From 648e4727445100fddec1898f04a6c7c1fef34e6e Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 28 Jan 2019 00:55:21 +0100 Subject: [PATCH 048/164] - handled approx. half of all cases where the address of level is taken. --- src/am_map.cpp | 2 +- src/b_func.cpp | 2 +- src/b_think.cpp | 2 +- src/d_net.cpp | 2 +- src/fragglescript/t_func.cpp | 2 +- src/fragglescript/t_prepro.cpp | 12 +++++------ src/fragglescript/t_script.cpp | 14 ++++++------- src/fragglescript/t_script.h | 10 ++++++---- src/fragglescript/t_spec.cpp | 2 +- src/g_level.cpp | 6 +++--- src/g_levellocals.h | 9 +++++++-- src/g_shared/a_decals.cpp | 4 ++-- src/g_shared/a_lightning.cpp | 8 ++++---- src/g_shared/a_quake.cpp | 2 +- src/g_statusbar/shared_sbar.cpp | 4 ++-- src/gl/renderer/gl_renderer.cpp | 2 +- src/maploader/polyobjects.cpp | 4 ++++ src/nodebuild.cpp | 8 ++++---- src/nodebuild.h | 6 +++--- src/p_acs.cpp | 24 +++++++++++----------- src/p_actionfunctions.cpp | 2 +- src/p_conversation.cpp | 4 ++-- src/p_lnspec.cpp | 32 +++++++++++++++--------------- src/p_map.cpp | 16 +++++++-------- src/p_setup.cpp | 12 +++++------ src/p_spec.cpp | 8 ++------ src/p_spec.h | 6 +++--- src/p_switch.cpp | 4 ++-- src/p_teleport.cpp | 2 +- src/p_things.cpp | 2 +- src/po_man.cpp | 13 +----------- src/po_man.h | 4 +--- src/polyrenderer/poly_renderer.cpp | 2 +- src/r_utility.cpp | 2 +- src/s_sound.cpp | 8 ++++---- src/s_sound.h | 2 +- src/scripting/vmthunks_actors.cpp | 2 +- src/statistics.cpp | 4 ++-- 38 files changed, 122 insertions(+), 128 deletions(-) diff --git a/src/am_map.cpp b/src/am_map.cpp index 8d0fbecfe..2a603be7b 100644 --- a/src/am_map.cpp +++ b/src/am_map.cpp @@ -2824,7 +2824,7 @@ void DAutomap::drawKeys () mpoint_t p; DAngle angle; - TThinkerIterator it(NAME_Key); + auto it = Level->GetThinkerIterator(NAME_Key); AActor *key; while ((key = it.Next()) != nullptr) diff --git a/src/b_func.cpp b/src/b_func.cpp index 36bbcf5c2..ddc491986 100644 --- a/src/b_func.cpp +++ b/src/b_func.cpp @@ -73,7 +73,7 @@ bool DBot::Reachable (AActor *rtarget) double estimated_dist = player->mo->Distance2D(rtarget); bool reachable = true; - FPathTraverse it(&level, player->mo->X()+player->mo->Vel.X, player->mo->Y()+player->mo->Vel.Y, rtarget->X(), rtarget->Y(), PT_ADDLINES|PT_ADDTHINGS); + FPathTraverse it(Level, player->mo->X()+player->mo->Vel.X, player->mo->Y()+player->mo->Vel.Y, rtarget->X(), rtarget->Y(), PT_ADDLINES|PT_ADDTHINGS); intercept_t *in; while ((in = it.Next())) { diff --git a/src/b_think.cpp b/src/b_think.cpp index 82954d83e..a0a30180d 100644 --- a/src/b_think.cpp +++ b/src/b_think.cpp @@ -289,7 +289,7 @@ void DBot::ThinkForMove (ticcmd_t *cmd) r = pr_botmove(); if (r < 128) { - TThinkerIterator it (NAME_Inventory, MAX_STATNUM+1, bglobal.firstthing); + auto it = player->mo->Level->GetThinkerIterator(NAME_Inventory, MAX_STATNUM+1, bglobal.firstthing); auto item = it.Next(); if (item != NULL || (item = it.Next()) != NULL) diff --git a/src/d_net.cpp b/src/d_net.cpp index a5b144b86..f062e8ddf 100644 --- a/src/d_net.cpp +++ b/src/d_net.cpp @@ -2697,7 +2697,7 @@ static void RunScript(uint8_t **stream, AActor *pawn, int snum, int argn, int al arg[i] = argval; } } - P_StartScript(pawn, NULL, snum, level.MapName, arg, MIN(countof(arg), argn), ACS_NET | always); + P_StartScript(pawn->Level, pawn, NULL, snum, level.MapName, arg, MIN(countof(arg), argn), ACS_NET | always); } void Net_SkipCommand (int type, uint8_t **stream) diff --git a/src/fragglescript/t_func.cpp b/src/fragglescript/t_func.cpp index 2797191bc..7d3fc89ae 100644 --- a/src/fragglescript/t_func.cpp +++ b/src/fragglescript/t_func.cpp @@ -560,7 +560,7 @@ void FParser::SF_Include(void) else mysnprintf(tempstr, countof(tempstr), "%i", (int)t_argv[0].value.i); - Script->ParseInclude(tempstr); + Script->ParseInclude(Level, tempstr); } } diff --git a/src/fragglescript/t_prepro.cpp b/src/fragglescript/t_prepro.cpp index d5667d7c7..4c75b95f0 100644 --- a/src/fragglescript/t_prepro.cpp +++ b/src/fragglescript/t_prepro.cpp @@ -333,13 +333,13 @@ char *DFsScript::ProcessFindChar(char *datap, char find) // //========================================================================== -void DFsScript::DryRunScript() +void DFsScript::DryRunScript(FLevelLocals *Level) { char *end = data + len; char *rover = data; // allocate space for the tokens - FParser parse(&level, this); + FParser parse(Level, this); try { while(rover < end && *rover) @@ -387,11 +387,11 @@ void DFsScript::DryRunScript() // //========================================================================== -void DFsScript::Preprocess() +void DFsScript::Preprocess(FLevelLocals *Level) { len = (int)strlen(data); ProcessFindChar(data, 0); // fill in everything - DryRunScript(); + DryRunScript(Level); } //========================================================================== @@ -406,7 +406,7 @@ void DFsScript::Preprocess() // //========================================================================== -void DFsScript::ParseInclude(char *lumpname) +void DFsScript::ParseInclude(FLevelLocals *Level, char *lumpname) { int lumpnum; char *lump; @@ -429,7 +429,7 @@ void DFsScript::ParseInclude(char *lumpname) ProcessFindChar(lump, 0); // now parse the lump - FParser parse(&level, this); + FParser parse(Level, this); parse.Run(lump, lump, lump+lumplen); // free the lump diff --git a/src/fragglescript/t_script.cpp b/src/fragglescript/t_script.cpp index 818323eef..534eb5fa4 100644 --- a/src/fragglescript/t_script.cpp +++ b/src/fragglescript/t_script.cpp @@ -196,7 +196,7 @@ void DFsScript::Serialize(FSerializer &arc) // //========================================================================== -void DFsScript::ParseScript(char *position, AActor **pTrigger) +void DFsScript::ParseScript(char *position, DFraggleThinker *th) { if (position == nullptr) { @@ -211,11 +211,11 @@ void DFsScript::ParseScript(char *position, AActor **pTrigger) return; } - *pTrigger = trigger; // set trigger variable. + th->trigger_obj = trigger; // set trigger variable. try { - FParser parse(&level, this); + FParser parse(th->Level, this); parse.Run(position, data, data + len); } catch (CFraggleScriptError &err) @@ -528,7 +528,7 @@ void DFraggleThinker::Tick() next = current->next; // save before freeing // continue the script - current->script->ParseScript (current->script->data + current->save_point, &trigger_obj); + current->script->ParseScript (current->script->data + current->save_point, this); // free current->Destroy(); @@ -618,8 +618,8 @@ void T_PreprocessScripts(FLevelLocals *Level) // levelscript started by player 0 'superplayer' th->LevelScript->trigger = players[0].mo; - th->LevelScript->Preprocess(); - th->LevelScript->ParseScript(nullptr, &th->trigger_obj); + th->LevelScript->Preprocess(Level); + th->LevelScript->ParseScript(nullptr, th); } } @@ -667,6 +667,6 @@ CCMD(fpuke) } else { - T_RunScript(&level, atoi(argv[1]), players[consoleplayer].mo); + T_RunScript(currentUILevel, atoi(argv[1]), players[consoleplayer].mo); } } diff --git a/src/fragglescript/t_script.h b/src/fragglescript/t_script.h index 6d09d0d01..f21300887 100644 --- a/src/fragglescript/t_script.h +++ b/src/fragglescript/t_script.h @@ -35,6 +35,8 @@ #pragma pointers_to_members( full_generality, single_inheritance ) #endif +class DFraggleThinker; + class CFraggleScriptError : public CDoomError { @@ -360,10 +362,10 @@ public: DFsSection *FindSectionStart(const char *brace); DFsSection *FindSectionEnd(const char *brace); char *ProcessFindChar(char *data, char find); - void DryRunScript(); - void Preprocess(); - void ParseInclude(char *lumpname); - void ParseScript(char *rover, AActor **pTrigger); + void DryRunScript(FLevelLocals *Level); + void Preprocess(FLevelLocals *Level); + void ParseInclude(FLevelLocals *Level, char *lumpname); + void ParseScript(char *rover, DFraggleThinker *th); void ParseData(char *rover, char *data, char *end); }; diff --git a/src/fragglescript/t_spec.cpp b/src/fragglescript/t_spec.cpp index c52f4cd29..5361c7c1e 100644 --- a/src/fragglescript/t_spec.cpp +++ b/src/fragglescript/t_spec.cpp @@ -429,7 +429,7 @@ void FParser::spec_script() newscript->parent = Script; // remember parent // preprocess the newscript now - newscript->Preprocess(); + newscript->Preprocess(Level); // we dont want to run the newscript, only add it // jump past the newscript in parsing diff --git a/src/g_level.cpp b/src/g_level.cpp index 4f57af68a..1eabc17a8 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -2012,11 +2012,11 @@ void FLevelLocals::AddScroller (int secnum) void FLevelLocals::SetInterMusic(const char *nextmap) { - auto mus = level.info->MapInterMusic.CheckKey(nextmap); + auto mus = info->MapInterMusic.CheckKey(nextmap); if (mus != nullptr) S_ChangeMusic(mus->first, mus->second); - else if (level.info->InterMusic.IsNotEmpty()) - S_ChangeMusic(level.info->InterMusic, level.info->intermusicorder); + else if (info->InterMusic.IsNotEmpty()) + S_ChangeMusic(info->InterMusic, info->intermusicorder); else S_ChangeMusic(gameinfo.intermissionMusic.GetChars(), gameinfo.intermissionOrder); } diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 79012fb58..fcf92642e 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -286,6 +286,10 @@ public: if (subtype == NAME_None) return TThinkerIterator(statnum); else return TThinkerIterator(subtype, statnum); } + template TThinkerIterator GetThinkerIterator(FName subtype, int statnum, AActor *prev) + { + return TThinkerIterator(subtype, statnum, prev); + } FActorIterator GetActorIterator(int tid) { return FActorIterator(TIDHash, tid); @@ -524,7 +528,8 @@ extern FLevelLocals *currentUILevel; // level for which to display the user inte inline FSectorPortal *line_t::GetTransferredPortal() { - return portaltransferred >= level.sectorPortals.Size() ? (FSectorPortal*)nullptr : &level.sectorPortals[portaltransferred]; + auto Level = GetLevel(); + return portaltransferred >= Level->sectorPortals.Size() ? (FSectorPortal*)nullptr : &Level->sectorPortals[portaltransferred]; } inline FSectorPortal *sector_t::GetPortal(int plane) @@ -580,7 +585,7 @@ inline bool sector_t::PortalIsLinked(int plane) inline FLevelLocals *line_t::GetLevel() const { - return &level; + return frontsector->Level; } inline FLinePortal *line_t::getPortal() const { diff --git a/src/g_shared/a_decals.cpp b/src/g_shared/a_decals.cpp index a2283852c..8373231a8 100644 --- a/src/g_shared/a_decals.cpp +++ b/src/g_shared/a_decals.cpp @@ -407,7 +407,7 @@ void DBaseDecal::SpreadLeft (double r, vertex_t *v1, side_t *feelwall, F3DFloor double x = v1->fX(); double y = v1->fY(); - feelwall = &level.sides[feelwall->LeftSide]; + feelwall = &feelwall->GetLevel()->sides[feelwall->LeftSide]; GetWallStuff (feelwall, v1, ldx, ldy); double wallsize = Length (ldx, ldy); r += spread->DecalLeft; @@ -447,7 +447,7 @@ void DBaseDecal::SpreadRight (double r, side_t *feelwall, double wallsize, F3DFl while (r > wallsize && feelwall->RightSide != NO_SIDE) { - feelwall = &level.sides[feelwall->RightSide]; + feelwall = &feelwall->GetLevel()->sides[feelwall->RightSide]; side_t *nextwall = NextWall (feelwall); if (nextwall != NULL && nextwall->LeftSide != NO_SIDE) diff --git a/src/g_shared/a_lightning.cpp b/src/g_shared/a_lightning.cpp index e1610e6ee..d52bd1b92 100644 --- a/src/g_shared/a_lightning.cpp +++ b/src/g_shared/a_lightning.cpp @@ -196,9 +196,9 @@ void DLightningThinker::ForceLightning (int mode) } } -static DLightningThinker *LocateLightning () +static DLightningThinker *LocateLightning (FLevelLocals *Level) { - TThinkerIterator iterator (STAT_LIGHTNING); + auto iterator = Level->GetThinkerIterator(NAME_None, STAT_LIGHTNING); return iterator.Next (); } @@ -230,7 +230,7 @@ void FLevelLocals::StartLightning () } } - DLightningThinker *lightning = LocateLightning (); + DLightningThinker *lightning = LocateLightning (this); if (lightning == nullptr) { CreateThinker(); @@ -239,7 +239,7 @@ void FLevelLocals::StartLightning () void FLevelLocals::ForceLightning (int mode) { - DLightningThinker *lightning = LocateLightning (); + DLightningThinker *lightning = LocateLightning (this); if (lightning == nullptr) { lightning = CreateThinker(); diff --git a/src/g_shared/a_quake.cpp b/src/g_shared/a_quake.cpp index 892ba586b..a00307f7e 100644 --- a/src/g_shared/a_quake.cpp +++ b/src/g_shared/a_quake.cpp @@ -288,7 +288,7 @@ int DEarthquake::StaticGetQuakeIntensities(double ticFrac, AActor *victim, FQuak return 0; } - TThinkerIterator iterator(STAT_EARTHQUAKE); + auto iterator = victim->Level->GetThinkerIterator(NAME_None, STAT_EARTHQUAKE); DEarthquake *quake; int count = 0; diff --git a/src/g_statusbar/shared_sbar.cpp b/src/g_statusbar/shared_sbar.cpp index 378af905f..6a17fda2f 100644 --- a/src/g_statusbar/shared_sbar.cpp +++ b/src/g_statusbar/shared_sbar.cpp @@ -788,7 +788,7 @@ void DBaseStatusBar::RefreshViewBorder () { return; } - auto tex = GetBorderTexture(&level); + auto tex = GetBorderTexture(currentUILevel); screen->DrawBorder (tex, 0, 0, Width, viewwindowy); screen->DrawBorder (tex, 0, viewwindowy, viewwindowx, viewheight + viewwindowy); screen->DrawBorder (tex, viewwindowx + viewwidth, viewwindowy, Width, viewheight + viewwindowy); @@ -814,7 +814,7 @@ void DBaseStatusBar::RefreshBackground () const if (x == 0 && y == SCREENHEIGHT) return; - auto tex = GetBorderTexture(&level); + auto tex = GetBorderTexture(currentUILevel); if(!CompleteBorder) { diff --git a/src/gl/renderer/gl_renderer.cpp b/src/gl/renderer/gl_renderer.cpp index aed0be31a..b459685ba 100644 --- a/src/gl/renderer/gl_renderer.cpp +++ b/src/gl/renderer/gl_renderer.cpp @@ -254,7 +254,7 @@ sector_t *FGLRenderer::RenderView(player_t* player) bool saved_niv = NoInterpolateView; NoInterpolateView = false; // prepare all camera textures that have been used in the last frame - auto Level = &level; + auto Level = r_viewpoint.ViewLevel; gl_RenderState.CheckTimer(Level->ShaderStartTime); Level->canvasTextureInfo.UpdateAll([&](AActor *camera, FCanvasTexture *camtex, double fov) { diff --git a/src/maploader/polyobjects.cpp b/src/maploader/polyobjects.cpp index 61b2bcb5d..2bc931d1c 100644 --- a/src/maploader/polyobjects.cpp +++ b/src/maploader/polyobjects.cpp @@ -351,6 +351,10 @@ void MapLoader::PO_Init (void) InitSideLists (); Level->Polyobjects.Resize(NumPolyobjs); + for (auto p : Level->Polyobjects) + { + p.Level = Level; + } polyIndex = 0; // index polyobj number // Find the startSpot points, and spawn each polyobj diff --git a/src/nodebuild.cpp b/src/nodebuild.cpp index a352a8f0a..81d841c1b 100644 --- a/src/nodebuild.cpp +++ b/src/nodebuild.cpp @@ -54,17 +54,17 @@ const int AAPreference = 16; #define D(x) do{}while(0) #endif -FNodeBuilder::FNodeBuilder(FLevel &level) -: Level(level), GLNodes(false), SegsStuffed(0) +FNodeBuilder::FNodeBuilder(FLevel &lev) +: Level(lev), GLNodes(false), SegsStuffed(0) { VertexMap = NULL; OldVertexTable = NULL; } -FNodeBuilder::FNodeBuilder (FLevel &level, +FNodeBuilder::FNodeBuilder (FLevel &lev, TArray &polyspots, TArray &anchors, bool makeGLNodes) - : Level(level), GLNodes(makeGLNodes), SegsStuffed(0) + : Level(lev), GLNodes(makeGLNodes), SegsStuffed(0) { VertexMap = new FVertexMap (*this, Level.MinX, Level.MinY, Level.MaxX, Level.MaxY); FindUsedVertices (Level.Vertices, Level.NumVertices); diff --git a/src/nodebuild.h b/src/nodebuild.h index 8a8f133e0..0618f7247 100644 --- a/src/nodebuild.h +++ b/src/nodebuild.h @@ -228,13 +228,13 @@ public: fixed_t x, y; }; - FNodeBuilder (FLevel &level); - FNodeBuilder (FLevel &level, + FNodeBuilder (FLevel &lev); + FNodeBuilder (FLevel &lev, TArray &polyspots, TArray &anchors, bool makeGLNodes); ~FNodeBuilder (); - void Extract(FLevelLocals &level); + void Extract(FLevelLocals &lev); const int *GetOldVertexTable(); // These are used for building sub-BSP trees for polyobjects. diff --git a/src/p_acs.cpp b/src/p_acs.cpp index e589d8d07..c2dd9a3c9 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -6795,7 +6795,7 @@ int DLevelScript::RunScript() case SCRIPT_PolyWait: // Wait for polyobj(s) to stop moving, then enter state running - if (!PO_Busy (&level, statedata)) + if (!PO_Busy (Level, statedata)) { state = SCRIPT_Running; } @@ -9908,7 +9908,7 @@ scriptwait: int flags = STACK(1); sp -= 5; - P_SectorDamage(&level, tag, amount, type, protectClass, flags); + P_SectorDamage(Level, tag, amount, type, protectClass, flags); } break; @@ -10354,14 +10354,14 @@ static void addDefered (level_info_t *i, acsdefered_t::EType type, int script, c EXTERN_CVAR (Bool, sv_cheats) -int P_StartScript (AActor *who, line_t *where, int script, const char *map, const int *args, int argcount, int flags) +int P_StartScript (FLevelLocals *Level, AActor *who, line_t *where, int script, const char *map, const int *args, int argcount, int flags) { - if (map == NULL || 0 == strnicmp (level.MapName, map, 8)) + if (map == NULL || 0 == strnicmp (Level->MapName, map, 8)) { FBehavior *module = NULL; const ScriptPtr *scriptdata; - if ((scriptdata = level.Behaviors.FindScript (script, module)) != NULL) + if ((scriptdata = Level->Behaviors.FindScript (script, module)) != NULL) { if ((flags & ACS_NET) && netgame && !sv_cheats) { @@ -10379,7 +10379,7 @@ int P_StartScript (AActor *who, line_t *where, int script, const char *map, cons return false; } } - DLevelScript *runningScript = P_GetScriptGoing (&level, who, where, script, + DLevelScript *runningScript = P_GetScriptGoing (Level, who, where, script, scriptdata, module, args, argcount, flags); if (runningScript != NULL) { @@ -10409,20 +10409,20 @@ int P_StartScript (AActor *who, line_t *where, int script, const char *map, cons return false; } -void P_SuspendScript (int script, const char *map) +void P_SuspendScript (FLevelLocals *Level, int script, const char *map) { - if (strnicmp (level.MapName, map, 8)) + if (strnicmp (Level->MapName, map, 8)) addDefered (FindLevelInfo (map), acsdefered_t::defsuspend, script, NULL, 0, NULL); else - SetScriptState (level.ACSThinker, script, DLevelScript::SCRIPT_Suspended); + SetScriptState (Level->ACSThinker, script, DLevelScript::SCRIPT_Suspended); } -void P_TerminateScript (int script, const char *map) +void P_TerminateScript (FLevelLocals *Level, int script, const char *map) { - if (strnicmp (level.MapName, map, 8)) + if (strnicmp (Level->MapName, map, 8)) addDefered (FindLevelInfo (map), acsdefered_t::defterminate, script, NULL, 0, NULL); else - SetScriptState (level.ACSThinker, script, DLevelScript::SCRIPT_PleaseRemove); + SetScriptState (Level->ACSThinker, script, DLevelScript::SCRIPT_PleaseRemove); } FSerializer &Serialize(FSerializer &arc, const char *key, acsdefered_t &defer, acsdefered_t *def) diff --git a/src/p_actionfunctions.cpp b/src/p_actionfunctions.cpp index 347b6ee01..9afe3597e 100644 --- a/src/p_actionfunctions.cpp +++ b/src/p_actionfunctions.cpp @@ -3049,7 +3049,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_Teleport) } } - DSpotState *state = GetSpotState(&level, false); + DSpotState *state = GetSpotState(self->Level, false); if (state == NULL) { return numret; diff --git a/src/p_conversation.cpp b/src/p_conversation.cpp index ed25f3c9c..5265b1010 100644 --- a/src/p_conversation.cpp +++ b/src/p_conversation.cpp @@ -739,7 +739,7 @@ void P_StartConversation (AActor *npc, AActor *pc, bool facetalker, bool saveang // Make sure this is actually a player. if (pc == nullptr || pc->player == nullptr || npc == nullptr) return; - auto Level = &level; + auto Level = pc->Level; // [CW] If an NPC is talking to a PC already, then don't let // anyone else talk to the NPC. @@ -887,7 +887,7 @@ static void HandleReply(player_t *player, bool isconsole, int nodenum, int reply AActor *npc; bool takestuff; int i; - auto Level = &level; + auto Level = player->mo->Level; if (player->ConversationNPC == nullptr || (unsigned)nodenum >= Level->StrifeDialogues.Size()) { return; diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index ceebb43ee..c60343045 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -1923,7 +1923,7 @@ FUNC(LS_ACS_Execute) { return false; } - return P_StartScript(it, ln, arg0, mapname, args, 3, flags); + return P_StartScript(Level, it, ln, arg0, mapname, args, 3, flags); } FUNC(LS_ACS_ExecuteAlways) @@ -1946,7 +1946,7 @@ FUNC(LS_ACS_ExecuteAlways) { return false; } - return P_StartScript(it, ln, arg0, mapname, args, 3, flags); + return P_StartScript(Level, it, ln, arg0, mapname, args, 3, flags); } FUNC(LS_ACS_LockedExecute) @@ -1976,7 +1976,7 @@ FUNC(LS_ACS_ExecuteWithResult) int args[4] = { arg1, arg2, arg3, arg4 }; int flags = (backSide ? ACS_BACKSIDE : 0) | ACS_ALWAYS | ACS_WANTRESULT; - return P_StartScript (it, ln, arg0, Level->MapName, args, 4, flags); + return P_StartScript (Level, it, ln, arg0, Level->MapName, args, 4, flags); } FUNC(LS_ACS_Suspend) @@ -1985,9 +1985,9 @@ FUNC(LS_ACS_Suspend) level_info_t *info; if (arg1 == 0) - P_SuspendScript (arg0, Level->MapName); + P_SuspendScript (Level, arg0, Level->MapName); else if ((info = FindLevelByNum (arg1)) ) - P_SuspendScript (arg0, info->MapName); + P_SuspendScript (Level, arg0, info->MapName); return true; } @@ -1998,9 +1998,9 @@ FUNC(LS_ACS_Terminate) level_info_t *info; if (arg1 == 0) - P_TerminateScript (arg0, Level->MapName); + P_TerminateScript (Level, arg0, Level->MapName); else if ((info = FindLevelByNum (arg1)) ) - P_TerminateScript (arg0, info->MapName); + P_TerminateScript (Level, arg0, info->MapName); return true; } @@ -2016,7 +2016,7 @@ FUNC(LS_FS_Execute) { if (arg1 && ln && backSide) return false; if (arg2!=0 && !P_CheckKeys(it, arg2, !!arg3)) return false; - return T_RunScript(&level, arg0, it); + return T_RunScript(Level, arg0, it); } @@ -2251,7 +2251,7 @@ FUNC(LS_Sector_SetCurrent) FUNC(LS_Sector_SetFriction) // Sector_SetFriction (tag, amount) { - P_SetSectorFriction (&level, arg0, arg1, true); + P_SetSectorFriction (Level, arg0, arg1, true); return true; } @@ -2310,7 +2310,7 @@ FUNC(LS_Scroll_Texture_Both) sidechoice = 0; } - SetWallScroller (&level, arg0, sidechoice, dx, dy, scw_all); + SetWallScroller (Level, arg0, sidechoice, dx, dy, scw_all); return true; } @@ -2321,7 +2321,7 @@ FUNC(LS_Scroll_Wall) if (arg0 == 0) return false; - SetWallScroller (&level, arg0, !!arg3, arg1 / 65536., arg2 / 65536., EScrollPos(arg4)); + SetWallScroller (Level, arg0, !!arg3, arg1 / 65536., arg2 / 65536., EScrollPos(arg4)); return true; } @@ -2337,19 +2337,19 @@ FUNC(LS_Scroll_Floor) if (arg3 == 0 || arg3 == 2) { - SetScroller (&level, arg0, EScroll::sc_floor, -dx, dy); + SetScroller (Level, arg0, EScroll::sc_floor, -dx, dy); } else { - SetScroller (&level, arg0, EScroll::sc_floor, 0, 0); + SetScroller (Level, arg0, EScroll::sc_floor, 0, 0); } if (arg3 > 0) { - SetScroller (&level, arg0, EScroll::sc_carry, dx, dy); + SetScroller (Level, arg0, EScroll::sc_carry, dx, dy); } else { - SetScroller (&level, arg0, EScroll::sc_carry, 0, 0); + SetScroller (Level, arg0, EScroll::sc_carry, 0, 0); } return true; } @@ -2360,7 +2360,7 @@ FUNC(LS_Scroll_Ceiling) double dx = arg1 / 32.; double dy = arg2 / 32.; - SetScroller (&level, arg0, EScroll::sc_ceiling, -dx, dy); + SetScroller (Level, arg0, EScroll::sc_ceiling, -dx, dy); return true; } diff --git a/src/p_map.cpp b/src/p_map.cpp index 7fb261ce7..2166831c5 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -2928,7 +2928,7 @@ void FSlide::HitSlideLine(line_t* ld) void FSlide::SlideTraverse(const DVector2 &start, const DVector2 &end) { FLineOpening open; - FPathTraverse it(&level, start.X, start.Y, end.X, end.Y, PT_ADDLINES); + FPathTraverse it(slidemo->Level, start.X, start.Y, end.X, end.Y, PT_ADDLINES); intercept_t *in; while ((in = it.Next())) @@ -3285,7 +3285,7 @@ const secplane_t * P_CheckSlopeWalk(AActor *actor, DVector2 &move) bool FSlide::BounceTraverse(const DVector2 &start, const DVector2 &end) { FLineOpening open; - FPathTraverse it(&level, start.X, start.Y, end.X, end.Y, PT_ADDLINES); + FPathTraverse it(slidemo->Level, start.X, start.Y, end.X, end.Y, PT_ADDLINES); intercept_t *in; while ((in = it.Next())) @@ -3977,7 +3977,7 @@ struct aim_t if (ceilingportalstate) EnterSectorPortal(sector_t::ceiling, 0, lastsector, toppitch, MIN(0., bottompitch)); if (floorportalstate) EnterSectorPortal(sector_t::floor, 0, lastsector, MAX(0., toppitch), bottompitch); - FPathTraverse it(&level, startpos.X, startpos.Y, aimtrace.X, aimtrace.Y, PT_ADDLINES | PT_ADDTHINGS | PT_COMPATIBLE | PT_DELTA, startfrac); + FPathTraverse it(lastsector->Level, startpos.X, startpos.Y, aimtrace.X, aimtrace.Y, PT_ADDLINES | PT_ADDTHINGS | PT_COMPATIBLE | PT_DELTA, startfrac); intercept_t *in; if (aimdebug) @@ -5376,7 +5376,7 @@ bool P_TalkFacing(AActor *player) bool P_UseTraverse(AActor *usething, const DVector2 &start, const DVector2 &end, bool &foundline) { - FPathTraverse it(&level, start.X, start.Y, end.X, end.Y, PT_ADDLINES | PT_ADDTHINGS); + FPathTraverse it(usething->Level, start.X, start.Y, end.X, end.Y, PT_ADDLINES | PT_ADDTHINGS); intercept_t *in; DVector3 xpos = { start.X, start.Y, usething->Z() }; @@ -5519,7 +5519,7 @@ bool P_UseTraverse(AActor *usething, const DVector2 &start, const DVector2 &end, bool P_NoWayTraverse(AActor *usething, const DVector2 &start, const DVector2 &end) { - FPathTraverse it(&level, start.X, start.Y, end.X, end.Y, PT_ADDLINES); + FPathTraverse it(usething->Level, start.X, start.Y, end.X, end.Y, PT_ADDLINES); intercept_t *in; while ((in = it.Next())) @@ -5596,7 +5596,7 @@ int P_UsePuzzleItem(AActor *PuzzleItemUser, int PuzzleItemType) start = PuzzleItemUser->GetPortalTransition(PuzzleItemUser->Height / 2); end = PuzzleItemUser->Angles.Yaw.ToVector(usedist); - FPathTraverse it(&level, start.X, start.Y, end.X, end.Y, PT_DELTA | PT_ADDLINES | PT_ADDTHINGS); + FPathTraverse it(PuzzleItemUser->Level, start.X, start.Y, end.X, end.Y, PT_DELTA | PT_ADDLINES | PT_ADDTHINGS); intercept_t *in; while ((in = it.Next())) @@ -5624,7 +5624,7 @@ int P_UsePuzzleItem(AActor *PuzzleItemUser, int PuzzleItemType) return false; } int args[3] = { in->d.line->args[2], in->d.line->args[3], in->d.line->args[4] }; - P_StartScript(PuzzleItemUser, in->d.line, in->d.line->args[1], NULL, args, 3, ACS_ALWAYS); + P_StartScript(PuzzleItemUser->Level, PuzzleItemUser, in->d.line, in->d.line->args[1], NULL, args, 3, ACS_ALWAYS); in->d.line->special = 0; return true; } @@ -5639,7 +5639,7 @@ int P_UsePuzzleItem(AActor *PuzzleItemUser, int PuzzleItemType) continue; } int args[3] = { mobj->args[2], mobj->args[3], mobj->args[4] }; - P_StartScript(PuzzleItemUser, NULL, mobj->args[1], NULL, args, 3, ACS_ALWAYS); + P_StartScript(PuzzleItemUser->Level, PuzzleItemUser, NULL, mobj->args[1], NULL, args, 3, ACS_ALWAYS); mobj->special = 0; return true; } diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 311a7cb4e..3017d6aed 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -143,7 +143,7 @@ static void PrecacheLevel(FLevelLocals *Level) memset(hitlist.Data(), 0, cnt); AActor *actor; - TThinkerIterator iterator; + auto iterator = Level->GetThinkerIterator(); while ((actor = iterator.Next())) { @@ -485,7 +485,7 @@ void P_SetupLevel(FLevelLocals *Level, int position, bool newGame) // Don't count monsters in end-of-level sectors if option is on if (dmflags2 & DF2_NOCOUNTENDMONST) { - TThinkerIterator it; + auto it = Level->GetThinkerIterator(); AActor * mo; while ((mo = it.Next())) @@ -500,7 +500,7 @@ void P_SetupLevel(FLevelLocals *Level, int position, bool newGame) } } - T_PreprocessScripts(&level); // preprocess FraggleScript scripts + T_PreprocessScripts(Level); // preprocess FraggleScript scripts // build subsector connect matrix // UNUSED P_ConnectSubsectors (); @@ -513,8 +513,8 @@ void P_SetupLevel(FLevelLocals *Level, int position, bool newGame) // preload graphics and sounds if (precache) { - PrecacheLevel(&level); - S_PrecacheLevel(); + PrecacheLevel(Level); + S_PrecacheLevel(Level); } if (deathmatch) @@ -663,7 +663,7 @@ CUSTOM_CVAR(Bool, forcewater, false, CVAR_ARCHIVE | CVAR_SERVERINFO) { if (gamestate == GS_LEVEL) { - auto Level = &level; + auto Level = currentUILevel; for (auto &sec : Level->sectors) { sector_t *hsec = sec.GetHeightSec(); diff --git a/src/p_spec.cpp b/src/p_spec.cpp index f60e61468..942441890 100644 --- a/src/p_spec.cpp +++ b/src/p_spec.cpp @@ -435,7 +435,7 @@ void P_PlayerInSpecialSector (player_t *player, sector_t * sector) // Has hit ground. AActor *ironfeet; - auto Level = &level; + auto Level = sector->Level; // [RH] Apply any customizable damage if (sector->damageamount > 0) @@ -630,7 +630,7 @@ DEFINE_ACTION_FUNCTION(FLevelLocals, GiveSecret) void P_PlayerOnSpecialFlat (player_t *player, int floorType) { - auto Level = &level; + auto Level = player->mo->Level; if (Terrains[floorType].DamageAmount && !(Level->time & Terrains[floorType].DamageTimeMask)) @@ -707,7 +707,6 @@ void DLightTransfer::Construct(sector_t *srcSec, int target, bool copyFloor) CopyFloor = copyFloor; DoTransfer (LastLight = srcSec->lightlevel, target, copyFloor); - auto Level = &level; if (copyFloor) { auto itr = Level->GetSectorTagIterator(target); @@ -737,7 +736,6 @@ void DLightTransfer::DoTransfer (int llevel, int target, bool floor) { int secnum; - auto Level = &level; if (floor) { auto itr = Level->GetSectorTagIterator(target); @@ -783,7 +781,6 @@ void DWallLightTransfer::Construct(sector_t *srcSec, int target, uint8_t flags) wallflags = WALLF_ABSLIGHTING | WALLF_NOFAKECONTRAST; } - auto Level = &level; auto itr = Level->GetLineIdIterator(target); while ((linenum = itr.Next()) >= 0) { @@ -814,7 +811,6 @@ void DWallLightTransfer::DoTransfer (short lightlevel, int target, uint8_t flags { int linenum; - auto Level = &level; auto itr = Level->GetLineIdIterator(target); while ((linenum = itr.Next()) >= 0) { diff --git a/src/p_spec.h b/src/p_spec.h index d959bf6ba..be1b710b9 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -595,9 +595,9 @@ bool P_Teleport(AActor *thing, DVector3 pos, DAngle angle, int flags); #define ACS_WANTRESULT 4 #define ACS_NET 8 -int P_StartScript (AActor *who, line_t *where, int script, const char *map, const int *args, int argcount, int flags); -void P_SuspendScript (int script, const char *map); -void P_TerminateScript (int script, const char *map); +int P_StartScript (FLevelLocals *Level, AActor *who, line_t *where, int script, const char *map, const int *args, int argcount, int flags); +void P_SuspendScript (FLevelLocals *Level, int script, const char *map); +void P_TerminateScript (FLevelLocals *Level, int script, const char *map); // // [RH] p_quake.c diff --git a/src/p_switch.cpp b/src/p_switch.cpp index 918a76d60..bfb8478a4 100644 --- a/src/p_switch.cpp +++ b/src/p_switch.cpp @@ -85,7 +85,7 @@ protected: static bool P_StartButton (side_t *side, int Where, FSwitchDef *Switch, const DVector2 &pos, bool useagain) { DActiveButton *button; - TThinkerIterator iterator; + auto iterator = side->GetLevel()->GetThinkerIterator(); // See if button is already pressed while ( (button = iterator.Next ()) ) @@ -97,7 +97,7 @@ static bool P_StartButton (side_t *side, int Where, FSwitchDef *Switch, const DV } } - side->sector->Level->CreateThinker (side, Where, Switch, pos, useagain); + side->GetLevel()->CreateThinker (side, Where, Switch, pos, useagain); return true; } diff --git a/src/p_teleport.cpp b/src/p_teleport.cpp index 4c423bdc8..63e5d3353 100644 --- a/src/p_teleport.cpp +++ b/src/p_teleport.cpp @@ -316,7 +316,7 @@ AActor *FLevelLocals::SelectTeleDest (int tid, int tag, bool norandom) // teleport destination. This means if 50 sectors have a matching tag and // only the last one has a destination, *every* actor is scanned at least 49 // times. Yuck. - TThinkerIterator it2(NAME_TeleportDest); + auto it2 = GetThinkerIterator(NAME_TeleportDest); while ((searcher = it2.Next()) != NULL) { if (searcher->Sector == §ors[secnum]) diff --git a/src/p_things.cpp b/src/p_things.cpp index a65ff70b8..7f72ed19d 100644 --- a/src/p_things.cpp +++ b/src/p_things.cpp @@ -754,7 +754,7 @@ int P_Thing_CheckProximity(AActor *self, PClass *classname, double distance, int const bool ptrWillChange = !!(flags & (CPXF_SETTARGET | CPXF_SETMASTER | CPXF_SETTRACER)); const bool ptrDistPref = !!(flags & (CPXF_CLOSEST | CPXF_FARTHEST)); - TThinkerIterator it; + auto it = self->Level->GetThinkerIterator(); AActor *mo, *dist = nullptr; // [MC] Process of elimination, I think, will get through this as quickly and diff --git a/src/po_man.cpp b/src/po_man.cpp index b5d90f364..9f52f5a89 100644 --- a/src/po_man.cpp +++ b/src/po_man.cpp @@ -741,11 +741,6 @@ int FPolyObj::GetMirror() return MirrorNum; } -FLevelLocals *FPolyObj::GetLevel() const -{ - return &level; -} - //========================================================================== // // ThrustMobj @@ -756,7 +751,6 @@ void FPolyObj::ThrustMobj (AActor *actor, side_t *side) { DAngle thrustAngle; DPolyAction *pe; - auto Level = GetLevel(); double force; @@ -811,7 +805,6 @@ void FPolyObj::UpdateLinks() { if (bHasPortals == 2) { - auto Level = GetLevel(); TMap processed; for (unsigned i = 0; i < Linedefs.Size(); i++) { @@ -1000,7 +993,6 @@ void FPolyObj::UnLinkPolyobj () polyblock_t *link; int i, j; int index; - auto Level = GetLevel(); // remove the polyobj from each blockmap section for(j = bbox[BOXBOTTOM]; j <= bbox[BOXTOP]; j++) @@ -1033,7 +1025,6 @@ void FPolyObj::UnLinkPolyobj () bool FPolyObj::CheckMobjBlocking (side_t *sd) { - auto Level = GetLevel(); static TArray checker; FBlockNode *block; AActor *mobj; @@ -1169,7 +1160,6 @@ void FPolyObj::LinkPolyobj () { polyblock_t **link; polyblock_t *tempLink; - auto Level = GetLevel(); int bmapwidth = Level->blockmap.bmapwidth; int bmapheight = Level->blockmap.bmapheight; @@ -1666,7 +1656,6 @@ static void SplitPoly(FPolyNode *pnode, void *node, float bbox[4]) void FPolyObj::CreateSubsectorLinks() { - auto Level = GetLevel(); FPolyNode *node = NewPolyNode(); // Even though we don't care about it, we need to initialize this // bounding box to something so that Valgrind won't complain about it @@ -1846,7 +1835,7 @@ FPolyObj *FPolyMirrorIterator::NextMirror() if (i == NumUsedPolys) { // No, it has not been returned. UsedPolys[NumUsedPolys++] = mirror; - nextpoly = poly->GetLevel()->GetPolyobj(mirror); + nextpoly = poly->Level->GetPolyobj(mirror); if (nextpoly == nullptr) { Printf("Invalid mirror polyobj num %d for polyobj num %d\n", mirror, UsedPolys[i - 1]); diff --git a/src/po_man.h b/src/po_man.h index 70f437443..cc8f5fbf9 100644 --- a/src/po_man.h +++ b/src/po_man.h @@ -67,6 +67,7 @@ struct FPolyNode // ===== Polyobj data ===== struct FPolyObj { + FLevelLocals *Level; TArray Sidedefs; TArray Linedefs; TArray Vertices; @@ -108,9 +109,6 @@ struct FPolyObj void UpdateLinks(); static void ClearAllSubsectorLinks(); - FLevelLocals *GetLevel() const; - - private: void ThrustMobj (AActor *actor, side_t *side); diff --git a/src/polyrenderer/poly_renderer.cpp b/src/polyrenderer/poly_renderer.cpp index 8cc8aa616..87642d831 100644 --- a/src/polyrenderer/poly_renderer.cpp +++ b/src/polyrenderer/poly_renderer.cpp @@ -136,7 +136,7 @@ void PolyRenderer::RenderActorView(AActor *actor, bool dontmaplines) R_SetupFrame(Viewpoint, Viewwindow, actor); Level = Viewpoint.ViewLevel; P_FindParticleSubsectors(); - PO_LinkToSubsectors(&level); + PO_LinkToSubsectors(Level); static bool firstcall = true; if (firstcall) diff --git a/src/r_utility.cpp b/src/r_utility.cpp index 26d8d4f6d..9278a94d3 100644 --- a/src/r_utility.cpp +++ b/src/r_utility.cpp @@ -1034,7 +1034,7 @@ void R_SetupFrame (FRenderViewpoint &viewpoint, FViewWindow &viewwindow, AActor viewpoint.HWAngles.Pitch = RAD2DEG((float)asin(angy / alen)); viewpoint.HWAngles.Roll.Degrees = (float)viewpoint.Angles.Roll.Degrees; // copied for convenience. - viewpoint.ViewLevel = &level; + viewpoint.ViewLevel = actor->Level; // ViewActor only gets set, if the camera actor should not be rendered if (actor->player && actor->player - players == consoleplayer && diff --git a/src/s_sound.cpp b/src/s_sound.cpp index 6dbb6ff88..20a287ae7 100644 --- a/src/s_sound.cpp +++ b/src/s_sound.cpp @@ -471,11 +471,11 @@ void S_Start () // //========================================================================== -void S_PrecacheLevel () +void S_PrecacheLevel (FLevelLocals *Level) { unsigned int i; - if (GSnd) + if (GSnd && Level == currentUILevel) { for (i = 0; i < S_sfx.Size(); ++i) { @@ -483,7 +483,7 @@ void S_PrecacheLevel () } AActor *actor; - TThinkerIterator iterator; + auto iterator = Level->GetThinkerIterator(); // Precache all sounds known to be used by the currently spawned actors. while ( (actor = iterator.Next()) != NULL ) @@ -1371,7 +1371,7 @@ void S_SoundMinMaxDist(AActor *ent, int channel, FSoundID sound_id, float volume void S_Sound (const FPolyObj *poly, int channel, FSoundID sound_id, float volume, float attenuation) { - if (poly->GetLevel() != currentUILevel) return; + if (poly->Level != currentUILevel) return; S_StartSound (nullptr, nullptr, poly, nullptr, channel, sound_id, volume, attenuation); } diff --git a/src/s_sound.h b/src/s_sound.h index a5f3c17a0..411896716 100644 --- a/src/s_sound.h +++ b/src/s_sound.h @@ -218,7 +218,7 @@ void S_Shutdown (); void S_Start (); // Called after a level is loaded. Ensures that most sounds are loaded. -void S_PrecacheLevel (); +void S_PrecacheLevel (FLevelLocals *l); // Loads a sound, including any random sounds it might reference. void S_CacheSound (sfxinfo_t *sfx); diff --git a/src/scripting/vmthunks_actors.cpp b/src/scripting/vmthunks_actors.cpp index d52e6e28e..dd833e744 100644 --- a/src/scripting/vmthunks_actors.cpp +++ b/src/scripting/vmthunks_actors.cpp @@ -1330,7 +1330,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(AActor, CheckSight, P_CheckSight) static void GiveSecret(AActor *self, bool printmessage, bool playsound) { - P_GiveSecret(&level, self, printmessage, playsound, -1); + P_GiveSecret(self->Level, self, printmessage, playsound, -1); } DEFINE_ACTION_FUNCTION_NATIVE(AActor, GiveSecret, GiveSecret) diff --git a/src/statistics.cpp b/src/statistics.cpp index 2c155f5fb..04c780f34 100644 --- a/src/statistics.cpp +++ b/src/statistics.cpp @@ -577,7 +577,7 @@ FString GetStatString() CCMD(printstats) { - StoreLevelStats(&level); // Refresh the current level's results. + StoreLevelStats(currentUILevel); // Refresh the current level's results. Printf("%s", GetStatString().GetChars()); } @@ -596,6 +596,6 @@ CCMD(finishgame) ADD_STAT(statistics) { - StoreLevelStats(&level); // Refresh the current level's results. + StoreLevelStats(currentUILevel); // Refresh the current level's results. return GetStatString(); } From a7746278a80fcca3253bbd147ee4810c8f770178 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 28 Jan 2019 01:25:52 +0100 Subject: [PATCH 049/164] - a few remaining simple ones This also removes a few pointless comments that popped up and consolidates setting a level's music into a subfuntion. --- src/actorinlines.h | 6 ------ src/g_levellocals.h | 7 +++++++ src/g_shared/a_dynlight.h | 2 +- src/hwrenderer/data/hw_vertexbuilder.cpp | 2 +- src/hwrenderer/scene/hw_fakeflat.cpp | 2 +- src/intermission/intermission.cpp | 3 +-- src/p_saveg.cpp | 3 +-- src/p_setup.h | 6 ------ src/portal.h | 2 +- src/posix/sdl/i_main.cpp | 2 +- src/r_data/models/models.cpp | 2 +- src/s_sound.cpp | 3 +-- src/v_video.h | 3 --- src/win32/i_keyboard.cpp | 2 +- src/win32/i_main.cpp | 2 +- src/win32/i_mouse.cpp | 2 +- 16 files changed, 19 insertions(+), 30 deletions(-) diff --git a/src/actorinlines.h b/src/actorinlines.h index a253ecc7f..abc17e1b3 100644 --- a/src/actorinlines.h +++ b/src/actorinlines.h @@ -26,12 +26,6 @@ inline DVector3 AActor::PosRelative(const line_t *line) const return Pos() + Level->Displacements.getOffset(Sector->PortalGroup, line->frontsector->PortalGroup); } -inline DVector3 PosRelative(const DVector3 &pos, line_t *line, sector_t *refsec = NULL) -{ - return pos + level.Displacements.getOffset(refsec->PortalGroup, line->frontsector->PortalGroup); -} - - inline void AActor::ClearInterpolation() { Prev = Pos(); diff --git a/src/g_levellocals.h b/src/g_levellocals.h index fcf92642e..3eb3c810e 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -261,6 +261,7 @@ public: void SpawnExtraPlayers(); void Serialize(FSerializer &arc, bool hubload); + private: // Work data for CollectConnectedGroups. FPortalBits processMask; @@ -398,6 +399,12 @@ public: thinker->Construct(std::forward(args)...); return thinker; } + + void SetMusic() + { + if (cdtrack == 0 || !S_ChangeCDMusic(cdtrack, cdid)) + S_ChangeMusic(Music, musicorder); + } uint8_t md5[16]; // for savegame validation. If the MD5 does not match the savegame won't be loaded. diff --git a/src/g_shared/a_dynlight.h b/src/g_shared/a_dynlight.h index f0f287ef6..25d6a3477 100644 --- a/src/g_shared/a_dynlight.h +++ b/src/g_shared/a_dynlight.h @@ -170,7 +170,7 @@ struct FDynamicLight inline DVector3 PosRelative(int portalgroup) const { - return Pos + level.Displacements.getOffset(Sector->PortalGroup, portalgroup); + return Pos + Level->Displacements.getOffset(Sector->PortalGroup, portalgroup); } bool ShouldLightActor(AActor *check) diff --git a/src/hwrenderer/data/hw_vertexbuilder.cpp b/src/hwrenderer/data/hw_vertexbuilder.cpp index f4e4c6c36..a21b3c78f 100644 --- a/src/hwrenderer/data/hw_vertexbuilder.cpp +++ b/src/hwrenderer/data/hw_vertexbuilder.cpp @@ -129,7 +129,7 @@ static void CreateVerticesForSection(FSection §ion, VertexContainer &gen, bo static void CreateVerticesForSector(sector_t *sec, VertexContainer &gen) { - auto sections = level.sections.SectionsForSector(sec); + auto sections = sec->Level->sections.SectionsForSector(sec); for (auto §ion :sections) { CreateVerticesForSection( section, gen, true); diff --git a/src/hwrenderer/scene/hw_fakeflat.cpp b/src/hwrenderer/scene/hw_fakeflat.cpp index 030c09f8e..b37d8b67f 100644 --- a/src/hwrenderer/scene/hw_fakeflat.cpp +++ b/src/hwrenderer/scene/hw_fakeflat.cpp @@ -196,7 +196,7 @@ static sector_t *allocateSector(sector_t *sec) { if (fakesectorbuffer == nullptr) { - unsigned numsectors = level.sectors.Size(); + unsigned numsectors = sec->Level->sectors.Size(); fakesectorbuffer = (sector_t**)FakeSectorAllocator.Alloc(numsectors * sizeof(sector_t*)); memset(fakesectorbuffer, 0, numsectors * sizeof(sector_t*)); } diff --git a/src/intermission/intermission.cpp b/src/intermission/intermission.cpp index 47d9cec1b..2c014c78b 100644 --- a/src/intermission/intermission.cpp +++ b/src/intermission/intermission.cpp @@ -787,8 +787,7 @@ void DIntermissionController::Ticker () switch (mGameState) { case FSTATE_InLevel: - if (level.cdtrack == 0 || !S_ChangeCDMusic (level.cdtrack, level.cdid)) - S_ChangeMusic (level.Music, level.musicorder); + currentUILevel->SetMusic(); gamestate = GS_LEVEL; wipegamestate = GS_LEVEL; P_ResumeConversation (); diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 7972d06d3..06fc8c613 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -544,8 +544,7 @@ void P_SerializeSounds(FLevelLocals *Level, FSerializer &arc) if (arc.isReading()) { if (!S_ChangeMusic(name, order)) - if (Level->cdtrack == 0 || !S_ChangeCDMusic(Level->cdtrack, Level->cdid)) - S_ChangeMusic(Level->Music, Level->musicorder); + Level->SetMusic(); Level->SetMusicVolume(musvol); } } diff --git a/src/p_setup.h b/src/p_setup.h index 8588ada68..0ddc25fa3 100644 --- a/src/p_setup.h +++ b/src/p_setup.h @@ -140,12 +140,6 @@ public: MapData * P_OpenMapData(const char * mapname, bool justcheck); bool P_CheckMapData(const char * mapname); - -// NOT called by W_Ticker. Fixme. [RH] Is that bad? -// -// [RH] The only parameter used is mapname, so I removed playermask and skill. -// On September 1, 1998, I added the position to indicate which set -// of single-player start spots should be spawned in the level. void P_SetupLevel (FLevelLocals *Level, int position, bool newGame); void P_FreeLevelData(); diff --git a/src/portal.h b/src/portal.h index cb9d5c7a8..58093476f 100644 --- a/src/portal.h +++ b/src/portal.h @@ -22,7 +22,7 @@ struct subsector_t; // have to be traversed to connect the two // // - any sector not connected to any portal is assigned to group 0 -// Group 0 has no displacement to any other group in the level. +// Group 0 has no displacement to any other group in the level // //============================================================================ diff --git a/src/posix/sdl/i_main.cpp b/src/posix/sdl/i_main.cpp index 3d7912fc8..f7d5da8f3 100644 --- a/src/posix/sdl/i_main.cpp +++ b/src/posix/sdl/i_main.cpp @@ -162,7 +162,7 @@ static int DoomSpecificInfo (char *buffer, char *end) } else { - p += snprintf (buffer+p, size-p, "\n\nCurrent map: %s", level.MapName.GetChars()); + p += snprintf (buffer+p, size-p, "\n\nCurrent map: %s", currentUILevel->MapName.GetChars()); if (!viewactive) { diff --git a/src/r_data/models/models.cpp b/src/r_data/models/models.cpp index e75d9d030..f75594b05 100644 --- a/src/r_data/models/models.cpp +++ b/src/r_data/models/models.cpp @@ -167,7 +167,7 @@ void FModelRenderer::RenderModel(float x, float y, float z, FSpriteModelFrame *s objectToWorldMatrix.rotate(-smf->rolloffset, 1, 0, 0); // consider the pixel stretching. For non-voxels this must be factored out here - float stretch = (smf->modelIDs[0] != -1 ? Models[smf->modelIDs[0]]->getAspectFactor() : 1.f) / level.info->pixelstretch; + float stretch = (smf->modelIDs[0] != -1 ? Models[smf->modelIDs[0]]->getAspectFactor() : 1.f) / actor->Level->info->pixelstretch; objectToWorldMatrix.scale(1, stretch, 1); float orientation = scaleFactorX * scaleFactorY * scaleFactorZ; diff --git a/src/s_sound.cpp b/src/s_sound.cpp index 20a287ae7..ad4eb38ed 100644 --- a/src/s_sound.cpp +++ b/src/s_sound.cpp @@ -458,8 +458,7 @@ void S_Start () // Don't start the music if revisiting a level in a hub for the same reason. if (!currentUILevel->IsReentering()) { - if (currentUILevel->cdtrack == 0 || !S_ChangeCDMusic (currentUILevel->cdtrack, currentUILevel->cdid)) - S_ChangeMusic (currentUILevel->Music, currentUILevel->musicorder); + currentUILevel->SetMusic(); } } diff --git a/src/v_video.h b/src/v_video.h index 2fd3f7e13..1b3131f83 100644 --- a/src/v_video.h +++ b/src/v_video.h @@ -399,9 +399,6 @@ public: // Mark the palette as changed. It will be updated on the next Update(). virtual void UpdatePalette() {} - // Sets the gamma level. Returns false if the hardware does not support - // gamma changing. (Always true for now, since palettes can always be - // gamma adjusted.) virtual void SetGamma() {} // Sets a color flash. RGB is the color, and amount is 0-256, with 256 diff --git a/src/win32/i_keyboard.cpp b/src/win32/i_keyboard.cpp index 840313cea..69571cbfd 100644 --- a/src/win32/i_keyboard.cpp +++ b/src/win32/i_keyboard.cpp @@ -345,7 +345,7 @@ ufailit: Device = NULL; return false; } - // Set cooperative level. + hr = Device->SetCooperativeLevel(Window, DISCL_NONEXCLUSIVE | DISCL_BACKGROUND); if (FAILED(hr)) { diff --git a/src/win32/i_main.cpp b/src/win32/i_main.cpp index 809deb43c..878ba29a1 100644 --- a/src/win32/i_main.cpp +++ b/src/win32/i_main.cpp @@ -1104,7 +1104,7 @@ void DoomSpecificInfo (char *buffer, size_t bufflen) } else { - buffer += mysnprintf (buffer, buffend - buffer, "\r\n\r\nCurrent map: %s", level.MapName.GetChars()); + buffer += mysnprintf (buffer, buffend - buffer, "\r\n\r\nCurrent map: %s", currentUILevel->MapName.GetChars()); if (!viewactive) { diff --git a/src/win32/i_mouse.cpp b/src/win32/i_mouse.cpp index df81332e8..00103d746 100644 --- a/src/win32/i_mouse.cpp +++ b/src/win32/i_mouse.cpp @@ -781,7 +781,7 @@ ufailit: Device = NULL; return false; } - // Set cooperative level. + hr = Device->SetCooperativeLevel(Window, DISCL_EXCLUSIVE | DISCL_FOREGROUND); if (FAILED(hr)) { From 7211c1db0f059155e1f6dc517732ea8a114cbcae Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 28 Jan 2019 01:33:52 +0100 Subject: [PATCH 050/164] - give the tag manager a reference to the level. This is needed for the compatibility search of the sector tag iterator which linearly searches the sector array. --- src/g_levellocals.h | 2 ++ src/p_tags.cpp | 6 +++--- src/p_tags.h | 3 +++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 3eb3c810e..0d18e9e01 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -154,6 +154,8 @@ struct FLevelData struct FLevelLocals : public FLevelData { + FLevelLocals() : tagManager(this) {} + friend class MapLoader; void Tick(); diff --git a/src/p_tags.cpp b/src/p_tags.cpp index bd012094d..db113daab 100644 --- a/src/p_tags.cpp +++ b/src/p_tags.cpp @@ -346,11 +346,11 @@ int FSectorTagIterator::Next() else { // with the tag manager, searching for tag 0 has to be different, because it won't create entries for untagged sectors. - while (start < (int)level.sectors.Size() && tagManager.SectorHasTags(start)) + while (start < (int)tagManager.Level->sectors.Size() && tagManager.SectorHasTags(start)) { start++; } - if (start == (int)level.sectors.Size()) return -1; + if (start == (int)tagManager.Level->sectors.Size()) return -1; ret = start; start++; } @@ -367,7 +367,7 @@ int FSectorTagIterator::NextCompat(bool compat, int start) { if (!compat) return Next(); - for (unsigned i = start + 1; i < level.sectors.Size(); i++) + for (unsigned i = start + 1; i < tagManager.Level->sectors.Size(); i++) { if (level.SectorHasTag(i, searchtag)) return i; } diff --git a/src/p_tags.h b/src/p_tags.h index aadeb8e7a..7452ef755 100644 --- a/src/p_tags.h +++ b/src/p_tags.h @@ -29,6 +29,7 @@ class FTagManager friend struct FLevelLocals; friend class UDMFParser; + FLevelLocals *Level; TArray allTags; TArray allIDs; TArray startForSector; @@ -46,6 +47,8 @@ class FTagManager return sect >= 0 && sect < (int)startForLine.Size() && startForLine[sect] >= 0; } + + FTagManager(FLevelLocals *l) : Level(l) {} void Clear() { allTags.Clear(); From 472a1118ddb49574c045a398df49c7ff50711034 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 28 Jan 2019 01:37:21 +0100 Subject: [PATCH 051/164] - had to move the tag manager. This somehow got skipped by the last commit. --- src/g_levellocals.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 0d18e9e01..4c0691668 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -141,7 +141,6 @@ struct FLevelData TArray AllPlayerStarts; FBehaviorContainer Behaviors; - FTagManager tagManager; AActor *TIDHash[128]; TArray StrifeDialogues; @@ -429,6 +428,7 @@ public: FString NextSecretMap; // map to go to when used secret exit FString F1Pic; EMapType maptype; + FTagManager tagManager; uint64_t ShaderStartTime = 0; // tell the shader system when we started the level (forces a timer restart) From aee8851643cb28ba06a64aa8c445631ea830273f Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 28 Jan 2019 02:07:46 +0100 Subject: [PATCH 052/164] - fixed all the missed level references in the decal thinkers. --- src/decallib.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/decallib.cpp b/src/decallib.cpp index 8a984ecd7..db423eae6 100644 --- a/src/decallib.cpp +++ b/src/decallib.cpp @@ -1184,11 +1184,11 @@ void DDecalFader::Tick () } else { - if (level.maptime < TimeToStartDecay || bglobal.freeze) + if (Level->maptime < TimeToStartDecay || bglobal.freeze) { return; } - else if (level.maptime >= TimeToEndDecay) + else if (Level->maptime >= TimeToEndDecay) { TheDecal->Destroy (); // remove the decal Destroy (); // remove myself @@ -1199,7 +1199,7 @@ void DDecalFader::Tick () StartTrans = TheDecal->Alpha; } - int distanceToEnd = TimeToEndDecay - level.maptime; + int distanceToEnd = TimeToEndDecay - Level->maptime; int fadeDistance = TimeToEndDecay - TimeToStartDecay; TheDecal->Alpha = StartTrans * distanceToEnd / fadeDistance; } @@ -1271,11 +1271,11 @@ void DDecalStretcher::Tick () Destroy (); return; } - if (level.maptime < TimeToStart || bglobal.freeze) + if (Level->maptime < TimeToStart || bglobal.freeze) { return; } - if (level.maptime >= TimeToStop) + if (Level->maptime >= TimeToStop) { if (bStretchX) { @@ -1295,7 +1295,7 @@ void DDecalStretcher::Tick () StartY = TheDecal->ScaleY; } - int distance = level.maptime - TimeToStart; + int distance = Level->maptime - TimeToStart; int maxDistance = TimeToStop - TimeToStart; if (bStretchX) { @@ -1339,7 +1339,7 @@ void DDecalSlider::Tick () Destroy (); return; } - if (level.maptime < TimeToStart || bglobal.freeze) + if (Level->maptime < TimeToStart || bglobal.freeze) { return; } @@ -1349,7 +1349,7 @@ void DDecalSlider::Tick () /*StartX = TheDecal->LeftDistance;*/ StartY = TheDecal->Z; } - if (level.maptime >= TimeToStop) + if (Level->maptime >= TimeToStop) { /*TheDecal->LeftDistance = StartX + DistX;*/ TheDecal->Z = StartY + DistY; @@ -1357,7 +1357,7 @@ void DDecalSlider::Tick () return; } - int distance = level.maptime - TimeToStart; + int distance = Level->maptime - TimeToStart; int maxDistance = TimeToStop - TimeToStart; /*TheDecal->LeftDistance = StartX + DistX * distance / maxDistance);*/ TheDecal->Z = StartY + DistY * distance / maxDistance; @@ -1407,11 +1407,11 @@ void DDecalColorer::Tick () } else { - if (level.maptime < TimeToStartDecay || bglobal.freeze) + if (Level->maptime < TimeToStartDecay || bglobal.freeze) { return; } - else if (level.maptime >= TimeToEndDecay) + else if (Level->maptime >= TimeToEndDecay) { TheDecal->SetShade (GoalColor); Destroy (); // remove myself @@ -1425,12 +1425,12 @@ void DDecalColorer::Tick () return; } } - if (level.maptime & 0) + if (Level->maptime & 0) { // Changing the shade can be expensive, so don't do it too often. return; } - int distance = level.maptime - TimeToStartDecay; + int distance = Level->maptime - TimeToStartDecay; int maxDistance = TimeToEndDecay - TimeToStartDecay; int r = StartColor.r + Scale (GoalColor.r - StartColor.r, distance, maxDistance); int g = StartColor.g + Scale (GoalColor.g - StartColor.g, distance, maxDistance); From 64e9f7e43b83a17130d80ab0e2b9b5ea6f4ccd17 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 28 Jan 2019 02:08:49 +0100 Subject: [PATCH 053/164] - changemap must use the current UI level if the user wants to go to "*". --- src/c_cmds.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/c_cmds.cpp b/src/c_cmds.cpp index b9ec1228f..57171eb5f 100644 --- a/src/c_cmds.cpp +++ b/src/c_cmds.cpp @@ -366,7 +366,7 @@ CCMD (changemap) if (argv.argc() > 1) { const char *mapname = argv[1]; - if (!strcmp(mapname, "*")) mapname = level.MapName.GetChars(); + if (!strcmp(mapname, "*")) mapname = currentUILevel->MapName.GetChars(); try { From d941dea0050723c03888144a391f9cf63a5f9960 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 28 Jan 2019 02:41:29 +0100 Subject: [PATCH 054/164] - added a level iterator for operations that need to make changes to all open levels. Since currently there is only one level, this will obvciously only run once on that level for the time being. This is mainly used for CCMDs and CVARs which either print some diagnostics or change some user-settable configuration. --- src/c_cmds.cpp | 3 +- src/d_main.cpp | 11 +-- src/dobject.cpp | 6 +- src/dobjgc.cpp | 3 +- src/doomstat.cpp | 11 ++- src/g_game.cpp | 2 +- src/g_level.cpp | 27 ++++++-- src/g_levellocals.h | 7 ++ src/g_shared/a_action.cpp | 13 ++-- src/g_shared/a_decals.cpp | 8 +-- src/g_shared/a_dynlight.cpp | 82 ++++++++++++----------- src/hu_scores.cpp | 2 +- src/hwrenderer/dynlights/hw_shadowmap.cpp | 4 +- src/m_cheat.cpp | 5 +- src/p_3dfloors.cpp | 6 +- src/p_mobj.cpp | 13 ++-- src/p_secnodes.cpp | 4 +- src/p_setup.cpp | 77 +++++++++++---------- src/p_tags.cpp | 7 +- src/portal.cpp | 14 ++-- src/r_data/r_sections.cpp | 12 ++-- src/r_utility.cpp | 2 +- src/swrenderer/r_swcolormaps.cpp | 5 +- 23 files changed, 198 insertions(+), 126 deletions(-) diff --git a/src/c_cmds.cpp b/src/c_cmds.cpp index 57171eb5f..e2f9b06f4 100644 --- a/src/c_cmds.cpp +++ b/src/c_cmds.cpp @@ -1061,7 +1061,8 @@ CCMD(changesky) FTextureID newsky = TexMan.GetTextureID(sky1name, ETextureType::Wall, FTextureManager::TEXMAN_Overridable | FTextureManager::TEXMAN_ReturnFirst); if (newsky.Exists()) { - sky1texture = level.skytexture1 = newsky; + // This only alters the primary level's sky setting. + sky1texture = currentUILevel->skytexture1 = newsky; } else { diff --git a/src/d_main.cpp b/src/d_main.cpp index 0f354c8bc..2853cceb3 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -746,12 +746,15 @@ void D_Display () //E_RenderFrame(); // - // Check for the presence of dynamic lights at the start of the frame once. - if ((gl_lights && vid_rendermode == 4) || (r_dynlights && vid_rendermode != 4)) + for (auto Level : AllLevels()) { - level.HasDynamicLights = !!level.lights; + // Check for the presence of dynamic lights at the start of the frame once. + if ((gl_lights && vid_rendermode == 4) || (r_dynlights && vid_rendermode != 4)) + { + Level->HasDynamicLights = !!level.lights; + } + else Level->HasDynamicLights = false; // lights are off so effectively we have none. } - else level.HasDynamicLights = false; // lights are off so effectively we have none. viewsec = screen->RenderView(&players[consoleplayer]); screen->Begin2D(); diff --git a/src/dobject.cpp b/src/dobject.cpp index 9e2e01a3a..b16e69d9b 100644 --- a/src/dobject.cpp +++ b/src/dobject.cpp @@ -488,6 +488,8 @@ void DObject::StaticPointerSubstitution (AActor *old, AActor *notOld) DObject *probe; size_t changed = 0; int i; + + if (old == nullptr) return; // Go through all objects. i = 0;DObject *last=0; @@ -515,8 +517,8 @@ void DObject::StaticPointerSubstitution (AActor *old, AActor *notOld) } } - // Go through sectors. - for (auto &sec : level.sectors) + // Go through sectors. Only the level this actor belongs to is relevant. + for (auto &sec : old->Level->sectors) { if (sec.SoundTarget == old) sec.SoundTarget = notOld; } diff --git a/src/dobjgc.cpp b/src/dobjgc.cpp index 8359eba3c..169baf32c 100644 --- a/src/dobjgc.cpp +++ b/src/dobjgc.cpp @@ -306,7 +306,8 @@ static void MarkRoot() DThinker::MarkRoots(); Mark(E_FirstEventHandler); Mark(E_LastEventHandler); - level.Mark(); + for (auto Level : AllLevels()) + Level->Mark(); // Mark players. for (i = 0; i < MAXPLAYERS; i++) diff --git a/src/doomstat.cpp b/src/doomstat.cpp index edca955e1..b6f0e7871 100644 --- a/src/doomstat.cpp +++ b/src/doomstat.cpp @@ -50,14 +50,21 @@ CVAR (Bool, alwaysapplydmflags, false, CVAR_SERVERINFO); CUSTOM_CVAR (Float, teamdamage, 0.f, CVAR_SERVERINFO) { - level.teamdamage = self; + for (auto Level : AllLevels()) + { + Level->teamdamage = self; + } } CUSTOM_CVAR (String, language, "auto", CVAR_ARCHIVE) { SetLanguageIDs (); GStrings.LoadStrings (false); - if (level.info != NULL) level.LevelName = level.info->LookupLevelName(); + for (auto Level : AllLevels()) + { + // does this even make sense on secondary levels...? + if (Level->info != nullptr) Level->LevelName = Level->info->LookupLevelName(); + } } // [RH] Network arbitrator diff --git a/src/g_game.cpp b/src/g_game.cpp index ba4b9589e..c22c5b4ad 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -769,7 +769,7 @@ void G_AddViewPitch (int look, bool mouse) return; } look = LookAdjust(look); - if (!level.IsFreelookAllowed()) + if (!currentUILevel->IsFreelookAllowed()) { LocalViewPitch = 0; } diff --git a/src/g_level.cpp b/src/g_level.cpp index 1eabc17a8..4b4b17603 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -109,17 +109,26 @@ void G_VerifySkill(); CUSTOM_CVAR(Bool, gl_brightfog, false, CVAR_ARCHIVE | CVAR_NOINITCALL) { - if (level.info == nullptr || level.info->brightfog == -1) level.brightfog = self; + for (auto Level : AllLevels()) + { + if (Level->info == nullptr || Level->info->brightfog == -1) Level->brightfog = self; + } } CUSTOM_CVAR(Bool, gl_lightadditivesurfaces, false, CVAR_ARCHIVE | CVAR_NOINITCALL) { - if (level.info == nullptr || level.info->lightadditivesurfaces == -1) level.lightadditivesurfaces = self; + for (auto Level : AllLevels()) + { + if (Level->info == nullptr || Level->info->lightadditivesurfaces == -1) Level->lightadditivesurfaces = self; + } } CUSTOM_CVAR(Bool, gl_notexturefill, false, CVAR_NOINITCALL) { - if (level.info == nullptr || level.info->notexturefill == -1) level.notexturefill = self; + for (auto Level : AllLevels()) + { + if (Level->info == nullptr || Level->info->notexturefill == -1) Level->notexturefill = self; + } } CUSTOM_CVAR(Int, gl_lightmode, 3, CVAR_ARCHIVE | CVAR_NOINITCALL) @@ -129,7 +138,10 @@ CUSTOM_CVAR(Int, gl_lightmode, 3, CVAR_ARCHIVE | CVAR_NOINITCALL) else if (newself > 4) newself = 8; else if (newself < 0) newself = 0; if (self != newself) self = newself; - else if ((level.info == nullptr || level.info->lightmode == ELightMode::NotSet)) level.lightMode = (ELightMode)*self; + else for (auto Level : AllLevels()) + { + if ((level.info == nullptr || level.info->lightmode == ELightMode::NotSet)) level.lightMode = (ELightMode)*self; + } } @@ -202,7 +214,7 @@ CCMD (map) if (argv.argc() > 1) { const char *mapname = argv[1]; - if (!strcmp(mapname, "*")) mapname = level.MapName.GetChars(); + if (!strcmp(mapname, "*")) mapname = currentUILevel->MapName.GetChars(); try { @@ -252,7 +264,7 @@ UNSAFE_CCMD(recordmap) if (argv.argc() > 2) { const char *mapname = argv[2]; - if (!strcmp(mapname, "*")) mapname = level.MapName.GetChars(); + if (!strcmp(mapname, "*")) mapname = currentUILevel->MapName.GetChars(); try { @@ -2180,7 +2192,8 @@ CCMD(skyfog) { if (argv.argc()>1) { - level.skyfog = MAX(0, (int)strtoull(argv[1], NULL, 0)); + // Do this only on the primary level. + currentUILevel->skyfog = MAX(0, (int)strtoull(argv[1], NULL, 0)); } } diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 4c0691668..41e5e2851 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -635,3 +635,10 @@ inline AActor *P_SpawnPlayer(FPlayerStart *mthing, int playernum, int flags = 0) { return level.SpawnPlayer(mthing, playernum, flags); } + +// This must later be extended to return an array with all levels. +// It is meant for code that needs to iterate over all levels to make some global changes, e.g. configuation CCMDs. +inline TArrayView AllLevels() +{ + return TArrayView(¤tUILevel, 1); +} diff --git a/src/g_shared/a_action.cpp b/src/g_shared/a_action.cpp index 43500b7c5..fb3b9a309 100644 --- a/src/g_shared/a_action.cpp +++ b/src/g_shared/a_action.cpp @@ -92,12 +92,15 @@ CUSTOM_CVAR(Int, sv_corpsequeuesize, 64, CVAR_ARCHIVE|CVAR_SERVERINFO) { if (self > 0) { - auto &corpsequeue = level.CorpseQueue; - while (corpsequeue.Size() > (unsigned)self) + for (auto Level : AllLevels()) { - AActor *corpse = corpsequeue[0]; - if (corpse) corpse->Destroy(); - corpsequeue.Delete(0); + auto &corpsequeue = Level->CorpseQueue; + while (corpsequeue.Size() > (unsigned)self) + { + AActor *corpse = corpsequeue[0]; + if (corpse) corpse->Destroy(); + corpsequeue.Delete(0); + } } } } diff --git a/src/g_shared/a_decals.cpp b/src/g_shared/a_decals.cpp index 8373231a8..10fec6ce0 100644 --- a/src/g_shared/a_decals.cpp +++ b/src/g_shared/a_decals.cpp @@ -538,9 +538,9 @@ CUSTOM_CVAR (Int, cl_maxdecals, 1024, CVAR_ARCHIVE) { self = 0; } - else + else for (auto Level : AllLevels()) { - while (level.ImpactDecalCount > self) + while (Level->ImpactDecalCount > self) { DThinker *thinker = DThinker::FirstThinker(STAT_AUTODECAL); if (thinker != NULL) @@ -553,13 +553,13 @@ CUSTOM_CVAR (Int, cl_maxdecals, 1024, CVAR_ARCHIVE) void DImpactDecal::CheckMax () { - if (++level.ImpactDecalCount >= cl_maxdecals) + if (++Level->ImpactDecalCount >= cl_maxdecals) { DThinker *thinker = DThinker::FirstThinker (STAT_AUTODECAL); if (thinker != NULL) { thinker->Destroy(); - level.ImpactDecalCount--; + Level->ImpactDecalCount--; } } } diff --git a/src/g_shared/a_dynlight.cpp b/src/g_shared/a_dynlight.cpp index 07e245983..e333bffc5 100644 --- a/src/g_shared/a_dynlight.cpp +++ b/src/g_shared/a_dynlight.cpp @@ -880,48 +880,52 @@ CCMD(listlights) int allwalls=0, allsectors=0, allsubsecs = 0; int i=0, shadowcount = 0; FDynamicLight * dl; - - for (dl = level.lights; dl; dl = dl->next) + + for (auto Level : AllLevels()) { - walls=0; - sectors=0; - Printf("%s at (%f, %f, %f), color = 0x%02x%02x%02x, radius = %f %s %s", - dl->target->GetClass()->TypeName.GetChars(), - dl->X(), dl->Y(), dl->Z(), dl->GetRed(), dl->GetGreen(), dl->GetBlue(), - dl->radius, dl->IsAttenuated()? "attenuated" : "", dl->shadowmapped? "shadowmapped" : ""); - i++; - shadowcount += dl->shadowmapped; - - if (dl->target) + Printf("Lights for %s\n", Level->MapName.GetChars()); + for (dl = Level->lights; dl; dl = dl->next) { - FTextureID spr = sprites[dl->target->sprite].GetSpriteFrame(dl->target->frame, 0, 0., nullptr); - Printf(", frame = %s ", TexMan.GetTexture(spr)->GetName().GetChars()); + walls=0; + sectors=0; + Printf("%s at (%f, %f, %f), color = 0x%02x%02x%02x, radius = %f %s %s", + dl->target->GetClass()->TypeName.GetChars(), + dl->X(), dl->Y(), dl->Z(), dl->GetRed(), dl->GetGreen(), dl->GetBlue(), + dl->radius, dl->IsAttenuated()? "attenuated" : "", dl->shadowmapped? "shadowmapped" : ""); + i++; + shadowcount += dl->shadowmapped; + + if (dl->target) + { + FTextureID spr = sprites[dl->target->sprite].GetSpriteFrame(dl->target->frame, 0, 0., nullptr); + Printf(", frame = %s ", TexMan.GetTexture(spr)->GetName().GetChars()); + } + + + FLightNode * node; + + node=dl->touching_sides; + + while (node) + { + walls++; + allwalls++; + node = node->nextTarget; + } + + + node = dl->touching_sector; + + while (node) + { + allsectors++; + sectors++; + node = node->nextTarget; + } + Printf("- %d walls, %d sectors\n", walls, sectors); + } - - - FLightNode * node; - - node=dl->touching_sides; - - while (node) - { - walls++; - allwalls++; - node = node->nextTarget; - } - - - node = dl->touching_sector; - - while (node) - { - allsectors++; - sectors++; - node = node->nextTarget; - } - Printf("- %d walls, %d sectors\n", walls, sectors); - + Printf("%i dynamic lights, %d shadowmapped, %d walls, %d sectors\n\n\n", i, shadowcount, allwalls, allsectors); } - Printf("%i dynamic lights, %d shadowmapped, %d walls, %d sectors\n\n\n", i, shadowcount, allwalls, allsectors); } diff --git a/src/hu_scores.cpp b/src/hu_scores.cpp index a4a261a77..ceddaca23 100644 --- a/src/hu_scores.cpp +++ b/src/hu_scores.cpp @@ -368,7 +368,7 @@ static void HU_DrawTimeRemaining (int y) if (deathmatch && timelimit && gamestate == GS_LEVEL) { char str[80]; - int timeleft = (int)(timelimit * TICRATE * 60) - level.maptime; + int timeleft = (int)(timelimit * TICRATE * 60) - currentUILevel->maptime; int hours, minutes, seconds; if (timeleft < 0) diff --git a/src/hwrenderer/dynlights/hw_shadowmap.cpp b/src/hwrenderer/dynlights/hw_shadowmap.cpp index 3f9dc89eb..5bed01063 100644 --- a/src/hwrenderer/dynlights/hw_shadowmap.cpp +++ b/src/hwrenderer/dynlights/hw_shadowmap.cpp @@ -83,9 +83,9 @@ CUSTOM_CVAR(Int, gl_shadowmap_quality, 512, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) CUSTOM_CVAR (Bool, gl_light_shadowmap, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) { - if (!self) + if (!self) for (auto Level : AllLevels()) { - auto light = level.lights; + auto light = Level->lights; while (light) { light->mShadowmapIndex = 1024; diff --git a/src/m_cheat.cpp b/src/m_cheat.cpp index 3effff3ea..b58479c08 100644 --- a/src/m_cheat.cpp +++ b/src/m_cheat.cpp @@ -287,7 +287,10 @@ void cht_DoCheat (player_t *player, int cheat) if (i == 4) { - level.flags2 ^= LEVEL2_ALLMAP; + for (auto Level : AllLevels()) + { + Level->flags2 ^= LEVEL2_ALLMAP; + } } else if (player->mo != NULL && player->health >= 0) { diff --git a/src/p_3dfloors.cpp b/src/p_3dfloors.cpp index 4da592cf4..213987718 100644 --- a/src/p_3dfloors.cpp +++ b/src/p_3dfloors.cpp @@ -867,13 +867,15 @@ CCMD (dump3df) { if (argv.argc() > 1) { + // Print 3D floor info for a single sector. + // This only checks the primary level. int sec = (int)strtoll(argv[1], NULL, 10); - if ((unsigned)sec >= level.sectors.Size()) + if ((unsigned)sec >= currentUILevel->sectors.Size()) { Printf("Sector %d does not exist.\n", sec); return; } - sector_t *sector = &level.sectors[sec]; + sector_t *sector = ¤tUILevel->sectors[sec]; TArray & ffloors=sector->e->XFloor.ffloors; for (unsigned int i = 0; i < ffloors.Size(); i++) diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index fc2c43f02..02abc3be0 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -147,7 +147,10 @@ FRandom pr_spawnmobj ("SpawnActor"); CUSTOM_CVAR (Float, sv_gravity, 800.f, CVAR_SERVERINFO|CVAR_NOSAVE) { - level.gravity = self; + for (auto Level : AllLevels()) + { + Level->gravity = self; + } } CVAR (Bool, cl_missiledecals, true, CVAR_ARCHIVE) @@ -3021,9 +3024,11 @@ int FLevelLocals::FindUniqueTID(int start_tid, int limit) CCMD(utid) { - Printf("%d\n", - level.FindUniqueTID(argv.argc() > 1 ? atoi(argv[1]) : 0, - (argv.argc() > 2 && atoi(argv[2]) >= 0) ? atoi(argv[2]) : 0)); + for (auto Level : AllLevels()) + { + Printf("%s, %d\n", Level->MapName.GetChars(), Level->FindUniqueTID(argv.argc() > 1 ? atoi(argv[1]) : 0, + (argv.argc() > 2 && atoi(argv[2]) >= 0) ? atoi(argv[2]) : 0)); + } } //========================================================================== diff --git a/src/p_secnodes.cpp b/src/p_secnodes.cpp index 4400960ad..9f5554b7c 100644 --- a/src/p_secnodes.cpp +++ b/src/p_secnodes.cpp @@ -466,7 +466,7 @@ FBlockNode *FBlockNode::Create(AActor *who, int x, int y, int group) { block = (FBlockNode *)secnodearena.Alloc(sizeof(FBlockNode)); } - block->BlockIndex = x + y * level.blockmap.bmapwidth; + block->BlockIndex = x + y * who->Level->blockmap.bmapwidth; block->Me = who; block->NextActor = nullptr; block->PrevActor = nullptr; @@ -479,4 +479,4 @@ void FBlockNode::Release() { NextBlock = FreeBlocks; FreeBlocks = this; -} \ No newline at end of file +} diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 3017d6aed..8b1d59160 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -594,39 +594,43 @@ static void P_Shutdown () CCMD(dumpgeometry) { - for (auto §or : level.sectors) + for (auto Level : AllLevels()) { - Printf(PRINT_LOG, "Sector %d\n", sector.sectornum); - for (int j = 0; jMapName.GetChars()); + for (auto §or : Level->sectors) { - subsector_t * sub = sector.subsectors[j]; - - Printf(PRINT_LOG, " Subsector %d - real sector = %d - %s\n", int(sub->Index()), sub->sector->sectornum, sub->hacked & 1 ? "hacked" : ""); - for (uint32_t k = 0; knumlines; k++) + Printf(PRINT_LOG, "Sector %d\n", sector.sectornum); + for (int j = 0; jfirstline + k; - if (seg->linedef) + subsector_t * sub = sector.subsectors[j]; + + Printf(PRINT_LOG, " Subsector %d - real sector = %d - %s\n", int(sub->Index()), sub->sector->sectornum, sub->hacked & 1 ? "hacked" : ""); + for (uint32_t k = 0; knumlines; k++) { - 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->Index(), seg->linedef->Index(), seg->sidedef != seg->linedef->sidedef[0]); + seg_t * seg = sub->firstline + k; + if (seg->linedef) + { + 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->Index(), seg->linedef->Index(), seg->sidedef != seg->linedef->sidedef[0]); + } + else + { + Printf(PRINT_LOG, " (%4.4f, %4.4f), (%4.4f, %4.4f) - seg %d, miniseg", + seg->v1->fX(), seg->v1->fY(), seg->v2->fX(), seg->v2->fY(), seg->Index()); + } + if (seg->PartnerSeg) + { + subsector_t * sub2 = seg->PartnerSeg->Subsector; + Printf(PRINT_LOG, ", back sector = %d, real back sector = %d", sub2->render_sector->sectornum, seg->PartnerSeg->frontsector->sectornum); + } + else if (seg->backsector) + { + Printf(PRINT_LOG, ", back sector = %d (no partnerseg)", seg->backsector->sectornum); + } + + Printf(PRINT_LOG, "\n"); } - else - { - Printf(PRINT_LOG, " (%4.4f, %4.4f), (%4.4f, %4.4f) - seg %d, miniseg", - seg->v1->fX(), seg->v1->fY(), seg->v2->fX(), seg->v2->fY(), seg->Index()); - } - if (seg->PartnerSeg) - { - subsector_t * sub2 = seg->PartnerSeg->Subsector; - Printf(PRINT_LOG, ", back sector = %d, real back sector = %d", sub2->render_sector->sectornum, seg->PartnerSeg->frontsector->sectornum); - } - else if (seg->backsector) - { - Printf(PRINT_LOG, ", back sector = %d (no partnerseg)", seg->backsector->sectornum); - } - - Printf(PRINT_LOG, "\n"); } } } @@ -640,14 +644,18 @@ CCMD(dumpgeometry) CCMD(listmapsections) { - for (int i = 0; i < 100; i++) + for (auto Level : AllLevels()) { - for (auto &sub : level.subsectors) + Printf("Map sections for %s:\n", Level->MapName.GetChars()); + for (int i = 0; i < 100; i++) { - if (sub.mapsection == i) + for (auto &sub : Level->subsectors) { - Printf("Mapsection %d, sector %d, line %d\n", i, sub.render_sector->Index(), sub.firstline->linedef->Index()); - break; + if (sub.mapsection == i) + { + Printf("Mapsection %d, sector %d, line %d\n", i, sub.render_sector->Index(), sub.firstline->linedef->Index()); + break; + } } } } @@ -661,9 +669,8 @@ CCMD(listmapsections) CUSTOM_CVAR(Bool, forcewater, false, CVAR_ARCHIVE | CVAR_SERVERINFO) { - if (gamestate == GS_LEVEL) + if (gamestate == GS_LEVEL) for (auto Level : AllLevels()) { - auto Level = currentUILevel; for (auto &sec : Level->sectors) { sector_t *hsec = sec.GetHeightSec(); diff --git a/src/p_tags.cpp b/src/p_tags.cpp index db113daab..35d6902a8 100644 --- a/src/p_tags.cpp +++ b/src/p_tags.cpp @@ -316,7 +316,10 @@ void FTagManager::DumpTags() CCMD(dumptags) { - level.tagManager.DumpTags(); + for (auto Level : AllLevels()) + { + Level->tagManager.DumpTags(); + } } //----------------------------------------------------------------------------- @@ -369,7 +372,7 @@ int FSectorTagIterator::NextCompat(bool compat, int start) for (unsigned i = start + 1; i < tagManager.Level->sectors.Size(); i++) { - if (level.SectorHasTag(i, searchtag)) return i; + if (tagManager.Level->SectorHasTag(i, searchtag)) return i; } return -1; } diff --git a/src/portal.cpp b/src/portal.cpp index 7b10f1d9b..128905bf7 100644 --- a/src/portal.cpp +++ b/src/portal.cpp @@ -1208,14 +1208,18 @@ bool FLevelLocals::CollectConnectedGroups(int startgroup, const DVector3 &positi CCMD(dumplinktable) { - for (int x = 1; x < level.Displacements.size; x++) + for (auto Level : AllLevels()) { - for (int y = 1; y < level.Displacements.size; y++) + Printf("Portal displacements for %s:\n", Level->MapName.GetChars()); + for (int x = 1; x < Level->Displacements.size; x++) { - FDisplacement &disp = level.Displacements(x, y); - Printf("%c%c(%6d, %6d)", TEXTCOLOR_ESCAPE, 'C' + disp.indirect, int(disp.pos.X), int(disp.pos.Y)); + for (int y = 1; y < Level->Displacements.size; y++) + { + FDisplacement &disp = Level->Displacements(x, y); + Printf("%c%c(%6d, %6d)", TEXTCOLOR_ESCAPE, 'C' + disp.indirect, int(disp.pos.X), int(disp.pos.Y)); + } + Printf("\n"); } - Printf("\n"); } } diff --git a/src/r_data/r_sections.cpp b/src/r_data/r_sections.cpp index b896f1ddb..79790a6cd 100644 --- a/src/r_data/r_sections.cpp +++ b/src/r_data/r_sections.cpp @@ -813,9 +813,10 @@ public: // //============================================================================= -void PrintSections(FSectionContainer &container) +void PrintSections(FLevelLocals *Level) { - auto Level = &level; + FSectionContainer &container = Level->sections; + Printf("Sections for %s\n", Level->MapName.GetChars()); for (unsigned i = 0; i < container.allSections.Size(); i++) { auto §ion = container.allSections[i]; @@ -852,7 +853,7 @@ void PrintSections(FSectionContainer &container) } } } - Printf(PRINT_LOG, "%d sectors, %d subsectors, %d sections\n", Level->sectors.Size(), Level->subsectors.Size(), container.allSections.Size()); + Printf(PRINT_LOG, "%d sectors, %d subsectors, %d sections\n\n", Level->sectors.Size(), Level->subsectors.Size(), container.allSections.Size()); } @@ -876,7 +877,10 @@ void CreateSections(FLevelLocals *Level) CCMD(printsections) { - PrintSections(level.sections); + for (auto Level : AllLevels()) + { + PrintSections(Level); + } } diff --git a/src/r_utility.cpp b/src/r_utility.cpp index 9278a94d3..9a6f675cb 100644 --- a/src/r_utility.cpp +++ b/src/r_utility.cpp @@ -1029,7 +1029,7 @@ void R_SetupFrame (FRenderViewpoint &viewpoint, FViewWindow &viewwindow, AActor // However, to set up a projection matrix this needs to be adjusted. double radPitch = viewpoint.Angles.Pitch.Normalized180().Radians(); double angx = cos(radPitch); - double angy = sin(radPitch) * level.info->pixelstretch; + double angy = sin(radPitch) * actor->Level->info->pixelstretch; double alen = sqrt(angx*angx + angy*angy); viewpoint.HWAngles.Pitch = RAD2DEG((float)asin(angy / alen)); diff --git a/src/swrenderer/r_swcolormaps.cpp b/src/swrenderer/r_swcolormaps.cpp index d5b374ad1..712107be8 100644 --- a/src/swrenderer/r_swcolormaps.cpp +++ b/src/swrenderer/r_swcolormaps.cpp @@ -524,7 +524,10 @@ CCMD (testfade) { color = V_GetColorFromString (NULL, argv[1]); } - level.fadeto = color; + for (auto Level : AllLevels()) + { + Level->fadeto = color; + } NormalLight.ChangeFade (color); } } From 0ef0698d247744bf8c035fea56295b13763098de Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 28 Jan 2019 02:43:39 +0100 Subject: [PATCH 055/164] - use the proper level for setting up a hardware rendered scene. The shader timer may be taken from the primary level for the entire scene, because it will always be the same for all levels in a set. The camera textures need to be prepared for all levels. --- src/gl/renderer/gl_renderer.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/gl/renderer/gl_renderer.cpp b/src/gl/renderer/gl_renderer.cpp index b459685ba..76e4f9932 100644 --- a/src/gl/renderer/gl_renderer.cpp +++ b/src/gl/renderer/gl_renderer.cpp @@ -253,13 +253,18 @@ sector_t *FGLRenderer::RenderView(player_t* player) // NoInterpolateView should have no bearing on camera textures, but needs to be preserved for the main view below. bool saved_niv = NoInterpolateView; NoInterpolateView = false; - // prepare all camera textures that have been used in the last frame - auto Level = r_viewpoint.ViewLevel; - gl_RenderState.CheckTimer(Level->ShaderStartTime); - Level->canvasTextureInfo.UpdateAll([&](AActor *camera, FCanvasTexture *camtex, double fov) + + // Shader start time does not need to be handled per level. Just use the one from the camera to render from. + gl_RenderState.CheckTimer(player->camera->Level->ShaderStartTime); + // prepare all camera textures that have been used in the last frame. + // This must be done for all levels, not just the primary one! + for (auto Level : AllLevels()) { - RenderTextureView(camtex, camera, fov); - }); + Level->canvasTextureInfo.UpdateAll([&](AActor *camera, FCanvasTexture *camtex, double fov) + { + RenderTextureView(camtex, camera, fov); + }); + } NoInterpolateView = saved_niv; @@ -391,4 +396,4 @@ void FGLRenderer::BeginFrame() mSaveBuffers->Setup(SAVEPICWIDTH, SAVEPICHEIGHT, SAVEPICWIDTH, SAVEPICHEIGHT); } -} \ No newline at end of file +} From 66695ac6a0003ead5fe21d2616a779e147d50cc5 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 28 Jan 2019 02:44:05 +0100 Subject: [PATCH 056/164] - made most of the player spawn spot handliing functions members of FLevelLocals. --- src/b_game.cpp | 2 +- src/fragglescript/t_script.cpp | 2 +- src/g_game.cpp | 99 ++++++++++--------- src/g_game.h | 4 - src/g_level.cpp | 4 +- src/g_levellocals.h | 11 +++ src/p_mobj.cpp | 4 +- src/p_setup.cpp | 6 +- wadsrc/static/zscript/base.txt | 12 ++- wadsrc/static/zscript/hexen/teleportother.txt | 6 +- wadsrc/static/zscript/raven/artitele.txt | 4 +- 11 files changed, 84 insertions(+), 70 deletions(-) diff --git a/src/b_game.cpp b/src/b_game.cpp index f8eca50a5..69f273174 100644 --- a/src/b_game.cpp +++ b/src/b_game.cpp @@ -417,7 +417,7 @@ bool FCajunMaster::DoAddBot (uint8_t *info, botskill_t skill) else Printf ("%s joined the game\n", players[bnum].userinfo.GetName()); - G_DoReborn (bnum, true); + level.DoReborn (bnum, true); return true; } diff --git a/src/fragglescript/t_script.cpp b/src/fragglescript/t_script.cpp index 534eb5fa4..2eb6df9d6 100644 --- a/src/fragglescript/t_script.cpp +++ b/src/fragglescript/t_script.cpp @@ -667,6 +667,6 @@ CCMD(fpuke) } else { - T_RunScript(currentUILevel, atoi(argv[1]), players[consoleplayer].mo); + T_RunScript(players[consoleplayer].mo->Level, atoi(argv[1]), players[consoleplayer].mo); } } diff --git a/src/g_game.cpp b/src/g_game.cpp index c22c5b4ad..9cf44bf9c 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -1014,7 +1014,7 @@ void G_Ticker () } if (players[i].playerstate == PST_REBORN || players[i].playerstate == PST_ENTER) { - G_DoReborn(i, false); + level.DoReborn(i, false); } } } @@ -1241,7 +1241,7 @@ void G_PlayerFinishLevel (int player, EFinishLevelType mode, int flags) // Called after a player dies // almost everything is cleared and initialized // -void G_PlayerReborn (int player) +void FLevelLocals::PlayerReborn (int player) { player_t* p; int frags[MAXPLAYERS]; @@ -1325,7 +1325,7 @@ void G_PlayerReborn (int player) // because something is occupying it // -bool G_CheckSpot (int playernum, FPlayerStart *mthing) +bool FLevelLocals::CheckSpot (int playernum, FPlayerStart *mthing) { DVector3 spot; double oldz; @@ -1335,7 +1335,7 @@ bool G_CheckSpot (int playernum, FPlayerStart *mthing) spot = mthing->pos; - if (!(level.flags & LEVEL_USEPLAYERSTARTZ)) + if (!(flags & LEVEL_USEPLAYERSTARTZ)) { spot.Z = 0; } @@ -1377,7 +1377,7 @@ bool G_CheckSpot (int playernum, FPlayerStart *mthing) // // [RH] Returns the distance of the closest player to the given mapthing -static double PlayersRangeFromSpot (FPlayerStart *spot) +double FLevelLocals::PlayersRangeFromSpot (FPlayerStart *spot) { double closest = INT_MAX; double distance; @@ -1398,7 +1398,7 @@ static double PlayersRangeFromSpot (FPlayerStart *spot) } // [RH] Select the deathmatch spawn spot farthest from everyone. -static FPlayerStart *SelectFarthestDeathmatchSpot (size_t selections) +FPlayerStart *FLevelLocals::SelectFarthestDeathmatchSpot (size_t selections) { double bestdistance = 0; FPlayerStart *bestspot = NULL; @@ -1406,7 +1406,7 @@ static FPlayerStart *SelectFarthestDeathmatchSpot (size_t selections) for (i = 0; i < selections; i++) { - double distance = PlayersRangeFromSpot (&level.deathmatchstarts[i]); + double distance = PlayersRangeFromSpot (&deathmatchstarts[i]); if (distance > bestdistance) { @@ -1419,27 +1419,27 @@ static FPlayerStart *SelectFarthestDeathmatchSpot (size_t selections) } // [RH] Select a deathmatch spawn spot at random (original mechanism) -static FPlayerStart *SelectRandomDeathmatchSpot (int playernum, unsigned int selections) +FPlayerStart *FLevelLocals::SelectRandomDeathmatchSpot (int playernum, unsigned int selections) { unsigned int i, j; for (j = 0; j < 20; j++) { i = pr_dmspawn() % selections; - if (G_CheckSpot (playernum, &level.deathmatchstarts[i]) ) + if (CheckSpot (playernum, &level.deathmatchstarts[i]) ) { - return &level.deathmatchstarts[i]; + return &deathmatchstarts[i]; } } // [RH] return a spot anyway, since we allow telefragging when a player spawns - return &level.deathmatchstarts[i]; + return &deathmatchstarts[i]; } -DEFINE_ACTION_FUNCTION(DObject, G_PickDeathmatchStart) +DEFINE_ACTION_FUNCTION(FLevelLocals, PickDeathmatchStart) { - PARAM_PROLOGUE; - unsigned int selections = level.deathmatchstarts.Size(); + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); + unsigned int selections = self->deathmatchstarts.Size(); DVector3 pos; int angle; if (selections == 0) @@ -1450,8 +1450,8 @@ DEFINE_ACTION_FUNCTION(DObject, G_PickDeathmatchStart) else { unsigned int i = pr_dmspawn() % selections; - angle = level.deathmatchstarts[i].angle; - pos = level.deathmatchstarts[i].pos; + angle = self->deathmatchstarts[i].angle; + pos = self->deathmatchstarts[i].pos; } if (numret > 1) @@ -1466,12 +1466,12 @@ DEFINE_ACTION_FUNCTION(DObject, G_PickDeathmatchStart) return numret; } -void G_DeathMatchSpawnPlayer (int playernum) +void FLevelLocals::DeathMatchSpawnPlayer (int playernum) { unsigned int selections; FPlayerStart *spot; - selections = level.deathmatchstarts.Size (); + selections = deathmatchstarts.Size (); // [RH] We can get by with just 1 deathmatch start if (selections < 1) I_Error ("No deathmatch starts"); @@ -1488,17 +1488,17 @@ void G_DeathMatchSpawnPlayer (int playernum) { // No good spot, so the player will probably get stuck. // We were probably using select farthest above, and all // the spots were taken. - spot = G_PickPlayerStart(playernum, PPS_FORCERANDOM); - if (!G_CheckSpot(playernum, spot)) + spot = PickPlayerStart(playernum, PPS_FORCERANDOM); + if (!CheckSpot(playernum, spot)) { // This map doesn't have enough coop spots for this player // to use one. spot = SelectRandomDeathmatchSpot(playernum, selections); if (spot == NULL) { // We have a player 1 start, right? - spot = &level.playerstarts[0]; + spot = &playerstarts[0]; if (spot->type == 0) { // Fine, whatever. - spot = &level.deathmatchstarts[0]; + spot = &deathmatchstarts[0]; } } } @@ -1511,15 +1511,15 @@ void G_DeathMatchSpawnPlayer (int playernum) // // G_PickPlayerStart // -FPlayerStart *G_PickPlayerStart(int playernum, int flags) +FPlayerStart *FLevelLocals::PickPlayerStart(int playernum, int flags) { - if (level.AllPlayerStarts.Size() == 0) // No starts to pick + if (AllPlayerStarts.Size() == 0) // No starts to pick { return NULL; } - if ((level.flags2 & LEVEL2_RANDOMPLAYERSTARTS) || (flags & PPS_FORCERANDOM) || - level.playerstarts[playernum].type == 0) + if ((flags2 & LEVEL2_RANDOMPLAYERSTARTS) || (flags & PPS_FORCERANDOM) || + playerstarts[playernum].type == 0) { if (!(flags & PPS_NOBLOCKINGCHECK)) { @@ -1529,9 +1529,9 @@ FPlayerStart *G_PickPlayerStart(int playernum, int flags) // Find all unblocked player starts. for (i = 0; i < level.AllPlayerStarts.Size(); ++i) { - if (G_CheckSpot(playernum, &level.AllPlayerStarts[i])) + if (CheckSpot(playernum, &AllPlayerStarts[i])) { - good_starts.Push(&level.AllPlayerStarts[i]); + good_starts.Push(&AllPlayerStarts[i]); } } if (good_starts.Size() > 0) @@ -1540,17 +1540,17 @@ FPlayerStart *G_PickPlayerStart(int playernum, int flags) } } // Pick a spot at random, whether it's open or not. - return &level.AllPlayerStarts[pr_pspawn(level.AllPlayerStarts.Size())]; + return &level.AllPlayerStarts[pr_pspawn(AllPlayerStarts.Size())]; } - return &level.playerstarts[playernum]; + return &playerstarts[playernum]; } -DEFINE_ACTION_FUNCTION(DObject, G_PickPlayerStart) +DEFINE_ACTION_FUNCTION(FLevelLocals, PickPlayerStart) { - PARAM_PROLOGUE; + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); PARAM_INT(playernum); PARAM_INT(flags); - auto ps = G_PickPlayerStart(playernum, flags); + auto ps = self->PickPlayerStart(playernum, flags); if (numret > 1) { ret[1].SetInt(ps? ps->angle : 0); @@ -1566,23 +1566,24 @@ DEFINE_ACTION_FUNCTION(DObject, G_PickPlayerStart) // // G_QueueBody // -static void G_QueueBody (AActor *body) +void FLevelLocals::QueueBody (AActor *body) { // flush an old corpse if needed - int modslot = level.bodyqueslot%level.BODYQUESIZE; - level.bodyqueslot = modslot + 1; + int modslot = bodyqueslot%level.BODYQUESIZE; + bodyqueslot = modslot + 1; - if (level.bodyqueslot >= level.BODYQUESIZE && level.bodyque[modslot] != NULL) + if (bodyqueslot >= BODYQUESIZE && bodyque[modslot] != NULL) { - level.bodyque[modslot]->Destroy (); + bodyque[modslot]->Destroy (); } - level.bodyque[modslot] = body; + bodyque[modslot] = body; // Copy the player's translation, so that if they change their color later, only // their current body will change and not all their old corpses. if (GetTranslationType(body->Translation) == TRANSLATION_Players || GetTranslationType(body->Translation) == TRANSLATION_PlayersExtra) { + // This needs to be able to handle multiple levels, in case a level with dead players is used as a secondary one later. *translationtables[TRANSLATION_PlayerCorpses][modslot] = *TranslationToTable(body->Translation); body->Translation = TRANSLATION(TRANSLATION_PlayerCorpses,modslot); translationtables[TRANSLATION_PlayerCorpses][modslot]->UpdateNative(); @@ -1606,9 +1607,9 @@ static void G_QueueBody (AActor *body) // G_DoReborn // EXTERN_CVAR(Bool, sv_singleplayerrespawn) -void G_DoReborn (int playernum, bool freshbot) +void FLevelLocals::DoReborn (int playernum, bool freshbot) { - if (!multiplayer && !(level.flags2 & LEVEL2_ALLOWRESPAWN) && !sv_singleplayerrespawn && + if (!multiplayer && !(flags2 & LEVEL2_ALLOWRESPAWN) && !sv_singleplayerrespawn && !G_SkillProperty(SKILLP_PlayerRespawn)) { if (BackupSaveName.Len() > 0 && FileExists (BackupSaveName.GetChars())) @@ -1633,27 +1634,27 @@ void G_DoReborn (int playernum, bool freshbot) // first disassociate the corpse if (players[playernum].mo) { - G_QueueBody (players[playernum].mo); + QueueBody (players[playernum].mo); players[playernum].mo->player = NULL; } // spawn at random spot if in deathmatch - if ((deathmatch || isUnfriendly) && (level.deathmatchstarts.Size () > 0)) + if ((deathmatch || isUnfriendly) && (deathmatchstarts.Size () > 0)) { - G_DeathMatchSpawnPlayer (playernum); + DeathMatchSpawnPlayer (playernum); return; } - if (!(level.flags2 & LEVEL2_RANDOMPLAYERSTARTS) && - level.playerstarts[playernum].type != 0 && - G_CheckSpot (playernum, &level.playerstarts[playernum])) + if (!(flags2 & LEVEL2_RANDOMPLAYERSTARTS) && + playerstarts[playernum].type != 0 && + CheckSpot (playernum, &playerstarts[playernum])) { - AActor *mo = P_SpawnPlayer(&level.playerstarts[playernum], playernum); + AActor *mo = P_SpawnPlayer(&playerstarts[playernum], playernum); if (mo != NULL) P_PlayerStartStomp(mo, true); } else { // try to spawn at any random player's spot - FPlayerStart *start = G_PickPlayerStart(playernum, PPS_FORCERANDOM); + FPlayerStart *start = PickPlayerStart(playernum, PPS_FORCERANDOM); AActor *mo = P_SpawnPlayer(start, playernum); if (mo != NULL) P_PlayerStartStomp(mo, true); } diff --git a/src/g_game.h b/src/g_game.h index 35b8f479c..03658c106 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -38,9 +38,6 @@ class AActor; // // GAME // -void G_DeathMatchSpawnPlayer (int playernum); - -struct FPlayerStart *G_PickPlayerStart (int playernum, int flags = 0); enum { PPS_FORCERANDOM = 1, @@ -89,7 +86,6 @@ enum EFinishLevelType void G_PlayerFinishLevel (int player, EFinishLevelType mode, int flags); -void G_DoReborn (int playernum, bool freshbot); void G_DoPlayerPop(int playernum); // Adds pitch to consoleplayer's viewpitch and clamps it diff --git a/src/g_level.cpp b/src/g_level.cpp index 4b4b17603..37c1bbc22 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -693,7 +693,7 @@ void G_ChangeLevel(const char *levelname, int position, int flags, int nextSkill player->mo->special1 = 0; } // ]] - G_DoReborn(i, false); + level.DoReborn(i, false); } } } @@ -1360,7 +1360,7 @@ int G_FinishTravel () pawndup = pawn->player->mo; assert (pawn != pawndup); - start = G_PickPlayerStart(pnum, 0); + start = level.PickPlayerStart(pnum, 0); if (start == NULL) { if (pawndup != nullptr) diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 41e5e2851..d28728986 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -262,6 +262,17 @@ public: void SpawnExtraPlayers(); void Serialize(FSerializer &arc, bool hubload); + // g_Game + void PlayerReborn (int player); + bool CheckSpot (int playernum, FPlayerStart *mthing); + void DoReborn (int playernum, bool freshbot); + void QueueBody (AActor *body); + double PlayersRangeFromSpot (FPlayerStart *spot); + FPlayerStart *SelectFarthestDeathmatchSpot (size_t selections); + FPlayerStart *SelectRandomDeathmatchSpot (int playernum, unsigned int selections); + void DeathMatchSpawnPlayer (int playernum); + FPlayerStart *PickPlayerStart(int playernum, int flags = 0); + private: // Work data for CollectConnectedGroups. diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 02abc3be0..52d371f3d 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -109,8 +109,6 @@ // EXTERNAL FUNCTION PROTOTYPES -------------------------------------------- -void G_PlayerReborn (int player); - // PRIVATE FUNCTION PROTOTYPES --------------------------------------------- static void PlayerLandedOnThing (AActor *mo, AActor *onmobj); @@ -4999,7 +4997,7 @@ AActor *FLevelLocals::SpawnPlayer (FPlayerStart *mthing, int playernum, int flag state = p->playerstate; if (state == PST_REBORN || state == PST_ENTER) { - G_PlayerReborn (playernum); + PlayerReborn (playernum); } else if (oldactor != NULL && oldactor->player == p && !(flags & SPF_TEMPPLAYER)) { diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 8b1d59160..d557236ac 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -445,7 +445,7 @@ void P_SetupLevel(FLevelLocals *Level, int position, bool newGame) if (playeringame[i]) { players[i].mo = nullptr; - G_DeathMatchSpawnPlayer(i); + Level->DeathMatchSpawnPlayer(i); } } } @@ -457,7 +457,7 @@ void P_SetupLevel(FLevelLocals *Level, int position, bool newGame) if (playeringame[i]) { players[i].mo = nullptr; - FPlayerStart *mthing = G_PickPlayerStart(i); + FPlayerStart *mthing = Level->PickPlayerStart(i); P_SpawnPlayer(mthing, i, (Level->flags2 & LEVEL2_PRERAISEWEAPON) ? SPF_WEAPONFULLYUP : 0); } } @@ -474,7 +474,7 @@ void P_SetupLevel(FLevelLocals *Level, int position, bool newGame) if (!(players[i].mo->flags & MF_FRIENDLY)) { AActor * oldSpawn = players[i].mo; - G_DeathMatchSpawnPlayer(i); + Level->DeathMatchSpawnPlayer(i); oldSpawn->Destroy(); } } diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index 5e52f3e5a..de621398c 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -400,8 +400,14 @@ class Object native native static String G_SkillName(); native static int G_SkillPropertyInt(int p); native static double G_SkillPropertyFloat(int p); - native static vector3, int G_PickDeathmatchStart(); - native static vector3, int G_PickPlayerStart(int pnum, int flags = 0); + deprecated("3.8") static vector3, int G_PickDeathmatchStart() + { + return level.PickDeathmatchStart(); + } + deprecated("3.8") static vector3, int G_PickPlayerStart(int pnum, int flags = 0) + { + return level.PickPlayerStart(pnum, flags); + } native static void S_Sound (Sound sound_id, int channel, float volume = 1, float attenuation = ATTN_NORM); native static void S_PauseSound (bool notmusic, bool notsfx); native static void S_ResumeSound (bool notsfx); @@ -703,6 +709,8 @@ struct LevelLocals native native int FindUniqueTid(int start = 0, int limit = 0); native uint GetSkyboxPortal(Actor actor); native void ReplaceTextures(String from, String to, int flags); + native vector3, int PickDeathmatchStart(); + native vector3, int PickPlayerStart(int pnum, int flags = 0); native static clearscope bool IsPointInMap(vector3 p); diff --git a/wadsrc/static/zscript/hexen/teleportother.txt b/wadsrc/static/zscript/hexen/teleportother.txt index f7be0ebff..93608470e 100644 --- a/wadsrc/static/zscript/hexen/teleportother.txt +++ b/wadsrc/static/zscript/hexen/teleportother.txt @@ -157,12 +157,12 @@ class TelOtherFX1 : Actor // //=========================================================================== - private static void P_TeleportToPlayerStarts (Actor victim) + private void P_TeleportToPlayerStarts (Actor victim) { Vector3 dest; double destAngle; - [dest, destAngle] = G_PickPlayerStart(0, PPS_FORCERANDOM | PPS_NOBLOCKINGCHECK); + [dest, destAngle] = level.PickPlayerStart(0, PPS_FORCERANDOM | PPS_NOBLOCKINGCHECK); dest.Z = ONFLOORZ; victim.Teleport ((dest.xy, ONFLOORZ), destangle, TELF_SOURCEFOG | TELF_DESTFOG); } @@ -178,7 +178,7 @@ class TelOtherFX1 : Actor Vector3 dest; double destAngle; - [dest, destAngle] = G_PickDeathmatchStart(); + [dest, destAngle] = level.PickDeathmatchStart(); if (destAngle < 65536) victim.Teleport((dest.xy, ONFLOORZ), destangle, TELF_SOURCEFOG | TELF_DESTFOG); else P_TeleportToPlayerStarts(victim); } diff --git a/wadsrc/static/zscript/raven/artitele.txt b/wadsrc/static/zscript/raven/artitele.txt index 0e65fe051..0400193fe 100644 --- a/wadsrc/static/zscript/raven/artitele.txt +++ b/wadsrc/static/zscript/raven/artitele.txt @@ -30,11 +30,11 @@ class ArtiTeleport : Inventory if (deathmatch) { - [dest, destAngle] = G_PickDeathmatchStart(); + [dest, destAngle] = level.PickDeathmatchStart(); } else { - [dest, destAngle] = G_PickPlayerStart(Owner.PlayerNumber()); + [dest, destAngle] = level.PickPlayerStart(Owner.PlayerNumber()); } dest.Z = ONFLOORZ; Owner.Teleport (dest, destAngle, TELF_SOURCEFOG | TELF_DESTFOG); From 41e576bbb503505981fa7291979ecc3536b1eec4 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 28 Jan 2019 03:02:25 +0100 Subject: [PATCH 057/164] - removed the intermediate P_SpawnPlayer inline --- src/g_game.cpp | 6 +++--- src/g_level.cpp | 2 +- src/g_levellocals.h | 8 +------- src/p_mobj.cpp | 2 +- src/p_saveg.cpp | 2 +- src/p_setup.cpp | 2 +- 6 files changed, 8 insertions(+), 14 deletions(-) diff --git a/src/g_game.cpp b/src/g_game.cpp index 9cf44bf9c..b6c4cd4ad 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -1503,7 +1503,7 @@ void FLevelLocals::DeathMatchSpawnPlayer (int playernum) } } } - AActor *mo = P_SpawnPlayer(spot, playernum); + AActor *mo = SpawnPlayer(spot, playernum); if (mo != NULL) P_PlayerStartStomp(mo); } @@ -1649,13 +1649,13 @@ void FLevelLocals::DoReborn (int playernum, bool freshbot) playerstarts[playernum].type != 0 && CheckSpot (playernum, &playerstarts[playernum])) { - AActor *mo = P_SpawnPlayer(&playerstarts[playernum], playernum); + AActor *mo = SpawnPlayer(&playerstarts[playernum], playernum); if (mo != NULL) P_PlayerStartStomp(mo, true); } else { // try to spawn at any random player's spot FPlayerStart *start = PickPlayerStart(playernum, PPS_FORCERANDOM); - AActor *mo = P_SpawnPlayer(start, playernum); + AActor *mo = SpawnPlayer(start, playernum); if (mo != NULL) P_PlayerStartStomp(mo, true); } } diff --git a/src/g_level.cpp b/src/g_level.cpp index 37c1bbc22..5cc253a6d 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1379,7 +1379,7 @@ int G_FinishTravel () // The player being spawned here is a short lived dummy and // must not start any ENTER script or big problems will happen. - pawndup = P_SpawnPlayer(start, pnum, SPF_TEMPPLAYER); + pawndup = level.SpawnPlayer(start, pnum, SPF_TEMPPLAYER); if (pawndup != NULL) { if (!(changeflags & CHANGELEVEL_KEEPFACING)) diff --git a/src/g_levellocals.h b/src/g_levellocals.h index d28728986..5d1feaadf 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -207,7 +207,7 @@ public: int Massacre(bool baddies = false, FName cls = NAME_None); AActor *SpawnMapThing(FMapThing *mthing, int position); AActor *SpawnMapThing(int index, FMapThing *mt, int position); - AActor *SpawnPlayer(FPlayerStart *mthing, int playernum, int flags); + AActor *SpawnPlayer(FPlayerStart *mthing, int playernum, int flags = 0); void StartLightning(); void ForceLightning(int mode); void ClearDynamic3DFloorData(); @@ -641,12 +641,6 @@ inline bool line_t::hitSkyWall(AActor* mo) const mo->Z() >= backsector->ceilingplane.ZatPoint(mo->PosRelative(this)); } -// Work for later. -inline AActor *P_SpawnPlayer(FPlayerStart *mthing, int playernum, int flags = 0) -{ - return level.SpawnPlayer(mthing, playernum, flags); -} - // This must later be extended to return an array with all levels. // It is meant for code that needs to iterate over all levels to make some global changes, e.g. configuation CCMDs. inline TArrayView AllLevels() diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 52d371f3d..bbd7a4eaa 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -5338,7 +5338,7 @@ AActor *FLevelLocals::SpawnMapThing (FMapThing *mthing, int position) } if (!deathmatch && !(flags2 & LEVEL2_RANDOMPLAYERSTARTS)) { - return P_SpawnPlayer(&start, pnum, (flags2 & LEVEL2_PRERAISEWEAPON) ? SPF_WEAPONFULLYUP : 0); + return SpawnPlayer(&start, pnum, (flags2 & LEVEL2_PRERAISEWEAPON) ? SPF_WEAPONFULLYUP : 0); } return NULL; } diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 06fc8c613..a1d68b235 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -889,7 +889,7 @@ void FLevelLocals::SpawnExtraPlayers() if (playeringame[i] && players[i].mo == NULL) { players[i].playerstate = PST_ENTER; - P_SpawnPlayer(&playerstarts[i], i, (flags2 & LEVEL2_PRERAISEWEAPON) ? SPF_WEAPONFULLYUP : 0); + SpawnPlayer(&playerstarts[i], i, (flags2 & LEVEL2_PRERAISEWEAPON) ? SPF_WEAPONFULLYUP : 0); } } } diff --git a/src/p_setup.cpp b/src/p_setup.cpp index d557236ac..405892c35 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -458,7 +458,7 @@ void P_SetupLevel(FLevelLocals *Level, int position, bool newGame) { players[i].mo = nullptr; FPlayerStart *mthing = Level->PickPlayerStart(i); - P_SpawnPlayer(mthing, i, (Level->flags2 & LEVEL2_PRERAISEWEAPON) ? SPF_WEAPONFULLYUP : 0); + Level->SpawnPlayer(mthing, i, (Level->flags2 & LEVEL2_PRERAISEWEAPON) ? SPF_WEAPONFULLYUP : 0); } } } From d0942bcb972c0a8750b80042c970e9e02a2cb7e7 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 28 Jan 2019 14:06:19 +0100 Subject: [PATCH 058/164] - moved FirstThinker function to FLevelLocals Currently it is meaningless but that's where it should be later. --- src/dthinker.cpp | 6 +++--- src/dthinker.h | 1 - src/g_levellocals.h | 1 + src/g_shared/a_decals.cpp | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/dthinker.cpp b/src/dthinker.cpp index 959d9f3e9..c104e677a 100644 --- a/src/dthinker.cpp +++ b/src/dthinker.cpp @@ -328,7 +328,7 @@ void DThinker::PostSerialize() // //========================================================================== -DThinker *DThinker::FirstThinker (int statnum) +DThinker *FLevelLocals::FirstThinker (int statnum) { DThinker *node; @@ -336,10 +336,10 @@ DThinker *DThinker::FirstThinker (int statnum) { statnum = MAX_STATNUM; } - node = Thinkers[statnum].GetHead(); + node = DThinker::Thinkers[statnum].GetHead(); if (node == NULL) { - node = FreshThinkers[statnum].GetHead(); + node = DThinker::FreshThinkers[statnum].GetHead(); if (node == NULL) { return NULL; diff --git a/src/dthinker.h b/src/dthinker.h index c90c8b536..a48a2d113 100644 --- a/src/dthinker.h +++ b/src/dthinker.h @@ -90,7 +90,6 @@ public: static void SerializeThinkers(FSerializer &arc, bool keepPlayers); static void MarkRoots(); - static DThinker *FirstThinker (int statnum); private: static void DestroyThinkersInList (FThinkerList &list); static bool DoDestroyThinkersInList(FThinkerList &list); diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 5d1feaadf..de6ff2331 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -261,6 +261,7 @@ public: FSerializer &SerializeSubsectors(FSerializer &arc, const char *key); void SpawnExtraPlayers(); void Serialize(FSerializer &arc, bool hubload); + DThinker *FirstThinker (int statnum); // g_Game void PlayerReborn (int player); diff --git a/src/g_shared/a_decals.cpp b/src/g_shared/a_decals.cpp index 10fec6ce0..5546aef08 100644 --- a/src/g_shared/a_decals.cpp +++ b/src/g_shared/a_decals.cpp @@ -542,7 +542,7 @@ CUSTOM_CVAR (Int, cl_maxdecals, 1024, CVAR_ARCHIVE) { while (Level->ImpactDecalCount > self) { - DThinker *thinker = DThinker::FirstThinker(STAT_AUTODECAL); + DThinker *thinker = Level->FirstThinker(STAT_AUTODECAL); if (thinker != NULL) { thinker->Destroy(); @@ -555,7 +555,7 @@ void DImpactDecal::CheckMax () { if (++Level->ImpactDecalCount >= cl_maxdecals) { - DThinker *thinker = DThinker::FirstThinker (STAT_AUTODECAL); + DThinker *thinker = Level->FirstThinker (STAT_AUTODECAL); if (thinker != NULL) { thinker->Destroy(); From 1dc11c5032430292bb7a983d7f1d8f820ede2ed5 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 28 Jan 2019 14:31:23 +0100 Subject: [PATCH 059/164] - changed infighting check so that the static skill checker does not access the level Instead the level needs to be queried now. --- src/g_game.h | 2 -- src/g_level.cpp | 13 +++++++++++++ src/g_levellocals.h | 1 + src/g_skill.cpp | 3 --- src/p_interaction.cpp | 2 +- src/p_map.cpp | 2 +- 6 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/g_game.h b/src/g_game.h index 03658c106..b1b18d5c8 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -64,8 +64,6 @@ void G_PlayDemo (char* name); void G_TimeDemo (const char* name); bool G_CheckDemoStatus (void); -void G_WorldDone (void); - void G_Ticker (void); bool G_Responder (event_t* ev); diff --git a/src/g_level.cpp b/src/g_level.cpp index 5cc253a6d..c619ec76f 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -2052,6 +2052,19 @@ void FLevelLocals::SetMusicVolume(float f) I_SetMusicVolume(f); } +//============================================================================ +// +// +// +//============================================================================ + +int FLevelLocals::GetInfighting() +{ + if (flags2 & LEVEL2_TOTALINFIGHTING) return 1; + if (flags2 & LEVEL2_NOINFIGHTING) return -1; + return G_SkillProperty(SKILLP_Infight); +} + //========================================================================== // IsPointInMap // diff --git a/src/g_levellocals.h b/src/g_levellocals.h index de6ff2331..f95b38f5c 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -174,6 +174,7 @@ struct FLevelLocals : public FLevelData int GetConversation(FName classname); void SetConversation(int convid, PClassActor *Class, int dlgindex); int FindNode (const FStrifeDialogueNode *node); + int GetInfighting(); void Init(); private: diff --git a/src/g_skill.cpp b/src/g_skill.cpp index 287d862f7..897ffdc76 100644 --- a/src/g_skill.cpp +++ b/src/g_skill.cpp @@ -393,9 +393,6 @@ int G_SkillProperty(ESkillProperty prop) return AllSkills[gameskill].NoPain; case SKILLP_Infight: - // This property also needs to consider the level flags for the same info. - if (level.flags2 & LEVEL2_TOTALINFIGHTING) return 1; - if (level.flags2 & LEVEL2_NOINFIGHTING) return -1; if (AllSkills[gameskill].Infighting == LEVEL2_TOTALINFIGHTING) return 1; if (AllSkills[gameskill].Infighting == LEVEL2_NOINFIGHTING) return -1; return infighting; diff --git a/src/p_interaction.cpp b/src/p_interaction.cpp index a4916e5cf..dfaeebea8 100644 --- a/src/p_interaction.cpp +++ b/src/p_interaction.cpp @@ -1622,7 +1622,7 @@ bool AActor::OkayToSwitchTarget(AActor *other) int infight; if (flags7 & MF7_FORCEINFIGHTING) infight = 1; else if (flags5 & MF5_NOINFIGHTING) infight = -1; - else infight = G_SkillProperty(SKILLP_Infight); + else infight = Level->GetInfighting(); if (infight < 0 && other->player == NULL && !IsHostile (other)) { diff --git a/src/p_map.cpp b/src/p_map.cpp index 2166831c5..68275cf0b 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -1163,7 +1163,7 @@ static bool CanAttackHurt(AActor *victim, AActor *shooter) // to harm / be harmed by anything. if (!victim->player && !shooter->player) { - int infight = G_SkillProperty(SKILLP_Infight); + int infight = victim->Level->GetInfighting(); if (infight < 0 && (victim->flags7 & MF7_FORCEINFIGHTING)) infight = 0; // This must override the 'no infight' setting to take effect. if (infight < 0) From d1ca3ef99422c24fbc527029de1fff8109887e59 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 28 Jan 2019 15:20:02 +0100 Subject: [PATCH 060/164] - added braces as per XCode's suggestion. --- src/am_map.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/am_map.cpp b/src/am_map.cpp index 2a603be7b..d00b4fb75 100644 --- a/src/am_map.cpp +++ b/src/am_map.cpp @@ -809,9 +809,9 @@ static TArray CheatKey; static TArray EasyKey; static std::array thintriangle_guy = { { - {-.5,-.7, 1,0}, - {1,0, -.5,.7}, - {-.5,.7, -.5,-.7} + {{-.5,-.7}, {1,0}}, + {{1,0}, {-.5,.7}}, + {{-.5,.7}, {-.5,-.7}} } }; //============================================================================= From 44f622c64441495f34812f71df3b7175d9ba4162 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 28 Jan 2019 15:41:52 +0100 Subject: [PATCH 061/164] - more XCode warnings fixed. --- src/am_map.cpp | 10 ++++++---- src/g_level.cpp | 2 +- src/umapinfo.cpp | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/am_map.cpp b/src/am_map.cpp index d00b4fb75..93682dee1 100644 --- a/src/am_map.cpp +++ b/src/am_map.cpp @@ -2671,14 +2671,15 @@ void DAutomap::rotatePoint (double *x, double *y) void DAutomap::drawLineCharacter(const mline_t *lineguy, size_t lineguylines, double scale, DAngle angle, const AMColor &color, double x, double y) { - int i; mline_t l; - for (i=0;iBossActions[mape->BossActions.Reserve(1)]; - bossact = { type, special | 0x40000000, tag }; + bossact = { type, special | 0x40000000, {tag} }; }; } } From 3364988680802e8be9f3df96e753feb883191e04 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 28 Jan 2019 18:26:14 +0100 Subject: [PATCH 062/164] - moved the interpolator into FLevelLocals and refactored its use to happen outside the renderers. There is no need to do this deep inside the renderer where it required code duplication and made it problematic to execute on multiple levels. This is now being done before and after the top level call into the renderer in d_main.cpp. This also serializes the interpolator itself to avoid problems with the Serialize functions adding the interpolations into the list which can only work with a single global instance. --- src/d_main.cpp | 8 +++++++- src/dobjgc.cpp | 1 - src/g_level.cpp | 1 + src/g_levellocals.h | 2 ++ src/gl/renderer/gl_scene.cpp | 1 - src/p_saveg.cpp | 5 +++-- src/p_setup.cpp | 2 +- src/p_tick.cpp | 5 ++++- src/polyrenderer/poly_renderer.cpp | 1 - src/r_data/r_interpolate.cpp | 23 +++++++++++++++-------- src/r_data/r_interpolate.h | 15 +++------------ src/r_utility.cpp | 2 -- src/serializer.h | 2 ++ src/swrenderer/scene/r_scene.cpp | 1 - 14 files changed, 38 insertions(+), 31 deletions(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index 2853cceb3..65458d7a9 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -754,9 +754,15 @@ void D_Display () Level->HasDynamicLights = !!level.lights; } else Level->HasDynamicLights = false; // lights are off so effectively we have none. + Level->interpolator.DoInterpolations(I_GetTimeFrac()); } - viewsec = screen->RenderView(&players[consoleplayer]); + + for (auto Level : AllLevels()) + { + Level->interpolator.RestoreInterpolations(); + } + screen->Begin2D(); screen->DrawBlend(viewsec); if (automapactive) diff --git a/src/dobjgc.cpp b/src/dobjgc.cpp index 169baf32c..5f0a995c0 100644 --- a/src/dobjgc.cpp +++ b/src/dobjgc.cpp @@ -331,7 +331,6 @@ static void MarkRoot() SectorMarker->SecNum = 0; } Mark(SectorMarker); - Mark(interpolator.Head); // Mark bot stuff. Mark(bglobal.firstthing); Mark(bglobal.body1); diff --git a/src/g_level.cpp b/src/g_level.cpp index 581ff9b34..51367df8e 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1983,6 +1983,7 @@ void FLevelLocals::Mark() GC::Mark(FraggleScriptThinker); GC::Mark(ACSThinker); GC::Mark(automap); + GC::Mark(interpolator.Head); canvasTextureInfo.Mark(); for (auto &c : CorpseQueue) { diff --git a/src/g_levellocals.h b/src/g_levellocals.h index f95b38f5c..38d424868 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -50,6 +50,7 @@ #include "p_destructible.h" #include "r_data/r_sections.h" #include "r_data/r_canvastexture.h" +#include "r_data/r_interpolate.h" //============================================================================ // @@ -442,6 +443,7 @@ public: FString F1Pic; EMapType maptype; FTagManager tagManager; + FInterpolator interpolator; uint64_t ShaderStartTime = 0; // tell the shader system when we started the level (forces a timer restart) diff --git a/src/gl/renderer/gl_scene.cpp b/src/gl/renderer/gl_scene.cpp index 52c461288..8e6475c96 100644 --- a/src/gl/renderer/gl_scene.cpp +++ b/src/gl/renderer/gl_scene.cpp @@ -218,7 +218,6 @@ sector_t * FGLRenderer::RenderViewpoint (FRenderViewpoint &mainvp, AActor * came mBuffers->BlitToEyeTexture(eye_ix); } - interpolator.RestoreInterpolations (); return mainvp.sector; } diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index a1d68b235..593aacb38 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -962,9 +962,10 @@ void FLevelLocals::Serialize(FSerializer &arc, bool hubload) ("spotstate", SpotState) ("fragglethinker", FraggleScriptThinker) ("acsthinker", ACSThinker) - ("impactdecalcount", ImpactDecalCount) + ("impactdecalcount", ImpactDecalCount) ("scrolls", Scrolls) - ("automap", automap); + ("automap", automap) + ("interpolator", interpolator); // Hub transitions must keep the current total time diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 405892c35..bef044331 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -288,6 +288,7 @@ void FLevelLocals::ClearLevelData() } ClearPortals(); + interpolator.ClearInterpolations(); // [RH] Nothing to interpolate on a fresh level. tagManager.Clear(); ClearTIDHashes(); Behaviors.UnloadModules(); @@ -350,7 +351,6 @@ void P_FreeLevelData () R_FreePastViewers(); P_ClearUDMFKeys(); - interpolator.ClearInterpolations(); // [RH] Nothing to interpolate on a fresh level. SN_StopAllSequences (); DThinker::DestroyAllThinkers (); diff --git a/src/p_tick.cpp b/src/p_tick.cpp index 562184edb..1fc66dda2 100644 --- a/src/p_tick.cpp +++ b/src/p_tick.cpp @@ -75,7 +75,10 @@ void P_Ticker (void) { int i; - interpolator.UpdateInterpolations (); + for (auto Level : AllLevels()) + { + Level->interpolator.UpdateInterpolations(); + } r_NoInterpolate = true; if (!demoplayback) diff --git a/src/polyrenderer/poly_renderer.cpp b/src/polyrenderer/poly_renderer.cpp index 87642d831..338def63a 100644 --- a/src/polyrenderer/poly_renderer.cpp +++ b/src/polyrenderer/poly_renderer.cpp @@ -188,7 +188,6 @@ void PolyRenderer::RenderActorView(AActor *actor, bool dontmaplines) if (Viewpoint.camera) Viewpoint.camera->renderflags = savedflags; - interpolator.RestoreInterpolations (); NetUpdate(); } diff --git a/src/r_data/r_interpolate.cpp b/src/r_data/r_interpolate.cpp index 70cf09393..b3a8e08b2 100644 --- a/src/r_data/r_interpolate.cpp +++ b/src/r_data/r_interpolate.cpp @@ -39,6 +39,7 @@ #include "p_local.h" #include "po_man.h" #include "serializer.h" +#include "g_levellocals.h" //========================================================================== // @@ -312,6 +313,16 @@ void FInterpolator::ClearInterpolations() } } +FSerializer &Serialize(FSerializer &arc, const char *key, FInterpolator &rs, FInterpolator *def) +{ + if (arc.BeginObject(key)) + { + arc("head", rs.Head) + ("count", rs.count) + .EndObject(); + } + return arc; +} //========================================================================== // @@ -379,10 +390,6 @@ void DInterpolation::Serialize(FSerializer &arc) { Super::Serialize(arc); arc("refcount", refcount); - if (arc.isReading()) - { - interpolator.AddInterpolation(this); - } } //========================================================================== @@ -408,7 +415,7 @@ DSectorPlaneInterpolation::DSectorPlaneInterpolation(sector_t *_sector, bool _pl P_Start3dMidtexInterpolations(attached, sector, ceiling); P_StartLinkedSectorInterpolations(attached, sector, ceiling); } - interpolator.AddInterpolation(this); + sector->Level->interpolator.AddInterpolation(this); } //========================================================================== @@ -567,7 +574,7 @@ DSectorScrollInterpolation::DSectorScrollInterpolation(sector_t *_sector, bool _ sector = _sector; ceiling = _plane; UpdateInterpolation (); - interpolator.AddInterpolation(this); + sector->Level->interpolator.AddInterpolation(this); } //========================================================================== @@ -672,7 +679,7 @@ DWallScrollInterpolation::DWallScrollInterpolation(side_t *_side, int _part) side = _side; part = _part; UpdateInterpolation (); - interpolator.AddInterpolation(this); + side->GetLevel()->interpolator.AddInterpolation(this); } //========================================================================== @@ -770,7 +777,7 @@ DPolyobjInterpolation::DPolyobjInterpolation(FPolyObj *po) oldverts.Resize(po->Vertices.Size() << 1); bakverts.Resize(po->Vertices.Size() << 1); UpdateInterpolation (); - interpolator.AddInterpolation(this); + po->Level->interpolator.AddInterpolation(this); } //========================================================================== diff --git a/src/r_data/r_interpolate.h b/src/r_data/r_interpolate.h index dabfa3a1e..0696bf85f 100644 --- a/src/r_data/r_interpolate.h +++ b/src/r_data/r_interpolate.h @@ -43,19 +43,13 @@ public: struct FInterpolator { - TObjPtr Head; - bool didInterp; - int count; + TObjPtr Head = nullptr; + bool didInterp = false; + int count = 0; int CountInterpolations (); public: - FInterpolator() - { - Head = nullptr; - didInterp = false; - count = 0; - } void UpdateInterpolations(); void AddInterpolation(DInterpolation *); void RemoveInterpolation(DInterpolation *); @@ -64,9 +58,6 @@ public: void ClearInterpolations(); }; -extern FInterpolator interpolator; - - #endif diff --git a/src/r_utility.cpp b/src/r_utility.cpp index 9a6f675cb..89a631712 100644 --- a/src/r_utility.cpp +++ b/src/r_utility.cpp @@ -854,8 +854,6 @@ void R_SetupFrame (FRenderViewpoint &viewpoint, FViewWindow &viewwindow, AActor viewpoint.SetViewAngle (viewwindow); - interpolator.DoInterpolations (viewpoint.TicFrac); - // Keep the view within the sector's floor and ceiling if (viewpoint.sector->PortalBlocksMovement(sector_t::ceiling)) { diff --git a/src/serializer.h b/src/serializer.h index d7d2a1e1a..2957dbdc7 100644 --- a/src/serializer.h +++ b/src/serializer.h @@ -24,6 +24,7 @@ struct FDoorAnimation; class FSoundID; struct FPolyObj; union FRenderStyle; +struct FInterpolator; inline bool nullcmp(const void *buffer, size_t length) { @@ -202,6 +203,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, FString &sid, FString FSerializer &Serialize(FSerializer &arc, const char *key, NumericValue &sid, NumericValue *def); FSerializer &Serialize(FSerializer &arc, const char *key, ticcmd_t &sid, ticcmd_t *def); FSerializer &Serialize(FSerializer &arc, const char *key, usercmd_t &cmd, usercmd_t *def); +FSerializer &Serialize(FSerializer &arc, const char *key, FInterpolator &rs, FInterpolator *def); template FSerializer &Serialize(FSerializer &arc, const char *key, T *&value, T **) diff --git a/src/swrenderer/scene/r_scene.cpp b/src/swrenderer/scene/r_scene.cpp index 0678607a2..02bd00755 100644 --- a/src/swrenderer/scene/r_scene.cpp +++ b/src/swrenderer/scene/r_scene.cpp @@ -189,7 +189,6 @@ namespace swrenderer RenderPSprites(); MainThread()->Viewport->viewpoint.camera->renderflags = savedflags; - interpolator.RestoreInterpolations(); } void RenderScene::RenderPSprites() From 3c14a7db76d9fc82e37919f05904f9dd5370f568 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 28 Jan 2019 18:42:56 +0100 Subject: [PATCH 063/164] - use map time, not hub time for map actions. --- src/bbannouncer.cpp | 4 ++-- src/p_tick.cpp | 2 +- wadsrc/static/zscript/base.txt | 12 +++++----- wadsrc/static/zscript/heretic/ironlich.txt | 4 ++-- wadsrc/static/zscript/hexen/clericholy.txt | 4 ++-- wadsrc/static/zscript/hexen/korax.txt | 2 +- wadsrc/static/zscript/hexen/magelightning.txt | 4 ++-- wadsrc/static/zscript/inventory/powerups.txt | 22 ++++++++--------- wadsrc/static/zscript/shared/movingcamera.txt | 4 ++-- wadsrc/static/zscript/shared/player.txt | 24 +++++++++---------- .../static/zscript/strife/strifefunctions.txt | 2 +- 11 files changed, 42 insertions(+), 42 deletions(-) diff --git a/src/bbannouncer.cpp b/src/bbannouncer.cpp index 80de8b979..7c7d0e12a 100644 --- a/src/bbannouncer.cpp +++ b/src/bbannouncer.cpp @@ -182,9 +182,9 @@ static FRandom pr_bbannounce ("BBAnnounce"); void DoVoiceAnnounce (const char *sound) { // Don't play announcements too close together - if (LastAnnounceTime == 0 || LastAnnounceTime <= level.time-5) + if (LastAnnounceTime == 0 || LastAnnounceTime <= currentUILevel->time-5) { - LastAnnounceTime = level.time; + LastAnnounceTime = currentUILevel->time; S_Sound (CHAN_VOICE, sound, 1, ATTN_NONE); } } diff --git a/src/p_tick.cpp b/src/p_tick.cpp index 1fc66dda2..79fdf2621 100644 --- a/src/p_tick.cpp +++ b/src/p_tick.cpp @@ -95,7 +95,7 @@ void P_Ticker (void) DPSprite::NewTick(); // [RH] Frozen mode is only changed every 4 tics, to make it work with A_Tracer(). - if ((level.time & 3) == 0) + if ((level.maptime & 3) == 0) { if (bglobal.changefreeze) { diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index de621398c..c9cee74a8 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -635,9 +635,9 @@ struct LevelLocals native native readonly Array<@Vertex> Vertexes; native internal Array<@SectorPortal> SectorPortals; - native readonly int time; + deprecated("3.8") native readonly int time; native readonly int maptime; - native readonly int totaltime; + deprecated("3.8") native readonly int totaltime; native readonly int starttime; native readonly int partime; native readonly int sucktime; @@ -648,10 +648,10 @@ struct LevelLocals native native readonly String MapName; native String NextMap; native String NextSecretMap; - native String F1Pic; + deprecated("3.8") native readonly String F1Pic; native readonly int maptype; - native readonly String Music; - native readonly int musicorder; + deprecated("3.8") native readonly String Music; + deprecated("3.8") native readonly int musicorder; native readonly TextureID skytexture1; native readonly TextureID skytexture2; native float skyspeed1; @@ -696,7 +696,7 @@ struct LevelLocals native native int ExecuteSpecial(int special, Actor activator, line linedef, bool lineside, int arg1 = 0, int arg2 = 0, int arg3 = 0, int arg4 = 0, int arg5 = 0); native static void GiveSecret(Actor activator, bool printmsg = true, bool playsound = true); native static void StartSlideshow(Name whichone = 'none'); - native static void WorldDone(); + native void WorldDone(); native static void RemoveAllBots(bool fromlist); native ui Vector2 GetAutomapPosition(); native void SetInterMusic(String nextmap); diff --git a/wadsrc/static/zscript/heretic/ironlich.txt b/wadsrc/static/zscript/heretic/ironlich.txt index 052e9119e..a27facce8 100644 --- a/wadsrc/static/zscript/heretic/ironlich.txt +++ b/wadsrc/static/zscript/heretic/ironlich.txt @@ -310,7 +310,7 @@ class Whirlwind : Actor target.Vel.Y += Random2[WhirlwindDamage]() / 64.; } - if ((level.time & 16) && !target.bBoss && !target.bDontThrust) + if ((Level.maptime & 16) && !target.bBoss && !target.bDontThrust) { randVal = min(160, random[WhirlwindSeek]()); target.Vel.Z += randVal / 32.; @@ -319,7 +319,7 @@ class Whirlwind : Actor target.Vel.Z = 12; } } - if (!(level.time & 7)) + if (!(Level.maptime & 7)) { target.DamageMobj (null, target, 3, 'Melee'); } diff --git a/wadsrc/static/zscript/hexen/clericholy.txt b/wadsrc/static/zscript/hexen/clericholy.txt index f58194ab9..b6561795d 100644 --- a/wadsrc/static/zscript/hexen/clericholy.txt +++ b/wadsrc/static/zscript/hexen/clericholy.txt @@ -461,7 +461,7 @@ class HolySpirit : Actor } VelFromAngle(); - if (!(level.time&15) + if (!(Level.maptime&15) || pos.z > target.pos.z + target.height || pos.z + height < target.pos.z) { @@ -503,7 +503,7 @@ class HolySpirit : Actor if (tracer) { CHolySeekerMissile (args[0], args[0]*2.); - if (!((level.time+7)&15)) + if (!((Level.maptime+7)&15)) { args[0] = 5+(random[HolySeeker]()/20); } diff --git a/wadsrc/static/zscript/hexen/korax.txt b/wadsrc/static/zscript/hexen/korax.txt index 6141b9b27..e19ff0457 100644 --- a/wadsrc/static/zscript/hexen/korax.txt +++ b/wadsrc/static/zscript/hexen/korax.txt @@ -430,7 +430,7 @@ class KoraxSpirit : Actor } VelFromAngle(); - if (!(level.time&15) + if (!(Level.maptime&15) || pos.z > target.pos.z + target.Default.Height || pos.z + height < target.pos.z) { diff --git a/wadsrc/static/zscript/hexen/magelightning.txt b/wadsrc/static/zscript/hexen/magelightning.txt index a4b23706b..5ece4fd80 100644 --- a/wadsrc/static/zscript/hexen/magelightning.txt +++ b/wadsrc/static/zscript/hexen/magelightning.txt @@ -121,7 +121,7 @@ class Lightning : Actor thing.Vel.X += Vel.X / 16; thing.Vel.Y += Vel.Y / 16; } - if ((!thing.player && !thing.bBoss) || !(level.time&1)) + if ((!thing.player && !thing.bBoss) || !(Level.maptime & 1)) { thing.DamageMobj(self, target, 3, 'Electric'); A_PlaySound(AttackSound, CHAN_WEAPON|CHAN_NOSTOP, 1, false); @@ -411,7 +411,7 @@ class LightningZap : Actor { lmo.tracer = thing; } - if (!(level.time&3)) + if (!(Level.maptime&3)) { lmo.health--; } diff --git a/wadsrc/static/zscript/inventory/powerups.txt b/wadsrc/static/zscript/inventory/powerups.txt index ab256380e..8327307d0 100644 --- a/wadsrc/static/zscript/inventory/powerups.txt +++ b/wadsrc/static/zscript/inventory/powerups.txt @@ -364,7 +364,7 @@ class PowerInvulnerable : Powerup // Don't mess with the translucency settings if an // invisibility powerup is active. let alpha = Owner.Alpha; - if (!(level.time & 7) && alpha > 0 && alpha < 1) + if (!(Level.maptime & 7) && alpha > 0 && alpha < 1) { if (alpha == HX_SHADOW) { @@ -376,7 +376,7 @@ class PowerInvulnerable : Powerup Owner.bNonShootable = true; } } - if (!(level.time & 31)) + if (!(Level.maptime & 31)) { if (alpha == 0) { @@ -806,7 +806,7 @@ class PowerMask : PowerIronFeet override void DoEffect () { Super.DoEffect (); - if (!(level.time & 0x3f)) + if (!(Level.maptime & 0x3f)) { Owner.A_PlaySound ("misc/mask", CHAN_AUTO); } @@ -894,7 +894,7 @@ class PowerTorch : PowerLightAmp { Powerup.DoEffect (); - if (!(level.time & 16) && Owner.player != NULL) + if (!(Level.maptime & 16) && Owner.player != NULL) { if (NewTorch != 0) { @@ -1014,7 +1014,7 @@ class PowerFlight : Powerup } TextureID picnum = TexMan.CheckForTexture ("SPFLY0", TexMan.Type_MiscPatch); - int frame = (level.time/3) & 15; + int frame = (Level.maptime/3) & 15; if (!picnum.isValid()) { @@ -1191,7 +1191,7 @@ class PowerSpeed : Powerup if (NoTrail) return; - if (level.time & 1) + if (Level.maptime & 1) return; // Check if another speed item is present to avoid multiple drawing of the speed trail. @@ -1529,7 +1529,7 @@ class PowerTimeFreezer : Powerup EffectTics++; } // Make sure the effect starts and ends on an even tic. - if ((level.time & 1) == 0) + if ((Level.maptime & 1) == 0) { level.frozen = true;; } @@ -1553,14 +1553,14 @@ class PowerTimeFreezer : Powerup // [RH] Do not change LEVEL_FROZEN on odd tics, or the Revenant's tracer // will get thrown off. // [ED850] Don't change it if the player is predicted either. - if (level.time & 1 || (Owner != null && Owner.player != null && Owner.player.cheats & CF_PREDICTING)) + if (Level.maptime & 1 || (Owner != null && Owner.player != null && Owner.player.cheats & CF_PREDICTING)) { return; } // [RH] The "blinking" can't check against EffectTics exactly or it will // never happen, because InitEffect ensures that EffectTics will always - // be odd when level.time is even. - level.frozen = ( EffectTics > 4*32 + // be odd when Level.maptime is even. + Level.frozen = ( EffectTics > 4*32 || (( EffectTics > 3*32 && EffectTics <= 4*32 ) && ((EffectTics + 1) & 15) != 0 ) || (( EffectTics > 2*32 && EffectTics <= 3*32 ) && ((EffectTics + 1) & 7) != 0 ) || (( EffectTics > 32 && EffectTics <= 2*32 ) && ((EffectTics + 1) & 3) != 0 ) @@ -1791,7 +1791,7 @@ class PowerRegeneration : Powerup override void DoEffect() { Super.DoEffect(); - if (Owner != null && Owner.health > 0 && (level.time & 31) == 0) + if (Owner != null && Owner.health > 0 && (Level.maptime & 31) == 0) { if (Owner.GiveBody(int(Strength))) { diff --git a/wadsrc/static/zscript/shared/movingcamera.txt b/wadsrc/static/zscript/shared/movingcamera.txt index 8fb092ddb..3a254a615 100644 --- a/wadsrc/static/zscript/shared/movingcamera.txt +++ b/wadsrc/static/zscript/shared/movingcamera.txt @@ -267,12 +267,12 @@ class PathFollower : Actor bJustStepped = false; if (CurrNode.args[2]) { - HoldTime = level.time + CurrNode.args[2] * TICRATE / 8; + HoldTime = Level.maptime + CurrNode.args[2] * TICRATE / 8; SetXYZ(CurrNode.Pos); } } - if (HoldTime > level.time) + if (HoldTime > Level.maptime) return; // Splines must have a previous node. diff --git a/wadsrc/static/zscript/shared/player.txt b/wadsrc/static/zscript/shared/player.txt index 5b5ffe06f..67a5592bf 100644 --- a/wadsrc/static/zscript/shared/player.txt +++ b/wadsrc/static/zscript/shared/player.txt @@ -585,7 +585,7 @@ class PlayerPawn : Actor { if (player.health > 0) { - angle = level.time / (120 * TICRATE / 35.) * 360.; + angle = Level.maptime / (120 * TICRATE / 35.) * 360.; bob = player.GetStillBob() * sin(angle); } else @@ -595,7 +595,7 @@ class PlayerPawn : Actor } else { - angle = level.time / (20 * TICRATE / 35.) * 360.; + angle = Level.maptime / (20 * TICRATE / 35.) * 360.; bob = player.bob * sin(angle) * (waterlevel > 1 ? 0.25f : 0.5f); } @@ -734,7 +734,7 @@ class PlayerPawn : Actor if ((player.cmd.buttons & BT_USE || ((multiplayer || alwaysapplydmflags) && sv_forcerespawn)) && !sv_norespawn) { - if (level.time >= player.respawn_time || ((player.cmd.buttons & BT_USE) && player.Bot == NULL)) + if (Level.maptime >= player.respawn_time || ((player.cmd.buttons & BT_USE) && player.Bot == NULL)) { player.cls = NULL; // Force a new class if the player is using a random class player.playerstate = (multiplayer || level.AllowRespawn || sv_singleplayerrespawn || G_SkillPropertyInt(SKILLP_PlayerRespawn)) ? PST_REBORN : PST_ENTER; @@ -1518,7 +1518,7 @@ class PlayerPawn : Actor virtual void CheckPoison() { let player = self.player; - if (player.poisoncount && !(level.time & 15)) + if (player.poisoncount && !(Level.maptime & 15)) { player.poisoncount -= 5; if (player.poisoncount < 0) @@ -1542,7 +1542,7 @@ class PlayerPawn : Actor { let player = self.player; int maxhealth = GetMaxHealth(true); - if ((level.time % TICRATE) == 0 && player.health > maxhealth) + if ((Level.maptime % TICRATE) == 0 && player.health > maxhealth) { if (player.health - 5 < maxhealth) player.health = maxhealth; @@ -1570,9 +1570,9 @@ class PlayerPawn : Actor { ResetAirSupply(); } - else if (player.air_finished <= level.time && !(level.time & 31)) + else if (player.air_finished <= Level.maptime && !(Level.maptime & 31)) { - DamageMobj(NULL, NULL, 2 + ((level.time - player.air_finished) / TICRATE), 'Drowning'); + DamageMobj(NULL, NULL, 2 + ((Level.maptime - player.air_finished) / TICRATE), 'Drowning'); } } } @@ -1647,7 +1647,7 @@ class PlayerPawn : Actor if (player.hazardcount) { player.hazardcount--; - if (!(level.time % player.hazardinterval) && player.hazardcount > 16*TICRATE) + if (!(Level.maptime % player.hazardinterval) && player.hazardcount > 16*TICRATE) player.mo.DamageMobj (NULL, NULL, 5, player.hazardtype); } player.mo.CheckPoison(); @@ -1898,7 +1898,7 @@ class PlayerPawn : Actor // This problem is only detectable when it's too late to do something about it... ThrowAbortException("Cannot give morph item '%s' when starting a game!", di.Name); } - } + } let weap = Weapon(item); if (weap != NULL && weap.CheckAmmo(Weapon.EitherFire, false)) { @@ -2334,7 +2334,7 @@ class PlayerPawn : Actor for (int i = 0; i < 2; i++) { // Bob the weapon based on movement speed. ([SP] And user's bob speed setting) - double angle = (BobSpeed * player.GetWBobSpeed() * 35 / TICRATE*(level.time - 1 + i)) * (360. / 8192.); + double angle = (BobSpeed * player.GetWBobSpeed() * 35 / TICRATE*(Level.maptime - 1 + i)) * (360. / 8192.); // [RH] Smooth transitions between bobbing and not-bobbing frames. // This also fixes the bug where you can "stick" a weapon off-center by @@ -2432,13 +2432,13 @@ class PlayerPawn : Actor virtual bool ResetAirSupply (bool playgasp = true) { let player = self.player; - bool wasdrowning = (player.air_finished < level.time); + bool wasdrowning = (player.air_finished < Level.maptime); if (playgasp && wasdrowning) { A_PlaySound("*gasp", CHAN_VOICE); } - if (level.airsupply > 0 && AirCapacity > 0) player.air_finished = level.time + int(level.airsupply * AirCapacity); + if (Level.airsupply > 0 && AirCapacity > 0) player.air_finished = Level.maptime + int(Level.airsupply * AirCapacity); else player.air_finished = int.max; return wasdrowning; } diff --git a/wadsrc/static/zscript/strife/strifefunctions.txt b/wadsrc/static/zscript/strife/strifefunctions.txt index 0757cd16d..d22b506c2 100644 --- a/wadsrc/static/zscript/strife/strifefunctions.txt +++ b/wadsrc/static/zscript/strife/strifefunctions.txt @@ -7,7 +7,7 @@ extend class Actor void A_FLoopActiveSound() { - if (ActiveSound != 0 && !(level.time & 7)) + if (ActiveSound != 0 && !(Level.maptime & 7)) { A_PlaySound (ActiveSound, CHAN_VOICE); } From 37217719346b67c5ab91f8e8f6b49bef8237cd21 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 28 Jan 2019 18:44:42 +0100 Subject: [PATCH 064/164] - forgot to save this. --- wadsrc/static/zscript/doom/revenant.txt | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/wadsrc/static/zscript/doom/revenant.txt b/wadsrc/static/zscript/doom/revenant.txt index 91363edb8..6fddcdb16 100644 --- a/wadsrc/static/zscript/doom/revenant.txt +++ b/wadsrc/static/zscript/doom/revenant.txt @@ -225,13 +225,8 @@ extend class Actor // killough 1/18/98: this is why some missiles do not have smoke // and some do. Also, internal demos start at random gametics, thus // the bug in which revenants cause internal demos to go out of sync. - // - // killough 3/6/98: fix revenant internal demo bug by subtracting - // levelstarttic from gametic: - // - // [RH] level.time is always 0-based, so nothing special to do here. - if (level.time & 3) return; + if (level.maptime & 3) return; // spawn a puff of smoke behind the rocket SpawnPuff ("BulletPuff", pos, angle, angle, 3); From 259ae4177470e6150fe5a17b095083e87a56201f Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 28 Jan 2019 20:15:48 +0100 Subject: [PATCH 065/164] - sanitized the 'frozen level' code. This had two different flags that were checked totally inconsistently, and one was not even saved. Moved everything into a few subfunctions so that these checks do not have to be scattered all over the code. --- src/actor.h | 1 + src/actorinlines.h | 28 +++++++++++++++-- src/b_bot.cpp | 3 +- src/b_bot.h | 2 +- src/b_game.cpp | 4 +-- src/decallib.cpp | 8 ++--- src/g_game.cpp | 2 +- src/g_levellocals.h | 6 ++++ src/hwrenderer/scene/hw_sprites.cpp | 2 +- src/p_effect.cpp | 2 +- src/p_mobj.cpp | 30 +++++-------------- src/p_saveg.cpp | 4 ++- src/p_tick.cpp | 8 ++--- src/p_user.cpp | 8 ++++- src/polyrenderer/scene/poly_particle.cpp | 2 +- src/r_data/models/models.cpp | 2 +- src/scripting/vmthunks.cpp | 26 ++++++++++++++++ src/scripting/vmthunks_actors.cpp | 12 ++++++++ src/swrenderer/things/r_particle.cpp | 2 +- wadsrc/static/zscript/actor.txt | 1 + wadsrc/static/zscript/base.txt | 16 +++++----- wadsrc/static/zscript/inventory/powerups.txt | 6 ++-- .../static/zscript/shared/fastprojectile.txt | 10 ++----- wadsrc/static/zscript/shared/player.txt | 2 +- .../zscript/shared/player_inventory.txt | 2 +- 25 files changed, 124 insertions(+), 65 deletions(-) diff --git a/src/actor.h b/src/actor.h index afed3a51f..9d7651d33 100644 --- a/src/actor.h +++ b/src/actor.h @@ -1425,6 +1425,7 @@ public: void DeleteAttachedLights(); static void DeleteAllAttachedLights(); static void RecreateAllAttachedLights(); + bool isFrozen(); bool hasmodel; }; diff --git a/src/actorinlines.h b/src/actorinlines.h index abc17e1b3..3e4f7684b 100644 --- a/src/actorinlines.h +++ b/src/actorinlines.h @@ -107,7 +107,7 @@ inline DVector3 AActor::Vec2OffsetZ(double dx, double dy, double atz, bool absol { return{ X() + dx, Y() + dy, atz }; } - else + else { DVector2 v = Level->GetPortalOffsetPosition(X(), Y(), dx, dy); return DVector3(v, atz); @@ -133,7 +133,7 @@ inline DVector3 AActor::Vec3Offset(double dx, double dy, double dz, bool absolut return { X() + dx, Y() + dy, Z() + dz }; } else - { + { DVector2 v = Level->GetPortalOffsetPosition(X(), Y(), dx, dy); return DVector3(v, Z() + dz); } @@ -151,8 +151,30 @@ inline DVector3 AActor::Vec3Angle(double length, DAngle angle, double dz, bool a return{ X() + length * angle.Cos(), Y() + length * angle.Sin(), Z() + dz }; } else - { + { DVector2 v = Level->GetPortalOffsetPosition(X(), Y(), length*angle.Cos(), length*angle.Sin()); return DVector3(v, Z() + dz); } } + +inline bool AActor::isFrozen() +{ + if (!(flags5 & MF5_NOTIMEFREEZE)) + { + auto state = Level->isFrozen(); + if (state) + { + if (player == nullptr || player->Bot != nullptr) return true; + + // This is the only place in the entire game where the two freeze flags need different treatment. + // The time freezer flag also freezes other players, the global setting does not. + + if ((state & 1) && player->timefreezer == 0) + { + return true; + } + } + } + return false; +} + diff --git a/src/b_bot.cpp b/src/b_bot.cpp index 9ff12a8ab..2ca43dca6 100644 --- a/src/b_bot.cpp +++ b/src/b_bot.cpp @@ -49,6 +49,7 @@ #include "d_player.h" #include "w_wad.h" #include "vm.h" +#include "g_levellocals.h" IMPLEMENT_CLASS(DBot, false, true) @@ -137,7 +138,7 @@ void DBot::Tick () { Super::Tick (); - if (player->mo == nullptr || bglobal.freeze) + if (player->mo == nullptr || Level->isFrozen()) { return; } diff --git a/src/b_bot.h b/src/b_bot.h index 71b8252f8..a24f07a46 100644 --- a/src/b_bot.h +++ b/src/b_bot.h @@ -116,7 +116,7 @@ public: void ClearPlayer (int playernum, bool keepTeam); //(b_game.cpp) - void Main (); + void Main (FLevelLocals *Level); void Init (); void End(); bool SpawnBot (const char *name, int color = NOCOLOR); diff --git a/src/b_game.cpp b/src/b_game.cpp index 69f273174..58f78424d 100644 --- a/src/b_game.cpp +++ b/src/b_game.cpp @@ -129,7 +129,7 @@ FCajunMaster::~FCajunMaster() } //This function is called every tick (from g_game.c). -void FCajunMaster::Main () +void FCajunMaster::Main(FLevelLocals *Level) { BotThinkCycles.Reset(); @@ -137,7 +137,7 @@ void FCajunMaster::Main () return; //Add new bots? - if (wanted_botnum > botnum && !freeze) + if (wanted_botnum > botnum && !Level->isFrozen()) { if (t_join == ((wanted_botnum - botnum) * SPAWN_DELAY)) { diff --git a/src/decallib.cpp b/src/decallib.cpp index db423eae6..18c1c7cfd 100644 --- a/src/decallib.cpp +++ b/src/decallib.cpp @@ -1184,7 +1184,7 @@ void DDecalFader::Tick () } else { - if (Level->maptime < TimeToStartDecay || bglobal.freeze) + if (Level->maptime < TimeToStartDecay || Level->isFrozen()) { return; } @@ -1271,7 +1271,7 @@ void DDecalStretcher::Tick () Destroy (); return; } - if (Level->maptime < TimeToStart || bglobal.freeze) + if (Level->maptime < TimeToStart || Level->isFrozen()) { return; } @@ -1339,7 +1339,7 @@ void DDecalSlider::Tick () Destroy (); return; } - if (Level->maptime < TimeToStart || bglobal.freeze) + if (Level->maptime < TimeToStart || Level->isFrozen()) { return; } @@ -1407,7 +1407,7 @@ void DDecalColorer::Tick () } else { - if (Level->maptime < TimeToStartDecay || bglobal.freeze) + if (Level->maptime < TimeToStartDecay || Level->isFrozen()) { return; } diff --git a/src/g_game.cpp b/src/g_game.cpp index b6c4cd4ad..677ba8a30 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -1112,7 +1112,7 @@ void G_Ticker () uint32_t rngsum = FRandom::StaticSumSeeds (); //Added by MC: For some of that bot stuff. The main bot function. - bglobal.Main (); + bglobal.Main (&level); for (i = 0; i < MAXPLAYERS; i++) { diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 38d424868..143743e78 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -369,6 +369,11 @@ public: return it.Next(); } + int isFrozen() + { + return frozenstate; + } + sector_t *PointInSector(const DVector2 &pos) { return P_PointInSector(pos); @@ -497,6 +502,7 @@ public: bool FromSnapshot; // The current map was restored from a snapshot bool HasHeightSecs; // true if some Transfer_Heights effects are present in the map. If this is false, some checks in the renderer can be shortcut. bool HasDynamicLights; // Another render optimization for maps with no lights at all. + uint8_t frozenstate; double teamdamage; diff --git a/src/hwrenderer/scene/hw_sprites.cpp b/src/hwrenderer/scene/hw_sprites.cpp index 49ced7dfe..eb0874e7b 100644 --- a/src/hwrenderer/scene/hw_sprites.cpp +++ b/src/hwrenderer/scene/hw_sprites.cpp @@ -1198,7 +1198,7 @@ void GLSprite::ProcessParticle (HWDrawInfo *di, particle_t *particle, sector_t * const auto &vp = di->Viewpoint; double timefrac = vp.TicFrac; - if (paused || bglobal.freeze || (di->Level->flags2 & LEVEL2_FROZEN)) + if (paused || di->Level->isFrozen()) timefrac = 0.; float xvf = (particle->Vel.X) * timefrac; float yvf = (particle->Vel.Y) * timefrac; diff --git a/src/p_effect.cpp b/src/p_effect.cpp index c9e7d70d4..1fd04ebc3 100644 --- a/src/p_effect.cpp +++ b/src/p_effect.cpp @@ -243,7 +243,7 @@ void P_ThinkParticles () { particle = &Particles[i]; i = particle->tnext; - if (!particle->notimefreeze && ((bglobal.freeze) || (level.flags2 & LEVEL2_FROZEN))) + if (!particle->notimefreeze && level.isFrozen()) { prev = particle; continue; diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index bbd7a4eaa..9ec9a6339 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -3505,18 +3505,15 @@ void AActor::Tick () // apply velocity // ensure that the actor is not linked into the blockmap - if (!(flags5 & MF5_NOTIMEFREEZE)) + //Added by MC: Freeze mode. + if (isFrozen()) { - //Added by MC: Freeze mode. - if (bglobal.freeze || Level->flags2 & LEVEL2_FROZEN) + // Boss cubes shouldn't be accelerated by timefreeze + if (flags6 & MF6_BOSSCUBE) { - // Boss cubes shouldn't be accelerated by timefreeze - if (flags6 & MF6_BOSSCUBE) - { - special2++; - } - return; + special2++; } + return; } if (!Vel.isZero() || !(flags & MF_NOBLOCKMAP)) @@ -3555,27 +3552,16 @@ void AActor::Tick () return; } - if (!(flags5 & MF5_NOTIMEFREEZE)) + if (isFrozen()) { // Boss cubes shouldn't be accelerated by timefreeze if (flags6 & MF6_BOSSCUBE) { special2++; } - //Added by MC: Freeze mode. - if (bglobal.freeze && !(player && player->Bot == NULL)) - { - return; - } - - // Apply freeze mode. - if ((Level->flags2 & LEVEL2_FROZEN) && (player == NULL || player->timefreezer == 0)) - { - return; - } + return; } - if (effects & FX_ROCKET) { if (++smokecounter == 4) diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 593aacb38..ceac468e9 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -965,7 +965,8 @@ void FLevelLocals::Serialize(FSerializer &arc, bool hubload) ("impactdecalcount", ImpactDecalCount) ("scrolls", Scrolls) ("automap", automap) - ("interpolator", interpolator); + ("interpolator", interpolator) + ("frozenstate", frozenstate); // Hub transitions must keep the current total time @@ -978,6 +979,7 @@ void FLevelLocals::Serialize(FSerializer &arc, bool hubload) sky2texture = skytexture2; R_InitSkyMap(); AirControlChanged(); + bglobal.freeze = !!(frozenstate & 2); } Behaviors.SerializeModuleStates(arc); diff --git a/src/p_tick.cpp b/src/p_tick.cpp index 79fdf2621..65655b82b 100644 --- a/src/p_tick.cpp +++ b/src/p_tick.cpp @@ -99,6 +99,7 @@ void P_Ticker (void) { if (bglobal.changefreeze) { + level.frozenstate ^= 2; bglobal.freeze ^= 1; bglobal.changefreeze = 0; } @@ -134,8 +135,7 @@ void P_Ticker (void) P_ThinkParticles(); // [RH] make the particles think for (i = 0; imo->Level->isFrozen() && player->Bot != nullptr) + { + return; + } + if (debugfile && !(player->cheats & CF_PREDICTING)) { fprintf (debugfile, "tic %d for pl %d: (%f, %f, %f, %f) b:%02x p:%d y:%d f:%d s:%d u:%d\n", @@ -1682,7 +1688,7 @@ bool P_IsPlayerTotallyFrozen(const player_t *player) return gamestate == GS_TITLELEVEL || player->cheats & CF_TOTALLYFROZEN || - ((player->mo->Level->flags2 & LEVEL2_FROZEN) && player->timefreezer == 0); + player->mo->isFrozen(); } diff --git a/src/polyrenderer/scene/poly_particle.cpp b/src/polyrenderer/scene/poly_particle.cpp index d7db9be84..002daac52 100644 --- a/src/polyrenderer/scene/poly_particle.cpp +++ b/src/polyrenderer/scene/poly_particle.cpp @@ -35,7 +35,7 @@ EXTERN_CVAR(Int, gl_particles_style) void RenderPolyParticle::Render(PolyRenderThread *thread, particle_t *particle, subsector_t *sub, uint32_t stencilValue) { double timefrac = r_viewpoint.TicFrac; - if (paused || bglobal.freeze || (PolyRenderer::Instance()->Level->flags2 & LEVEL2_FROZEN)) + if (paused || r_viewpoint.ViewLevel->isFrozen()) timefrac = 0.; DVector3 pos = particle->Pos + (particle->Vel * timefrac); double psize = particle->size / 8.0; diff --git a/src/r_data/models/models.cpp b/src/r_data/models/models.cpp index f75594b05..ac260f8ff 100644 --- a/src/r_data/models/models.cpp +++ b/src/r_data/models/models.cpp @@ -229,7 +229,7 @@ void FModelRenderer::RenderFrameModels(const FSpriteModelFrame *smf, const FStat // [BB] To interpolate at more than 35 fps we take tic fractions into account. float ticFraction = 0.; // [BB] In case the tic counter is frozen we have to leave ticFraction at zero. - if (ConsoleState == c_up && menuactive != MENU_On && !(level.flags2 & LEVEL2_FROZEN)) + if (ConsoleState == c_up && menuactive != MENU_On && !level.isFrozen()) { ticFraction = I_GetTimeFrac(); } diff --git a/src/scripting/vmthunks.cpp b/src/scripting/vmthunks.cpp index ee7f3a89d..bb3a8918e 100644 --- a/src/scripting/vmthunks.cpp +++ b/src/scripting/vmthunks.cpp @@ -2682,7 +2682,32 @@ DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, Vec3Offset, Vec3Offset) ACTION_RETURN_VEC3(result); } +static int isFrozen(FLevelLocals *self) +{ + return self->isFrozen(); +} +DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, isFrozen, isFrozen) +{ + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); + return isFrozen(self); +} + +void setFrozen(FLevelLocals *self, int on) +{ + self->frozenstate = (self->frozenstate & ~1) | !!on; + // For compatibility. The engine itself never checks this. + if (on) self->flags2 |= LEVEL2_FROZEN; + else self->flags2 &= ~LEVEL2_FROZEN; +} + +DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, setFrozen, setFrozen) +{ + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); + PARAM_BOOL(on); + setFrozen(self, on); + return 0; +} //===================================================================================== // @@ -2764,6 +2789,7 @@ DEFINE_FIELD(FLevelLocals, outsidefogdensity) DEFINE_FIELD(FLevelLocals, skyfog) DEFINE_FIELD(FLevelLocals, pixelstretch) DEFINE_FIELD(FLevelLocals, deathsequence) + DEFINE_FIELD_BIT(FLevelLocals, flags, noinventorybar, LEVEL_NOINVENTORYBAR) DEFINE_FIELD_BIT(FLevelLocals, flags, monsterstelefrag, LEVEL_MONSTERSTELEFRAG) DEFINE_FIELD_BIT(FLevelLocals, flags, actownspecial, LEVEL_ACTOWNSPECIAL) diff --git a/src/scripting/vmthunks_actors.cpp b/src/scripting/vmthunks_actors.cpp index dd833e744..68cf3560c 100644 --- a/src/scripting/vmthunks_actors.cpp +++ b/src/scripting/vmthunks_actors.cpp @@ -1654,6 +1654,18 @@ DEFINE_ACTION_FUNCTION_NATIVE(AActor, CheckFor3DCeilingHit, CheckFor3DCeilingHit +static int isFrozen(AActor *self) +{ + return self->isFrozen(); +} + +DEFINE_ACTION_FUNCTION_NATIVE(AActor, isFrozen, isFrozen) +{ + PARAM_SELF_PROLOGUE(AActor); + ACTION_RETURN_BOOL(isFrozen(self)); +} + + //=========================================================================== // // PlayerPawn functions diff --git a/src/swrenderer/things/r_particle.cpp b/src/swrenderer/things/r_particle.cpp index ed961da96..43d680c06 100644 --- a/src/swrenderer/things/r_particle.cpp +++ b/src/swrenderer/things/r_particle.cpp @@ -79,7 +79,7 @@ namespace swrenderer sector_t* heightsec = NULL; double timefrac = r_viewpoint.TicFrac; - if (paused || bglobal.freeze || (sector->Level->flags2 & LEVEL2_FROZEN)) + if (paused || r_viewpoint.ViewLevel->isFrozen()) timefrac = 0.; double ippx = particle->Pos.X + particle->Vel.X * timefrac; diff --git a/wadsrc/static/zscript/actor.txt b/wadsrc/static/zscript/actor.txt index a4be48651..acc2229b3 100644 --- a/wadsrc/static/zscript/actor.txt +++ b/wadsrc/static/zscript/actor.txt @@ -448,6 +448,7 @@ class Actor : Thinker native return sin(fb * (180./32)) * 8; } + native bool isFrozen(); virtual native void BeginPlay(); virtual native void Activate(Actor activator); virtual native void Deactivate(Actor activator); diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index c9cee74a8..f0f81d5b6 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -20,7 +20,6 @@ struct _ native // These are the global variables, the struct is only here to av native play uint gameaction; native readonly int gamestate; native readonly TextureID skyflatnum; - native readonly uint8 globalfreeze; native readonly int consoleplayer; native readonly Font smallfont; native readonly Font smallfont2; @@ -46,6 +45,7 @@ struct _ native // These are the global variables, the struct is only here to av native readonly Weapon WP_NOCHANGE; native int LocalViewPitch; native ui readonly LevelLocals currentUILevel; + deprecated("3.8") native readonly bool globalfreeze; } @@ -635,9 +635,9 @@ struct LevelLocals native native readonly Array<@Vertex> Vertexes; native internal Array<@SectorPortal> SectorPortals; - deprecated("3.8") native readonly int time; + native readonly int time; native readonly int maptime; - deprecated("3.8") native readonly int totaltime; + native readonly int totaltime; native readonly int starttime; native readonly int partime; native readonly int sucktime; @@ -648,10 +648,10 @@ struct LevelLocals native native readonly String MapName; native String NextMap; native String NextSecretMap; - deprecated("3.8") native readonly String F1Pic; + native readonly String F1Pic; native readonly int maptype; - deprecated("3.8") native readonly String Music; - deprecated("3.8") native readonly int musicorder; + native readonly String Music; + native readonly int musicorder; native readonly TextureID skytexture1; native readonly TextureID skytexture2; native float skyspeed1; @@ -678,7 +678,7 @@ struct LevelLocals native native readonly bool polygrind; native readonly bool nomonsters; native readonly bool allowrespawn; - native bool frozen; + deprecated("3.8") native bool frozen; native readonly bool infinite_flight; native readonly bool no_dlg_freeze; native readonly bool keepfullinventory; @@ -711,6 +711,8 @@ struct LevelLocals native native void ReplaceTextures(String from, String to, int flags); native vector3, int PickDeathmatchStart(); native vector3, int PickPlayerStart(int pnum, int flags = 0); + native int isFrozen(); + native void setFrozen(bool on); native static clearscope bool IsPointInMap(vector3 p); diff --git a/wadsrc/static/zscript/inventory/powerups.txt b/wadsrc/static/zscript/inventory/powerups.txt index 8327307d0..8cebd0ae0 100644 --- a/wadsrc/static/zscript/inventory/powerups.txt +++ b/wadsrc/static/zscript/inventory/powerups.txt @@ -1531,7 +1531,7 @@ class PowerTimeFreezer : Powerup // Make sure the effect starts and ends on an even tic. if ((Level.maptime & 1) == 0) { - level.frozen = true;; + Level.SetFrozen(true); } else { @@ -1560,7 +1560,7 @@ class PowerTimeFreezer : Powerup // [RH] The "blinking" can't check against EffectTics exactly or it will // never happen, because InitEffect ensures that EffectTics will always // be odd when Level.maptime is even. - Level.frozen = ( EffectTics > 4*32 + Level.SetFrozen ( EffectTics > 4*32 || (( EffectTics > 3*32 && EffectTics <= 4*32 ) && ((EffectTics + 1) & 15) != 0 ) || (( EffectTics > 2*32 && EffectTics <= 3*32 ) && ((EffectTics + 1) & 7) != 0 ) || (( EffectTics > 32 && EffectTics <= 2*32 ) && ((EffectTics + 1) & 3) != 0 ) @@ -1598,7 +1598,7 @@ class PowerTimeFreezer : Powerup } // No, so allow other actors to move about freely once again. - level.frozen = false; + Level.SetFrozen(false); // Also, turn the music back on. S_ResumeSound(false); diff --git a/wadsrc/static/zscript/shared/fastprojectile.txt b/wadsrc/static/zscript/shared/fastprojectile.txt index 9a3a18ad0..da0c003e1 100644 --- a/wadsrc/static/zscript/shared/fastprojectile.txt +++ b/wadsrc/static/zscript/shared/fastprojectile.txt @@ -50,14 +50,8 @@ class FastProjectile : Actor ClearInterpolation(); double oldz = pos.Z; - if (!bNoTimeFreeze) - { - //Added by MC: Freeze mode. - if (globalfreeze || level.Frozen) - { - return; - } - } + if (isFrozen()) + return; // [RH] Ripping is a little different than it was in Hexen FCheckPosition tm; diff --git a/wadsrc/static/zscript/shared/player.txt b/wadsrc/static/zscript/shared/player.txt index 67a5592bf..0394fbcbd 100644 --- a/wadsrc/static/zscript/shared/player.txt +++ b/wadsrc/static/zscript/shared/player.txt @@ -2765,7 +2765,7 @@ struct PlayerInfo native play // self is what internally is known as player_t return gamestate == GS_TITLELEVEL || (cheats & CF_TOTALLYFROZEN) || - (mo && mo.Level.frozen && timefreezer == 0); + mo.isFrozen(); } void Uncrouch() diff --git a/wadsrc/static/zscript/shared/player_inventory.txt b/wadsrc/static/zscript/shared/player_inventory.txt index bd01a59a8..ca622707c 100644 --- a/wadsrc/static/zscript/shared/player_inventory.txt +++ b/wadsrc/static/zscript/shared/player_inventory.txt @@ -210,7 +210,7 @@ extend class PlayerPawn { // You can't use items if you're totally frozen return false; } - if ((level.FROZEN) && (player == NULL || player.timefreezer == 0)) + if (isFrozen()) { // Time frozen return false; From 6312c442347c1d380bdb100606cff344e5ca288c Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 28 Jan 2019 22:04:33 +0100 Subject: [PATCH 066/164] - removed the remaining level references from p_acs.cpp. --- src/g_levellocals.h | 115 +++++++++++++++++++++----------------------- src/p_acs.cpp | 54 +++++++++++++-------- src/p_acs.h | 5 +- 3 files changed, 93 insertions(+), 81 deletions(-) diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 143743e78..31b7bf433 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -93,68 +93,9 @@ class DAutomapBase; typedef TMap FDialogueIDMap; // maps dialogue IDs to dialogue array index (for ACS) typedef TMap FDialogueMap; // maps actor class names to dialogue array index -struct FLevelData +struct FLevelLocals { - TArray vertexes; - TArray sectors; - TArray linebuffer; // contains the line lists for the sectors. - TArray subsectorbuffer; // contains the subsector lists for the sectors. - TArray lines; - TArray sides; - TArray segbuffer; // contains the seg links for the sidedefs. - TArray segs; - TArray subsectors; - TArray nodes; - TArray gamesubsectors; - TArray gamenodes; - node_t *headgamenode; - TArray rejectmatrix; - TArray Zones; - TArray Polyobjects; - - TArray sectorPortals; - TArray linePortals; - - // Portal information. - FDisplacementTable Displacements; - FPortalBlockmap PortalBlockmap; - TArray linkedPortals; // only the linked portals, this is used to speed up looking for them in P_CollectConnectedGroups. - TArray portalGroups; - TArray linePortalSpans; - FSectionContainer sections; - FCanvasTextureInfo canvasTextureInfo; - - // [ZZ] Destructible geometry information - TMap healthGroups; - - FBlockmap blockmap; - TArray PolyBlockMap; - - // These are copies of the loaded map data that get used by the savegame code to skip unaltered fields - // Without such a mechanism the savegame format would become too slow and large because more than 80-90% are normally still unaltered. - TArray loadsectors; - TArray loadlines; - TArray loadsides; - - // Maintain single and multi player starting spots. - TArray deathmatchstarts; - FPlayerStart playerstarts[MAXPLAYERS]; - TArray AllPlayerStarts; - - FBehaviorContainer Behaviors; - AActor *TIDHash[128]; - - TArray StrifeDialogues; - FDialogueIDMap DialogueRoots; - FDialogueMap ClassRoots; - - -}; - - -struct FLevelLocals : public FLevelData -{ - FLevelLocals() : tagManager(this) {} + FLevelLocals() : tagManager(this), Behaviors(this) {} friend class MapLoader; @@ -426,6 +367,58 @@ public: S_ChangeMusic(Music, musicorder); } + TArray vertexes; + TArray sectors; + TArray linebuffer; // contains the line lists for the sectors. + TArray subsectorbuffer; // contains the subsector lists for the sectors. + TArray lines; + TArray sides; + TArray segbuffer; // contains the seg links for the sidedefs. + TArray segs; + TArray subsectors; + TArray nodes; + TArray gamesubsectors; + TArray gamenodes; + node_t *headgamenode; + TArray rejectmatrix; + TArray Zones; + TArray Polyobjects; + + TArray sectorPortals; + TArray linePortals; + + // Portal information. + FDisplacementTable Displacements; + FPortalBlockmap PortalBlockmap; + TArray linkedPortals; // only the linked portals, this is used to speed up looking for them in P_CollectConnectedGroups. + TArray portalGroups; + TArray linePortalSpans; + FSectionContainer sections; + FCanvasTextureInfo canvasTextureInfo; + + // [ZZ] Destructible geometry information + TMap healthGroups; + + FBlockmap blockmap; + TArray PolyBlockMap; + + // These are copies of the loaded map data that get used by the savegame code to skip unaltered fields + // Without such a mechanism the savegame format would become too slow and large because more than 80-90% are normally still unaltered. + TArray loadsectors; + TArray loadlines; + TArray loadsides; + + // Maintain single and multi player starting spots. + TArray deathmatchstarts; + FPlayerStart playerstarts[MAXPLAYERS]; + TArray AllPlayerStarts; + + FBehaviorContainer Behaviors; + AActor *TIDHash[128]; + + TArray StrifeDialogues; + FDialogueIDMap DialogueRoots; + FDialogueMap ClassRoots; uint8_t md5[16]; // for savegame validation. If the MD5 does not match the savegame won't be loaded. int time; // time in the hub diff --git a/src/p_acs.cpp b/src/p_acs.cpp index c2dd9a3c9..6d2e62082 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -1447,7 +1447,10 @@ void P_CollectACSGlobalStrings() GlobalACSStrings.MarkStringArray(&stack->buffer[0], sp); } } - level.Behaviors.MarkLevelVarStrings(); + for(auto Level : AllLevels()) + { + Level->Behaviors.MarkLevelVarStrings(); + } P_MarkWorldVarStrings(); P_MarkGlobalVarStrings(); GlobalACSStrings.PurgeStrings(); @@ -1951,7 +1954,7 @@ FBehavior *FBehaviorContainer::LoadModule (int lumpnum, FileReader *fr, int len) } FBehavior * behavior = new FBehavior (); - if (behavior->Init(lumpnum, fr, len)) + if (behavior->Init(Level, lumpnum, fr, len)) { return behavior; } @@ -2001,9 +2004,9 @@ void FBehaviorContainer::MarkLevelVarStrings() StaticModules[modnum]->MarkMapVarStrings(); } // Mark running scripts' local variables. - if (level.ACSThinker != nullptr) + if (Level->ACSThinker != nullptr) { - for (DLevelScript *script = level.ACSThinker->Scripts; script != NULL; script = script->GetNext()) + for (DLevelScript *script = Level->ACSThinker->Scripts; script != NULL; script = script->GetNext()) { script->MarkLocalVarStrings(); } @@ -2018,9 +2021,9 @@ void FBehaviorContainer::LockLevelVarStrings(int levelnum) StaticModules[modnum]->LockMapVarStrings(levelnum); } // Lock running scripts' local variables. - if (level.ACSThinker != nullptr) + if (Level->ACSThinker != nullptr) { - for (DLevelScript *script = level.ACSThinker->Scripts; script != NULL; script = script->GetNext()) + for (DLevelScript *script = Level->ACSThinker->Scripts; script != NULL; script = script->GetNext()) { script->LockLocalVarStrings(levelnum); } @@ -2205,7 +2208,7 @@ FBehavior::FBehavior() } -bool FBehavior::Init(int lumpnum, FileReader * fr, int len) +bool FBehavior::Init(FLevelLocals *Level, int lumpnum, FileReader * fr, int len) { uint8_t *object; int i; @@ -2267,7 +2270,7 @@ bool FBehavior::Init(int lumpnum, FileReader * fr, int len) delete[] object; return false; } - LibraryID = level.Behaviors.StaticModules.Push (this) << LIBRARYID_SHIFT; + LibraryID = Level->Behaviors.StaticModules.Push (this) << LIBRARYID_SHIFT; if (fr == NULL) { @@ -2556,7 +2559,7 @@ bool FBehavior::Init(int lumpnum, FileReader * fr, int len) } else { - module = level.Behaviors.LoadModule (lump); + module = Level->Behaviors.LoadModule (lump); } if (module != NULL) Imports.Push (module); do {;} while (parse[++i]); @@ -3285,7 +3288,7 @@ void FBehavior::StartTypedScripts (uint16_t type, AActor *activator, bool always void FBehaviorContainer::StopMyScripts (AActor *actor) { - DACSThinker *controller = level.ACSThinker; + DACSThinker *controller = actor->Level->ACSThinker; if (controller != NULL) { @@ -10440,13 +10443,17 @@ FSerializer &Serialize(FSerializer &arc, const char *key, acsdefered_t &defer, a CCMD (scriptstat) { - if (level.ACSThinker == NULL) + for (auto Level : AllLevels()) { - Printf ("No scripts are running.\n"); - } - else - { - level.ACSThinker->DumpScriptStatus (); + Printf("Script status for %s", Level->MapName.GetChars()); + if (Level->ACSThinker == nullptr) + { + Printf("No scripts are running.\n"); + } + else + { + Level->ACSThinker->DumpScriptStatus(); + } } } @@ -10659,7 +10666,7 @@ static void ShowProfileData(TArray &profiles, long ilimit, } } -CCMD(acsprofile) +void ACSProfile(FLevelLocals *Level, FCommandLine &argv) { static int (*sort_funcs[])(const void*, const void *) = { @@ -10678,8 +10685,9 @@ CCMD(acsprofile) assert(countof(sort_names) == countof(sort_match_len)); - level.Behaviors.ArrangeScriptProfiles(ScriptProfiles); - level.Behaviors.ArrangeFunctionProfiles(FuncProfiles); + Printf("ACS profile for %s\n", Level->MapName.GetChars()); + Level->Behaviors.ArrangeScriptProfiles(ScriptProfiles); + Level->Behaviors.ArrangeFunctionProfiles(FuncProfiles); if (argv.argc() > 1) { @@ -10730,6 +10738,14 @@ CCMD(acsprofile) ShowProfileData(FuncProfiles, limit, sorter, true); } +CCMD(acsprofile) +{ + for (auto Level : AllLevels()) + { + ACSProfile(Level, argv); + } +} + ADD_STAT(ACS) { return FStringf("ACS time: %f ms", ACSTime.TimeMS()); diff --git a/src/p_acs.h b/src/p_acs.h index 5f106fbb1..7eea0c22a 100644 --- a/src/p_acs.h +++ b/src/p_acs.h @@ -349,7 +349,7 @@ class FBehavior public: FBehavior (); ~FBehavior (); - bool Init(int lumpnum, FileReader * fr = NULL, int len = 0); + bool Init(FLevelLocals *l, int lumpnum, FileReader * fr = NULL, int len = 0); bool IsGood (); uint8_t *FindChunk (uint32_t id) const; @@ -425,8 +425,11 @@ private: struct FBehaviorContainer { + FLevelLocals *Level; TArray StaticModules; + FBehaviorContainer(FLevelLocals *l) : Level(l) {} + FBehavior *LoadModule(int lumpnum, FileReader *fr = nullptr, int len = 0); void LoadDefaultModules(); void UnloadModules(); From befacddab438e8428f17f34626e5fcfd724f5fa7 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 28 Jan 2019 22:19:09 +0100 Subject: [PATCH 067/164] - removed level references in p_trace.cpp. Also added a null check to the sector pointer of the LineTracer Trace function because a null pointer here would crash. --- src/p_trace.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/p_trace.cpp b/src/p_trace.cpp index b4a33ade9..cdeb967f8 100644 --- a/src/p_trace.cpp +++ b/src/p_trace.cpp @@ -50,6 +50,7 @@ struct FTraceInfo { + FLevelLocals *Level; DVector3 Start; DVector3 Vec; ActorFlags ActorMask; @@ -158,6 +159,7 @@ bool Trace(const DVector3 &start, sector_t *sector, const DVector3 &direction, d memset(&tempResult, 0, sizeof(tempResult)); tempResult.Fraction = tempResult.Distance = NO_VALUE; + inf.Level = sector->Level; inf.Start = start; GetPortalTransition(inf.Start, sector); inf.ptflags = actorMask ? PT_ADDLINES|PT_ADDTHINGS|PT_COMPATIBLE : PT_ADDLINES; @@ -452,7 +454,7 @@ bool FTraceInfo::LineCheck(intercept_t *in, double dist, DVector3 hit, bool spec // hit crossed a water plane if (CheckSectorPlane(hsec, true)) { - Results->CrossedWater = &level.sectors[CurSector->sectornum]; + Results->CrossedWater = &Level->sectors[CurSector->sectornum]; Results->CrossedWaterPos = Results->HitPos; Results->Distance = 0; } @@ -583,7 +585,7 @@ cont: if (Results->HitType != TRACE_HitNone) { // We hit something, so figure out where exactly - Results->Sector = &level.sectors[CurSector->sectornum]; + Results->Sector = &Level->sectors[CurSector->sectornum]; if (Results->HitType != TRACE_HitWall && !CheckSectorPlane(CurSector, Results->HitType == TRACE_HitFloor)) @@ -720,7 +722,7 @@ bool FTraceInfo::ThingCheck(intercept_t *in, double dist, DVector3 hit) // the trace hit a 3D floor before the thing. // Calculate an intersection and abort. - Results->Sector = &level.sectors[CurSector->sectornum]; + Results->Sector = &Level->sectors[CurSector->sectornum]; if (!CheckSectorPlane(CurSector, Results->HitType == TRACE_HitFloor)) { Results->HitType = TRACE_HitNone; @@ -872,7 +874,7 @@ bool FTraceInfo::TraceTraverse (int ptflags) } // check for intersection with floor/ceiling - Results->Sector = &level.sectors[CurSector->sectornum]; + Results->Sector = &Level->sectors[CurSector->sectornum]; if (Results->CrossedWater == NULL && CurSector->heightsec != NULL && @@ -886,7 +888,7 @@ bool FTraceInfo::TraceTraverse (int ptflags) if (CheckSectorPlane(CurSector->heightsec, true)) { - Results->CrossedWater = &level.sectors[CurSector->sectornum]; + Results->CrossedWater = &Level->sectors[CurSector->sectornum]; Results->CrossedWaterPos = Results->HitPos; Results->Distance = 0; } @@ -1020,7 +1022,7 @@ DEFINE_ACTION_FUNCTION(DLineTracer, Trace) PARAM_FLOAT(start_x); PARAM_FLOAT(start_y); PARAM_FLOAT(start_z); - PARAM_POINTER(sector, sector_t); + PARAM_POINTER_NOT_NULL(sector, sector_t); PARAM_FLOAT(direction_x); PARAM_FLOAT(direction_y); PARAM_FLOAT(direction_z); From 623330f938ad0733bd5f7f9eda8572f5bac8898c Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 28 Jan 2019 22:33:50 +0100 Subject: [PATCH 068/164] - initial adjustments for P_Ticker. --- src/p_tick.cpp | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/src/p_tick.cpp b/src/p_tick.cpp index 65655b82b..97e8af6a0 100644 --- a/src/p_tick.cpp +++ b/src/p_tick.cpp @@ -62,7 +62,8 @@ bool P_CheckTickerPaused () && players[consoleplayer].viewz != NO_VALUE && wipegamestate == gamestate) { - S_PauseSound (!(level.flags2 & LEVEL2_PAUSE_MUSIC_IN_MENUS), false); + // Only the current UI level's settings are relevant for sound. + S_PauseSound (!(currentUILevel->flags2 & LEVEL2_PAUSE_MUSIC_IN_MENUS), false); return true; } return false; @@ -95,11 +96,15 @@ void P_Ticker (void) DPSprite::NewTick(); // [RH] Frozen mode is only changed every 4 tics, to make it work with A_Tracer(). - if ((level.maptime & 3) == 0) + // This may not be perfect but it is not really relevant for sublevels that tracer homing behavior is preserved. + if ((currentUILevel->maptime & 3) == 0) { if (bglobal.changefreeze) { - level.frozenstate ^= 2; + for (auto Level : AllLevels()) + { + Level->frozenstate ^= 2; + } bglobal.freeze ^= 1; bglobal.changefreeze = 0; } @@ -120,13 +125,16 @@ void P_Ticker (void) P_ResetSightCounters (false); R_ClearInterpolationPath(); - // Reset all actor interpolations for all actors before the current thinking turn so that indirect actor movement gets properly interpolated. - TThinkerIterator it; - AActor *ac; - - while ((ac = it.Next())) + // Reset all actor interpolations on all levels before the current thinking turn so that indirect actor movement gets properly interpolated. + for (auto Level : AllLevels()) { - ac->ClearInterpolation(); + auto it = Level->GetThinkerIterator(); + AActor *ac; + + while ((ac = it.Next())) + { + ac->ClearInterpolation(); + } } // Since things will be moving, it's okay to interpolate them in the renderer. From 50d59e99cb36bb130a70a62aff6ff1e1625f341b Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 28 Jan 2019 23:53:40 +0100 Subject: [PATCH 069/164] - moved sound sequence head of list into FLevelLocals. --- src/dobjgc.cpp | 2 -- src/g_level.cpp | 2 ++ src/g_levellocals.h | 4 +++ src/p_saveg.cpp | 7 +++-- src/p_setup.cpp | 9 +++--- src/s_sndseq.cpp | 71 +++++++++++++++++++++------------------------ src/s_sndseq.h | 18 +++++------- src/s_sound.cpp | 11 +++++-- src/wi_stuff.cpp | 5 +++- 9 files changed, 67 insertions(+), 62 deletions(-) diff --git a/src/dobjgc.cpp b/src/dobjgc.cpp index 5f0a995c0..f86cdb1d3 100644 --- a/src/dobjgc.cpp +++ b/src/dobjgc.cpp @@ -315,8 +315,6 @@ static void MarkRoot() if (playeringame[i]) players[i].PropagateMark(); } - // Mark sound sequences. - DSeqNode::StaticMarkHead(); // Mark sectors. if (SectorMarker == nullptr && level.sectors.Size() > 0) { diff --git a/src/g_level.cpp b/src/g_level.cpp index 51367df8e..a80b8d6ae 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1984,6 +1984,8 @@ void FLevelLocals::Mark() GC::Mark(ACSThinker); GC::Mark(automap); GC::Mark(interpolator.Head); + GC::Mark(SequenceListHead); + canvasTextureInfo.Mark(); for (auto &c : CorpseQueue) { diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 31b7bf433..ca14ee839 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -87,6 +87,7 @@ struct FPortalBits class DACSThinker; class DFraggleThinker; class DSpotState; +class DSeqNode; struct FStrifeDialogueNode; class DAutomapBase; @@ -487,6 +488,9 @@ public: int airsupply; int DefaultEnvironment; // Default sound environment. + int ActiveSequences; + DSeqNode *SequenceListHead; + TArray Scrolls; // NULL if no DScrollers in this level int8_t WallVertLight; // Light diffs for vert/horiz walls diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index ceac468e9..fd6f7138b 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -528,7 +528,6 @@ FSerializer &Serialize(FSerializer &arc, const char *key, zone_t &z, zone_t *def void P_SerializeSounds(FLevelLocals *Level, FSerializer &arc) { S_SerializeSounds(arc); - DSeqNode::SerializeSequences (arc); const char *name = NULL; uint8_t order; float musvol = Level->MusicVolume; @@ -931,6 +930,7 @@ void FLevelLocals::Serialize(FSerializer &arc, bool hubload) DThinker::DestroyAllThinkers(); interpolator.ClearInterpolations(); arc.ReadObjects(hubload); + ActiveSequences = 0; } arc("multiplayer", multiplayer); @@ -966,7 +966,8 @@ void FLevelLocals::Serialize(FSerializer &arc, bool hubload) ("scrolls", Scrolls) ("automap", automap) ("interpolator", interpolator) - ("frozenstate", frozenstate); + ("frozenstate", frozenstate) + ("sndseqlisthead", SequenceListHead); // Hub transitions must keep the current total time @@ -1022,7 +1023,7 @@ void FLevelLocals::Serialize(FSerializer &arc, bool hubload) FWeaponSlots::SetupWeaponSlots(players[i].mo); } } - AActor::RecreateAllAttachedLights(); + AActor::RecreateAllAttachedLights(); InitPortalGroups(this); automap->UpdateShowAllLines(); diff --git a/src/p_setup.cpp b/src/p_setup.cpp index bef044331..7b482b0ad 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -267,6 +267,8 @@ void FLevelLocals::ClearLevelData() killed_monsters = found_items = found_secrets = wminfo.maxfrags = 0; + SN_StopAllSequences(this); + FStrifeDialogueNode *node; while (StrifeDialogues.Pop (node)) @@ -351,7 +353,6 @@ void P_FreeLevelData () R_FreePastViewers(); P_ClearUDMFKeys(); - SN_StopAllSequences (); DThinker::DestroyAllThinkers (); level.ClearLevelData(); @@ -611,13 +612,13 @@ CCMD(dumpgeometry) if (seg->linedef) { 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->Index(), seg->linedef->Index(), seg->sidedef != seg->linedef->sidedef[0]); + seg->v1->fX(), seg->v1->fY(), seg->v2->fX(), seg->v2->fY(), + seg->Index(), seg->linedef->Index(), seg->sidedef != seg->linedef->sidedef[0]); } else { Printf(PRINT_LOG, " (%4.4f, %4.4f), (%4.4f, %4.4f) - seg %d, miniseg", - seg->v1->fX(), seg->v1->fY(), seg->v2->fX(), seg->v2->fY(), seg->Index()); + seg->v1->fX(), seg->v1->fY(), seg->v2->fX(), seg->v2->fY(), seg->Index()); } if (seg->PartnerSeg) { diff --git a/src/s_sndseq.cpp b/src/s_sndseq.cpp index d08a26732..3d5b347e1 100644 --- a/src/s_sndseq.cpp +++ b/src/s_sndseq.cpp @@ -219,8 +219,6 @@ static bool TwiddleSeqNum (int &sequence, seqtype_t type); // PUBLIC DATA DEFINITIONS ------------------------------------------------- FSoundSequencePtrArray Sequences; -int ActiveSequences; -DSeqNode *DSeqNode::SequenceListHead; // PRIVATE DATA DEFINITIONS ------------------------------------------------ @@ -289,11 +287,6 @@ static FRandom pr_sndseq ("SndSeq"); // CODE -------------------------------------------------------------------- -void DSeqNode::SerializeSequences (FSerializer &arc) -{ - arc("sndseqlisthead", SequenceListHead); -} - IMPLEMENT_CLASS(DSeqNode, false, true) IMPLEMENT_POINTERS_START(DSeqNode) @@ -345,7 +338,8 @@ void DSeqNode::Serialize(FSerializer &arc) ("parentseqnode", m_ParentSeqNode) ("id", id) ("seqname", seqName) - ("numchoices", numchoices); + ("numchoices", numchoices) + ("level", Level); // The way this is saved makes it hard to encapsulate so just do it the hard way... if (arc.isWriting()) @@ -397,9 +391,9 @@ void DSeqNode::OnDestroy() m_ParentSeqNode->m_ChildSeqNode = nullptr; m_ParentSeqNode = nullptr; } - if (SequenceListHead == this) + if (Level->SequenceListHead == this) { - SequenceListHead = m_Next; + Level->SequenceListHead = m_Next; GC::WriteBarrier(m_Next); } if (m_Prev) @@ -412,7 +406,7 @@ void DSeqNode::OnDestroy() m_Next->m_Prev = m_Prev; GC::WriteBarrier(m_Next, m_Prev); } - ActiveSequences--; + Level->ActiveSequences--; Super::OnDestroy(); } @@ -803,21 +797,22 @@ static void AddSequence (int curseq, FName seqname, FName slot, int stopsound, c Sequences[curseq]->Script[ScriptTemp.Size()] = MakeCommand(SS_CMD_END, 0); } -DSeqNode::DSeqNode (int sequence, int modenum) +DSeqNode::DSeqNode (FLevelLocals *l, int sequence, int modenum) : m_ModeNum(modenum), m_SequenceChoices(0) { + Level = l; ActivateSequence (sequence); - if (!SequenceListHead) + if (!Level->SequenceListHead) { - SequenceListHead = this; - m_Next = m_Prev = NULL; + Level->SequenceListHead = this; + m_Next = m_Prev = nullptr; } else { - SequenceListHead->m_Prev = this; GC::WriteBarrier(SequenceListHead->m_Prev, this); - m_Next = SequenceListHead; GC::WriteBarrier(this, SequenceListHead); - SequenceListHead = this; - m_Prev = NULL; + Level->SequenceListHead->m_Prev = this; GC::WriteBarrier(Level->SequenceListHead->m_Prev, this); + m_Next = Level->SequenceListHead; GC::WriteBarrier(this, Level->SequenceListHead); + Level->SequenceListHead = this; + m_Prev = nullptr; } GC::WriteBarrier(this); m_ParentSeqNode = m_ChildSeqNode = nullptr; @@ -832,24 +827,23 @@ void DSeqNode::ActivateSequence (int sequence) m_CurrentSoundID = 0; m_Volume = 1; // Start at max volume... m_Atten = ATTN_IDLE; // ...and idle attenuation - - ActiveSequences++; + Level->ActiveSequences++; } DSeqActorNode::DSeqActorNode (AActor *actor, int sequence, int modenum) - : DSeqNode (sequence, modenum), + : DSeqNode (actor->Level, sequence, modenum), m_Actor (actor) { } DSeqPolyNode::DSeqPolyNode (FPolyObj *poly, int sequence, int modenum) - : DSeqNode (sequence, modenum), + : DSeqNode (poly->Level, sequence, modenum), m_Poly (poly) { } DSeqSectorNode::DSeqSectorNode (sector_t *sec, int chan, int sequence, int modenum) - : DSeqNode (sequence, modenum), + : DSeqNode (sec->Level, sequence, modenum), Channel (chan), m_Sector (sec) { @@ -1048,7 +1042,8 @@ static int FindSequence (FName seqname) DSeqNode *SN_CheckSequence(sector_t *sector, int chan) { - for (DSeqNode *node = DSeqNode::FirstSequence(); node; ) + auto Level = sector->Level; + for (DSeqNode *node = Level->SequenceListHead; node; ) { DSeqNode *next = node->NextSequence(); if (node->Source() == sector) @@ -1079,7 +1074,7 @@ DEFINE_ACTION_FUNCTION(_Sector, CheckSoundSequence) void SN_StopSequence (AActor *actor) { - SN_DoStop (actor); + SN_DoStop (actor->Level, actor); } DEFINE_ACTION_FUNCTION(AActor, StopSoundSequence) @@ -1109,14 +1104,14 @@ DEFINE_ACTION_FUNCTION(_Sector, StopSoundSequence) void SN_StopSequence (FPolyObj *poly) { - SN_DoStop (poly); + SN_DoStop (poly->Level, poly); } -void SN_DoStop (void *source) +void SN_DoStop (FLevelLocals *Level, void *source) { DSeqNode *node; - for (node = DSeqNode::FirstSequence(); node; ) + for (node = Level->SequenceListHead; node; ) { DSeqNode *next = node->NextSequence(); if (node->Source() == source) @@ -1164,7 +1159,7 @@ bool SN_IsMakingLoopingSound (sector_t *sector) { DSeqNode *node; - for (node = DSeqNode::FirstSequence (); node; ) + for (node = sector->Level->SequenceListHead; node; ) { DSeqNode *next = node->NextSequence(); if (node->Source() == (void *)sector) @@ -1328,7 +1323,7 @@ void DSeqNode::Tick () int seqnum = FindSequence (ENamedName(m_SequencePtr[i*2+1])); if (seqnum >= 0) { // Found a match, and it's a good one too. - ActiveSequences--; + Level->ActiveSequences--; ActivateSequence (seqnum); break; } @@ -1359,15 +1354,15 @@ void DSeqNode::Tick () } } -void SN_UpdateActiveSequences (void) +void SN_UpdateActiveSequences (FLevelLocals *Level) { DSeqNode *node; - if (!ActiveSequences || paused) + if (!Level->ActiveSequences || paused) { // No sequences currently playing/game is paused return; } - for (node = DSeqNode::FirstSequence(); node; node = node->NextSequence()) + for (node =Level->SequenceListHead; node; node = node->NextSequence()) { node->Tick (); } @@ -1379,11 +1374,11 @@ void SN_UpdateActiveSequences (void) // //========================================================================== -void SN_StopAllSequences (void) +void SN_StopAllSequences (FLevelLocals *Level) { DSeqNode *node; - for (node = DSeqNode::FirstSequence(); node; ) + for (node = Level->SequenceListHead; node; ) { DSeqNode *next = node->NextSequence(); node->m_StopSound = 0; // don't play any stop sounds @@ -1470,14 +1465,14 @@ DEFINE_ACTION_FUNCTION(DSeqNode, MarkPrecacheSounds) // nodeNum zero is the first node //========================================================================== -void SN_ChangeNodeData (int nodeNum, int seqOffset, int delayTics, float volume, +void SN_ChangeNodeData (FLevelLocals *Level, int nodeNum, int seqOffset, int delayTics, float volume, int currentSoundID) { int i; DSeqNode *node; i = 0; - node = DSeqNode::FirstSequence(); + node = Level->SequenceListHead; while (node && i < nodeNum) { node = node->NextSequence(); diff --git a/src/s_sndseq.h b/src/s_sndseq.h index 83b0475be..17e4284d2 100644 --- a/src/s_sndseq.h +++ b/src/s_sndseq.h @@ -28,21 +28,18 @@ public: void AddChoice (int seqnum, seqtype_t type); int GetModeNum() const { return m_ModeNum; } FName GetSequenceName() const; - static void StaticMarkHead() { GC::Mark(SequenceListHead); } virtual void MakeSound (int loop, FSoundID id) {} virtual void *Source () { return NULL; } virtual bool IsPlaying () { return false; } virtual DSeqNode *SpawnChild (int seqnum) { return NULL; } - inline static DSeqNode *FirstSequence() { return SequenceListHead; } inline DSeqNode *NextSequence() const { return m_Next; } - static void SerializeSequences (FSerializer &arc); protected: DSeqNode (); - DSeqNode (int sequence, int modenum); + DSeqNode (FLevelLocals *l, int sequence, int modenum); int32_t *m_SequencePtr; int m_Sequence; @@ -54,20 +51,20 @@ protected: float m_Atten; int m_ModeNum; + FLevelLocals *Level; TArray m_SequenceChoices; TObjPtr m_ChildSeqNode; TObjPtr m_ParentSeqNode; private: - static DSeqNode *SequenceListHead; DSeqNode *m_Next, *m_Prev; void ActivateSequence (int sequence); - friend void SN_StopAllSequences (void); + friend void SN_StopAllSequences (FLevelLocals *Level); }; -void SN_StopAllSequences (void); +void SN_StopAllSequences (FLevelLocals *Level); struct FSoundSequence { @@ -92,11 +89,10 @@ void SN_StopSequence (sector_t *sector, int chan); void SN_StopSequence (FPolyObj *poly); bool SN_AreModesSame(int sequence, seqtype_t type, int mode1, int mode2); bool SN_AreModesSame(FName name, int mode1, int mode2); -void SN_UpdateActiveSequences (void); +void SN_UpdateActiveSequences (FLevelLocals *Level); ptrdiff_t SN_GetSequenceOffset (int sequence, int32_t *sequencePtr); -void SN_DoStop (void *); -void SN_ChangeNodeData (int nodeNum, int seqOffset, int delayTics, - float volume, int currentSoundID); +void SN_DoStop (FLevelLocals *Level, void *); +void SN_ChangeNodeData (FLevelLocals *Level, int nodeNum, int seqOffset, int delayTics, float volume, int currentSoundID); FName SN_GetSequenceSlot (int sequence, seqtype_t type); void SN_MarkPrecacheSounds (int sequence, seqtype_t type); bool SN_IsMakingLoopingSound (sector_t *sector); diff --git a/src/s_sound.cpp b/src/s_sound.cpp index ad4eb38ed..606fcd71e 100644 --- a/src/s_sound.cpp +++ b/src/s_sound.cpp @@ -1751,7 +1751,10 @@ void S_StopSound (const FPolyObj *poly, int channel) void S_StopAllChannels () { - SN_StopAllSequences(); + for (auto Level : AllLevels()) + { + SN_StopAllSequences(Level); + } FSoundChan *chan = Channels; while (chan != NULL) @@ -2178,8 +2181,10 @@ void S_UpdateSounds (AActor *listenactor) chan->ChanFlags &= ~CHAN_JUSTSTARTED; } - SN_UpdateActiveSequences(); - + for (auto Level : AllLevels()) + { + SN_UpdateActiveSequences(Level); + } GSnd->UpdateListener(&listener); GSnd->UpdateSounds(); diff --git a/src/wi_stuff.cpp b/src/wi_stuff.cpp index 9fc258ee4..87edc0398 100644 --- a/src/wi_stuff.cpp +++ b/src/wi_stuff.cpp @@ -769,7 +769,10 @@ void WI_Start(wbstartstruct_t *wbstartstruct) else wbstartstruct->nextname = info->LookupLevelName(); V_SetBlend(0, 0, 0, 0); S_StopAllChannels(); - SN_StopAllSequences(); + for (auto Level : AllLevels()) + { + SN_StopAllSequences(Level); + } WI_Screen = cls->CreateNew(); IFVIRTUALPTRNAME(WI_Screen, "StatusScreen", Start) { From 68667e5eaa6fd0ba6cc965d286389d8249e68ecb Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 29 Jan 2019 01:09:02 +0100 Subject: [PATCH 070/164] - moved particle storage into FLevelLocals. - moved parts of the render setup out of the separate render functions. Things like particle and polyobject linking were duplicated several times for rendering different things in different renderers. These things only need to be set up once before the renderer is started so it makes a lot more sense to consolidate them into one place outside the actual rendering code. --- src/d_event.h | 2 + src/d_main.cpp | 47 ++++++---- src/g_game.cpp | 6 +- src/g_level.cpp | 3 + src/g_levellocals.h | 7 ++ src/gl/renderer/gl_renderer.cpp | 3 - src/hwrenderer/scene/hw_bsp.cpp | 8 +- src/hwrenderer/scene/hw_drawinfo.cpp | 1 - src/maploader/polyobjects.cpp | 5 +- src/p_acs.cpp | 2 +- src/p_actionfunctions.cpp | 2 +- src/p_effect.cpp | 117 ++++++++++++------------- src/p_effect.h | 23 +++-- src/p_map.cpp | 2 +- src/p_mobj.cpp | 10 +-- src/p_setup.cpp | 2 +- src/p_tick.cpp | 4 +- src/polyrenderer/poly_renderer.cpp | 4 +- src/polyrenderer/scene/poly_scene.cpp | 5 +- src/scripting/vmthunks_actors.cpp | 4 +- src/swrenderer/scene/r_opaque_pass.cpp | 4 +- src/swrenderer/scene/r_scene.cpp | 6 -- 22 files changed, 139 insertions(+), 128 deletions(-) diff --git a/src/d_event.h b/src/d_event.h index 22988cda5..b751155df 100644 --- a/src/d_event.h +++ b/src/d_event.h @@ -25,6 +25,7 @@ #include "basictypes.h" +#include // @@ -119,6 +120,7 @@ typedef enum // Called by IO functions when input is detected. void D_PostEvent (const event_t* ev); void D_RemoveNextCharEvent(); +void D_Render(std::function action, bool interpolate); // diff --git a/src/d_main.cpp b/src/d_main.cpp index 65458d7a9..098eb6876 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -351,6 +351,35 @@ void D_RemoveNextCharEvent() } } +//========================================================================== +// +// Render wrapper. +// This function contains all the needed setup and cleanup for starting a render job. +// +//========================================================================== + +void D_Render(std::function action, bool interpolate) +{ + for (auto Level : AllLevels()) + { + // Check for the presence of dynamic lights at the start of the frame once. + if ((gl_lights && vid_rendermode == 4) || (r_dynlights && vid_rendermode != 4)) + { + Level->HasDynamicLights = !!level.lights; + } + else Level->HasDynamicLights = false; // lights are off so effectively we have none. + if (interpolate) Level->interpolator.DoInterpolations(I_GetTimeFrac()); + P_FindParticleSubsectors(Level); + PO_LinkToSubsectors(Level); + } + action(); + + if (interpolate) for (auto Level : AllLevels()) + { + Level->interpolator.RestoreInterpolations(); + } +} + //========================================================================== // // CVAR dmflags @@ -746,22 +775,10 @@ void D_Display () //E_RenderFrame(); // - for (auto Level : AllLevels()) + D_Render([&]() { - // Check for the presence of dynamic lights at the start of the frame once. - if ((gl_lights && vid_rendermode == 4) || (r_dynlights && vid_rendermode != 4)) - { - Level->HasDynamicLights = !!level.lights; - } - else Level->HasDynamicLights = false; // lights are off so effectively we have none. - Level->interpolator.DoInterpolations(I_GetTimeFrac()); - } - viewsec = screen->RenderView(&players[consoleplayer]); - - for (auto Level : AllLevels()) - { - Level->interpolator.RestoreInterpolations(); - } + viewsec = screen->RenderView(&players[consoleplayer]); + }, true); screen->Begin2D(); screen->DrawBlend(viewsec); diff --git a/src/g_game.cpp b/src/g_game.cpp index 677ba8a30..5d8cdde6f 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -72,6 +72,7 @@ #include "vm.h" #include "dobjgc.h" #include "gi.h" +#include "a_dynlight.h" #include "g_hub.h" #include "g_levellocals.h" @@ -2101,7 +2102,10 @@ static void PutSavePic (FileWriter *file, int width, int height) } else { - screen->WriteSavePic(&players[consoleplayer], file, width, height); + D_Render([&]() + { + screen->WriteSavePic(&players[consoleplayer], file, width, height); + }, false); } } diff --git a/src/g_level.cpp b/src/g_level.cpp index a80b8d6ae..b820eb421 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -80,6 +80,7 @@ #include "i_music.h" #include "a_dynlight.h" #include "p_conversation.h" +#include "p_effect.h" #include "gi.h" @@ -1460,6 +1461,8 @@ int G_FinishTravel () void FLevelLocals::Init() { + P_InitParticles(this); + P_ClearParticles(this); BaseBlendA = 0.0f; // Remove underwater blend effect, if any gravity = sv_gravity * 35/TICRATE; diff --git a/src/g_levellocals.h b/src/g_levellocals.h index ca14ee839..b2ade4bd6 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -47,6 +47,7 @@ #include "p_tags.h" #include "p_spec.h" #include "actor.h" +#include "p_effect.h" #include "p_destructible.h" #include "r_data/r_sections.h" #include "r_data/r_canvastexture.h" @@ -491,6 +492,12 @@ public: int ActiveSequences; DSeqNode *SequenceListHead; + // [RH] particle globals + uint32_t ActiveParticles; + uint32_t InactiveParticles; + TArray Particles; + TArray ParticlesInSubsec; + TArray Scrolls; // NULL if no DScrollers in this level int8_t WallVertLight; // Light diffs for vert/horiz walls diff --git a/src/gl/renderer/gl_renderer.cpp b/src/gl/renderer/gl_renderer.cpp index 76e4f9932..00a4f3460 100644 --- a/src/gl/renderer/gl_renderer.cpp +++ b/src/gl/renderer/gl_renderer.cpp @@ -245,8 +245,6 @@ sector_t *FGLRenderer::RenderView(player_t* player) if (cl_capfps || r_NoInterpolate) r_viewpoint.TicFrac = 1.; else r_viewpoint.TicFrac = I_GetTimeFrac(); - P_FindParticleSubsectors(); - screen->mLights->Clear(); screen->mViewpoints->Clear(); @@ -358,7 +356,6 @@ void FGLRenderer::WriteSavePic (player_t *player, FileWriter *file, int width, i mBuffers = mSaveBuffers; hw_ClearFakeFlat(); - P_FindParticleSubsectors(); // make sure that all recently spawned particles have a valid subsector. gl_RenderState.SetVertexBuffer(screen->mVertexData); screen->mVertexData->Reset(); screen->mLights->Clear(); diff --git a/src/hwrenderer/scene/hw_bsp.cpp b/src/hwrenderer/scene/hw_bsp.cpp index 7ecbccaf2..011c905c0 100644 --- a/src/hwrenderer/scene/hw_bsp.cpp +++ b/src/hwrenderer/scene/hw_bsp.cpp @@ -554,16 +554,16 @@ void HWDrawInfo::RenderThings(subsector_t * sub, sector_t * sector) void HWDrawInfo::RenderParticles(subsector_t *sub, sector_t *front) { SetupSprite.Clock(); - for (int i = ParticlesInSubsec[sub->Index()]; i != NO_PARTICLE; i = Particles[i].snext) + for (int i = Level->ParticlesInSubsec[sub->Index()]; i != NO_PARTICLE; i = Level->Particles[i].snext) { if (mClipPortal) { - int clipres = mClipPortal->ClipPoint(Particles[i].Pos); + int clipres = mClipPortal->ClipPoint(Level->Particles[i].Pos); if (clipres == PClip_InFront) continue; } GLSprite sprite; - sprite.ProcessParticle(this, &Particles[i], front); + sprite.ProcessParticle(this, &Level->Particles[i], front); } SetupSprite.Unclock(); } @@ -626,7 +626,7 @@ void HWDrawInfo::DoSubsector(subsector_t * sub) } // [RH] Add particles - if (gl_render_things && ParticlesInSubsec[sub->Index()] != NO_PARTICLE) + if (gl_render_things && Level->ParticlesInSubsec[sub->Index()] != NO_PARTICLE) { if (multithread) { diff --git a/src/hwrenderer/scene/hw_drawinfo.cpp b/src/hwrenderer/scene/hw_drawinfo.cpp index 8856fc9e2..fc1f74f73 100644 --- a/src/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/hwrenderer/scene/hw_drawinfo.cpp @@ -429,7 +429,6 @@ void HWDrawInfo::CreateScene() // reset the portal manager screen->mPortalState->StartFrame(); - PO_LinkToSubsectors(Level); ProcessAll.Clock(); diff --git a/src/maploader/polyobjects.cpp b/src/maploader/polyobjects.cpp index 2bc931d1c..e1b042743 100644 --- a/src/maploader/polyobjects.cpp +++ b/src/maploader/polyobjects.cpp @@ -152,6 +152,7 @@ void MapLoader::SpawnPolyobj (int index, int tag, int type) unsigned int ii; int i; FPolyObj *po = &Level->Polyobjects[index]; + po->Level = Level; for (ii = 0; ii < KnownPolySides.Size(); ++ii) { @@ -351,10 +352,6 @@ void MapLoader::PO_Init (void) InitSideLists (); Level->Polyobjects.Resize(NumPolyobjs); - for (auto p : Level->Polyobjects) - { - p.Level = Level; - } polyIndex = 0; // index polyobj number // Find the startSpot points, and spawn each polyobj diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 6d2e62082..d6285bff8 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -6447,7 +6447,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) size = fabs(size); if (lifetime != 0) - P_SpawnParticle(DVector3(ACSToDouble(x), ACSToDouble(y), ACSToDouble(z)), + P_SpawnParticle(Level, DVector3(ACSToDouble(x), ACSToDouble(y), ACSToDouble(z)), DVector3(ACSToDouble(xvel), ACSToDouble(yvel), ACSToDouble(zvel)), DVector3(ACSToDouble(accelx), ACSToDouble(accely), ACSToDouble(accelz)), color, startalpha/255., lifetime, size, endsize, fadestep/255., fullbright); diff --git a/src/p_actionfunctions.cpp b/src/p_actionfunctions.cpp index 9afe3597e..55bcb4a86 100644 --- a/src/p_actionfunctions.cpp +++ b/src/p_actionfunctions.cpp @@ -1669,7 +1669,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_SpawnParticle) acc.X = accelx * c + accely * s; acc.Y = accelx * s - accely * c; } - P_SpawnParticle(self->Vec3Offset(pos), vel, acc, color, startalpha, lifetime, size, fadestep, sizestep, flags); + P_SpawnParticle(self->Level, self->Vec3Offset(pos), vel, acc, color, startalpha, lifetime, size, fadestep, sizestep, flags); } return 0; } diff --git a/src/p_effect.cpp b/src/p_effect.cpp index 1fd04ebc3..3f0bebb7e 100644 --- a/src/p_effect.cpp +++ b/src/p_effect.cpp @@ -59,12 +59,6 @@ FRandom pr_railtrail("RailTrail"); #define FADEFROMTTL(a) (1.f/(a)) -// [RH] particle globals -uint32_t ActiveParticles; -uint32_t InactiveParticles; -TArray Particles; -TArray ParticlesInSubsec; - static int grey1, grey2, grey3, grey4, red, green, blue, yellow, black, red1, green1, blue1, yellow1, purple, purple1, white, rblue1, rblue2, rblue3, rblue4, orange, yorange, dred, grey5, @@ -103,15 +97,15 @@ static const struct ColorList { {NULL, 0, 0, 0 } }; -inline particle_t *NewParticle (void) +inline particle_t *NewParticle (FLevelLocals *Level) { particle_t *result = nullptr; - if (InactiveParticles != NO_PARTICLE) + if (Level->InactiveParticles != NO_PARTICLE) { - result = &Particles[InactiveParticles]; - InactiveParticles = result->tnext; - result->tnext = ActiveParticles; - ActiveParticles = uint32_t(result - Particles.Data()); + result = &Level->Particles[Level->InactiveParticles]; + Level->InactiveParticles = result->tnext; + result->tnext = Level->ActiveParticles; + Level->ActiveParticles = uint32_t(result - Level->Particles.Data()); } return result; } @@ -119,7 +113,7 @@ inline particle_t *NewParticle (void) // // [RH] Particle functions // -void P_InitParticles (); +void P_InitParticles (FLevelLocals *); // [BC] Allow the maximum number of particles to be specified by a cvar (so people // with lots of nice hardware can have lots of particles!). @@ -134,11 +128,14 @@ CUSTOM_CVAR( Int, r_maxparticles, 4000, CVAR_ARCHIVE ) if ( gamestate != GS_STARTUP ) { - P_InitParticles( ); + for (auto Level : AllLevels()) + { + P_InitParticles(Level); + } } } -void P_InitParticles () +void P_InitParticles (FLevelLocals *Level) { const char *i; int num; @@ -152,45 +149,45 @@ void P_InitParticles () // This should be good, but eh... int NumParticles = clamp(num, 100, 65535); - Particles.Resize(NumParticles); - P_ClearParticles (); + Level->Particles.Resize(NumParticles); + P_ClearParticles (Level); } -void P_ClearParticles () +void P_ClearParticles (FLevelLocals *Level) { int i = 0; - memset (Particles.Data(), 0, Particles.Size() * sizeof(particle_t)); - ActiveParticles = NO_PARTICLE; - InactiveParticles = 0; - for (auto &p : Particles) + memset (Level->Particles.Data(), 0, Level->Particles.Size() * sizeof(particle_t)); + Level->ActiveParticles = NO_PARTICLE; + Level->InactiveParticles = 0; + for (auto &p : Level->Particles) p.tnext = ++i; - Particles.Last().tnext = NO_PARTICLE; + Level->Particles.Last().tnext = NO_PARTICLE; } // Group particles by subsectors. Because particles are always // in motion, there is little benefit to caching this information // from one frame to the next. -void P_FindParticleSubsectors () +void P_FindParticleSubsectors (FLevelLocals *Level) { - if (ParticlesInSubsec.Size() < level.subsectors.Size()) + if (Level->ParticlesInSubsec.Size() < level.subsectors.Size()) { - ParticlesInSubsec.Reserve (level.subsectors.Size() - ParticlesInSubsec.Size()); + Level->ParticlesInSubsec.Reserve (level.subsectors.Size() - Level->ParticlesInSubsec.Size()); } - fillshort (&ParticlesInSubsec[0], level.subsectors.Size(), NO_PARTICLE); + fillshort (&Level->ParticlesInSubsec[0], level.subsectors.Size(), NO_PARTICLE); if (!r_particles) { return; } - for (uint16_t i = ActiveParticles; i != NO_PARTICLE; i = Particles[i].tnext) + for (uint16_t i = Level->ActiveParticles; i != NO_PARTICLE; i = Level->Particles[i].tnext) { // Try to reuse the subsector from the last portal check, if still valid. - if (Particles[i].subsector == NULL) Particles[i].subsector = R_PointInSubsector(Particles[i].Pos); - int ssnum = Particles[i].subsector->Index(); - Particles[i].snext = ParticlesInSubsec[ssnum]; - ParticlesInSubsec[ssnum] = i; + if (Level->Particles[i].subsector == nullptr) Level->Particles[i].subsector = R_PointInSubsector(Level->Particles[i].Pos); + int ssnum = Level->Particles[i].subsector->Index(); + Level->Particles[i].snext = Level->ParticlesInSubsec[ssnum]; + Level->ParticlesInSubsec[ssnum] = i; } } @@ -220,7 +217,6 @@ void P_InitEffects () { const struct ColorList *color = Colors; - P_InitParticles(); while (color->color) { *(color->color) = ParticleColor(color->r, color->g, color->b); @@ -232,16 +228,16 @@ void P_InitEffects () blood2 = ParticleColor(RPART(kind)/3, GPART(kind)/3, BPART(kind)/3); } -void P_ThinkParticles () +void P_ThinkParticles (FLevelLocals *Level) { int i; particle_t *particle, *prev; - i = ActiveParticles; + i = Level->ActiveParticles; prev = NULL; while (i != NO_PARTICLE) { - particle = &Particles[i]; + particle = &Level->Particles[i]; i = particle->tnext; if (!particle->notimefreeze && level.isFrozen()) { @@ -258,9 +254,9 @@ void P_ThinkParticles () if (prev) prev->tnext = i; else - ActiveParticles = i; - particle->tnext = InactiveParticles; - InactiveParticles = (int)(particle - Particles.Data()); + Level->ActiveParticles = i; + particle->tnext = Level->InactiveParticles; + Level->InactiveParticles = (int)(particle - Level->Particles.Data()); continue; } @@ -299,10 +295,10 @@ enum PSFlag PS_NOTIMEFREEZE = 1 << 5, }; -void P_SpawnParticle(const DVector3 &pos, const DVector3 &vel, const DVector3 &accel, PalEntry color, double startalpha, int lifetime, double size, +void P_SpawnParticle(FLevelLocals *Level, const DVector3 &pos, const DVector3 &vel, const DVector3 &accel, PalEntry color, double startalpha, int lifetime, double size, double fadestep, double sizestep, int flags) { - particle_t *particle = NewParticle(); + particle_t *particle = NewParticle(Level); if (particle) { @@ -326,7 +322,7 @@ void P_SpawnParticle(const DVector3 &pos, const DVector3 &vel, const DVector3 &a // // Run effects on all actors in the world // -void P_RunEffects () +void P_RunEffects (FLevelLocals *Level) { if (players[consoleplayer].camera == NULL) return; @@ -339,10 +335,7 @@ void P_RunEffects () { if (actor->effects || actor->fountaincolor) { - // Only run the effect if the actor is potentially visible - int rnum = pnum + actor->Sector->Index(); - if (level.rejectmatrix.Size() == 0 || !(level.rejectmatrix[rnum>>3] & (1 << (rnum & 7)))) - P_RunEffect (actor, actor->effects); + P_RunEffect (actor, actor->effects); } } } @@ -352,14 +345,14 @@ void P_RunEffects () // // Creates a particle with "jitter" // -particle_t *JitterParticle (int ttl) +particle_t *JitterParticle (FLevelLocals *Level, int ttl) { - return JitterParticle (ttl, 1.0); + return JitterParticle (Level, ttl, 1.0); } // [XA] Added "drift speed" multiplier setting for enhanced railgun stuffs. -particle_t *JitterParticle (int ttl, double drift) +particle_t *JitterParticle (FLevelLocals *Level, int ttl, double drift) { - particle_t *particle = NewParticle (); + particle_t *particle = NewParticle (Level); if (particle) { int i; @@ -385,7 +378,7 @@ static void MakeFountain (AActor *actor, int color1, int color2) if (!(level.time & 1)) return; - particle = JitterParticle (51); + particle = JitterParticle (actor->Level, 51); if (particle) { @@ -425,7 +418,7 @@ void P_RunEffect (AActor *actor, int effects) DAngle an = moveangle + 90.; double speed; - particle = JitterParticle (3 + (M_Random() & 31)); + particle = JitterParticle (actor->Level, 3 + (M_Random() & 31)); if (particle) { double pathdist = M_Random() / 256.; DVector3 pos = actor->Vec3Offset( @@ -442,7 +435,7 @@ void P_RunEffect (AActor *actor, int effects) particle->size = 2; } for (i = 6; i; i--) { - particle_t *particle = JitterParticle (3 + (M_Random() & 31)); + particle_t *particle = JitterParticle (actor->Level, 3 + (M_Random() & 31)); if (particle) { double pathdist = M_Random() / 256.; DVector3 pos = actor->Vec3Offset( @@ -471,7 +464,7 @@ void P_RunEffect (AActor *actor, int effects) DVector3 pos = actor->Vec3Angle(-actor->radius * 2, moveangle, -actor->Height * actor->Vel.Z / 8 + actor->Height * (2. / 3)); - P_DrawSplash2 (6, pos, moveangle + 180, 2, 2); + P_DrawSplash2 (actor->Level, 6, pos, moveangle + 180, 2, 2); } if (actor->fountaincolor) { @@ -498,7 +491,7 @@ void P_RunEffect (AActor *actor, int effects) for (i = 3; i > 0; i--) { - particle = JitterParticle (16); + particle = JitterParticle (actor->Level, 16); if (particle != NULL) { DAngle ang = M_Random() * (360 / 256.); @@ -519,7 +512,7 @@ void P_RunEffect (AActor *actor, int effects) } } -void P_DrawSplash (int count, const DVector3 &pos, DAngle angle, int kind) +void P_DrawSplash (FLevelLocals *Level, int count, const DVector3 &pos, DAngle angle, int kind) { int color1, color2; @@ -535,7 +528,7 @@ void P_DrawSplash (int count, const DVector3 &pos, DAngle angle, int kind) for (; count; count--) { - particle_t *p = JitterParticle (10); + particle_t *p = JitterParticle (Level, 10); if (!p) break; @@ -553,7 +546,7 @@ void P_DrawSplash (int count, const DVector3 &pos, DAngle angle, int kind) } } -void P_DrawSplash2 (int count, const DVector3 &pos, DAngle angle, int updown, int kind) +void P_DrawSplash2 (FLevelLocals *Level, int count, const DVector3 &pos, DAngle angle, int updown, int kind) { int color1, color2, zadd; double zvel, zspread; @@ -584,7 +577,7 @@ void P_DrawSplash2 (int count, const DVector3 &pos, DAngle angle, int updown, in for (; count; count--) { - particle_t *p = NewParticle (); + particle_t *p = NewParticle (Level); DAngle an; if (!p) @@ -724,7 +717,7 @@ void P_DrawRailTrail(AActor *source, TArray &portalhits, int color1, deg = (double)SpiralOffset; for (i = spiral_steps; i; i--) { - particle_t *p = NewParticle (); + particle_t *p = NewParticle (source->Level); DVector3 tempvec; if (!p) @@ -795,7 +788,7 @@ void P_DrawRailTrail(AActor *source, TArray &portalhits, int color1, { // [XA] inner trail uses a different default duration (33). int innerduration = (duration == 0) ? 33 : duration; - particle_t *p = JitterParticle (innerduration, (float)drift); + particle_t *p = JitterParticle (source->Level, innerduration, (float)drift); if (!p) return; @@ -915,7 +908,7 @@ void P_DisconnectEffect (AActor *actor) for (i = 64; i; i--) { - particle_t *p = JitterParticle (TICRATE*2); + particle_t *p = JitterParticle (actor->Level, TICRATE*2); if (!p) break; diff --git a/src/p_effect.h b/src/p_effect.h index 00689118a..22a9ab823 100644 --- a/src/p_effect.h +++ b/src/p_effect.h @@ -41,6 +41,7 @@ #define FX_VISIBILITYPULSE 0x00000040 struct subsector_t; +struct FLevelLocals; // [RH] Particle details @@ -62,24 +63,22 @@ struct particle_t uint16_t snext; }; -extern TArray Particles; -extern TArray ParticlesInSubsec; - const uint16_t NO_PARTICLE = 0xffff; -void P_ClearParticles (); -void P_FindParticleSubsectors (); +void P_InitParticles(FLevelLocals *); +void P_ClearParticles (FLevelLocals *Level); +void P_FindParticleSubsectors (FLevelLocals *Level); class AActor; -particle_t *JitterParticle (int ttl); -particle_t *JitterParticle (int ttl, double drift); +particle_t *JitterParticle (FLevelLocals *Level, int ttl); +particle_t *JitterParticle (FLevelLocals *Level, int ttl, double drift); -void P_ThinkParticles (void); -void P_SpawnParticle(const DVector3 &pos, const DVector3 &vel, const DVector3 &accel, PalEntry color, double startalpha, int lifetime, double size, double fadestep, double sizestep, int flags = 0); +void P_ThinkParticles (FLevelLocals *Level); +void P_SpawnParticle(FLevelLocals *Level, const DVector3 &pos, const DVector3 &vel, const DVector3 &accel, PalEntry color, double startalpha, int lifetime, double size, double fadestep, double sizestep, int flags = 0); void P_InitEffects (void); -void P_RunEffects (void); +void P_RunEffects (FLevelLocals *Level); void P_RunEffect (AActor *actor, int effects); @@ -91,6 +90,6 @@ struct SPortalHit }; void P_DrawRailTrail(AActor *source, TArray &portalhits, int color1, int color2, double maxdiff = 0, int flags = 0, PClassActor *spawnclass = NULL, DAngle angle = 0., int duration = 35, double sparsity = 1.0, double drift = 1.0, int SpiralOffset = 270, DAngle pitch = 0.); -void P_DrawSplash (int count, const DVector3 &pos, DAngle angle, int kind); -void P_DrawSplash2 (int count, const DVector3 &pos, DAngle angle, int updown, int kind); +void P_DrawSplash (FLevelLocals *Level, int count, const DVector3 &pos, DAngle angle, int kind); +void P_DrawSplash2 (FLevelLocals *Level, int count, const DVector3 &pos, DAngle angle, int updown, int kind); void P_DisconnectEffect (AActor *actor); diff --git a/src/p_map.cpp b/src/p_map.cpp index 68275cf0b..164c94ade 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -6203,7 +6203,7 @@ void P_DoCrunch(AActor *thing, FChangePosition *cpos) DAngle an = (M_Random() - 128) * (360./256); if (cl_bloodtype >= 1) { - P_DrawSplash2(32, thing->PosPlusZ(thing->Height/2), an, 2, thing->BloodColor); + P_DrawSplash2(thing->Level, 32, thing->PosPlusZ(thing->Height/2), an, 2, thing->BloodColor); } } if (thing->CrushPainSound != 0 && !S_GetSoundPlayingInfo(thing, thing->CrushPainSound)) diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 9ec9a6339..9b960d48f 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -5619,7 +5619,7 @@ AActor *P_SpawnPuff (AActor *source, PClassActor *pufftype, const DVector3 &pos1 { if (cl_pufftype && updown != 3 && (puff->flags4 & MF4_ALLOWPARTICLES)) { - P_DrawSplash2 (32, pos, particledir, updown, 1); + P_DrawSplash2 (source->Level, 32, pos, particledir, updown, 1); if (cl_pufftype == 1) puff->renderflags |= RF_INVISIBLE; } @@ -5743,7 +5743,7 @@ void P_SpawnBlood (const DVector3 &pos1, DAngle dir, int damage, AActor *origina } if (bloodtype >= 1) - P_DrawSplash2 (40, pos, dir, 2, originator->BloodColor); + P_DrawSplash2 (originator->Level, 40, pos, dir, 2, originator->BloodColor); } DEFINE_ACTION_FUNCTION(AActor, SpawnBlood) @@ -5794,7 +5794,7 @@ void P_BloodSplatter (const DVector3 &pos, AActor *originator, DAngle hitangle) } if (bloodtype >= 1) { - P_DrawSplash2 (40, pos, hitangle-180., 2, originator->BloodColor); + P_DrawSplash2 (originator->Level, 40, pos, hitangle-180., 2, originator->BloodColor); } } @@ -5835,7 +5835,7 @@ void P_BloodSplatter2 (const DVector3 &pos, AActor *originator, DAngle hitangle) } if (bloodtype >= 1) { - P_DrawSplash2(40, pos + add, hitangle - 180., 2, originator->BloodColor); + P_DrawSplash2(originator->Level, 40, pos + add, hitangle - 180., 2, originator->BloodColor); } } @@ -5895,7 +5895,7 @@ void P_RipperBlood (AActor *mo, AActor *bleeder) } if (bloodtype >= 1) { - P_DrawSplash2(28, pos, bleeder->AngleTo(mo) + 180., 0, bleeder->BloodColor); + P_DrawSplash2(bleeder->Level, 28, pos, bleeder->AngleTo(mo) + 180., 0, bleeder->BloodColor); } } diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 7b482b0ad..fb9499a00 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -509,7 +509,7 @@ void P_SetupLevel(FLevelLocals *Level, int position, bool newGame) R_OldBlend = 0xffffffff; // [RH] Remove all particles - P_ClearParticles(); + P_ClearParticles(Level); // preload graphics and sounds if (precache) diff --git a/src/p_tick.cpp b/src/p_tick.cpp index 97e8af6a0..cec6e2b06 100644 --- a/src/p_tick.cpp +++ b/src/p_tick.cpp @@ -135,12 +135,12 @@ void P_Ticker (void) { ac->ClearInterpolation(); } + P_ThinkParticles(Level); // [RH] make the particles think } // Since things will be moving, it's okay to interpolate them in the renderer. r_NoInterpolate = false; - P_ThinkParticles(); // [RH] make the particles think for (i = 0; isector; + auto Level = frontsector->Level; frontsector->MoreFlags |= SECMF_DRAWN; if (sub->polys) @@ -187,9 +188,9 @@ void RenderPolyScene::RenderSubsector(PolyRenderThread *thread, subsector_t *sub } int subsectorIndex = sub->Index(); - for (int i = ParticlesInSubsec[subsectorIndex]; i != NO_PARTICLE; i = Particles[i].snext) + for (int i = Level->ParticlesInSubsec[subsectorIndex]; i != NO_PARTICLE; i = Level->Particles[i].snext) { - particle_t *particle = &Particles[i]; + particle_t *particle = &Level->Particles[i]; thread->TranslucentObjects.push_back(thread->FrameMemory->NewObject(particle, sub, subsectorDepth, CurrentViewpoint->StencilValue)); } } diff --git a/src/scripting/vmthunks_actors.cpp b/src/scripting/vmthunks_actors.cpp index 68cf3560c..a670907bb 100644 --- a/src/scripting/vmthunks_actors.cpp +++ b/src/scripting/vmthunks_actors.cpp @@ -1256,7 +1256,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(AActor, GetReplacee, ZS_GetReplacee) static void DrawSplash(AActor *self, int count, double angle, int kind) { - P_DrawSplash(count, self->Pos(), angle, kind); + P_DrawSplash(self->Level, count, self->Pos(), angle, kind); } DEFINE_ACTION_FUNCTION_NATIVE(AActor, DrawSplash, DrawSplash) @@ -1265,7 +1265,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(AActor, DrawSplash, DrawSplash) PARAM_INT(count); PARAM_FLOAT(angle); PARAM_INT(kind); - P_DrawSplash(count, self->Pos(), angle, kind); + P_DrawSplash(self->Level, count, self->Pos(), angle, kind); return 0; } diff --git a/src/swrenderer/scene/r_opaque_pass.cpp b/src/swrenderer/scene/r_opaque_pass.cpp index 79d3112b2..12f00fda8 100644 --- a/src/swrenderer/scene/r_opaque_pass.cpp +++ b/src/swrenderer/scene/r_opaque_pass.cpp @@ -615,9 +615,9 @@ namespace swrenderer if ((unsigned int)(sub->Index()) < Level->subsectors.Size()) { // Only do it for the main BSP. int lightlevel = (floorlightlevel + ceilinglightlevel) / 2; - for (int i = ParticlesInSubsec[sub->Index()]; i != NO_PARTICLE; i = Particles[i].snext) + for (int i = frontsector->Level->ParticlesInSubsec[sub->Index()]; i != NO_PARTICLE; i = frontsector->Level->Particles[i].snext) { - RenderParticle::Project(Thread, &Particles[i], sub->sector, lightlevel, FakeSide, foggy); + RenderParticle::Project(Thread, &frontsector->Level->Particles[i], sub->sector, lightlevel, FakeSide, foggy); } } diff --git a/src/swrenderer/scene/r_scene.cpp b/src/swrenderer/scene/r_scene.cpp index 02bd00755..01e696918 100644 --- a/src/swrenderer/scene/r_scene.cpp +++ b/src/swrenderer/scene/r_scene.cpp @@ -159,12 +159,6 @@ namespace swrenderer this->dontmaplines = dontmaplines; - // [RH] Setup particles for this frame - P_FindParticleSubsectors(); - - // Link the polyobjects right before drawing the scene to reduce the amounts of calls to this function - PO_LinkToSubsectors(&level); - R_UpdateFuzzPosFrameStart(); if (r_modelscene) From 60873bc5d673a69d59fc0af7cf848df0c64b1ec9 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 29 Jan 2019 01:30:41 +0100 Subject: [PATCH 071/164] Moved the PointInSector functions into FLevelLocals --- src/actor.h | 3 +- src/am_map.cpp | 2 +- src/fragglescript/t_func.cpp | 4 +- src/g_game.cpp | 2 +- src/g_level.cpp | 16 +++--- src/g_levellocals.h | 20 +++++++- src/g_shared/a_dynlight.cpp | 8 +-- src/hwrenderer/scene/hw_drawinfo.cpp | 6 +-- src/hwrenderer/scene/hw_portal.cpp | 4 +- src/hwrenderer/scene/hw_renderhacks.cpp | 2 +- src/maploader/polyobjects.cpp | 2 +- src/maploader/slopes.cpp | 4 +- src/maploader/specials.cpp | 2 +- src/p_3dfloors.cpp | 5 +- src/p_actionfunctions.cpp | 4 +- src/p_effect.cpp | 6 +-- src/p_enemy.cpp | 4 +- src/p_map.cpp | 14 ++--- src/p_maputl.cpp | 51 ++++++++++++++----- src/p_mobj.cpp | 12 ++--- src/p_secnodes.cpp | 4 +- src/p_sectors.cpp | 8 +-- src/p_sight.cpp | 2 +- src/p_switch.cpp | 2 +- src/p_teleport.cpp | 2 +- src/p_trace.cpp | 10 ++-- src/p_user.cpp | 1 - src/polyrenderer/scene/poly_portal.cpp | 2 +- src/portal.cpp | 6 +-- src/r_defs.h | 19 +------ src/r_utility.cpp | 42 +++------------ src/r_utility.h | 6 --- src/s_sound.cpp | 4 +- src/scripting/vmthunks.cpp | 33 +++++++----- wadsrc/static/zscript/base.txt | 8 ++- wadsrc/static/zscript/mapdata.txt | 5 +- wadsrc/static/zscript/statusbar/alt_hud.txt | 2 +- .../static/zscript/strife/weapongrenade.txt | 2 +- 38 files changed, 167 insertions(+), 162 deletions(-) diff --git a/src/actor.h b/src/actor.h index 9d7651d33..d6657a83e 100644 --- a/src/actor.h +++ b/src/actor.h @@ -90,8 +90,7 @@ struct FLevelLocals; // // Every actor is linked into a single sector // based on its origin coordinates. -// The subsector_t is found with R_PointInSubsector(x,y), -// and the sector_t can be found with subsector->sector. +// The subsector_t is found with PointInSector(x,y). // The sector links are only used by the rendering code, // the play simulation does not care about them at all. // diff --git a/src/am_map.cpp b/src/am_map.cpp index 93682dee1..54e769883 100644 --- a/src/am_map.cpp +++ b/src/am_map.cpp @@ -2480,7 +2480,7 @@ void DAutomap::drawWalls (bool allmap) if (line.sidedef[0]->Flags & WALLF_POLYOBJ) { // For polyobjects we must test the surrounding sector to get the proper group. - pg = P_PointInSector(line.v1->fX() + line.Delta().X / 2, line.v1->fY() + line.Delta().Y / 2)->PortalGroup; + pg = Level->PointInSector(line.v1->fX() + line.Delta().X / 2, line.v1->fY() + line.Delta().Y / 2)->PortalGroup; } else { diff --git a/src/fragglescript/t_func.cpp b/src/fragglescript/t_func.cpp index 7d3fc89ae..e6f2a583e 100644 --- a/src/fragglescript/t_func.cpp +++ b/src/fragglescript/t_func.cpp @@ -839,7 +839,7 @@ void FParser::SF_Spawn(void) // [Graf Zahl] added option of spawning with a relative z coordinate if(t_argc > 5) { - if (intvalue(t_argv[5])) pos.Z += P_PointInSector(pos)->floorplane.ZatPoint(pos); + if (intvalue(t_argv[5])) pos.Z += Level->PointInSector(pos)->floorplane.ZatPoint(pos); } } else @@ -2900,7 +2900,7 @@ void FParser::SF_SpawnExplosion() if(t_argc > 3) pos.Z = floatvalue(t_argv[3]); else - pos.Z = P_PointInSector(pos)->floorplane.ZatPoint(pos); + pos.Z = Level->PointInSector(pos)->floorplane.ZatPoint(pos); spawn = Spawn (pclass, pos, ALLOW_REPLACE); t_return.type = svt_int; diff --git a/src/g_game.cpp b/src/g_game.cpp index 5d8cdde6f..1926c9338 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -1340,7 +1340,7 @@ bool FLevelLocals::CheckSpot (int playernum, FPlayerStart *mthing) { spot.Z = 0; } - spot.Z += P_PointInSector (spot)->floorplane.ZatPoint (spot); + spot.Z += PointInSector (spot)->floorplane.ZatPoint (spot); if (!players[playernum].mo) { // first spawn of level, before corpses diff --git a/src/g_level.cpp b/src/g_level.cpp index b820eb421..a6a6efa29 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -2078,10 +2078,10 @@ int FLevelLocals::GetInfighting() // Made by dpJudas, modified and implemented by Major Cooke //========================================================================== - -int IsPointInMap(double x, double y, double z) +int IsPointInMap(FLevelLocals *Level, double x, double y, double z) { - subsector_t *subsector = R_PointInSubsector(FLOAT2FIXED(x), FLOAT2FIXED(y)); + // This uses the render nodes because those are guaranteed to be GL nodes, meaning all subsectors are closed. + subsector_t *subsector = Level->PointInRenderSubsector(FLOAT2FIXED(x), FLOAT2FIXED(y)); if (!subsector) return false; for (uint32_t i = 0; i < subsector->numlines; i++) @@ -2105,13 +2105,13 @@ int IsPointInMap(double x, double y, double z) return true; } -DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, IsPointInMap, IsPointInMap) +DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, IsPointInLevel, IsPointInMap) { - PARAM_PROLOGUE; + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); PARAM_FLOAT(x); PARAM_FLOAT(y); PARAM_FLOAT(z); - ACTION_RETURN_BOOL(IsPointInMap(x, y, z)); + ACTION_RETURN_BOOL(IsPointInMap(self, x, y, z)); } template @@ -2121,8 +2121,8 @@ inline T VecDiff(const T& v1, const T& v2) if (level.subsectors.Size() > 0) { - const sector_t *const sec1 = P_PointInSector(v1); - const sector_t *const sec2 = P_PointInSector(v2); + const sector_t *const sec1 = level.PointInSector(v1); + const sector_t *const sec2 = level.PointInSector(v2); if (nullptr != sec1 && nullptr != sec2) { diff --git a/src/g_levellocals.h b/src/g_levellocals.h index b2ade4bd6..5f7d202b0 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -317,11 +317,27 @@ public: return frozenstate; } +private: // The engine should never ever access subsectors of the game nodes. This is only needed for actually implementing PointInSector. + subsector_t *PointInSubsector(double x, double y); +public: + sector_t *PointInSectorBuggy(double x, double y); + subsector_t *PointInRenderSubsector (fixed_t x, fixed_t y); + sector_t *PointInSector(const DVector2 &pos) { - return P_PointInSector(pos); + return PointInSubsector(pos.X, pos.Y)->sector; } - + + sector_t *PointInSector(double x, double y) + { + return PointInSubsector(x, y)->sector; + } + + subsector_t *PointInRenderSubsector (const DVector2 &pos) + { + return PointInRenderSubsector(FloatToFixed(pos.X), FloatToFixed(pos.Y)); + } + FPolyObj *GetPolyobj (int polyNum) { auto index = Polyobjects.FindEx([=](const auto &poly) { return poly.tag == polyNum; }); diff --git a/src/g_shared/a_dynlight.cpp b/src/g_shared/a_dynlight.cpp index e333bffc5..a24a82bfe 100644 --- a/src/g_shared/a_dynlight.cpp +++ b/src/g_shared/a_dynlight.cpp @@ -591,7 +591,7 @@ void FDynamicLight::CollectWithinRadius(const DVector3 &opos, FSection *section, line_t *other = port->mDestination; if (other->validcount != ::validcount) { - subsector_t *othersub = R_PointInSubsector(other->v1->fPos() + other->Delta() / 2); + subsector_t *othersub = Level->PointInRenderSubsector(other->v1->fPos() + other->Delta() / 2); FSection *othersect = othersub->section; if (othersect->validcount != ::validcount) { @@ -642,7 +642,7 @@ void FDynamicLight::CollectWithinRadius(const DVector3 &opos, FSection *section, if (sec->GetPortalPlaneZ(sector_t::ceiling) < Z() + radius) { DVector2 refpos = other->v1->fPos() + other->Delta() / 2 + sec->GetPortalDisplacement(sector_t::ceiling); - subsector_t *othersub = R_PointInSubsector(refpos); + subsector_t *othersub = Level->PointInRenderSubsector(refpos); FSection *othersect = othersub->section; if (othersect->validcount != dl_validcount) { @@ -657,7 +657,7 @@ void FDynamicLight::CollectWithinRadius(const DVector3 &opos, FSection *section, if (sec->GetPortalPlaneZ(sector_t::floor) > Z() - radius) { DVector2 refpos = other->v1->fPos() + other->Delta() / 2 + sec->GetPortalDisplacement(sector_t::floor); - subsector_t *othersub = R_PointInSubsector(refpos); + subsector_t *othersub = Level->PointInRenderSubsector(refpos); FSection *othersect = othersub->section; if (othersect->validcount != dl_validcount) { @@ -697,7 +697,7 @@ void FDynamicLight::LinkLight() if (radius>0) { // passing in radius*radius allows us to do a distance check without any calls to sqrt - FSection *sect = R_PointInSubsector(Pos)->section; + FSection *sect = Level->PointInRenderSubsector(Pos)->section; dl_validcount++; ::validcount++; diff --git a/src/hwrenderer/scene/hw_drawinfo.cpp b/src/hwrenderer/scene/hw_drawinfo.cpp index fc1f74f73..5d86051cc 100644 --- a/src/hwrenderer/scene/hw_drawinfo.cpp +++ b/src/hwrenderer/scene/hw_drawinfo.cpp @@ -224,7 +224,7 @@ void HWDrawInfo::ClearBuffers() void HWDrawInfo::UpdateCurrentMapSection() { - const int mapsection = R_PointInSubsector(Viewpoint.Pos)->mapsection; + const int mapsection = Level->PointInRenderSubsector(Viewpoint.Pos)->mapsection; CurrentMapSections.Set(mapsection); } @@ -239,7 +239,7 @@ void HWDrawInfo::SetViewArea() { auto &vp = Viewpoint; // The render_sector is better suited to represent the current position in GL - vp.sector = R_PointInSubsector(vp.Pos)->render_sector; + vp.sector = Level->PointInRenderSubsector(vp.Pos)->render_sector; // Get the heightsec state from the render sector, not the current one! if (vp.sector->GetHeightSec()) @@ -652,7 +652,7 @@ void HWDrawInfo::ProcessScene(bool toscreen, const std::functionmPortalState->BeginScene(); - int mapsection = R_PointInSubsector(Viewpoint.Pos)->mapsection; + int mapsection = Level->PointInRenderSubsector(Viewpoint.Pos)->mapsection; CurrentMapSections.Set(mapsection); DrawScene = drawScene; DrawScene(this, toscreen ? DM_MAINVIEW : DM_OFFSCREEN); diff --git a/src/hwrenderer/scene/hw_portal.cpp b/src/hwrenderer/scene/hw_portal.cpp index 457f0fb4d..b052c2676 100644 --- a/src/hwrenderer/scene/hw_portal.cpp +++ b/src/hwrenderer/scene/hw_portal.cpp @@ -625,7 +625,7 @@ bool HWLineToLinePortal::Setup(HWDrawInfo *di, FRenderState &rstate, Clipper *cl line_t *line = lines[i].seg->linedef->getPortalDestination(); subsector_t *sub; if (line->sidedef[0]->Flags & WALLF_POLYOBJ) - sub = R_PointInSubsector(line->v1->fixX(), line->v1->fixY()); + sub = di->Level->PointInRenderSubsector(line->v1->fixX(), line->v1->fixY()); else sub = line->frontsector->subsectors[0]; di->CurrentMapSections.Set(sub->mapsection); } @@ -791,7 +791,7 @@ bool HWSectorStackPortal::Setup(HWDrawInfo *di, FRenderState &rstate, Clipper *c // If the viewpoint is not within the portal, we need to invalidate the entire clip area. // The portal will re-validate the necessary parts when its subsectors get traversed. - subsector_t *sub = R_PointInSubsector(vp.Pos); + subsector_t *sub = di->Level->PointInRenderSubsector(vp.Pos); if (!(di->ss_renderflags[sub->Index()] & SSRF_SEEN)) { clipper->SafeAddClipRange(0, ANGLE_MAX); diff --git a/src/hwrenderer/scene/hw_renderhacks.cpp b/src/hwrenderer/scene/hw_renderhacks.cpp index 65a3da607..9ed505444 100644 --- a/src/hwrenderer/scene/hw_renderhacks.cpp +++ b/src/hwrenderer/scene/hw_renderhacks.cpp @@ -1123,7 +1123,7 @@ void HWDrawInfo::ProcessLowerMinisegs(TArray &lowersegs) void HWDrawInfo::HandleHackedSubsectors() { - viewsubsector = R_PointInSubsector(Viewpoint.Pos); + viewsubsector = Level->PointInRenderSubsector(Viewpoint.Pos); // Each subsector may only be processed once in this loop! validcount++; diff --git a/src/maploader/polyobjects.cpp b/src/maploader/polyobjects.cpp index e1b042743..1ff264712 100644 --- a/src/maploader/polyobjects.cpp +++ b/src/maploader/polyobjects.cpp @@ -316,7 +316,7 @@ void MapLoader::TranslateToStartSpot (int tag, const DVector2 &origin) } po->CalcCenter(); // For compatibility purposes - po->CenterSubsector = R_PointInSubsector(po->CenterSpot.pos); + po->CenterSubsector = Level->PointInRenderSubsector(po->CenterSpot.pos); } //========================================================================== diff --git a/src/maploader/slopes.cpp b/src/maploader/slopes.cpp index cd6100179..92c761103 100644 --- a/src/maploader/slopes.cpp +++ b/src/maploader/slopes.cpp @@ -143,7 +143,7 @@ void MapLoader::CopyPlane (int tag, sector_t *dest, bool copyCeil) void MapLoader::CopyPlane (int tag, const DVector2 &pos, bool copyCeil) { - sector_t *dest = P_PointInSector (pos); + sector_t *dest = Level->PointInSector (pos); CopyPlane(tag, dest, copyCeil); } @@ -389,7 +389,7 @@ void MapLoader::SpawnSlopeMakers (FMapThing *firstmt, FMapThing *lastmt, const i sector_t *sec; bool ceiling; - sec = P_PointInSector (mt->pos); + sec = Level->PointInSector (mt->pos); if (mt->info->Special == SMT_SlopeCeilingPointLine || mt->info->Special == SMT_VavoomCeiling || mt->info->Special == SMT_SetCeilingSlope) { refplane = &sec->ceilingplane; diff --git a/src/maploader/specials.cpp b/src/maploader/specials.cpp index 7177de655..3eef88e48 100644 --- a/src/maploader/specials.cpp +++ b/src/maploader/specials.cpp @@ -419,7 +419,7 @@ void MapLoader::SpawnSkybox(AActor *origin) if (Sector == NULL) { Printf("Sector not initialized for SkyCamCompat\n"); - origin->Sector = Sector = P_PointInSector(origin->Pos()); + origin->Sector = Sector = Level->PointInSector(origin->Pos()); } if (Sector) { diff --git a/src/p_3dfloors.cpp b/src/p_3dfloors.cpp index 213987718..d132da69f 100644 --- a/src/p_3dfloors.cpp +++ b/src/p_3dfloors.cpp @@ -814,9 +814,8 @@ secplane_t P_FindFloorPlane(sector_t * sector, const DVector3 &pos) int P_Find3DFloor(sector_t * sec, const DVector3 &pos, bool above, bool floor, double &cmpz) { - // If no sector given, find the one appropriate - if (sec == NULL) - sec = P_PointInSector(pos); + // sector must be given + if (sec == nullptr) return -1; // Above normal ceiling cmpz = sec->ceilingplane.ZatPoint(pos); diff --git a/src/p_actionfunctions.cpp b/src/p_actionfunctions.cpp index 55bcb4a86..a6ccd9e4b 100644 --- a/src/p_actionfunctions.cpp +++ b/src/p_actionfunctions.cpp @@ -295,7 +295,7 @@ DEFINE_ACTION_FUNCTION(AActor, GetZAt) double c = angle.Cos(); pos = mobj->Vec2Offset(pos.X * c + pos.Y * s, pos.X * s - pos.Y * c); } - sector_t *sec = P_PointInSector(pos); + sector_t *sec = self->Level->PointInSector(pos); if (sec) { @@ -2302,7 +2302,7 @@ DEFINE_ACTION_FUNCTION(AActor, CheckLOF) range */ - sector_t *sec = P_PointInSector(pos); + sector_t *sec = self->Level->PointInSector(pos); if (range == 0) { diff --git a/src/p_effect.cpp b/src/p_effect.cpp index 3f0bebb7e..fbfb0f322 100644 --- a/src/p_effect.cpp +++ b/src/p_effect.cpp @@ -184,7 +184,7 @@ void P_FindParticleSubsectors (FLevelLocals *Level) for (uint16_t i = Level->ActiveParticles; i != NO_PARTICLE; i = Level->Particles[i].tnext) { // Try to reuse the subsector from the last portal check, if still valid. - if (Level->Particles[i].subsector == nullptr) Level->Particles[i].subsector = R_PointInSubsector(Level->Particles[i].Pos); + if (Level->Particles[i].subsector == nullptr) Level->Particles[i].subsector = Level->PointInRenderSubsector(Level->Particles[i].Pos); int ssnum = Level->Particles[i].subsector->Index(); Level->Particles[i].snext = Level->ParticlesInSubsec[ssnum]; Level->ParticlesInSubsec[ssnum] = i; @@ -261,12 +261,12 @@ void P_ThinkParticles (FLevelLocals *Level) } // Handle crossing a line portal - DVector2 newxy = level.GetPortalOffsetPosition(particle->Pos.X, particle->Pos.Y, particle->Vel.X, particle->Vel.Y); + DVector2 newxy = Level->GetPortalOffsetPosition(particle->Pos.X, particle->Pos.Y, particle->Vel.X, particle->Vel.Y); particle->Pos.X = newxy.X; particle->Pos.Y = newxy.Y; particle->Pos.Z += particle->Vel.Z; particle->Vel += particle->Acc; - particle->subsector = R_PointInSubsector(particle->Pos); + particle->subsector = Level->PointInRenderSubsector(particle->Pos); sector_t *s = particle->subsector->sector; // Handle crossing a sector portal. if (!s->PortalBlocksMovement(sector_t::ceiling)) diff --git a/src/p_enemy.cpp b/src/p_enemy.cpp index bc1341d1f..43a2b9ce2 100644 --- a/src/p_enemy.cpp +++ b/src/p_enemy.cpp @@ -161,12 +161,12 @@ static void P_RecursiveSound(sector_t *sec, AActor *soundtarget, bool splash, AA // I wish there was a better method to do this than randomly looking through the portal at a few places... if (checkabove) { - sector_t *upper = P_PointInSector(check->v1->fPos() + check->Delta() / 2 + sec->GetPortalDisplacement(sector_t::ceiling)); + sector_t *upper = sec->Level->PointInSector(check->v1->fPos() + check->Delta() / 2 + sec->GetPortalDisplacement(sector_t::ceiling)); NoiseMarkSector(upper, soundtarget, splash, emitter, soundblocks, maxdist); } if (checkbelow) { - sector_t *lower = P_PointInSector(check->v1->fPos() + check->Delta() / 2 + sec->GetPortalDisplacement(sector_t::floor)); + sector_t *lower = sec->Level->PointInSector(check->v1->fPos() + check->Delta() / 2 + sec->GetPortalDisplacement(sector_t::floor)); NoiseMarkSector(lower, soundtarget, splash, emitter, soundblocks, maxdist); } diff --git a/src/p_map.cpp b/src/p_map.cpp index 164c94ade..cfd905f0c 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -275,7 +275,7 @@ static bool PIT_FindFloorCeiling(FMultiBlockLinesIterator &mit, FMultiBlockLines void P_GetFloorCeilingZ(FCheckPosition &tmf, int flags) { - sector_t *sec = (!(flags & FFCF_SAMESECTOR) || tmf.thing->Sector == NULL)? P_PointInSector(tmf.pos) : tmf.sector; + sector_t *sec = (!(flags & FFCF_SAMESECTOR) || tmf.thing->Sector == NULL)? tmf.thing->Level->PointInSector(tmf.pos) : tmf.sector; F3DFloor *ffc, *fff; tmf.ceilingz = NextHighestCeilingAt(sec, tmf.pos.X, tmf.pos.Y, tmf.pos.Z, tmf.pos.Z + tmf.thing->Height, flags, &tmf.ceilingsector, &ffc); @@ -418,7 +418,7 @@ bool P_TeleportMove(AActor* thing, const DVector3 &pos, bool telefrag, bool modi // P_LineOpening requires the thing's z to be the destination z in order to work. double savedz = thing->Z(); thing->SetZ(pos.Z); - sector_t *sector = P_PointInSector(pos); + sector_t *sector = thing->Level->PointInSector(pos); FPortalGroupArray grouplist; FMultiBlockLinesIterator mit(grouplist, pos.X, pos.Y, pos.Z, thing->Height, thing->radius, sector); @@ -1668,7 +1668,7 @@ bool P_CheckPosition(AActor *thing, const DVector2 &pos, FCheckPosition &tm, boo tm.pos.Y = pos.Y; tm.pos.Z = thing->Z(); - newsec = tm.sector = P_PointInSector(pos); + newsec = tm.sector = thing->Level->PointInSector(pos); tm.ceilingline = thing->BlockingLine = NULL; // Retrieve the base floor / ceiling from the target location. @@ -2596,7 +2596,7 @@ bool P_TryMove(AActor *thing, const DVector2 &pos, thing->UnlinkFromWorld(&ctx); thing->SetXYZ(thing->PosRelative(tm.portalgroup)); thing->Prev += thing->Pos() - oldpos; - thing->Sector = P_PointInSector(thing->Pos()); + thing->Sector = thing->Level->PointInSector(thing->Pos()); thing->PrevPortalGroup = thing->Sector->PortalGroup; thing->LinkToWorld(&ctx); @@ -3819,7 +3819,7 @@ struct aim_t newtrace.aimdir = position == sector_t::ceiling? aim_t::aim_up : aim_t::aim_down; newtrace.startpos = startpos + entersec->GetPortalDisplacement(position); newtrace.startfrac = frac + 1. / attackrange; // this is to skip the transition line to the portal which would produce a bogus opening - newtrace.lastsector = P_PointInSector(newtrace.startpos + aimtrace * newtrace.startfrac); + newtrace.lastsector = entersec->Level->PointInSector(newtrace.startpos + aimtrace * newtrace.startfrac); newtrace.limitz = portalz; if (aimdebug) Printf("-----Entering %s portal from sector %d to sector %d\n", position ? "ceiling" : "floor", lastsector->sectornum, newtrace.lastsector->sectornum); @@ -3858,7 +3858,7 @@ struct aim_t DVector2 pos = newtrace.startpos + newtrace.aimtrace * newtrace.startfrac; - newtrace.lastsector = P_PointInSector(pos); + newtrace.lastsector = li->GetLevel()->PointInSector(pos); P_TranslatePortalZ(li, limitz); if (aimdebug) Printf("-----Entering line portal from sector %d to sector %d\n", lastsector->sectornum, newtrace.lastsector->sectornum); @@ -6775,7 +6775,7 @@ static void SpawnDeepSplash(AActor *t1, const FTraceResults &trace, AActor *puff } else return; - P_HitWater(puff != NULL ? puff : t1, P_PointInSector(*hitpos), *hitpos); + P_HitWater(puff != NULL ? puff : t1, t1->Level->PointInSector(*hitpos), *hitpos); } //============================================================================= diff --git a/src/p_maputl.cpp b/src/p_maputl.cpp index 4d748aa72..32c5b4b4b 100644 --- a/src/p_maputl.cpp +++ b/src/p_maputl.cpp @@ -80,7 +80,6 @@ #include "po_man.h" #include "vm.h" -sector_t *P_PointInSectorBuggy(double x, double y); int P_VanillaPointOnDivlineSide(double x, double y, const divline_t* line); @@ -354,7 +353,7 @@ void AActor::UnlinkFromWorld (FLinkContext *ctx) bool AActor::FixMapthingPos() { - sector_t *secstart = P_PointInSectorBuggy(X(), Y()); + sector_t *secstart = Level->PointInSectorBuggy(X(), Y()); int blockx = Level->blockmap.GetBlockX(X()); int blocky = Level->blockmap.GetBlockY(Y()); @@ -452,16 +451,16 @@ void AActor::LinkToWorld(FLinkContext *ctx, bool spawningmapthing, sector_t *sec { if (!spawning) { - sector = P_PointInSector(Pos()); + sector = Level->PointInSector(Pos()); } else { - sector = P_PointInSectorBuggy(X(), Y()); + sector = Level->PointInSectorBuggy(X(), Y()); } } Sector = sector; - subsector = R_PointInSubsector(Pos()); // this is from the rendering nodes, not the gameplay nodes! + subsector = Level->PointInRenderSubsector(Pos()); // this is from the rendering nodes, not the gameplay nodes! section = subsector->section; if (!(flags & MF_NOSECTOR)) @@ -725,7 +724,7 @@ FMultiBlockLinesIterator::FMultiBlockLinesIterator(FPortalGroupArray &check, dou : checklist(check) { checkpoint = { checkx, checky, checkz }; - if (newsec == NULL) newsec = P_PointInSector(checkx, checky); + if (newsec == NULL) newsec = level.PointInSector(checkx, checky); startsector = newsec; basegroup = newsec->PortalGroup; if (!check.inited) level.CollectConnectedGroups(basegroup, checkpoint, checkz + checkh, checkradius, checklist); @@ -851,7 +850,7 @@ bool FMultiBlockLinesIterator::startIteratorForGroup(int group) offset = level.Displacements.getOffset(basegroup, group); offset.X += checkpoint.X; offset.Y += checkpoint.Y; - cursector = group == startsector->PortalGroup ? startsector : P_PointInSector(offset); + cursector = group == startsector->PortalGroup ? startsector : level.PointInSector(offset); // If we ended up in a different group, // presumably because the spot to be checked is too far outside the actual portal group, // the search needs to abort. @@ -1068,7 +1067,7 @@ FMultiBlockThingsIterator::FMultiBlockThingsIterator(FPortalGroupArray &check, d checkpoint.X = checkx; checkpoint.Y = checky; checkpoint.Z = checkz; - if (newsec == NULL) newsec = P_PointInSector(checkx, checky); + if (newsec == NULL) newsec = level.PointInSector(checkx, checky); basegroup = newsec->PortalGroup; if (!check.inited) level.CollectConnectedGroups(basegroup, checkpoint, checkz + checkh, checkradius, checklist); checkpoint.Z = checkradius; @@ -1933,15 +1932,15 @@ int P_VanillaPointOnLineSide(double x, double y, const line_t* line) // //========================================================================== -subsector_t *P_PointInSubsector(double x, double y) +subsector_t *FLevelLocals::PointInSubsector(double x, double y) { int side; auto node = level.HeadGamenode(); if (node == nullptr) return &level.subsectors[0]; - fixed_t xx = FLOAT2FIXED(x); - fixed_t yy = FLOAT2FIXED(y); + fixed_t xx = FloatToFixed(x); + fixed_t yy = FloatToFixed(y); do { side = R_PointOnSide(xx, yy, node); @@ -1958,7 +1957,7 @@ subsector_t *P_PointInSubsector(double x, double y) // //========================================================================== -sector_t *P_PointInSectorBuggy(double x, double y) +sector_t *FLevelLocals::PointInSectorBuggy(double x, double y) { // single subsector is a special case auto node = level.HeadGamenode(); @@ -1979,3 +1978,31 @@ sector_t *P_PointInSectorBuggy(double x, double y) subsector_t *ssec = (subsector_t *)((uint8_t *)node - 1); return ssec->sector; } + +//========================================================================== +// +// RPointInRenderSubsector +// +//========================================================================== + +subsector_t *FLevelLocals::PointInRenderSubsector (fixed_t x, fixed_t y) +{ + node_t *node; + int side; + + // single subsector is a special case + if (level.nodes.Size() == 0) + return &level.subsectors[0]; + + node = level.HeadNode(); + + do + { + side = R_PointOnSide (x, y, node); + node = (node_t *)node->children[side]; + } + while (!((size_t)node & 1)); + + return (subsector_t *)((uint8_t *)node - 1); +} + diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 9b960d48f..52e413278 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -3395,7 +3395,7 @@ DVector3 AActor::GetPortalTransition(double byoffset, sector_t **pSec) if (testz >= sec->GetPortalPlaneZ(sector_t::ceiling)) { pos = PosRelative(sec->GetOppositePortalGroup(sector_t::ceiling)); - sec = P_PointInSector(pos); + sec = Level->PointInSector(pos); moved = true; } else break; @@ -3407,7 +3407,7 @@ DVector3 AActor::GetPortalTransition(double byoffset, sector_t **pSec) if (testz < sec->GetPortalPlaneZ(sector_t::floor)) { pos = PosRelative(sec->GetOppositePortalGroup(sector_t::floor)); - sec = P_PointInSector(pos); + sec = Level->PointInSector(pos); } else break; } @@ -3430,7 +3430,7 @@ void AActor::CheckPortalTransition(bool islinked) if (islinked && !moved) UnlinkFromWorld(&ctx); SetXYZ(PosRelative(Sector->GetOppositePortalGroup(sector_t::ceiling))); Prev += Pos() - oldpos; - Sector = P_PointInSector(Pos()); + Sector = Level->PointInSector(Pos()); PrevPortalGroup = Sector->PortalGroup; moved = true; } @@ -3447,7 +3447,7 @@ void AActor::CheckPortalTransition(bool islinked) if (islinked && !moved) UnlinkFromWorld(&ctx); SetXYZ(PosRelative(Sector->GetOppositePortalGroup(sector_t::floor))); Prev += Pos() - oldpos; - Sector = P_PointInSector(Pos()); + Sector = Level->PointInSector(Pos()); PrevPortalGroup = Sector->PortalGroup; moved = true; } @@ -5340,7 +5340,7 @@ AActor *FLevelLocals::SpawnMapThing (FMapThing *mthing, int position) } else { - P_PointInSector (mthing->pos)->seqType = type; + PointInSector (mthing->pos)->seqType = type; } return NULL; } @@ -6176,7 +6176,7 @@ bool P_CheckMissileSpawn (AActor* th, double maxdist) newpos = th->Vec3Offset(newpos); th->SetXYZ(newpos); - th->Sector = P_PointInSector(th->Pos()); + th->Sector = th->Level->PointInSector(th->Pos()); FCheckPosition tm(!!(th->flags2 & MF2_RIP)); diff --git a/src/p_secnodes.cpp b/src/p_secnodes.cpp index 9f5554b7c..d7b2c1a64 100644 --- a/src/p_secnodes.cpp +++ b/src/p_secnodes.cpp @@ -415,7 +415,7 @@ void AActor::UpdateRenderSectorList() if (Top() + SPRITE_SPACE < planeh) break; lasth = planeh; DVector2 newpos = Pos() + sec->GetPortalDisplacement(sector_t::ceiling); - sec = P_PointInSector(newpos); + sec = sec->Level->PointInSector(newpos); touching_sectorportallist = P_AddSecnode(sec, this, touching_sectorportallist, sec->sectorportal_thinglist); } sec = Sector; @@ -427,7 +427,7 @@ void AActor::UpdateRenderSectorList() if (Z() - SPRITE_SPACE > planeh) break; lasth = planeh; DVector2 newpos = Pos() + sec->GetPortalDisplacement(sector_t::floor); - sec = P_PointInSector(newpos); + sec = sec->Level->PointInSector(newpos); touching_sectorportallist = P_AddSecnode(sec, this, touching_sectorportallist, sec->sectorportal_thinglist); } } diff --git a/src/p_sectors.cpp b/src/p_sectors.cpp index 6001a3fe3..1694652d5 100644 --- a/src/p_sectors.cpp +++ b/src/p_sectors.cpp @@ -941,7 +941,7 @@ double HighestCeilingAt(sector_t *check, double x, double y, sector_t **resultse { pos += check->GetPortalDisplacement(sector_t::ceiling); planeheight = check->GetPortalPlaneZ(sector_t::ceiling); - check = P_PointInSector(pos); + check = check->Level->PointInSector(pos); } if (resultsec) *resultsec = check; return check->ceilingplane.ZatPoint(pos); @@ -963,7 +963,7 @@ double LowestFloorAt(sector_t *check, double x, double y, sector_t **resultsec) { pos += check->GetPortalDisplacement(sector_t::floor); planeheight = check->GetPortalPlaneZ(sector_t::ceiling); - check = P_PointInSector(pos); + check = check->Level->PointInSector(pos); } if (resultsec) *resultsec = check; return check->floorplane.ZatPoint(pos); @@ -1012,7 +1012,7 @@ double NextHighestCeilingAt(sector_t *sec, double x, double y, double bottomz, d x += pos.X; y += pos.Y; planeheight = sec->GetPortalPlaneZ(sector_t::ceiling); - sec = P_PointInSector(x, y); + sec = sec->Level->PointInSector(x, y); } } } @@ -1061,7 +1061,7 @@ double NextLowestFloorAt(sector_t *sec, double x, double y, double z, int flags, x += pos.X; y += pos.Y; planeheight = sec->GetPortalPlaneZ(sector_t::floor); - sec = P_PointInSector(x, y); + sec = sec->Level->PointInSector(x, y); } } } diff --git a/src/p_sight.cpp b/src/p_sight.cpp index 41ecd23e8..0577f0d62 100644 --- a/src/p_sight.cpp +++ b/src/p_sight.cpp @@ -633,7 +633,7 @@ bool SightCheck::P_SightPathTraverse () y1 = sightstart.Y + Startfrac * Trace.dy; x2 = sightend.X; y2 = sightend.Y; - if (lastsector == NULL) lastsector = P_PointInSector(x1, y1); + if (lastsector == NULL) lastsector = Level->PointInSector(x1, y1); // for FF_SEETHROUGH the following rule applies: // If the viewer is in an area without FF_SEETHROUGH he can only see into areas without this flag diff --git a/src/p_switch.cpp b/src/p_switch.cpp index bfb8478a4..04bca2ca1 100644 --- a/src/p_switch.cpp +++ b/src/p_switch.cpp @@ -153,7 +153,7 @@ bool P_CheckSwitchRange(AActor *user, line_t *line, int sideno, const DVector3 * // if the polyobject lies directly on a sector boundary check.X = dll.x + dll.dx * (inter + 0.01); check.Y = dll.y + dll.dy * (inter + 0.01); - front = P_PointInSector(check); + front = line->GetLevel()->PointInSector(check); } else { diff --git a/src/p_teleport.cpp b/src/p_teleport.cpp index 63e5d3353..8bbdd7a61 100644 --- a/src/p_teleport.cpp +++ b/src/p_teleport.cpp @@ -107,7 +107,7 @@ bool P_Teleport (AActor *thing, DVector3 pos, DAngle angle, int flags) old = thing->Pos(); aboveFloor = thing->Z() - thing->floorz; - destsect = P_PointInSector (pos); + destsect = thing->Level->PointInSector (pos); // killough 5/12/98: exclude voodoo dolls: player = thing->player; if (player && player->mo != thing) diff --git a/src/p_trace.cpp b/src/p_trace.cpp index cdeb967f8..9fcecede5 100644 --- a/src/p_trace.cpp +++ b/src/p_trace.cpp @@ -117,7 +117,7 @@ static void GetPortalTransition(DVector3 &pos, sector_t *&sec) if (pos.Z > sec->GetPortalPlaneZ(sector_t::ceiling)) { pos += sec->GetPortalDisplacement(sector_t::ceiling); - sec = P_PointInSector(pos); + sec = sec->Level->PointInSector(pos); moved = true; } else break; @@ -129,7 +129,7 @@ static void GetPortalTransition(DVector3 &pos, sector_t *&sec) if (pos.Z <= sec->GetPortalPlaneZ(sector_t::floor)) { pos += sec->GetPortalDisplacement(sector_t::floor); - sec = P_PointInSector(pos); + sec = sec->Level->PointInSector(pos); } else break; } @@ -222,7 +222,7 @@ void FTraceInfo::EnterSectorPortal(FPathTraverse &pt, int position, double frac, DVector3 enter = exit + displacement; Start += displacement; - CurSector = P_PointInSector(enter); + CurSector = entersec->Level->PointInSector(enter); inshootthrough = true; startfrac = frac; EnterDist = enterdist; @@ -261,7 +261,7 @@ void FTraceInfo::EnterLinePortal(FPathTraverse &pt, intercept_t *in) P_TranslatePortalVXVY(li, Vec.X, Vec.Y); P_TranslatePortalZ(li, limitz); - CurSector = P_PointInSector(Start + enterdist * Vec); + CurSector = li->GetLevel()->PointInSector(Start + enterdist * Vec); EnterDist = enterdist; inshootthrough = true; startfrac = frac; @@ -1085,4 +1085,4 @@ ETraceStatus DLineTracer::CallZScriptCallback() } return TRACE_Stop; -} \ No newline at end of file +} diff --git a/src/p_user.cpp b/src/p_user.cpp index a5f129122..d4e20a79f 100644 --- a/src/p_user.cpp +++ b/src/p_user.cpp @@ -1263,7 +1263,6 @@ bool P_LerpCalculate(AActor *pmo, PredictPos from, PredictPos to, PredictPos &re DVector3 delta = vecResult - vecTo; result.pos = pmo->Vec3Offset(vecResult - to.pos); - //result.portalgroup = P_PointInSector(result.pos.x, result.pos.y)->PortalGroup; // As a fail safe, assume extrapolation is the threshold. return (delta.LengthSquared() > cl_predict_lerpthreshold && scale <= 1.00f); diff --git a/src/polyrenderer/scene/poly_portal.cpp b/src/polyrenderer/scene/poly_portal.cpp index ea9b2b949..c70d659ec 100644 --- a/src/polyrenderer/scene/poly_portal.cpp +++ b/src/polyrenderer/scene/poly_portal.cpp @@ -234,7 +234,7 @@ void PolyDrawLinePortal::SaveGlobals() } viewpoint.camera = nullptr; - viewpoint.sector = R_PointInSubsector(viewpoint.Pos)->sector; + viewpoint.sector = viewpoint.ViewLevel->PointInRenderSubsector(viewpoint.Pos)->sector; viewpoint.SetViewAngle(viewwindow); } diff --git a/src/portal.cpp b/src/portal.cpp index 128905bf7..ed321829c 100644 --- a/src/portal.cpp +++ b/src/portal.cpp @@ -1115,7 +1115,7 @@ bool FLevelLocals::CollectConnectedGroups(int startgroup, const DVector3 &positi } if (out.method != FPortalGroupArray::PGA_NoSectorPortals) { - sector_t *sec = P_PointInSector(position); + sector_t *sec = PointInSector(position); sector_t *wsec = sec; while (!wsec->PortalBlocksMovement(sector_t::ceiling) && upperz > wsec->GetPortalPlaneZ(sector_t::ceiling)) { @@ -1124,7 +1124,7 @@ bool FLevelLocals::CollectConnectedGroups(int startgroup, const DVector3 &positi if (processMask.getBit(othergroup)) break; processMask.setBit(othergroup); out.Add(othergroup | FPortalGroupArray::UPPER); - wsec = P_PointInSector(pos); // get upper sector at the exact spot we want to check and repeat + wsec = PointInSector(pos); // get upper sector at the exact spot we want to check and repeat retval = true; } wsec = sec; @@ -1135,7 +1135,7 @@ bool FLevelLocals::CollectConnectedGroups(int startgroup, const DVector3 &positi if (processMask.getBit(othergroup)) break; processMask.setBit(othergroup); out.Add(othergroup | FPortalGroupArray::LOWER); - wsec = P_PointInSector(pos); // get lower sector at the exact spot we want to check and repeat + wsec = PointInSector(pos); // get lower sector at the exact spot we want to check and repeat retval = true; } if (out.method == FPortalGroupArray::PGA_Full3d && PortalBlockmap.hasLinkedSectorPortals) diff --git a/src/r_defs.h b/src/r_defs.h index e22fd3f62..15d608c6c 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -1598,26 +1598,9 @@ typedef uint8_t lighttable_t; // This could be wider for >8 bit display. //---------------------------------------------------------------------------------- // -// The playsim can use different nodes than the renderer so this is -// not the same as R_PointInSubsector +// // //---------------------------------------------------------------------------------- -subsector_t *P_PointInSubsector(double x, double y); - -inline sector_t *P_PointInSector(const DVector2 &pos) -{ - return P_PointInSubsector(pos.X, pos.Y)->sector; -} - -inline sector_t *P_PointInSector(double X, double Y) -{ - return P_PointInSubsector(X, Y)->sector; -} - -inline sector_t *P_PointInSectorXY(double X, double Y) // This is for the benefit of unambiguously looking up this function's address -{ - return P_PointInSubsector(X, Y)->sector; -} inline bool FBoundingBox::inRange(const line_t *ld) const { diff --git a/src/r_utility.cpp b/src/r_utility.cpp index 89a631712..f7064149f 100644 --- a/src/r_utility.cpp +++ b/src/r_utility.cpp @@ -361,33 +361,6 @@ CUSTOM_CVAR (Int, screenblocks, 10, CVAR_ARCHIVE) R_SetViewSize (self); } -//========================================================================== -// -// R_PointInSubsector -// -//========================================================================== - -subsector_t *R_PointInSubsector (fixed_t x, fixed_t y) -{ - node_t *node; - int side; - - // single subsector is a special case - if (level.nodes.Size() == 0) - return &level.subsectors[0]; - - node = level.HeadNode(); - - do - { - side = R_PointOnSide (x, y, node); - node = (node_t *)node->children[side]; - } - while (!((size_t)node & 1)); - - return (subsector_t *)((uint8_t *)node - 1); -} - //========================================================================== // // @@ -450,8 +423,9 @@ void R_InterpolateView (FRenderViewpoint &viewpoint, player_t *player, double Fr NoInterpolateView = false; iview->Old = iview->New; } - int oldgroup = R_PointInSubsector(iview->Old.Pos)->sector->PortalGroup; - int newgroup = R_PointInSubsector(iview->New.Pos)->sector->PortalGroup; + auto Level = viewpoint.ViewLevel; + int oldgroup = Level->PointInRenderSubsector(iview->Old.Pos)->sector->PortalGroup; + int newgroup = Level->PointInRenderSubsector(iview->New.Pos)->sector->PortalGroup; DAngle oviewangle = iview->Old.Angles.Yaw; DAngle nviewangle = iview->New.Angles.Yaw; @@ -556,7 +530,7 @@ void R_InterpolateView (FRenderViewpoint &viewpoint, player_t *player, double Fr } // Due to interpolation this is not necessarily the same as the sector the camera is in. - viewpoint.sector = R_PointInSubsector(viewpoint.Pos)->sector; + viewpoint.sector = Level->PointInRenderSubsector(viewpoint.Pos)->sector; bool moved = false; while (!viewpoint.sector->PortalBlocksMovement(sector_t::ceiling)) { @@ -564,7 +538,7 @@ void R_InterpolateView (FRenderViewpoint &viewpoint, player_t *player, double Fr { viewpoint.Pos += viewpoint.sector->GetPortalDisplacement(sector_t::ceiling); viewpoint.ActorPos += viewpoint.sector->GetPortalDisplacement(sector_t::ceiling); - viewpoint.sector = R_PointInSubsector(viewpoint.Pos)->sector; + viewpoint.sector = Level->PointInRenderSubsector(viewpoint.Pos)->sector; moved = true; } else break; @@ -577,7 +551,7 @@ void R_InterpolateView (FRenderViewpoint &viewpoint, player_t *player, double Fr { viewpoint.Pos += viewpoint.sector->GetPortalDisplacement(sector_t::floor); viewpoint.ActorPos += viewpoint.sector->GetPortalDisplacement(sector_t::floor); - viewpoint.sector = R_PointInSubsector(viewpoint.Pos)->sector; + viewpoint.sector = Level->PointInRenderSubsector(viewpoint.Pos)->sector; moved = true; } else break; @@ -771,6 +745,7 @@ void R_SetupFrame (FRenderViewpoint &viewpoint, FViewWindow &viewwindow, AActor { I_Error ("Tried to render from a NULL actor."); } + viewpoint.ViewLevel = actor->Level; player_t *player = actor->player; unsigned int newblend; @@ -807,7 +782,7 @@ void R_SetupFrame (FRenderViewpoint &viewpoint, FViewWindow &viewwindow, AActor if (player != NULL && gamestate != GS_TITLELEVEL && ((player->cheats & CF_CHASECAM) || (r_deathcamera && viewpoint.camera->health <= 0))) { - sector_t *oldsector = R_PointInSubsector(iview->Old.Pos)->sector; + sector_t *oldsector = viewpoint.ViewLevel->PointInRenderSubsector(iview->Old.Pos)->sector; // [RH] Use chasecam view DVector3 campos; DAngle camangle; @@ -1032,7 +1007,6 @@ void R_SetupFrame (FRenderViewpoint &viewpoint, FViewWindow &viewwindow, AActor viewpoint.HWAngles.Pitch = RAD2DEG((float)asin(angy / alen)); viewpoint.HWAngles.Roll.Degrees = (float)viewpoint.Angles.Roll.Degrees; // copied for convenience. - viewpoint.ViewLevel = actor->Level; // ViewActor only gets set, if the camera actor should not be rendered if (actor->player && actor->player - players == consoleplayer && diff --git a/src/r_utility.h b/src/r_utility.h index 53218615f..bdc9aea17 100644 --- a/src/r_utility.h +++ b/src/r_utility.h @@ -111,12 +111,6 @@ struct DVector3a DAngle angle; }; - -subsector_t *R_PointInSubsector (fixed_t x, fixed_t y); -inline subsector_t *R_PointInSubsector(const DVector2 &pos) -{ - return R_PointInSubsector(FLOAT2FIXED(pos.X), FLOAT2FIXED(pos.Y)); -} void R_ResetViewInterpolation (); void R_RebuildViewInterpolation(player_t *player); bool R_GetViewInterpolationStatus(); diff --git a/src/s_sound.cpp b/src/s_sound.cpp index 606fcd71e..7179b8bbe 100644 --- a/src/s_sound.cpp +++ b/src/s_sound.cpp @@ -704,7 +704,7 @@ static void CalcPosVel(int type, const AActor *actor, const sector_t *sector, // on static analysis. if(type == SOURCE_Unattached) { - sector_t *sec = P_PointInSector(pt[0], pt[2]); + sector_t *sec = currentUILevel->PointInSector(pt[0], pt[2]); DVector2 disp = currentUILevel->Displacements.getOffset(pgroup, sec->PortalGroup); pos->X = pt[0] - (float)disp.X; pos->Y = !(chanflags & CHAN_LISTENERZ) ? pt[1] : (float)listenpos.Z; @@ -851,7 +851,7 @@ static void CalcSectorSoundOrg(const DVector3 &listenpos, const sector_t *sec, i if (!(i_compatflags & COMPATF_SECTORSOUNDS)) { // Are we inside the sector? If yes, the closest point is the one we're on. - if (P_PointInSector(listenpos.X, listenpos.Y) == sec) + if (currentUILevel->PointInSector(listenpos.X, listenpos.Y) == sec) { pos.X = (float)listenpos.X; pos.Z = (float)listenpos.Y; diff --git a/src/scripting/vmthunks.cpp b/src/scripting/vmthunks.cpp index bb3a8918e..ee66b957f 100644 --- a/src/scripting/vmthunks.cpp +++ b/src/scripting/vmthunks.cpp @@ -657,22 +657,27 @@ DEFINE_ACTION_FUNCTION_NATIVE(_Sector, RemoveForceField, RemoveForceField) return 0; } - DEFINE_ACTION_FUNCTION_NATIVE(_Sector, PointInSector, P_PointInSectorXY) - { - PARAM_PROLOGUE; - PARAM_FLOAT(x); - PARAM_FLOAT(y); - ACTION_RETURN_POINTER(P_PointInSector(x, y)); - } +static sector_t *PointInSectorXY(FLevelLocals *self, double x, double y) +{ + return self->PointInSector(x ,y); +} - static void SetXOffset(sector_t *self, int pos, double o) - { - self->SetXOffset(pos, o); - } +DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, PointInSector, PointInSectorXY) +{ + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); + PARAM_FLOAT(x); + PARAM_FLOAT(y); + ACTION_RETURN_POINTER(PointInSectorXY(self, x, y)); +} - DEFINE_ACTION_FUNCTION_NATIVE(_Sector, SetXOffset, SetXOffset) - { - PARAM_SELF_STRUCT_PROLOGUE(sector_t); +static void SetXOffset(sector_t *self, int pos, double o) +{ + self->SetXOffset(pos, o); +} + +DEFINE_ACTION_FUNCTION_NATIVE(_Sector, SetXOffset, SetXOffset) +{ + PARAM_SELF_STRUCT_PROLOGUE(sector_t); PARAM_INT(pos); PARAM_FLOAT(o); self->SetXOffset(pos, o); diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index f0f81d5b6..49e77fb0d 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -714,7 +714,13 @@ struct LevelLocals native native int isFrozen(); native void setFrozen(bool on); - native static clearscope bool IsPointInMap(vector3 p); + native clearscope Sector PointInSector(Vector2 pt); + + native clearscope bool IsPointInLevel(vector3 p); + deprecated("3.8") clearscope static bool IsPointInMap(vector3 p) + { + return level.IsPointInLevel(p); + } native static clearscope vector2 Vec2Diff(vector2 v1, vector2 v2); native static clearscope vector3 Vec3Diff(vector3 v1, vector3 v2); diff --git a/wadsrc/static/zscript/mapdata.txt b/wadsrc/static/zscript/mapdata.txt index 9d056ffed..4a1154feb 100644 --- a/wadsrc/static/zscript/mapdata.txt +++ b/wadsrc/static/zscript/mapdata.txt @@ -368,7 +368,10 @@ struct Sector native play native double, Sector, F3DFloor NextLowestFloorAt(double x, double y, double z, int flags = 0, double steph = 0); native void RemoveForceField(); - native static clearscope Sector PointInSector(Vector2 pt); + deprecated("3.8") static clearscope Sector PointInSector(Vector2 pt) + { + return level.PointInSector(pt); + } native bool PlaneMoving(int pos); native int GetFloorLight(); diff --git a/wadsrc/static/zscript/statusbar/alt_hud.txt b/wadsrc/static/zscript/statusbar/alt_hud.txt index 93b21cdda..7fd694c98 100644 --- a/wadsrc/static/zscript/statusbar/alt_hud.txt +++ b/wadsrc/static/zscript/statusbar/alt_hud.txt @@ -735,7 +735,7 @@ class AltHud ui else { pos.xy = currentUILevel.GetAutomapPosition(); - pos.z = Sector.PointInSector(pos.xy).floorplane.ZatPoint(pos.xy); + pos.z = currentUILevel.PointInSector(pos.xy).floorplane.ZatPoint(pos.xy); } int xpos = hudwidth - SmallFont.StringWidth("X: -00000")-6; diff --git a/wadsrc/static/zscript/strife/weapongrenade.txt b/wadsrc/static/zscript/strife/weapongrenade.txt index dc0958a64..9b0db47da 100644 --- a/wadsrc/static/zscript/strife/weapongrenade.txt +++ b/wadsrc/static/zscript/strife/weapongrenade.txt @@ -296,7 +296,7 @@ class PhosphorousFire : Actor Vector2 newpos = Vec2Offset(xofs, yofs); - Sector sec = Sector.PointInSector(newpos); + Sector sec = Level.PointInSector(newpos); // Consider portals and 3D floors instead of just using the current sector's z. double floorh = sec.NextLowestFloorAt(newpos.x, newpos.y, pos.z+4, 0, MaxStepHeight); From f9239f6e0f9c0e57a489c862bb2b0e52a2f01c80 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 29 Jan 2019 02:04:31 +0100 Subject: [PATCH 072/164] - added a compiler-side workaround for the formerly static methods of FLevelLocals. LevelLocals on the left side of.a function call will now always be remapped to 'Level', which will either remap to the same-named instance variable or the global deprecated one. In a few degenerate cases where there is a conflicting local variable named 'level' it may error out but that is unavoidable here but this is very unlikely. --- src/b_game.cpp | 8 -- src/g_level.cpp | 82 ++----------- src/namedef.h | 6 +- src/scripting/vmthunks.cpp | 116 ++++++++++++++++-- src/scripting/zscript/zcc_compile.cpp | 11 +- src/scripting/zscript/zcc_compile.h | 2 +- wadsrc/static/zscript/base.txt | 18 +-- .../static/zscript/statscreen/statscreen.txt | 6 - 8 files changed, 132 insertions(+), 117 deletions(-) diff --git a/src/b_game.cpp b/src/b_game.cpp index 58f78424d..3dd90d224 100644 --- a/src/b_game.cpp +++ b/src/b_game.cpp @@ -654,11 +654,3 @@ ADD_STAT (bots) BotWTG); return out; } - -DEFINE_ACTION_FUNCTION(FLevelLocals, RemoveAllBots) -{ - PARAM_PROLOGUE; - PARAM_BOOL(fromlist); - bglobal.RemoveAllBots(fromlist); - return 0; -} diff --git a/src/g_level.cpp b/src/g_level.cpp index a6a6efa29..940b912b3 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1151,6 +1151,13 @@ void FLevelLocals::WorldDone (void) gameaction = ga_worlddone; + + //Added by mc + if (deathmatch) + { + bglobal.RemoveAllBots(consoleplayer != Net_Arbitrator); + } + if (flags & LEVEL_CHANGEMAPCHEAT) return; @@ -2105,81 +2112,6 @@ int IsPointInMap(FLevelLocals *Level, double x, double y, double z) return true; } -DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, IsPointInLevel, IsPointInMap) -{ - PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); - PARAM_FLOAT(x); - PARAM_FLOAT(y); - PARAM_FLOAT(z); - ACTION_RETURN_BOOL(IsPointInMap(self, x, y, z)); -} - -template -inline T VecDiff(const T& v1, const T& v2) -{ - T result = v2 - v1; - - if (level.subsectors.Size() > 0) - { - const sector_t *const sec1 = level.PointInSector(v1); - const sector_t *const sec2 = level.PointInSector(v2); - - if (nullptr != sec1 && nullptr != sec2) - { - result += level.Displacements.getOffset(sec2->PortalGroup, sec1->PortalGroup); - } - } - - return result; -} - -DEFINE_ACTION_FUNCTION(FLevelLocals, Vec2Diff) -{ - PARAM_PROLOGUE; - PARAM_FLOAT(x1); - PARAM_FLOAT(y1); - PARAM_FLOAT(x2); - PARAM_FLOAT(y2); - ACTION_RETURN_VEC2(VecDiff(DVector2(x1, y1), DVector2(x2, y2))); -} - -DEFINE_ACTION_FUNCTION(FLevelLocals, Vec3Diff) -{ - PARAM_PROLOGUE; - PARAM_FLOAT(x1); - PARAM_FLOAT(y1); - PARAM_FLOAT(z1); - PARAM_FLOAT(x2); - PARAM_FLOAT(y2); - PARAM_FLOAT(z2); - ACTION_RETURN_VEC3(VecDiff(DVector3(x1, y1, z1), DVector3(x2, y2, z2))); -} - -DEFINE_ACTION_FUNCTION(FLevelLocals, SphericalCoords) -{ - PARAM_PROLOGUE; - PARAM_FLOAT(viewpointX); - PARAM_FLOAT(viewpointY); - PARAM_FLOAT(viewpointZ); - PARAM_FLOAT(targetX); - PARAM_FLOAT(targetY); - PARAM_FLOAT(targetZ); - PARAM_ANGLE(viewYaw); - PARAM_ANGLE(viewPitch); - PARAM_BOOL(absolute); - - DVector3 viewpoint(viewpointX, viewpointY, viewpointZ); - DVector3 target(targetX, targetY, targetZ); - auto vecTo = absolute ? target - viewpoint : VecDiff(viewpoint, target); - - ACTION_RETURN_VEC3(DVector3( - deltaangle(vecTo.Angle(), viewYaw).Degrees, - deltaangle(vecTo.Pitch(), viewPitch).Degrees, - vecTo.Length() - )); -} - - //========================================================================== // // Lists all currently defined maps diff --git a/src/namedef.h b/src/namedef.h index 8e1aaceda..11a285079 100644 --- a/src/namedef.h +++ b/src/namedef.h @@ -1075,4 +1075,8 @@ xx(lightflags) xx(lighttype) xx(InternalDynamicLight) xx(_a_chase_default) -xx(MapMarker) \ No newline at end of file +xx(MapMarker) +xx(Spawn2) +xx(globalfreeze) +xx(LevelLocals) +xx(Level) diff --git a/src/scripting/vmthunks.cpp b/src/scripting/vmthunks.cpp index ee66b957f..9e5b435d2 100644 --- a/src/scripting/vmthunks.cpp +++ b/src/scripting/vmthunks.cpp @@ -2607,7 +2607,7 @@ DEFINE_ACTION_FUNCTION(FLevelLocals, GetChecksum) ACTION_RETURN_STRING((const char*)md5string); } -static void Vec2Offset(double x, double y, double dx, double dy, bool absolute, DVector2 *result) +static void Vec2Offset(FLevelLocals *Level, double x, double y, double dx, double dy, bool absolute, DVector2 *result) { if (absolute) { @@ -2615,24 +2615,24 @@ static void Vec2Offset(double x, double y, double dx, double dy, bool absolute, } else { - *result = level.GetPortalOffsetPosition(x, y, dx, dy); + *result = Level->GetPortalOffsetPosition(x, y, dx, dy); } } DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, Vec2Offset, Vec2Offset) { - PARAM_PROLOGUE; + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); PARAM_FLOAT(x); PARAM_FLOAT(y); PARAM_FLOAT(dx); PARAM_FLOAT(dy); PARAM_BOOL(absolute); DVector2 result; - Vec2Offset(x, y, dx, dy, absolute, &result); + Vec2Offset(self, x, y, dx, dy, absolute, &result); ACTION_RETURN_VEC2(result); } -static void Vec2OffsetZ(double x, double y, double dx, double dy, double atz, bool absolute, DVector3 *result) +static void Vec2OffsetZ(FLevelLocals *Level, double x, double y, double dx, double dy, double atz, bool absolute, DVector3 *result) { if (absolute) { @@ -2647,7 +2647,7 @@ static void Vec2OffsetZ(double x, double y, double dx, double dy, double atz, bo DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, Vec2OffsetZ, Vec2OffsetZ) { - PARAM_PROLOGUE; + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); PARAM_FLOAT(x); PARAM_FLOAT(y); PARAM_FLOAT(dx); @@ -2655,11 +2655,11 @@ DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, Vec2OffsetZ, Vec2OffsetZ) PARAM_FLOAT(atz); PARAM_BOOL(absolute); DVector3 result; - Vec2OffsetZ(x, y, dx, dy, atz, absolute, &result); + Vec2OffsetZ(self, x, y, dx, dy, atz, absolute, &result); ACTION_RETURN_VEC3(result); } -static void Vec3Offset(double x, double y, double z, double dx, double dy, double dz, bool absolute, DVector3 *result) +static void Vec3Offset(FLevelLocals *Level, double x, double y, double z, double dx, double dy, double dz, bool absolute, DVector3 *result) { if (absolute) { @@ -2667,14 +2667,14 @@ static void Vec3Offset(double x, double y, double z, double dx, double dy, doubl } else { - DVector2 v = level.GetPortalOffsetPosition(x, y, dx, dy); + DVector2 v = Level->GetPortalOffsetPosition(x, y, dx, dy); *result = (DVector3(v, z + dz)); } } DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, Vec3Offset, Vec3Offset) { - PARAM_PROLOGUE; + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); PARAM_FLOAT(x); PARAM_FLOAT(y); PARAM_FLOAT(z); @@ -2683,10 +2683,104 @@ DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, Vec3Offset, Vec3Offset) PARAM_FLOAT(dz); PARAM_BOOL(absolute); DVector3 result; - Vec3Offset(x, y, z, dx, dy, dz, absolute, &result); + Vec3Offset(self, x, y, z, dx, dy, dz, absolute, &result); ACTION_RETURN_VEC3(result); } +int IsPointInMap(FLevelLocals *Level, double x, double y, double z); + +DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, IsPointInLevel, IsPointInMap) +{ + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); + PARAM_FLOAT(x); + PARAM_FLOAT(y); + PARAM_FLOAT(z); + ACTION_RETURN_BOOL(IsPointInMap(self, x, y, z)); +} + +template +inline T VecDiff(FLevelLocals *Level, const T& v1, const T& v2) +{ + T result = v2 - v1; + + if (Level->subsectors.Size() > 0) + { + const sector_t * sec1 = Level->PointInSector(v1); + const sector_t * sec2 = Level->PointInSector(v2); + + if (nullptr != sec1 && nullptr != sec2) + { + result += Level->Displacements.getOffset(sec2->PortalGroup, sec1->PortalGroup); + } + } + + return result; +} + +void Vec2Diff(FLevelLocals *Level, double x1, double y1, double x2, double y2, DVector2 *result) +{ + *result = VecDiff(Level, DVector2(x1, y1), DVector2(x2, y2)); +} + +DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, Vec2Diff, Vec2Diff) +{ + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); + PARAM_FLOAT(x1); + PARAM_FLOAT(y1); + PARAM_FLOAT(x2); + PARAM_FLOAT(y2); + ACTION_RETURN_VEC2(VecDiff(self, DVector2(x1, y1), DVector2(x2, y2))); +} + +void Vec3Diff(FLevelLocals *Level, double x1, double y1, double z1, double x2, double y2, double z2, DVector3 *result) +{ + *result = VecDiff(Level, DVector3(x1, y1, z1), DVector3(x2, y2, z2)); +} + +DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, Vec3Diff, Vec3Diff) +{ + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); + PARAM_FLOAT(x1); + PARAM_FLOAT(y1); + PARAM_FLOAT(z1); + PARAM_FLOAT(x2); + PARAM_FLOAT(y2); + PARAM_FLOAT(z2); + ACTION_RETURN_VEC3(VecDiff(self, DVector3(x1, y1, z1), DVector3(x2, y2, z2))); +} + +void SphericalCoords(FLevelLocals *self, double vpX, double vpY, double vpZ, double tX, double tY, double tZ, double viewYaw, double viewPitch, int absolute, DVector3 *result) +{ + + DVector3 viewpoint(vpX, vpY, vpZ); + DVector3 target(tX, tY, tZ); + auto vecTo = absolute ? target - viewpoint : VecDiff(self, viewpoint, target); + + *result = (DVector3( + deltaangle(vecTo.Angle(), viewYaw).Degrees, + deltaangle(vecTo.Pitch(), viewPitch).Degrees, + vecTo.Length() + )); + +} +DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, SphericalCoords, SphericalCoords) +{ + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); + PARAM_FLOAT(viewpointX); + PARAM_FLOAT(viewpointY); + PARAM_FLOAT(viewpointZ); + PARAM_FLOAT(targetX); + PARAM_FLOAT(targetY); + PARAM_FLOAT(targetZ); + PARAM_FLOAT(viewYaw); + PARAM_FLOAT(viewPitch); + PARAM_BOOL(absolute); + DVector3 result; + SphericalCoords(self, viewpointX, viewpointY, viewpointZ, targetX, targetY, targetZ, viewYaw, viewpointZ, absolute, &result); + ACTION_RETURN_VEC3(result); +} + + static int isFrozen(FLevelLocals *self) { return self->isFrozen(); diff --git a/src/scripting/zscript/zcc_compile.cpp b/src/scripting/zscript/zcc_compile.cpp index c963c0dd1..53362669c 100644 --- a/src/scripting/zscript/zcc_compile.cpp +++ b/src/scripting/zscript/zcc_compile.cpp @@ -3290,12 +3290,10 @@ static FxExpression *ModifyAssign(FxBinary *operation, FxExpression *left) // //========================================================================== -FxExpression *ZCCCompiler::ConvertNode(ZCC_TreeNode *ast) +FxExpression *ZCCCompiler::ConvertNode(ZCC_TreeNode *ast, bool substitute) { if (ast == nullptr) return nullptr; - // Note: Do not call 'Simplify' here because that function tends to destroy identifiers due to lack of context in which to resolve them. - // The Fx nodes created here will be better suited for that. switch (ast->NodeType) { case AST_ExprFuncCall: @@ -3317,7 +3315,7 @@ FxExpression *ZCCCompiler::ConvertNode(ZCC_TreeNode *ast) case AST_ExprMemberAccess: { auto ema = static_cast(fcall->Function); - return new FxMemberFunctionCall(ConvertNode(ema->Left), ema->Right, ConvertNodeList(args, fcall->Parameters), *ast); + return new FxMemberFunctionCall(ConvertNode(ema->Left, true), ema->Right, ConvertNodeList(args, fcall->Parameters), *ast); } case AST_ExprBinary: @@ -3382,8 +3380,9 @@ FxExpression *ZCCCompiler::ConvertNode(ZCC_TreeNode *ast) case AST_ExprID: { - auto id = static_cast(ast); - return new FxIdentifier(id->Identifier, *ast); + auto id = static_cast(ast)->Identifier; + if (id == NAME_LevelLocals && substitute) id = NAME_Level; // All static methods of FLevelLocals are now non-static so remap the name right here before passing it to the backend. + return new FxIdentifier(id, *ast); } case AST_ExprConstant: diff --git a/src/scripting/zscript/zcc_compile.h b/src/scripting/zscript/zcc_compile.h index 3a107ecfd..15497f7f6 100644 --- a/src/scripting/zscript/zcc_compile.h +++ b/src/scripting/zscript/zcc_compile.h @@ -146,7 +146,7 @@ private: void MessageV(ZCC_TreeNode *node, const char *txtcolor, const char *msg, va_list argptr); FxExpression *ConvertAST(PContainerType *cclass, ZCC_TreeNode *ast); - FxExpression *ConvertNode(ZCC_TreeNode *node); + FxExpression *ConvertNode(ZCC_TreeNode *node, bool substitute= false); FxExpression *ConvertImplicitScopeNode(ZCC_TreeNode *node, ZCC_Statement *nested); FArgumentList &ConvertNodeList(FArgumentList &, ZCC_TreeNode *head); diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index 49e77fb0d..580bd8dbb 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -694,10 +694,10 @@ struct LevelLocals native native int GetUDMFInt(int type, int index, Name key); native double GetUDMFFloat(int type, int index, Name key); native int ExecuteSpecial(int special, Actor activator, line linedef, bool lineside, int arg1 = 0, int arg2 = 0, int arg3 = 0, int arg4 = 0, int arg5 = 0); - native static void GiveSecret(Actor activator, bool printmsg = true, bool playsound = true); - native static void StartSlideshow(Name whichone = 'none'); + native void GiveSecret(Actor activator, bool printmsg = true, bool playsound = true); + native void StartSlideshow(Name whichone = 'none'); native void WorldDone(); - native static void RemoveAllBots(bool fromlist); + deprecated("3.8") native static void RemoveAllBots(bool fromlist) { /* intentionally left as no-op. */ } native ui Vector2 GetAutomapPosition(); native void SetInterMusic(String nextmap); native String FormatMapName(int mapnamecolor); @@ -722,13 +722,13 @@ struct LevelLocals native return level.IsPointInLevel(p); } - native static clearscope vector2 Vec2Diff(vector2 v1, vector2 v2); - native static clearscope vector3 Vec3Diff(vector3 v1, vector3 v2); - native static clearscope vector3 SphericalCoords(vector3 viewpoint, vector3 targetPos, vector2 viewAngles = (0, 0), bool absolute = false); + native clearscope vector2 Vec2Diff(vector2 v1, vector2 v2); + native clearscope vector3 Vec3Diff(vector3 v1, vector3 v2); + native clearscope vector3 SphericalCoords(vector3 viewpoint, vector3 targetPos, vector2 viewAngles = (0, 0), bool absolute = false); - native static clearscope vector2 Vec2Offset(vector2 pos, vector2 dir, bool absolute = false); - native static clearscope vector3 Vec2OffsetZ(vector2 pos, vector2 dir, double atz, bool absolute = false); - native static clearscope vector3 Vec3Offset(vector3 pos, vector3 dir, bool absolute = false); + native clearscope vector2 Vec2Offset(vector2 pos, vector2 dir, bool absolute = false); + native clearscope vector3 Vec2OffsetZ(vector2 pos, vector2 dir, double atz, bool absolute = false); + native clearscope vector3 Vec3Offset(vector3 pos, vector3 dir, bool absolute = false); native String GetChecksum() const; diff --git a/wadsrc/static/zscript/statscreen/statscreen.txt b/wadsrc/static/zscript/statscreen/statscreen.txt index 552f2112b..084d9a256 100644 --- a/wadsrc/static/zscript/statscreen/statscreen.txt +++ b/wadsrc/static/zscript/statscreen/statscreen.txt @@ -403,12 +403,6 @@ class StatusScreen abstract play version("2.5") virtual void End () { CurState = LeavingIntermission; - - //Added by mc - if (deathmatch) - { - currentUILevel.RemoveAllBots (consoleplayer != Net_Arbitrator); - } } //==================================================================== From 87859b2950931a2d6692dc2d6115ddba6559dec7 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 29 Jan 2019 02:08:53 +0100 Subject: [PATCH 073/164] - add Level parameter to G_LeavingHub --- src/g_hub.cpp | 18 +++++++++--------- src/g_hub.h | 2 +- src/g_level.cpp | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/g_hub.cpp b/src/g_hub.cpp index 3cac5b17f..677b99160 100644 --- a/src/g_hub.cpp +++ b/src/g_hub.cpp @@ -76,7 +76,7 @@ struct FHubInfo static TArray hubdata; -void G_LeavingHub(int mode, cluster_info_t * cluster, wbstartstruct_t * wbs) +void G_LeavingHub(FLevelLocals *Level, int mode, cluster_info_t * cluster, wbstartstruct_t * wbs) { unsigned int i, j; @@ -84,7 +84,7 @@ void G_LeavingHub(int mode, cluster_info_t * cluster, wbstartstruct_t * wbs) { for (i = 0; i < hubdata.Size(); i++) { - if (hubdata[i].levelnum == level.levelnum) + if (hubdata[i].levelnum == Level->levelnum) { hubdata[i] = *wbs; break; @@ -95,13 +95,13 @@ void G_LeavingHub(int mode, cluster_info_t * cluster, wbstartstruct_t * wbs) hubdata[hubdata.Reserve(1)] = *wbs; } - hubdata[i].levelnum = level.levelnum; + hubdata[i].levelnum = Level->levelnum; if (!multiplayer && !deathmatch) { // The player counters don't work in hubs - hubdata[i].plyr[0].skills = level.killed_monsters; - hubdata[i].plyr[0].sitems = level.found_items; - hubdata[i].plyr[0].ssecret = level.found_secrets; + hubdata[i].plyr[0].skills = Level->killed_monsters; + hubdata[i].plyr[0].sitems = Level->found_items; + hubdata[i].plyr[0].ssecret = Level->found_secrets; } @@ -129,11 +129,11 @@ void G_LeavingHub(int mode, cluster_info_t * cluster, wbstartstruct_t * wbs) { if (cluster->flags & CLUSTER_LOOKUPNAME) { - level.LevelName = GStrings(cluster->ClusterName); + Level->LevelName = GStrings(cluster->ClusterName); } else { - level.LevelName = cluster->ClusterName; + Level->LevelName = cluster->ClusterName; } } } @@ -185,4 +185,4 @@ void G_SerializeHub(FSerializer &arc) void G_ClearHubInfo() { hubdata.Clear(); -} \ No newline at end of file +} diff --git a/src/g_hub.h b/src/g_hub.h index 372546b83..bc7c89df3 100644 --- a/src/g_hub.h +++ b/src/g_hub.h @@ -6,7 +6,7 @@ struct wbstartstruct_t; class FSerializer; void G_SerializeHub (FSerializer &file); -void G_LeavingHub(int mode, cluster_info_t * cluster, struct wbstartstruct_t * wbs); +void G_LeavingHub(FLevelLocals *Level, int mode, cluster_info_t * cluster, struct wbstartstruct_t * wbs); #endif diff --git a/src/g_level.cpp b/src/g_level.cpp index 940b912b3..19052d44f 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -855,7 +855,7 @@ void G_DoCompleted (void) } // Intermission stats for entire hubs - G_LeavingHub(mode, thiscluster, &wminfo); + G_LeavingHub(&level, mode, thiscluster, &wminfo); for (i = 0; i < MAXPLAYERS; i++) { From 1d748b72a8e8058bfa7c9a9787c48862addcdc8d Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 29 Jan 2019 02:39:14 +0100 Subject: [PATCH 074/164] Split G_DoCompleted into a global part and a level specific part. --- src/d_event.h | 2 +- src/g_game.cpp | 4 -- src/g_level.cpp | 123 +++++++++++++++++++++++--------------------- src/g_level.h | 2 +- src/g_levellocals.h | 2 + 5 files changed, 67 insertions(+), 66 deletions(-) diff --git a/src/d_event.h b/src/d_event.h index b751155df..302ef1aac 100644 --- a/src/d_event.h +++ b/src/d_event.h @@ -59,7 +59,7 @@ struct event_t enum gameaction_t : int { ga_nothing, - ga_loadlevel, + ga_loadlevel, // not used. ga_newgame, ga_newgame2, ga_recordgame, diff --git a/src/g_game.cpp b/src/g_game.cpp index 1926c9338..ff06e184f 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -1037,9 +1037,6 @@ void G_Ticker () } switch (gameaction) { - case ga_loadlevel: - G_DoLoadLevel (-1, false, false); - break; case ga_recordgame: G_CheckDemoStatus(); G_RecordDemo(newdemoname); @@ -1624,7 +1621,6 @@ void FLevelLocals::DoReborn (int playernum, bool freshbot) BackupSaveName = ""; G_InitNew (level.MapName, false); demoplayback = indemo; -// gameaction = ga_loadlevel; } } else diff --git a/src/g_level.cpp b/src/g_level.cpp index 19052d44f..0017d9334 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -538,7 +538,6 @@ void G_InitNew (const char *mapname, bool bTitleLevel) bglobal.Init (); } - level.MapName = mapname; if (bTitleLevel) { gamestate = GS_TITLELEVEL; @@ -548,7 +547,7 @@ void G_InitNew (const char *mapname, bool bTitleLevel) gamestate = GS_LEVEL; } - G_DoLoadLevel (0, false, !savegamerestore); + G_DoLoadLevel (mapname, 0, false, !savegamerestore); } // @@ -746,47 +745,63 @@ void G_SecretExitLevel (int position) // //========================================================================== -void G_DoCompleted (void) +void G_DoCompleted (void) { - int i; - gameaction = ga_nothing; - + if ( gamestate == GS_DEMOSCREEN || gamestate == GS_FULLCONSOLE || gamestate == GS_STARTUP) { return; } - + if (gamestate == GS_TITLELEVEL) { - level.MapName = nextlevel; - G_DoLoadLevel (startpos, false, false); + G_DoLoadLevel (nextlevel, startpos, false, false); startpos = 0; viewactive = true; return; } - - // [RH] Mark this level as having been visited - if (!(level.flags & LEVEL_CHANGEMAPCHEAT)) - FindLevelInfo (level.MapName)->flags |= LEVEL_VISITED; - + if (automapactive) AM_Stop (); - + // Close the conversation menu if open. P_FreeStrifeConversations (); - wminfo.finished_ep = level.cluster - 1; - wminfo.LName0 = TexMan.CheckForTexture(level.info->PName, ETextureType::MiscPatch); - wminfo.current = level.MapName; + if (level.DoCompleted(nextlevel, wminfo)) + { + gamestate = GS_INTERMISSION; + viewactive = false; + automapactive = false; + + // [RH] If you ever get a statistics driver operational, adapt this. + // if (statcopy) + // memcpy (statcopy, &wminfo, sizeof(wminfo)); + + WI_Start (&wminfo); + } +} + + +bool FLevelLocals::DoCompleted (FString nextlevel, wbstartstruct_t &wminfo) +{ + int i; + + // [RH] Mark this level as having been visited + if (!(flags & LEVEL_CHANGEMAPCHEAT)) + FindLevelInfo (MapName)->flags |= LEVEL_VISITED; + + wminfo.finished_ep = cluster - 1; + wminfo.LName0 = TexMan.CheckForTexture(info->PName, ETextureType::MiscPatch); + wminfo.current = MapName; if (deathmatch && (dmflags & DF_SAME_LEVEL) && - !(level.flags & LEVEL_CHANGEMAPCHEAT)) + !(flags & LEVEL_CHANGEMAPCHEAT)) { - wminfo.next = level.MapName; + wminfo.next = MapName; wminfo.LName1 = wminfo.LName0; } else @@ -808,32 +823,31 @@ void G_DoCompleted (void) nextlevel = wminfo.next; wminfo.next_ep = FindLevelInfo (wminfo.next)->cluster - 1; - wminfo.maxkills = level.total_monsters; - wminfo.maxitems = level.total_items; - wminfo.maxsecret = level.total_secrets; + wminfo.maxkills = total_monsters; + wminfo.maxitems = total_items; + wminfo.maxsecret = total_secrets; wminfo.maxfrags = 0; - wminfo.partime = TICRATE * level.partime; - wminfo.sucktime = level.sucktime; + wminfo.partime = TICRATE * partime; + wminfo.sucktime = sucktime; wminfo.pnum = consoleplayer; - wminfo.totaltime = level.totaltime; + wminfo.totaltime = totaltime; for (i=0 ; iSnapshot.Clean(); + info->Snapshot.Clean(); } } else @@ -887,30 +901,21 @@ void G_DoCompleted (void) { // Reset world variables for the new hub. P_ClearACSVars(false); } - level.time = 0; - level.maptime = 0; - level.spawnindex = 0; + time = 0; + maptime = 0; + spawnindex = 0; } finishstate = mode; if (!deathmatch && - ((level.flags & LEVEL_NOINTERMISSION) || + ((flags & LEVEL_NOINTERMISSION) || ((nextcluster == thiscluster) && (thiscluster->flags & CLUSTER_HUB) && !(thiscluster->flags & CLUSTER_ALLOWINTERMISSION)))) { - level.WorldDone (); - return; + WorldDone (); + return false; } - - gamestate = GS_INTERMISSION; - viewactive = false; - automapactive = false; - -// [RH] If you ever get a statistics driver operational, adapt this. -// if (statcopy) -// memcpy (statcopy, &wminfo, sizeof(wminfo)); - - WI_Start (&wminfo); + return true; } //========================================================================== @@ -942,8 +947,9 @@ void DAutosaver::Tick () extern gamestate_t wipegamestate; -void G_DoLoadLevel (int position, bool autosave, bool newGame) -{ +void G_DoLoadLevel (const FString &nextmapname, int position, bool autosave, bool newGame) +{ + level.MapName = nextmapname; static int lastposition = 0; gamestate_t oldgs = gamestate; int i; @@ -1277,13 +1283,10 @@ void G_DoWorldDone (void) { // Don't crash if no next map is given. Just repeat the current one. Printf ("No next map specified.\n"); - } - else - { - level.MapName = nextlevel; + nextlevel = level.MapName; } G_StartTravel (); - G_DoLoadLevel (startpos, true, false); + G_DoLoadLevel (nextlevel, startpos, true, false); startpos = 0; gameaction = ga_nothing; viewactive = true; diff --git a/src/g_level.h b/src/g_level.h index 9686a4e5c..e8d694dd4 100644 --- a/src/g_level.h +++ b/src/g_level.h @@ -475,7 +475,7 @@ void G_ChangeLevel(const char *levelname, int position, int flags, int nextSkill void G_StartTravel (); int G_FinishTravel (); -void G_DoLoadLevel (int position, bool autosave, bool newGame); +void G_DoLoadLevel (const FString &MapName, int position, bool autosave, bool newGame); cluster_info_t *FindClusterInfo (int cluster); level_info_t *FindLevelInfo (const char *mapname, bool allowdefault=true); diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 5f7d202b0..b1077fb06 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -91,6 +91,7 @@ class DSpotState; class DSeqNode; struct FStrifeDialogueNode; class DAutomapBase; +struct wbstartstruct_t; typedef TMap FDialogueIDMap; // maps dialogue IDs to dialogue array index (for ACS) typedef TMap FDialogueMap; // maps actor class names to dialogue array index @@ -218,6 +219,7 @@ public: FPlayerStart *SelectRandomDeathmatchSpot (int playernum, unsigned int selections); void DeathMatchSpawnPlayer (int playernum); FPlayerStart *PickPlayerStart(int playernum, int flags = 0); + bool DoCompleted(FString nextlevel, wbstartstruct_t &wminfo); private: From 932bbee9289daf4ded4b090764df27bde4f2c8cf Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 29 Jan 2019 02:16:36 +0100 Subject: [PATCH 075/164] - fixed some warnings --- src/fragglescript/t_parse.cpp | 2 +- src/g_game.cpp | 1 + src/g_levellocals.h | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/fragglescript/t_parse.cpp b/src/fragglescript/t_parse.cpp index 16cfdda49..78bfc3aed 100644 --- a/src/fragglescript/t_parse.cpp +++ b/src/fragglescript/t_parse.cpp @@ -34,7 +34,7 @@ #include #include "t_script.h" #include "v_text.h" -#include "g_levellocals.h""" +#include "g_levellocals.h" CVAR(Bool, script_debug, false, 0) diff --git a/src/g_game.cpp b/src/g_game.cpp index ff06e184f..1d9b73950 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -1088,6 +1088,7 @@ void G_Ticker () AM_ToggleMap (); gameaction = ga_nothing; break; + default: case ga_nothing: break; } diff --git a/src/g_levellocals.h b/src/g_levellocals.h index b1077fb06..7977b6fc3 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -98,7 +98,7 @@ typedef TMap FDialogueMap; // maps actor class names to dialogue struct FLevelLocals { - FLevelLocals() : tagManager(this), Behaviors(this) {} + FLevelLocals() : Behaviors(this), tagManager(this) {} friend class MapLoader; From 8652f140f2798ad4fee625f09ae28908627bc603 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 29 Jan 2019 02:17:25 +0100 Subject: [PATCH 076/164] - fixed missing declaration --- src/g_hub.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/g_hub.h b/src/g_hub.h index bc7c89df3..855402de7 100644 --- a/src/g_hub.h +++ b/src/g_hub.h @@ -4,6 +4,7 @@ struct cluster_info_t; struct wbstartstruct_t; class FSerializer; +struct FLevelLocals; void G_SerializeHub (FSerializer &file); void G_LeavingHub(FLevelLocals *Level, int mode, cluster_info_t * cluster, struct wbstartstruct_t * wbs); From 473892dedee171451dcdd88d0b4e21d8ffd59b38 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 29 Jan 2019 02:18:19 +0100 Subject: [PATCH 077/164] - changed all model related references to level. --- src/hwrenderer/scene/hw_spritelight.cpp | 2 +- src/polyrenderer/scene/poly_model.cpp | 2 +- src/r_data/models/models.cpp | 10 +++++----- src/r_data/models/models.h | 15 ++++++++------- src/r_data/models/models_voxel.cpp | 4 ++-- src/r_utility.cpp | 2 +- src/swrenderer/things/r_model.cpp | 2 +- 7 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/hwrenderer/scene/hw_spritelight.cpp b/src/hwrenderer/scene/hw_spritelight.cpp index 8023f6272..028c2f03d 100644 --- a/src/hwrenderer/scene/hw_spritelight.cpp +++ b/src/hwrenderer/scene/hw_spritelight.cpp @@ -160,7 +160,7 @@ void hw_GetDynModelLight(AActor *self, FDynLightData &modellightdata) float radiusSquared = (float)(self->renderradius * self->renderradius); dl_validcount++; - BSPWalkCircle(x, y, radiusSquared, [&](subsector_t *subsector) // Iterate through all subsectors potentially touched by actor + BSPWalkCircle(self->Level, x, y, radiusSquared, [&](subsector_t *subsector) // Iterate through all subsectors potentially touched by actor { auto section = subsector->section; if (section->validcount == dl_validcount) return; // already done from a previous subsector. diff --git a/src/polyrenderer/scene/poly_model.cpp b/src/polyrenderer/scene/poly_model.cpp index 752552661..67f2efa56 100644 --- a/src/polyrenderer/scene/poly_model.cpp +++ b/src/polyrenderer/scene/poly_model.cpp @@ -122,7 +122,7 @@ void PolyModelRenderer::AddLights(AActor *actor) float z = (float)actor->Center(); float radiusSquared = (float)(actor->renderradius * actor->renderradius); - BSPWalkCircle(x, y, radiusSquared, [&](subsector_t *subsector) // Iterate through all subsectors potentially touched by actor + BSPWalkCircle(actor->Level, x, y, radiusSquared, [&](subsector_t *subsector) // Iterate through all subsectors potentially touched by actor { FLightNode * node = subsector->section->lighthead; while (node) // check all lights touching a subsector diff --git a/src/r_data/models/models.cpp b/src/r_data/models/models.cpp index ac260f8ff..90b93eaa3 100644 --- a/src/r_data/models/models.cpp +++ b/src/r_data/models/models.cpp @@ -167,13 +167,13 @@ void FModelRenderer::RenderModel(float x, float y, float z, FSpriteModelFrame *s objectToWorldMatrix.rotate(-smf->rolloffset, 1, 0, 0); // consider the pixel stretching. For non-voxels this must be factored out here - float stretch = (smf->modelIDs[0] != -1 ? Models[smf->modelIDs[0]]->getAspectFactor() : 1.f) / actor->Level->info->pixelstretch; + float stretch = (smf->modelIDs[0] != -1 ? Models[smf->modelIDs[0]]->getAspectFactor(actor->Level) : 1.f) / actor->Level->info->pixelstretch; objectToWorldMatrix.scale(1, stretch, 1); float orientation = scaleFactorX * scaleFactorY * scaleFactorZ; BeginDrawModel(actor, smf, objectToWorldMatrix, orientation < 0); - RenderFrameModels(smf, actor->state, actor->tics, actor->GetClass(), translation); + RenderFrameModels(actor->Level, smf, actor->state, actor->tics, actor->GetClass(), translation); EndDrawModel(actor, smf); } @@ -211,11 +211,11 @@ void FModelRenderer::RenderHUDModel(DPSprite *psp, float ofsX, float ofsY) float orientation = smf->xscale * smf->yscale * smf->zscale; BeginDrawHUDModel(playermo, objectToWorldMatrix, orientation < 0); - RenderFrameModels(smf, psp->GetState(), psp->GetTics(), playermo->player->ReadyWeapon->GetClass(), 0); + RenderFrameModels(playermo->Level, smf, psp->GetState(), psp->GetTics(), playermo->player->ReadyWeapon->GetClass(), 0); EndDrawHUDModel(playermo); } -void FModelRenderer::RenderFrameModels(const FSpriteModelFrame *smf, const FState *curState, const int curTics, const PClass *ti, int translation) +void FModelRenderer::RenderFrameModels(FLevelLocals *Level, const FSpriteModelFrame *smf, const FState *curState, const int curTics, const PClass *ti, int translation) { // [BB] Frame interpolation: Find the FSpriteModelFrame smfNext which follows after smf in the animation // and the scalar value inter ( element of [0,1) ), both necessary to determine the interpolated frame. @@ -229,7 +229,7 @@ void FModelRenderer::RenderFrameModels(const FSpriteModelFrame *smf, const FStat // [BB] To interpolate at more than 35 fps we take tic fractions into account. float ticFraction = 0.; // [BB] In case the tic counter is frozen we have to leave ticFraction at zero. - if (ConsoleState == c_up && menuactive != MENU_On && !level.isFrozen()) + if (ConsoleState == c_up && menuactive != MENU_On && !Level->isFrozen()) { ticFraction = I_GetTimeFrac(); } diff --git a/src/r_data/models/models.h b/src/r_data/models/models.h index 6a286dc92..ba0920390 100644 --- a/src/r_data/models/models.h +++ b/src/r_data/models/models.h @@ -46,6 +46,7 @@ FTextureID LoadSkin(const char * path, const char * fn); struct FSpriteModelFrame; class IModelVertexBuffer; +struct FLevelLocals; enum ModelRendererType { @@ -81,7 +82,7 @@ public: virtual void DrawElements(int numIndices, size_t offset) = 0; private: - void RenderFrameModels(const FSpriteModelFrame *smf, const FState *curState, const int curTics, const PClass *ti, int translation); + void RenderFrameModels(FLevelLocals *Level, const FSpriteModelFrame *smf, const FState *curState, const int curTics, const PClass *ti, int translation); }; struct FModelVertex @@ -138,7 +139,7 @@ public: virtual void RenderFrame(FModelRenderer *renderer, FTexture * skin, int frame, int frame2, double inter, int translation=0) = 0; virtual void BuildVertexBuffer(FModelRenderer *renderer) = 0; virtual void AddSkins(uint8_t *hitlist) = 0; - virtual float getAspectFactor() { return 1.f; } + virtual float getAspectFactor(FLevelLocals *) { return 1.f; } void SetVertexBuffer(FModelRenderer *renderer, IModelVertexBuffer *buffer) { mVBuf[renderer->GetType()] = buffer; } IModelVertexBuffer *GetVertexBuffer(FModelRenderer *renderer) const { return mVBuf[renderer->GetType()]; } @@ -407,7 +408,7 @@ public: virtual void AddSkins(uint8_t *hitlist); FTextureID GetPaletteTexture() const { return mPalette; } void BuildVertexBuffer(FModelRenderer *renderer); - float getAspectFactor(); + float getAspectFactor(FLevelLocals *) override; }; @@ -502,12 +503,12 @@ void BSPNodeWalkCircle(void *node, float x, float y, float radiusSquared, const // Search BSP for subsectors within the given radius and call callback(subsector) for each found template -void BSPWalkCircle(float x, float y, float radiusSquared, const Callback &callback) +void BSPWalkCircle(FLevelLocals *Level, float x, float y, float radiusSquared, const Callback &callback) { - if (level.nodes.Size() == 0) - callback(&level.subsectors[0]); + if (Level->nodes.Size() == 0) + callback(&Level->subsectors[0]); else - BSPNodeWalkCircle(level.HeadNode(), x, y, radiusSquared, callback); + BSPNodeWalkCircle(Level->HeadNode(), x, y, radiusSquared, callback); } #endif diff --git a/src/r_data/models/models_voxel.cpp b/src/r_data/models/models_voxel.cpp index 9a01b6487..b0acb941c 100644 --- a/src/r_data/models/models_voxel.cpp +++ b/src/r_data/models/models_voxel.cpp @@ -383,9 +383,9 @@ int FVoxelModel::FindFrame(const char * name) // //=========================================================================== -float FVoxelModel::getAspectFactor() +float FVoxelModel::getAspectFactor(FLevelLocals *Level) { - return level.info->pixelstretch; + return Level->info->pixelstretch; } //=========================================================================== diff --git a/src/r_utility.cpp b/src/r_utility.cpp index f7064149f..e44ca7c4c 100644 --- a/src/r_utility.cpp +++ b/src/r_utility.cpp @@ -492,7 +492,7 @@ void R_InterpolateView (FRenderViewpoint &viewpoint, player_t *player, double Fr } else { - DVector2 disp = level.Displacements.getOffset(oldgroup, newgroup); + DVector2 disp = viewpoint.ViewLevel->Displacements.getOffset(oldgroup, newgroup); viewpoint.Pos = iview->Old.Pos + (iview->New.Pos - iview->Old.Pos - disp) * Frac; viewpoint.Path[0] = viewpoint.Path[1] = iview->New.Pos; } diff --git a/src/swrenderer/things/r_model.cpp b/src/swrenderer/things/r_model.cpp index 6dca4cbf3..1f0be17ca 100644 --- a/src/swrenderer/things/r_model.cpp +++ b/src/swrenderer/things/r_model.cpp @@ -163,7 +163,7 @@ namespace swrenderer float z = (float)actor->Center(); float radiusSquared = (float)(actor->renderradius * actor->renderradius); - BSPWalkCircle(x, y, radiusSquared, [&](subsector_t *subsector) // Iterate through all subsectors potentially touched by actor + BSPWalkCircle(actor->Level, x, y, radiusSquared, [&](subsector_t *subsector) // Iterate through all subsectors potentially touched by actor { FLightNode * node = subsector->section->lighthead; while (node) // check all lights touching a subsector From f823e57446f5bafef1488e46b49c4fb1eb6e101a Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 29 Jan 2019 02:51:06 +0100 Subject: [PATCH 078/164] Handle level check in texture coordinate calculation --- src/hwrenderer/scene/hw_walls.cpp | 18 ++++++++++++------ src/hwrenderer/textures/hw_material.h | 10 ---------- src/p_3dmidtex.cpp | 2 +- src/scripting/vmthunks.cpp | 2 +- src/textures/texture.cpp | 4 ++-- src/textures/textures.h | 2 +- 6 files changed, 17 insertions(+), 21 deletions(-) diff --git a/src/hwrenderer/scene/hw_walls.cpp b/src/hwrenderer/scene/hw_walls.cpp index 905e70b11..9b42ac5cc 100644 --- a/src/hwrenderer/scene/hw_walls.cpp +++ b/src/hwrenderer/scene/hw_walls.cpp @@ -1095,6 +1095,12 @@ void GLWall::CheckTexturePosition(FTexCoordInfo *tci) } } + +static void GetTexCoordInfo(FMaterial *tex, FTexCoordInfo *tci, side_t *side, int texpos) +{ + tci->GetFromTexture(tex->tex, (float)side->GetTextureXScale(texpos), (float)side->GetTextureYScale(texpos), !!(side->GetLevel()->flags3 & LEVEL3_FORCEWORLDPANNING)); +} + //========================================================================== // // Handle one sided walls, upper and lower texture @@ -1129,7 +1135,7 @@ void GLWall::DoTexture(HWDrawInfo *di, int _type,seg_t * seg, int peg, FTexCoordInfo tci; - gltexture->GetTexCoordInfo(&tci, seg->sidedef, texpos); + GetTexCoordInfo(gltexture, &tci, seg->sidedef, texpos); type = _type; @@ -1190,7 +1196,7 @@ void GLWall::DoMidTexture(HWDrawInfo *di, seg_t * seg, bool drawfogboundary, // Align the texture to the ORIGINAL sector's height!! // At this point slopes don't matter because they don't affect the texture's z-position - gltexture->GetTexCoordInfo(&tci, seg->sidedef, side_t::mid); + GetTexCoordInfo(gltexture, &tci, seg->sidedef, side_t::mid); if (tci.mRenderHeight < 0) { mirrory = true; @@ -1530,19 +1536,19 @@ void GLWall::BuildFFBlock(HWDrawInfo *di, seg_t * seg, F3DFloor * rover, { gltexture = FMaterial::ValidateTexture(seg->sidedef->GetTexture(side_t::top), false, true); if (!gltexture) return; - gltexture->GetTexCoordInfo(&tci, seg->sidedef, side_t::top); + GetTexCoordInfo(gltexture, &tci, seg->sidedef, side_t::top); } else if (rover->flags&FF_LOWERTEXTURE) { gltexture = FMaterial::ValidateTexture(seg->sidedef->GetTexture(side_t::bottom), false, true); if (!gltexture) return; - gltexture->GetTexCoordInfo(&tci, seg->sidedef, side_t::bottom); + GetTexCoordInfo(gltexture, &tci, seg->sidedef, side_t::bottom); } else { gltexture = FMaterial::ValidateTexture(mastersd->GetTexture(side_t::mid), false, true); if (!gltexture) return; - gltexture->GetTexCoordInfo(&tci, mastersd, side_t::mid); + GetTexCoordInfo(gltexture, &tci, mastersd, side_t::mid); } to = (rover->flags&(FF_UPPERTEXTURE | FF_LOWERTEXTURE)) ? 0 : tci.TextureOffset(mastersd->GetTextureXOffset(side_t::mid)); @@ -2195,7 +2201,7 @@ void GLWall::ProcessLowerMiniseg(HWDrawInfo *di, seg_t *seg, sector_t * frontsec { FTexCoordInfo tci; type = RENDERWALL_BOTTOM; - gltexture->GetTexCoordInfo(&tci, 1.f, 1.f); + tci.GetFromTexture(gltexture->tex, 1, 1, false); SetWallCoordinates(seg, &tci, bfh, bfh, bfh, ffh, ffh, 0); PutWall(di, false); } diff --git a/src/hwrenderer/textures/hw_material.h b/src/hwrenderer/textures/hw_material.h index 6bf3e265b..99f241434 100644 --- a/src/hwrenderer/textures/hw_material.h +++ b/src/hwrenderer/textures/hw_material.h @@ -94,16 +94,6 @@ public: *r = mSpriteRect; } - void GetTexCoordInfo(FTexCoordInfo *tci, float x, float y) const - { - tci->GetFromTexture(tex, x, y); - } - - void GetTexCoordInfo(FTexCoordInfo *tci, side_t *side, int texpos) const - { - GetTexCoordInfo(tci, (float)side->GetTextureXScale(texpos), (float)side->GetTextureYScale(texpos)); - } - // This is scaled size in integer units as needed by walls and flats int TextureHeight() const { return mRenderHeight; } int TextureWidth() const { return mRenderWidth; } diff --git a/src/p_3dmidtex.cpp b/src/p_3dmidtex.cpp index 64485522c..be5ab9000 100644 --- a/src/p_3dmidtex.cpp +++ b/src/p_3dmidtex.cpp @@ -236,7 +236,7 @@ bool P_GetMidTexturePosition(const line_t *line, int sideno, double *ptextop, do FTexCoordInfo tci; // We only need the vertical positioning info here. - tci.GetFromTexture(tex, 1., (float)side->GetTextureYScale(side_t::mid)); + tci.GetFromTexture(tex, 1., (float)side->GetTextureYScale(side_t::mid), !!(line->GetLevel()->flags3 & LEVEL3_FORCEWORLDPANNING)); double y_offset = tci.RowOffset((float)side->GetTextureYOffset(side_t::mid)); double textureheight = tci.mRenderHeight; diff --git a/src/scripting/vmthunks.cpp b/src/scripting/vmthunks.cpp index 9e5b435d2..74ecf1313 100644 --- a/src/scripting/vmthunks.cpp +++ b/src/scripting/vmthunks.cpp @@ -2640,7 +2640,7 @@ static void Vec2OffsetZ(FLevelLocals *Level, double x, double y, double dx, doub } else { - DVector2 v = level.GetPortalOffsetPosition(x, y, dx, dy); + DVector2 v = Level->GetPortalOffsetPosition(x, y, dx, dy); *result = (DVector3(v, atz)); } } diff --git a/src/textures/texture.cpp b/src/textures/texture.cpp index 118bbf5bc..6d8dc0198 100644 --- a/src/textures/texture.cpp +++ b/src/textures/texture.cpp @@ -870,7 +870,7 @@ float FTexCoordInfo::TextureAdjustWidth() const // //=========================================================================== -void FTexCoordInfo::GetFromTexture(FTexture *tex, float x, float y) +void FTexCoordInfo::GetFromTexture(FTexture *tex, float x, float y, bool forceworldpanning) { if (x == 1.f) { @@ -904,7 +904,7 @@ void FTexCoordInfo::GetFromTexture(FTexture *tex, float x, float y) mScale.Y = -mScale.Y; mRenderHeight = -mRenderHeight; } - mWorldPanning = tex->bWorldPanning || (level.flags3 & LEVEL3_FORCEWORLDPANNING); + mWorldPanning = tex->bWorldPanning || forceworldpanning; mWidth = tex->GetWidth(); } diff --git a/src/textures/textures.h b/src/textures/textures.h index 52ed052db..f23d3c3d6 100644 --- a/src/textures/textures.h +++ b/src/textures/textures.h @@ -755,7 +755,7 @@ struct FTexCoordInfo float RowOffset(float ofs) const; float TextureOffset(float ofs) const; float TextureAdjustWidth() const; - void GetFromTexture(FTexture *tex, float x, float y); + void GetFromTexture(FTexture *tex, float x, float y, bool forceworldpanning); }; From 7d3cd53c7ebbc352f2ec3a7c1c22edffb4b3344a Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 29 Jan 2019 03:15:42 +0100 Subject: [PATCH 079/164] - handle the software renderer's GetColorTable function MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The real question here should be: Why does this need to get called in over 40 differenrt locations…? --- src/polyrenderer/scene/poly_model.cpp | 8 +++--- src/polyrenderer/scene/poly_playersprite.cpp | 10 ++++--- src/polyrenderer/scene/poly_sprite.cpp | 4 +-- src/polyrenderer/scene/poly_wallsprite.cpp | 4 +-- src/swrenderer/r_swcolormaps.h | 30 ++++++++++++++------ src/swrenderer/scene/r_opaque_pass.cpp | 7 +++-- src/swrenderer/things/r_model.cpp | 8 +++--- src/swrenderer/things/r_particle.cpp | 10 ++++--- src/swrenderer/things/r_playersprite.cpp | 10 ++++--- src/swrenderer/things/r_visiblesprite.cpp | 6 ++-- 10 files changed, 59 insertions(+), 38 deletions(-) diff --git a/src/polyrenderer/scene/poly_model.cpp b/src/polyrenderer/scene/poly_model.cpp index 67f2efa56..5ed08ef9b 100644 --- a/src/polyrenderer/scene/poly_model.cpp +++ b/src/polyrenderer/scene/poly_model.cpp @@ -256,8 +256,8 @@ void PolyModelRenderer::SetTransform() void PolyModelRenderer::DrawArrays(int start, int count) { PolyDrawArgs args; - args.SetLight(GetColorTable(sector->Colormap, sector->SpecialColors[sector_t::sprites], true), lightlevel, visibility, fullbrightSprite); - args.SetLights(Lights, NumLights); + auto nc = !!(sector->Level->flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING); + args.SetLight(GetSpriteColorTable(sector->Colormap, sector->SpecialColors[sector_t::sprites], nc), lightlevel, visibility, fullbrightSprite); args.SetLights(Lights, NumLights); args.SetStencilTestValue(StencilValue); args.SetClipPlane(0, PolyClipPlane()); args.SetStyle(RenderStyle, RenderAlpha, fillcolor, Translation, SkinTexture, fullbrightSprite); @@ -270,8 +270,8 @@ void PolyModelRenderer::DrawArrays(int start, int count) void PolyModelRenderer::DrawElements(int numIndices, size_t offset) { PolyDrawArgs args; - args.SetLight(GetColorTable(sector->Colormap, sector->SpecialColors[sector_t::sprites], true), lightlevel, visibility, fullbrightSprite); - args.SetLights(Lights, NumLights); + auto nc = !!(sector->Level->flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING); + args.SetLight(GetSpriteColorTable(sector->Colormap, sector->SpecialColors[sector_t::sprites], nc), lightlevel, visibility, fullbrightSprite); args.SetLights(Lights, NumLights); args.SetStencilTestValue(StencilValue); args.SetClipPlane(0, PolyClipPlane()); args.SetStyle(RenderStyle, RenderAlpha, fillcolor, Translation, SkinTexture, fullbrightSprite); diff --git a/src/polyrenderer/scene/poly_playersprite.cpp b/src/polyrenderer/scene/poly_playersprite.cpp index 600953508..3cf04a53d 100644 --- a/src/polyrenderer/scene/poly_playersprite.cpp +++ b/src/polyrenderer/scene/poly_playersprite.cpp @@ -66,6 +66,8 @@ void RenderPolyPlayerSprites::Render(PolyRenderThread *thread) FDynamicColormap *basecolormap; PolyCameraLight *cameraLight = PolyCameraLight::Instance(); + bool nc = !!(viewpoint.camera->Level->flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING); + if (cameraLight->FixedLightLevel() < 0 && viewpoint.sector->e && viewpoint.sector->e->XFloor.lightlist.Size()) { for (i = viewpoint.sector->e->XFloor.lightlist.Size() - 1; i >= 0; i--) @@ -79,9 +81,9 @@ void RenderPolyPlayerSprites::Render(PolyRenderThread *thread) break; sec = rover->model; if (rover->flags & FF_FADEWALLS) - basecolormap = GetColorTable(sec->Colormap, sec->SpecialColors[sector_t::sprites], true); + basecolormap = GetSpriteColorTable(sec->Colormap, sec->SpecialColors[sector_t::sprites], nc); else - basecolormap = GetColorTable(viewpoint.sector->e->XFloor.lightlist[i].extra_colormap, sec->SpecialColors[sector_t::sprites], true); + basecolormap = GetSpriteColorTable(viewpoint.sector->e->XFloor.lightlist[i].extra_colormap, sec->SpecialColors[sector_t::sprites], nc); } break; } @@ -89,7 +91,7 @@ void RenderPolyPlayerSprites::Render(PolyRenderThread *thread) if (!sec) { sec = viewpoint.sector; - basecolormap = GetColorTable(sec->Colormap, sec->SpecialColors[sector_t::sprites], true); + basecolormap = GetSpriteColorTable(sec->Colormap, sec->SpecialColors[sector_t::sprites], nc); } floorlight = ceilinglight = sec->lightlevel; } @@ -102,7 +104,7 @@ void RenderPolyPlayerSprites::Render(PolyRenderThread *thread) ceilinglight = fakeflat.CeilingLightLevel; // [RH] set basecolormap - basecolormap = GetColorTable(sec->Colormap, sec->SpecialColors[sector_t::sprites], true); + basecolormap = GetSpriteColorTable(sec->Colormap, sec->SpecialColors[sector_t::sprites], nc); } // [RH] set foggy flag diff --git a/src/polyrenderer/scene/poly_sprite.cpp b/src/polyrenderer/scene/poly_sprite.cpp index b6487c231..5428f8de6 100644 --- a/src/polyrenderer/scene/poly_sprite.cpp +++ b/src/polyrenderer/scene/poly_sprite.cpp @@ -158,8 +158,8 @@ void RenderPolySprite::Render(PolyRenderThread *thread, AActor *thing, subsector PolyDrawArgs args; SetDynlight(thing, args); - args.SetLight(GetColorTable(sub->sector->Colormap, sub->sector->SpecialColors[sector_t::sprites], true), lightlevel, PolyRenderer::Instance()->Light.SpriteGlobVis(foggy), fullbrightSprite); - args.SetStencilTestValue(stencilValue); + auto nc = !!(thing->Level->flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING); + args.SetLight(GetSpriteColorTable(sub->sector->Colormap, sub->sector->SpecialColors[sector_t::sprites], nc), lightlevel, PolyRenderer::Instance()->Light.SpriteGlobVis(foggy), fullbrightSprite); args.SetStencilTestValue(stencilValue); if ((thing->renderflags & RF_ZDOOMTRANS) && r_UseVanillaTransparency) args.SetStyle(LegacyRenderStyles[STYLE_Normal], 1.0f, thing->fillcolor, thing->Translation, tex, fullbrightSprite); else diff --git a/src/polyrenderer/scene/poly_wallsprite.cpp b/src/polyrenderer/scene/poly_wallsprite.cpp index 4313b6863..d94be7a63 100644 --- a/src/polyrenderer/scene/poly_wallsprite.cpp +++ b/src/polyrenderer/scene/poly_wallsprite.cpp @@ -101,8 +101,8 @@ void RenderPolyWallSprite::Render(PolyRenderThread *thread, AActor *thing, subse int lightlevel = fullbrightSprite ? 255 : thing->Sector->lightlevel + actualextralight; PolyDrawArgs args; - args.SetLight(GetColorTable(sub->sector->Colormap, sub->sector->SpecialColors[sector_t::sprites], true), lightlevel, PolyRenderer::Instance()->Light.WallGlobVis(foggy), fullbrightSprite); - args.SetStencilTestValue(stencilValue); + auto nc = !!(sub->sector->Level->flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING); + args.SetLight(GetSpriteColorTable(sub->sector->Colormap, sub->sector->SpecialColors[sector_t::sprites], nc), lightlevel, PolyRenderer::Instance()->Light.WallGlobVis(foggy), fullbrightSprite); args.SetStencilTestValue(stencilValue); args.SetTexture(tex, thing->RenderStyle); args.SetDepthTest(true); args.SetWriteDepth(false); diff --git a/src/swrenderer/r_swcolormaps.h b/src/swrenderer/r_swcolormaps.h index 76d5faa53..b7d053d9b 100644 --- a/src/swrenderer/r_swcolormaps.h +++ b/src/swrenderer/r_swcolormaps.h @@ -47,16 +47,9 @@ void SetDefaultColormap (const char *name); #endif // MSVC needs the forceinline here. -FORCEINLINE FDynamicColormap *GetColorTable(const FColormap &cm, PalEntry SpecialColor = 0xffffff, bool forsprites = false) +FORCEINLINE FDynamicColormap *GetColorTable(const FColormap &cm, PalEntry SpecialColor = 0xffffff) { - PalEntry c; - if (!forsprites || !(level.flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING)) c = SpecialColor.Modulate(cm.LightColor); - else - { - c = cm.LightColor; - c.Decolorize(); - c = SpecialColor.Modulate(c); - } + PalEntry c = SpecialColor.Modulate(cm.LightColor); // First colormap is the default Doom colormap. // testcolor and testfade CCMDs modifies the first colormap, so we have to do the check without looking at the actual values stored in NormalLight. @@ -65,3 +58,22 @@ FORCEINLINE FDynamicColormap *GetColorTable(const FColormap &cm, PalEntry Specia return GetSpecialLights(c, cm.FadeColor, cm.Desaturation); } + +FORCEINLINE FDynamicColormap *GetSpriteColorTable(const FColormap &cm, PalEntry SpecialColor, bool nocoloredspritelighting) +{ + PalEntry c; + if (!nocoloredspritelighting) c = SpecialColor.Modulate(cm.LightColor); + else + { + c = cm.LightColor; + c.Decolorize(); + c = SpecialColor.Modulate(c); + } + + // First colormap is the default Doom colormap. + // testcolor and testfade CCMDs modifies the first colormap, so we have to do the check without looking at the actual values stored in NormalLight. + if (c == PalEntry(255, 255, 255) && cm.FadeColor == 0 && cm.Desaturation == 0) + return &NormalLight; + + return GetSpecialLights(c, cm.FadeColor, cm.Desaturation); +} diff --git a/src/swrenderer/scene/r_opaque_pass.cpp b/src/swrenderer/scene/r_opaque_pass.cpp index 12f00fda8..d929a2234 100644 --- a/src/swrenderer/scene/r_opaque_pass.cpp +++ b/src/swrenderer/scene/r_opaque_pass.cpp @@ -609,7 +609,8 @@ namespace swrenderer // lightlevels on floor & ceiling lightlevels in the surrounding area. // [RH] Handle sprite lighting like Duke 3D: If the ceiling is a sky, sprites are lit by // it, otherwise they are lit by the floor. - AddSprites(sub->sector, frontsector->GetTexture(sector_t::ceiling) == skyflatnum ? ceilinglightlevel : floorlightlevel, FakeSide, foggy, GetColorTable(frontsector->Colormap, frontsector->SpecialColors[sector_t::sprites], true)); + auto nc = !!(frontsector->Level->flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING); + AddSprites(sub->sector, frontsector->GetTexture(sector_t::ceiling) == skyflatnum ? ceilinglightlevel : floorlightlevel, FakeSide, foggy, GetSpriteColorTable(frontsector->Colormap, frontsector->SpecialColors[sector_t::sprites], nc)); // [RH] Add particles if ((unsigned int)(sub->Index()) < Level->subsectors.Size()) @@ -948,8 +949,8 @@ namespace swrenderer if (sec->sectornum != thing->Sector->sectornum) // compare sectornums to account for R_FakeFlat copies. { thinglightlevel = thing->Sector->GetTexture(sector_t::ceiling) == skyflatnum ? thing->Sector->GetCeilingLight() : thing->Sector->GetFloorLight(); - thingColormap = GetColorTable(thing->Sector->Colormap, thing->Sector->SpecialColors[sector_t::sprites], true); - } + auto nc = !!(thing->Level->flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING); + thingColormap = GetSpriteColorTable(thing->Sector->Colormap, thing->Sector->SpecialColors[sector_t::sprites], nc); } if ((sprite.renderflags & RF_SPRITETYPEMASK) == RF_WALLSPRITE) { diff --git a/src/swrenderer/things/r_model.cpp b/src/swrenderer/things/r_model.cpp index 1f0be17ca..93901fbf1 100644 --- a/src/swrenderer/things/r_model.cpp +++ b/src/swrenderer/things/r_model.cpp @@ -352,8 +352,8 @@ namespace swrenderer void SWModelRenderer::DrawArrays(int start, int count) { PolyDrawArgs args; - args.SetLight(GetColorTable(sector->Colormap, sector->SpecialColors[sector_t::sprites], true), lightlevel, visibility, fullbrightSprite); - args.SetLights(Lights, NumLights); + auto nc = !!(sector->Level->flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING); + args.SetLight(GetSpriteColorTable(sector->Colormap, sector->SpecialColors[sector_t::sprites], nc), lightlevel, visibility, fullbrightSprite); args.SetLights(Lights, NumLights); args.SetNormal(FVector3(0.0f, 0.0f, 0.0f)); args.SetStyle(RenderStyle, RenderAlpha, fillcolor, Translation, SkinTexture->GetSoftwareTexture(), fullbrightSprite); args.SetDepthTest(true); @@ -369,8 +369,8 @@ namespace swrenderer void SWModelRenderer::DrawElements(int numIndices, size_t offset) { PolyDrawArgs args; - args.SetLight(GetColorTable(sector->Colormap, sector->SpecialColors[sector_t::sprites], true), lightlevel, visibility, fullbrightSprite); - args.SetLights(Lights, NumLights); + auto nc = !!(sector->Level->flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING); + args.SetLight(GetSpriteColorTable(sector->Colormap, sector->SpecialColors[sector_t::sprites], nc), lightlevel, visibility, fullbrightSprite); args.SetLights(Lights, NumLights); args.SetNormal(FVector3(0.0f, 0.0f, 0.0f)); args.SetStyle(RenderStyle, RenderAlpha, fillcolor, Translation, SkinTexture->GetSoftwareTexture(), fullbrightSprite); args.SetDepthTest(true); diff --git a/src/swrenderer/things/r_particle.cpp b/src/swrenderer/things/r_particle.cpp index 43d680c06..99831a386 100644 --- a/src/swrenderer/things/r_particle.cpp +++ b/src/swrenderer/things/r_particle.cpp @@ -155,6 +155,8 @@ namespace swrenderer FTextureID toppic; FTextureID botpic; FDynamicColormap *map; + auto nc = !!(sector->Level->flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING); + if (heightsec) // only clip things which are in special sectors { @@ -164,7 +166,7 @@ namespace swrenderer botplane = &heightsec->ceilingplane; toppic = sector->GetTexture(sector_t::ceiling); botpic = heightsec->GetTexture(sector_t::ceiling); - map = GetColorTable(heightsec->Colormap, heightsec->SpecialColors[sector_t::sprites], true); + map = GetSpriteColorTable(heightsec->Colormap, heightsec->SpecialColors[sector_t::sprites], nc); } else if (fakeside == WaterFakeSide::BelowFloor) { @@ -172,7 +174,7 @@ namespace swrenderer botplane = §or->floorplane; toppic = heightsec->GetTexture(sector_t::floor); botpic = sector->GetTexture(sector_t::floor); - map = GetColorTable(heightsec->Colormap, heightsec->SpecialColors[sector_t::sprites], true); + map = GetSpriteColorTable(heightsec->Colormap, heightsec->SpecialColors[sector_t::sprites], nc); } else { @@ -180,7 +182,7 @@ namespace swrenderer botplane = &heightsec->floorplane; toppic = heightsec->GetTexture(sector_t::ceiling); botpic = heightsec->GetTexture(sector_t::floor); - map = GetColorTable(sector->Colormap, sector->SpecialColors[sector_t::sprites], true); + map = GetSpriteColorTable(sector->Colormap, sector->SpecialColors[sector_t::sprites], nc); } } else @@ -189,7 +191,7 @@ namespace swrenderer botplane = §or->floorplane; toppic = sector->GetTexture(sector_t::ceiling); botpic = sector->GetTexture(sector_t::floor); - map = GetColorTable(sector->Colormap, sector->SpecialColors[sector_t::sprites], true); + map = GetSpriteColorTable(sector->Colormap, sector->SpecialColors[sector_t::sprites], nc); } if (botpic != skyflatnum && ippz < botplane->ZatPoint(particle->Pos)) diff --git a/src/swrenderer/things/r_playersprite.cpp b/src/swrenderer/things/r_playersprite.cpp index 812d2df37..eb12dbcae 100644 --- a/src/swrenderer/things/r_playersprite.cpp +++ b/src/swrenderer/things/r_playersprite.cpp @@ -97,6 +97,8 @@ namespace swrenderer FDynamicColormap *basecolormap; CameraLight *cameraLight = CameraLight::Instance(); + auto nc = !!(Thread->Viewport->Level()->flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING); + if (cameraLight->FixedLightLevel() < 0 && Thread->Viewport->viewpoint.sector->e && Thread->Viewport->viewpoint.sector->e->XFloor.lightlist.Size()) { for (i = Thread->Viewport->viewpoint.sector->e->XFloor.lightlist.Size() - 1; i >= 0; i--) @@ -110,9 +112,9 @@ namespace swrenderer break; sec = rover->model; if (rover->flags & FF_FADEWALLS) - basecolormap = GetColorTable(sec->Colormap, sec->SpecialColors[sector_t::sprites], true); + basecolormap = GetSpriteColorTable(sec->Colormap, sec->SpecialColors[sector_t::sprites], nc); else - basecolormap = GetColorTable(Thread->Viewport->viewpoint.sector->e->XFloor.lightlist[i].extra_colormap, sec->SpecialColors[sector_t::sprites], true); + basecolormap = GetSpriteColorTable(Thread->Viewport->viewpoint.sector->e->XFloor.lightlist[i].extra_colormap, sec->SpecialColors[sector_t::sprites], nc); } break; } @@ -120,7 +122,7 @@ namespace swrenderer if (!sec) { sec = Thread->Viewport->viewpoint.sector; - basecolormap = GetColorTable(sec->Colormap, sec->SpecialColors[sector_t::sprites], true); + basecolormap = GetSpriteColorTable(sec->Colormap, sec->SpecialColors[sector_t::sprites], nc); } floorlight = ceilinglight = sec->lightlevel; } @@ -130,7 +132,7 @@ namespace swrenderer sec = Thread->OpaquePass->FakeFlat(Thread->Viewport->viewpoint.sector, &tempsec, &floorlight, &ceilinglight, nullptr, 0, 0, 0, 0); // [RH] set basecolormap - basecolormap = GetColorTable(sec->Colormap, sec->SpecialColors[sector_t::sprites], true); + basecolormap = GetSpriteColorTable(sec->Colormap, sec->SpecialColors[sector_t::sprites], nc); } // [RH] set foggy flag diff --git a/src/swrenderer/things/r_visiblesprite.cpp b/src/swrenderer/things/r_visiblesprite.cpp index adf058875..9c7e157c8 100644 --- a/src/swrenderer/things/r_visiblesprite.cpp +++ b/src/swrenderer/things/r_visiblesprite.cpp @@ -136,13 +136,15 @@ namespace swrenderer break; } sec = rover->model; + auto nc = !!(sec->Level->flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING); + if (rover->flags & FF_FADEWALLS) { - mybasecolormap = GetColorTable(sec->Colormap, spr->sector->SpecialColors[sector_t::sprites], true); + mybasecolormap = GetSpriteColorTable(sec->Colormap, spr->sector->SpecialColors[sector_t::sprites], nc); } else { - mybasecolormap = GetColorTable(spr->sector->e->XFloor.lightlist[i].extra_colormap, spr->sector->SpecialColors[sector_t::sprites], true); + mybasecolormap = GetSpriteColorTable(spr->sector->e->XFloor.lightlist[i].extra_colormap, spr->sector->SpecialColors[sector_t::sprites], nc); } } break; From de1b89707d6e6559a39dd33ec18dcd4fc2be8263 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 29 Jan 2019 03:26:22 +0100 Subject: [PATCH 080/164] Handle level in block iterators. The scripted interface isn't done yet. --- src/p_actionfunctions.cpp | 2 +- src/p_destructible.cpp | 4 +- src/p_enemy.cpp | 4 +- src/p_map.cpp | 12 ++-- src/p_maputl.cpp | 109 ++++++++++++++++++---------------- src/p_maputl.h | 22 +++---- src/p_secnodes.cpp | 2 +- src/p_sight.cpp | 2 +- src/p_spec.cpp | 2 +- src/p_trace.cpp | 2 +- src/po_man.cpp | 2 +- src/portal.cpp | 2 +- src/scripting/vmiterators.cpp | 4 +- 13 files changed, 88 insertions(+), 81 deletions(-) diff --git a/src/p_actionfunctions.cpp b/src/p_actionfunctions.cpp index a6ccd9e4b..913a42bc5 100644 --- a/src/p_actionfunctions.cpp +++ b/src/p_actionfunctions.cpp @@ -3712,7 +3712,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_RadiusGive) { FPortalGroupArray check(FPortalGroupArray::PGA_Full3d); double mid = self->Center(); - FMultiBlockThingsIterator it(check, self->X(), self->Y(), mid-distance, mid+distance, distance, false, self->Sector); + FMultiBlockThingsIterator it(check, self->Level, self->X(), self->Y(), mid-distance, mid+distance, distance, false, self->Sector); FMultiBlockThingsIterator::CheckResult cres; while ((it.Next(&cres)) && ((unlimited) || (given < limit))) diff --git a/src/p_destructible.cpp b/src/p_destructible.cpp index 56ab0ea5d..8882d9255 100755 --- a/src/p_destructible.cpp +++ b/src/p_destructible.cpp @@ -520,7 +520,7 @@ void P_GeometryRadiusAttack(AActor* bombspot, AActor* bombsource, int bombdamage // enumerate all lines around FBoundingBox bombbox(bombspot->X(), bombspot->Y(), bombdistance); - FBlockLinesIterator it(bombbox); + FBlockLinesIterator it(bombspot->Level, bombbox); line_t* ln; int vc = validcount; TArray lines; @@ -1070,4 +1070,4 @@ DEFINE_ACTION_FUNCTION(_Sector, SetHealth) *health = newhealth; if (grp) P_SetHealthGroupHealth(grp, newhealth); return 0; -} \ No newline at end of file +} diff --git a/src/p_enemy.cpp b/src/p_enemy.cpp index 43a2b9ce2..17f1e8561 100644 --- a/src/p_enemy.cpp +++ b/src/p_enemy.cpp @@ -867,7 +867,7 @@ void P_NewChaseDir(AActor * actor) !(actor->flags & MF_FLOAT) && !(i_compatflags & COMPATF_DROPOFF)) { FBoundingBox box(actor->X(), actor->Y(), actor->radius); - FBlockLinesIterator it(box); + FBlockLinesIterator it(actor->Level, box); line_t *line; double deltax = 0; @@ -2627,7 +2627,7 @@ bool P_CheckForResurrection(AActor *self, bool usevilestates) FPortalGroupArray check(FPortalGroupArray::PGA_Full3d); - FMultiBlockThingsIterator it(check, viletry.X, viletry.Y, self->Z() - 64, self->Top() + 64, 32., false, NULL); + FMultiBlockThingsIterator it(check, self->Level, viletry.X, viletry.Y, self->Z() - 64, self->Top() + 64, 32., false, NULL); FMultiBlockThingsIterator::CheckResult cres; while (it.Next(&cres)) { diff --git a/src/p_map.cpp b/src/p_map.cpp index cfd905f0c..1d14c00bd 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -421,7 +421,7 @@ bool P_TeleportMove(AActor* thing, const DVector3 &pos, bool telefrag, bool modi sector_t *sector = thing->Level->PointInSector(pos); FPortalGroupArray grouplist; - FMultiBlockLinesIterator mit(grouplist, pos.X, pos.Y, pos.Z, thing->Height, thing->radius, sector); + FMultiBlockLinesIterator mit(grouplist, thing->Level, pos.X, pos.Y, pos.Z, thing->Height, thing->radius, sector); FMultiBlockLinesIterator::CheckResult cres; while (mit.Next(&cres)) @@ -432,7 +432,7 @@ bool P_TeleportMove(AActor* thing, const DVector3 &pos, bool telefrag, bool modi if (tmf.touchmidtex) tmf.dropoffz = tmf.floorz; - FMultiBlockThingsIterator mit2(grouplist, pos.X, pos.Y, pos.Z, thing->Height, thing->radius, false, sector); + FMultiBlockThingsIterator mit2(grouplist, thing->Level, pos.X, pos.Y, pos.Z, thing->Height, thing->radius, false, sector); FMultiBlockThingsIterator::CheckResult cres2; while (mit2.Next(&cres2)) @@ -1082,7 +1082,7 @@ static bool PIT_CheckPortal(FMultiBlockLinesIterator &mit, FMultiBlockLinesItera tm.thing->AddZ(zofs); FBoundingBox pbox(cres.Position.X, cres.Position.Y, tm.thing->radius); - FBlockLinesIterator it(pbox); + FBlockLinesIterator it(tm.thing->Level, pbox); bool ret = false; line_t *ld; @@ -1750,7 +1750,7 @@ bool P_CheckPosition(AActor *thing, const DVector2 &pos, FCheckPosition &tm, boo FBoundingBox box(pos.X, pos.Y, thing->radius); FPortalGroupArray pcheck; - FMultiBlockThingsIterator it2(pcheck, pos.X, pos.Y, thing->Z(), thing->Height, thing->radius, false, newsec); + FMultiBlockThingsIterator it2(pcheck, thing->Level, pos.X, pos.Y, thing->Z(), thing->Height, thing->radius, false, newsec); FMultiBlockThingsIterator::CheckResult tcres; while ((it2.Next(&tcres))) @@ -1822,7 +1822,7 @@ bool P_CheckPosition(AActor *thing, const DVector2 &pos, FCheckPosition &tm, boo return (thing->BlockingMobj = thingblocker) == NULL; - FMultiBlockLinesIterator it(pcheck, pos.X, pos.Y, thing->Z(), thing->Height, thing->radius, newsec); + FMultiBlockLinesIterator it(pcheck, thing->Level, pos.X, pos.Y, thing->Z(), thing->Height, thing->radius, newsec); FMultiBlockLinesIterator::CheckResult lcres; double thingdropoffz = tm.floorz; @@ -5836,7 +5836,7 @@ int P_RadiusAttack(AActor *bombspot, AActor *bombsource, int bombdamage, int bom fulldamagedistance = clamp(fulldamagedistance, 0, bombdistance - 1); FPortalGroupArray grouplist(FPortalGroupArray::PGA_Full3d); - FMultiBlockThingsIterator it(grouplist, bombspot->X(), bombspot->Y(), bombspot->Z() - bombdistance, bombspot->Height + bombdistance*2, bombdistance, false, bombspot->Sector); + FMultiBlockThingsIterator it(grouplist, bombspot->Level, bombspot->X(), bombspot->Y(), bombspot->Z() - bombdistance, bombspot->Height + bombdistance*2, bombdistance, false, bombspot->Sector); FMultiBlockThingsIterator::CheckResult cres; if (flags & RADF_SOURCEISSPOT) diff --git a/src/p_maputl.cpp b/src/p_maputl.cpp index 32c5b4b4b..4ea687216 100644 --- a/src/p_maputl.cpp +++ b/src/p_maputl.cpp @@ -581,9 +581,10 @@ void AActor::SetOrigin(double x, double y, double z, bool moving) // //=========================================================================== -FBlockLinesIterator::FBlockLinesIterator(int _minx, int _miny, int _maxx, int _maxy, bool keepvalidcount) +FBlockLinesIterator::FBlockLinesIterator(FLevelLocals *l, int _minx, int _miny, int _maxx, int _maxy, bool keepvalidcount) { if (!keepvalidcount) validcount++; + Level = l; minx = _minx; maxx = _maxx; miny = _miny; @@ -594,15 +595,16 @@ FBlockLinesIterator::FBlockLinesIterator(int _minx, int _miny, int _maxx, int _m void FBlockLinesIterator::init(const FBoundingBox &box) { validcount++; - maxy = level.blockmap.GetBlockY(box.Top()); - miny = level.blockmap.GetBlockY(box.Bottom()); - maxx = level.blockmap.GetBlockX(box.Right()); - minx = level.blockmap.GetBlockX(box.Left()); + maxy = Level->blockmap.GetBlockY(box.Top()); + miny = Level->blockmap.GetBlockY(box.Bottom()); + maxx = Level->blockmap.GetBlockX(box.Right()); + minx = Level->blockmap.GetBlockX(box.Left()); Reset(); } -FBlockLinesIterator::FBlockLinesIterator(const FBoundingBox &box) +FBlockLinesIterator::FBlockLinesIterator(FLevelLocals *l, const FBoundingBox &box) { + Level = l; init(box); } @@ -616,13 +618,13 @@ void FBlockLinesIterator::StartBlock(int x, int y) { curx = x; cury = y; - if (level.blockmap.isValidBlock(x, y)) + if (Level->blockmap.isValidBlock(x, y)) { - unsigned offset = y*level.blockmap.bmapwidth + x; - polyLink = level.PolyBlockMap.Size() > offset? level.PolyBlockMap[offset] : nullptr; + unsigned offset = y*Level->blockmap.bmapwidth + x; + polyLink = Level->PolyBlockMap.Size() > offset? Level->PolyBlockMap[offset] : nullptr; polyIndex = 0; - list = level.blockmap.GetLines(x, y); + list = Level->blockmap.GetLines(x, y); } else { @@ -681,7 +683,7 @@ line_t *FBlockLinesIterator::Next() { while (*list != -1) { - line_t *ld = &level.lines[*list]; + line_t *ld = &Level->lines[*list]; list++; if (ld->validcount != validcount) @@ -710,24 +712,24 @@ line_t *FBlockLinesIterator::Next() //=========================================================================== FMultiBlockLinesIterator::FMultiBlockLinesIterator(FPortalGroupArray &check, AActor *origin, double checkradius) - : checklist(check) + : checklist(check), blockIterator(origin->Level) { checkpoint = origin->Pos(); - if (!check.inited) level.CollectConnectedGroups(origin->Sector->PortalGroup, checkpoint, origin->Top(), checkradius, checklist); + if (!check.inited) origin->Level->CollectConnectedGroups(origin->Sector->PortalGroup, checkpoint, origin->Top(), checkradius, checklist); checkpoint.Z = checkradius == -1? origin->radius : checkradius; basegroup = origin->Sector->PortalGroup; startsector = origin->Sector; Reset(); } -FMultiBlockLinesIterator::FMultiBlockLinesIterator(FPortalGroupArray &check, double checkx, double checky, double checkz, double checkh, double checkradius, sector_t *newsec) - : checklist(check) +FMultiBlockLinesIterator::FMultiBlockLinesIterator(FPortalGroupArray &check, FLevelLocals *Level, double checkx, double checky, double checkz, double checkh, double checkradius, sector_t *newsec) + : checklist(check), blockIterator(Level) { checkpoint = { checkx, checky, checkz }; - if (newsec == NULL) newsec = level.PointInSector(checkx, checky); + if (newsec == NULL) newsec = Level->PointInSector(checkx, checky); startsector = newsec; basegroup = newsec->PortalGroup; - if (!check.inited) level.CollectConnectedGroups(basegroup, checkpoint, checkz + checkh, checkradius, checklist); + if (!check.inited) Level->CollectConnectedGroups(basegroup, checkpoint, checkz + checkh, checkradius, checklist); checkpoint.Z = checkradius; Reset(); } @@ -847,10 +849,10 @@ bool FMultiBlockLinesIterator::Next(FMultiBlockLinesIterator::CheckResult *item) bool FMultiBlockLinesIterator::startIteratorForGroup(int group) { - offset = level.Displacements.getOffset(basegroup, group); + offset = blockIterator.Level->Displacements.getOffset(basegroup, group); offset.X += checkpoint.X; offset.Y += checkpoint.Y; - cursector = group == startsector->PortalGroup ? startsector : level.PointInSector(offset); + cursector = group == startsector->PortalGroup ? startsector : blockIterator.Level->PointInSector(offset); // If we ended up in a different group, // presumably because the spot to be checked is too far outside the actual portal group, // the search needs to abort. @@ -880,18 +882,20 @@ void FMultiBlockLinesIterator::Reset() // //=========================================================================== -FBlockThingsIterator::FBlockThingsIterator() +FBlockThingsIterator::FBlockThingsIterator(FLevelLocals *l) : DynHash(0) { + Level = l; minx = maxx = 0; miny = maxy = 0; ClearHash(); block = NULL; } -FBlockThingsIterator::FBlockThingsIterator(int _minx, int _miny, int _maxx, int _maxy) +FBlockThingsIterator::FBlockThingsIterator(FLevelLocals *l, int _minx, int _miny, int _maxx, int _maxy) : DynHash(0) { + Level = l; minx = _minx; maxx = _maxx; miny = _miny; @@ -902,10 +906,10 @@ FBlockThingsIterator::FBlockThingsIterator(int _minx, int _miny, int _maxx, int void FBlockThingsIterator::init(const FBoundingBox &box) { - maxy = level.blockmap.GetBlockY(box.Top()); - miny = level.blockmap.GetBlockY(box.Bottom()); - maxx = level.blockmap.GetBlockX(box.Right()); - minx = level.blockmap.GetBlockX(box.Left()); + maxy = Level->blockmap.GetBlockY(box.Top()); + miny = Level->blockmap.GetBlockY(box.Bottom()); + maxx = Level->blockmap.GetBlockX(box.Right()); + minx = Level->blockmap.GetBlockX(box.Left()); ClearHash(); Reset(); } @@ -933,9 +937,9 @@ void FBlockThingsIterator::StartBlock(int x, int y) { curx = x; cury = y; - if (level.blockmap.isValidBlock(x, y)) + if (Level->blockmap.isValidBlock(x, y)) { - block = level.blockmap.blocklinks[y*level.blockmap.bmapwidth + x]; + block = Level->blockmap.blocklinks[y*Level->blockmap.bmapwidth + x]; } else { @@ -983,9 +987,9 @@ AActor *FBlockThingsIterator::Next(bool centeronly) if (centeronly) { // Block boundaries for compatibility mode - double blockleft = (curx * FBlockmap::MAPBLOCKUNITS) + level.blockmap.bmaporgx; + double blockleft = (curx * FBlockmap::MAPBLOCKUNITS) + Level->blockmap.bmaporgx; double blockright = blockleft + FBlockmap::MAPBLOCKUNITS; - double blockbottom = (cury * FBlockmap::MAPBLOCKUNITS) + level.blockmap.bmaporgy; + double blockbottom = (cury * FBlockmap::MAPBLOCKUNITS) + Level->blockmap.bmaporgy; double blocktop = blockbottom + FBlockmap::MAPBLOCKUNITS; // only return actors with the center in this block @@ -1052,24 +1056,24 @@ AActor *FBlockThingsIterator::Next(bool centeronly) //=========================================================================== FMultiBlockThingsIterator::FMultiBlockThingsIterator(FPortalGroupArray &check, AActor *origin, double checkradius, bool ignorerestricted) - : checklist(check) + : checklist(check), blockIterator(origin->Level) { checkpoint = origin->Pos(); - if (!check.inited) level.CollectConnectedGroups(origin->Sector->PortalGroup, checkpoint, origin->Top(), checkradius, checklist); + if (!check.inited) origin->Level->CollectConnectedGroups(origin->Sector->PortalGroup, checkpoint, origin->Top(), checkradius, checklist); checkpoint.Z = checkradius == -1? origin->radius : checkradius; basegroup = origin->Sector->PortalGroup; Reset(); } -FMultiBlockThingsIterator::FMultiBlockThingsIterator(FPortalGroupArray &check, double checkx, double checky, double checkz, double checkh, double checkradius, bool ignorerestricted, sector_t *newsec) - : checklist(check) +FMultiBlockThingsIterator::FMultiBlockThingsIterator(FPortalGroupArray &check, FLevelLocals *Level, double checkx, double checky, double checkz, double checkh, double checkradius, bool ignorerestricted, sector_t *newsec) + : checklist(check), blockIterator(Level) { checkpoint.X = checkx; checkpoint.Y = checky; checkpoint.Z = checkz; - if (newsec == NULL) newsec = level.PointInSector(checkx, checky); + if (newsec == NULL) newsec = Level->PointInSector(checkx, checky); basegroup = newsec->PortalGroup; - if (!check.inited) level.CollectConnectedGroups(basegroup, checkpoint, checkz + checkh, checkradius, checklist); + if (!check.inited) Level->CollectConnectedGroups(basegroup, checkpoint, checkz + checkh, checkradius, checklist); checkpoint.Z = checkradius; Reset(); } @@ -1086,7 +1090,7 @@ bool FMultiBlockThingsIterator::Next(FMultiBlockThingsIterator::CheckResult *ite if (thing != NULL) { item->thing = thing; - item->Position = checkpoint + level.Displacements.getOffset(basegroup, thing->Sector->PortalGroup); + item->Position = checkpoint + blockIterator.Level->Displacements.getOffset(basegroup, thing->Sector->PortalGroup); item->portalflags = portalflags; return true; } @@ -1125,7 +1129,7 @@ bool FMultiBlockThingsIterator::Next(FMultiBlockThingsIterator::CheckResult *ite void FMultiBlockThingsIterator::startIteratorForGroup(int group) { - DVector2 offset = level.Displacements.getOffset(basegroup, group); + DVector2 offset = blockIterator.Level->Displacements.getOffset(basegroup, group); offset.X += checkpoint.X; offset.Y += checkpoint.Y; bbox.setBox(offset.X, offset.Y, checkpoint.Z); @@ -1168,7 +1172,7 @@ TArray FPathTraverse::intercepts(128); void FPathTraverse::AddLineIntercepts(int bx, int by) { - FBlockLinesIterator it(bx, by, bx, by, true); + FBlockLinesIterator it(Level, bx, by, bx, by, true); line_t *ld; while ((ld = it.Next())) @@ -1542,7 +1546,7 @@ void FPathTraverse::init(double x1, double y1, double x2, double y2, int flags, bool compatible = (flags & PT_COMPATIBLE) && (i_compatflags & COMPATF_HITSCAN); // we want to use one list of checked actors for the entire operation - FBlockThingsIterator btit; + FBlockThingsIterator btit(Level); for (count = 0 ; count < 1000 ; count++) { if (flags & PT_ADDLINES) @@ -1689,14 +1693,15 @@ AActor *P_BlockmapSearch (AActor *mo, int distance, AActor *(*check)(AActor*, in int finalStop; int count; AActor *target; - int bmapwidth = level.blockmap.bmapwidth; - int bmapheight = level.blockmap.bmapheight; + auto Level = mo->Level; + int bmapwidth = Level->blockmap.bmapwidth; + int bmapheight = Level->blockmap.bmapheight; - startX = level.blockmap.GetBlockX(mo->X()); - startY = level.blockmap.GetBlockY(mo->Y()); + startX = Level->blockmap.GetBlockX(mo->X()); + startY = Level->blockmap.GetBlockY(mo->Y()); validcount++; - if (level.blockmap.isValidBlock(startX, startY)) + if (Level->blockmap.isValidBlock(startX, startY)) { if ( (target = check (mo, startY*bmapwidth+startX, params)) ) { // found a target right away @@ -1787,7 +1792,7 @@ static AActor *RoughBlockCheck (AActor *mo, int index, void *param) FBlockNode *link; - for (link = level.blockmap.blocklinks[index]; link != NULL; link = link->NextActor) + for (link = mo->Level->blockmap.blocklinks[index]; link != NULL; link = link->NextActor) { if (link->Me != mo) { @@ -1936,8 +1941,8 @@ subsector_t *FLevelLocals::PointInSubsector(double x, double y) { int side; - auto node = level.HeadGamenode(); - if (node == nullptr) return &level.subsectors[0]; + auto node = HeadGamenode(); + if (node == nullptr) return &subsectors[0]; fixed_t xx = FloatToFixed(x); fixed_t yy = FloatToFixed(y); @@ -1960,8 +1965,8 @@ subsector_t *FLevelLocals::PointInSubsector(double x, double y) sector_t *FLevelLocals::PointInSectorBuggy(double x, double y) { // single subsector is a special case - auto node = level.HeadGamenode(); - if (node == nullptr) return level.subsectors[0].sector; + auto node = HeadGamenode(); + if (node == nullptr) return subsectors[0].sector; do { // Use original buggy point-on-side test when spawning @@ -1991,10 +1996,10 @@ subsector_t *FLevelLocals::PointInRenderSubsector (fixed_t x, fixed_t y) int side; // single subsector is a special case - if (level.nodes.Size() == 0) - return &level.subsectors[0]; + if (nodes.Size() == 0) + return &subsectors[0]; - node = level.HeadNode(); + node = HeadNode(); do { diff --git a/src/p_maputl.h b/src/p_maputl.h index c8b5cd9ff..161eaac29 100644 --- a/src/p_maputl.h +++ b/src/p_maputl.h @@ -206,6 +206,7 @@ private: class FBlockLinesIterator { friend class FMultiBlockLinesIterator; + FLevelLocals *Level; int minx, maxx; int miny, maxy; @@ -216,11 +217,11 @@ class FBlockLinesIterator void StartBlock(int x, int y); - FBlockLinesIterator() {} + FBlockLinesIterator(FLevelLocals *l) { Level = l; } void init(const FBoundingBox &box); public: - FBlockLinesIterator(int minx, int miny, int maxx, int maxy, bool keepvalidcount = false); - FBlockLinesIterator(const FBoundingBox &box); + FBlockLinesIterator(FLevelLocals *Level, int minx, int miny, int maxx, int maxy, bool keepvalidcount = false); + FBlockLinesIterator(FLevelLocals *Level, const FBoundingBox &box); line_t *Next(); void Reset() { StartBlock(minx, miny); } }; @@ -254,7 +255,7 @@ public: }; FMultiBlockLinesIterator(FPortalGroupArray &check, AActor *origin, double checkradius = -1); - FMultiBlockLinesIterator(FPortalGroupArray &check, double checkx, double checky, double checkz, double checkh, double checkradius, sector_t *newsec); + FMultiBlockLinesIterator(FPortalGroupArray &check, FLevelLocals *Level, double checkx, double checky, double checkz, double checkh, double checkradius, sector_t *newsec); bool Next(CheckResult *item); void Reset(); @@ -276,6 +277,7 @@ public: class FBlockThingsIterator { + FLevelLocals *Level; int minx, maxx; int miny, maxy; @@ -302,14 +304,14 @@ class FBlockThingsIterator // The following is only for use in the path traverser // and therefore declared private. - FBlockThingsIterator(); + FBlockThingsIterator(FLevelLocals *); friend class FPathTraverse; friend class FMultiBlockThingsIterator; public: - FBlockThingsIterator(int minx, int miny, int maxx, int maxy); - FBlockThingsIterator(const FBoundingBox &box) + FBlockThingsIterator(FLevelLocals *Level, int minx, int miny, int maxx, int maxy); + FBlockThingsIterator(FLevelLocals *Level, const FBoundingBox &box) { init(box); } @@ -331,7 +333,7 @@ class FMultiBlockThingsIterator void startIteratorForGroup(int group); protected: - FMultiBlockThingsIterator(FPortalGroupArray &check) : checklist(check) {} + FMultiBlockThingsIterator(FPortalGroupArray &check, FLevelLocals *Level) : checklist(check), blockIterator(Level) {} public: struct CheckResult @@ -342,7 +344,7 @@ public: }; FMultiBlockThingsIterator(FPortalGroupArray &check, AActor *origin, double checkradius = -1, bool ignorerestricted = false); - FMultiBlockThingsIterator(FPortalGroupArray &check, double checkx, double checky, double checkz, double checkh, double checkradius, bool ignorerestricted, sector_t *newsec); + FMultiBlockThingsIterator(FPortalGroupArray &check, FLevelLocals *Level, double checkx, double checky, double checkz, double checkh, double checkradius, bool ignorerestricted, sector_t *newsec); bool Next(CheckResult *item); void Reset(); const FBoundingBox &Box() const @@ -411,4 +413,4 @@ double P_InterceptVector(const divline_t *v2, const divline_t *v1); #define PT_COMPATIBLE 4 #define PT_DELTA 8 // x2,y2 is passed as a delta, not as an endpoint -#endif \ No newline at end of file +#endif diff --git a/src/p_secnodes.cpp b/src/p_secnodes.cpp index d7b2c1a64..3b3c1fced 100644 --- a/src/p_secnodes.cpp +++ b/src/p_secnodes.cpp @@ -237,7 +237,7 @@ msecnode_t *P_CreateSecNodeList(AActor *thing, double radius, msecnode_t *sector } FBoundingBox box(thing->X(), thing->Y(), radius); - FBlockLinesIterator it(box); + FBlockLinesIterator it(thing->Level, box); line_t *ld; while ((ld = it.Next())) diff --git a/src/p_sight.cpp b/src/p_sight.cpp index 0577f0d62..2e31e5f19 100644 --- a/src/p_sight.cpp +++ b/src/p_sight.cpp @@ -914,7 +914,7 @@ sightcounts[0]++; SightTask task = { 0, topslope, bottomslope, -1, sec->PortalGroup }; - SightCheck s(&level); + SightCheck s(t1->Level); s.init(t1, t2, sec, &task, flags); res = s.P_SightPathTraverse (); if (!res) diff --git a/src/p_spec.cpp b/src/p_spec.cpp index 942441890..effc55eed 100644 --- a/src/p_spec.cpp +++ b/src/p_spec.cpp @@ -249,7 +249,7 @@ DEFINE_ACTION_FUNCTION(_Line, RemoteActivate) bool P_TestActivateLine (line_t *line, AActor *mo, int side, int activationType, DVector3 *optpos) { - auto Level = &level; + auto Level = line->GetLevel(); int lineActivation = line->activation; if (line->flags & ML_FIRSTSIDEONLY && side == 1) diff --git a/src/p_trace.cpp b/src/p_trace.cpp index 9fcecede5..624f11bd7 100644 --- a/src/p_trace.cpp +++ b/src/p_trace.cpp @@ -779,7 +779,7 @@ bool FTraceInfo::TraceTraverse (int ptflags) // Do a 3D floor check in the starting sector Setup3DFloors(); - FPathTraverse it(&level, Start.X, Start.Y, Vec.X * MaxDist, Vec.Y * MaxDist, ptflags | PT_DELTA, startfrac); + FPathTraverse it(Level, Start.X, Start.Y, Vec.X * MaxDist, Vec.Y * MaxDist, ptflags | PT_DELTA, startfrac); intercept_t *in; int lastsplashsector = -1; diff --git a/src/po_man.cpp b/src/po_man.cpp index 9f52f5a89..8c2aa750f 100644 --- a/src/po_man.cpp +++ b/src/po_man.cpp @@ -1232,7 +1232,7 @@ void FPolyObj::LinkPolyobj () void FPolyObj::RecalcActorFloorCeil(FBoundingBox bounds) const { - FBlockThingsIterator it(bounds); + FBlockThingsIterator it(Level, bounds); AActor *actor; while ((actor = it.Next()) != nullptr) diff --git a/src/portal.cpp b/src/portal.cpp index ed321829c..6cca8385d 100644 --- a/src/portal.cpp +++ b/src/portal.cpp @@ -1147,7 +1147,7 @@ bool FLevelLocals::CollectConnectedGroups(int startgroup, const DVector3 &positi { DVector2 disp = Displacements.getOffset(startgroup, thisgroup & ~FPortalGroupArray::FLAT); FBoundingBox box(position.X + disp.X, position.Y + disp.Y, checkradius); - FBlockLinesIterator it(box); + FBlockLinesIterator it(this, box); line_t *ld; while ((ld = it.Next())) { diff --git a/src/scripting/vmiterators.cpp b/src/scripting/vmiterators.cpp index f543ee59a..825dbef04 100644 --- a/src/scripting/vmiterators.cpp +++ b/src/scripting/vmiterators.cpp @@ -109,7 +109,7 @@ public: } DBlockLinesIterator(double x, double y, double z, double height, double radius, sector_t *sec) - :FMultiBlockLinesIterator(check, x, y, z, height, radius, sec) + :FMultiBlockLinesIterator(check, &level, x, y, z, height, radius, sec) { cres.line = nullptr; cres.Position.Zero(); @@ -183,7 +183,7 @@ public: } DBlockThingsIterator(double checkx, double checky, double checkz, double checkh, double checkradius, bool ignorerestricted, sector_t *newsec) - : iterator(check, checkx, checky, checkz, checkh, checkradius, ignorerestricted, newsec) + : iterator(check, &level, checkx, checky, checkz, checkh, checkradius, ignorerestricted, newsec) { cres.thing = nullptr; cres.Position.Zero(); From d4ee52f606031f526f0ce139dda110ed515f4e23 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 29 Jan 2019 04:17:58 +0100 Subject: [PATCH 081/164] - handle G_StartSlideshow --- src/g_game.cpp | 8 ++++---- src/g_game.h | 2 +- src/p_acs.cpp | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/g_game.cpp b/src/g_game.cpp index 1d9b73950..6490ab25e 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -2859,17 +2859,17 @@ bool G_CheckDemoStatus (void) return false; } -void G_StartSlideshow(FName whichone) +void G_StartSlideshow(FLevelLocals *Level, FName whichone) { gameaction = ga_slideshow; - SelectedSlideshow = whichone == NAME_None ? level.info->slideshow : whichone; + SelectedSlideshow = whichone == NAME_None ? Level->info->slideshow : whichone; } DEFINE_ACTION_FUNCTION(FLevelLocals, StartSlideshow) { - PARAM_PROLOGUE; + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); PARAM_NAME(whichone); - G_StartSlideshow(whichone); + G_StartSlideshow(self, whichone); return 0; } diff --git a/src/g_game.h b/src/g_game.h index b1b18d5c8..119c531e3 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -68,7 +68,7 @@ void G_Ticker (void); bool G_Responder (event_t* ev); void G_ScreenShot (char *filename); -void G_StartSlideshow(FName whichone); +void G_StartSlideshow(FLevelLocals *Level, FName whichone); FString G_BuildSaveName (const char *prefix, int slot); diff --git a/src/p_acs.cpp b/src/p_acs.cpp index d6285bff8..2c675d0b0 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -6619,7 +6619,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) return ScriptCall(activator, argCount, args); case ACSF_StartSlideshow: - G_StartSlideshow(FName(Level->Behaviors.LookupString(args[0]))); + G_StartSlideshow(Level, FName(Level->Behaviors.LookupString(args[0]))); break; case ACSF_GetSectorHealth: From 14971c8c3a5ebfe42f255ef65a306b68cdf765b1 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 29 Jan 2019 04:20:36 +0100 Subject: [PATCH 082/164] - missed references in p_effect.cpp --- src/p_effect.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/p_effect.cpp b/src/p_effect.cpp index fbfb0f322..a621d1961 100644 --- a/src/p_effect.cpp +++ b/src/p_effect.cpp @@ -170,12 +170,12 @@ void P_ClearParticles (FLevelLocals *Level) void P_FindParticleSubsectors (FLevelLocals *Level) { - if (Level->ParticlesInSubsec.Size() < level.subsectors.Size()) + if (Level->ParticlesInSubsec.Size() < Level->subsectors.Size()) { - Level->ParticlesInSubsec.Reserve (level.subsectors.Size() - Level->ParticlesInSubsec.Size()); + Level->ParticlesInSubsec.Reserve (Level->subsectors.Size() - Level->ParticlesInSubsec.Size()); } - fillshort (&Level->ParticlesInSubsec[0], level.subsectors.Size(), NO_PARTICLE); + fillshort (&Level->ParticlesInSubsec[0], Level->subsectors.Size(), NO_PARTICLE); if (!r_particles) { @@ -239,7 +239,7 @@ void P_ThinkParticles (FLevelLocals *Level) { particle = &Level->Particles[i]; i = particle->tnext; - if (!particle->notimefreeze && level.isFrozen()) + if (!particle->notimefreeze && Level->isFrozen()) { prev = particle; continue; @@ -326,7 +326,7 @@ void P_RunEffects (FLevelLocals *Level) { if (players[consoleplayer].camera == NULL) return; - int pnum = players[consoleplayer].camera->Sector->Index() * level.sectors.Size(); + int pnum = players[consoleplayer].camera->Sector->Index() * Level->sectors.Size(); AActor *actor; TThinkerIterator iterator; @@ -375,7 +375,7 @@ static void MakeFountain (AActor *actor, int color1, int color2) { particle_t *particle; - if (!(level.time & 1)) + if (!(actor->Level->time & 1)) return; particle = JitterParticle (actor->Level, 51); From 06e5dd1d86f3bec914d5921f0425a816d01011b1 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 29 Jan 2019 04:27:21 +0100 Subject: [PATCH 083/164] - Handle level in bot code --- src/b_bot.h | 6 +++--- src/b_game.cpp | 12 ++++++------ src/d_main.cpp | 2 +- src/d_net.cpp | 4 ++-- src/g_game.cpp | 2 +- src/g_level.cpp | 2 +- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/b_bot.h b/src/b_bot.h index a24f07a46..cdcda5b6a 100644 --- a/src/b_bot.h +++ b/src/b_bot.h @@ -120,8 +120,8 @@ public: void Init (); void End(); bool SpawnBot (const char *name, int color = NOCOLOR); - void TryAddBot (uint8_t **stream, int player); - void RemoveAllBots (bool fromlist); + void TryAddBot (FLevelLocals *Level, uint8_t **stream, int player); + void RemoveAllBots (FLevelLocals *Level, bool fromlist); bool LoadBots (); void ForgetBots (); @@ -153,7 +153,7 @@ public: private: //(b_game.cpp) - bool DoAddBot (uint8_t *info, botskill_t skill); + bool DoAddBot (FLevelLocals *Level, uint8_t *info, botskill_t skill); protected: bool ctf; diff --git a/src/b_game.cpp b/src/b_game.cpp index 3dd90d224..beed7f3b3 100644 --- a/src/b_game.cpp +++ b/src/b_game.cpp @@ -340,7 +340,7 @@ bool FCajunMaster::SpawnBot (const char *name, int color) return true; } -void FCajunMaster::TryAddBot (uint8_t **stream, int player) +void FCajunMaster::TryAddBot (FLevelLocals *Level, uint8_t **stream, int player) { int botshift = ReadByte (stream); char *info = ReadString (stream); @@ -363,7 +363,7 @@ void FCajunMaster::TryAddBot (uint8_t **stream, int player) } } - if (DoAddBot ((uint8_t *)info, skill)) + if (DoAddBot (Level,(uint8_t *)info, skill)) { //Increment this. botnum++; @@ -384,7 +384,7 @@ void FCajunMaster::TryAddBot (uint8_t **stream, int player) delete[] info; } -bool FCajunMaster::DoAddBot (uint8_t *info, botskill_t skill) +bool FCajunMaster::DoAddBot (FLevelLocals *Level, uint8_t *info, botskill_t skill) { int bnum; @@ -405,7 +405,7 @@ bool FCajunMaster::DoAddBot (uint8_t *info, botskill_t skill) D_ReadUserInfoStrings (bnum, &info, false); multiplayer = true; //Prevents cheating and so on; emulates real netgame (almost). - players[bnum].Bot = level.CreateThinker(); + players[bnum].Bot = Level->CreateThinker(); players[bnum].Bot->player = &players[bnum]; players[bnum].Bot->skill = skill; playeringame[bnum] = true; @@ -417,11 +417,11 @@ bool FCajunMaster::DoAddBot (uint8_t *info, botskill_t skill) else Printf ("%s joined the game\n", players[bnum].userinfo.GetName()); - level.DoReborn (bnum, true); + Level->DoReborn (bnum, true); return true; } -void FCajunMaster::RemoveAllBots (bool fromlist) +void FCajunMaster::RemoveAllBots (FLevelLocals *Level, bool fromlist) { int i, j; diff --git a/src/d_main.cpp b/src/d_main.cpp index 098eb6876..e835e33a1 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -954,7 +954,7 @@ void D_Display () void D_ErrorCleanup () { savegamerestore = false; - bglobal.RemoveAllBots (true); + bglobal.RemoveAllBots (&level, true); D_QuitNetGame (); if (demorecording || demoplayback) G_CheckDemoStatus (); diff --git a/src/d_net.cpp b/src/d_net.cpp index f062e8ddf..abd703d13 100644 --- a/src/d_net.cpp +++ b/src/d_net.cpp @@ -2230,11 +2230,11 @@ void Net_DoCommand (int type, uint8_t **stream, int player) break; case DEM_ADDBOT: - bglobal.TryAddBot (stream, player); + bglobal.TryAddBot (&level, stream, player); break; case DEM_KILLBOTS: - bglobal.RemoveAllBots (true); + bglobal.RemoveAllBots (&level, true); Printf ("Removed all bots\n"); break; diff --git a/src/g_game.cpp b/src/g_game.cpp index 6490ab25e..119e99ee5 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -1893,7 +1893,7 @@ void G_DoLoadGame () // Read intermission data for hubs G_SerializeHub(arc); - bglobal.RemoveAllBots(true); + bglobal.RemoveAllBots(&level, true); FString cvar; arc("importantcvars", cvar); diff --git a/src/g_level.cpp b/src/g_level.cpp index 0017d9334..07b98057c 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1161,7 +1161,7 @@ void FLevelLocals::WorldDone (void) //Added by mc if (deathmatch) { - bglobal.RemoveAllBots(consoleplayer != Net_Arbitrator); + bglobal.RemoveAllBots(this, consoleplayer != Net_Arbitrator); } if (flags & LEVEL_CHANGEMAPCHEAT) From 3c565c9e86f83744028bf3543c319ba302650396 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 29 Jan 2019 04:44:44 +0100 Subject: [PATCH 084/164] - moved the static sky variables into FLevelLocals and removed the redundant ones for the texture ID. --- src/c_cmds.cpp | 6 ++-- src/d_main.cpp | 3 +- src/fragglescript/t_load.cpp | 4 +-- src/g_level.cpp | 14 +++----- src/g_levellocals.h | 4 +++ src/hwrenderer/scene/hw_sky.cpp | 18 +++++----- src/p_acs.cpp | 6 ++-- src/p_saveg.cpp | 5 ++- src/p_setup.cpp | 14 +++----- src/polyrenderer/scene/poly_sky.cpp | 21 +++++------ src/r_sky.cpp | 56 ++++++++++++++++------------- src/r_sky.h | 9 +++-- src/swrenderer/plane/r_skyplane.cpp | 20 +++++------ 13 files changed, 89 insertions(+), 91 deletions(-) diff --git a/src/c_cmds.cpp b/src/c_cmds.cpp index e2f9b06f4..43f84a0d7 100644 --- a/src/c_cmds.cpp +++ b/src/c_cmds.cpp @@ -1055,21 +1055,21 @@ CCMD(changesky) if (netgame || argv.argc()<2) return; + // This only alters the primary level's sky setting. For testing out a sky that is sufficient. sky1name = argv[1]; if (sky1name[0] != 0) { FTextureID newsky = TexMan.GetTextureID(sky1name, ETextureType::Wall, FTextureManager::TEXMAN_Overridable | FTextureManager::TEXMAN_ReturnFirst); if (newsky.Exists()) { - // This only alters the primary level's sky setting. - sky1texture = currentUILevel->skytexture1 = newsky; + currentUILevel->skytexture1 = newsky; } else { Printf("changesky: Texture '%s' not found\n", sky1name); } } - R_InitSkyMap (); + InitSkyMap (currentUILevel); } //----------------------------------------------------------------------------- diff --git a/src/d_main.cpp b/src/d_main.cpp index e835e33a1..345e08868 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -390,8 +390,7 @@ CUSTOM_CVAR (Int, dmflags, 0, CVAR_SERVERINFO) { // In case DF_NO_FREELOOK was changed, reinitialize the sky // map. (If no freelook, then no need to stretch the sky.) - if (sky1texture.isValid()) - R_InitSkyMap (); + R_InitSkyMap (); if (self & DF_NO_FREELOOK) { diff --git a/src/fragglescript/t_load.cpp b/src/fragglescript/t_load.cpp index 2bad1ddec..bcb4dadcf 100644 --- a/src/fragglescript/t_load.cpp +++ b/src/fragglescript/t_load.cpp @@ -143,8 +143,8 @@ void FScriptLoader::ParseInfoCmd(char *line, FString &scriptsrc) sc.MustGetStringName("="); sc.MustGetString(); - sky2texture = sky1texture = Level->skytexture1 = Level->skytexture2 = TexMan.GetTextureID (sc.String, ETextureType::Wall, FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_ReturnFirst); - R_InitSkyMap (); + Level->skytexture1 = Level->skytexture2 = TexMan.GetTextureID (sc.String, ETextureType::Wall, FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_ReturnFirst); + InitSkyMap (Level); } else if (sc.Compare("interpic")) { diff --git a/src/g_level.cpp b/src/g_level.cpp index 07b98057c..6f8c23216 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1001,14 +1001,8 @@ void G_DoLoadLevel (const FString &nextmapname, int position, bool autosave, boo // setting one. skyflatnum = TexMan.GetTextureID (gameinfo.SkyFlatName, ETextureType::Flat, FTextureManager::TEXMAN_Overridable); - // DOOM determines the sky texture to be used - // depending on the current episode and the game version. - // [RH] Fetch sky parameters from FLevelLocals. - sky1texture = level.skytexture1; - sky2texture = level.skytexture2; - // [RH] Set up details about sky rendering - R_InitSkyMap (); + InitSkyMap (&level); for (i = 0; i < MAXPLAYERS; i++) { @@ -2162,9 +2156,9 @@ DEFINE_ACTION_FUNCTION(FLevelLocals, ChangeSky) PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); PARAM_INT(sky1); PARAM_INT(sky2); - sky1texture = self->skytexture1 = FSetTextureID(sky1); - sky2texture = self->skytexture2 = FSetTextureID(sky2); - R_InitSkyMap(); + self->skytexture1 = FSetTextureID(sky1); + self->skytexture2 = FSetTextureID(sky2); + InitSkyMap(self); return 0; } diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 7977b6fc3..752b5aced 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -492,6 +492,10 @@ public: float skyspeed1; // Scrolling speed of sky textures, in pixels per ms float skyspeed2; + double sky1pos, sky2pos; + float hw_sky1pos, hw_sky2pos; + bool skystretch; + int total_secrets; int found_secrets; diff --git a/src/hwrenderer/scene/hw_sky.cpp b/src/hwrenderer/scene/hw_sky.cpp index a446facc2..7b4be8631 100644 --- a/src/hwrenderer/scene/hw_sky.cpp +++ b/src/hwrenderer/scene/hw_sky.cpp @@ -72,24 +72,24 @@ void GLSkyInfo::init(HWDrawInfo *di, int sky1, PalEntry FadeColor) normalsky: if (di->Level->flags&LEVEL_DOUBLESKY) { - texture[1] = FMaterial::ValidateTexture(sky1texture, false, true); - x_offset[1] = hw_sky1pos; + texture[1] = FMaterial::ValidateTexture(di->Level->skytexture1, false, true); + x_offset[1] = di->Level->hw_sky1pos; doublesky = true; } if ((di->Level->flags&LEVEL_SWAPSKIES || (sky1 == PL_SKYFLAT) || (di->Level->flags&LEVEL_DOUBLESKY)) && - sky2texture != sky1texture) // If both skies are equal use the scroll offset of the first! + di->Level->skytexture2 != di->Level->skytexture1) // If both skies are equal use the scroll offset of the first! { - texture[0] = FMaterial::ValidateTexture(sky2texture, false, true); - skytexno1 = sky2texture; + texture[0] = FMaterial::ValidateTexture(di->Level->skytexture2, false, true); + skytexno1 = di->Level->skytexture2; sky2 = true; - x_offset[0] = hw_sky2pos; + x_offset[0] = di->Level->hw_sky2pos; } else if (!doublesky) { - texture[0] = FMaterial::ValidateTexture(sky1texture, false, true); - skytexno1 = sky1texture; - x_offset[0] = hw_sky1pos; + texture[0] = FMaterial::ValidateTexture(di->Level->skytexture1, false, true); + skytexno1 = di->Level->skytexture1; + x_offset[0] = di->Level->hw_sky1pos; } } if (di->Level->skyfog > 0) diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 2c675d0b0..0857dc1dd 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -9762,13 +9762,13 @@ scriptwait: sky2name = Level->Behaviors.LookupString (STACK(1)); if (sky1name[0] != 0) { - sky1texture = Level->skytexture1 = TexMan.GetTextureID(sky1name, ETextureType::Wall, FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_ReturnFirst); + Level->skytexture1 = TexMan.GetTextureID(sky1name, ETextureType::Wall, FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_ReturnFirst); } if (sky2name[0] != 0) { - sky2texture = Level->skytexture2 = TexMan.GetTextureID(sky2name, ETextureType::Wall, FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_ReturnFirst); + Level->skytexture2 = TexMan.GetTextureID(sky2name, ETextureType::Wall, FTextureManager::TEXMAN_Overridable|FTextureManager::TEXMAN_ReturnFirst); } - R_InitSkyMap (); + InitSkyMap (Level); sp -= 2; } break; diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index fd6f7138b..b860eb4d1 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -57,6 +57,7 @@ #include "g_levellocals.h" #include "events.h" #include "p_destructible.h" +#include "r_sky.h" #include "fragglescript/t_script.h" //========================================================================== @@ -976,9 +977,7 @@ void FLevelLocals::Serialize(FSerializer &arc, bool hubload) if (arc.isReading()) { - sky1texture = skytexture1; - sky2texture = skytexture2; - R_InitSkyMap(); + InitSkyMap(this); AirControlChanged(); bglobal.freeze = !!(frozenstate & 2); } diff --git a/src/p_setup.cpp b/src/p_setup.cpp index fb9499a00..4a9955dd9 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -175,20 +175,14 @@ static void PrecacheLevel(FLevelLocals *Level) AddToList(hitlist.Data(), Level->sides[i].GetTexture(side_t::bottom), FTextureManager::HIT_Wall); } - // Sky texture is always present. - // Note that F_SKY1 is the name used to - // indicate a sky floor/ceiling as a flat, - // while the sky texture is stored like - // a wall texture, with an episode dependant - // name. - if (sky1texture.isValid()) + if (Level->skytexture1.isValid()) { - AddToList(hitlist.Data(), sky1texture, FTextureManager::HIT_Sky); + AddToList(hitlist.Data(), Level->skytexture1, FTextureManager::HIT_Sky); } - if (sky2texture.isValid()) + if (Level->skytexture2.isValid()) { - AddToList(hitlist.Data(), sky2texture, FTextureManager::HIT_Sky); + AddToList(hitlist.Data(), Level->skytexture2, FTextureManager::HIT_Sky); } for (auto n : gameinfo.PrecachedTextures) diff --git a/src/polyrenderer/scene/poly_sky.cpp b/src/polyrenderer/scene/poly_sky.cpp index b279746c0..0584f5d96 100644 --- a/src/polyrenderer/scene/poly_sky.cpp +++ b/src/polyrenderer/scene/poly_sky.cpp @@ -291,9 +291,10 @@ void PolySkySetup::Update() double skyscale = 0.0; float skyiscale = 0.0f; fixed_t sky1cyl = 0, sky2cyl = 0; + auto Level = PolyRenderer::Instance()->Level; - auto skytex1 = TexMan.GetPalettedTexture(sky1texture, true); - auto skytex2 = TexMan.GetPalettedTexture(sky2texture, true); + auto skytex1 = TexMan.GetPalettedTexture(Level->skytexture1, true); + auto skytex2 = TexMan.GetPalettedTexture(Level->skytexture2, true); if (skytex1) { @@ -307,7 +308,7 @@ void PolySkySetup::Update() } else if (skyheight > 200) { - skytexturemid = (200 - skyheight) * sskytex1->GetScale().Y + ((r_skymode == 2 && !(PolyRenderer::Instance()->Level->flags & LEVEL_FORCETILEDSKY)) ? skytex1->GetSkyOffset() : 0); + skytexturemid = (200 - skyheight) * sskytex1->GetScale().Y + ((r_skymode == 2 && !(Level->flags & LEVEL_FORCETILEDSKY)) ? skytex1->GetSkyOffset() : 0); } if (viewwidth != 0 && viewheight != 0) @@ -319,7 +320,7 @@ void PolySkySetup::Update() skyscale *= float(90. / r_viewpoint.FieldOfView.Degrees); } - if (skystretch) + if (Level->skystretch) { skyscale *= (double)SKYSTRETCH_HEIGHT / skyheight; skyiscale *= skyheight / (float)SKYSTRETCH_HEIGHT; @@ -339,13 +340,13 @@ void PolySkySetup::Update() if ((PolyRenderer::Instance()->Level->flags & LEVEL_SWAPSKIES) && !(PolyRenderer::Instance()->Level->flags & LEVEL_DOUBLESKY)) { - sky1tex = sky2texture; + sky1tex = Level->skytexture2; } else { - sky1tex = sky1texture; + sky1tex = Level->skytexture1; } - sky2tex = sky2texture; + sky2tex = Level->skytexture2; skymid = skytexturemid; skyangle = 0; @@ -360,8 +361,8 @@ void PolySkySetup::Update() else backskytex = nullptr; skyflip = false; - frontdpos = sky1pos; - backdpos = sky2pos; + frontdpos = Level->sky1pos; + backdpos = Level->sky2pos; frontcyl = sky1cyl; backcyl = sky2cyl; } @@ -371,7 +372,7 @@ void PolySkySetup::Update() backskytex = nullptr; frontcyl = sky2cyl; skyflip = false; - frontdpos = sky2pos; + frontdpos = Level->sky2pos; } else { // MBF's linedef-controlled skies diff --git a/src/r_sky.cpp b/src/r_sky.cpp index 94fb65644..5c62a81ac 100644 --- a/src/r_sky.cpp +++ b/src/r_sky.cpp @@ -43,10 +43,6 @@ // sky mapping // FTextureID skyflatnum; -FTextureID sky1texture, sky2texture; -double sky1pos, sky2pos; -float hw_sky1pos, hw_sky2pos; -bool skystretch; // [RH] Stretch sky texture if not taller than 128 pixels? // Also now controls capped skies. 0 = normal, 1 = stretched, 2 = capped @@ -65,31 +61,32 @@ CVAR(Float, skyoffset, 0, 0) // for testing // //========================================================================== -void R_InitSkyMap() +void InitSkyMap(FLevelLocals *Level) { int skyheight; FTexture *skytex1, *skytex2; // Do not allow the null texture which has no bitmap and will crash. - if (sky1texture.isNull()) + if (Level->skytexture1.isNull()) { - sky1texture = TexMan.CheckForTexture("-noflat-", ETextureType::Any); + Level->skytexture1 = TexMan.CheckForTexture("-noflat-", ETextureType::Any); } - if (sky2texture.isNull()) + if (Level->skytexture2.isNull()) { - sky2texture = TexMan.CheckForTexture("-noflat-", ETextureType::Any); + Level->skytexture2 = TexMan.CheckForTexture("-noflat-", ETextureType::Any); } - skytex1 = TexMan.GetTexture(sky1texture, false); - skytex2 = TexMan.GetTexture(sky2texture, false); + skytex1 = TexMan.GetTexture(Level->skytexture1, false); + skytex2 = TexMan.GetTexture(Level->skytexture2, false); if (skytex1 == nullptr) return; - if ((level.flags & LEVEL_DOUBLESKY) && skytex1->GetDisplayHeight() != skytex2->GetDisplayHeight()) + if ((Level->flags & LEVEL_DOUBLESKY) && skytex1->GetDisplayHeight() != skytex2->GetDisplayHeight()) { Printf(TEXTCOLOR_BOLD "Both sky textures must be the same height." TEXTCOLOR_NORMAL "\n"); - sky2texture = sky1texture; + Level->flags &= ~LEVEL_DOUBLESKY; + Level->skytexture1 = Level->skytexture2; } // There are various combinations for sky rendering depending on how tall the sky is: @@ -109,14 +106,23 @@ void R_InitSkyMap() if (skyheight >= 128 && skyheight < 200) { - skystretch = (r_skymode == 1 + Level->skystretch = (r_skymode == 1 && skyheight >= 128 - && level.IsFreelookAllowed() - && !(level.flags & LEVEL_FORCETILEDSKY)) ? 1 : 0; + && Level->IsFreelookAllowed() + && !(Level->flags & LEVEL_FORCETILEDSKY)) ? 1 : 0; } - else skystretch = false; + else Level->skystretch = false; } +void R_InitSkyMap() +{ + for(auto Level : AllLevels()) + { + InitSkyMap(Level); + } +} + + //========================================================================== // // R_UpdateSky @@ -127,14 +133,16 @@ void R_InitSkyMap() void R_UpdateSky (uint64_t mstime) { - // Scroll the sky double ms = (double)mstime * FRACUNIT; - sky1pos = ms * level.skyspeed1; - sky2pos = ms * level.skyspeed2; - - // The hardware renderer uses a different value range and clamps it to a single rotation - hw_sky1pos = (float)(fmod((double(mstime) * level.skyspeed1), 1024.) * (90. / 256.)); - hw_sky2pos = (float)(fmod((double(mstime) * level.skyspeed2), 1024.) * (90. / 256.)); + for(auto Level : AllLevels()) + { + // Scroll the sky + Level->sky1pos = ms * level.skyspeed1; + Level->sky2pos = ms * level.skyspeed2; + // The hardware renderer uses a different value range and clamps it to a single rotation + Level->hw_sky1pos = (float)(fmod((double(mstime) * level.skyspeed1), 1024.) * (90. / 256.)); + Level->hw_sky2pos = (float)(fmod((double(mstime) * level.skyspeed2), 1024.) * (90. / 256.)); + } } diff --git a/src/r_sky.h b/src/r_sky.h index 05154e2fd..9d80740c9 100644 --- a/src/r_sky.h +++ b/src/r_sky.h @@ -30,17 +30,16 @@ #include "textures/textures.h" +struct FLevelLocals; + extern FTextureID skyflatnum; -extern FTextureID sky1texture, sky2texture; -extern double sky1pos, sky2pos; -extern float hw_sky1pos, hw_sky2pos; -extern bool skystretch; extern int freelookviewheight; #define SKYSTRETCH_HEIGHT 228 // Called whenever the sky changes. -void R_InitSkyMap (); +void InitSkyMap(FLevelLocals *Level); +void R_InitSkyMap(); void R_UpdateSky (uint64_t mstime); // 57 world units roughly represent one sky texel for the glTranslate call. diff --git a/src/swrenderer/plane/r_skyplane.cpp b/src/swrenderer/plane/r_skyplane.cpp index d441f28e4..223a71b79 100644 --- a/src/swrenderer/plane/r_skyplane.cpp +++ b/src/swrenderer/plane/r_skyplane.cpp @@ -72,8 +72,8 @@ namespace swrenderer Thread = thread; auto Level = Thread->Viewport->Level(); - auto skytex1 = TexMan.GetPalettedTexture(sky1texture, true); - auto skytex2 = TexMan.GetPalettedTexture(sky2texture, true); + auto skytex1 = TexMan.GetPalettedTexture(Level->skytexture1, true); + auto skytex2 = TexMan.GetPalettedTexture(Level->skytexture2, true); if (skytex1 == nullptr) return; @@ -100,7 +100,7 @@ namespace swrenderer skyscale *= float(90. / r_viewpoint.FieldOfView.Degrees); } - if (skystretch) + if (Level->skystretch) { skyscale *= (double)SKYSTRETCH_HEIGHT / skyheight; skyiscale *= skyheight / (float)SKYSTRETCH_HEIGHT; @@ -123,13 +123,13 @@ namespace swrenderer if ((Level->flags & LEVEL_SWAPSKIES) && !(Level->flags & LEVEL_DOUBLESKY)) { - sky1tex = sky2texture; + sky1tex = Level->skytexture2; } else { - sky1tex = sky1texture; + sky1tex = Level->skytexture1; } - sky2tex = sky2texture; + sky2tex = Level->skytexture2; skymid = skytexturemid; skyangle = Thread->Viewport->viewpoint.Angles.Yaw.BAMs(); @@ -144,8 +144,8 @@ namespace swrenderer else backskytex = NULL; skyflip = 0; - frontdpos = sky1pos; - backdpos = sky2pos; + frontdpos = Level->sky1pos; + backdpos = Level->sky2pos; frontcyl = sky1cyl; backcyl = sky2cyl; } @@ -155,7 +155,7 @@ namespace swrenderer backskytex = NULL; frontcyl = sky2cyl; skyflip = 0; - frontdpos = sky2pos; + frontdpos = Level->sky2pos; } else { // MBF's linedef-controlled skies @@ -202,7 +202,7 @@ namespace swrenderer int frontxscale = int(frontskytex->GetScale().X * 1024); frontcyl = MAX(frontskytex->GetWidth(), frontxscale); - if (skystretch) + if (Level->skystretch) { skymid = skymid * frontskytex->GetScaledHeightDouble() / SKYSTRETCH_HEIGHT; } From eb5a39960e6be950521422c5634f95e592378b21 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 29 Jan 2019 15:22:26 +0100 Subject: [PATCH 085/164] - missed a few references --- src/r_sky.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/r_sky.cpp b/src/r_sky.cpp index 5c62a81ac..7ff9973f0 100644 --- a/src/r_sky.cpp +++ b/src/r_sky.cpp @@ -137,12 +137,12 @@ void R_UpdateSky (uint64_t mstime) for(auto Level : AllLevels()) { // Scroll the sky - Level->sky1pos = ms * level.skyspeed1; - Level->sky2pos = ms * level.skyspeed2; + Level->sky1pos = ms * Level->skyspeed1; + Level->sky2pos = ms * Level->skyspeed2; // The hardware renderer uses a different value range and clamps it to a single rotation - Level->hw_sky1pos = (float)(fmod((double(mstime) * level.skyspeed1), 1024.) * (90. / 256.)); - Level->hw_sky2pos = (float)(fmod((double(mstime) * level.skyspeed2), 1024.) * (90. / 256.)); + Level->hw_sky1pos = (float)(fmod((double(mstime) * Level->skyspeed1), 1024.) * (90. / 256.)); + Level->hw_sky2pos = (float)(fmod((double(mstime) * Level->skyspeed2), 1024.) * (90. / 256.)); } } From 14101fa4470390252a99cc85b726e248e0bad2f0 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 29 Jan 2019 16:06:17 +0100 Subject: [PATCH 086/164] - health groups and software rendering textures freed of 'level' Edited cherry-pick of an older commit. --- src/g_game.h | 1 + src/maploader/maploader.cpp | 2 +- src/p_acs.cpp | 8 +-- src/p_destructible.cpp | 66 +++++++++++---------- src/p_destructible.h | 11 ++-- src/p_lnspec.cpp | 8 +-- src/p_maputl.h | 4 +- src/p_saveg.cpp | 2 +- src/polyrenderer/scene/poly_wall.cpp | 2 +- src/polyrenderer/scene/poly_wallsprite.cpp | 2 +- src/r_defs.h | 5 ++ src/swrenderer/line/r_line.cpp | 14 ++--- src/swrenderer/line/r_renderdrawsegment.cpp | 6 +- src/swrenderer/textures/r_swtexture.h | 4 +- wadsrc/static/zscript/base.txt | 3 +- wadsrc/static/zscript/destructible.txt | 5 +- 16 files changed, 79 insertions(+), 64 deletions(-) diff --git a/src/g_game.h b/src/g_game.h index 119c531e3..96ca6d8e2 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -34,6 +34,7 @@ struct event_t; class AActor; +struct FLevelLocals; // // GAME diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index b3695754e..aa4c2bd7c 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -3285,7 +3285,7 @@ void MapLoader::LoadLevel(MapData *map, const char *lumpname, int position) SWRenderer->SetColormap(Level); //The SW renderer needs to do some special setup for the level's default colormap. InitPortalGroups(Level); - P_InitHealthGroups(); + P_InitHealthGroups(Level); if (reloop) LoopSidedefs(false); PO_Init(); // Initialize the polyobjs diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 0857dc1dd..18846570a 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -6633,17 +6633,17 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) FHealthGroup* grp; if (part == SECPART_Ceiling) { - return (ss->healthceilinggroup && (grp = P_GetHealthGroup(ss->healthceilinggroup))) + return (ss->healthceilinggroup && (grp = P_GetHealthGroup(Level, ss->healthceilinggroup))) ? grp->health : ss->healthceiling; } else if (part == SECPART_Floor) { - return (ss->healthfloorgroup && (grp = P_GetHealthGroup(ss->healthfloorgroup))) + return (ss->healthfloorgroup && (grp = P_GetHealthGroup(Level, ss->healthfloorgroup))) ? grp->health : ss->healthfloor; } else if (part == SECPART_3D) { - return (ss->health3dgroup && (grp = P_GetHealthGroup(ss->health3dgroup))) + return (ss->health3dgroup && (grp = P_GetHealthGroup(Level, ss->health3dgroup))) ? grp->health : ss->health3d; } return 0; @@ -6658,7 +6658,7 @@ doplaysound: if (funcIndex == ACSF_PlayActorSound) line_t* ll = &Level->lines[l]; if (ll->healthgroup > 0) { - FHealthGroup* grp = P_GetHealthGroup(ll->healthgroup); + FHealthGroup* grp = P_GetHealthGroup(Level, ll->healthgroup); if (grp) return grp->health; } diff --git a/src/p_destructible.cpp b/src/p_destructible.cpp index 8882d9255..5a9c56448 100755 --- a/src/p_destructible.cpp +++ b/src/p_destructible.cpp @@ -75,9 +75,9 @@ void P_SetHealthGroupHealth(FHealthGroup* grp, int health) } } -void P_SetHealthGroupHealth(int id, int health) +void P_SetHealthGroupHealth(FLevelLocals *Level, int id, int health) { - P_SetHealthGroupHealth(P_GetHealthGroup(id), health); + P_SetHealthGroupHealth(P_GetHealthGroup(Level, id), health); } void P_DamageHealthGroup(FHealthGroup* grp, void* object, AActor* source, int damage, FName damagetype, int side, int part, DVector3 position, bool isradius) @@ -133,6 +133,7 @@ void P_DamageLinedef(line_t* line, AActor* source, int damage, FName damagetype, line->health -= damage; if (line->health < 0) line->health = 0; + auto Level = line->GetLevel(); // callbacks here // first off, call special if needed @@ -145,7 +146,7 @@ void P_DamageLinedef(line_t* line, AActor* source, int damage, FName damagetype, if (dogroups && line->healthgroup) { - FHealthGroup* grp = P_GetHealthGroup(line->healthgroup); + FHealthGroup* grp = P_GetHealthGroup(Level, line->healthgroup); if (grp) grp->health = line->health; P_DamageHealthGroup(grp, line, source, damage, damagetype, side, -1, position, isradius); @@ -166,6 +167,7 @@ void P_DamageSector(sector_t* sector, AActor* source, int damage, FName damagety if (!damage) return; + auto Level = sector->Level; int* sectorhealth; int group; int dmg; @@ -209,7 +211,7 @@ void P_DamageSector(sector_t* sector, AActor* source, int damage, FName damagety if (dogroups && group) { - FHealthGroup* grp = P_GetHealthGroup(group); + FHealthGroup* grp = P_GetHealthGroup(Level, group); if (grp) grp->health = newhealth; P_DamageHealthGroup(grp, sector, source, damage, damagetype, 0, part, position, isradius); @@ -225,35 +227,36 @@ void P_DamageSector(sector_t* sector, AActor* source, int damage, FName damagety // //=========================================================================== -FHealthGroup* P_GetHealthGroup(int id) +FHealthGroup* P_GetHealthGroup(FLevelLocals *Level, int id) { - FHealthGroup* grp = level.healthGroups.CheckKey(id); + FHealthGroup* grp = Level->healthGroups.CheckKey(id); return grp; } -FHealthGroup* P_GetHealthGroupOrNew(int id, int health) +FHealthGroup* P_GetHealthGroupOrNew(FLevelLocals *Level, int id, int health) { - FHealthGroup* grp = level.healthGroups.CheckKey(id); + FHealthGroup* grp = Level->healthGroups.CheckKey(id); if (!grp) { FHealthGroup newgrp; newgrp.id = id; newgrp.health = health; - grp = &(level.healthGroups.Insert(id, newgrp)); + grp = &(Level->healthGroups.Insert(id, newgrp)); } return grp; } -void P_InitHealthGroups() +void P_InitHealthGroups(FLevelLocals *Level) { - level.healthGroups.Clear(); + Level->healthGroups.Clear(); TArray groupsInError; - for (unsigned i = 0; i < level.lines.Size(); i++) + + for (unsigned i = 0; i < Level->lines.Size(); i++) { - line_t* lline = &level.lines[i]; + line_t* lline = &Level->lines[i]; if (lline->healthgroup > 0) { - FHealthGroup* grp = P_GetHealthGroupOrNew(lline->healthgroup, lline->health); + FHealthGroup* grp = P_GetHealthGroupOrNew(Level, lline->healthgroup, lline->health); if (grp->health != lline->health) { Printf(TEXTCOLOR_RED "Warning: line %d in health group %d has different starting health (line health = %d, group health = %d)\n", i, lline->healthgroup, lline->health, grp->health); @@ -264,12 +267,12 @@ void P_InitHealthGroups() grp->lines.Push(lline); } } - for (unsigned i = 0; i < level.sectors.Size(); i++) + for (unsigned i = 0; i < Level->sectors.Size(); i++) { - sector_t* lsector = &level.sectors[i]; + sector_t* lsector = &Level->sectors[i]; if (lsector->healthceilinggroup > 0) { - FHealthGroup* grp = P_GetHealthGroupOrNew(lsector->healthceilinggroup, lsector->healthceiling); + FHealthGroup* grp = P_GetHealthGroupOrNew(Level, lsector->healthceilinggroup, lsector->healthceiling); if (grp->health != lsector->healthceiling) { Printf(TEXTCOLOR_RED "Warning: sector ceiling %d in health group %d has different starting health (ceiling health = %d, group health = %d)\n", i, lsector->healthceilinggroup, lsector->healthceiling, grp->health); @@ -281,7 +284,7 @@ void P_InitHealthGroups() } if (lsector->healthfloorgroup > 0) { - FHealthGroup* grp = P_GetHealthGroupOrNew(lsector->healthfloorgroup, lsector->healthfloor); + FHealthGroup* grp = P_GetHealthGroupOrNew(Level, lsector->healthfloorgroup, lsector->healthfloor); if (grp->health != lsector->healthfloor) { Printf(TEXTCOLOR_RED "Warning: sector floor %d in health group %d has different starting health (floor health = %d, group health = %d)\n", i, lsector->healthfloorgroup, lsector->healthfloor, grp->health); @@ -295,7 +298,7 @@ void P_InitHealthGroups() } for (unsigned i = 0; i < groupsInError.Size(); i++) { - FHealthGroup* grp = P_GetHealthGroup(groupsInError[i]); + FHealthGroup* grp = P_GetHealthGroup(Level, groupsInError[i]); Printf(TEXTCOLOR_GOLD "Health group %d is using the highest found health value of %d", groupsInError[i], grp->health); } } @@ -840,7 +843,7 @@ FSerializer &Serialize(FSerializer &arc, const char *key, FHealthGroup& g, FHeal return arc; } -void P_SerializeHealthGroups(FSerializer& arc) +void P_SerializeHealthGroups(FLevelLocals *Level, FSerializer& arc) { // todo : stuff if (arc.BeginArray("healthgroups")) @@ -853,7 +856,7 @@ void P_SerializeHealthGroups(FSerializer& arc) { FHealthGroup grp; arc(nullptr, grp); - FHealthGroup* existinggrp = P_GetHealthGroup(grp.id); + FHealthGroup* existinggrp = P_GetHealthGroup(Level, grp.id); if (!existinggrp) continue; existinggrp->health = grp.health; @@ -861,7 +864,7 @@ void P_SerializeHealthGroups(FSerializer& arc) } else { - TMap::ConstIterator it(level.healthGroups); + TMap::ConstIterator it(Level->healthGroups); TMap::ConstPair* pair; while (it.NextPair(pair)) { @@ -883,11 +886,11 @@ DEFINE_FIELD_X(HealthGroup, FHealthGroup, health) DEFINE_FIELD_X(HealthGroup, FHealthGroup, sectors) DEFINE_FIELD_X(HealthGroup, FHealthGroup, lines) -DEFINE_ACTION_FUNCTION(FHealthGroup, Find) +DEFINE_ACTION_FUNCTION(FLevelLocals, FindHealthGroup) { - PARAM_PROLOGUE; + PARAM_SELF_STRUCT_PROLOGUE(FLevelLocals); PARAM_INT(id); - FHealthGroup* grp = P_GetHealthGroup(id); + FHealthGroup* grp = P_GetHealthGroup(self, id); ACTION_RETURN_POINTER(grp); } @@ -993,7 +996,7 @@ DEFINE_ACTION_FUNCTION(_Line, GetHealth) PARAM_SELF_STRUCT_PROLOGUE(line_t); if (self->healthgroup) { - FHealthGroup* grp = P_GetHealthGroup(self->healthgroup); + FHealthGroup* grp = P_GetHealthGroup(self->GetLevel(), self->healthgroup); if (grp) ACTION_RETURN_INT(grp->health); } @@ -1011,7 +1014,7 @@ DEFINE_ACTION_FUNCTION(_Line, SetHealth) self->health = newhealth; if (self->healthgroup) { - FHealthGroup* grp = P_GetHealthGroup(self->healthgroup); + FHealthGroup* grp = P_GetHealthGroup(self->GetLevel(), self->healthgroup); if (grp) P_SetHealthGroupHealth(grp, newhealth); } @@ -1024,14 +1027,15 @@ DEFINE_ACTION_FUNCTION(_Sector, GetHealth) PARAM_INT(part); FHealthGroup* grp; + auto Level = self->Level; switch (part) { case SECPART_Floor: - ACTION_RETURN_INT((self->healthfloorgroup && (grp = P_GetHealthGroup(self->healthfloorgroup))) ? grp->health : self->healthfloor); + ACTION_RETURN_INT((self->healthfloorgroup && (grp = P_GetHealthGroup(Level, self->healthfloorgroup))) ? grp->health : self->healthfloor); case SECPART_Ceiling: - ACTION_RETURN_INT((self->healthceilinggroup && (grp = P_GetHealthGroup(self->healthceilinggroup))) ? grp->health : self->healthceiling); + ACTION_RETURN_INT((self->healthceilinggroup && (grp = P_GetHealthGroup(Level, self->healthceilinggroup))) ? grp->health : self->healthceiling); case SECPART_3D: - ACTION_RETURN_INT((self->health3dgroup && (grp = P_GetHealthGroup(self->health3dgroup))) ? grp->health : self->health3d); + ACTION_RETURN_INT((self->health3dgroup && (grp = P_GetHealthGroup(Level, self->health3dgroup))) ? grp->health : self->health3d); default: ACTION_RETURN_INT(0); } @@ -1066,7 +1070,7 @@ DEFINE_ACTION_FUNCTION(_Sector, SetHealth) return 0; } - FHealthGroup* grp = group ? P_GetHealthGroup(group) : nullptr; + FHealthGroup* grp = group ? P_GetHealthGroup(self->Level, group) : nullptr; *health = newhealth; if (grp) P_SetHealthGroupHealth(grp, newhealth); return 0; diff --git a/src/p_destructible.h b/src/p_destructible.h index 99c14b927..24a95b6a4 100755 --- a/src/p_destructible.h +++ b/src/p_destructible.h @@ -21,13 +21,14 @@ enum SECPART_3D = 2 }; -void P_InitHealthGroups(); +struct FLevelLocals; +void P_InitHealthGroups(FLevelLocals *Level); void P_SetHealthGroupHealth(FHealthGroup* group, int health); -void P_SetHealthGroupHealth(int group, int health); +void P_SetHealthGroupHealth(FLevelLocals *Level, int group, int health); -FHealthGroup* P_GetHealthGroup(int id); -FHealthGroup* P_GetHealthGroupOrNew(int id, int startinghealth); +FHealthGroup* P_GetHealthGroup(FLevelLocals *Level, int id); +FHealthGroup* P_GetHealthGroupOrNew(FLevelLocals *Level, int id, int startinghealth); void P_DamageSector(sector_t* sector, AActor* source, int damage, FName damagetype, int part, DVector3 position, bool isradius, bool dogroups); void P_DamageLinedef(line_t* line, AActor* source, int damage, FName damagetype, int side, DVector3 position, bool isradius, bool dogroups); @@ -40,4 +41,4 @@ bool P_ProjectileHitPlane(AActor* projectile, int part); bool P_CheckLinedefVulnerable(line_t* line, int side, int part = -1); bool P_CheckSectorVulnerable(sector_t* sector, int part); -void P_SerializeHealthGroups(FSerializer& arc); \ No newline at end of file +void P_SerializeHealthGroups(FLevelLocals *Level, FSerializer& arc); \ No newline at end of file diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index c60343045..ed594244b 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -3491,7 +3491,7 @@ FUNC(LS_Line_SetHealth) line_t* line = &Level->lines[l]; line->health = arg1; if (line->healthgroup) - P_SetHealthGroupHealth(line->healthgroup, arg1); + P_SetHealthGroupHealth(Level, line->healthgroup, arg1); } return true; } @@ -3512,19 +3512,19 @@ FUNC(LS_Sector_SetHealth) { sector->healthceiling = arg2; if (sector->healthceilinggroup) - P_SetHealthGroupHealth(sector->healthceilinggroup, arg2); + P_SetHealthGroupHealth(Level, sector->healthceilinggroup, arg2); } else if (arg1 == SECPART_Floor) { sector->healthfloor = arg2; if (sector->healthfloorgroup) - P_SetHealthGroupHealth(sector->healthfloorgroup, arg2); + P_SetHealthGroupHealth(Level, sector->healthfloorgroup, arg2); } else if (arg1 == SECPART_3D) { sector->health3d = arg2; if (sector->health3dgroup) - P_SetHealthGroupHealth(sector->health3dgroup, arg2); + P_SetHealthGroupHealth(Level, sector->health3dgroup, arg2); } } return true; diff --git a/src/p_maputl.h b/src/p_maputl.h index 161eaac29..e22c9cddd 100644 --- a/src/p_maputl.h +++ b/src/p_maputl.h @@ -117,7 +117,7 @@ struct FLineOpening static const double LINEOPEN_MIN = -FLT_MAX; static const double LINEOPEN_MAX = FLT_MAX; -void P_LineOpening(FLineOpening &open, AActor *thing, const line_t *linedef, const DVector2 &xy, const DVector2 *ref = NULL, int flags = 0); +void P_LineOpening(FLineOpening &open, AActor *thing, const line_t *linedef, const DVector2 &xy, const DVector2 *ref = nullptr, int flags = 0); inline void P_LineOpening(FLineOpening &open, AActor *thing, const line_t *linedef, const DVector2 &xy, const DVector3 *ref, int flags = 0) { P_LineOpening(open, thing, linedef, xy, reinterpret_cast(ref), flags); @@ -383,7 +383,7 @@ public: init(x1, y1, x2, y2, flags, startfrac); } void init(double x1, double y1, double x2, double y2, int flags, double startfrac = 0); - int PortalRelocate(intercept_t *in, int flags, DVector3 *optpos = NULL); + int PortalRelocate(intercept_t *in, int flags, DVector3 *optpos = nullptr); void PortalRelocate(const DVector2 &disp, int flags, double hitfrac); virtual ~FPathTraverse(); const divline_t &Trace() const { return trace; } diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index b860eb4d1..cb7cdc848 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -996,7 +996,7 @@ void FLevelLocals::Serialize(FSerializer &arc, bool hubload) } // [ZZ] serialize health groups - P_SerializeHealthGroups(arc); + P_SerializeHealthGroups(this, arc); // [ZZ] serialize events E_SerializeEvents(arc); DThinker::SerializeThinkers(arc, hubload); diff --git a/src/polyrenderer/scene/poly_wall.cpp b/src/polyrenderer/scene/poly_wall.cpp index 1d04348ea..9d04b64a7 100644 --- a/src/polyrenderer/scene/poly_wall.cpp +++ b/src/polyrenderer/scene/poly_wall.cpp @@ -637,7 +637,7 @@ PolyWallTextureCoordsU::PolyWallTextureCoordsU(FSoftwareTexture *tex, const seg_ PolyWallTextureCoordsV::PolyWallTextureCoordsV(FSoftwareTexture *tex, const line_t *line, const side_t *side, side_t::ETexpart wallpart, double topz, double bottomz, double unpeggedceil, double topTexZ, double bottomTexZ) { double yoffset = side->GetTextureYOffset(wallpart); - if (tex->useWorldPanning()) + if (tex->useWorldPanning(line->GetLevel())) yoffset *= side->GetTextureYScale(wallpart) * tex->GetScale().Y; switch (wallpart) diff --git a/src/polyrenderer/scene/poly_wallsprite.cpp b/src/polyrenderer/scene/poly_wallsprite.cpp index d94be7a63..d826186db 100644 --- a/src/polyrenderer/scene/poly_wallsprite.cpp +++ b/src/polyrenderer/scene/poly_wallsprite.cpp @@ -101,7 +101,7 @@ void RenderPolyWallSprite::Render(PolyRenderThread *thread, AActor *thing, subse int lightlevel = fullbrightSprite ? 255 : thing->Sector->lightlevel + actualextralight; PolyDrawArgs args; - auto nc = !!(sub->sector->Level->flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING); + auto nc = !!(thing->Level->flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING); args.SetLight(GetSpriteColorTable(sub->sector->Colormap, sub->sector->SpecialColors[sector_t::sprites], nc), lightlevel, PolyRenderer::Instance()->Light.WallGlobVis(foggy), fullbrightSprite); args.SetStencilTestValue(stencilValue); args.SetTexture(tex, thing->RenderStyle); args.SetDepthTest(true); diff --git a/src/r_defs.h b/src/r_defs.h index 15d608c6c..4aefe42d5 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -1497,6 +1497,11 @@ struct seg_t int segnum; int Index() const { return segnum; } + + FLevelLocals *GetLevel() const + { + return frontsector->Level; + } }; //extern seg_t *segs; diff --git a/src/swrenderer/line/r_line.cpp b/src/swrenderer/line/r_line.cpp index 528da5d6e..731292147 100644 --- a/src/swrenderer/line/r_line.cpp +++ b/src/swrenderer/line/r_line.cpp @@ -444,7 +444,7 @@ namespace swrenderer double yscale = (pic ? pic->GetScale().Y : 1.0) * sidedef->GetTextureYScale(side_t::mid); fixed_t xoffset = FLOAT2FIXED(sidedef->GetTextureXOffset(side_t::mid)); - if (pic && pic->useWorldPanning()) + if (pic && pic->useWorldPanning(sidedef->GetLevel())) { xoffset = xs_RoundToInt(xoffset * lwallscale); } @@ -822,7 +822,7 @@ namespace swrenderer mTopPart.TextureMid = (mBackSector->GetPlaneTexZ(sector_t::ceiling) - Thread->Viewport->viewpoint.Pos.Z) * yrepeat; } } - if (mTopPart.Texture->useWorldPanning()) + if (mTopPart.Texture->useWorldPanning(mLineSegment->GetLevel())) { mTopPart.TextureMid += rowoffset * yrepeat; } @@ -880,7 +880,7 @@ namespace swrenderer mMiddlePart.TextureMid = (mFrontSector->GetPlaneTexZ(sector_t::ceiling) - Thread->Viewport->viewpoint.Pos.Z) * yrepeat + mMiddlePart.Texture->GetHeight(); } } - if (mMiddlePart.Texture->useWorldPanning()) + if (mMiddlePart.Texture->useWorldPanning(mLineSegment->GetLevel())) { mMiddlePart.TextureMid += rowoffset * yrepeat; } @@ -947,7 +947,7 @@ namespace swrenderer mBottomPart.TextureMid = (mBackSector->GetPlaneTexZ(sector_t::floor) - Thread->Viewport->viewpoint.Pos.Z) * yrepeat + mBottomPart.Texture->GetHeight(); } } - if (mBottomPart.Texture->useWorldPanning()) + if (mBottomPart.Texture->useWorldPanning(mLineSegment->GetLevel())) { mBottomPart.TextureMid += rowoffset * yrepeat; } @@ -1122,7 +1122,7 @@ namespace swrenderer lwallscale = xscale; } fixed_t offset; - if (mTopPart.Texture->useWorldPanning()) + if (mTopPart.Texture->useWorldPanning(mLineSegment->GetLevel())) { offset = xs_RoundToInt(mTopPart.TextureOffsetU * xscale); } @@ -1153,7 +1153,7 @@ namespace swrenderer lwallscale = xscale; } fixed_t offset; - if (mMiddlePart.Texture->useWorldPanning()) + if (mMiddlePart.Texture->useWorldPanning(mLineSegment->GetLevel())) { offset = xs_RoundToInt(mMiddlePart.TextureOffsetU * xscale); } @@ -1185,7 +1185,7 @@ namespace swrenderer lwallscale = xscale; } fixed_t offset; - if (mBottomPart.Texture->useWorldPanning()) + if (mBottomPart.Texture->useWorldPanning(mLineSegment->GetLevel())) { offset = xs_RoundToInt(mBottomPart.TextureOffsetU * xscale); } diff --git a/src/swrenderer/line/r_renderdrawsegment.cpp b/src/swrenderer/line/r_renderdrawsegment.cpp index 4f404dcb2..0f477d70c 100644 --- a/src/swrenderer/line/r_renderdrawsegment.cpp +++ b/src/swrenderer/line/r_renderdrawsegment.cpp @@ -197,7 +197,7 @@ namespace swrenderer MaskedScaleY = -MaskedScaleY; sprflipvert = true; } - if (tex->useWorldPanning()) + if (tex->useWorldPanning(curline->GetLevel())) { // rowoffset is added before the multiply so that the masked texture will // still be positioned in world units rather than texels. @@ -332,7 +332,7 @@ namespace swrenderer } else { // Texture does wrap vertically. - if (tex->useWorldPanning()) + if (tex->useWorldPanning(curline->GetLevel())) { // rowoffset is added before the multiply so that the masked texture will // still be positioned in world units rather than texels. @@ -447,7 +447,7 @@ namespace swrenderer rowoffset += rw_pic->GetHeight(); } double texturemid = (planez - Thread->Viewport->viewpoint.Pos.Z) * yscale; - if (rw_pic->useWorldPanning()) + if (rw_pic->useWorldPanning(curline->GetLevel())) { // rowoffset is added before the multiply so that the masked texture will // still be positioned in world units rather than texels. diff --git a/src/swrenderer/textures/r_swtexture.h b/src/swrenderer/textures/r_swtexture.h index 319144d90..2842bf129 100644 --- a/src/swrenderer/textures/r_swtexture.h +++ b/src/swrenderer/textures/r_swtexture.h @@ -45,9 +45,9 @@ public: } // The feature from hell... :( - bool useWorldPanning() const + bool useWorldPanning(FLevelLocals *Level) const { - return mTexture->bWorldPanning || (level.flags3 & LEVEL3_FORCEWORLDPANNING); + return mTexture->bWorldPanning || (Level->flags3 & LEVEL3_FORCEWORLDPANNING); } bool isMasked() diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index 580bd8dbb..2860273c8 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -697,7 +697,7 @@ struct LevelLocals native native void GiveSecret(Actor activator, bool printmsg = true, bool playsound = true); native void StartSlideshow(Name whichone = 'none'); native void WorldDone(); - deprecated("3.8") native static void RemoveAllBots(bool fromlist) { /* intentionally left as no-op. */ } + deprecated("3.8") static void RemoveAllBots(bool fromlist) { /* intentionally left as no-op. */ } native ui Vector2 GetAutomapPosition(); native void SetInterMusic(String nextmap); native String FormatMapName(int mapnamecolor); @@ -709,6 +709,7 @@ struct LevelLocals native native int FindUniqueTid(int start = 0, int limit = 0); native uint GetSkyboxPortal(Actor actor); native void ReplaceTextures(String from, String to, int flags); + clearscope native HealthGroup FindHealthGroup(int id); native vector3, int PickDeathmatchStart(); native vector3, int PickPlayerStart(int pnum, int flags = 0); native int isFrozen(); diff --git a/wadsrc/static/zscript/destructible.txt b/wadsrc/static/zscript/destructible.txt index 3ea0b4f2b..c44a1ef30 100755 --- a/wadsrc/static/zscript/destructible.txt +++ b/wadsrc/static/zscript/destructible.txt @@ -1,6 +1,9 @@ struct HealthGroup native play { - static clearscope native HealthGroup Find(int id); + deprecated("3.8") static clearscope HealthGroup Find(int id) + { + return level.FindHealthGroup(id); + } readonly int id; readonly int health; From 4cb3ce819699a790b51073b8e0f711011944cf66 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 29 Jan 2019 16:11:23 +0100 Subject: [PATCH 087/164] - StartTravel and EndTravel --- src/g_level.cpp | 14 +++++++------- src/g_level.h | 3 --- src/g_levellocals.h | 2 ++ 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/g_level.cpp b/src/g_level.cpp index 6f8c23216..8bc9ab97d 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1279,7 +1279,7 @@ void G_DoWorldDone (void) Printf ("No next map specified.\n"); nextlevel = level.MapName; } - G_StartTravel (); + level.StartTravel (); G_DoLoadLevel (nextlevel, startpos, true, false); startpos = 0; gameaction = ga_nothing; @@ -1296,7 +1296,7 @@ void G_DoWorldDone (void) // //========================================================================== -void G_StartTravel () +void FLevelLocals::StartTravel () { if (deathmatch) return; @@ -1343,9 +1343,9 @@ void G_StartTravel () // //========================================================================== -int G_FinishTravel () +int FLevelLocals::FinishTravel () { - TThinkerIterator it (NAME_PlayerPawn, STAT_TRAVELLING); + auto it = GetThinkerIterator(NAME_PlayerPawn, STAT_TRAVELLING); AActor *pawn, *pawndup, *oldpawn, *next; AActor *inv; FPlayerStart *start; @@ -1365,7 +1365,7 @@ int G_FinishTravel () pawndup = pawn->player->mo; assert (pawn != pawndup); - start = level.PickPlayerStart(pnum, 0); + start = PickPlayerStart(pnum, 0); if (start == NULL) { if (pawndup != nullptr) @@ -1384,7 +1384,7 @@ int G_FinishTravel () // The player being spawned here is a short lived dummy and // must not start any ENTER script or big problems will happen. - pawndup = level.SpawnPlayer(start, pnum, SPF_TEMPPLAYER); + pawndup = SpawnPlayer(start, pnum, SPF_TEMPPLAYER); if (pawndup != NULL) { if (!(changeflags & CHANGELEVEL_KEEPFACING)) @@ -1736,7 +1736,7 @@ void FLevelLocals::UnSnapshotLevel (bool hubLoad) if (hubLoad) { // Unlock ACS global strings that were locked when the snapshot was made. - Behaviors.UnlockLevelVarStrings(level.levelnum); + Behaviors.UnlockLevelVarStrings(levelnum); } } diff --git a/src/g_level.h b/src/g_level.h index e8d694dd4..bdba32b7b 100644 --- a/src/g_level.h +++ b/src/g_level.h @@ -472,9 +472,6 @@ enum void G_ChangeLevel(const char *levelname, int position, int flags, int nextSkill=-1); -void G_StartTravel (); -int G_FinishTravel (); - void G_DoLoadLevel (const FString &MapName, int position, bool autosave, bool newGame); cluster_info_t *FindClusterInfo (int cluster); diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 752b5aced..758370db5 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -220,6 +220,8 @@ public: void DeathMatchSpawnPlayer (int playernum); FPlayerStart *PickPlayerStart(int playernum, int flags = 0); bool DoCompleted(FString nextlevel, wbstartstruct_t &wminfo); + void StartTravel(); + int FinishTravel(); private: From d716a17b9692b7aaba05c38c8845d6a422f14d7f Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 29 Jan 2019 17:41:22 +0100 Subject: [PATCH 088/164] - compatibility variable handling --- src/d_main.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index 345e08868..cac75766f 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -535,22 +535,22 @@ int ii_compatflags, ii_compatflags2, ib_compatflags; EXTERN_CVAR(Int, compatmode) -static int GetCompatibility(int mask) +static int GetCompatibility(FLevelLocals *Level, int mask) { - if (level.info == NULL) return mask; - else return (mask & ~level.info->compatmask) | (level.info->compatflags & level.info->compatmask); + if (Level->info == nullptr) return mask; + else return (mask & ~Level->info->compatmask) | (Level->info->compatflags & Level->info->compatmask); } -static int GetCompatibility2(int mask) +static int GetCompatibility2(FLevelLocals *Level, int mask) { - return (level.info == NULL) ? mask - : (mask & ~level.info->compatmask2) | (level.info->compatflags2 & level.info->compatmask2); + return (Level->info == nullptr) ? mask + : (mask & ~Level->info->compatmask2) | (Level->info->compatflags2 & Level->info->compatmask2); } CUSTOM_CVAR (Int, compatflags, 0, CVAR_ARCHIVE|CVAR_SERVERINFO) { int old = i_compatflags; - i_compatflags = GetCompatibility(self) | ii_compatflags; + i_compatflags = GetCompatibility(&level, self) | ii_compatflags; if ((old ^ i_compatflags) & COMPATF_POLYOBJ) { level.ClearAllSubsectorLinks(); @@ -559,7 +559,7 @@ CUSTOM_CVAR (Int, compatflags, 0, CVAR_ARCHIVE|CVAR_SERVERINFO) CUSTOM_CVAR (Int, compatflags2, 0, CVAR_ARCHIVE|CVAR_SERVERINFO) { - i_compatflags2 = GetCompatibility2(self) | ii_compatflags2; + i_compatflags2 = GetCompatibility2(&level, self) | ii_compatflags2; } CUSTOM_CVAR(Int, compatmode, 0, CVAR_ARCHIVE|CVAR_NOINITCALL) From 6451b7d5920c71e92b7debe062319f1af4edeaf6 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 29 Jan 2019 19:28:22 +0100 Subject: [PATCH 089/164] - moved the combined compatibility flags into FLevelLocals. --- src/d_main.cpp | 20 +++++++----- src/doomdata.h | 2 ++ src/doomstat.h | 1 - src/dsectoreffect.cpp | 4 +-- src/g_level.cpp | 19 +++++++++-- src/g_levellocals.h | 7 ++++ src/hwrenderer/scene/hw_drawlist.cpp | 3 +- src/hwrenderer/scene/hw_drawlist.h | 1 + src/hwrenderer/scene/hw_walls.cpp | 2 +- src/maploader/compatibility.cpp | 23 +++++++------ src/maploader/maploader.cpp | 4 +-- src/maploader/slopes.cpp | 2 +- src/p_doors.cpp | 2 +- src/p_enemy.cpp | 14 ++++---- src/p_floor.cpp | 2 +- src/p_lnspec.cpp | 2 +- src/p_map.cpp | 32 +++++++++---------- src/p_maputl.cpp | 2 +- src/p_maputl.h | 3 +- src/p_mobj.cpp | 26 +++++++-------- src/p_pusher.cpp | 2 +- src/p_saveg.cpp | 2 ++ src/p_sectors.cpp | 12 +++---- src/p_setup.cpp | 1 + src/p_sight.cpp | 2 +- src/p_trace.cpp | 2 +- src/po_man.cpp | 2 +- src/s_sound.cpp | 14 ++++---- src/scripting/backend/codegen.cpp | 4 +-- src/scripting/vmthunks_actors.cpp | 28 ++++++++++++++++ src/swrenderer/line/r_line.cpp | 4 +-- src/swrenderer/line/r_renderdrawsegment.cpp | 6 ++-- src/swrenderer/things/r_visiblespritelist.cpp | 2 +- wadsrc/static/zscript/doom/fatso.txt | 3 +- wadsrc/static/zscript/doom/painelemental.txt | 4 ++- 35 files changed, 162 insertions(+), 97 deletions(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index cac75766f..cefd446b9 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -530,9 +530,6 @@ CVAR (Flag, sv_respawnsuper, dmflags2, DF2_RESPAWN_SUPER); // //========================================================================== -int i_compatflags, i_compatflags2; // internal compatflags composed from the compatflags CVAR and MAPINFO settings -int ii_compatflags, ii_compatflags2, ib_compatflags; - EXTERN_CVAR(Int, compatmode) static int GetCompatibility(FLevelLocals *Level, int mask) @@ -549,17 +546,24 @@ static int GetCompatibility2(FLevelLocals *Level, int mask) CUSTOM_CVAR (Int, compatflags, 0, CVAR_ARCHIVE|CVAR_SERVERINFO) { - int old = i_compatflags; - i_compatflags = GetCompatibility(&level, self) | ii_compatflags; - if ((old ^ i_compatflags) & COMPATF_POLYOBJ) + for (auto Level : AllLevels()) { - level.ClearAllSubsectorLinks(); + int old = Level->i_compatflags; + Level->i_compatflags = GetCompatibility(Level, self) | Level->ii_compatflags; + if ((old ^ Level->i_compatflags) & COMPATF_POLYOBJ) + { + Level->ClearAllSubsectorLinks(); + } } } CUSTOM_CVAR (Int, compatflags2, 0, CVAR_ARCHIVE|CVAR_SERVERINFO) { - i_compatflags2 = GetCompatibility2(&level, self) | ii_compatflags2; + for (auto Level : AllLevels()) + { + Level->i_compatflags2 = GetCompatibility2(Level, self) | Level->ii_compatflags2; + Level->SetCompatLineOnSide(true); + } } CUSTOM_CVAR(Int, compatmode, 0, CVAR_ARCHIVE|CVAR_NOINITCALL) diff --git a/src/doomdata.h b/src/doomdata.h index ee0b21f32..05bcfbfc1 100644 --- a/src/doomdata.h +++ b/src/doomdata.h @@ -151,7 +151,9 @@ enum ELineFlags : unsigned ML_MAPPED = 0x00000100, // set if already drawn in automap ML_REPEAT_SPECIAL = 0x00000200, // special is repeatable + // 0x400, 0x800 and 0x1000 are ML_SPAC_MASK, they can be used for internal things but not for real map flags. ML_ADDTRANS = 0x00000400, // additive translucency (can only be set internally) + ML_COMPATSIDE = 0x00000800, // for compatible PointOnLineSide checks. Using the global compatibility check would be a bit expensive for this check. // Extended flags ML_MONSTERSCANACTIVATE = 0x00002000, // [RH] Monsters (as well as players) can activate the line diff --git a/src/doomstat.h b/src/doomstat.h index 6f0007f4c..23356b25f 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -248,7 +248,6 @@ EXTERN_CVAR (Int, dmflags2); // [BC] EXTERN_CVAR (Int, compatflags); EXTERN_CVAR (Int, compatflags2); -extern int i_compatflags, i_compatflags2, ii_compatflags, ii_compatflags2, ib_compatflags; // Filters from AddAutoloadFiles(). Used to filter files from archives. extern FString LumpFilterIWAD; diff --git a/src/dsectoreffect.cpp b/src/dsectoreffect.cpp index adc9c5f0a..8fbf3c8a7 100644 --- a/src/dsectoreffect.cpp +++ b/src/dsectoreffect.cpp @@ -214,7 +214,7 @@ EMoveResult sector_t::MoveFloor(double speed, double dest, int crush, int direct //destheight = (dest < ceilingheight) ? dest : ceilingheight; if (!ceilingplane.isSlope() && !floorplane.isSlope() && !PortalIsLinked(sector_t::ceiling) && - (!(i_compatflags2 & COMPATF2_FLOORMOVE) && -dest > ceilingplane.fD())) + (!(Level->i_compatflags2 & COMPATF2_FLOORMOVE) && -dest > ceilingplane.fD())) { dest = -ceilingplane.fD(); } @@ -304,7 +304,7 @@ EMoveResult sector_t::MoveCeiling(double speed, double dest, int crush, int dire //destheight = (dest > floorheight) ? dest : floorheight; if (!ceilingplane.isSlope() && !floorplane.isSlope() && !PortalIsLinked(sector_t::floor) && - (!(i_compatflags2 & COMPATF2_FLOORMOVE) && dest < -floorplane.fD())) + (!(Level->i_compatflags2 & COMPATF2_FLOORMOVE) && dest < -floorplane.fD())) { dest = -floorplane.fD(); } diff --git a/src/g_level.cpp b/src/g_level.cpp index 8bc9ab97d..5491367ad 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -578,7 +578,7 @@ void G_ChangeLevel(const char *levelname, int position, int flags, int nextSkill Printf (TEXTCOLOR_RED "Unloading scripts cannot exit the level again.\n"); return; } - if (gameaction == ga_completed && !(i_compatflags2 & COMPATF2_MULTIEXIT)) // do not exit multiple times. + if (gameaction == ga_completed && !(level.i_compatflags2 & COMPATF2_MULTIEXIT)) // do not exit multiple times. { return; } @@ -1070,7 +1070,7 @@ void G_DoLoadLevel (const FString &nextmapname, int position, bool autosave, boo level.starttime = gametic; level.UnSnapshotLevel (!savegamerestore); // [RH] Restore the state of the level. - int pnumerr = G_FinishTravel (); + int pnumerr = level.FinishTravel (); if (!level.FromSnapshot) { @@ -2075,6 +2075,21 @@ int FLevelLocals::GetInfighting() return G_SkillProperty(SKILLP_Infight); } +//============================================================================ +// +// transfers the compatiblity flag for old PointOnLineSide to each line. +// This gets checked in a frequently called worker function and the closer +// this info is to the data this function works on, the better. +// +//============================================================================ + +void FLevelLocals::SetCompatLineOnSide(bool state) +{ + int on = (state && (i_compatflags2 & COMPATF2_POINTONLINE)); + if (on) for (auto l : lines) l.flags |= ML_COMPATSIDE; + else for (auto l : lines) l.flags &= ML_COMPATSIDE; +} + //========================================================================== // IsPointInMap // diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 758370db5..aa19b989e 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -120,6 +120,7 @@ struct FLevelLocals void SetConversation(int convid, PClassActor *Class, int dlgindex); int FindNode (const FStrifeDialogueNode *node); int GetInfighting(); + void SetCompatLineOnSide(bool state); void Init(); private: @@ -442,6 +443,12 @@ public: FDialogueIDMap DialogueRoots; FDialogueMap ClassRoots; + int ii_compatflags = 0; + int ii_compatflags2 = 0; + int ib_compatflags = 0; + int i_compatflags = 0; + int i_compatflags2 = 0; + uint8_t 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 diff --git a/src/hwrenderer/scene/hw_drawlist.cpp b/src/hwrenderer/scene/hw_drawlist.cpp index f50c49b8b..b6f4859f1 100644 --- a/src/hwrenderer/scene/hw_drawlist.cpp +++ b/src/hwrenderer/scene/hw_drawlist.cpp @@ -588,7 +588,7 @@ inline int HWDrawList::CompareSprites(SortNode * a,SortNode * b) int res = s1->depth - s2->depth; if (res != 0) return -res; - else return (i_compatflags & COMPATF_SPRITESORT)? s2->index-s1->index : s1->index-s2->index; + else return reverseSort? s2->index-s1->index : s1->index-s2->index; } //========================================================================== @@ -702,6 +702,7 @@ SortNode * HWDrawList::DoSort(HWDrawInfo *di, SortNode * head) //========================================================================== void HWDrawList::Sort(HWDrawInfo *di) { + reverseSort = !!(di->Level->i_compatflags & COMPATF_SPRITESORT); SortZ = di->Viewpoint.Pos.Z; MakeSortList(); sorted = DoSort(di, SortNodes[SortNodeStart]); diff --git a/src/hwrenderer/scene/hw_drawlist.h b/src/hwrenderer/scene/hw_drawlist.h index 66ae468ed..e4279516c 100644 --- a/src/hwrenderer/scene/hw_drawlist.h +++ b/src/hwrenderer/scene/hw_drawlist.h @@ -67,6 +67,7 @@ struct HWDrawList int SortNodeStart; float SortZ; SortNode * sorted; + bool reverseSort; public: HWDrawList() diff --git a/src/hwrenderer/scene/hw_walls.cpp b/src/hwrenderer/scene/hw_walls.cpp index 9b42ac5cc..91ec1a5f8 100644 --- a/src/hwrenderer/scene/hw_walls.cpp +++ b/src/hwrenderer/scene/hw_walls.cpp @@ -2068,7 +2068,7 @@ void GLWall::Process(HWDrawInfo *di, seg_t *seg, sector_t * frontsector, sector_ FTexture *tex = TexMan.GetTexture(seg->sidedef->GetTexture(side_t::mid), true); if (tex != NULL) { - if (i_compatflags & COMPATF_MASKEDMIDTEX) + if (di->Level->i_compatflags & COMPATF_MASKEDMIDTEX) { tex = tex->GetRawTexture(); } diff --git a/src/maploader/compatibility.cpp b/src/maploader/compatibility.cpp index 1c9ed5c60..f3a424cac 100644 --- a/src/maploader/compatibility.cpp +++ b/src/maploader/compatibility.cpp @@ -279,17 +279,17 @@ FName MapLoader::CheckCompatibility(MapData *map) if (BCompatMap.CountUsed() == 0) ParseCompatibility(); - ii_compatflags = 0; - ii_compatflags2 = 0; - ib_compatflags = 0; + Level->ii_compatflags = 0; + Level->ii_compatflags2 = 0; + Level->ib_compatflags = 0; // When playing Doom IWAD levels force COMPAT_SHORTTEX and COMPATF_LIGHT. // I'm not sure if the IWAD maps actually need COMPATF_LIGHT but it certainly does not hurt. // TNT's MAP31 also needs COMPATF_STAIRINDEX but that only gets activated for TNT.WAD. if (Wads.GetLumpFile(map->lumpnum) == Wads.GetIwadNum() && (gameinfo.flags & GI_COMPATSHORTTEX) && Level->maptype == MAPTYPE_DOOM) { - ii_compatflags = COMPATF_SHORTTEX|COMPATF_LIGHT; - if (gameinfo.flags & GI_COMPATSTAIRS) ii_compatflags |= COMPATF_STAIRINDEX; + Level->ii_compatflags = COMPATF_SHORTTEX|COMPATF_LIGHT; + if (gameinfo.flags & GI_COMPATSTAIRS) Level->ii_compatflags |= COMPATF_STAIRINDEX; } map->GetChecksum(md5.Bytes); @@ -319,9 +319,9 @@ FName MapLoader::CheckCompatibility(MapData *map) if (flags != NULL) { - ii_compatflags |= flags->CompatFlags[SLOT_COMPAT]; - ii_compatflags2 |= flags->CompatFlags[SLOT_COMPAT2]; - ib_compatflags |= flags->CompatFlags[SLOT_BCOMPAT]; + Level->ii_compatflags |= flags->CompatFlags[SLOT_COMPAT]; + Level->ii_compatflags2 |= flags->CompatFlags[SLOT_COMPAT2]; + Level->ib_compatflags |= flags->CompatFlags[SLOT_BCOMPAT]; } // Reset i_compatflags @@ -330,7 +330,7 @@ FName MapLoader::CheckCompatibility(MapData *map) // Set floatbob compatibility for all maps with an original Hexen MAPINFO. if (Level->flags2 & LEVEL2_HEXENHACK) { - ib_compatflags |= BCOMPATF_FLOATBOB; + Level->ib_compatflags |= BCOMPATF_FLOATBOB; } return FName(hash, true); // if this returns NAME_None it means there is no scripted compatibility handler. } @@ -574,6 +574,9 @@ CCMD (mapchecksum) CCMD (hiddencompatflags) { - Printf("%08x %08x %08x\n", ii_compatflags, ii_compatflags2, ib_compatflags); + for(auto Level : AllLevels()) + { + Printf("%s: %08x %08x %08x\n", Level->MapName.GetChars(), Level->ii_compatflags, Level->ii_compatflags2, Level->ib_compatflags); + } } diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index aa4c2bd7c..a22491009 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -1516,7 +1516,7 @@ void MapLoader::SetLineID (int i, line_t *ld) break; case Plane_Align: - if (!(ib_compatflags & BCOMPATF_NOSLOPEID)) setid = ld->args[2]; + if (!(Level->ib_compatflags & BCOMPATF_NOSLOPEID)) setid = ld->args[2]; break; case Static_Init: @@ -3016,7 +3016,7 @@ void MapLoader::LoadLevel(MapData *map, const char *lumpname, int position) Level->maptype = MAPTYPE_UDMF; } FName checksum = CheckCompatibility(map); - if (ib_compatflags & BCOMPATF_REBUILDNODES) + if (Level->ib_compatflags & BCOMPATF_REBUILDNODES) { ForceNodeBuild = true; } diff --git a/src/maploader/slopes.cpp b/src/maploader/slopes.cpp index 92c761103..2fb44e628 100644 --- a/src/maploader/slopes.cpp +++ b/src/maploader/slopes.cpp @@ -179,7 +179,7 @@ void MapLoader::SetSlope (secplane_t *plane, bool setCeil, int xyangi, int zangi DVector3 norm; - if (ib_compatflags & BCOMPATF_SETSLOPEOVERFLOW) + if (Level->ib_compatflags & BCOMPATF_SETSLOPEOVERFLOW) { // We have to consider an integer multiplication overflow here. norm[0] = FixedToFloat(FloatToFixed(zang.Cos()) * FloatToFixed(xyang.Cos())) / 65536.; diff --git a/src/p_doors.cpp b/src/p_doors.cpp index 00b4f214e..c3c8b92e8 100644 --- a/src/p_doors.cpp +++ b/src/p_doors.cpp @@ -352,7 +352,7 @@ void DDoor::Construct(sector_t *sec, EVlDoor type, double speed, int delay, int m_TopCountdown = topcountdown; m_LightTag = lightTag; - if (i_compatflags & COMPATF_NODOORLIGHT) + if (Level->i_compatflags & COMPATF_NODOORLIGHT) { m_LightTag = 0; } diff --git a/src/p_enemy.cpp b/src/p_enemy.cpp index 17f1e8561..162e9a76c 100644 --- a/src/p_enemy.cpp +++ b/src/p_enemy.cpp @@ -464,7 +464,7 @@ int P_Move (AActor *actor) // [RH] I'm not so sure this is such a good idea // [GZ] That's why it's compat-optioned. - if (compatflags & COMPATF_MBFMONSTERMOVE && !(actor->flags8 & MF8_NOFRICTION)) + if (actor->Level->i_compatflags & COMPATF_MBFMONSTERMOVE && !(actor->flags8 & MF8_NOFRICTION)) { // killough 10/98: make monsters get affected by ice and sludge too: movefactor = P_GetMoveFactor (actor, &friction); @@ -864,7 +864,7 @@ void P_NewChaseDir(AActor * actor) if (actor->floorz - actor->dropoffz > actor->MaxDropOffHeight && actor->Z() <= actor->floorz && !(actor->flags & MF_DROPOFF) && !(actor->flags2 & MF2_ONMOBJ) && - !(actor->flags & MF_FLOAT) && !(i_compatflags & COMPATF_DROPOFF)) + !(actor->flags & MF_FLOAT) && !(actor->Level->i_compatflags & COMPATF_DROPOFF)) { FBoundingBox box(actor->X(), actor->Y(), actor->radius); FBlockLinesIterator it(actor->Level, box); @@ -1715,7 +1715,7 @@ int P_LookForPlayers (AActor *actor, INTBOOL allaround, FLookExParams *params) // the player then, eh? if(!(actor->flags6 & MF6_SEEINVISIBLE)) { - if ((player->mo->flags & MF_SHADOW && !(i_compatflags & COMPATF_INVISIBILITY)) || + if ((player->mo->flags & MF_SHADOW && !(actor->Level->i_compatflags & COMPATF_INVISIBILITY)) || player->mo->flags3 & MF3_GHOST) { if (player->mo->Distance2D (actor) > 128 && player->mo->Vel.XY().LengthSquared() < 5*5) @@ -1776,7 +1776,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_Look) } else { - targ = (i_compatflags & COMPATF_SOUNDTARGET || self->flags & MF_NOSECTOR)? + targ = (self->Level->i_compatflags & COMPATF_SOUNDTARGET || self->flags & MF_NOSECTOR)? self->Sector->SoundTarget : self->LastHeard; // [RH] If the soundtarget is dead, don't chase it @@ -1909,7 +1909,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_LookEx) { if (!(flags & LOF_NOSOUNDCHECK)) { - targ = (i_compatflags & COMPATF_SOUNDTARGET || self->flags & MF_NOSECTOR)? + targ = (self->Level->i_compatflags & COMPATF_SOUNDTARGET || self->flags & MF_NOSECTOR)? self->Sector->SoundTarget : self->LastHeard; if (targ != NULL) { @@ -2721,7 +2721,7 @@ bool P_CheckForResurrection(AActor *self, bool usevilestates) { corpsehit->Translation = info->Translation; // Clean up bloodcolor translation from crushed corpses } - if (ib_compatflags & BCOMPATF_VILEGHOSTS) + if (self->Level->ib_compatflags & BCOMPATF_VILEGHOSTS) { corpsehit->Height *= 4; // [GZ] This was a commented-out feature, so let's make use of it, @@ -3116,7 +3116,7 @@ void A_BossDeath(AActor *self) LEVEL_SORCERER2SPECIAL)) == 0) return; - if ((i_compatflags & COMPATF_ANYBOSSDEATH) || ( // [GZ] Added for UAC_DEAD + if ((Level->i_compatflags & COMPATF_ANYBOSSDEATH) || ( // [GZ] Added for UAC_DEAD ((Level->flags & LEVEL_MAP07SPECIAL) && (type == NAME_Fatso || type == NAME_Arachnotron)) || ((Level->flags & LEVEL_BRUISERSPECIAL) && (type == NAME_BaronOfHell)) || ((Level->flags & LEVEL_CYBORGSPECIAL) && (type == NAME_Cyberdemon)) || diff --git a/src/p_floor.cpp b/src/p_floor.cpp index 4f6e087b1..0bd2ae5b7 100644 --- a/src/p_floor.cpp +++ b/src/p_floor.cpp @@ -461,7 +461,7 @@ bool FLevelLocals::CreateFloor(sector_t *sec, DFloor::EFloor floortype, line_t * // [Graf Zahl] // Don't make sounds for instant movement hacks but make an exception for // switches that activate their own back side. - if (!(i_compatflags & COMPATF_SILENT_INSTANT_FLOORS)) + if (!(sec->Level->i_compatflags & COMPATF_SILENT_INSTANT_FLOORS)) { if (!line || !(line->activation & (SPAC_Use | SPAC_Push)) || line->backsector != sec) silent = true; diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index ed594244b..04d7d9337 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -3065,7 +3065,7 @@ FUNC(LS_SetPlayerProperty) { int i; - if ((ib_compatflags & BCOMPATF_LINKFROZENPROPS) && (mask & (CF_FROZEN | CF_TOTALLYFROZEN))) + if ((Level->ib_compatflags & BCOMPATF_LINKFROZENPROPS) && (mask & (CF_FROZEN | CF_TOTALLYFROZEN))) { // Clearing one of these properties clears both of them (if the compat flag is set.) mask = CF_FROZEN | CF_TOTALLYFROZEN; } diff --git a/src/p_map.cpp b/src/p_map.cpp index 1d14c00bd..ebfda7f83 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -459,7 +459,7 @@ bool P_TeleportMove(AActor* thing, const DVector3 &pos, bool telefrag, bool modi // [RH] Z-Check // But not if not MF2_PASSMOBJ or MF3_DONTOVERLAP are set! // Otherwise those things would get stuck inside each other. - if ((thing->flags2 & MF2_PASSMOBJ || th->flags4 & MF4_ACTLIKEBRIDGE) && !(i_compatflags & COMPATF_NO_PASSMOBJ)) + if ((thing->flags2 & MF2_PASSMOBJ || th->flags4 & MF4_ACTLIKEBRIDGE) && !(thing->Level->i_compatflags & COMPATF_NO_PASSMOBJ)) { if (!(th->flags3 & thing->flags3 & MF3_DONTOVERLAP)) { @@ -516,7 +516,7 @@ bool P_TeleportMove(AActor* thing, const DVector3 &pos, bool telefrag, bool modi // If this teleport was caused by a move, P_TryMove() will handle the // sector transition messages better than we can here. // This needs to be compatibility optioned because some older maps exploited this missing feature. - if (!(thing->flags6 & MF6_INTRYMOVE) && !(i_compatflags2 & COMPATF2_TELEPORT)) + if (!(thing->flags6 & MF6_INTRYMOVE) && !(thing->Level->i_compatflags2 & COMPATF2_TELEPORT)) { thing->CheckSectorTransition(oldsec); } @@ -850,7 +850,7 @@ bool PIT_CheckLine(FMultiBlockLinesIterator &mit, FMultiBlockLinesIterator::Chec // into being friendly with the MBF flag automatically gain MF3_NOBLOCKMONST, so this // just optionally generalizes the behavior to other friendly monsters. bool NotBlocked = ((tm.thing->flags3 & MF3_NOBLOCKMONST) - || ((i_compatflags & COMPATF_NOBLOCKFRIENDS) && (tm.thing->flags & MF_FRIENDLY))); + || ((tm.thing->Level->i_compatflags & COMPATF_NOBLOCKFRIENDS) && (tm.thing->flags & MF_FRIENDLY))); uint32_t ProjectileBlocking = ML_BLOCKEVERYTHING | ML_BLOCKPROJECTILE; if ( tm.thing->flags8 & MF8_BLOCKASPLAYER ) ProjectileBlocking |= ML_BLOCK_PLAYERS | ML_BLOCKING; @@ -1263,7 +1263,7 @@ bool PIT_CheckThing(FMultiBlockThingsIterator &it, FMultiBlockThingsIterator::Ch // walking on other actors and unblocking is too messy through restricted portal types so disable it. if (!(cres.portalflags & FFCF_RESTRICTEDPORTAL)) { - if (!(i_compatflags & COMPATF_NO_PASSMOBJ) && !(tm.thing->flags & (MF_FLOAT | MF_MISSILE | MF_SKULLFLY | MF_NOGRAVITY)) && + if (!(thing->Level->i_compatflags & COMPATF_NO_PASSMOBJ) && !(tm.thing->flags & (MF_FLOAT | MF_MISSILE | MF_SKULLFLY | MF_NOGRAVITY)) && (thing->flags & MF_SOLID) && (thing->flags4 & MF4_ACTLIKEBRIDGE)) { // [RH] Let monsters walk on actors as well as floors @@ -1311,7 +1311,7 @@ bool PIT_CheckThing(FMultiBlockThingsIterator &it, FMultiBlockThingsIterator::Ch // [RH] If the other thing is a bridge, then treat the moving thing as if it had MF2_PASSMOBJ, so // you can use a scrolling floor to move scenery items underneath a bridge. - if ((tm.thing->flags2 & MF2_PASSMOBJ || thing->flags4 & MF4_ACTLIKEBRIDGE) && !(i_compatflags & COMPATF_NO_PASSMOBJ)) + if ((tm.thing->flags2 & MF2_PASSMOBJ || thing->flags4 & MF4_ACTLIKEBRIDGE) && !(tm.thing->Level->i_compatflags & COMPATF_NO_PASSMOBJ)) { // check if a mobj passed over/under another object if (!(tm.thing->flags & MF_MISSILE) || !(tm.thing->flags2 & MF2_RIP) || @@ -1441,7 +1441,7 @@ bool PIT_CheckThing(FMultiBlockThingsIterator &it, FMultiBlockThingsIterator::Ch { clipheight = thing->projectilepassheight; } - else if (thing->projectilepassheight < 0 && (i_compatflags & COMPATF_MISSILECLIP)) + else if (thing->projectilepassheight < 0 && (thing->Level->i_compatflags & COMPATF_MISSILECLIP)) { clipheight = -thing->projectilepassheight; } @@ -1763,7 +1763,7 @@ bool P_CheckPosition(AActor *thing, const DVector2 &pos, FCheckPosition &tm, boo AActor *BlockingMobj = thing->BlockingMobj; // If this blocks through a restricted line portal, it will always completely block. - if (BlockingMobj == NULL || (i_compatflags & COMPATF_NO_PASSMOBJ) || (tcres.portalflags & FFCF_RESTRICTEDPORTAL)) + if (BlockingMobj == NULL || (thing->Level->i_compatflags & COMPATF_NO_PASSMOBJ) || (tcres.portalflags & FFCF_RESTRICTEDPORTAL)) { // Thing slammed into something; don't let it move now. thing->Height = realHeight; return false; @@ -2068,7 +2068,7 @@ static void CheckForPushSpecial(line_t *line, int side, AActor *mobj, DVector2 * { if (line->special && !(mobj->flags6 & MF6_NOTRIGGER)) { - if (posforwindowcheck && !(i_compatflags2 & COMPATF2_PUSHWINDOW) && line->backsector != NULL) + if (posforwindowcheck && !(mobj->Level->i_compatflags2 & COMPATF2_PUSHWINDOW) && line->backsector != NULL) { // Make sure this line actually blocks us and is not a window // or similar construct we are standing inside of. DVector3 pos = mobj->PosRelative(line); @@ -2175,7 +2175,7 @@ bool P_TryMove(AActor *thing, const DVector2 &pos, goto pushline; } } - if (!(tm.thing->flags2 & MF2_PASSMOBJ) || (i_compatflags & COMPATF_NO_PASSMOBJ)) + if (!(tm.thing->flags2 & MF2_PASSMOBJ) || (tm.thing->Level->i_compatflags & COMPATF_NO_PASSMOBJ)) { thing->SetZ(oldz); thing->flags6 &= ~MF6_INTRYMOVE; @@ -2274,7 +2274,7 @@ bool P_TryMove(AActor *thing, const DVector2 &pos, // compatibility check: Doom originally did not allow monsters to cross dropoffs at all. // If the compatibility flag is on, only allow this when the velocity comes from a scroller - if ((i_compatflags & COMPATF_CROSSDROPOFF) && !(thing->flags4 & MF4_SCROLLMOVE)) + if ((thing->Level->i_compatflags & COMPATF_CROSSDROPOFF) && !(thing->flags4 & MF4_SCROLLMOVE)) { dropoff = false; } @@ -2963,7 +2963,7 @@ void FSlide::SlideTraverse(const DVector2 &start, const DVector2 &end) goto isblocking; } if (li->flags & ML_BLOCKMONSTERS && !((slidemo->flags3 & MF3_NOBLOCKMONST) - || ((i_compatflags & COMPATF_NOBLOCKFRIENDS) && (slidemo->flags & MF_FRIENDLY)))) + || ((slidemo->Level->i_compatflags & COMPATF_NOBLOCKFRIENDS) && (slidemo->flags & MF_FRIENDLY)))) { goto isblocking; } @@ -4588,7 +4588,7 @@ AActor *P_LineAttack(AActor *t1, DAngle angle, double distance, // Hit a thing, so it could be either a puff or blood DVector3 bleedpos = trace.HitPos; // position a bit closer for puffs/blood if using compatibility mode. - if (i_compatflags & COMPATF_HITSCAN) + if (trace.Actor->Level->i_compatflags & COMPATF_HITSCAN) { DVector2 ofs = t1->Level->GetPortalOffsetPosition(bleedpos.X, bleedpos.Y, -10 * trace.HitVector.X, -10 * trace.HitVector.Y); bleedpos.X = ofs.X; @@ -4781,7 +4781,7 @@ int P_LineTrace(AActor *t1, DAngle angle, double distance, if ( flags & TRF_BLOCKSELF ) { bool Projectile = ( (t1->flags&MF_MISSILE) || (t1->BounceFlags&BOUNCE_MBF) ); - bool NotBlocked = ( (t1->flags3&MF3_NOBLOCKMONST) || ( (i_compatflags&COMPATF_NOBLOCKFRIENDS) && (t1->flags&MF_FRIENDLY) ) ); + bool NotBlocked = ( (t1->flags3&MF3_NOBLOCKMONST) || ( (t1->Level->i_compatflags&COMPATF_NOBLOCKFRIENDS) && (t1->flags&MF_FRIENDLY) ) ); if ( Projectile ) lflags |= ML_BLOCKPROJECTILE; if ( !Projectile || (t1->flags8&MF8_BLOCKASPLAYER) ) lflags |= ML_BLOCKING; if ( !NotBlocked ) lflags |= ML_BLOCKMONSTERS; @@ -5099,7 +5099,7 @@ static ETraceStatus ProcessRailHit(FTraceResults &res, void *userdata) newhit.HitActor = res.Actor; newhit.HitPos = res.HitPos; newhit.HitAngle = res.SrcAngleFromTarget; - if (i_compatflags & COMPATF_HITSCAN) + if (res.Actor->Level->i_compatflags & COMPATF_HITSCAN) { DVector2 ofs = res.Actor->Level->GetPortalOffsetPosition(newhit.HitPos.X, newhit.HitPos.Y, -10 * res.HitVector.X, -10 * res.HitVector.Y); newhit.HitPos.X = ofs.X; @@ -5427,7 +5427,7 @@ bool P_UseTraverse(AActor *usething, const DVector2 &start, const DVector2 &end, P_LineOpening(open, NULL, in->d.line, it.InterceptPoint(in)); } if (open.range <= 0 || - (in->d.line->special != 0 && (i_compatflags & COMPATF_USEBLOCKING))) + (in->d.line->special != 0 && (usething->Level->i_compatflags & COMPATF_USEBLOCKING))) { // [RH] Give sector a chance to intercept the use @@ -5487,7 +5487,7 @@ bool P_UseTraverse(AActor *usething, const DVector2 &start, const DVector2 &end, //[RH] And now I've changed it again. If the line is of type // SPAC_USE, then it eats the use. Everything else passes // it through, including SPAC_USETHROUGH. - if (i_compatflags & COMPATF_USEBLOCKING) + if (usething->Level->i_compatflags & COMPATF_USEBLOCKING) { if (in->d.line->activation & SPAC_UseThrough) continue; else return true; diff --git a/src/p_maputl.cpp b/src/p_maputl.cpp index 4ea687216..16f6a72ad 100644 --- a/src/p_maputl.cpp +++ b/src/p_maputl.cpp @@ -1543,7 +1543,7 @@ void FPathTraverse::init(double x1, double y1, double x2, double y2, int flags, // Count is present to prevent a round off error // from skipping the break statement. - bool compatible = (flags & PT_COMPATIBLE) && (i_compatflags & COMPATF_HITSCAN); + bool compatible = (flags & PT_COMPATIBLE) && (Level->i_compatflags & COMPATF_HITSCAN); // we want to use one list of checked actors for the entire operation FBlockThingsIterator btit(Level); diff --git a/src/p_maputl.h b/src/p_maputl.h index e22c9cddd..99a8a8a04 100644 --- a/src/p_maputl.h +++ b/src/p_maputl.h @@ -4,6 +4,7 @@ #include #include "r_defs.h" #include "doomstat.h" +#include "doomdata.h" #include "m_bbox.h" extern int validcount; @@ -50,7 +51,7 @@ inline int P_PointOnLineSidePrecise(const DVector2 &pt, const line_t *line) inline int P_PointOnLineSide (double x, double y, const line_t *line) { extern int P_VanillaPointOnLineSide(double x, double y, const line_t* line); - return i_compatflags2 & COMPATF2_POINTONLINE + return (line->flags & ML_COMPATSIDE) ? P_VanillaPointOnLineSide(x, y, line) : P_PointOnLineSidePrecise(x, y, line); } diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 52e413278..57216d5e3 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -1161,7 +1161,7 @@ bool AActor::Grind(bool items) // see rh_log entry for February 21, 1999. Don't know if it is still relevant. if (state == NULL // Only use the default crushed state if: && !(flags & MF_NOBLOOD) // 1. the monster bleeeds, - && (i_compatflags & COMPATF_CORPSEGIBS) // 2. the compat setting is on, + && (Level->i_compatflags & COMPATF_CORPSEGIBS) // 2. the compat setting is on, && player == NULL) // 3. and the thing isn't a player. { isgeneric = true; @@ -1816,7 +1816,7 @@ double P_XYMovement (AActor *mo, DVector2 scroll) // [anon] When friction is turned off, turn off the crouching and water // speed caps as well, since it is a sort of friction, and the modders // most likely want to deal with that themselves. - if ((mo->player != NULL && (i_compatflags & COMPATF_WALLRUN)) || ((mo->waterlevel >= 1 || + if ((mo->player != NULL && (mo->Level->i_compatflags & COMPATF_WALLRUN)) || ((mo->waterlevel >= 1 || (mo->player != NULL && mo->player->crouchfactor < 0.75)) && !(mo->flags8 & MF8_NOFRICTION))) { // preserve the direction instead of clamping x and y independently. @@ -1938,7 +1938,7 @@ double P_XYMovement (AActor *mo, DVector2 scroll) DAngle oldangle = mo->Angles.Yaw; do { - if (i_compatflags & COMPATF_WALLRUN) pushtime++; + if (mo->Level->i_compatflags & COMPATF_WALLRUN) pushtime++; tm.PushTime = pushtime; ptry = start + move * step / steps; @@ -1989,7 +1989,7 @@ double P_XYMovement (AActor *mo, DVector2 scroll) // actor's velocity, do not attempt to slide. if (mo->Vel.XY() == startvel) { - if (player && (i_compatflags & COMPATF_WALLRUN)) + if (player && (mo->Level->i_compatflags & COMPATF_WALLRUN)) { // [RH] Here is the key to wall running: The move is clipped using its full speed. // If the move is done a second time (because it was too fast for one move), it @@ -2007,7 +2007,7 @@ double P_XYMovement (AActor *mo, DVector2 scroll) } else { - if (!player || !(i_compatflags & COMPATF_WALLRUN)) + if (!player || !(mo->Level->i_compatflags & COMPATF_WALLRUN)) { move = mo->Vel; onestep = move / steps; @@ -2451,7 +2451,7 @@ void P_ZMovement (AActor *mo, double oldfloorz) // Hexen yanked all items to the floor, except those being spawned at map start in the air. // Those were kept at their original height. // Do this only if the item was actually spawned by the map above ground to avoid problems. - if (mo->specialf1 > 0 && (mo->flags2 & MF2_FLOATBOB) && (ib_compatflags & BCOMPATF_FLOATBOB)) + if (mo->specialf1 > 0 && (mo->flags2 & MF2_FLOATBOB) && (mo->Level->ib_compatflags & BCOMPATF_FLOATBOB)) { mo->SetZ(mo->floorz + mo->specialf1); } @@ -3713,7 +3713,7 @@ void AActor::Tick () scrolltype <= Scroll_SouthWest_Fast) { // Hexen scroll special scrolltype -= Scroll_North_Slow; - if (i_compatflags&COMPATF_RAVENSCROLL) + if (Level->i_compatflags&COMPATF_RAVENSCROLL) { scrollv.X -= HexenCompatSpeeds[HexenScrollies[scrolltype][0]+4] * (1. / (32 * CARRYFACTOR)); scrollv.Y += HexenCompatSpeeds[HexenScrollies[scrolltype][1]+4] * (1. / (32 * CARRYFACTOR)); @@ -3732,7 +3732,7 @@ void AActor::Tick () scrolltype -= Carry_East5; uint8_t dir = HereticScrollDirs[scrolltype / 5]; double carryspeed = HereticSpeedMuls[scrolltype % 5] * (1. / (32 * CARRYFACTOR)); - if (scrolltype < 5 && !(i_compatflags&COMPATF_RAVENSCROLL)) + if (scrolltype < 5 && !(Level->i_compatflags&COMPATF_RAVENSCROLL)) { // Use speeds that actually match the scrolling textures! carryspeed = (1 << ((scrolltype % 5) + 15)) / 65536.; @@ -3742,7 +3742,7 @@ void AActor::Tick () } else if (scrolltype == dScroll_EastLavaDamage) { // Special Heretic scroll special - if (i_compatflags&COMPATF_RAVENSCROLL) + if (Level->i_compatflags&COMPATF_RAVENSCROLL) { scrollv.X += 28. / (32*CARRYFACTOR); } @@ -3795,7 +3795,7 @@ void AActor::Tick () // Some levels designed with Boom in mind actually want things to accelerate // at neighboring scrolling sector boundaries. But it is only important for // non-player objects. - if (player != NULL || !(i_compatflags & COMPATF_BOOMSCROLL)) + if (player != NULL || !(Level->i_compatflags & COMPATF_BOOMSCROLL)) { if (countx > 1) { @@ -3888,7 +3888,7 @@ void AActor::Tick () } if (Vel.Z != 0 || BlockingMobj || Z() != floorz) { // Handle Z velocity and gravity - if (((flags2 & MF2_PASSMOBJ) || (flags & MF_SPECIAL)) && !(i_compatflags & COMPATF_NO_PASSMOBJ)) + if (((flags2 & MF2_PASSMOBJ) || (flags & MF_SPECIAL)) && !(Level->i_compatflags & COMPATF_NO_PASSMOBJ)) { if (!(onmo = P_CheckOnmobj (this))) { @@ -5414,7 +5414,7 @@ AActor *FLevelLocals::SpawnMapThing (FMapThing *mthing, int position) if (sz == ONFLOORZ) { mobj->AddZ(mthing->pos.Z); - if ((mobj->flags2 & MF2_FLOATBOB) && (ib_compatflags & BCOMPATF_FLOATBOB)) + if ((mobj->flags2 & MF2_FLOATBOB) && (mobj->Level->ib_compatflags & BCOMPATF_FLOATBOB)) { mobj->specialf1 = mthing->pos.Z; } @@ -5437,7 +5437,7 @@ AActor *FLevelLocals::SpawnMapThing (FMapThing *mthing, int position) } // For Hexen floatbob 'compatibility' we do not really want to alter the floorz. - if (mobj->specialf1 == 0 || !(mobj->flags2 & MF2_FLOATBOB) || !(ib_compatflags & BCOMPATF_FLOATBOB)) + if (mobj->specialf1 == 0 || !(mobj->flags2 & MF2_FLOATBOB) || !(mobj->Level->ib_compatflags & BCOMPATF_FLOATBOB)) { P_FindFloorCeiling(mobj, FFCF_SAMESECTOR | FFCF_ONLY3DFLOORS | FFCF_3DRESTRICT); } diff --git a/src/p_pusher.cpp b/src/p_pusher.cpp index c06ee2c1f..2f580048c 100644 --- a/src/p_pusher.cpp +++ b/src/p_pusher.cpp @@ -199,7 +199,7 @@ void DPusher::Tick () bool pusharound = ((thing->flags2 & MF2_WINDTHRUST) && !(thing->flags & MF_NOCLIP)); // MBF allows any sentient or shootable thing to be affected, but players with a fly cheat aren't. - if (compatflags & COMPATF_MBFMONSTERMOVE) + if (Level->i_compatflags & COMPATF_MBFMONSTERMOVE) { pusharound = ((pusharound || (thing->IsSentient()) || (thing->flags & MF_SHOOTABLE)) // Add categories here && (!(thing->player && (thing->flags & (MF_NOGRAVITY))))); // Exclude flying players here diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index cb7cdc848..333992601 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -984,7 +984,9 @@ void FLevelLocals::Serialize(FSerializer &arc, bool hubload) Behaviors.SerializeModuleStates(arc); // The order here is important: First world state, then portal state, then thinkers, and last polyobjects. + SetCompatLineOnSide(false); // This flag should not be saved. It solely depends on current compatibility state. arc("linedefs", lines, loadlines); + SetCompatLineOnSide(true); arc("sidedefs", sides, loadsides); arc("sectors", sectors, loadsectors); arc("zones", Zones); diff --git a/src/p_sectors.cpp b/src/p_sectors.cpp index 1694652d5..b9e17dd5e 100644 --- a/src/p_sectors.cpp +++ b/src/p_sectors.cpp @@ -473,9 +473,9 @@ double FindHighestCeilingSurrounding (const sector_t *sector, vertex_t **v) // jff 02/03/98 Add routine to find shortest lower texture // -static inline void CheckShortestTex (FTextureID texnum, double &minsize) +static inline void CheckShortestTex (FLevelLocals *Level, FTextureID texnum, double &minsize) { - if (texnum.isValid() || (texnum.isNull() && (i_compatflags & COMPATF_SHORTTEX))) + if (texnum.isValid() || (texnum.isNull() && (Level->i_compatflags & COMPATF_SHORTTEX))) { FTexture *tex = TexMan.GetTexture(texnum); if (tex != NULL) @@ -497,8 +497,8 @@ double FindShortestTextureAround (sector_t *sec) { if (check->flags & ML_TWOSIDED) { - CheckShortestTex (check->sidedef[0]->GetTexture(side_t::bottom), minsize); - CheckShortestTex (check->sidedef[1]->GetTexture(side_t::bottom), minsize); + CheckShortestTex (sec->Level, check->sidedef[0]->GetTexture(side_t::bottom), minsize); + CheckShortestTex (sec->Level, check->sidedef[1]->GetTexture(side_t::bottom), minsize); } } return minsize < FLT_MAX ? minsize : TexMan.ByIndex(0)->GetDisplayHeight(); @@ -522,8 +522,8 @@ double FindShortestUpperAround (sector_t *sec) { if (check->flags & ML_TWOSIDED) { - CheckShortestTex (check->sidedef[0]->GetTexture(side_t::top), minsize); - CheckShortestTex (check->sidedef[1]->GetTexture(side_t::top), minsize); + CheckShortestTex (sec->Level, check->sidedef[0]->GetTexture(side_t::top), minsize); + CheckShortestTex (sec->Level, check->sidedef[1]->GetTexture(side_t::top), minsize); } } return minsize < FLT_MAX ? minsize : TexMan.ByIndex(0)->GetDisplayHeight(); diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 4a9955dd9..602adff56 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -546,6 +546,7 @@ void P_SetupLevel(FLevelLocals *Level, int position, bool newGame) Level->automap = AM_Create(Level); Level->automap->LevelInit(); + Level->SetCompatLineOnSide(true); // [RH] Start lightning, if MAPINFO tells us to if (Level->flags & LEVEL_STARTLIGHTNING) diff --git a/src/p_sight.cpp b/src/p_sight.cpp index 2e31e5f19..610025301 100644 --- a/src/p_sight.cpp +++ b/src/p_sight.cpp @@ -222,7 +222,7 @@ bool SightCheck::PTR_SightTraverse (intercept_t *in) // // ignore self referencing sectors if COMPAT_TRACE is on - if ((i_compatflags & COMPATF_TRACE) && li->frontsector == li->backsector) + if ((Level->i_compatflags & COMPATF_TRACE) && li->frontsector == li->backsector) return true; double trX = Trace.x + Trace.dx * in->frac; diff --git a/src/p_trace.cpp b/src/p_trace.cpp index 624f11bd7..dd9c7bb99 100644 --- a/src/p_trace.cpp +++ b/src/p_trace.cpp @@ -421,7 +421,7 @@ bool FTraceInfo::LineCheck(intercept_t *in, double dist, DVector3 hit, bool spec // For backwards compatibility: Ignore lines with the same sector on both sides. // This is the way Doom.exe did it and some WADs (e.g. Alien Vendetta MAP15) need it. - if (i_compatflags & COMPATF_TRACE && in->d.line->backsector == in->d.line->frontsector && !special3dpass) + if (Level->i_compatflags & COMPATF_TRACE && in->d.line->backsector == in->d.line->frontsector && !special3dpass) { // We must check special activation here because the code below is never reached. if (TraceFlags & TRACE_PCross) diff --git a/src/po_man.cpp b/src/po_man.cpp index 8c2aa750f..5147d77ff 100644 --- a/src/po_man.cpp +++ b/src/po_man.cpp @@ -1674,7 +1674,7 @@ void FPolyObj::CreateSubsectorLinks() seg->v2 = side->V2(); seg->wall = side; } - if (!(i_compatflags & COMPATF_POLYOBJ)) + if (!(Level->i_compatflags & COMPATF_POLYOBJ)) { SplitPoly(node, Level->HeadNode(), dummybbox); } diff --git a/src/s_sound.cpp b/src/s_sound.cpp index 7179b8bbe..fd609cabe 100644 --- a/src/s_sound.cpp +++ b/src/s_sound.cpp @@ -848,7 +848,7 @@ static bool ValidatePosVel(const FSoundChan *const chan, const FVector3 &pos, co static void CalcSectorSoundOrg(const DVector3 &listenpos, const sector_t *sec, int channum, FVector3 &pos) { - if (!(i_compatflags & COMPATF_SECTORSOUNDS)) + if (!(sec->Level->i_compatflags & COMPATF_SECTORSOUNDS)) { // Are we inside the sector? If yes, the closest point is the one we're on. if (currentUILevel->PointInSector(listenpos.X, listenpos.Y) == sec) @@ -1663,7 +1663,7 @@ void S_StopSound (int channel) { FSoundChan *next = chan->NextChan; if (chan->SourceType == SOURCE_None && - (chan->EntChannel == channel || (i_compatflags & COMPATF_MAGICSILENCE))) + (chan->EntChannel == channel || (compatflags & COMPATF_MAGICSILENCE))) { S_StopChannel(chan); } @@ -1687,7 +1687,7 @@ void S_StopSound (AActor *actor, int channel) FSoundChan *next = chan->NextChan; if (chan->SourceType == SOURCE_Actor && chan->Actor == actor && - (chan->EntChannel == channel || (i_compatflags & COMPATF_MAGICSILENCE))) + (chan->EntChannel == channel || (compatflags & COMPATF_MAGICSILENCE))) { S_StopChannel(chan); } @@ -1711,7 +1711,7 @@ void S_StopSound (const sector_t *sec, int channel) FSoundChan *next = chan->NextChan; if (chan->SourceType == SOURCE_Sector && chan->Sector == sec && - (chan->EntChannel == channel || (i_compatflags & COMPATF_MAGICSILENCE))) + (chan->EntChannel == channel || (compatflags & COMPATF_MAGICSILENCE))) { S_StopChannel(chan); } @@ -1735,7 +1735,7 @@ void S_StopSound (const FPolyObj *poly, int channel) FSoundChan *next = chan->NextChan; if (chan->SourceType == SOURCE_Polyobj && chan->Poly == poly && - (chan->EntChannel == channel || (i_compatflags & COMPATF_MAGICSILENCE))) + (chan->EntChannel == channel || (compatflags & COMPATF_MAGICSILENCE))) { S_StopChannel(chan); } @@ -1827,7 +1827,7 @@ void S_ChangeSoundVolume(AActor *actor, int channel, double dvolume) { if (chan->SourceType == SOURCE_Actor && chan->Actor == actor && - (chan->EntChannel == channel || (i_compatflags & COMPATF_MAGICSILENCE))) + (chan->EntChannel == channel || (compatflags & COMPATF_MAGICSILENCE))) { GSnd->ChannelVolume(chan, volume); chan->Volume = volume; @@ -1933,7 +1933,7 @@ static bool S_IsChannelUsed(AActor *actor, int channel, int *seen) bool S_IsActorPlayingSomething (AActor *actor, int channel, int sound_id) { - if (i_compatflags & COMPATF_MAGICSILENCE) + if (compatflags & COMPATF_MAGICSILENCE) { channel = 0; } diff --git a/src/scripting/backend/codegen.cpp b/src/scripting/backend/codegen.cpp index 2a854d346..6b5a4b9f8 100644 --- a/src/scripting/backend/codegen.cpp +++ b/src/scripting/backend/codegen.cpp @@ -6858,9 +6858,7 @@ ExpEmit FxCVar::Emit(VMFunctionBuilder *build) int *pVal; auto cv = static_cast(CVar); auto vcv = &cv->ValueVar; - if (vcv == &compatflags) pVal = &i_compatflags; - else if (vcv == &compatflags2) pVal = &i_compatflags2; - else pVal = &vcv->Value; + pVal = &vcv->Value; build->Emit(OP_LKP, addr.RegNum, build->GetConstantAddress(pVal)); build->Emit(OP_LW, dest.RegNum, addr.RegNum, nul); build->Emit(OP_SRL_RI, dest.RegNum, dest.RegNum, cv->BitNum); diff --git a/src/scripting/vmthunks_actors.cpp b/src/scripting/vmthunks_actors.cpp index a670907bb..d4b8f260a 100644 --- a/src/scripting/vmthunks_actors.cpp +++ b/src/scripting/vmthunks_actors.cpp @@ -1666,6 +1666,34 @@ DEFINE_ACTION_FUNCTION_NATIVE(AActor, isFrozen, isFrozen) } +//===================================================================================== +// +// compat flags. These two are the only ones that get checked in script code +// so anything more complex isn't really needed. +// +//===================================================================================== +static int compat_limitpain_(AActor *self) +{ + return self->Level->i_compatflags & COMPATF_LIMITPAIN; +} + +static int compat_mushroom_(AActor *self) +{ + return self->Level->i_compatflags & COMPATF_MUSHROOM; +} + +DEFINE_ACTION_FUNCTION_NATIVE(AActor, compat_limitpain, compat_limitpain_) +{ + PARAM_SELF_PROLOGUE(AActor); + ACTION_RETURN_INT(compat_limitpain_(self)); +} + +DEFINE_ACTION_FUNCTION_NATIVE(AActor, compat_mushroom, compat_mushroom_) +{ + PARAM_SELF_PROLOGUE(AActor); + ACTION_RETURN_INT(compat_mushroom_(self)); +} + //=========================================================================== // // PlayerPawn functions diff --git a/src/swrenderer/line/r_line.cpp b/src/swrenderer/line/r_line.cpp index 731292147..2b3578437 100644 --- a/src/swrenderer/line/r_line.cpp +++ b/src/swrenderer/line/r_line.cpp @@ -591,7 +591,7 @@ namespace swrenderer if (mFrontSector->e && mFrontSector->e->XFloor.lightlist.Size()) return true; if (mBackSector->e && mBackSector->e->XFloor.lightlist.Size()) return true; - if (sidedef->GetTexture(side_t::mid).isValid() && ((ib_compatflags & BCOMPATF_CLIPMIDTEX) || (linedef->flags & (ML_CLIP_MIDTEX | ML_WRAP_MIDTEX)) || sidedef->Flags & (WALLF_CLIP_MIDTEX | WALLF_WRAP_MIDTEX))) return true; + if (sidedef->GetTexture(side_t::mid).isValid() && ((mFrontSector->Level->ib_compatflags & BCOMPATF_CLIPMIDTEX) || (linedef->flags & (ML_CLIP_MIDTEX | ML_WRAP_MIDTEX)) || sidedef->Flags & (WALLF_CLIP_MIDTEX | WALLF_WRAP_MIDTEX))) return true; return false; } @@ -653,7 +653,7 @@ namespace swrenderer if (sidedef->GetTexture(side_t::mid).isValid()) { - if (ib_compatflags & BCOMPATF_CLIPMIDTEX) return true; + if (mFrontSector->Level->ib_compatflags & BCOMPATF_CLIPMIDTEX) return true; if (linedef->flags & (ML_CLIP_MIDTEX | ML_WRAP_MIDTEX)) return true; if (sidedef->Flags & (WALLF_CLIP_MIDTEX | WALLF_WRAP_MIDTEX)) return true; } diff --git a/src/swrenderer/line/r_renderdrawsegment.cpp b/src/swrenderer/line/r_renderdrawsegment.cpp index 0f477d70c..610641fdf 100644 --- a/src/swrenderer/line/r_renderdrawsegment.cpp +++ b/src/swrenderer/line/r_renderdrawsegment.cpp @@ -150,7 +150,7 @@ namespace swrenderer return false; FTexture *ttex = TexMan.GetPalettedTexture(curline->sidedef->GetTexture(side_t::mid), true); - if (i_compatflags & COMPATF_MASKEDMIDTEX) + if (curline->GetLevel()->i_compatflags & COMPATF_MASKEDMIDTEX) { ttex = ttex->GetRawTexture(); } @@ -294,7 +294,7 @@ namespace swrenderer // this drawseg. if ((curline->linedef->flags & ML_CLIP_MIDTEX) || (curline->sidedef->Flags & WALLF_CLIP_MIDTEX) || - (ib_compatflags & BCOMPATF_CLIPMIDTEX)) + (curline->GetLevel()->ib_compatflags & BCOMPATF_CLIPMIDTEX)) { ClipMidtex(x1, x2); } @@ -356,7 +356,7 @@ namespace swrenderer // this drawseg. if ((curline->linedef->flags & ML_CLIP_MIDTEX) || (curline->sidedef->Flags & WALLF_CLIP_MIDTEX) || - (ib_compatflags & BCOMPATF_CLIPMIDTEX)) + (curline->GetLevel()->ib_compatflags & BCOMPATF_CLIPMIDTEX)) { ClipMidtex(x1, x2); } diff --git a/src/swrenderer/things/r_visiblespritelist.cpp b/src/swrenderer/things/r_visiblespritelist.cpp index 8c3935a4b..ca1a40ab5 100644 --- a/src/swrenderer/things/r_visiblespritelist.cpp +++ b/src/swrenderer/things/r_visiblespritelist.cpp @@ -69,7 +69,7 @@ namespace swrenderer if (count == 0) return; - if (!(i_compatflags & COMPATF_SPRITESORT)) + if (!(thread->Viewport->Level()->i_compatflags & COMPATF_SPRITESORT)) { for (unsigned int i = 0; i < count; i++) SortedSprites[i] = Sprites[first + i]; diff --git a/wadsrc/static/zscript/doom/fatso.txt b/wadsrc/static/zscript/doom/fatso.txt index f24b0d2e7..cbf820398 100644 --- a/wadsrc/static/zscript/doom/fatso.txt +++ b/wadsrc/static/zscript/doom/fatso.txt @@ -105,6 +105,7 @@ extend class Actor { const FATSPREAD = 90./8; + private native bool compat_mushroom(); void A_FatRaise() { @@ -195,7 +196,7 @@ extend class Actor aimtarget.Height = Height; bool shootmode = ((flags & MSF_Classic) || // Flag explicitly set, or no flags and compat options - (flags == 0 && CurState.bDehacked && compat_mushroom)); + (flags == 0 && CurState.bDehacked && compat_mushroom())); for (i = -numspawns; i <= numspawns; i += 8) { diff --git a/wadsrc/static/zscript/doom/painelemental.txt b/wadsrc/static/zscript/doom/painelemental.txt index f953e47ef..7995eae1b 100644 --- a/wadsrc/static/zscript/doom/painelemental.txt +++ b/wadsrc/static/zscript/doom/painelemental.txt @@ -62,6 +62,8 @@ class PainElemental : Actor extend class Actor { + private native bool compat_limitpain(); + // // A_PainShootSkull // Spawn a lost soul and launch it at the target @@ -86,7 +88,7 @@ extend class Actor } // [RH] make this optional - if (limit < 0 && compat_limitpain) + if (limit < 0 && compat_limitpain()) limit = 21; if (limit > 0) From 4af5ea25c12d2f2be196b628334af9aef474352c Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 29 Jan 2019 20:09:06 +0100 Subject: [PATCH 090/164] - change per-level attenuation of dynamic lights for each viewpoint. To avoid unnecessary work, the current state is tracked. --- src/g_level.cpp | 2 -- src/g_shared/a_dynlight.h | 2 +- src/gl/renderer/gl_scene.cpp | 4 ++++ src/r_data/a_dynlightdata.cpp | 13 +++++++++---- src/r_data/gldefs.cpp | 2 ++ 5 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/g_level.cpp b/src/g_level.cpp index 5491367ad..3a29c2098 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1552,8 +1552,6 @@ void FLevelLocals::Init() brightfog = info->brightfog < 0? gl_brightfog : !!info->brightfog; lightadditivesurfaces = info->lightadditivesurfaces < 0 ? gl_lightadditivesurfaces : !!info->lightadditivesurfaces; notexturefill = info->notexturefill < 0 ? gl_notexturefill : !!info->notexturefill; - - FLightDefaults::SetAttenuationForLevel(); } //========================================================================== diff --git a/src/g_shared/a_dynlight.h b/src/g_shared/a_dynlight.h index 25d6a3477..77c971942 100644 --- a/src/g_shared/a_dynlight.h +++ b/src/g_shared/a_dynlight.h @@ -76,7 +76,7 @@ public: void SetSpot(bool spot) { if (spot) m_lightFlags |= LF_SPOT; else m_lightFlags &= ~LF_SPOT; } void SetSpotInnerAngle(double angle) { m_spotInnerAngle = angle; } void SetSpotOuterAngle(double angle) { m_spotOuterAngle = angle; } - static void SetAttenuationForLevel(); + static void SetAttenuationForLevel(bool); void OrderIntensities() { diff --git a/src/gl/renderer/gl_scene.cpp b/src/gl/renderer/gl_scene.cpp index 8e6475c96..c62203be9 100644 --- a/src/gl/renderer/gl_scene.cpp +++ b/src/gl/renderer/gl_scene.cpp @@ -156,6 +156,10 @@ sector_t * FGLRenderer::RenderViewpoint (FRenderViewpoint &mainvp, AActor * came if (mainview && toscreen) UpdateShadowMap(); + // Update the attenuation flag of all light defaults for each viewpoint. + // This function will only do something if the setting differs. + FLightDefaults::SetAttenuationForLevel(!!(camera->Level->flags3 & LEVEL3_ATTENUATE)); + // Render (potentially) multiple views for stereo 3d // Fixme. The view offsetting should be done with a static table and not require setup of the entire render state for the mode. auto vrmode = VRMode::GetVRMode(mainview && toscreen); diff --git a/src/r_data/a_dynlightdata.cpp b/src/r_data/a_dynlightdata.cpp index f0b66f972..e6ed0c10b 100644 --- a/src/r_data/a_dynlightdata.cpp +++ b/src/r_data/a_dynlightdata.cpp @@ -55,6 +55,7 @@ inline PClassActor * GetRealType(PClassActor * ti) } TDeletingArray LightDefaults; +int AttenuationIsSet = -1; //----------------------------------------------------------------------------- // @@ -101,14 +102,18 @@ void FLightDefaults::ApplyProperties(FDynamicLight * light) const light->SetOffset(m_Pos); // this must be the last thing to do. } -void FLightDefaults::SetAttenuationForLevel() +void FLightDefaults::SetAttenuationForLevel(bool yes) { - for (auto ldef : LightDefaults) + if (AttenuationIsSet != int(yes)) { - if (ldef->m_attenuate == -1) + for (auto ldef : LightDefaults) { - if (level.flags3 & LEVEL3_ATTENUATE) ldef->m_lightFlags |= LF_ATTENUATE; else ldef->m_lightFlags &= ~LF_ATTENUATE; + if (ldef->m_attenuate == -1) + { + if (yes) ldef->m_lightFlags |= LF_ATTENUATE; else ldef->m_lightFlags &= ~LF_ATTENUATE; + } } + AttenuationIsSet = yes; } } diff --git a/src/r_data/gldefs.cpp b/src/r_data/gldefs.cpp index 054e299cd..e853ed6e4 100644 --- a/src/r_data/gldefs.cpp +++ b/src/r_data/gldefs.cpp @@ -53,6 +53,7 @@ void InitializeActorLights(TArray &LightAssociations); TArray usershaders; extern TDeletingArray LightDefaults; +extern int AttenuationIsSet; //----------------------------------------------------------------------------- @@ -1777,6 +1778,7 @@ void ParseGLDefs() const char *defsLump = NULL; LightDefaults.DeleteAndClear(); + AttenuationIsSet = -1; //gl_DestroyUserShaders(); function says 'todo' switch (gameinfo.gametype) { From 1b37d85ac3ffc3f05304df538189224cf3de3c4f Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 29 Jan 2019 20:15:06 +0100 Subject: [PATCH 091/164] - removed a few missed references in FLevelLocals's member functions. --- src/g_game.cpp | 12 ++++++------ src/g_level.cpp | 2 +- src/g_levellocals.h | 2 ++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/g_game.cpp b/src/g_game.cpp index 119e99ee5..09732db19 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -1410,7 +1410,7 @@ FPlayerStart *FLevelLocals::SelectFarthestDeathmatchSpot (size_t selections) if (distance > bestdistance) { bestdistance = distance; - bestspot = &level.deathmatchstarts[i]; + bestspot = &deathmatchstarts[i]; } } @@ -1425,7 +1425,7 @@ FPlayerStart *FLevelLocals::SelectRandomDeathmatchSpot (int playernum, unsigned for (j = 0; j < 20; j++) { i = pr_dmspawn() % selections; - if (CheckSpot (playernum, &level.deathmatchstarts[i]) ) + if (CheckSpot (playernum, &deathmatchstarts[i]) ) { return &deathmatchstarts[i]; } @@ -1526,7 +1526,7 @@ FPlayerStart *FLevelLocals::PickPlayerStart(int playernum, int flags) unsigned int i; // Find all unblocked player starts. - for (i = 0; i < level.AllPlayerStarts.Size(); ++i) + for (i = 0; i < AllPlayerStarts.Size(); ++i) { if (CheckSpot(playernum, &AllPlayerStarts[i])) { @@ -1539,7 +1539,7 @@ FPlayerStart *FLevelLocals::PickPlayerStart(int playernum, int flags) } } // Pick a spot at random, whether it's open or not. - return &level.AllPlayerStarts[pr_pspawn(AllPlayerStarts.Size())]; + return &AllPlayerStarts[pr_pspawn(AllPlayerStarts.Size())]; } return &playerstarts[playernum]; } @@ -1568,7 +1568,7 @@ DEFINE_ACTION_FUNCTION(FLevelLocals, PickPlayerStart) void FLevelLocals::QueueBody (AActor *body) { // flush an old corpse if needed - int modslot = bodyqueslot%level.BODYQUESIZE; + int modslot = bodyqueslot % BODYQUESIZE; bodyqueslot = modslot + 1; if (bodyqueslot >= BODYQUESIZE && bodyque[modslot] != NULL) @@ -1620,7 +1620,7 @@ void FLevelLocals::DoReborn (int playernum, bool freshbot) { // Reload the level from scratch bool indemo = demoplayback; BackupSaveName = ""; - G_InitNew (level.MapName, false); + G_InitNew (MapName, false); demoplayback = indemo; } } diff --git a/src/g_level.cpp b/src/g_level.cpp index 3a29c2098..940708a80 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -141,7 +141,7 @@ CUSTOM_CVAR(Int, gl_lightmode, 3, CVAR_ARCHIVE | CVAR_NOINITCALL) if (self != newself) self = newself; else for (auto Level : AllLevels()) { - if ((level.info == nullptr || level.info->lightmode == ELightMode::NotSet)) level.lightMode = (ELightMode)*self; + if ((Level->info == nullptr || Level->info->lightmode == ELightMode::NotSet)) Level->lightMode = (ELightMode)*self; } } diff --git a/src/g_levellocals.h b/src/g_levellocals.h index aa19b989e..30d915ccd 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -98,6 +98,8 @@ typedef TMap FDialogueMap; // maps actor class names to dialogue struct FLevelLocals { + void *level; + void *Level; // bug catchers. FLevelLocals() : Behaviors(this), tagManager(this) {} friend class MapLoader; From 12351ae9bb1ea746d2c119b1c2d0d3b8ad5f53cd Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 29 Jan 2019 20:23:18 +0100 Subject: [PATCH 092/164] - made dumpportals CCMD multi-level aware. --- src/r_data/portalgroups.cpp | 51 ++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/src/r_data/portalgroups.cpp b/src/r_data/portalgroups.cpp index 25bbdd198..2560ce3d9 100644 --- a/src/r_data/portalgroups.cpp +++ b/src/r_data/portalgroups.cpp @@ -468,36 +468,39 @@ void InitPortalGroups(FLevelLocals *Level) CCMD(dumpportals) { - auto Level = &level; - for(unsigned i=0;iportalGroups.Size(); i++) + for (auto Level : AllLevels()) { - auto p = Level->portalGroups[i]; - double xdisp = p->mDisplacement.X; - double ydisp = p->mDisplacement.Y; - Printf(PRINT_LOG, "Portal #%d, %s, displacement = (%f,%f)\n", i, p->plane==0? "floor":"ceiling", - xdisp, ydisp); - Printf(PRINT_LOG, "Coverage:\n"); - for(auto &sub : Level->subsectors) + Printf("Portal groups for %s\n", Level->MapName.GetChars()); + for (unsigned i = 0; i < Level->portalGroups.Size(); i++) { - auto port = sub.render_sector->GetPortalGroup(p->plane); - if (port == p) + auto p = Level->portalGroups[i]; + double xdisp = p->mDisplacement.X; + double ydisp = p->mDisplacement.Y; + Printf(PRINT_LOG, "Portal #%d, %s, displacement = (%f,%f)\n", i, p->plane == 0 ? "floor" : "ceiling", + xdisp, ydisp); + Printf(PRINT_LOG, "Coverage:\n"); + for (auto &sub : Level->subsectors) { - Printf(PRINT_LOG, "\tSubsector %d (%d):\n\t\t", sub.Index(), sub.render_sector->sectornum); - for(unsigned k = 0;k< sub.numlines; k++) + auto port = sub.render_sector->GetPortalGroup(p->plane); + if (port == p) { - Printf(PRINT_LOG, "(%.3f,%.3f), ", sub.firstline[k].v1->fX() + xdisp, sub.firstline[k].v1->fY() + ydisp); - } - Printf(PRINT_LOG, "\n\t\tCovered by subsectors:\n"); - FPortalCoverage *cov = &sub.portalcoverage[p->plane]; - for(int l = 0;l< cov->sscount; l++) - { - subsector_t *csub = &Level->subsectors[cov->subsectors[l]]; - Printf(PRINT_LOG, "\t\t\t%5d (%4d): ", cov->subsectors[l], csub->render_sector->sectornum); - for(unsigned m = 0;m< csub->numlines; m++) + Printf(PRINT_LOG, "\tSubsector %d (%d):\n\t\t", sub.Index(), sub.render_sector->sectornum); + for (unsigned k = 0; k < sub.numlines; k++) { - Printf(PRINT_LOG, "(%.3f,%.3f), ", csub->firstline[m].v1->fX(), csub->firstline[m].v1->fY()); + Printf(PRINT_LOG, "(%.3f,%.3f), ", sub.firstline[k].v1->fX() + xdisp, sub.firstline[k].v1->fY() + ydisp); + } + Printf(PRINT_LOG, "\n\t\tCovered by subsectors:\n"); + FPortalCoverage *cov = &sub.portalcoverage[p->plane]; + for (int l = 0; l < cov->sscount; l++) + { + subsector_t *csub = &Level->subsectors[cov->subsectors[l]]; + Printf(PRINT_LOG, "\t\t\t%5d (%4d): ", cov->subsectors[l], csub->render_sector->sectornum); + for (unsigned m = 0; m < csub->numlines; m++) + { + Printf(PRINT_LOG, "(%.3f,%.3f), ", csub->firstline[m].v1->fX(), csub->firstline[m].v1->fY()); + } + Printf(PRINT_LOG, "\n"); } - Printf(PRINT_LOG, "\n"); } } } From ea849e5acaef73ee608fa4eca69f8ccd572d6a5d Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 29 Jan 2019 21:19:16 +0100 Subject: [PATCH 093/164] - split G_DoLoadLevel into a level specific and a global part. --- src/g_level.cpp | 111 ++++++++++++++++++++++++-------------------- src/g_levellocals.h | 1 + 2 files changed, 62 insertions(+), 50 deletions(-) diff --git a/src/g_level.cpp b/src/g_level.cpp index 940708a80..6825d78ed 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -947,11 +947,47 @@ void DAutosaver::Tick () extern gamestate_t wipegamestate; -void G_DoLoadLevel (const FString &nextmapname, int position, bool autosave, bool newGame) +void G_DoLoadLevel(const FString &nextmapname, int position, bool autosave, bool newGame) { - level.MapName = nextmapname; - static int lastposition = 0; gamestate_t oldgs = gamestate; + + // Here the new level needs to be allocated. + level.DoLoadLevel(nextmapname, position, autosave, newGame); + + // Reset the global state for the new level. + if (wipegamestate == GS_LEVEL) + wipegamestate = GS_FORCEWIPE; + + if (gamestate != GS_TITLELEVEL) + { + gamestate = GS_LEVEL; + } + + gameaction = ga_nothing; + + // clear cmd building stuff + ResetButtonStates(); + + SendItemUse = nullptr; + SendItemDrop = nullptr; + mousex = mousey = 0; + sendpause = sendsave = sendturn180 = SendLand = false; + LocalViewAngle = 0; + LocalViewPitch = 0; + paused = 0; + + if (demoplayback || oldgs == GS_STARTUP || oldgs == GS_TITLELEVEL) + C_HideConsole(); + + C_FlushDisplay(); + P_ResetSightCounters(true); + +} + +void FLevelLocals::DoLoadLevel(const FString &nextmapname, int position, bool autosave, bool newGame) +{ + MapName = nextmapname; + static int lastposition = 0; int i; if (NextSkill >= 0) @@ -967,32 +1003,24 @@ void G_DoLoadLevel (const FString &nextmapname, int position, bool autosave, boo else lastposition = position; - level.Init(); + Init(); StatusBar->DetachAllMessages (); // Force 'teamplay' to 'true' if need be. - if (level.flags2 & LEVEL2_FORCETEAMPLAYON) + if (flags2 & LEVEL2_FORCETEAMPLAYON) teamplay = true; // Force 'teamplay' to 'false' if need be. - if (level.flags2 & LEVEL2_FORCETEAMPLAYOFF) + if (flags2 & LEVEL2_FORCETEAMPLAYOFF) teamplay = false; - FString mapname = level.MapName; + FString mapname = nextmapname; mapname.ToLower(); Printf ( "\n\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36" "\36\36\36\36\36\36\36\36\36\36\36\36\37\n\n" TEXTCOLOR_BOLD "%s - %s\n\n", - mapname.GetChars(), level.LevelName.GetChars()); - - if (wipegamestate == GS_LEVEL) - wipegamestate = GS_FORCEWIPE; - - if (gamestate != GS_TITLELEVEL) - { - gamestate = GS_LEVEL; - } + mapname.GetChars(), LevelName.GetChars()); // Set the sky map. // First thing, we have a dummy sky texture name, @@ -1002,7 +1030,7 @@ void G_DoLoadLevel (const FString &nextmapname, int position, bool autosave, boo skyflatnum = TexMan.GetTextureID (gameinfo.SkyFlatName, ETextureType::Flat, FTextureManager::TEXMAN_Overridable); // [RH] Set up details about sky rendering - InitSkyMap (&level); + InitSkyMap (this); for (i = 0; i < MAXPLAYERS; i++) { @@ -1015,40 +1043,28 @@ void G_DoLoadLevel (const FString &nextmapname, int position, bool autosave, boo if (changeflags & CHANGELEVEL_NOMONSTERS) { - level.flags2 |= LEVEL2_NOMONSTERS; + flags2 |= LEVEL2_NOMONSTERS; } else { - level.flags2 &= ~LEVEL2_NOMONSTERS; + flags2 &= ~LEVEL2_NOMONSTERS; } if (changeflags & CHANGELEVEL_PRERAISEWEAPON) { - level.flags2 |= LEVEL2_PRERAISEWEAPON; + flags2 |= LEVEL2_PRERAISEWEAPON; } - level.maptime = 0; + maptime = 0; if (newGame) { E_NewGame(EventHandlerType::Global); } - P_SetupLevel (&level, position, newGame); + P_SetupLevel (this, position, newGame); - gameaction = ga_nothing; - - // clear cmd building stuff - ResetButtonStates (); - - SendItemUse = NULL; - SendItemDrop = NULL; - mousex = mousey = 0; - sendpause = sendsave = sendturn180 = SendLand = false; - LocalViewAngle = 0; - LocalViewPitch = 0; - paused = 0; //Added by MC: Initialize bots. if (deathmatch) @@ -1067,12 +1083,12 @@ void G_DoLoadLevel (const FString &nextmapname, int position, bool autosave, boo } } - level.starttime = gametic; + starttime = gametic; - level.UnSnapshotLevel (!savegamerestore); // [RH] Restore the state of the level. - int pnumerr = level.FinishTravel (); + UnSnapshotLevel (!savegamerestore); // [RH] Restore the state of the + int pnumerr = FinishTravel (); - if (!level.FromSnapshot) + if (!FromSnapshot) { for (int i = 0; iAttachToPlayer (&players[consoleplayer]); @@ -1118,23 +1134,18 @@ void G_DoLoadLevel (const FString &nextmapname, int position, bool autosave, boo E_WorldLoadedUnsafe(); // regular world load (savegames are handled internally) E_WorldLoaded(); - level.DoDeferedScripts (); // [RH] Do script actions that were triggered on another map. + DoDeferedScripts (); // [RH] Do script actions that were triggered on another map. - if (demoplayback || oldgs == GS_STARTUP || oldgs == GS_TITLELEVEL) - C_HideConsole (); - C_FlushDisplay (); - - // [RH] Always save the game when entering a new level. + // [RH] Always save the game when entering a new if (autosave && !savegamerestore && disableautosave < 1) { - level.CreateThinker(); + CreateThinker(); } if (pnumerr > 0) { I_Error("no start for player %d found.", pnumerr); } - P_ResetSightCounters(true); } diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 30d915ccd..6e15f2a65 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -225,6 +225,7 @@ public: bool DoCompleted(FString nextlevel, wbstartstruct_t &wminfo); void StartTravel(); int FinishTravel(); + void DoLoadLevel(const FString &nextmapname, int position, bool autosave, bool newGame); private: From 68fe5534a46e60b3b8d7039374991fa063b6a59f Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 10 Jan 2019 02:00:58 +0100 Subject: [PATCH 094/164] - moved the SectorMarker handling into the level itself. --- src/dobjgc.cpp | 106 ++--------------------------------------- src/g_level.cpp | 112 ++++++++++++++++++++++++++++++++++++++++++++ src/g_levellocals.h | 2 + 3 files changed, 117 insertions(+), 103 deletions(-) diff --git a/src/dobjgc.cpp b/src/dobjgc.cpp index f86cdb1d3..94d6a946c 100644 --- a/src/dobjgc.cpp +++ b/src/dobjgc.cpp @@ -96,9 +96,6 @@ #define DEFAULT_GCMUL 400 // GC runs 'quadruple the speed' of memory allocation // Number of sectors to mark for each step. -#define SECTORSTEPSIZE 32 -#define POLYSTEPSIZE 120 -#define SIDEDEFSTEPSIZE 240 #define GCSTEPSIZE 1024u #define GCSWEEPMAX 40 @@ -107,22 +104,6 @@ // TYPES ------------------------------------------------------------------- -// This object is responsible for marking sectors during the propagate -// stage. In case there are many, many sectors, it lets us break them -// up instead of marking them all at once. -class DSectorMarker : public DObject -{ - DECLARE_CLASS(DSectorMarker, DObject) -public: - DSectorMarker() : SecNum(0),PolyNum(0),SideNum(0) {} - size_t PropagateMark(); - int SecNum; - int PolyNum; - int SideNum; -}; - -IMPLEMENT_CLASS(DSectorMarker, false, false) - // EXTERNAL FUNCTION PROTOTYPES -------------------------------------------- // PUBLIC FUNCTION PROTOTYPES ---------------------------------------------- @@ -154,8 +135,6 @@ bool FinalGC; // PRIVATE DATA DEFINITIONS ------------------------------------------------ -static DSectorMarker *SectorMarker; - // CODE -------------------------------------------------------------------- //========================================================================== @@ -316,19 +295,11 @@ static void MarkRoot() players[i].PropagateMark(); } // Mark sectors. - if (SectorMarker == nullptr && level.sectors.Size() > 0) + + for auto Level : AllLevels()) { - SectorMarker = Create(); + Level->Mark(); } - else if (level.sectors.Size() == 0) - { - SectorMarker = nullptr; - } - else - { - SectorMarker->SecNum = 0; - } - Mark(SectorMarker); // Mark bot stuff. Mark(bglobal.firstthing); Mark(bglobal.body1); @@ -615,77 +586,6 @@ void DelSoftRoot(DObject *obj) } -//========================================================================== -// -// DSectorMarker :: PropagateMark -// -// Propagates marks across a few sectors and reinserts itself into the -// gray list if it didn't do them all. -// -//========================================================================== - -size_t DSectorMarker::PropagateMark() -{ - int i; - int marked = 0; - bool moretodo = false; - int numsectors = level.sectors.Size(); - - for (i = 0; i < SECTORSTEPSIZE && SecNum + i < numsectors; ++i) - { - sector_t *sec = &level.sectors[SecNum + i]; - GC::Mark(sec->SoundTarget); - GC::Mark(sec->SecActTarget); - GC::Mark(sec->floordata); - GC::Mark(sec->ceilingdata); - GC::Mark(sec->lightingdata); - for(int j=0;j<4;j++) GC::Mark(sec->interpolations[j]); - } - marked += i * sizeof(sector_t); - if (SecNum + i < numsectors) - { - SecNum += i; - moretodo = true; - } - - if (!moretodo && level.Polyobjects.Size() > 0) - { - for (i = 0; i < POLYSTEPSIZE && PolyNum + i < (int)level.Polyobjects.Size(); ++i) - { - GC::Mark(level.Polyobjects[PolyNum + i].interpolation); - } - marked += i * sizeof(FPolyObj); - if (PolyNum + i < (int)level.Polyobjects.Size()) - { - PolyNum += i; - moretodo = true; - } - } - if (!moretodo && level.sides.Size() > 0) - { - for (i = 0; i < SIDEDEFSTEPSIZE && SideNum + i < (int)level.sides.Size(); ++i) - { - side_t *side = &level.sides[SideNum + i]; - for (int j = 0; j < 3; j++) GC::Mark(side->textures[j].interpolation); - } - marked += i * sizeof(side_t); - if (SideNum + i < (int)level.sides.Size()) - { - SideNum += i; - moretodo = true; - } - } - // If there are more sectors to mark, put ourself back into the gray - // list. - if (moretodo) - { - Black2Gray(); - GCNext = GC::Gray; - GC::Gray = this; - } - return marked; -} - //========================================================================== // // STAT gc diff --git a/src/g_level.cpp b/src/g_level.cpp index 6825d78ed..24fa264a5 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1974,6 +1974,104 @@ void P_ReadACSDefereds (FSerializer &arc) } +//========================================================================== +// +// This object is responsible for marking sectors during the propagate +// stage. In case there are many, many sectors, it lets us break them +// up instead of marking them all at once. +// +//========================================================================== + +class DSectorMarker : public DObject +{ + enum + { + SECTORSTEPSIZE = 32, + POLYSTEPSIZE = 120, + SIDEDEFSTEPSIZE = 240 + }; + DECLARE_CLASS(DSectorMarker, DObject) +public: + DSectorMarker(FLevelLocals *l) : Level(l), SecNum(0),PolyNum(0),SideNum(0) {} + size_t PropagateMark(); + FLevelLocals *Level; + int SecNum; + int PolyNum; + int SideNum; +}; + +IMPLEMENT_CLASS(DSectorMarker, true, false) + +//========================================================================== +// +// DSectorMarker :: PropagateMark +// +// Propagates marks across a few sectors and reinserts itself into the +// gray list if it didn't do them all. +// +//========================================================================== + +size_t DSectorMarker::PropagateMark() +{ + int i; + int marked = 0; + bool moretodo = false; + int numsectors = Level->sectors.Size(); + + for (i = 0; i < SECTORSTEPSIZE && SecNum + i < numsectors; ++i) + { + sector_t *sec = &Level->sectors[SecNum + i]; + GC::Mark(sec->SoundTarget); + GC::Mark(sec->SecActTarget); + GC::Mark(sec->floordata); + GC::Mark(sec->ceilingdata); + GC::Mark(sec->lightingdata); + for(int j = 0; j < 4; j++) GC::Mark(sec->interpolations[j]); + } + marked += i * sizeof(sector_t); + if (SecNum + i < numsectors) + { + SecNum += i; + moretodo = true; + } + + if (!moretodo && Level->Polyobjects.Size() > 0) + { + for (i = 0; i < POLYSTEPSIZE && PolyNum + i < (int)Level->Polyobjects.Size(); ++i) + { + GC::Mark(Level->Polyobjects[PolyNum + i].interpolation); + } + marked += i * sizeof(FPolyObj); + if (PolyNum + i < (int)Level->Polyobjects.Size()) + { + PolyNum += i; + moretodo = true; + } + } + if (!moretodo && Level->sides.Size() > 0) + { + for (i = 0; i < SIDEDEFSTEPSIZE && SideNum + i < (int)Level->sides.Size(); ++i) + { + side_t *side = &Level->sides[SideNum + i]; + for (int j = 0; j < 3; j++) GC::Mark(side->textures[j].interpolation); + } + marked += i * sizeof(side_t); + if (SideNum + i < (int)Level->sides.Size()) + { + SideNum += i; + moretodo = true; + } + } + // If there are more items to mark, put ourself back into the gray list. + if (moretodo) + { + Black2Gray(); + GCNext = GC::Gray; + GC::Gray = this; + } + return marked; +} + //========================================================================== // // @@ -1995,6 +2093,20 @@ void FLevelLocals::Tick () void FLevelLocals::Mark() { + if (SectorMarker == nullptr && (sectors.Size() > 0 || Polyobjects.Size() > 0 || sides.Size() > 0)) + { + SectorMarker = Create(this); + } + else if (sectors.Size() == 0 && Polyobjects.Size() == 0 && sides.Size() == 0) + { + SectorMarker = nullptr; + } + else + { + SectorMarker->SecNum = 0; + } + + GC::Mark(SectorMarker); GC::Mark(SpotState); GC::Mark(FraggleScriptThinker); GC::Mark(ACSThinker); diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 6e15f2a65..17c834788 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -452,6 +452,8 @@ public: int i_compatflags = 0; int i_compatflags2 = 0; + DSectorMarker *SectorMarker; + uint8_t 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 From 4ad327d7e09b89888fe5587c9002ae9743a8f1af Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 29 Jan 2019 23:45:14 +0100 Subject: [PATCH 095/164] - moved G_ChangeLevel and other exit functions into FLevelLocals. --- src/d_main.cpp | 2 +- src/d_net.cpp | 4 +-- src/dobjgc.cpp | 2 +- src/fragglescript/t_cmd.cpp | 6 ++-- src/fragglescript/t_func.cpp | 4 +-- src/g_level.cpp | 61 ++++++++++++++++++------------------ src/g_level.h | 7 ----- src/g_levellocals.h | 5 +++ src/p_acs.cpp | 2 +- src/p_enemy.cpp | 2 +- src/p_interaction.cpp | 2 +- src/p_lnspec.cpp | 12 +++---- src/p_spec.cpp | 4 +-- 13 files changed, 56 insertions(+), 57 deletions(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index cefd446b9..55db3cc71 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -170,7 +170,7 @@ CUSTOM_CVAR (Int, fraglimit, 0, CVAR_SERVERINFO) if (playeringame[i] && self <= D_GetFragCount(&players[i])) { Printf ("%s\n", GStrings("TXT_FRAGLIMIT")); - G_ExitLevel (0, false); + level.ExitLevel (0, false); break; } } diff --git a/src/d_net.cpp b/src/d_net.cpp index abd703d13..33a6a3f3c 100644 --- a/src/d_net.cpp +++ b/src/d_net.cpp @@ -2222,7 +2222,7 @@ void Net_DoCommand (int type, uint8_t **stream, int player) // Using LEVEL_NOINTERMISSION tends to throw the game out of sync. // That was a long time ago. Maybe it works now? level.flags |= LEVEL_CHANGEMAPCHEAT; - G_ChangeLevel(s, pos, 0); + level.ChangeLevel(s, pos, 0); break; case DEM_SUICIDE: @@ -2659,7 +2659,7 @@ void Net_DoCommand (int type, uint8_t **stream, int player) case DEM_FINISHGAME: // Simulate an end-of-game action - G_ChangeLevel(NULL, 0, 0); + level.ChangeLevel(NULL, 0, 0); break; case DEM_NETEVENT: diff --git a/src/dobjgc.cpp b/src/dobjgc.cpp index 94d6a946c..2b8aefd58 100644 --- a/src/dobjgc.cpp +++ b/src/dobjgc.cpp @@ -296,7 +296,7 @@ static void MarkRoot() } // Mark sectors. - for auto Level : AllLevels()) + for (auto Level : AllLevels()) { Level->Mark(); } diff --git a/src/fragglescript/t_cmd.cpp b/src/fragglescript/t_cmd.cpp index f3673c277..593b72e03 100644 --- a/src/fragglescript/t_cmd.cpp +++ b/src/fragglescript/t_cmd.cpp @@ -77,7 +77,7 @@ static void FS_Gimme(const char * what) // //========================================================================== -void FS_MapCmd(FScanner &sc) +void FS_MapCmd(FLevelLocals *Level, FScanner &sc) { char nextmap[9]; int NextSkill = -1; @@ -108,7 +108,7 @@ void FS_MapCmd(FScanner &sc) flags &= ~(CHANGELEVEL_RESETINVENTORY|CHANGELEVEL_RESETHEALTH); } } - G_ChangeLevel(nextmap, 0, flags, NextSkill); + Level->ChangeLevel(nextmap, 0, flags, NextSkill); } //========================================================================== @@ -168,7 +168,7 @@ void FS_EmulateCmd(FLevelLocals *Level, char * string) } else if (sc.Compare("map")) { - FS_MapCmd(sc); + FS_MapCmd(Level, sc); } else if (sc.Compare("gr_fogdensity")) { diff --git a/src/fragglescript/t_func.cpp b/src/fragglescript/t_func.cpp index e6f2a583e..1dccf3f35 100644 --- a/src/fragglescript/t_func.cpp +++ b/src/fragglescript/t_func.cpp @@ -608,7 +608,7 @@ void FParser::SF_Clock(void) void FParser::SF_ExitLevel(void) { - G_ExitLevel(0, false); + Level->ExitLevel(0, false); } //========================================================================== @@ -2825,7 +2825,7 @@ void FParser::SF_AmbientSound(void) void FParser::SF_ExitSecret(void) { - G_SecretExitLevel(0); + Level->SecretExitLevel(0); } diff --git a/src/g_level.cpp b/src/g_level.cpp index 24fa264a5..94a985066 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -569,16 +569,19 @@ static bool unloading; EXTERN_CVAR(Bool, sv_singleplayerrespawn) -void G_ChangeLevel(const char *levelname, int position, int flags, int nextSkill) +void FLevelLocals::ChangeLevel(const char *levelname, int position, int flags, int nextSkill) { - level_info_t *nextinfo = NULL; + if (this != currentUILevel) return; // only the primary level may exit. + + FString nextlevel; + level_info_t *nextinfo = nullptr; if (unloading) { Printf (TEXTCOLOR_RED "Unloading scripts cannot exit the level again.\n"); return; } - if (gameaction == ga_completed && !(level.i_compatflags2 & COMPATF2_MULTIEXIT)) // do not exit multiple times. + if (gameaction == ga_completed && !(i_compatflags2 & COMPATF2_MULTIEXIT)) // do not exit multiple times. { return; } @@ -587,9 +590,9 @@ void G_ChangeLevel(const char *levelname, int position, int flags, int nextSkill { // end the game levelname = NULL; - if (!level.NextMap.Compare("enDSeQ",6)) + if (!NextMap.Compare("enDSeQ",6)) { - nextlevel = level.NextMap; // If there is already an end sequence please leave it alone! + nextlevel = NextMap; // If there is already an end sequence please leave it alone! } else { @@ -625,15 +628,14 @@ void G_ChangeLevel(const char *levelname, int position, int flags, int nextSkill if (flags & CHANGELEVEL_NOINTERMISSION) { - level.flags |= LEVEL_NOINTERMISSION; + flags |= LEVEL_NOINTERMISSION; } - cluster_info_t *thiscluster = FindClusterInfo (level.cluster); + cluster_info_t *thiscluster = FindClusterInfo (cluster); cluster_info_t *nextcluster = nextinfo? FindClusterInfo (nextinfo->cluster) : NULL; startpos = position; - gameaction = ga_completed; - level.SetMusicVolume(1.0); + SetMusicVolume(1.0); if (nextinfo != NULL) { @@ -655,18 +657,18 @@ void G_ChangeLevel(const char *levelname, int position, int flags, int nextSkill // [RH] Give scripts a chance to do something unloading = true; - level.Behaviors.StartTypedScripts (SCRIPT_Unloading, NULL, false, 0, true); + Behaviors.StartTypedScripts (SCRIPT_Unloading, NULL, false, 0, true); // [ZZ] safe world unload E_WorldUnloaded(); // [ZZ] unsafe world unload (changemap != map) E_WorldUnloadedUnsafe(); unloading = false; - STAT_ChangeLevel(nextlevel, &level); + STAT_ChangeLevel(nextlevel, this); if (thiscluster && (thiscluster->flags & CLUSTER_HUB)) { - if ((level.flags & LEVEL_NOINTERMISSION) || ((nextcluster == thiscluster) && !(thiscluster->flags & CLUSTER_ALLOWINTERMISSION))) + if ((flags & LEVEL_NOINTERMISSION) || ((nextcluster == thiscluster) && !(thiscluster->flags & CLUSTER_ALLOWINTERMISSION))) NoWipe = 35; D_DrawIcon = "TELEICON"; } @@ -682,7 +684,7 @@ void G_ChangeLevel(const char *levelname, int position, int flags, int nextSkill // If this is co-op, respawn any dead players now so they can // keep their inventory on the next map. - if ((multiplayer || level.flags2 & LEVEL2_ALLOWRESPAWN || sv_singleplayerrespawn || !!G_SkillProperty(SKILLP_PlayerRespawn)) + if ((multiplayer || flags2 & LEVEL2_ALLOWRESPAWN || sv_singleplayerrespawn || !!G_SkillProperty(SKILLP_PlayerRespawn)) && !deathmatch && player->playerstate == PST_DEAD) { // Copied from the end of P_DeathThink [[ @@ -693,10 +695,13 @@ void G_ChangeLevel(const char *levelname, int position, int flags, int nextSkill player->mo->special1 = 0; } // ]] - level.DoReborn(i, false); + DoReborn(i, false); } } } + // Set global transition state. + gameaction = ga_completed; + ::nextlevel = nextlevel; } //========================================================================== @@ -704,20 +709,15 @@ void G_ChangeLevel(const char *levelname, int position, int flags, int nextSkill // //========================================================================== -const char *G_GetExitMap() +const char *FLevelLocals::GetSecretExitMap() { - return level.NextMap; -} + const char *nextmap = NextMap; -const char *G_GetSecretExitMap() -{ - const char *nextmap = level.NextMap; - - if (level.NextSecretMap.Len() > 0) + if (NextSecretMap.Len() > 0) { - if (P_CheckMapData(level.NextSecretMap)) + if (P_CheckMapData(NextSecretMap)) { - nextmap = level.NextSecretMap; + nextmap = NextSecretMap; } } return nextmap; @@ -728,16 +728,17 @@ const char *G_GetSecretExitMap() // //========================================================================== -void G_ExitLevel (int position, bool keepFacing) + +void FLevelLocals::ExitLevel (int position, bool keepFacing) { - level.flags3 |= LEVEL3_EXITNORMALUSED; - G_ChangeLevel(G_GetExitMap(), position, keepFacing ? CHANGELEVEL_KEEPFACING : 0); + flags3 |= LEVEL3_EXITNORMALUSED; + ChangeLevel(NextMap, position, keepFacing ? CHANGELEVEL_KEEPFACING : 0); } -void G_SecretExitLevel (int position) +void FLevelLocals::SecretExitLevel (int position) { - level.flags3 |= LEVEL3_EXITSECRETUSED; - G_ChangeLevel(G_GetSecretExitMap(), position, 0); + flags3 |= LEVEL3_EXITSECRETUSED; + ChangeLevel(GetSecretExitMap(), position, 0); } //========================================================================== diff --git a/src/g_level.h b/src/g_level.h index bdba32b7b..8b83ed043 100644 --- a/src/g_level.h +++ b/src/g_level.h @@ -454,11 +454,6 @@ void G_DeferedInitNew (const char *mapname, int skill = -1); struct FGameStartup; void G_DeferedInitNew (FGameStartup *gs); -void G_ExitLevel (int position, bool keepFacing); -void G_SecretExitLevel (int position); -const char *G_GetExitMap(); -const char *G_GetSecretExitMap(); - enum { CHANGELEVEL_KEEPFACING = 1, @@ -470,8 +465,6 @@ enum CHANGELEVEL_PRERAISEWEAPON = 64, }; -void G_ChangeLevel(const char *levelname, int position, int flags, int nextSkill=-1); - void G_DoLoadLevel (const FString &MapName, int position, bool autosave, bool newGame); cluster_info_t *FindClusterInfo (int cluster); diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 17c834788..a8d1486dc 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -92,6 +92,7 @@ class DSeqNode; struct FStrifeDialogueNode; class DAutomapBase; struct wbstartstruct_t; +class DSectorMarker; typedef TMap FDialogueIDMap; // maps dialogue IDs to dialogue array index (for ACS) typedef TMap FDialogueMap; // maps actor class names to dialogue array index @@ -225,6 +226,10 @@ public: bool DoCompleted(FString nextlevel, wbstartstruct_t &wminfo); void StartTravel(); int FinishTravel(); + void ChangeLevel(const char *levelname, int position, int flags, int nextSkill = -1); + const char *GetSecretExitMap(); + void ExitLevel(int position, bool keepFacing); + void SecretExitLevel(int position); void DoLoadLevel(const FString &nextmapname, int position, bool autosave, bool newGame); diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 18846570a..a51343c7f 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -9896,7 +9896,7 @@ scriptwait: case PCD_CHANGELEVEL: { - G_ChangeLevel(Level->Behaviors.LookupString(STACK(4)), STACK(3), STACK(2), STACK(1)); + Level->ChangeLevel(Level->Behaviors.LookupString(STACK(4)), STACK(3), STACK(2), STACK(1)); sp -= 4; } break; diff --git a/src/p_enemy.cpp b/src/p_enemy.cpp index 162e9a76c..f97628510 100644 --- a/src/p_enemy.cpp +++ b/src/p_enemy.cpp @@ -3175,7 +3175,7 @@ void A_BossDeath(AActor *self) if ((deathmatch || alwaysapplydmflags) && (dmflags & DF_NO_EXIT)) return; - G_ExitLevel (0, false); + Level->ExitLevel (0, false); } //---------------------------------------------------------------------------- diff --git a/src/p_interaction.cpp b/src/p_interaction.cpp index dfaeebea8..448892cf3 100644 --- a/src/p_interaction.cpp +++ b/src/p_interaction.cpp @@ -543,7 +543,7 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOf fraglimit <= D_GetFragCount (source->player)) { Printf ("%s\n", GStrings("TXT_FRAGLIMIT")); - G_ExitLevel (0, false); + Level->ExitLevel (0, false); } } } diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index 04d7d9337..fbb2dc873 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -1060,9 +1060,9 @@ FUNC(LS_Generic_Lift) FUNC(LS_Exit_Normal) // Exit_Normal (position) { - if (Level->CheckIfExitIsGood (it, FindLevelInfo(G_GetExitMap()))) + if (Level->CheckIfExitIsGood (it, FindLevelInfo(Level->NextMap))) { - G_ExitLevel (arg0, false); + Level->ExitLevel (arg0, false); return true; } return false; @@ -1071,9 +1071,9 @@ FUNC(LS_Exit_Normal) FUNC(LS_Exit_Secret) // Exit_Secret (position) { - if (Level->CheckIfExitIsGood (it, FindLevelInfo(G_GetSecretExitMap()))) + if (Level->CheckIfExitIsGood (it, FindLevelInfo(Level->GetSecretExitMap()))) { - G_SecretExitLevel (arg0); + Level->SecretExitLevel (arg0); return true; } return false; @@ -1088,7 +1088,7 @@ FUNC(LS_Teleport_NewMap) if (info && Level->CheckIfExitIsGood (it, info)) { - G_ChangeLevel(info->MapName, arg1, arg2 ? CHANGELEVEL_KEEPFACING : 0); + Level->ChangeLevel(info->MapName, arg1, arg2 ? CHANGELEVEL_KEEPFACING : 0); return true; } } @@ -1183,7 +1183,7 @@ FUNC(LS_Teleport_EndGame) { if (!backSide && Level->CheckIfExitIsGood (it, NULL)) { - G_ChangeLevel(NULL, 0, 0); + Level->ChangeLevel(NULL, 0, 0); return true; } return false; diff --git a/src/p_spec.cpp b/src/p_spec.cpp index effc55eed..7271e9401 100644 --- a/src/p_spec.cpp +++ b/src/p_spec.cpp @@ -463,7 +463,7 @@ void P_PlayerInSpecialSector (player_t *player, sector_t * sector) if (!(player->cheats & (CF_GODMODE|CF_GODMODE2))) P_DamageMobj(player->mo, NULL, NULL, sector->damageamount, sector->damagetype); if ((sector->Flags & SECF_ENDLEVEL) && player->health <= 10 && (!deathmatch || !(dmflags & DF_NO_EXIT))) { - G_ExitLevel(0, false); + Level->ExitLevel(0, false); } if (sector->Flags & SECF_DMGTERRAINFX) { @@ -678,7 +678,7 @@ void P_UpdateSpecials (FLevelLocals *Level) if (Level->maptime >= (int)(timelimit * TICRATE * 60)) { Printf ("%s\n", GStrings("TXT_TIMELIMIT")); - G_ExitLevel(0, false); + Level->ExitLevel(0, false); } } } From 78b7b64237134e38592abc1158fe1be7b9ba735e Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 30 Jan 2019 00:27:05 +0100 Subject: [PATCH 096/164] - replaced all TThinkerIterators except one that probably won't be relevant anymore as things progress. --- src/actor.h | 2 -- src/c_cmds.cpp | 3 ++- src/d_net.cpp | 8 ++++---- src/g_levellocals.h | 3 +++ src/g_shared/a_decals.cpp | 20 ++++++++------------ src/g_shared/a_dynlight.cpp | 15 +++++++++------ src/gl/renderer/gl_renderer.cpp | 1 - src/p_acs.cpp | 3 ++- src/p_acs.h | 1 + src/p_effect.cpp | 2 +- 10 files changed, 30 insertions(+), 28 deletions(-) diff --git a/src/actor.h b/src/actor.h index d6657a83e..2436cdaaa 100644 --- a/src/actor.h +++ b/src/actor.h @@ -1422,8 +1422,6 @@ public: int ApplyDamageFactor(FName damagetype, int damage) const; int GetModifiedDamage(FName damagetype, int damage, bool passive); void DeleteAttachedLights(); - static void DeleteAllAttachedLights(); - static void RecreateAllAttachedLights(); bool isFrozen(); bool hasmodel; diff --git a/src/c_cmds.cpp b/src/c_cmds.cpp index 43f84a0d7..fac4ff6a3 100644 --- a/src/c_cmds.cpp +++ b/src/c_cmds.cpp @@ -945,7 +945,8 @@ static void PrintFilteredActorList(const ActorTypeChecker IsActorType, const cha } } } - TThinkerIterator it; + // This only works on the primary level. + auto it = currentUILevel->GetThinkerIterator(); while ( (mo = it.Next()) ) { diff --git a/src/d_net.cpp b/src/d_net.cpp index 33a6a3f3c..bd7504098 100644 --- a/src/d_net.cpp +++ b/src/d_net.cpp @@ -2080,12 +2080,12 @@ uint8_t *FDynamicBuffer::GetData (int *len) } -static int RemoveClass(const PClass *cls) +static int RemoveClass(FLevelLocals *Level, const PClass *cls) { AActor *actor; int removecount = 0; bool player = false; - TThinkerIterator iterator(cls); + auto iterator = Level->GetThinkerIterator(cls->TypeName); while ((actor = iterator.Next())) { if (actor->IsA(cls)) @@ -2581,11 +2581,11 @@ void Net_DoCommand (int type, uint8_t **stream, int player) PClassActor *cls = PClass::FindActor(s); if (cls != NULL && cls->IsDescendantOf(RUNTIME_CLASS(AActor))) { - removecount = RemoveClass(cls); + removecount = RemoveClass(&level, cls); const PClass *cls_rep = cls->GetReplacement(); if (cls != cls_rep) { - removecount += RemoveClass(cls_rep); + removecount += RemoveClass(&leve, cls_rep); } Printf("Removed %d actors of type %s.\n", removecount, s); } diff --git a/src/g_levellocals.h b/src/g_levellocals.h index a8d1486dc..d4e236b64 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -232,6 +232,9 @@ public: void SecretExitLevel(int position); void DoLoadLevel(const FString &nextmapname, int position, bool autosave, bool newGame); + void DeleteAllAttachedLights(); + void RecreateAllAttachedLights(); + private: // Work data for CollectConnectedGroups. diff --git a/src/g_shared/a_decals.cpp b/src/g_shared/a_decals.cpp index 5546aef08..a0a27aacd 100644 --- a/src/g_shared/a_decals.cpp +++ b/src/g_shared/a_decals.cpp @@ -54,8 +54,6 @@ struct SpreadInfo TArray SpreadStack; }; -static int ImpactCount; - CVAR (Bool, cl_spreaddecals, true, CVAR_ARCHIVE) IMPLEMENT_CLASS(DBaseDecal, false, true) @@ -652,18 +650,16 @@ DBaseDecal *DImpactDecal::CloneSelf (const FDecalTemplate *tpl, double ix, doubl CCMD (countdecals) { - Printf ("%d impact decals\n", ImpactCount); -} + for (auto Level : AllLevels()) + { + auto iterator = Level->GetThinkerIterator(NAME_None, STAT_AUTODECAL); + int count = 0; -CCMD (countdecalsreal) -{ - TThinkerIterator iterator (STAT_AUTODECAL); - int count = 0; + while (iterator.Next()) + count++; - while (iterator.Next()) - count++; - - Printf ("Counted %d impact decals\n", count); + Printf("%s: Counted %d impact decals\n", Level->MapName.GetChars(), count); + } } CCMD (spray) diff --git a/src/g_shared/a_dynlight.cpp b/src/g_shared/a_dynlight.cpp index a24a82bfe..92720cddc 100644 --- a/src/g_shared/a_dynlight.cpp +++ b/src/g_shared/a_dynlight.cpp @@ -71,8 +71,11 @@ static FRandom randLight; CUSTOM_CVAR (Bool, gl_lights, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) { - if (self) AActor::RecreateAllAttachedLights(); - else AActor::DeleteAllAttachedLights(); + for (auto Level : AllLevels()) + { + if (self) Level->RecreateAllAttachedLights(); + else Level->DeleteAllAttachedLights(); + } } CVAR (Bool, gl_attachedlights, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG); @@ -833,9 +836,9 @@ void AActor::DeleteAttachedLights() // //========================================================================== -void AActor::DeleteAllAttachedLights() +void FLevelLocals::DeleteAllAttachedLights() { - TThinkerIterator it; + auto it = GetThinkerIterator(); AActor * a; while ((a=it.Next())) @@ -850,9 +853,9 @@ void AActor::DeleteAllAttachedLights() // //========================================================================== -void AActor::RecreateAllAttachedLights() +void FLevelLocals::RecreateAllAttachedLights() { - TThinkerIterator it; + auto it = GetThinkerIterator(); AActor * a; while ((a=it.Next())) diff --git a/src/gl/renderer/gl_renderer.cpp b/src/gl/renderer/gl_renderer.cpp index 00a4f3460..38a0ad604 100644 --- a/src/gl/renderer/gl_renderer.cpp +++ b/src/gl/renderer/gl_renderer.cpp @@ -116,7 +116,6 @@ void FGLRenderer::Initialize(int width, int height) FGLRenderer::~FGLRenderer() { FlushModels(); - AActor::DeleteAllAttachedLights(); TexMan.FlushAll(); if (mShaderManager != nullptr) delete mShaderManager; if (mSamplerManager != nullptr) delete mSamplerManager; diff --git a/src/p_acs.cpp b/src/p_acs.cpp index a51343c7f..23d685677 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -2213,6 +2213,7 @@ bool FBehavior::Init(FLevelLocals *Level, int lumpnum, FileReader * fr, int len) uint8_t *object; int i; + this->Level = Level; LumpNum = lumpnum; // Now that everything is set up, record this module as being among the loaded modules. @@ -3270,7 +3271,7 @@ void FBehavior::StartTypedScripts (uint16_t type, AActor *activator, bool always ptr = &Scripts[i]; if (ptr->Type == type) { - DLevelScript *runningScript = P_GetScriptGoing (&level, activator, NULL, ptr->Number, + DLevelScript *runningScript = P_GetScriptGoing (Level, activator, NULL, ptr->Number, ptr, this, &arg1, 1, always ? ACS_ALWAYS : 0); if (nullptr != runningScript && runNow) { diff --git a/src/p_acs.h b/src/p_acs.h index 7eea0c22a..6fae24de9 100644 --- a/src/p_acs.h +++ b/src/p_acs.h @@ -387,6 +387,7 @@ private: ACSFormat Format; + FLevelLocals *Level; int LumpNum; uint8_t *Data; int DataSize; diff --git a/src/p_effect.cpp b/src/p_effect.cpp index a621d1961..20312ced3 100644 --- a/src/p_effect.cpp +++ b/src/p_effect.cpp @@ -329,7 +329,7 @@ void P_RunEffects (FLevelLocals *Level) int pnum = players[consoleplayer].camera->Sector->Index() * Level->sectors.Size(); AActor *actor; - TThinkerIterator iterator; + auto iterator = Level->GetThinkerIterator(); while ( (actor = iterator.Next ()) ) { From f410762695d6673a65db5c52c18a9ae744654602 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 30 Jan 2019 00:29:42 +0100 Subject: [PATCH 097/164] - missed two lines. --- src/d_net.cpp | 2 +- src/p_saveg.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/d_net.cpp b/src/d_net.cpp index bd7504098..c88a0ce12 100644 --- a/src/d_net.cpp +++ b/src/d_net.cpp @@ -2585,7 +2585,7 @@ void Net_DoCommand (int type, uint8_t **stream, int player) const PClass *cls_rep = cls->GetReplacement(); if (cls != cls_rep) { - removecount += RemoveClass(&leve, cls_rep); + removecount += RemoveClass(&level, cls_rep); } Printf("Removed %d actors of type %s.\n", removecount, s); } diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 333992601..a2378b316 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -1024,7 +1024,7 @@ void FLevelLocals::Serialize(FSerializer &arc, bool hubload) FWeaponSlots::SetupWeaponSlots(players[i].mo); } } - AActor::RecreateAllAttachedLights(); + RecreateAllAttachedLights(); InitPortalGroups(this); automap->UpdateShowAllLines(); From ebdb2643c4794669b9ac8899510da7c5d5179af3 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 30 Jan 2019 00:37:29 +0100 Subject: [PATCH 098/164] - moved UDMF custom properties into FLevelLocals. --- src/g_levellocals.h | 4 +++- src/maploader/udmf.cpp | 28 +++++++--------------------- src/p_acs.cpp | 16 ++++++++-------- src/p_setup.cpp | 8 +++++--- src/p_setup.h | 6 +++--- src/scripting/vmthunks.cpp | 12 ++++++------ 6 files changed, 32 insertions(+), 42 deletions(-) diff --git a/src/g_levellocals.h b/src/g_levellocals.h index d4e236b64..79f72c23f 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -96,6 +96,7 @@ class DSectorMarker; typedef TMap FDialogueIDMap; // maps dialogue IDs to dialogue array index (for ACS) typedef TMap FDialogueMap; // maps actor class names to dialogue array index +typedef TMap FUDMFKeyMap; struct FLevelLocals { @@ -435,6 +436,7 @@ public: FBlockmap blockmap; TArray PolyBlockMap; + FUDMFKeyMap UDMFKeys[4]; // These are copies of the loaded map data that get used by the savegame code to skip unaltered fields // Without such a mechanism the savegame format would become too slow and large because more than 80-90% are normally still unaltered. @@ -464,7 +466,7 @@ public: uint8_t 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 maptime; // time in the map int totaltime; // time in the game int starttime; int partime; diff --git a/src/maploader/udmf.cpp b/src/maploader/udmf.cpp index ea23dabb1..4a1688bf7 100644 --- a/src/maploader/udmf.cpp +++ b/src/maploader/udmf.cpp @@ -285,20 +285,6 @@ const char *UDMFParserBase::CheckString(const char *key) // //=========================================================================== -typedef TMap FUDMFKeyMap; - - -static FUDMFKeyMap UDMFKeys[4]; -// Things must be handled differently - -void P_ClearUDMFKeys() -{ - for(int i=0;i<4;i++) - { - UDMFKeys[i].Clear(); - } -} - static int udmfcmp(const void *a, const void *b) { FUDMFKey *A = (FUDMFKey*)a; @@ -346,11 +332,11 @@ FUDMFKey *FUDMFKeys::Find(FName key) // //=========================================================================== -int GetUDMFInt(int type, int index, FName key) +int GetUDMFInt(FLevelLocals *Level, int type, int index, FName key) { assert(type >=0 && type <=3); - FUDMFKeys *pKeys = UDMFKeys[type].CheckKey(index); + FUDMFKeys *pKeys = Level->UDMFKeys[type].CheckKey(index); if (pKeys != NULL) { @@ -363,11 +349,11 @@ int GetUDMFInt(int type, int index, FName key) return 0; } -double GetUDMFFloat(int type, int index, FName key) +double GetUDMFFloat(FLevelLocals *Level, int type, int index, FName key) { assert(type >=0 && type <=3); - FUDMFKeys *pKeys = UDMFKeys[type].CheckKey(index); + FUDMFKeys *pKeys = Level->UDMFKeys[type].CheckKey(index); if (pKeys != NULL) { @@ -380,11 +366,11 @@ double GetUDMFFloat(int type, int index, FName key) return 0; } -FString GetUDMFString(int type, int index, FName key) +FString GetUDMFString(FLevelLocals *Level, int type, int index, FName key) { assert(type >= 0 && type <= 3); - FUDMFKeys *pKeys = UDMFKeys[type].CheckKey(index); + FUDMFKeys *pKeys = Level->UDMFKeys[type].CheckKey(index); if (pKeys != NULL) { @@ -459,7 +445,7 @@ public: } void AddUserKey(FName key, int kind, int index) { - FUDMFKeys &keyarray = UDMFKeys[kind][index]; + FUDMFKeys &keyarray = Level->UDMFKeys[kind][index]; for(unsigned i=0; i < keyarray.Size(); i++) { diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 23d685677..6a45adb38 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -5277,26 +5277,26 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) switch(funcIndex) { case ACSF_GetLineUDMFInt: - return GetUDMFInt(UDMF_Line, LineFromID(args[0]), Level->Behaviors.LookupString(args[1])); + return GetUDMFInt(Level, UDMF_Line, LineFromID(args[0]), Level->Behaviors.LookupString(args[1])); case ACSF_GetLineUDMFFixed: - return DoubleToACS(GetUDMFFloat(UDMF_Line, LineFromID(args[0]), Level->Behaviors.LookupString(args[1]))); + return DoubleToACS(GetUDMFFloat(Level, UDMF_Line, LineFromID(args[0]), Level->Behaviors.LookupString(args[1]))); case ACSF_GetThingUDMFInt: case ACSF_GetThingUDMFFixed: return 0; // Not implemented yet case ACSF_GetSectorUDMFInt: - return GetUDMFInt(UDMF_Sector, Level->FindFirstSectorFromTag(args[0]), Level->Behaviors.LookupString(args[1])); + return GetUDMFInt(Level, UDMF_Sector, Level->FindFirstSectorFromTag(args[0]), Level->Behaviors.LookupString(args[1])); case ACSF_GetSectorUDMFFixed: - return DoubleToACS(GetUDMFFloat(UDMF_Sector, Level->FindFirstSectorFromTag(args[0]), Level->Behaviors.LookupString(args[1]))); + return DoubleToACS(GetUDMFFloat(Level, UDMF_Sector, Level->FindFirstSectorFromTag(args[0]), Level->Behaviors.LookupString(args[1]))); case ACSF_GetSideUDMFInt: - return GetUDMFInt(UDMF_Side, SideFromID(args[0], args[1]), Level->Behaviors.LookupString(args[2])); + return GetUDMFInt(Level, UDMF_Side, SideFromID(args[0], args[1]), Level->Behaviors.LookupString(args[2])); case ACSF_GetSideUDMFFixed: - return DoubleToACS(GetUDMFFloat(UDMF_Side, SideFromID(args[0], args[1]), Level->Behaviors.LookupString(args[2]))); + return DoubleToACS(GetUDMFFloat(Level, UDMF_Side, SideFromID(args[0], args[1]), Level->Behaviors.LookupString(args[2]))); case ACSF_GetActorVelX: actor = Level->SingleActorFromTID(args[0], activator); @@ -10680,8 +10680,8 @@ void ACSProfile(FLevelLocals *Level, FCommandLine &argv) static const char *sort_names[] = { "total", "min", "max", "avg", "runs" }; static const uint8_t sort_match_len[] = { 1, 2, 2, 1, 1 }; - TArray ScriptProfiles, FuncProfiles; - long limit = 10; + TArray ScriptProfiles, FuncProfiles; + long limit = 10; int (*sorter)(const void *, const void *) = sort_by_total_instr; assert(countof(sort_names) == countof(sort_match_len)); diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 602adff56..83724cd21 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -74,8 +74,6 @@ #include "am_map.h" #include "fragglescript/t_script.h" -void P_ClearUDMFKeys(); - extern AActor *SpawnMapThing (int index, FMapThing *mthing, int position); extern unsigned int R_OldBlend; @@ -260,6 +258,11 @@ void FLevelLocals::ClearLevelData() total_monsters = total_items = total_secrets = killed_monsters = found_items = found_secrets = wminfo.maxfrags = 0; + + for (int i = 0; i < 4; i++) + { + UDMFKeys[i].Clear(); + } SN_StopAllSequences(this); @@ -345,7 +348,6 @@ void P_FreeLevelData () // [ZZ] delete per-map event handlers E_Shutdown(true); R_FreePastViewers(); - P_ClearUDMFKeys(); DThinker::DestroyAllThinkers (); diff --git a/src/p_setup.h b/src/p_setup.h index 0ddc25fa3..12bffa6fb 100644 --- a/src/p_setup.h +++ b/src/p_setup.h @@ -153,9 +153,9 @@ struct maplinedef_t; void P_LoadTranslator(const char *lumpname); int P_TranslateSectorSpecial (int); -int GetUDMFInt(int type, int index, FName key); -double GetUDMFFloat(int type, int index, FName key); -FString GetUDMFString(int type, int index, FName key); +int GetUDMFInt(FLevelLocals *Level, int type, int index, FName key); +double GetUDMFFloat(FLevelLocals *Level, int type, int index, FName key); +FString GetUDMFString(FLevelLocals *Level, int type, int index, FName key); void FixMinisegReferences(); void FixHoles(); diff --git a/src/scripting/vmthunks.cpp b/src/scripting/vmthunks.cpp index 74ecf1313..6e3705781 100644 --- a/src/scripting/vmthunks.cpp +++ b/src/scripting/vmthunks.cpp @@ -2554,7 +2554,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, GetAutomapPosition, GetAutomapPositi static int ZGetUDMFInt(FLevelLocals *self, int type, int index, int key) { - return GetUDMFInt(type, index, ENamedName(key)); + return GetUDMFInt(self,type, index, ENamedName(key)); } DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, GetUDMFInt, ZGetUDMFInt) @@ -2563,12 +2563,12 @@ DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, GetUDMFInt, ZGetUDMFInt) PARAM_INT(type); PARAM_INT(index); PARAM_NAME(key); - ACTION_RETURN_INT(GetUDMFInt(type, index, key)); + ACTION_RETURN_INT(GetUDMFInt(self, type, index, key)); } static double ZGetUDMFFloat(FLevelLocals *self, int type, int index, int key) { - return GetUDMFFloat(type, index, ENamedName(key)); + return GetUDMFFloat(self, type, index, ENamedName(key)); } DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, GetUDMFFloat, ZGetUDMFFloat) @@ -2577,12 +2577,12 @@ DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, GetUDMFFloat, ZGetUDMFFloat) PARAM_INT(type); PARAM_INT(index); PARAM_NAME(key); - ACTION_RETURN_FLOAT(GetUDMFFloat(type, index, key)); + ACTION_RETURN_FLOAT(GetUDMFFloat(self, type, index, key)); } static void ZGetUDMFString(FLevelLocals *self, int type, int index, int key, FString *result) { - *result = GetUDMFString(type, index, ENamedName(key)); + *result = GetUDMFString(self, type, index, ENamedName(key)); } DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, GetUDMFString, ZGetUDMFString) @@ -2591,7 +2591,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(FLevelLocals, GetUDMFString, ZGetUDMFString) PARAM_INT(type); PARAM_INT(index); PARAM_NAME(key); - ACTION_RETURN_STRING(GetUDMFString(type, index, key)); + ACTION_RETURN_STRING(GetUDMFString(self, type, index, key)); } DEFINE_ACTION_FUNCTION(FLevelLocals, GetChecksum) From 3c0200de19f5c3d3148128dfd6569c3d4fd0869e Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 30 Jan 2019 00:47:34 +0100 Subject: [PATCH 099/164] - run disconnect scripts on the level the disconnected player is on This is nearly always the primary one but let's keep the option of using bots on secondary levels. --- src/b_game.cpp | 3 +-- src/g_game.cpp | 20 +++++++++++--------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/b_game.cpp b/src/b_game.cpp index beed7f3b3..0f6b69911 100644 --- a/src/b_game.cpp +++ b/src/b_game.cpp @@ -447,8 +447,7 @@ void FCajunMaster::RemoveAllBots (FLevelLocals *Level, bool fromlist) } // [ZZ] run event hook E_PlayerDisconnected(i); - // - level.Behaviors.StartTypedScripts (SCRIPT_Disconnect, players[i].mo, true, i, true); + Level->Behaviors.StartTypedScripts (SCRIPT_Disconnect, players[i].mo, true, i, true); ClearPlayer (i, !fromlist); } } diff --git a/src/g_game.cpp b/src/g_game.cpp index 09732db19..c0ba5398d 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -1691,22 +1691,23 @@ void G_DoPlayerPop(int playernum) } // [RH] Make the player disappear - level.Behaviors.StopMyScripts(players[playernum].mo); + auto mo = players[playernum].mo; + mo->Level->Behaviors.StopMyScripts(mo); // [ZZ] fire player disconnect hook E_PlayerDisconnected(playernum); // [RH] Let the scripts know the player left - level.Behaviors.StartTypedScripts(SCRIPT_Disconnect, players[playernum].mo, true, playernum, true); - if (players[playernum].mo != NULL) + mo->Level->Behaviors.StartTypedScripts(SCRIPT_Disconnect, mo, true, playernum, true); + if (mo != NULL) { - P_DisconnectEffect(players[playernum].mo); - players[playernum].mo->player = NULL; - players[playernum].mo->Destroy(); + P_DisconnectEffect(mo); + mo->player = NULL; + mo->Destroy(); if (!(players[playernum].mo->ObjectFlags & OF_EuthanizeMe)) { // We just destroyed a morphed player, so now the original player // has taken their place. Destroy that one too. players[playernum].mo->Destroy(); } - players[playernum].mo = NULL; + players[playernum].mo = nullptr; players[playernum].camera = nullptr; } @@ -2033,14 +2034,15 @@ void G_DoAutoSave () file = G_BuildSaveName ("auto", nextautosave); - if (!(level.flags2 & LEVEL2_NOAUTOSAVEHINT)) + // The hint flag is only relevant on the primary level. + if (!(currentUILevel->flags2 & LEVEL2_NOAUTOSAVEHINT)) { nextautosave = (nextautosave + 1) % count; } else { // This flag can only be used once per level - level.flags2 &= ~LEVEL2_NOAUTOSAVEHINT; + currentUILevel->flags2 &= ~LEVEL2_NOAUTOSAVEHINT; } readableTime = myasctime (); From b12de0425811a4647e38c3c9e8601325ff3e281c Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 30 Jan 2019 00:58:44 +0100 Subject: [PATCH 100/164] - fixed the remaining deprecation warnings in the base script. All these required access to the sector's Level reference. The remaining references to the global 'level' variable are all in deprecated functions which is ok. --- src/scripting/vmthunks.cpp | 1 + wadsrc/static/zscript/base.txt | 28 ++++++++++---------- wadsrc/static/zscript/mapdata.txt | 13 ++++----- wadsrc/static/zscript/shared/specialspot.txt | 2 +- 4 files changed, 23 insertions(+), 21 deletions(-) diff --git a/src/scripting/vmthunks.cpp b/src/scripting/vmthunks.cpp index 6e3705781..b5fa6a918 100644 --- a/src/scripting/vmthunks.cpp +++ b/src/scripting/vmthunks.cpp @@ -2926,6 +2926,7 @@ DEFINE_FIELD_X(Sector, sector_t, terrainnum) DEFINE_FIELD_X(Sector, sector_t, floordata) DEFINE_FIELD_X(Sector, sector_t, ceilingdata) DEFINE_FIELD_X(Sector, sector_t, lightingdata) +DEFINE_FIELD_X(Sector, sector_t, Level) DEFINE_FIELD_X(Sector, sector_t, interpolations) DEFINE_FIELD_X(Sector, sector_t, soundtraversed) DEFINE_FIELD_X(Sector, sector_t, stairlock) diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index 2860273c8..070f3f033 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -693,7 +693,7 @@ struct LevelLocals native native String GetUDMFString(int type, int index, Name key); native int GetUDMFInt(int type, int index, Name key); native double GetUDMFFloat(int type, int index, Name key); - native int ExecuteSpecial(int special, Actor activator, line linedef, bool lineside, int arg1 = 0, int arg2 = 0, int arg3 = 0, int arg4 = 0, int arg5 = 0); + native play int ExecuteSpecial(int special, Actor activator, line linedef, bool lineside, int arg1 = 0, int arg2 = 0, int arg3 = 0, int arg4 = 0, int arg5 = 0); native void GiveSecret(Actor activator, bool printmsg = true, bool playsound = true); native void StartSlideshow(Name whichone = 'none'); native void WorldDone(); @@ -705,35 +705,35 @@ struct LevelLocals native native bool IsCrouchingAllowed() const; native bool IsFreelookAllowed() const; native void StartIntermission(Name type, int state) const; - native SpotState GetSpotState(bool create = true); + native play SpotState GetSpotState(bool create = true); native int FindUniqueTid(int start = 0, int limit = 0); native uint GetSkyboxPortal(Actor actor); native void ReplaceTextures(String from, String to, int flags); clearscope native HealthGroup FindHealthGroup(int id); native vector3, int PickDeathmatchStart(); native vector3, int PickPlayerStart(int pnum, int flags = 0); - native int isFrozen(); + native int isFrozen() const; native void setFrozen(bool on); - native clearscope Sector PointInSector(Vector2 pt); + native clearscope Sector PointInSector(Vector2 pt) const; - native clearscope bool IsPointInLevel(vector3 p); + native clearscope bool IsPointInLevel(vector3 p) const; deprecated("3.8") clearscope static bool IsPointInMap(vector3 p) { return level.IsPointInLevel(p); } - native clearscope vector2 Vec2Diff(vector2 v1, vector2 v2); - native clearscope vector3 Vec3Diff(vector3 v1, vector3 v2); - native clearscope vector3 SphericalCoords(vector3 viewpoint, vector3 targetPos, vector2 viewAngles = (0, 0), bool absolute = false); + native clearscope vector2 Vec2Diff(vector2 v1, vector2 v2) const; + native clearscope vector3 Vec3Diff(vector3 v1, vector3 v2) const; + native clearscope vector3 SphericalCoords(vector3 viewpoint, vector3 targetPos, vector2 viewAngles = (0, 0), bool absolute = false) const; - native clearscope vector2 Vec2Offset(vector2 pos, vector2 dir, bool absolute = false); - native clearscope vector3 Vec2OffsetZ(vector2 pos, vector2 dir, double atz, bool absolute = false); - native clearscope vector3 Vec3Offset(vector3 pos, vector3 dir, bool absolute = false); + native clearscope vector2 Vec2Offset(vector2 pos, vector2 dir, bool absolute = false) const; + native clearscope vector3 Vec2OffsetZ(vector2 pos, vector2 dir, double atz, bool absolute = false) const; + native clearscope vector3 Vec3Offset(vector3 pos, vector3 dir, bool absolute = false) const; native String GetChecksum() const; - native void ChangeSky( TextureID sky1, TextureID sky2 ); + native void ChangeSky(TextureID sky1, TextureID sky2 ); native SectorTagIterator CreateSectorTagIterator(int tag, line defline = null); native LineIdIterator CreateLineIdIterator(int tag); @@ -745,8 +745,8 @@ struct LevelLocals native return String.Format("%02d:%02d:%02d", sec / 3600, (sec % 3600) / 60, sec % 60); } - native bool CreateCeiling(sector sec, int type, line ln, double speed, double speed2, double height = 0, int crush = -1, int silent = 0, int change = 0, int crushmode = 0 /*Floor.crushDoom*/); - native bool CreateFloor(sector sec, int floortype, line ln, double speed, double height = 0, int crush = -1, int change = 0, bool crushmode = false, bool hereticlower = false); + native play bool CreateCeiling(sector sec, int type, line ln, double speed, double speed2, double height = 0, int crush = -1, int silent = 0, int change = 0, int crushmode = 0 /*Floor.crushDoom*/); + native play bool CreateFloor(sector sec, int floortype, line ln, double speed, double height = 0, int crush = -1, int change = 0, bool crushmode = false, bool hereticlower = false); } diff --git a/wadsrc/static/zscript/mapdata.txt b/wadsrc/static/zscript/mapdata.txt index 4a1154feb..02e78fe7f 100644 --- a/wadsrc/static/zscript/mapdata.txt +++ b/wadsrc/static/zscript/mapdata.txt @@ -97,15 +97,15 @@ struct Side native play int GetUDMFInt(Name nm) { - return Level.GetUDMFInt(LevelLocals.UDMF_Side, Index(), nm); + return sector.Level.GetUDMFInt(LevelLocals.UDMF_Side, Index(), nm); } double GetUDMFFloat(Name nm) { - return Level.GetUDMFFloat(LevelLocals.UDMF_Side, Index(), nm); + return sector.Level.GetUDMFFloat(LevelLocals.UDMF_Side, Index(), nm); } String GetUDMFString(Name nm) { - return Level.GetUDMFString(LevelLocals.UDMF_Side, Index(), nm); + return sector.Level.GetUDMFString(LevelLocals.UDMF_Side, Index(), nm); } }; @@ -180,15 +180,15 @@ struct Line native play int GetUDMFInt(Name nm) { - return Level.GetUDMFInt(LevelLocals.UDMF_Line, Index(), nm); + return frontsector.Level.GetUDMFInt(LevelLocals.UDMF_Line, Index(), nm); } double GetUDMFFloat(Name nm) { - return Level.GetUDMFFloat(LevelLocals.UDMF_Line, Index(), nm); + return frontsector.Level.GetUDMFFloat(LevelLocals.UDMF_Line, Index(), nm); } String GetUDMFString(Name nm) { - return Level.GetUDMFString(LevelLocals.UDMF_Line, Index(), nm); + return frontsector.Level.GetUDMFString(LevelLocals.UDMF_Line, Index(), nm); } native clearscope int GetHealth(); @@ -259,6 +259,7 @@ struct Sector native play native SectorEffect floordata; native SectorEffect ceilingdata; native SectorEffect lightingdata; + native readonly LevelLocals Level; enum EPlane { diff --git a/wadsrc/static/zscript/shared/specialspot.txt b/wadsrc/static/zscript/shared/specialspot.txt index fdf357b2a..fd6192d87 100644 --- a/wadsrc/static/zscript/shared/specialspot.txt +++ b/wadsrc/static/zscript/shared/specialspot.txt @@ -1,4 +1,4 @@ -class SpotState : Object native +class SpotState : Object native play { deprecated ("3.8") static SpotState GetSpotState(bool create = true) { From c15212ca82cc715ff4b6dc1bd92cc8f18760db68 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 30 Jan 2019 01:04:30 +0100 Subject: [PATCH 101/164] -fixed: The HUD model info was taken from the wrong player It used the current console player's camera, not the actual camera being used for rendering. Although this is the same most of the time, let's better do it right. This also removes a few leftover references to the player array elsewhwere in the hardware renderer --- src/hwrenderer/scene/hw_flats.cpp | 2 -- src/hwrenderer/scene/hw_portal.cpp | 1 - src/hwrenderer/scene/hw_sprites.cpp | 4 ---- src/hwrenderer/scene/hw_weapon.cpp | 4 ++-- 4 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/hwrenderer/scene/hw_flats.cpp b/src/hwrenderer/scene/hw_flats.cpp index d4bc79ee2..9d2c13633 100644 --- a/src/hwrenderer/scene/hw_flats.cpp +++ b/src/hwrenderer/scene/hw_flats.cpp @@ -615,8 +615,6 @@ void GLFlat::ProcessSector(HWDrawInfo *di, sector_t * frontsector, int which) stack = false; if ((which & SSRF_RENDER3DPLANES) && x.ffloors.Size()) { - player_t * player = players[consoleplayer].camera->player; - renderflags = SSRF_RENDER3DPLANES; srf |= SSRF_RENDER3DPLANES; // 3d-floors must not overlap! diff --git a/src/hwrenderer/scene/hw_portal.cpp b/src/hwrenderer/scene/hw_portal.cpp index b052c2676..a9b0b2515 100644 --- a/src/hwrenderer/scene/hw_portal.cpp +++ b/src/hwrenderer/scene/hw_portal.cpp @@ -948,7 +948,6 @@ void HWHorizonPortal::DrawContents(HWDrawInfo *di, FRenderState &state) Clocker c(PortalAll); FMaterial * gltexture; - player_t * player = &players[consoleplayer]; GLSectorPlane * sp = &origin->plane; auto &vp = di->Viewpoint; diff --git a/src/hwrenderer/scene/hw_sprites.cpp b/src/hwrenderer/scene/hw_sprites.cpp index eb0874e7b..14c6d60f0 100644 --- a/src/hwrenderer/scene/hw_sprites.cpp +++ b/src/hwrenderer/scene/hw_sprites.cpp @@ -753,7 +753,6 @@ void GLSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t else Angles = thing->Angles; - player_t *player = &players[consoleplayer]; FloatRect r; if (sector->sectornum != thing->Sector->sectornum && !thruportal) @@ -1069,7 +1068,6 @@ void GLSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t const bool drawWithXYBillboard = (!(actor->renderflags & RF_FORCEYBILLBOARD) && (actor->renderflags & RF_SPRITETYPEMASK) == RF_FACESPRITE - && players[consoleplayer].camera && (gl_billboard_mode == 1 || actor->renderflags & RF_FORCEXYBILLBOARD)); @@ -1113,8 +1111,6 @@ void GLSprite::Process(HWDrawInfo *di, AActor* thing, sector_t * sector, area_t void GLSprite::ProcessParticle (HWDrawInfo *di, particle_t *particle, sector_t *sector)//, int shade, int fakeside) { - player_t *player=&players[consoleplayer]; - if (particle->alpha==0) return; lightlevel = hw_ClampLight(sector->GetTexture(sector_t::ceiling) == skyflatnum ? diff --git a/src/hwrenderer/scene/hw_weapon.cpp b/src/hwrenderer/scene/hw_weapon.cpp index 96bd52b63..db45bb2bb 100644 --- a/src/hwrenderer/scene/hw_weapon.cpp +++ b/src/hwrenderer/scene/hw_weapon.cpp @@ -488,8 +488,7 @@ void HWDrawInfo::PreparePlayerSprites(sector_t * viewsector, area_t in_area) bool brightflash = false; AActor * playermo = players[consoleplayer].camera; player_t * player = playermo->player; - const bool hudModelStep = IsHUDModelForPlayerAvailable(player); - + const auto &vp = Viewpoint; AActor *camera = vp.camera; @@ -502,6 +501,7 @@ void HWDrawInfo::PreparePlayerSprites(sector_t * viewsector, area_t in_area) (r_deathcamera && camera->health <= 0)) return; + const bool hudModelStep = IsHUDModelForPlayerAvailable(camera->player); WeaponPosition weap = GetWeaponPosition(camera->player, vp.TicFrac); WeaponLighting light = GetWeaponLighting(viewsector, vp.Pos, isFullbrightScene(), in_area, camera->Pos()); From 8bbdee5c28eebc0785afa71476474ea6242cc3a6 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 30 Jan 2019 01:15:32 +0100 Subject: [PATCH 102/164] - redirect most references to the global players array through FLevelLocals. The Map loader may not access any global state at all - everything it can touch must be exchangable. Furthermore, if we want to sandbox each level, there may be no direct access to any kind of global state whatsoever from the play code. --- src/actorptrselect.cpp | 11 +++-- src/fragglescript/t_cmd.cpp | 8 ++-- src/fragglescript/t_func.cpp | 62 ++++++++++++++-------------- src/fragglescript/t_script.cpp | 2 +- src/g_inventory/a_keys.cpp | 2 +- src/g_level.cpp | 44 ++++++++++---------- src/g_levellocals.h | 47 ++++++++++++++++++++- src/g_shared/a_quake.cpp | 4 +- src/maploader/maploader.cpp | 4 +- src/p_acs.cpp | 75 ++++++++++++++++++---------------- src/p_actionfunctions.cpp | 34 ++++++++------- src/p_conversation.cpp | 2 +- src/p_effect.cpp | 4 -- src/p_enemy.cpp | 33 ++++++++------- src/p_interaction.cpp | 13 +++--- src/p_lnspec.cpp | 43 ++++++++++--------- src/p_mobj.cpp | 27 +++++++----- src/p_saveg.cpp | 12 +++--- src/p_setup.cpp | 21 +++++----- 19 files changed, 259 insertions(+), 189 deletions(-) diff --git a/src/actorptrselect.cpp b/src/actorptrselect.cpp index 8c9057ca7..5cf326480 100644 --- a/src/actorptrselect.cpp +++ b/src/actorptrselect.cpp @@ -35,6 +35,7 @@ #include "actor.h" #include "d_player.h" #include "p_local.h" +#include "g_levellocals.h" //========================================================================== // @@ -61,14 +62,18 @@ Only one selector of each type can be used. */ -#define AAPTR_RESOLVE_PLAYERNUM(playernum) (playeringame[playernum] ? players[playernum].mo : NULL) - AActor *COPY_AAPTR(AActor *origin, int selector) { if (selector == AAPTR_DEFAULT) return origin; FTranslatedLineTarget t; + auto Level = origin->Level; + auto AAPTR_RESOLVE_PLAYERNUM = [=](int playernum) -> AActor* + { + return (Level->PlayerInGame(playernum) ? Level->Players[playernum]->mo : nullptr); + }; + if (origin) { if (origin->player) @@ -97,7 +102,7 @@ AActor *COPY_AAPTR(AActor *origin, int selector) return t.linetarget; } } - + switch (selector & AAPTR_STATIC_SELECTORS) { case AAPTR_PLAYER1: return AAPTR_RESOLVE_PLAYERNUM(0); diff --git a/src/fragglescript/t_cmd.cpp b/src/fragglescript/t_cmd.cpp index 593b72e03..905c47c99 100644 --- a/src/fragglescript/t_cmd.cpp +++ b/src/fragglescript/t_cmd.cpp @@ -154,12 +154,12 @@ void FS_EmulateCmd(FLevelLocals *Level, char * string) { sc.MustGetFloat(); double playerviewheight = sc.Float; - for(int i=0;iPlayers) { // No, this is not correct. But this is the way Legacy WADs expect it to be handled! - if (players[i].mo != NULL) players[i].mo->FloatVar(NAME_ViewHeight) = playerviewheight; - players[i].viewheight = playerviewheight; - players[i].Uncrouch(); + if (p->mo != nullptr) p->mo->FloatVar(NAME_ViewHeight) = playerviewheight; + p->viewheight = playerviewheight; + p->Uncrouch(); } while (sc.GetString()) { diff --git a/src/fragglescript/t_func.cpp b/src/fragglescript/t_func.cpp index 1dccf3f35..4ebd0b1e9 100644 --- a/src/fragglescript/t_func.cpp +++ b/src/fragglescript/t_func.cpp @@ -278,7 +278,7 @@ int FParser::T_GetPlayerNum(const svalue_t &arg) { return -1; } - if(!playeringame[playernum]) // no error, just return -1 + if(!Level->PlayerInGame(playernum)) // no error, just return -1 { return -1; } @@ -288,7 +288,7 @@ int FParser::T_GetPlayerNum(const svalue_t &arg) AActor *FParser::T_GetPlayerActor(const svalue_t &arg) { int num = T_GetPlayerNum(arg); - return num == -1 ? nullptr : players[num].mo; + return num == -1 ? nullptr : Level->Players[num]->mo; } PClassActor *T_ClassType(const svalue_t &arg) @@ -659,7 +659,7 @@ void FParser::SF_PlayerTip(void) if (CheckArgs(1)) { int plnum = T_GetPlayerNum(t_argv[0]); - if (plnum!=-1 && players[plnum].mo->CheckLocalView(consoleplayer)) + if (plnum!=-1 && Level->Players[plnum]->mo->CheckLocalView(consoleplayer)) { C_MidPrint(SmallFont, GetFormatString(1).GetChars()); } @@ -692,7 +692,7 @@ void FParser::SF_PlayerMsg(void) if (CheckArgs(1)) { int plnum = T_GetPlayerNum(t_argv[0]); - if (plnum!=-1 && players[plnum].mo->CheckLocalView(consoleplayer)) + if (plnum!=-1 && Level->Players[plnum]->mo->CheckLocalView(consoleplayer)) { Printf(PRINT_HIGH, "%s\n", GetFormatString(1).GetChars()); } @@ -714,7 +714,7 @@ void FParser::SF_PlayerInGame(void) if (plnum!=-1) { t_return.type = svt_int; - t_return.value.i = playeringame[plnum]; + t_return.value.i = Level->PlayerInGame(plnum); } } } @@ -742,7 +742,7 @@ void FParser::SF_PlayerName(void) if(plnum !=-1) { t_return.type = svt_string; - t_return.string = players[plnum].userinfo.GetName(); + t_return.string = Level->Players[plnum]->userinfo.GetName(); } else { @@ -773,7 +773,7 @@ void FParser::SF_PlayerObj(void) if(plnum !=-1) { t_return.type = svt_mobj; - t_return.value.mobj = players[plnum].mo; + t_return.value.mobj = Level->Players[plnum]->mo; } else { @@ -1402,8 +1402,8 @@ void FParser::SF_SetCamera(void) if (CheckArgs(1)) { - player=Script->trigger->player; - if (!player) player=&players[0]; + player = Script->trigger->player; + if (!player) player = Level->Players[0]; newcamera = actorvalue(t_argv[0]); if(!newcamera) @@ -1435,8 +1435,8 @@ void FParser::SF_SetCamera(void) void FParser::SF_ClearCamera(void) { player_t * player; - player=Script->trigger->player; - if (!player) player=&players[0]; + player = Script->trigger->player; + if (!player) player = Level->Players[0]; AActor * cam=player->camera; if (cam) @@ -2419,13 +2419,13 @@ void FParser::SF_PlayerKeys(void) if(t_argc == 2) { t_return.type = svt_int; - t_return.value.i = CheckInventory(players[playernum].mo, keyname); + t_return.value.i = CheckInventory(Level->Players[playernum]->mo, keyname); return; } else { givetake = intvalue(t_argv[2]); - ScriptUtil::Exec(givetake?NAME_GiveInventory : NAME_TakeInventory, ScriptUtil::Pointer, players[playernum].mo, ScriptUtil::Int, keyname.GetIndex(), ScriptUtil::Int, 1, ScriptUtil::End); + ScriptUtil::Exec(givetake?NAME_GiveInventory : NAME_TakeInventory, ScriptUtil::Pointer, Level->Players[playernum]->mo, ScriptUtil::Int, keyname.GetIndex(), ScriptUtil::Int, 1, ScriptUtil::End); t_return.type = svt_int; t_return.value.i = 0; } @@ -2504,14 +2504,14 @@ void FParser::SF_PlayerWeapon() if (t_argc == 2) { - AActor * wp = players[playernum].mo->FindInventory(ti); + AActor * wp = Level->Players[playernum]->mo->FindInventory(ti); t_return.type = svt_int; t_return.value.i = wp!=NULL; return; } else { - AActor * wp = players[playernum].mo->FindInventory(ti); + AActor * wp = Level->Players[playernum]->mo->FindInventory(ti); newweapon = !!intvalue(t_argv[2]); if (!newweapon) @@ -2520,14 +2520,14 @@ void FParser::SF_PlayerWeapon() { wp->Destroy(); // If the weapon is active pick a replacement. Legacy didn't do this! - if (players[playernum].PendingWeapon==wp) players[playernum].PendingWeapon=WP_NOCHANGE; - if (players[playernum].ReadyWeapon==wp) + if (Level->Players[playernum]->PendingWeapon==wp) Level->Players[playernum]->PendingWeapon=WP_NOCHANGE; + if (Level->Players[playernum]->ReadyWeapon==wp) { - players[playernum].ReadyWeapon=nullptr; + Level->Players[playernum]->ReadyWeapon=nullptr; IFVM(PlayerPawn, PickNewWeapon) { - VMValue param[] = { players[playernum].mo, (void*)nullptr }; + VMValue param[] = { Level->Players[playernum]->mo, (void*)nullptr }; VMCall(func, param, 2, nullptr, 0); } } @@ -2537,9 +2537,9 @@ void FParser::SF_PlayerWeapon() { if (!wp) { - auto pw=players[playernum].PendingWeapon; - players[playernum].mo->GiveInventoryType(ti); - players[playernum].PendingWeapon=pw; + auto pw=Level->Players[playernum]->PendingWeapon; + Level->Players[playernum]->mo->GiveInventoryType(ti); + Level->Players[playernum]->PendingWeapon=pw; } } @@ -2588,13 +2588,13 @@ void FParser::SF_PlayerSelectedWeapon() return; } - players[playernum].PendingWeapon = players[playernum].mo->FindInventory(ti); + Level->Players[playernum]->PendingWeapon = Level->Players[playernum]->mo->FindInventory(ti); } t_return.type = svt_int; for(int i=0;i<9;i++) { - if (players[playernum].ReadyWeapon->GetClass ()->TypeName == FName(WeaponNames[i])) + if (Level->Players[playernum]->ReadyWeapon->GetClass ()->TypeName == FName(WeaponNames[i])) { t_return.value.i=i; break; @@ -2620,7 +2620,7 @@ void FParser::SF_GiveInventory(void) if(t_argc == 2) count=1; else count=intvalue(t_argv[2]); - ScriptUtil::Exec(NAME_GiveInventory, ScriptUtil::Pointer, players[playernum].mo, ScriptUtil::Int, FName(stringvalue(t_argv[1])).GetIndex(), ScriptUtil::Int, count, ScriptUtil::End); + ScriptUtil::Exec(NAME_GiveInventory, ScriptUtil::Pointer, Level->Players[playernum]->mo, ScriptUtil::Int, FName(stringvalue(t_argv[1])).GetIndex(), ScriptUtil::Int, count, ScriptUtil::End); t_return.type = svt_int; t_return.value.i = 0; } @@ -2643,7 +2643,7 @@ void FParser::SF_TakeInventory(void) if(t_argc == 2) count=32767; else count=intvalue(t_argv[2]); - ScriptUtil::Exec(NAME_TakeInventory, ScriptUtil::Pointer, players[playernum].mo, ScriptUtil::Int, FName(stringvalue(t_argv[1])).GetIndex(), ScriptUtil::Int, count, ScriptUtil::End); + ScriptUtil::Exec(NAME_TakeInventory, ScriptUtil::Pointer, Level->Players[playernum]->mo, ScriptUtil::Int, FName(stringvalue(t_argv[1])).GetIndex(), ScriptUtil::Int, count, ScriptUtil::End); t_return.type = svt_int; t_return.value.i = 0; } @@ -2668,7 +2668,7 @@ void FParser::SF_CheckInventory(void) return; } t_return.type = svt_int; - t_return.value.i = CheckInventory(players[playernum].mo, stringvalue(t_argv[1])); + t_return.value.i = CheckInventory(Level->Players[playernum]->mo, stringvalue(t_argv[1])); } } @@ -3221,10 +3221,10 @@ void FParser::SF_PlayerAddFrag() { playernum1 = T_GetPlayerNum(t_argv[0]); - players[playernum1].fragcount++; + Level->Players[playernum1]->fragcount++; t_return.type = svt_int; - t_return.value.f = players[playernum1].fragcount; + t_return.value.f = Level->Players[playernum1]->fragcount; } else @@ -3232,10 +3232,10 @@ void FParser::SF_PlayerAddFrag() playernum1 = T_GetPlayerNum(t_argv[0]); playernum2 = T_GetPlayerNum(t_argv[1]); - players[playernum1].frags[playernum2]++; + Level->Players[playernum1]->frags[playernum2]++; t_return.type = svt_int; - t_return.value.f = players[playernum1].frags[playernum2]; + t_return.value.f = Level->Players[playernum1]->frags[playernum2]; } } } diff --git a/src/fragglescript/t_script.cpp b/src/fragglescript/t_script.cpp index 2eb6df9d6..fd2cbcefc 100644 --- a/src/fragglescript/t_script.cpp +++ b/src/fragglescript/t_script.cpp @@ -616,7 +616,7 @@ void T_PreprocessScripts(FLevelLocals *Level) // get the other scripts // levelscript started by player 0 'superplayer' - th->LevelScript->trigger = players[0].mo; + th->LevelScript->trigger = Level->Players[0]->mo; th->LevelScript->Preprocess(Level); th->LevelScript->ParseScript(nullptr, th); diff --git a/src/g_inventory/a_keys.cpp b/src/g_inventory/a_keys.cpp index 817340579..ad0e85404 100644 --- a/src/g_inventory/a_keys.cpp +++ b/src/g_inventory/a_keys.cpp @@ -494,7 +494,7 @@ int P_CheckKeys (AActor *owner, int keynum, bool remote, bool quiet) // If we get here, that means the actor isn't holding an appropriate key. - if (owner == players[consoleplayer].camera) + if (owner->CheckLocalView(consoleplayer)) { PrintMessage(failtext); diff --git a/src/g_level.cpp b/src/g_level.cpp index 94a985066..60f38ea5e 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -835,12 +835,12 @@ bool FLevelLocals::DoCompleted (FString nextlevel, wbstartstruct_t &wminfo) for (i=0 ; ikillcount; + wminfo.plyr[i].sitems = Players[i]->itemcount; + wminfo.plyr[i].ssecret = Players[i]->secretcount; wminfo.plyr[i].stime = time; - memcpy (wminfo.plyr[i].frags, players[i].frags, sizeof(wminfo.plyr[i].frags)); - wminfo.plyr[i].fragcount = players[i].fragcount; + memcpy (wminfo.plyr[i].frags, Players[i]->frags, sizeof(wminfo.plyr[i].frags)); + wminfo.plyr[i].fragcount = Players[i]->fragcount; } // [RH] If we're in a hub and staying within that hub, take a snapshot. @@ -1035,11 +1035,11 @@ void FLevelLocals::DoLoadLevel(const FString &nextmapname, int position, bool au for (i = 0; i < MAXPLAYERS; i++) { - if (playeringame[i] && (deathmatch || players[i].playerstate == PST_DEAD)) - players[i].playerstate = PST_ENTER; // [BC] - memset (players[i].frags,0,sizeof(players[i].frags)); + if (PlayerInGame(i) && (deathmatch || Players[i]->playerstate == PST_DEAD)) + Players[i]->playerstate = PST_ENTER; // [BC] + memset (Players[i]->frags,0,sizeof(Players[i]->frags)); if (!(dmflags2 & DF2_YES_KEEPFRAGS) && (alwaysapplydmflags || deathmatch)) - players[i].fragcount = 0; + Players[i]->fragcount = 0; } if (changeflags & CHANGELEVEL_NOMONSTERS) @@ -1093,19 +1093,19 @@ void FLevelLocals::DoLoadLevel(const FString &nextmapname, int position, bool au { for (int i = 0; imo != nullptr) + P_PlayerStartStomp(Players[i]->mo); } } // For each player, if they are viewing through a player, make sure it is themselves. for (int ii = 0; ii < MAXPLAYERS; ++ii) { - if (playeringame[ii]) + if (PlayerInGame(ii)) { - if (players[ii].camera == NULL || players[ii].camera->player != NULL) + if (Players[ii]->camera == nullptr || Players[ii]->camera->player != nullptr) { - players[ii].camera = players[ii].mo; + Players[ii]->camera = Players[ii]->mo; } if (savegamerestore) @@ -1119,7 +1119,7 @@ void FLevelLocals::DoLoadLevel(const FString &nextmapname, int position, bool au if (fromSnapshot) { // ENTER scripts are being handled when the player gets spawned, this cannot be changed due to its effect on voodoo dolls. - Behaviors.StartTypedScripts(SCRIPT_Return, players[ii].mo, true); + Behaviors.StartTypedScripts(SCRIPT_Return, Players[ii]->mo, true); } } } @@ -1181,8 +1181,8 @@ void FLevelLocals::WorldDone (void) // Strife needs a special case here to choose between good and sad ending. Bad is handled elsewhere. if (endsequence == NAME_Inter_Strife) { - if (players[0].mo->FindInventory (NAME_QuestItem25) || - players[0].mo->FindInventory (NAME_QuestItem28)) + if (Players[0]->mo->FindInventory (NAME_QuestItem25) || + Players[0]->mo->FindInventory (NAME_QuestItem28)) { endsequence = NAME_Inter_Strife_Good; } @@ -1317,12 +1317,12 @@ void FLevelLocals::StartTravel () { if (playeringame[i]) { - AActor *pawn = players[i].mo; + AActor *pawn = Players[i]->mo; AActor *inv; - players[i].camera = nullptr; + Players[i]->camera = nullptr; // Only living players travel. Dead ones get a new body on the new level. - if (players[i].health > 0) + if (Players[i]->health > 0) { pawn->UnlinkFromWorld (nullptr); int tid = pawn->tid; // Save TID @@ -1721,14 +1721,14 @@ void FLevelLocals::UnSnapshotLevel (bool hubLoad) while ((pawn = next) != 0) { next = it.Next(); - if (pawn->player == NULL || pawn->player->mo == NULL || !playeringame[pawn->player - players]) + if (pawn->player == nullptr || pawn->player->mo == nullptr || !PlayerInGame(pawn->player)) { int i; // If this isn't the unmorphed original copy of a player, destroy it, because it's extra. for (i = 0; i < MAXPLAYERS; ++i) { - if (playeringame[i] && players[i].morphTics && players[i].mo->alternative == pawn) + if (PlayerInGame(i) && Players[i]->morphTics && Players[i]->mo->alternative == pawn) { break; } diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 79f72c23f..471d7b655 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -48,6 +48,7 @@ #include "p_spec.h" #include "actor.h" #include "p_effect.h" +#include "d_player.h" #include "p_destructible.h" #include "r_data/r_sections.h" #include "r_data/r_canvastexture.h" @@ -102,7 +103,15 @@ struct FLevelLocals { void *level; void *Level; // bug catchers. - FLevelLocals() : Behaviors(this), tagManager(this) {} + FLevelLocals() : Behaviors(this), tagManager(this) + { + // Make sure that these point to the right data all the time. + // This will be needed for as long as it takes to completely separate global UI state from per-level play state. + for (int i = 0; i < MAXPLAYERS; i++) + { + Players[i] = &players[i]; + } + } friend class MapLoader; @@ -493,6 +502,42 @@ public: TObjPtr bodyque[BODYQUESIZE]; TObjPtr automap = nullptr; int bodyqueslot; + + // For now this merely points to the global player array, but with this in place, access to this array can be moved over to the level. + // As things progress each level needs to be able to point to different players, + // but even then the level will not own the player - the player merely links to the level. + // This should also be made a real object eventually. + player_t *Players[MAXPLAYERS]; + + // This is to allow refactoring without refactoring the data right away. + bool PlayerInGame(int pnum) + { + return playeringame[pnum]; + } + + // This needs to be done better, but for now it should be good enough. + bool PlayerInGame(player_t *player) + { + for (int i = 0; i < MAXPLAYERS; i++) + { + if (player == Players[i]) return PlayerInGame(i); + } + return false; + } + + int PlayerNum(player_t *player) + { + for (int i = 0; i < MAXPLAYERS; i++) + { + if (player == Players[i]) return i; + } + return -1; + } + + bool isPrimaryLevel() const + { + return true; + } int NumMapSections; diff --git a/src/g_shared/a_quake.cpp b/src/g_shared/a_quake.cpp index a00307f7e..4eff8a437 100644 --- a/src/g_shared/a_quake.cpp +++ b/src/g_shared/a_quake.cpp @@ -122,9 +122,9 @@ void DEarthquake::Tick () { for (i = 0; i < MAXPLAYERS; i++) { - if (playeringame[i] && !(players[i].cheats & CF_NOCLIP)) + if (Level->PlayerInGame(i) && !(Level->Players[i]->cheats & CF_NOCLIP)) { - AActor *victim = players[i].mo; + AActor *victim = Level->Players[i]->mo; double dist; dist = m_Spot->Distance2D(victim, true); diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index a22491009..ca141bb01 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -3247,8 +3247,8 @@ void MapLoader::LoadLevel(MapData *map, const char *lumpname, int position) for (int i = 0; i < MAXPLAYERS; ++i) { - if (playeringame[i] && players[i].mo != nullptr) - players[i].health = players[i].mo->health; + if (Level->PlayerInGame(i) && Level->Players[i]->mo != nullptr) + Level->Players[i]->health = Level->Players[i]->mo->health; } if (!map->HasBehavior && !map->isText) TranslateTeleportThings(); // [RH] Assign teleport destination TIDs diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 6a45adb38..8b54e9798 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -1725,7 +1725,7 @@ static bool DoUseInv (AActor *actor, PClassActor *info) // //============================================================================ -static int UseInventory (AActor *activator, const char *type) +static int UseInventory (FLevelLocals *Level, AActor *activator, const char *type) { PClassActor *info; int ret = 0; @@ -1743,8 +1743,8 @@ static int UseInventory (AActor *activator, const char *type) { for (int i = 0; i < MAXPLAYERS; ++i) { - if (playeringame[i]) - ret += DoUseInv (players[i].mo, info); + if (Level->PlayerInGame(i)) + ret += DoUseInv (Level->Players[i]->mo, info); } } else @@ -1759,6 +1759,7 @@ static int UseInventory (AActor *activator, const char *type) // CheckInventory // // Returns how much of a particular item an actor has. +// This also gets called from FraggleScript. // //============================================================================ @@ -3672,7 +3673,7 @@ int DLevelScript::CountPlayers () int count = 0, i; for (i = 0; i < MAXPLAYERS; i++) - if (playeringame[i]) + if (Level->PlayerInGame(i)) count++; return count; @@ -3850,9 +3851,9 @@ void DLevelScript::DoFadeRange (int r1, int g1, int b1, int a1, { for (i = 0; i < MAXPLAYERS; ++i) { - if (playeringame[i]) + if (Level->PlayerInGame(i)) { - viewer = &players[i]; + viewer = Level->Players[i]; showme: if (ftime <= 0.f) { @@ -3965,7 +3966,7 @@ int DoGetMasterTID (AActor *self) if (self->master) return self->master->tid; else if (self->FriendPlayer) { - player_t *player = &players[(self->FriendPlayer)-1]; + player_t *player = self->Level->Players[(self->FriendPlayer)-1]; return player->mo->tid; } else return 0; @@ -4504,13 +4505,13 @@ int DLevelScript::GetPlayerInput(int playernum, int inputnum) } p = activator->player; } - else if (playernum >= MAXPLAYERS || !playeringame[playernum]) + else if (playernum >= MAXPLAYERS || !Level->PlayerInGame(playernum)) { return 0; } else { - p = &players[playernum]; + p = Level->Players[playernum]; } if (p == NULL) { @@ -4961,11 +4962,11 @@ static int DoGetCVar(FBaseCVar *cvar, bool is_string) int DLevelScript::SetUserCVar(int playernum, const char *cvarname, int value, bool is_string) { - if ((unsigned)playernum >= MAXPLAYERS || !playeringame[playernum]) + if ((unsigned)playernum >= MAXPLAYERS || !Level->PlayerInGame(playernum)) { return 0; } - FBaseCVar **cvar_p = players[playernum].userinfo.CheckKey(FName(cvarname, true)); + FBaseCVar **cvar_p = Level->Players[playernum]->userinfo.CheckKey(FName(cvarname, true)); FBaseCVar *cvar; // Only mod-created cvars may be set. if (cvar_p == NULL || (cvar = *cvar_p) == NULL || (cvar->GetFlags() & CVAR_IGNORE) || !(cvar->GetFlags() & CVAR_MOD)) @@ -4975,7 +4976,7 @@ int DLevelScript::SetUserCVar(int playernum, const char *cvarname, int value, bo DoSetCVar(cvar, value, is_string); // If we are this player, then also reflect this change in the local version of this cvar. - if (playernum == consoleplayer) + if (playernum == consoleplayer && Level->isPrimaryLevel()) { FBaseCVar *cvar = FindCVar(cvarname, NULL); // If we can find it in the userinfo, then we should also be able to find it in the normal cvar list, @@ -5004,7 +5005,9 @@ int DLevelScript::SetCVar(AActor *activator, const char *cvarname, int value, bo { return 0; } - return SetUserCVar(int(activator->player - players), cvarname, value, is_string); + auto pnum = Level->PlayerNum(activator->player); + if (pnum < 0) return 0; + return SetUserCVar(pnum, cvarname, value, is_string); } DoSetCVar(cvar, value, is_string); return 1; @@ -5388,25 +5391,25 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) case ACSF_GetAirSupply: { - if (args[0] < 0 || args[0] >= MAXPLAYERS || !playeringame[args[0]]) + if (args[0] < 0 || args[0] >= MAXPLAYERS || !Level->PlayerInGame(args[0])) { return 0; } else { - return players[args[0]].air_finished - Level->time; + return Level->Players[args[0]]->air_finished - Level->time; } } case ACSF_SetAirSupply: { - if (args[0] < 0 || args[0] >= MAXPLAYERS || !playeringame[args[0]]) + if (args[0] < 0 || args[0] >= MAXPLAYERS || !Level->PlayerInGame(args[0])) { return 0; } else { - players[args[0]].air_finished = args[1] + Level->time; + Level->Players[args[0]]->air_finished = args[1] + Level->time; return 1; } } @@ -5420,14 +5423,14 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) case ACSF_GetArmorType: { - if (args[1] < 0 || args[1] >= MAXPLAYERS || !playeringame[args[1]]) + if (args[1] < 0 || args[1] >= MAXPLAYERS || !Level->PlayerInGame(args[1])) { return 0; } else { FName p(Level->Behaviors.LookupString(args[0])); - auto armor = players[args[1]].mo->FindInventory(NAME_BasicArmor); + auto armor = Level->Players[args[1]]->mo->FindInventory(NAME_BasicArmor); if (armor && armor->NameVar(NAME_ArmorType) == p) return armor->IntVar(NAME_Amount); } return 0; @@ -8454,9 +8457,9 @@ scriptwait: player = activator->player; } } - else if (playeringame[STACK(1)-1]) + else if (Level->PlayerInGame(STACK(1)-1)) { - player = &players[STACK(1)-1]; + player = Level->Players[STACK(1)-1]; } else { @@ -8610,6 +8613,7 @@ scriptwait: { optstart = sp; } + if (Level->isPrimaryLevel()) { AActor *screen = activator; if (screen != NULL && @@ -9198,7 +9202,7 @@ scriptwait: break; case PCD_USEINVENTORY: - STACK(1) = UseInventory (activator, Level->Behaviors.LookupString (STACK(1))); + STACK(1) = UseInventory (Level, activator, Level->Behaviors.LookupString (STACK(1))); break; case PCD_USEACTORINVENTORY: @@ -9207,7 +9211,7 @@ scriptwait: const char *type = Level->Behaviors.LookupString(STACK(1)); if (STACK(2) == 0) { - ret = UseInventory(NULL, type); + ret = UseInventory(Level, NULL, type); } else { @@ -9215,7 +9219,7 @@ scriptwait: AActor *actor; for (actor = it.Next(); actor != NULL; actor = it.Next()) { - ret += UseInventory(actor, type); + ret += UseInventory(Level, actor, type); } } STACK(2) = ret; @@ -9655,18 +9659,18 @@ scriptwait: } else { - STACK(1) = playeringame[STACK(1)]; + STACK(1) = Level->PlayerInGame(STACK(1)); } break; case PCD_PLAYERISBOT: - if (STACK(1) < 0 || STACK(1) >= MAXPLAYERS || !playeringame[STACK(1)]) + if (STACK(1) < 0 || STACK(1) >= MAXPLAYERS || !Level->PlayerInGame(STACK(1))) { STACK(1) = false; } else { - STACK(1) = (players[STACK(1)].Bot != NULL); + STACK(1) = (Level->Players[STACK(1)]->Bot != nullptr); } break; @@ -9858,24 +9862,24 @@ scriptwait: break; case PCD_PLAYERCLASS: // [GRB] - if (STACK(1) < 0 || STACK(1) >= MAXPLAYERS || !playeringame[STACK(1)]) + if (STACK(1) < 0 || STACK(1) >= MAXPLAYERS || !Level->PlayerInGame(STACK(1))) { STACK(1) = -1; } else { - STACK(1) = players[STACK(1)].CurrentPlayerClass; + STACK(1) = Level->Players[STACK(1)]->CurrentPlayerClass; } break; case PCD_GETPLAYERINFO: // [GRB] - if (STACK(2) < 0 || STACK(2) >= MAXPLAYERS || !playeringame[STACK(2)]) + if (STACK(2) < 0 || STACK(2) >= MAXPLAYERS || !Level->PlayerInGame(STACK(2))) { STACK(2) = -1; } else { - player_t *pl = &players[STACK(2)]; + player_t *pl = Level->Players[STACK(2)]; userinfo_t *userinfo = &pl->userinfo; switch (STACK(1)) { @@ -9973,13 +9977,14 @@ scriptwait: { int playernum = STACK(1); - if (playernum < 0 || playernum >= MAXPLAYERS || !playeringame[playernum] || players[playernum].camera == NULL || players[playernum].camera->player != NULL) + if (playernum < 0 || playernum >= MAXPLAYERS || !Level->PlayerInGame(playernum) || + Level->Players[playernum]->camera == nullptr || Level->Players[playernum]->camera->player != nullptr) { STACK(1) = -1; } else { - STACK(1) = players[playernum].camera->tid; + STACK(1) = Level->Players[playernum]->camera->tid; } } break; @@ -10301,8 +10306,8 @@ void FLevelLocals::DoDeferedScripts () if (scriptdata) { P_GetScriptGoing (this, (unsigned)def->playernum < MAXPLAYERS && - playeringame[def->playernum] ? players[def->playernum].mo : NULL, - NULL, def->script, + PlayerInGame(def->playernum) ? Players[def->playernum]->mo : nullptr, + nullptr, def->script, scriptdata, module, def->args, 3, def->type == acsdefered_t::defexealways ? ACS_ALWAYS : 0); diff --git a/src/p_actionfunctions.cpp b/src/p_actionfunctions.cpp index 913a42bc5..398343633 100644 --- a/src/p_actionfunctions.cpp +++ b/src/p_actionfunctions.cpp @@ -1684,18 +1684,20 @@ DEFINE_ACTION_FUNCTION(AActor, CheckIfSeen) { PARAM_SELF_PROLOGUE(AActor); + auto Level = self->Level; for (int i = 0; i < MAXPLAYERS; i++) { - if (playeringame[i]) + if (Level->PlayerInGame(i)) { + auto p = Level->Players[i]; // Always check sight from each player. - if (P_CheckSight(players[i].mo, self, SF_IGNOREVISIBILITY)) + if (P_CheckSight(p->mo, self, SF_IGNOREVISIBILITY)) { ACTION_RETURN_BOOL(false); } // If a player is viewing from a non-player, then check that too. - if (players[i].camera != NULL && players[i].camera->player == NULL && - P_CheckSight(players[i].camera, self, SF_IGNOREVISIBILITY)) + if (p->camera != nullptr && p->camera->player == NULL && + P_CheckSight(p->camera, self, SF_IGNOREVISIBILITY)) { ACTION_RETURN_BOOL(false); } @@ -1755,18 +1757,20 @@ DEFINE_ACTION_FUNCTION(AActor, CheckSightOrRange) PARAM_BOOL(twodi); range *= range; - for (int i = 0; i < MAXPLAYERS; ++i) + auto Level = self->Level; + for (int i = 0; i < MAXPLAYERS; i++) { - if (playeringame[i]) + if (Level->PlayerInGame(i)) { + auto p = Level->Players[i]; // Always check from each player. - if (DoCheckSightOrRange(self, players[i].mo, range, twodi, true)) + if (DoCheckSightOrRange(self, p->mo, range, twodi, true)) { ACTION_RETURN_BOOL(false); } // If a player is viewing from a non-player, check that too. - if (players[i].camera != NULL && players[i].camera->player == NULL && - DoCheckSightOrRange(self, players[i].camera, range, twodi, true)) + if (p->camera != nullptr && p->camera->player == nullptr && + DoCheckSightOrRange(self, p->camera, range, twodi, true)) { ACTION_RETURN_BOOL(false); } @@ -1783,18 +1787,20 @@ DEFINE_ACTION_FUNCTION(AActor, CheckRange) PARAM_BOOL(twodi); range *= range; - for (int i = 0; i < MAXPLAYERS; ++i) + auto Level = self->Level; + for (int i = 0; i < MAXPLAYERS; i++) { - if (playeringame[i]) + if (Level->PlayerInGame(i)) { + auto p = Level->Players[i]; // Always check from each player. - if (DoCheckSightOrRange(self, players[i].mo, range, twodi, false)) + if (DoCheckSightOrRange(self, p->mo, range, twodi, false)) { ACTION_RETURN_BOOL(false); } // If a player is viewing from a non-player, check that too. - if (players[i].camera != NULL && players[i].camera->player == NULL && - DoCheckSightOrRange(self, players[i].camera, range, twodi, false)) + if (p->camera != nullptr && p->camera->player == nullptr && + DoCheckSightOrRange(self, p->camera, range, twodi, false)) { ACTION_RETURN_BOOL(false); } diff --git a/src/p_conversation.cpp b/src/p_conversation.cpp index 5265b1010..e2185104a 100644 --- a/src/p_conversation.cpp +++ b/src/p_conversation.cpp @@ -738,7 +738,7 @@ void P_StartConversation (AActor *npc, AActor *pc, bool facetalker, bool saveang int i; // Make sure this is actually a player. - if (pc == nullptr || pc->player == nullptr || npc == nullptr) return; + if (pc == nullptr || pc->player == nullptr || npc == nullptr || pc->Level != currentUILevel) return; auto Level = pc->Level; // [CW] If an NPC is talking to a PC already, then don't let diff --git a/src/p_effect.cpp b/src/p_effect.cpp index 20312ced3..ce93fcdea 100644 --- a/src/p_effect.cpp +++ b/src/p_effect.cpp @@ -324,10 +324,6 @@ void P_SpawnParticle(FLevelLocals *Level, const DVector3 &pos, const DVector3 &v // void P_RunEffects (FLevelLocals *Level) { - if (players[consoleplayer].camera == NULL) return; - - int pnum = players[consoleplayer].camera->Sector->Index() * Level->sectors.Size(); - AActor *actor; auto iterator = Level->GetThinkerIterator(); diff --git a/src/p_enemy.cpp b/src/p_enemy.cpp index f97628510..6997cd738 100644 --- a/src/p_enemy.cpp +++ b/src/p_enemy.cpp @@ -1005,12 +1005,12 @@ void P_RandomChaseDir (AActor *actor) { i = 0; } - else for (i = pr_newchasedir() & (MAXPLAYERS-1); !playeringame[i]; i = (i+1) & (MAXPLAYERS-1)) + else for (i = pr_newchasedir() & (MAXPLAYERS-1); !actor->Level->PlayerInGame(i); i = (i+1) & (MAXPLAYERS-1)) { } - player = players[i].mo; + player = actor->Level->Players[i]->mo; } - if (player != NULL && playeringame[i]) + if (player != NULL && actor->Level->PlayerInGame(i)) { if (pr_newchasedir() & 1 || !P_CheckSight (actor, player)) { @@ -1203,7 +1203,7 @@ int P_LookForMonsters (AActor *actor) AActor *mo; auto iterator = actor->Level->GetThinkerIterator(); - if (!P_CheckSight (players[0].mo, actor, SF_SEEPASTBLOCKEVERYTHING)) + if (!P_CheckSight (actor->Level->Players[0]->mo, actor, SF_SEEPASTBLOCKEVERYTHING)) { // Player can't see monster return false; } @@ -1592,11 +1592,13 @@ int P_LookForPlayers (AActor *actor, INTBOOL allaround, FLookExParams *params) // Go back to a player, no matter whether it's visible or not for (int anyone=0; anyone<=1; anyone++) { + auto Level = actor->Level; for (int c=0; cIsFriend(players[c].mo) && - (anyone || P_IsVisible(actor, players[c].mo, allaround))) + auto p = Level->Players[i]; + if (Level->PlayerInGame(c) && p->playerstate==PST_LIVE && + actor->IsFriend(p->mo) && + (anyone || P_IsVisible(actor, p->mo, allaround))) { actor->target = players[c].mo; @@ -1623,8 +1625,9 @@ int P_LookForPlayers (AActor *actor, INTBOOL allaround, FLookExParams *params) } // [SP] if false, and in deathmatch, intentional fall-through if (!(gameinfo.gametype & (GAME_DoomStrifeChex)) && + actor->Level->isPrimaryLevel() && !multiplayer && - players[0].health <= 0 && + actor->Level->Players[0]->health <= 0 && actor->goal == NULL && gamestate != GS_TITLELEVEL ) @@ -1648,7 +1651,7 @@ int P_LookForPlayers (AActor *actor, INTBOOL allaround, FLookExParams *params) if (c++ < MAXPLAYERS) { pnum = (pnum + 1) & (MAXPLAYERS - 1); - if (!playeringame[pnum]) + if (!actor->Level->PlayerInGame(pnum)) continue; if (actor->TIDtoHate == 0) @@ -1686,12 +1689,12 @@ int P_LookForPlayers (AActor *actor, INTBOOL allaround, FLookExParams *params) return actor->target == actor->goal && actor->goal != NULL; } - player = &players[pnum]; + player = actor->Level->Players[pnum]; if (!(player->mo->flags & MF_SHOOTABLE)) continue; // not shootable (observer or dead) - if (!((actor->flags ^ player->mo->flags) & MF_FRIENDLY)) + if (actor->IsFriend(player->mo)) continue; // same +MF_FRIENDLY, ignore if (player->cheats & CF_NOTARGET) @@ -2284,7 +2287,7 @@ void A_DoChase (AActor *actor, bool fastchase, FState *meleestate, FState *missi if (actor->FriendPlayer != 0) { - player = &players[actor->FriendPlayer - 1]; + player = actor->Level->Players[actor->FriendPlayer - 1]; } else { @@ -2293,10 +2296,10 @@ void A_DoChase (AActor *actor, bool fastchase, FState *meleestate, FState *missi { i = 0; } - else for (i = pr_newchasedir() & (MAXPLAYERS-1); !playeringame[i]; i = (i+1) & (MAXPLAYERS-1)) + else for (i = pr_newchasedir() & (MAXPLAYERS-1); !actor->Level->PlayerInGame(i); i = (i+1) & (MAXPLAYERS-1)) { } - player = &players[i]; + player = actor->Level->Players[i]; } if (player->attacker && player->attacker->health > 0 && player->attacker->flags & MF_SHOOTABLE && pr_newchasedir() < 80) { @@ -3037,7 +3040,7 @@ int CheckBossDeath (AActor *actor) // make sure there is a player alive for victory for (i = 0; i < MAXPLAYERS; i++) - if (playeringame[i] && players[i].health > 0) + if (actor->Level->PlayerInGame(i) && actor->Level->Players[i]->health > 0) break; if (i == MAXPLAYERS) diff --git a/src/p_interaction.cpp b/src/p_interaction.cpp index 448892cf3..d1f23094f 100644 --- a/src/p_interaction.cpp +++ b/src/p_interaction.cpp @@ -547,11 +547,11 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOf } } } - else if (!multiplayer && CountsAsKill()) + else if (!multiplayer && CountsAsKill() && Level->isPrimaryLevel()) { // count all monster deaths, // even those caused by other monsters - players[0].killcount++; + Level->Players[0]->killcount++; } if (player) @@ -577,11 +577,12 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOf //Added by MC: Discard enemies. for (int i = 0; i < MAXPLAYERS; i++) { - if (players[i].Bot != NULL && this == players[i].Bot->enemy) + DBot *Bot = Level->Players[i]->Bot; + if (Bot != nullptr && this == Bot->enemy) { - if (players[i].Bot->dest == players[i].Bot->enemy) - players[i].Bot->dest = nullptr; - players[i].Bot->enemy = nullptr; + if (Bot->dest == Bot->enemy) + Bot->dest = nullptr; + Bot->enemy = nullptr; } } diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index fbb2dc873..2b180955f 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -2835,24 +2835,25 @@ FUNC(LS_ChangeCamera) for (i = 0; i < MAXPLAYERS; i++) { - if (!playeringame[i]) + if (!Level->PlayerInGame(i)) continue; - AActor *oldcamera = players[i].camera; + auto p = Level->Players[i]; + AActor *oldcamera = p->camera; if (camera) { - players[i].camera = camera; + p->camera = camera; if (arg2) - players[i].cheats |= CF_REVERTPLEASE; + p->cheats |= CF_REVERTPLEASE; } else { - players[i].camera = players[i].mo; - players[i].cheats &= ~CF_REVERTPLEASE; + p->camera = p->mo; + p->cheats &= ~CF_REVERTPLEASE; } - if (oldcamera != players[i].camera) + if (oldcamera != p->camera) { - R_ClearPastViewer (players[i].camera); + R_ClearPastViewer (p->camera); } } } @@ -2977,14 +2978,15 @@ FUNC(LS_SetPlayerProperty) for (i = 0; i < MAXPLAYERS; i++) { - if (!playeringame[i] || players[i].mo == NULL) + auto p = Level->Players[i]; + if (!Level->PlayerInGame(i) || p->mo == nullptr) continue; if (arg1) { // Give power if (power != 4) { - auto item = players[i].mo->GiveInventoryType ((PClass::FindActor(powers[power]))); + auto item = p->mo->GiveInventoryType ((PClass::FindActor(powers[power]))); if (item != NULL && power == 0 && arg1 == 1) { item->ColorVar(NAME_BlendColor) = MakeSpecialColormap(INVERSECOLORMAP); @@ -2999,7 +3001,7 @@ FUNC(LS_SetPlayerProperty) { // Take power if (power != 4) { - auto item = players[i].mo->FindInventory (PClass::FindActor(powers[power])); + auto item = p->mo->FindInventory (PClass::FindActor(powers[power])); if (item != NULL) { item->Destroy (); @@ -3072,25 +3074,26 @@ FUNC(LS_SetPlayerProperty) for (i = 0; i < MAXPLAYERS; i++) { - if (!playeringame[i]) + if (!Level->PlayerInGame(i)) continue; + auto p = Level->Players[i]; if (arg1) { - players[i].cheats |= mask; + p->cheats |= mask; if (arg2 == PROP_FLY) { - players[i].mo->flags2 |= MF2_FLY; - players[i].mo->flags |= MF_NOGRAVITY; + p->mo->flags2 |= MF2_FLY; + p->mo->flags |= MF_NOGRAVITY; } } else { - players[i].cheats &= ~mask; + p->cheats &= ~mask; if (arg2 == PROP_FLY) { - players[i].mo->flags2 &= ~MF2_FLY; - players[i].mo->flags &= ~MF_NOGRAVITY; + p->mo->flags2 &= ~MF2_FLY; + p->mo->flags &= ~MF_NOGRAVITY; } } } @@ -3310,9 +3313,9 @@ FUNC(LS_GlassBreak) { for (int i = 0; i < MAXPLAYERS; ++i) { - if (playeringame[i]) + if (Level->PlayerInGame(i)) { - it = players[i].mo; + it = Level->Players[i]->mo; break; } } diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 57216d5e3..6b1144660 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -945,16 +945,17 @@ DEFINE_ACTION_FUNCTION(AActor, GiveBody) bool AActor::CheckLocalView (int playernum) const { - if (players[playernum].camera == this) + auto p = &players[playernum]; + if (p->camera == this) { return true; } - if (players[playernum].mo != this || players[playernum].camera == NULL) + if (p->mo != this || p->camera == nullptr) { return false; } - if (players[playernum].camera->player == NULL && - !(players[playernum].camera->flags3 & MF3_ISMONSTER)) + if (p->camera->player == NULL && + !(p->camera->flags3 & MF3_ISMONSTER)) { return true; } @@ -985,6 +986,10 @@ bool AActor::IsInsideVisibleAngles() const if (players[consoleplayer].camera == nullptr) return true; + // Not detectable. + if (!Level->isPrimaryLevel()) + return true; + DAngle anglestart = VisibleStartAngle; DAngle angleend = VisibleEndAngle; DAngle pitchstart = VisibleStartPitch; @@ -3264,7 +3269,7 @@ bool AActor::IsOkayToAttack (AActor *link) AActor * Friend; if (flags5 & MF5_SUMMONEDMONSTER) Friend = tracer; else if (flags2 & MF2_SEEKERMISSILE) Friend = target; - else if ((flags & MF_FRIENDLY) && FriendPlayer) Friend = players[FriendPlayer-1].mo; + else if ((flags & MF_FRIENDLY) && FriendPlayer) Friend = Level->Players[FriendPlayer-1]->mo; else Friend = this; // Friend checks @@ -5052,9 +5057,9 @@ AActor *FLevelLocals::SpawnPlayer (FPlayerStart *mthing, int playernum, int flag for (int ii = 0; ii < MAXPLAYERS; ++ii) { - if (playeringame[ii] && players[ii].camera == oldactor) + if (PlayerInGame(ii) && Players[ii]->camera == oldactor) { - players[ii].camera = mobj; + Players[ii]->camera = mobj; } } @@ -6825,13 +6830,13 @@ bool AActor::IsFriend (AActor *other) if (deathmatch && teamplay) return IsTeammate(other) || (FriendPlayer != 0 && other->FriendPlayer != 0 && - players[FriendPlayer-1].mo->IsTeammate(players[other->FriendPlayer-1].mo)); + Level->Players[FriendPlayer-1]->mo->IsTeammate(Level->Players[other->FriendPlayer-1]->mo)); return !deathmatch || FriendPlayer == other->FriendPlayer || FriendPlayer == 0 || other->FriendPlayer == 0 || - players[FriendPlayer-1].mo->IsTeammate(players[other->FriendPlayer-1].mo); + Level->Players[FriendPlayer-1]->mo->IsTeammate(Level->Players[other->FriendPlayer-1]->mo); } // [SP] If friendly flags match, then they are on the same team. /*if (!((flags ^ other->flags) & MF_FRIENDLY)) @@ -6858,13 +6863,13 @@ bool AActor::IsHostile (AActor *other) if (deathmatch && teamplay) return !IsTeammate(other) && !(FriendPlayer != 0 && other->FriendPlayer != 0 && - players[FriendPlayer-1].mo->IsTeammate(players[other->FriendPlayer-1].mo)); + Level->Players[FriendPlayer-1]->mo->IsTeammate(Level->Players[other->FriendPlayer-1]->mo)); return deathmatch && FriendPlayer != other->FriendPlayer && FriendPlayer !=0 && other->FriendPlayer != 0 && - !players[FriendPlayer-1].mo->IsTeammate(players[other->FriendPlayer-1].mo); + !Level->Players[FriendPlayer-1]->mo->IsTeammate(Level->Players[other->FriendPlayer-1]->mo); } return true; } diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index a2378b316..b11de948c 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -573,7 +573,7 @@ void P_SerializePlayers(FLevelLocals *Level, FSerializer &arc, bool skipload) // Count the number of players present right now. for (numPlayersNow = 0, i = 0; i < MAXPLAYERS; ++i) { - if (playeringame[i]) + if (Level->PlayerInGame(i)) { ++numPlayersNow; } @@ -879,16 +879,16 @@ void FLevelLocals::SpawnExtraPlayers() // be sure to spawn the extra players. int i; - if (deathmatch) + if (deathmatch || !isPrimaryLevel()) { return; } for (i = 0; i < MAXPLAYERS; ++i) { - if (playeringame[i] && players[i].mo == NULL) + if (PlayerInGame(i) && Players[i]->mo == NULL) { - players[i].playerstate = PST_ENTER; + Players[i]->playerstate = PST_ENTER; SpawnPlayer(&playerstarts[i], i, (flags2 & LEVEL2_PRERAISEWEAPON) ? SPF_WEAPONFULLYUP : 0); } } @@ -1019,9 +1019,9 @@ void FLevelLocals::Serialize(FSerializer &arc, bool hubload) } for (int i = 0; i < MAXPLAYERS; ++i) { - if (playeringame[i] && players[i].mo != nullptr) + if (PlayerInGame(i) && Players[i]->mo != nullptr) { - FWeaponSlots::SetupWeaponSlots(players[i].mo); + FWeaponSlots::SetupWeaponSlots(Players[i]->mo); } } RecreateAllAttachedLights(); diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 83724cd21..cee9f639b 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -378,13 +378,13 @@ void P_SetupLevel(FLevelLocals *Level, int position, bool newGame) Level->SetMusicVolume(Level->MusicVolume); for (i = 0; i < MAXPLAYERS; ++i) { - players[i].killcount = players[i].secretcount - = players[i].itemcount = 0; + Level->Players[i]->killcount = Level->Players[i]->secretcount + = Level->Players[i]->itemcount = 0; } } for (i = 0; i < MAXPLAYERS; ++i) { - players[i].mo = nullptr; + Level->Players[i]->mo = nullptr; } // [RH] Clear any scripted translation colors the previous level may have set. for (i = 0; i < int(translationtables[TRANSLATION_LevelScripted].Size()); ++i) @@ -439,9 +439,9 @@ void P_SetupLevel(FLevelLocals *Level, int position, bool newGame) { for (i = 0; i < MAXPLAYERS; i++) { - if (playeringame[i]) + if (Level->PlayerInGame(i)) { - players[i].mo = nullptr; + Level->Players[i]->mo = nullptr; Level->DeathMatchSpawnPlayer(i); } } @@ -451,9 +451,9 @@ void P_SetupLevel(FLevelLocals *Level, int position, bool newGame) { for (i = 0; i < MAXPLAYERS; ++i) { - if (playeringame[i]) + if (Level->PlayerInGame(i)) { - players[i].mo = nullptr; + Level->Players[i]->mo = nullptr; FPlayerStart *mthing = Level->PickPlayerStart(i); Level->SpawnPlayer(mthing, i, (Level->flags2 & LEVEL2_PRERAISEWEAPON) ? SPF_WEAPONFULLYUP : 0); } @@ -466,11 +466,12 @@ void P_SetupLevel(FLevelLocals *Level, int position, bool newGame) { for (i = 0; i < MAXPLAYERS; ++i) { - if (playeringame[i] && players[i].mo != nullptr) + auto p = Level->Players[i]; + if (Level->PlayerInGame(i) && p->mo != nullptr) { - if (!(players[i].mo->flags & MF_FRIENDLY)) + if (!(p->mo->flags & MF_FRIENDLY)) { - AActor * oldSpawn = players[i].mo; + AActor * oldSpawn = p->mo; Level->DeathMatchSpawnPlayer(i); oldSpawn->Destroy(); } From e30f116faf4260ecfad2ed6c6e9f6056459e5581 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 30 Jan 2019 01:38:18 +0100 Subject: [PATCH 103/164] - moved bglobal into FLevelLocals This is still all static data, only the location has changed, but none of the access. --- src/b_bot.cpp | 10 +++++----- src/b_bot.h | 6 +++--- src/b_func.cpp | 30 +++++++++++++++--------------- src/b_game.cpp | 10 +++------- src/b_move.cpp | 2 +- src/b_think.cpp | 7 ++----- src/d_main.cpp | 10 +++++----- src/d_net.cpp | 4 ++-- src/dobjgc.cpp | 4 ---- src/g_game.cpp | 11 +++++++---- src/g_level.cpp | 15 +++++++++------ src/g_levellocals.h | 2 ++ src/m_cheat.cpp | 6 ++++-- src/namedef.h | 1 - src/p_interaction.cpp | 4 ++-- src/p_map.cpp | 2 +- src/p_mobj.cpp | 6 +++--- src/p_saveg.cpp | 5 ++--- src/p_sight.cpp | 2 +- src/p_tick.cpp | 9 +++++---- 20 files changed, 72 insertions(+), 74 deletions(-) diff --git a/src/b_bot.cpp b/src/b_bot.cpp index 2ca43dca6..39067dfa9 100644 --- a/src/b_bot.cpp +++ b/src/b_bot.cpp @@ -144,9 +144,9 @@ void DBot::Tick () } BotThinkCycles.Clock(); - bglobal.m_Thinking = true; + Level->BotInfo.m_Thinking = true; Think (); - bglobal.m_Thinking = false; + Level->BotInfo.m_Thinking = false; BotThinkCycles.Unclock(); } @@ -174,9 +174,9 @@ CCMD (addbot) } if (argv.argc() > 1) - bglobal.SpawnBot (argv[1]); + currentUILevel->BotInfo.SpawnBot (argv[1]); else - bglobal.SpawnBot (nullptr); + currentUILevel->BotInfo.SpawnBot (nullptr); } void FCajunMaster::ClearPlayer (int i, bool keepTeam) @@ -233,7 +233,7 @@ CCMD (freeze) CCMD (listbots) { - botinfo_t *thebot = bglobal.botinfo; + botinfo_t *thebot = currentUILevel->BotInfo.botinfo; int count = 0; while (thebot) diff --git a/src/b_bot.h b/src/b_bot.h index cdcda5b6a..b7a30d5eb 100644 --- a/src/b_bot.h +++ b/src/b_bot.h @@ -139,8 +139,9 @@ public: bool IsDangerous (sector_t *sec); TArray getspawned; //Array of bots (their names) which should be spawned when starting a game. - uint8_t freeze; //Game in freeze mode. - uint8_t changefreeze; //Game wants to change freeze mode. + + //uint8_t freeze; //Game in freeze mode. + //uint8_t changefreeze; //Game wants to change freeze mode. int botnum; botinfo_t *botinfo; int spawn_tries; @@ -237,7 +238,6 @@ private: //Externs -extern FCajunMaster bglobal; extern cycle_t BotThinkCycles, BotSupportCycles; EXTERN_CVAR (Float, bot_flag_return_time) diff --git a/src/b_func.cpp b/src/b_func.cpp index ddc491986..9d0b015dd 100644 --- a/src/b_func.cpp +++ b/src/b_func.cpp @@ -105,7 +105,7 @@ bool DBot::Reachable (AActor *rtarget) double ceilingheight = s->ceilingplane.ZatPoint (hitx, hity); double floorheight = s->floorplane.ZatPoint (hitx, hity); - if (!bglobal.IsDangerous (s) && //Any nukage/lava? + if (!Level->BotInfo.IsDangerous (s) && //Any nukage/lava? (floorheight <= (last_z+MAXMOVEHEIGHT) && ((ceilingheight == floorheight && line->special) || (ceilingheight - floorheight) >= player->mo->Height))) //Does it fit? @@ -235,8 +235,8 @@ void DBot::Dofire (ticcmd_t *cmd) // prediction aiming Dist = player->mo->Distance2D(enemy); fm = Dist / GetDefaultByType (GetBotInfo(player->ReadyWeapon).projectileType)->Speed; - bglobal.SetBodyAt(enemy->Pos() + enemy->Vel.XY() * fm * 2, 1); - Angle = player->mo->AngleTo(bglobal.body1); + Level->BotInfo.SetBodyAt(enemy->Pos() + enemy->Vel.XY() * fm * 2, 1); + Angle = player->mo->AngleTo(Level->BotInfo.body1); if (Check_LOS (enemy, SHOOTFOV)) no_fire = false; } @@ -300,7 +300,7 @@ extern int BotWTG; void FCajunMaster::BotTick(AActor *mo) { BotSupportCycles.Clock(); - bglobal.m_Thinking = true; + m_Thinking = true; for (int i = 0; i < MAXPLAYERS; i++) { if (!playeringame[i] || players[i].Bot == NULL) @@ -333,7 +333,7 @@ void FCajunMaster::BotTick(AActor *mo) } } } - bglobal.m_Thinking = false; + m_Thinking = false; BotSupportCycles.Unclock(); } @@ -382,7 +382,7 @@ AActor *DBot::Choose_Mate () && client->mo->health > 0 && client->mo != observer && ((player->mo->health/2) <= client->mo->health || !deathmatch) - && !bglobal.IsLeader(client)) //taken? + && !Level->BotInfo.IsLeader(client)) //taken? { if (P_CheckSight (player->mo, client->mo, SF_IGNOREVISIBILITY)) { @@ -401,7 +401,7 @@ AActor *DBot::Choose_Mate () //Make a introducing to mate. if(target && target!=last_mate) { - if((P_Random()%(200*bglobal.botnum))<3) + if((P_Random()%(200*Level->BotInfo.botnum))<3) { chat = c_teamup; if(target->bot) @@ -543,9 +543,9 @@ DAngle DBot::FireRox (AActor *enemy, ticcmd_t *cmd) AActor *actor; double m; - bglobal.SetBodyAt(player->mo->PosPlusZ(player->mo->Height / 2) + player->mo->Vel.XY() * 5, 2); + Level->BotInfo.SetBodyAt(player->mo->PosPlusZ(player->mo->Height / 2) + player->mo->Vel.XY() * 5, 2); - actor = bglobal.body2; + actor = Level->BotInfo.body2; dist = actor->Distance2D (enemy); if (dist < SAFE_SELF_MISDIST) @@ -553,24 +553,24 @@ DAngle DBot::FireRox (AActor *enemy, ticcmd_t *cmd) //Predict. m = ((dist+1) / GetDefaultByName("Rocket")->Speed); - bglobal.SetBodyAt(DVector3((enemy->Pos() + enemy->Vel * (m + 2)), ONFLOORZ), 1); + Level->BotInfo.SetBodyAt(DVector3((enemy->Pos() + enemy->Vel * (m + 2)), ONFLOORZ), 1); //try the predicted location - if (P_CheckSight (actor, bglobal.body1, SF_IGNOREVISIBILITY)) //See the predicted location, so give a test missile + if (P_CheckSight (actor, Level->BotInfo.body1, SF_IGNOREVISIBILITY)) //See the predicted location, so give a test missile { FCheckPosition tm; - if (bglobal.SafeCheckPosition (player->mo, actor->X(), actor->Y(), tm)) + if (Level->BotInfo.SafeCheckPosition (player->mo, actor->X(), actor->Y(), tm)) { - if (bglobal.FakeFire (actor, bglobal.body1, cmd) >= SAFE_SELF_MISDIST) + if (Level->BotInfo.FakeFire (actor, Level->BotInfo.body1, cmd) >= SAFE_SELF_MISDIST) { - return actor->AngleTo(bglobal.body1); + return actor->AngleTo(Level->BotInfo.body1); } } } //Try fire straight. if (P_CheckSight (actor, enemy, 0)) { - if (bglobal.FakeFire (player->mo, enemy, cmd) >= SAFE_SELF_MISDIST) + if (Level->BotInfo.FakeFire (player->mo, enemy, cmd) >= SAFE_SELF_MISDIST) { return player->mo->AngleTo(enemy); } diff --git a/src/b_game.cpp b/src/b_game.cpp index 0f6b69911..603d7ecb8 100644 --- a/src/b_game.cpp +++ b/src/b_game.cpp @@ -96,9 +96,6 @@ Everything that is changed is marked (maybe commented) with "Added by MC" static FRandom pr_botspawn ("BotSpawn"); -//Externs -FCajunMaster bglobal; - cycle_t BotThinkCycles, BotSupportCycles; int BotWTG; @@ -176,7 +173,6 @@ void FCajunMaster::Init () botnum = 0; firstthing = nullptr; spawn_tries = 0; - freeze = false; observer = false; body1 = nullptr; body2 = nullptr; @@ -520,7 +516,7 @@ bool FCajunMaster::LoadBots () bool gotteam = false; int loaded_bots = 0; - bglobal.ForgetBots (); + ForgetBots (); tmp = M_GetCajunPath(BOTFILENAME); if (tmp.IsEmpty()) { @@ -636,9 +632,9 @@ bool FCajunMaster::LoadBots () appendinfo (newinfo->info, "team"); appendinfo (newinfo->info, "255"); } - newinfo->next = bglobal.botinfo; + newinfo->next = botinfo; newinfo->lastteam = TEAM_NONE; - bglobal.botinfo = newinfo; + botinfo = newinfo; loaded_bots++; } Printf ("%d bots read from %s\n", loaded_bots, BOTFILENAME); diff --git a/src/b_move.cpp b/src/b_move.cpp index 52ae724dc..a22867af1 100644 --- a/src/b_move.cpp +++ b/src/b_move.cpp @@ -104,7 +104,7 @@ bool DBot::Move (ticcmd_t *cmd) tryx = player->mo->X() + 8*xspeed[player->mo->movedir]; tryy = player->mo->Y() + 8*yspeed[player->mo->movedir]; - try_ok = bglobal.CleanAhead (player->mo, tryx, tryy, cmd); + try_ok = Level->BotInfo.CleanAhead (player->mo, tryx, tryy, cmd); if (!try_ok) //Anything blocking that could be opened etc.. { diff --git a/src/b_think.cpp b/src/b_think.cpp index a0a30180d..4152e475d 100644 --- a/src/b_think.cpp +++ b/src/b_think.cpp @@ -289,7 +289,7 @@ void DBot::ThinkForMove (ticcmd_t *cmd) r = pr_botmove(); if (r < 128) { - auto it = player->mo->Level->GetThinkerIterator(NAME_Inventory, MAX_STATNUM+1, bglobal.firstthing); + auto it = player->mo->Level->GetThinkerIterator(NAME_Inventory, MAX_STATNUM+1, Level->BotInfo.firstthing); auto item = it.Next(); if (item != NULL || (item = it.Next()) != NULL) @@ -304,7 +304,7 @@ void DBot::ThinkForMove (ticcmd_t *cmd) { item = it.Next(); } - bglobal.firstthing = item; + Level->BotInfo.firstthing = item; dest = item; } } @@ -356,9 +356,6 @@ void DBot::WhatToGet (AActor *item) } int weapgiveammo = (alwaysapplydmflags || deathmatch) && !(dmflags & DF_WEAPONS_STAY); - //if(pos && !bglobal.thingvis[pos->id][item->id]) continue; -// if (item->IsKindOf (RUNTIME_CLASS(AArtifact))) -// return; // don't know how to use artifacts if (item->IsKindOf(NAME_Weapon)) { // FIXME diff --git a/src/d_main.cpp b/src/d_main.cpp index 55db3cc71..36c921abf 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -957,7 +957,7 @@ void D_Display () void D_ErrorCleanup () { savegamerestore = false; - bglobal.RemoveAllBots (&level, true); + level.BotInfo.RemoveAllBots (&level, true); D_QuitNetGame (); if (demorecording || demoplayback) G_CheckDemoStatus (); @@ -2553,14 +2553,14 @@ void D_DoomMain (void) PClassActor::StaticSetActorNums(); //Added by MC: - bglobal.getspawned.Clear(); + level.BotInfo.getspawned.Clear(); argcount = Args->CheckParmList("-bots", &args); for (p = 0; p < argcount; ++p) { - bglobal.getspawned.Push(args[p]); + level.BotInfo.getspawned.Push(args[p]); } - bglobal.spawn_tries = 0; - bglobal.wanted_botnum = bglobal.getspawned.Size(); + level.BotInfo.spawn_tries = 0; + level.BotInfo.wanted_botnum = level.BotInfo.getspawned.Size(); if (!batchrun) Printf ("P_Init: Init Playloop state.\n"); StartScreen->LoadingStatus ("Init game engine", 0x3f); diff --git a/src/d_net.cpp b/src/d_net.cpp index c88a0ce12..1f360a8d2 100644 --- a/src/d_net.cpp +++ b/src/d_net.cpp @@ -2230,11 +2230,11 @@ void Net_DoCommand (int type, uint8_t **stream, int player) break; case DEM_ADDBOT: - bglobal.TryAddBot (&level, stream, player); + level.BotInfo.TryAddBot (&level, stream, player); break; case DEM_KILLBOTS: - bglobal.RemoveAllBots (&level, true); + level.BotInfo.RemoveAllBots (&level, true); Printf ("Removed all bots\n"); break; diff --git a/src/dobjgc.cpp b/src/dobjgc.cpp index 2b8aefd58..ab1ccf34f 100644 --- a/src/dobjgc.cpp +++ b/src/dobjgc.cpp @@ -300,10 +300,6 @@ static void MarkRoot() { Level->Mark(); } - // Mark bot stuff. - Mark(bglobal.firstthing); - Mark(bglobal.body1); - Mark(bglobal.body2); // NextToThink must not be freed while thinkers are ticking. Mark(NextToThink); // Mark soft roots. diff --git a/src/g_game.cpp b/src/g_game.cpp index c0ba5398d..2f170a52b 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -219,6 +219,8 @@ bool SendLand; const AActor *SendItemUse, *SendItemDrop; int SendItemDropAmount; +extern uint8_t globalfreeze; + EXTERN_CVAR (Int, team) CVAR (Bool, teamplay, false, CVAR_SERVERINFO) @@ -1111,7 +1113,7 @@ void G_Ticker () uint32_t rngsum = FRandom::StaticSumSeeds (); //Added by MC: For some of that bot stuff. The main bot function. - bglobal.Main (&level); + level.BotInfo.Main (&level); for (i = 0; i < MAXPLAYERS; i++) { @@ -1894,7 +1896,7 @@ void G_DoLoadGame () // Read intermission data for hubs G_SerializeHub(arc); - bglobal.RemoveAllBots(&level, true); + level.BotInfo.RemoveAllBots(&level, true); FString cvar; arc("importantcvars", cvar); @@ -1907,7 +1909,8 @@ void G_DoLoadGame () uint32_t time[2] = { 1,0 }; arc("ticrate", time[0]) - ("leveltime", time[1]); + ("leveltime", time[1]) + ("globalfreeze", globalfreeze); // dearchive all the modifications level.time = Scale(time[1], TICRATE, time[0]); @@ -2887,7 +2890,7 @@ DEFINE_GLOBAL(multiplayer) DEFINE_GLOBAL(gameaction) DEFINE_GLOBAL(gamestate) DEFINE_GLOBAL(skyflatnum) -DEFINE_GLOBAL_NAMED(bglobal.freeze, globalfreeze) +DEFINE_GLOBAL(globalfreeze) DEFINE_GLOBAL(gametic) DEFINE_GLOBAL(demoplayback) DEFINE_GLOBAL(automapactive); diff --git a/src/g_level.cpp b/src/g_level.cpp index 60f38ea5e..bd0d234d2 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -535,7 +535,7 @@ void G_InitNew (const char *mapname, bool bTitleLevel) //Added by MC: Initialize bots. if (!deathmatch) { - bglobal.Init (); + level.BotInfo.Init (); } if (bTitleLevel) @@ -653,7 +653,7 @@ void FLevelLocals::ChangeLevel(const char *levelname, int position, int flags, i } changeflags = flags; - bglobal.End(); //Added by MC: + BotInfo.End(); //Added by MC: // [RH] Give scripts a chance to do something unloading = true; @@ -1070,7 +1070,7 @@ void FLevelLocals::DoLoadLevel(const FString &nextmapname, int position, bool au //Added by MC: Initialize bots. if (deathmatch) { - bglobal.Init (); + BotInfo.Init (); } if (timingdemo) @@ -1167,7 +1167,7 @@ void FLevelLocals::WorldDone (void) //Added by mc if (deathmatch) { - bglobal.RemoveAllBots(this, consoleplayer != Net_Arbitrator); + BotInfo.RemoveAllBots(this, consoleplayer != Net_Arbitrator); } if (flags & LEVEL_CHANGEMAPCHEAT) @@ -1341,7 +1341,7 @@ void FLevelLocals::StartTravel () } } - bglobal.StartTravel (); + BotInfo.StartTravel (); } //========================================================================== @@ -1461,7 +1461,7 @@ int FLevelLocals::FinishTravel () pawns[pawnsnum++] = pawn; } - bglobal.FinishTravel (); + BotInfo.FinishTravel (); // make sure that, after travelling has completed, no travelling thinkers are left. // Since this list is excluded from regular thinker cleaning, anything that may survive through here @@ -2114,6 +2114,9 @@ void FLevelLocals::Mark() GC::Mark(automap); GC::Mark(interpolator.Head); GC::Mark(SequenceListHead); + GC::Mark(BotInfo.firstthing); + GC::Mark(BotInfo.body1); + GC::Mark(BotInfo.body2); canvasTextureInfo.Mark(); for (auto &c : CorpseQueue) diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 471d7b655..35dce9eaa 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -47,6 +47,7 @@ #include "p_tags.h" #include "p_spec.h" #include "actor.h" +#include "b_bot.h" #include "p_effect.h" #include "d_player.h" #include "p_destructible.h" @@ -464,6 +465,7 @@ public: TArray StrifeDialogues; FDialogueIDMap DialogueRoots; FDialogueMap ClassRoots; + FCajunMaster BotInfo; int ii_compatflags = 0; int ii_compatflags2 = 0; diff --git a/src/m_cheat.cpp b/src/m_cheat.cpp index b58479c08..31e985370 100644 --- a/src/m_cheat.cpp +++ b/src/m_cheat.cpp @@ -54,6 +54,8 @@ #include "g_levellocals.h" #include "vm.h" +uint8_t globalfreeze, globalchangefreeze; // user's freeze state. + // [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 // later calls us. @@ -514,8 +516,8 @@ void cht_DoCheat (player_t *player, int cheat) break; case CHT_FREEZE: - bglobal.changefreeze ^= 1; - if (bglobal.freeze ^ bglobal.changefreeze) + globalchangefreeze ^= 1; + if (globalfreeze ^ globalchangefreeze) { msg = GStrings("TXT_FREEZEON"); } diff --git a/src/namedef.h b/src/namedef.h index 11a285079..f47720066 100644 --- a/src/namedef.h +++ b/src/namedef.h @@ -1077,6 +1077,5 @@ xx(InternalDynamicLight) xx(_a_chase_default) xx(MapMarker) xx(Spawn2) -xx(globalfreeze) xx(LevelLocals) xx(Level) diff --git a/src/p_interaction.cpp b/src/p_interaction.cpp index d1f23094f..a8e3c0acc 100644 --- a/src/p_interaction.cpp +++ b/src/p_interaction.cpp @@ -569,10 +569,10 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOf player->respawn_time = Level->time + TICRATE; //Added by MC: Respawn bots - if (bglobal.botnum && !demoplayback) + if (Level->BotInfo.botnum && !demoplayback) { if (player->Bot != NULL) - player->Bot->t_respawn = (pr_botrespawn()%15)+((bglobal.botnum-1)*2)+TICRATE+1; + player->Bot->t_respawn = (pr_botrespawn()%15)+((Level->BotInfo.botnum-1)*2)+TICRATE+1; //Added by MC: Discard enemies. for (int i = 0; i < MAXPLAYERS; i++) diff --git a/src/p_map.cpp b/src/p_map.cpp index ebfda7f83..eeb11b545 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -2333,7 +2333,7 @@ bool P_TryMove(AActor *thing, const DVector2 &pos, if (thing->player && thing->player->Bot != NULL && thing->flags & MF_SHOOTABLE) { if (tm.sector != thing->Sector - && bglobal.IsDangerous(tm.sector)) + && thing->Level->BotInfo.IsDangerous(tm.sector)) { thing->player->Bot->prev = thing->player->Bot->dest; thing->player->Bot->dest = nullptr; diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 6b1144660..dca94497a 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -3668,10 +3668,10 @@ void AActor::Tick () } } - if (bglobal.botnum && !demoplayback && + if (Level->BotInfo.botnum && !demoplayback && ((flags & (MF_SPECIAL|MF_MISSILE)) || (flags3 & MF3_ISMONSTER))) { - bglobal.BotTick(this); + Level->BotInfo.BotTick(this); } // [RH] Consider carrying sectors here @@ -4375,7 +4375,7 @@ void ConstructActor(AActor *actor, const DVector3 &pos, bool SpawningMapThing) // Actors with zero gravity need the NOGRAVITY flag set. if (actor->Gravity == 0) actor->flags |= MF_NOGRAVITY; - FRandom &rng = bglobal.m_Thinking ? pr_botspawnmobj : pr_spawnmobj; + FRandom &rng = Level->BotInfo.m_Thinking ? pr_botspawnmobj : pr_spawnmobj; if (actor->isFast() && actor->flags3 & MF3_ISMONSTER) actor->reactiontime = 0; diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index b11de948c..49e087250 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -822,7 +822,7 @@ void CopyPlayer(player_t *dst, player_t *src, const char *name) if (dst->Bot != nullptr) { - botinfo_t *thebot = bglobal.botinfo; + botinfo_t *thebot = level.BotInfo.botinfo; while (thebot && stricmp(name, thebot->name)) { thebot = thebot->next; @@ -831,7 +831,7 @@ void CopyPlayer(player_t *dst, player_t *src, const char *name) { thebot->inuse = BOTINUSE_Yes; } - bglobal.botnum++; + level.BotInfo.botnum++; dst->userinfo.TransferFrom(uibackup2); } else @@ -979,7 +979,6 @@ void FLevelLocals::Serialize(FSerializer &arc, bool hubload) { InitSkyMap(this); AirControlChanged(); - bglobal.freeze = !!(frozenstate & 2); } Behaviors.SerializeModuleStates(arc); diff --git a/src/p_sight.cpp b/src/p_sight.cpp index 610025301..cb1dc8243 100644 --- a/src/p_sight.cpp +++ b/src/p_sight.cpp @@ -871,7 +871,7 @@ sightcounts[0]++; // Cannot see an invisible object if ((flags & SF_IGNOREVISIBILITY) == 0 && ((t2->renderflags & RF_INVISIBLE) || !t2->RenderStyle.IsVisible(t2->Alpha))) { // small chance of an attack being made anyway - if ((bglobal.m_Thinking ? pr_botchecksight() : pr_checksight()) > 50) + if ((t1->Level->BotInfo.m_Thinking ? pr_botchecksight() : pr_checksight()) > 50) { res = false; goto done; diff --git a/src/p_tick.cpp b/src/p_tick.cpp index cec6e2b06..88649f0d5 100644 --- a/src/p_tick.cpp +++ b/src/p_tick.cpp @@ -39,6 +39,7 @@ #include "actorinlines.h" extern gamestate_t wipegamestate; +extern uint8_t globalfreeze, globalchangefreeze; //========================================================================== // @@ -99,14 +100,14 @@ void P_Ticker (void) // This may not be perfect but it is not really relevant for sublevels that tracer homing behavior is preserved. if ((currentUILevel->maptime & 3) == 0) { - if (bglobal.changefreeze) + if (globalchangefreeze) { + globalfreeze ^= 1; + globalchangefreeze = 0; for (auto Level : AllLevels()) { - Level->frozenstate ^= 2; + Level->frozenstate = (Level->frozenstate & ~2) | (2 * globalfreeze); } - bglobal.freeze ^= 1; - bglobal.changefreeze = 0; } } From 3b4ded5694e3b36e0b9bafaf81190bcb8d701cc2 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 30 Jan 2019 02:15:48 +0100 Subject: [PATCH 104/164] - refactored the thinker list. This was an unorganized set of static members in DThinker but has now been regrouped into something more structured. --- src/d_main.cpp | 2 +- src/dobjgc.cpp | 5 - src/dthinker.cpp | 954 +++++++++++++++++++++++--------------------- src/dthinker.h | 55 ++- src/g_level.cpp | 4 +- src/g_levellocals.h | 2 +- src/p_pusher.cpp | 8 +- src/p_saveg.cpp | 4 +- src/p_setup.cpp | 6 +- src/p_spec.h | 6 - src/p_tick.cpp | 2 +- 11 files changed, 543 insertions(+), 505 deletions(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index 36c921abf..29086572b 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -2724,7 +2724,7 @@ void D_DoomMain (void) // clean up game state ST_Clear(); D_ErrorCleanup (); - DThinker::DestroyThinkersInList(STAT_STATIC); + Thinkers.DestroyThinkersInList(STAT_STATIC); E_Shutdown(false); P_FreeLevelData(); diff --git a/src/dobjgc.cpp b/src/dobjgc.cpp index ab1ccf34f..b49f8f4dc 100644 --- a/src/dobjgc.cpp +++ b/src/dobjgc.cpp @@ -112,8 +112,6 @@ // EXTERNAL DATA DECLARATIONS ---------------------------------------------- -extern DThinker *NextToThink; - // PUBLIC DATA DEFINITIONS ------------------------------------------------- namespace GC @@ -282,7 +280,6 @@ static void MarkRoot() Mark(StatusBar); M_MarkMenus(); Mark(DIntermissionController::CurrentIntermission); - DThinker::MarkRoots(); Mark(E_FirstEventHandler); Mark(E_LastEventHandler); for (auto Level : AllLevels()) @@ -300,8 +297,6 @@ static void MarkRoot() { Level->Mark(); } - // NextToThink must not be freed while thinkers are ticking. - Mark(NextToThink); // Mark soft roots. if (SoftRoots != NULL) { diff --git a/src/dthinker.cpp b/src/dthinker.cpp index c104e677a..3157b567f 100644 --- a/src/dthinker.cpp +++ b/src/dthinker.cpp @@ -52,55 +52,41 @@ extern int BotWTG; IMPLEMENT_CLASS(DThinker, false, false) +struct ProfileInfo +{ + int numcalls = 0; + cycle_t timer; + + ProfileInfo() + { + timer.Reset(); + } +}; + +static TMap Profiles; +static unsigned int profilethinkers, profilelimit; +FThinkerCollection Thinkers; DThinker *NextToThink; -FThinkerList DThinker::Thinkers[MAX_STATNUM+2]; -FThinkerList DThinker::FreshThinkers[MAX_STATNUM+1]; - //========================================================================== // // // //========================================================================== -void FThinkerList::AddTail(DThinker *thinker) +void FThinkerCollection::Link(DThinker *thinker, int statnum) { - assert(thinker->PrevThinker == NULL && thinker->NextThinker == NULL); - assert(!(thinker->ObjectFlags & OF_EuthanizeMe)); - if (Sentinel == NULL) + FThinkerList *list; + if ((thinker->ObjectFlags & OF_JustSpawned) && statnum >= STAT_FIRST_THINKING) { - Sentinel = Create(); - Sentinel->ObjectFlags = OF_Sentinel; - Sentinel->NextThinker = Sentinel; - Sentinel->PrevThinker = Sentinel; - GC::WriteBarrier(Sentinel); + list = &FreshThinkers[statnum]; } - DThinker *tail = Sentinel->PrevThinker; - assert(tail->NextThinker == Sentinel); - thinker->PrevThinker = tail; - thinker->NextThinker = Sentinel; - tail->NextThinker = thinker; - Sentinel->PrevThinker = thinker; - GC::WriteBarrier(thinker, tail); - GC::WriteBarrier(thinker, Sentinel); - GC::WriteBarrier(tail, thinker); - GC::WriteBarrier(Sentinel, thinker); -} - -//========================================================================== -// -// -// -//========================================================================== - -DThinker *FThinkerList::GetHead() const -{ - if (Sentinel == NULL || Sentinel->NextThinker == Sentinel) + else { - return NULL; + thinker->ObjectFlags &= ~OF_JustSpawned; + list = &Thinkers[statnum]; } - assert(Sentinel->NextThinker->PrevThinker == Sentinel); - return Sentinel->NextThinker; + list->AddTail(thinker); } //========================================================================== @@ -109,43 +95,161 @@ DThinker *FThinkerList::GetHead() const // //========================================================================== -DThinker *FThinkerList::GetTail() const +void FThinkerCollection::RunThinkers(FLevelLocals *Level) { - if (Sentinel == NULL || Sentinel->PrevThinker == Sentinel) + int i, count; + + ThinkCount = 0; + ThinkCycles.Reset(); + BotSupportCycles.Reset(); + ActionCycles.Reset(); + BotWTG = 0; + + ThinkCycles.Clock(); + + if (!profilethinkers) { - return NULL; - } - return Sentinel->PrevThinker; -} - -//========================================================================== -// -// -// -//========================================================================== - -bool FThinkerList::IsEmpty() const -{ - return Sentinel == NULL || Sentinel->NextThinker == NULL; -} - -//========================================================================== -// -// -// -//========================================================================== - -void DThinker::SaveList(FSerializer &arc, DThinker *node) -{ - if (node != NULL) - { - while (!(node->ObjectFlags & OF_Sentinel)) + // Tick every thinker left from last time + for (i = STAT_FIRST_THINKING; i <= MAX_STATNUM; ++i) { - assert(node->NextThinker != NULL && !(node->NextThinker->ObjectFlags & OF_EuthanizeMe)); - ::Serialize(arc, nullptr, node, nullptr); - node = node->NextThinker; + Thinkers[i].TickThinkers(nullptr); + } + + // Keep ticking the fresh thinkers until there are no new ones. + do + { + count = 0; + for (i = STAT_FIRST_THINKING; i <= MAX_STATNUM; ++i) + { + count += FreshThinkers[i].TickThinkers(&Thinkers[i]); + } + } while (count != 0); + + for (auto light = Level->lights; light;) + { + auto next = light->next; + light->Tick(); + light = next; } } + else + { + Profiles.Clear(); + // Tick every thinker left from last time + for (i = STAT_FIRST_THINKING; i <= MAX_STATNUM; ++i) + { + Thinkers[i].ProfileThinkers(nullptr); + } + + // Keep ticking the fresh thinkers until there are no new ones. + do + { + count = 0; + for (i = STAT_FIRST_THINKING; i <= MAX_STATNUM; ++i) + { + count += FreshThinkers[i].ProfileThinkers(&Thinkers[i]); + } + } while (count != 0); + + // Also profile the internal dynamic lights, even though they are not implemented as thinkers. + auto &prof = Profiles[NAME_InternalDynamicLight]; + prof.timer.Clock(); + for (auto light = Level->lights; light;) + { + prof.numcalls++; + auto next = light->next; + light->Tick(); + light = next; + } + prof.timer.Unclock(); + + + struct SortedProfileInfo + { + const char* className; + int numcalls; + double time; + }; + + TArray sorted; + sorted.Grow(Profiles.CountUsed()); + + auto it = TMap::Iterator(Profiles); + TMap::Pair *pair; + while (it.NextPair(pair)) + { + sorted.Push({ pair->Key.GetChars(), pair->Value.numcalls, pair->Value.timer.TimeMS() }); + } + + std::sort(sorted.begin(), sorted.end(), [](const SortedProfileInfo& left, const SortedProfileInfo& right) + { + switch (profilethinkers) + { + case 1: // by name, from A to Z + return stricmp(left.className, right.className) < 0; + case 2: // by name, from Z to A + return stricmp(right.className, left.className) < 0; + case 3: // number of calls, ascending + return left.numcalls < right.numcalls; + case 4: // number of calls, descending + return right.numcalls < left.numcalls; + case 5: // average time, ascending + return left.time / left.numcalls < right.time / right.numcalls; + case 6: // average time, descending + return right.time / right.numcalls < left.time / left.numcalls; + case 7: // total time, ascending + return left.time < right.time; + default: // total time, descending + return right.time < left.time; + } + }); + + Printf(TEXTCOLOR_YELLOW "Total, ms Averg, ms Calls Actor class\n"); + Printf(TEXTCOLOR_YELLOW "---------- ---------- ------ --------------------\n"); + + const unsigned count = MIN(profilelimit > 0 ? profilelimit : UINT_MAX, sorted.Size()); + + for (unsigned i = 0; i < count; ++i) + { + const SortedProfileInfo& info = sorted[i]; + Printf("%s%10.6f %s%10.6f %s%6d %s%s\n", + profilethinkers >= 7 ? TEXTCOLOR_YELLOW : TEXTCOLOR_WHITE, info.time, + profilethinkers == 5 || profilethinkers == 6 ? TEXTCOLOR_YELLOW : TEXTCOLOR_WHITE, info.time / info.numcalls, + profilethinkers == 3 || profilethinkers == 4 ? TEXTCOLOR_YELLOW : TEXTCOLOR_WHITE, info.numcalls, + profilethinkers == 1 || profilethinkers == 2 ? TEXTCOLOR_YELLOW : TEXTCOLOR_WHITE, info.className); + } + + profilethinkers = 0; + } + + ThinkCycles.Unclock(); +} + +//========================================================================== +// +// Destroy every thinker +// +//========================================================================== + +void FThinkerCollection::DestroyAllThinkers() +{ + int i; + bool error = false; + + for (i = 0; i <= MAX_STATNUM; i++) + { + if (i != STAT_TRAVELLING && i != STAT_STATIC) + { + error |= Thinkers[i].DoDestroyThinkers(); + error |= FreshThinkers[i].DoDestroyThinkers(); + } + } + error |= Thinkers[MAX_STATNUM + 1].DoDestroyThinkers(); + GC::FullGC(); + if (error) + { + I_Error("DestroyAllThinkers failed"); + } } //========================================================================== @@ -154,7 +258,7 @@ void DThinker::SaveList(FSerializer &arc, DThinker *node) // //========================================================================== -void DThinker::SerializeThinkers(FSerializer &arc, bool hubLoad) +void FThinkerCollection::SerializeThinkers(FSerializer &arc, bool hubLoad) { //DThinker *thinker; //uint8_t stat; @@ -167,8 +271,8 @@ void DThinker::SerializeThinkers(FSerializer &arc, bool hubLoad) for (i = 0; i <= MAX_STATNUM; i++) { arc.BeginArray(nullptr); - SaveList(arc, Thinkers[i].GetHead()); - SaveList(arc, FreshThinkers[i].GetHead()); + Thinkers[i].SaveList(arc); + FreshThinkers[i].SaveList(arc); arc.EndArray(); } arc.EndArray(); @@ -225,6 +329,311 @@ void DThinker::SerializeThinkers(FSerializer &arc, bool hubLoad) } } + +//========================================================================== +// +// +// +//========================================================================== + +void FThinkerList::AddTail(DThinker *thinker) +{ + assert(thinker->PrevThinker == nullptr && thinker->NextThinker == nullptr); + assert(!(thinker->ObjectFlags & OF_EuthanizeMe)); + if (Sentinel == nullptr) + { + // This cannot use CreateThinker because it must not be added to the list automatically. + Sentinel = (DThinker*)RUNTIME_CLASS(DThinker)->CreateNew(); + Sentinel->ObjectFlags |= OF_Sentinel; + Sentinel->NextThinker = Sentinel; + Sentinel->PrevThinker = Sentinel; + GC::WriteBarrier(Sentinel); + } + DThinker *tail = Sentinel->PrevThinker; + assert(tail->NextThinker == Sentinel); + thinker->PrevThinker = tail; + thinker->NextThinker = Sentinel; + tail->NextThinker = thinker; + Sentinel->PrevThinker = thinker; + GC::WriteBarrier(thinker, tail); + GC::WriteBarrier(thinker, Sentinel); + GC::WriteBarrier(tail, thinker); + GC::WriteBarrier(Sentinel, thinker); +} + +//========================================================================== +// +// +// +//========================================================================== + +DThinker *FThinkerCollection::FirstThinker(int statnum) +{ + DThinker *node; + + if ((unsigned)statnum > MAX_STATNUM) + { + statnum = MAX_STATNUM; + } + node = Thinkers[statnum].GetHead(); + if (node == nullptr) + { + node = FreshThinkers[statnum].GetHead(); + if (node == nullptr) + { + return nullptr; + } + } + return node; +} + +//========================================================================== +// +// Mark the first thinker of each list +// +//========================================================================== + +void FThinkerCollection::MarkRoots() +{ + for (int i = 0; i <= MAX_STATNUM; ++i) + { + GC::Mark(Thinkers[i].Sentinel); + GC::Mark(FreshThinkers[i].Sentinel); + } + GC::Mark(Thinkers[MAX_STATNUM + 1].Sentinel); +} + +//========================================================================== +// +// +// +//========================================================================== + +DThinker *FThinkerList::GetHead() const +{ + if (Sentinel == nullptr || Sentinel->NextThinker == Sentinel) + { + return nullptr; + } + assert(Sentinel->NextThinker->PrevThinker == Sentinel); + return Sentinel->NextThinker; +} + +//========================================================================== +// +// +// +//========================================================================== + +DThinker *FThinkerList::GetTail() const +{ + if (Sentinel == nullptr || Sentinel->PrevThinker == Sentinel) + { + return nullptr; + } + return Sentinel->PrevThinker; +} + +//========================================================================== +// +// +// +//========================================================================== + +bool FThinkerList::IsEmpty() const +{ + return Sentinel == nullptr || Sentinel->NextThinker == nullptr; +} + +//========================================================================== +// +// +// +//========================================================================== + +void FThinkerList::DestroyThinkers() +{ + if (DoDestroyThinkers()) + { + I_Error("DestroyThinkers failed"); + } +} + +//========================================================================== +// +// +// +//========================================================================== + +bool FThinkerList::DoDestroyThinkers() +{ + bool error = false; + if (Sentinel != nullptr) + { + // Taking down the linked list live is far too dangerous in case something goes wrong. So first copy all elements into an array, take down the list and then destroy them. + + TArray toDelete; + DThinker *node = Sentinel->NextThinker; + while (node != Sentinel) + { + assert(node != nullptr); + auto next = node->NextThinker; + toDelete.Push(node); + node->NextThinker = node->PrevThinker = nullptr; // clear the links + node = next; + } + Sentinel->NextThinker = Sentinel->PrevThinker = nullptr; + Sentinel->Destroy(); + Sentinel = nullptr; + for (auto node : toDelete) + { + // We must intercept all exceptions so that we can continue deleting the list. + try + { + node->Destroy(); + } + catch (CVMAbortException &exception) + { + Printf("VM exception in DestroyThinkers:\n"); + exception.MaybePrintMessage(); + Printf("%s", exception.stacktrace.GetChars()); + // forcibly delete this. Cleanup may be incomplete, though. + node->ObjectFlags |= OF_YesReallyDelete; + delete node; + error = true; + } + catch (CRecoverableError &exception) + { + Printf("Error in DestroyThinkers: %s\n", exception.GetMessage()); + // forcibly delete this. Cleanup may be incomplete, though. + node->ObjectFlags |= OF_YesReallyDelete; + delete node; + error = true; + } + } + } + return error; +} + +//========================================================================== +// +// +// +//========================================================================== + +void FThinkerList::SaveList(FSerializer &arc) +{ + auto node = GetHead(); + if (node != nullptr) + { + while (!(node->ObjectFlags & OF_Sentinel)) + { + assert(node->NextThinker != nullptr && !(node->NextThinker->ObjectFlags & OF_EuthanizeMe)); + ::Serialize(arc, nullptr, node, nullptr); + node = node->NextThinker; + } + } +} + +//========================================================================== +// +// +// +//========================================================================== + +int FThinkerList::TickThinkers(FThinkerList *dest) +{ + int count = 0; + DThinker *node = GetHead(); + + if (node == nullptr) + { + return 0; + } + + while (node != Sentinel) + { + ++count; + NextToThink = node->NextThinker; + if (node->ObjectFlags & OF_JustSpawned) + { + // Leave OF_JustSpawn set until after Tick() so the ticker can check it. + if (dest != nullptr) + { // Move thinker from this list to the destination list + node->Remove(); + dest->AddTail(node); + } + node->CallPostBeginPlay(); + } + else if (dest != nullptr) + { + I_Error("There is a thinker in the fresh list that has already ticked.\n"); + } + + if (!(node->ObjectFlags & OF_EuthanizeMe)) + { // Only tick thinkers not scheduled for destruction + ThinkCount++; + node->CallTick(); + node->ObjectFlags &= ~OF_JustSpawned; + GC::CheckGC(); + } + node = NextToThink; + } + return count; +} + +//========================================================================== +// +// +// +//========================================================================== +int FThinkerList::ProfileThinkers(FThinkerList *dest) +{ + int count = 0; + DThinker *node = GetHead(); + + if (node == nullptr) + { + return 0; + } + + while (node != Sentinel) + { + ++count; + NextToThink = node->NextThinker; + if (node->ObjectFlags & OF_JustSpawned) + { + // Leave OF_JustSpawn set until after Tick() so the ticker can check it. + if (dest != nullptr) + { // Move thinker from this list to the destination list + node->Remove(); + dest->AddTail(node); + } + node->CallPostBeginPlay(); + } + else if (dest != nullptr) + { + I_Error("There is a thinker in the fresh list that has already ticked.\n"); + } + + if (!(node->ObjectFlags & OF_EuthanizeMe)) + { // Only tick thinkers not scheduled for destruction + ThinkCount++; + + auto &prof = Profiles[node->GetClass()->TypeName]; + prof.numcalls++; + prof.timer.Clock(); + node->CallTick(); + prof.timer.Unclock(); + node->ObjectFlags &= ~OF_JustSpawned; + GC::CheckGC(); + } + node = NextToThink; + } + return count; +} + + //========================================================================== // // @@ -330,22 +739,7 @@ void DThinker::PostSerialize() DThinker *FLevelLocals::FirstThinker (int statnum) { - DThinker *node; - - if ((unsigned)statnum > MAX_STATNUM) - { - statnum = MAX_STATNUM; - } - node = DThinker::Thinkers[statnum].GetHead(); - if (node == NULL) - { - node = DThinker::FreshThinkers[statnum].GetHead(); - if (node == NULL) - { - return NULL; - } - } - return node; + return Thinkers.FirstThinker(statnum); } //========================================================================== @@ -358,23 +752,14 @@ void DThinker::ChangeStatNum (int statnum) { FThinkerList *list; - // This thinker should already be in a list; verify that. - assert(NextThinker != NULL && PrevThinker != NULL); + FThinkerCollection *collection = &Thinkers; //Todo: get from level if ((unsigned)statnum > MAX_STATNUM) { statnum = MAX_STATNUM; } Remove(); - if ((ObjectFlags & OF_JustSpawned) && statnum >= STAT_FIRST_THINKING) - { - list = &FreshThinkers[statnum]; - } - else - { - list = &Thinkers[statnum]; - } - list->AddTail(this); + Thinkers.Link(this, statnum); } static void ChangeStatNum(DThinker *thinker, int statnum) @@ -389,48 +774,6 @@ DEFINE_ACTION_FUNCTION_NATIVE(DThinker, ChangeStatNum, ChangeStatNum) self->ChangeStatNum(stat); return 0; } -//========================================================================== -// -// Mark the first thinker of each list -// -//========================================================================== - -void DThinker::MarkRoots() -{ - for (int i = 0; i <= MAX_STATNUM; ++i) - { - GC::Mark(Thinkers[i].Sentinel); - GC::Mark(FreshThinkers[i].Sentinel); - } - GC::Mark(Thinkers[MAX_STATNUM+1].Sentinel); -} - -//========================================================================== -// -// Destroy every thinker -// -//========================================================================== - -void DThinker::DestroyAllThinkers () -{ - int i; - bool error = false; - - for (i = 0; i <= MAX_STATNUM; i++) - { - if (i != STAT_TRAVELLING && i != STAT_STATIC) - { - error |= DoDestroyThinkersInList (Thinkers[i]); - error |= DoDestroyThinkersInList (FreshThinkers[i]); - } - } - error |= DoDestroyThinkersInList (Thinkers[MAX_STATNUM+1]); - GC::FullGC(); - if (error) - { - I_Error("DestroyAllThinkers failed"); - } -} //========================================================================== // @@ -438,77 +781,6 @@ void DThinker::DestroyAllThinkers () // //========================================================================== -void DThinker::DestroyThinkersInList(FThinkerList &list) -{ - if (DoDestroyThinkersInList(list)) - { - I_Error("DestroyThinkersInList failed"); - } -} - -//========================================================================== -// -// -// -//========================================================================== - -bool DThinker::DoDestroyThinkersInList (FThinkerList &list) -{ - bool error = false; - if (list.Sentinel != nullptr) - { - // Taking down the linked list live is far too dangerous in case something goes wrong. So first copy all elements into an array, take down the list and then destroy them. - - TArray toDelete; - DThinker *node = list.Sentinel->NextThinker; - while (node != list.Sentinel) - { - assert(node != nullptr); - auto next = node->NextThinker; - toDelete.Push(node); - node->NextThinker = node->PrevThinker = nullptr; // clear the links - node = next; - } - list.Sentinel->NextThinker = list.Sentinel->PrevThinker = nullptr; - list.Sentinel->Destroy(); - list.Sentinel = nullptr; - for(auto node : toDelete) - { - // We must intercept all exceptions so that we can continue deleting the list. - try - { - node->Destroy(); - } - catch (CVMAbortException &exception) - { - Printf("VM exception in DestroyThinkers:\n"); - exception.MaybePrintMessage(); - Printf("%s", exception.stacktrace.GetChars()); - // forcibly delete this. Cleanup may be incomplete, though. - node->ObjectFlags |= OF_YesReallyDelete; - delete node; - error = true; - } - catch (CRecoverableError &exception) - { - Printf("Error in DestroyThinkers: %s\n", exception.GetMessage()); - // forcibly delete this. Cleanup may be incomplete, though. - node->ObjectFlags |= OF_YesReallyDelete; - delete node; - error = true; - } - } - } - return error; -} - -//========================================================================== -// -// -// -//========================================================================== -static unsigned int profilethinkers, profilelimit; - CCMD(profilethinkers) { const int argc = argv.argc(); @@ -559,248 +831,6 @@ CCMD(profilethinkers) } } -struct ProfileInfo -{ - int numcalls = 0; - cycle_t timer; - - ProfileInfo() - { - timer.Reset(); - } -}; - -TMap Profiles; - - -void DThinker::RunThinkers () -{ - int i, count; - - ThinkCount = 0; - ThinkCycles.Reset(); - BotSupportCycles.Reset(); - ActionCycles.Reset(); - BotWTG = 0; - - ThinkCycles.Clock(); - - if (!profilethinkers) - { - // Tick every thinker left from last time - for (i = STAT_FIRST_THINKING; i <= MAX_STATNUM; ++i) - { - TickThinkers(&Thinkers[i], NULL); - } - - // Keep ticking the fresh thinkers until there are no new ones. - do - { - count = 0; - for (i = STAT_FIRST_THINKING; i <= MAX_STATNUM; ++i) - { - count += TickThinkers(&FreshThinkers[i], &Thinkers[i]); - } - } while (count != 0); - - for (auto light = level.lights; light;) - { - auto next = light->next; - light->Tick(); - light = next; - } - } - else - { - Profiles.Clear(); - // Tick every thinker left from last time - for (i = STAT_FIRST_THINKING; i <= MAX_STATNUM; ++i) - { - ProfileThinkers(&Thinkers[i], NULL); - } - - // Keep ticking the fresh thinkers until there are no new ones. - do - { - count = 0; - for (i = STAT_FIRST_THINKING; i <= MAX_STATNUM; ++i) - { - count += ProfileThinkers(&FreshThinkers[i], &Thinkers[i]); - } - } while (count != 0); - - // Also profile the internal dynamic lights, even though they are not implemented as thinkers. - auto &prof = Profiles[NAME_InternalDynamicLight]; - prof.timer.Clock(); - for (auto light = level.lights; light;) - { - prof.numcalls++; - auto next = light->next; - light->Tick(); - light = next; - } - prof.timer.Unclock(); - - - struct SortedProfileInfo - { - const char* className; - int numcalls; - double time; - }; - - TArray sorted; - sorted.Grow(Profiles.CountUsed()); - - auto it = TMap::Iterator(Profiles); - TMap::Pair *pair; - while (it.NextPair(pair)) - { - sorted.Push({ pair->Key.GetChars(), pair->Value.numcalls, pair->Value.timer.TimeMS() }); - } - - std::sort(sorted.begin(), sorted.end(), [](const SortedProfileInfo& left, const SortedProfileInfo& right) - { - switch (profilethinkers) - { - case 1: // by name, from A to Z - return stricmp(left.className, right.className) < 0; - case 2: // by name, from Z to A - return stricmp(right.className, left.className) < 0; - case 3: // number of calls, ascending - return left.numcalls < right.numcalls; - case 4: // number of calls, descending - return right.numcalls < left.numcalls; - case 5: // average time, ascending - return left.time / left.numcalls < right.time / right.numcalls; - case 6: // average time, descending - return right.time / right.numcalls < left.time / left.numcalls; - case 7: // total time, ascending - return left.time < right.time; - default: // total time, descending - return right.time < left.time; - } - }); - - Printf(TEXTCOLOR_YELLOW "Total, ms Averg, ms Calls Actor class\n"); - Printf(TEXTCOLOR_YELLOW "---------- ---------- ------ --------------------\n"); - - const unsigned count = MIN(profilelimit > 0 ? profilelimit : UINT_MAX, sorted.Size()); - - for (unsigned i = 0; i < count; ++i) - { - const SortedProfileInfo& info = sorted[i]; - Printf("%s%10.6f %s%10.6f %s%6d %s%s\n", - profilethinkers >= 7 ? TEXTCOLOR_YELLOW : TEXTCOLOR_WHITE, info.time, - profilethinkers == 5 || profilethinkers == 6 ? TEXTCOLOR_YELLOW : TEXTCOLOR_WHITE, info.time / info.numcalls, - profilethinkers == 3 || profilethinkers == 4 ? TEXTCOLOR_YELLOW : TEXTCOLOR_WHITE, info.numcalls, - profilethinkers == 1 || profilethinkers == 2 ? TEXTCOLOR_YELLOW : TEXTCOLOR_WHITE, info.className); - } - - profilethinkers = 0; - } - - ThinkCycles.Unclock(); -} - -//========================================================================== -// -// -// -//========================================================================== - -int DThinker::TickThinkers (FThinkerList *list, FThinkerList *dest) -{ - int count = 0; - DThinker *node = list->GetHead(); - - if (node == NULL) - { - return 0; - } - - while (node != list->Sentinel) - { - ++count; - NextToThink = node->NextThinker; - if (node->ObjectFlags & OF_JustSpawned) - { - // Leave OF_JustSpawn set until after Tick() so the ticker can check it. - if (dest != NULL) - { // Move thinker from this list to the destination list - node->Remove(); - dest->AddTail(node); - } - node->CallPostBeginPlay(); - } - else if (dest != NULL) - { - I_Error("There is a thinker in the fresh list that has already ticked.\n"); - } - - if (!(node->ObjectFlags & OF_EuthanizeMe)) - { // Only tick thinkers not scheduled for destruction - ThinkCount++; - node->CallTick(); - node->ObjectFlags &= ~OF_JustSpawned; - GC::CheckGC(); - } - node = NextToThink; - } - return count; -} - -//========================================================================== -// -// -// -//========================================================================== -int DThinker::ProfileThinkers(FThinkerList *list, FThinkerList *dest) -{ - int count = 0; - DThinker *node = list->GetHead(); - - if (node == NULL) - { - return 0; - } - - while (node != list->Sentinel) - { - ++count; - NextToThink = node->NextThinker; - if (node->ObjectFlags & OF_JustSpawned) - { - // Leave OF_JustSpawn set until after Tick() so the ticker can check it. - if (dest != NULL) - { // Move thinker from this list to the destination list - node->Remove(); - dest->AddTail(node); - } - node->CallPostBeginPlay(); - } - else if (dest != NULL) - { - I_Error("There is a thinker in the fresh list that has already ticked.\n"); - } - - if (!(node->ObjectFlags & OF_EuthanizeMe)) - { // Only tick thinkers not scheduled for destruction - ThinkCount++; - - auto &prof = Profiles[node->GetClass()->TypeName]; - prof.numcalls++; - prof.timer.Clock(); - node->CallTick(); - prof.timer.Unclock(); - node->ObjectFlags &= ~OF_JustSpawned; - GC::CheckGC(); - } - node = NextToThink; - } - return count; -} - //========================================================================== // // @@ -867,7 +897,7 @@ FThinkerIterator::FThinkerIterator (const PClass *type, int statnum) m_SearchStats = false; } m_ParentType = type; - m_CurrThinker = DThinker::Thinkers[m_Stat].GetHead(); + m_CurrThinker = Thinkers.Thinkers[m_Stat].GetHead(); m_SearchingFresh = false; } @@ -890,7 +920,7 @@ FThinkerIterator::FThinkerIterator (const PClass *type, int statnum, DThinker *p m_SearchStats = false; } m_ParentType = type; - if (prev == NULL || (prev->NextThinker->ObjectFlags & OF_Sentinel)) + if (prev == nullptr || (prev->NextThinker->ObjectFlags & OF_Sentinel)) { Reinit(); } @@ -909,7 +939,7 @@ FThinkerIterator::FThinkerIterator (const PClass *type, int statnum, DThinker *p void FThinkerIterator::Reinit () { - m_CurrThinker = DThinker::Thinkers[m_Stat].GetHead(); + m_CurrThinker = Thinkers.Thinkers[m_Stat].GetHead(); m_SearchingFresh = false; } @@ -921,15 +951,15 @@ void FThinkerIterator::Reinit () DThinker *FThinkerIterator::Next (bool exact) { - if (m_ParentType == NULL) + if (m_ParentType == nullptr) { - return NULL; + return nullptr; } do { do { - if (m_CurrThinker != NULL) + if (m_CurrThinker != nullptr) { while (!(m_CurrThinker->ObjectFlags & OF_Sentinel)) { @@ -950,7 +980,7 @@ DThinker *FThinkerIterator::Next (bool exact) } if ((m_SearchingFresh = !m_SearchingFresh)) { - m_CurrThinker = DThinker::FreshThinkers[m_Stat].GetHead(); + m_CurrThinker = Thinkers.FreshThinkers[m_Stat].GetHead(); } } while (m_SearchingFresh); if (m_SearchStats) @@ -961,10 +991,10 @@ DThinker *FThinkerIterator::Next (bool exact) m_Stat = STAT_FIRST_THINKING; } } - m_CurrThinker = DThinker::Thinkers[m_Stat].GetHead(); + m_CurrThinker = Thinkers.Thinkers[m_Stat].GetHead(); m_SearchingFresh = false; } while (m_SearchStats && m_Stat != STAT_FIRST_THINKING); - return NULL; + return nullptr; } //========================================================================== diff --git a/src/dthinker.h b/src/dthinker.h index a48a2d113..5d322409c 100644 --- a/src/dthinker.h +++ b/src/dthinker.h @@ -53,13 +53,43 @@ enum { MAX_STATNUM = 127 }; // Doubly linked ring list of thinkers struct FThinkerList { - FThinkerList() : Sentinel(0) {} + // No destructor. If this list goes away it's the GC's task to clean the orphaned thinkers. Otherwise this may clash with engine shutdown. void AddTail(DThinker *thinker); DThinker *GetHead() const; DThinker *GetTail() const; bool IsEmpty() const; + void DestroyThinkers(); + bool DoDestroyThinkers(); + int TickThinkers(FThinkerList *dest); // Returns: # of thinkers ticked + int ProfileThinkers(FThinkerList *dest); + void SaveList(FSerializer &arc); - DThinker *Sentinel; +private: + DThinker *Sentinel = nullptr; + + friend struct FThinkerCollection; +}; + +struct FThinkerCollection +{ + void DestroyThinkersInList(int statnum) + { + Thinkers[statnum].DestroyThinkers(); + FreshThinkers[statnum].DestroyThinkers(); + } + + void RunThinkers(FLevelLocals *Level); // The level is needed to tick the lights + void DestroyAllThinkers(); + void SerializeThinkers(FSerializer &arc, bool keepPlayers); + void MarkRoots(); + DThinker *FirstThinker(int statnum); + void Link(DThinker *thinker, int statnum); + +private: + FThinkerList Thinkers[MAX_STATNUM + 2]; + FThinkerList FreshThinkers[MAX_STATNUM + 1]; + + friend class FThinkerIterator; }; class DThinker : public DObject @@ -79,29 +109,11 @@ public: void ChangeStatNum (int statnum); - static void RunThinkers (); - static void RunThinkers (int statnum); - static void DestroyAllThinkers (); - static void DestroyThinkersInList(int statnum) - { - DestroyThinkersInList(Thinkers[statnum]); - DestroyThinkersInList(FreshThinkers[statnum]); - } - static void SerializeThinkers(FSerializer &arc, bool keepPlayers); - static void MarkRoots(); - private: - static void DestroyThinkersInList (FThinkerList &list); - static bool DoDestroyThinkersInList(FThinkerList &list); - static int TickThinkers (FThinkerList *list, FThinkerList *dest); // Returns: # of thinkers ticked - static int ProfileThinkers(FThinkerList *list, FThinkerList *dest); - static void SaveList(FSerializer &arc, DThinker *node); void Remove(); - static FThinkerList Thinkers[MAX_STATNUM+2]; // Current thinkers - static FThinkerList FreshThinkers[MAX_STATNUM+1]; // Newly created thinkers - friend struct FThinkerList; + friend struct FThinkerCollection; friend class FThinkerIterator; friend class DObject; friend class FSerializer; @@ -167,4 +179,5 @@ public: } }; +extern FThinkerCollection Thinkers; #endif //__DTHINKER_H__ diff --git a/src/g_level.cpp b/src/g_level.cpp index bd0d234d2..07e7df6d9 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -469,7 +469,7 @@ void G_InitNew (const char *mapname, bool bTitleLevel) UnlatchCVars (); G_VerifySkill(); UnlatchCVars (); - DThinker::DestroyThinkersInList(STAT_STATIC); + Thinkers.DestroyThinkersInList(STAT_STATIC); if (paused) { @@ -1466,7 +1466,7 @@ int FLevelLocals::FinishTravel () // make sure that, after travelling has completed, no travelling thinkers are left. // Since this list is excluded from regular thinker cleaning, anything that may survive through here // will endlessly multiply and severely break the following savegames or just simply crash on broken pointers. - DThinker::DestroyThinkersInList(STAT_TRAVELLING); + Thinkers.DestroyThinkersInList(STAT_TRAVELLING); return failnum; } diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 35dce9eaa..9ab21d52d 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -393,7 +393,7 @@ public: DThinker *thinker = static_cast(cls->CreateNew()); assert(thinker->IsKindOf(RUNTIME_CLASS(DThinker))); thinker->ObjectFlags |= OF_JustSpawned; - DThinker::FreshThinkers[statnum].AddTail(thinker); + Thinkers.Link(thinker, statnum); thinker->Level = this; return thinker; } diff --git a/src/p_pusher.cpp b/src/p_pusher.cpp index 2f580048c..24a015d14 100644 --- a/src/p_pusher.cpp +++ b/src/p_pusher.cpp @@ -295,8 +295,14 @@ void DPusher::Tick () void FLevelLocals::AdjustPusher(int tag, int magnitude, int angle, bool wind) { - DPusher::EPusher type = wind ? DPusher::p_wind : DPusher::p_current; + struct FThinkerCollection + { + int RefNum; + DThinker *Obj; + }; + DPusher::EPusher type = wind? DPusher::p_wind : DPusher::p_current; + // Find pushers already attached to the sector, and change their parameters. TArray Collection; { diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 49e087250..d792b338f 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -928,7 +928,7 @@ void FLevelLocals::Serialize(FSerializer &arc, bool hubload) if (arc.isReading()) { - DThinker::DestroyAllThinkers(); + Thinkers.DestroyAllThinkers(); interpolator.ClearInterpolations(); arc.ReadObjects(hubload); ActiveSequences = 0; @@ -1000,7 +1000,7 @@ void FLevelLocals::Serialize(FSerializer &arc, bool hubload) P_SerializeHealthGroups(this, arc); // [ZZ] serialize events E_SerializeEvents(arc); - DThinker::SerializeThinkers(arc, hubload); + Thinkers.SerializeThinkers(arc, hubload); arc("polyobjs", Polyobjects); SerializeSubsectors(arc, "subsectors"); StatusBar->SerializeMessages(arc); diff --git a/src/p_setup.cpp b/src/p_setup.cpp index cee9f639b..01b84ed6d 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -349,7 +349,7 @@ void P_FreeLevelData () E_Shutdown(true); R_FreePastViewers(); - DThinker::DestroyAllThinkers (); + Thinkers.DestroyAllThinkers (); level.ClearLevelData(); } @@ -573,8 +573,8 @@ void P_Init () } static void P_Shutdown () -{ - DThinker::DestroyThinkersInList(STAT_STATIC); +{ + Thinkers.DestroyThinkersInList(STAT_STATIC); P_FreeLevelData (); // [ZZ] delete global event handlers E_Shutdown(false); diff --git a/src/p_spec.h b/src/p_spec.h index be1b710b9..529b184ac 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -40,12 +40,6 @@ class FScanner; struct level_info_t; struct FDoorAnimation; -struct FThinkerCollection -{ - int RefNum; - DThinker *Obj; -}; - enum class EScroll : int { sc_side, diff --git a/src/p_tick.cpp b/src/p_tick.cpp index 88649f0d5..cfd6064f3 100644 --- a/src/p_tick.cpp +++ b/src/p_tick.cpp @@ -151,7 +151,7 @@ void P_Ticker (void) E_WorldTick(); StatusBar->CallTick (); // [RH] moved this here level.Tick (); // [RH] let the level tick - DThinker::RunThinkers (); + Thinkers.RunThinkers(&level); //if added by MC: Freeze mode. if (!level.isFrozen()) From 99d63faea9592db7b5c8493f70effdafee26143e Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 30 Jan 2019 18:22:37 +0100 Subject: [PATCH 105/164] - fixed bad merge of dobjgc.cpp --- src/dobjgc.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/dobjgc.cpp b/src/dobjgc.cpp index b49f8f4dc..f9c1e2293 100644 --- a/src/dobjgc.cpp +++ b/src/dobjgc.cpp @@ -112,6 +112,8 @@ // EXTERNAL DATA DECLARATIONS ---------------------------------------------- +extern DThinker *NextToThink; + // PUBLIC DATA DEFINITIONS ------------------------------------------------- namespace GC @@ -280,6 +282,7 @@ static void MarkRoot() Mark(StatusBar); M_MarkMenus(); Mark(DIntermissionController::CurrentIntermission); + Thinkers.MarkRoots(); Mark(E_FirstEventHandler); Mark(E_LastEventHandler); for (auto Level : AllLevels()) @@ -297,6 +300,8 @@ static void MarkRoot() { Level->Mark(); } + // NextToThink must not be freed while thinkers are ticking. + Mark(NextToThink); // Mark soft roots. if (SoftRoots != NULL) { From 64ac6dbc6e19e4040c6cf77f41f415e947649aa4 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 30 Jan 2019 19:09:21 +0100 Subject: [PATCH 106/164] - moved thinker storage into FLevelLocals. --- src/d_main.cpp | 2 +- src/dobjgc.cpp | 1 - src/dthinker.cpp | 22 ++++++++-------------- src/dthinker.h | 26 +++++++++----------------- src/g_level.cpp | 6 +++--- src/g_levellocals.h | 7 ++++--- src/p_saveg.cpp | 2 +- src/p_setup.cpp | 5 ++--- src/p_tick.cpp | 2 +- src/scripting/vmiterators.cpp | 8 ++++---- 10 files changed, 33 insertions(+), 48 deletions(-) diff --git a/src/d_main.cpp b/src/d_main.cpp index 29086572b..ef9c18e11 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -2724,7 +2724,7 @@ void D_DoomMain (void) // clean up game state ST_Clear(); D_ErrorCleanup (); - Thinkers.DestroyThinkersInList(STAT_STATIC); + level.Thinkers.DestroyThinkersInList(STAT_STATIC); E_Shutdown(false); P_FreeLevelData(); diff --git a/src/dobjgc.cpp b/src/dobjgc.cpp index f9c1e2293..e0531be7d 100644 --- a/src/dobjgc.cpp +++ b/src/dobjgc.cpp @@ -282,7 +282,6 @@ static void MarkRoot() Mark(StatusBar); M_MarkMenus(); Mark(DIntermissionController::CurrentIntermission); - Thinkers.MarkRoots(); Mark(E_FirstEventHandler); Mark(E_LastEventHandler); for (auto Level : AllLevels()) diff --git a/src/dthinker.cpp b/src/dthinker.cpp index 3157b567f..7b286ebec 100644 --- a/src/dthinker.cpp +++ b/src/dthinker.cpp @@ -65,7 +65,6 @@ struct ProfileInfo static TMap Profiles; static unsigned int profilethinkers, profilelimit; -FThinkerCollection Thinkers; DThinker *NextToThink; //========================================================================== @@ -750,16 +749,12 @@ DThinker *FLevelLocals::FirstThinker (int statnum) void DThinker::ChangeStatNum (int statnum) { - FThinkerList *list; - - FThinkerCollection *collection = &Thinkers; //Todo: get from level - if ((unsigned)statnum > MAX_STATNUM) { statnum = MAX_STATNUM; } Remove(); - Thinkers.Link(this, statnum); + Level->Thinkers.Link(this, statnum); } static void ChangeStatNum(DThinker *thinker, int statnum) @@ -771,7 +766,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(DThinker, ChangeStatNum, ChangeStatNum) { PARAM_SELF_PROLOGUE(DThinker); PARAM_INT(stat); - self->ChangeStatNum(stat); + ChangeStatNum(self, stat); return 0; } @@ -884,7 +879,7 @@ size_t DThinker::PropagateMark() // //========================================================================== -FThinkerIterator::FThinkerIterator (const PClass *type, int statnum) +FThinkerIterator::FThinkerIterator (FLevelLocals *l, const PClass *type, int statnum) : Level(l) { if ((unsigned)statnum > MAX_STATNUM) { @@ -897,8 +892,7 @@ FThinkerIterator::FThinkerIterator (const PClass *type, int statnum) m_SearchStats = false; } m_ParentType = type; - m_CurrThinker = Thinkers.Thinkers[m_Stat].GetHead(); - m_SearchingFresh = false; + Reinit(); } //========================================================================== @@ -907,7 +901,7 @@ FThinkerIterator::FThinkerIterator (const PClass *type, int statnum) // //========================================================================== -FThinkerIterator::FThinkerIterator (const PClass *type, int statnum, DThinker *prev) +FThinkerIterator::FThinkerIterator (FLevelLocals *l, const PClass *type, int statnum, DThinker *prev) : Level(l) { if ((unsigned)statnum > MAX_STATNUM) { @@ -939,7 +933,7 @@ FThinkerIterator::FThinkerIterator (const PClass *type, int statnum, DThinker *p void FThinkerIterator::Reinit () { - m_CurrThinker = Thinkers.Thinkers[m_Stat].GetHead(); + m_CurrThinker = Level->Thinkers.Thinkers[m_Stat].GetHead(); m_SearchingFresh = false; } @@ -980,7 +974,7 @@ DThinker *FThinkerIterator::Next (bool exact) } if ((m_SearchingFresh = !m_SearchingFresh)) { - m_CurrThinker = Thinkers.FreshThinkers[m_Stat].GetHead(); + m_CurrThinker = Level->Thinkers.FreshThinkers[m_Stat].GetHead(); } } while (m_SearchingFresh); if (m_SearchStats) @@ -991,7 +985,7 @@ DThinker *FThinkerIterator::Next (bool exact) m_Stat = STAT_FIRST_THINKING; } } - m_CurrThinker = Thinkers.Thinkers[m_Stat].GetHead(); + m_CurrThinker = Level->Thinkers.Thinkers[m_Stat].GetHead(); m_SearchingFresh = false; } while (m_SearchStats && m_Stat != STAT_FIRST_THINKING); return nullptr; diff --git a/src/dthinker.h b/src/dthinker.h index 5d322409c..26b4e06ac 100644 --- a/src/dthinker.h +++ b/src/dthinker.h @@ -131,14 +131,15 @@ class FThinkerIterator protected: const PClass *m_ParentType; private: + FLevelLocals *Level; DThinker *m_CurrThinker; uint8_t m_Stat; bool m_SearchStats; bool m_SearchingFresh; public: - FThinkerIterator (const PClass *type, int statnum=MAX_STATNUM+1); - FThinkerIterator (const PClass *type, int statnum, DThinker *prev); + FThinkerIterator (FLevelLocals *Level, const PClass *type, int statnum=MAX_STATNUM+1); + FThinkerIterator (FLevelLocals *Level, const PClass *type, int statnum, DThinker *prev); DThinker *Next (bool exact = false); void Reinit (); @@ -149,28 +150,19 @@ protected: template class TThinkerIterator : public FThinkerIterator { public: - TThinkerIterator (int statnum=MAX_STATNUM+1) : FThinkerIterator (RUNTIME_CLASS(T), statnum) + TThinkerIterator (FLevelLocals *Level, int statnum=MAX_STATNUM+1) : FThinkerIterator (Level, RUNTIME_CLASS(T), statnum) { } - TThinkerIterator (int statnum, DThinker *prev) : FThinkerIterator (RUNTIME_CLASS(T), statnum, prev) + TThinkerIterator (FLevelLocals *Level, int statnum, DThinker *prev) : FThinkerIterator (Level, RUNTIME_CLASS(T), statnum, prev) { } - TThinkerIterator (const PClass *subclass, int statnum=MAX_STATNUM+1) : FThinkerIterator(subclass, statnum) + TThinkerIterator (FLevelLocals *Level, const PClass *subclass, int statnum=MAX_STATNUM+1) : FThinkerIterator(Level, subclass, statnum) { } - TThinkerIterator (FName subclass, int statnum=MAX_STATNUM+1) : FThinkerIterator(PClass::FindClass(subclass), statnum) + TThinkerIterator (FLevelLocals *Level, FName subclass, int statnum=MAX_STATNUM+1) : FThinkerIterator(Level, PClass::FindClass(subclass), statnum) { } - TThinkerIterator (ENamedName subclass, int statnum=MAX_STATNUM+1) : FThinkerIterator(PClass::FindClass(subclass), statnum) - { - } - TThinkerIterator (FName subclass, int statnum, DThinker *prev) : FThinkerIterator(PClass::FindClass(subclass), statnum, prev) - { - } - TThinkerIterator (ENamedName subclass, int statnum, DThinker *prev) : FThinkerIterator(PClass::FindClass(subclass), statnum, prev) - { - } - TThinkerIterator (const char *subclass, int statnum=MAX_STATNUM+1) : FThinkerIterator(PClass::FindClass(subclass), statnum) + TThinkerIterator (FLevelLocals *Level, FName subclass, int statnum, DThinker *prev) : FThinkerIterator(Level, PClass::FindClass(subclass), statnum, prev) { } T *Next (bool exact = false) @@ -179,5 +171,5 @@ public: } }; -extern FThinkerCollection Thinkers; + #endif //__DTHINKER_H__ diff --git a/src/g_level.cpp b/src/g_level.cpp index 07e7df6d9..c3c26a03e 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -356,7 +356,7 @@ void G_NewInit () int i; // Destory all old player refrences that may still exist - TThinkerIterator it(NAME_PlayerPawn, STAT_TRAVELLING); + TThinkerIterator it(&level, NAME_PlayerPawn, STAT_TRAVELLING); AActor *pawn, *next; next = it.Next(); @@ -469,7 +469,7 @@ void G_InitNew (const char *mapname, bool bTitleLevel) UnlatchCVars (); G_VerifySkill(); UnlatchCVars (); - Thinkers.DestroyThinkersInList(STAT_STATIC); + level.Thinkers.DestroyThinkersInList(STAT_STATIC); if (paused) { @@ -2117,7 +2117,7 @@ void FLevelLocals::Mark() GC::Mark(BotInfo.firstthing); GC::Mark(BotInfo.body1); GC::Mark(BotInfo.body2); - + Thinkers.MarkRoots(); canvasTextureInfo.Mark(); for (auto &c : CorpseQueue) { diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 9ab21d52d..74011f9e1 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -269,12 +269,12 @@ public: } template TThinkerIterator GetThinkerIterator(FName subtype = NAME_None, int statnum = MAX_STATNUM+1) { - if (subtype == NAME_None) return TThinkerIterator(statnum); - else return TThinkerIterator(subtype, statnum); + if (subtype == NAME_None) return TThinkerIterator(this, statnum); + else return TThinkerIterator(this, subtype, statnum); } template TThinkerIterator GetThinkerIterator(FName subtype, int statnum, AActor *prev) { - return TThinkerIterator(subtype, statnum, prev); + return TThinkerIterator(this, subtype, statnum, prev); } FActorIterator GetActorIterator(int tid) { @@ -590,6 +590,7 @@ public: uint32_t InactiveParticles; TArray Particles; TArray ParticlesInSubsec; + FThinkerCollection Thinkers; TArray Scrolls; // NULL if no DScrollers in this level diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index d792b338f..d363e08c9 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -1013,7 +1013,7 @@ void FLevelLocals::Serialize(FSerializer &arc, bool hubload) if (arc.isReading()) { for (auto &sec : sectors) - { + { P_Recalculate3DFloors(&sec); } for (int i = 0; i < MAXPLAYERS; ++i) diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 01b84ed6d..8656507eb 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -253,6 +253,7 @@ void FLevelLocals::ClearPortals() void FLevelLocals::ClearLevelData() { + Thinkers.DestroyAllThinkers(); ClearAllSubsectorLinks(); // can't be done as part of the polyobj deletion process. total_monsters = total_items = total_secrets = @@ -349,8 +350,6 @@ void P_FreeLevelData () E_Shutdown(true); R_FreePastViewers(); - Thinkers.DestroyAllThinkers (); - level.ClearLevelData(); } @@ -574,7 +573,7 @@ void P_Init () static void P_Shutdown () { - Thinkers.DestroyThinkersInList(STAT_STATIC); + level.Thinkers.DestroyThinkersInList(STAT_STATIC); P_FreeLevelData (); // [ZZ] delete global event handlers E_Shutdown(false); diff --git a/src/p_tick.cpp b/src/p_tick.cpp index cfd6064f3..6b7b42b1c 100644 --- a/src/p_tick.cpp +++ b/src/p_tick.cpp @@ -151,7 +151,7 @@ void P_Ticker (void) E_WorldTick(); StatusBar->CallTick (); // [RH] moved this here level.Tick (); // [RH] let the level tick - Thinkers.RunThinkers(&level); + level.Thinkers.RunThinkers(&level); //if added by MC: Freeze mode. if (!level.isFrozen()) diff --git a/src/scripting/vmiterators.cpp b/src/scripting/vmiterators.cpp index 825dbef04..7e2ad47ad 100644 --- a/src/scripting/vmiterators.cpp +++ b/src/scripting/vmiterators.cpp @@ -41,8 +41,8 @@ class DThinkerIterator : public DObject, public FThinkerIterator DECLARE_ABSTRACT_CLASS(DThinkerIterator, DObject) public: - DThinkerIterator(PClass *cls, int statnum = MAX_STATNUM + 1) - : FThinkerIterator(cls, statnum) + DThinkerIterator(FLevelLocals *Level, PClass *cls, int statnum = MAX_STATNUM + 1) + : FThinkerIterator(Level, cls, statnum) { } }; @@ -51,7 +51,7 @@ IMPLEMENT_CLASS(DThinkerIterator, true, false); static DThinkerIterator *CreateThinkerIterator(PClass *type, int statnum) { - return Create(type, statnum); + return Create(&level, type, statnum); } DEFINE_ACTION_FUNCTION_NATIVE(DThinkerIterator, Create, CreateThinkerIterator) @@ -59,7 +59,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(DThinkerIterator, Create, CreateThinkerIterator) PARAM_PROLOGUE; PARAM_CLASS(type, DThinker); PARAM_INT(statnum); - ACTION_RETURN_OBJECT(Create(type, statnum)); + ACTION_RETURN_OBJECT(CreateThinkerIterator(type, statnum)); } static DThinker *NextThinker(DThinkerIterator *self, bool exact) From c18a0e7736360a025c52bc9e6d0ce9b67d3fb79d Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 30 Jan 2019 22:34:11 +0100 Subject: [PATCH 107/164] - replaced DWORD_MAX with UINT_MAX globally. This was the last remnant of ZDoom's old integer types. --- src/maploader/glnodes.cpp | 2 +- src/nodebuild.cpp | 54 +++++++++++++++++++-------------------- src/nodebuild_extract.cpp | 8 +++--- src/nodebuild_gl.cpp | 52 ++++++++++++++++++------------------- src/nodebuild_utility.cpp | 44 +++++++++++++++---------------- 5 files changed, 80 insertions(+), 80 deletions(-) diff --git a/src/maploader/glnodes.cpp b/src/maploader/glnodes.cpp index defd5e7b7..7d16eb92e 100644 --- a/src/maploader/glnodes.cpp +++ b/src/maploader/glnodes.cpp @@ -346,7 +346,7 @@ bool MapLoader::LoadGLSegs(FileReader &lump) segs[i].v2 = &Level->vertexes[checkGLVertex3(LittleLong(ml->v2))]; const uint32_t partner = LittleLong(ml->partner); - segs[i].PartnerSeg = DWORD_MAX == partner ? nullptr : &segs[partner]; + segs[i].PartnerSeg = UINT_MAX == partner ? nullptr : &segs[partner]; if(ml->linedef != 0xffff) // skip minisegs { diff --git a/src/nodebuild.cpp b/src/nodebuild.cpp index 81d841c1b..8955060ff 100644 --- a/src/nodebuild.cpp +++ b/src/nodebuild.cpp @@ -117,8 +117,8 @@ void FNodeBuilder::BuildTree () { fixed_t bbox[4]; - HackSeg = DWORD_MAX; - HackMate = DWORD_MAX; + HackSeg = UINT_MAX; + HackMate = UINT_MAX; CreateNode (0, Segs.Size(), bbox); CreateSubsectorsForReal (); } @@ -171,7 +171,7 @@ int FNodeBuilder::CreateSubsector (uint32_t set, fixed_t bbox[4]) D(Printf (PRINT_LOG, "Subsector from set %d\n", set)); - assert (set != DWORD_MAX); + assert (set != UINT_MAX); // We cannot actually create the subsector now because the node building // process might split a seg in this subsector (because all partner segs @@ -181,7 +181,7 @@ int FNodeBuilder::CreateSubsector (uint32_t set, fixed_t bbox[4]) ssnum = (int)SubsectorSets.Push (set); count = 0; - while (set != DWORD_MAX) + while (set != UINT_MAX) { AddSegToBBox (bbox, &Segs[set]); set = Segs[set].next; @@ -211,7 +211,7 @@ void FNodeBuilder::CreateSubsectorsForReal () uint32_t set = SubsectorSets[i]; uint32_t firstline = (uint32_t)SegList.Size(); - while (set != DWORD_MAX) + while (set != UINT_MAX) { USegPtr ptr; @@ -349,9 +349,9 @@ bool FNodeBuilder::CheckSubsector (uint32_t set, node_t &node, uint32_t &splitse } } seg = Segs[seg].next; - } while (seg != DWORD_MAX); + } while (seg != UINT_MAX); - if (seg == DWORD_MAX) + if (seg == UINT_MAX) { // It's a valid non-GL subsector, and probably a valid GL subsector too. if (GLNodes) { @@ -361,13 +361,13 @@ bool FNodeBuilder::CheckSubsector (uint32_t set, node_t &node, uint32_t &splitse } D(Printf(PRINT_LOG, "Need to synthesize a splitter for set %d on seg %d\n", set, seg)); - splitseg = DWORD_MAX; + splitseg = UINT_MAX; // This is a very simple and cheap "fix" for subsectors with segs // from multiple sectors, and it seems ZenNode does something // similar. It is the only technique I could find that makes the // "transparent water" in nb_bmtrk.wad work properly. - return ShoveSegBehind (set, node, seg, DWORD_MAX); + return ShoveSegBehind (set, node, seg, UINT_MAX); } // When creating GL nodes, we need to check for segs with the same start and @@ -378,7 +378,7 @@ bool FNodeBuilder::CheckSubsectorOverlappingSegs (uint32_t set, node_t &node, ui int v1, v2; uint32_t seg1, seg2; - for (seg1 = set; seg1 != DWORD_MAX; seg1 = Segs[seg1].next) + for (seg1 = set; seg1 != UINT_MAX; seg1 = Segs[seg1].next) { if (Segs[seg1].linedef == -1) { // Do not check minisegs. @@ -386,7 +386,7 @@ bool FNodeBuilder::CheckSubsectorOverlappingSegs (uint32_t set, node_t &node, ui } v1 = Segs[seg1].v1; v2 = Segs[seg1].v2; - for (seg2 = Segs[seg1].next; seg2 != DWORD_MAX; seg2 = Segs[seg2].next) + for (seg2 = Segs[seg1].next; seg2 != UINT_MAX; seg2 = Segs[seg2].next) { if (Segs[seg2].v1 == v1 && Segs[seg2].v2 == v2) { @@ -395,7 +395,7 @@ bool FNodeBuilder::CheckSubsectorOverlappingSegs (uint32_t set, node_t &node, ui swapvalues (seg1, seg2); } D(Printf(PRINT_LOG, "Need to synthesize a splitter for set %d on seg %d (ov)\n", set, seg2)); - splitseg = DWORD_MAX; + splitseg = UINT_MAX; return ShoveSegBehind (set, node, seg2, seg1); } @@ -410,7 +410,7 @@ bool FNodeBuilder::CheckSubsectorOverlappingSegs (uint32_t set, node_t &node, ui // set, all the other segs will be in front of the splitter. Since // the splitter is formed from this seg, the back of the splitter // will have a one-dimensional subsector. SplitSegs() will add one -// or two new minisegs to close it: If mate is DWORD_MAX, then a +// or two new minisegs to close it: If mate is UINT_MAX, then a // new seg is created to replace this one on the front of the // splitter. Otherwise, mate takes its place. In either case, the // seg in front of the splitter is partnered with a new miniseg on @@ -447,7 +447,7 @@ int FNodeBuilder::SelectSplitter (uint32_t set, node_t &node, uint32_t &splitseg bool nosplitters = false; bestvalue = 0; - bestseg = DWORD_MAX; + bestseg = UINT_MAX; seg = set; stepleft = 0; @@ -456,7 +456,7 @@ int FNodeBuilder::SelectSplitter (uint32_t set, node_t &node, uint32_t &splitseg D(Printf (PRINT_LOG, "Processing set %d\n", set)); - while (seg != DWORD_MAX) + while (seg != UINT_MAX) { FPrivSeg *pseg = &Segs[seg]; @@ -495,7 +495,7 @@ int FNodeBuilder::SelectSplitter (uint32_t set, node_t &node, uint32_t &splitseg seg = pseg->next; } - if (bestseg == DWORD_MAX) + if (bestseg == UINT_MAX) { // No lines split any others into two sets, so this is a convex region. D(Printf (PRINT_LOG, "set %d, step %d, nosplit %d has no good splitter (%d)\n", set, step, nosplit, nosplitters)); return nosplitters ? -1 : 0; @@ -532,7 +532,7 @@ int FNodeBuilder::Heuristic (node_t &node, uint32_t set, bool honorNoSplit) Touched.Clear (); Colinear.Clear (); - while (i != DWORD_MAX) + while (i != UINT_MAX) { const FPrivSeg *test = &Segs[i]; @@ -756,13 +756,13 @@ void FNodeBuilder::SplitSegs (uint32_t set, node_t &node, uint32_t splitseg, uin { unsigned int _count0 = 0; unsigned int _count1 = 0; - outset0 = DWORD_MAX; - outset1 = DWORD_MAX; + outset0 = UINT_MAX; + outset1 = UINT_MAX; Events.DeleteAll (); SplitSharers.Clear (); - while (set != DWORD_MAX) + while (set != UINT_MAX) { bool hack; FPrivSeg *seg = &Segs[set]; @@ -772,7 +772,7 @@ void FNodeBuilder::SplitSegs (uint32_t set, node_t &node, uint32_t splitseg, uin if (HackSeg == set) { - HackSeg = DWORD_MAX; + HackSeg = UINT_MAX; side = 1; sidev[0] = sidev[1] = 0; hack = true; @@ -822,7 +822,7 @@ void FNodeBuilder::SplitSegs (uint32_t set, node_t &node, uint32_t splitseg, uin _count1++; // Also split the seg on the back side - if (Segs[set].partner != DWORD_MAX) + if (Segs[set].partner != UINT_MAX) { int partner1 = Segs[set].partner; int partner2 = SplitSeg(partner1, vertnum, sidev[1]); @@ -884,8 +884,8 @@ void FNodeBuilder::SplitSegs (uint32_t set, node_t &node, uint32_t splitseg, uin { uint32_t newback, newfront; - newback = AddMiniseg (seg->v2, seg->v1, DWORD_MAX, set, splitseg); - if (HackMate == DWORD_MAX) + newback = AddMiniseg (seg->v2, seg->v1, UINT_MAX, set, splitseg); + if (HackMate == UINT_MAX) { newfront = AddMiniseg (Segs[set].v1, Segs[set].v2, newback, set, splitseg); Segs[newfront].next = outset0; @@ -996,7 +996,7 @@ void FNodeBuilder::RemoveSegFromVert1 (uint32_t segnum, int vertnum) uint32_t prev, curr; prev = 0; curr = v->segs; - while (curr != DWORD_MAX && curr != segnum) + while (curr != UINT_MAX && curr != segnum) { prev = curr; curr = Segs[curr].nextforvert; @@ -1021,7 +1021,7 @@ void FNodeBuilder::RemoveSegFromVert2 (uint32_t segnum, int vertnum) uint32_t prev, curr; prev = 0; curr = v->segs2; - while (curr != DWORD_MAX && curr != segnum) + while (curr != UINT_MAX && curr != segnum) { prev = curr; curr = Segs[curr].nextforvert2; @@ -1059,7 +1059,7 @@ double FNodeBuilder::InterceptVector (const node_t &splitter, const FPrivSeg &se void FNodeBuilder::PrintSet (int l, uint32_t set) { Printf (PRINT_LOG, "set %d:\n", l); - for (; set != DWORD_MAX; set = Segs[set].next) + for (; set != UINT_MAX; set = Segs[set].next) { Printf (PRINT_LOG, "\t%u(%d)%c%d(%d,%d)-%d(%d,%d)\n", set, Segs[set].frontsector->sectornum, Segs[set].linedef == -1 ? '+' : ':', diff --git a/src/nodebuild_extract.cpp b/src/nodebuild_extract.cpp index 441275dc6..9714a52c6 100644 --- a/src/nodebuild_extract.cpp +++ b/src/nodebuild_extract.cpp @@ -122,10 +122,10 @@ void FNodeBuilder::Extract (FLevelLocals &theLevel) { outSegs[i] = *(seg_t *)&segs[i]; - if (segs[i].Partner != DWORD_MAX) + if (segs[i].Partner != UINT_MAX) { const uint32_t storedseg = Segs[segs[i].Partner].storedseg; - outSegs[i].PartnerSeg = DWORD_MAX == storedseg ? nullptr : &outSegs[storedseg]; + outSegs[i].PartnerSeg = UINT_MAX == storedseg ? nullptr : &outSegs[storedseg]; } else { @@ -330,7 +330,7 @@ int FNodeBuilder::CloseSubsector (TArray &segs, int subsector, vertex_t { angle_t bestdiff = ANGLE_MAX; FPrivSeg *bestseg = NULL; - uint32_t bestj = DWORD_MAX; + uint32_t bestj = UINT_MAX; j = first; do { @@ -526,6 +526,6 @@ void FNodeBuilder::PushConnectingGLSeg (int subsector, TArray &segs, ve newseg.frontsector = NULL; newseg.linedef = NULL; newseg.sidedef = NULL; - newseg.Partner = DWORD_MAX; + newseg.Partner = UINT_MAX; segs.Push (newseg); } diff --git a/src/nodebuild_gl.cpp b/src/nodebuild_gl.cpp index db9d716ac..d2b987e04 100644 --- a/src/nodebuild_gl.cpp +++ b/src/nodebuild_gl.cpp @@ -56,7 +56,7 @@ double FNodeBuilder::AddIntersection (const node_t &node, int vertex) { static const FEventInfo defaultInfo = { - -1, DWORD_MAX + -1, UINT_MAX }; // Calculate signed distance of intersection vertex from start of splitter. @@ -142,7 +142,7 @@ void FNodeBuilder::FixSplitSharers (const node_t &node) Segs[seg].next = newseg; uint32_t partner = Segs[seg].partner; - if (partner != DWORD_MAX) + if (partner != UINT_MAX) { int endpartner = SplitSeg (partner, event->Info.Vertex, 1); @@ -184,13 +184,13 @@ void FNodeBuilder::AddMinisegs (const node_t &node, uint32_t splitseg, uint32_t // are unclosed, but at least we won't be needlessly creating subsectors in void space. // Unclosed subsectors can be closed trivially once the BSP tree is complete. - if ((fseg1 = CheckLoopStart (node.dx, node.dy, prev->Info.Vertex, event->Info.Vertex)) != DWORD_MAX && - (bseg1 = CheckLoopStart (-node.dx, -node.dy, event->Info.Vertex, prev->Info.Vertex)) != DWORD_MAX && - (fseg2 = CheckLoopEnd (node.dx, node.dy, event->Info.Vertex)) != DWORD_MAX && - (bseg2 = CheckLoopEnd (-node.dx, -node.dy, prev->Info.Vertex)) != DWORD_MAX) + if ((fseg1 = CheckLoopStart (node.dx, node.dy, prev->Info.Vertex, event->Info.Vertex)) != UINT_MAX && + (bseg1 = CheckLoopStart (-node.dx, -node.dy, event->Info.Vertex, prev->Info.Vertex)) != UINT_MAX && + (fseg2 = CheckLoopEnd (node.dx, node.dy, event->Info.Vertex)) != UINT_MAX && + (bseg2 = CheckLoopEnd (-node.dx, -node.dy, prev->Info.Vertex)) != UINT_MAX) { // Add miniseg on the front side - fnseg = AddMiniseg (prev->Info.Vertex, event->Info.Vertex, DWORD_MAX, fseg1, splitseg); + fnseg = AddMiniseg (prev->Info.Vertex, event->Info.Vertex, UINT_MAX, fseg1, splitseg); Segs[fnseg].next = fset; fset = fnseg; @@ -243,14 +243,14 @@ uint32_t FNodeBuilder::AddMiniseg (int v1, int v2, uint32_t partner, uint32_t se newseg.sidedef = NO_SIDE; newseg.linedef = -1; newseg.loopnum = 0; - newseg.next = DWORD_MAX; + newseg.next = UINT_MAX; newseg.planefront = true; newseg.hashnext = NULL; - newseg.storedseg = DWORD_MAX; + newseg.storedseg = UINT_MAX; newseg.frontsector = NULL; newseg.backsector = NULL; - if (splitseg != DWORD_MAX) + if (splitseg != UINT_MAX) { newseg.planenum = Segs[splitseg].planenum; } @@ -264,16 +264,16 @@ uint32_t FNodeBuilder::AddMiniseg (int v1, int v2, uint32_t partner, uint32_t se newseg.nextforvert = Vertices[v1].segs; newseg.nextforvert2 = Vertices[v2].segs2; newseg.next = seg->next; - if (partner != DWORD_MAX) + if (partner != UINT_MAX) { newseg.partner = partner; } else { - newseg.partner = DWORD_MAX; + newseg.partner = UINT_MAX; } nseg = Segs.Push (newseg); - if (newseg.partner != DWORD_MAX) + if (newseg.partner != UINT_MAX) { Segs[partner].partner = nseg; } @@ -295,8 +295,8 @@ uint32_t FNodeBuilder::CheckLoopStart (fixed_t dx, fixed_t dy, int vertex, int v // to the splitter. segnum = v->segs2; bestang = ANGLE_MAX; - bestseg = DWORD_MAX; - while (segnum != DWORD_MAX) + bestseg = UINT_MAX; + while (segnum != UINT_MAX) { FPrivSeg *seg = &Segs[segnum]; angle_t segAngle = PointToAngle (Vertices[seg->v1].x - v->x, Vertices[seg->v1].y - v->y); @@ -317,25 +317,25 @@ uint32_t FNodeBuilder::CheckLoopStart (fixed_t dx, fixed_t dy, int vertex, int v } segnum = seg->nextforvert2; } - if (bestseg == DWORD_MAX) + if (bestseg == UINT_MAX) { - return DWORD_MAX; + return UINT_MAX; } // Now make sure there are no segs starting at this vertex that form // an even smaller angle to the splitter. segnum = v->segs; - while (segnum != DWORD_MAX) + while (segnum != UINT_MAX) { FPrivSeg *seg = &Segs[segnum]; if (seg->v2 == vertex2) { - return DWORD_MAX; + return UINT_MAX; } angle_t segAngle = PointToAngle (Vertices[seg->v2].x - v->x, Vertices[seg->v2].y - v->y); angle_t diff = splitAngle - segAngle; if (diff < bestang && seg->partner != bestseg) { - return DWORD_MAX; + return UINT_MAX; } segnum = seg->nextforvert; } @@ -354,8 +354,8 @@ uint32_t FNodeBuilder::CheckLoopEnd (fixed_t dx, fixed_t dy, int vertex) // to the splitter. segnum = v->segs; bestang = ANGLE_MAX; - bestseg = DWORD_MAX; - while (segnum != DWORD_MAX) + bestseg = UINT_MAX; + while (segnum != UINT_MAX) { FPrivSeg *seg = &Segs[segnum]; angle_t segAngle = PointToAngle (Vertices[seg->v2].x - v->x, Vertices[seg->v2].y - v->y); @@ -376,21 +376,21 @@ uint32_t FNodeBuilder::CheckLoopEnd (fixed_t dx, fixed_t dy, int vertex) } segnum = seg->nextforvert; } - if (bestseg == DWORD_MAX) + if (bestseg == UINT_MAX) { - return DWORD_MAX; + return UINT_MAX; } // Now make sure there are no segs ending at this vertex that form // an even smaller angle to the splitter. segnum = v->segs2; - while (segnum != DWORD_MAX) + while (segnum != UINT_MAX) { FPrivSeg *seg = &Segs[segnum]; angle_t segAngle = PointToAngle (Vertices[seg->v1].x - v->x, Vertices[seg->v1].y - v->y); angle_t diff = segAngle - splitAngle; if (diff < bestang && seg->partner != bestseg) { - return DWORD_MAX; + return UINT_MAX; } segnum = seg->nextforvert2; } diff --git a/src/nodebuild_utility.cpp b/src/nodebuild_utility.cpp index a6e724ed4..0735c299f 100644 --- a/src/nodebuild_utility.cpp +++ b/src/nodebuild_utility.cpp @@ -152,13 +152,13 @@ int FNodeBuilder::CreateSeg (int linenum, int sidenum) FPrivSeg seg; int segnum; - seg.next = DWORD_MAX; + seg.next = UINT_MAX; seg.loopnum = 0; - seg.partner = DWORD_MAX; + seg.partner = UINT_MAX; seg.hashnext = NULL; seg.planefront = false; - seg.planenum = DWORD_MAX; - seg.storedseg = DWORD_MAX; + seg.planenum = UINT_MAX; + seg.storedseg = UINT_MAX; if (sidenum == 0) { // front @@ -202,13 +202,13 @@ void FNodeBuilder::AddSegs(seg_t *segs, int numsegs) FPrivVert vert; int segnum; - seg.next = DWORD_MAX; + seg.next = UINT_MAX; seg.loopnum = 0; - seg.partner = DWORD_MAX; + seg.partner = UINT_MAX; seg.hashnext = NULL; seg.planefront = false; - seg.planenum = DWORD_MAX; - seg.storedseg = DWORD_MAX; + seg.planenum = UINT_MAX; + seg.storedseg = UINT_MAX; seg.frontsector = segs[i].frontsector; seg.backsector = segs[i].backsector; @@ -239,13 +239,13 @@ void FNodeBuilder::AddPolySegs(FPolySeg *segs, int numsegs) FPrivVert vert; int segnum; - seg.next = DWORD_MAX; + seg.next = UINT_MAX; seg.loopnum = 0; - seg.partner = DWORD_MAX; + seg.partner = UINT_MAX; seg.hashnext = NULL; seg.planefront = false; - seg.planenum = DWORD_MAX; - seg.storedseg = DWORD_MAX; + seg.planenum = UINT_MAX; + seg.storedseg = UINT_MAX; side_t *side = segs[i].wall; assert(side != NULL); @@ -286,7 +286,7 @@ void FNodeBuilder::GroupSegPlanes () seg->hashnext = NULL; } - Segs[Segs.Size()-1].next = DWORD_MAX; + Segs[Segs.Size()-1].next = UINT_MAX; for (i = planenum = 0; i < (int)Segs.Size(); ++i) { @@ -379,7 +379,7 @@ void FNodeBuilder::GroupSegPlanesSimple() pline->dx = Vertices[seg->v2].x - Vertices[seg->v1].x; pline->dy = Vertices[seg->v2].y - Vertices[seg->v1].y; } - Segs.Last().next = DWORD_MAX; + Segs.Last().next = UINT_MAX; PlaneChecked.Reserve((Segs.Size() + 7) / 8); } @@ -497,13 +497,13 @@ int FNodeBuilder::MarkLoop (uint32_t firstseg, int loopnum) Vertices[s1->v1].x>>16, Vertices[s1->v1].y>>16, Vertices[s1->v2].x>>16, Vertices[s1->v2].y>>16)); - uint32_t bestseg = DWORD_MAX; + uint32_t bestseg = UINT_MAX; uint32_t tryseg = Vertices[s1->v2].segs; angle_t bestang = ANGLE_MAX; angle_t ang1 = PointToAngle (Vertices[s1->v2].x - Vertices[s1->v1].x, Vertices[s1->v2].y - Vertices[s1->v1].y); - while (tryseg != DWORD_MAX) + while (tryseg != UINT_MAX) { FPrivSeg *s2 = &Segs[tryseg]; @@ -523,7 +523,7 @@ int FNodeBuilder::MarkLoop (uint32_t firstseg, int loopnum) } seg = bestseg; - } while (seg != DWORD_MAX && Segs[seg].loopnum == 0); + } while (seg != UINT_MAX && Segs[seg].loopnum == 0); return loopnum + 1; } @@ -563,7 +563,7 @@ bool FNodeBuilder::GetPolyExtents (int polynum, fixed_t bbox[4]) vert = Segs[i].v2; i = Vertices[vert].segs; count++; // to prevent endless loops. Stop when this reaches the number of segs. - } while (i != DWORD_MAX && (Vertices[vert].x != start.fixX() || Vertices[vert].y != start.fixY()) && count < Segs.Size()); + } while (i != UINT_MAX && (Vertices[vert].x != start.fixX() || Vertices[vert].y != start.fixY()) && count < Segs.Size()); return true; } @@ -691,8 +691,8 @@ int FNodeBuilder::FVertexMap::InsertVertex (FNodeBuilder::FPrivVert &vert) { int vertnum; - vert.segs = DWORD_MAX; - vert.segs2 = DWORD_MAX; + vert.segs = UINT_MAX; + vert.segs2 = UINT_MAX; vertnum = (int)MyBuilder.Vertices.Push (vert); // If a vertex is near a block boundary, then it will be inserted on @@ -772,7 +772,7 @@ int FNodeBuilder::FVertexMapSimple::SelectVertexClose(FNodeBuilder::FPrivVert &v int FNodeBuilder::FVertexMapSimple::InsertVertex (FNodeBuilder::FPrivVert &vert) { - vert.segs = DWORD_MAX; - vert.segs2 = DWORD_MAX; + vert.segs = UINT_MAX; + vert.segs2 = UINT_MAX; return (int)MyBuilder.Vertices.Push (vert); } From fa3312e2a99bd01601507f5c8772d8c6e20be4bb Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 31 Jan 2019 00:28:43 +0100 Subject: [PATCH 108/164] - moved gamestate_t to g_game.h. This made reviewing the code for accessing the global state hard, because the doomdef.h contains mainly constants, this particular item was the only thing in there that represents actual engine state. --- src/am_map.cpp | 1 + src/b_bot.cpp | 2 +- src/c_cvars.cpp | 2 +- src/c_dispatch.cpp | 2 +- src/ct_chat.cpp | 2 +- src/doomdef.h | 27 ------------------------- src/events.cpp | 1 + src/g_game.h | 27 +++++++++++++++++++++++++ src/g_statusbar/shared_sbar.cpp | 1 + src/hu_scores.cpp | 1 + src/intermission/intermission.cpp | 2 +- src/intermission/intermission.h | 1 + src/intermission/intermission_parse.cpp | 2 +- src/p_effect.cpp | 1 + src/p_tick.cpp | 1 + src/p_user.cpp | 1 + src/r_utility.cpp | 1 + src/s_sound.cpp | 1 + src/win32/i_main.cpp | 2 +- src/win32/i_mouse.cpp | 2 +- 20 files changed, 45 insertions(+), 35 deletions(-) diff --git a/src/am_map.cpp b/src/am_map.cpp index 54e769883..4a5520a9e 100644 --- a/src/am_map.cpp +++ b/src/am_map.cpp @@ -46,6 +46,7 @@ #include "sbar.h" #include "d_player.h" #include "p_blockmap.h" +#include "g_game.h" #include "m_cheat.h" #include "c_dispatch.h" diff --git a/src/b_bot.cpp b/src/b_bot.cpp index 39067dfa9..54e8991c4 100644 --- a/src/b_bot.cpp +++ b/src/b_bot.cpp @@ -40,7 +40,7 @@ #include "c_cvars.h" #include "c_dispatch.h" #include "b_bot.h" -#include "doomstat.h" +#include "g_game.h" #include "p_local.h" #include "cmdlib.h" #include "teaminfo.h" diff --git a/src/c_cvars.cpp b/src/c_cvars.cpp index 0345a7bd1..667e811a0 100644 --- a/src/c_cvars.cpp +++ b/src/c_cvars.cpp @@ -40,7 +40,7 @@ #include "c_console.h" #include "c_dispatch.h" -#include "doomstat.h" +#include "g_game.h" #include "d_player.h" #include "d_netinf.h" diff --git a/src/c_dispatch.cpp b/src/c_dispatch.cpp index feccd2d8b..127f5f2f6 100644 --- a/src/c_dispatch.cpp +++ b/src/c_dispatch.cpp @@ -45,7 +45,7 @@ #include "c_console.h" #include "c_dispatch.h" #include "m_argv.h" -#include "doomstat.h" +#include "g_game.h" #include "d_player.h" #include "configfile.h" #include "v_text.h" diff --git a/src/ct_chat.cpp b/src/ct_chat.cpp index ec3c4f4e2..5a8878eb2 100644 --- a/src/ct_chat.cpp +++ b/src/ct_chat.cpp @@ -27,7 +27,7 @@ #include "m_swap.h" #include "hu_stuff.h" #include "s_sound.h" -#include "doomstat.h" +#include "g_game.h" #include "st_stuff.h" #include "c_console.h" #include "c_dispatch.h" diff --git a/src/doomdef.h b/src/doomdef.h index b324fa90f..a8f0250d5 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -71,33 +71,6 @@ enum }; -// The current state of the game: whether we are -// playing, gazing at the intermission screen, -// the game final animation, or a demo. -enum gamestate_t : int -{ - GS_LEVEL, - GS_INTERMISSION, - GS_FINALE, - GS_DEMOSCREEN, - GS_FULLCONSOLE, // [RH] Fullscreen console - GS_HIDECONSOLE, // [RH] The menu just did something that should hide fs console - GS_STARTUP, // [RH] Console is fullscreen, and game is just starting - GS_TITLELEVEL, // [RH] A combination of GS_LEVEL and GS_DEMOSCREEN - - GS_FORCEWIPE = -1, - GS_FORCEWIPEFADE = -2, - GS_FORCEWIPEBURN = -3, - GS_FORCEWIPEMELT = -4 -}; - -extern gamestate_t gamestate; - -// wipegamestate can be set to -1 -// to force a wipe on the next draw -extern gamestate_t wipegamestate; - - typedef float skill_t; /* diff --git a/src/events.cpp b/src/events.cpp index e85706a85..74afb1b67 100755 --- a/src/events.cpp +++ b/src/events.cpp @@ -39,6 +39,7 @@ #include "actor.h" #include "c_dispatch.h" #include "d_net.h" +#include "g_game.h" #include "info.h" DStaticEventHandler* E_FirstEventHandler = nullptr; diff --git a/src/g_game.h b/src/g_game.h index 96ca6d8e2..a21c80cc6 100644 --- a/src/g_game.h +++ b/src/g_game.h @@ -32,6 +32,33 @@ struct event_t; #include "dobjgc.h" +// The current state of the game: whether we are +// playing, gazing at the intermission screen, +// the game final animation, or a demo. +enum gamestate_t : int +{ + GS_LEVEL, + GS_INTERMISSION, + GS_FINALE, + GS_DEMOSCREEN, + GS_FULLCONSOLE, // [RH] Fullscreen console + GS_HIDECONSOLE, // [RH] The menu just did something that should hide fs console + GS_STARTUP, // [RH] Console is fullscreen, and game is just starting + GS_TITLELEVEL, // [RH] A combination of GS_LEVEL and GS_DEMOSCREEN + + GS_FORCEWIPE = -1, + GS_FORCEWIPEFADE = -2, + GS_FORCEWIPEBURN = -3, + GS_FORCEWIPEMELT = -4 +}; + +extern gamestate_t gamestate; + +// wipegamestate can be set to -1 +// to force a wipe on the next draw +extern gamestate_t wipegamestate; + + class AActor; struct FLevelLocals; diff --git a/src/g_statusbar/shared_sbar.cpp b/src/g_statusbar/shared_sbar.cpp index 6a17fda2f..2c012c81d 100644 --- a/src/g_statusbar/shared_sbar.cpp +++ b/src/g_statusbar/shared_sbar.cpp @@ -56,6 +56,7 @@ #include "p_acs.h" #include "sbarinfo.h" #include "events.h" +#include "g_game.h" #include "../version.h" diff --git a/src/hu_scores.cpp b/src/hu_scores.cpp index ceddaca23..290621884 100644 --- a/src/hu_scores.cpp +++ b/src/hu_scores.cpp @@ -49,6 +49,7 @@ #include "d_net.h" #include "c_dispatch.h" #include "g_levellocals.h" +#include "g_game.h" #include "sbar.h" // MACROS ------------------------------------------------------------------ diff --git a/src/intermission/intermission.cpp b/src/intermission/intermission.cpp index 2c014c78b..2d395a48e 100644 --- a/src/intermission/intermission.cpp +++ b/src/intermission/intermission.cpp @@ -33,7 +33,7 @@ */ #include "doomtype.h" -#include "doomstat.h" +#include "g_game.h" #include "d_event.h" #include "w_wad.h" #include "gi.h" diff --git a/src/intermission/intermission.h b/src/intermission/intermission.h index f159ebb7a..435b38ed6 100644 --- a/src/intermission/intermission.h +++ b/src/intermission/intermission.h @@ -7,6 +7,7 @@ #include "textures/textures.h" #include "s_sound.h" #include "v_font.h" +#include "g_game.h" struct event_t; diff --git a/src/intermission/intermission_parse.cpp b/src/intermission/intermission_parse.cpp index c0fa4a337..50fd050a2 100644 --- a/src/intermission/intermission_parse.cpp +++ b/src/intermission/intermission_parse.cpp @@ -37,7 +37,7 @@ #include "intermission/intermission.h" #include "g_level.h" #include "w_wad.h" - + static void ReplaceIntermission(FName intname,FIntermissionDescriptor *desc) { diff --git a/src/p_effect.cpp b/src/p_effect.cpp index ce93fcdea..689191e5b 100644 --- a/src/p_effect.cpp +++ b/src/p_effect.cpp @@ -48,6 +48,7 @@ #include "g_levellocals.h" #include "vm.h" #include "actorinlines.h" +#include "g_game.h" CVAR (Int, cl_rockettrails, 1, CVAR_ARCHIVE); CVAR (Bool, r_rail_smartspiral, 0, CVAR_ARCHIVE); diff --git a/src/p_tick.cpp b/src/p_tick.cpp index 6b7b42b1c..8d1b7481d 100644 --- a/src/p_tick.cpp +++ b/src/p_tick.cpp @@ -37,6 +37,7 @@ #include "g_levellocals.h" #include "events.h" #include "actorinlines.h" +#include "g_game.h" extern gamestate_t wipegamestate; extern uint8_t globalfreeze, globalchangefreeze; diff --git a/src/p_user.cpp b/src/p_user.cpp index d4e20a79f..4fb9a0f6d 100644 --- a/src/p_user.cpp +++ b/src/p_user.cpp @@ -89,6 +89,7 @@ #include "actorinlines.h" #include "p_acs.h" #include "events.h" +#include "g_game.h" static FRandom pr_skullpop ("SkullPop"); diff --git a/src/r_utility.cpp b/src/r_utility.cpp index e44ca7c4c..ebe1e9ef4 100644 --- a/src/r_utility.cpp +++ b/src/r_utility.cpp @@ -62,6 +62,7 @@ #include "vm.h" #include "i_time.h" #include "actorinlines.h" +#include "g_game.h" // EXTERNAL DATA DECLARATIONS ---------------------------------------------- diff --git a/src/s_sound.cpp b/src/s_sound.cpp index fd609cabe..7bcff4d67 100644 --- a/src/s_sound.cpp +++ b/src/s_sound.cpp @@ -82,6 +82,7 @@ #include "d_player.h" #include "g_levellocals.h" #include "vm.h" +#include "g_game.h" // MACROS ------------------------------------------------------------------ diff --git a/src/win32/i_main.cpp b/src/win32/i_main.cpp index 878ba29a1..40115490c 100644 --- a/src/win32/i_main.cpp +++ b/src/win32/i_main.cpp @@ -67,7 +67,7 @@ #include "i_input.h" #include "w_wad.h" #include "cmdlib.h" -#include "doomstat.h" +#include "g_game.h" #include "r_utility.h" #include "g_levellocals.h" #include "s_sound.h" diff --git a/src/win32/i_mouse.cpp b/src/win32/i_mouse.cpp index 00103d746..749940824 100644 --- a/src/win32/i_mouse.cpp +++ b/src/win32/i_mouse.cpp @@ -42,7 +42,7 @@ #include "i_input.h" #include "d_event.h" #include "d_gui.h" -#include "doomstat.h" +#include "g_game.h" #include "hardware.h" #include "rawinput.h" #include "menu/menu.h" From 18b8a03f058190b009d51b81f1835c7a4624d384 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 31 Jan 2019 01:23:06 +0100 Subject: [PATCH 109/164] - cleaned up the header list in maploader.cpp. --- src/maploader/maploader.cpp | 76 +++++++++++-------------------------- src/maploader/maploader.h | 4 +- 2 files changed, 26 insertions(+), 54 deletions(-) diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index ca141bb01..8c65bdc98 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -59,60 +59,30 @@ #include - -#include "templates.h" -#include "d_player.h" -#include "m_argv.h" -#include "g_game.h" -#include "w_wad.h" -#include "p_local.h" -#include "p_effect.h" -#include "p_terrain.h" -#include "nodebuild.h" -#include "p_lnspec.h" -#include "c_console.h" -#include "p_acs.h" -#include "announcer.h" -#include "wi_stuff.h" -#include "doomerrors.h" -#include "gi.h" -#include "p_conversation.h" -#include "a_keys.h" -#include "s_sndseq.h" -#include "sbar.h" -#include "p_setup.h" -#include "r_data/r_interpolate.h" -#include "r_sky.h" -#include "cmdlib.h" -#include "md5.h" -#include "po_man.h" -#include "r_renderer.h" -#include "p_blockmap.h" -#include "r_utility.h" -#include "p_spec.h" -#include "g_levellocals.h" -#include "c_dispatch.h" -#include "a_dynlight.h" -#include "events.h" -#include "p_destructible.h" -#include "types.h" -#include "i_time.h" -#include "scripting/vm/vm.h" -#include "hwrenderer/data/flatvertices.h" -#include "fragglescript/t_fs.h" #include "maploader.h" +#include "c_cvars.h" +#include "actor.h" +#include "g_levellocals.h" +#include "p_lnspec.h" +#include "i_system.h" +#include "v_text.h" +#include "p_setup.h" +#include "gi.h" +#include "doomerrors.h" +#include "types.h" +#include "w_wad.h" +#include "p_conversation.h" +#include "v_video.h" +#include "i_time.h" +#include "m_argv.h" +#include "fragglescript/t_fs.h" +#include "swrenderer/r_swrenderer.h" +#include "hwrenderer/data/flatvertices.h" - -void PO_Init(); - -#define MISSING_TEXTURE_WARN_LIMIT 20 - -void BloodCrypt (void *data, int key, int len); -void P_ClearUDMFKeys(); -void InitRenderInfo(); - - -EXTERN_CVAR(Bool, am_textured) +enum +{ + MISSING_TEXTURE_WARN_LIMIT = 20 +}; CVAR (Bool, genblockmap, false, CVAR_SERVERINFO|CVAR_GLOBALCONFIG); CVAR (Bool, gennodes, false, CVAR_SERVERINFO|CVAR_GLOBALCONFIG); @@ -203,7 +173,7 @@ void MapLoader::SetTexture (side_t *side, int position, const char *name, FMissi { if (Level->lines[i].sidedef[j] == side) { - Printf(TEXTCOLOR_RED"Unknown %s texture '" + Printf(TEXTCOLOR_RED "Unknown %s texture '" TEXTCOLOR_ORANGE "%s" TEXTCOLOR_RED "' on %s side of linedef %d\n", positionnames[position], name, sidenames[j], i); diff --git a/src/maploader/maploader.h b/src/maploader/maploader.h index ba2f192bd..24de34184 100644 --- a/src/maploader/maploader.h +++ b/src/maploader/maploader.h @@ -1,7 +1,9 @@ #pragma once #include "nodebuild.h" -#include "p_spec.h" +#include "g_levellocals.h" + +class FileReader; struct EDMapthing { From 0f2938089d9f2b518455b17206c6eb630673b9c5 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 31 Jan 2019 02:05:16 +0100 Subject: [PATCH 110/164] - started cleaning up the contents of the g_shared directory, starting with a_dynlight.cpp This is supposed to be come the place where all pure play code should be placed, but for that all CVARs and CCMDs and other things that do not directly handle play data should be taken out to make code reviewing easier. These now get collected in two separate files, g_cvars.cpp and g_dumpinfo.cpp respectively. The sole ZScript property in here has also been moved - to thingdef_properties.cpp. --- src/CMakeLists.txt | 2 + src/c_console.h | 1 + src/d_main.cpp | 1 + src/g_cvars.cpp | 48 +++++++++++++ src/g_cvars.h | 9 +++ src/g_dumpinfo.cpp | 100 ++++++++++++++++++++++++++ src/g_shared/a_dynlight.cpp | 91 +---------------------- src/g_shared/a_dynlight.h | 3 - src/hwrenderer/utility/hw_cvars.h | 4 +- src/polyrenderer/scene/poly_model.cpp | 2 +- src/scripting/thingdef_properties.cpp | 19 +++++ 11 files changed, 185 insertions(+), 95 deletions(-) create mode 100644 src/g_cvars.cpp create mode 100644 src/g_cvars.h create mode 100644 src/g_dumpinfo.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6e71eaa73..31b85960c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -911,7 +911,9 @@ set (PCH_SOURCES f_wipe.cpp files.cpp files_decompress.cpp + g_cvars.cpp g_doomedmap.cpp + g_dumpinfo.cpp g_game.cpp g_hub.cpp g_level.cpp diff --git a/src/c_console.h b/src/c_console.h index 9e563b3ef..39c16c9bb 100644 --- a/src/c_console.h +++ b/src/c_console.h @@ -65,6 +65,7 @@ void C_Ticker (void); void AddToConsole (int printlevel, const char *string); int PrintString (int printlevel, const char *string); +int PrintStringHigh (const char *string); int VPrintf (int printlevel, const char *format, va_list parms) GCCFORMAT(2); void C_DrawConsole (); diff --git a/src/d_main.cpp b/src/d_main.cpp index ef9c18e11..b04fc33e6 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -99,6 +99,7 @@ #include "events.h" #include "vm.h" #include "types.h" +#include "g_cvars.h" #include "r_data/r_vanillatrans.h" EXTERN_CVAR(Bool, hud_althud) diff --git a/src/g_cvars.cpp b/src/g_cvars.cpp new file mode 100644 index 000000000..cb26743bf --- /dev/null +++ b/src/g_cvars.cpp @@ -0,0 +1,48 @@ +/* + ** g_cvars.cpp + ** collects all the CVARs that were scattered all across the code before + ** + **--------------------------------------------------------------------------- + ** Copyright 1998-2016 Randy Heit + ** Copyright 2003-2018 Christoph Oelckers + ** All rights reserved. + ** + ** Redistribution and use in source and binary forms, with or without + ** modification, are permitted provided that the following conditions + ** are met: + ** + ** 1. Redistributions of source code must retain the above copyright + ** notice, this list of conditions and the following disclaimer. + ** 2. Redistributions in binary form must reproduce the above copyright + ** notice, this list of conditions and the following disclaimer in the + ** documentation and/or other materials provided with the distribution. + ** 3. The name of the author may not be used to endorse or promote products + ** derived from this software without specific prior written permission. + ** + ** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + ** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + ** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + ** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + ** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + ** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + ** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + **--------------------------------------------------------------------------- + ** + */ + +#include "c_cvars.h" +#include "g_levellocals.h" + +CUSTOM_CVAR (Bool, gl_lights, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) +{ + for (auto Level : AllLevels()) + { + if (self) Level->RecreateAllAttachedLights(); + else Level->DeleteAllAttachedLights(); + } +} + + diff --git a/src/g_cvars.h b/src/g_cvars.h new file mode 100644 index 000000000..35930b2a2 --- /dev/null +++ b/src/g_cvars.h @@ -0,0 +1,9 @@ + +#pragma once + +#include "c_cvars.h" + + +EXTERN_CVAR(Bool, r_dynlights) +EXTERN_CVAR(Bool, gl_lights) + diff --git a/src/g_dumpinfo.cpp b/src/g_dumpinfo.cpp new file mode 100644 index 000000000..b4d177490 --- /dev/null +++ b/src/g_dumpinfo.cpp @@ -0,0 +1,100 @@ +/* + ** g_dumpinfo.cpp + ** diagnostic CCMDs that output info about the current game + ** + **--------------------------------------------------------------------------- + ** Copyright 1998-2016 Randy Heit + ** Copyright 2003-2018 Christoph Oelckers + ** All rights reserved. + ** + ** Redistribution and use in source and binary forms, with or without + ** modification, are permitted provided that the following conditions + ** are met: + ** + ** 1. Redistributions of source code must retain the above copyright + ** notice, this list of conditions and the following disclaimer. + ** 2. Redistributions in binary form must reproduce the above copyright + ** notice, this list of conditions and the following disclaimer in the + ** documentation and/or other materials provided with the distribution. + ** 3. The name of the author may not be used to endorse or promote products + ** derived from this software without specific prior written permission. + ** + ** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + ** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + ** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + ** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + ** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + ** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + ** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + **--------------------------------------------------------------------------- + ** + */ + +#include "c_dispatch.h" +#include "g_levellocals.h" +#include "a_dynlight.h" + +//========================================================================== +// +// CCMDs +// +//========================================================================== + +CCMD(listlights) +{ + int walls, sectors; + int allwalls=0, allsectors=0, allsubsecs = 0; + int i=0, shadowcount = 0; + FDynamicLight * dl; + + for (auto Level : AllLevels()) + { + Printf("Lights for %s\n", Level->MapName.GetChars()); + for (dl = Level->lights; dl; dl = dl->next) + { + walls=0; + sectors=0; + Printf("%s at (%f, %f, %f), color = 0x%02x%02x%02x, radius = %f %s %s", + dl->target->GetClass()->TypeName.GetChars(), + dl->X(), dl->Y(), dl->Z(), dl->GetRed(), dl->GetGreen(), dl->GetBlue(), + dl->radius, dl->IsAttenuated()? "attenuated" : "", dl->shadowmapped? "shadowmapped" : ""); + i++; + shadowcount += dl->shadowmapped; + + if (dl->target) + { + FTextureID spr = sprites[dl->target->sprite].GetSpriteFrame(dl->target->frame, 0, 0., nullptr); + Printf(", frame = %s ", TexMan.GetTexture(spr)->GetName().GetChars()); + } + + + FLightNode * node; + + node=dl->touching_sides; + + while (node) + { + walls++; + allwalls++; + node = node->nextTarget; + } + + + node = dl->touching_sector; + + while (node) + { + allsectors++; + sectors++; + node = node->nextTarget; + } + Printf("- %d walls, %d sectors\n", walls, sectors); + + } + Printf("%i dynamic lights, %d shadowmapped, %d walls, %d sectors\n\n\n", i, shadowcount, allwalls, allsectors); + } +} + diff --git a/src/g_shared/a_dynlight.cpp b/src/g_shared/a_dynlight.cpp index be6f90364..f3462a69b 100644 --- a/src/g_shared/a_dynlight.cpp +++ b/src/g_shared/a_dynlight.cpp @@ -69,31 +69,8 @@ static FMemArena DynLightArena(sizeof(FDynamicLight) * 200); static TArray FreeList; static FRandom randLight; -CUSTOM_CVAR (Bool, gl_lights, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) -{ - for (auto Level : AllLevels()) - { - if (self) Level->RecreateAllAttachedLights(); - else Level->DeleteAllAttachedLights(); - } -} +extern TArray StateLights; -//========================================================================== -// -//========================================================================== -DEFINE_CLASS_PROPERTY(type, S, DynamicLight) -{ - PROP_STRING_PARM(str, 0); - static const char * ltype_names[]={ - "Point","Pulse","Flicker","Sector","RandomFlicker", "ColorPulse", "ColorFlicker", "RandomColorFlicker", nullptr}; - - static const int ltype_values[]={ - PointLight, PulseLight, FlickerLight, SectorLight, RandomFlickerLight, ColorPulseLight, ColorFlickerLight, RandomColorFlickerLight }; - - int style = MatchString(str, ltype_names); - if (style < 0) I_Error("Unknown light type '%s'", str); - defaults->IntVar(NAME_lighttype) = ltype_values[style]; -} //========================================================================== // @@ -505,9 +482,9 @@ static FLightNode * DeleteLightNode(FLightNode * node) tn=node->nextTarget; delete node; return(tn); - } + } return(nullptr); -} // phares 3/13/98 +} @@ -774,7 +751,6 @@ void AActor::AttachLight(unsigned int count, const FLightDefaults *lightdef) // per-state light adjustment // //========================================================================== -extern TArray StateLights; void AActor::SetDynamicLights() { @@ -870,64 +846,3 @@ void FLevelLocals::RecreateAllAttachedLights() } } -//========================================================================== -// -// CCMDs -// -//========================================================================== - -CCMD(listlights) -{ - int walls, sectors; - int allwalls=0, allsectors=0, allsubsecs = 0; - int i=0, shadowcount = 0; - FDynamicLight * dl; - - for (auto Level : AllLevels()) - { - Printf("Lights for %s\n", Level->MapName.GetChars()); - for (dl = Level->lights; dl; dl = dl->next) - { - walls=0; - sectors=0; - Printf("%s at (%f, %f, %f), color = 0x%02x%02x%02x, radius = %f %s %s", - dl->target->GetClass()->TypeName.GetChars(), - dl->X(), dl->Y(), dl->Z(), dl->GetRed(), dl->GetGreen(), dl->GetBlue(), - dl->radius, dl->IsAttenuated()? "attenuated" : "", dl->shadowmapped? "shadowmapped" : ""); - i++; - shadowcount += dl->shadowmapped; - - if (dl->target) - { - FTextureID spr = sprites[dl->target->sprite].GetSpriteFrame(dl->target->frame, 0, 0., nullptr); - Printf(", frame = %s ", TexMan.GetTexture(spr)->GetName().GetChars()); - } - - - FLightNode * node; - - node=dl->touching_sides; - - while (node) - { - walls++; - allwalls++; - node = node->nextTarget; - } - - - node = dl->touching_sector; - - while (node) - { - allsectors++; - sectors++; - node = node->nextTarget; - } - Printf("- %d walls, %d sectors\n", walls, sectors); - - } - Printf("%i dynamic lights, %d shadowmapped, %d walls, %d sectors\n\n\n", i, shadowcount, allwalls, allsectors); - } -} - diff --git a/src/g_shared/a_dynlight.h b/src/g_shared/a_dynlight.h index e61c2a3fc..54da9e7d5 100644 --- a/src/g_shared/a_dynlight.h +++ b/src/g_shared/a_dynlight.h @@ -4,9 +4,6 @@ #include "cycler.h" #include "g_levellocals.h" -EXTERN_CVAR(Bool, r_dynlights) -EXTERN_CVAR(Bool, gl_lights) - struct side_t; struct seg_t; diff --git a/src/hwrenderer/utility/hw_cvars.h b/src/hwrenderer/utility/hw_cvars.h index 1f08a4722..025880fc4 100644 --- a/src/hwrenderer/utility/hw_cvars.h +++ b/src/hwrenderer/utility/hw_cvars.h @@ -15,8 +15,6 @@ EXTERN_CVAR(Bool, gl_usefb) EXTERN_CVAR(Int, gl_weaponlight) -EXTERN_CVAR (Bool, gl_lights); - EXTERN_CVAR (Bool, gl_light_sprites); EXTERN_CVAR (Bool, gl_light_particles); EXTERN_CVAR (Bool, gl_light_shadowmap); @@ -69,4 +67,4 @@ EXTERN_CVAR(Bool, gl_billboard_particles) EXTERN_CVAR(Int, gl_enhanced_nv_stealth) EXTERN_CVAR(Int, gl_fuzztype) -EXTERN_CVAR(Int, gl_shadowmap_filter) \ No newline at end of file +EXTERN_CVAR(Int, gl_shadowmap_filter) diff --git a/src/polyrenderer/scene/poly_model.cpp b/src/polyrenderer/scene/poly_model.cpp index 5ed08ef9b..a0c544ab8 100644 --- a/src/polyrenderer/scene/poly_model.cpp +++ b/src/polyrenderer/scene/poly_model.cpp @@ -128,7 +128,7 @@ void PolyModelRenderer::AddLights(AActor *actor) while (node) // check all lights touching a subsector { FDynamicLight *light = node->lightsource; - if (light->ShouldLightActor(actor)) + if (light->ShouldLightActor(actor)) { int group = subsector->sector->PortalGroup; DVector3 pos = light->PosRelative(group); diff --git a/src/scripting/thingdef_properties.cpp b/src/scripting/thingdef_properties.cpp index 17a546a94..5cf0ebb0b 100644 --- a/src/scripting/thingdef_properties.cpp +++ b/src/scripting/thingdef_properties.cpp @@ -54,6 +54,7 @@ #include "a_keys.h" #include "g_levellocals.h" #include "types.h" +#include "a_dynlight.h" //========================================================================== // @@ -1789,3 +1790,21 @@ DEFINE_CLASS_PROPERTY(unmorphflash, S, PowerMorph) defaults->PointerVar(NAME_UnMorphFlash) = FindClassTentative(str, RUNTIME_CLASS(AActor), bag.fromDecorate); } +//========================================================================== +// +//========================================================================== +DEFINE_CLASS_PROPERTY(type, S, DynamicLight) +{ + PROP_STRING_PARM(str, 0); + static const char * ltype_names[]={ + "Point","Pulse","Flicker","Sector","RandomFlicker", "ColorPulse", "ColorFlicker", "RandomColorFlicker", nullptr}; + + static const int ltype_values[]={ + PointLight, PulseLight, FlickerLight, SectorLight, RandomFlickerLight, ColorPulseLight, ColorFlickerLight, RandomColorFlickerLight }; + + int style = MatchString(str, ltype_names); + if (style < 0) I_Error("Unknown light type '%s'", str); + defaults->IntVar(NAME_lighttype) = ltype_values[style]; +} + + From 0b4862480e05dedee3e38d1cc8b1d4c28201b5b5 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 31 Jan 2019 02:05:33 +0100 Subject: [PATCH 111/164] - fixed macOS compilation. --- src/posix/cocoa/i_input.mm | 1 + 1 file changed, 1 insertion(+) diff --git a/src/posix/cocoa/i_input.mm b/src/posix/cocoa/i_input.mm index 87abe4298..79315e1ce 100644 --- a/src/posix/cocoa/i_input.mm +++ b/src/posix/cocoa/i_input.mm @@ -45,6 +45,7 @@ #include "doomstat.h" #include "v_video.h" #include "events.h" +#include "g_game.h" EXTERN_CVAR(Int, m_use_mouse) From 25d5b788f5ab0d45bc1d7f5c847fc80e9ef6e31b Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 31 Jan 2019 02:27:54 +0100 Subject: [PATCH 112/164] - reviewed and sorted out the remaining parts of g_shared --- src/g_cvars.cpp | 42 +++++++ src/g_dumpinfo.cpp | 27 ++++ src/g_shared/a_action.cpp | 21 +--- src/g_shared/a_decals.cpp | 227 ++++++++++++++++++++++++++-------- src/g_shared/a_flashfader.cpp | 36 ++++++ src/g_shared/a_lightning.cpp | 48 +++++++ 6 files changed, 333 insertions(+), 68 deletions(-) diff --git a/src/g_cvars.cpp b/src/g_cvars.cpp index cb26743bf..6f661371e 100644 --- a/src/g_cvars.cpp +++ b/src/g_cvars.cpp @@ -36,6 +36,9 @@ #include "c_cvars.h" #include "g_levellocals.h" +CVAR (Bool, cl_spreaddecals, true, CVAR_ARCHIVE) + + CUSTOM_CVAR (Bool, gl_lights, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) { for (auto Level : AllLevels()) @@ -45,4 +48,43 @@ CUSTOM_CVAR (Bool, gl_lights, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOIN } } +CUSTOM_CVAR(Int, sv_corpsequeuesize, 64, CVAR_ARCHIVE|CVAR_SERVERINFO) +{ + if (self > 0) + { + for (auto Level : AllLevels()) + { + auto &corpsequeue = Level->CorpseQueue; + while (corpsequeue.Size() > (unsigned)self) + { + AActor *corpse = corpsequeue[0]; + if (corpse) corpse->Destroy(); + corpsequeue.Delete(0); + } + } + } +} + +CUSTOM_CVAR (Int, cl_maxdecals, 1024, CVAR_ARCHIVE) +{ + if (self < 0) + { + self = 0; + } + else for (auto Level : AllLevels()) + { + while (Level->ImpactDecalCount > self) + { + DThinker *thinker = Level->FirstThinker(STAT_AUTODECAL); + if (thinker != NULL) + { + thinker->Destroy(); + } + } + } +} + + + + diff --git a/src/g_dumpinfo.cpp b/src/g_dumpinfo.cpp index b4d177490..95677f330 100644 --- a/src/g_dumpinfo.cpp +++ b/src/g_dumpinfo.cpp @@ -98,3 +98,30 @@ CCMD(listlights) } } +CCMD (countdecals) +{ + for (auto Level : AllLevels()) + { + auto iterator = Level->GetThinkerIterator(NAME_None, STAT_AUTODECAL); + int count = 0; + + while (iterator.Next()) + count++; + + Printf("%s: Counted %d impact decals\n", Level->MapName.GetChars(), count); + } +} + +CCMD (spray) +{ + if (who == NULL || argv.argc() < 2) + { + Printf ("Usage: spray \n"); + return; + } + + Net_WriteByte (DEM_SPRAY); + Net_WriteString (argv[1]); +} + + diff --git a/src/g_shared/a_action.cpp b/src/g_shared/a_action.cpp index fb3b9a309..c5e96adcd 100644 --- a/src/g_shared/a_action.cpp +++ b/src/g_shared/a_action.cpp @@ -32,6 +32,8 @@ #include "vm.h" #include "actorinlines.h" +EXTERN_CVAR(Int, sv_corpsequeuesize) + //---------------------------------------------------------------------------- // // PROC A_NoBlocking @@ -88,25 +90,6 @@ void A_Unblock(AActor *self, bool drop) // //---------------------------------------------------------------------------- -CUSTOM_CVAR(Int, sv_corpsequeuesize, 64, CVAR_ARCHIVE|CVAR_SERVERINFO) -{ - if (self > 0) - { - for (auto Level : AllLevels()) - { - auto &corpsequeue = Level->CorpseQueue; - while (corpsequeue.Size() > (unsigned)self) - { - AActor *corpse = corpsequeue[0]; - if (corpse) corpse->Destroy(); - corpsequeue.Delete(0); - } - } - } -} - - - // throw another corpse on the queue DEFINE_ACTION_FUNCTION(AActor, A_QueueCorpse) { diff --git a/src/g_shared/a_decals.cpp b/src/g_shared/a_decals.cpp index a0a27aacd..b53675b23 100644 --- a/src/g_shared/a_decals.cpp +++ b/src/g_shared/a_decals.cpp @@ -45,6 +45,16 @@ #include "g_levellocals.h" #include "vm.h" +EXTERN_CVAR (Bool, cl_spreaddecals) +EXTERN_CVAR (Int, cl_maxdecals) + + +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + struct SpreadInfo { double DecalWidth, DecalLeft, DecalRight; @@ -54,7 +64,12 @@ struct SpreadInfo TArray SpreadStack; }; -CVAR (Bool, cl_spreaddecals, true, CVAR_ARCHIVE) + +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- IMPLEMENT_CLASS(DBaseDecal, false, true) @@ -65,6 +80,12 @@ IMPLEMENT_POINTERS_END IMPLEMENT_CLASS(DImpactDecal, false, false) +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DBaseDecal::Construct(double z) { Z = z; @@ -72,6 +93,12 @@ void DBaseDecal::Construct(double z) PicNum.SetInvalid(); } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DBaseDecal::Construct(const AActor *basis) { Z = basis->Z(); @@ -85,6 +112,12 @@ void DBaseDecal::Construct(const AActor *basis) RenderStyle = basis->RenderStyle; } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DBaseDecal::Construct(const DBaseDecal *basis) { LeftDistance = basis->LeftDistance; @@ -100,12 +133,24 @@ void DBaseDecal::Construct(const DBaseDecal *basis) } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DBaseDecal::OnDestroy () { Remove (); Super::OnDestroy(); } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DBaseDecal::Remove () { if (WallPrev == nullptr) @@ -120,6 +165,12 @@ void DBaseDecal::Remove () WallNext = nullptr; } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DBaseDecal::Serialize(FSerializer &arc) { Super::Serialize (arc); @@ -139,6 +190,12 @@ void DBaseDecal::Serialize(FSerializer &arc) ("sector", Sector); } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DBaseDecal::GetXY (side_t *wall, double &ox, double &oy) const { line_t *line = wall->linedef; @@ -162,18 +219,35 @@ void DBaseDecal::GetXY (side_t *wall, double &ox, double &oy) const oy = v1->fY() + LeftDistance * dy; } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DBaseDecal::SetShade (uint32_t rgb) { PalEntry *entry = (PalEntry *)&rgb; AlphaColor = rgb | (ColorMatcher.Pick (entry->r, entry->g, entry->b) << 24); } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DBaseDecal::SetShade (int r, int g, int b) { AlphaColor = MAKEARGB(ColorMatcher.Pick (r, g, b), r, g, b); } +//---------------------------------------------------------------------------- +// // Returns the texture the decal stuck to. +// +//---------------------------------------------------------------------------- + FTextureID DBaseDecal::StickToWall (side_t *wall, double x, double y, F3DFloor *ffloor) { Side = wall; @@ -265,6 +339,12 @@ FTextureID DBaseDecal::StickToWall (side_t *wall, double x, double y, F3DFloor * return tex; } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + double DBaseDecal::GetRealZ (const side_t *wall) const { const line_t *line = wall->linedef; @@ -319,6 +399,12 @@ double DBaseDecal::GetRealZ (const side_t *wall) const } } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DBaseDecal::CalcFracPos (side_t *wall, double x, double y) { line_t *line = wall->linedef; @@ -352,6 +438,12 @@ void DBaseDecal::CalcFracPos (side_t *wall, double x, double y) } } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + static void GetWallStuff (side_t *wall, vertex_t *&v1, double &ldx, double &ldy) { line_t *line = wall->linedef; @@ -369,11 +461,23 @@ static void GetWallStuff (side_t *wall, vertex_t *&v1, double &ldx, double &ldy) } } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + static double Length (double dx, double dy) { return DVector2(dx, dy).Length(); } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + static side_t *NextWall (const side_t *wall) { line_t *line = wall->linedef; @@ -392,6 +496,12 @@ static side_t *NextWall (const side_t *wall) return NULL; } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DBaseDecal::SpreadLeft (double r, vertex_t *v1, side_t *feelwall, F3DFloor *ffloor, SpreadInfo *spread) { double ldx, ldy; @@ -436,6 +546,12 @@ void DBaseDecal::SpreadLeft (double r, vertex_t *v1, side_t *feelwall, F3DFloor } } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DBaseDecal::SpreadRight (double r, side_t *feelwall, double wallsize, F3DFloor *ffloor, SpreadInfo *spread) { vertex_t *v1; @@ -476,6 +592,12 @@ void DBaseDecal::SpreadRight (double r, side_t *feelwall, double wallsize, F3DFl } } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DBaseDecal::Spread (const FDecalTemplate *tpl, side_t *wall, double x, double y, double z, F3DFloor * ffloor) { SpreadInfo spread; @@ -509,6 +631,12 @@ void DBaseDecal::Spread (const FDecalTemplate *tpl, side_t *wall, double x, doub Length (wall->linedef->Delta().X, wall->linedef->Delta().Y), ffloor, &spread); } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + DBaseDecal *DBaseDecal::CloneSelf (const FDecalTemplate *tpl, double ix, double iy, double iz, side_t *wall, F3DFloor * ffloor) const { DBaseDecal *decal = Level->CreateThinker(iz); @@ -530,24 +658,11 @@ DBaseDecal *DBaseDecal::CloneSelf (const FDecalTemplate *tpl, double ix, double return decal; } -CUSTOM_CVAR (Int, cl_maxdecals, 1024, CVAR_ARCHIVE) -{ - if (self < 0) - { - self = 0; - } - else for (auto Level : AllLevels()) - { - while (Level->ImpactDecalCount > self) - { - DThinker *thinker = Level->FirstThinker(STAT_AUTODECAL); - if (thinker != NULL) - { - thinker->Destroy(); - } - } - } -} +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- void DImpactDecal::CheckMax () { @@ -562,6 +677,12 @@ void DImpactDecal::CheckMax () } } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + DImpactDecal *DImpactDecal::StaticCreate (FLevelLocals *Level, const char *name, const DVector3 &pos, side_t *wall, F3DFloor * ffloor, PalEntry color) { if (cl_maxdecals > 0) @@ -576,6 +697,12 @@ DImpactDecal *DImpactDecal::StaticCreate (FLevelLocals *Level, const char *name, return NULL; } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + DImpactDecal *DImpactDecal::StaticCreate (FLevelLocals *Level, const FDecalTemplate *tpl, const DVector3 &pos, side_t *wall, F3DFloor * ffloor, PalEntry color) { DImpactDecal *decal = NULL; @@ -621,6 +748,12 @@ DImpactDecal *DImpactDecal::StaticCreate (FLevelLocals *Level, const FDecalTempl return decal; } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + DBaseDecal *DImpactDecal::CloneSelf (const FDecalTemplate *tpl, double ix, double iy, double iz, side_t *wall, F3DFloor * ffloor) const { if (wall->Flags & WALLF_NOAUTODECALS) @@ -648,31 +781,11 @@ DBaseDecal *DImpactDecal::CloneSelf (const FDecalTemplate *tpl, double ix, doubl return decal; } -CCMD (countdecals) -{ - for (auto Level : AllLevels()) - { - auto iterator = Level->GetThinkerIterator(NAME_None, STAT_AUTODECAL); - int count = 0; - - while (iterator.Next()) - count++; - - Printf("%s: Counted %d impact decals\n", Level->MapName.GetChars(), count); - } -} - -CCMD (spray) -{ - if (who == NULL || argv.argc() < 2) - { - Printf ("Usage: spray \n"); - return; - } - - Net_WriteByte (DEM_SPRAY); - Net_WriteString (argv[1]); -} +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- void SprayDecal(AActor *shooter, const char *name, double distance) { @@ -692,6 +805,12 @@ void SprayDecal(AActor *shooter, const char *name, double distance) } } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + DBaseDecal *ShootDecal(FLevelLocals *Level, const FDecalTemplate *tpl, sector_t *sec, double x, double y, double z, DAngle angle, double tracedist, bool permanent) { if (tpl == NULL || (tpl = tpl->GetDecal()) == NULL) @@ -728,12 +847,16 @@ DBaseDecal *ShootDecal(FLevelLocals *Level, const FDecalTemplate *tpl, sector_t return NULL; } -DEFINE_ACTION_FUNCTION(ADecal, SpawnDecal) +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + +static void SpawnDecal(AActor *self) { - PARAM_SELF_PROLOGUE(AActor); - const FDecalTemplate *tpl = nullptr; - + if (self->args[0] < 0) { FName name = ENamedName(-self->args[0]); @@ -744,7 +867,7 @@ DEFINE_ACTION_FUNCTION(ADecal, SpawnDecal) int decalid = self->args[0] + (self->args[1] << 8); // [KS] High byte for decals. tpl = DecalLibrary.GetDecalByNum(decalid); } - + // If no decal is specified, don't try to create one. if (tpl != nullptr) { @@ -767,5 +890,11 @@ DEFINE_ACTION_FUNCTION(ADecal, SpawnDecal) { DPrintf (DMSG_ERROR, "Decal actor at (%f,%f) does not have a good template\n", self->X(), self->Y()); } +} + +DEFINE_ACTION_FUNCTION_NATIVE(ADecal, SpawnDecal, SpawnDecal) +{ + PARAM_SELF_PROLOGUE(AActor); + SpawnDecal(self); return 0; } diff --git a/src/g_shared/a_flashfader.cpp b/src/g_shared/a_flashfader.cpp index c93ef7ef4..e08ae8bf6 100644 --- a/src/g_shared/a_flashfader.cpp +++ b/src/g_shared/a_flashfader.cpp @@ -43,6 +43,12 @@ IMPLEMENT_POINTERS_START(DFlashFader) IMPLEMENT_POINTER(ForWho) IMPLEMENT_POINTERS_END +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DFlashFader::Construct (float r1, float g1, float b1, float a1, float r2, float g2, float b2, float a2, float time, AActor *who, bool terminate) @@ -55,6 +61,12 @@ void DFlashFader::Construct (float r1, float g1, float b1, float a1, Terminate = terminate; } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DFlashFader::OnDestroy () { if (Terminate) Blends[1][3] = 0.f; // Needed in order to cancel out the secondary fade. @@ -62,6 +74,12 @@ void DFlashFader::OnDestroy () Super::OnDestroy(); } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DFlashFader::Serialize(FSerializer &arc) { Super::Serialize (arc); @@ -71,6 +89,12 @@ void DFlashFader::Serialize(FSerializer &arc) .Array("blends", Blends[0], 8); } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DFlashFader::Tick () { if (ForWho == NULL || ForWho->player == NULL) @@ -87,6 +111,12 @@ void DFlashFader::Tick () SetBlend (1.f - (float)RemainingTics / (float)TotalTics); } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DFlashFader::SetBlend (float time) { if (ForWho == NULL || ForWho->player == NULL) @@ -101,6 +131,12 @@ void DFlashFader::SetBlend (float time) player->BlendA = Blends[0][3]*iT + Blends[1][3]*time; } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DFlashFader::Cancel () { RemainingTics = 0; diff --git a/src/g_shared/a_lightning.cpp b/src/g_shared/a_lightning.cpp index d52bd1b92..62fae6e44 100644 --- a/src/g_shared/a_lightning.cpp +++ b/src/g_shared/a_lightning.cpp @@ -41,6 +41,12 @@ static FRandom pr_lightning ("Lightning"); IMPLEMENT_CLASS(DLightningThinker, false, false) +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DLightningThinker::Construct() { Stopped = false; @@ -55,6 +61,12 @@ DLightningThinker::~DLightningThinker () { } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DLightningThinker::Serialize(FSerializer &arc) { Super::Serialize (arc); @@ -64,6 +76,12 @@ void DLightningThinker::Serialize(FSerializer &arc) ("levels", LightningLightLevels); } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DLightningThinker::Tick () { if (!NextLightningFlash || LightningFlashCount) @@ -77,6 +95,12 @@ void DLightningThinker::Tick () } } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DLightningThinker::LightningFlash () { int i, j; @@ -179,6 +203,12 @@ void DLightningThinker::LightningFlash () } } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void DLightningThinker::ForceLightning (int mode) { switch (mode) @@ -196,12 +226,24 @@ void DLightningThinker::ForceLightning (int mode) } } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + static DLightningThinker *LocateLightning (FLevelLocals *Level) { auto iterator = Level->GetThinkerIterator(NAME_None, STAT_LIGHTNING); return iterator.Next (); } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void FLevelLocals::StartLightning () { const bool isOriginalHexen = (gameinfo.gametype == GAME_Hexen) @@ -237,6 +279,12 @@ void FLevelLocals::StartLightning () } } +//---------------------------------------------------------------------------- +// +// +// +//---------------------------------------------------------------------------- + void FLevelLocals::ForceLightning (int mode) { DLightningThinker *lightning = LocateLightning (this); From 51581d018a445b1a1d69238ab3ab27c86a5d188e Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 31 Jan 2019 02:31:57 +0100 Subject: [PATCH 113/164] - moved the hud message and alt hud code from g_shared to g_statusbar This is where it really belongs, this was simply overlooked when the folder was split. --- src/CMakeLists.txt | 4 ++-- src/{g_shared => g_statusbar}/hudmessages.cpp | 0 src/{g_shared => g_statusbar}/shared_hud.cpp | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename src/{g_shared => g_statusbar}/hudmessages.cpp (100%) rename src/{g_shared => g_statusbar}/shared_hud.cpp (100%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 31b85960c..6670cf6b4 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1030,8 +1030,8 @@ set (PCH_SOURCES g_shared/a_morph.cpp g_shared/a_quake.cpp g_shared/a_specialspot.cpp - g_shared/hudmessages.cpp - g_shared/shared_hud.cpp + g_statusbar/hudmessages.cpp + g_statusbar/shared_hud.cpp g_statusbar/sbarinfo.cpp g_statusbar/sbar_mugshot.cpp g_statusbar/shared_sbar.cpp diff --git a/src/g_shared/hudmessages.cpp b/src/g_statusbar/hudmessages.cpp similarity index 100% rename from src/g_shared/hudmessages.cpp rename to src/g_statusbar/hudmessages.cpp diff --git a/src/g_shared/shared_hud.cpp b/src/g_statusbar/shared_hud.cpp similarity index 100% rename from src/g_shared/shared_hud.cpp rename to src/g_statusbar/shared_hud.cpp From 77f8dfeabf59166a38cd6775156badad589b83ee Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 31 Jan 2019 02:38:23 +0100 Subject: [PATCH 114/164] - fixed g_dumpinfo.cpp's includes --- src/g_dumpinfo.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/g_dumpinfo.cpp b/src/g_dumpinfo.cpp index 95677f330..94f450621 100644 --- a/src/g_dumpinfo.cpp +++ b/src/g_dumpinfo.cpp @@ -36,6 +36,8 @@ #include "c_dispatch.h" #include "g_levellocals.h" #include "a_dynlight.h" +#include "a_sharedglobal.h" +#include "d_net.h" //========================================================================== // From 65a812e31617d97883c43dfb482bc3b83cdca132 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 31 Jan 2019 02:38:39 +0100 Subject: [PATCH 115/164] - moved the door thinkers into g_shared. --- src/CMakeLists.txt | 2 +- src/{p_doors.cpp => g_shared/a_doors.cpp} | 0 src/g_shared/a_doors.h | 87 ++++++++++++++++++++++ src/p_spec.h | 88 +---------------------- 4 files changed, 89 insertions(+), 88 deletions(-) rename src/{p_doors.cpp => g_shared/a_doors.cpp} (100%) create mode 100644 src/g_shared/a_doors.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6670cf6b4..badc2e44a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -952,7 +952,6 @@ set (PCH_SOURCES p_ceiling.cpp p_conversation.cpp p_destructible.cpp - p_doors.cpp p_effect.cpp p_enemy.cpp p_floor.cpp @@ -1024,6 +1023,7 @@ set (PCH_SOURCES g_inventory/a_weapons.cpp g_shared/a_action.cpp g_shared/a_decals.cpp + g_shared/a_doors.cpp g_shared/a_dynlight.cpp g_shared/a_flashfader.cpp g_shared/a_lightning.cpp diff --git a/src/p_doors.cpp b/src/g_shared/a_doors.cpp similarity index 100% rename from src/p_doors.cpp rename to src/g_shared/a_doors.cpp diff --git a/src/g_shared/a_doors.h b/src/g_shared/a_doors.h new file mode 100644 index 000000000..88c0c5667 --- /dev/null +++ b/src/g_shared/a_doors.h @@ -0,0 +1,87 @@ +#pragma once + +// +// P_DOORS +// +class DDoor : public DMovingCeiling +{ + DECLARE_CLASS (DDoor, DMovingCeiling) +public: + enum EVlDoor + { + doorClose, + doorOpen, + doorRaise, + doorWaitRaise, + doorCloseWaitOpen, + doorWaitClose, + }; + + void Construct(sector_t *sector); + void Construct(sector_t *sec, EVlDoor type, double speed, int delay, int lightTag, int topcountdown); + + void Serialize(FSerializer &arc); + void Tick (); +protected: + EVlDoor m_Type; + double m_TopDist; + double m_BotDist, m_OldFloorDist; + vertex_t *m_BotSpot; + double m_Speed; + + // 1 = up, 0 = waiting at top, -1 = down + int m_Direction; + + // tics to wait at the top + int m_TopWait; + // (keep in case a door going down is reset) + // when it reaches 0, start going down + int m_TopCountdown; + + int m_LightTag; + + void DoorSound (bool raise, class DSeqNode *curseq=NULL) const; + +private: + friend struct FLevelLocals; +}; + +class DAnimatedDoor : public DMovingCeiling +{ + DECLARE_CLASS (DAnimatedDoor, DMovingCeiling) +public: + + enum EADType + { + adOpenClose, + adClose + }; + + void Construct(sector_t *sector); + void Construct(sector_t *sec, line_t *line, int speed, int delay, FDoorAnimation *anim, EADType type); + + void Serialize(FSerializer &arc); + void Tick (); + + bool StartClosing (); +protected: + line_t *m_Line1, *m_Line2; + int m_Frame; + FDoorAnimation *m_DoorAnim; + int m_Timer; + double m_BotDist; + int m_Status; + int m_Type; + enum + { + Opening, + Waiting, + Closing, + Dead + }; + int m_Speed; + int m_Delay; + bool m_SetBlocking1, m_SetBlocking2; + + friend struct FLevelLocals; +}; diff --git a/src/p_spec.h b/src/p_spec.h index 529b184ac..c95460915 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -224,93 +224,7 @@ protected: TObjPtr m_Interp_Floor; }; - -// -// P_DOORS -// -class DDoor : public DMovingCeiling -{ - DECLARE_CLASS (DDoor, DMovingCeiling) -public: - enum EVlDoor - { - doorClose, - doorOpen, - doorRaise, - doorWaitRaise, - doorCloseWaitOpen, - doorWaitClose, - }; - - void Construct(sector_t *sector); - void Construct(sector_t *sec, EVlDoor type, double speed, int delay, int lightTag, int topcountdown); - - void Serialize(FSerializer &arc); - void Tick (); -protected: - EVlDoor m_Type; - double m_TopDist; - double m_BotDist, m_OldFloorDist; - vertex_t *m_BotSpot; - double m_Speed; - - // 1 = up, 0 = waiting at top, -1 = down - int m_Direction; - - // tics to wait at the top - int m_TopWait; - // (keep in case a door going down is reset) - // when it reaches 0, start going down - int m_TopCountdown; - - int m_LightTag; - - void DoorSound (bool raise, class DSeqNode *curseq=NULL) const; - -private: - friend struct FLevelLocals; -}; - -class DAnimatedDoor : public DMovingCeiling -{ - DECLARE_CLASS (DAnimatedDoor, DMovingCeiling) -public: - - enum EADType - { - adOpenClose, - adClose - }; - - void Construct(sector_t *sector); - void Construct(sector_t *sec, line_t *line, int speed, int delay, FDoorAnimation *anim, EADType type); - - void Serialize(FSerializer &arc); - void Tick (); - - bool StartClosing (); -protected: - line_t *m_Line1, *m_Line2; - int m_Frame; - FDoorAnimation *m_DoorAnim; - int m_Timer; - double m_BotDist; - int m_Status; - int m_Type; - enum - { - Opening, - Waiting, - Closing, - Dead - }; - int m_Speed; - int m_Delay; - bool m_SetBlocking1, m_SetBlocking2; - - friend struct FLevelLocals; -}; - +#include "a_doors.h" // // P_CEILING // From 4984bc8c5fcb98c7560ca711c6b0c0e883c9f920 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 31 Jan 2019 02:50:12 +0100 Subject: [PATCH 116/164] - prettification of a few files --- src/g_cvars.cpp | 1 + src/p_pillar.cpp | 30 +++++++++++++++++++++++++++ src/p_plats.cpp | 47 +++++++++++++++++++++++++++++++++++++++++++ src/p_pusher.cpp | 28 +++++++++++++++++++------- src/p_spec_thinkers.h | 6 ++++++ 5 files changed, 105 insertions(+), 7 deletions(-) diff --git a/src/g_cvars.cpp b/src/g_cvars.cpp index 6f661371e..31d224ccc 100644 --- a/src/g_cvars.cpp +++ b/src/g_cvars.cpp @@ -37,6 +37,7 @@ #include "g_levellocals.h" CVAR (Bool, cl_spreaddecals, true, CVAR_ARCHIVE) +CVAR(Bool, var_pushers, true, CVAR_SERVERINFO); CUSTOM_CVAR (Bool, gl_lights, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) diff --git a/src/p_pillar.cpp b/src/p_pillar.cpp index ee9bb6e50..fb7605617 100644 --- a/src/p_pillar.cpp +++ b/src/p_pillar.cpp @@ -48,6 +48,12 @@ IMPLEMENT_POINTERS_START(DPillar) IMPLEMENT_POINTER(m_Interp_Ceiling) IMPLEMENT_POINTERS_END +//----------------------------------------------------------------------------- +// +// +// +//----------------------------------------------------------------------------- + void DPillar::OnDestroy() { if (m_Interp_Ceiling != nullptr) @@ -63,6 +69,12 @@ void DPillar::OnDestroy() Super::OnDestroy(); } +//----------------------------------------------------------------------------- +// +// +// +//----------------------------------------------------------------------------- + void DPillar::Serialize(FSerializer &arc) { Super::Serialize (arc); @@ -77,6 +89,12 @@ void DPillar::Serialize(FSerializer &arc) ("interp_ceiling", m_Interp_Ceiling); } +//----------------------------------------------------------------------------- +// +// +// +//----------------------------------------------------------------------------- + void DPillar::Tick () { EMoveResult r, s; @@ -114,6 +132,12 @@ void DPillar::Tick () } } +//----------------------------------------------------------------------------- +// +// +// +//----------------------------------------------------------------------------- + void DPillar::Construct(sector_t *sector, EPillar type, double speed, double floordist, double ceilingdist, int crush, bool hexencrush) { Super::Construct(sector); @@ -205,6 +229,12 @@ void DPillar::Construct(sector_t *sector, EPillar type, double speed, double flo } } +//----------------------------------------------------------------------------- +// +// +// +//----------------------------------------------------------------------------- + bool FLevelLocals::EV_DoPillar (DPillar::EPillar type, line_t *line, int tag, double speed, double height, double height2, int crush, bool hexencrush) { diff --git a/src/p_plats.cpp b/src/p_plats.cpp index 2b1e3e253..4cc4367ab 100644 --- a/src/p_plats.cpp +++ b/src/p_plats.cpp @@ -41,6 +41,12 @@ static FRandom pr_doplat ("DoPlat"); IMPLEMENT_CLASS(DPlat, false, false) +//----------------------------------------------------------------------------- +// +// +// +//----------------------------------------------------------------------------- + void DPlat::Serialize(FSerializer &arc) { Super::Serialize (arc); @@ -56,6 +62,12 @@ void DPlat::Serialize(FSerializer &arc) ("tag", m_Tag); } +//----------------------------------------------------------------------------- +// +// +// +//----------------------------------------------------------------------------- + void DPlat::PlayPlatSound (const char *sound) { if (m_Sector->Flags & SECF_SILENTMOVE) return; @@ -74,9 +86,12 @@ void DPlat::PlayPlatSound (const char *sound) } } +//----------------------------------------------------------------------------- // // Move a plat up and down // +//----------------------------------------------------------------------------- + void DPlat::Tick () { EMoveResult res; @@ -200,6 +215,12 @@ void DPlat::Tick () } } +//----------------------------------------------------------------------------- +// +// +// +//----------------------------------------------------------------------------- + void DPlat::Reactivate() { if (m_Type == platToggle) //jff 3/14/98 reactivate toggle type @@ -208,6 +229,11 @@ void DPlat::Reactivate() m_Status = m_OldStatus; } +//----------------------------------------------------------------------------- +// +// +// +//----------------------------------------------------------------------------- void DPlat::Stop() { @@ -215,16 +241,25 @@ void DPlat::Stop() m_Status = in_stasis; } +//----------------------------------------------------------------------------- +// +// +// +//----------------------------------------------------------------------------- + void DPlat::Construct (sector_t *sector) { Super::Construct(sector); } +//----------------------------------------------------------------------------- // // Do Platforms // [RH] Changed amount to height and added delay, // lip, change, tag, and speed parameters. // +//----------------------------------------------------------------------------- + bool FLevelLocals::EV_DoPlat (int tag, line_t *line, DPlat::EPlatType type, double height, double speed, int delay, int lip, int change) { DPlat *plat; @@ -402,6 +437,12 @@ bool FLevelLocals::EV_DoPlat (int tag, line_t *line, DPlat::EPlatType type, doub return rtn; } +//----------------------------------------------------------------------------- +// +// +// +//----------------------------------------------------------------------------- + void FLevelLocals::ActivateInStasisPlat (int tag) { DPlat *scan; @@ -414,6 +455,12 @@ void FLevelLocals::ActivateInStasisPlat (int tag) } } +//----------------------------------------------------------------------------- +// +// +// +//----------------------------------------------------------------------------- + void FLevelLocals::EV_StopPlat (int tag, bool remove) { DPlat *scan; diff --git a/src/p_pusher.cpp b/src/p_pusher.cpp index 24a015d14..bd9a40e5f 100644 --- a/src/p_pusher.cpp +++ b/src/p_pusher.cpp @@ -39,7 +39,7 @@ #include "p_spec_thinkers.h" #include "maploader/maploader.h" -CVAR(Bool, var_pushers, true, CVAR_SERVERINFO); +EXTERN_CVAR(Bool, var_pushers); IMPLEMENT_CLASS(DPusher, false, true) @@ -47,6 +47,12 @@ IMPLEMENT_POINTERS_START(DPusher) IMPLEMENT_POINTER(m_Source) IMPLEMENT_POINTERS_END +//----------------------------------------------------------------------------- +// +// +// +//----------------------------------------------------------------------------- + void DPusher::Serialize(FSerializer &arc) { Super::Serialize (arc); @@ -59,7 +65,7 @@ void DPusher::Serialize(FSerializer &arc) } -//////////////////////////////////////////////////////////////////////////// +//----------------------------------------------------------------------------- // // PUSH/PULL EFFECT // @@ -102,13 +108,14 @@ void DPusher::Serialize(FSerializer &arc) // to have the PUSH_MASK bit set. If this bit is turned off by a switch // at run-time, the effect will not occur. The controlling sector for // types 1 & 2 is the sector containing the MT_PUSH/MT_PULL Thing. +// +//----------------------------------------------------------------------------- - -#define PUSH_FACTOR 128 - -///////////////////////////// +//----------------------------------------------------------------------------- // // Add a push thinker to the thinker list +// +//----------------------------------------------------------------------------- void DPusher::Construct (DPusher::EPusher type, line_t *l, int magnitude, int angle, AActor *source, int affectee) @@ -140,11 +147,13 @@ int DPusher::CheckForSectorMatch (EPusher type, int tag) } -///////////////////////////// +//----------------------------------------------------------------------------- // // T_Pusher looks for all objects that are inside the radius of // the effect. // +//----------------------------------------------------------------------------- + void DPusher::Tick () { sector_t *sec; @@ -292,6 +301,11 @@ void DPusher::Tick () } } +//----------------------------------------------------------------------------- +// +// +// +//----------------------------------------------------------------------------- void FLevelLocals::AdjustPusher(int tag, int magnitude, int angle, bool wind) { diff --git a/src/p_spec_thinkers.h b/src/p_spec_thinkers.h index dfa4038ea..4508dfe6e 100644 --- a/src/p_spec_thinkers.h +++ b/src/p_spec_thinkers.h @@ -161,6 +161,12 @@ class DPusher : public DThinker { DECLARE_CLASS (DPusher, DThinker) HAS_OBJECT_POINTERS + + enum + { + PUSH_FACTOR = 128 + }; + public: enum EPusher { From aa340145acb654f58b07b61507dea830ceb77e56 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 31 Jan 2019 02:51:07 +0100 Subject: [PATCH 117/164] - moved the remaining thinker code to g_shared --- src/CMakeLists.txt | 15 +- src/fragglescript/t_func.cpp | 1 + src/{p_ceiling.cpp => g_shared/a_ceiling.cpp} | 0 src/g_shared/a_ceiling.h | 81 ++++ src/{p_floor.cpp => g_shared/a_floor.cpp} | 0 src/g_shared/a_floor.h | 173 +++++++++ src/{p_lights.cpp => g_shared/a_lights.cpp} | 0 src/g_shared/a_lights.h | 115 ++++++ src/g_shared/a_lighttransfer.cpp | 184 +++++++++ src/g_shared/a_lighttransfer.h | 46 +++ src/{p_pillar.cpp => g_shared/a_pillar.cpp} | 0 src/g_shared/a_pillar.h | 37 ++ src/{p_plats.cpp => g_shared/a_plats.cpp} | 0 src/g_shared/a_plats.h | 60 +++ src/{p_pusher.cpp => g_shared/a_pusher.cpp} | 0 src/g_shared/a_pusher.h | 46 +++ src/{p_scroll.cpp => g_shared/a_scroll.cpp} | 0 src/g_shared/a_scroll.h | 42 +++ src/p_spec.cpp | 145 ------- src/p_spec.h | 354 +----------------- src/p_spec_thinkers.h | 241 +----------- 21 files changed, 801 insertions(+), 739 deletions(-) rename src/{p_ceiling.cpp => g_shared/a_ceiling.cpp} (100%) create mode 100644 src/g_shared/a_ceiling.h rename src/{p_floor.cpp => g_shared/a_floor.cpp} (100%) create mode 100644 src/g_shared/a_floor.h rename src/{p_lights.cpp => g_shared/a_lights.cpp} (100%) create mode 100644 src/g_shared/a_lights.h create mode 100644 src/g_shared/a_lighttransfer.cpp create mode 100644 src/g_shared/a_lighttransfer.h rename src/{p_pillar.cpp => g_shared/a_pillar.cpp} (100%) create mode 100644 src/g_shared/a_pillar.h rename src/{p_plats.cpp => g_shared/a_plats.cpp} (100%) create mode 100644 src/g_shared/a_plats.h rename src/{p_pusher.cpp => g_shared/a_pusher.cpp} (100%) create mode 100644 src/g_shared/a_pusher.h rename src/{p_scroll.cpp => g_shared/a_scroll.cpp} (100%) create mode 100644 src/g_shared/a_scroll.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index badc2e44a..6c0929319 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -949,26 +949,19 @@ set (PCH_SOURCES p_3dmidtex.cpp p_acs.cpp p_actionfunctions.cpp - p_ceiling.cpp p_conversation.cpp p_destructible.cpp p_effect.cpp p_enemy.cpp - p_floor.cpp p_interaction.cpp - p_lights.cpp p_linkedsectors.cpp p_lnspec.cpp p_map.cpp p_maputl.cpp p_mobj.cpp p_openmap.cpp - p_pillar.cpp - p_plats.cpp p_pspr.cpp - p_pusher.cpp p_saveg.cpp - p_scroll.cpp p_secnodes.cpp p_sectors.cpp p_setup.cpp @@ -1030,6 +1023,14 @@ set (PCH_SOURCES g_shared/a_morph.cpp g_shared/a_quake.cpp g_shared/a_specialspot.cpp + g_shared/a_ceiling.cpp + g_shared/a_floor.cpp + g_shared/a_lights.cpp + g_shared/a_lighttransfer.cpp + g_shared/a_pillar.cpp + g_shared/a_plats.cpp + g_shared/a_pusher.cpp + g_shared/a_scroll.cpp g_statusbar/hudmessages.cpp g_statusbar/shared_hud.cpp g_statusbar/sbarinfo.cpp diff --git a/src/fragglescript/t_func.cpp b/src/fragglescript/t_func.cpp index 4ebd0b1e9..828da8d1e 100644 --- a/src/fragglescript/t_func.cpp +++ b/src/fragglescript/t_func.cpp @@ -50,6 +50,7 @@ #include "actorinlines.h" #include "scriptutil.h" #include "vm.h" +#include "a_lights.h" static FRandom pr_script("FScript"); diff --git a/src/p_ceiling.cpp b/src/g_shared/a_ceiling.cpp similarity index 100% rename from src/p_ceiling.cpp rename to src/g_shared/a_ceiling.cpp diff --git a/src/g_shared/a_ceiling.h b/src/g_shared/a_ceiling.h new file mode 100644 index 000000000..d1db8b70a --- /dev/null +++ b/src/g_shared/a_ceiling.h @@ -0,0 +1,81 @@ +#pragma once + +// +// P_CEILING +// + +// [RH] Changed these +class DCeiling : public DMovingCeiling +{ + DECLARE_CLASS (DCeiling, DMovingCeiling) +public: + enum ECeiling + { + ceilLowerByValue, + ceilRaiseByValue, + ceilMoveToValue, + ceilLowerToHighestFloor, + ceilLowerInstant, + ceilRaiseInstant, + ceilCrushAndRaise, + ceilLowerAndCrush, + ceil_placeholder, + ceilCrushRaiseAndStay, + ceilRaiseToNearest, + ceilLowerToLowest, + ceilLowerToFloor, + + // The following are only used by Generic_Ceiling + ceilRaiseToHighest, + ceilLowerToHighest, + ceilRaiseToLowest, + ceilLowerToNearest, + ceilRaiseToHighestFloor, + ceilRaiseToFloor, + ceilRaiseByTexture, + ceilLowerByTexture, + + genCeilingChg0, + genCeilingChgT, + genCeilingChg + }; + + enum class ECrushMode + { + crushDoom = 0, + crushHexen = 1, + crushSlowdown = 2 + }; + + + void Construct(sector_t *sec); + void Construct(sector_t *sec, double speed1, double speed2, int silent); + + void Serialize(FSerializer &arc); + void Tick (); + +protected: + ECeiling m_Type; + double m_BottomHeight; + double m_TopHeight; + double m_Speed; + double m_Speed1; // [RH] dnspeed of crushers + double m_Speed2; // [RH] upspeed of crushers + int m_Crush; + ECrushMode m_CrushMode; + int m_Silent; + int m_Direction; // 1 = up, 0 = waiting, -1 = down + + // [RH] Need these for BOOM-ish transferring ceilings + FTextureID m_Texture; + secspecial_t m_NewSpecial{}; + + // ID + int m_Tag; + int m_OldDirection; + + void PlayCeilingSound (); + + friend struct FLevelLocals; +}; + diff --git a/src/p_floor.cpp b/src/g_shared/a_floor.cpp similarity index 100% rename from src/p_floor.cpp rename to src/g_shared/a_floor.cpp diff --git a/src/g_shared/a_floor.h b/src/g_shared/a_floor.h new file mode 100644 index 000000000..e0331bca6 --- /dev/null +++ b/src/g_shared/a_floor.h @@ -0,0 +1,173 @@ +#pragma once + +// +// P_FLOOR +// + +class DFloor : public DMovingFloor +{ + DECLARE_CLASS (DFloor, DMovingFloor) +public: + enum EFloor + { + floorLowerToLowest, + floorLowerToNearest, + floorLowerToHighest, + floorLowerByValue, + floorRaiseByValue, + floorRaiseToHighest, + floorRaiseToNearest, + floorRaiseAndCrush, + floorRaiseAndCrushDoom, + floorCrushStop, + floorLowerInstant, + floorRaiseInstant, + floorMoveToValue, + floorRaiseToLowestCeiling, + floorRaiseByTexture, + + floorLowerAndChange, + floorRaiseAndChange, + + floorRaiseToLowest, + floorRaiseToCeiling, + floorLowerToLowestCeiling, + floorLowerByTexture, + floorLowerToCeiling, + + donutRaise, + + buildStair, + waitStair, + resetStair, + + // Not to be used as parameters to EV_DoFloor() + genFloorChg0, + genFloorChgT, + genFloorChg + }; + + // [RH] Changed to use Hexen-ish specials + enum EStair + { + buildUp, + buildDown + }; + + enum EStairType + { + stairUseSpecials = 1, + stairSync = 2, + stairCrush = 4, + }; + + void Construct(sector_t *sec); + + void Serialize(FSerializer &arc); + void Tick (); + +//protected: + EFloor m_Type; + int m_Crush; + bool m_Hexencrush; + bool m_Instant; + int m_Direction; + secspecial_t m_NewSpecial{}; + FTextureID m_Texture; + double m_FloorDestDist; + double m_Speed; + + // [RH] New parameters used to reset and delay stairs + double m_OrgDist; + int m_ResetCount; + int m_Delay; + int m_PauseTime; + int m_StepTime; + int m_PerStepTime; + + void StartFloorSound (); + void SetFloorChangeType (sector_t *sec, int change); + friend struct FLevelLocals; +}; + +class DElevator : public DMover +{ + DECLARE_CLASS (DElevator, DMover) + HAS_OBJECT_POINTERS +public: + enum EElevator + { + elevateUp, + elevateDown, + elevateCurrent, + // [RH] For FloorAndCeiling_Raise/Lower + elevateRaise, + elevateLower + }; + + void Construct(sector_t *sec); + + void OnDestroy() override; + void Serialize(FSerializer &arc); + void Tick (); + +protected: + EElevator m_Type; + int m_Direction; + double m_FloorDestDist; + double m_CeilingDestDist; + double m_Speed; + TObjPtr m_Interp_Ceiling; + TObjPtr m_Interp_Floor; + + void StartFloorSound (); + friend struct FLevelLocals; +}; + + +class DWaggleBase : public DMover +{ + DECLARE_CLASS (DWaggleBase, DMover) + HAS_OBJECT_POINTERS +public: + void Construct(sector_t *sec); + + void Serialize(FSerializer &arc); + +protected: + double m_OriginalDist; + double m_Accumulator; + double m_AccDelta; + double m_TargetScale; + double m_Scale; + double m_ScaleDelta; + int m_Ticker; + int m_State; + + friend struct FLevelLocals; + void DoWaggle (bool ceiling); +}; + +class DFloorWaggle : public DWaggleBase +{ + DECLARE_CLASS (DFloorWaggle, DWaggleBase) +public: + void Construct(sector_t *sec); + void Tick (); +}; + +class DCeilingWaggle : public DWaggleBase +{ + DECLARE_CLASS (DCeilingWaggle, DWaggleBase) +public: + void Construct(sector_t *sec); + void Tick (); +}; + +//jff 3/15/98 pure texture/type change for better generalized support +enum EChange +{ + trigChangeOnly, + numChangeOnly, +}; + diff --git a/src/p_lights.cpp b/src/g_shared/a_lights.cpp similarity index 100% rename from src/p_lights.cpp rename to src/g_shared/a_lights.cpp diff --git a/src/g_shared/a_lights.h b/src/g_shared/a_lights.h new file mode 100644 index 000000000..dde32d904 --- /dev/null +++ b/src/g_shared/a_lights.h @@ -0,0 +1,115 @@ +#pragma once + +class DLighting : public DSectorEffect +{ + DECLARE_CLASS(DLighting, DSectorEffect) +public: + static const int DEFAULT_STAT = STAT_LIGHT; +}; + +class DFireFlicker : public DLighting +{ + DECLARE_CLASS(DFireFlicker, DLighting) +public: + void Construct(sector_t *sector); + void Construct(sector_t *sector, int upper, int lower); + void Serialize(FSerializer &arc); + void Tick(); +protected: + int m_Count; + int m_MaxLight; + int m_MinLight; +}; + +class DFlicker : public DLighting +{ + DECLARE_CLASS(DFlicker, DLighting) +public: + void Construct(sector_t *sector, int upper, int lower); + void Serialize(FSerializer &arc); + void Tick(); +protected: + int m_Count; + int m_MaxLight; + int m_MinLight; +}; + +class DLightFlash : public DLighting +{ + DECLARE_CLASS(DLightFlash, DLighting) +public: + void Construct(sector_t *sector); + void Construct(sector_t *sector, int min, int max); + void Serialize(FSerializer &arc); + void Tick(); +protected: + int m_Count; + int m_MaxLight; + int m_MinLight; + int m_MaxTime; + int m_MinTime; +}; + +class DStrobe : public DLighting +{ + DECLARE_CLASS(DStrobe, DLighting) +public: + void Construct(sector_t *sector, int utics, int ltics, bool inSync); + void Construct(sector_t *sector, int upper, int lower, int utics, int ltics); + void Serialize(FSerializer &arc); + void Tick(); +protected: + int m_Count; + int m_MinLight; + int m_MaxLight; + int m_DarkTime; + int m_BrightTime; +}; + +class DGlow : public DLighting +{ + DECLARE_CLASS(DGlow, DLighting) +public: + void Construct(sector_t *sector); + void Serialize(FSerializer &arc); + void Tick(); +protected: + int m_MinLight; + int m_MaxLight; + int m_Direction; +}; + +// [RH] Glow from Light_Glow and Light_Fade specials +class DGlow2 : public DLighting +{ + DECLARE_CLASS(DGlow2, DLighting) +public: + void Construct(sector_t *sector, int start, int end, int tics, bool oneshot); + void Serialize(FSerializer &arc); + void Tick(); +protected: + int m_Start; + int m_End; + int m_MaxTics; + int m_Tics; + bool m_OneShot; +}; + +// [RH] Phased light thinker +class DPhased : public DLighting +{ + DECLARE_CLASS(DPhased, DLighting) +public: + void Construct(sector_t *sector, int baselevel = 0, int phase = 0); + // These are for internal use only but the Create template needs access to them. + void Construct(); + void Propagate(); + + void Serialize(FSerializer &arc); + void Tick(); +protected: + uint8_t m_BaseLevel; + uint8_t m_Phase; +private: + int PhaseHelper(sector_t *sector, int index, int light, sector_t *prev); +}; diff --git a/src/g_shared/a_lighttransfer.cpp b/src/g_shared/a_lighttransfer.cpp new file mode 100644 index 000000000..931de98da --- /dev/null +++ b/src/g_shared/a_lighttransfer.cpp @@ -0,0 +1,184 @@ +/* + ** a_lighttransfer.cpp + ** + **--------------------------------------------------------------------------- + ** Copyright 1998-2016 Randy Heit + ** Copyright 2003-2018 Christoph Oelckers + ** All rights reserved. + ** + ** Redistribution and use in source and binary forms, with or without + ** modification, are permitted provided that the following conditions + ** are met: + ** + ** 1. Redistributions of source code must retain the above copyright + ** notice, this list of conditions and the following disclaimer. + ** 2. Redistributions in binary form must reproduce the above copyright + ** notice, this list of conditions and the following disclaimer in the + ** documentation and/or other materials provided with the distribution. + ** 3. The name of the author may not be used to endorse or promote products + ** derived from this software without specific prior written permission. + ** + ** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + ** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + ** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + ** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + ** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + ** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + ** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + **--------------------------------------------------------------------------- + ** + */ + +#include "p_spec.h" +#include "a_lighttransfer.h" +#include "serializer.h" +#include "g_levellocals.h" + +// +// SPECIAL SPAWNING +// + +IMPLEMENT_CLASS(DLightTransfer, false, false) + +void DLightTransfer::Serialize(FSerializer &arc) +{ + Super::Serialize (arc); + arc("lastlight", LastLight) + ("source", Source) + ("targettag", TargetTag) + ("copyfloor", CopyFloor); +} + +void DLightTransfer::Construct(sector_t *srcSec, int target, bool copyFloor) +{ + int secnum; + + Source = srcSec; + TargetTag = target; + CopyFloor = copyFloor; + DoTransfer (LastLight = srcSec->lightlevel, target, copyFloor); + + if (copyFloor) + { + auto itr = Level->GetSectorTagIterator(target); + while ((secnum = itr.Next()) >= 0) + Level->sectors[secnum].ChangeFlags(sector_t::floor, 0, PLANEF_ABSLIGHTING); + } + else + { + auto itr = Level->GetSectorTagIterator(target); + while ((secnum = itr.Next()) >= 0) + Level->sectors[secnum].ChangeFlags(sector_t::ceiling, 0, PLANEF_ABSLIGHTING); + } +} + +void DLightTransfer::Tick () +{ + int light = Source->lightlevel; + + if (light != LastLight) + { + LastLight = light; + DoTransfer (light, TargetTag, CopyFloor); + } +} + +void DLightTransfer::DoTransfer (int llevel, int target, bool floor) +{ + int secnum; + + if (floor) + { + auto itr = Level->GetSectorTagIterator(target); + while ((secnum = itr.Next()) >= 0) + Level->sectors[secnum].SetPlaneLight(sector_t::floor, llevel); + } + else + { + auto itr = Level->GetSectorTagIterator(target); + while ((secnum = itr.Next()) >= 0) + Level->sectors[secnum].SetPlaneLight(sector_t::ceiling, llevel); + } +} + + +IMPLEMENT_CLASS(DWallLightTransfer, false, false) + +void DWallLightTransfer::Serialize(FSerializer &arc) +{ + Super::Serialize (arc); + arc("lastlight", LastLight) + ("source", Source) + ("targetid", TargetID) + ("flags", Flags); +} + +void DWallLightTransfer::Construct(sector_t *srcSec, int target, uint8_t flags) +{ + int linenum; + int wallflags; + + Source = srcSec; + TargetID = target; + Flags = flags; + DoTransfer (LastLight = srcSec->GetLightLevel(), target, Flags); + + if (!(flags & WLF_NOFAKECONTRAST)) + { + wallflags = WALLF_ABSLIGHTING; + } + else + { + wallflags = WALLF_ABSLIGHTING | WALLF_NOFAKECONTRAST; + } + + auto itr = Level->GetLineIdIterator(target); + while ((linenum = itr.Next()) >= 0) + { + if (flags & WLF_SIDE1 && Level->lines[linenum].sidedef[0] != NULL) + { + Level->lines[linenum].sidedef[0]->Flags |= wallflags; + } + + if (flags & WLF_SIDE2 && Level->lines[linenum].sidedef[1] != NULL) + { + Level->lines[linenum].sidedef[1]->Flags |= wallflags; + } + } +} + +void DWallLightTransfer::Tick () +{ + short light = sector_t::ClampLight(Source->lightlevel); + + if (light != LastLight) + { + LastLight = light; + DoTransfer (light, TargetID, Flags); + } +} + +void DWallLightTransfer::DoTransfer (short lightlevel, int target, uint8_t flags) +{ + int linenum; + + auto itr = Level->GetLineIdIterator(target); + while ((linenum = itr.Next()) >= 0) + { + line_t *line = &Level->lines[linenum]; + + if (flags & WLF_SIDE1 && line->sidedef[0] != NULL) + { + line->sidedef[0]->SetLight(lightlevel); + } + + if (flags & WLF_SIDE2 && line->sidedef[1] != NULL) + { + line->sidedef[1]->SetLight(lightlevel); + } + } +} + diff --git a/src/g_shared/a_lighttransfer.h b/src/g_shared/a_lighttransfer.h new file mode 100644 index 000000000..2dd2c9eee --- /dev/null +++ b/src/g_shared/a_lighttransfer.h @@ -0,0 +1,46 @@ +#pragma once + +class DLightTransfer : public DThinker +{ + DECLARE_CLASS (DLightTransfer, DThinker) + +public: + static const int DEFAULT_STAT = STAT_LIGHTTRANSFER; + void Construct(sector_t *srcSec, int target, bool copyFloor); + void Serialize(FSerializer &arc); + void Tick (); + +protected: + void DoTransfer (int level, int target, bool floor); + + sector_t *Source; + int TargetTag; + bool CopyFloor; + short LastLight; +}; + +class DWallLightTransfer : public DThinker +{ + enum + { + WLF_SIDE1=1, + WLF_SIDE2=2, + WLF_NOFAKECONTRAST=4 + }; + + DECLARE_CLASS (DWallLightTransfer, DThinker) +public: + static const int DEFAULT_STAT = STAT_LIGHTTRANSFER; + void Construct(sector_t *srcSec, int target, uint8_t flags); + void Serialize(FSerializer &arc); + void Tick (); + +protected: + void DoTransfer (short level, int target, uint8_t flags); + + sector_t *Source; + int TargetID; + short LastLight; + uint8_t Flags; +}; + diff --git a/src/p_pillar.cpp b/src/g_shared/a_pillar.cpp similarity index 100% rename from src/p_pillar.cpp rename to src/g_shared/a_pillar.cpp diff --git a/src/g_shared/a_pillar.h b/src/g_shared/a_pillar.h new file mode 100644 index 000000000..19e7c2f4f --- /dev/null +++ b/src/g_shared/a_pillar.h @@ -0,0 +1,37 @@ +#pragma once + +// +// [RH] +// P_PILLAR +// + +class DPillar : public DMover +{ + DECLARE_CLASS (DPillar, DMover) + HAS_OBJECT_POINTERS +public: + enum EPillar + { + pillarBuild, + pillarOpen + + }; + + void Construct (sector_t *sector, EPillar type, double speed, double height, double height2, int crush, bool hexencrush); + + void Serialize(FSerializer &arc); + void Tick (); + void OnDestroy() override; + +protected: + EPillar m_Type; + double m_FloorSpeed; + double m_CeilingSpeed; + double m_FloorTarget; + double m_CeilingTarget; + int m_Crush; + bool m_Hexencrush; + TObjPtr m_Interp_Ceiling; + TObjPtr m_Interp_Floor; +}; + diff --git a/src/p_plats.cpp b/src/g_shared/a_plats.cpp similarity index 100% rename from src/p_plats.cpp rename to src/g_shared/a_plats.cpp diff --git a/src/g_shared/a_plats.h b/src/g_shared/a_plats.h new file mode 100644 index 000000000..947f104cf --- /dev/null +++ b/src/g_shared/a_plats.h @@ -0,0 +1,60 @@ +#pragma once + +// +// P_PLATS +// +class DPlat : public DMovingFloor +{ + DECLARE_CLASS (DPlat, DMovingFloor) +public: + enum EPlatState + { + up, + down, + waiting, + in_stasis + }; + + enum EPlatType + { + platPerpetualRaise, + platDownWaitUpStay, + platDownWaitUpStayStone, + platUpWaitDownStay, + platUpNearestWaitDownStay, + platDownByValue, + platUpByValue, + platUpByValueStay, + platRaiseAndStay, + platToggle, + platDownToNearestFloor, + platDownToLowestCeiling, + platRaiseAndStayLockout, + }; + + void Serialize(FSerializer &arc); + void Tick (); + + bool IsLift() const { return m_Type == platDownWaitUpStay || m_Type == platDownWaitUpStayStone; } + void Construct(sector_t *sector); + +protected: + + double m_Speed; + double m_Low; + double m_High; + int m_Wait; + int m_Count; + EPlatState m_Status; + EPlatState m_OldStatus; + int m_Crush; + int m_Tag; + EPlatType m_Type; + + void PlayPlatSound (const char *sound); + void Reactivate (); + void Stop (); + + friend struct FLevelLocals; +}; + diff --git a/src/p_pusher.cpp b/src/g_shared/a_pusher.cpp similarity index 100% rename from src/p_pusher.cpp rename to src/g_shared/a_pusher.cpp diff --git a/src/g_shared/a_pusher.h b/src/g_shared/a_pusher.h new file mode 100644 index 000000000..c3cf30efa --- /dev/null +++ b/src/g_shared/a_pusher.h @@ -0,0 +1,46 @@ +#pragma once + +// phares 3/20/98: added new model of Pushers for push/pull effects + +class DPusher : public DThinker +{ + DECLARE_CLASS (DPusher, DThinker) + HAS_OBJECT_POINTERS + + enum + { + PUSH_FACTOR = 128 + }; + +public: + enum EPusher + { + p_push, + p_pull, + p_wind, + p_current + }; + + void Construct(EPusher type, line_t *l, int magnitude, int angle, AActor *source, int affectee); + void Serialize(FSerializer &arc); + int CheckForSectorMatch (EPusher type, int tag); + void ChangeValues (int magnitude, int angle) + { + DAngle ang = angle * (360. / 256.); + m_PushVec = ang.ToVector(magnitude); + m_Magnitude = magnitude; + } + + void Tick (); + +protected: + EPusher m_Type; + TObjPtr m_Source;// Point source if point pusher + DVector2 m_PushVec; + double m_Magnitude; // Vector strength for point pusher + double m_Radius; // Effective radius for point pusher + int m_Affectee; // Number of affected sector + + friend bool PIT_PushThing (AActor *thing); +}; + diff --git a/src/p_scroll.cpp b/src/g_shared/a_scroll.cpp similarity index 100% rename from src/p_scroll.cpp rename to src/g_shared/a_scroll.cpp diff --git a/src/g_shared/a_scroll.h b/src/g_shared/a_scroll.h new file mode 100644 index 000000000..95d985117 --- /dev/null +++ b/src/g_shared/a_scroll.h @@ -0,0 +1,42 @@ +#pragma once + +//----------------------------------------------------------------------------- +// +// killough 3/7/98: Add generalized scroll effects +// +//----------------------------------------------------------------------------- + +class DScroller : public DThinker +{ + DECLARE_CLASS (DScroller, DThinker) + HAS_OBJECT_POINTERS +public: + static const int DEFAULT_STAT = STAT_SCROLLER; + + void Construct(EScroll type, double dx, double dy, sector_t *control, sector_t *sec, side_t *side, int accel, EScrollPos scrollpos = EScrollPos::scw_all); + void Construct(double dx, double dy, const line_t *l, sector_t *control, int accel, EScrollPos scrollpos = EScrollPos::scw_all); + void OnDestroy() override; + + void Serialize(FSerializer &arc); + void Tick (); + + bool AffectsWall (side_t * wall) const { return m_Side == wall; } + side_t *GetWall () const { return m_Side; } + sector_t *GetSector() const { return m_Sector; } + void SetRate (double dx, double dy) { m_dx = dx; m_dy = dy; } + bool IsType (EScroll type) const { return type == m_Type; } + EScrollPos GetScrollParts() const { return m_Parts; } + +protected: + EScroll m_Type; // Type of scroll effect + double m_dx, m_dy; // (dx,dy) scroll speeds + sector_t *m_Sector; // Affected sector + side_t *m_Side; // ... or side + sector_t *m_Controller; // Control sector (nullptr if none) used to control scrolling + double m_LastHeight; // Last known height of control sector + double m_vdx, m_vdy; // Accumulated velocity if accelerative + int m_Accel; // Whether it's accelerative + EScrollPos m_Parts; // Which parts of a sidedef are being scrolled? + TObjPtr m_Interpolations[3]; +}; + diff --git a/src/p_spec.cpp b/src/p_spec.cpp index 7271e9401..65f10d0cd 100644 --- a/src/p_spec.cpp +++ b/src/p_spec.cpp @@ -683,151 +683,6 @@ void P_UpdateSpecials (FLevelLocals *Level) } } -// -// SPECIAL SPAWNING -// - -IMPLEMENT_CLASS(DLightTransfer, false, false) - -void DLightTransfer::Serialize(FSerializer &arc) -{ - Super::Serialize (arc); - arc("lastlight", LastLight) - ("source", Source) - ("targettag", TargetTag) - ("copyfloor", CopyFloor); -} - -void DLightTransfer::Construct(sector_t *srcSec, int target, bool copyFloor) -{ - int secnum; - - Source = srcSec; - TargetTag = target; - CopyFloor = copyFloor; - DoTransfer (LastLight = srcSec->lightlevel, target, copyFloor); - - if (copyFloor) - { - auto itr = Level->GetSectorTagIterator(target); - while ((secnum = itr.Next()) >= 0) - Level->sectors[secnum].ChangeFlags(sector_t::floor, 0, PLANEF_ABSLIGHTING); - } - else - { - auto itr = Level->GetSectorTagIterator(target); - while ((secnum = itr.Next()) >= 0) - Level->sectors[secnum].ChangeFlags(sector_t::ceiling, 0, PLANEF_ABSLIGHTING); - } -} - -void DLightTransfer::Tick () -{ - int light = Source->lightlevel; - - if (light != LastLight) - { - LastLight = light; - DoTransfer (light, TargetTag, CopyFloor); - } -} - -void DLightTransfer::DoTransfer (int llevel, int target, bool floor) -{ - int secnum; - - if (floor) - { - auto itr = Level->GetSectorTagIterator(target); - while ((secnum = itr.Next()) >= 0) - Level->sectors[secnum].SetPlaneLight(sector_t::floor, llevel); - } - else - { - auto itr = Level->GetSectorTagIterator(target); - while ((secnum = itr.Next()) >= 0) - Level->sectors[secnum].SetPlaneLight(sector_t::ceiling, llevel); - } -} - - -IMPLEMENT_CLASS(DWallLightTransfer, false, false) - -void DWallLightTransfer::Serialize(FSerializer &arc) -{ - Super::Serialize (arc); - arc("lastlight", LastLight) - ("source", Source) - ("targetid", TargetID) - ("flags", Flags); -} - -void DWallLightTransfer::Construct(sector_t *srcSec, int target, uint8_t flags) -{ - int linenum; - int wallflags; - - Source = srcSec; - TargetID = target; - Flags = flags; - DoTransfer (LastLight = srcSec->GetLightLevel(), target, Flags); - - if (!(flags & WLF_NOFAKECONTRAST)) - { - wallflags = WALLF_ABSLIGHTING; - } - else - { - wallflags = WALLF_ABSLIGHTING | WALLF_NOFAKECONTRAST; - } - - auto itr = Level->GetLineIdIterator(target); - while ((linenum = itr.Next()) >= 0) - { - if (flags & WLF_SIDE1 && Level->lines[linenum].sidedef[0] != NULL) - { - Level->lines[linenum].sidedef[0]->Flags |= wallflags; - } - - if (flags & WLF_SIDE2 && Level->lines[linenum].sidedef[1] != NULL) - { - Level->lines[linenum].sidedef[1]->Flags |= wallflags; - } - } -} - -void DWallLightTransfer::Tick () -{ - short light = sector_t::ClampLight(Source->lightlevel); - - if (light != LastLight) - { - LastLight = light; - DoTransfer (light, TargetID, Flags); - } -} - -void DWallLightTransfer::DoTransfer (short lightlevel, int target, uint8_t flags) -{ - int linenum; - - auto itr = Level->GetLineIdIterator(target); - while ((linenum = itr.Next()) >= 0) - { - line_t *line = &Level->lines[linenum]; - - if (flags & WLF_SIDE1 && line->sidedef[0] != NULL) - { - line->sidedef[0]->SetLight(lightlevel); - } - - if (flags & WLF_SIDE2 && line->sidedef[1] != NULL) - { - line->sidedef[1]->SetLight(lightlevel); - } - } -} - //////////////////////////////////////////////////////////////////////////// // // FRICTION EFFECTS diff --git a/src/p_spec.h b/src/p_spec.h index c95460915..9508dd225 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -115,13 +115,6 @@ inline sector_t *getNextSector (line_t *line, const sector_t *sec) #include "p_tags.h" -class DLighting : public DSectorEffect -{ - DECLARE_CLASS(DLighting, DSectorEffect) -public: - static const int DEFAULT_STAT = STAT_LIGHT; -}; - // // P_SWITCH // @@ -131,350 +124,11 @@ public: bool P_ChangeSwitchTexture (side_t *side, int useAgain, uint8_t special, bool *quest=NULL); bool P_CheckSwitchRange(AActor *user, line_t *line, int sideno, const DVector3 *optpos = NULL); -// -// P_PLATS -// -class DPlat : public DMovingFloor -{ - DECLARE_CLASS (DPlat, DMovingFloor) -public: - enum EPlatState - { - up, - down, - waiting, - in_stasis - }; - - enum EPlatType - { - platPerpetualRaise, - platDownWaitUpStay, - platDownWaitUpStayStone, - platUpWaitDownStay, - platUpNearestWaitDownStay, - platDownByValue, - platUpByValue, - platUpByValueStay, - platRaiseAndStay, - platToggle, - platDownToNearestFloor, - platDownToLowestCeiling, - platRaiseAndStayLockout, - }; - - void Serialize(FSerializer &arc); - void Tick (); - - bool IsLift() const { return m_Type == platDownWaitUpStay || m_Type == platDownWaitUpStayStone; } - void Construct(sector_t *sector); - -protected: - - double m_Speed; - double m_Low; - double m_High; - int m_Wait; - int m_Count; - EPlatState m_Status; - EPlatState m_OldStatus; - int m_Crush; - int m_Tag; - EPlatType m_Type; - - void PlayPlatSound (const char *sound); - void Reactivate (); - void Stop (); - - friend struct FLevelLocals; -}; - -// -// [RH] -// P_PILLAR -// - -class DPillar : public DMover -{ - DECLARE_CLASS (DPillar, DMover) - HAS_OBJECT_POINTERS -public: - enum EPillar - { - pillarBuild, - pillarOpen - - }; - - void Construct (sector_t *sector, EPillar type, double speed, double height, double height2, int crush, bool hexencrush); - - void Serialize(FSerializer &arc); - void Tick (); - void OnDestroy() override; - -protected: - EPillar m_Type; - double m_FloorSpeed; - double m_CeilingSpeed; - double m_FloorTarget; - double m_CeilingTarget; - int m_Crush; - bool m_Hexencrush; - TObjPtr m_Interp_Ceiling; - TObjPtr m_Interp_Floor; -}; - +#include "a_plats.h" +#include "a_pillar.h" #include "a_doors.h" -// -// P_CEILING -// - -// [RH] Changed these -class DCeiling : public DMovingCeiling -{ - DECLARE_CLASS (DCeiling, DMovingCeiling) -public: - enum ECeiling - { - ceilLowerByValue, - ceilRaiseByValue, - ceilMoveToValue, - ceilLowerToHighestFloor, - ceilLowerInstant, - ceilRaiseInstant, - ceilCrushAndRaise, - ceilLowerAndCrush, - ceil_placeholder, - ceilCrushRaiseAndStay, - ceilRaiseToNearest, - ceilLowerToLowest, - ceilLowerToFloor, - - // The following are only used by Generic_Ceiling - ceilRaiseToHighest, - ceilLowerToHighest, - ceilRaiseToLowest, - ceilLowerToNearest, - ceilRaiseToHighestFloor, - ceilRaiseToFloor, - ceilRaiseByTexture, - ceilLowerByTexture, - - genCeilingChg0, - genCeilingChgT, - genCeilingChg - }; - - enum class ECrushMode - { - crushDoom = 0, - crushHexen = 1, - crushSlowdown = 2 - }; - - - void Construct(sector_t *sec); - void Construct(sector_t *sec, double speed1, double speed2, int silent); - - void Serialize(FSerializer &arc); - void Tick (); - -protected: - ECeiling m_Type; - double m_BottomHeight; - double m_TopHeight; - double m_Speed; - double m_Speed1; // [RH] dnspeed of crushers - double m_Speed2; // [RH] upspeed of crushers - int m_Crush; - ECrushMode m_CrushMode; - int m_Silent; - int m_Direction; // 1 = up, 0 = waiting, -1 = down - - // [RH] Need these for BOOM-ish transferring ceilings - FTextureID m_Texture; - secspecial_t m_NewSpecial{}; - - // ID - int m_Tag; - int m_OldDirection; - - void PlayCeilingSound (); - - friend struct FLevelLocals; -}; - -// -// P_FLOOR -// - -class DFloor : public DMovingFloor -{ - DECLARE_CLASS (DFloor, DMovingFloor) -public: - enum EFloor - { - floorLowerToLowest, - floorLowerToNearest, - floorLowerToHighest, - floorLowerByValue, - floorRaiseByValue, - floorRaiseToHighest, - floorRaiseToNearest, - floorRaiseAndCrush, - floorRaiseAndCrushDoom, - floorCrushStop, - floorLowerInstant, - floorRaiseInstant, - floorMoveToValue, - floorRaiseToLowestCeiling, - floorRaiseByTexture, - - floorLowerAndChange, - floorRaiseAndChange, - - floorRaiseToLowest, - floorRaiseToCeiling, - floorLowerToLowestCeiling, - floorLowerByTexture, - floorLowerToCeiling, - - donutRaise, - - buildStair, - waitStair, - resetStair, - - // Not to be used as parameters to EV_DoFloor() - genFloorChg0, - genFloorChgT, - genFloorChg - }; - - // [RH] Changed to use Hexen-ish specials - enum EStair - { - buildUp, - buildDown - }; - - enum EStairType - { - stairUseSpecials = 1, - stairSync = 2, - stairCrush = 4, - }; - - void Construct(sector_t *sec); - - void Serialize(FSerializer &arc); - void Tick (); - -//protected: - EFloor m_Type; - int m_Crush; - bool m_Hexencrush; - bool m_Instant; - int m_Direction; - secspecial_t m_NewSpecial{}; - FTextureID m_Texture; - double m_FloorDestDist; - double m_Speed; - - // [RH] New parameters used to reset and delay stairs - double m_OrgDist; - int m_ResetCount; - int m_Delay; - int m_PauseTime; - int m_StepTime; - int m_PerStepTime; - - void StartFloorSound (); - void SetFloorChangeType (sector_t *sec, int change); - friend struct FLevelLocals; -}; - -class DElevator : public DMover -{ - DECLARE_CLASS (DElevator, DMover) - HAS_OBJECT_POINTERS -public: - enum EElevator - { - elevateUp, - elevateDown, - elevateCurrent, - // [RH] For FloorAndCeiling_Raise/Lower - elevateRaise, - elevateLower - }; - - void Construct(sector_t *sec); - - void OnDestroy() override; - void Serialize(FSerializer &arc); - void Tick (); - -protected: - EElevator m_Type; - int m_Direction; - double m_FloorDestDist; - double m_CeilingDestDist; - double m_Speed; - TObjPtr m_Interp_Ceiling; - TObjPtr m_Interp_Floor; - - void StartFloorSound (); - friend struct FLevelLocals; -}; - - -class DWaggleBase : public DMover -{ - DECLARE_CLASS (DWaggleBase, DMover) - HAS_OBJECT_POINTERS -public: - void Construct(sector_t *sec); - - void Serialize(FSerializer &arc); - -protected: - double m_OriginalDist; - double m_Accumulator; - double m_AccDelta; - double m_TargetScale; - double m_Scale; - double m_ScaleDelta; - int m_Ticker; - int m_State; - - friend struct FLevelLocals; - void DoWaggle (bool ceiling); -}; - -class DFloorWaggle : public DWaggleBase -{ - DECLARE_CLASS (DFloorWaggle, DWaggleBase) -public: - void Construct(sector_t *sec); - void Tick (); -}; - -class DCeilingWaggle : public DWaggleBase -{ - DECLARE_CLASS (DCeilingWaggle, DWaggleBase) -public: - void Construct(sector_t *sec); - void Tick (); -}; - -//jff 3/15/98 pure texture/type change for better generalized support -enum EChange -{ - trigChangeOnly, - numChangeOnly, -}; - +#include "a_ceiling.h" +#include "a_floor.h" // // P_TELEPT // diff --git a/src/p_spec_thinkers.h b/src/p_spec_thinkers.h index 4508dfe6e..f616c936a 100644 --- a/src/p_spec_thinkers.h +++ b/src/p_spec_thinkers.h @@ -2,240 +2,7 @@ #include "p_spec.h" #include "r_defs.h" - -class DLightTransfer : public DThinker -{ - DECLARE_CLASS (DLightTransfer, DThinker) - -public: - static const int DEFAULT_STAT = STAT_LIGHTTRANSFER; - void Construct(sector_t *srcSec, int target, bool copyFloor); - void Serialize(FSerializer &arc); - void Tick (); - -protected: - void DoTransfer (int level, int target, bool floor); - - sector_t *Source; - int TargetTag; - bool CopyFloor; - short LastLight; -}; - -class DWallLightTransfer : public DThinker -{ - enum - { - WLF_SIDE1=1, - WLF_SIDE2=2, - WLF_NOFAKECONTRAST=4 - }; - - DECLARE_CLASS (DWallLightTransfer, DThinker) -public: - static const int DEFAULT_STAT = STAT_LIGHTTRANSFER; - void Construct(sector_t *srcSec, int target, uint8_t flags); - void Serialize(FSerializer &arc); - void Tick (); - -protected: - void DoTransfer (short level, int target, uint8_t flags); - - sector_t *Source; - int TargetID; - short LastLight; - uint8_t Flags; -}; - - -class DFireFlicker : public DLighting -{ - DECLARE_CLASS(DFireFlicker, DLighting) -public: - void Construct(sector_t *sector); - void Construct(sector_t *sector, int upper, int lower); - void Serialize(FSerializer &arc); - void Tick(); -protected: - int m_Count; - int m_MaxLight; - int m_MinLight; -}; - -class DFlicker : public DLighting -{ - DECLARE_CLASS(DFlicker, DLighting) -public: - void Construct(sector_t *sector, int upper, int lower); - void Serialize(FSerializer &arc); - void Tick(); -protected: - int m_Count; - int m_MaxLight; - int m_MinLight; -}; - -class DLightFlash : public DLighting -{ - DECLARE_CLASS(DLightFlash, DLighting) -public: - void Construct(sector_t *sector); - void Construct(sector_t *sector, int min, int max); - void Serialize(FSerializer &arc); - void Tick(); -protected: - int m_Count; - int m_MaxLight; - int m_MinLight; - int m_MaxTime; - int m_MinTime; -}; - -class DStrobe : public DLighting -{ - DECLARE_CLASS(DStrobe, DLighting) -public: - void Construct(sector_t *sector, int utics, int ltics, bool inSync); - void Construct(sector_t *sector, int upper, int lower, int utics, int ltics); - void Serialize(FSerializer &arc); - void Tick(); -protected: - int m_Count; - int m_MinLight; - int m_MaxLight; - int m_DarkTime; - int m_BrightTime; -}; - -class DGlow : public DLighting -{ - DECLARE_CLASS(DGlow, DLighting) -public: - void Construct(sector_t *sector); - void Serialize(FSerializer &arc); - void Tick(); -protected: - int m_MinLight; - int m_MaxLight; - int m_Direction; -}; - -// [RH] Glow from Light_Glow and Light_Fade specials -class DGlow2 : public DLighting -{ - DECLARE_CLASS(DGlow2, DLighting) -public: - void Construct(sector_t *sector, int start, int end, int tics, bool oneshot); - void Serialize(FSerializer &arc); - void Tick(); -protected: - int m_Start; - int m_End; - int m_MaxTics; - int m_Tics; - bool m_OneShot; -}; - -// [RH] Phased light thinker -class DPhased : public DLighting -{ - DECLARE_CLASS(DPhased, DLighting) -public: - void Construct(sector_t *sector, int baselevel = 0, int phase = 0); - // These are for internal use only but the Create template needs access to them. - void Construct(); - void Propagate(); - - void Serialize(FSerializer &arc); - void Tick(); -protected: - uint8_t m_BaseLevel; - uint8_t m_Phase; -private: - int PhaseHelper(sector_t *sector, int index, int light, sector_t *prev); -}; - -// phares 3/20/98: added new model of Pushers for push/pull effects - -class DPusher : public DThinker -{ - DECLARE_CLASS (DPusher, DThinker) - HAS_OBJECT_POINTERS - - enum - { - PUSH_FACTOR = 128 - }; - -public: - enum EPusher - { - p_push, - p_pull, - p_wind, - p_current - }; - - void Construct(EPusher type, line_t *l, int magnitude, int angle, AActor *source, int affectee); - void Serialize(FSerializer &arc); - int CheckForSectorMatch (EPusher type, int tag); - void ChangeValues (int magnitude, int angle) - { - DAngle ang = angle * (360. / 256.); - m_PushVec = ang.ToVector(magnitude); - m_Magnitude = magnitude; - } - - void Tick (); - -protected: - EPusher m_Type; - TObjPtr m_Source;// Point source if point pusher - DVector2 m_PushVec; - double m_Magnitude; // Vector strength for point pusher - double m_Radius; // Effective radius for point pusher - int m_Affectee; // Number of affected sector - - friend bool PIT_PushThing (AActor *thing); -}; - -//----------------------------------------------------------------------------- -// -// killough 3/7/98: Add generalized scroll effects -// -//----------------------------------------------------------------------------- - -class DScroller : public DThinker -{ - DECLARE_CLASS (DScroller, DThinker) - HAS_OBJECT_POINTERS -public: - static const int DEFAULT_STAT = STAT_SCROLLER; - - void Construct(EScroll type, double dx, double dy, sector_t *control, sector_t *sec, side_t *side, int accel, EScrollPos scrollpos = EScrollPos::scw_all); - void Construct(double dx, double dy, const line_t *l, sector_t *control, int accel, EScrollPos scrollpos = EScrollPos::scw_all); - void OnDestroy() override; - - void Serialize(FSerializer &arc); - void Tick (); - - bool AffectsWall (side_t * wall) const { return m_Side == wall; } - side_t *GetWall () const { return m_Side; } - sector_t *GetSector() const { return m_Sector; } - void SetRate (double dx, double dy) { m_dx = dx; m_dy = dy; } - bool IsType (EScroll type) const { return type == m_Type; } - EScrollPos GetScrollParts() const { return m_Parts; } - -protected: - EScroll m_Type; // Type of scroll effect - double m_dx, m_dy; // (dx,dy) scroll speeds - sector_t *m_Sector; // Affected sector - side_t *m_Side; // ... or side - sector_t *m_Controller; // Control sector (nullptr if none) used to control scrolling - double m_LastHeight; // Last known height of control sector - double m_vdx, m_vdy; // Accumulated velocity if accelerative - int m_Accel; // Whether it's accelerative - EScrollPos m_Parts; // Which parts of a sidedef are being scrolled? - TObjPtr m_Interpolations[3]; -}; - +#include "a_lighttransfer.h" +#include "a_lights.h" +#include "a_pusher.h" +#include "a_scroll.h" From 65f3fec283ab72661cf34fce082a4d7deddaea34 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 31 Jan 2019 03:03:56 +0100 Subject: [PATCH 118/164] - copied a few more map information CCMDs to g_ccmd. --- src/g_cvars.cpp | 2 + src/g_dumpinfo.cpp | 113 ++++++++++++++++++++++++++++++++ src/maploader/compatibility.cpp | 50 -------------- src/maploader/glnodes.cpp | 4 +- src/r_data/portalgroups.cpp | 40 ----------- src/r_data/r_interpolate.cpp | 10 --- src/r_data/r_sections.cpp | 9 --- 7 files changed, 117 insertions(+), 111 deletions(-) diff --git a/src/g_cvars.cpp b/src/g_cvars.cpp index 31d224ccc..3fc48ff86 100644 --- a/src/g_cvars.cpp +++ b/src/g_cvars.cpp @@ -38,6 +38,8 @@ CVAR (Bool, cl_spreaddecals, true, CVAR_ARCHIVE) CVAR(Bool, var_pushers, true, CVAR_SERVERINFO); +CVAR(Bool, gl_cachenodes, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) +CVAR(Float, gl_cachetime, 0.6f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CUSTOM_CVAR (Bool, gl_lights, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG | CVAR_NOINITCALL) diff --git a/src/g_dumpinfo.cpp b/src/g_dumpinfo.cpp index 94f450621..8223e13c9 100644 --- a/src/g_dumpinfo.cpp +++ b/src/g_dumpinfo.cpp @@ -126,4 +126,117 @@ CCMD (spray) Net_WriteString (argv[1]); } +//========================================================================== +// +// CCMD mapchecksum +// +//========================================================================== + +CCMD (mapchecksum) +{ + MapData *map; + uint8_t cksum[16]; + + if (argv.argc() < 2) + { + Printf("Usage: mapchecksum ...\n"); + } + for (int i = 1; i < argv.argc(); ++i) + { + map = P_OpenMapData(argv[i], true); + if (map == NULL) + { + Printf("Cannot load %s as a map\n", argv[i]); + } + else + { + map->GetChecksum(cksum); + const char *wadname = Wads.GetWadName(Wads.GetLumpFile(map->lumpnum)); + delete map; + for (size_t j = 0; j < sizeof(cksum); ++j) + { + Printf("%02X", cksum[j]); + } + Printf(" // %s %s\n", wadname, argv[i]); + } + } +} + +//========================================================================== +// +// CCMD hiddencompatflags +// +//========================================================================== + +CCMD (hiddencompatflags) +{ + for(auto Level : AllLevels()) + { + Printf("%s: %08x %08x %08x\n", Level->MapName.GetChars(), Level->ii_compatflags, Level->ii_compatflags2, Level->ib_compatflags); + } +} + +CCMD(dumpportals) +{ + for (auto Level : AllLevels()) + { + Printf("Portal groups for %s\n", Level->MapName.GetChars()); + for (unsigned i = 0; i < Level->portalGroups.Size(); i++) + { + auto p = Level->portalGroups[i]; + double xdisp = p->mDisplacement.X; + double ydisp = p->mDisplacement.Y; + Printf(PRINT_LOG, "Portal #%d, %s, displacement = (%f,%f)\n", i, p->plane == 0 ? "floor" : "ceiling", + xdisp, ydisp); + Printf(PRINT_LOG, "Coverage:\n"); + for (auto &sub : Level->subsectors) + { + auto port = sub.render_sector->GetPortalGroup(p->plane); + if (port == p) + { + Printf(PRINT_LOG, "\tSubsector %d (%d):\n\t\t", sub.Index(), sub.render_sector->sectornum); + for (unsigned k = 0; k < sub.numlines; k++) + { + Printf(PRINT_LOG, "(%.3f,%.3f), ", sub.firstline[k].v1->fX() + xdisp, sub.firstline[k].v1->fY() + ydisp); + } + Printf(PRINT_LOG, "\n\t\tCovered by subsectors:\n"); + FPortalCoverage *cov = &sub.portalcoverage[p->plane]; + for (int l = 0; l < cov->sscount; l++) + { + subsector_t *csub = &Level->subsectors[cov->subsectors[l]]; + Printf(PRINT_LOG, "\t\t\t%5d (%4d): ", cov->subsectors[l], csub->render_sector->sectornum); + for (unsigned m = 0; m < csub->numlines; m++) + { + Printf(PRINT_LOG, "(%.3f,%.3f), ", csub->firstline[m].v1->fX(), csub->firstline[m].v1->fY()); + } + Printf(PRINT_LOG, "\n"); + } + } + } + } + } +} + +ADD_STAT (interpolations) +{ + FString out; + for (auto Level : AllLevels()) + { + if (out.Len() > 0) out << '\n'; + out.AppendFormat("%s: %d interpolations", Level->MapName.GetChars(), Level->interpolator.CountInterpolations ()); + + } + return out; +} + +CCMD(printsections) +{ + void PrintSections(FLevelLocals *Level); + for (auto Level : AllLevels()) + { + PrintSections(Level); + } +} + + diff --git a/src/maploader/compatibility.cpp b/src/maploader/compatibility.cpp index f3a424cac..ad792dc5a 100644 --- a/src/maploader/compatibility.cpp +++ b/src/maploader/compatibility.cpp @@ -530,53 +530,3 @@ DEFINE_ACTION_FUNCTION(DLevelCompatibility, GetDefaultActor) DEFINE_FIELD(DLevelCompatibility, Level); -//========================================================================== -// -// CCMD mapchecksum -// -//========================================================================== - -CCMD (mapchecksum) -{ - MapData *map; - uint8_t cksum[16]; - - if (argv.argc() < 2) - { - Printf("Usage: mapchecksum ...\n"); - } - for (int i = 1; i < argv.argc(); ++i) - { - map = P_OpenMapData(argv[i], true); - if (map == NULL) - { - Printf("Cannot load %s as a map\n", argv[i]); - } - else - { - map->GetChecksum(cksum); - const char *wadname = Wads.GetWadName(Wads.GetLumpFile(map->lumpnum)); - delete map; - for (size_t j = 0; j < sizeof(cksum); ++j) - { - Printf("%02X", cksum[j]); - } - Printf(" // %s %s\n", wadname, argv[i]); - } - } -} - -//========================================================================== -// -// CCMD hiddencompatflags -// -//========================================================================== - -CCMD (hiddencompatflags) -{ - for(auto Level : AllLevels()) - { - Printf("%s: %08x %08x %08x\n", Level->MapName.GetChars(), Level->ii_compatflags, Level->ii_compatflags2, Level->ib_compatflags); - } -} - diff --git a/src/maploader/glnodes.cpp b/src/maploader/glnodes.cpp index 7d16eb92e..fa6246952 100644 --- a/src/maploader/glnodes.cpp +++ b/src/maploader/glnodes.cpp @@ -61,8 +61,8 @@ #include "i_time.h" #include "maploader.h" -CVAR(Bool, gl_cachenodes, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) -CVAR(Float, gl_cachetime, 0.6f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) +EXTERN_CVAR(Bool, gl_cachenodes) +EXTERN_CVAR(Float, gl_cachetime) // fixed 32 bit gl_vert format v2.0+ (glBsp 1.91) struct mapglvertex_t diff --git a/src/r_data/portalgroups.cpp b/src/r_data/portalgroups.cpp index 2560ce3d9..8d682b78e 100644 --- a/src/r_data/portalgroups.cpp +++ b/src/r_data/portalgroups.cpp @@ -466,43 +466,3 @@ void InitPortalGroups(FLevelLocals *Level) GroupLinePortals(Level); } -CCMD(dumpportals) -{ - for (auto Level : AllLevels()) - { - Printf("Portal groups for %s\n", Level->MapName.GetChars()); - for (unsigned i = 0; i < Level->portalGroups.Size(); i++) - { - auto p = Level->portalGroups[i]; - double xdisp = p->mDisplacement.X; - double ydisp = p->mDisplacement.Y; - Printf(PRINT_LOG, "Portal #%d, %s, displacement = (%f,%f)\n", i, p->plane == 0 ? "floor" : "ceiling", - xdisp, ydisp); - Printf(PRINT_LOG, "Coverage:\n"); - for (auto &sub : Level->subsectors) - { - auto port = sub.render_sector->GetPortalGroup(p->plane); - if (port == p) - { - Printf(PRINT_LOG, "\tSubsector %d (%d):\n\t\t", sub.Index(), sub.render_sector->sectornum); - for (unsigned k = 0; k < sub.numlines; k++) - { - Printf(PRINT_LOG, "(%.3f,%.3f), ", sub.firstline[k].v1->fX() + xdisp, sub.firstline[k].v1->fY() + ydisp); - } - Printf(PRINT_LOG, "\n\t\tCovered by subsectors:\n"); - FPortalCoverage *cov = &sub.portalcoverage[p->plane]; - for (int l = 0; l < cov->sscount; l++) - { - subsector_t *csub = &Level->subsectors[cov->subsectors[l]]; - Printf(PRINT_LOG, "\t\t\t%5d (%4d): ", cov->subsectors[l], csub->render_sector->sectornum); - for (unsigned m = 0; m < csub->numlines; m++) - { - Printf(PRINT_LOG, "(%.3f,%.3f), ", csub->firstline[m].v1->fX(), csub->firstline[m].v1->fY()); - } - Printf(PRINT_LOG, "\n"); - } - } - } - } - } -} diff --git a/src/r_data/r_interpolate.cpp b/src/r_data/r_interpolate.cpp index b3a8e08b2..b4ab89b12 100644 --- a/src/r_data/r_interpolate.cpp +++ b/src/r_data/r_interpolate.cpp @@ -186,8 +186,6 @@ IMPLEMENT_CLASS(DPolyobjInterpolation, false, false) // //========================================================================== -FInterpolator interpolator; - //========================================================================== // // @@ -989,11 +987,3 @@ void FPolyObj::StopInterpolation() } -ADD_STAT (interpolations) -{ - FString out; - out.Format ("%d interpolations", interpolator.CountInterpolations ()); - return out; -} - - diff --git a/src/r_data/r_sections.cpp b/src/r_data/r_sections.cpp index 79790a6cd..29b518966 100644 --- a/src/r_data/r_sections.cpp +++ b/src/r_data/r_sections.cpp @@ -875,12 +875,3 @@ void CreateSections(FLevelLocals *Level) creat.FixMissingReferences(); } -CCMD(printsections) -{ - for (auto Level : AllLevels()) - { - PrintSections(Level); - } -} - - From 0a781b9bbb1bfdb4e59f1e1e8b56d6f57f8edcfd Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 31 Jan 2019 03:25:26 +0100 Subject: [PATCH 119/164] - fixed: DInterpolation was unlinking itself from the wrong interpolator The global one was just a leftover, the real one is on the current level. --- src/r_data/r_interpolate.cpp | 7 ++++++- src/r_data/r_interpolate.h | 3 ++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/r_data/r_interpolate.cpp b/src/r_data/r_interpolate.cpp index b4ab89b12..5edf79df4 100644 --- a/src/r_data/r_interpolate.cpp +++ b/src/r_data/r_interpolate.cpp @@ -373,7 +373,7 @@ int DInterpolation::DelRef(bool force) void DInterpolation::OnDestroy() { - interpolator.RemoveInterpolation(this); + Level->interpolator.RemoveInterpolation(this); refcount = 0; Super::OnDestroy(); } @@ -388,6 +388,7 @@ void DInterpolation::Serialize(FSerializer &arc) { Super::Serialize(arc); arc("refcount", refcount); + arc("level", Level); } //========================================================================== @@ -403,6 +404,7 @@ void DInterpolation::Serialize(FSerializer &arc) //========================================================================== DSectorPlaneInterpolation::DSectorPlaneInterpolation(sector_t *_sector, bool _plane, bool attach) +: DInterpolation(sector->Level) { sector = _sector; ceiling = _plane; @@ -568,6 +570,7 @@ size_t DSectorPlaneInterpolation::PropagateMark() //========================================================================== DSectorScrollInterpolation::DSectorScrollInterpolation(sector_t *_sector, bool _plane) +: DInterpolation(sector->Level) { sector = _sector; ceiling = _plane; @@ -673,6 +676,7 @@ void DSectorScrollInterpolation::Serialize(FSerializer &arc) //========================================================================== DWallScrollInterpolation::DWallScrollInterpolation(side_t *_side, int _part) +: DInterpolation(side->GetLevel()) { side = _side; part = _part; @@ -770,6 +774,7 @@ void DWallScrollInterpolation::Serialize(FSerializer &arc) //========================================================================== DPolyobjInterpolation::DPolyobjInterpolation(FPolyObj *po) +: DInterpolation(po->Level) { poly = po; oldverts.Resize(po->Vertices.Size() << 1); diff --git a/src/r_data/r_interpolate.h b/src/r_data/r_interpolate.h index 0696bf85f..0854fca8c 100644 --- a/src/r_data/r_interpolate.h +++ b/src/r_data/r_interpolate.h @@ -19,9 +19,10 @@ class DInterpolation : public DObject TObjPtr Prev; protected: + FLevelLocals *Level; int refcount; - DInterpolation(); + DInterpolation(FLevelLocals *l) : Level(l) {} public: int AddRef(); From 7149d1d3124ffd4231ef4525a8157a91126b44af Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 31 Jan 2019 03:25:49 +0100 Subject: [PATCH 120/164] - added missing includes --- src/g_dumpinfo.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/g_dumpinfo.cpp b/src/g_dumpinfo.cpp index 8223e13c9..39fc5a549 100644 --- a/src/g_dumpinfo.cpp +++ b/src/g_dumpinfo.cpp @@ -38,6 +38,8 @@ #include "a_dynlight.h" #include "a_sharedglobal.h" #include "d_net.h" +#include "p_setup.h" +#include "w_wad.h" //========================================================================== // From ddab2c3e780f867b81036f1c030d98ff03c3c430 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 31 Jan 2019 03:29:25 +0100 Subject: [PATCH 121/164] - removed the playernum parameter from CheckLocalView This was always used with 'consoleplayer' which really is the only thing making sense here. But this is a part of the global state which should be avoided in play code. In particular, this makes no real sense in case of secondary maps where it should always return false. --- src/actor.h | 2 +- src/bbannouncer.cpp | 12 ++++++------ src/fragglescript/t_func.cpp | 8 ++++---- src/g_inventory/a_keys.cpp | 2 +- src/p_acs.cpp | 6 +++--- src/p_actionfunctions.cpp | 12 ++++++------ src/p_interaction.cpp | 2 +- src/p_lnspec.cpp | 2 +- src/p_map.cpp | 10 +++++----- src/p_mobj.cpp | 6 +++--- src/p_spec.cpp | 2 +- src/p_user.cpp | 2 +- src/r_data/r_interpolate.cpp | 19 +++---------------- src/r_data/r_interpolate.h | 10 ++++++---- src/s_sound.cpp | 2 +- wadsrc/static/zscript/inventory/inv_misc.txt | 2 +- wadsrc/static/zscript/inventory/inventory.txt | 6 +++--- wadsrc/static/zscript/strife/strifeitems.txt | 6 +++--- 18 files changed, 50 insertions(+), 61 deletions(-) diff --git a/src/actor.h b/src/actor.h index 2436cdaaa..3394789fb 100644 --- a/src/actor.h +++ b/src/actor.h @@ -752,7 +752,7 @@ public: void ClearInventory(); // Returns true if this view is considered "local" for the player. - bool CheckLocalView (int playernum) const; + bool CheckLocalView() const; // Finds the first item of a particular type. AActor *FindInventory (PClassActor *type, bool subclass=false); diff --git a/src/bbannouncer.cpp b/src/bbannouncer.cpp index 7c7d0e12a..58243ea5c 100644 --- a/src/bbannouncer.cpp +++ b/src/bbannouncer.cpp @@ -224,7 +224,7 @@ bool AnnounceKill (AActor *killer, AActor *killee) if (cl_bbannounce && deathmatch) { - bool playSound = killee->CheckLocalView (consoleplayer); + bool playSound = killee->CheckLocalView(); if (killer == NULL) { // The world killed the player @@ -258,7 +258,7 @@ bool AnnounceKill (AActor *killer, AActor *killee) // Blood only plays the announcement sound on the killer's // computer. I think it sounds neater to also hear it on // the killee's machine. - playSound |= killer->CheckLocalView (consoleplayer); + playSound |= killer->CheckLocalView(); } message = GStrings(choice->Message); @@ -302,8 +302,8 @@ bool AnnounceTelefrag (AActor *killer, AActor *killee) killee->player->userinfo.GetName(), killer->player->userinfo.GetName()); Printf (PRINT_MEDIUM, "%s\n", assembled); } - if (killee->CheckLocalView (consoleplayer) || - killer->CheckLocalView (consoleplayer)) + if (killee->CheckLocalView() || + killer->CheckLocalView()) { DoVoiceAnnounce (TelefragSounds[rannum % 7]); } @@ -337,7 +337,7 @@ bool AnnounceSpreeLoss (AActor *who) { if (cl_bbannounce) { - if (who->CheckLocalView (consoleplayer)) + if (who->CheckLocalView()) { DoVoiceAnnounce (TooBadSounds[M_Random() % 3]); } @@ -357,7 +357,7 @@ bool AnnounceMultikill (AActor *who) { if (cl_bbannounce) { - if (who->CheckLocalView (consoleplayer)) + if (who->CheckLocalView()) { DoVoiceAnnounce (GoodJobSounds[M_Random() % 3]); } diff --git a/src/fragglescript/t_func.cpp b/src/fragglescript/t_func.cpp index 828da8d1e..c2843665b 100644 --- a/src/fragglescript/t_func.cpp +++ b/src/fragglescript/t_func.cpp @@ -621,7 +621,7 @@ void FParser::SF_ExitLevel(void) void FParser::SF_Tip(void) { if (t_argc>0 && Script->trigger && - Script->trigger->CheckLocalView(consoleplayer)) + Script->trigger->CheckLocalView()) { C_MidPrint(SmallFont, GetFormatString(0).GetChars()); } @@ -660,7 +660,7 @@ void FParser::SF_PlayerTip(void) if (CheckArgs(1)) { int plnum = T_GetPlayerNum(t_argv[0]); - if (plnum!=-1 && Level->Players[plnum]->mo->CheckLocalView(consoleplayer)) + if (plnum!=-1 && Level->Players[plnum]->mo->CheckLocalView()) { C_MidPrint(SmallFont, GetFormatString(1).GetChars()); } @@ -676,7 +676,7 @@ void FParser::SF_PlayerTip(void) void FParser::SF_Message(void) { if (t_argc>0 && Script->trigger && - Script->trigger->CheckLocalView(consoleplayer)) + Script->trigger->CheckLocalView()) { Printf(PRINT_HIGH, "%s\n", GetFormatString(0).GetChars()); } @@ -693,7 +693,7 @@ void FParser::SF_PlayerMsg(void) if (CheckArgs(1)) { int plnum = T_GetPlayerNum(t_argv[0]); - if (plnum!=-1 && Level->Players[plnum]->mo->CheckLocalView(consoleplayer)) + if (plnum!=-1 && Level->Players[plnum]->mo->CheckLocalView()) { Printf(PRINT_HIGH, "%s\n", GetFormatString(1).GetChars()); } diff --git a/src/g_inventory/a_keys.cpp b/src/g_inventory/a_keys.cpp index ad0e85404..1024f216a 100644 --- a/src/g_inventory/a_keys.cpp +++ b/src/g_inventory/a_keys.cpp @@ -494,7 +494,7 @@ int P_CheckKeys (AActor *owner, int keynum, bool remote, bool quiet) // If we get here, that means the actor isn't holding an appropriate key. - if (owner->CheckLocalView(consoleplayer)) + if (owner->CheckLocalView()) { PrintMessage(failtext); diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 8b54e9798..723f89c67 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -8588,7 +8588,7 @@ scriptwait: screen = screen->target; } if (pcd == PCD_ENDPRINTBOLD || screen == NULL || - screen->CheckLocalView (consoleplayer)) + screen->CheckLocalView()) { if (pcd == PCD_ENDPRINTBOLD && (gameinfo.correctprintbold || (Level->flags2 & LEVEL2_HEXENHACK))) C_MidPrintBold(activefont, work); @@ -8837,7 +8837,7 @@ scriptwait: case PCD_LOCALAMBIENTSOUND: lookup = Level->Behaviors.LookupString (STACK(2)); - if (lookup != NULL && activator->CheckLocalView (consoleplayer)) + if (lookup != NULL && activator->CheckLocalView()) { S_Sound (CHAN_AUTO, lookup, @@ -9966,7 +9966,7 @@ scriptwait: } case PCD_SETMUGSHOTSTATE: - if (!multiplayer || (activator != nullptr && activator->CheckLocalView(consoleplayer))) + if (!multiplayer || (activator != nullptr && activator->CheckLocalView())) { StatusBar->SetMugShotState(Level->Behaviors.LookupString(STACK(1))); } diff --git a/src/p_actionfunctions.cpp b/src/p_actionfunctions.cpp index 398343633..54d843268 100644 --- a/src/p_actionfunctions.cpp +++ b/src/p_actionfunctions.cpp @@ -1294,8 +1294,8 @@ DEFINE_ACTION_FUNCTION(AActor, A_Print) PARAM_NAME (fontname); if (text[0] == '$') text = GStrings(&text[1]); - if (self->CheckLocalView (consoleplayer) || - (self->target != NULL && self->target->CheckLocalView (consoleplayer))) + if (self->CheckLocalView() || + (self->target != NULL && self->target->CheckLocalView())) { float saved = con_midtime; FFont *font = NULL; @@ -1358,7 +1358,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_Log) PARAM_STRING_VAL(text); PARAM_BOOL(local); - if (local && !self->CheckLocalView(consoleplayer)) return 0; + if (local && !self->CheckLocalView()) return 0; if (text[0] == '$') text = GStrings(&text[1]); FString formatted = strbin1(text); @@ -1378,7 +1378,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_LogInt) PARAM_INT(num); PARAM_BOOL(local); - if (local && !self->CheckLocalView(consoleplayer)) return 0; + if (local && !self->CheckLocalView()) return 0; Printf("%d\n", num); return 0; } @@ -1395,7 +1395,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_LogFloat) PARAM_FLOAT(num); PARAM_BOOL(local); - if (local && !self->CheckLocalView(consoleplayer)) return 0; + if (local && !self->CheckLocalView()) return 0; IGNORE_FORMAT_PRE Printf("%H\n", num); IGNORE_FORMAT_POST @@ -4925,7 +4925,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_SetMugshotState) { PARAM_SELF_PROLOGUE(AActor); PARAM_STRING(name); - if (self->CheckLocalView(consoleplayer)) + if (self->CheckLocalView()) StatusBar->SetMugShotState(name); return 0; } diff --git a/src/p_interaction.cpp b/src/p_interaction.cpp index a8e3c0acc..d5fb79cc3 100644 --- a/src/p_interaction.cpp +++ b/src/p_interaction.cpp @@ -498,7 +498,7 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOf } if (deathmatch && - source->CheckLocalView (consoleplayer) && + source->CheckLocalView() && cl_showmultikills) { const char *multimsg; diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index 2b180955f..08513304b 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -3200,7 +3200,7 @@ FUNC(LS_SendToCommunicator) it->player->SetLogNumber (arg0); } - if (it->CheckLocalView (consoleplayer)) + if (it->CheckLocalView()) { S_StopSound (CHAN_VOICE); S_Sound (CHAN_VOICE, name, 1, ATTN_NORM); diff --git a/src/p_map.cpp b/src/p_map.cpp index eeb11b545..ebdd82434 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -6274,7 +6274,7 @@ int P_PushUp(AActor *thing, FChangePosition *cpos) if (cpos->instant) { intersect->Prev.Z += intersect->Z() - oldz; - if (intersect->CheckLocalView(consoleplayer)) R_ResetViewInterpolation(); + if (intersect->CheckLocalView()) R_ResetViewInterpolation(); } intersect->UpdateRenderSectorList(); @@ -6371,7 +6371,7 @@ void PIT_FloorDrop(AActor *thing, FChangePosition *cpos) if (cpos->instant) { thing->Prev.Z += thing->floorz - oldz; - if (thing->CheckLocalView(consoleplayer)) R_ResetViewInterpolation(); + if (thing->CheckLocalView()) R_ResetViewInterpolation(); } thing->SetZ(thing->floorz); P_CheckFakeFloorTriggers(thing, oldz); @@ -6385,7 +6385,7 @@ void PIT_FloorDrop(AActor *thing, FChangePosition *cpos) if (cpos->instant) { thing->Prev.Z += -oldfloorz + thing->floorz; - if (thing->CheckLocalView(consoleplayer)) R_ResetViewInterpolation(); + if (thing->CheckLocalView()) R_ResetViewInterpolation(); } thing->AddZ(-oldfloorz + thing->floorz); P_CheckFakeFloorTriggers(thing, oldz); @@ -6425,7 +6425,7 @@ void PIT_FloorRaise(AActor *thing, FChangePosition *cpos) if (cpos->instant) { thing->Prev.Z += thing->floorz - thing->Z(); - if (thing->CheckLocalView(consoleplayer)) R_ResetViewInterpolation(); + if (thing->CheckLocalView()) R_ResetViewInterpolation(); } thing->SetZ(thing->floorz); @@ -6439,7 +6439,7 @@ void PIT_FloorRaise(AActor *thing, FChangePosition *cpos) if (cpos->instant) { thing->Prev.Z += -oldfloorz + thing->floorz; - if (thing->CheckLocalView(consoleplayer)) R_ResetViewInterpolation(); + if (thing->CheckLocalView()) R_ResetViewInterpolation(); } } else return; diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index dca94497a..94255229d 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -943,9 +943,9 @@ DEFINE_ACTION_FUNCTION(AActor, GiveBody) // //============================================================================ -bool AActor::CheckLocalView (int playernum) const +bool AActor::CheckLocalView() const { - auto p = &players[playernum]; + auto p = &players[consoleplayer]; if (p->camera == this) { return true; @@ -966,7 +966,7 @@ DEFINE_ACTION_FUNCTION(AActor, CheckLocalView) { PARAM_SELF_PROLOGUE(AActor); PARAM_INT(cp); - ACTION_RETURN_BOOL(self->CheckLocalView(cp)); + ACTION_RETURN_BOOL(self->CheckLocalView()); } //============================================================================ diff --git a/src/p_spec.cpp b/src/p_spec.cpp index 65f10d0cd..b2ebd2cfb 100644 --- a/src/p_spec.cpp +++ b/src/p_spec.cpp @@ -594,7 +594,7 @@ void P_GiveSecret(FLevelLocals *Level, AActor *actor, bool printmessage, bool pl ret.IntAt(&retval); VMCall(func, params, countof(params), &ret, 1); } - if (retval && cl_showsecretmessage && actor->CheckLocalView(consoleplayer)) + if (retval && cl_showsecretmessage && actor->CheckLocalView()) { if (printmessage) { diff --git a/src/p_user.cpp b/src/p_user.cpp index 4fb9a0f6d..487a68806 100644 --- a/src/p_user.cpp +++ b/src/p_user.cpp @@ -438,7 +438,7 @@ void player_t::SetLogText (const char *text) { LogText = text; - if (mo->CheckLocalView(consoleplayer)) + if (mo->CheckLocalView()) { // Print log text to console AddToConsole(-1, TEXTCOLOR_GOLD); diff --git a/src/r_data/r_interpolate.cpp b/src/r_data/r_interpolate.cpp index 5edf79df4..874159c02 100644 --- a/src/r_data/r_interpolate.cpp +++ b/src/r_data/r_interpolate.cpp @@ -334,19 +334,6 @@ FSerializer &Serialize(FSerializer &arc, const char *key, FInterpolator &rs, FIn // //========================================================================== -DInterpolation::DInterpolation() -{ - Next = nullptr; - Prev = nullptr; - refcount = 0; -} - -//========================================================================== -// -// -// -//========================================================================== - int DInterpolation::AddRef() { return ++refcount; @@ -404,7 +391,7 @@ void DInterpolation::Serialize(FSerializer &arc) //========================================================================== DSectorPlaneInterpolation::DSectorPlaneInterpolation(sector_t *_sector, bool _plane, bool attach) -: DInterpolation(sector->Level) +: DInterpolation(_sector->Level) { sector = _sector; ceiling = _plane; @@ -570,7 +557,7 @@ size_t DSectorPlaneInterpolation::PropagateMark() //========================================================================== DSectorScrollInterpolation::DSectorScrollInterpolation(sector_t *_sector, bool _plane) -: DInterpolation(sector->Level) +: DInterpolation(_sector->Level) { sector = _sector; ceiling = _plane; @@ -676,7 +663,7 @@ void DSectorScrollInterpolation::Serialize(FSerializer &arc) //========================================================================== DWallScrollInterpolation::DWallScrollInterpolation(side_t *_side, int _part) -: DInterpolation(side->GetLevel()) +: DInterpolation(_side->GetLevel()) { side = _side; part = _part; diff --git a/src/r_data/r_interpolate.h b/src/r_data/r_interpolate.h index 0854fca8c..701d8c318 100644 --- a/src/r_data/r_interpolate.h +++ b/src/r_data/r_interpolate.h @@ -2,6 +2,8 @@ #define R_INTERPOLATE_H #include "dobject.h" + +struct FLevelLocals; //========================================================================== // // @@ -15,14 +17,14 @@ class DInterpolation : public DObject DECLARE_ABSTRACT_CLASS(DInterpolation, DObject) HAS_OBJECT_POINTERS - TObjPtr Next; - TObjPtr Prev; + TObjPtr Next = nullptr; + TObjPtr Prev = nullptr; protected: FLevelLocals *Level; - int refcount; + int refcount = 0; - DInterpolation(FLevelLocals *l) : Level(l) {} + DInterpolation(FLevelLocals *l = nullptr) : Level(l) {} public: int AddRef(); diff --git a/src/s_sound.cpp b/src/s_sound.cpp index 7bcff4d67..766821c8d 100644 --- a/src/s_sound.cpp +++ b/src/s_sound.cpp @@ -1420,7 +1420,7 @@ void S_PlaySound(AActor *a, int chan, FSoundID sid, float vol, float atten, bool } else { - if (a->CheckLocalView(consoleplayer)) + if (a->CheckLocalView()) { S_Sound(chan, sid, vol, ATTN_NONE); } diff --git a/wadsrc/static/zscript/inventory/inv_misc.txt b/wadsrc/static/zscript/inventory/inv_misc.txt index 7aa60227d..f401a3e2d 100644 --- a/wadsrc/static/zscript/inventory/inv_misc.txt +++ b/wadsrc/static/zscript/inventory/inv_misc.txt @@ -125,7 +125,7 @@ class PuzzleItem : Inventory } // [RH] Always play the sound if the use fails. Owner.A_PlaySound ("*puzzfail", CHAN_VOICE); - if (Owner.CheckLocalView (consoleplayer)) + if (Owner.CheckLocalView()) { Console.MidPrint ("SmallFont", PuzzFailMessage, true); } diff --git a/wadsrc/static/zscript/inventory/inventory.txt b/wadsrc/static/zscript/inventory/inventory.txt index f89bb7493..ecafdf66c 100644 --- a/wadsrc/static/zscript/inventory/inventory.txt +++ b/wadsrc/static/zscript/inventory/inventory.txt @@ -765,7 +765,7 @@ class Inventory : Actor toucher = player.mo; } - bool localview = toucher.CheckLocalView(consoleplayer); + bool localview = toucher.CheckLocalView(); bool res; [res, toucher] = CallTryPickup(toucher); @@ -1049,7 +1049,7 @@ class Inventory : Actor } /* else if ((ItemFlags & IF_FANCYPICKUPSOUND) && - (toucher == NULL || toucher->CheckLocalView(consoleplayer))) + (toucher == NULL || toucher->CheckLocalView())) { atten = ATTN_NONE; } @@ -1059,7 +1059,7 @@ class Inventory : Actor atten = ATTN_NORM; } - if (toucher != NULL && toucher.CheckLocalView(consoleplayer)) + if (toucher != NULL && toucher.CheckLocalView()) { chan = CHAN_PICKUP|CHAN_NOPAUSE; } diff --git a/wadsrc/static/zscript/strife/strifeitems.txt b/wadsrc/static/zscript/strife/strifeitems.txt index 65ccb7ccb..9b6935566 100644 --- a/wadsrc/static/zscript/strife/strifeitems.txt +++ b/wadsrc/static/zscript/strife/strifeitems.txt @@ -529,7 +529,7 @@ class Scanner : PowerupGiver { if (!level.AllMap) { - if (Owner.CheckLocalView (consoleplayer)) + if (Owner.CheckLocalView()) { Console.MidPrint("SmallFont", "$TXT_NEEDMAP"); } @@ -630,7 +630,7 @@ class RaiseAlarm : DummyStrifeItem if (dropper.target != null) { dropper.target.SoundAlert(dropper.target); - if (dropper.target.CheckLocalView(consoleplayer)) + if (dropper.target.CheckLocalView()) { Console.MidPrint(SmallFont, "$TXT_YOUFOOL"); } @@ -670,7 +670,7 @@ class CloseDoor222 : DummyStrifeItem Door_Close(222, 16); if (dropper.target != null) { - if (dropper.target.CheckLocalView(consoleplayer)) + if (dropper.target.CheckLocalView()) { Console.MidPrint(SmallFont, "$TXT_YOUREDEAD"); } From 68bff17d634d8f23f24e046a80f3a7dc8f5d9064 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 31 Jan 2019 03:29:45 +0100 Subject: [PATCH 122/164] - this was missing --- wadsrc/static/zscript/actor.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wadsrc/static/zscript/actor.txt b/wadsrc/static/zscript/actor.txt index acc2229b3..b47d599a7 100644 --- a/wadsrc/static/zscript/actor.txt +++ b/wadsrc/static/zscript/actor.txt @@ -607,7 +607,7 @@ class Actor : Thinker native native void SoundAlert(Actor target, bool splash = false, double maxdist = 0); native void ClearBounce(); native TerrainDef GetFloorTerrain(); - native bool CheckLocalView(int consoleplayer); + native bool CheckLocalView(int consoleplayer = -1 /* parameter is not used anymore but needed for backward compatibilityö. */); native bool CheckNoDelay(); native bool UpdateWaterLevel (bool splash = true); native bool IsZeroDamage(); From 1dcdfec7335d39b269d04acb1561c919542f26ff Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 31 Jan 2019 17:43:12 +0100 Subject: [PATCH 123/164] - Unload behavior with the map, not outside. --- src/maploader/maploader.cpp | 1 - src/p_setup.cpp | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index 8c65bdc98..20582180b 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -2952,7 +2952,6 @@ void MapLoader::LoadLevel(MapData *map, const char *lumpname, int position) ForceNodeBuild = gennodes; // [RH] Load in the BEHAVIOR lump - Level->Behaviors.UnloadModules(); if (map->HasBehavior) { LoadBehavior(map); diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 8656507eb..3321e6cec 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -335,6 +335,7 @@ void FLevelLocals::ClearLevelData() memset(playerstarts, 0, sizeof(playerstarts)); Scrolls.Clear(); if (automap) automap->Destroy(); + Behaviors.UnloadModules(); } //========================================================================== From f6a91e17228bf1c2198d17476e105d987ef9840d Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 31 Jan 2019 19:38:04 +0100 Subject: [PATCH 124/164] - moved the I_Error prototypes to doomerrors.h to avoid having to include the low level system header for this. --- src/c_cmds.cpp | 1 - src/c_console.cpp | 2 +- src/cmdlib.cpp | 2 +- src/d_main.cpp | 1 + src/d_net.cpp | 1 + src/d_protocol.cpp | 2 +- src/dobject.h | 2 +- src/dobjtype.cpp | 1 + src/doomerrors.h | 4 ++++ src/files_decompress.cpp | 2 +- src/g_doomedmap.cpp | 1 + src/g_game.cpp | 1 + src/g_level.cpp | 2 +- src/g_mapinfo.cpp | 1 + src/g_statusbar/sbarinfo.cpp | 1 + src/gl_load/gl_interface.cpp | 1 + src/hwrenderer/textures/hw_material.h | 2 +- src/hwrenderer/utility/hw_clock.cpp | 2 +- src/i_net.cpp | 1 + src/m_alloc.cpp | 2 +- src/m_argv.cpp | 1 + src/m_misc.cpp | 1 + src/maploader/maploader.cpp | 2 +- src/maploader/udmf.cpp | 2 +- src/menu/loadsavemenu.cpp | 1 + src/menu/menudef.cpp | 2 +- src/nodebuild_utility.cpp | 2 +- src/p_acs.h | 1 + src/p_effect.cpp | 2 +- src/p_enemy.cpp | 2 +- src/p_mobj.cpp | 2 +- src/p_openmap.cpp | 2 +- src/p_saveg.cpp | 2 +- src/p_setup.cpp | 1 + src/p_sight.cpp | 2 +- src/p_switch.cpp | 2 +- src/polyrenderer/drawers/poly_buffer.cpp | 2 +- src/polyrenderer/drawers/poly_draw_args.cpp | 2 +- src/polyrenderer/drawers/poly_triangle.cpp | 2 +- src/polyrenderer/drawers/screen_triangle.cpp | 2 +- src/polyrenderer/poly_renderthread.cpp | 2 +- src/posix/cocoa/i_main.mm | 1 + src/posix/cocoa/i_video.mm | 1 + src/posix/i_system.h | 3 --- src/posix/sdl/critsec.cpp | 1 + src/posix/sdl/hardware.cpp | 1 + src/posix/sdl/i_main.cpp | 1 + src/posix/unix/i_specialpaths.cpp | 1 + src/r_data/colormaps.cpp | 2 +- src/r_data/gldefs.cpp | 2 +- src/r_data/r_sections.cpp | 2 +- src/r_data/sprites.cpp | 2 +- src/r_utility.cpp | 2 +- src/resourcefiles/file_wad.cpp | 2 +- src/resourcefiles/file_zip.cpp | 2 +- src/s_advsound.cpp | 1 + src/sc_man.cpp | 2 +- src/scripting/vm/jitintern.h | 2 +- src/scripting/vmthunks.cpp | 1 + src/scriptutil.cpp | 2 +- src/sound/mididevices/music_fluidsynth_mididevice.cpp | 1 + src/sound/mididevices/music_opl_mididevice.cpp | 2 +- src/sound/mididevices/music_opnmidi_mididevice.cpp | 2 +- src/sound/mididevices/music_timiditypp_mididevice.cpp | 2 +- src/sound/mididevices/music_wildmidi_mididevice.cpp | 2 +- src/sound/mididevices/music_win_mididevice.cpp | 2 +- src/sound/musicformats/music_dumb.cpp | 2 +- src/sound/timidity/common.cpp | 2 +- src/sound/timidity/timidity.cpp | 1 + src/swrenderer/drawers/r_draw.cpp | 2 +- src/swrenderer/drawers/r_draw_rgba.cpp | 2 +- src/swrenderer/line/r_farclip_line.cpp | 2 +- src/swrenderer/line/r_fogboundary.cpp | 2 +- src/swrenderer/line/r_line.cpp | 2 +- src/swrenderer/line/r_renderdrawsegment.cpp | 2 +- src/swrenderer/line/r_wallsetup.cpp | 2 +- src/swrenderer/plane/r_flatplane.cpp | 2 +- src/swrenderer/plane/r_planerenderer.cpp | 2 +- src/swrenderer/plane/r_skyplane.cpp | 2 +- src/swrenderer/plane/r_slopeplane.cpp | 2 +- src/swrenderer/plane/r_visibleplane.cpp | 2 +- src/swrenderer/plane/r_visibleplanelist.cpp | 2 +- src/swrenderer/r_memory.cpp | 2 +- src/swrenderer/r_renderthread.cpp | 2 +- src/swrenderer/r_swscene.cpp | 1 + src/swrenderer/scene/r_light.cpp | 2 +- src/swrenderer/scene/r_opaque_pass.cpp | 2 +- src/swrenderer/scene/r_portal.cpp | 2 +- src/swrenderer/scene/r_scene.cpp | 2 +- src/swrenderer/scene/r_translucent_pass.cpp | 2 +- src/swrenderer/segments/r_clipsegment.cpp | 2 +- src/swrenderer/segments/r_drawsegment.cpp | 2 +- src/swrenderer/segments/r_portalsegment.cpp | 2 +- src/swrenderer/things/r_decal.cpp | 2 +- src/swrenderer/things/r_particle.cpp | 2 +- src/swrenderer/things/r_playersprite.cpp | 2 +- src/swrenderer/things/r_sprite.cpp | 2 +- src/swrenderer/things/r_visiblesprite.cpp | 2 +- src/swrenderer/things/r_visiblespritelist.cpp | 2 +- src/swrenderer/things/r_wallsprite.cpp | 2 +- src/swrenderer/viewport/r_viewport.cpp | 2 +- src/teaminfo.cpp | 2 +- src/textures/animations.cpp | 2 +- src/textures/formats/brightmaptexture.cpp | 2 +- src/textures/formats/fontchars.cpp | 1 + src/textures/formats/multipatchtexture.cpp | 2 +- src/textures/multipatchtexturebuilder.cpp | 2 +- src/textures/texture.cpp | 2 +- src/textures/texturemanager.cpp | 2 +- src/v_framebuffer.cpp | 2 +- src/v_pfx.cpp | 2 +- src/v_text.cpp | 2 +- src/v_video.cpp | 1 + src/wi_stuff.cpp | 2 +- src/win32/hardware.cpp | 2 ++ src/win32/i_cd.cpp | 1 + src/win32/i_input.cpp | 2 ++ src/win32/i_main.cpp | 1 + src/win32/i_system.cpp | 1 + src/win32/i_system.h | 3 --- src/win32/st_start.cpp | 1 + 121 files changed, 123 insertions(+), 91 deletions(-) diff --git a/src/c_cmds.cpp b/src/c_cmds.cpp index fac4ff6a3..995677209 100644 --- a/src/c_cmds.cpp +++ b/src/c_cmds.cpp @@ -47,7 +47,6 @@ #include "c_dispatch.h" #include "i_system.h" - #include "doomerrors.h" #include "doomstat.h" #include "gstrings.h" diff --git a/src/c_console.cpp b/src/c_console.cpp index d72b29465..b05e4c5a1 100644 --- a/src/c_console.cpp +++ b/src/c_console.cpp @@ -34,7 +34,7 @@ #include "templates.h" #include "p_setup.h" - +#include "i_system.h" #include "version.h" #include "g_game.h" #include "c_bind.h" diff --git a/src/cmdlib.cpp b/src/cmdlib.cpp index b313f5691..7a7436c19 100644 --- a/src/cmdlib.cpp +++ b/src/cmdlib.cpp @@ -35,7 +35,7 @@ #endif #include "doomtype.h" #include "cmdlib.h" -#include "i_system.h" +#include "doomerrors.h" #include "v_text.h" #include "sc_man.h" diff --git a/src/d_main.cpp b/src/d_main.cpp index b04fc33e6..c28c25ab9 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -99,6 +99,7 @@ #include "events.h" #include "vm.h" #include "types.h" +#include "i_system.h" #include "g_cvars.h" #include "r_data/r_vanillatrans.h" diff --git a/src/d_net.cpp b/src/d_net.cpp index 1f360a8d2..ac65061c6 100644 --- a/src/d_net.cpp +++ b/src/d_net.cpp @@ -64,6 +64,7 @@ #include "actorinlines.h" #include "events.h" #include "i_time.h" +#include "i_system.h" #include "vm.h" EXTERN_CVAR (Int, disableautosave) diff --git a/src/d_protocol.cpp b/src/d_protocol.cpp index 1a0ebcc02..107941976 100644 --- a/src/d_protocol.cpp +++ b/src/d_protocol.cpp @@ -32,7 +32,7 @@ ** */ -#include "i_system.h" + #include "d_protocol.h" #include "d_net.h" #include "doomstat.h" diff --git a/src/dobject.h b/src/dobject.h index b57f75bed..a4e16dc0b 100644 --- a/src/dobject.h +++ b/src/dobject.h @@ -37,7 +37,7 @@ #include #include #include "doomtype.h" -#include "i_system.h" + #include "vectors.h" class PClass; diff --git a/src/dobjtype.cpp b/src/dobjtype.cpp index 96a135a03..c0c8e2432 100644 --- a/src/dobjtype.cpp +++ b/src/dobjtype.cpp @@ -49,6 +49,7 @@ #include "vm.h" #include "types.h" #include "scriptutil.h" +#include "i_system.h" // MACROS ------------------------------------------------------------------ diff --git a/src/doomerrors.h b/src/doomerrors.h index 52bc3c12b..9847120e6 100644 --- a/src/doomerrors.h +++ b/src/doomerrors.h @@ -39,6 +39,7 @@ #include #include #include +#include "doomtype.h" #define MAX_ERRORTEXT 1024 @@ -103,4 +104,7 @@ public: CFatalError(const char *message) : CDoomError(message) {} }; +void I_Error (const char *error, ...) GCCPRINTF(1,2); +void I_FatalError (const char *error, ...) GCCPRINTF(1,2); + #endif //__ERRORS_H__ diff --git a/src/files_decompress.cpp b/src/files_decompress.cpp index b6ba8fbcb..4ff30f791 100644 --- a/src/files_decompress.cpp +++ b/src/files_decompress.cpp @@ -39,7 +39,7 @@ #include #include "files.h" -#include "i_system.h" +#include "doomerrors.h" #include "templates.h" #include "m_misc.h" diff --git a/src/g_doomedmap.cpp b/src/g_doomedmap.cpp index f1a99c1d9..6f99ded13 100644 --- a/src/g_doomedmap.cpp +++ b/src/g_doomedmap.cpp @@ -38,6 +38,7 @@ #include "p_lnspec.h" #include "c_dispatch.h" #include "v_text.h" +#include "doomerrors.h" const char *SpecialMapthingNames[] = { diff --git a/src/g_game.cpp b/src/g_game.cpp index 2f170a52b..fe9404bff 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -73,6 +73,7 @@ #include "dobjgc.h" #include "gi.h" #include "a_dynlight.h" +#include "i_system.h" #include "g_hub.h" #include "g_levellocals.h" diff --git a/src/g_level.cpp b/src/g_level.cpp index c3c26a03e..616877c12 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -46,7 +46,7 @@ #include "w_wad.h" #include "am_map.h" #include "c_dispatch.h" -#include "i_system.h" + #include "p_setup.h" #include "p_local.h" #include "r_sky.h" diff --git a/src/g_mapinfo.cpp b/src/g_mapinfo.cpp index e90fa52b5..0826b160a 100644 --- a/src/g_mapinfo.cpp +++ b/src/g_mapinfo.cpp @@ -49,6 +49,7 @@ #include "autosegs.h" #include "g_levellocals.h" #include "events.h" +#include "i_system.h" TArray wadclusterinfos; TArray wadlevelinfos; diff --git a/src/g_statusbar/sbarinfo.cpp b/src/g_statusbar/sbarinfo.cpp index 9da0e107e..60c68448f 100644 --- a/src/g_statusbar/sbarinfo.cpp +++ b/src/g_statusbar/sbarinfo.cpp @@ -47,6 +47,7 @@ #include "gstrings.h" #include "g_levellocals.h" #include "vm.h" +#include "i_system.h""" #define ARTIFLASH_OFFSET (statusBar->invBarOffset+6) enum diff --git a/src/gl_load/gl_interface.cpp b/src/gl_load/gl_interface.cpp index d2dc502db..72806a6a0 100644 --- a/src/gl_load/gl_interface.cpp +++ b/src/gl_load/gl_interface.cpp @@ -27,6 +27,7 @@ */ #include "gl_load/gl_system.h" +#include "doomerrors.h" #include "tarray.h" #include "doomtype.h" #include "m_argv.h" diff --git a/src/hwrenderer/textures/hw_material.h b/src/hwrenderer/textures/hw_material.h index 99f241434..154abcc89 100644 --- a/src/hwrenderer/textures/hw_material.h +++ b/src/hwrenderer/textures/hw_material.h @@ -4,7 +4,7 @@ #include "m_fixed.h" #include "textures/textures.h" -#include "i_system.h" + #include "r_defs.h" EXTERN_CVAR(Bool, gl_precache) diff --git a/src/hwrenderer/utility/hw_clock.cpp b/src/hwrenderer/utility/hw_clock.cpp index 2ac4c48f0..67b38ed16 100644 --- a/src/hwrenderer/utility/hw_clock.cpp +++ b/src/hwrenderer/utility/hw_clock.cpp @@ -32,7 +32,7 @@ ** */ -#include "i_system.h" + #include "g_level.h" #include "c_console.h" #include "c_dispatch.h" diff --git a/src/i_net.cpp b/src/i_net.cpp index 5c74c87ae..4cbf1df23 100644 --- a/src/i_net.cpp +++ b/src/i_net.cpp @@ -61,6 +61,7 @@ #include "d_player.h" #include "st_start.h" #include "m_misc.h" +#include "doomerrors.h" #include "i_net.h" diff --git a/src/m_alloc.cpp b/src/m_alloc.cpp index d08913b85..99f1b0657 100644 --- a/src/m_alloc.cpp +++ b/src/m_alloc.cpp @@ -44,7 +44,7 @@ #include #endif -#include "i_system.h" +#include "doomerrors.h" #include "dobject.h" #ifndef _MSC_VER diff --git a/src/m_argv.cpp b/src/m_argv.cpp index 0a2744e5d..ed2b08f1c 100644 --- a/src/m_argv.cpp +++ b/src/m_argv.cpp @@ -34,6 +34,7 @@ #include #include "m_argv.h" +#include "i_system.h" //=========================================================================== // diff --git a/src/m_misc.cpp b/src/m_misc.cpp index 392ba670d..2bf798b13 100644 --- a/src/m_misc.cpp +++ b/src/m_misc.cpp @@ -53,6 +53,7 @@ #include "i_video.h" #include "v_video.h" +#include "i_system.h" // Data. #include "m_misc.h" diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index 20582180b..de52b0424 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -64,7 +64,7 @@ #include "actor.h" #include "g_levellocals.h" #include "p_lnspec.h" -#include "i_system.h" + #include "v_text.h" #include "p_setup.h" #include "gi.h" diff --git a/src/maploader/udmf.cpp b/src/maploader/udmf.cpp index 4a1688bf7..a35f555b1 100644 --- a/src/maploader/udmf.cpp +++ b/src/maploader/udmf.cpp @@ -36,7 +36,7 @@ #include "doomstat.h" #include "p_setup.h" #include "p_lnspec.h" -#include "i_system.h" + #include "gi.h" #include "r_sky.h" #include "g_level.h" diff --git a/src/menu/loadsavemenu.cpp b/src/menu/loadsavemenu.cpp index e023f1f88..c7dc2738e 100644 --- a/src/menu/loadsavemenu.cpp +++ b/src/menu/loadsavemenu.cpp @@ -42,6 +42,7 @@ #include "gstrings.h" #include "serializer.h" #include "vm.h" +#include "i_system.h" // Save name length limit for old binary formats. #define OLDSAVESTRINGSIZE 24 diff --git a/src/menu/menudef.cpp b/src/menu/menudef.cpp index 43c703900..f085f79b7 100644 --- a/src/menu/menudef.cpp +++ b/src/menu/menudef.cpp @@ -45,7 +45,7 @@ #include "gameconfigfile.h" #include "m_argv.h" #include "i_soundfont.h" - +#include "i_system.h" void ClearSaveGames(); diff --git a/src/nodebuild_utility.cpp b/src/nodebuild_utility.cpp index 0735c299f..ffd5f61e8 100644 --- a/src/nodebuild_utility.cpp +++ b/src/nodebuild_utility.cpp @@ -44,7 +44,7 @@ #include #include "nodebuild.h" -#include "i_system.h" + #include "po_man.h" #include "g_levellocals.h" diff --git a/src/p_acs.h b/src/p_acs.h index 6fae24de9..bbd1001bf 100644 --- a/src/p_acs.h +++ b/src/p_acs.h @@ -37,6 +37,7 @@ #include "doomtype.h" #include "dthinker.h" +#include "doomerrors.h" #define LOCAL_SIZE 20 #define NUM_MAPVARS 128 diff --git a/src/p_effect.cpp b/src/p_effect.cpp index 689191e5b..073d6d9b8 100644 --- a/src/p_effect.cpp +++ b/src/p_effect.cpp @@ -36,7 +36,7 @@ #include "doomtype.h" #include "doomstat.h" -#include "i_system.h" + #include "actor.h" #include "m_argv.h" #include "p_effect.h" diff --git a/src/p_enemy.cpp b/src/p_enemy.cpp index 6997cd738..ade5c445a 100644 --- a/src/p_enemy.cpp +++ b/src/p_enemy.cpp @@ -33,7 +33,7 @@ #include "templates.h" #include "m_random.h" -#include "i_system.h" + #include "doomdef.h" #include "p_local.h" #include "p_maputl.h" diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 94255229d..a8aef7705 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -59,7 +59,7 @@ // HEADER FILES ------------------------------------------------------------ #include #include "templates.h" -#include "i_system.h" + #include "m_random.h" #include "doomdef.h" #include "p_local.h" diff --git a/src/p_openmap.cpp b/src/p_openmap.cpp index 9331dca72..765d91797 100644 --- a/src/p_openmap.cpp +++ b/src/p_openmap.cpp @@ -35,7 +35,7 @@ */ #include "p_setup.h" -#include "i_system.h" + #include "cmdlib.h" #include "w_wad.h" #include "md5.h" diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index d363e08c9..807287f41 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -33,7 +33,7 @@ ** */ -#include "i_system.h" + #include "p_local.h" #include "p_spec.h" diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 3321e6cec..2c5d1551c 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -72,6 +72,7 @@ #include "maploader/maploader.h" #include "p_acs.h" #include "am_map.h" +#include "i_system.h" #include "fragglescript/t_script.h" extern AActor *SpawnMapThing (int index, FMapThing *mthing, int position); diff --git a/src/p_sight.cpp b/src/p_sight.cpp index cb1dc8243..1e4c8155b 100644 --- a/src/p_sight.cpp +++ b/src/p_sight.cpp @@ -23,7 +23,7 @@ #include #include "doomdef.h" -#include "i_system.h" + #include "p_local.h" #include "p_maputl.h" #include "p_blockmap.h" diff --git a/src/p_switch.cpp b/src/p_switch.cpp index 04bca2ca1..375249c5c 100644 --- a/src/p_switch.cpp +++ b/src/p_switch.cpp @@ -33,7 +33,7 @@ */ #include "templates.h" -#include "i_system.h" + #include "doomdef.h" #include "p_local.h" #include "p_lnspec.h" diff --git a/src/polyrenderer/drawers/poly_buffer.cpp b/src/polyrenderer/drawers/poly_buffer.cpp index eb1b5e1e4..d205fe8cc 100644 --- a/src/polyrenderer/drawers/poly_buffer.cpp +++ b/src/polyrenderer/drawers/poly_buffer.cpp @@ -23,7 +23,7 @@ #include #include "templates.h" #include "doomdef.h" -#include "i_system.h" + #include "w_wad.h" #include "v_video.h" #include "doomstat.h" diff --git a/src/polyrenderer/drawers/poly_draw_args.cpp b/src/polyrenderer/drawers/poly_draw_args.cpp index bb31c1515..fe5dd1e8d 100644 --- a/src/polyrenderer/drawers/poly_draw_args.cpp +++ b/src/polyrenderer/drawers/poly_draw_args.cpp @@ -23,7 +23,7 @@ #include #include "templates.h" #include "doomdef.h" -#include "i_system.h" + #include "w_wad.h" #include "v_video.h" #include "doomstat.h" diff --git a/src/polyrenderer/drawers/poly_triangle.cpp b/src/polyrenderer/drawers/poly_triangle.cpp index b0248eceb..9fd779cdc 100644 --- a/src/polyrenderer/drawers/poly_triangle.cpp +++ b/src/polyrenderer/drawers/poly_triangle.cpp @@ -23,7 +23,7 @@ #include #include "templates.h" #include "doomdef.h" -#include "i_system.h" + #include "w_wad.h" #include "v_video.h" #include "doomstat.h" diff --git a/src/polyrenderer/drawers/screen_triangle.cpp b/src/polyrenderer/drawers/screen_triangle.cpp index 151e86a9f..c989a94d1 100644 --- a/src/polyrenderer/drawers/screen_triangle.cpp +++ b/src/polyrenderer/drawers/screen_triangle.cpp @@ -23,7 +23,7 @@ #include #include "templates.h" #include "doomdef.h" -#include "i_system.h" + #include "w_wad.h" #include "v_video.h" #include "doomstat.h" diff --git a/src/polyrenderer/poly_renderthread.cpp b/src/polyrenderer/poly_renderthread.cpp index 3293014f4..ccc8338bf 100644 --- a/src/polyrenderer/poly_renderthread.cpp +++ b/src/polyrenderer/poly_renderthread.cpp @@ -24,7 +24,7 @@ #include "templates.h" #include "doomdef.h" #include "m_bbox.h" -#include "i_system.h" + #include "p_lnspec.h" #include "p_setup.h" #include "a_sharedglobal.h" diff --git a/src/posix/cocoa/i_main.mm b/src/posix/cocoa/i_main.mm index 9fe38947b..7f823b628 100644 --- a/src/posix/cocoa/i_main.mm +++ b/src/posix/cocoa/i_main.mm @@ -44,6 +44,7 @@ #include "m_argv.h" #include "st_console.h" #include "version.h" +#include "doomerrors.h" #define ZD_UNUSED(VARIABLE) ((void)(VARIABLE)) diff --git a/src/posix/cocoa/i_video.mm b/src/posix/cocoa/i_video.mm index 0746056da..7b20907f2 100644 --- a/src/posix/cocoa/i_video.mm +++ b/src/posix/cocoa/i_video.mm @@ -46,6 +46,7 @@ #include "st_console.h" #include "v_text.h" #include "version.h" +#include "doomerrors.h" #include "gl/renderer/gl_renderer.h" #include "gl/system/gl_framebuffer.h" diff --git a/src/posix/i_system.h b/src/posix/i_system.h index 1ff06a79e..7e6837824 100644 --- a/src/posix/i_system.h +++ b/src/posix/i_system.h @@ -99,9 +99,6 @@ void I_Quit (void); void I_Tactile (int on, int off, int total); -void I_Error (const char *error, ...) GCCPRINTF(1,2); -void I_FatalError (const char *error, ...) GCCPRINTF(1,2); - void addterm (void (*func)(void), const char *name); #define atterm(t) addterm (t, #t) void popterm (); diff --git a/src/posix/sdl/critsec.cpp b/src/posix/sdl/critsec.cpp index 04aa4aa9d..03a6202b9 100644 --- a/src/posix/sdl/critsec.cpp +++ b/src/posix/sdl/critsec.cpp @@ -36,6 +36,7 @@ #include "SDL.h" #include "i_system.h" +#include "doomerrors.h" class FInternalCriticalSection { diff --git a/src/posix/sdl/hardware.cpp b/src/posix/sdl/hardware.cpp index faf1b4988..a26536538 100644 --- a/src/posix/sdl/hardware.cpp +++ b/src/posix/sdl/hardware.cpp @@ -40,6 +40,7 @@ #include "v_text.h" #include "doomstat.h" #include "m_argv.h" +#include "doomerrors.h" #include "swrenderer/r_swrenderer.h" IVideo *Video; diff --git a/src/posix/sdl/i_main.cpp b/src/posix/sdl/i_main.cpp index f7d5da8f3..05b0e6425 100644 --- a/src/posix/sdl/i_main.cpp +++ b/src/posix/sdl/i_main.cpp @@ -53,6 +53,7 @@ #include "r_utility.h" #include "doomstat.h" #include "vm.h" +#include "doomerrors.h" // MACROS ------------------------------------------------------------------ diff --git a/src/posix/unix/i_specialpaths.cpp b/src/posix/unix/i_specialpaths.cpp index 60cc12fcf..b6cba526a 100644 --- a/src/posix/unix/i_specialpaths.cpp +++ b/src/posix/unix/i_specialpaths.cpp @@ -37,6 +37,7 @@ #include #include "i_system.h" #include "cmdlib.h" +#include "doomerrors.h" #include "version.h" // for GAMENAME diff --git a/src/r_data/colormaps.cpp b/src/r_data/colormaps.cpp index d8feac7c7..5c5ed6a3b 100644 --- a/src/r_data/colormaps.cpp +++ b/src/r_data/colormaps.cpp @@ -38,7 +38,7 @@ #include #include -#include "i_system.h" + #include "w_wad.h" #include "r_sky.h" #include "colormaps.h" diff --git a/src/r_data/gldefs.cpp b/src/r_data/gldefs.cpp index e853ed6e4..ae7f11519 100644 --- a/src/r_data/gldefs.cpp +++ b/src/r_data/gldefs.cpp @@ -33,7 +33,7 @@ ** */ #include -#include "i_system.h" + #include "sc_man.h" #include "templates.h" #include "w_wad.h" diff --git a/src/r_data/r_sections.cpp b/src/r_data/r_sections.cpp index 29b518966..5009b58c6 100644 --- a/src/r_data/r_sections.cpp +++ b/src/r_data/r_sections.cpp @@ -23,7 +23,7 @@ #include -#include "i_system.h" + #include "p_local.h" #include "c_dispatch.h" #include "r_defs.h" diff --git a/src/r_data/sprites.cpp b/src/r_data/sprites.cpp index 2a5224b4f..eecb27dd2 100644 --- a/src/r_data/sprites.cpp +++ b/src/r_data/sprites.cpp @@ -23,7 +23,7 @@ #include "doomtype.h" #include "w_wad.h" -#include "i_system.h" + #include "s_sound.h" #include "d_player.h" #include "d_netinf.h" diff --git a/src/r_utility.cpp b/src/r_utility.cpp index ebe1e9ef4..3d314d34c 100644 --- a/src/r_utility.cpp +++ b/src/r_utility.cpp @@ -63,7 +63,7 @@ #include "i_time.h" #include "actorinlines.h" #include "g_game.h" - +#include "i_system.h" // EXTERNAL DATA DECLARATIONS ---------------------------------------------- diff --git a/src/resourcefiles/file_wad.cpp b/src/resourcefiles/file_wad.cpp index c1f5b3fdb..7b8e81bf9 100644 --- a/src/resourcefiles/file_wad.cpp +++ b/src/resourcefiles/file_wad.cpp @@ -37,7 +37,7 @@ #include "v_text.h" #include "w_wad.h" #include "gi.h" -#include "i_system.h" +#include "doomerrors.h" //========================================================================== // diff --git a/src/resourcefiles/file_zip.cpp b/src/resourcefiles/file_zip.cpp index 04430384e..ac7ae7a08 100644 --- a/src/resourcefiles/file_zip.cpp +++ b/src/resourcefiles/file_zip.cpp @@ -40,7 +40,7 @@ #include "v_text.h" #include "w_wad.h" #include "w_zip.h" -#include "i_system.h" + #include "ancientzip.h" #define BUFREADCOMMENT (0x400) diff --git a/src/s_advsound.cpp b/src/s_advsound.cpp index 0f11c18b6..054edd6fb 100644 --- a/src/s_advsound.cpp +++ b/src/s_advsound.cpp @@ -47,6 +47,7 @@ #include "g_levellocals.h" #include "r_data/sprites.h" #include "vm.h" +#include "i_system.h" // MACROS ------------------------------------------------------------------ diff --git a/src/sc_man.cpp b/src/sc_man.cpp index f1b9b9267..7c2aa460a 100644 --- a/src/sc_man.cpp +++ b/src/sc_man.cpp @@ -61,7 +61,7 @@ #include #include #include "doomtype.h" -#include "i_system.h" +#include "doomerrors.h" #include "sc_man.h" #include "w_wad.h" #include "cmdlib.h" diff --git a/src/scripting/vm/jitintern.h b/src/scripting/vm/jitintern.h index 67659e6e0..aa6dbfc09 100644 --- a/src/scripting/vm/jitintern.h +++ b/src/scripting/vm/jitintern.h @@ -1,6 +1,6 @@ #include "jit.h" -#include "i_system.h" + #include "types.h" #include "stats.h" diff --git a/src/scripting/vmthunks.cpp b/src/scripting/vmthunks.cpp index b5fa6a918..e6cf8b3c8 100644 --- a/src/scripting/vmthunks.cpp +++ b/src/scripting/vmthunks.cpp @@ -28,6 +28,7 @@ // //----------------------------------------------------------------------------- +#include #include "vm.h" #include "r_defs.h" #include "g_levellocals.h" diff --git a/src/scriptutil.cpp b/src/scriptutil.cpp index b47eaee4b..5dfbea03c 100644 --- a/src/scriptutil.cpp +++ b/src/scriptutil.cpp @@ -23,7 +23,7 @@ // //----------------------------------------------------------------------------- -#include "i_system.h" + #include "tarray.h" #include "dobject.h" #include "vm.h" diff --git a/src/sound/mididevices/music_fluidsynth_mididevice.cpp b/src/sound/mididevices/music_fluidsynth_mididevice.cpp index 9112e527a..8314107df 100644 --- a/src/sound/mididevices/music_fluidsynth_mididevice.cpp +++ b/src/sound/mididevices/music_fluidsynth_mididevice.cpp @@ -39,6 +39,7 @@ #include "v_text.h" #include "cmdlib.h" #include "i_soundfont.h" +#include "doomerrors.h" // MACROS ------------------------------------------------------------------ diff --git a/src/sound/mididevices/music_opl_mididevice.cpp b/src/sound/mididevices/music_opl_mididevice.cpp index f5a45ab23..f588618b1 100644 --- a/src/sound/mididevices/music_opl_mididevice.cpp +++ b/src/sound/mididevices/music_opl_mididevice.cpp @@ -38,7 +38,7 @@ #include "i_musicinterns.h" #include "w_wad.h" #include "v_text.h" -#include "i_system.h" +#include "doomerrors.h" #include "opl.h" // MACROS ------------------------------------------------------------------ diff --git a/src/sound/mididevices/music_opnmidi_mididevice.cpp b/src/sound/mididevices/music_opnmidi_mididevice.cpp index d9f5d6124..60a9e6167 100644 --- a/src/sound/mididevices/music_opnmidi_mididevice.cpp +++ b/src/sound/mididevices/music_opnmidi_mididevice.cpp @@ -36,7 +36,7 @@ #include "i_musicinterns.h" #include "w_wad.h" -#include "i_system.h" +#include "doomerrors.h" #include "opnmidi/opnmidi.h" #include "i_soundfont.h" diff --git a/src/sound/mididevices/music_timiditypp_mididevice.cpp b/src/sound/mididevices/music_timiditypp_mididevice.cpp index d7025dbcf..381551d3a 100644 --- a/src/sound/mididevices/music_timiditypp_mididevice.cpp +++ b/src/sound/mididevices/music_timiditypp_mididevice.cpp @@ -36,7 +36,7 @@ #include "i_musicinterns.h" #include "v_text.h" -#include "i_system.h" +#include "doomerrors.h" #include "timiditypp/timidity.h" #include "timiditypp/instrum.h" diff --git a/src/sound/mididevices/music_wildmidi_mididevice.cpp b/src/sound/mididevices/music_wildmidi_mididevice.cpp index ccb63ebf3..235110044 100644 --- a/src/sound/mididevices/music_wildmidi_mididevice.cpp +++ b/src/sound/mididevices/music_wildmidi_mididevice.cpp @@ -35,7 +35,7 @@ // HEADER FILES ------------------------------------------------------------ #include "i_musicinterns.h" -#include "i_system.h" +#include "doomerrors.h" // MACROS ------------------------------------------------------------------ diff --git a/src/sound/mididevices/music_win_mididevice.cpp b/src/sound/mididevices/music_win_mididevice.cpp index b6ddd46a2..e2605297d 100644 --- a/src/sound/mididevices/music_win_mididevice.cpp +++ b/src/sound/mididevices/music_win_mididevice.cpp @@ -42,7 +42,7 @@ #include "templates.h" #include "doomdef.h" #include "m_swap.h" -#include "i_system.h" +#include "doomerrors.h" #ifndef __GNUC__ #include diff --git a/src/sound/musicformats/music_dumb.cpp b/src/sound/musicformats/music_dumb.cpp index 94c7199c6..5ff82f0de 100644 --- a/src/sound/musicformats/music_dumb.cpp +++ b/src/sound/musicformats/music_dumb.cpp @@ -37,7 +37,7 @@ #include #include "i_musicinterns.h" -#include "i_system.h" + #undef CDECL // w32api's windef.h defines this #include "../dumb/include/dumb.h" diff --git a/src/sound/timidity/common.cpp b/src/sound/timidity/common.cpp index 02d10c7e8..448075f39 100644 --- a/src/sound/timidity/common.cpp +++ b/src/sound/timidity/common.cpp @@ -24,7 +24,7 @@ #include #include #include "timidity.h" -#include "i_system.h" +#include "doomerrors.h" namespace Timidity { diff --git a/src/sound/timidity/timidity.cpp b/src/sound/timidity/timidity.cpp index e657466c0..b100a1e5d 100644 --- a/src/sound/timidity/timidity.cpp +++ b/src/sound/timidity/timidity.cpp @@ -28,6 +28,7 @@ #include "cmdlib.h" #include "c_cvars.h" #include "c_dispatch.h" +#include "doomerrors.h" #include "i_system.h" #include "files.h" #include "w_wad.h" diff --git a/src/swrenderer/drawers/r_draw.cpp b/src/swrenderer/drawers/r_draw.cpp index 8dfddb832..4d20ca682 100644 --- a/src/swrenderer/drawers/r_draw.cpp +++ b/src/swrenderer/drawers/r_draw.cpp @@ -36,7 +36,7 @@ #include "templates.h" #include "doomdef.h" -#include "i_system.h" + #include "w_wad.h" #include "v_video.h" #include "doomstat.h" diff --git a/src/swrenderer/drawers/r_draw_rgba.cpp b/src/swrenderer/drawers/r_draw_rgba.cpp index f43831d65..9c3e328cd 100644 --- a/src/swrenderer/drawers/r_draw_rgba.cpp +++ b/src/swrenderer/drawers/r_draw_rgba.cpp @@ -36,7 +36,7 @@ #include "templates.h" #include "doomdef.h" -#include "i_system.h" + #include "w_wad.h" #include "v_video.h" #include "doomstat.h" diff --git a/src/swrenderer/line/r_farclip_line.cpp b/src/swrenderer/line/r_farclip_line.cpp index 5b55e654f..91f2774a2 100644 --- a/src/swrenderer/line/r_farclip_line.cpp +++ b/src/swrenderer/line/r_farclip_line.cpp @@ -21,7 +21,7 @@ #include #include #include "templates.h" -#include "i_system.h" + #include "doomdef.h" #include "doomstat.h" #include "doomdata.h" diff --git a/src/swrenderer/line/r_fogboundary.cpp b/src/swrenderer/line/r_fogboundary.cpp index 8a20b9028..8831e15c4 100644 --- a/src/swrenderer/line/r_fogboundary.cpp +++ b/src/swrenderer/line/r_fogboundary.cpp @@ -23,7 +23,7 @@ #include #include #include "templates.h" -#include "i_system.h" + #include "w_wad.h" #include "doomdef.h" #include "doomstat.h" diff --git a/src/swrenderer/line/r_line.cpp b/src/swrenderer/line/r_line.cpp index 2b3578437..04d43b3bd 100644 --- a/src/swrenderer/line/r_line.cpp +++ b/src/swrenderer/line/r_line.cpp @@ -23,7 +23,7 @@ #include #include #include "templates.h" -#include "i_system.h" +#include "doomerrors.h" #include "doomdef.h" #include "doomstat.h" #include "doomdata.h" diff --git a/src/swrenderer/line/r_renderdrawsegment.cpp b/src/swrenderer/line/r_renderdrawsegment.cpp index 610641fdf..5758b08ee 100644 --- a/src/swrenderer/line/r_renderdrawsegment.cpp +++ b/src/swrenderer/line/r_renderdrawsegment.cpp @@ -24,7 +24,7 @@ #include "templates.h" #include "doomdef.h" #include "m_bbox.h" -#include "i_system.h" + #include "p_lnspec.h" #include "p_setup.h" #include "a_sharedglobal.h" diff --git a/src/swrenderer/line/r_wallsetup.cpp b/src/swrenderer/line/r_wallsetup.cpp index 168e8425f..f1b2f2518 100644 --- a/src/swrenderer/line/r_wallsetup.cpp +++ b/src/swrenderer/line/r_wallsetup.cpp @@ -23,7 +23,7 @@ #include #include #include "templates.h" -#include "i_system.h" + #include "doomdef.h" #include "doomstat.h" #include "doomdata.h" diff --git a/src/swrenderer/plane/r_flatplane.cpp b/src/swrenderer/plane/r_flatplane.cpp index b75d5c545..278fe3e14 100644 --- a/src/swrenderer/plane/r_flatplane.cpp +++ b/src/swrenderer/plane/r_flatplane.cpp @@ -23,7 +23,7 @@ #include #include #include "templates.h" -#include "i_system.h" +#include "doomerrors.h" #include "w_wad.h" #include "doomdef.h" #include "doomstat.h" diff --git a/src/swrenderer/plane/r_planerenderer.cpp b/src/swrenderer/plane/r_planerenderer.cpp index bc1eb22f9..5a07a319a 100644 --- a/src/swrenderer/plane/r_planerenderer.cpp +++ b/src/swrenderer/plane/r_planerenderer.cpp @@ -24,7 +24,7 @@ #include #include "templates.h" -#include "i_system.h" + #include "w_wad.h" #include "doomdef.h" #include "doomstat.h" diff --git a/src/swrenderer/plane/r_skyplane.cpp b/src/swrenderer/plane/r_skyplane.cpp index 223a71b79..a3ddae79b 100644 --- a/src/swrenderer/plane/r_skyplane.cpp +++ b/src/swrenderer/plane/r_skyplane.cpp @@ -23,7 +23,7 @@ #include #include #include "templates.h" -#include "i_system.h" + #include "w_wad.h" #include "doomdef.h" #include "doomstat.h" diff --git a/src/swrenderer/plane/r_slopeplane.cpp b/src/swrenderer/plane/r_slopeplane.cpp index c143e86c3..e2249a30f 100644 --- a/src/swrenderer/plane/r_slopeplane.cpp +++ b/src/swrenderer/plane/r_slopeplane.cpp @@ -23,7 +23,7 @@ #include #include #include "templates.h" -#include "i_system.h" + #include "w_wad.h" #include "doomdef.h" #include "doomstat.h" diff --git a/src/swrenderer/plane/r_visibleplane.cpp b/src/swrenderer/plane/r_visibleplane.cpp index a61b6e84d..2d5cf854d 100644 --- a/src/swrenderer/plane/r_visibleplane.cpp +++ b/src/swrenderer/plane/r_visibleplane.cpp @@ -24,7 +24,7 @@ #include #include "templates.h" -#include "i_system.h" + #include "w_wad.h" #include "doomdef.h" #include "doomstat.h" diff --git a/src/swrenderer/plane/r_visibleplanelist.cpp b/src/swrenderer/plane/r_visibleplanelist.cpp index 3c65e6386..d157bc42a 100644 --- a/src/swrenderer/plane/r_visibleplanelist.cpp +++ b/src/swrenderer/plane/r_visibleplanelist.cpp @@ -24,7 +24,7 @@ #include #include "templates.h" -#include "i_system.h" + #include "w_wad.h" #include "doomdef.h" #include "doomstat.h" diff --git a/src/swrenderer/r_memory.cpp b/src/swrenderer/r_memory.cpp index 38fc7d868..6e0556edb 100644 --- a/src/swrenderer/r_memory.cpp +++ b/src/swrenderer/r_memory.cpp @@ -22,7 +22,7 @@ #include "templates.h" #include "doomdef.h" #include "m_bbox.h" -#include "i_system.h" + #include "p_lnspec.h" #include "p_setup.h" #include "swrenderer/drawers/r_draw.h" diff --git a/src/swrenderer/r_renderthread.cpp b/src/swrenderer/r_renderthread.cpp index 86e789721..036e29730 100644 --- a/src/swrenderer/r_renderthread.cpp +++ b/src/swrenderer/r_renderthread.cpp @@ -24,7 +24,7 @@ #include "templates.h" #include "doomdef.h" #include "m_bbox.h" -#include "i_system.h" + #include "p_lnspec.h" #include "p_setup.h" #include "a_sharedglobal.h" diff --git a/src/swrenderer/r_swscene.cpp b/src/swrenderer/r_swscene.cpp index 013308bbf..164ffd536 100644 --- a/src/swrenderer/r_swscene.cpp +++ b/src/swrenderer/r_swscene.cpp @@ -34,6 +34,7 @@ #include "textures/bitmap.h" #include "swrenderer/scene/r_light.h" #include "image.h" +#include "doomerrors.h" // [RH] Base blending values (for e.g. underwater) int BaseBlendR, BaseBlendG, BaseBlendB; diff --git a/src/swrenderer/scene/r_light.cpp b/src/swrenderer/scene/r_light.cpp index 0834a990c..0af4723a1 100644 --- a/src/swrenderer/scene/r_light.cpp +++ b/src/swrenderer/scene/r_light.cpp @@ -24,7 +24,7 @@ #include #include "templates.h" -#include "i_system.h" + #include "w_wad.h" #include "doomdef.h" #include "doomstat.h" diff --git a/src/swrenderer/scene/r_opaque_pass.cpp b/src/swrenderer/scene/r_opaque_pass.cpp index d929a2234..2674e782d 100644 --- a/src/swrenderer/scene/r_opaque_pass.cpp +++ b/src/swrenderer/scene/r_opaque_pass.cpp @@ -34,7 +34,7 @@ #include "m_bbox.h" -#include "i_system.h" +#include "doomerrors.h" #include "p_lnspec.h" #include "p_setup.h" diff --git a/src/swrenderer/scene/r_portal.cpp b/src/swrenderer/scene/r_portal.cpp index d78930e41..3077f3705 100644 --- a/src/swrenderer/scene/r_portal.cpp +++ b/src/swrenderer/scene/r_portal.cpp @@ -38,7 +38,7 @@ #include "v_video.h" #include "stats.h" #include "i_video.h" -#include "i_system.h" + #include "a_sharedglobal.h" #include "r_data/r_translate.h" #include "p_3dmidtex.h" diff --git a/src/swrenderer/scene/r_scene.cpp b/src/swrenderer/scene/r_scene.cpp index 01e696918..fe00fc1b8 100644 --- a/src/swrenderer/scene/r_scene.cpp +++ b/src/swrenderer/scene/r_scene.cpp @@ -23,7 +23,7 @@ #include #include "templates.h" -#include "i_system.h" + #include "w_wad.h" #include "doomdef.h" #include "doomstat.h" diff --git a/src/swrenderer/scene/r_translucent_pass.cpp b/src/swrenderer/scene/r_translucent_pass.cpp index ba077b9d4..4738af57b 100644 --- a/src/swrenderer/scene/r_translucent_pass.cpp +++ b/src/swrenderer/scene/r_translucent_pass.cpp @@ -26,7 +26,7 @@ #include "templates.h" #include "doomdef.h" #include "m_swap.h" -#include "i_system.h" + #include "w_wad.h" #include "g_levellocals.h" #include "p_maputl.h" diff --git a/src/swrenderer/segments/r_clipsegment.cpp b/src/swrenderer/segments/r_clipsegment.cpp index 5201bc38e..3afb4bab3 100644 --- a/src/swrenderer/segments/r_clipsegment.cpp +++ b/src/swrenderer/segments/r_clipsegment.cpp @@ -23,7 +23,7 @@ #include "templates.h" #include "doomdef.h" #include "m_bbox.h" -#include "i_system.h" + #include "p_lnspec.h" #include "p_setup.h" #include "swrenderer/drawers/r_draw.h" diff --git a/src/swrenderer/segments/r_drawsegment.cpp b/src/swrenderer/segments/r_drawsegment.cpp index a613ce60f..798ee7a3c 100644 --- a/src/swrenderer/segments/r_drawsegment.cpp +++ b/src/swrenderer/segments/r_drawsegment.cpp @@ -23,7 +23,7 @@ #include "templates.h" #include "doomdef.h" #include "m_bbox.h" -#include "i_system.h" + #include "p_lnspec.h" #include "p_setup.h" #include "a_sharedglobal.h" diff --git a/src/swrenderer/segments/r_portalsegment.cpp b/src/swrenderer/segments/r_portalsegment.cpp index a5dcfe7c3..34ed3677d 100644 --- a/src/swrenderer/segments/r_portalsegment.cpp +++ b/src/swrenderer/segments/r_portalsegment.cpp @@ -23,7 +23,7 @@ #include "templates.h" #include "doomdef.h" #include "m_bbox.h" -#include "i_system.h" + #include "p_lnspec.h" #include "p_setup.h" #include "swrenderer/drawers/r_draw.h" diff --git a/src/swrenderer/things/r_decal.cpp b/src/swrenderer/things/r_decal.cpp index 4340358ea..af026276b 100644 --- a/src/swrenderer/things/r_decal.cpp +++ b/src/swrenderer/things/r_decal.cpp @@ -22,7 +22,7 @@ #include #include #include "templates.h" -#include "i_system.h" + #include "doomdef.h" #include "doomstat.h" #include "doomdata.h" diff --git a/src/swrenderer/things/r_particle.cpp b/src/swrenderer/things/r_particle.cpp index 99831a386..220124ae4 100644 --- a/src/swrenderer/things/r_particle.cpp +++ b/src/swrenderer/things/r_particle.cpp @@ -26,7 +26,7 @@ #include "templates.h" #include "doomdef.h" #include "m_swap.h" -#include "i_system.h" + #include "w_wad.h" #include "c_console.h" #include "c_cvars.h" diff --git a/src/swrenderer/things/r_playersprite.cpp b/src/swrenderer/things/r_playersprite.cpp index eb12dbcae..94e127ad1 100644 --- a/src/swrenderer/things/r_playersprite.cpp +++ b/src/swrenderer/things/r_playersprite.cpp @@ -26,7 +26,7 @@ #include "templates.h" #include "doomdef.h" #include "m_swap.h" -#include "i_system.h" + #include "w_wad.h" #include "swrenderer/things/r_playersprite.h" #include "c_console.h" diff --git a/src/swrenderer/things/r_sprite.cpp b/src/swrenderer/things/r_sprite.cpp index fa8ce436d..5c00ed9fd 100644 --- a/src/swrenderer/things/r_sprite.cpp +++ b/src/swrenderer/things/r_sprite.cpp @@ -26,7 +26,7 @@ #include "templates.h" #include "doomdef.h" #include "m_swap.h" -#include "i_system.h" + #include "w_wad.h" #include "swrenderer/things/r_wallsprite.h" #include "c_console.h" diff --git a/src/swrenderer/things/r_visiblesprite.cpp b/src/swrenderer/things/r_visiblesprite.cpp index 9c7e157c8..a2dd22b13 100644 --- a/src/swrenderer/things/r_visiblesprite.cpp +++ b/src/swrenderer/things/r_visiblesprite.cpp @@ -26,7 +26,7 @@ #include "templates.h" #include "doomdef.h" #include "m_swap.h" -#include "i_system.h" + #include "w_wad.h" #include "g_levellocals.h" #include "p_maputl.h" diff --git a/src/swrenderer/things/r_visiblespritelist.cpp b/src/swrenderer/things/r_visiblespritelist.cpp index ca1a40ab5..95a4dfaca 100644 --- a/src/swrenderer/things/r_visiblespritelist.cpp +++ b/src/swrenderer/things/r_visiblespritelist.cpp @@ -26,7 +26,7 @@ #include "templates.h" #include "doomdef.h" #include "m_swap.h" -#include "i_system.h" + #include "w_wad.h" #include "g_levellocals.h" #include "p_maputl.h" diff --git a/src/swrenderer/things/r_wallsprite.cpp b/src/swrenderer/things/r_wallsprite.cpp index 15d600b5f..3a6e60a0f 100644 --- a/src/swrenderer/things/r_wallsprite.cpp +++ b/src/swrenderer/things/r_wallsprite.cpp @@ -26,7 +26,7 @@ #include "templates.h" #include "doomdef.h" #include "m_swap.h" -#include "i_system.h" + #include "w_wad.h" #include "swrenderer/things/r_wallsprite.h" #include "c_console.h" diff --git a/src/swrenderer/viewport/r_viewport.cpp b/src/swrenderer/viewport/r_viewport.cpp index 2e39b1d3d..76a46bed3 100644 --- a/src/swrenderer/viewport/r_viewport.cpp +++ b/src/swrenderer/viewport/r_viewport.cpp @@ -23,7 +23,7 @@ #include #include "templates.h" -#include "i_system.h" + #include "w_wad.h" #include "doomdef.h" #include "doomstat.h" diff --git a/src/teaminfo.cpp b/src/teaminfo.cpp index bde80a431..5a70429e0 100644 --- a/src/teaminfo.cpp +++ b/src/teaminfo.cpp @@ -36,7 +36,7 @@ #include "c_dispatch.h" #include "gi.h" -#include "i_system.h" + #include "teaminfo.h" #include "v_font.h" #include "v_video.h" diff --git a/src/textures/animations.cpp b/src/textures/animations.cpp index 031a940e7..644718bc4 100644 --- a/src/textures/animations.cpp +++ b/src/textures/animations.cpp @@ -34,7 +34,7 @@ #include "doomtype.h" #include "cmdlib.h" -#include "i_system.h" +#include "doomerrors.h" #include "r_sky.h" #include "m_random.h" #include "d_player.h" diff --git a/src/textures/formats/brightmaptexture.cpp b/src/textures/formats/brightmaptexture.cpp index d56f06010..b9baf2383 100644 --- a/src/textures/formats/brightmaptexture.cpp +++ b/src/textures/formats/brightmaptexture.cpp @@ -35,7 +35,7 @@ #include "doomtype.h" #include "w_wad.h" -#include "i_system.h" + #include "r_data/r_translate.h" #include "bitmap.h" #include "v_video.h" diff --git a/src/textures/formats/fontchars.cpp b/src/textures/formats/fontchars.cpp index afb643487..6ff30ab8c 100644 --- a/src/textures/formats/fontchars.cpp +++ b/src/textures/formats/fontchars.cpp @@ -42,6 +42,7 @@ #include "image.h" #include "imagehelpers.h" #include "fontchars.h" +#include "doomerrors.h" //========================================================================== // diff --git a/src/textures/formats/multipatchtexture.cpp b/src/textures/formats/multipatchtexture.cpp index 165a49344..8166db645 100644 --- a/src/textures/formats/multipatchtexture.cpp +++ b/src/textures/formats/multipatchtexture.cpp @@ -37,7 +37,7 @@ #include "doomtype.h" #include "files.h" #include "w_wad.h" -#include "i_system.h" + #include "gi.h" #include "st_start.h" #include "sc_man.h" diff --git a/src/textures/multipatchtexturebuilder.cpp b/src/textures/multipatchtexturebuilder.cpp index 4675220f5..0bc822a05 100644 --- a/src/textures/multipatchtexturebuilder.cpp +++ b/src/textures/multipatchtexturebuilder.cpp @@ -38,7 +38,7 @@ #include "doomtype.h" #include "files.h" #include "w_wad.h" -#include "i_system.h" + #include "gi.h" #include "st_start.h" #include "sc_man.h" diff --git a/src/textures/texture.cpp b/src/textures/texture.cpp index 6d8dc0198..85d319ffc 100644 --- a/src/textures/texture.cpp +++ b/src/textures/texture.cpp @@ -38,7 +38,7 @@ #include "files.h" #include "w_wad.h" #include "templates.h" -#include "i_system.h" + #include "r_data/r_translate.h" #include "bitmap.h" #include "colormatcher.h" diff --git a/src/textures/texturemanager.cpp b/src/textures/texturemanager.cpp index 1c535f4df..f68f0d478 100644 --- a/src/textures/texturemanager.cpp +++ b/src/textures/texturemanager.cpp @@ -38,7 +38,7 @@ #include "doomstat.h" #include "w_wad.h" #include "templates.h" -#include "i_system.h" + #include "r_data/r_translate.h" #include "r_data/sprites.h" #include "c_dispatch.h" diff --git a/src/v_framebuffer.cpp b/src/v_framebuffer.cpp index 722596c35..26a86623a 100644 --- a/src/v_framebuffer.cpp +++ b/src/v_framebuffer.cpp @@ -34,7 +34,7 @@ #include -#include "i_system.h" + #include "x86.h" #include "actor.h" diff --git a/src/v_pfx.cpp b/src/v_pfx.cpp index 884a9c7a4..14a50c7c9 100644 --- a/src/v_pfx.cpp +++ b/src/v_pfx.cpp @@ -33,7 +33,7 @@ */ #include "doomtype.h" -#include "i_system.h" +#include "doomerrors.h" #include "v_pfx.h" PfxUnion GPfxPal; diff --git a/src/v_text.cpp b/src/v_text.cpp index a6d57399b..345f4b731 100644 --- a/src/v_text.cpp +++ b/src/v_text.cpp @@ -39,7 +39,7 @@ #include "v_text.h" -#include "i_system.h" + #include "v_video.h" #include "w_wad.h" diff --git a/src/v_video.cpp b/src/v_video.cpp index 6e0299bbb..8c8dccf97 100644 --- a/src/v_video.cpp +++ b/src/v_video.cpp @@ -36,6 +36,7 @@ #include #include "i_system.h" +#include "c_cvars.h" #include "x86.h" #include "i_video.h" #include "r_state.h" diff --git a/src/wi_stuff.cpp b/src/wi_stuff.cpp index 87edc0398..e5da62553 100644 --- a/src/wi_stuff.cpp +++ b/src/wi_stuff.cpp @@ -37,7 +37,7 @@ #include "m_random.h" #include "m_swap.h" -#include "i_system.h" + #include "w_wad.h" #include "g_level.h" #include "s_sound.h" diff --git a/src/win32/hardware.cpp b/src/win32/hardware.cpp index aa5671f28..29ee60aa7 100644 --- a/src/win32/hardware.cpp +++ b/src/win32/hardware.cpp @@ -44,6 +44,8 @@ #include "m_argv.h" #include "version.h" #include "win32glvideo.h" +#include "doomerrors.h" +#include "i_system.h" #include "swrenderer/r_swrenderer.h" EXTERN_CVAR(Int, vid_maxfps) diff --git a/src/win32/i_cd.cpp b/src/win32/i_cd.cpp index f6139e96f..c8dcc3d62 100644 --- a/src/win32/i_cd.cpp +++ b/src/win32/i_cd.cpp @@ -42,6 +42,7 @@ #include "c_cvars.h" #include "m_argv.h" #include "version.h" +#include "i_system.h" #include "i_cd.h" #include "helperthread.h" diff --git a/src/win32/i_input.cpp b/src/win32/i_input.cpp index 85bc3abef..e43c9c8bb 100644 --- a/src/win32/i_input.cpp +++ b/src/win32/i_input.cpp @@ -89,6 +89,8 @@ #include "v_text.h" #include "version.h" #include "events.h" +#include "doomerrors.h" +#include "i_system.h" // Prototypes and declarations. #include "rawinput.h" diff --git a/src/win32/i_main.cpp b/src/win32/i_main.cpp index 40115490c..2a35242d6 100644 --- a/src/win32/i_main.cpp +++ b/src/win32/i_main.cpp @@ -72,6 +72,7 @@ #include "g_levellocals.h" #include "s_sound.h" #include "vm.h" +#include "i_system.h" #include "stats.h" #include "st_start.h" diff --git a/src/win32/i_system.cpp b/src/win32/i_system.cpp index 45bb50b4d..bc0fb865b 100644 --- a/src/win32/i_system.cpp +++ b/src/win32/i_system.cpp @@ -80,6 +80,7 @@ #include "v_font.h" #include "g_level.h" #include "doomstat.h" +#include "i_system.h" #include "textures/bitmap.h" #include "optwin32.h" diff --git a/src/win32/i_system.h b/src/win32/i_system.h index 903203daf..59551a865 100644 --- a/src/win32/i_system.h +++ b/src/win32/i_system.h @@ -91,9 +91,6 @@ void I_Quit (void); void I_Tactile (int on, int off, int total); -void I_Error (const char *error, ...) GCCPRINTF(1,2); -void I_FatalError (const char *error, ...) GCCPRINTF(1,2); - void atterm (void (*func)(void)); void popterm (); diff --git a/src/win32/st_start.cpp b/src/win32/st_start.cpp index 549ccad1c..c2a0d5941 100644 --- a/src/win32/st_start.cpp +++ b/src/win32/st_start.cpp @@ -50,6 +50,7 @@ #include "s_sound.h" #include "m_argv.h" #include "d_main.h" +#include "doomerrors.h" // MACROS ------------------------------------------------------------------ From c77487dab8d0e41b479aca270328b1e71bf04d7c Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 31 Jan 2019 19:44:04 +0100 Subject: [PATCH 125/164] - moved the menu.h include from oalsound.h to oalsound.cpp. The menu is a very 'dirty' header, and forcing it to be pulled in with something entirely unrelated is not good - even though only two files include oalsound.h. --- src/sound/i_sound.cpp | 2 ++ src/sound/oalsound.cpp | 1 + src/sound/oalsound.h | 1 - 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/sound/i_sound.cpp b/src/sound/i_sound.cpp index a3587e3a5..de9c9a6a9 100644 --- a/src/sound/i_sound.cpp +++ b/src/sound/i_sound.cpp @@ -46,6 +46,8 @@ #include "i_music.h" #include "m_argv.h" #include "v_text.h" +#include "c_cvars.h" +#include "stats.h" EXTERN_CVAR (Float, snd_sfxvolume) CVAR (Int, snd_samplerate, 0, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) diff --git a/src/sound/oalsound.cpp b/src/sound/oalsound.cpp index 697a7a91f..98c3621f4 100644 --- a/src/sound/oalsound.cpp +++ b/src/sound/oalsound.cpp @@ -44,6 +44,7 @@ #include "i_music.h" #include "i_musicinterns.h" #include "cmdlib.h" +#include "menu/menu.h" FModule OpenALModule{"OpenAL"}; diff --git a/src/sound/oalsound.h b/src/sound/oalsound.h index a2a7869ce..0cf72a133 100644 --- a/src/sound/oalsound.h +++ b/src/sound/oalsound.h @@ -9,7 +9,6 @@ #include "i_sound.h" #include "s_sound.h" -#include "menu/menu.h" #ifndef NO_OPENAL From 89d607c9a61f4f9af5b708870399a68ed26bbdbc Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 31 Jan 2019 19:58:17 +0100 Subject: [PATCH 126/164] - moved all rendering code into a common subdirectory. No changes to the files themselves was made. --- src/CMakeLists.txt | 384 +++++++++--------- .../gl/renderer/gl_postprocess.cpp | 0 .../gl/renderer/gl_postprocessstate.cpp | 0 .../gl/renderer/gl_postprocessstate.h | 0 .../gl/renderer/gl_renderbuffers.cpp | 0 .../gl/renderer/gl_renderbuffers.h | 0 .../gl/renderer/gl_renderer.cpp | 0 src/{ => rendering}/gl/renderer/gl_renderer.h | 0 .../gl/renderer/gl_renderstate.cpp | 0 .../gl/renderer/gl_renderstate.h | 0 src/{ => rendering}/gl/renderer/gl_scene.cpp | 0 .../gl/renderer/gl_stereo3d.cpp | 0 .../gl/shaders/gl_postprocessshader.cpp | 0 .../gl/shaders/gl_postprocessshaderinstance.h | 0 src/{ => rendering}/gl/shaders/gl_shader.cpp | 0 src/{ => rendering}/gl/shaders/gl_shader.h | 0 .../gl/shaders/gl_shaderprogram.cpp | 0 .../gl/shaders/gl_shaderprogram.h | 0 src/{ => rendering}/gl/system/gl_buffers.cpp | 0 src/{ => rendering}/gl/system/gl_buffers.h | 0 src/{ => rendering}/gl/system/gl_debug.cpp | 0 src/{ => rendering}/gl/system/gl_debug.h | 0 .../gl/system/gl_framebuffer.cpp | 0 .../gl/system/gl_framebuffer.h | 0 .../gl/textures/gl_hwtexture.cpp | 0 .../gl/textures/gl_hwtexture.h | 0 .../gl/textures/gl_samplers.cpp | 0 src/{ => rendering}/gl/textures/gl_samplers.h | 0 src/{ => rendering}/gl_load/gl_extlist.txt | 0 src/{ => rendering}/gl_load/gl_interface.cpp | 0 src/{ => rendering}/gl_load/gl_interface.h | 0 src/{ => rendering}/gl_load/gl_load.c | 0 src/{ => rendering}/gl_load/gl_load.h | 0 src/{ => rendering}/gl_load/gl_system.h | 0 src/{ => rendering}/hwrenderer/data/buffers.h | 0 .../hwrenderer/data/flatvertices.cpp | 0 .../hwrenderer/data/flatvertices.h | 0 .../hwrenderer/data/hw_vertexbuilder.cpp | 0 .../hwrenderer/data/hw_vertexbuilder.h | 0 .../hwrenderer/data/hw_viewpointbuffer.cpp | 0 .../hwrenderer/data/hw_viewpointbuffer.h | 0 .../hwrenderer/data/renderqueue.h | 0 .../hwrenderer/data/shaderuniforms.h | 0 .../hwrenderer/dynlights/hw_aabbtree.cpp | 0 .../hwrenderer/dynlights/hw_aabbtree.h | 0 .../hwrenderer/dynlights/hw_dynlightdata.cpp | 0 .../hwrenderer/dynlights/hw_dynlightdata.h | 0 .../hwrenderer/dynlights/hw_lightbuffer.cpp | 0 .../hwrenderer/dynlights/hw_lightbuffer.h | 0 .../hwrenderer/dynlights/hw_shadowmap.cpp | 0 .../hwrenderer/dynlights/hw_shadowmap.h | 0 .../hwrenderer/models/hw_models.cpp | 0 .../hwrenderer/models/hw_models.h | 0 .../postprocessing/hw_postprocess.cpp | 0 .../postprocessing/hw_postprocess.h | 0 .../postprocessing/hw_postprocess_cvars.cpp | 0 .../postprocessing/hw_postprocess_cvars.h | 0 .../postprocessing/hw_postprocessshader.cpp | 0 .../postprocessing/hw_postprocessshader.h | 0 .../postprocessing/hw_present3dRowshader.cpp | 0 .../postprocessing/hw_present3dRowshader.h | 0 .../postprocessing/hw_presentshader.cpp | 0 .../postprocessing/hw_presentshader.h | 0 .../postprocessing/hw_shaderprogram.h | 0 .../postprocessing/hw_shadowmapshader.cpp | 0 .../postprocessing/hw_shadowmapshader.h | 0 .../hwrenderer/scene/hw_bsp.cpp | 0 .../hwrenderer/scene/hw_clipper.cpp | 0 .../hwrenderer/scene/hw_clipper.h | 0 .../hwrenderer/scene/hw_decal.cpp | 0 .../hwrenderer/scene/hw_drawinfo.cpp | 0 .../hwrenderer/scene/hw_drawinfo.h | 0 .../hwrenderer/scene/hw_drawlist.cpp | 0 .../hwrenderer/scene/hw_drawlist.h | 0 .../hwrenderer/scene/hw_drawlistadd.cpp | 0 .../hwrenderer/scene/hw_drawstructs.h | 0 .../hwrenderer/scene/hw_fakeflat.cpp | 0 .../hwrenderer/scene/hw_fakeflat.h | 0 .../hwrenderer/scene/hw_flats.cpp | 0 .../hwrenderer/scene/hw_portal.cpp | 0 .../hwrenderer/scene/hw_portal.h | 0 .../hwrenderer/scene/hw_renderhacks.cpp | 0 .../hwrenderer/scene/hw_renderstate.cpp | 0 .../hwrenderer/scene/hw_renderstate.h | 0 .../hwrenderer/scene/hw_sky.cpp | 0 .../hwrenderer/scene/hw_skydome.cpp | 0 .../hwrenderer/scene/hw_skydome.h | 0 .../hwrenderer/scene/hw_skyportal.cpp | 0 .../hwrenderer/scene/hw_spritelight.cpp | 0 .../hwrenderer/scene/hw_sprites.cpp | 0 .../hwrenderer/scene/hw_viewpointuniforms.h | 0 .../hwrenderer/scene/hw_walls.cpp | 0 .../hwrenderer/scene/hw_walls_vertex.cpp | 0 .../hwrenderer/scene/hw_weapon.cpp | 0 .../hwrenderer/scene/hw_weapon.h | 0 .../hwrenderer/textures/hw_ihwtexture.h | 0 .../hwrenderer/textures/hw_material.cpp | 0 .../hwrenderer/textures/hw_material.h | 0 .../hwrenderer/textures/hw_precache.cpp | 0 .../hwrenderer/textures/hw_texcontainer.h | 0 .../hwrenderer/utility/hw_clock.cpp | 0 .../hwrenderer/utility/hw_clock.h | 0 .../hwrenderer/utility/hw_cvars.cpp | 0 .../hwrenderer/utility/hw_cvars.h | 0 .../hwrenderer/utility/hw_draw2d.cpp | 0 .../hwrenderer/utility/hw_lighting.cpp | 0 .../hwrenderer/utility/hw_lighting.h | 0 .../hwrenderer/utility/hw_shaderpatcher.cpp | 0 .../hwrenderer/utility/hw_shaderpatcher.h | 0 .../hwrenderer/utility/hw_vrmodes.cpp | 0 .../hwrenderer/utility/hw_vrmodes.h | 0 .../polyrenderer/drawers/poly_buffer.cpp | 0 .../polyrenderer/drawers/poly_buffer.h | 0 .../polyrenderer/drawers/poly_draw_args.cpp | 0 .../polyrenderer/drawers/poly_draw_args.h | 0 .../polyrenderer/drawers/poly_triangle.cpp | 0 .../polyrenderer/drawers/poly_triangle.h | 0 .../polyrenderer/drawers/screen_triangle.cpp | 0 .../polyrenderer/drawers/screen_triangle.h | 0 .../polyrenderer/math/gpu_types.cpp | 0 .../polyrenderer/math/gpu_types.h | 0 src/{ => rendering}/polyrenderer/poly_all.cpp | 0 .../polyrenderer/poly_renderer.cpp | 0 .../polyrenderer/poly_renderer.h | 0 .../polyrenderer/poly_renderthread.cpp | 0 .../polyrenderer/poly_renderthread.h | 0 .../polyrenderer/scene/poly_cull.cpp | 0 .../polyrenderer/scene/poly_cull.h | 0 .../polyrenderer/scene/poly_decal.cpp | 0 .../polyrenderer/scene/poly_decal.h | 0 .../polyrenderer/scene/poly_light.cpp | 0 .../polyrenderer/scene/poly_light.h | 0 .../polyrenderer/scene/poly_model.cpp | 0 .../polyrenderer/scene/poly_model.h | 0 .../polyrenderer/scene/poly_particle.cpp | 0 .../polyrenderer/scene/poly_particle.h | 0 .../polyrenderer/scene/poly_plane.cpp | 0 .../polyrenderer/scene/poly_plane.h | 0 .../polyrenderer/scene/poly_playersprite.cpp | 0 .../polyrenderer/scene/poly_playersprite.h | 0 .../polyrenderer/scene/poly_portal.cpp | 0 .../polyrenderer/scene/poly_portal.h | 0 .../polyrenderer/scene/poly_scene.cpp | 0 .../polyrenderer/scene/poly_scene.h | 0 .../polyrenderer/scene/poly_sky.cpp | 0 .../polyrenderer/scene/poly_sky.h | 0 .../polyrenderer/scene/poly_sprite.cpp | 0 .../polyrenderer/scene/poly_sprite.h | 0 .../polyrenderer/scene/poly_wall.cpp | 0 .../polyrenderer/scene/poly_wall.h | 0 .../polyrenderer/scene/poly_wallsprite.cpp | 0 .../polyrenderer/scene/poly_wallsprite.h | 0 .../swrenderer/drawers/r_draw.cpp | 0 .../swrenderer/drawers/r_draw.h | 0 .../swrenderer/drawers/r_draw_pal.cpp | 0 .../swrenderer/drawers/r_draw_pal.h | 0 .../swrenderer/drawers/r_draw_rgba.cpp | 0 .../swrenderer/drawers/r_draw_rgba.h | 0 .../swrenderer/drawers/r_draw_sky32.h | 0 .../swrenderer/drawers/r_draw_sky32_sse2.h | 0 .../swrenderer/drawers/r_draw_span32.h | 0 .../swrenderer/drawers/r_draw_span32_sse2.h | 0 .../swrenderer/drawers/r_draw_sprite32.h | 0 .../swrenderer/drawers/r_draw_sprite32_sse2.h | 0 .../swrenderer/drawers/r_draw_wall32.h | 0 .../swrenderer/drawers/r_draw_wall32_sse2.h | 0 .../swrenderer/drawers/r_thread.cpp | 0 .../swrenderer/drawers/r_thread.h | 0 .../swrenderer/line/r_farclip_line.cpp | 0 .../swrenderer/line/r_farclip_line.h | 0 .../swrenderer/line/r_fogboundary.cpp | 0 .../swrenderer/line/r_fogboundary.h | 0 .../swrenderer/line/r_line.cpp | 0 src/{ => rendering}/swrenderer/line/r_line.h | 0 .../swrenderer/line/r_renderdrawsegment.cpp | 0 .../swrenderer/line/r_renderdrawsegment.h | 0 .../swrenderer/line/r_walldraw.cpp | 0 .../swrenderer/line/r_walldraw.h | 0 .../swrenderer/line/r_wallsetup.cpp | 0 .../swrenderer/line/r_wallsetup.h | 0 .../swrenderer/plane/r_flatplane.cpp | 0 .../swrenderer/plane/r_flatplane.h | 0 .../swrenderer/plane/r_planerenderer.cpp | 0 .../swrenderer/plane/r_planerenderer.h | 0 .../swrenderer/plane/r_skyplane.cpp | 0 .../swrenderer/plane/r_skyplane.h | 0 .../swrenderer/plane/r_slopeplane.cpp | 0 .../swrenderer/plane/r_slopeplane.h | 0 .../swrenderer/plane/r_visibleplane.cpp | 0 .../swrenderer/plane/r_visibleplane.h | 0 .../swrenderer/plane/r_visibleplanelist.cpp | 0 .../swrenderer/plane/r_visibleplanelist.h | 0 src/{ => rendering}/swrenderer/r_all.cpp | 0 src/{ => rendering}/swrenderer/r_memory.cpp | 0 src/{ => rendering}/swrenderer/r_memory.h | 0 .../swrenderer/r_renderthread.cpp | 0 .../swrenderer/r_renderthread.h | 0 .../swrenderer/r_swcolormaps.cpp | 0 .../swrenderer/r_swcolormaps.h | 0 .../swrenderer/r_swrenderer.cpp | 0 src/{ => rendering}/swrenderer/r_swrenderer.h | 0 src/{ => rendering}/swrenderer/r_swscene.cpp | 0 src/{ => rendering}/swrenderer/r_swscene.h | 0 .../swrenderer/scene/r_3dfloors.cpp | 0 .../swrenderer/scene/r_3dfloors.h | 0 .../swrenderer/scene/r_light.cpp | 0 .../swrenderer/scene/r_light.h | 0 .../swrenderer/scene/r_opaque_pass.cpp | 0 .../swrenderer/scene/r_opaque_pass.h | 0 .../swrenderer/scene/r_portal.cpp | 0 .../swrenderer/scene/r_portal.h | 0 .../swrenderer/scene/r_scene.cpp | 0 .../swrenderer/scene/r_scene.h | 0 .../swrenderer/scene/r_translucent_pass.cpp | 0 .../swrenderer/scene/r_translucent_pass.h | 0 .../swrenderer/segments/r_clipsegment.cpp | 0 .../swrenderer/segments/r_clipsegment.h | 0 .../swrenderer/segments/r_drawsegment.cpp | 0 .../swrenderer/segments/r_drawsegment.h | 0 .../swrenderer/segments/r_portalsegment.cpp | 0 .../swrenderer/segments/r_portalsegment.h | 0 .../swrenderer/textures/r_swtexture.cpp | 0 .../swrenderer/textures/r_swtexture.h | 0 .../swrenderer/textures/swcanvastexture.cpp | 0 .../swrenderer/textures/warpbuffer.h | 0 .../swrenderer/textures/warptexture.cpp | 0 .../swrenderer/things/r_decal.cpp | 0 .../swrenderer/things/r_decal.h | 0 .../swrenderer/things/r_model.cpp | 0 .../swrenderer/things/r_model.h | 0 .../swrenderer/things/r_particle.cpp | 0 .../swrenderer/things/r_particle.h | 0 .../swrenderer/things/r_playersprite.cpp | 0 .../swrenderer/things/r_playersprite.h | 0 .../swrenderer/things/r_sprite.cpp | 0 .../swrenderer/things/r_sprite.h | 0 .../swrenderer/things/r_visiblesprite.cpp | 0 .../swrenderer/things/r_visiblesprite.h | 0 .../swrenderer/things/r_visiblespritelist.cpp | 0 .../swrenderer/things/r_visiblespritelist.h | 0 .../swrenderer/things/r_voxel.cpp | 0 .../swrenderer/things/r_voxel.h | 0 .../swrenderer/things/r_wallsprite.cpp | 0 .../swrenderer/things/r_wallsprite.h | 0 .../swrenderer/viewport/r_drawerargs.cpp | 0 .../swrenderer/viewport/r_drawerargs.h | 0 .../swrenderer/viewport/r_skydrawer.cpp | 0 .../swrenderer/viewport/r_skydrawer.h | 0 .../swrenderer/viewport/r_spandrawer.cpp | 0 .../swrenderer/viewport/r_spandrawer.h | 0 .../swrenderer/viewport/r_spritedrawer.cpp | 0 .../swrenderer/viewport/r_spritedrawer.h | 0 .../swrenderer/viewport/r_viewport.cpp | 0 .../swrenderer/viewport/r_viewport.h | 0 .../swrenderer/viewport/r_walldrawer.cpp | 0 .../swrenderer/viewport/r_walldrawer.h | 0 256 files changed, 193 insertions(+), 191 deletions(-) rename src/{ => rendering}/gl/renderer/gl_postprocess.cpp (100%) rename src/{ => rendering}/gl/renderer/gl_postprocessstate.cpp (100%) rename src/{ => rendering}/gl/renderer/gl_postprocessstate.h (100%) rename src/{ => rendering}/gl/renderer/gl_renderbuffers.cpp (100%) rename src/{ => rendering}/gl/renderer/gl_renderbuffers.h (100%) rename src/{ => rendering}/gl/renderer/gl_renderer.cpp (100%) rename src/{ => rendering}/gl/renderer/gl_renderer.h (100%) rename src/{ => rendering}/gl/renderer/gl_renderstate.cpp (100%) rename src/{ => rendering}/gl/renderer/gl_renderstate.h (100%) rename src/{ => rendering}/gl/renderer/gl_scene.cpp (100%) rename src/{ => rendering}/gl/renderer/gl_stereo3d.cpp (100%) rename src/{ => rendering}/gl/shaders/gl_postprocessshader.cpp (100%) rename src/{ => rendering}/gl/shaders/gl_postprocessshaderinstance.h (100%) rename src/{ => rendering}/gl/shaders/gl_shader.cpp (100%) rename src/{ => rendering}/gl/shaders/gl_shader.h (100%) rename src/{ => rendering}/gl/shaders/gl_shaderprogram.cpp (100%) rename src/{ => rendering}/gl/shaders/gl_shaderprogram.h (100%) rename src/{ => rendering}/gl/system/gl_buffers.cpp (100%) rename src/{ => rendering}/gl/system/gl_buffers.h (100%) rename src/{ => rendering}/gl/system/gl_debug.cpp (100%) rename src/{ => rendering}/gl/system/gl_debug.h (100%) rename src/{ => rendering}/gl/system/gl_framebuffer.cpp (100%) rename src/{ => rendering}/gl/system/gl_framebuffer.h (100%) rename src/{ => rendering}/gl/textures/gl_hwtexture.cpp (100%) rename src/{ => rendering}/gl/textures/gl_hwtexture.h (100%) rename src/{ => rendering}/gl/textures/gl_samplers.cpp (100%) rename src/{ => rendering}/gl/textures/gl_samplers.h (100%) rename src/{ => rendering}/gl_load/gl_extlist.txt (100%) rename src/{ => rendering}/gl_load/gl_interface.cpp (100%) rename src/{ => rendering}/gl_load/gl_interface.h (100%) rename src/{ => rendering}/gl_load/gl_load.c (100%) rename src/{ => rendering}/gl_load/gl_load.h (100%) rename src/{ => rendering}/gl_load/gl_system.h (100%) rename src/{ => rendering}/hwrenderer/data/buffers.h (100%) rename src/{ => rendering}/hwrenderer/data/flatvertices.cpp (100%) rename src/{ => rendering}/hwrenderer/data/flatvertices.h (100%) rename src/{ => rendering}/hwrenderer/data/hw_vertexbuilder.cpp (100%) rename src/{ => rendering}/hwrenderer/data/hw_vertexbuilder.h (100%) rename src/{ => rendering}/hwrenderer/data/hw_viewpointbuffer.cpp (100%) rename src/{ => rendering}/hwrenderer/data/hw_viewpointbuffer.h (100%) rename src/{ => rendering}/hwrenderer/data/renderqueue.h (100%) rename src/{ => rendering}/hwrenderer/data/shaderuniforms.h (100%) rename src/{ => rendering}/hwrenderer/dynlights/hw_aabbtree.cpp (100%) rename src/{ => rendering}/hwrenderer/dynlights/hw_aabbtree.h (100%) rename src/{ => rendering}/hwrenderer/dynlights/hw_dynlightdata.cpp (100%) rename src/{ => rendering}/hwrenderer/dynlights/hw_dynlightdata.h (100%) rename src/{ => rendering}/hwrenderer/dynlights/hw_lightbuffer.cpp (100%) rename src/{ => rendering}/hwrenderer/dynlights/hw_lightbuffer.h (100%) rename src/{ => rendering}/hwrenderer/dynlights/hw_shadowmap.cpp (100%) rename src/{ => rendering}/hwrenderer/dynlights/hw_shadowmap.h (100%) rename src/{ => rendering}/hwrenderer/models/hw_models.cpp (100%) rename src/{ => rendering}/hwrenderer/models/hw_models.h (100%) rename src/{ => rendering}/hwrenderer/postprocessing/hw_postprocess.cpp (100%) rename src/{ => rendering}/hwrenderer/postprocessing/hw_postprocess.h (100%) rename src/{ => rendering}/hwrenderer/postprocessing/hw_postprocess_cvars.cpp (100%) rename src/{ => rendering}/hwrenderer/postprocessing/hw_postprocess_cvars.h (100%) rename src/{ => rendering}/hwrenderer/postprocessing/hw_postprocessshader.cpp (100%) rename src/{ => rendering}/hwrenderer/postprocessing/hw_postprocessshader.h (100%) rename src/{ => rendering}/hwrenderer/postprocessing/hw_present3dRowshader.cpp (100%) rename src/{ => rendering}/hwrenderer/postprocessing/hw_present3dRowshader.h (100%) rename src/{ => rendering}/hwrenderer/postprocessing/hw_presentshader.cpp (100%) rename src/{ => rendering}/hwrenderer/postprocessing/hw_presentshader.h (100%) rename src/{ => rendering}/hwrenderer/postprocessing/hw_shaderprogram.h (100%) rename src/{ => rendering}/hwrenderer/postprocessing/hw_shadowmapshader.cpp (100%) rename src/{ => rendering}/hwrenderer/postprocessing/hw_shadowmapshader.h (100%) rename src/{ => rendering}/hwrenderer/scene/hw_bsp.cpp (100%) rename src/{ => rendering}/hwrenderer/scene/hw_clipper.cpp (100%) rename src/{ => rendering}/hwrenderer/scene/hw_clipper.h (100%) rename src/{ => rendering}/hwrenderer/scene/hw_decal.cpp (100%) rename src/{ => rendering}/hwrenderer/scene/hw_drawinfo.cpp (100%) rename src/{ => rendering}/hwrenderer/scene/hw_drawinfo.h (100%) rename src/{ => rendering}/hwrenderer/scene/hw_drawlist.cpp (100%) rename src/{ => rendering}/hwrenderer/scene/hw_drawlist.h (100%) rename src/{ => rendering}/hwrenderer/scene/hw_drawlistadd.cpp (100%) rename src/{ => rendering}/hwrenderer/scene/hw_drawstructs.h (100%) rename src/{ => rendering}/hwrenderer/scene/hw_fakeflat.cpp (100%) rename src/{ => rendering}/hwrenderer/scene/hw_fakeflat.h (100%) rename src/{ => rendering}/hwrenderer/scene/hw_flats.cpp (100%) rename src/{ => rendering}/hwrenderer/scene/hw_portal.cpp (100%) rename src/{ => rendering}/hwrenderer/scene/hw_portal.h (100%) rename src/{ => rendering}/hwrenderer/scene/hw_renderhacks.cpp (100%) rename src/{ => rendering}/hwrenderer/scene/hw_renderstate.cpp (100%) rename src/{ => rendering}/hwrenderer/scene/hw_renderstate.h (100%) rename src/{ => rendering}/hwrenderer/scene/hw_sky.cpp (100%) rename src/{ => rendering}/hwrenderer/scene/hw_skydome.cpp (100%) rename src/{ => rendering}/hwrenderer/scene/hw_skydome.h (100%) rename src/{ => rendering}/hwrenderer/scene/hw_skyportal.cpp (100%) rename src/{ => rendering}/hwrenderer/scene/hw_spritelight.cpp (100%) rename src/{ => rendering}/hwrenderer/scene/hw_sprites.cpp (100%) rename src/{ => rendering}/hwrenderer/scene/hw_viewpointuniforms.h (100%) rename src/{ => rendering}/hwrenderer/scene/hw_walls.cpp (100%) rename src/{ => rendering}/hwrenderer/scene/hw_walls_vertex.cpp (100%) rename src/{ => rendering}/hwrenderer/scene/hw_weapon.cpp (100%) rename src/{ => rendering}/hwrenderer/scene/hw_weapon.h (100%) rename src/{ => rendering}/hwrenderer/textures/hw_ihwtexture.h (100%) rename src/{ => rendering}/hwrenderer/textures/hw_material.cpp (100%) rename src/{ => rendering}/hwrenderer/textures/hw_material.h (100%) rename src/{ => rendering}/hwrenderer/textures/hw_precache.cpp (100%) rename src/{ => rendering}/hwrenderer/textures/hw_texcontainer.h (100%) rename src/{ => rendering}/hwrenderer/utility/hw_clock.cpp (100%) rename src/{ => rendering}/hwrenderer/utility/hw_clock.h (100%) rename src/{ => rendering}/hwrenderer/utility/hw_cvars.cpp (100%) rename src/{ => rendering}/hwrenderer/utility/hw_cvars.h (100%) rename src/{ => rendering}/hwrenderer/utility/hw_draw2d.cpp (100%) rename src/{ => rendering}/hwrenderer/utility/hw_lighting.cpp (100%) rename src/{ => rendering}/hwrenderer/utility/hw_lighting.h (100%) rename src/{ => rendering}/hwrenderer/utility/hw_shaderpatcher.cpp (100%) rename src/{ => rendering}/hwrenderer/utility/hw_shaderpatcher.h (100%) rename src/{ => rendering}/hwrenderer/utility/hw_vrmodes.cpp (100%) rename src/{ => rendering}/hwrenderer/utility/hw_vrmodes.h (100%) rename src/{ => rendering}/polyrenderer/drawers/poly_buffer.cpp (100%) rename src/{ => rendering}/polyrenderer/drawers/poly_buffer.h (100%) rename src/{ => rendering}/polyrenderer/drawers/poly_draw_args.cpp (100%) rename src/{ => rendering}/polyrenderer/drawers/poly_draw_args.h (100%) rename src/{ => rendering}/polyrenderer/drawers/poly_triangle.cpp (100%) rename src/{ => rendering}/polyrenderer/drawers/poly_triangle.h (100%) rename src/{ => rendering}/polyrenderer/drawers/screen_triangle.cpp (100%) rename src/{ => rendering}/polyrenderer/drawers/screen_triangle.h (100%) rename src/{ => rendering}/polyrenderer/math/gpu_types.cpp (100%) rename src/{ => rendering}/polyrenderer/math/gpu_types.h (100%) rename src/{ => rendering}/polyrenderer/poly_all.cpp (100%) rename src/{ => rendering}/polyrenderer/poly_renderer.cpp (100%) rename src/{ => rendering}/polyrenderer/poly_renderer.h (100%) rename src/{ => rendering}/polyrenderer/poly_renderthread.cpp (100%) rename src/{ => rendering}/polyrenderer/poly_renderthread.h (100%) rename src/{ => rendering}/polyrenderer/scene/poly_cull.cpp (100%) rename src/{ => rendering}/polyrenderer/scene/poly_cull.h (100%) rename src/{ => rendering}/polyrenderer/scene/poly_decal.cpp (100%) rename src/{ => rendering}/polyrenderer/scene/poly_decal.h (100%) rename src/{ => rendering}/polyrenderer/scene/poly_light.cpp (100%) rename src/{ => rendering}/polyrenderer/scene/poly_light.h (100%) rename src/{ => rendering}/polyrenderer/scene/poly_model.cpp (100%) rename src/{ => rendering}/polyrenderer/scene/poly_model.h (100%) rename src/{ => rendering}/polyrenderer/scene/poly_particle.cpp (100%) rename src/{ => rendering}/polyrenderer/scene/poly_particle.h (100%) rename src/{ => rendering}/polyrenderer/scene/poly_plane.cpp (100%) rename src/{ => rendering}/polyrenderer/scene/poly_plane.h (100%) rename src/{ => rendering}/polyrenderer/scene/poly_playersprite.cpp (100%) rename src/{ => rendering}/polyrenderer/scene/poly_playersprite.h (100%) rename src/{ => rendering}/polyrenderer/scene/poly_portal.cpp (100%) rename src/{ => rendering}/polyrenderer/scene/poly_portal.h (100%) rename src/{ => rendering}/polyrenderer/scene/poly_scene.cpp (100%) rename src/{ => rendering}/polyrenderer/scene/poly_scene.h (100%) rename src/{ => rendering}/polyrenderer/scene/poly_sky.cpp (100%) rename src/{ => rendering}/polyrenderer/scene/poly_sky.h (100%) rename src/{ => rendering}/polyrenderer/scene/poly_sprite.cpp (100%) rename src/{ => rendering}/polyrenderer/scene/poly_sprite.h (100%) rename src/{ => rendering}/polyrenderer/scene/poly_wall.cpp (100%) rename src/{ => rendering}/polyrenderer/scene/poly_wall.h (100%) rename src/{ => rendering}/polyrenderer/scene/poly_wallsprite.cpp (100%) rename src/{ => rendering}/polyrenderer/scene/poly_wallsprite.h (100%) rename src/{ => rendering}/swrenderer/drawers/r_draw.cpp (100%) rename src/{ => rendering}/swrenderer/drawers/r_draw.h (100%) rename src/{ => rendering}/swrenderer/drawers/r_draw_pal.cpp (100%) rename src/{ => rendering}/swrenderer/drawers/r_draw_pal.h (100%) rename src/{ => rendering}/swrenderer/drawers/r_draw_rgba.cpp (100%) rename src/{ => rendering}/swrenderer/drawers/r_draw_rgba.h (100%) rename src/{ => rendering}/swrenderer/drawers/r_draw_sky32.h (100%) rename src/{ => rendering}/swrenderer/drawers/r_draw_sky32_sse2.h (100%) rename src/{ => rendering}/swrenderer/drawers/r_draw_span32.h (100%) rename src/{ => rendering}/swrenderer/drawers/r_draw_span32_sse2.h (100%) rename src/{ => rendering}/swrenderer/drawers/r_draw_sprite32.h (100%) rename src/{ => rendering}/swrenderer/drawers/r_draw_sprite32_sse2.h (100%) rename src/{ => rendering}/swrenderer/drawers/r_draw_wall32.h (100%) rename src/{ => rendering}/swrenderer/drawers/r_draw_wall32_sse2.h (100%) rename src/{ => rendering}/swrenderer/drawers/r_thread.cpp (100%) rename src/{ => rendering}/swrenderer/drawers/r_thread.h (100%) rename src/{ => rendering}/swrenderer/line/r_farclip_line.cpp (100%) rename src/{ => rendering}/swrenderer/line/r_farclip_line.h (100%) rename src/{ => rendering}/swrenderer/line/r_fogboundary.cpp (100%) rename src/{ => rendering}/swrenderer/line/r_fogboundary.h (100%) rename src/{ => rendering}/swrenderer/line/r_line.cpp (100%) rename src/{ => rendering}/swrenderer/line/r_line.h (100%) rename src/{ => rendering}/swrenderer/line/r_renderdrawsegment.cpp (100%) rename src/{ => rendering}/swrenderer/line/r_renderdrawsegment.h (100%) rename src/{ => rendering}/swrenderer/line/r_walldraw.cpp (100%) rename src/{ => rendering}/swrenderer/line/r_walldraw.h (100%) rename src/{ => rendering}/swrenderer/line/r_wallsetup.cpp (100%) rename src/{ => rendering}/swrenderer/line/r_wallsetup.h (100%) rename src/{ => rendering}/swrenderer/plane/r_flatplane.cpp (100%) rename src/{ => rendering}/swrenderer/plane/r_flatplane.h (100%) rename src/{ => rendering}/swrenderer/plane/r_planerenderer.cpp (100%) rename src/{ => rendering}/swrenderer/plane/r_planerenderer.h (100%) rename src/{ => rendering}/swrenderer/plane/r_skyplane.cpp (100%) rename src/{ => rendering}/swrenderer/plane/r_skyplane.h (100%) rename src/{ => rendering}/swrenderer/plane/r_slopeplane.cpp (100%) rename src/{ => rendering}/swrenderer/plane/r_slopeplane.h (100%) rename src/{ => rendering}/swrenderer/plane/r_visibleplane.cpp (100%) rename src/{ => rendering}/swrenderer/plane/r_visibleplane.h (100%) rename src/{ => rendering}/swrenderer/plane/r_visibleplanelist.cpp (100%) rename src/{ => rendering}/swrenderer/plane/r_visibleplanelist.h (100%) rename src/{ => rendering}/swrenderer/r_all.cpp (100%) rename src/{ => rendering}/swrenderer/r_memory.cpp (100%) rename src/{ => rendering}/swrenderer/r_memory.h (100%) rename src/{ => rendering}/swrenderer/r_renderthread.cpp (100%) rename src/{ => rendering}/swrenderer/r_renderthread.h (100%) rename src/{ => rendering}/swrenderer/r_swcolormaps.cpp (100%) rename src/{ => rendering}/swrenderer/r_swcolormaps.h (100%) rename src/{ => rendering}/swrenderer/r_swrenderer.cpp (100%) rename src/{ => rendering}/swrenderer/r_swrenderer.h (100%) rename src/{ => rendering}/swrenderer/r_swscene.cpp (100%) rename src/{ => rendering}/swrenderer/r_swscene.h (100%) rename src/{ => rendering}/swrenderer/scene/r_3dfloors.cpp (100%) rename src/{ => rendering}/swrenderer/scene/r_3dfloors.h (100%) rename src/{ => rendering}/swrenderer/scene/r_light.cpp (100%) rename src/{ => rendering}/swrenderer/scene/r_light.h (100%) rename src/{ => rendering}/swrenderer/scene/r_opaque_pass.cpp (100%) rename src/{ => rendering}/swrenderer/scene/r_opaque_pass.h (100%) rename src/{ => rendering}/swrenderer/scene/r_portal.cpp (100%) rename src/{ => rendering}/swrenderer/scene/r_portal.h (100%) rename src/{ => rendering}/swrenderer/scene/r_scene.cpp (100%) rename src/{ => rendering}/swrenderer/scene/r_scene.h (100%) rename src/{ => rendering}/swrenderer/scene/r_translucent_pass.cpp (100%) rename src/{ => rendering}/swrenderer/scene/r_translucent_pass.h (100%) rename src/{ => rendering}/swrenderer/segments/r_clipsegment.cpp (100%) rename src/{ => rendering}/swrenderer/segments/r_clipsegment.h (100%) rename src/{ => rendering}/swrenderer/segments/r_drawsegment.cpp (100%) rename src/{ => rendering}/swrenderer/segments/r_drawsegment.h (100%) rename src/{ => rendering}/swrenderer/segments/r_portalsegment.cpp (100%) rename src/{ => rendering}/swrenderer/segments/r_portalsegment.h (100%) rename src/{ => rendering}/swrenderer/textures/r_swtexture.cpp (100%) rename src/{ => rendering}/swrenderer/textures/r_swtexture.h (100%) rename src/{ => rendering}/swrenderer/textures/swcanvastexture.cpp (100%) rename src/{ => rendering}/swrenderer/textures/warpbuffer.h (100%) rename src/{ => rendering}/swrenderer/textures/warptexture.cpp (100%) rename src/{ => rendering}/swrenderer/things/r_decal.cpp (100%) rename src/{ => rendering}/swrenderer/things/r_decal.h (100%) rename src/{ => rendering}/swrenderer/things/r_model.cpp (100%) rename src/{ => rendering}/swrenderer/things/r_model.h (100%) rename src/{ => rendering}/swrenderer/things/r_particle.cpp (100%) rename src/{ => rendering}/swrenderer/things/r_particle.h (100%) rename src/{ => rendering}/swrenderer/things/r_playersprite.cpp (100%) rename src/{ => rendering}/swrenderer/things/r_playersprite.h (100%) rename src/{ => rendering}/swrenderer/things/r_sprite.cpp (100%) rename src/{ => rendering}/swrenderer/things/r_sprite.h (100%) rename src/{ => rendering}/swrenderer/things/r_visiblesprite.cpp (100%) rename src/{ => rendering}/swrenderer/things/r_visiblesprite.h (100%) rename src/{ => rendering}/swrenderer/things/r_visiblespritelist.cpp (100%) rename src/{ => rendering}/swrenderer/things/r_visiblespritelist.h (100%) rename src/{ => rendering}/swrenderer/things/r_voxel.cpp (100%) rename src/{ => rendering}/swrenderer/things/r_voxel.h (100%) rename src/{ => rendering}/swrenderer/things/r_wallsprite.cpp (100%) rename src/{ => rendering}/swrenderer/things/r_wallsprite.h (100%) rename src/{ => rendering}/swrenderer/viewport/r_drawerargs.cpp (100%) rename src/{ => rendering}/swrenderer/viewport/r_drawerargs.h (100%) rename src/{ => rendering}/swrenderer/viewport/r_skydrawer.cpp (100%) rename src/{ => rendering}/swrenderer/viewport/r_skydrawer.h (100%) rename src/{ => rendering}/swrenderer/viewport/r_spandrawer.cpp (100%) rename src/{ => rendering}/swrenderer/viewport/r_spandrawer.h (100%) rename src/{ => rendering}/swrenderer/viewport/r_spritedrawer.cpp (100%) rename src/{ => rendering}/swrenderer/viewport/r_spritedrawer.h (100%) rename src/{ => rendering}/swrenderer/viewport/r_viewport.cpp (100%) rename src/{ => rendering}/swrenderer/viewport/r_viewport.h (100%) rename src/{ => rendering}/swrenderer/viewport/r_walldrawer.cpp (100%) rename src/{ => rendering}/swrenderer/viewport/r_walldrawer.h (100%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6c0929319..1f6b54a5a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -682,105 +682,105 @@ file( GLOB HEADER_FILES sound/timiditypp/*.h sound/wildmidi/*.h xlat/*.h - swrenderer/*.h - swrenderer/textures/*.h - swrenderer/drawers/*.h - swrenderer/scene/*.h - swrenderer/segments/*.h - swrenderer/line/*.h - swrenderer/plane/*.h - swrenderer/things/*.h - swrenderer/viewport/*.h - polyrenderer/*.h - polyrenderer/math/*.h - polyrenderer/drawers/*.h - polyrenderer/scene/*.h - hwrenderer/data/*.h - hwrenderer/dynlights/*.h - hwrenderer/models/*.h - hwrenderer/postprocessing/*.h - hwrenderer/scene/*.h - hwrenderer/textures/*.h - hwrenderer/utility/*.h - gl/*.h - gl/models/*.h - gl/renderer/*.h - gl/scene/*.h - gl/shaders/*.h - gl/system/*.h - gl/textures/*.h - gl_load/*.h + rendering/swrenderer/*.h + rendering/swrenderer/textures/*.h + rendering/swrenderer/drawers/*.h + rendering/swrenderer/scene/*.h + rendering/swrenderer/segments/*.h + rendering/swrenderer/line/*.h + rendering/swrenderer/plane/*.h + rendering/swrenderer/things/*.h + rendering/swrenderer/viewport/*.h + rendering/polyrenderer/*.h + rendering/polyrenderer/math/*.h + rendering/polyrenderer/drawers/*.h + rendering/polyrenderer/scene/*.h + rendering/hwrenderer/data/*.h + rendering/hwrenderer/dynlights/*.h + rendering/hwrenderer/models/*.h + rendering/hwrenderer/postprocessing/*.h + rendering/hwrenderer/scene/*.h + rendering/hwrenderer/textures/*.h + rendering/hwrenderer/utility/*.h + rendering/gl/*.h + rendering/gl/models/*.h + rendering/gl/renderer/*.h + rendering/gl/scene/*.h + rendering/gl/shaders/*.h + rendering/gl/system/*.h + rendering/gl/textures/*.h + rendering/gl_load/*.h *.h ) set ( SWRENDER_SOURCES - swrenderer/r_swcolormaps.cpp - swrenderer/r_swrenderer.cpp - swrenderer/r_memory.cpp - swrenderer/r_renderthread.cpp - swrenderer/drawers/r_draw.cpp - swrenderer/drawers/r_draw_pal.cpp - swrenderer/drawers/r_draw_rgba.cpp - swrenderer/drawers/r_thread.cpp - swrenderer/scene/r_3dfloors.cpp - swrenderer/scene/r_light.cpp - swrenderer/scene/r_opaque_pass.cpp - swrenderer/scene/r_portal.cpp - swrenderer/scene/r_scene.cpp - swrenderer/scene/r_translucent_pass.cpp - swrenderer/viewport/r_drawerargs.cpp - swrenderer/viewport/r_skydrawer.cpp - swrenderer/viewport/r_spandrawer.cpp - swrenderer/viewport/r_spritedrawer.cpp - swrenderer/viewport/r_viewport.cpp - swrenderer/viewport/r_walldrawer.cpp - swrenderer/line/r_line.cpp - swrenderer/line/r_farclip_line.cpp - swrenderer/line/r_walldraw.cpp - swrenderer/line/r_wallsetup.cpp - swrenderer/line/r_fogboundary.cpp - swrenderer/line/r_renderdrawsegment.cpp - swrenderer/segments/r_clipsegment.cpp - swrenderer/segments/r_drawsegment.cpp - swrenderer/segments/r_portalsegment.cpp - swrenderer/things/r_visiblesprite.cpp - swrenderer/things/r_visiblespritelist.cpp - swrenderer/things/r_voxel.cpp - swrenderer/things/r_particle.cpp - swrenderer/things/r_playersprite.cpp - swrenderer/things/r_sprite.cpp - swrenderer/things/r_wallsprite.cpp - swrenderer/things/r_decal.cpp - swrenderer/things/r_model.cpp - swrenderer/plane/r_visibleplane.cpp - swrenderer/plane/r_visibleplanelist.cpp - swrenderer/plane/r_skyplane.cpp - swrenderer/plane/r_planerenderer.cpp - swrenderer/plane/r_flatplane.cpp - swrenderer/plane/r_slopeplane.cpp + rendering/swrenderer/r_swcolormaps.cpp + rendering/swrenderer/r_swrenderer.cpp + rendering/swrenderer/r_memory.cpp + rendering/swrenderer/r_renderthread.cpp + rendering/swrenderer/drawers/r_draw.cpp + rendering/swrenderer/drawers/r_draw_pal.cpp + rendering/swrenderer/drawers/r_draw_rgba.cpp + rendering/swrenderer/drawers/r_thread.cpp + rendering/swrenderer/scene/r_3dfloors.cpp + rendering/swrenderer/scene/r_light.cpp + rendering/swrenderer/scene/r_opaque_pass.cpp + rendering/swrenderer/scene/r_portal.cpp + rendering/swrenderer/scene/r_scene.cpp + rendering/swrenderer/scene/r_translucent_pass.cpp + rendering/swrenderer/viewport/r_drawerargs.cpp + rendering/swrenderer/viewport/r_skydrawer.cpp + rendering/swrenderer/viewport/r_spandrawer.cpp + rendering/swrenderer/viewport/r_spritedrawer.cpp + rendering/swrenderer/viewport/r_viewport.cpp + rendering/swrenderer/viewport/r_walldrawer.cpp + rendering/swrenderer/line/r_line.cpp + rendering/swrenderer/line/r_farclip_line.cpp + rendering/swrenderer/line/r_walldraw.cpp + rendering/swrenderer/line/r_wallsetup.cpp + rendering/swrenderer/line/r_fogboundary.cpp + rendering/swrenderer/line/r_renderdrawsegment.cpp + rendering/swrenderer/segments/r_clipsegment.cpp + rendering/swrenderer/segments/r_drawsegment.cpp + rendering/swrenderer/segments/r_portalsegment.cpp + rendering/swrenderer/things/r_visiblesprite.cpp + rendering/swrenderer/things/r_visiblespritelist.cpp + rendering/swrenderer/things/r_voxel.cpp + rendering/swrenderer/things/r_particle.cpp + rendering/swrenderer/things/r_playersprite.cpp + rendering/swrenderer/things/r_sprite.cpp + rendering/swrenderer/things/r_wallsprite.cpp + rendering/swrenderer/things/r_decal.cpp + rendering/swrenderer/things/r_model.cpp + rendering/swrenderer/plane/r_visibleplane.cpp + rendering/swrenderer/plane/r_visibleplanelist.cpp + rendering/swrenderer/plane/r_skyplane.cpp + rendering/swrenderer/plane/r_planerenderer.cpp + rendering/swrenderer/plane/r_flatplane.cpp + rendering/swrenderer/plane/r_slopeplane.cpp ) set( POLYRENDER_SOURCES - polyrenderer/poly_renderer.cpp - polyrenderer/poly_renderthread.cpp - polyrenderer/scene/poly_scene.cpp - polyrenderer/scene/poly_portal.cpp - polyrenderer/scene/poly_cull.cpp - polyrenderer/scene/poly_decal.cpp - polyrenderer/scene/poly_particle.cpp - polyrenderer/scene/poly_plane.cpp - polyrenderer/scene/poly_playersprite.cpp - polyrenderer/scene/poly_wall.cpp - polyrenderer/scene/poly_wallsprite.cpp - polyrenderer/scene/poly_sprite.cpp - polyrenderer/scene/poly_model.cpp - polyrenderer/scene/poly_sky.cpp - polyrenderer/scene/poly_light.cpp - polyrenderer/drawers/poly_buffer.cpp - polyrenderer/drawers/poly_triangle.cpp - polyrenderer/drawers/poly_draw_args.cpp - polyrenderer/drawers/screen_triangle.cpp - polyrenderer/math/gpu_types.cpp + rendering/polyrenderer/poly_renderer.cpp + rendering/polyrenderer/poly_renderthread.cpp + rendering/polyrenderer/scene/poly_scene.cpp + rendering/polyrenderer/scene/poly_portal.cpp + rendering/polyrenderer/scene/poly_cull.cpp + rendering/polyrenderer/scene/poly_decal.cpp + rendering/polyrenderer/scene/poly_particle.cpp + rendering/polyrenderer/scene/poly_plane.cpp + rendering/polyrenderer/scene/poly_playersprite.cpp + rendering/polyrenderer/scene/poly_wall.cpp + rendering/polyrenderer/scene/poly_wallsprite.cpp + rendering/polyrenderer/scene/poly_sprite.cpp + rendering/polyrenderer/scene/poly_model.cpp + rendering/polyrenderer/scene/poly_sky.cpp + rendering/polyrenderer/scene/poly_light.cpp + rendering/polyrenderer/drawers/poly_buffer.cpp + rendering/polyrenderer/drawers/poly_triangle.cpp + rendering/polyrenderer/drawers/poly_draw_args.cpp + rendering/polyrenderer/drawers/screen_triangle.cpp + rendering/polyrenderer/math/gpu_types.cpp ) # These files will be flagged as "headers" so that they appear in project files @@ -806,9 +806,9 @@ set( NOT_COMPILED_SOURCE_FILES # Enable fast math for some sources set( FASTMATH_SOURCES - swrenderer/r_all.cpp - swrenderer/r_swscene.cpp - polyrenderer/poly_all.cpp + rendering/swrenderer/r_all.cpp + rendering/swrenderer/r_swscene.cpp + rendering/polyrenderer/poly_all.cpp sound/oplsynth/opl_mus_player.cpp sound/mpg123_decoder.cpp sound/music_midi_base.cpp @@ -822,26 +822,26 @@ set( FASTMATH_SOURCES textures/hires/hqnx/hq4x.cpp textures/hires/xbr/xbrz.cpp textures/hires/xbr/xbrz_old.cpp - gl_load/gl_load.c - hwrenderer/postprocessing/hw_postprocess_cvars.cpp - hwrenderer/postprocessing/hw_postprocessshader.cpp - hwrenderer/dynlights/hw_dynlightdata.cpp - hwrenderer/scene/hw_bsp.cpp - hwrenderer/scene/hw_fakeflat.cpp - hwrenderer/scene/hw_decal.cpp - hwrenderer/scene/hw_drawinfo.cpp - hwrenderer/scene/hw_drawlist.cpp - hwrenderer/scene/hw_clipper.cpp - hwrenderer/scene/hw_flats.cpp - hwrenderer/scene/hw_portal.cpp - hwrenderer/scene/hw_renderhacks.cpp - hwrenderer/scene/hw_sky.cpp - hwrenderer/scene/hw_skyportal.cpp - hwrenderer/scene/hw_sprites.cpp - hwrenderer/scene/hw_spritelight.cpp - hwrenderer/scene/hw_walls.cpp - hwrenderer/scene/hw_walls_vertex.cpp - hwrenderer/scene/hw_weapon.cpp + rendering/gl_load/gl_load.c + rendering/hwrenderer/postprocessing/hw_postprocess_cvars.cpp + rendering/hwrenderer/postprocessing/hw_postprocessshader.cpp + rendering/hwrenderer/dynlights/hw_dynlightdata.cpp + rendering/hwrenderer/scene/hw_bsp.cpp + rendering/hwrenderer/scene/hw_fakeflat.cpp + rendering/hwrenderer/scene/hw_decal.cpp + rendering/hwrenderer/scene/hw_drawinfo.cpp + rendering/hwrenderer/scene/hw_drawlist.cpp + rendering/hwrenderer/scene/hw_clipper.cpp + rendering/hwrenderer/scene/hw_flats.cpp + rendering/hwrenderer/scene/hw_portal.cpp + rendering/hwrenderer/scene/hw_renderhacks.cpp + rendering/hwrenderer/scene/hw_sky.cpp + rendering/hwrenderer/scene/hw_skyportal.cpp + rendering/hwrenderer/scene/hw_sprites.cpp + rendering/hwrenderer/scene/hw_spritelight.cpp + rendering/hwrenderer/scene/hw_walls.cpp + rendering/hwrenderer/scene/hw_walls_vertex.cpp + rendering/hwrenderer/scene/hw_weapon.cpp r_data/models/models.cpp r_data/matrix.cpp sound/adlmidi/adldata.cpp @@ -1036,46 +1036,46 @@ set (PCH_SOURCES g_statusbar/sbarinfo.cpp g_statusbar/sbar_mugshot.cpp g_statusbar/shared_sbar.cpp - gl/renderer/gl_renderer.cpp - gl/renderer/gl_renderstate.cpp - gl/renderer/gl_renderbuffers.cpp - gl/renderer/gl_postprocess.cpp - gl/renderer/gl_postprocessstate.cpp - gl/renderer/gl_stereo3d.cpp - gl/renderer/gl_scene.cpp - gl/shaders/gl_shader.cpp - gl/shaders/gl_shaderprogram.cpp - gl/shaders/gl_postprocessshader.cpp - gl_load/gl_interface.cpp - gl/system/gl_framebuffer.cpp - gl/system/gl_debug.cpp - gl/system/gl_buffers.cpp - gl/textures/gl_hwtexture.cpp - gl/textures/gl_samplers.cpp - hwrenderer/data/hw_vertexbuilder.cpp - hwrenderer/data/flatvertices.cpp - hwrenderer/data/hw_viewpointbuffer.cpp - hwrenderer/dynlights/hw_aabbtree.cpp - hwrenderer/dynlights/hw_shadowmap.cpp - hwrenderer/dynlights/hw_lightbuffer.cpp - hwrenderer/models/hw_models.cpp - hwrenderer/scene/hw_skydome.cpp - hwrenderer/scene/hw_drawlistadd.cpp - hwrenderer/scene/hw_renderstate.cpp - hwrenderer/postprocessing/hw_postprocess.cpp - hwrenderer/postprocessing/hw_postprocess_cvars.cpp - hwrenderer/postprocessing/hw_postprocessshader.cpp - hwrenderer/postprocessing/hw_shadowmapshader.cpp - hwrenderer/postprocessing/hw_presentshader.cpp - hwrenderer/postprocessing/hw_present3dRowshader.cpp - hwrenderer/textures/hw_material.cpp - hwrenderer/textures/hw_precache.cpp - hwrenderer/utility/hw_clock.cpp - hwrenderer/utility/hw_cvars.cpp - hwrenderer/utility/hw_draw2d.cpp - hwrenderer/utility/hw_lighting.cpp - hwrenderer/utility/hw_shaderpatcher.cpp - hwrenderer/utility/hw_vrmodes.cpp + rendering/gl/renderer/gl_renderer.cpp + rendering/gl/renderer/gl_renderstate.cpp + rendering/gl/renderer/gl_renderbuffers.cpp + rendering/gl/renderer/gl_postprocess.cpp + rendering/gl/renderer/gl_postprocessstate.cpp + rendering/gl/renderer/gl_stereo3d.cpp + rendering/gl/renderer/gl_scene.cpp + rendering/gl/shaders/gl_shader.cpp + rendering/gl/shaders/gl_shaderprogram.cpp + rendering/gl/shaders/gl_postprocessshader.cpp + rendering/gl_load/gl_interface.cpp + rendering/gl/system/gl_framebuffer.cpp + rendering/gl/system/gl_debug.cpp + rendering/gl/system/gl_buffers.cpp + rendering/gl/textures/gl_hwtexture.cpp + rendering/gl/textures/gl_samplers.cpp + rendering/hwrenderer/data/hw_vertexbuilder.cpp + rendering/hwrenderer/data/flatvertices.cpp + rendering/hwrenderer/data/hw_viewpointbuffer.cpp + rendering/hwrenderer/dynlights/hw_aabbtree.cpp + rendering/hwrenderer/dynlights/hw_shadowmap.cpp + rendering/hwrenderer/dynlights/hw_lightbuffer.cpp + rendering/hwrenderer/models/hw_models.cpp + rendering/hwrenderer/scene/hw_skydome.cpp + rendering/hwrenderer/scene/hw_drawlistadd.cpp + rendering/hwrenderer/scene/hw_renderstate.cpp + rendering/hwrenderer/postprocessing/hw_postprocess.cpp + rendering/hwrenderer/postprocessing/hw_postprocess_cvars.cpp + rendering/hwrenderer/postprocessing/hw_postprocessshader.cpp + rendering/hwrenderer/postprocessing/hw_shadowmapshader.cpp + rendering/hwrenderer/postprocessing/hw_presentshader.cpp + rendering/hwrenderer/postprocessing/hw_present3dRowshader.cpp + rendering/hwrenderer/textures/hw_material.cpp + rendering/hwrenderer/textures/hw_precache.cpp + rendering/hwrenderer/utility/hw_clock.cpp + rendering/hwrenderer/utility/hw_cvars.cpp + rendering/hwrenderer/utility/hw_draw2d.cpp + rendering/hwrenderer/utility/hw_lighting.cpp + rendering/hwrenderer/utility/hw_shaderpatcher.cpp + rendering/hwrenderer/utility/hw_vrmodes.cpp maploader/edata.cpp maploader/specials.cpp maploader/maploader.cpp @@ -1256,9 +1256,9 @@ set (PCH_SOURCES sound/wildmidi/reverb.cpp sound/wildmidi/wildmidi_lib.cpp sound/wildmidi/wm_error.cpp - swrenderer/textures/r_swtexture.cpp - swrenderer/textures/warptexture.cpp - swrenderer/textures/swcanvastexture.cpp + rendering/swrenderer/textures/r_swtexture.cpp + rendering/swrenderer/textures/warptexture.cpp + rendering/swrenderer/textures/swcanvastexture.cpp events.cpp ) @@ -1320,6 +1320,7 @@ include_directories( . g_statusbar g_shared g_inventory + rendering sound textures sound/oplsynth @@ -1437,39 +1438,40 @@ source_group("FraggleScript" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/fr source_group("Intermission" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/intermission/.+") source_group("Map Loader" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/maploader/.+") source_group("Menu" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/menu/.+") -source_group("Hardware Renderer" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/gl/.+") -source_group("Hardware Renderer\\Data" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/hwrenderer/data/.+") -source_group("Hardware Renderer\\Dynamic Lights" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/hwrenderer/dynlights/.+") -source_group("Hardware Renderer\\Models" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/hwrenderer/models/.+") -source_group("Hardware Renderer\\Postprocessing" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/hwrenderer/postprocessing/.+") -source_group("Hardware Renderer\\Renderer" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/hwrenderer/renderer/.+") -source_group("Hardware Renderer\\Scene" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/hwrenderer/scene/.+") -source_group("Hardware Renderer\\Shaders" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/hwrenderer/shaders/.+") -source_group("Hardware Renderer\\System" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/hwrenderer/system/.+") -source_group("Hardware Renderer\\Textures" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/hwrenderer/textures/.+") -source_group("Hardware Renderer\\Utilities" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/hwrenderer/utility/.+") -source_group("OpenGL Loader" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/gl_load/.+") -source_group("OpenGL Renderer" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/gl/.+") -source_group("OpenGL Renderer\\Data" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/gl/data/.+") -source_group("OpenGL Renderer\\Dynamic Lights" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/gl/dynlights/.+") -source_group("OpenGL Renderer\\Renderer" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/gl/renderer/.+") -source_group("OpenGL Renderer\\Scene" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/gl/scene/.+") -source_group("OpenGL Renderer\\Shaders" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/gl/shaders/.+") -source_group("OpenGL Renderer\\System" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/gl/system/.+") -source_group("OpenGL Renderer\\Textures" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/gl/textures/.+") -source_group("OpenGL Renderer\\Utilities" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/gl/utility/.+") -source_group("Software Renderer" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/swrenderer/.+") -source_group("Software Renderer\\Drawers" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/swrenderer/drawers/.+") -source_group("Software Renderer\\Scene" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/swrenderer/scene/.+") -source_group("Software Renderer\\Segments" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/swrenderer/segments/.+") -source_group("Software Renderer\\Line" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/swrenderer/line/.+") -source_group("Software Renderer\\Plane" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/swrenderer/plane/.+") -source_group("Software Renderer\\Things" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/swrenderer/things/.+") -source_group("Software Renderer\\Viewport" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/swrenderer/viewport/.+") -source_group("Poly Renderer" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/polyrenderer/.+") -source_group("Poly Renderer\\Math" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/polyrenderer/math/.+") -source_group("Poly Renderer\\Drawers" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/polyrenderer/drawers/.+") -source_group("Poly Renderer\\Scene" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/polyrenderer/scene/.+") +source_group("Rendering" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/.+") +source_group("Rendering\\Hardware Renderer" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/gl/.+") +source_group("Rendering\\Hardware Renderer\\Data" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/hwrenderer/data/.+") +source_group("Rendering\\Hardware Renderer\\Dynamic Lights" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/hwrenderer/dynlights/.+") +source_group("Rendering\\Hardware Renderer\\Models" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/hwrenderer/models/.+") +source_group("Rendering\\Hardware Renderer\\Postprocessing" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/hwrenderer/postprocessing/.+") +source_group("Rendering\\Hardware Renderer\\Renderer" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/hwrenderer/renderer/.+") +source_group("Rendering\\Hardware Renderer\\Scene" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/hwrenderer/scene/.+") +source_group("Rendering\\Hardware Renderer\\Shaders" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/hwrenderer/shaders/.+") +source_group("Rendering\\Hardware Renderer\\System" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/hwrenderer/system/.+") +source_group("Rendering\\Hardware Renderer\\Textures" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/hwrenderer/textures/.+") +source_group("Rendering\\Hardware Renderer\\Utilities" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/hwrenderer/utility/.+") +source_group("Rendering\\OpenGL Loader" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/gl_load/.+") +source_group("Rendering\\OpenGL Renderer" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/gl/.+") +source_group("Rendering\\OpenGL Renderer\\Data" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/gl/data/.+") +source_group("Rendering\\OpenGL Renderer\\Dynamic Lights" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/gl/dynlights/.+") +source_group("Rendering\\OpenGL Renderer\\Renderer" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/gl/renderer/.+") +source_group("Rendering\\OpenGL Renderer\\Scene" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/gl/scene/.+") +source_group("Rendering\\OpenGL Renderer\\Shaders" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/gl/shaders/.+") +source_group("Rendering\\OpenGL Renderer\\System" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/gl/system/.+") +source_group("Rendering\\OpenGL Renderer\\Textures" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/gl/textures/.+") +source_group("Rendering\\OpenGL Renderer\\Utilities" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/gl/utility/.+") +source_group("Rendering\\Software Renderer" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/swrenderer/.+") +source_group("Rendering\\Software Renderer\\Drawers" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/swrenderer/drawers/.+") +source_group("Rendering\\Software Renderer\\Scene" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/swrenderer/scene/.+") +source_group("Rendering\\Software Renderer\\Segments" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/swrenderer/segments/.+") +source_group("Rendering\\Software Renderer\\Line" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/swrenderer/line/.+") +source_group("Rendering\\Software Renderer\\Plane" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/swrenderer/plane/.+") +source_group("Rendering\\Software Renderer\\Things" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/swrenderer/things/.+") +source_group("Rendering\\Software Renderer\\Viewport" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/swrenderer/viewport/.+") +source_group("Rendering\\Poly Renderer" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/polyrenderer/.+") +source_group("Rendering\\Poly Renderer\\Math" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/polyrenderer/math/.+") +source_group("Rendering\\Poly Renderer\\Drawers" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/polyrenderer/drawers/.+") +source_group("Rendering\\Poly Renderer\\Scene" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/polyrenderer/scene/.+") source_group("Render Data" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/r_data/.+") source_group("Render Data\\Textures" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/textures/.+") source_group("Render Data\\Textures\\Hires" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/textures/hires/.+") diff --git a/src/gl/renderer/gl_postprocess.cpp b/src/rendering/gl/renderer/gl_postprocess.cpp similarity index 100% rename from src/gl/renderer/gl_postprocess.cpp rename to src/rendering/gl/renderer/gl_postprocess.cpp diff --git a/src/gl/renderer/gl_postprocessstate.cpp b/src/rendering/gl/renderer/gl_postprocessstate.cpp similarity index 100% rename from src/gl/renderer/gl_postprocessstate.cpp rename to src/rendering/gl/renderer/gl_postprocessstate.cpp diff --git a/src/gl/renderer/gl_postprocessstate.h b/src/rendering/gl/renderer/gl_postprocessstate.h similarity index 100% rename from src/gl/renderer/gl_postprocessstate.h rename to src/rendering/gl/renderer/gl_postprocessstate.h diff --git a/src/gl/renderer/gl_renderbuffers.cpp b/src/rendering/gl/renderer/gl_renderbuffers.cpp similarity index 100% rename from src/gl/renderer/gl_renderbuffers.cpp rename to src/rendering/gl/renderer/gl_renderbuffers.cpp diff --git a/src/gl/renderer/gl_renderbuffers.h b/src/rendering/gl/renderer/gl_renderbuffers.h similarity index 100% rename from src/gl/renderer/gl_renderbuffers.h rename to src/rendering/gl/renderer/gl_renderbuffers.h diff --git a/src/gl/renderer/gl_renderer.cpp b/src/rendering/gl/renderer/gl_renderer.cpp similarity index 100% rename from src/gl/renderer/gl_renderer.cpp rename to src/rendering/gl/renderer/gl_renderer.cpp diff --git a/src/gl/renderer/gl_renderer.h b/src/rendering/gl/renderer/gl_renderer.h similarity index 100% rename from src/gl/renderer/gl_renderer.h rename to src/rendering/gl/renderer/gl_renderer.h diff --git a/src/gl/renderer/gl_renderstate.cpp b/src/rendering/gl/renderer/gl_renderstate.cpp similarity index 100% rename from src/gl/renderer/gl_renderstate.cpp rename to src/rendering/gl/renderer/gl_renderstate.cpp diff --git a/src/gl/renderer/gl_renderstate.h b/src/rendering/gl/renderer/gl_renderstate.h similarity index 100% rename from src/gl/renderer/gl_renderstate.h rename to src/rendering/gl/renderer/gl_renderstate.h diff --git a/src/gl/renderer/gl_scene.cpp b/src/rendering/gl/renderer/gl_scene.cpp similarity index 100% rename from src/gl/renderer/gl_scene.cpp rename to src/rendering/gl/renderer/gl_scene.cpp diff --git a/src/gl/renderer/gl_stereo3d.cpp b/src/rendering/gl/renderer/gl_stereo3d.cpp similarity index 100% rename from src/gl/renderer/gl_stereo3d.cpp rename to src/rendering/gl/renderer/gl_stereo3d.cpp diff --git a/src/gl/shaders/gl_postprocessshader.cpp b/src/rendering/gl/shaders/gl_postprocessshader.cpp similarity index 100% rename from src/gl/shaders/gl_postprocessshader.cpp rename to src/rendering/gl/shaders/gl_postprocessshader.cpp diff --git a/src/gl/shaders/gl_postprocessshaderinstance.h b/src/rendering/gl/shaders/gl_postprocessshaderinstance.h similarity index 100% rename from src/gl/shaders/gl_postprocessshaderinstance.h rename to src/rendering/gl/shaders/gl_postprocessshaderinstance.h diff --git a/src/gl/shaders/gl_shader.cpp b/src/rendering/gl/shaders/gl_shader.cpp similarity index 100% rename from src/gl/shaders/gl_shader.cpp rename to src/rendering/gl/shaders/gl_shader.cpp diff --git a/src/gl/shaders/gl_shader.h b/src/rendering/gl/shaders/gl_shader.h similarity index 100% rename from src/gl/shaders/gl_shader.h rename to src/rendering/gl/shaders/gl_shader.h diff --git a/src/gl/shaders/gl_shaderprogram.cpp b/src/rendering/gl/shaders/gl_shaderprogram.cpp similarity index 100% rename from src/gl/shaders/gl_shaderprogram.cpp rename to src/rendering/gl/shaders/gl_shaderprogram.cpp diff --git a/src/gl/shaders/gl_shaderprogram.h b/src/rendering/gl/shaders/gl_shaderprogram.h similarity index 100% rename from src/gl/shaders/gl_shaderprogram.h rename to src/rendering/gl/shaders/gl_shaderprogram.h diff --git a/src/gl/system/gl_buffers.cpp b/src/rendering/gl/system/gl_buffers.cpp similarity index 100% rename from src/gl/system/gl_buffers.cpp rename to src/rendering/gl/system/gl_buffers.cpp diff --git a/src/gl/system/gl_buffers.h b/src/rendering/gl/system/gl_buffers.h similarity index 100% rename from src/gl/system/gl_buffers.h rename to src/rendering/gl/system/gl_buffers.h diff --git a/src/gl/system/gl_debug.cpp b/src/rendering/gl/system/gl_debug.cpp similarity index 100% rename from src/gl/system/gl_debug.cpp rename to src/rendering/gl/system/gl_debug.cpp diff --git a/src/gl/system/gl_debug.h b/src/rendering/gl/system/gl_debug.h similarity index 100% rename from src/gl/system/gl_debug.h rename to src/rendering/gl/system/gl_debug.h diff --git a/src/gl/system/gl_framebuffer.cpp b/src/rendering/gl/system/gl_framebuffer.cpp similarity index 100% rename from src/gl/system/gl_framebuffer.cpp rename to src/rendering/gl/system/gl_framebuffer.cpp diff --git a/src/gl/system/gl_framebuffer.h b/src/rendering/gl/system/gl_framebuffer.h similarity index 100% rename from src/gl/system/gl_framebuffer.h rename to src/rendering/gl/system/gl_framebuffer.h diff --git a/src/gl/textures/gl_hwtexture.cpp b/src/rendering/gl/textures/gl_hwtexture.cpp similarity index 100% rename from src/gl/textures/gl_hwtexture.cpp rename to src/rendering/gl/textures/gl_hwtexture.cpp diff --git a/src/gl/textures/gl_hwtexture.h b/src/rendering/gl/textures/gl_hwtexture.h similarity index 100% rename from src/gl/textures/gl_hwtexture.h rename to src/rendering/gl/textures/gl_hwtexture.h diff --git a/src/gl/textures/gl_samplers.cpp b/src/rendering/gl/textures/gl_samplers.cpp similarity index 100% rename from src/gl/textures/gl_samplers.cpp rename to src/rendering/gl/textures/gl_samplers.cpp diff --git a/src/gl/textures/gl_samplers.h b/src/rendering/gl/textures/gl_samplers.h similarity index 100% rename from src/gl/textures/gl_samplers.h rename to src/rendering/gl/textures/gl_samplers.h diff --git a/src/gl_load/gl_extlist.txt b/src/rendering/gl_load/gl_extlist.txt similarity index 100% rename from src/gl_load/gl_extlist.txt rename to src/rendering/gl_load/gl_extlist.txt diff --git a/src/gl_load/gl_interface.cpp b/src/rendering/gl_load/gl_interface.cpp similarity index 100% rename from src/gl_load/gl_interface.cpp rename to src/rendering/gl_load/gl_interface.cpp diff --git a/src/gl_load/gl_interface.h b/src/rendering/gl_load/gl_interface.h similarity index 100% rename from src/gl_load/gl_interface.h rename to src/rendering/gl_load/gl_interface.h diff --git a/src/gl_load/gl_load.c b/src/rendering/gl_load/gl_load.c similarity index 100% rename from src/gl_load/gl_load.c rename to src/rendering/gl_load/gl_load.c diff --git a/src/gl_load/gl_load.h b/src/rendering/gl_load/gl_load.h similarity index 100% rename from src/gl_load/gl_load.h rename to src/rendering/gl_load/gl_load.h diff --git a/src/gl_load/gl_system.h b/src/rendering/gl_load/gl_system.h similarity index 100% rename from src/gl_load/gl_system.h rename to src/rendering/gl_load/gl_system.h diff --git a/src/hwrenderer/data/buffers.h b/src/rendering/hwrenderer/data/buffers.h similarity index 100% rename from src/hwrenderer/data/buffers.h rename to src/rendering/hwrenderer/data/buffers.h diff --git a/src/hwrenderer/data/flatvertices.cpp b/src/rendering/hwrenderer/data/flatvertices.cpp similarity index 100% rename from src/hwrenderer/data/flatvertices.cpp rename to src/rendering/hwrenderer/data/flatvertices.cpp diff --git a/src/hwrenderer/data/flatvertices.h b/src/rendering/hwrenderer/data/flatvertices.h similarity index 100% rename from src/hwrenderer/data/flatvertices.h rename to src/rendering/hwrenderer/data/flatvertices.h diff --git a/src/hwrenderer/data/hw_vertexbuilder.cpp b/src/rendering/hwrenderer/data/hw_vertexbuilder.cpp similarity index 100% rename from src/hwrenderer/data/hw_vertexbuilder.cpp rename to src/rendering/hwrenderer/data/hw_vertexbuilder.cpp diff --git a/src/hwrenderer/data/hw_vertexbuilder.h b/src/rendering/hwrenderer/data/hw_vertexbuilder.h similarity index 100% rename from src/hwrenderer/data/hw_vertexbuilder.h rename to src/rendering/hwrenderer/data/hw_vertexbuilder.h diff --git a/src/hwrenderer/data/hw_viewpointbuffer.cpp b/src/rendering/hwrenderer/data/hw_viewpointbuffer.cpp similarity index 100% rename from src/hwrenderer/data/hw_viewpointbuffer.cpp rename to src/rendering/hwrenderer/data/hw_viewpointbuffer.cpp diff --git a/src/hwrenderer/data/hw_viewpointbuffer.h b/src/rendering/hwrenderer/data/hw_viewpointbuffer.h similarity index 100% rename from src/hwrenderer/data/hw_viewpointbuffer.h rename to src/rendering/hwrenderer/data/hw_viewpointbuffer.h diff --git a/src/hwrenderer/data/renderqueue.h b/src/rendering/hwrenderer/data/renderqueue.h similarity index 100% rename from src/hwrenderer/data/renderqueue.h rename to src/rendering/hwrenderer/data/renderqueue.h diff --git a/src/hwrenderer/data/shaderuniforms.h b/src/rendering/hwrenderer/data/shaderuniforms.h similarity index 100% rename from src/hwrenderer/data/shaderuniforms.h rename to src/rendering/hwrenderer/data/shaderuniforms.h diff --git a/src/hwrenderer/dynlights/hw_aabbtree.cpp b/src/rendering/hwrenderer/dynlights/hw_aabbtree.cpp similarity index 100% rename from src/hwrenderer/dynlights/hw_aabbtree.cpp rename to src/rendering/hwrenderer/dynlights/hw_aabbtree.cpp diff --git a/src/hwrenderer/dynlights/hw_aabbtree.h b/src/rendering/hwrenderer/dynlights/hw_aabbtree.h similarity index 100% rename from src/hwrenderer/dynlights/hw_aabbtree.h rename to src/rendering/hwrenderer/dynlights/hw_aabbtree.h diff --git a/src/hwrenderer/dynlights/hw_dynlightdata.cpp b/src/rendering/hwrenderer/dynlights/hw_dynlightdata.cpp similarity index 100% rename from src/hwrenderer/dynlights/hw_dynlightdata.cpp rename to src/rendering/hwrenderer/dynlights/hw_dynlightdata.cpp diff --git a/src/hwrenderer/dynlights/hw_dynlightdata.h b/src/rendering/hwrenderer/dynlights/hw_dynlightdata.h similarity index 100% rename from src/hwrenderer/dynlights/hw_dynlightdata.h rename to src/rendering/hwrenderer/dynlights/hw_dynlightdata.h diff --git a/src/hwrenderer/dynlights/hw_lightbuffer.cpp b/src/rendering/hwrenderer/dynlights/hw_lightbuffer.cpp similarity index 100% rename from src/hwrenderer/dynlights/hw_lightbuffer.cpp rename to src/rendering/hwrenderer/dynlights/hw_lightbuffer.cpp diff --git a/src/hwrenderer/dynlights/hw_lightbuffer.h b/src/rendering/hwrenderer/dynlights/hw_lightbuffer.h similarity index 100% rename from src/hwrenderer/dynlights/hw_lightbuffer.h rename to src/rendering/hwrenderer/dynlights/hw_lightbuffer.h diff --git a/src/hwrenderer/dynlights/hw_shadowmap.cpp b/src/rendering/hwrenderer/dynlights/hw_shadowmap.cpp similarity index 100% rename from src/hwrenderer/dynlights/hw_shadowmap.cpp rename to src/rendering/hwrenderer/dynlights/hw_shadowmap.cpp diff --git a/src/hwrenderer/dynlights/hw_shadowmap.h b/src/rendering/hwrenderer/dynlights/hw_shadowmap.h similarity index 100% rename from src/hwrenderer/dynlights/hw_shadowmap.h rename to src/rendering/hwrenderer/dynlights/hw_shadowmap.h diff --git a/src/hwrenderer/models/hw_models.cpp b/src/rendering/hwrenderer/models/hw_models.cpp similarity index 100% rename from src/hwrenderer/models/hw_models.cpp rename to src/rendering/hwrenderer/models/hw_models.cpp diff --git a/src/hwrenderer/models/hw_models.h b/src/rendering/hwrenderer/models/hw_models.h similarity index 100% rename from src/hwrenderer/models/hw_models.h rename to src/rendering/hwrenderer/models/hw_models.h diff --git a/src/hwrenderer/postprocessing/hw_postprocess.cpp b/src/rendering/hwrenderer/postprocessing/hw_postprocess.cpp similarity index 100% rename from src/hwrenderer/postprocessing/hw_postprocess.cpp rename to src/rendering/hwrenderer/postprocessing/hw_postprocess.cpp diff --git a/src/hwrenderer/postprocessing/hw_postprocess.h b/src/rendering/hwrenderer/postprocessing/hw_postprocess.h similarity index 100% rename from src/hwrenderer/postprocessing/hw_postprocess.h rename to src/rendering/hwrenderer/postprocessing/hw_postprocess.h diff --git a/src/hwrenderer/postprocessing/hw_postprocess_cvars.cpp b/src/rendering/hwrenderer/postprocessing/hw_postprocess_cvars.cpp similarity index 100% rename from src/hwrenderer/postprocessing/hw_postprocess_cvars.cpp rename to src/rendering/hwrenderer/postprocessing/hw_postprocess_cvars.cpp diff --git a/src/hwrenderer/postprocessing/hw_postprocess_cvars.h b/src/rendering/hwrenderer/postprocessing/hw_postprocess_cvars.h similarity index 100% rename from src/hwrenderer/postprocessing/hw_postprocess_cvars.h rename to src/rendering/hwrenderer/postprocessing/hw_postprocess_cvars.h diff --git a/src/hwrenderer/postprocessing/hw_postprocessshader.cpp b/src/rendering/hwrenderer/postprocessing/hw_postprocessshader.cpp similarity index 100% rename from src/hwrenderer/postprocessing/hw_postprocessshader.cpp rename to src/rendering/hwrenderer/postprocessing/hw_postprocessshader.cpp diff --git a/src/hwrenderer/postprocessing/hw_postprocessshader.h b/src/rendering/hwrenderer/postprocessing/hw_postprocessshader.h similarity index 100% rename from src/hwrenderer/postprocessing/hw_postprocessshader.h rename to src/rendering/hwrenderer/postprocessing/hw_postprocessshader.h diff --git a/src/hwrenderer/postprocessing/hw_present3dRowshader.cpp b/src/rendering/hwrenderer/postprocessing/hw_present3dRowshader.cpp similarity index 100% rename from src/hwrenderer/postprocessing/hw_present3dRowshader.cpp rename to src/rendering/hwrenderer/postprocessing/hw_present3dRowshader.cpp diff --git a/src/hwrenderer/postprocessing/hw_present3dRowshader.h b/src/rendering/hwrenderer/postprocessing/hw_present3dRowshader.h similarity index 100% rename from src/hwrenderer/postprocessing/hw_present3dRowshader.h rename to src/rendering/hwrenderer/postprocessing/hw_present3dRowshader.h diff --git a/src/hwrenderer/postprocessing/hw_presentshader.cpp b/src/rendering/hwrenderer/postprocessing/hw_presentshader.cpp similarity index 100% rename from src/hwrenderer/postprocessing/hw_presentshader.cpp rename to src/rendering/hwrenderer/postprocessing/hw_presentshader.cpp diff --git a/src/hwrenderer/postprocessing/hw_presentshader.h b/src/rendering/hwrenderer/postprocessing/hw_presentshader.h similarity index 100% rename from src/hwrenderer/postprocessing/hw_presentshader.h rename to src/rendering/hwrenderer/postprocessing/hw_presentshader.h diff --git a/src/hwrenderer/postprocessing/hw_shaderprogram.h b/src/rendering/hwrenderer/postprocessing/hw_shaderprogram.h similarity index 100% rename from src/hwrenderer/postprocessing/hw_shaderprogram.h rename to src/rendering/hwrenderer/postprocessing/hw_shaderprogram.h diff --git a/src/hwrenderer/postprocessing/hw_shadowmapshader.cpp b/src/rendering/hwrenderer/postprocessing/hw_shadowmapshader.cpp similarity index 100% rename from src/hwrenderer/postprocessing/hw_shadowmapshader.cpp rename to src/rendering/hwrenderer/postprocessing/hw_shadowmapshader.cpp diff --git a/src/hwrenderer/postprocessing/hw_shadowmapshader.h b/src/rendering/hwrenderer/postprocessing/hw_shadowmapshader.h similarity index 100% rename from src/hwrenderer/postprocessing/hw_shadowmapshader.h rename to src/rendering/hwrenderer/postprocessing/hw_shadowmapshader.h diff --git a/src/hwrenderer/scene/hw_bsp.cpp b/src/rendering/hwrenderer/scene/hw_bsp.cpp similarity index 100% rename from src/hwrenderer/scene/hw_bsp.cpp rename to src/rendering/hwrenderer/scene/hw_bsp.cpp diff --git a/src/hwrenderer/scene/hw_clipper.cpp b/src/rendering/hwrenderer/scene/hw_clipper.cpp similarity index 100% rename from src/hwrenderer/scene/hw_clipper.cpp rename to src/rendering/hwrenderer/scene/hw_clipper.cpp diff --git a/src/hwrenderer/scene/hw_clipper.h b/src/rendering/hwrenderer/scene/hw_clipper.h similarity index 100% rename from src/hwrenderer/scene/hw_clipper.h rename to src/rendering/hwrenderer/scene/hw_clipper.h diff --git a/src/hwrenderer/scene/hw_decal.cpp b/src/rendering/hwrenderer/scene/hw_decal.cpp similarity index 100% rename from src/hwrenderer/scene/hw_decal.cpp rename to src/rendering/hwrenderer/scene/hw_decal.cpp diff --git a/src/hwrenderer/scene/hw_drawinfo.cpp b/src/rendering/hwrenderer/scene/hw_drawinfo.cpp similarity index 100% rename from src/hwrenderer/scene/hw_drawinfo.cpp rename to src/rendering/hwrenderer/scene/hw_drawinfo.cpp diff --git a/src/hwrenderer/scene/hw_drawinfo.h b/src/rendering/hwrenderer/scene/hw_drawinfo.h similarity index 100% rename from src/hwrenderer/scene/hw_drawinfo.h rename to src/rendering/hwrenderer/scene/hw_drawinfo.h diff --git a/src/hwrenderer/scene/hw_drawlist.cpp b/src/rendering/hwrenderer/scene/hw_drawlist.cpp similarity index 100% rename from src/hwrenderer/scene/hw_drawlist.cpp rename to src/rendering/hwrenderer/scene/hw_drawlist.cpp diff --git a/src/hwrenderer/scene/hw_drawlist.h b/src/rendering/hwrenderer/scene/hw_drawlist.h similarity index 100% rename from src/hwrenderer/scene/hw_drawlist.h rename to src/rendering/hwrenderer/scene/hw_drawlist.h diff --git a/src/hwrenderer/scene/hw_drawlistadd.cpp b/src/rendering/hwrenderer/scene/hw_drawlistadd.cpp similarity index 100% rename from src/hwrenderer/scene/hw_drawlistadd.cpp rename to src/rendering/hwrenderer/scene/hw_drawlistadd.cpp diff --git a/src/hwrenderer/scene/hw_drawstructs.h b/src/rendering/hwrenderer/scene/hw_drawstructs.h similarity index 100% rename from src/hwrenderer/scene/hw_drawstructs.h rename to src/rendering/hwrenderer/scene/hw_drawstructs.h diff --git a/src/hwrenderer/scene/hw_fakeflat.cpp b/src/rendering/hwrenderer/scene/hw_fakeflat.cpp similarity index 100% rename from src/hwrenderer/scene/hw_fakeflat.cpp rename to src/rendering/hwrenderer/scene/hw_fakeflat.cpp diff --git a/src/hwrenderer/scene/hw_fakeflat.h b/src/rendering/hwrenderer/scene/hw_fakeflat.h similarity index 100% rename from src/hwrenderer/scene/hw_fakeflat.h rename to src/rendering/hwrenderer/scene/hw_fakeflat.h diff --git a/src/hwrenderer/scene/hw_flats.cpp b/src/rendering/hwrenderer/scene/hw_flats.cpp similarity index 100% rename from src/hwrenderer/scene/hw_flats.cpp rename to src/rendering/hwrenderer/scene/hw_flats.cpp diff --git a/src/hwrenderer/scene/hw_portal.cpp b/src/rendering/hwrenderer/scene/hw_portal.cpp similarity index 100% rename from src/hwrenderer/scene/hw_portal.cpp rename to src/rendering/hwrenderer/scene/hw_portal.cpp diff --git a/src/hwrenderer/scene/hw_portal.h b/src/rendering/hwrenderer/scene/hw_portal.h similarity index 100% rename from src/hwrenderer/scene/hw_portal.h rename to src/rendering/hwrenderer/scene/hw_portal.h diff --git a/src/hwrenderer/scene/hw_renderhacks.cpp b/src/rendering/hwrenderer/scene/hw_renderhacks.cpp similarity index 100% rename from src/hwrenderer/scene/hw_renderhacks.cpp rename to src/rendering/hwrenderer/scene/hw_renderhacks.cpp diff --git a/src/hwrenderer/scene/hw_renderstate.cpp b/src/rendering/hwrenderer/scene/hw_renderstate.cpp similarity index 100% rename from src/hwrenderer/scene/hw_renderstate.cpp rename to src/rendering/hwrenderer/scene/hw_renderstate.cpp diff --git a/src/hwrenderer/scene/hw_renderstate.h b/src/rendering/hwrenderer/scene/hw_renderstate.h similarity index 100% rename from src/hwrenderer/scene/hw_renderstate.h rename to src/rendering/hwrenderer/scene/hw_renderstate.h diff --git a/src/hwrenderer/scene/hw_sky.cpp b/src/rendering/hwrenderer/scene/hw_sky.cpp similarity index 100% rename from src/hwrenderer/scene/hw_sky.cpp rename to src/rendering/hwrenderer/scene/hw_sky.cpp diff --git a/src/hwrenderer/scene/hw_skydome.cpp b/src/rendering/hwrenderer/scene/hw_skydome.cpp similarity index 100% rename from src/hwrenderer/scene/hw_skydome.cpp rename to src/rendering/hwrenderer/scene/hw_skydome.cpp diff --git a/src/hwrenderer/scene/hw_skydome.h b/src/rendering/hwrenderer/scene/hw_skydome.h similarity index 100% rename from src/hwrenderer/scene/hw_skydome.h rename to src/rendering/hwrenderer/scene/hw_skydome.h diff --git a/src/hwrenderer/scene/hw_skyportal.cpp b/src/rendering/hwrenderer/scene/hw_skyportal.cpp similarity index 100% rename from src/hwrenderer/scene/hw_skyportal.cpp rename to src/rendering/hwrenderer/scene/hw_skyportal.cpp diff --git a/src/hwrenderer/scene/hw_spritelight.cpp b/src/rendering/hwrenderer/scene/hw_spritelight.cpp similarity index 100% rename from src/hwrenderer/scene/hw_spritelight.cpp rename to src/rendering/hwrenderer/scene/hw_spritelight.cpp diff --git a/src/hwrenderer/scene/hw_sprites.cpp b/src/rendering/hwrenderer/scene/hw_sprites.cpp similarity index 100% rename from src/hwrenderer/scene/hw_sprites.cpp rename to src/rendering/hwrenderer/scene/hw_sprites.cpp diff --git a/src/hwrenderer/scene/hw_viewpointuniforms.h b/src/rendering/hwrenderer/scene/hw_viewpointuniforms.h similarity index 100% rename from src/hwrenderer/scene/hw_viewpointuniforms.h rename to src/rendering/hwrenderer/scene/hw_viewpointuniforms.h diff --git a/src/hwrenderer/scene/hw_walls.cpp b/src/rendering/hwrenderer/scene/hw_walls.cpp similarity index 100% rename from src/hwrenderer/scene/hw_walls.cpp rename to src/rendering/hwrenderer/scene/hw_walls.cpp diff --git a/src/hwrenderer/scene/hw_walls_vertex.cpp b/src/rendering/hwrenderer/scene/hw_walls_vertex.cpp similarity index 100% rename from src/hwrenderer/scene/hw_walls_vertex.cpp rename to src/rendering/hwrenderer/scene/hw_walls_vertex.cpp diff --git a/src/hwrenderer/scene/hw_weapon.cpp b/src/rendering/hwrenderer/scene/hw_weapon.cpp similarity index 100% rename from src/hwrenderer/scene/hw_weapon.cpp rename to src/rendering/hwrenderer/scene/hw_weapon.cpp diff --git a/src/hwrenderer/scene/hw_weapon.h b/src/rendering/hwrenderer/scene/hw_weapon.h similarity index 100% rename from src/hwrenderer/scene/hw_weapon.h rename to src/rendering/hwrenderer/scene/hw_weapon.h diff --git a/src/hwrenderer/textures/hw_ihwtexture.h b/src/rendering/hwrenderer/textures/hw_ihwtexture.h similarity index 100% rename from src/hwrenderer/textures/hw_ihwtexture.h rename to src/rendering/hwrenderer/textures/hw_ihwtexture.h diff --git a/src/hwrenderer/textures/hw_material.cpp b/src/rendering/hwrenderer/textures/hw_material.cpp similarity index 100% rename from src/hwrenderer/textures/hw_material.cpp rename to src/rendering/hwrenderer/textures/hw_material.cpp diff --git a/src/hwrenderer/textures/hw_material.h b/src/rendering/hwrenderer/textures/hw_material.h similarity index 100% rename from src/hwrenderer/textures/hw_material.h rename to src/rendering/hwrenderer/textures/hw_material.h diff --git a/src/hwrenderer/textures/hw_precache.cpp b/src/rendering/hwrenderer/textures/hw_precache.cpp similarity index 100% rename from src/hwrenderer/textures/hw_precache.cpp rename to src/rendering/hwrenderer/textures/hw_precache.cpp diff --git a/src/hwrenderer/textures/hw_texcontainer.h b/src/rendering/hwrenderer/textures/hw_texcontainer.h similarity index 100% rename from src/hwrenderer/textures/hw_texcontainer.h rename to src/rendering/hwrenderer/textures/hw_texcontainer.h diff --git a/src/hwrenderer/utility/hw_clock.cpp b/src/rendering/hwrenderer/utility/hw_clock.cpp similarity index 100% rename from src/hwrenderer/utility/hw_clock.cpp rename to src/rendering/hwrenderer/utility/hw_clock.cpp diff --git a/src/hwrenderer/utility/hw_clock.h b/src/rendering/hwrenderer/utility/hw_clock.h similarity index 100% rename from src/hwrenderer/utility/hw_clock.h rename to src/rendering/hwrenderer/utility/hw_clock.h diff --git a/src/hwrenderer/utility/hw_cvars.cpp b/src/rendering/hwrenderer/utility/hw_cvars.cpp similarity index 100% rename from src/hwrenderer/utility/hw_cvars.cpp rename to src/rendering/hwrenderer/utility/hw_cvars.cpp diff --git a/src/hwrenderer/utility/hw_cvars.h b/src/rendering/hwrenderer/utility/hw_cvars.h similarity index 100% rename from src/hwrenderer/utility/hw_cvars.h rename to src/rendering/hwrenderer/utility/hw_cvars.h diff --git a/src/hwrenderer/utility/hw_draw2d.cpp b/src/rendering/hwrenderer/utility/hw_draw2d.cpp similarity index 100% rename from src/hwrenderer/utility/hw_draw2d.cpp rename to src/rendering/hwrenderer/utility/hw_draw2d.cpp diff --git a/src/hwrenderer/utility/hw_lighting.cpp b/src/rendering/hwrenderer/utility/hw_lighting.cpp similarity index 100% rename from src/hwrenderer/utility/hw_lighting.cpp rename to src/rendering/hwrenderer/utility/hw_lighting.cpp diff --git a/src/hwrenderer/utility/hw_lighting.h b/src/rendering/hwrenderer/utility/hw_lighting.h similarity index 100% rename from src/hwrenderer/utility/hw_lighting.h rename to src/rendering/hwrenderer/utility/hw_lighting.h diff --git a/src/hwrenderer/utility/hw_shaderpatcher.cpp b/src/rendering/hwrenderer/utility/hw_shaderpatcher.cpp similarity index 100% rename from src/hwrenderer/utility/hw_shaderpatcher.cpp rename to src/rendering/hwrenderer/utility/hw_shaderpatcher.cpp diff --git a/src/hwrenderer/utility/hw_shaderpatcher.h b/src/rendering/hwrenderer/utility/hw_shaderpatcher.h similarity index 100% rename from src/hwrenderer/utility/hw_shaderpatcher.h rename to src/rendering/hwrenderer/utility/hw_shaderpatcher.h diff --git a/src/hwrenderer/utility/hw_vrmodes.cpp b/src/rendering/hwrenderer/utility/hw_vrmodes.cpp similarity index 100% rename from src/hwrenderer/utility/hw_vrmodes.cpp rename to src/rendering/hwrenderer/utility/hw_vrmodes.cpp diff --git a/src/hwrenderer/utility/hw_vrmodes.h b/src/rendering/hwrenderer/utility/hw_vrmodes.h similarity index 100% rename from src/hwrenderer/utility/hw_vrmodes.h rename to src/rendering/hwrenderer/utility/hw_vrmodes.h diff --git a/src/polyrenderer/drawers/poly_buffer.cpp b/src/rendering/polyrenderer/drawers/poly_buffer.cpp similarity index 100% rename from src/polyrenderer/drawers/poly_buffer.cpp rename to src/rendering/polyrenderer/drawers/poly_buffer.cpp diff --git a/src/polyrenderer/drawers/poly_buffer.h b/src/rendering/polyrenderer/drawers/poly_buffer.h similarity index 100% rename from src/polyrenderer/drawers/poly_buffer.h rename to src/rendering/polyrenderer/drawers/poly_buffer.h diff --git a/src/polyrenderer/drawers/poly_draw_args.cpp b/src/rendering/polyrenderer/drawers/poly_draw_args.cpp similarity index 100% rename from src/polyrenderer/drawers/poly_draw_args.cpp rename to src/rendering/polyrenderer/drawers/poly_draw_args.cpp diff --git a/src/polyrenderer/drawers/poly_draw_args.h b/src/rendering/polyrenderer/drawers/poly_draw_args.h similarity index 100% rename from src/polyrenderer/drawers/poly_draw_args.h rename to src/rendering/polyrenderer/drawers/poly_draw_args.h diff --git a/src/polyrenderer/drawers/poly_triangle.cpp b/src/rendering/polyrenderer/drawers/poly_triangle.cpp similarity index 100% rename from src/polyrenderer/drawers/poly_triangle.cpp rename to src/rendering/polyrenderer/drawers/poly_triangle.cpp diff --git a/src/polyrenderer/drawers/poly_triangle.h b/src/rendering/polyrenderer/drawers/poly_triangle.h similarity index 100% rename from src/polyrenderer/drawers/poly_triangle.h rename to src/rendering/polyrenderer/drawers/poly_triangle.h diff --git a/src/polyrenderer/drawers/screen_triangle.cpp b/src/rendering/polyrenderer/drawers/screen_triangle.cpp similarity index 100% rename from src/polyrenderer/drawers/screen_triangle.cpp rename to src/rendering/polyrenderer/drawers/screen_triangle.cpp diff --git a/src/polyrenderer/drawers/screen_triangle.h b/src/rendering/polyrenderer/drawers/screen_triangle.h similarity index 100% rename from src/polyrenderer/drawers/screen_triangle.h rename to src/rendering/polyrenderer/drawers/screen_triangle.h diff --git a/src/polyrenderer/math/gpu_types.cpp b/src/rendering/polyrenderer/math/gpu_types.cpp similarity index 100% rename from src/polyrenderer/math/gpu_types.cpp rename to src/rendering/polyrenderer/math/gpu_types.cpp diff --git a/src/polyrenderer/math/gpu_types.h b/src/rendering/polyrenderer/math/gpu_types.h similarity index 100% rename from src/polyrenderer/math/gpu_types.h rename to src/rendering/polyrenderer/math/gpu_types.h diff --git a/src/polyrenderer/poly_all.cpp b/src/rendering/polyrenderer/poly_all.cpp similarity index 100% rename from src/polyrenderer/poly_all.cpp rename to src/rendering/polyrenderer/poly_all.cpp diff --git a/src/polyrenderer/poly_renderer.cpp b/src/rendering/polyrenderer/poly_renderer.cpp similarity index 100% rename from src/polyrenderer/poly_renderer.cpp rename to src/rendering/polyrenderer/poly_renderer.cpp diff --git a/src/polyrenderer/poly_renderer.h b/src/rendering/polyrenderer/poly_renderer.h similarity index 100% rename from src/polyrenderer/poly_renderer.h rename to src/rendering/polyrenderer/poly_renderer.h diff --git a/src/polyrenderer/poly_renderthread.cpp b/src/rendering/polyrenderer/poly_renderthread.cpp similarity index 100% rename from src/polyrenderer/poly_renderthread.cpp rename to src/rendering/polyrenderer/poly_renderthread.cpp diff --git a/src/polyrenderer/poly_renderthread.h b/src/rendering/polyrenderer/poly_renderthread.h similarity index 100% rename from src/polyrenderer/poly_renderthread.h rename to src/rendering/polyrenderer/poly_renderthread.h diff --git a/src/polyrenderer/scene/poly_cull.cpp b/src/rendering/polyrenderer/scene/poly_cull.cpp similarity index 100% rename from src/polyrenderer/scene/poly_cull.cpp rename to src/rendering/polyrenderer/scene/poly_cull.cpp diff --git a/src/polyrenderer/scene/poly_cull.h b/src/rendering/polyrenderer/scene/poly_cull.h similarity index 100% rename from src/polyrenderer/scene/poly_cull.h rename to src/rendering/polyrenderer/scene/poly_cull.h diff --git a/src/polyrenderer/scene/poly_decal.cpp b/src/rendering/polyrenderer/scene/poly_decal.cpp similarity index 100% rename from src/polyrenderer/scene/poly_decal.cpp rename to src/rendering/polyrenderer/scene/poly_decal.cpp diff --git a/src/polyrenderer/scene/poly_decal.h b/src/rendering/polyrenderer/scene/poly_decal.h similarity index 100% rename from src/polyrenderer/scene/poly_decal.h rename to src/rendering/polyrenderer/scene/poly_decal.h diff --git a/src/polyrenderer/scene/poly_light.cpp b/src/rendering/polyrenderer/scene/poly_light.cpp similarity index 100% rename from src/polyrenderer/scene/poly_light.cpp rename to src/rendering/polyrenderer/scene/poly_light.cpp diff --git a/src/polyrenderer/scene/poly_light.h b/src/rendering/polyrenderer/scene/poly_light.h similarity index 100% rename from src/polyrenderer/scene/poly_light.h rename to src/rendering/polyrenderer/scene/poly_light.h diff --git a/src/polyrenderer/scene/poly_model.cpp b/src/rendering/polyrenderer/scene/poly_model.cpp similarity index 100% rename from src/polyrenderer/scene/poly_model.cpp rename to src/rendering/polyrenderer/scene/poly_model.cpp diff --git a/src/polyrenderer/scene/poly_model.h b/src/rendering/polyrenderer/scene/poly_model.h similarity index 100% rename from src/polyrenderer/scene/poly_model.h rename to src/rendering/polyrenderer/scene/poly_model.h diff --git a/src/polyrenderer/scene/poly_particle.cpp b/src/rendering/polyrenderer/scene/poly_particle.cpp similarity index 100% rename from src/polyrenderer/scene/poly_particle.cpp rename to src/rendering/polyrenderer/scene/poly_particle.cpp diff --git a/src/polyrenderer/scene/poly_particle.h b/src/rendering/polyrenderer/scene/poly_particle.h similarity index 100% rename from src/polyrenderer/scene/poly_particle.h rename to src/rendering/polyrenderer/scene/poly_particle.h diff --git a/src/polyrenderer/scene/poly_plane.cpp b/src/rendering/polyrenderer/scene/poly_plane.cpp similarity index 100% rename from src/polyrenderer/scene/poly_plane.cpp rename to src/rendering/polyrenderer/scene/poly_plane.cpp diff --git a/src/polyrenderer/scene/poly_plane.h b/src/rendering/polyrenderer/scene/poly_plane.h similarity index 100% rename from src/polyrenderer/scene/poly_plane.h rename to src/rendering/polyrenderer/scene/poly_plane.h diff --git a/src/polyrenderer/scene/poly_playersprite.cpp b/src/rendering/polyrenderer/scene/poly_playersprite.cpp similarity index 100% rename from src/polyrenderer/scene/poly_playersprite.cpp rename to src/rendering/polyrenderer/scene/poly_playersprite.cpp diff --git a/src/polyrenderer/scene/poly_playersprite.h b/src/rendering/polyrenderer/scene/poly_playersprite.h similarity index 100% rename from src/polyrenderer/scene/poly_playersprite.h rename to src/rendering/polyrenderer/scene/poly_playersprite.h diff --git a/src/polyrenderer/scene/poly_portal.cpp b/src/rendering/polyrenderer/scene/poly_portal.cpp similarity index 100% rename from src/polyrenderer/scene/poly_portal.cpp rename to src/rendering/polyrenderer/scene/poly_portal.cpp diff --git a/src/polyrenderer/scene/poly_portal.h b/src/rendering/polyrenderer/scene/poly_portal.h similarity index 100% rename from src/polyrenderer/scene/poly_portal.h rename to src/rendering/polyrenderer/scene/poly_portal.h diff --git a/src/polyrenderer/scene/poly_scene.cpp b/src/rendering/polyrenderer/scene/poly_scene.cpp similarity index 100% rename from src/polyrenderer/scene/poly_scene.cpp rename to src/rendering/polyrenderer/scene/poly_scene.cpp diff --git a/src/polyrenderer/scene/poly_scene.h b/src/rendering/polyrenderer/scene/poly_scene.h similarity index 100% rename from src/polyrenderer/scene/poly_scene.h rename to src/rendering/polyrenderer/scene/poly_scene.h diff --git a/src/polyrenderer/scene/poly_sky.cpp b/src/rendering/polyrenderer/scene/poly_sky.cpp similarity index 100% rename from src/polyrenderer/scene/poly_sky.cpp rename to src/rendering/polyrenderer/scene/poly_sky.cpp diff --git a/src/polyrenderer/scene/poly_sky.h b/src/rendering/polyrenderer/scene/poly_sky.h similarity index 100% rename from src/polyrenderer/scene/poly_sky.h rename to src/rendering/polyrenderer/scene/poly_sky.h diff --git a/src/polyrenderer/scene/poly_sprite.cpp b/src/rendering/polyrenderer/scene/poly_sprite.cpp similarity index 100% rename from src/polyrenderer/scene/poly_sprite.cpp rename to src/rendering/polyrenderer/scene/poly_sprite.cpp diff --git a/src/polyrenderer/scene/poly_sprite.h b/src/rendering/polyrenderer/scene/poly_sprite.h similarity index 100% rename from src/polyrenderer/scene/poly_sprite.h rename to src/rendering/polyrenderer/scene/poly_sprite.h diff --git a/src/polyrenderer/scene/poly_wall.cpp b/src/rendering/polyrenderer/scene/poly_wall.cpp similarity index 100% rename from src/polyrenderer/scene/poly_wall.cpp rename to src/rendering/polyrenderer/scene/poly_wall.cpp diff --git a/src/polyrenderer/scene/poly_wall.h b/src/rendering/polyrenderer/scene/poly_wall.h similarity index 100% rename from src/polyrenderer/scene/poly_wall.h rename to src/rendering/polyrenderer/scene/poly_wall.h diff --git a/src/polyrenderer/scene/poly_wallsprite.cpp b/src/rendering/polyrenderer/scene/poly_wallsprite.cpp similarity index 100% rename from src/polyrenderer/scene/poly_wallsprite.cpp rename to src/rendering/polyrenderer/scene/poly_wallsprite.cpp diff --git a/src/polyrenderer/scene/poly_wallsprite.h b/src/rendering/polyrenderer/scene/poly_wallsprite.h similarity index 100% rename from src/polyrenderer/scene/poly_wallsprite.h rename to src/rendering/polyrenderer/scene/poly_wallsprite.h diff --git a/src/swrenderer/drawers/r_draw.cpp b/src/rendering/swrenderer/drawers/r_draw.cpp similarity index 100% rename from src/swrenderer/drawers/r_draw.cpp rename to src/rendering/swrenderer/drawers/r_draw.cpp diff --git a/src/swrenderer/drawers/r_draw.h b/src/rendering/swrenderer/drawers/r_draw.h similarity index 100% rename from src/swrenderer/drawers/r_draw.h rename to src/rendering/swrenderer/drawers/r_draw.h diff --git a/src/swrenderer/drawers/r_draw_pal.cpp b/src/rendering/swrenderer/drawers/r_draw_pal.cpp similarity index 100% rename from src/swrenderer/drawers/r_draw_pal.cpp rename to src/rendering/swrenderer/drawers/r_draw_pal.cpp diff --git a/src/swrenderer/drawers/r_draw_pal.h b/src/rendering/swrenderer/drawers/r_draw_pal.h similarity index 100% rename from src/swrenderer/drawers/r_draw_pal.h rename to src/rendering/swrenderer/drawers/r_draw_pal.h diff --git a/src/swrenderer/drawers/r_draw_rgba.cpp b/src/rendering/swrenderer/drawers/r_draw_rgba.cpp similarity index 100% rename from src/swrenderer/drawers/r_draw_rgba.cpp rename to src/rendering/swrenderer/drawers/r_draw_rgba.cpp diff --git a/src/swrenderer/drawers/r_draw_rgba.h b/src/rendering/swrenderer/drawers/r_draw_rgba.h similarity index 100% rename from src/swrenderer/drawers/r_draw_rgba.h rename to src/rendering/swrenderer/drawers/r_draw_rgba.h diff --git a/src/swrenderer/drawers/r_draw_sky32.h b/src/rendering/swrenderer/drawers/r_draw_sky32.h similarity index 100% rename from src/swrenderer/drawers/r_draw_sky32.h rename to src/rendering/swrenderer/drawers/r_draw_sky32.h diff --git a/src/swrenderer/drawers/r_draw_sky32_sse2.h b/src/rendering/swrenderer/drawers/r_draw_sky32_sse2.h similarity index 100% rename from src/swrenderer/drawers/r_draw_sky32_sse2.h rename to src/rendering/swrenderer/drawers/r_draw_sky32_sse2.h diff --git a/src/swrenderer/drawers/r_draw_span32.h b/src/rendering/swrenderer/drawers/r_draw_span32.h similarity index 100% rename from src/swrenderer/drawers/r_draw_span32.h rename to src/rendering/swrenderer/drawers/r_draw_span32.h diff --git a/src/swrenderer/drawers/r_draw_span32_sse2.h b/src/rendering/swrenderer/drawers/r_draw_span32_sse2.h similarity index 100% rename from src/swrenderer/drawers/r_draw_span32_sse2.h rename to src/rendering/swrenderer/drawers/r_draw_span32_sse2.h diff --git a/src/swrenderer/drawers/r_draw_sprite32.h b/src/rendering/swrenderer/drawers/r_draw_sprite32.h similarity index 100% rename from src/swrenderer/drawers/r_draw_sprite32.h rename to src/rendering/swrenderer/drawers/r_draw_sprite32.h diff --git a/src/swrenderer/drawers/r_draw_sprite32_sse2.h b/src/rendering/swrenderer/drawers/r_draw_sprite32_sse2.h similarity index 100% rename from src/swrenderer/drawers/r_draw_sprite32_sse2.h rename to src/rendering/swrenderer/drawers/r_draw_sprite32_sse2.h diff --git a/src/swrenderer/drawers/r_draw_wall32.h b/src/rendering/swrenderer/drawers/r_draw_wall32.h similarity index 100% rename from src/swrenderer/drawers/r_draw_wall32.h rename to src/rendering/swrenderer/drawers/r_draw_wall32.h diff --git a/src/swrenderer/drawers/r_draw_wall32_sse2.h b/src/rendering/swrenderer/drawers/r_draw_wall32_sse2.h similarity index 100% rename from src/swrenderer/drawers/r_draw_wall32_sse2.h rename to src/rendering/swrenderer/drawers/r_draw_wall32_sse2.h diff --git a/src/swrenderer/drawers/r_thread.cpp b/src/rendering/swrenderer/drawers/r_thread.cpp similarity index 100% rename from src/swrenderer/drawers/r_thread.cpp rename to src/rendering/swrenderer/drawers/r_thread.cpp diff --git a/src/swrenderer/drawers/r_thread.h b/src/rendering/swrenderer/drawers/r_thread.h similarity index 100% rename from src/swrenderer/drawers/r_thread.h rename to src/rendering/swrenderer/drawers/r_thread.h diff --git a/src/swrenderer/line/r_farclip_line.cpp b/src/rendering/swrenderer/line/r_farclip_line.cpp similarity index 100% rename from src/swrenderer/line/r_farclip_line.cpp rename to src/rendering/swrenderer/line/r_farclip_line.cpp diff --git a/src/swrenderer/line/r_farclip_line.h b/src/rendering/swrenderer/line/r_farclip_line.h similarity index 100% rename from src/swrenderer/line/r_farclip_line.h rename to src/rendering/swrenderer/line/r_farclip_line.h diff --git a/src/swrenderer/line/r_fogboundary.cpp b/src/rendering/swrenderer/line/r_fogboundary.cpp similarity index 100% rename from src/swrenderer/line/r_fogboundary.cpp rename to src/rendering/swrenderer/line/r_fogboundary.cpp diff --git a/src/swrenderer/line/r_fogboundary.h b/src/rendering/swrenderer/line/r_fogboundary.h similarity index 100% rename from src/swrenderer/line/r_fogboundary.h rename to src/rendering/swrenderer/line/r_fogboundary.h diff --git a/src/swrenderer/line/r_line.cpp b/src/rendering/swrenderer/line/r_line.cpp similarity index 100% rename from src/swrenderer/line/r_line.cpp rename to src/rendering/swrenderer/line/r_line.cpp diff --git a/src/swrenderer/line/r_line.h b/src/rendering/swrenderer/line/r_line.h similarity index 100% rename from src/swrenderer/line/r_line.h rename to src/rendering/swrenderer/line/r_line.h diff --git a/src/swrenderer/line/r_renderdrawsegment.cpp b/src/rendering/swrenderer/line/r_renderdrawsegment.cpp similarity index 100% rename from src/swrenderer/line/r_renderdrawsegment.cpp rename to src/rendering/swrenderer/line/r_renderdrawsegment.cpp diff --git a/src/swrenderer/line/r_renderdrawsegment.h b/src/rendering/swrenderer/line/r_renderdrawsegment.h similarity index 100% rename from src/swrenderer/line/r_renderdrawsegment.h rename to src/rendering/swrenderer/line/r_renderdrawsegment.h diff --git a/src/swrenderer/line/r_walldraw.cpp b/src/rendering/swrenderer/line/r_walldraw.cpp similarity index 100% rename from src/swrenderer/line/r_walldraw.cpp rename to src/rendering/swrenderer/line/r_walldraw.cpp diff --git a/src/swrenderer/line/r_walldraw.h b/src/rendering/swrenderer/line/r_walldraw.h similarity index 100% rename from src/swrenderer/line/r_walldraw.h rename to src/rendering/swrenderer/line/r_walldraw.h diff --git a/src/swrenderer/line/r_wallsetup.cpp b/src/rendering/swrenderer/line/r_wallsetup.cpp similarity index 100% rename from src/swrenderer/line/r_wallsetup.cpp rename to src/rendering/swrenderer/line/r_wallsetup.cpp diff --git a/src/swrenderer/line/r_wallsetup.h b/src/rendering/swrenderer/line/r_wallsetup.h similarity index 100% rename from src/swrenderer/line/r_wallsetup.h rename to src/rendering/swrenderer/line/r_wallsetup.h diff --git a/src/swrenderer/plane/r_flatplane.cpp b/src/rendering/swrenderer/plane/r_flatplane.cpp similarity index 100% rename from src/swrenderer/plane/r_flatplane.cpp rename to src/rendering/swrenderer/plane/r_flatplane.cpp diff --git a/src/swrenderer/plane/r_flatplane.h b/src/rendering/swrenderer/plane/r_flatplane.h similarity index 100% rename from src/swrenderer/plane/r_flatplane.h rename to src/rendering/swrenderer/plane/r_flatplane.h diff --git a/src/swrenderer/plane/r_planerenderer.cpp b/src/rendering/swrenderer/plane/r_planerenderer.cpp similarity index 100% rename from src/swrenderer/plane/r_planerenderer.cpp rename to src/rendering/swrenderer/plane/r_planerenderer.cpp diff --git a/src/swrenderer/plane/r_planerenderer.h b/src/rendering/swrenderer/plane/r_planerenderer.h similarity index 100% rename from src/swrenderer/plane/r_planerenderer.h rename to src/rendering/swrenderer/plane/r_planerenderer.h diff --git a/src/swrenderer/plane/r_skyplane.cpp b/src/rendering/swrenderer/plane/r_skyplane.cpp similarity index 100% rename from src/swrenderer/plane/r_skyplane.cpp rename to src/rendering/swrenderer/plane/r_skyplane.cpp diff --git a/src/swrenderer/plane/r_skyplane.h b/src/rendering/swrenderer/plane/r_skyplane.h similarity index 100% rename from src/swrenderer/plane/r_skyplane.h rename to src/rendering/swrenderer/plane/r_skyplane.h diff --git a/src/swrenderer/plane/r_slopeplane.cpp b/src/rendering/swrenderer/plane/r_slopeplane.cpp similarity index 100% rename from src/swrenderer/plane/r_slopeplane.cpp rename to src/rendering/swrenderer/plane/r_slopeplane.cpp diff --git a/src/swrenderer/plane/r_slopeplane.h b/src/rendering/swrenderer/plane/r_slopeplane.h similarity index 100% rename from src/swrenderer/plane/r_slopeplane.h rename to src/rendering/swrenderer/plane/r_slopeplane.h diff --git a/src/swrenderer/plane/r_visibleplane.cpp b/src/rendering/swrenderer/plane/r_visibleplane.cpp similarity index 100% rename from src/swrenderer/plane/r_visibleplane.cpp rename to src/rendering/swrenderer/plane/r_visibleplane.cpp diff --git a/src/swrenderer/plane/r_visibleplane.h b/src/rendering/swrenderer/plane/r_visibleplane.h similarity index 100% rename from src/swrenderer/plane/r_visibleplane.h rename to src/rendering/swrenderer/plane/r_visibleplane.h diff --git a/src/swrenderer/plane/r_visibleplanelist.cpp b/src/rendering/swrenderer/plane/r_visibleplanelist.cpp similarity index 100% rename from src/swrenderer/plane/r_visibleplanelist.cpp rename to src/rendering/swrenderer/plane/r_visibleplanelist.cpp diff --git a/src/swrenderer/plane/r_visibleplanelist.h b/src/rendering/swrenderer/plane/r_visibleplanelist.h similarity index 100% rename from src/swrenderer/plane/r_visibleplanelist.h rename to src/rendering/swrenderer/plane/r_visibleplanelist.h diff --git a/src/swrenderer/r_all.cpp b/src/rendering/swrenderer/r_all.cpp similarity index 100% rename from src/swrenderer/r_all.cpp rename to src/rendering/swrenderer/r_all.cpp diff --git a/src/swrenderer/r_memory.cpp b/src/rendering/swrenderer/r_memory.cpp similarity index 100% rename from src/swrenderer/r_memory.cpp rename to src/rendering/swrenderer/r_memory.cpp diff --git a/src/swrenderer/r_memory.h b/src/rendering/swrenderer/r_memory.h similarity index 100% rename from src/swrenderer/r_memory.h rename to src/rendering/swrenderer/r_memory.h diff --git a/src/swrenderer/r_renderthread.cpp b/src/rendering/swrenderer/r_renderthread.cpp similarity index 100% rename from src/swrenderer/r_renderthread.cpp rename to src/rendering/swrenderer/r_renderthread.cpp diff --git a/src/swrenderer/r_renderthread.h b/src/rendering/swrenderer/r_renderthread.h similarity index 100% rename from src/swrenderer/r_renderthread.h rename to src/rendering/swrenderer/r_renderthread.h diff --git a/src/swrenderer/r_swcolormaps.cpp b/src/rendering/swrenderer/r_swcolormaps.cpp similarity index 100% rename from src/swrenderer/r_swcolormaps.cpp rename to src/rendering/swrenderer/r_swcolormaps.cpp diff --git a/src/swrenderer/r_swcolormaps.h b/src/rendering/swrenderer/r_swcolormaps.h similarity index 100% rename from src/swrenderer/r_swcolormaps.h rename to src/rendering/swrenderer/r_swcolormaps.h diff --git a/src/swrenderer/r_swrenderer.cpp b/src/rendering/swrenderer/r_swrenderer.cpp similarity index 100% rename from src/swrenderer/r_swrenderer.cpp rename to src/rendering/swrenderer/r_swrenderer.cpp diff --git a/src/swrenderer/r_swrenderer.h b/src/rendering/swrenderer/r_swrenderer.h similarity index 100% rename from src/swrenderer/r_swrenderer.h rename to src/rendering/swrenderer/r_swrenderer.h diff --git a/src/swrenderer/r_swscene.cpp b/src/rendering/swrenderer/r_swscene.cpp similarity index 100% rename from src/swrenderer/r_swscene.cpp rename to src/rendering/swrenderer/r_swscene.cpp diff --git a/src/swrenderer/r_swscene.h b/src/rendering/swrenderer/r_swscene.h similarity index 100% rename from src/swrenderer/r_swscene.h rename to src/rendering/swrenderer/r_swscene.h diff --git a/src/swrenderer/scene/r_3dfloors.cpp b/src/rendering/swrenderer/scene/r_3dfloors.cpp similarity index 100% rename from src/swrenderer/scene/r_3dfloors.cpp rename to src/rendering/swrenderer/scene/r_3dfloors.cpp diff --git a/src/swrenderer/scene/r_3dfloors.h b/src/rendering/swrenderer/scene/r_3dfloors.h similarity index 100% rename from src/swrenderer/scene/r_3dfloors.h rename to src/rendering/swrenderer/scene/r_3dfloors.h diff --git a/src/swrenderer/scene/r_light.cpp b/src/rendering/swrenderer/scene/r_light.cpp similarity index 100% rename from src/swrenderer/scene/r_light.cpp rename to src/rendering/swrenderer/scene/r_light.cpp diff --git a/src/swrenderer/scene/r_light.h b/src/rendering/swrenderer/scene/r_light.h similarity index 100% rename from src/swrenderer/scene/r_light.h rename to src/rendering/swrenderer/scene/r_light.h diff --git a/src/swrenderer/scene/r_opaque_pass.cpp b/src/rendering/swrenderer/scene/r_opaque_pass.cpp similarity index 100% rename from src/swrenderer/scene/r_opaque_pass.cpp rename to src/rendering/swrenderer/scene/r_opaque_pass.cpp diff --git a/src/swrenderer/scene/r_opaque_pass.h b/src/rendering/swrenderer/scene/r_opaque_pass.h similarity index 100% rename from src/swrenderer/scene/r_opaque_pass.h rename to src/rendering/swrenderer/scene/r_opaque_pass.h diff --git a/src/swrenderer/scene/r_portal.cpp b/src/rendering/swrenderer/scene/r_portal.cpp similarity index 100% rename from src/swrenderer/scene/r_portal.cpp rename to src/rendering/swrenderer/scene/r_portal.cpp diff --git a/src/swrenderer/scene/r_portal.h b/src/rendering/swrenderer/scene/r_portal.h similarity index 100% rename from src/swrenderer/scene/r_portal.h rename to src/rendering/swrenderer/scene/r_portal.h diff --git a/src/swrenderer/scene/r_scene.cpp b/src/rendering/swrenderer/scene/r_scene.cpp similarity index 100% rename from src/swrenderer/scene/r_scene.cpp rename to src/rendering/swrenderer/scene/r_scene.cpp diff --git a/src/swrenderer/scene/r_scene.h b/src/rendering/swrenderer/scene/r_scene.h similarity index 100% rename from src/swrenderer/scene/r_scene.h rename to src/rendering/swrenderer/scene/r_scene.h diff --git a/src/swrenderer/scene/r_translucent_pass.cpp b/src/rendering/swrenderer/scene/r_translucent_pass.cpp similarity index 100% rename from src/swrenderer/scene/r_translucent_pass.cpp rename to src/rendering/swrenderer/scene/r_translucent_pass.cpp diff --git a/src/swrenderer/scene/r_translucent_pass.h b/src/rendering/swrenderer/scene/r_translucent_pass.h similarity index 100% rename from src/swrenderer/scene/r_translucent_pass.h rename to src/rendering/swrenderer/scene/r_translucent_pass.h diff --git a/src/swrenderer/segments/r_clipsegment.cpp b/src/rendering/swrenderer/segments/r_clipsegment.cpp similarity index 100% rename from src/swrenderer/segments/r_clipsegment.cpp rename to src/rendering/swrenderer/segments/r_clipsegment.cpp diff --git a/src/swrenderer/segments/r_clipsegment.h b/src/rendering/swrenderer/segments/r_clipsegment.h similarity index 100% rename from src/swrenderer/segments/r_clipsegment.h rename to src/rendering/swrenderer/segments/r_clipsegment.h diff --git a/src/swrenderer/segments/r_drawsegment.cpp b/src/rendering/swrenderer/segments/r_drawsegment.cpp similarity index 100% rename from src/swrenderer/segments/r_drawsegment.cpp rename to src/rendering/swrenderer/segments/r_drawsegment.cpp diff --git a/src/swrenderer/segments/r_drawsegment.h b/src/rendering/swrenderer/segments/r_drawsegment.h similarity index 100% rename from src/swrenderer/segments/r_drawsegment.h rename to src/rendering/swrenderer/segments/r_drawsegment.h diff --git a/src/swrenderer/segments/r_portalsegment.cpp b/src/rendering/swrenderer/segments/r_portalsegment.cpp similarity index 100% rename from src/swrenderer/segments/r_portalsegment.cpp rename to src/rendering/swrenderer/segments/r_portalsegment.cpp diff --git a/src/swrenderer/segments/r_portalsegment.h b/src/rendering/swrenderer/segments/r_portalsegment.h similarity index 100% rename from src/swrenderer/segments/r_portalsegment.h rename to src/rendering/swrenderer/segments/r_portalsegment.h diff --git a/src/swrenderer/textures/r_swtexture.cpp b/src/rendering/swrenderer/textures/r_swtexture.cpp similarity index 100% rename from src/swrenderer/textures/r_swtexture.cpp rename to src/rendering/swrenderer/textures/r_swtexture.cpp diff --git a/src/swrenderer/textures/r_swtexture.h b/src/rendering/swrenderer/textures/r_swtexture.h similarity index 100% rename from src/swrenderer/textures/r_swtexture.h rename to src/rendering/swrenderer/textures/r_swtexture.h diff --git a/src/swrenderer/textures/swcanvastexture.cpp b/src/rendering/swrenderer/textures/swcanvastexture.cpp similarity index 100% rename from src/swrenderer/textures/swcanvastexture.cpp rename to src/rendering/swrenderer/textures/swcanvastexture.cpp diff --git a/src/swrenderer/textures/warpbuffer.h b/src/rendering/swrenderer/textures/warpbuffer.h similarity index 100% rename from src/swrenderer/textures/warpbuffer.h rename to src/rendering/swrenderer/textures/warpbuffer.h diff --git a/src/swrenderer/textures/warptexture.cpp b/src/rendering/swrenderer/textures/warptexture.cpp similarity index 100% rename from src/swrenderer/textures/warptexture.cpp rename to src/rendering/swrenderer/textures/warptexture.cpp diff --git a/src/swrenderer/things/r_decal.cpp b/src/rendering/swrenderer/things/r_decal.cpp similarity index 100% rename from src/swrenderer/things/r_decal.cpp rename to src/rendering/swrenderer/things/r_decal.cpp diff --git a/src/swrenderer/things/r_decal.h b/src/rendering/swrenderer/things/r_decal.h similarity index 100% rename from src/swrenderer/things/r_decal.h rename to src/rendering/swrenderer/things/r_decal.h diff --git a/src/swrenderer/things/r_model.cpp b/src/rendering/swrenderer/things/r_model.cpp similarity index 100% rename from src/swrenderer/things/r_model.cpp rename to src/rendering/swrenderer/things/r_model.cpp diff --git a/src/swrenderer/things/r_model.h b/src/rendering/swrenderer/things/r_model.h similarity index 100% rename from src/swrenderer/things/r_model.h rename to src/rendering/swrenderer/things/r_model.h diff --git a/src/swrenderer/things/r_particle.cpp b/src/rendering/swrenderer/things/r_particle.cpp similarity index 100% rename from src/swrenderer/things/r_particle.cpp rename to src/rendering/swrenderer/things/r_particle.cpp diff --git a/src/swrenderer/things/r_particle.h b/src/rendering/swrenderer/things/r_particle.h similarity index 100% rename from src/swrenderer/things/r_particle.h rename to src/rendering/swrenderer/things/r_particle.h diff --git a/src/swrenderer/things/r_playersprite.cpp b/src/rendering/swrenderer/things/r_playersprite.cpp similarity index 100% rename from src/swrenderer/things/r_playersprite.cpp rename to src/rendering/swrenderer/things/r_playersprite.cpp diff --git a/src/swrenderer/things/r_playersprite.h b/src/rendering/swrenderer/things/r_playersprite.h similarity index 100% rename from src/swrenderer/things/r_playersprite.h rename to src/rendering/swrenderer/things/r_playersprite.h diff --git a/src/swrenderer/things/r_sprite.cpp b/src/rendering/swrenderer/things/r_sprite.cpp similarity index 100% rename from src/swrenderer/things/r_sprite.cpp rename to src/rendering/swrenderer/things/r_sprite.cpp diff --git a/src/swrenderer/things/r_sprite.h b/src/rendering/swrenderer/things/r_sprite.h similarity index 100% rename from src/swrenderer/things/r_sprite.h rename to src/rendering/swrenderer/things/r_sprite.h diff --git a/src/swrenderer/things/r_visiblesprite.cpp b/src/rendering/swrenderer/things/r_visiblesprite.cpp similarity index 100% rename from src/swrenderer/things/r_visiblesprite.cpp rename to src/rendering/swrenderer/things/r_visiblesprite.cpp diff --git a/src/swrenderer/things/r_visiblesprite.h b/src/rendering/swrenderer/things/r_visiblesprite.h similarity index 100% rename from src/swrenderer/things/r_visiblesprite.h rename to src/rendering/swrenderer/things/r_visiblesprite.h diff --git a/src/swrenderer/things/r_visiblespritelist.cpp b/src/rendering/swrenderer/things/r_visiblespritelist.cpp similarity index 100% rename from src/swrenderer/things/r_visiblespritelist.cpp rename to src/rendering/swrenderer/things/r_visiblespritelist.cpp diff --git a/src/swrenderer/things/r_visiblespritelist.h b/src/rendering/swrenderer/things/r_visiblespritelist.h similarity index 100% rename from src/swrenderer/things/r_visiblespritelist.h rename to src/rendering/swrenderer/things/r_visiblespritelist.h diff --git a/src/swrenderer/things/r_voxel.cpp b/src/rendering/swrenderer/things/r_voxel.cpp similarity index 100% rename from src/swrenderer/things/r_voxel.cpp rename to src/rendering/swrenderer/things/r_voxel.cpp diff --git a/src/swrenderer/things/r_voxel.h b/src/rendering/swrenderer/things/r_voxel.h similarity index 100% rename from src/swrenderer/things/r_voxel.h rename to src/rendering/swrenderer/things/r_voxel.h diff --git a/src/swrenderer/things/r_wallsprite.cpp b/src/rendering/swrenderer/things/r_wallsprite.cpp similarity index 100% rename from src/swrenderer/things/r_wallsprite.cpp rename to src/rendering/swrenderer/things/r_wallsprite.cpp diff --git a/src/swrenderer/things/r_wallsprite.h b/src/rendering/swrenderer/things/r_wallsprite.h similarity index 100% rename from src/swrenderer/things/r_wallsprite.h rename to src/rendering/swrenderer/things/r_wallsprite.h diff --git a/src/swrenderer/viewport/r_drawerargs.cpp b/src/rendering/swrenderer/viewport/r_drawerargs.cpp similarity index 100% rename from src/swrenderer/viewport/r_drawerargs.cpp rename to src/rendering/swrenderer/viewport/r_drawerargs.cpp diff --git a/src/swrenderer/viewport/r_drawerargs.h b/src/rendering/swrenderer/viewport/r_drawerargs.h similarity index 100% rename from src/swrenderer/viewport/r_drawerargs.h rename to src/rendering/swrenderer/viewport/r_drawerargs.h diff --git a/src/swrenderer/viewport/r_skydrawer.cpp b/src/rendering/swrenderer/viewport/r_skydrawer.cpp similarity index 100% rename from src/swrenderer/viewport/r_skydrawer.cpp rename to src/rendering/swrenderer/viewport/r_skydrawer.cpp diff --git a/src/swrenderer/viewport/r_skydrawer.h b/src/rendering/swrenderer/viewport/r_skydrawer.h similarity index 100% rename from src/swrenderer/viewport/r_skydrawer.h rename to src/rendering/swrenderer/viewport/r_skydrawer.h diff --git a/src/swrenderer/viewport/r_spandrawer.cpp b/src/rendering/swrenderer/viewport/r_spandrawer.cpp similarity index 100% rename from src/swrenderer/viewport/r_spandrawer.cpp rename to src/rendering/swrenderer/viewport/r_spandrawer.cpp diff --git a/src/swrenderer/viewport/r_spandrawer.h b/src/rendering/swrenderer/viewport/r_spandrawer.h similarity index 100% rename from src/swrenderer/viewport/r_spandrawer.h rename to src/rendering/swrenderer/viewport/r_spandrawer.h diff --git a/src/swrenderer/viewport/r_spritedrawer.cpp b/src/rendering/swrenderer/viewport/r_spritedrawer.cpp similarity index 100% rename from src/swrenderer/viewport/r_spritedrawer.cpp rename to src/rendering/swrenderer/viewport/r_spritedrawer.cpp diff --git a/src/swrenderer/viewport/r_spritedrawer.h b/src/rendering/swrenderer/viewport/r_spritedrawer.h similarity index 100% rename from src/swrenderer/viewport/r_spritedrawer.h rename to src/rendering/swrenderer/viewport/r_spritedrawer.h diff --git a/src/swrenderer/viewport/r_viewport.cpp b/src/rendering/swrenderer/viewport/r_viewport.cpp similarity index 100% rename from src/swrenderer/viewport/r_viewport.cpp rename to src/rendering/swrenderer/viewport/r_viewport.cpp diff --git a/src/swrenderer/viewport/r_viewport.h b/src/rendering/swrenderer/viewport/r_viewport.h similarity index 100% rename from src/swrenderer/viewport/r_viewport.h rename to src/rendering/swrenderer/viewport/r_viewport.h diff --git a/src/swrenderer/viewport/r_walldrawer.cpp b/src/rendering/swrenderer/viewport/r_walldrawer.cpp similarity index 100% rename from src/swrenderer/viewport/r_walldrawer.cpp rename to src/rendering/swrenderer/viewport/r_walldrawer.cpp diff --git a/src/swrenderer/viewport/r_walldrawer.h b/src/rendering/swrenderer/viewport/r_walldrawer.h similarity index 100% rename from src/swrenderer/viewport/r_walldrawer.h rename to src/rendering/swrenderer/viewport/r_walldrawer.h From 7241072b16d0409ce646c2a8ffeb0fba57f034bc Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 31 Jan 2019 20:33:52 +0100 Subject: [PATCH 127/164] - moved most utility code to a subdirectory. Again no code changes. --- src/CMakeLists.txt | 86 ++++++++++--------- src/{ => utility}/ctpl.h | 0 src/{ => utility}/earcut.hpp | 0 src/{ => utility}/files.cpp | 0 src/{ => utility}/files.h | 0 src/{ => utility}/files_decompress.cpp | 0 src/{ => utility}/m_png.cpp | 0 src/{ => utility}/m_png.h | 0 src/{ => utility}/m_random.cpp | 0 src/{ => utility}/m_random.h | 0 src/{ => utility}/m_swap.h | 0 src/{ => utility}/math/asin.c | 0 src/{ => utility}/math/atan.c | 0 src/{ => utility}/math/cmath.h | 0 src/{ => utility}/math/const.c | 0 src/{ => utility}/math/cosh.c | 0 src/{ => utility}/math/exp.c | 0 src/{ => utility}/math/fastsin.cpp | 0 src/{ => utility}/math/isnan.c | 0 src/{ => utility}/math/log.c | 0 src/{ => utility}/math/log10.c | 0 src/{ => utility}/math/mconf.h | 0 src/{ => utility}/math/mtherr.c | 0 src/{ => utility}/math/polevl.c | 0 src/{ => utility}/math/pow.c | 0 src/{ => utility}/math/powi.c | 0 src/{ => utility}/math/readme.txt | 0 src/{ => utility}/math/sin.c | 0 src/{ => utility}/math/sinh.c | 0 src/{ => utility}/math/sqrt.c | 0 src/{ => utility}/math/tan.c | 0 src/{ => utility}/math/tanh.c | 0 src/{ => utility}/md5.cpp | 0 src/{ => utility}/md5.h | 0 src/{ => utility}/memarena.cpp | 0 src/{ => utility}/memarena.h | 0 src/{ => utility/nodebuilder}/nodebuild.cpp | 0 src/{ => utility/nodebuilder}/nodebuild.h | 0 .../nodebuild_classify_nosse2.cpp | 0 .../nodebuilder}/nodebuild_events.cpp | 0 .../nodebuilder}/nodebuild_extract.cpp | 0 .../nodebuilder}/nodebuild_gl.cpp | 0 .../nodebuilder}/nodebuild_utility.cpp | 0 src/{ => utility}/parallel_for.h | 0 src/{ => utility}/rapidjson/allocators.h | 0 src/{ => utility}/rapidjson/document.h | 0 src/{ => utility}/rapidjson/encodedstream.h | 0 src/{ => utility}/rapidjson/encodings.h | 0 src/{ => utility}/rapidjson/error/en.h | 0 src/{ => utility}/rapidjson/error/error.h | 0 src/{ => utility}/rapidjson/filereadstream.h | 0 src/{ => utility}/rapidjson/filewritestream.h | 0 src/{ => utility}/rapidjson/fwd.h | 0 .../rapidjson/internal/biginteger.h | 0 src/{ => utility}/rapidjson/internal/diyfp.h | 0 src/{ => utility}/rapidjson/internal/dtoa.h | 0 .../rapidjson/internal/ieee754.h | 0 src/{ => utility}/rapidjson/internal/itoa.h | 0 src/{ => utility}/rapidjson/internal/meta.h | 0 src/{ => utility}/rapidjson/internal/pow10.h | 0 src/{ => utility}/rapidjson/internal/regex.h | 0 src/{ => utility}/rapidjson/internal/stack.h | 0 .../rapidjson/internal/strfunc.h | 0 src/{ => utility}/rapidjson/internal/strtod.h | 0 src/{ => utility}/rapidjson/internal/swap.h | 0 src/{ => utility}/rapidjson/istreamwrapper.h | 0 src/{ => utility}/rapidjson/memorybuffer.h | 0 src/{ => utility}/rapidjson/memorystream.h | 0 .../rapidjson/msinttypes/inttypes.h | 0 .../rapidjson/msinttypes/stdint.h | 0 src/{ => utility}/rapidjson/ostreamwrapper.h | 0 src/{ => utility}/rapidjson/pointer.h | 0 src/{ => utility}/rapidjson/prettywriter.h | 0 src/{ => utility}/rapidjson/rapidjson.h | 0 src/{ => utility}/rapidjson/reader.h | 0 src/{ => utility}/rapidjson/schema.h | 0 src/{ => utility}/rapidjson/stream.h | 0 src/{ => utility}/rapidjson/stringbuffer.h | 0 src/{ => utility}/rapidjson/writer.h | 0 src/{ => utility}/sc_man.cpp | 0 src/{ => utility}/sc_man.h | 0 src/{ => utility}/sc_man_scanner.re | 0 src/{ => utility}/sc_man_tokens.h | 0 src/{ => utility}/sfmt/LICENSE.txt | 0 src/{ => utility}/sfmt/SFMT-alti.h | 0 src/{ => utility}/sfmt/SFMT-params.h | 0 src/{ => utility}/sfmt/SFMT-params11213.h | 0 src/{ => utility}/sfmt/SFMT-params1279.h | 0 src/{ => utility}/sfmt/SFMT-params132049.h | 0 src/{ => utility}/sfmt/SFMT-params19937.h | 0 src/{ => utility}/sfmt/SFMT-params216091.h | 0 src/{ => utility}/sfmt/SFMT-params2281.h | 0 src/{ => utility}/sfmt/SFMT-params4253.h | 0 src/{ => utility}/sfmt/SFMT-params44497.h | 0 src/{ => utility}/sfmt/SFMT-params607.h | 0 src/{ => utility}/sfmt/SFMT-params86243.h | 0 src/{ => utility}/sfmt/SFMT-sse2.h | 0 src/{ => utility}/sfmt/SFMT.cpp | 0 src/{ => utility}/sfmt/SFMT.h | 0 src/{ => utility}/strnatcmp.c | 0 src/{ => utility}/strnatcmp.h | 0 src/{ => utility}/xs_Float.h | 0 102 files changed, 46 insertions(+), 40 deletions(-) rename src/{ => utility}/ctpl.h (100%) rename src/{ => utility}/earcut.hpp (100%) rename src/{ => utility}/files.cpp (100%) rename src/{ => utility}/files.h (100%) rename src/{ => utility}/files_decompress.cpp (100%) rename src/{ => utility}/m_png.cpp (100%) rename src/{ => utility}/m_png.h (100%) rename src/{ => utility}/m_random.cpp (100%) rename src/{ => utility}/m_random.h (100%) rename src/{ => utility}/m_swap.h (100%) rename src/{ => utility}/math/asin.c (100%) rename src/{ => utility}/math/atan.c (100%) rename src/{ => utility}/math/cmath.h (100%) rename src/{ => utility}/math/const.c (100%) rename src/{ => utility}/math/cosh.c (100%) rename src/{ => utility}/math/exp.c (100%) rename src/{ => utility}/math/fastsin.cpp (100%) rename src/{ => utility}/math/isnan.c (100%) rename src/{ => utility}/math/log.c (100%) rename src/{ => utility}/math/log10.c (100%) rename src/{ => utility}/math/mconf.h (100%) rename src/{ => utility}/math/mtherr.c (100%) rename src/{ => utility}/math/polevl.c (100%) rename src/{ => utility}/math/pow.c (100%) rename src/{ => utility}/math/powi.c (100%) rename src/{ => utility}/math/readme.txt (100%) rename src/{ => utility}/math/sin.c (100%) rename src/{ => utility}/math/sinh.c (100%) rename src/{ => utility}/math/sqrt.c (100%) rename src/{ => utility}/math/tan.c (100%) rename src/{ => utility}/math/tanh.c (100%) rename src/{ => utility}/md5.cpp (100%) rename src/{ => utility}/md5.h (100%) rename src/{ => utility}/memarena.cpp (100%) rename src/{ => utility}/memarena.h (100%) rename src/{ => utility/nodebuilder}/nodebuild.cpp (100%) rename src/{ => utility/nodebuilder}/nodebuild.h (100%) rename src/{ => utility/nodebuilder}/nodebuild_classify_nosse2.cpp (100%) rename src/{ => utility/nodebuilder}/nodebuild_events.cpp (100%) rename src/{ => utility/nodebuilder}/nodebuild_extract.cpp (100%) rename src/{ => utility/nodebuilder}/nodebuild_gl.cpp (100%) rename src/{ => utility/nodebuilder}/nodebuild_utility.cpp (100%) rename src/{ => utility}/parallel_for.h (100%) rename src/{ => utility}/rapidjson/allocators.h (100%) rename src/{ => utility}/rapidjson/document.h (100%) rename src/{ => utility}/rapidjson/encodedstream.h (100%) rename src/{ => utility}/rapidjson/encodings.h (100%) rename src/{ => utility}/rapidjson/error/en.h (100%) rename src/{ => utility}/rapidjson/error/error.h (100%) rename src/{ => utility}/rapidjson/filereadstream.h (100%) rename src/{ => utility}/rapidjson/filewritestream.h (100%) rename src/{ => utility}/rapidjson/fwd.h (100%) rename src/{ => utility}/rapidjson/internal/biginteger.h (100%) rename src/{ => utility}/rapidjson/internal/diyfp.h (100%) rename src/{ => utility}/rapidjson/internal/dtoa.h (100%) rename src/{ => utility}/rapidjson/internal/ieee754.h (100%) rename src/{ => utility}/rapidjson/internal/itoa.h (100%) rename src/{ => utility}/rapidjson/internal/meta.h (100%) rename src/{ => utility}/rapidjson/internal/pow10.h (100%) rename src/{ => utility}/rapidjson/internal/regex.h (100%) rename src/{ => utility}/rapidjson/internal/stack.h (100%) rename src/{ => utility}/rapidjson/internal/strfunc.h (100%) rename src/{ => utility}/rapidjson/internal/strtod.h (100%) rename src/{ => utility}/rapidjson/internal/swap.h (100%) rename src/{ => utility}/rapidjson/istreamwrapper.h (100%) rename src/{ => utility}/rapidjson/memorybuffer.h (100%) rename src/{ => utility}/rapidjson/memorystream.h (100%) rename src/{ => utility}/rapidjson/msinttypes/inttypes.h (100%) rename src/{ => utility}/rapidjson/msinttypes/stdint.h (100%) rename src/{ => utility}/rapidjson/ostreamwrapper.h (100%) rename src/{ => utility}/rapidjson/pointer.h (100%) rename src/{ => utility}/rapidjson/prettywriter.h (100%) rename src/{ => utility}/rapidjson/rapidjson.h (100%) rename src/{ => utility}/rapidjson/reader.h (100%) rename src/{ => utility}/rapidjson/schema.h (100%) rename src/{ => utility}/rapidjson/stream.h (100%) rename src/{ => utility}/rapidjson/stringbuffer.h (100%) rename src/{ => utility}/rapidjson/writer.h (100%) rename src/{ => utility}/sc_man.cpp (100%) rename src/{ => utility}/sc_man.h (100%) rename src/{ => utility}/sc_man_scanner.re (100%) rename src/{ => utility}/sc_man_tokens.h (100%) rename src/{ => utility}/sfmt/LICENSE.txt (100%) rename src/{ => utility}/sfmt/SFMT-alti.h (100%) rename src/{ => utility}/sfmt/SFMT-params.h (100%) rename src/{ => utility}/sfmt/SFMT-params11213.h (100%) rename src/{ => utility}/sfmt/SFMT-params1279.h (100%) rename src/{ => utility}/sfmt/SFMT-params132049.h (100%) rename src/{ => utility}/sfmt/SFMT-params19937.h (100%) rename src/{ => utility}/sfmt/SFMT-params216091.h (100%) rename src/{ => utility}/sfmt/SFMT-params2281.h (100%) rename src/{ => utility}/sfmt/SFMT-params4253.h (100%) rename src/{ => utility}/sfmt/SFMT-params44497.h (100%) rename src/{ => utility}/sfmt/SFMT-params607.h (100%) rename src/{ => utility}/sfmt/SFMT-params86243.h (100%) rename src/{ => utility}/sfmt/SFMT-sse2.h (100%) rename src/{ => utility}/sfmt/SFMT.cpp (100%) rename src/{ => utility}/sfmt/SFMT.h (100%) rename src/{ => utility}/strnatcmp.c (100%) rename src/{ => utility}/strnatcmp.h (100%) rename src/{ => utility}/xs_Float.h (100%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 1f6b54a5a..e9c8e9ae9 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -605,8 +605,8 @@ add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/zcc-parse.c ${CMAKE_CURRE DEPENDS lemon ${CMAKE_CURRENT_SOURCE_DIR}/scripting/zscript/zcc-parse.lemon ) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/sc_man_scanner.h - COMMAND re2c --no-generation-date -s -o ${CMAKE_CURRENT_BINARY_DIR}/sc_man_scanner.h ${CMAKE_CURRENT_SOURCE_DIR}/sc_man_scanner.re - DEPENDS re2c ${CMAKE_CURRENT_SOURCE_DIR}/sc_man_scanner.re ) + COMMAND re2c --no-generation-date -s -o ${CMAKE_CURRENT_BINARY_DIR}/sc_man_scanner.h ${CMAKE_CURRENT_SOURCE_DIR}/utility/sc_man_scanner.re + DEPENDS re2c ${CMAKE_CURRENT_SOURCE_DIR}/utility/sc_man_scanner.re ) include_directories( ${CMAKE_CURRENT_BINARY_DIR} ) @@ -661,9 +661,11 @@ file( GLOB HEADER_FILES win32/*.h r_data/*.h r_data/models/*.h - rapidjson/*.h + utility/rapidjson/*.h resourcefiles/*.h - sfmt/*.h + utility/sfmt/*.h + utility/math./*h + utility/*.h sound/*.h textures/*.h textures/hires/hqnx/*.h @@ -790,7 +792,7 @@ set( NOT_COMPILED_SOURCE_FILES ${SWRENDER_SOURCES} ${POLYRENDER_SOURCES} sc_man_scanner.h - sc_man_scanner.re + utility/sc_man_scanner.re g_statusbar/sbarinfo_commands.cpp xlat/xlat_parser.y xlat_parser.c @@ -909,8 +911,6 @@ set (PCH_SOURCES dsectoreffect.cpp dthinker.cpp f_wipe.cpp - files.cpp - files_decompress.cpp g_cvars.cpp g_doomedmap.cpp g_dumpinfo.cpp @@ -934,17 +934,7 @@ set (PCH_SOURCES m_cheat.cpp m_joy.cpp m_misc.cpp - m_png.cpp - m_random.cpp - memarena.cpp - md5.cpp name.cpp - nodebuild.cpp - nodebuild_classify_nosse2.cpp - nodebuild_events.cpp - nodebuild_extract.cpp - nodebuild_gl.cpp - nodebuild_utility.cpp p_3dfloors.cpp p_3dmidtex.cpp p_acs.cpp @@ -990,7 +980,6 @@ set (PCH_SOURCES s_sndseq.cpp s_sound.cpp serializer.cpp - sc_man.cpp scriptutil.cpp st_stuff.cpp statistics.cpp @@ -1191,7 +1180,7 @@ set (PCH_SOURCES scripting/zscript/ast.cpp scripting/zscript/zcc_compile.cpp scripting/zscript/zcc_parser.cpp - sfmt/SFMT.cpp + utility/sfmt/SFMT.cpp sound/i_music.cpp sound/i_sound.cpp sound/i_soundfont.cpp @@ -1260,6 +1249,19 @@ set (PCH_SOURCES rendering/swrenderer/textures/warptexture.cpp rendering/swrenderer/textures/swcanvastexture.cpp events.cpp + utility/files.cpp + utility/files_decompress.cpp + utility/m_png.cpp + utility/m_random.cpp + utility/memarena.cpp + utility/md5.cpp + utility/nodebuilder/nodebuild.cpp + utility/nodebuilder/nodebuild_classify_nosse2.cpp + utility/nodebuilder/nodebuild_events.cpp + utility/nodebuilder/nodebuild_extract.cpp + utility/nodebuilder/nodebuild_gl.cpp + utility/nodebuilder/nodebuild_utility.cpp + utility/sc_man.cpp ) enable_precompiled_headers( g_pch.h PCH_SOURCES ) @@ -1273,32 +1275,32 @@ add_executable( zdoom WIN32 MACOSX_BUNDLE ${FASTMATH_SOURCES} ${PCH_SOURCES} x86.cpp - strnatcmp.c + utility/strnatcmp.c zstring.cpp - math/asin.c - math/atan.c - math/const.c - math/cosh.c - math/exp.c - math/isnan.c - math/log.c - math/log10.c - math/mtherr.c - math/polevl.c - math/pow.c - math/powi.c - math/sin.c - math/sinh.c - math/sqrt.c - math/tan.c - math/tanh.c - math/fastsin.cpp + utility/math/asin.c + utility/math/atan.c + utility/math/const.c + utility/math/cosh.c + utility/math/exp.c + utility/math/isnan.c + utility/math/log.c + utility/math/log10.c + utility/math/mtherr.c + utility/math/polevl.c + utility/math/pow.c + utility/math/powi.c + utility/math/sin.c + utility/math/sinh.c + utility/math/sqrt.c + utility/math/tan.c + utility/math/tanh.c + utility/math/fastsin.cpp zzautozend.cpp ) set_source_files_properties( ${FASTMATH_SOURCES} PROPERTIES COMPILE_FLAGS ${ZD_FASTMATH_FLAG} ) set_source_files_properties( xlat/parse_xlat.cpp PROPERTIES OBJECT_DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/xlat_parser.c" ) -set_source_files_properties( sc_man.cpp PROPERTIES OBJECT_DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/sc_man_scanner.h" ) +set_source_files_properties( utility/sc_man.cpp PROPERTIES OBJECT_DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/sc_man_scanner.h" ) set_source_files_properties( ${NOT_COMPILED_SOURCE_FILES} PROPERTIES HEADER_FILE_ONLY TRUE ) @@ -1327,6 +1329,8 @@ include_directories( . sound/timidity sound/wildmidi xlat + utility + utility/nodebuilder scripting scripting/vm ../gdtoa @@ -1493,8 +1497,10 @@ source_group("Scripting\\ZScript frontend" REGULAR_EXPRESSION "^${CMAKE_CURRENT_ source_group("Scripting\\Compiler backend" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/scripting/backend/.+") source_group("Scripting\\VM" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/scripting/vm/.+") source_group("Scripting" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/scripting/.+") +source_group("Utility" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/utility/.+") +source_group("Utility\\Node Builder" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/utility/nodebuilder/.+") source_group("Shared Game" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/g_shared/.+") source_group("Statusbar" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/g_statusbar/.+") source_group("Versioning" FILES version.h win32/zdoom.rc) source_group("Xlat" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/xlat/.+" FILES ${CMAKE_CURRENT_BINARY_DIR}/xlat_parser.c ${CMAKE_CURRENT_BINARY_DIR}/xlat_parser.h) -source_group("Source Files" FILES ${CMAKE_CURRENT_BINARY_DIR}/sc_man_scanner.h sc_man_scanner.re) +source_group("Source Files" FILES ${CMAKE_CURRENT_BINARY_DIR}/sc_man_scanner.h utility/sc_man_scanner.re) diff --git a/src/ctpl.h b/src/utility/ctpl.h similarity index 100% rename from src/ctpl.h rename to src/utility/ctpl.h diff --git a/src/earcut.hpp b/src/utility/earcut.hpp similarity index 100% rename from src/earcut.hpp rename to src/utility/earcut.hpp diff --git a/src/files.cpp b/src/utility/files.cpp similarity index 100% rename from src/files.cpp rename to src/utility/files.cpp diff --git a/src/files.h b/src/utility/files.h similarity index 100% rename from src/files.h rename to src/utility/files.h diff --git a/src/files_decompress.cpp b/src/utility/files_decompress.cpp similarity index 100% rename from src/files_decompress.cpp rename to src/utility/files_decompress.cpp diff --git a/src/m_png.cpp b/src/utility/m_png.cpp similarity index 100% rename from src/m_png.cpp rename to src/utility/m_png.cpp diff --git a/src/m_png.h b/src/utility/m_png.h similarity index 100% rename from src/m_png.h rename to src/utility/m_png.h diff --git a/src/m_random.cpp b/src/utility/m_random.cpp similarity index 100% rename from src/m_random.cpp rename to src/utility/m_random.cpp diff --git a/src/m_random.h b/src/utility/m_random.h similarity index 100% rename from src/m_random.h rename to src/utility/m_random.h diff --git a/src/m_swap.h b/src/utility/m_swap.h similarity index 100% rename from src/m_swap.h rename to src/utility/m_swap.h diff --git a/src/math/asin.c b/src/utility/math/asin.c similarity index 100% rename from src/math/asin.c rename to src/utility/math/asin.c diff --git a/src/math/atan.c b/src/utility/math/atan.c similarity index 100% rename from src/math/atan.c rename to src/utility/math/atan.c diff --git a/src/math/cmath.h b/src/utility/math/cmath.h similarity index 100% rename from src/math/cmath.h rename to src/utility/math/cmath.h diff --git a/src/math/const.c b/src/utility/math/const.c similarity index 100% rename from src/math/const.c rename to src/utility/math/const.c diff --git a/src/math/cosh.c b/src/utility/math/cosh.c similarity index 100% rename from src/math/cosh.c rename to src/utility/math/cosh.c diff --git a/src/math/exp.c b/src/utility/math/exp.c similarity index 100% rename from src/math/exp.c rename to src/utility/math/exp.c diff --git a/src/math/fastsin.cpp b/src/utility/math/fastsin.cpp similarity index 100% rename from src/math/fastsin.cpp rename to src/utility/math/fastsin.cpp diff --git a/src/math/isnan.c b/src/utility/math/isnan.c similarity index 100% rename from src/math/isnan.c rename to src/utility/math/isnan.c diff --git a/src/math/log.c b/src/utility/math/log.c similarity index 100% rename from src/math/log.c rename to src/utility/math/log.c diff --git a/src/math/log10.c b/src/utility/math/log10.c similarity index 100% rename from src/math/log10.c rename to src/utility/math/log10.c diff --git a/src/math/mconf.h b/src/utility/math/mconf.h similarity index 100% rename from src/math/mconf.h rename to src/utility/math/mconf.h diff --git a/src/math/mtherr.c b/src/utility/math/mtherr.c similarity index 100% rename from src/math/mtherr.c rename to src/utility/math/mtherr.c diff --git a/src/math/polevl.c b/src/utility/math/polevl.c similarity index 100% rename from src/math/polevl.c rename to src/utility/math/polevl.c diff --git a/src/math/pow.c b/src/utility/math/pow.c similarity index 100% rename from src/math/pow.c rename to src/utility/math/pow.c diff --git a/src/math/powi.c b/src/utility/math/powi.c similarity index 100% rename from src/math/powi.c rename to src/utility/math/powi.c diff --git a/src/math/readme.txt b/src/utility/math/readme.txt similarity index 100% rename from src/math/readme.txt rename to src/utility/math/readme.txt diff --git a/src/math/sin.c b/src/utility/math/sin.c similarity index 100% rename from src/math/sin.c rename to src/utility/math/sin.c diff --git a/src/math/sinh.c b/src/utility/math/sinh.c similarity index 100% rename from src/math/sinh.c rename to src/utility/math/sinh.c diff --git a/src/math/sqrt.c b/src/utility/math/sqrt.c similarity index 100% rename from src/math/sqrt.c rename to src/utility/math/sqrt.c diff --git a/src/math/tan.c b/src/utility/math/tan.c similarity index 100% rename from src/math/tan.c rename to src/utility/math/tan.c diff --git a/src/math/tanh.c b/src/utility/math/tanh.c similarity index 100% rename from src/math/tanh.c rename to src/utility/math/tanh.c diff --git a/src/md5.cpp b/src/utility/md5.cpp similarity index 100% rename from src/md5.cpp rename to src/utility/md5.cpp diff --git a/src/md5.h b/src/utility/md5.h similarity index 100% rename from src/md5.h rename to src/utility/md5.h diff --git a/src/memarena.cpp b/src/utility/memarena.cpp similarity index 100% rename from src/memarena.cpp rename to src/utility/memarena.cpp diff --git a/src/memarena.h b/src/utility/memarena.h similarity index 100% rename from src/memarena.h rename to src/utility/memarena.h diff --git a/src/nodebuild.cpp b/src/utility/nodebuilder/nodebuild.cpp similarity index 100% rename from src/nodebuild.cpp rename to src/utility/nodebuilder/nodebuild.cpp diff --git a/src/nodebuild.h b/src/utility/nodebuilder/nodebuild.h similarity index 100% rename from src/nodebuild.h rename to src/utility/nodebuilder/nodebuild.h diff --git a/src/nodebuild_classify_nosse2.cpp b/src/utility/nodebuilder/nodebuild_classify_nosse2.cpp similarity index 100% rename from src/nodebuild_classify_nosse2.cpp rename to src/utility/nodebuilder/nodebuild_classify_nosse2.cpp diff --git a/src/nodebuild_events.cpp b/src/utility/nodebuilder/nodebuild_events.cpp similarity index 100% rename from src/nodebuild_events.cpp rename to src/utility/nodebuilder/nodebuild_events.cpp diff --git a/src/nodebuild_extract.cpp b/src/utility/nodebuilder/nodebuild_extract.cpp similarity index 100% rename from src/nodebuild_extract.cpp rename to src/utility/nodebuilder/nodebuild_extract.cpp diff --git a/src/nodebuild_gl.cpp b/src/utility/nodebuilder/nodebuild_gl.cpp similarity index 100% rename from src/nodebuild_gl.cpp rename to src/utility/nodebuilder/nodebuild_gl.cpp diff --git a/src/nodebuild_utility.cpp b/src/utility/nodebuilder/nodebuild_utility.cpp similarity index 100% rename from src/nodebuild_utility.cpp rename to src/utility/nodebuilder/nodebuild_utility.cpp diff --git a/src/parallel_for.h b/src/utility/parallel_for.h similarity index 100% rename from src/parallel_for.h rename to src/utility/parallel_for.h diff --git a/src/rapidjson/allocators.h b/src/utility/rapidjson/allocators.h similarity index 100% rename from src/rapidjson/allocators.h rename to src/utility/rapidjson/allocators.h diff --git a/src/rapidjson/document.h b/src/utility/rapidjson/document.h similarity index 100% rename from src/rapidjson/document.h rename to src/utility/rapidjson/document.h diff --git a/src/rapidjson/encodedstream.h b/src/utility/rapidjson/encodedstream.h similarity index 100% rename from src/rapidjson/encodedstream.h rename to src/utility/rapidjson/encodedstream.h diff --git a/src/rapidjson/encodings.h b/src/utility/rapidjson/encodings.h similarity index 100% rename from src/rapidjson/encodings.h rename to src/utility/rapidjson/encodings.h diff --git a/src/rapidjson/error/en.h b/src/utility/rapidjson/error/en.h similarity index 100% rename from src/rapidjson/error/en.h rename to src/utility/rapidjson/error/en.h diff --git a/src/rapidjson/error/error.h b/src/utility/rapidjson/error/error.h similarity index 100% rename from src/rapidjson/error/error.h rename to src/utility/rapidjson/error/error.h diff --git a/src/rapidjson/filereadstream.h b/src/utility/rapidjson/filereadstream.h similarity index 100% rename from src/rapidjson/filereadstream.h rename to src/utility/rapidjson/filereadstream.h diff --git a/src/rapidjson/filewritestream.h b/src/utility/rapidjson/filewritestream.h similarity index 100% rename from src/rapidjson/filewritestream.h rename to src/utility/rapidjson/filewritestream.h diff --git a/src/rapidjson/fwd.h b/src/utility/rapidjson/fwd.h similarity index 100% rename from src/rapidjson/fwd.h rename to src/utility/rapidjson/fwd.h diff --git a/src/rapidjson/internal/biginteger.h b/src/utility/rapidjson/internal/biginteger.h similarity index 100% rename from src/rapidjson/internal/biginteger.h rename to src/utility/rapidjson/internal/biginteger.h diff --git a/src/rapidjson/internal/diyfp.h b/src/utility/rapidjson/internal/diyfp.h similarity index 100% rename from src/rapidjson/internal/diyfp.h rename to src/utility/rapidjson/internal/diyfp.h diff --git a/src/rapidjson/internal/dtoa.h b/src/utility/rapidjson/internal/dtoa.h similarity index 100% rename from src/rapidjson/internal/dtoa.h rename to src/utility/rapidjson/internal/dtoa.h diff --git a/src/rapidjson/internal/ieee754.h b/src/utility/rapidjson/internal/ieee754.h similarity index 100% rename from src/rapidjson/internal/ieee754.h rename to src/utility/rapidjson/internal/ieee754.h diff --git a/src/rapidjson/internal/itoa.h b/src/utility/rapidjson/internal/itoa.h similarity index 100% rename from src/rapidjson/internal/itoa.h rename to src/utility/rapidjson/internal/itoa.h diff --git a/src/rapidjson/internal/meta.h b/src/utility/rapidjson/internal/meta.h similarity index 100% rename from src/rapidjson/internal/meta.h rename to src/utility/rapidjson/internal/meta.h diff --git a/src/rapidjson/internal/pow10.h b/src/utility/rapidjson/internal/pow10.h similarity index 100% rename from src/rapidjson/internal/pow10.h rename to src/utility/rapidjson/internal/pow10.h diff --git a/src/rapidjson/internal/regex.h b/src/utility/rapidjson/internal/regex.h similarity index 100% rename from src/rapidjson/internal/regex.h rename to src/utility/rapidjson/internal/regex.h diff --git a/src/rapidjson/internal/stack.h b/src/utility/rapidjson/internal/stack.h similarity index 100% rename from src/rapidjson/internal/stack.h rename to src/utility/rapidjson/internal/stack.h diff --git a/src/rapidjson/internal/strfunc.h b/src/utility/rapidjson/internal/strfunc.h similarity index 100% rename from src/rapidjson/internal/strfunc.h rename to src/utility/rapidjson/internal/strfunc.h diff --git a/src/rapidjson/internal/strtod.h b/src/utility/rapidjson/internal/strtod.h similarity index 100% rename from src/rapidjson/internal/strtod.h rename to src/utility/rapidjson/internal/strtod.h diff --git a/src/rapidjson/internal/swap.h b/src/utility/rapidjson/internal/swap.h similarity index 100% rename from src/rapidjson/internal/swap.h rename to src/utility/rapidjson/internal/swap.h diff --git a/src/rapidjson/istreamwrapper.h b/src/utility/rapidjson/istreamwrapper.h similarity index 100% rename from src/rapidjson/istreamwrapper.h rename to src/utility/rapidjson/istreamwrapper.h diff --git a/src/rapidjson/memorybuffer.h b/src/utility/rapidjson/memorybuffer.h similarity index 100% rename from src/rapidjson/memorybuffer.h rename to src/utility/rapidjson/memorybuffer.h diff --git a/src/rapidjson/memorystream.h b/src/utility/rapidjson/memorystream.h similarity index 100% rename from src/rapidjson/memorystream.h rename to src/utility/rapidjson/memorystream.h diff --git a/src/rapidjson/msinttypes/inttypes.h b/src/utility/rapidjson/msinttypes/inttypes.h similarity index 100% rename from src/rapidjson/msinttypes/inttypes.h rename to src/utility/rapidjson/msinttypes/inttypes.h diff --git a/src/rapidjson/msinttypes/stdint.h b/src/utility/rapidjson/msinttypes/stdint.h similarity index 100% rename from src/rapidjson/msinttypes/stdint.h rename to src/utility/rapidjson/msinttypes/stdint.h diff --git a/src/rapidjson/ostreamwrapper.h b/src/utility/rapidjson/ostreamwrapper.h similarity index 100% rename from src/rapidjson/ostreamwrapper.h rename to src/utility/rapidjson/ostreamwrapper.h diff --git a/src/rapidjson/pointer.h b/src/utility/rapidjson/pointer.h similarity index 100% rename from src/rapidjson/pointer.h rename to src/utility/rapidjson/pointer.h diff --git a/src/rapidjson/prettywriter.h b/src/utility/rapidjson/prettywriter.h similarity index 100% rename from src/rapidjson/prettywriter.h rename to src/utility/rapidjson/prettywriter.h diff --git a/src/rapidjson/rapidjson.h b/src/utility/rapidjson/rapidjson.h similarity index 100% rename from src/rapidjson/rapidjson.h rename to src/utility/rapidjson/rapidjson.h diff --git a/src/rapidjson/reader.h b/src/utility/rapidjson/reader.h similarity index 100% rename from src/rapidjson/reader.h rename to src/utility/rapidjson/reader.h diff --git a/src/rapidjson/schema.h b/src/utility/rapidjson/schema.h similarity index 100% rename from src/rapidjson/schema.h rename to src/utility/rapidjson/schema.h diff --git a/src/rapidjson/stream.h b/src/utility/rapidjson/stream.h similarity index 100% rename from src/rapidjson/stream.h rename to src/utility/rapidjson/stream.h diff --git a/src/rapidjson/stringbuffer.h b/src/utility/rapidjson/stringbuffer.h similarity index 100% rename from src/rapidjson/stringbuffer.h rename to src/utility/rapidjson/stringbuffer.h diff --git a/src/rapidjson/writer.h b/src/utility/rapidjson/writer.h similarity index 100% rename from src/rapidjson/writer.h rename to src/utility/rapidjson/writer.h diff --git a/src/sc_man.cpp b/src/utility/sc_man.cpp similarity index 100% rename from src/sc_man.cpp rename to src/utility/sc_man.cpp diff --git a/src/sc_man.h b/src/utility/sc_man.h similarity index 100% rename from src/sc_man.h rename to src/utility/sc_man.h diff --git a/src/sc_man_scanner.re b/src/utility/sc_man_scanner.re similarity index 100% rename from src/sc_man_scanner.re rename to src/utility/sc_man_scanner.re diff --git a/src/sc_man_tokens.h b/src/utility/sc_man_tokens.h similarity index 100% rename from src/sc_man_tokens.h rename to src/utility/sc_man_tokens.h diff --git a/src/sfmt/LICENSE.txt b/src/utility/sfmt/LICENSE.txt similarity index 100% rename from src/sfmt/LICENSE.txt rename to src/utility/sfmt/LICENSE.txt diff --git a/src/sfmt/SFMT-alti.h b/src/utility/sfmt/SFMT-alti.h similarity index 100% rename from src/sfmt/SFMT-alti.h rename to src/utility/sfmt/SFMT-alti.h diff --git a/src/sfmt/SFMT-params.h b/src/utility/sfmt/SFMT-params.h similarity index 100% rename from src/sfmt/SFMT-params.h rename to src/utility/sfmt/SFMT-params.h diff --git a/src/sfmt/SFMT-params11213.h b/src/utility/sfmt/SFMT-params11213.h similarity index 100% rename from src/sfmt/SFMT-params11213.h rename to src/utility/sfmt/SFMT-params11213.h diff --git a/src/sfmt/SFMT-params1279.h b/src/utility/sfmt/SFMT-params1279.h similarity index 100% rename from src/sfmt/SFMT-params1279.h rename to src/utility/sfmt/SFMT-params1279.h diff --git a/src/sfmt/SFMT-params132049.h b/src/utility/sfmt/SFMT-params132049.h similarity index 100% rename from src/sfmt/SFMT-params132049.h rename to src/utility/sfmt/SFMT-params132049.h diff --git a/src/sfmt/SFMT-params19937.h b/src/utility/sfmt/SFMT-params19937.h similarity index 100% rename from src/sfmt/SFMT-params19937.h rename to src/utility/sfmt/SFMT-params19937.h diff --git a/src/sfmt/SFMT-params216091.h b/src/utility/sfmt/SFMT-params216091.h similarity index 100% rename from src/sfmt/SFMT-params216091.h rename to src/utility/sfmt/SFMT-params216091.h diff --git a/src/sfmt/SFMT-params2281.h b/src/utility/sfmt/SFMT-params2281.h similarity index 100% rename from src/sfmt/SFMT-params2281.h rename to src/utility/sfmt/SFMT-params2281.h diff --git a/src/sfmt/SFMT-params4253.h b/src/utility/sfmt/SFMT-params4253.h similarity index 100% rename from src/sfmt/SFMT-params4253.h rename to src/utility/sfmt/SFMT-params4253.h diff --git a/src/sfmt/SFMT-params44497.h b/src/utility/sfmt/SFMT-params44497.h similarity index 100% rename from src/sfmt/SFMT-params44497.h rename to src/utility/sfmt/SFMT-params44497.h diff --git a/src/sfmt/SFMT-params607.h b/src/utility/sfmt/SFMT-params607.h similarity index 100% rename from src/sfmt/SFMT-params607.h rename to src/utility/sfmt/SFMT-params607.h diff --git a/src/sfmt/SFMT-params86243.h b/src/utility/sfmt/SFMT-params86243.h similarity index 100% rename from src/sfmt/SFMT-params86243.h rename to src/utility/sfmt/SFMT-params86243.h diff --git a/src/sfmt/SFMT-sse2.h b/src/utility/sfmt/SFMT-sse2.h similarity index 100% rename from src/sfmt/SFMT-sse2.h rename to src/utility/sfmt/SFMT-sse2.h diff --git a/src/sfmt/SFMT.cpp b/src/utility/sfmt/SFMT.cpp similarity index 100% rename from src/sfmt/SFMT.cpp rename to src/utility/sfmt/SFMT.cpp diff --git a/src/sfmt/SFMT.h b/src/utility/sfmt/SFMT.h similarity index 100% rename from src/sfmt/SFMT.h rename to src/utility/sfmt/SFMT.h diff --git a/src/strnatcmp.c b/src/utility/strnatcmp.c similarity index 100% rename from src/strnatcmp.c rename to src/utility/strnatcmp.c diff --git a/src/strnatcmp.h b/src/utility/strnatcmp.h similarity index 100% rename from src/strnatcmp.h rename to src/utility/strnatcmp.h diff --git a/src/xs_Float.h b/src/utility/xs_Float.h similarity index 100% rename from src/xs_Float.h rename to src/utility/xs_Float.h From b40c709b663b6b0bd1e135469ee0c53b5c46d9e4 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 31 Jan 2019 20:42:36 +0100 Subject: [PATCH 128/164] - minor corrections. --- src/CMakeLists.txt | 5 ++++- src/g_statusbar/sbarinfo.cpp | 2 +- src/utility/m_png.cpp | 1 - src/utility/m_random.cpp | 1 - 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e9c8e9ae9..ec2a360c3 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1453,7 +1453,7 @@ source_group("Rendering\\Hardware Renderer\\Scene" REGULAR_EXPRESSION "^${CMAKE_ source_group("Rendering\\Hardware Renderer\\Shaders" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/hwrenderer/shaders/.+") source_group("Rendering\\Hardware Renderer\\System" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/hwrenderer/system/.+") source_group("Rendering\\Hardware Renderer\\Textures" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/hwrenderer/textures/.+") -source_group("Rendering\\Hardware Renderer\\Utilities" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/hwrenderer/utility/.+") +source_group("Rendering\\Hardware Renderer\\Utilities" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/hwrenderer/utility/.+") source_group("Rendering\\OpenGL Loader" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/gl_load/.+") source_group("Rendering\\OpenGL Renderer" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/gl/.+") source_group("Rendering\\OpenGL Renderer\\Data" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/gl/data/.+") @@ -1499,6 +1499,9 @@ source_group("Scripting\\VM" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/sc source_group("Scripting" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/scripting/.+") source_group("Utility" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/utility/.+") source_group("Utility\\Node Builder" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/utility/nodebuilder/.+") +source_group("Utility\\Math" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/utility/math/.+") +source_group("Utility\\RapidJSON" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/utility/rapidjson/.+") +source_group("Utility\\SFMT" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/utility/sfmt/.+") source_group("Shared Game" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/g_shared/.+") source_group("Statusbar" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/g_statusbar/.+") source_group("Versioning" FILES version.h win32/zdoom.rc) diff --git a/src/g_statusbar/sbarinfo.cpp b/src/g_statusbar/sbarinfo.cpp index 60c68448f..22f6d9ae4 100644 --- a/src/g_statusbar/sbarinfo.cpp +++ b/src/g_statusbar/sbarinfo.cpp @@ -47,7 +47,7 @@ #include "gstrings.h" #include "g_levellocals.h" #include "vm.h" -#include "i_system.h""" +#include "i_system.h" #define ARTIFLASH_OFFSET (statusBar->invBarOffset+6) enum diff --git a/src/utility/m_png.cpp b/src/utility/m_png.cpp index 06cf4ce2e..df2ec5860 100644 --- a/src/utility/m_png.cpp +++ b/src/utility/m_png.cpp @@ -44,7 +44,6 @@ #include "m_swap.h" #include "c_cvars.h" #include "r_defs.h" -#include "v_video.h" #include "m_png.h" // MACROS ------------------------------------------------------------------ diff --git a/src/utility/m_random.cpp b/src/utility/m_random.cpp index 5b77bccaf..9a765b851 100644 --- a/src/utility/m_random.cpp +++ b/src/utility/m_random.cpp @@ -62,7 +62,6 @@ #include "doomstat.h" #include "m_random.h" #include "serializer.h" -#include "b_bot.h" #include "m_crc32.h" #include "c_dispatch.h" From 65c2c318fb2ef2deec0fcf9d5479782db7b2c57e Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 31 Jan 2019 22:22:39 +0100 Subject: [PATCH 129/164] - prettification of p_teleport.cpp and some include cleanup. --- src/g_dumpinfo.cpp | 8 ++++++ src/p_secnodes.cpp | 2 +- src/p_sectors.cpp | 23 ++++++++--------- src/p_switch.cpp | 2 -- src/p_tags.cpp | 8 ------ src/p_teleport.cpp | 64 +++++++++++++++++++++++++++++++++------------- 6 files changed, 66 insertions(+), 41 deletions(-) diff --git a/src/g_dumpinfo.cpp b/src/g_dumpinfo.cpp index 39fc5a549..84a296d27 100644 --- a/src/g_dumpinfo.cpp +++ b/src/g_dumpinfo.cpp @@ -240,5 +240,13 @@ CCMD(printsections) } } +CCMD(dumptags) +{ + for (auto Level : AllLevels()) + { + Level->tagManager.DumpTags(); + } +} + diff --git a/src/p_secnodes.cpp b/src/p_secnodes.cpp index 3b3c1fced..bdbc99eab 100644 --- a/src/p_secnodes.cpp +++ b/src/p_secnodes.cpp @@ -346,7 +346,7 @@ portnode_t *P_AddPortalnode(FLinePortal *s, AActor *thing, portnode_t *nextnode) { portnode_t *node; - if (s == 0) + if (s == nullptr) { I_FatalError("AddSecnode of 0 for %s\n", thing->GetClass()->TypeName.GetChars()); } diff --git a/src/p_sectors.cpp b/src/p_sectors.cpp index b9e17dd5e..41bf380d1 100644 --- a/src/p_sectors.cpp +++ b/src/p_sectors.cpp @@ -71,6 +71,17 @@ #include "g_levellocals.h" #include "vm.h" +//========================================================================== +// +// +// +//========================================================================== + +CUSTOM_CVAR(Int, r_fakecontrast, true, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) +{ + if (self < 0) self = 1; + else if (self > 2) self = 2; +} // [RH] // P_NextSpecialSector() @@ -1465,18 +1476,6 @@ void subsector_t::BuildPolyBSP() } } -//========================================================================== -// -// -// -//========================================================================== - -CUSTOM_CVAR(Int, r_fakecontrast, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) -{ - if (self < 0) self = 1; - else if (self > 2) self = 2; -} - //=========================================================================== // // diff --git a/src/p_switch.cpp b/src/p_switch.cpp index 375249c5c..2e092b5c3 100644 --- a/src/p_switch.cpp +++ b/src/p_switch.cpp @@ -39,10 +39,8 @@ #include "p_lnspec.h" #include "p_3dmidtex.h" #include "m_random.h" -#include "g_game.h" #include "s_sound.h" #include "doomstat.h" -#include "r_state.h" #include "serializer.h" #include "p_maputl.h" #include "p_spec.h" diff --git a/src/p_tags.cpp b/src/p_tags.cpp index 35d6902a8..ae5ba5727 100644 --- a/src/p_tags.cpp +++ b/src/p_tags.cpp @@ -314,14 +314,6 @@ void FTagManager::DumpTags() } } -CCMD(dumptags) -{ - for (auto Level : AllLevels()) - { - Level->tagManager.DumpTags(); - } -} - //----------------------------------------------------------------------------- // // RETURN NEXT SECTOR # THAT LINE TAG REFERS TO diff --git a/src/p_teleport.cpp b/src/p_teleport.cpp index 8bbdd7a61..a426a4edd 100644 --- a/src/p_teleport.cpp +++ b/src/p_teleport.cpp @@ -26,23 +26,13 @@ // //----------------------------------------------------------------------------- - -#include "templates.h" -#include "doomtype.h" -#include "doomdef.h" -#include "s_sound.h" -#include "p_local.h" -#include "p_terrain.h" -#include "r_state.h" -#include "gi.h" -#include "a_sharedglobal.h" -#include "doomstat.h" #include "d_player.h" -#include "p_maputl.h" -#include "r_utility.h" -#include "p_spec.h" -#include "g_levellocals.h" +#include "doomdef.h" #include "vm.h" +#include "g_levellocals.h" +#include "p_maputl.h" +#include "gi.h" +#include "r_utility.h" #define FUDGEFACTOR 10 @@ -89,9 +79,11 @@ DEFINE_ACTION_FUNCTION(AActor, SpawnTeleportFog) return 0; } +//----------------------------------------------------------------------------- // // TELEPORTATION // +//----------------------------------------------------------------------------- bool P_Teleport (AActor *thing, DVector3 pos, DAngle angle, int flags) { @@ -235,6 +227,12 @@ DEFINE_ACTION_FUNCTION(AActor, Teleport) ACTION_RETURN_BOOL(P_Teleport(self, DVector3(x, y, z), an, flags)); } +//----------------------------------------------------------------------------- +// +// +// +//----------------------------------------------------------------------------- + AActor *FLevelLocals::SelectTeleDest (int tid, int tag, bool norandom) { AActor *searcher; @@ -330,6 +328,12 @@ AActor *FLevelLocals::SelectTeleDest (int tid, int tag, bool norandom) return NULL; } +//----------------------------------------------------------------------------- +// +// +// +//----------------------------------------------------------------------------- + bool FLevelLocals::EV_Teleport (int tid, int tag, line_t *line, int side, AActor *thing, int flags) { AActor *searcher; @@ -377,7 +381,7 @@ bool FLevelLocals::EV_Teleport (int tid, int tag, line_t *line, int side, AActor z = searcher->Z(); } - else if (searcher->IsKindOf (PClass::FindClass(NAME_TeleportDest2))) + else if (searcher->IsKindOf (NAME_TeleportDest2)) { z = searcher->Z(); } @@ -413,15 +417,18 @@ bool FLevelLocals::EV_Teleport (int tid, int tag, line_t *line, int side, AActor return false; } +//----------------------------------------------------------------------------- // // Silent linedef-based TELEPORTATION, by Lee Killough // Primarily for rooms-over-rooms etc. // This is the complete player-preserving kind of teleporter. // It has advantages over the teleporter with thing exits. // - // [RH] Modified to support different source and destination ids. // [RH] Modified some more to be accurate. +// +//----------------------------------------------------------------------------- + bool FLevelLocals::EV_SilentLineTeleport (line_t *line, int side, AActor *thing, int id, INTBOOL reverse) { int i; @@ -599,7 +606,12 @@ bool FLevelLocals::EV_SilentLineTeleport (line_t *line, int side, AActor *thing, return false; } +//----------------------------------------------------------------------------- +// // [RH] Teleport anything matching other_tid to dest_tid +// +//----------------------------------------------------------------------------- + bool FLevelLocals::EV_TeleportOther (int other_tid, int dest_tid, bool fog) { bool didSomething = false; @@ -619,6 +631,12 @@ bool FLevelLocals::EV_TeleportOther (int other_tid, int dest_tid, bool fog) return didSomething; } +//----------------------------------------------------------------------------- +// +// +// +//----------------------------------------------------------------------------- + bool DoGroupForOne (AActor *victim, AActor *source, AActor *dest, bool floorz, bool fog) { DAngle an = dest->Angles.Yaw - source->Angles.Yaw; @@ -636,8 +654,13 @@ bool DoGroupForOne (AActor *victim, AActor *source, AActor *dest, bool floorz, b return res; } +//----------------------------------------------------------------------------- +// // [RH] Teleport a group of actors centered around source_tid so // that they become centered around dest_tid instead. +// +//----------------------------------------------------------------------------- + bool FLevelLocals::EV_TeleportGroup (int group_tid, AActor *victim, int source_tid, int dest_tid, bool moveSource, bool fog) { AActor *sourceOrigin, *destOrigin; @@ -690,9 +713,14 @@ bool FLevelLocals::EV_TeleportGroup (int group_tid, AActor *victim, int source_t return didSomething; } +//----------------------------------------------------------------------------- +// // [RH] Teleport a group of actors in a sector. Source_tid is used as a // reference point so that they end up in the same position relative to // dest_tid. Group_tid can be used to not teleport all actors in the sector. +// +//----------------------------------------------------------------------------- + bool FLevelLocals::EV_TeleportSector (int tag, int source_tid, int dest_tid, bool fog, int group_tid) { AActor *sourceOrigin, *destOrigin; @@ -714,7 +742,7 @@ bool FLevelLocals::EV_TeleportSector (int tag, int source_tid, int dest_tid, boo } bool didSomething = false; - bool floorz = !destOrigin->IsKindOf (PClass::FindClass("TeleportDest2")); + bool floorz = !destOrigin->IsKindOf(NAME_TeleportDest2); int secnum; secnum = -1; From 5010e613092dc5ac017df55b051abf599e804c98 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 31 Jan 2019 22:31:41 +0100 Subject: [PATCH 130/164] - moved a few more play files free of global state references to g_shared. --- src/CMakeLists.txt | 14 +++++++------- src/{ => g_shared}/dsectoreffect.cpp | 0 src/{ => g_shared}/dsectoreffect.h | 0 src/{ => g_shared}/p_secnodes.cpp | 0 src/{ => g_shared}/p_sectors.cpp | 0 src/{ => g_shared}/p_sight.cpp | 0 src/{ => g_shared}/p_switch.cpp | 0 src/{ => g_shared}/p_tags.cpp | 0 src/{ => g_shared}/p_tags.h | 0 src/{ => g_shared}/p_teleport.cpp | 0 10 files changed, 7 insertions(+), 7 deletions(-) rename src/{ => g_shared}/dsectoreffect.cpp (100%) rename src/{ => g_shared}/dsectoreffect.h (100%) rename src/{ => g_shared}/p_secnodes.cpp (100%) rename src/{ => g_shared}/p_sectors.cpp (100%) rename src/{ => g_shared}/p_sight.cpp (100%) rename src/{ => g_shared}/p_switch.cpp (100%) rename src/{ => g_shared}/p_tags.cpp (100%) rename src/{ => g_shared}/p_tags.h (100%) rename src/{ => g_shared}/p_teleport.cpp (100%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ec2a360c3..dff262f26 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -908,7 +908,6 @@ set (PCH_SOURCES dobjgc.cpp dobjtype.cpp doomstat.cpp - dsectoreffect.cpp dthinker.cpp f_wipe.cpp g_cvars.cpp @@ -952,15 +951,9 @@ set (PCH_SOURCES p_openmap.cpp p_pspr.cpp p_saveg.cpp - p_secnodes.cpp - p_sectors.cpp p_setup.cpp - p_sight.cpp p_spec.cpp p_states.cpp - p_switch.cpp - p_tags.cpp - p_teleport.cpp p_terrain.cpp p_things.cpp p_tick.cpp @@ -1020,6 +1013,13 @@ set (PCH_SOURCES g_shared/a_plats.cpp g_shared/a_pusher.cpp g_shared/a_scroll.cpp + g_shared/dsectoreffect.cpp + g_shared/p_secnodes.cpp + g_shared/p_sectors.cpp + g_shared/p_sight.cpp + g_shared/p_switch.cpp + g_shared/p_tags.cpp + g_shared/p_teleport.cpp g_statusbar/hudmessages.cpp g_statusbar/shared_hud.cpp g_statusbar/sbarinfo.cpp diff --git a/src/dsectoreffect.cpp b/src/g_shared/dsectoreffect.cpp similarity index 100% rename from src/dsectoreffect.cpp rename to src/g_shared/dsectoreffect.cpp diff --git a/src/dsectoreffect.h b/src/g_shared/dsectoreffect.h similarity index 100% rename from src/dsectoreffect.h rename to src/g_shared/dsectoreffect.h diff --git a/src/p_secnodes.cpp b/src/g_shared/p_secnodes.cpp similarity index 100% rename from src/p_secnodes.cpp rename to src/g_shared/p_secnodes.cpp diff --git a/src/p_sectors.cpp b/src/g_shared/p_sectors.cpp similarity index 100% rename from src/p_sectors.cpp rename to src/g_shared/p_sectors.cpp diff --git a/src/p_sight.cpp b/src/g_shared/p_sight.cpp similarity index 100% rename from src/p_sight.cpp rename to src/g_shared/p_sight.cpp diff --git a/src/p_switch.cpp b/src/g_shared/p_switch.cpp similarity index 100% rename from src/p_switch.cpp rename to src/g_shared/p_switch.cpp diff --git a/src/p_tags.cpp b/src/g_shared/p_tags.cpp similarity index 100% rename from src/p_tags.cpp rename to src/g_shared/p_tags.cpp diff --git a/src/p_tags.h b/src/g_shared/p_tags.h similarity index 100% rename from src/p_tags.h rename to src/g_shared/p_tags.h diff --git a/src/p_teleport.cpp b/src/g_shared/p_teleport.cpp similarity index 100% rename from src/p_teleport.cpp rename to src/g_shared/p_teleport.cpp From 18fb7fdd81358bbf4b6942e84979b55290d1cd88 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 1 Feb 2019 00:14:31 +0100 Subject: [PATCH 131/164] - moved some diagnostic CCMDs to g_dumpinfo.cpp. --- src/g_cvars.cpp | 20 ++++++++++++++- src/g_dumpinfo.cpp | 57 ++++++++++++++++++++++++++++++++++++++++++ src/p_3dfloors.cpp | 33 ------------------------ src/p_destructible.cpp | 1 - src/p_effect.cpp | 21 +--------------- src/portal.cpp | 28 --------------------- src/skins.h | 4 --- src/tagitem.h | 0 8 files changed, 77 insertions(+), 87 deletions(-) delete mode 100644 src/skins.h delete mode 100644 src/tagitem.h diff --git a/src/g_cvars.cpp b/src/g_cvars.cpp index 3fc48ff86..67d18179f 100644 --- a/src/g_cvars.cpp +++ b/src/g_cvars.cpp @@ -35,6 +35,7 @@ #include "c_cvars.h" #include "g_levellocals.h" +#include "g_game.h" CVAR (Bool, cl_spreaddecals, true, CVAR_ARCHIVE) CVAR(Bool, var_pushers, true, CVAR_SERVERINFO); @@ -88,6 +89,23 @@ CUSTOM_CVAR (Int, cl_maxdecals, 1024, CVAR_ARCHIVE) } +// [BC] Allow the maximum number of particles to be specified by a cvar (so people +// with lots of nice hardware can have lots of particles!). +CUSTOM_CVAR(Int, r_maxparticles, 4000, CVAR_ARCHIVE) +{ + if (self == 0) + self = 4000; + else if (self > 65535) + self = 65535; + else if (self < 100) + self = 100; - + if (gamestate != GS_STARTUP) + { + for (auto Level : AllLevels()) + { + P_InitParticles(Level); + } + } +} diff --git a/src/g_dumpinfo.cpp b/src/g_dumpinfo.cpp index 84a296d27..9501b452f 100644 --- a/src/g_dumpinfo.cpp +++ b/src/g_dumpinfo.cpp @@ -40,6 +40,7 @@ #include "d_net.h" #include "p_setup.h" #include "w_wad.h" +#include "v_text.h" //========================================================================== // @@ -250,3 +251,59 @@ CCMD(dumptags) +CCMD(dump3df) +{ + if (argv.argc() > 1) + { + // Print 3D floor info for a single sector. + // This only checks the primary level. + int sec = (int)strtoll(argv[1], NULL, 10); + if ((unsigned)sec >= currentUILevel->sectors.Size()) + { + Printf("Sector %d does not exist.\n", sec); + return; + } + sector_t *sector = ¤tUILevel->sectors[sec]; + TArray & ffloors = sector->e->XFloor.ffloors; + + for (unsigned int i = 0; i < ffloors.Size(); i++) + { + double height = ffloors[i]->top.plane->ZatPoint(sector->centerspot); + double bheight = ffloors[i]->bottom.plane->ZatPoint(sector->centerspot); + + IGNORE_FORMAT_PRE + Printf("FFloor %d @ top = %f (model = %d), bottom = %f (model = %d), flags = %B, alpha = %d %s %s\n", + i, height, ffloors[i]->top.model->sectornum, + bheight, ffloors[i]->bottom.model->sectornum, + ffloors[i]->flags, ffloors[i]->alpha, (ffloors[i]->flags&FF_EXISTS) ? "Exists" : "", (ffloors[i]->flags&FF_DYNAMIC) ? "Dynamic" : ""); + IGNORE_FORMAT_POST + } + } +} + +//============================================================================ +// +// print the group link table to the console +// +//============================================================================ + +CCMD(dumplinktable) +{ + for (auto Level : AllLevels()) + { + Printf("Portal displacements for %s:\n", Level->MapName.GetChars()); + for (int x = 1; x < Level->Displacements.size; x++) + { + for (int y = 1; y < Level->Displacements.size; y++) + { + FDisplacement &disp = Level->Displacements(x, y); + Printf("%c%c(%6d, %6d)", TEXTCOLOR_ESCAPE, 'C' + disp.indirect, int(disp.pos.X), int(disp.pos.Y)); + } + Printf("\n"); + } + } +} + + + + diff --git a/src/p_3dfloors.cpp b/src/p_3dfloors.cpp index d132da69f..1d3e2d4c5 100644 --- a/src/p_3dfloors.cpp +++ b/src/p_3dfloors.cpp @@ -46,7 +46,6 @@ #include "p_spec.h" #include "g_levellocals.h" #include "actorinlines.h" -#include "maploader/maploader.h" //========================================================================== // @@ -859,35 +858,3 @@ int P_Find3DFloor(sector_t * sec, const DVector3 &pos, bool above, bool floor, d return -1; } -#include "c_dispatch.h" - - -CCMD (dump3df) -{ - if (argv.argc() > 1) - { - // Print 3D floor info for a single sector. - // This only checks the primary level. - int sec = (int)strtoll(argv[1], NULL, 10); - if ((unsigned)sec >= currentUILevel->sectors.Size()) - { - Printf("Sector %d does not exist.\n", sec); - return; - } - sector_t *sector = ¤tUILevel->sectors[sec]; - TArray & ffloors=sector->e->XFloor.ffloors; - - for (unsigned int i = 0; i < ffloors.Size(); i++) - { - double height=ffloors[i]->top.plane->ZatPoint(sector->centerspot); - double bheight=ffloors[i]->bottom.plane->ZatPoint(sector->centerspot); - - IGNORE_FORMAT_PRE - Printf("FFloor %d @ top = %f (model = %d), bottom = %f (model = %d), flags = %B, alpha = %d %s %s\n", - i, height, ffloors[i]->top.model->sectornum, - bheight, ffloors[i]->bottom.model->sectornum, - ffloors[i]->flags, ffloors[i]->alpha, (ffloors[i]->flags&FF_EXISTS)? "Exists":"", (ffloors[i]->flags&FF_DYNAMIC)? "Dynamic":""); - IGNORE_FORMAT_POST - } - } -} diff --git a/src/p_destructible.cpp b/src/p_destructible.cpp index 5a9c56448..4794b7ed4 100755 --- a/src/p_destructible.cpp +++ b/src/p_destructible.cpp @@ -37,7 +37,6 @@ #include "actor.h" #include "p_trace.h" #include "p_lnspec.h" -#include "r_sky.h" #include "p_local.h" #include "p_maputl.h" #include "c_cvars.h" diff --git a/src/p_effect.cpp b/src/p_effect.cpp index 073d6d9b8..82c4e40b1 100644 --- a/src/p_effect.cpp +++ b/src/p_effect.cpp @@ -55,6 +55,7 @@ CVAR (Bool, r_rail_smartspiral, 0, CVAR_ARCHIVE); CVAR (Int, r_rail_spiralsparsity, 1, CVAR_ARCHIVE); CVAR (Int, r_rail_trailsparsity, 1, CVAR_ARCHIVE); CVAR (Bool, r_particles, true, 0); +EXTERN_CVAR(Int, r_maxparticles); FRandom pr_railtrail("RailTrail"); @@ -116,26 +117,6 @@ inline particle_t *NewParticle (FLevelLocals *Level) // void P_InitParticles (FLevelLocals *); -// [BC] Allow the maximum number of particles to be specified by a cvar (so people -// with lots of nice hardware can have lots of particles!). -CUSTOM_CVAR( Int, r_maxparticles, 4000, CVAR_ARCHIVE ) -{ - if ( self == 0 ) - self = 4000; - else if (self > 65535) - self = 65535; - else if (self < 100) - self = 100; - - if ( gamestate != GS_STARTUP ) - { - for (auto Level : AllLevels()) - { - P_InitParticles(Level); - } - } -} - void P_InitParticles (FLevelLocals *Level) { const char *i; diff --git a/src/portal.cpp b/src/portal.cpp index 6cca8385d..5a9c8b3a6 100644 --- a/src/portal.cpp +++ b/src/portal.cpp @@ -1198,31 +1198,3 @@ bool FLevelLocals::CollectConnectedGroups(int startgroup, const DVector3 &positi } return retval; } - - -//============================================================================ -// -// print the group link table to the console -// -//============================================================================ - -CCMD(dumplinktable) -{ - for (auto Level : AllLevels()) - { - Printf("Portal displacements for %s:\n", Level->MapName.GetChars()); - for (int x = 1; x < Level->Displacements.size; x++) - { - for (int y = 1; y < Level->Displacements.size; y++) - { - FDisplacement &disp = Level->Displacements(x, y); - Printf("%c%c(%6d, %6d)", TEXTCOLOR_ESCAPE, 'C' + disp.indirect, int(disp.pos.X), int(disp.pos.Y)); - } - Printf("\n"); - } - } -} - - - - diff --git a/src/skins.h b/src/skins.h deleted file mode 100644 index 8ce1f99cb..000000000 --- a/src/skins.h +++ /dev/null @@ -1,4 +0,0 @@ -#ifndef __SKINS_H__ -#define __SKINS_H__ - -#endif //__SKINS_H__ diff --git a/src/tagitem.h b/src/tagitem.h deleted file mode 100644 index e69de29bb..000000000 From e3eaa5964de0c0c81ab0b4276b0e6eed331f90b3 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 1 Feb 2019 00:30:21 +0100 Subject: [PATCH 132/164] - removed v_video.h include from portals.h This has no business in a play related file which also made no use of it. --- src/actor.h | 1 + src/am_map.cpp | 1 + src/c_cmds.cpp | 1 + src/c_cvars.cpp | 2 +- src/ct_chat.cpp | 1 + src/menu/menu.cpp | 1 + src/menu/menudef.cpp | 1 + src/p_conversation.cpp | 1 + src/p_setup.cpp | 1 + src/p_user.cpp | 1 + src/portal.h | 1 - src/r_data/gldefs.cpp | 1 + src/rendering/gl/system/gl_buffers.cpp | 1 + src/rendering/hwrenderer/data/flatvertices.cpp | 1 + src/rendering/hwrenderer/dynlights/hw_shadowmap.cpp | 1 + src/rendering/hwrenderer/models/hw_models.h | 1 + src/rendering/hwrenderer/scene/hw_skydome.h | 1 + src/rendering/hwrenderer/textures/hw_precache.cpp | 1 + src/scripting/backend/codegen.cpp | 1 + src/scripting/decorate/thingdef_parse.cpp | 1 + src/scripting/thingdef_properties.cpp | 1 + src/scripting/vmthunks.cpp | 1 + src/scripting/zscript/zcc_compile.cpp | 1 + 23 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/actor.h b/src/actor.h index 3394789fb..c82b5de75 100644 --- a/src/actor.h +++ b/src/actor.h @@ -55,6 +55,7 @@ struct visstyle_t; class FLightDefaults; struct FSection; struct FLevelLocals; +struct FDynamicLight; // // NOTES: AActor // diff --git a/src/am_map.cpp b/src/am_map.cpp index 4a5520a9e..795840218 100644 --- a/src/am_map.cpp +++ b/src/am_map.cpp @@ -47,6 +47,7 @@ #include "d_player.h" #include "p_blockmap.h" #include "g_game.h" +#include "v_video.h" #include "m_cheat.h" #include "c_dispatch.h" diff --git a/src/c_cmds.cpp b/src/c_cmds.cpp index 995677209..44ddbe3e4 100644 --- a/src/c_cmds.cpp +++ b/src/c_cmds.cpp @@ -67,6 +67,7 @@ #include "r_utility.h" #include "c_functions.h" #include "g_levellocals.h" +#include "v_video.h" extern FILE *Logfile; extern bool insave; diff --git a/src/c_cvars.cpp b/src/c_cvars.cpp index 667e811a0..bda309361 100644 --- a/src/c_cvars.cpp +++ b/src/c_cvars.cpp @@ -42,7 +42,7 @@ #include "g_game.h" #include "d_player.h" - +#include "v_video.h" #include "d_netinf.h" #include "menu/menu.h" diff --git a/src/ct_chat.cpp b/src/ct_chat.cpp index 5a8878eb2..31dd40f8a 100644 --- a/src/ct_chat.cpp +++ b/src/ct_chat.cpp @@ -38,6 +38,7 @@ #include "d_net.h" #include "d_event.h" #include "sbar.h" +#include "v_video.h" #define QUEUESIZE 128 #define MESSAGESIZE 128 diff --git a/src/menu/menu.cpp b/src/menu/menu.cpp index a61733a2d..6689f771b 100644 --- a/src/menu/menu.cpp +++ b/src/menu/menu.cpp @@ -51,6 +51,7 @@ #include "menu/menu.h" #include "vm.h" #include "events.h" +#include "v_video.h" #include "scripting/types.h" int DMenu::InMenu; diff --git a/src/menu/menudef.cpp b/src/menu/menudef.cpp index f085f79b7..409db4ba3 100644 --- a/src/menu/menudef.cpp +++ b/src/menu/menudef.cpp @@ -46,6 +46,7 @@ #include "m_argv.h" #include "i_soundfont.h" #include "i_system.h" +#include "v_video.h" void ClearSaveGames(); diff --git a/src/p_conversation.cpp b/src/p_conversation.cpp index e2185104a..ff5f8241e 100644 --- a/src/p_conversation.cpp +++ b/src/p_conversation.cpp @@ -55,6 +55,7 @@ #include "menu/menu.h" #include "g_levellocals.h" #include "vm.h" +#include "v_video.h" #include "actorinlines.h" // The conversations as they exist inside a SCRIPTxx lump. diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 2c5d1551c..20655a223 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -73,6 +73,7 @@ #include "p_acs.h" #include "am_map.h" #include "i_system.h" +#include "v_video.h" #include "fragglescript/t_script.h" extern AActor *SpawnMapThing (int index, FMapThing *mthing, int position); diff --git a/src/p_user.cpp b/src/p_user.cpp index 487a68806..a7ad96c27 100644 --- a/src/p_user.cpp +++ b/src/p_user.cpp @@ -90,6 +90,7 @@ #include "p_acs.h" #include "events.h" #include "g_game.h" +#include "v_video.h" static FRandom pr_skullpop ("SkullPop"); diff --git a/src/portal.h b/src/portal.h index 58093476f..b5e2b7a1b 100644 --- a/src/portal.h +++ b/src/portal.h @@ -2,7 +2,6 @@ #define _PORTALS_H_ #include "basictypes.h" -#include "v_video.h" #include "m_bbox.h" struct FPortalGroupArray; diff --git a/src/r_data/gldefs.cpp b/src/r_data/gldefs.cpp index ae7f11519..be4645699 100644 --- a/src/r_data/gldefs.cpp +++ b/src/r_data/gldefs.cpp @@ -43,6 +43,7 @@ #include "v_text.h" #include "g_levellocals.h" #include "a_dynlight.h" +#include "v_video.h" #include "textures/skyboxtexture.h" #include "hwrenderer/postprocessing/hw_postprocessshader.h" #include "hwrenderer/textures/hw_material.h" diff --git a/src/rendering/gl/system/gl_buffers.cpp b/src/rendering/gl/system/gl_buffers.cpp index 39535fd03..6306f1033 100644 --- a/src/rendering/gl/system/gl_buffers.cpp +++ b/src/rendering/gl/system/gl_buffers.cpp @@ -27,6 +27,7 @@ #include "gl_load/gl_system.h" #include "gl_buffers.h" #include "gl/renderer/gl_renderstate.h" +#include "v_video.h" namespace OpenGLRenderer { diff --git a/src/rendering/hwrenderer/data/flatvertices.cpp b/src/rendering/hwrenderer/data/flatvertices.cpp index d185240fb..2d956e5e2 100644 --- a/src/rendering/hwrenderer/data/flatvertices.cpp +++ b/src/rendering/hwrenderer/data/flatvertices.cpp @@ -31,6 +31,7 @@ #include "c_cvars.h" #include "g_levellocals.h" #include "flatvertices.h" +#include "v_video.h" #include "cmdlib.h" #include "hwrenderer/data/buffers.h" #include "hwrenderer/scene/hw_renderstate.h" diff --git a/src/rendering/hwrenderer/dynlights/hw_shadowmap.cpp b/src/rendering/hwrenderer/dynlights/hw_shadowmap.cpp index 5bed01063..74a60a452 100644 --- a/src/rendering/hwrenderer/dynlights/hw_shadowmap.cpp +++ b/src/rendering/hwrenderer/dynlights/hw_shadowmap.cpp @@ -26,6 +26,7 @@ #include "hwrenderer/data/buffers.h" #include "stats.h" #include "g_levellocals.h" +#include "v_video.h" /* The 1D shadow maps are stored in a 1024x1024 texture as float depth values (R32F). diff --git a/src/rendering/hwrenderer/models/hw_models.h b/src/rendering/hwrenderer/models/hw_models.h index 4d2086acf..e3ee0b6a7 100644 --- a/src/rendering/hwrenderer/models/hw_models.h +++ b/src/rendering/hwrenderer/models/hw_models.h @@ -26,6 +26,7 @@ #include "p_pspr.h" #include "r_data/voxels.h" #include "r_data/models/models.h" +#include "hwrenderer/data/buffers.h" class GLSprite; struct HWDrawInfo; diff --git a/src/rendering/hwrenderer/scene/hw_skydome.h b/src/rendering/hwrenderer/scene/hw_skydome.h index 8f2c9ca8d..fc850aeeb 100644 --- a/src/rendering/hwrenderer/scene/hw_skydome.h +++ b/src/rendering/hwrenderer/scene/hw_skydome.h @@ -2,6 +2,7 @@ #include "v_palette.h" #include "r_data/matrix.h" +#include "hwrenderer/data/buffers.h" class FMaterial; class FRenderState; diff --git a/src/rendering/hwrenderer/textures/hw_precache.cpp b/src/rendering/hwrenderer/textures/hw_precache.cpp index dc6829dd6..3a1ea46c6 100644 --- a/src/rendering/hwrenderer/textures/hw_precache.cpp +++ b/src/rendering/hwrenderer/textures/hw_precache.cpp @@ -34,6 +34,7 @@ #include "textures/skyboxtexture.h" #include "hwrenderer/textures/hw_material.h" #include "image.h" +#include "v_video.h" //========================================================================== diff --git a/src/scripting/backend/codegen.cpp b/src/scripting/backend/codegen.cpp index 6b5a4b9f8..495518f18 100644 --- a/src/scripting/backend/codegen.cpp +++ b/src/scripting/backend/codegen.cpp @@ -48,6 +48,7 @@ #include "w_wad.h" #include "doomstat.h" #include "g_levellocals.h" +#include "v_video.h" extern FRandom pr_exrandom; FMemArena FxAlloc(65536); diff --git a/src/scripting/decorate/thingdef_parse.cpp b/src/scripting/decorate/thingdef_parse.cpp index 24360b165..68ab70cac 100644 --- a/src/scripting/decorate/thingdef_parse.cpp +++ b/src/scripting/decorate/thingdef_parse.cpp @@ -47,6 +47,7 @@ #include "w_wad.h" #include "v_text.h" #include "m_argv.h" +#include "v_video.h" void ParseOldDecoration(FScanner &sc, EDefinitionType def, PNamespace *ns); EXTERN_CVAR(Bool, strictdecorate); diff --git a/src/scripting/thingdef_properties.cpp b/src/scripting/thingdef_properties.cpp index 5cf0ebb0b..8f9916818 100644 --- a/src/scripting/thingdef_properties.cpp +++ b/src/scripting/thingdef_properties.cpp @@ -55,6 +55,7 @@ #include "g_levellocals.h" #include "types.h" #include "a_dynlight.h" +#include "v_video.h" //========================================================================== // diff --git a/src/scripting/vmthunks.cpp b/src/scripting/vmthunks.cpp index e6cf8b3c8..e78707413 100644 --- a/src/scripting/vmthunks.cpp +++ b/src/scripting/vmthunks.cpp @@ -48,6 +48,7 @@ #include "p_setup.h" #include "i_music.h" #include "am_map.h" +#include "v_video.h" DVector2 AM_GetPosition(); int Net_GetLatency(int *ld, int *ad); diff --git a/src/scripting/zscript/zcc_compile.cpp b/src/scripting/zscript/zcc_compile.cpp index 53362669c..13959c7bb 100644 --- a/src/scripting/zscript/zcc_compile.cpp +++ b/src/scripting/zscript/zcc_compile.cpp @@ -41,6 +41,7 @@ #include "zcc_compile.h" #include "v_text.h" #include "p_lnspec.h" +#include "v_video.h" FSharedStringArena VMStringConstants; bool isActor(PContainerType *type); From b77e83e0b9aee10aed46845a5d2e6d5541c261b4 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 1 Feb 2019 00:48:21 +0100 Subject: [PATCH 133/164] - moved 15 more files to g_shared. --- CMakeSettings.json | 47 + externs.txt | 21073 +++++++++++++++++++++++ externs.zip | Bin 0 -> 246757 bytes p_destructible.cpp | 1073 ++ p_destructible.h | 43 + src/CMakeLists.txt | 16 +- src/{ => g_shared}/actorptrselect.cpp | 0 src/{ => g_shared}/actorptrselect.h | 0 src/{ => g_shared}/dthinker.cpp | 0 src/{ => g_shared}/dthinker.h | 0 src/{ => g_shared}/p_3dfloors.cpp | 0 src/{ => g_shared}/p_3dfloors.h | 0 src/{ => g_shared}/p_3dmidtex.cpp | 0 src/{ => g_shared}/p_3dmidtex.h | 0 src/{ => g_shared}/p_linkedsectors.cpp | 0 src/{ => g_shared}/p_trace.cpp | 0 src/{ => g_shared}/p_trace.h | 0 src/{ => g_shared}/po_man.cpp | 0 src/{ => g_shared}/po_man.h | 0 src/{ => g_shared}/portal.cpp | 0 src/{ => g_shared}/portal.h | 0 21 files changed, 22244 insertions(+), 8 deletions(-) create mode 100644 CMakeSettings.json create mode 100644 externs.txt create mode 100644 externs.zip create mode 100644 p_destructible.cpp create mode 100644 p_destructible.h rename src/{ => g_shared}/actorptrselect.cpp (100%) rename src/{ => g_shared}/actorptrselect.h (100%) rename src/{ => g_shared}/dthinker.cpp (100%) rename src/{ => g_shared}/dthinker.h (100%) rename src/{ => g_shared}/p_3dfloors.cpp (100%) rename src/{ => g_shared}/p_3dfloors.h (100%) rename src/{ => g_shared}/p_3dmidtex.cpp (100%) rename src/{ => g_shared}/p_3dmidtex.h (100%) rename src/{ => g_shared}/p_linkedsectors.cpp (100%) rename src/{ => g_shared}/p_trace.cpp (100%) rename src/{ => g_shared}/p_trace.h (100%) rename src/{ => g_shared}/po_man.cpp (100%) rename src/{ => g_shared}/po_man.h (100%) rename src/{ => g_shared}/portal.cpp (100%) rename src/{ => g_shared}/portal.h (100%) diff --git a/CMakeSettings.json b/CMakeSettings.json new file mode 100644 index 000000000..8710296e4 --- /dev/null +++ b/CMakeSettings.json @@ -0,0 +1,47 @@ +{ + "configurations": [ + { + "name": "x64-Release", + "generator": "Ninja", + "configurationType": "Release", + "inheritEnvironments": [ "msvc_x64_x64" ], + "buildRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\build\\${name}", + "installRoot": "${env.USERPROFILE}\\CMakeBuilds\\${workspaceHash}\\install\\${name}", + "cmakeCommandArgs": "", + "buildCommandArgs": "-v", + "ctestCommandArgs": "", + "variables": [ + { + "name": "ZDOOM_GENERATE_ASM", + "value": "True", + "type": "BOOL" + }, + { + "name": "ZDOOM_GENERATE_MAPFILE", + "value": "True", + "type": "BOOL" + }, + { + "name": "ZDOOM_OUTPUT_OLDSTYLE", + "value": "True", + "type": "BOOL" + }, + { + "name": "JPEG_INCLUDE_DIR", + "value": "c:\\Programming\\vcpkg\\packages\\libjpeg-turbo_x64-windows-static\\include\\", + "type": "PATH" + }, + { + "name": "JPEG_LIBRARY_DEBUG", + "value": "c:\\Programming\\vcpkg\\packages\\libjpeg-turbo_x64-windows-static\\lib\\jpeg.lib", + "type": "FILEPATH" + }, + { + "name": "JPEG_LIBRARY_RELEASE", + "value": "c:\\Programming\\vcpkg\\packages\\libjpeg-turbo_x64-windows-static\\lib\\jpeg.lib", + "type": "FILEPATH" + } + ] + } + ] +} \ No newline at end of file diff --git a/externs.txt b/externs.txt new file mode 100644 index 000000000..e157f790a --- /dev/null +++ b/externs.txt @@ -0,0 +1,21073 @@ +Search "EXTRN" (20592 hits in 480 files) + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\a_action.cod (12 hits) + Line 17: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 63: EXTRN atexit:PROC + Line 64: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 65: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 66: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 67: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 68: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 69: EXTRN ?P_DropItem@@YAPEAVAActor@@PEAV1@PEAVPClassActor@@HH@Z:PROC ; P_DropItem + Line 70: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 71: EXTRN memmove:PROC + Line 72: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 73: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\a_decals.cod (65 hits) + Line 29: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 30: EXTRN ?RegistrationInfo@DThinker@@2UClassReg@@A:BYTE ; DThinker::RegistrationInfo + Line 31: EXTRN ?DecalLibrary@@3VFDecalLib@@A:BYTE ; DecalLibrary + Line 190: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 191: EXTRN atexit:PROC + Line 192: EXTRN __std_terminate:PROC + Line 193: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 194: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 195: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 196: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 197: EXTRN c_sqrt:PROC + Line 198: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 199: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 200: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 201: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 202: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 203: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 204: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 205: EXTRN ?Link@FThinkerCollection@@QEAAXPEAVDThinker@@H@Z:PROC ; FThinkerCollection::Link + Line 206: EXTRN ?StaticType@DThinker@@UEBAPEAVPClass@@XZ:PROC ; DThinker::StaticType + Line 207: EXTRN ?OnDestroy@DThinker@@UEAAXXZ:PROC ; DThinker::OnDestroy + Line 208: EXTRN ??1DThinker@@UEAA@XZ:PROC ; DThinker::~DThinker + Line 209: EXTRN ?Tick@DThinker@@UEAAXXZ:PROC ; DThinker::Tick + Line 210: EXTRN ?PostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::PostBeginPlay + Line 211: EXTRN ?CallPostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::CallPostBeginPlay + Line 212: EXTRN ?PostSerialize@DThinker@@UEAAXXZ:PROC ; DThinker::PostSerialize + Line 213: EXTRN ?Serialize@DThinker@@UEAAXAEAVFSerializer@@@Z:PROC ; DThinker::Serialize + Line 214: EXTRN ?PropagateMark@DThinker@@UEAA_KXZ:PROC ; DThinker::PropagateMark + Line 215: EXTRN ??_EDThinker@@UEAAPEAXI@Z:PROC ; DThinker::`vector deleting destructor' + Line 216: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 217: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 218: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 219: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 220: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 221: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 222: EXTRN ?Pick@FColorMatcher@@QEAAEHHH@Z:PROC ; FColorMatcher::Pick + Line 223: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAVFTextureID@@PEAV2@@Z:PROC ; Serialize + Line 224: EXTRN ??_EDBaseDecal@@UEAAPEAXI@Z:PROC ; DBaseDecal::`vector deleting destructor' + Line 225: EXTRN ??_EDImpactDecal@@UEAAPEAXI@Z:PROC ; DImpactDecal::`vector deleting destructor' + Line 226: EXTRN ?Trace@@YA_NAEBU?$TVector3@N@@PEAUsector_t@@0NV?$TFlags@W4ActorFlag@@I@@IPEAVAActor@@AEAUFTraceResults@@IP6A?AW4ETraceStatus@@4PEAX@Z5@Z:PROC ; Trace + Line 227: EXTRN ?ApplyToDecal@FDecalTemplate@@QEBAXPEAVDBaseDecal@@PEAUside_t@@@Z:PROC ; FDecalTemplate::ApplyToDecal + Line 228: EXTRN ?GetDecalByNum@FDecalLib@@QEBAPEBVFDecalTemplate@@G@Z:PROC ; FDecalLib::GetDecalByNum + Line 229: EXTRN ?GetDecalByName@FDecalLib@@QEBAPEBVFDecalTemplate@@PEBD@Z:PROC ; FDecalLib::GetDecalByName + Line 230: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 231: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 232: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 233: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 234: EXTRN ?Net_WriteByte@@YAXE@Z:PROC ; Net_WriteByte + Line 235: EXTRN ?Net_WriteString@@YAXPEBD@Z:PROC ; Net_WriteString + Line 236: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 237: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAIPEAI@Z:PROC ; Serialize + Line 238: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEANPEAN@Z:PROC ; Serialize + Line 239: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 240: EXTRN ??$Serialize@Usector_t@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUsector_t@@PEAPEAU1@@Z:PROC ; Serialize + Line 241: EXTRN ??$Serialize@Uside_t@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUside_t@@PEAPEAU1@@Z:PROC ; Serialize + Line 242: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEATFRenderStyle@@PEAT2@@Z:PROC ; Serialize + Line 243: EXTRN ?FirstThinker@FLevelLocals@@QEAAPEAVDThinker@@H@Z:PROC ; FLevelLocals::FirstThinker + Line 244: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 245: EXTRN __CxxFrameHandler3:PROC + Line 246: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 247: EXTRN ?ColorMatcher@@3VFColorMatcher@@A:QWORD ; ColorMatcher + Line 248: EXTRN ?LegacyRenderStyles@@3PATFRenderStyle@@A:BYTE ; LegacyRenderStyles + Line 249: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 250: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 251: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\a_dynlight.cod (45 hits) + Line 210: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 211: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 212: EXTRN atexit:PROC + Line 213: EXTRN __std_terminate:PROC + Line 214: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 215: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 216: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 217: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 218: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 219: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 220: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 221: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 222: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 223: EXTRN ??0FMemArena@@QEAA@_K@Z:PROC ; FMemArena::FMemArena + Line 224: EXTRN ??1FMemArena@@QEAA@XZ:PROC ; FMemArena::~FMemArena + Line 225: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 226: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 227: EXTRN ??0FRandom@@QEAA@XZ:PROC ; FRandom::FRandom + Line 228: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 229: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 230: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 231: EXTRN ?MatchString@@YAHPEBDPEAPEBD@Z:PROC ; MatchString + Line 232: EXTRN ?GetSpriteFrame@spritedef_t@@QEAA?AVFTextureID@@HHU?$TAngle@N@@PEA_N_N@Z:PROC ; spritedef_t::GetSpriteFrame + Line 233: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 234: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 235: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 236: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 237: EXTRN ?IsVisibleToPlayer@AActor@@QEBA_NXZ:PROC ; AActor::IsVisibleToPlayer + Line 238: EXTRN ?GetPortalOffsetPosition@FLevelLocals@@QEAA?AU?$TVector2@N@@NNNN@Z:PROC ; FLevelLocals::GetPortalOffsetPosition + Line 239: EXTRN ?PointInRenderSubsector@FLevelLocals@@QEAAPEAUsubsector_t@@HH@Z:PROC ; FLevelLocals::PointInRenderSubsector + Line 240: EXTRN ?Update@FCycler@@QEAAXN@Z:PROC ; FCycler::Update + Line 241: EXTRN ?SetParams@FCycler@@QEAAXNNN_N@Z:PROC ; FCycler::SetParams + Line 242: EXTRN ?ApplyProperties@FLightDefaults@@QEBAXPEAUFDynamicLight@@@Z:PROC ; FLightDefaults::ApplyProperties + Line 243: EXTRN __CxxFrameHandler3:PROC + Line 244: EXTRN memset:PROC + Line 245: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 246: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 247: EXTRN ?sprites@@3V?$TArray@Uspritedef_t@@U1@@@A:BYTE ; sprites + Line 248: EXTRN ?validcount@@3HA:DWORD ; validcount + Line 249: EXTRN ?dl_validcount@@3HA:DWORD ; dl_validcount + Line 250: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 251: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 252: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 253: EXTRN ?StateLights@@3V?$TArray@PEAVFLightDefaults@@PEAV1@@@A:BYTE ; StateLights + Line 254: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\a_dynlightdata.cod (19 hits) + Line 25: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 26: EXTRN atexit:PROC + Line 27: EXTRN __std_terminate:PROC + Line 28: EXTRN strncmp:PROC + Line 29: EXTRN toupper:PROC + Line 30: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 31: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 32: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 33: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 34: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 35: EXTRN ?GetReplacement@PClassActor@@QEAAPEAV1@_N@Z:PROC ; PClassActor::GetReplacement + Line 36: EXTRN ?SetParams@FCycler@@QEAAXNNN_N@Z:PROC ; FCycler::SetParams + Line 37: EXTRN __CxxFrameHandler3:PROC + Line 38: EXTRN memmove:PROC + Line 39: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 40: EXTRN ?sprites@@3V?$TArray@Uspritedef_t@@U1@@@A:BYTE ; sprites + Line 41: EXTRN ?ClassDataAllocator@@3VFMemArena@@A:BYTE ; ClassDataAllocator + Line 42: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 43: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\a_flashfader.cod (27 hits) + Line 13: EXTRN ?RegistrationInfo@DThinker@@2UClassReg@@A:BYTE ; DThinker::RegistrationInfo + Line 57: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 58: EXTRN __std_terminate:PROC + Line 59: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 60: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 61: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 62: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 63: EXTRN ?StaticType@DThinker@@UEBAPEAVPClass@@XZ:PROC ; DThinker::StaticType + Line 64: EXTRN ?OnDestroy@DThinker@@UEAAXXZ:PROC ; DThinker::OnDestroy + Line 65: EXTRN ??1DThinker@@UEAA@XZ:PROC ; DThinker::~DThinker + Line 66: EXTRN ?Tick@DThinker@@UEAAXXZ:PROC ; DThinker::Tick + Line 67: EXTRN ?PostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::PostBeginPlay + Line 68: EXTRN ?CallPostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::CallPostBeginPlay + Line 69: EXTRN ?PostSerialize@DThinker@@UEAAXXZ:PROC ; DThinker::PostSerialize + Line 70: EXTRN ?Serialize@DThinker@@UEAAXAEAVFSerializer@@@Z:PROC ; DThinker::Serialize + Line 71: EXTRN ?PropagateMark@DThinker@@UEAA_KXZ:PROC ; DThinker::PropagateMark + Line 72: EXTRN ??_EDThinker@@UEAAPEAXI@Z:PROC ; DThinker::`vector deleting destructor' + Line 73: EXTRN ??_EDFlashFader@@UEAAPEAXI@Z:PROC ; DFlashFader::`vector deleting destructor' + Line 74: EXTRN ?ArraySize@FSerializer@@QEAAIXZ:PROC ; FSerializer::ArraySize + Line 75: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 76: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 77: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 78: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAMPEAM@Z:PROC ; Serialize + Line 79: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 80: EXTRN __CxxFrameHandler3:PROC + Line 81: EXTRN ?save_full@@3_NA:BYTE ; save_full + Line 82: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\a_keys.cod (45 hits) + Line 65: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 66: EXTRN atexit:PROC + Line 67: EXTRN __std_terminate:PROC + Line 68: EXTRN qsort:PROC + Line 69: EXTRN stricmp:PROC + Line 70: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 71: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 72: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 73: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 74: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 75: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 76: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 77: EXTRN ??RFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator() + Line 78: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 79: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 80: EXTRN ?S_Sound@@YAXPEAVAActor@@HVFSoundID@@MM@Z:PROC ; S_Sound + Line 81: EXTRN ?S_FindSkinnedSound@@YAHPEAVAActor@@VFSoundID@@@Z:PROC ; S_FindSkinnedSound + Line 82: EXTRN ??0FScanner@@QEAA@H@Z:PROC ; FScanner::FScanner + Line 83: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 84: EXTRN ?Close@FScanner@@QEAAXXZ:PROC ; FScanner::Close + Line 85: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 86: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 87: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 88: EXTRN ?CheckString@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::CheckString + Line 89: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 90: EXTRN ?UnGet@FScanner@@QEAAXXZ:PROC ; FScanner::UnGet + Line 91: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 92: EXTRN ?MatchString@FScanner@@QEAAHPEBQEBD_K@Z:PROC ; FScanner::MatchString + Line 93: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 94: EXTRN ?CheckLocalView@AActor@@QEBA_NH@Z:PROC ; AActor::CheckLocalView + Line 95: EXTRN ?GetSpecies@AActor@@QEAA?AVFName@@XZ:PROC ; AActor::GetSpecies + Line 96: EXTRN ?C_MidPrint@@YAXPEAVFFont@@PEBD@Z:PROC ; C_MidPrint + Line 97: EXTRN ?FindLump@FWadCollection@@QEAAHPEBDPEAH_N@Z:PROC ; FWadCollection::FindLump + Line 98: EXTRN __CxxFrameHandler3:PROC + Line 99: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 100: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 101: EXTRN ?GameNames@@3PAPEBDA:BYTE ; GameNames + Line 102: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 103: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 104: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 105: EXTRN ?AllActorClasses@PClassActor@@2V?$TArray@PEAVPClassActor@@PEAV1@@@A:BYTE ; PClassActor::AllActorClasses + Line 106: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 107: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 108: EXTRN ?SmallFont@@3PEAVFFont@@EA:QWORD ; SmallFont + Line 109: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\a_lightning.cod (42 hits) + Line 13: EXTRN ?RegistrationInfo@DThinker@@2UClassReg@@A:BYTE ; DThinker::RegistrationInfo + Line 61: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 62: EXTRN atexit:PROC + Line 63: EXTRN __std_terminate:PROC + Line 64: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 65: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 66: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 67: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 68: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 69: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 70: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 71: EXTRN ?Link@FThinkerCollection@@QEAAXPEAVDThinker@@H@Z:PROC ; FThinkerCollection::Link + Line 72: EXTRN ?StaticType@DThinker@@UEBAPEAVPClass@@XZ:PROC ; DThinker::StaticType + Line 73: EXTRN ?OnDestroy@DThinker@@UEAAXXZ:PROC ; DThinker::OnDestroy + Line 74: EXTRN ??1DThinker@@UEAA@XZ:PROC ; DThinker::~DThinker + Line 75: EXTRN ?Tick@DThinker@@UEAAXXZ:PROC ; DThinker::Tick + Line 76: EXTRN ?PostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::PostBeginPlay + Line 77: EXTRN ?CallPostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::CallPostBeginPlay + Line 78: EXTRN ?PostSerialize@DThinker@@UEAAXXZ:PROC ; DThinker::PostSerialize + Line 79: EXTRN ?Serialize@DThinker@@UEAAXAEAVFSerializer@@@Z:PROC ; DThinker::Serialize + Line 80: EXTRN ?PropagateMark@DThinker@@UEAA_KXZ:PROC ; DThinker::PropagateMark + Line 81: EXTRN ??_EDThinker@@UEAAPEAXI@Z:PROC ; DThinker::`vector deleting destructor' + Line 82: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 83: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 84: EXTRN ??_EDLightningThinker@@UEAAPEAXI@Z:PROC ; DLightningThinker::`vector deleting destructor' + Line 85: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 86: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 87: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 88: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 89: EXTRN ?S_Sound@@YAXHVFSoundID@@MM@Z:PROC ; S_Sound + Line 90: EXTRN ?StartTypedScripts@FBehaviorContainer@@QEAAXGPEAVAActor@@_NH1@Z:PROC ; FBehaviorContainer::StartTypedScripts + Line 91: EXTRN ?ArraySize@FSerializer@@QEAAIXZ:PROC ; FSerializer::ArraySize + Line 92: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 93: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 94: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEA_NPEA_N@Z:PROC ; Serialize + Line 95: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 96: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAFPEAF@Z:PROC ; Serialize + Line 97: EXTRN ?E_WorldLightning@@YAXXZ:PROC ; E_WorldLightning + Line 98: EXTRN __CxxFrameHandler3:PROC + Line 99: EXTRN ?skyflatnum@@3VFTextureID@@A:DWORD ; skyflatnum + Line 100: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 101: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\a_morph.cod (3 hits) + Line 14: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 15: EXTRN ?GetVirtualIndex@@YAIPEAVPClass@@PEBD@Z:PROC ; GetVirtualIndex + Line 16: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\a_pickups.cod (21 hits) + Line 10: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 33: EXTRN atexit:PROC + Line 34: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 35: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 36: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 37: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 38: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 39: EXTRN ?FindFunction@PClass@@SAXPEAPEAVVMFunction@@VFName@@1@Z:PROC ; PClass::FindFunction + Line 40: EXTRN ?CheckCheatmode@@YA_N_N@Z:PROC ; CheckCheatmode + Line 41: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 42: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 43: EXTRN ??RFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator() + Line 44: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 45: EXTRN ?GetVirtualIndex@@YAIPEAVPClass@@PEBD@Z:PROC ; GetVirtualIndex + Line 46: EXTRN ?C_PrintInv@@YAXPEAVAActor@@@Z:PROC ; C_PrintInv + Line 47: EXTRN ?C_AimLine@@YAXPEAUFTranslatedLineTarget@@_N@Z:PROC ; C_AimLine + Line 48: EXTRN ?StatusBar@@3PEAVDBaseStatusBar@@EA:QWORD ; StatusBar + Line 49: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 50: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 51: EXTRN ?gametic@@3HA:DWORD ; gametic + Line 52: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\a_quake.cod (48 hits) + Line 14: EXTRN ?RegistrationInfo@DThinker@@2UClassReg@@A:BYTE ; DThinker::RegistrationInfo + Line 80: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 81: EXTRN atexit:PROC + Line 82: EXTRN __std_terminate:PROC + Line 83: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 84: EXTRN c_sqrt:PROC + Line 85: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 86: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 87: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 88: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 89: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 90: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 91: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 92: EXTRN ?P_DamageMobj@@YAHPEAVAActor@@00HVFName@@HU?$TAngle@N@@@Z:PROC ; P_DamageMobj + Line 93: EXTRN ?Link@FThinkerCollection@@QEAAXPEAVDThinker@@H@Z:PROC ; FThinkerCollection::Link + Line 94: EXTRN ?StaticType@DThinker@@UEBAPEAVPClass@@XZ:PROC ; DThinker::StaticType + Line 95: EXTRN ?OnDestroy@DThinker@@UEAAXXZ:PROC ; DThinker::OnDestroy + Line 96: EXTRN ??1DThinker@@UEAA@XZ:PROC ; DThinker::~DThinker + Line 97: EXTRN ?Tick@DThinker@@UEAAXXZ:PROC ; DThinker::Tick + Line 98: EXTRN ?PostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::PostBeginPlay + Line 99: EXTRN ?CallPostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::CallPostBeginPlay + Line 100: EXTRN ?PostSerialize@DThinker@@UEAAXXZ:PROC ; DThinker::PostSerialize + Line 101: EXTRN ?Serialize@DThinker@@UEAAXAEAVFSerializer@@@Z:PROC ; DThinker::Serialize + Line 102: EXTRN ?PropagateMark@DThinker@@UEAA_KXZ:PROC ; DThinker::PropagateMark + Line 103: EXTRN ??_EDThinker@@UEAAPEAXI@Z:PROC ; DThinker::`vector deleting destructor' + Line 104: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 105: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 106: EXTRN ?S_Sound@@YAXPEAVAActor@@HVFSoundID@@MM@Z:PROC ; S_Sound + Line 107: EXTRN ?S_StopSound@@YAXPEAVAActor@@H@Z:PROC ; S_StopSound + Line 108: EXTRN ?S_IsActorPlayingSomething@@YA_NPEAVAActor@@HH@Z:PROC ; S_IsActorPlayingSomething + Line 109: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 110: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 111: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 112: EXTRN ?PosRelative@AActor@@QEBA?AU?$TVector3@N@@PEBV1@@Z:PROC ; AActor::PosRelative + Line 113: EXTRN ??_EDEarthquake@@UEAAPEAXI@Z:PROC ; DEarthquake::`vector deleting destructor' + Line 114: EXTRN ?ArraySize@FSerializer@@QEAAIXZ:PROC ; FSerializer::ArraySize + Line 115: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 116: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 117: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 118: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEANPEAN@Z:PROC ; Serialize + Line 119: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 120: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAVFSoundID@@PEAV2@@Z:PROC ; Serialize + Line 121: EXTRN __CxxFrameHandler3:PROC + Line 122: EXTRN memcmp:PROC + Line 123: EXTRN ?playeringame@@3PA_NA:BYTE ; playeringame + Line 124: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 125: EXTRN ?save_full@@3_NA:BYTE ; save_full + Line 126: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\a_specialspot.cod (30 hits) + Line 13: EXTRN ?RegistrationInfo@DObject@@2UClassReg@@A:BYTE ; DObject::RegistrationInfo + Line 64: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 65: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 66: EXTRN atexit:PROC + Line 67: EXTRN __std_terminate:PROC + Line 68: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 69: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 70: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 71: EXTRN c_sqrt:PROC + Line 72: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 73: EXTRN ??1DObject@@UEAA@XZ:PROC ; DObject::~DObject + Line 74: EXTRN ?Serialize@DObject@@UEAAXAEAVFSerializer@@@Z:PROC ; DObject::Serialize + Line 75: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 76: EXTRN ?PropagateMark@DObject@@UEAA_KXZ:PROC ; DObject::PropagateMark + Line 77: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 78: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 79: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 80: EXTRN ??_EDSpotState@@UEAAPEAXI@Z:PROC ; DSpotState::`vector deleting destructor' + Line 81: EXTRN ?ArraySize@FSerializer@@QEAAIXZ:PROC ; FSerializer::ArraySize + Line 82: EXTRN ?BeginObject@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginObject + Line 83: EXTRN ?EndObject@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndObject + Line 84: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 85: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 86: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 87: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAIPEAI@Z:PROC ; Serialize + Line 88: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 89: EXTRN ??$Serialize@VPClassActor@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAVPClassActor@@PEAPEAV1@@Z:PROC ; Serialize + Line 90: EXTRN __CxxFrameHandler3:PROC + Line 91: EXTRN memmove:PROC + Line 92: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\a_weapons.cod (51 hits) + Line 12: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 90: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 91: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 92: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 93: EXTRN atexit:PROC + Line 94: EXTRN __std_terminate:PROC + Line 95: EXTRN qsort:PROC + Line 96: EXTRN atoi:PROC + Line 97: EXTRN strtok:PROC + Line 98: EXTRN stricmp:PROC + Line 99: EXTRN strnicmp:PROC + Line 100: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 101: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 102: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 103: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 104: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 105: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 106: EXTRN ?LockBuffer@FString@@QEAAPEADXZ:PROC ; FString::LockBuffer + Line 107: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 108: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 109: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 110: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 111: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 112: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 113: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 114: EXTRN ?ReadByte@@YAHPEAPEAE@Z:PROC ; ReadByte + Line 115: EXTRN ?ReadWord@@YAHPEAPEAE@Z:PROC ; ReadWord + Line 116: EXTRN ?ReadStringConst@@YAPEBDPEAPEAE@Z:PROC ; ReadStringConst + Line 117: EXTRN ?WriteWord@@YAXFPEAPEAE@Z:PROC ; WriteWord + Line 118: EXTRN ?WriteString@@YAXPEBDPEAPEAE@Z:PROC ; WriteString + Line 119: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 120: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 121: EXTRN ?AddCommandString@@YAXPEBDH@Z:PROC ; AddCommandString + Line 122: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 123: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 124: EXTRN ?SetSection@FConfigFile@@QEAA_NPEBD_N@Z:PROC ; FConfigFile::SetSection + Line 125: EXTRN ?NextInSection@FConfigFile@@QEAA_NAEAPEBD0@Z:PROC ; FConfigFile::NextInSection + Line 126: EXTRN ?GetConfigPath@FGameConfigFile@@QEAA?AVFString@@_N@Z:PROC ; FGameConfigFile::GetConfigPath + Line 127: EXTRN ?Net_WriteByte@@YAXE@Z:PROC ; Net_WriteByte + Line 128: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 129: EXTRN ?GetVirtualIndex@@YAIPEAVPClass@@PEBD@Z:PROC ; GetVirtualIndex + Line 130: EXTRN __CxxFrameHandler3:PROC + Line 131: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 132: EXTRN ?AllActorClasses@PClassActor@@2V?$TArray@PEAVPClassActor@@PEAV1@@@A:BYTE ; PClassActor::AllActorClasses + Line 133: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 134: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 135: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 136: EXTRN ?Net_Arbitrator@@3HA:DWORD ; Net_Arbitrator + Line 137: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 138: EXTRN ?ParsingKeyConf@@3_NA:BYTE ; ParsingKeyConf + Line 139: EXTRN ?GameConfig@@3PEAVFGameConfigFile@@EA:QWORD ; GameConfig + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\actorptrselect.cod (2 hits) + Line 15: EXTRN ?P_BulletSlope@@YA?AU?$TAngle@N@@PEAVAActor@@PEAUFTranslatedLineTarget@@H@Z:PROC ; P_BulletSlope + Line 16: EXTRN ?playeringame@@3PA_NA:BYTE ; playeringame + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\adlmidi.cod (61 hits) + Line 168: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 169: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 170: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 171: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 172: EXTRN __std_terminate:PROC + Line 173: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 174: EXTRN free:PROC + Line 175: EXTRN malloc:PROC + Line 176: EXTRN ??2@YAPEAX_KAEBUnothrow_t@std@@@Z:PROC ; operator new + Line 177: EXTRN __stdio_common_vsprintf:PROC + Line 178: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 179: EXTRN ?maxAdlBanks@@YAHXZ:PROC ; maxAdlBanks + Line 180: EXTRN ?cvt_ADLI_to_FMIns@@YAXAEAUadlinsdata2@@AEBUADL_Instrument@@@Z:PROC ; cvt_ADLI_to_FMIns + Line 181: EXTRN ?cvt_FMIns_to_ADLI@@YAXAEAUADL_Instrument@@AEBUadlinsdata2@@@Z:PROC ; cvt_FMIns_to_ADLI + Line 182: EXTRN ?adlCalculateFourOpChannels@@YAHPEAVMIDIplay@@_N@Z:PROC ; adlCalculateFourOpChannels + Line 183: EXTRN ?setupLocked@OPL3@@QEAA_NXZ:PROC ; OPL3::setupLocked + Line 184: EXTRN ?setEmbeddedBank@OPL3@@QEAAXI@Z:PROC ; OPL3::setEmbeddedBank + Line 185: EXTRN ?updateChannelCategories@OPL3@@QEAAXXZ:PROC ; OPL3::updateChannelCategories + Line 186: EXTRN ?commitDeepFlags@OPL3@@QEAAXXZ:PROC ; OPL3::commitDeepFlags + Line 187: EXTRN ?setVolumeScaleModel@OPL3@@QEAAXW4ADLMIDI_VolumeModels@@@Z:PROC ; OPL3::setVolumeScaleModel + Line 188: EXTRN ?getVolumeScaleModel@OPL3@@QEAA?AW4ADLMIDI_VolumeModels@@XZ:PROC ; OPL3::getVolumeScaleModel + Line 189: EXTRN ??0MIDIplay@@QEAA@K@Z:PROC ; MIDIplay::MIDIplay + Line 190: EXTRN ?applySetup@MIDIplay@@QEAAXXZ:PROC ; MIDIplay::applySetup + Line 191: EXTRN ?partialReset@MIDIplay@@QEAAXXZ:PROC ; MIDIplay::partialReset + Line 192: EXTRN ?resetMIDI@MIDIplay@@QEAAXXZ:PROC ; MIDIplay::resetMIDI + Line 193: EXTRN ?getErrorString@MIDIplay@@QEAAAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ:PROC ; MIDIplay::getErrorString + Line 194: EXTRN ?setErrorString@MIDIplay@@QEAAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z:PROC ; MIDIplay::setErrorString + Line 195: EXTRN ?LoadBank@MIDIplay@@QEAA_NAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z:PROC ; MIDIplay::LoadBank + Line 196: EXTRN ?LoadBank@MIDIplay@@QEAA_NPEBX_K@Z:PROC ; MIDIplay::LoadBank + Line 197: EXTRN ?TickIterators@MIDIplay@@QEAAXN@Z:PROC ; MIDIplay::TickIterators + Line 198: EXTRN ?realTime_ResetState@MIDIplay@@QEAAXXZ:PROC ; MIDIplay::realTime_ResetState + Line 199: EXTRN ?realTime_NoteOn@MIDIplay@@QEAA_NEEE@Z:PROC ; MIDIplay::realTime_NoteOn + Line 200: EXTRN ?realTime_NoteOff@MIDIplay@@QEAAXEE@Z:PROC ; MIDIplay::realTime_NoteOff + Line 201: EXTRN ?realTime_NoteAfterTouch@MIDIplay@@QEAAXEEE@Z:PROC ; MIDIplay::realTime_NoteAfterTouch + Line 202: EXTRN ?realTime_ChannelAfterTouch@MIDIplay@@QEAAXEE@Z:PROC ; MIDIplay::realTime_ChannelAfterTouch + Line 203: EXTRN ?realTime_Controller@MIDIplay@@QEAAXEEE@Z:PROC ; MIDIplay::realTime_Controller + Line 204: EXTRN ?realTime_PatchChange@MIDIplay@@QEAAXEE@Z:PROC ; MIDIplay::realTime_PatchChange + Line 205: EXTRN ?realTime_PitchBend@MIDIplay@@QEAAXEG@Z:PROC ; MIDIplay::realTime_PitchBend + Line 206: EXTRN ?realTime_PitchBend@MIDIplay@@QEAAXEEE@Z:PROC ; MIDIplay::realTime_PitchBend + Line 207: EXTRN ?realTime_BankChangeLSB@MIDIplay@@QEAAXEE@Z:PROC ; MIDIplay::realTime_BankChangeLSB + Line 208: EXTRN ?realTime_BankChangeMSB@MIDIplay@@QEAAXEE@Z:PROC ; MIDIplay::realTime_BankChangeMSB + Line 209: EXTRN ?realTime_BankChange@MIDIplay@@QEAAXEG@Z:PROC ; MIDIplay::realTime_BankChange + Line 210: EXTRN ?setDeviceId@MIDIplay@@QEAAXE@Z:PROC ; MIDIplay::setDeviceId + Line 211: EXTRN ?realTime_SysEx@MIDIplay@@QEAA_NPEBE_K@Z:PROC ; MIDIplay::realTime_SysEx + Line 212: EXTRN ?realTime_panic@MIDIplay@@QEAAXXZ:PROC ; MIDIplay::realTime_panic + Line 213: EXTRN ?describeChannels@MIDIplay@@QEAAXPEAD0_K@Z:PROC ; MIDIplay::describeChannels + Line 214: EXTRN ?adl_isEmulatorAvailable@@YA_NH@Z:PROC ; adl_isEmulatorAvailable + Line 215: EXTRN _CxxThrowException:PROC + Line 216: EXTRN __CxxFrameHandler3:PROC + Line 217: EXTRN __chkstk:PROC + Line 218: EXTRN memcpy:PROC + Line 219: EXTRN memmove:PROC + Line 220: EXTRN memset:PROC + Line 221: EXTRN ?nothrow@std@@3Unothrow_t@1@B:BYTE ; std::nothrow + Line 222: EXTRN ?adl@@3QBUadldata@@B:BYTE ; adl + Line 223: EXTRN ?adlins@@3QBUadlinsdata@@B:BYTE ; adlins + Line 224: EXTRN ?banks@@3QAY0BAA@$$CBGA:BYTE ; banks + Line 225: EXTRN ?banknames@@3QBQEBDB:BYTE ; banknames + Line 226: EXTRN ?ADLMIDI_ErrorString@@3V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@A:BYTE ; ADLMIDI_ErrorString + Line 227: EXTRN __ImageBase:BYTE + Line 228: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\adlmidi_load.cod (27 hits) + Line 45: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 46: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 47: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 48: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 49: EXTRN __std_terminate:PROC + Line 50: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 51: EXTRN __imp_MultiByteToWideChar:PROC + Line 52: EXTRN free:PROC + Line 53: EXTRN malloc:PROC + Line 54: EXTRN round:PROC + Line 55: EXTRN _wfopen:PROC + Line 56: EXTRN fclose:PROC + Line 57: EXTRN fread:PROC + Line 58: EXTRN fseek:PROC + Line 59: EXTRN ftell:PROC + Line 60: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 61: EXTRN ?setEmbeddedBank@OPL3@@QEAAXI@Z:PROC ; OPL3::setEmbeddedBank + Line 62: EXTRN ?applySetup@MIDIplay@@QEAAXXZ:PROC ; MIDIplay::applySetup + Line 63: EXTRN WOPL_Free:PROC + Line 64: EXTRN WOPL_LoadBankFromMem:PROC + Line 65: EXTRN _CxxThrowException:PROC + Line 66: EXTRN __CxxFrameHandler3:PROC + Line 67: EXTRN __chkstk:PROC + Line 68: EXTRN memcpy:PROC + Line 69: EXTRN memmove:PROC + Line 70: EXTRN memset:PROC + Line 71: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\adlmidi_midiplay.cod (42 hits) + Line 221: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 222: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 223: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 224: EXTRN __std_terminate:PROC + Line 225: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 226: EXTRN strchr:PROC + Line 227: EXTRN __acrt_iob_func:PROC + Line 228: EXTRN __stdio_common_vfprintf:PROC + Line 229: EXTRN __stdio_common_vsprintf:PROC + Line 230: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 231: EXTRN adl_getBanksCount:PROC + Line 232: EXTRN ??_EAdlInstrumentTester@@UEAAPEAXI@Z:PROC ; AdlInstrumentTester::`vector deleting destructor' + Line 233: EXTRN ?adlCalculateFourOpChannels@@YAHPEAVMIDIplay@@_N@Z:PROC ; adlCalculateFourOpChannels + Line 234: EXTRN ??0OPL3@@QEAA@XZ:PROC ; OPL3::OPL3 + Line 235: EXTRN ?writeReg@OPL3@@QEAAX_KGE@Z:PROC ; OPL3::writeReg + Line 236: EXTRN ?noteOff@OPL3@@QEAAX_K@Z:PROC ; OPL3::noteOff + Line 237: EXTRN ?noteOn@OPL3@@QEAAX_K0N@Z:PROC ; OPL3::noteOn + Line 238: EXTRN ?touchNote@OPL3@@QEAAX_KEE@Z:PROC ; OPL3::touchNote + Line 239: EXTRN ?setPatch@OPL3@@QEAAX_KAEBUadldata@@@Z:PROC ; OPL3::setPatch + Line 240: EXTRN ?setPan@OPL3@@QEAAX_KE@Z:PROC ; OPL3::setPan + Line 241: EXTRN ?silenceAll@OPL3@@QEAAXXZ:PROC ; OPL3::silenceAll + Line 242: EXTRN ?setVolumeScaleModel@OPL3@@QEAAXW4ADLMIDI_VolumeModels@@@Z:PROC ; OPL3::setVolumeScaleModel + Line 243: EXTRN ?reset@OPL3@@QEAAXHKPEAX@Z:PROC ; OPL3::reset + Line 244: EXTRN ?adl_getLowestEmulator@@YAHXZ:PROC ; adl_getLowestEmulator + Line 245: EXTRN _CxxThrowException:PROC + Line 246: EXTRN __CxxFrameHandler3:PROC + Line 247: EXTRN __chkstk:PROC + Line 248: EXTRN exp:PROC + Line 249: EXTRN log:PROC + Line 250: EXTRN memcmp:PROC + Line 251: EXTRN memcpy:PROC + Line 252: EXTRN memmove:PROC + Line 253: EXTRN memset:PROC + Line 254: EXTRN pow:PROC + Line 255: EXTRN sin:PROC + Line 256: EXTRN ?adl@@3QBUadldata@@B:BYTE ; adl + Line 257: EXTRN ?adlins@@3QBUadlinsdata@@B:BYTE ; adlins + Line 258: EXTRN ?banks@@3QAY0BAA@$$CBGA:BYTE ; banks + Line 259: EXTRN ?adlbanksetup@@3QBUAdlBankSetup@@B:BYTE ; adlbanksetup + Line 260: EXTRN ?m_emptyInstrument@OPL3@@2Uadlinsdata2@@B:BYTE ; OPL3::m_emptyInstrument + Line 261: EXTRN __ImageBase:BYTE + Line 262: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\adlmidi_opl3.cod (24 hits) + Line 74: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 75: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 76: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 77: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 78: EXTRN __std_terminate:PROC + Line 79: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 80: EXTRN abort:PROC + Line 81: EXTRN round:PROC + Line 82: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 83: EXTRN ?maxAdlBanks@@YAHXZ:PROC ; maxAdlBanks + Line 84: EXTRN ??0NukedOPL3@@QEAA@XZ:PROC ; NukedOPL3::NukedOPL3 + Line 85: EXTRN ??0NukedOPL3v174@@QEAA@XZ:PROC ; NukedOPL3v174::NukedOPL3v174 + Line 86: EXTRN ??0DosBoxOPL3@@QEAA@XZ:PROC ; DosBoxOPL3::DosBoxOPL3 + Line 87: EXTRN _CxxThrowException:PROC + Line 88: EXTRN __CxxFrameHandler3:PROC + Line 89: EXTRN __chkstk:PROC + Line 90: EXTRN memcpy:PROC + Line 91: EXTRN memmove:PROC + Line 92: EXTRN memset:PROC + Line 93: EXTRN ?adl@@3QBUadldata@@B:BYTE ; adl + Line 94: EXTRN ?adlins@@3QBUadlinsdata@@B:BYTE ; adlins + Line 95: EXTRN ?banks@@3QAY0BAA@$$CBGA:BYTE ; banks + Line 96: EXTRN __ImageBase:BYTE + Line 97: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\adlmidi_private.cod (8 hits) + Line 15: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 16: EXTRN atexit:PROC + Line 17: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 18: EXTRN ?updateChannelCategories@OPL3@@QEAAXXZ:PROC ; OPL3::updateChannelCategories + Line 19: EXTRN ?adl@@3QBUadldata@@B:BYTE ; adl + Line 20: EXTRN ?adlins@@3QBUadlinsdata@@B:BYTE ; adlins + Line 21: EXTRN ?banks@@3QAY0BAA@$$CBGA:BYTE ; banks + Line 22: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\am_map.cod (139 hits) + Line 118: EXTRN ?StatusBar@@3PEAVDBaseStatusBar@@EA:QWORD ; StatusBar + Line 119: EXTRN ?netgame@@3_NA:BYTE ; netgame + Line 120: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 121: EXTRN ?sv_cheats@@3VFBoolCVar@@A:BYTE ; sv_cheats + Line 122: EXTRN ?RegistrationInfo@DObject@@2UClassReg@@A:BYTE ; DObject::RegistrationInfo + Line 868: EXTRN _purecall:PROC + Line 869: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 870: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 871: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 872: EXTRN atexit:PROC + Line 873: EXTRN __std_terminate:PROC + Line 874: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 875: EXTRN atof:PROC + Line 876: EXTRN stricmp:PROC + Line 877: EXTRN strnicmp:PROC + Line 878: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 879: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 880: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 881: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 882: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 883: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 884: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 885: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 886: EXTRN mysnprintf:PROC + Line 887: EXTRN ??0FScanner@@QEAA@XZ:PROC ; FScanner::FScanner + Line 888: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 889: EXTRN ?OpenLumpNum@FScanner@@QEAAXH@Z:PROC ; FScanner::OpenLumpNum + Line 890: EXTRN ?SetCMode@FScanner@@QEAAX_N@Z:PROC ; FScanner::SetCMode + Line 891: EXTRN ?GetToken@FScanner@@QEAA_NXZ:PROC ; FScanner::GetToken + Line 892: EXTRN ?TokenMustBe@FScanner@@QEAAXH@Z:PROC ; FScanner::TokenMustBe + Line 893: EXTRN ?MustGetToken@FScanner@@QEAAXH@Z:PROC ; FScanner::MustGetToken + Line 894: EXTRN ?CheckToken@FScanner@@QEAA_NH@Z:PROC ; FScanner::CheckToken + Line 895: EXTRN ?MustGetFloat@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetFloat + Line 896: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 897: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 898: EXTRN ?G_SkillProperty@@YAHW4ESkillProperty@@@Z:PROC ; G_SkillProperty + Line 899: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 900: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 901: EXTRN ??1DObject@@UEAA@XZ:PROC ; DObject::~DObject + Line 902: EXTRN ?Serialize@DObject@@UEAAXAEAVFSerializer@@@Z:PROC ; DObject::Serialize + Line 903: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 904: EXTRN ?PropagateMark@DObject@@UEAA_KXZ:PROC ; DObject::PropagateMark + Line 905: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 906: EXTRN ?P_GetLineSpecialInfo@@YAPEAUFLineSpecial@@H@Z:PROC ; P_GetLineSpecialInfo + Line 907: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 908: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 909: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 910: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 911: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 912: EXTRN ?ResetToDefault@FBaseCVar@@QEAAXXZ:PROC ; FBaseCVar::ResetToDefault + Line 913: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 914: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 915: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 916: EXTRN ??0FColorCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FColorCVar::FColorCVar + Line 917: EXTRN ?HSVtoRGB@@YAXPEAM00MMM@Z:PROC ; HSVtoRGB + Line 918: EXTRN ?Pick@FColorMatcher@@QEAAEHHH@Z:PROC ; FColorMatcher::Pick + Line 919: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAVFTextureID@@PEAV2@@Z:PROC ; Serialize + Line 920: EXTRN ?CheckForTexture@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::CheckForTexture + Line 921: EXTRN ?FillSimplePoly@DFrameBuffer@@QEAAXPEAVFTexture@@PEAU?$TVector2@M@@HNNNNU?$TAngle@N@@AEBUFColormap@@UPalEntry@@HHPEAI_K@Z:PROC ; DFrameBuffer::FillSimplePoly + Line 922: EXTRN ?Clear@DFrameBuffer@@QEAAXHHHHHI@Z:PROC ; DFrameBuffer::Clear + Line 923: EXTRN ?DrawLine@DFrameBuffer@@QEAAXHHHHHIE@Z:PROC ; DFrameBuffer::DrawLine + Line 924: EXTRN ?DrawPixel@DFrameBuffer@@QEAAXHHHI@Z:PROC ; DFrameBuffer::DrawPixel + Line 925: EXTRN ?DrawTexture@DFrameBuffer@@QEAAXPEAVFTexture@@NNHZZ:PROC ; DFrameBuffer::DrawTexture + Line 926: EXTRN ?V_GetColorFromString@@YAHPEBIPEBDPEAUFScriptPosition@@@Z:PROC ; V_GetColorFromString + Line 927: EXTRN ?V_GetColorStringByName@@YA?AVFString@@PEBDPEAUFScriptPosition@@@Z:PROC ; V_GetColorStringByName + Line 928: EXTRN ?FindInventory@AActor@@QEAAPEAV1@VFName@@_N@Z:PROC ; AActor::FindInventory + Line 929: EXTRN ?IsTeammate@AActor@@QEAA_NPEAV1@@Z:PROC ; AActor::IsTeammate + Line 930: EXTRN ?GetPortalTransition@AActor@@QEAA?AU?$TVector3@N@@NPEAPEAUsector_t@@@Z:PROC ; AActor::GetPortalTransition + Line 931: EXTRN ?CopyPlaneIfValid@secplane_t@@QEBA_NPEAU1@PEBU1@@Z:PROC ; secplane_t::CopyPlaneIfValid + Line 932: EXTRN ?P_GetPlaneLight@@YAPEAUlightlist_t@@PEAUsector_t@@PEAUsecplane_t@@_N@Z:PROC ; P_GetPlaneLight + Line 933: EXTRN ?AdjustFloorClip@@YAXPEBUsector_t@@@Z:PROC ; AdjustFloorClip + Line 934: EXTRN ?GetFloorLight@@YAHPEBUsector_t@@@Z:PROC ; GetFloorLight + Line 935: EXTRN ?C_DoKey@@YA_NPEAUevent_t@@PEAVFKeyBindings@@1@Z:PROC ; C_DoKey + Line 936: EXTRN ?ArraySize@FSerializer@@QEAAIXZ:PROC ; FSerializer::ArraySize + Line 937: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 938: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 939: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 940: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEANPEAN@Z:PROC ; Serialize + Line 941: EXTRN ??$Serialize@UFLevelLocals@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUFLevelLocals@@PEAPEAU1@@Z:PROC ; Serialize + Line 942: EXTRN ?D_GetPlayerColor@@YAXHPEAM00PEAPEAUFPlayerColorSet@@@Z:PROC ; D_GetPlayerColor + Line 943: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 944: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 945: EXTRN ?CheckCheatmode@@YA_N_N@Z:PROC ; CheckCheatmode + Line 946: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 947: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 948: EXTRN ??RFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator() + Line 949: EXTRN ??_EDAutomapBase@@UEAAPEAXI@Z:PROC ; DAutomapBase::`vector deleting destructor' + Line 950: EXTRN ?P_GetMapColorForLock@@YAHH@Z:PROC ; P_GetMapColorForLock + Line 951: EXTRN ?P_GetMapColorForKey@@YAHPEAVAActor@@@Z:PROC ; P_GetMapColorForKey + Line 952: EXTRN ?PointInSubsector@FLevelLocals@@AEAAPEAUsubsector_t@@NN@Z:PROC ; FLevelLocals::PointInSubsector + Line 953: EXTRN ??_EDAutomap@@UEAAPEAXI@Z:PROC ; DAutomap::`vector deleting destructor' + Line 954: EXTRN _CxxThrowException:PROC + Line 955: EXTRN __CxxFrameHandler3:PROC + Line 956: EXTRN ceil:PROC + Line 957: EXTRN cos:PROC + Line 958: EXTRN memmove:PROC + Line 959: EXTRN memset:PROC + Line 960: EXTRN sin:PROC + Line 961: EXTRN sqrt:PROC + Line 962: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 963: EXTRN ?ColorMatcher@@3VFColorMatcher@@A:QWORD ; ColorMatcher + Line 964: EXTRN ?LegacyRenderStyles@@3PATFRenderStyle@@A:BYTE ; LegacyRenderStyles + Line 965: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 966: EXTRN ?CleanXfac@@3HA:DWORD ; CleanXfac + Line 967: EXTRN ?CleanYfac@@3HA:DWORD ; CleanYfac + Line 968: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 969: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 970: EXTRN ?gameaction@@3W4gameaction_t@@A:DWORD ; gameaction + Line 971: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 972: EXTRN ?Bindings@@3VFKeyBindings@@A:BYTE ; Bindings + Line 973: EXTRN ?AutomapBindings@@3VFKeyBindings@@A:BYTE ; AutomapBindings + Line 974: EXTRN ?save_full@@3_NA:BYTE ; save_full + Line 975: EXTRN ?skyflatnum@@3VFTextureID@@A:DWORD ; skyflatnum + Line 976: EXTRN ?multiplayer@@3_NA:BYTE ; multiplayer + Line 977: EXTRN ?deathmatch@@3VFIntCVar@@A:BYTE ; deathmatch + Line 978: EXTRN ?viewactive@@3_NA:BYTE ; viewactive + Line 979: EXTRN ?viewwindowx@@3HA:DWORD ; viewwindowx + Line 980: EXTRN ?viewwindowy@@3HA:DWORD ; viewwindowy + Line 981: EXTRN ?viewheight@@3HA:DWORD ; viewheight + Line 982: EXTRN ?viewwidth@@3HA:DWORD ; viewwidth + Line 983: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 984: EXTRN ?demoplayback@@3_NA:BYTE ; demoplayback + Line 985: EXTRN ?playeringame@@3PA_NA:BYTE ; playeringame + Line 986: EXTRN ?dmflags2@@3VFIntCVar@@A:BYTE ; dmflags2 + Line 987: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 988: EXTRN ?gamestate@@3W4gamestate_t@@A:DWORD ; gamestate + Line 989: EXTRN ?Button_AM_PanLeft@@3UFButtonStatus@@A:BYTE ; Button_AM_PanLeft + Line 990: EXTRN ?Button_AM_PanRight@@3UFButtonStatus@@A:BYTE ; Button_AM_PanRight + Line 991: EXTRN ?Button_AM_PanDown@@3UFButtonStatus@@A:BYTE ; Button_AM_PanDown + Line 992: EXTRN ?Button_AM_PanUp@@3UFButtonStatus@@A:BYTE ; Button_AM_PanUp + Line 993: EXTRN ?Button_AM_ZoomIn@@3UFButtonStatus@@A:BYTE ; Button_AM_ZoomIn + Line 994: EXTRN ?Button_AM_ZoomOut@@3UFButtonStatus@@A:BYTE ; Button_AM_ZoomOut + Line 995: EXTRN ?SpriteFrames@@3V?$TArray@Uspriteframe_t@@U1@@@A:BYTE ; SpriteFrames + Line 996: EXTRN ?sprites@@3V?$TArray@Uspritedef_t@@U1@@@A:BYTE ; sprites + Line 997: EXTRN ?r_viewpoint@@3UFRenderViewpoint@@A:BYTE ; r_viewpoint + Line 998: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 999: EXTRN __ImageBase:BYTE + Line 1000: EXTRN _fltused:DWORD + Line 1001: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\ancientzip.cod (14 hits) + Line 37: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 38: EXTRN qsort:PROC + Line 39: EXTRN strncpy:PROC + Line 40: EXTRN __std_exception_copy:PROC + Line 41: EXTRN __std_exception_destroy:PROC + Line 42: EXTRN ??_Eexception@std@@UEAAPEAXI@Z:PROC ; std::exception::`vector deleting destructor' + Line 43: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 44: EXTRN ??_ECDoomError@@UEAAPEAXI@Z:PROC ; CDoomError::`vector deleting destructor' + Line 45: EXTRN ??_ECRecoverableError@@UEAAPEAXI@Z:PROC ; CRecoverableError::`vector deleting destructor' + Line 46: EXTRN ??_ECExplosionError@@UEAAPEAXI@Z:PROC ; CExplosionError::`vector deleting destructor' + Line 47: EXTRN _CxxThrowException:PROC + Line 48: EXTRN __chkstk:PROC + Line 49: EXTRN memset:PROC + Line 50: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\anim_switches.cod (26 hits) + Line 34: EXTRN __std_terminate:PROC + Line 35: EXTRN qsort:PROC + Line 36: EXTRN stricmp:PROC + Line 37: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 38: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 39: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 40: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 41: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 42: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 43: EXTRN ?CheckForTexture@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::CheckForTexture + Line 44: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 45: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 46: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 47: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 48: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 49: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 50: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 51: EXTRN ?CheckNumber@FScanner@@QEAA_NXZ:PROC ; FScanner::CheckNumber + Line 52: EXTRN ?UnGet@FScanner@@QEAAXXZ:PROC ; FScanner::UnGet + Line 53: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 54: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 55: EXTRN __CxxFrameHandler3:PROC + Line 56: EXTRN memcpy:PROC + Line 57: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 58: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 59: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\animations.cod (59 hits) + Line 83: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 84: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 85: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 86: EXTRN atexit:PROC + Line 87: EXTRN __std_terminate:PROC + Line 88: EXTRN free:PROC + Line 89: EXTRN atoi:PROC + Line 90: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 91: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 92: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 93: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 94: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 95: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 96: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 97: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 98: EXTRN ??HFTextureID@@QEAA?AV0@H@Z:PROC ; FTextureID::operator+ + Line 99: EXTRN ?IsNum@@YA_NPEBD@Z:PROC ; IsNum + Line 100: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 101: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 102: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 103: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAVFTextureID@@PEAV2@@Z:PROC ; Serialize + Line 104: EXTRN ??1FTexture@@UEAA@XZ:PROC ; FTexture::~FTexture + Line 105: EXTRN ?Get8BitPixels@FTexture@@UEAA?AV?$TArray@EE@@_N@Z:PROC ; FTexture::Get8BitPixels + Line 106: EXTRN ?GetBgraBitmap@FTexture@@UEAA?AVFBitmap@@PEAUPalEntry@@PEAH@Z:PROC ; FTexture::GetBgraBitmap + Line 107: EXTRN ?SetFrontSkyLayer@FTexture@@IEAAXXZ:PROC ; FTexture::SetFrontSkyLayer + Line 108: EXTRN ?SetScaledSize@FTexture@@IEAAXHH@Z:PROC ; FTexture::SetScaledSize + Line 109: EXTRN ??0FTexture@@IEAA@PEBDH@Z:PROC ; FTexture::FTexture + Line 110: EXTRN ?CheckForTexture@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::CheckForTexture + Line 111: EXTRN ?AreTexturesCompatible@FTextureManager@@QEAA_NVFTextureID@@0@Z:PROC ; FTextureManager::AreTexturesCompatible + Line 112: EXTRN ?AddTexture@FTextureManager@@QEAA?AVFTextureID@@PEAVFTexture@@@Z:PROC ; FTextureManager::AddTexture + Line 113: EXTRN ?ReplaceTexture@FTextureManager@@QEAAXVFTextureID@@PEAVFTexture@@_N@Z:PROC ; FTextureManager::ReplaceTexture + Line 114: EXTRN ?ProcessSwitchDef@FTextureManager@@AEAAXAEAVFScanner@@@Z:PROC ; FTextureManager::ProcessSwitchDef + Line 115: EXTRN ??_EFCanvasTexture@@UEAAPEAXI@Z:PROC ; FCanvasTexture::`vector deleting destructor' + Line 116: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 117: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 118: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 119: EXTRN ??0FScanner@@QEAA@H@Z:PROC ; FScanner::FScanner + Line 120: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 121: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 122: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 123: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 124: EXTRN ?MustGetFloat@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetFloat + Line 125: EXTRN ?CheckFloat@FScanner@@QEAA_NXZ:PROC ; FScanner::CheckFloat + Line 126: EXTRN ?UnGet@FScanner@@QEAAXXZ:PROC ; FScanner::UnGet + Line 127: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 128: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 129: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 130: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 131: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 132: EXTRN ?FindLump@FWadCollection@@QEAAHPEBDPEAH_N@Z:PROC ; FWadCollection::FindLump + Line 133: EXTRN ?LumpLength@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::LumpLength + Line 134: EXTRN ?GetLumpFile@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpFile + Line 135: EXTRN __CxxFrameHandler3:PROC + Line 136: EXTRN memcpy:PROC + Line 137: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 138: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 139: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 140: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 141: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\asin.cod (8 hits) + Line 18: EXTRN mtherr:PROC + Line 19: EXTRN polevl:PROC + Line 20: EXTRN p1evl:PROC + Line 21: EXTRN c_sqrt:PROC + Line 22: EXTRN PIO2:QWORD + Line 23: EXTRN PIO4:QWORD + Line 24: EXTRN NAN:QWORD + Line 25: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\ast.cod (22 hits) + Line 102: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 103: EXTRN ?TypeSInt8@@3PEAVPInt@@EA:QWORD ; TypeSInt8 + Line 104: EXTRN ?TypeUInt8@@3PEAVPInt@@EA:QWORD ; TypeUInt8 + Line 105: EXTRN ?TypeSInt16@@3PEAVPInt@@EA:QWORD ; TypeSInt16 + Line 106: EXTRN ?TypeSInt32@@3PEAVPInt@@EA:QWORD ; TypeSInt32 + Line 107: EXTRN ?TypeFloat32@@3PEAVPFloat@@EA:QWORD ; TypeFloat32 + Line 108: EXTRN ?TypeFloat64@@3PEAVPFloat@@EA:QWORD ; TypeFloat64 + Line 109: EXTRN ?TypeString@@3PEAVPString@@EA:QWORD ; TypeString + Line 110: EXTRN ?TypeName@@3PEAVPName@@EA:QWORD ; TypeName + Line 111: EXTRN ?TypeSound@@3PEAVPSound@@EA:QWORD ; TypeSound + Line 112: EXTRN ?TypeColor@@3PEAVPColor@@EA:QWORD ; TypeColor + Line 581: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 582: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 583: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 584: EXTRN ?AppendCStrPart@FString@@QEAAAEAV1@PEBD_K@Z:PROC ; FString::AppendCStrPart + Line 585: EXTRN ?AppendFormat@FString@@QEAAXPEBDZZ:PROC ; FString::AppendFormat + Line 586: EXTRN ?Truncate@FString@@QEAAX_K@Z:PROC ; FString::Truncate + Line 587: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 588: EXTRN mysnprintf:PROC + Line 589: EXTRN __CxxFrameHandler3:PROC + Line 590: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 591: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\atan.cod (10 hits) + Line 19: EXTRN polevl:PROC + Line 20: EXTRN p1evl:PROC + Line 21: EXTRN signbit:PROC + Line 22: EXTRN isnan:PROC + Line 23: EXTRN PI:QWORD + Line 24: EXTRN PIO2:QWORD + Line 25: EXTRN PIO4:QWORD + Line 26: EXTRN INFINITY:QWORD + Line 27: EXTRN NEGZERO:QWORD + Line 28: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\automaptexture.cod (20 hits) + Line 20: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 21: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 22: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 23: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 24: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 25: EXTRN ?CheckLumpName@FWadCollection@@QEAA_NHPEBD@Z:PROC ; FWadCollection::CheckLumpName + Line 26: EXTRN ?LumpLength@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::LumpLength + Line 27: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 28: EXTRN ?CreatePalettedPixels@FImageSource@@MEAA?AV?$TArray@EE@@H@Z:PROC ; FImageSource::CreatePalettedPixels + Line 29: EXTRN ?CopyPixels@FImageSource@@MEAAHPEAVFBitmap@@H@Z:PROC ; FImageSource::CopyPixels + Line 30: EXTRN ?CollectForPrecache@FImageSource@@UEAAXAEAV?$TMap@HU?$pair@HH@std@@U?$THashTraits@H@@U?$TValueTraits@U?$pair@HH@std@@@@@@_N@Z:PROC ; FImageSource::CollectForPrecache + Line 31: EXTRN ??_EFImageSource@@UEAAPEAXI@Z:PROC ; FImageSource::`vector deleting destructor' + Line 32: EXTRN ??_EFAutomapTexture@@UEAAPEAXI@Z:PROC ; FAutomapTexture::`vector deleting destructor' + Line 33: EXTRN __CxxFrameHandler3:PROC + Line 34: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 35: EXTRN ?GPalette@@3UFPalette@@A:BYTE ; GPalette + Line 36: EXTRN ?translationtables@@3PAV?$TAutoGrowArray@VFRemapTablePtr@@PEAUFRemapTable@@@@A:BYTE ; translationtables + Line 37: EXTRN ?GrayMap@ImageHelpers@@3PAEA:BYTE ; ImageHelpers::GrayMap + Line 38: EXTRN ?ImageArena@FImageSource@@1VFMemArena@@A:BYTE ; FImageSource::ImageArena + Line 39: EXTRN ?NextID@FImageSource@@1HA:DWORD ; FImageSource::NextID + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\b_bot.cod (80 hits) + Line 21: EXTRN ?RegistrationInfo@DThinker@@2UClassReg@@A:BYTE ; DThinker::RegistrationInfo + Line 160: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 161: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 162: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 163: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 164: EXTRN atexit:PROC + Line 165: EXTRN __std_terminate:PROC + Line 166: EXTRN stricmp:PROC + Line 167: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 168: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 169: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 170: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 171: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 172: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 173: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 174: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 175: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 176: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 177: EXTRN ?CheckCheatmode@@YA_N_N@Z:PROC ; CheckCheatmode + Line 178: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 179: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 180: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 181: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 182: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 183: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 184: EXTRN ?StaticType@DThinker@@UEBAPEAVPClass@@XZ:PROC ; DThinker::StaticType + Line 185: EXTRN ?OnDestroy@DThinker@@UEAAXXZ:PROC ; DThinker::OnDestroy + Line 186: EXTRN ??1DThinker@@UEAA@XZ:PROC ; DThinker::~DThinker + Line 187: EXTRN ?Tick@DThinker@@UEAAXXZ:PROC ; DThinker::Tick + Line 188: EXTRN ?PostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::PostBeginPlay + Line 189: EXTRN ?CallPostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::CallPostBeginPlay + Line 190: EXTRN ?PostSerialize@DThinker@@UEAAXXZ:PROC ; DThinker::PostSerialize + Line 191: EXTRN ?Serialize@DThinker@@UEAAXAEAVFSerializer@@@Z:PROC ; DThinker::Serialize + Line 192: EXTRN ?PropagateMark@DThinker@@UEAA_KXZ:PROC ; DThinker::PropagateMark + Line 193: EXTRN ??_EDThinker@@UEAAPEAXI@Z:PROC ; DThinker::`vector deleting destructor' + Line 194: EXTRN ??0FScanner@@QEAA@H@Z:PROC ; FScanner::FScanner + Line 195: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 196: EXTRN ?SetCMode@FScanner@@QEAAX_N@Z:PROC ; FScanner::SetCMode + Line 197: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 198: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 199: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 200: EXTRN ?CheckString@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::CheckString + Line 201: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 202: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 203: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 204: EXTRN ?Clear@FWeaponSlots@@QEAAXXZ:PROC ; FWeaponSlots::Clear + Line 205: EXTRN ?SpawnBot@FCajunMaster@@QEAA_NPEBDH@Z:PROC ; FCajunMaster::SpawnBot + Line 206: EXTRN ?Think@DBot@@AEAAXXZ:PROC ; DBot::Think + Line 207: EXTRN ??_EDBot@@UEAAPEAXI@Z:PROC ; DBot::`vector deleting destructor' + Line 208: EXTRN ?Net_WriteByte@@YAXE@Z:PROC ; Net_WriteByte + Line 209: EXTRN ?ArraySize@FSerializer@@QEAAIXZ:PROC ; FSerializer::ArraySize + Line 210: EXTRN ?BeginObject@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginObject + Line 211: EXTRN ?EndObject@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndObject + Line 212: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 213: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 214: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEA_NPEA_N@Z:PROC ; Serialize + Line 215: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 216: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEANPEAN@Z:PROC ; Serialize + Line 217: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 218: EXTRN ??$Serialize@Vplayer_t@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAVplayer_t@@PEAPEAV1@@Z:PROC ; Serialize + Line 219: EXTRN ??1userinfo_t@@QEAA@XZ:PROC ; userinfo_t::~userinfo_t + Line 220: EXTRN ?Reset@userinfo_t@@QEAAXXZ:PROC ; userinfo_t::Reset + Line 221: EXTRN ??1player_t@@QEAA@XZ:PROC ; player_t::~player_t + Line 222: EXTRN ?FindLump@FWadCollection@@QEAAHPEBDPEAH_N@Z:PROC ; FWadCollection::FindLump + Line 223: EXTRN __CxxFrameHandler3:PROC + Line 224: EXTRN memcmp:PROC + Line 225: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 226: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 227: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 228: EXTRN ?BotThinkCycles@@3Vcycle_t@@A:QWORD ; BotThinkCycles + Line 229: EXTRN ?gamestate@@3W4gamestate_t@@A:DWORD ; gamestate + Line 230: EXTRN ?save_full@@3_NA:BYTE ; save_full + Line 231: EXTRN ?netgame@@3_NA:BYTE ; netgame + Line 232: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 233: EXTRN ?playeringame@@3PA_NA:BYTE ; playeringame + Line 234: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 235: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 236: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 237: EXTRN __ImageBase:BYTE + Line 238: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\b_func.cod (40 hits) + Line 64: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 65: EXTRN atexit:PROC + Line 66: EXTRN __std_terminate:PROC + Line 67: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 68: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 69: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 70: EXTRN c_atan2:PROC + Line 71: EXTRN c_sqrt:PROC + Line 72: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 73: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 74: EXTRN ?P_RoughMonsterSearch@@YAPEAVAActor@@PEAV1@H_N1@Z:PROC ; P_RoughMonsterSearch + Line 75: EXTRN ?P_CheckPosition@@YA_NPEAVAActor@@AEBU?$TVector2@N@@AEAUFCheckPosition@@_N@Z:PROC ; P_CheckPosition + Line 76: EXTRN ?P_CheckSight@@YAHPEAVAActor@@0H@Z:PROC ; P_CheckSight + Line 77: EXTRN ?AddLineIntercepts@FPathTraverse@@MEAAXHH@Z:PROC ; FPathTraverse::AddLineIntercepts + Line 78: EXTRN ?AddThingIntercepts@FPathTraverse@@MEAAXHHAEAVFBlockThingsIterator@@_N@Z:PROC ; FPathTraverse::AddThingIntercepts + Line 79: EXTRN ?Next@FPathTraverse@@QEAAPEAUintercept_t@@XZ:PROC ; FPathTraverse::Next + Line 80: EXTRN ?init@FPathTraverse@@QEAAXNNNNHN@Z:PROC ; FPathTraverse::init + Line 81: EXTRN ??1FPathTraverse@@UEAA@XZ:PROC ; FPathTraverse::~FPathTraverse + Line 82: EXTRN ??_EFPathTraverse@@UEAAPEAXI@Z:PROC ; FPathTraverse::`vector deleting destructor' + Line 83: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 84: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 85: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 86: EXTRN ?ChangeStatNum@DThinker@@QEAAXH@Z:PROC ; DThinker::ChangeStatNum + Line 87: EXTRN ?StaticSpawn@AActor@@SAPEAV1@PEAVPClassActor@@AEBU?$TVector3@N@@W4replace_t@@_N@Z:PROC ; AActor::StaticSpawn + Line 88: EXTRN ?IsTeammate@AActor@@QEAA_NPEAV1@@Z:PROC ; AActor::IsTeammate + Line 89: EXTRN ?ClassForSpawn@@YAPEAVPClassActor@@VFName@@@Z:PROC ; ClassForSpawn + Line 90: EXTRN ?CleanAhead@FCajunMaster@@QEAA_NPEAVAActor@@NNPEAUticcmd_t@@@Z:PROC ; FCajunMaster::CleanAhead + Line 91: EXTRN ?IsDangerous@FCajunMaster@@QEAA_NPEAUsector_t@@@Z:PROC ; FCajunMaster::IsDangerous + Line 92: EXTRN ?WhatToGet@DBot@@QEAAXPEAVAActor@@@Z:PROC ; DBot::WhatToGet + Line 93: EXTRN __CxxFrameHandler3:PROC + Line 94: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 95: EXTRN ?deathmatch@@3VFIntCVar@@A:BYTE ; deathmatch + Line 96: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 97: EXTRN ?playeringame@@3PA_NA:BYTE ; playeringame + Line 98: EXTRN ?BotInfo@@3V?$TMap@VFName@@UBotInfoData@@U?$THashTraits@VFName@@@@U?$TValueTraits@UBotInfoData@@@@@@A:BYTE ; BotInfo + Line 99: EXTRN ?BotSupportCycles@@3Vcycle_t@@A:QWORD ; BotSupportCycles + Line 100: EXTRN ?bot_observer@@3VFBoolCVar@@A:BYTE ; bot_observer + Line 101: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 102: EXTRN ?BotWTG@@3HA:DWORD ; BotWTG + Line 103: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\b_game.cod (75 hits) + Line 22: EXTRN ??_EStat_bots@@UEAAPEAXI@Z:PROC ; Stat_bots::`vector deleting destructor' + Line 106: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 107: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 108: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 109: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 110: EXTRN atexit:PROC + Line 111: EXTRN __std_terminate:PROC + Line 112: EXTRN atoi:PROC + Line 113: EXTRN stricmp:PROC + Line 114: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 115: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 116: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 117: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 118: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 119: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 120: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 121: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 122: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 123: EXTRN mysnprintf:PROC + Line 124: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 125: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 126: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 127: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 128: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 129: EXTRN ?ReadByte@@YAHPEAPEAE@Z:PROC ; ReadByte + Line 130: EXTRN ?ReadString@@YAPEADPEAPEAE@Z:PROC ; ReadString + Line 131: EXTRN ?Link@FThinkerCollection@@QEAAXPEAVDThinker@@H@Z:PROC ; FThinkerCollection::Link + Line 132: EXTRN ??0FScanner@@QEAA@XZ:PROC ; FScanner::FScanner + Line 133: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 134: EXTRN ?OpenFile@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::OpenFile + Line 135: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 136: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 137: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 138: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 139: EXTRN ?MatchString@FScanner@@QEAAHPEBQEBD_K@Z:PROC ; FScanner::MatchString + Line 140: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 141: EXTRN ??0FStat@@QEAA@PEBD@Z:PROC ; FStat::FStat + Line 142: EXTRN ??1FStat@@UEAA@XZ:PROC ; FStat::~FStat + Line 143: EXTRN ?LinkToWorld@AActor@@QEAAXPEAUFLinkContext@@_NPEAUsector_t@@@Z:PROC ; AActor::LinkToWorld + Line 144: EXTRN ?UnlinkFromWorld@AActor@@QEAAXPEAUFLinkContext@@@Z:PROC ; AActor::UnlinkFromWorld + Line 145: EXTRN ?ClearPlayer@FCajunMaster@@QEAAXH_N@Z:PROC ; FCajunMaster::ClearPlayer + Line 146: EXTRN ?Construct@DBot@@QEAAXXZ:PROC ; DBot::Construct + Line 147: EXTRN ?IsNum@@YA_NPEBD@Z:PROC ; IsNum + Line 148: EXTRN ?copystring@@YAPEADPEBD@Z:PROC ; copystring + Line 149: EXTRN ?M_GetCajunPath@@YA?AVFString@@PEBD@Z:PROC ; M_GetCajunPath + Line 150: EXTRN ?AttachToPlayer@DBaseStatusBar@@QEAAXPEAVplayer_t@@@Z:PROC ; DBaseStatusBar::AttachToPlayer + Line 151: EXTRN ?StartTypedScripts@FBehaviorContainer@@QEAAXGPEAVAActor@@_NH1@Z:PROC ; FBehaviorContainer::StartTypedScripts + Line 152: EXTRN ?IsValidTeam@FTeam@@QEAA_NI@Z:PROC ; FTeam::IsValidTeam + Line 153: EXTRN ?GetName@FTeam@@QEBAPEBDXZ:PROC ; FTeam::GetName + Line 154: EXTRN ?Net_WriteByte@@YAXE@Z:PROC ; Net_WriteByte + Line 155: EXTRN ?Net_WriteString@@YAXPEBD@Z:PROC ; Net_WriteString + Line 156: EXTRN ?D_ReadUserInfoStrings@@YAXHPEAPEAE_N@Z:PROC ; D_ReadUserInfoStrings + Line 157: EXTRN ?E_PlayerDisconnected@@YAXH@Z:PROC ; E_PlayerDisconnected + Line 158: EXTRN ?DoReborn@FLevelLocals@@QEAAXH_N@Z:PROC ; FLevelLocals::DoReborn + Line 159: EXTRN __CxxFrameHandler3:PROC + Line 160: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 161: EXTRN ?PerfToMillisec@@3NA:QWORD ; PerfToMillisec + Line 162: EXTRN ?RegistrationInfo@DBot@@2UClassReg@@A:BYTE ; DBot::RegistrationInfo + Line 163: EXTRN ?bot_next_color@@3VFIntCVar@@A:BYTE ; bot_next_color + Line 164: EXTRN ?bot_observer@@3VFBoolCVar@@A:BYTE ; bot_observer + Line 165: EXTRN ?gamestate@@3W4gamestate_t@@A:DWORD ; gamestate + Line 166: EXTRN ?netgame@@3_NA:BYTE ; netgame + Line 167: EXTRN ?multiplayer@@3_NA:BYTE ; multiplayer + Line 168: EXTRN ?deathmatch@@3VFIntCVar@@A:BYTE ; deathmatch + Line 169: EXTRN ?teamplay@@3VFBoolCVar@@A:BYTE ; teamplay + Line 170: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 171: EXTRN ?demoplayback@@3_NA:BYTE ; demoplayback + Line 172: EXTRN ?playeringame@@3PA_NA:BYTE ; playeringame + Line 173: EXTRN ?Net_Arbitrator@@3HA:DWORD ; Net_Arbitrator + Line 174: EXTRN ?StatusBar@@3PEAVDBaseStatusBar@@EA:QWORD ; StatusBar + Line 175: EXTRN ?TeamLibrary@@3VFTeam@@A:BYTE ; TeamLibrary + Line 176: EXTRN ?Teams@@3V?$TArray@VFTeam@@V1@@@A:BYTE ; Teams + Line 177: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 178: EXTRN __ImageBase:BYTE + Line 179: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\b_move.cod (24 hits) + Line 51: EXTRN atexit:PROC + Line 52: EXTRN __std_terminate:PROC + Line 53: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 54: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 55: EXTRN c_atan:PROC + Line 56: EXTRN c_atan2:PROC + Line 57: EXTRN c_sqrt:PROC + Line 58: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 59: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 60: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 61: EXTRN ?SafeCheckPosition@FCajunMaster@@QEAA_NPEAVAActor@@NNAEAUFCheckPosition@@@Z:PROC ; FCajunMaster::SafeCheckPosition + Line 62: EXTRN ?Check_LOS@DBot@@QEAA_NPEAVAActor@@U?$TAngle@N@@@Z:PROC ; DBot::Check_LOS + Line 63: EXTRN ?Reachable@DBot@@AEAA_NPEAVAActor@@@Z:PROC ; DBot::Reachable + Line 64: EXTRN ?P_CheckKeys@@YAHPEAVAActor@@H_N1@Z:PROC ; P_CheckKeys + Line 65: EXTRN ?P_TestActivateLine@@YA_NPEAUline_t@@PEAVAActor@@HHPEAU?$TVector3@N@@@Z:PROC ; P_TestActivateLine + Line 66: EXTRN __CxxFrameHandler3:PROC + Line 67: EXTRN ?spechit@@3V?$TArray@Uspechit_t@@U1@@@A:BYTE ; spechit + Line 68: EXTRN ?BotInfo@@3V?$TMap@VFName@@UBotInfoData@@U?$THashTraits@VFName@@@@U?$TValueTraits@UBotInfoData@@@@@@A:BYTE ; BotInfo + Line 69: EXTRN ?xspeed@@3PANA:BYTE ; xspeed + Line 70: EXTRN ?yspeed@@3PANA:BYTE ; yspeed + Line 71: EXTRN ?opposite@@3PAW4dirtype_t@@A:BYTE ; opposite + Line 72: EXTRN ?diags@@3PAW4dirtype_t@@A:BYTE ; diags + Line 73: EXTRN __ImageBase:BYTE + Line 74: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\b_think.cod (37 hits) + Line 45: EXTRN atexit:PROC + Line 46: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 47: EXTRN c_atan2:PROC + Line 48: EXTRN c_sqrt:PROC + Line 49: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 50: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 51: EXTRN ?P_CheckSight@@YAHPEAVAActor@@0H@Z:PROC ; P_CheckSight + Line 52: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 53: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 54: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 55: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@HPEAVDThinker@@@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 56: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 57: EXTRN ?FindInventory@AActor@@QEAAPEAV1@PEAVPClassActor@@_N@Z:PROC ; AActor::FindInventory + Line 58: EXTRN ?IsFriend@AActor@@QEAA_NPEAV1@@Z:PROC ; AActor::IsFriend + Line 59: EXTRN ?Check_LOS@DBot@@QEAA_NPEAVAActor@@U?$TAngle@N@@@Z:PROC ; DBot::Check_LOS + Line 60: EXTRN ?Reachable@DBot@@AEAA_NPEAVAActor@@@Z:PROC ; DBot::Reachable + Line 61: EXTRN ?Dofire@DBot@@AEAAXPEAUticcmd_t@@@Z:PROC ; DBot::Dofire + Line 62: EXTRN ?Choose_Mate@DBot@@AEAAPEAVAActor@@XZ:PROC ; DBot::Choose_Mate + Line 63: EXTRN ?Find_enemy@DBot@@AEAAPEAVAActor@@XZ:PROC ; DBot::Find_enemy + Line 64: EXTRN ?Roam@DBot@@AEAAXPEAUticcmd_t@@@Z:PROC ; DBot::Roam + Line 65: EXTRN ?TurnToAng@DBot@@AEAAXXZ:PROC ; DBot::TurnToAng + Line 66: EXTRN ?Pitch@DBot@@AEAAXPEAVAActor@@@Z:PROC ; DBot::Pitch + Line 67: EXTRN ?P_GetRealMaxHealth@@YAHPEAVAActor@@H@Z:PROC ; P_GetRealMaxHealth + Line 68: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 69: EXTRN ?deathmatch@@3VFIntCVar@@A:BYTE ; deathmatch + Line 70: EXTRN ?alwaysapplydmflags@@3VFBoolCVar@@A:BYTE ; alwaysapplydmflags + Line 71: EXTRN ?teamplay@@3VFBoolCVar@@A:BYTE ; teamplay + Line 72: EXTRN ?gametic@@3HA:DWORD ; gametic + Line 73: EXTRN ?playeringame@@3PA_NA:BYTE ; playeringame + Line 74: EXTRN ?dmflags@@3VFIntCVar@@A:BYTE ; dmflags + Line 75: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 76: EXTRN ?BotInfo@@3V?$TMap@VFName@@UBotInfoData@@U?$THashTraits@VFName@@@@U?$TValueTraits@UBotInfoData@@@@@@A:BYTE ; BotInfo + Line 77: EXTRN ?netcmds@@3PAY0CE@Uticcmd_t@@A:BYTE ; netcmds + Line 78: EXTRN ?ticdup@@3HA:DWORD ; ticdup + Line 79: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 80: EXTRN __ImageBase:BYTE + Line 81: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\base_sysfb.cod (44 hits) + Line 51: EXTRN _purecall:PROC + Line 52: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 53: EXTRN __imp_ShowWindow:PROC + Line 54: EXTRN __imp_MoveWindow:PROC + Line 55: EXTRN __imp_SetWindowPos:PROC + Line 56: EXTRN __imp_IsZoomed:PROC + Line 57: EXTRN __imp_GetDC:PROC + Line 58: EXTRN __imp_ReleaseDC:PROC + Line 59: EXTRN __imp_GetClientRect:PROC + Line 60: EXTRN __imp_GetWindowRect:PROC + Line 61: EXTRN __imp_AdjustWindowRectEx:PROC + Line 62: EXTRN __imp_GetWindowLongA:PROC + Line 63: EXTRN __imp_SetWindowLongA:PROC + Line 64: EXTRN __imp_EnumDisplaySettingsA:PROC + Line 65: EXTRN __imp_GetMonitorInfoA:PROC + Line 66: EXTRN ?_Xbad_function_call@std@@YAXXZ:PROC ; std::_Xbad_function_call + Line 67: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 68: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 69: EXTRN ??0DFrameBuffer@@QEAA@HH@Z:PROC ; DFrameBuffer::DFrameBuffer + Line 70: EXTRN ??1DFrameBuffer@@UEAA@XZ:PROC ; DFrameBuffer::~DFrameBuffer + Line 71: EXTRN ?SetSize@DFrameBuffer@@QEAAXHH@Z:PROC ; DFrameBuffer::SetSize + Line 72: EXTRN ?Update@DFrameBuffer@@UEAAXXZ:PROC ; DFrameBuffer::Update + Line 73: EXTRN ?SetVSync@DFrameBuffer@@UEAAX_N@Z:PROC ; DFrameBuffer::SetVSync + Line 74: EXTRN ?GetCaps@DFrameBuffer@@UEAAIXZ:PROC ; DFrameBuffer::GetCaps + Line 75: EXTRN ?WriteSavePic@DFrameBuffer@@UEAAXPEAVplayer_t@@PEAVFileWriter@@HH@Z:PROC ; DFrameBuffer::WriteSavePic + Line 76: EXTRN ?WipeStartScreen@DFrameBuffer@@UEAAPEAVFTexture@@XZ:PROC ; DFrameBuffer::WipeStartScreen + Line 77: EXTRN ?WipeEndScreen@DFrameBuffer@@UEAAPEAVFTexture@@XZ:PROC ; DFrameBuffer::WipeEndScreen + Line 78: EXTRN ?SetViewportRects@DFrameBuffer@@UEAAXPEAUIntRect@@@Z:PROC ; DFrameBuffer::SetViewportRects + Line 79: EXTRN ??_ESystemBaseFrameBuffer@@UEAAPEAXI@Z:PROC ; SystemBaseFrameBuffer::`vector deleting destructor' + Line 80: EXTRN ?I_GetEvent@@YAXXZ:PROC ; I_GetEvent + Line 81: EXTRN ?CheckParm@FArgs@@QEBAHPEBDH@Z:PROC ; FArgs::CheckParm + Line 82: EXTRN __CxxFrameHandler3:PROC + Line 83: EXTRN memset:PROC + Line 84: EXTRN ?fullscreen@@3VFBoolCVar@@A:BYTE ; fullscreen + Line 85: EXTRN ?win_x@@3VFIntCVar@@A:BYTE ; win_x + Line 86: EXTRN ?win_y@@3VFIntCVar@@A:BYTE ; win_y + Line 87: EXTRN ?win_w@@3VFIntCVar@@A:BYTE ; win_w + Line 88: EXTRN ?win_h@@3VFIntCVar@@A:BYTE ; win_h + Line 89: EXTRN ?win_maximized@@3VFBoolCVar@@A:BYTE ; win_maximized + Line 90: EXTRN ?Video@@3PEAVIVideo@@EA:QWORD ; Video + Line 91: EXTRN ?Args@@3PEAVFArgs@@EA:QWORD ; Args + Line 92: EXTRN ?Window@@3PEAUHWND__@@EA:QWORD ; Window + Line 93: EXTRN ?vid_defwidth@@3VFIntCVar@@A:BYTE ; vid_defwidth + Line 94: EXTRN ?vid_defheight@@3VFIntCVar@@A:BYTE ; vid_defheight + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\bbannouncer.cod (19 hits) + Line 562: EXTRN atexit:PROC + Line 563: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 564: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 565: EXTRN ?S_Sound@@YAXHVFSoundID@@MM@Z:PROC ; S_Sound + Line 566: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 567: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 568: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 569: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 570: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 571: EXTRN ?CheckLocalView@AActor@@QEBA_NH@Z:PROC ; AActor::CheckLocalView + Line 572: EXTRN ??RFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator() + Line 573: EXTRN ?PronounMessage@@YAXPEBDPEADH00@Z:PROC ; PronounMessage + Line 574: EXTRN ?M_Random@@3VFRandom@@A:BYTE ; M_Random + Line 575: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 576: EXTRN ?multiplayer@@3_NA:BYTE ; multiplayer + Line 577: EXTRN ?deathmatch@@3VFIntCVar@@A:BYTE ; deathmatch + Line 578: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 579: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 580: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\bitmap.cod (5 hits) + Line 137: EXTRN memset:PROC + Line 138: EXTRN ?IcePalette@@3QAY02$$CBEA:BYTE ; IcePalette + Line 139: EXTRN ?SpecialColormaps@@3V?$TArray@UFSpecialColormap@@U1@@@A:BYTE ; SpecialColormaps + Line 140: EXTRN __ImageBase:BYTE + Line 141: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\brightmaptexture.cod (15 hits) + Line 18: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 19: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 20: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 21: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 22: EXTRN ?CreatePalettedPixels@FImageSource@@MEAA?AV?$TArray@EE@@H@Z:PROC ; FImageSource::CreatePalettedPixels + Line 23: EXTRN ?CopyPixels@FImageSource@@MEAAHPEAVFBitmap@@H@Z:PROC ; FImageSource::CopyPixels + Line 24: EXTRN ?CopyTranslatedPixels@FImageSource@@IEAAHPEAVFBitmap@@PEAUPalEntry@@@Z:PROC ; FImageSource::CopyTranslatedPixels + Line 25: EXTRN ?CollectForPrecache@FImageSource@@UEAAXAEAV?$TMap@HU?$pair@HH@std@@U?$THashTraits@H@@U?$TValueTraits@U?$pair@HH@std@@@@@@_N@Z:PROC ; FImageSource::CollectForPrecache + Line 26: EXTRN ??_EFImageSource@@UEAAPEAXI@Z:PROC ; FImageSource::`vector deleting destructor' + Line 27: EXTRN ??0FImageTexture@@QEAA@PEAVFImageSource@@PEBD@Z:PROC ; FImageTexture::FImageTexture + Line 28: EXTRN ??_EFBrightmapTexture@@UEAAPEAXI@Z:PROC ; FBrightmapTexture::`vector deleting destructor' + Line 29: EXTRN __CxxFrameHandler3:PROC + Line 30: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 31: EXTRN ?ImageArena@FImageSource@@1VFMemArena@@A:BYTE ; FImageSource::ImageArena + Line 32: EXTRN ?NextID@FImageSource@@1HA:DWORD ; FImageSource::NextID + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\buildtexture.cod (44 hits) + Line 24: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 25: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 26: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 27: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 28: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 29: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 30: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 31: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 32: EXTRN ?ToLower@FString@@QEAAXXZ:PROC ; FString::ToLower + Line 33: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 34: EXTRN ??0FStringf@@QEAA@PEBDZZ:PROC ; FStringf::FStringf + Line 35: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 36: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 37: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForFullName + Line 38: EXTRN ?ReadLump@FWadCollection@@QEAAXHPEAX@Z:PROC ; FWadCollection::ReadLump + Line 39: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 40: EXTRN ?LumpLength@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::LumpLength + Line 41: EXTRN ?GetLumpFullName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetLumpFullName + Line 42: EXTRN ?GetLumpFile@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpFile + Line 43: EXTRN ?GetNumLumps@FWadCollection@@QEBAHXZ:PROC ; FWadCollection::GetNumLumps + Line 44: EXTRN ?ExtractFilePath@@YA?AVFString@@PEBD@Z:PROC ; ExtractFilePath + Line 45: EXTRN ?ExtractFileBase@@YA?AVFString@@PEBD_N@Z:PROC ; ExtractFileBase + Line 46: EXTRN ?Pick@FColorMatcher@@QEAAEHHH@Z:PROC ; FColorMatcher::Pick + Line 47: EXTRN ?CopyPixelData@FBitmap@@QEAAXHHPEBEHHHHHPEAUPalEntry@@PEAUFCopyInfo@@@Z:PROC ; FBitmap::CopyPixelData + Line 48: EXTRN ??0FRemapTable@@QEAA@H@Z:PROC ; FRemapTable::FRemapTable + Line 49: EXTRN ??1FRemapTable@@QEAA@XZ:PROC ; FRemapTable::~FRemapTable + Line 50: EXTRN ?StoreTranslation@FRemapTable@@QEAAHH@Z:PROC ; FRemapTable::StoreTranslation + Line 51: EXTRN ?AddTexture@FTextureManager@@QEAA?AVFTextureID@@PEAVFTexture@@@Z:PROC ; FTextureManager::AddTexture + Line 52: EXTRN ?AddSimpleAnim@FTextureManager@@AEAAPEAUFAnimDef@@VFTextureID@@HII@Z:PROC ; FTextureManager::AddSimpleAnim + Line 53: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 54: EXTRN ?CreatePalettedPixels@FImageSource@@MEAA?AV?$TArray@EE@@H@Z:PROC ; FImageSource::CreatePalettedPixels + Line 55: EXTRN ?CopyPixels@FImageSource@@MEAAHPEAVFBitmap@@H@Z:PROC ; FImageSource::CopyPixels + Line 56: EXTRN ?CollectForPrecache@FImageSource@@UEAAXAEAV?$TMap@HU?$pair@HH@std@@U?$THashTraits@H@@U?$TValueTraits@U?$pair@HH@std@@@@@@_N@Z:PROC ; FImageSource::CollectForPrecache + Line 57: EXTRN ??_EFImageSource@@UEAAPEAXI@Z:PROC ; FImageSource::`vector deleting destructor' + Line 58: EXTRN ??0FImageTexture@@QEAA@PEAVFImageSource@@PEBD@Z:PROC ; FImageTexture::FImageTexture + Line 59: EXTRN ??_EFBuildTexture@@UEAAPEAXI@Z:PROC ; FBuildTexture::`vector deleting destructor' + Line 60: EXTRN __CxxFrameHandler3:PROC + Line 61: EXTRN strcmp:PROC + Line 62: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 63: EXTRN ?ColorMatcher@@3VFColorMatcher@@A:QWORD ; ColorMatcher + Line 64: EXTRN ?translationtables@@3PAV?$TAutoGrowArray@VFRemapTablePtr@@PEAUFRemapTable@@@@A:BYTE ; translationtables + Line 65: EXTRN ?SpriteFrames@@3V?$TArray@Uspriteframe_t@@U1@@@A:BYTE ; SpriteFrames + Line 66: EXTRN ?ImageArena@FImageSource@@1VFMemArena@@A:BYTE ; FImageSource::ImageArena + Line 67: EXTRN ?NextID@FImageSource@@1HA:DWORD ; FImageSource::NextID + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\c_bind.cod (39 hits) + Line 382: EXTRN ?InMenu@DMenu@@2HA:DWORD ; DMenu::InMenu + Line 383: EXTRN ?IsAlias@FConsoleCommand@@UEAA_NXZ:PROC ; FConsoleCommand::IsAlias + Line 384: EXTRN ?Run@FUnsafeConsoleCommand@@UEAAXAEAVFCommandLine@@PEAVAActor@@H@Z:PROC ; FUnsafeConsoleCommand::Run + Line 385: EXTRN ??_EFUnsafeConsoleCommand@@UEAAPEAXI@Z:PROC ; FUnsafeConsoleCommand::`vector deleting destructor' + Line 2395: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 2396: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 2397: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 2398: EXTRN atexit:PROC + Line 2399: EXTRN __std_terminate:PROC + Line 2400: EXTRN atoi:PROC + Line 2401: EXTRN stricmp:PROC + Line 2402: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 2403: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 2404: EXTRN ?LockBuffer@FString@@QEAAPEADXZ:PROC ; FString::LockBuffer + Line 2405: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 2406: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 2407: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 2408: EXTRN mysnprintf:PROC + Line 2409: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 2410: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 2411: EXTRN ?AddCommandString@@YAXPEBDH@Z:PROC ; AddCommandString + Line 2412: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 2413: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 2414: EXTRN ??0FScanner@@QEAA@H@Z:PROC ; FScanner::FScanner + Line 2415: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 2416: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 2417: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 2418: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 2419: EXTRN ?ClearKey@FConfigFile@@QEAAXPEBD@Z:PROC ; FConfigFile::ClearKey + Line 2420: EXTRN ?SetValueForKey@FConfigFile@@QEAAXPEBD0_N@Z:PROC ; FConfigFile::SetValueForKey + Line 2421: EXTRN ?FindLump@FWadCollection@@QEAAHPEBDPEAH_N@Z:PROC ; FWadCollection::FindLump + Line 2422: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 2423: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 2424: EXTRN ?I_msTime@@YA_KXZ:PROC ; I_msTime + Line 2425: EXTRN __CxxFrameHandler3:PROC + Line 2426: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 2427: EXTRN ?chatmodeon@@3HA:DWORD ; chatmodeon + Line 2428: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 2429: EXTRN __ImageBase:BYTE + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\c_cmds.cod (110 hits) + Line 86: EXTRN ?netgame@@3_NA:BYTE ; netgame + Line 87: EXTRN ?Logfile@@3PEAU_iobuf@@EA:QWORD ; Logfile + Line 88: EXTRN ?IsAlias@FConsoleCommand@@UEAA_NXZ:PROC ; FConsoleCommand::IsAlias + Line 89: EXTRN ?Run@FUnsafeConsoleCommand@@UEAAXAEAVFCommandLine@@PEAVAActor@@H@Z:PROC ; FUnsafeConsoleCommand::Run + Line 90: EXTRN ??_EFUnsafeConsoleCommand@@UEAAPEAXI@Z:PROC ; FUnsafeConsoleCommand::`vector deleting destructor' + Line 616: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 617: EXTRN atexit:PROC + Line 618: EXTRN __std_terminate:PROC + Line 619: EXTRN exit:PROC + Line 620: EXTRN atoi:PROC + Line 621: EXTRN strtol:PROC + Line 622: EXTRN strtoll:PROC + Line 623: EXTRN strtoull:PROC + Line 624: EXTRN fclose:PROC + Line 625: EXTRN fopen:PROC + Line 626: EXTRN strncmp:PROC + Line 627: EXTRN stricmp:PROC + Line 628: EXTRN strnicmp:PROC + Line 629: EXTRN getcwd:PROC + Line 630: EXTRN chdir:PROC + Line 631: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 632: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 633: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 634: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 635: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 636: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 637: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 638: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 639: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 640: EXTRN ?StripRight@FString@@QEAAXPEBD@Z:PROC ; FString::StripRight + Line 641: EXTRN ?Substitute@FString@@QEAAXPEBD0@Z:PROC ; FString::Substitute + Line 642: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 643: EXTRN ?GetGitHash@@YAPEBDXZ:PROC ; GetGitHash + Line 644: EXTRN ?GetGitTime@@YAPEBDXZ:PROC ; GetGitTime + Line 645: EXTRN ?GetVersionString@@YAPEBDXZ:PROC ; GetVersionString + Line 646: EXTRN ?C_ToggleConsole@@YAXXZ:PROC ; C_ToggleConsole + Line 647: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 648: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 649: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 650: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 651: EXTRN ?C_ExecFile@@YA_NPEBD@Z:PROC ; C_ExecFile + Line 652: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 653: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 654: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 655: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 656: EXTRN ?I_FindFirst@@YAPEAXPEBDPEAUfindstate_t@@@Z:PROC ; I_FindFirst + Line 657: EXTRN ?I_FindNext@@YAHPEAXPEAUfindstate_t@@@Z:PROC ; I_FindNext + Line 658: EXTRN ?I_FindClose@@YAHPEAX@Z:PROC ; I_FindClose + Line 659: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 660: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 661: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 662: EXTRN ??RFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator() + Line 663: EXTRN ??AFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator[] + Line 664: EXTRN ?G_LoadGame@@YAXPEBD_N@Z:PROC ; G_LoadGame + Line 665: EXTRN ?G_SaveGame@@YAXPEBD0@Z:PROC ; G_SaveGame + Line 666: EXTRN ?CheckWarpTransMap@@YA_NAEAVFString@@_N@Z:PROC ; CheckWarpTransMap + Line 667: EXTRN ?G_DeferedInitNew@@YAXPEBDH@Z:PROC ; G_DeferedInitNew + Line 668: EXTRN ?FindLevelInfo@@YAPEAUlevel_info_t@@PEBD_N@Z:PROC ; FindLevelInfo + Line 669: EXTRN ?CalcMapName@@YA?AVFString@@HH@Z:PROC ; CalcMapName + Line 670: EXTRN ?G_SkillProperty@@YAHW4ESkillProperty@@@Z:PROC ; G_SkillProperty + Line 671: EXTRN ?CheckIfWadLoaded@FWadCollection@@QEAAHPEBD@Z:PROC ; FWadCollection::CheckIfWadLoaded + Line 672: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 673: EXTRN ?OpenLumpReader@FWadCollection@@QEAA?AVFileReader@@H@Z:PROC ; FWadCollection::OpenLumpReader + Line 674: EXTRN ?GetLumpFullName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetLumpFullName + Line 675: EXTRN ?GetLumpFile@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpFile + Line 676: EXTRN ?GetNumLumps@FWadCollection@@QEBAHXZ:PROC ; FWadCollection::GetNumLumps + Line 677: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 678: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 679: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 680: EXTRN ?GetTextureID@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::GetTextureID + Line 681: EXTRN ?IsMapActor@AActor@@QEAA_NXZ:PROC ; AActor::IsMapActor + Line 682: EXTRN ?InitSkyMap@@YAXPEAUFLevelLocals@@@Z:PROC ; InitSkyMap + Line 683: EXTRN ?P_CheckMapData@@YA_NPEBD@Z:PROC ; P_CheckMapData + Line 684: EXTRN ?DefaultExtension@@YAXAEAVFString@@PEBD@Z:PROC ; DefaultExtension + Line 685: EXTRN ?ExtractFilePath@@YA?AVFString@@PEBD@Z:PROC ; ExtractFilePath + Line 686: EXTRN ?copystring@@YAPEADPEBD@Z:PROC ; copystring + Line 687: EXTRN ?myasctime@@YAPEBDXZ:PROC ; myasctime + Line 688: EXTRN ?NicePath@@YA?AVFString@@PEBD@Z:PROC ; NicePath + Line 689: EXTRN ?Net_WriteByte@@YAXE@Z:PROC ; Net_WriteByte + Line 690: EXTRN ?Net_WriteWord@@YAXF@Z:PROC ; Net_WriteWord + Line 691: EXTRN ?Net_WriteLong@@YAXH@Z:PROC ; Net_WriteLong + Line 692: EXTRN ?Net_WriteString@@YAXPEBD@Z:PROC ; Net_WriteString + Line 693: EXTRN ?V_BreakLines@@YA?AV?$TArray@UFBrokenLines@@U1@@@PEAVFFont@@HPEBE_N@Z:PROC ; V_BreakLines + Line 694: EXTRN ?P_FindLineSpecial@@YAHPEBDPEAH1@Z:PROC ; P_FindLineSpecial + Line 695: EXTRN ?R_ResetViewInterpolation@@YAXXZ:PROC ; R_ResetViewInterpolation + Line 696: EXTRN ?C_AimLine@@YAXPEAUFTranslatedLineTarget@@_N@Z:PROC ; C_AimLine + Line 697: EXTRN ?C_PrintInfo@@YAXPEAVAActor@@_N@Z:PROC ; C_PrintInfo + Line 698: EXTRN __CxxFrameHandler3:PROC + Line 699: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 700: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 701: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 702: EXTRN ?deathmatch@@3VFIntCVar@@A:BYTE ; deathmatch + Line 703: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 704: EXTRN ?usergame@@3_NA:BYTE ; usergame + Line 705: EXTRN ?demoplayback@@3_NA:BYTE ; demoplayback + Line 706: EXTRN ?dmflags2@@3VFIntCVar@@A:BYTE ; dmflags2 + Line 707: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 708: EXTRN ?gamestate@@3W4gamestate_t@@A:DWORD ; gamestate + Line 709: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 710: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 711: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 712: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 713: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 714: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 715: EXTRN ?ConFont@@3PEAVFFont@@EA:QWORD ; ConFont + Line 716: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 717: EXTRN ?insave@@3_NA:BYTE ; insave + Line 718: EXTRN ?chasedemo@@3VFBoolCVar@@A:BYTE ; chasedemo + Line 719: EXTRN ?r_renderercaps@@3IA:DWORD ; r_renderercaps + Line 720: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\c_console.cod (112 hits) + Line 61: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 62: EXTRN ?IsAlias@FConsoleCommand@@UEAA_NXZ:PROC ; FConsoleCommand::IsAlias + Line 63: EXTRN ?Run@FUnsafeConsoleCommand@@UEAAXAEAVFCommandLine@@PEAVAActor@@H@Z:PROC ; FUnsafeConsoleCommand::Run + Line 64: EXTRN ??_EFUnsafeConsoleCommand@@UEAAPEAXI@Z:PROC ; FUnsafeConsoleCommand::`vector deleting destructor' + Line 361: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 362: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 363: EXTRN atexit:PROC + Line 364: EXTRN __std_terminate:PROC + Line 365: EXTRN free:PROC + Line 366: EXTRN fflush:PROC + Line 367: EXTRN fputs:PROC + Line 368: EXTRN stricmp:PROC + Line 369: EXTRN strnicmp:PROC + Line 370: EXTRN tolower:PROC + Line 371: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 372: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 373: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 374: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 375: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 376: EXTRN ??0FString@@QEAA@PEBD_K@Z:PROC ; FString::FString + Line 377: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 378: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 379: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 380: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 381: EXTRN ??HFString@@QEBA?AV0@AEBV0@@Z:PROC ; FString::operator+ + Line 382: EXTRN ??YFString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator+= + Line 383: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 384: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 385: EXTRN ?AppendCStrPart@FString@@QEAAAEAV1@PEBD_K@Z:PROC ; FString::AppendCStrPart + Line 386: EXTRN ?IndexOfAny@FString@@QEBAJPEBDJ@Z:PROC ; FString::IndexOfAny + Line 387: EXTRN ?StripLeftRight@FString@@QEAAXXZ:PROC ; FString::StripLeftRight + Line 388: EXTRN ?Insert@FString@@QEAAX_KAEBV1@@Z:PROC ; FString::Insert + Line 389: EXTRN ?Insert@FString@@QEAAX_KPEBD0@Z:PROC ; FString::Insert + Line 390: EXTRN ?VFormat@FString@@QEAAXPEBDPEAD@Z:PROC ; FString::VFormat + Line 391: EXTRN ?Truncate@FString@@QEAAX_K@Z:PROC ; FString::Truncate + Line 392: EXTRN ?Remove@FString@@QEAAX_K0@Z:PROC ; FString::Remove + Line 393: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 394: EXTRN mysnprintf:PROC + Line 395: EXTRN ?P_FreeLevelData@@YAXXZ:PROC ; P_FreeLevelData + Line 396: EXTRN ?GetVersionString@@YAPEBDXZ:PROC ; GetVersionString + Line 397: EXTRN ?G_CheckDemoStatus@@YA_NXZ:PROC ; G_CheckDemoStatus + Line 398: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 399: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 400: EXTRN ?FindCVar@@YAPEAVFBaseCVar@@PEBDPEAPEAV1@@Z:PROC ; FindCVar + Line 401: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 402: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 403: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 404: EXTRN ??0FStringCVar@@QEAA@PEBD0IP6AXAEAV0@@Z@Z:PROC ; FStringCVar::FStringCVar + Line 405: EXTRN ??1FStringCVar@@UEAA@XZ:PROC ; FStringCVar::~FStringCVar + Line 406: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 407: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 408: EXTRN ?AddCommandString@@YAXPEBDH@Z:PROC ; AddCommandString + Line 409: EXTRN ?C_DoCommand@@YAXPEBDH@Z:PROC ; C_DoCommand + Line 410: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 411: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 412: EXTRN ?FindByName@FConsoleCommand@@SAPEAV1@PEBD@Z:PROC ; FConsoleCommand::FindByName + Line 413: EXTRN ?I_PrintStr@@YAXPEBD@Z:PROC ; I_PrintStr + Line 414: EXTRN ?I_PutInClipboard@@YAXPEBD@Z:PROC ; I_PutInClipboard + Line 415: EXTRN ?I_GetFromClipboard@@YA?AVFString@@_N@Z:PROC ; I_GetFromClipboard + Line 416: EXTRN ?V_SetBlend@@YAXHHHH@Z:PROC ; V_SetBlend + Line 417: EXTRN ?CheckForTexture@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::CheckForTexture + Line 418: EXTRN ?GetTextureID@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::GetTextureID + Line 419: EXTRN ?Clear@DFrameBuffer@@QEAAXHHHHHI@Z:PROC ; DFrameBuffer::Clear + Line 420: EXTRN ?DrawTexture@DFrameBuffer@@QEAAXPEAVFTexture@@NNHZZ:PROC ; DFrameBuffer::DrawTexture + Line 421: EXTRN ?DrawText@DFrameBuffer@@QEAAXPEAVFFont@@HNNPEBDHZZ:PROC ; DFrameBuffer::DrawText + Line 422: EXTRN ?DrawChar@DFrameBuffer@@QEAAXPEAVFFont@@HNNHHZZ:PROC ; DFrameBuffer::DrawChar + Line 423: EXTRN ?GetUIScale@@YAHH@Z:PROC ; GetUIScale + Line 424: EXTRN ?StringWidth@FFont@@QEBAHPEBE@Z:PROC ; FFont::StringWidth + Line 425: EXTRN ?V_BreakLines@@YA?AV?$TArray@UFBrokenLines@@U1@@@PEAVFFont@@HPEBE_N@Z:PROC ; V_BreakLines + Line 426: EXTRN ??0DHUDMessage@@QEAA@PEAVFFont@@PEBDMMHHW4EColorRange@@M@Z:PROC ; DHUDMessage::DHUDMessage + Line 427: EXTRN ?AttachMessage@DBaseStatusBar@@QEAAXPEAVDHUDMessageBase@@IH@Z:PROC ; DBaseStatusBar::AttachMessage + Line 428: EXTRN ?DetachMessage@DBaseStatusBar@@QEAAPEAVDHUDMessageBase@@I@Z:PROC ; DBaseStatusBar::DetachMessage + Line 429: EXTRN ?S_Start@@YAXXZ:PROC ; S_Start + Line 430: EXTRN ?strbin1@@YA?AVFString@@PEBD@Z:PROC ; strbin1 + Line 431: EXTRN ?D_QuitNetGame@@YAXXZ:PROC ; D_QuitNetGame + Line 432: EXTRN ??RFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator() + Line 433: EXTRN ??0FConsoleBuffer@@QEAA@XZ:PROC ; FConsoleBuffer::FConsoleBuffer + Line 434: EXTRN ??1FConsoleBuffer@@QEAA@XZ:PROC ; FConsoleBuffer::~FConsoleBuffer + Line 435: EXTRN ?AddText@FConsoleBuffer@@QEAAXHPEBDPEAU_iobuf@@@Z:PROC ; FConsoleBuffer::AddText + Line 436: EXTRN ?FormatText@FConsoleBuffer@@QEAAXPEAVFFont@@H@Z:PROC ; FConsoleBuffer::FormatText + Line 437: EXTRN ?ResizeBuffer@FConsoleBuffer@@QEAAXI@Z:PROC ; FConsoleBuffer::ResizeBuffer + Line 438: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 439: EXTRN ?FStringFormat@@YA?AVFString@@PEAUVMValue@@HPEAUVMReturn@@HH@Z:PROC ; FStringFormat + Line 440: EXTRN __CxxFrameHandler3:PROC + Line 441: EXTRN memmove:PROC + Line 442: EXTRN memset:PROC + Line 443: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 444: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 445: EXTRN ?gamestate@@3W4gamestate_t@@A:DWORD ; gamestate + Line 446: EXTRN ?Bindings@@3VFKeyBindings@@A:BYTE ; Bindings + Line 447: EXTRN ?CVars@@3PEAVFBaseCVar@@EA:QWORD ; CVars + Line 448: EXTRN ?chatmodeon@@3HA:DWORD ; chatmodeon + Line 449: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 450: EXTRN ?DisplayWidth@@3HA:DWORD ; DisplayWidth + Line 451: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 452: EXTRN ?SmallFont@@3PEAVFFont@@EA:QWORD ; SmallFont + Line 453: EXTRN ?ConFont@@3PEAVFFont@@EA:QWORD ; ConFont + Line 454: EXTRN ?RegistrationInfo@DHUDMessage@@2UClassReg@@A:BYTE ; DHUDMessage::RegistrationInfo + Line 455: EXTRN ?StatusBar@@3PEAVDBaseStatusBar@@EA:QWORD ; StatusBar + Line 456: EXTRN ?menuactive@@3W4EMenuState@@A:DWORD ; menuactive + Line 457: EXTRN ?demoplayback@@3_NA:BYTE ; demoplayback + Line 458: EXTRN ?gametic@@3HA:DWORD ; gametic + Line 459: EXTRN ?developer@@3VFIntCVar@@A:BYTE ; developer + Line 460: EXTRN ?gameaction@@3W4gameaction_t@@A:DWORD ; gameaction + Line 461: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 462: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 463: EXTRN ?advancedemo@@3_NA:BYTE ; advancedemo + Line 464: EXTRN ?Commands@@3PAPEAVFConsoleCommand@@A:BYTE ; Commands + Line 465: EXTRN ?show_messages@@3VFBoolCVar@@A:BYTE ; show_messages + Line 466: EXTRN ?gameisdead@@3_NA:BYTE ; gameisdead + Line 467: EXTRN __ImageBase:BYTE + Line 468: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\c_consolebuffer.cod (20 hits) + Line 41: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 42: EXTRN __std_terminate:PROC + Line 43: EXTRN fflush:PROC + Line 44: EXTRN fputc:PROC + Line 45: EXTRN fputs:PROC + Line 46: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 47: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 48: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 49: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 50: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 51: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 52: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 53: EXTRN ?AppendCStrPart@FString@@QEAAAEAV1@PEBD_K@Z:PROC ; FString::AppendCStrPart + Line 54: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 55: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 56: EXTRN ?V_BreakLines@@YA?AV?$TArray@UFBrokenLines@@U1@@@PEAVFFont@@HPEBE_N@Z:PROC ; V_BreakLines + Line 57: EXTRN __CxxFrameHandler3:PROC + Line 58: EXTRN memmove:PROC + Line 59: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 60: EXTRN ?PrintColors@@3PAHA:BYTE ; PrintColors + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\c_cvars.cod (72 hits) + Line 52: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 53: EXTRN ?InMenu@DMenu@@2HA:DWORD ; DMenu::InMenu + Line 386: EXTRN _purecall:PROC + Line 387: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 388: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 389: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 390: EXTRN atexit:PROC + Line 391: EXTRN __std_terminate:PROC + Line 392: EXTRN qsort:PROC + Line 393: EXTRN strtod:PROC + Line 394: EXTRN strtoll:PROC + Line 395: EXTRN strtoul:PROC + Line 396: EXTRN strchr:PROC + Line 397: EXTRN stricmp:PROC + Line 398: EXTRN strnicmp:PROC + Line 399: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 400: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 401: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 402: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 403: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 404: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 405: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 406: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 407: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 408: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 409: EXTRN ?AppendFormat@FString@@QEAAXPEBDZZ:PROC ; FString::AppendFormat + Line 410: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 411: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 412: EXTRN mysnprintf:PROC + Line 413: EXTRN ?copystring@@YAPEADPEBD@Z:PROC ; copystring + Line 414: EXTRN ?ReplaceString@@YAXPEAPEADPEBD@Z:PROC ; ReplaceString + Line 415: EXTRN ?CheckWildcards@@YA_NPEBD0@Z:PROC ; CheckWildcards + Line 416: EXTRN ?FormatGUID@@YAXPEAD_KAEBU_GUID@@@Z:PROC ; FormatGUID + Line 417: EXTRN ?SetValueForKey@FConfigFile@@QEAAXPEBD0_N@Z:PROC ; FConfigFile::SetValueForKey + Line 418: EXTRN ?C_AddTabCommand@@YAXPEBD@Z:PROC ; C_AddTabCommand + Line 419: EXTRN ?C_RemoveTabCommand@@YAXPEBD@Z:PROC ; C_RemoveTabCommand + Line 420: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 421: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 422: EXTRN ?CheckCheatmode@@YA_N_N@Z:PROC ; CheckCheatmode + Line 423: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 424: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 425: EXTRN ??_EFBaseCVar@@UEAAPEAXI@Z:PROC ; FBaseCVar::`vector deleting destructor' + Line 426: EXTRN ??_EFBoolCVar@@UEAAPEAXI@Z:PROC ; FBoolCVar::`vector deleting destructor' + Line 427: EXTRN ??_EFIntCVar@@UEAAPEAXI@Z:PROC ; FIntCVar::`vector deleting destructor' + Line 428: EXTRN ??_EFFloatCVar@@UEAAPEAXI@Z:PROC ; FFloatCVar::`vector deleting destructor' + Line 429: EXTRN ??_EFStringCVar@@UEAAPEAXI@Z:PROC ; FStringCVar::`vector deleting destructor' + Line 430: EXTRN ??_EFColorCVar@@UEAAPEAXI@Z:PROC ; FColorCVar::`vector deleting destructor' + Line 431: EXTRN ??_EFFlagCVar@@UEAAPEAXI@Z:PROC ; FFlagCVar::`vector deleting destructor' + Line 432: EXTRN ??_EFMaskCVar@@UEAAPEAXI@Z:PROC ; FMaskCVar::`vector deleting destructor' + Line 433: EXTRN ??_EFGUIDCVar@@UEAAPEAXI@Z:PROC ; FGUIDCVar::`vector deleting destructor' + Line 434: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 435: EXTRN ?Pick@FColorMatcher@@QEAAEHHH@Z:PROC ; FColorMatcher::Pick + Line 436: EXTRN ?V_GetColorFromString@@YAHPEBIPEBDPEAUFScriptPosition@@@Z:PROC ; V_GetColorFromString + Line 437: EXTRN ?V_GetColorStringByName@@YA?AVFString@@PEBDPEAUFScriptPosition@@@Z:PROC ; V_GetColorStringByName + Line 438: EXTRN ?D_UserInfoChanged@@YAXPEAVFBaseCVar@@@Z:PROC ; D_UserInfoChanged + Line 439: EXTRN ?D_SendServerInfoChange@@YAXPEBVFBaseCVar@@TUCVarValue@@W4ECVarType@@@Z:PROC ; D_SendServerInfoChange + Line 440: EXTRN ?D_SendServerFlagChange@@YAXPEBVFBaseCVar@@H_N@Z:PROC ; D_SendServerFlagChange + Line 441: EXTRN ?ThrowAbortException@@YAXW4EVMAbortException@@PEBDZZ:PROC ; ThrowAbortException + Line 442: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 443: EXTRN __CxxFrameHandler3:PROC + Line 444: EXTRN memcpy:PROC + Line 445: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 446: EXTRN ?UnsafeExecutionContext@@3_NA:BYTE ; UnsafeExecutionContext + Line 447: EXTRN ?gamestate@@3W4gamestate_t@@A:DWORD ; gamestate + Line 448: EXTRN ?netgame@@3_NA:BYTE ; netgame + Line 449: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 450: EXTRN ?demoplayback@@3_NA:BYTE ; demoplayback + Line 451: EXTRN ?playeringame@@3PA_NA:BYTE ; playeringame + Line 452: EXTRN ?ColorMatcher@@3VFColorMatcher@@A:QWORD ; ColorMatcher + Line 453: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 454: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 455: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\c_dispatch.cod (73 hits) + Line 62: EXTRN ?CurrentMenu@@3PEAVDMenu@@EA:QWORD ; CurrentMenu + Line 421: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 422: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 423: EXTRN _purecall:PROC + Line 424: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 425: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 426: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 427: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 428: EXTRN atexit:PROC + Line 429: EXTRN __std_terminate:PROC + Line 430: EXTRN strtoll:PROC + Line 431: EXTRN strtoul:PROC + Line 432: EXTRN fclose:PROC + Line 433: EXTRN feof:PROC + Line 434: EXTRN fgets:PROC + Line 435: EXTRN fopen:PROC + Line 436: EXTRN strchr:PROC + Line 437: EXTRN strrchr:PROC + Line 438: EXTRN strnicmp:PROC + Line 439: EXTRN isspace:PROC + Line 440: EXTRN tolower:PROC + Line 441: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 442: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 443: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 444: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 445: EXTRN ??0FString@@QEAA@PEBD_K@Z:PROC ; FString::FString + Line 446: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 447: EXTRN ?LockBuffer@FString@@QEAAPEADXZ:PROC ; FString::LockBuffer + Line 448: EXTRN ?UnlockBuffer@FString@@QEAAXXZ:PROC ; FString::UnlockBuffer + Line 449: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 450: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 451: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 452: EXTRN ??YFString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator+= + Line 453: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 454: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 455: EXTRN ?AppendCStrPart@FString@@QEAAAEAV1@PEBD_K@Z:PROC ; FString::AppendCStrPart + Line 456: EXTRN ?Mid@FString@@QEBA?AV1@_K0@Z:PROC ; FString::Mid + Line 457: EXTRN ?IndexOf@FString@@QEBAJDJ@Z:PROC ; FString::IndexOf + Line 458: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 459: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 460: EXTRN mysnprintf:PROC + Line 461: EXTRN ?FileExists@@YA_NPEBD@Z:PROC ; FileExists + Line 462: EXTRN ?copystring@@YAPEADPEBD@Z:PROC ; copystring + Line 463: EXTRN ?CheckWildcards@@YA_NPEBD0@Z:PROC ; CheckWildcards + Line 464: EXTRN ?C_AddTabCommand@@YAXPEBD@Z:PROC ; C_AddTabCommand + Line 465: EXTRN ?C_RemoveTabCommand@@YAXPEBD@Z:PROC ; C_RemoveTabCommand + Line 466: EXTRN ??_EFConsoleCommand@@UEAAPEAXI@Z:PROC ; FConsoleCommand::`vector deleting destructor' + Line 467: EXTRN ??_EFConsoleAlias@@UEAAPEAXI@Z:PROC ; FConsoleAlias::`vector deleting destructor' + Line 468: EXTRN ??_EFUnsafeConsoleAlias@@UEAAPEAXI@Z:PROC ; FUnsafeConsoleAlias::`vector deleting destructor' + Line 469: EXTRN ?GetArg@FArgs@@QEBAPEBDH@Z:PROC ; FArgs::GetArg + Line 470: EXTRN ?GetArgList@FArgs@@QEBAPEAVFString@@H@Z:PROC ; FArgs::GetArgList + Line 471: EXTRN ?NumArgs@FArgs@@QEBAHXZ:PROC ; FArgs::NumArgs + Line 472: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 473: EXTRN ?CmdSet@FBaseCVar@@QEAAXPEBD@Z:PROC ; FBaseCVar::CmdSet + Line 474: EXTRN ?FindCVarSub@@YAPEAVFBaseCVar@@PEBDH@Z:PROC ; FindCVarSub + Line 475: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 476: EXTRN ?SetValueForKey@FConfigFile@@QEAAXPEBD0_N@Z:PROC ; FConfigFile::SetValueForKey + Line 477: EXTRN ?Net_WriteByte@@YAXE@Z:PROC ; Net_WriteByte + Line 478: EXTRN ?D_AddFile@@YA_NAEAV?$TArray@VFString@@V1@@@PEBD_NH@Z:PROC ; D_AddFile + Line 479: EXTRN ??_EFDelayedCommand@@UEAAPEAXI@Z:PROC ; FDelayedCommand::`vector deleting destructor' + Line 480: EXTRN ??_EFWaitingCommand@@UEAAPEAXI@Z:PROC ; FWaitingCommand::`vector deleting destructor' + Line 481: EXTRN ??_EFStoredCommand@@UEAAPEAXI@Z:PROC ; FStoredCommand::`vector deleting destructor' + Line 482: EXTRN __CxxFrameHandler3:PROC + Line 483: EXTRN __chkstk:PROC + Line 484: EXTRN memcpy:PROC + Line 485: EXTRN memmove:PROC + Line 486: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 487: EXTRN ?Args@@3PEAVFArgs@@EA:QWORD ; Args + Line 488: EXTRN ?gamestate@@3W4gamestate_t@@A:DWORD ; gamestate + Line 489: EXTRN ?StoredWarp@@3VFString@@A:QWORD ; StoredWarp + Line 490: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 491: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 492: EXTRN __ImageBase:BYTE + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\c_expr.cod (17 hits) + Line 60: EXTRN atexit:PROC + Line 61: EXTRN atof:PROC + Line 62: EXTRN stricmp:PROC + Line 63: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 64: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 65: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 66: EXTRN mysnprintf:PROC + Line 67: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 68: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 69: EXTRN ?AddCommandString@@YAXPEBDH@Z:PROC ; AddCommandString + Line 70: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 71: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 72: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 73: EXTRN ?FindCVar@@YAPEAVFBaseCVar@@PEBDPEAPEAV1@@Z:PROC ; FindCVar + Line 74: EXTRN fmod:PROC + Line 75: EXTRN pow:PROC + Line 76: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\c_functions.cod (9 hits) + Line 22: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 23: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 24: EXTRN ?SpawnHealth@AActor@@QEBAHXZ:PROC ; AActor::SpawnHealth + Line 25: EXTRN ?PrintMiscActorInfo@@YAXPEAVAActor@@@Z:PROC ; PrintMiscActorInfo + Line 26: EXTRN ?P_AimLineAttack@@YA?AU?$TAngle@N@@PEAVAActor@@U1@NPEAUFTranslatedLineTarget@@1H00@Z:PROC ; P_AimLineAttack + Line 27: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 28: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 29: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 30: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\cmdlib.cod (38 hits) + Line 42: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 43: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 44: EXTRN atexit:PROC + Line 45: EXTRN _errno:PROC + Line 46: EXTRN _makepath_s:PROC + Line 47: EXTRN _splitpath_s:PROC + Line 48: EXTRN getenv:PROC + Line 49: EXTRN strchr:PROC + Line 50: EXTRN strrchr:PROC + Line 51: EXTRN strerror:PROC + Line 52: EXTRN strspn:PROC + Line 53: EXTRN stricmp:PROC + Line 54: EXTRN isalpha:PROC + Line 55: EXTRN tolower:PROC + Line 56: EXTRN _stat64i32:PROC + Line 57: EXTRN _mkdir:PROC + Line 58: EXTRN _findclose:PROC + Line 59: EXTRN _findfirst64i32:PROC + Line 60: EXTRN _findnext64i32:PROC + Line 61: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 62: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 63: EXTRN ??0FString@@QEAA@PEBD_K@Z:PROC ; FString::FString + Line 64: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 65: EXTRN ??YFString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator+= + Line 66: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 67: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 68: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 69: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 70: EXTRN mysnprintf:PROC + Line 71: EXTRN asctime:PROC + Line 72: EXTRN _localtime64:PROC + Line 73: EXTRN _time64:PROC + Line 74: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 75: EXTRN ?Message@FScriptPosition@@QEBAXHPEBDZZ:PROC ; FScriptPosition::Message + Line 76: EXTRN __CxxFrameHandler3:PROC + Line 77: EXTRN memcpy:PROC + Line 78: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 79: EXTRN __ImageBase:BYTE + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\codegen.cod (259 hits) + Line 39: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 40: EXTRN ?level@@3UFLevelLocals@@A:BYTE ; level + Line 935: EXTRN _purecall:PROC + Line 936: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 937: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 938: EXTRN atexit:PROC + Line 939: EXTRN __std_terminate:PROC + Line 940: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 941: EXTRN stricmp:PROC + Line 942: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 943: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 944: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 945: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 946: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_K_N@Z:PROC ; FName::NameManager::FindName + Line 947: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 948: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 949: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 950: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 951: EXTRN ??HFString@@QEBA?AV0@AEBV0@@Z:PROC ; FString::operator+ + Line 952: EXTRN ?Right@FString@@QEBA?AV1@_K@Z:PROC ; FString::Right + Line 953: EXTRN ?IndexOf@FString@@QEBAJPEBDJ@Z:PROC ; FString::IndexOf + Line 954: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 955: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 956: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 957: EXTRN c_asin:PROC + Line 958: EXTRN c_acos:PROC + Line 959: EXTRN c_atan:PROC + Line 960: EXTRN c_atan2:PROC + Line 961: EXTRN c_tan:PROC + Line 962: EXTRN c_sqrt:PROC + Line 963: EXTRN c_sinh:PROC + Line 964: EXTRN c_cosh:PROC + Line 965: EXTRN c_tanh:PROC + Line 966: EXTRN c_exp:PROC + Line 967: EXTRN c_log:PROC + Line 968: EXTRN c_log10:PROC + Line 969: EXTRN c_pow:PROC + Line 970: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 971: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 972: EXTRN ??0FMemArena@@QEAA@_K@Z:PROC ; FMemArena::FMemArena + Line 973: EXTRN ??1FMemArena@@QEAA@XZ:PROC ; FMemArena::~FMemArena + Line 974: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 975: EXTRN ??0PField@@QEAA@VFName@@PEAVPType@@I_KH@Z:PROC ; PField::PField + Line 976: EXTRN ?GetVersion@PField@@QEAA?AUVersionInfo@@XZ:PROC ; PField::GetVersion + Line 977: EXTRN ?GetImplicitArgs@PFunction@@QEAAHXZ:PROC ; PFunction::GetImplicitArgs + Line 978: EXTRN ?FindSymbol@PSymbolTable@@QEBAPEAVPSymbol@@VFName@@_N@Z:PROC ; PSymbolTable::FindSymbol + Line 979: EXTRN ?FindSymbolInTable@PSymbolTable@@QEAAPEAVPSymbol@@VFName@@AEAPEAU1@@Z:PROC ; PSymbolTable::FindSymbolInTable + Line 980: EXTRN ?FindSymbol@PClass@@QEBAPEAVPSymbol@@VFName@@_N@Z:PROC ; PClass::FindSymbol + Line 981: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 982: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 983: EXTRN ?Link@FThinkerCollection@@QEAAXPEAVDThinker@@H@Z:PROC ; FThinkerCollection::Link + Line 984: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 985: EXTRN ?Init@FRandom@@QEAAXI@Z:PROC ; FRandom::Init + Line 986: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 987: EXTRN ?StaticFindRNG@FRandom@@SAPEAV1@PEBD@Z:PROC ; FRandom::StaticFindRNG + Line 988: EXTRN ?FindState@PClassActor@@QEBAPEAUFState@@HPEAVFName@@_N@Z:PROC ; PClassActor::FindState + Line 989: EXTRN ?MakeStateNameList@@YAAEAV?$TArray@VFName@@V1@@@PEBD@Z:PROC ; MakeStateNameList + Line 990: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 991: EXTRN ?FindCVar@@YAPEAVFBaseCVar@@PEBDPEAPEAV1@@Z:PROC ; FindCVar + Line 992: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 993: EXTRN ?TokenName@FScanner@@SA?AVFString@@HPEBD@Z:PROC ; FScanner::TokenName + Line 994: EXTRN ??0FScriptPosition@@QEAA@AEBU0@@Z:PROC ; FScriptPosition::FScriptPosition + Line 995: EXTRN ?Message@FScriptPosition@@QEBAXHPEBDZZ:PROC ; FScriptPosition::Message + Line 996: EXTRN ?V_GetColor@@YAHPEBIPEBDPEAUFScriptPosition@@@Z:PROC ; V_GetColor + Line 997: EXTRN ?SideFromFlags@FScopeBarrier@@SAHH@Z:PROC ; FScopeBarrier::SideFromFlags + Line 998: EXTRN ?SideFromObjectFlags@FScopeBarrier@@SAHW4EScopeFlags@@@Z:PROC ; FScopeBarrier::SideFromObjectFlags + Line 999: EXTRN ?FlagsFromSide@FScopeBarrier@@SAHH@Z:PROC ; FScopeBarrier::FlagsFromSide + Line 1000: EXTRN ?StringFromSide@FScopeBarrier@@SAPEBDH@Z:PROC ; FScopeBarrier::StringFromSide + Line 1001: EXTRN ?ChangeSideInFlags@FScopeBarrier@@SAHHH@Z:PROC ; FScopeBarrier::ChangeSideInFlags + Line 1002: EXTRN ??0FScopeBarrier@@QEAA@HHPEBD@Z:PROC ; FScopeBarrier::FScopeBarrier + Line 1003: EXTRN ?ValidateNew@FScopeBarrier@@SAXPEAVPClass@@H@Z:PROC ; FScopeBarrier::ValidateNew + Line 1004: EXTRN ?ThrowAbortException@@YAXW4EVMAbortException@@PEBDZZ:PROC ; ThrowAbortException + Line 1005: EXTRN ?FindClassMemberFunction@@YAPEAVPFunction@@PEAVPContainerType@@0VFName@@AEAUFScriptPosition@@PEA_NAEBUVersionInfo@@_N@Z:PROC ; FindClassMemberFunction + Line 1006: EXTRN ?P_FindLineSpecial@@YAHPEBDPEAH1@Z:PROC ; P_FindLineSpecial + Line 1007: EXTRN ?P_ExecuteSpecial@@YAHHPEAUline_t@@PEAVAActor@@_NHHHHH@Z:PROC ; P_ExecuteSpecial + Line 1008: EXTRN ?AllocExtraStack@VMScriptFunction@@QEAAHPEAVPType@@@Z:PROC ; VMScriptFunction::AllocExtraStack + Line 1009: EXTRN ?Get@RegAvailability@VMFunctionBuilder@@QEAAHH@Z:PROC ; VMFunctionBuilder::RegAvailability::Get + Line 1010: EXTRN ?Return@RegAvailability@VMFunctionBuilder@@QEAAXHH@Z:PROC ; VMFunctionBuilder::RegAvailability::Return + Line 1011: EXTRN ?Reuse@RegAvailability@VMFunctionBuilder@@QEAA_NH@Z:PROC ; VMFunctionBuilder::RegAvailability::Reuse + Line 1012: EXTRN ?BeginStatement@VMFunctionBuilder@@QEAAXPEAVFxExpression@@@Z:PROC ; VMFunctionBuilder::BeginStatement + Line 1013: EXTRN ?EndStatement@VMFunctionBuilder@@QEAAXXZ:PROC ; VMFunctionBuilder::EndStatement + Line 1014: EXTRN ?GetConstantInt@VMFunctionBuilder@@QEAAIH@Z:PROC ; VMFunctionBuilder::GetConstantInt + Line 1015: EXTRN ?GetConstantFloat@VMFunctionBuilder@@QEAAIN@Z:PROC ; VMFunctionBuilder::GetConstantFloat + Line 1016: EXTRN ?GetConstantAddress@VMFunctionBuilder@@QEAAIPEAX@Z:PROC ; VMFunctionBuilder::GetConstantAddress + Line 1017: EXTRN ?GetConstantString@VMFunctionBuilder@@QEAAIVFString@@@Z:PROC ; VMFunctionBuilder::GetConstantString + Line 1018: EXTRN ?AllocConstantsInt@VMFunctionBuilder@@QEAAIIPEAH@Z:PROC ; VMFunctionBuilder::AllocConstantsInt + Line 1019: EXTRN ?AllocConstantsFloat@VMFunctionBuilder@@QEAAIIPEAN@Z:PROC ; VMFunctionBuilder::AllocConstantsFloat + Line 1020: EXTRN ?AllocConstantsAddress@VMFunctionBuilder@@QEAAIIPEAPEAX@Z:PROC ; VMFunctionBuilder::AllocConstantsAddress + Line 1021: EXTRN ?AllocConstantsString@VMFunctionBuilder@@QEAAIIPEAVFString@@@Z:PROC ; VMFunctionBuilder::AllocConstantsString + Line 1022: EXTRN ?GetAddress@VMFunctionBuilder@@QEAA_KXZ:PROC ; VMFunctionBuilder::GetAddress + Line 1023: EXTRN ?Emit@VMFunctionBuilder@@QEAA_KHHHH@Z:PROC ; VMFunctionBuilder::Emit + Line 1024: EXTRN ?Emit@VMFunctionBuilder@@QEAA_KHHF@Z:PROC ; VMFunctionBuilder::Emit + Line 1025: EXTRN ?Emit@VMFunctionBuilder@@QEAA_KHH@Z:PROC ; VMFunctionBuilder::Emit + Line 1026: EXTRN ?EmitLoadInt@VMFunctionBuilder@@QEAA_KHH@Z:PROC ; VMFunctionBuilder::EmitLoadInt + Line 1027: EXTRN ?EmitRetInt@VMFunctionBuilder@@QEAA_KH_NH@Z:PROC ; VMFunctionBuilder::EmitRetInt + Line 1028: EXTRN ?Backpatch@VMFunctionBuilder@@QEAAX_K0@Z:PROC ; VMFunctionBuilder::Backpatch + Line 1029: EXTRN ?BackpatchToHere@VMFunctionBuilder@@QEAAX_K@Z:PROC ; VMFunctionBuilder::BackpatchToHere + Line 1030: EXTRN ?BackpatchList@VMFunctionBuilder@@QEAAXAEAV?$TArray@_K_K@@_K@Z:PROC ; VMFunctionBuilder::BackpatchList + Line 1031: EXTRN ?BackpatchListToHere@VMFunctionBuilder@@QEAAXAEAV?$TArray@_K_K@@@Z:PROC ; VMFunctionBuilder::BackpatchListToHere + Line 1032: EXTRN ?AddParameter@FunctionCallEmitter@@QEAAXPEAVVMFunctionBuilder@@PEAVFxExpression@@@Z:PROC ; FunctionCallEmitter::AddParameter + Line 1033: EXTRN ?AddParameter@FunctionCallEmitter@@QEAAXAEAUExpEmit@@_N@Z:PROC ; FunctionCallEmitter::AddParameter + Line 1034: EXTRN ?AddParameterPointerConst@FunctionCallEmitter@@QEAAXPEAX@Z:PROC ; FunctionCallEmitter::AddParameterPointerConst + Line 1035: EXTRN ?AddParameterPointer@FunctionCallEmitter@@QEAAXH_N@Z:PROC ; FunctionCallEmitter::AddParameterPointer + Line 1036: EXTRN ?AddParameterFloatConst@FunctionCallEmitter@@QEAAXN@Z:PROC ; FunctionCallEmitter::AddParameterFloatConst + Line 1037: EXTRN ?AddParameterIntConst@FunctionCallEmitter@@QEAAXH@Z:PROC ; FunctionCallEmitter::AddParameterIntConst + Line 1038: EXTRN ?AddParameterStringConst@FunctionCallEmitter@@QEAAXAEBVFString@@@Z:PROC ; FunctionCallEmitter::AddParameterStringConst + Line 1039: EXTRN ?EmitCall@FunctionCallEmitter@@QEAA?AUExpEmit@@PEAVVMFunctionBuilder@@PEAV?$TArray@UExpEmit@@U1@@@@Z:PROC ; FunctionCallEmitter::EmitCall + Line 1040: EXTRN ?DescriptiveName@PType@@QEBAPEBDXZ:PROC ; PType::DescriptiveName + Line 1041: EXTRN ?NewArray@@YAPEAVPArray@@PEAVPType@@I@Z:PROC ; NewArray + Line 1042: EXTRN ?NewStaticArray@@YAPEAVPStaticArray@@PEAVPType@@@Z:PROC ; NewStaticArray + Line 1043: EXTRN ?NewPointer@@YAPEAVPPointer@@PEAVPType@@_N@Z:PROC ; NewPointer + Line 1044: EXTRN ?NewPointer@@YAPEAVPPointer@@PEAVPClass@@_N@Z:PROC ; NewPointer + Line 1045: EXTRN ?NewClassPointer@@YAPEAVPClassPointer@@PEAVPClass@@@Z:PROC ; NewClassPointer + Line 1046: EXTRN ?NewPrototype@@YAPEAVPPrototype@@AEBV?$TArray@PEAVPType@@PEAV1@@@0@Z:PROC ; NewPrototype + Line 1047: EXTRN ??_EFxExpression@@UEAAPEAXI@Z:PROC ; FxExpression::`vector deleting destructor' + Line 1048: EXTRN ??_EFxIdentifier@@UEAAPEAXI@Z:PROC ; FxIdentifier::`vector deleting destructor' + Line 1049: EXTRN ??_EFxMemberIdentifier@@UEAAPEAXI@Z:PROC ; FxMemberIdentifier::`vector deleting destructor' + Line 1050: EXTRN ??_EFxClassDefaults@@UEAAPEAXI@Z:PROC ; FxClassDefaults::`vector deleting destructor' + Line 1051: EXTRN ??_EFxConstant@@UEAAPEAXI@Z:PROC ; FxConstant::`vector deleting destructor' + Line 1052: EXTRN ??_EFxVectorValue@@UEAAPEAXI@Z:PROC ; FxVectorValue::`vector deleting destructor' + Line 1053: EXTRN ??_EFxBoolCast@@UEAAPEAXI@Z:PROC ; FxBoolCast::`vector deleting destructor' + Line 1054: EXTRN ??_EFxIntCast@@UEAAPEAXI@Z:PROC ; FxIntCast::`vector deleting destructor' + Line 1055: EXTRN ??_EFxFloatCast@@UEAAPEAXI@Z:PROC ; FxFloatCast::`vector deleting destructor' + Line 1056: EXTRN ??_EFxNameCast@@UEAAPEAXI@Z:PROC ; FxNameCast::`vector deleting destructor' + Line 1057: EXTRN ??_EFxStringCast@@UEAAPEAXI@Z:PROC ; FxStringCast::`vector deleting destructor' + Line 1058: EXTRN ??_EFxColorCast@@UEAAPEAXI@Z:PROC ; FxColorCast::`vector deleting destructor' + Line 1059: EXTRN ??_EFxSoundCast@@UEAAPEAXI@Z:PROC ; FxSoundCast::`vector deleting destructor' + Line 1060: EXTRN ??_EFxFontCast@@UEAAPEAXI@Z:PROC ; FxFontCast::`vector deleting destructor' + Line 1061: EXTRN ??_EFxTypeCast@@UEAAPEAXI@Z:PROC ; FxTypeCast::`vector deleting destructor' + Line 1062: EXTRN ??_EFxPlusSign@@UEAAPEAXI@Z:PROC ; FxPlusSign::`vector deleting destructor' + Line 1063: EXTRN ??_EFxMinusSign@@UEAAPEAXI@Z:PROC ; FxMinusSign::`vector deleting destructor' + Line 1064: EXTRN ??_EFxUnaryNotBitwise@@UEAAPEAXI@Z:PROC ; FxUnaryNotBitwise::`vector deleting destructor' + Line 1065: EXTRN ??_EFxUnaryNotBoolean@@UEAAPEAXI@Z:PROC ; FxUnaryNotBoolean::`vector deleting destructor' + Line 1066: EXTRN ??_EFxSizeAlign@@UEAAPEAXI@Z:PROC ; FxSizeAlign::`vector deleting destructor' + Line 1067: EXTRN ??_EFxPreIncrDecr@@UEAAPEAXI@Z:PROC ; FxPreIncrDecr::`vector deleting destructor' + Line 1068: EXTRN ??_EFxPostIncrDecr@@UEAAPEAXI@Z:PROC ; FxPostIncrDecr::`vector deleting destructor' + Line 1069: EXTRN ??_EFxAssign@@UEAAPEAXI@Z:PROC ; FxAssign::`vector deleting destructor' + Line 1070: EXTRN ??_EFxMultiAssign@@UEAAPEAXI@Z:PROC ; FxMultiAssign::`vector deleting destructor' + Line 1071: EXTRN ??_EFxAssignSelf@@UEAAPEAXI@Z:PROC ; FxAssignSelf::`vector deleting destructor' + Line 1072: EXTRN ??_EFxBinary@@UEAAPEAXI@Z:PROC ; FxBinary::`vector deleting destructor' + Line 1073: EXTRN ??_EFxAddSub@@UEAAPEAXI@Z:PROC ; FxAddSub::`vector deleting destructor' + Line 1074: EXTRN ??_EFxMulDiv@@UEAAPEAXI@Z:PROC ; FxMulDiv::`vector deleting destructor' + Line 1075: EXTRN ??_EFxPow@@UEAAPEAXI@Z:PROC ; FxPow::`vector deleting destructor' + Line 1076: EXTRN ??_EFxCompareRel@@UEAAPEAXI@Z:PROC ; FxCompareRel::`vector deleting destructor' + Line 1077: EXTRN ??_EFxCompareEq@@UEAAPEAXI@Z:PROC ; FxCompareEq::`vector deleting destructor' + Line 1078: EXTRN ??_EFxBitOp@@UEAAPEAXI@Z:PROC ; FxBitOp::`vector deleting destructor' + Line 1079: EXTRN ??_EFxShift@@UEAAPEAXI@Z:PROC ; FxShift::`vector deleting destructor' + Line 1080: EXTRN ??_EFxLtGtEq@@UEAAPEAXI@Z:PROC ; FxLtGtEq::`vector deleting destructor' + Line 1081: EXTRN ??_EFxConcat@@UEAAPEAXI@Z:PROC ; FxConcat::`vector deleting destructor' + Line 1082: EXTRN ??_EFxBinaryLogical@@UEAAPEAXI@Z:PROC ; FxBinaryLogical::`vector deleting destructor' + Line 1083: EXTRN ??_EFxDotCross@@UEAAPEAXI@Z:PROC ; FxDotCross::`vector deleting destructor' + Line 1084: EXTRN ??_EFxTypeCheck@@UEAAPEAXI@Z:PROC ; FxTypeCheck::`vector deleting destructor' + Line 1085: EXTRN ??_EFxDynamicCast@@UEAAPEAXI@Z:PROC ; FxDynamicCast::`vector deleting destructor' + Line 1086: EXTRN ??_EFxConditional@@UEAAPEAXI@Z:PROC ; FxConditional::`vector deleting destructor' + Line 1087: EXTRN ??_EFxAbs@@UEAAPEAXI@Z:PROC ; FxAbs::`vector deleting destructor' + Line 1088: EXTRN ??_EFxATan2@@UEAAPEAXI@Z:PROC ; FxATan2::`vector deleting destructor' + Line 1089: EXTRN ??_EFxNew@@UEAAPEAXI@Z:PROC ; FxNew::`vector deleting destructor' + Line 1090: EXTRN ??_EFxMinMax@@UEAAPEAXI@Z:PROC ; FxMinMax::`vector deleting destructor' + Line 1091: EXTRN ??_EFxRandom@@UEAAPEAXI@Z:PROC ; FxRandom::`vector deleting destructor' + Line 1092: EXTRN ??_EFxRandomPick@@UEAAPEAXI@Z:PROC ; FxRandomPick::`vector deleting destructor' + Line 1093: EXTRN ??_EFxFRandom@@UEAAPEAXI@Z:PROC ; FxFRandom::`vector deleting destructor' + Line 1094: EXTRN ??_EFxRandom2@@UEAAPEAXI@Z:PROC ; FxRandom2::`vector deleting destructor' + Line 1095: EXTRN ??_EFxRandomSeed@@UEAAPEAXI@Z:PROC ; FxRandomSeed::`vector deleting destructor' + Line 1096: EXTRN ??_EFxMemberBase@@UEAAPEAXI@Z:PROC ; FxMemberBase::`vector deleting destructor' + Line 1097: EXTRN ??_EFxGlobalVariable@@UEAAPEAXI@Z:PROC ; FxGlobalVariable::`vector deleting destructor' + Line 1098: EXTRN ??_EFxCVar@@UEAAPEAXI@Z:PROC ; FxCVar::`vector deleting destructor' + Line 1099: EXTRN ??_EFxStructMember@@UEAAPEAXI@Z:PROC ; FxStructMember::`vector deleting destructor' + Line 1100: EXTRN ??_EFxClassMember@@UEAAPEAXI@Z:PROC ; FxClassMember::`vector deleting destructor' + Line 1101: EXTRN ??_EFxLocalVariable@@UEAAPEAXI@Z:PROC ; FxLocalVariable::`vector deleting destructor' + Line 1102: EXTRN ??_EFxStackVariable@@UEAAPEAXI@Z:PROC ; FxStackVariable::`vector deleting destructor' + Line 1103: EXTRN ??_EFxStaticArrayVariable@@UEAAPEAXI@Z:PROC ; FxStaticArrayVariable::`vector deleting destructor' + Line 1104: EXTRN ??_EFxSelf@@UEAAPEAXI@Z:PROC ; FxSelf::`vector deleting destructor' + Line 1105: EXTRN ??_EFxArrayElement@@UEAAPEAXI@Z:PROC ; FxArrayElement::`vector deleting destructor' + Line 1106: EXTRN ??_EFxFunctionCall@@UEAAPEAXI@Z:PROC ; FxFunctionCall::`vector deleting destructor' + Line 1107: EXTRN ??_EFxMemberFunctionCall@@UEAAPEAXI@Z:PROC ; FxMemberFunctionCall::`vector deleting destructor' + Line 1108: EXTRN ??_EFxActionSpecialCall@@UEAAPEAXI@Z:PROC ; FxActionSpecialCall::`vector deleting destructor' + Line 1109: EXTRN ??_EFxFlopFunctionCall@@UEAAPEAXI@Z:PROC ; FxFlopFunctionCall::`vector deleting destructor' + Line 1110: EXTRN ??_EFxVectorBuiltin@@UEAAPEAXI@Z:PROC ; FxVectorBuiltin::`vector deleting destructor' + Line 1111: EXTRN ??_EFxStrLen@@UEAAPEAXI@Z:PROC ; FxStrLen::`vector deleting destructor' + Line 1112: EXTRN ??_EFxGetClass@@UEAAPEAXI@Z:PROC ; FxGetClass::`vector deleting destructor' + Line 1113: EXTRN ??_EFxGetParentClass@@UEAAPEAXI@Z:PROC ; FxGetParentClass::`vector deleting destructor' + Line 1114: EXTRN ??_EFxGetClassName@@UEAAPEAXI@Z:PROC ; FxGetClassName::`vector deleting destructor' + Line 1115: EXTRN ??_EFxGetDefaultByType@@UEAAPEAXI@Z:PROC ; FxGetDefaultByType::`vector deleting destructor' + Line 1116: EXTRN ??_EFxColorLiteral@@UEAAPEAXI@Z:PROC ; FxColorLiteral::`vector deleting destructor' + Line 1117: EXTRN ??_EFxVMFunctionCall@@UEAAPEAXI@Z:PROC ; FxVMFunctionCall::`vector deleting destructor' + Line 1118: EXTRN ??_EFxSequence@@UEAAPEAXI@Z:PROC ; FxSequence::`vector deleting destructor' + Line 1119: EXTRN ??_EFxCompoundStatement@@UEAAPEAXI@Z:PROC ; FxCompoundStatement::`vector deleting destructor' + Line 1120: EXTRN ??_EFxSwitchStatement@@UEAAPEAXI@Z:PROC ; FxSwitchStatement::`vector deleting destructor' + Line 1121: EXTRN ??_EFxCaseStatement@@UEAAPEAXI@Z:PROC ; FxCaseStatement::`vector deleting destructor' + Line 1122: EXTRN ??_EFxIfStatement@@UEAAPEAXI@Z:PROC ; FxIfStatement::`vector deleting destructor' + Line 1123: EXTRN ??_EFxLoopStatement@@UEAAPEAXI@Z:PROC ; FxLoopStatement::`vector deleting destructor' + Line 1124: EXTRN ??_EFxWhileLoop@@UEAAPEAXI@Z:PROC ; FxWhileLoop::`vector deleting destructor' + Line 1125: EXTRN ??_EFxDoWhileLoop@@UEAAPEAXI@Z:PROC ; FxDoWhileLoop::`vector deleting destructor' + Line 1126: EXTRN ??_EFxForLoop@@UEAAPEAXI@Z:PROC ; FxForLoop::`vector deleting destructor' + Line 1127: EXTRN ??_EFxJumpStatement@@UEAAPEAXI@Z:PROC ; FxJumpStatement::`vector deleting destructor' + Line 1128: EXTRN ??_EFxReturnStatement@@UEAAPEAXI@Z:PROC ; FxReturnStatement::`vector deleting destructor' + Line 1129: EXTRN ??_EFxClassTypeCast@@UEAAPEAXI@Z:PROC ; FxClassTypeCast::`vector deleting destructor' + Line 1130: EXTRN ??_EFxClassPtrCast@@UEAAPEAXI@Z:PROC ; FxClassPtrCast::`vector deleting destructor' + Line 1131: EXTRN ??_EFxStateByIndex@@UEAAPEAXI@Z:PROC ; FxStateByIndex::`vector deleting destructor' + Line 1132: EXTRN ??_EFxRuntimeStateIndex@@UEAAPEAXI@Z:PROC ; FxRuntimeStateIndex::`vector deleting destructor' + Line 1133: EXTRN ??_EFxMultiNameState@@UEAAPEAXI@Z:PROC ; FxMultiNameState::`vector deleting destructor' + Line 1134: EXTRN ??_EFxNop@@UEAAPEAXI@Z:PROC ; FxNop::`vector deleting destructor' + Line 1135: EXTRN ??_EFxLocalVariableDeclaration@@UEAAPEAXI@Z:PROC ; FxLocalVariableDeclaration::`vector deleting destructor' + Line 1136: EXTRN ??_EFxStaticArray@@UEAAPEAXI@Z:PROC ; FxStaticArray::`vector deleting destructor' + Line 1137: EXTRN ??_EFxLocalArrayDeclaration@@UEAAPEAXI@Z:PROC ; FxLocalArrayDeclaration::`vector deleting destructor' + Line 1138: EXTRN ?V_GetFont@@YAPEAVFFont@@PEBD@Z:PROC ; V_GetFont + Line 1139: EXTRN ?GetLumpFile@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpFile + Line 1140: EXTRN ?utf8_decode@@YAHPEBDPEAH@Z:PROC ; utf8_decode + Line 1141: EXTRN __CxxFrameHandler3:PROC + Line 1142: EXTRN ceil:PROC + Line 1143: EXTRN floor:PROC + Line 1144: EXTRN fmod:PROC + Line 1145: EXTRN memcpy:PROC + Line 1146: EXTRN memmove:PROC + Line 1147: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 1148: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 1149: EXTRN ?RegistrationInfo@DObject@@2UClassReg@@A:BYTE ; DObject::RegistrationInfo + Line 1150: EXTRN ?RegistrationInfo@PSymbolType@@2UClassReg@@A:BYTE ; PSymbolType::RegistrationInfo + Line 1151: EXTRN ?RegistrationInfo@PField@@2UClassReg@@A:BYTE ; PField::RegistrationInfo + Line 1152: EXTRN ?RegistrationInfo@PSymbolConst@@2UClassReg@@A:BYTE ; PSymbolConst::RegistrationInfo + Line 1153: EXTRN ?RegistrationInfo@PSymbolConstNumeric@@2UClassReg@@A:BYTE ; PSymbolConstNumeric::RegistrationInfo + Line 1154: EXTRN ?RegistrationInfo@PSymbolConstString@@2UClassReg@@A:BYTE ; PSymbolConstString::RegistrationInfo + Line 1155: EXTRN ?RegistrationInfo@PFunction@@2UClassReg@@A:BYTE ; PFunction::RegistrationInfo + Line 1156: EXTRN ?S_sfx@@3V?$TArray@Usfxinfo_t@@U1@@@A:BYTE ; S_sfx + Line 1157: EXTRN ?StateLabels@@3UFStateLabelStorage@@A:BYTE ; StateLabels + Line 1158: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 1159: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 1160: EXTRN ?TypeError@@3PEAVPErrorType@@EA:QWORD ; TypeError + Line 1161: EXTRN ?TypeAuto@@3PEAVPErrorType@@EA:QWORD ; TypeAuto + Line 1162: EXTRN ?TypeVoid@@3PEAVPVoidType@@EA:QWORD ; TypeVoid + Line 1163: EXTRN ?TypeSInt8@@3PEAVPInt@@EA:QWORD ; TypeSInt8 + Line 1164: EXTRN ?TypeUInt8@@3PEAVPInt@@EA:QWORD ; TypeUInt8 + Line 1165: EXTRN ?TypeSInt16@@3PEAVPInt@@EA:QWORD ; TypeSInt16 + Line 1166: EXTRN ?TypeUInt16@@3PEAVPInt@@EA:QWORD ; TypeUInt16 + Line 1167: EXTRN ?TypeSInt32@@3PEAVPInt@@EA:QWORD ; TypeSInt32 + Line 1168: EXTRN ?TypeUInt32@@3PEAVPInt@@EA:QWORD ; TypeUInt32 + Line 1169: EXTRN ?TypeBool@@3PEAVPBool@@EA:QWORD ; TypeBool + Line 1170: EXTRN ?TypeFloat32@@3PEAVPFloat@@EA:QWORD ; TypeFloat32 + Line 1171: EXTRN ?TypeFloat64@@3PEAVPFloat@@EA:QWORD ; TypeFloat64 + Line 1172: EXTRN ?TypeString@@3PEAVPString@@EA:QWORD ; TypeString + Line 1173: EXTRN ?TypeName@@3PEAVPName@@EA:QWORD ; TypeName + Line 1174: EXTRN ?TypeSound@@3PEAVPSound@@EA:QWORD ; TypeSound + Line 1175: EXTRN ?TypeColor@@3PEAVPColor@@EA:QWORD ; TypeColor + Line 1176: EXTRN ?TypeTextureID@@3PEAVPTextureID@@EA:QWORD ; TypeTextureID + Line 1177: EXTRN ?TypeSpriteID@@3PEAVPSpriteID@@EA:QWORD ; TypeSpriteID + Line 1178: EXTRN ?TypeVector2@@3PEAVPStruct@@EA:QWORD ; TypeVector2 + Line 1179: EXTRN ?TypeVector3@@3PEAVPStruct@@EA:QWORD ; TypeVector3 + Line 1180: EXTRN ?TypeColorStruct@@3PEAVPStruct@@EA:QWORD ; TypeColorStruct + Line 1181: EXTRN ?TypeStringStruct@@3PEAVPStruct@@EA:QWORD ; TypeStringStruct + Line 1182: EXTRN ?TypeState@@3PEAVPStatePointer@@EA:QWORD ; TypeState + Line 1183: EXTRN ?TypeFont@@3PEAVPPointer@@EA:QWORD ; TypeFont + Line 1184: EXTRN ?TypeStateLabel@@3PEAVPStateLabel@@EA:QWORD ; TypeStateLabel + Line 1185: EXTRN ?TypeNullPtr@@3PEAVPPointer@@EA:QWORD ; TypeNullPtr + Line 1186: EXTRN ?TypeVoidPtr@@3PEAVPPointer@@EA:QWORD ; TypeVoidPtr + Line 1187: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 1188: EXTRN ?pr_exrandom@@3VFRandom@@A:BYTE ; pr_exrandom + Line 1189: EXTRN ?pr_cajump@@3VFRandom@@A:BYTE ; pr_cajump + Line 1190: EXTRN __ImageBase:BYTE + Line 1191: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\colormaps.cod (18 hits) + Line 27: EXTRN atexit:PROC + Line 28: EXTRN __std_terminate:PROC + Line 29: EXTRN strncpy:PROC + Line 30: EXTRN strnicmp:PROC + Line 31: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 32: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 33: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 34: EXTRN ?OpenLumpReader@FWadCollection@@QEAA?AVFileReader@@H@Z:PROC ; FWadCollection::OpenLumpReader + Line 35: EXTRN ?LumpLength@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::LumpLength + Line 36: EXTRN ?GetLumpName@FWadCollection@@QEBAXPEADH@Z:PROC ; FWadCollection::GetLumpName + Line 37: EXTRN ?GetLumpNamespace@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpNamespace + Line 38: EXTRN ?GetNumLumps@FWadCollection@@QEBAHXZ:PROC ; FWadCollection::GetNumLumps + Line 39: EXTRN ?Pick@FColorMatcher@@QEAAEHHH@Z:PROC ; FColorMatcher::Pick + Line 40: EXTRN __CxxFrameHandler3:PROC + Line 41: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 42: EXTRN ?GPalette@@3UFPalette@@A:BYTE ; GPalette + Line 43: EXTRN ?ColorMatcher@@3VFColorMatcher@@A:QWORD ; ColorMatcher + Line 44: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\colormatcher.cod (1 hit) + Line 14: EXTRN ?BestColor@@YAHPEBIHHHHH@Z:PROC ; BestColor + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\common.cod (24 hits) + Line 32: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 33: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 34: EXTRN atexit:PROC + Line 35: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 36: EXTRN free:PROC + Line 37: EXTRN malloc:PROC + Line 38: EXTRN realloc:PROC + Line 39: EXTRN atoi:PROC + Line 40: EXTRN strdup:PROC + Line 41: EXTRN isdigit:PROC + Line 42: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 43: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 44: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 45: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 46: EXTRN ??HFString@@QEBA?AV0@PEBD@Z:PROC ; FString::operator+ + Line 47: EXTRN ??0FRandom@@QEAA@XZ:PROC ; FRandom::FRandom + Line 48: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 49: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 50: EXTRN ?LookupFile@FSoundFontReader@@QEAA?AU?$pair@VFileReader@@VFString@@@std@@PEBD@Z:PROC ; FSoundFontReader::LookupFile + Line 51: EXTRN __CxxFrameHandler3:PROC + Line 52: EXTRN memcpy:PROC + Line 53: EXTRN memmove:PROC + Line 54: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 55: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\compatibility.cod (59 hits) + Line 97: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 98: EXTRN ?RegistrationInfo@DObject@@2UClassReg@@A:BYTE ; DObject::RegistrationInfo + Line 494: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 495: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 496: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 497: EXTRN atexit:PROC + Line 498: EXTRN __std_terminate:PROC + Line 499: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 500: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 501: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 502: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 503: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_K_N@Z:PROC ; FName::NameManager::FindName + Line 504: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 505: EXTRN ?AppendFormat@FString@@QEAAXPEBDZZ:PROC ; FString::AppendFormat + Line 506: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 507: EXTRN ??0FScanner@@QEAA@H@Z:PROC ; FScanner::FScanner + Line 508: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 509: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 510: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 511: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 512: EXTRN ?UnGet@FScanner@@QEAAXXZ:PROC ; FScanner::UnGet + Line 513: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 514: EXTRN ?MatchString@FScanner@@QEAAHPEBQEBD_K@Z:PROC ; FScanner::MatchString + Line 515: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 516: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 517: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 518: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 519: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 520: EXTRN ?CheckOverlap@sector_t@@QEAAXXZ:PROC ; sector_t::CheckOverlap + Line 521: EXTRN ?AddSectorTag@FTagManager@@QEAAXHH@Z:PROC ; FTagManager::AddSectorTag + Line 522: EXTRN ?AddLineID@FTagManager@@QEAAXHH@Z:PROC ; FTagManager::AddLineID + Line 523: EXTRN ?RemoveSectorTags@FTagManager@@QEAAXH@Z:PROC ; FTagManager::RemoveSectorTags + Line 524: EXTRN ?RemoveLineIDs@FTagManager@@QEAAXH@Z:PROC ; FTagManager::RemoveLineIDs + Line 525: EXTRN ?GetWadName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetWadName + Line 526: EXTRN ?GetNumForFullName@FWadCollection@@QEAAHPEBD@Z:PROC ; FWadCollection::GetNumForFullName + Line 527: EXTRN ?GetLumpFile@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpFile + Line 528: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 529: EXTRN ??1DObject@@UEAA@XZ:PROC ; DObject::~DObject + Line 530: EXTRN ?Serialize@DObject@@UEAAXAEAVFSerializer@@@Z:PROC ; DObject::Serialize + Line 531: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 532: EXTRN ?PropagateMark@DObject@@UEAA_KXZ:PROC ; DObject::PropagateMark + Line 533: EXTRN ?FindSymbol@PClass@@QEBAPEAVPSymbol@@VFName@@_N@Z:PROC ; PClass::FindSymbol + Line 534: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 535: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 536: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 537: EXTRN ?GetChecksum@MapData@@QEAAXQEAE@Z:PROC ; MapData::GetChecksum + Line 538: EXTRN ?P_OpenMapData@@YAPEAUMapData@@PEBD_N@Z:PROC ; P_OpenMapData + Line 539: EXTRN ??_EDLevelCompatibility@@UEAAPEAXI@Z:PROC ; DLevelCompatibility::`vector deleting destructor' + Line 540: EXTRN __CxxFrameHandler3:PROC + Line 541: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 542: EXTRN ?developer@@3VFIntCVar@@A:BYTE ; developer + Line 543: EXTRN ?compatflags@@3VFIntCVar@@A:BYTE ; compatflags + Line 544: EXTRN ?compatflags2@@3VFIntCVar@@A:BYTE ; compatflags2 + Line 545: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 546: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 547: EXTRN ?RegistrationInfo@PFunction@@2UClassReg@@A:BYTE ; PFunction::RegistrationInfo + Line 548: EXTRN ?AllClasses@PClass@@2V?$TArray@PEAVPClass@@PEAV1@@@A:BYTE ; PClass::AllClasses + Line 549: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 550: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\configfile.cod (43 hits) + Line 161: EXTRN free:PROC + Line 162: EXTRN bsearch:PROC + Line 163: EXTRN atof:PROC + Line 164: EXTRN atoi:PROC + Line 165: EXTRN strchr:PROC + Line 166: EXTRN strrchr:PROC + Line 167: EXTRN strcspn:PROC + Line 168: EXTRN strncmp:PROC + Line 169: EXTRN strncpy:PROC + Line 170: EXTRN strpbrk:PROC + Line 171: EXTRN isdigit:PROC + Line 172: EXTRN isspace:PROC + Line 173: EXTRN isalnum:PROC + Line 174: EXTRN ?ctl_cmsg@TimidityPlus@@YAXHHPEBDZZ:PROC ; TimidityPlus::ctl_cmsg + Line 175: EXTRN ?init_mblock@TimidityPlus@@YAXPEAUMBlockList@1@@Z:PROC ; TimidityPlus::init_mblock + Line 176: EXTRN ?new_segment@TimidityPlus@@YAPEAXPEAUMBlockList@1@_K@Z:PROC ; TimidityPlus::new_segment + Line 177: EXTRN ?reuse_mblock@TimidityPlus@@YAXPEAUMBlockList@1@@Z:PROC ; TimidityPlus::reuse_mblock + Line 178: EXTRN ?strdup_mblock@TimidityPlus@@YAPEADPEAUMBlockList@1@PEBD@Z:PROC ; TimidityPlus::strdup_mblock + Line 179: EXTRN ?AddPath@FSoundFontReader@@QEAAXPEBD@Z:PROC ; FSoundFontReader::AddPath + Line 180: EXTRN ?open_file@TimidityPlus@@YAPEAUtimidity_file@1@PEBDPEAVFSoundFontReader@@@Z:PROC ; TimidityPlus::open_file + Line 181: EXTRN ?tf_close@TimidityPlus@@YAXPEAUtimidity_file@1@@Z:PROC ; TimidityPlus::tf_close + Line 182: EXTRN ?tf_gets@TimidityPlus@@YAPEADPEADHPEAUtimidity_file@1@@Z:PROC ; TimidityPlus::tf_gets + Line 183: EXTRN ?safe_malloc@TimidityPlus@@YAPEAX_K@Z:PROC ; TimidityPlus::safe_malloc + Line 184: EXTRN ?safe_strdup@TimidityPlus@@YAPEADPEBD@Z:PROC ; TimidityPlus::safe_strdup + Line 185: EXTRN ?free_ptr_list@TimidityPlus@@YAXPEAXH@Z:PROC ; TimidityPlus::free_ptr_list + Line 186: EXTRN ?string_to_7bit_range@TimidityPlus@@YAHPEBDPEAH1@Z:PROC ; TimidityPlus::string_to_7bit_range + Line 187: EXTRN ?find_instrument_map_bank@Instruments@TimidityPlus@@QEAAHHHH@Z:PROC ; TimidityPlus::Instruments::find_instrument_map_bank + Line 188: EXTRN ?alloc_instrument_map_bank@Instruments@TimidityPlus@@QEAAHHHH@Z:PROC ; TimidityPlus::Instruments::alloc_instrument_map_bank + Line 189: EXTRN ?set_instrument_map@Instruments@TimidityPlus@@QEAAXHHHHH@Z:PROC ; TimidityPlus::Instruments::set_instrument_map + Line 190: EXTRN ?add_altassign_string@Instruments@TimidityPlus@@QEAAPEAUAlternateAssign@2@PEAU32@PEAPEADH@Z:PROC ; TimidityPlus::Instruments::add_altassign_string + Line 191: EXTRN ?copy_tone_bank_element@Instruments@TimidityPlus@@QEAAXPEAUToneBankElement@2@PEBU32@@Z:PROC ; TimidityPlus::Instruments::copy_tone_bank_element + Line 192: EXTRN ?free_tone_bank_element@Instruments@TimidityPlus@@QEAAXPEAUToneBankElement@2@@Z:PROC ; TimidityPlus::Instruments::free_tone_bank_element + Line 193: EXTRN ?add_soundfont@Instruments@TimidityPlus@@QEAAXPEADHHHH@Z:PROC ; TimidityPlus::Instruments::add_soundfont + Line 194: EXTRN ?remove_soundfont@Instruments@TimidityPlus@@QEAAXPEAD@Z:PROC ; TimidityPlus::Instruments::remove_soundfont + Line 195: EXTRN ?exclude_soundfont@Instruments@TimidityPlus@@QEAAHHHH@Z:PROC ; TimidityPlus::Instruments::exclude_soundfont + Line 196: EXTRN ?order_soundfont@Instruments@TimidityPlus@@QEAAHHHHH@Z:PROC ; TimidityPlus::Instruments::order_soundfont + Line 197: EXTRN ?string_to_quantity@TimidityPlus@@YAPEBDPEBDPEAUQuantity_@1@G@Z:PROC ; TimidityPlus::string_to_quantity + Line 198: EXTRN ?FixPathSeperator@@YAXPEAD@Z:PROC ; FixPathSeperator + Line 199: EXTRN memcpy:PROC + Line 200: EXTRN memmove:PROC + Line 201: EXTRN strcmp:PROC + Line 202: EXTRN __ImageBase:BYTE + Line 203: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\cosh.cod (7 hits) + Line 13: EXTRN mtherr:PROC + Line 14: EXTRN c_exp:PROC + Line 15: EXTRN isnan:PROC + Line 16: EXTRN MAXLOG:QWORD + Line 17: EXTRN INFINITY:QWORD + Line 18: EXTRN LOGE2:QWORD + Line 19: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\critsec.cod (6 hits) + Line 12: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 13: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 14: EXTRN __imp_InitializeCriticalSection:PROC + Line 15: EXTRN __imp_EnterCriticalSection:PROC + Line 16: EXTRN __imp_LeaveCriticalSection:PROC + Line 17: EXTRN __imp_DeleteCriticalSection:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\ct_chat.cod (46 hits) + Line 196: EXTRN atexit:PROC + Line 197: EXTRN strchr:PROC + Line 198: EXTRN strnicmp:PROC + Line 199: EXTRN isalpha:PROC + Line 200: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 201: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 202: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 203: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 204: EXTRN ?AppendCStrPart@FString@@QEAAAEAV1@PEBD_K@Z:PROC ; FString::AppendCStrPart + Line 205: EXTRN ?AppendFormat@FString@@QEAAXPEBDZZ:PROC ; FString::AppendFormat + Line 206: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 207: EXTRN ?HU_DrawScores@@YAXPEAVplayer_t@@@Z:PROC ; HU_DrawScores + Line 208: EXTRN ?C_HideConsole@@YAXXZ:PROC ; C_HideConsole + Line 209: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 210: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 211: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 212: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 213: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 214: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 215: EXTRN ??0FStringCVar@@QEAA@PEBD0IP6AXAEAV0@@Z@Z:PROC ; FStringCVar::FStringCVar + Line 216: EXTRN ??1FStringCVar@@UEAA@XZ:PROC ; FStringCVar::~FStringCVar + Line 217: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 218: EXTRN ?DrawText@DFrameBuffer@@QEAAXPEAVFFont@@HNNPEBDHZZ:PROC ; DFrameBuffer::DrawText + Line 219: EXTRN ?GetUIScale@@YAHH@Z:PROC ; GetUIScale + Line 220: EXTRN ?FindInventory@AActor@@QEAAPEAV1@VFName@@_N@Z:PROC ; AActor::FindInventory + Line 221: EXTRN ?StringWidth@FFont@@QEBAHPEBE@Z:PROC ; FFont::StringWidth + Line 222: EXTRN ?I_PutInClipboard@@YAXPEBD@Z:PROC ; I_PutInClipboard + Line 223: EXTRN ?I_GetFromClipboard@@YA?AVFString@@_N@Z:PROC ; I_GetFromClipboard + Line 224: EXTRN ?Net_WriteByte@@YAXE@Z:PROC ; Net_WriteByte + Line 225: EXTRN ?Net_WriteString@@YAXPEBD@Z:PROC ; Net_WriteString + Line 226: EXTRN __CxxFrameHandler3:PROC + Line 227: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 228: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 229: EXTRN ?SB_ForceActive@@3_NA:BYTE ; SB_ForceActive + Line 230: EXTRN ?gamestate@@3W4gamestate_t@@A:DWORD ; gamestate + Line 231: EXTRN ?Button_ShowScores@@3UFButtonStatus@@A:BYTE ; Button_ShowScores + Line 232: EXTRN ?menuactive@@3W4EMenuState@@A:DWORD ; menuactive + Line 233: EXTRN ?viewactive@@3_NA:BYTE ; viewactive + Line 234: EXTRN ?viewheight@@3HA:DWORD ; viewheight + Line 235: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 236: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 237: EXTRN ?con_scaletext@@3VFIntCVar@@A:BYTE ; con_scaletext + Line 238: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 239: EXTRN ?SmallFont@@3PEAVFFont@@EA:QWORD ; SmallFont + Line 240: EXTRN ?StatusBar@@3PEAVDBaseStatusBar@@EA:QWORD ; StatusBar + Line 241: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\cycler.cod (10 hits) + Line 25: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 26: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 27: EXTRN ?BeginObject@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginObject + Line 28: EXTRN ?EndObject@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndObject + Line 29: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEA_NPEA_N@Z:PROC ; Serialize + Line 30: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 31: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEANPEAN@Z:PROC ; Serialize + Line 32: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 33: EXTRN ?save_full@@3_NA:BYTE ; save_full + Line 34: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\d_dehacked.cod (134 hits) + Line 253: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 254: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 255: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 256: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 257: EXTRN ?LegacyRenderStyles@@3PATFRenderStyle@@A:BYTE ; LegacyRenderStyles + Line 258: EXTRN ?pr_statetics@FState@@2VFRandom@@A:BYTE ; FState::pr_statetics + Line 259: EXTRN ?AllActorClasses@PClassActor@@2V?$TArray@PEAVPClassActor@@PEAV1@@@A:BYTE ; PClassActor::AllActorClasses + Line 260: EXTRN ?StateLabels@@3UFStateLabelStorage@@A:BYTE ; StateLabels + Line 261: EXTRN ?sprites@@3V?$TArray@Uspritedef_t@@U1@@@A:BYTE ; sprites + Line 262: EXTRN ?DecalLibrary@@3VFDecalLib@@A:BYTE ; DecalLibrary + Line 1649: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 1650: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 1651: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 1652: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 1653: EXTRN atexit:PROC + Line 1654: EXTRN __std_terminate:PROC + Line 1655: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 1656: EXTRN atof:PROC + Line 1657: EXTRN atoi:PROC + Line 1658: EXTRN strtoll:PROC + Line 1659: EXTRN strtoull:PROC + Line 1660: EXTRN fclose:PROC + Line 1661: EXTRN fopen:PROC + Line 1662: EXTRN __stdio_common_vsscanf:PROC + Line 1663: EXTRN strchr:PROC + Line 1664: EXTRN strrchr:PROC + Line 1665: EXTRN strncmp:PROC + Line 1666: EXTRN strncpy:PROC + Line 1667: EXTRN strtok:PROC + Line 1668: EXTRN stricmp:PROC + Line 1669: EXTRN strnicmp:PROC + Line 1670: EXTRN isspace:PROC + Line 1671: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 1672: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 1673: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 1674: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 1675: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_K_N@Z:PROC ; FName::NameManager::FindName + Line 1676: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 1677: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 1678: EXTRN ?LockBuffer@FString@@QEAAPEADXZ:PROC ; FString::LockBuffer + Line 1679: EXTRN ?UnlockBuffer@FString@@QEAAXXZ:PROC ; FString::UnlockBuffer + Line 1680: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 1681: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 1682: EXTRN ?StripRight@FString@@QEAAXXZ:PROC ; FString::StripRight + Line 1683: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 1684: EXTRN ?Truncate@FString@@QEAAX_K@Z:PROC ; FString::Truncate + Line 1685: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 1686: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 1687: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 1688: EXTRN mysnprintf:PROC + Line 1689: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 1690: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 1691: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 1692: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 1693: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 1694: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 1695: EXTRN ?GetImplicitArgs@PFunction@@QEAAHXZ:PROC ; PFunction::GetImplicitArgs + Line 1696: EXTRN ?FindSymbol@PClass@@QEBAPEAVPSymbol@@VFName@@_N@Z:PROC ; PClass::FindSymbol + Line 1697: EXTRN ?CreateDerivedClass@PClass@@QEAAPEAV1@VFName@@I@Z:PROC ; PClass::CreateDerivedClass + Line 1698: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 1699: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 1700: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 1701: EXTRN ?StaticFindStateOwner@FState@@SAPEAVPClassActor@@PEBU1@@Z:PROC ; FState::StaticFindStateOwner + Line 1702: EXTRN ?FindState@PClassActor@@QEBAPEAUFState@@HPEAVFName@@_N@Z:PROC ; PClassActor::FindState + Line 1703: EXTRN ??0FScanner@@QEAA@XZ:PROC ; FScanner::FScanner + Line 1704: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 1705: EXTRN ?OpenLumpNum@FScanner@@QEAAXH@Z:PROC ; FScanner::OpenLumpNum + Line 1706: EXTRN ?SetCMode@FScanner@@QEAAX_N@Z:PROC ; FScanner::SetCMode + Line 1707: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 1708: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 1709: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 1710: EXTRN ?CheckString@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::CheckString + Line 1711: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 1712: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 1713: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 1714: EXTRN ?ScriptMessage@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptMessage + Line 1715: EXTRN ??0FScriptPosition@@QEAA@VFString@@H@Z:PROC ; FScriptPosition::FScriptPosition + Line 1716: EXTRN ?OpenFile@FileReader@@QEAA_NPEBD_J1@Z:PROC ; FileReader::OpenFile + Line 1717: EXTRN ?FindLevelInfo@@YAPEAUlevel_info_t@@PEBD_N@Z:PROC ; FindLevelInfo + Line 1718: EXTRN ?FileExists@@YA_NPEBD@Z:PROC ; FileExists + Line 1719: EXTRN ?ExtractFileBase@@YA?AVFString@@PEBD_N@Z:PROC ; ExtractFileBase + Line 1720: EXTRN ?IsNum@@YA_NPEBD@Z:PROC ; IsNum + Line 1721: EXTRN ?copystring@@YAPEADPEBD@Z:PROC ; copystring + Line 1722: EXTRN ??0FStringTable@@QEAA@XZ:PROC ; FStringTable::FStringTable + Line 1723: EXTRN ??1FStringTable@@QEAA@XZ:PROC ; FStringTable::~FStringTable + Line 1724: EXTRN ?LoadStrings@FStringTable@@QEAAX_N@Z:PROC ; FStringTable::LoadStrings + Line 1725: EXTRN ?MatchString@FStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::MatchString + Line 1726: EXTRN ?SetString@FStringTable@@QEAAXPEBD0@Z:PROC ; FStringTable::SetString + Line 1727: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 1728: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 1729: EXTRN ?ReadLump@FWadCollection@@QEAAXHPEAX@Z:PROC ; FWadCollection::ReadLump + Line 1730: EXTRN ?FindLump@FWadCollection@@QEAAHPEBDPEAH_N@Z:PROC ; FWadCollection::FindLump + Line 1731: EXTRN ?LumpLength@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::LumpLength + Line 1732: EXTRN ?GetLumpFullName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetLumpFullName + Line 1733: EXTRN ?GetLumpFullPath@FWadCollection@@QEBA?AVFString@@H@Z:PROC ; FWadCollection::GetLumpFullPath + Line 1734: EXTRN ?GetLumpFile@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpFile + Line 1735: EXTRN ?GetNumLumps@FWadCollection@@QEBAHXZ:PROC ; FWadCollection::GetNumLumps + Line 1736: EXTRN ?IsSentient@AActor@@QEBA_NXZ:PROC ; AActor::IsSentient + Line 1737: EXTRN ?GetDecalByName@FDecalLib@@QEBAPEBVFDecalTemplate@@PEBD@Z:PROC ; FDecalLib::GetDecalByName + Line 1738: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 1739: EXTRN ?SetStateLabel@FStateDefinitions@@QEAAXPEBDPEAUFState@@E@Z:PROC ; FStateDefinitions::SetStateLabel + Line 1740: EXTRN ?InstallStates@FStateDefinitions@@QEAAXPEAVPClassActor@@PEAVAActor@@@Z:PROC ; FStateDefinitions::InstallStates + Line 1741: EXTRN ?MakeStateDefines@FStateDefinitions@@QEAAXPEBVPClassActor@@@Z:PROC ; FStateDefinitions::MakeStateDefines + Line 1742: EXTRN ?AddStateDefines@FStateDefinitions@@QEAAXPEBUFStateLabels@@@Z:PROC ; FStateDefinitions::AddStateDefines + Line 1743: EXTRN ?CreateAnonymousFunction@@YAPEAVPFunction@@PEAVPContainerType@@PEAVPType@@H@Z:PROC ; CreateAnonymousFunction + Line 1744: EXTRN ??0VMScriptFunction@@QEAA@VFName@@@Z:PROC ; VMScriptFunction::VMScriptFunction + Line 1745: EXTRN ?Free@ExpEmit@@QEAAXPEAVVMFunctionBuilder@@@Z:PROC ; ExpEmit::Free + Line 1746: EXTRN ?Get@RegAvailability@VMFunctionBuilder@@QEAAHH@Z:PROC ; VMFunctionBuilder::RegAvailability::Get + Line 1747: EXTRN ??0VMFunctionBuilder@@QEAA@H@Z:PROC ; VMFunctionBuilder::VMFunctionBuilder + Line 1748: EXTRN ??1VMFunctionBuilder@@QEAA@XZ:PROC ; VMFunctionBuilder::~VMFunctionBuilder + Line 1749: EXTRN ?MakeFunction@VMFunctionBuilder@@QEAAXPEAVVMScriptFunction@@@Z:PROC ; VMFunctionBuilder::MakeFunction + Line 1750: EXTRN ?Emit@VMFunctionBuilder@@QEAA_KHHHH@Z:PROC ; VMFunctionBuilder::Emit + Line 1751: EXTRN ?DumpFunction@@YAXPEAU_iobuf@@PEAVVMScriptFunction@@PEBDH@Z:PROC ; DumpFunction + Line 1752: EXTRN ?EncodeRegType@@YAHUExpEmit@@@Z:PROC ; EncodeRegType + Line 1753: EXTRN ?AddParameterPointerConst@FunctionCallEmitter@@QEAAXPEAX@Z:PROC ; FunctionCallEmitter::AddParameterPointerConst + Line 1754: EXTRN ?AddParameterPointer@FunctionCallEmitter@@QEAAXH_N@Z:PROC ; FunctionCallEmitter::AddParameterPointer + Line 1755: EXTRN ?AddParameterFloatConst@FunctionCallEmitter@@QEAAXN@Z:PROC ; FunctionCallEmitter::AddParameterFloatConst + Line 1756: EXTRN ?AddParameterIntConst@FunctionCallEmitter@@QEAAXH@Z:PROC ; FunctionCallEmitter::AddParameterIntConst + Line 1757: EXTRN ?EmitCall@FunctionCallEmitter@@QEAA?AUExpEmit@@PEAVVMFunctionBuilder@@PEAV?$TArray@UExpEmit@@U1@@@@Z:PROC ; FunctionCallEmitter::EmitCall + Line 1758: EXTRN ?NewClassType@@YAPEAVPClassType@@PEAVPClass@@@Z:PROC ; NewClassType + Line 1759: EXTRN ?CheckParm@FArgs@@QEBAHPEBDH@Z:PROC ; FArgs::CheckParm + Line 1760: EXTRN ?JitDumpLog@@YAXPEAU_iobuf@@PEAVVMScriptFunction@@@Z:PROC ; JitDumpLog + Line 1761: EXTRN __CxxFrameHandler3:PROC + Line 1762: EXTRN memcpy:PROC + Line 1763: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 1764: EXTRN ?batchrun@@3_NA:BYTE ; batchrun + Line 1765: EXTRN ?ClassDataAllocator@@3VFMemArena@@A:BYTE ; ClassDataAllocator + Line 1766: EXTRN ?RegistrationInfo@PFunction@@2UClassReg@@A:BYTE ; PFunction::RegistrationInfo + Line 1767: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 1768: EXTRN ?TypeVoid@@3PEAVPVoidType@@EA:QWORD ; TypeVoid + Line 1769: EXTRN ?TypeState@@3PEAVPStatePointer@@EA:QWORD ; TypeState + Line 1770: EXTRN ?Args@@3PEAVFArgs@@EA:QWORD ; Args + Line 1771: EXTRN __ImageBase:BYTE + Line 1772: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\d_iwad.cod (70 hits) + Line 112: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 113: EXTRN atexit:PROC + Line 114: EXTRN __std_terminate:PROC + Line 115: EXTRN exit:PROC + Line 116: EXTRN strrchr:PROC + Line 117: EXTRN strcspn:PROC + Line 118: EXTRN stricmp:PROC + Line 119: EXTRN strnicmp:PROC + Line 120: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 121: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 122: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 123: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 124: EXTRN ??0FString@@QEAA@PEBD_K@Z:PROC ; FString::FString + Line 125: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 126: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 127: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 128: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 129: EXTRN ??HFString@@QEBA?AV0@PEBD@Z:PROC ; FString::operator+ + Line 130: EXTRN ??YFString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator+= + Line 131: EXTRN ?LastIndexOf@FString@@QEBAJD@Z:PROC ; FString::LastIndexOf + Line 132: EXTRN ?ReplaceChars@FString@@QEAAXDD@Z:PROC ; FString::ReplaceChars + Line 133: EXTRN ?Truncate@FString@@QEAAX_K@Z:PROC ; FString::Truncate + Line 134: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 135: EXTRN ??0FStringf@@QEAA@PEBDZZ:PROC ; FStringf::FStringf + Line 136: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 137: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 138: EXTRN ?D_AddFile@@YA_NAEAV?$TArray@VFString@@V1@@@PEBD_NH@Z:PROC ; D_AddFile + Line 139: EXTRN ?FileExists@@YA_NPEBD@Z:PROC ; FileExists + Line 140: EXTRN ?DefaultExtension@@YAXAEAVFString@@PEBD@Z:PROC ; DefaultExtension + Line 141: EXTRN ?ExtractFileBase@@YA?AVFString@@PEBD_N@Z:PROC ; ExtractFileBase + Line 142: EXTRN ?NicePath@@YA?AVFString@@PEBD@Z:PROC ; NicePath + Line 143: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 144: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 145: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 146: EXTRN ??0FStringCVar@@QEAA@PEBD0IP6AXAEAV0@@Z@Z:PROC ; FStringCVar::FStringCVar + Line 147: EXTRN ??1FStringCVar@@UEAA@XZ:PROC ; FStringCVar::~FStringCVar + Line 148: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 149: EXTRN ?I_SetIWADInfo@@YAXXZ:PROC ; I_SetIWADInfo + Line 150: EXTRN ?I_PickIWad@@YAHPEAUWadStuff@@H_NH@Z:PROC ; I_PickIWad + Line 151: EXTRN ?I_GetSteamPath@@YA?AV?$TArray@VFString@@V1@@@XZ:PROC ; I_GetSteamPath + Line 152: EXTRN ?I_GetGogPaths@@YA?AV?$TArray@VFString@@V1@@@XZ:PROC ; I_GetGogPaths + Line 153: EXTRN ?I_FindFirst@@YAPEAXPEBDPEAUfindstate_t@@@Z:PROC ; I_FindFirst + Line 154: EXTRN ?I_FindNext@@YAHPEAXPEAUfindstate_t@@@Z:PROC ; I_FindNext + Line 155: EXTRN ?I_FindClose@@YAHPEAX@Z:PROC ; I_FindClose + Line 156: EXTRN ?CheckValue@FArgs@@QEBAPEBDPEBD@Z:PROC ; FArgs::CheckValue + Line 157: EXTRN ??0FScanner@@QEAA@XZ:PROC ; FScanner::FScanner + Line 158: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 159: EXTRN ?OpenMem@FScanner@@QEAAXPEBD0H@Z:PROC ; FScanner::OpenMem + Line 160: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 161: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 162: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 163: EXTRN ?CheckString@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::CheckString + Line 164: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 165: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 166: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 167: EXTRN ?ScriptMessage@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptMessage + Line 168: EXTRN ?V_GetColor@@YAHPEBIAEAVFScanner@@@Z:PROC ; V_GetColor + Line 169: EXTRN ?SetSection@FConfigFile@@QEAA_NPEBD_N@Z:PROC ; FConfigFile::SetSection + Line 170: EXTRN ?NextInSection@FConfigFile@@QEAA_NAEAPEBD0@Z:PROC ; FConfigFile::NextInSection + Line 171: EXTRN ?CacheLump@FResourceLump@@QEAAPEAXXZ:PROC ; FResourceLump::CacheLump + Line 172: EXTRN ?OpenResourceFile@FResourceFile@@SAPEAV1@PEBD_N1@Z:PROC ; FResourceFile::OpenResourceFile + Line 173: EXTRN __CxxFrameHandler3:PROC + Line 174: EXTRN memmove:PROC + Line 175: EXTRN memset:PROC + Line 176: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 177: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 178: EXTRN ?DoomStartupInfo@@3UFStartupInfo@@A:BYTE ; DoomStartupInfo + Line 179: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 180: EXTRN ?Args@@3PEAVFArgs@@EA:QWORD ; Args + Line 181: EXTRN ?GameConfig@@3PEAVFGameConfigFile@@EA:QWORD ; GameConfig + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\d_main.cod (387 hits) + Line 177: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 178: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 179: EXTRN ?IsAlias@FConsoleCommand@@UEAA_NXZ:PROC ; FConsoleCommand::IsAlias + Line 180: EXTRN ?Run@FUnsafeConsoleCommand@@UEAAXAEAVFCommandLine@@PEAVAActor@@H@Z:PROC ; FUnsafeConsoleCommand::Run + Line 181: EXTRN ??_EFUnsafeConsoleCommand@@UEAAPEAXI@Z:PROC ; FUnsafeConsoleCommand::`vector deleting destructor' + Line 182: EXTRN ?level@@3UFLevelLocals@@A:BYTE ; level + Line 183: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 184: EXTRN ?multiplayer@@3_NA:BYTE ; multiplayer + Line 185: EXTRN ?deathmatch@@3VFIntCVar@@A:BYTE ; deathmatch + Line 186: EXTRN ?automapactive@@3_NA:BYTE ; automapactive + Line 187: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 188: EXTRN ?demoplayback@@3_NA:BYTE ; demoplayback + Line 189: EXTRN ?playeringame@@3PA_NA:BYTE ; playeringame + Line 190: EXTRN ?Args@@3PEAVFArgs@@EA:QWORD ; Args + Line 191: EXTRN ?Net_Arbitrator@@3HA:DWORD ; Net_Arbitrator + Line 192: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 193: EXTRN ?StatusBar@@3PEAVDBaseStatusBar@@EA:QWORD ; StatusBar + Line 1209: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 1210: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 1211: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 1212: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 1213: EXTRN atexit:PROC + Line 1214: EXTRN __std_terminate:PROC + Line 1215: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 1216: EXTRN srand:PROC + Line 1217: EXTRN atof:PROC + Line 1218: EXTRN atoi:PROC + Line 1219: EXTRN strtod:PROC + Line 1220: EXTRN fopen:PROC + Line 1221: EXTRN __stdio_common_vfprintf:PROC + Line 1222: EXTRN strrchr:PROC + Line 1223: EXTRN stricmp:PROC + Line 1224: EXTRN __std_exception_copy:PROC + Line 1225: EXTRN __std_exception_destroy:PROC + Line 1226: EXTRN ??_Eexception@std@@UEAAPEAXI@Z:PROC ; std::exception::`vector deleting destructor' + Line 1227: EXTRN ??_Eruntime_error@std@@UEAAPEAXI@Z:PROC ; std::runtime_error::`vector deleting destructor' + Line 1228: EXTRN getcwd:PROC + Line 1229: EXTRN chdir:PROC + Line 1230: EXTRN ?_Xbad_function_call@std@@YAXXZ:PROC ; std::_Xbad_function_call + Line 1231: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 1232: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 1233: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 1234: EXTRN ??0FString@@QEAA@PEBD_K@Z:PROC ; FString::FString + Line 1235: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 1236: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 1237: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 1238: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 1239: EXTRN ??HFString@@QEBA?AV0@PEBD@Z:PROC ; FString::operator+ + Line 1240: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 1241: EXTRN ?Left@FString@@QEBA?AV1@_K@Z:PROC ; FString::Left + Line 1242: EXTRN ?IndexOf@FString@@QEBAJDJ@Z:PROC ; FString::IndexOf + Line 1243: EXTRN ?ReplaceChars@FString@@QEAAXDD@Z:PROC ; FString::ReplaceChars + Line 1244: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 1245: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 1246: EXTRN ??_ECNoRunExit@@UEAAPEAXI@Z:PROC ; CNoRunExit::`vector deleting destructor' + Line 1247: EXTRN ?I_SetFrameTime@@YAXXZ:PROC ; I_SetFrameTime + Line 1248: EXTRN ?I_GetTimeFrac@@YANXZ:PROC ; I_GetTimeFrac + Line 1249: EXTRN ?I_FreezeTime@@YAX_N@Z:PROC ; I_FreezeTime + Line 1250: EXTRN ?I_msTime@@YA_KXZ:PROC ; I_msTime + Line 1251: EXTRN ?I_msTimeFS@@YA_KXZ:PROC ; I_msTimeFS + Line 1252: EXTRN ?StaticClearRandom@FRandom@@SAXXZ:PROC ; FRandom::StaticClearRandom + Line 1253: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 1254: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 1255: EXTRN mysnprintf:PROC + Line 1256: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 1257: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 1258: EXTRN ?EnableNoSet@FBaseCVar@@SAXXZ:PROC ; FBaseCVar::EnableNoSet + Line 1259: EXTRN ?EnableCallbacks@FBaseCVar@@SAXXZ:PROC ; FBaseCVar::EnableCallbacks + Line 1260: EXTRN ?DisableCallbacks@FBaseCVar@@SAXXZ:PROC ; FBaseCVar::DisableCallbacks + Line 1261: EXTRN ?FindCVar@@YAPEAVFBaseCVar@@PEBDPEAPEAV1@@Z:PROC ; FindCVar + Line 1262: EXTRN ?DestroyCVarsFlagged@@YAXI@Z:PROC ; DestroyCVarsFlagged + Line 1263: EXTRN ?C_CreateCVar@@YAPEAVFBaseCVar@@PEBDW4ECVarType@@I@Z:PROC ; C_CreateCVar + Line 1264: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 1265: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 1266: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 1267: EXTRN ??0FStringCVar@@QEAA@PEBD0IP6AXAEAV0@@Z@Z:PROC ; FStringCVar::FStringCVar + Line 1268: EXTRN ??1FStringCVar@@UEAA@XZ:PROC ; FStringCVar::~FStringCVar + Line 1269: EXTRN ??0FFlagCVar@@QEAA@PEBDAEAVFIntCVar@@I@Z:PROC ; FFlagCVar::FFlagCVar + Line 1270: EXTRN ??0FMaskCVar@@QEAA@PEBDAEAVFIntCVar@@I@Z:PROC ; FMaskCVar::FMaskCVar + Line 1271: EXTRN ?LoadStrings@FStringTable@@QEAAX_N@Z:PROC ; FStringTable::LoadStrings + Line 1272: EXTRN ??RFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator() + Line 1273: EXTRN ??AFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator[] + Line 1274: EXTRN ?OpenFile@FileReader@@QEAA_NPEBD_J1@Z:PROC ; FileReader::OpenFile + Line 1275: EXTRN ?InitMultipleFiles@FWadCollection@@QEAAXAEAV?$TArray@VFString@@V1@@@@Z:PROC ; FWadCollection::InitMultipleFiles + Line 1276: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 1277: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDHH_N@Z:PROC ; FWadCollection::CheckNumForName + Line 1278: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForFullName + Line 1279: EXTRN ?FindLump@FWadCollection@@QEAAHPEBDPEAH_N@Z:PROC ; FWadCollection::FindLump + Line 1280: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 1281: EXTRN ?S_Init@@YAXXZ:PROC ; S_Init + Line 1282: EXTRN ?S_InitData@@YAXXZ:PROC ; S_InitData + Line 1283: EXTRN ?S_Shutdown@@YAXXZ:PROC ; S_Shutdown + Line 1284: EXTRN ?S_Sound@@YAXHVFSoundID@@MM@Z:PROC ; S_Sound + Line 1285: EXTRN ?S_StopAllChannels@@YAXXZ:PROC ; S_StopAllChannels + Line 1286: EXTRN ?S_StartMusic@@YA_NPEBD@Z:PROC ; S_StartMusic + Line 1287: EXTRN ?S_ChangeMusic@@YA_NPEBDH_N1@Z:PROC ; S_ChangeMusic + Line 1288: EXTRN ?S_StopMusic@@YAX_N@Z:PROC ; S_StopMusic + Line 1289: EXTRN ?S_UpdateSounds@@YAXPEAVAActor@@@Z:PROC ; S_UpdateSounds + Line 1290: EXTRN ?S_ParseReverbDef@@YAXXZ:PROC ; S_ParseReverbDef + Line 1291: EXTRN ?S_ParseMusInfo@@YAXXZ:PROC ; S_ParseMusInfo + Line 1292: EXTRN ?SetLanguageIDs@@YAXXZ:PROC ; SetLanguageIDs + Line 1293: EXTRN ?I_Init@@YAXXZ:PROC ; I_Init + Line 1294: EXTRN ?I_MakeRNGSeed@@YAIXZ:PROC ; I_MakeRNGSeed + Line 1295: EXTRN ?I_StartFrame@@YAXXZ:PROC ; I_StartFrame + Line 1296: EXTRN ?I_StartTic@@YAXXZ:PROC ; I_StartTic + Line 1297: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 1298: EXTRN ?atterm@@YAXP6AXXZ@Z:PROC ; atterm + Line 1299: EXTRN ?I_SetCursor@@YA_NPEAVFTexture@@@Z:PROC ; I_SetCursor + Line 1300: EXTRN ?I_FindFirst@@YAPEAXPEBDPEAUfindstate_t@@@Z:PROC ; I_FindFirst + Line 1301: EXTRN ?I_FindNext@@YAHPEAXPEAUfindstate_t@@@Z:PROC ; I_FindNext + Line 1302: EXTRN ?I_FindClose@@YAHPEAX@Z:PROC ; I_FindClose + Line 1303: EXTRN ?Step@GC@@YAXXZ:PROC ; GC::Step + Line 1304: EXTRN ?FullGC@GC@@YAXXZ:PROC ; GC::FullGC + Line 1305: EXTRN ?DelSoftRootHead@GC@@YAXXZ:PROC ; GC::DelSoftRootHead + Line 1306: EXTRN ?RemoveUnusedSymbols@@YAXXZ:PROC ; RemoveUnusedSymbols + Line 1307: EXTRN ?StaticInit@PClass@@SAXXZ:PROC ; PClass::StaticInit + Line 1308: EXTRN ?StaticShutdown@PClass@@SAXXZ:PROC ; PClass::StaticShutdown + Line 1309: EXTRN ?V_SetBlend@@YAXHHHH@Z:PROC ; V_SetBlend + Line 1310: EXTRN ?R_DeinitTranslationTables@@YAXXZ:PROC ; R_DeinitTranslationTables + Line 1311: EXTRN ?R_ParseTrnslate@@YAXXZ:PROC ; R_ParseTrnslate + Line 1312: EXTRN ?CheckForTexture@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::CheckForTexture + Line 1313: EXTRN ?GetTextureID@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::GetTextureID + Line 1314: EXTRN ?Init@FTextureManager@@QEAAXXZ:PROC ; FTextureManager::Init + Line 1315: EXTRN ?UpdateAnimations@FTextureManager@@QEAAX_K@Z:PROC ; FTextureManager::UpdateAnimations + Line 1316: EXTRN ?GuesstimateNumTextures@FTextureManager@@QEAAHXZ:PROC ; FTextureManager::GuesstimateNumTextures + Line 1317: EXTRN ?PrintStat@FStat@@SAXXZ:PROC ; FStat::PrintStat + Line 1318: EXTRN ?V_OutputResized@@YAXHH@Z:PROC ; V_OutputResized + Line 1319: EXTRN ?InitPalette@DFrameBuffer@@QEAAXXZ:PROC ; DFrameBuffer::InitPalette + Line 1320: EXTRN ?DrawBlend@DFrameBuffer@@QEAAXPEAUsector_t@@@Z:PROC ; DFrameBuffer::DrawBlend + Line 1321: EXTRN ?Clear@DFrameBuffer@@QEAAXHHHHHI@Z:PROC ; DFrameBuffer::Clear + Line 1322: EXTRN ?DrawTexture@DFrameBuffer@@QEAAXPEAVFTexture@@NNHZZ:PROC ; DFrameBuffer::DrawTexture + Line 1323: EXTRN ?DrawText@DFrameBuffer@@QEAAXPEAVFFont@@HNNPEBDHZZ:PROC ; DFrameBuffer::DrawText + Line 1324: EXTRN ?DrawRateStuff@DFrameBuffer@@IEAAXXZ:PROC ; DFrameBuffer::DrawRateStuff + Line 1325: EXTRN ?V_Init@@YAX_N@Z:PROC ; V_Init + Line 1326: EXTRN ?V_Init2@@YAXXZ:PROC ; V_Init2 + Line 1327: EXTRN ?V_GetColor@@YAHPEBIAEAVFScanner@@@Z:PROC ; V_GetColor + Line 1328: EXTRN ?StringWidth@FFont@@QEBAHPEBE@Z:PROC ; FFont::StringWidth + Line 1329: EXTRN ?V_ClearFonts@@YAXXZ:PROC ; V_ClearFonts + Line 1330: EXTRN ?V_InitFonts@@YAXXZ:PROC ; V_InitFonts + Line 1331: EXTRN ?V_InitFontColors@@YAXXZ:PROC ; V_InitFontColors + Line 1332: EXTRN ?G_DeferedPlayDemo@@YAXPEBD@Z:PROC ; G_DeferedPlayDemo + Line 1333: EXTRN ?G_LoadGame@@YAXPEBD_N@Z:PROC ; G_LoadGame + Line 1334: EXTRN ?G_RecordDemo@@YAXPEBD@Z:PROC ; G_RecordDemo + Line 1335: EXTRN ?G_BeginRecording@@YAXPEBD@Z:PROC ; G_BeginRecording + Line 1336: EXTRN ?G_TimeDemo@@YAXPEBD@Z:PROC ; G_TimeDemo + Line 1337: EXTRN ?G_CheckDemoStatus@@YA_NXZ:PROC ; G_CheckDemoStatus + Line 1338: EXTRN ?G_Ticker@@YAXXZ:PROC ; G_Ticker + Line 1339: EXTRN ?G_Responder@@YA_NPEAUevent_t@@@Z:PROC ; G_Responder + Line 1340: EXTRN ?G_AddViewPitch@@YAXH_N@Z:PROC ; G_AddViewPitch + Line 1341: EXTRN ?G_AddViewAngle@@YAXH_N@Z:PROC ; G_AddViewAngle + Line 1342: EXTRN ?F_Drawer@@YAXXZ:PROC ; F_Drawer + Line 1343: EXTRN ?F_EndFinale@@YAXXZ:PROC ; F_EndFinale + Line 1344: EXTRN ?Create@Wiper@@SAPEAV1@H@Z:PROC ; Wiper::Create + Line 1345: EXTRN ??0FArgs@@QEAA@XZ:PROC ; FArgs::FArgs + Line 1346: EXTRN ?AppendArg@FArgs@@QEAAXVFString@@@Z:PROC ; FArgs::AppendArg + Line 1347: EXTRN ?RemoveArgs@FArgs@@QEAAXPEBD@Z:PROC ; FArgs::RemoveArgs + Line 1348: EXTRN ?CollectFiles@FArgs@@QEAAXPEBD0@Z:PROC ; FArgs::CollectFiles + Line 1349: EXTRN ?GatherFiles@FArgs@@QEBAPEAV1@PEBD@Z:PROC ; FArgs::GatherFiles + Line 1350: EXTRN ?CheckParm@FArgs@@QEBAHPEBDH@Z:PROC ; FArgs::CheckParm + Line 1351: EXTRN ?CheckParmList@FArgs@@QEBAHPEBDPEAPEAVFString@@H@Z:PROC ; FArgs::CheckParmList + Line 1352: EXTRN ?CheckValue@FArgs@@QEBAPEBDPEBD@Z:PROC ; FArgs::CheckValue + Line 1353: EXTRN ?GetArg@FArgs@@QEBAPEBDH@Z:PROC ; FArgs::GetArg + Line 1354: EXTRN ?TakeValue@FArgs@@QEAA?AVFString@@PEBD@Z:PROC ; FArgs::TakeValue + Line 1355: EXTRN ?NumArgs@FArgs@@QEBAHXZ:PROC ; FArgs::NumArgs + Line 1356: EXTRN ?M_FindResponseFile@@YAXXZ:PROC ; M_FindResponseFile + Line 1357: EXTRN ?M_LoadDefaults@@YAXXZ:PROC ; M_LoadDefaults + Line 1358: EXTRN ?M_SaveDefaults@@YA_NPEBD@Z:PROC ; M_SaveDefaults + Line 1359: EXTRN ?DestroyThinkers@FThinkerList@@QEAAXXZ:PROC ; FThinkerList::DestroyThinkers + Line 1360: EXTRN ?StaticInit@PClassActor@@SAXXZ:PROC ; PClassActor::StaticInit + Line 1361: EXTRN ?StaticSetActorNums@PClassActor@@SAXXZ:PROC ; PClassActor::StaticSetActorNums + Line 1362: EXTRN ?InitActorNumsFromMapinfo@@YAXXZ:PROC ; InitActorNumsFromMapinfo + Line 1363: EXTRN ??0FScanner@@QEAA@XZ:PROC ; FScanner::FScanner + Line 1364: EXTRN ??0FScanner@@QEAA@H@Z:PROC ; FScanner::FScanner + Line 1365: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 1366: EXTRN ?OpenMem@FScanner@@QEAAXPEBD0H@Z:PROC ; FScanner::OpenMem + Line 1367: EXTRN ?SetCMode@FScanner@@QEAAX_N@Z:PROC ; FScanner::SetCMode + Line 1368: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 1369: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 1370: EXTRN ?GetToken@FScanner@@QEAA_NXZ:PROC ; FScanner::GetToken + Line 1371: EXTRN ?MustGetAnyToken@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetAnyToken + Line 1372: EXTRN ?TokenMustBe@FScanner@@QEAAXH@Z:PROC ; FScanner::TokenMustBe + Line 1373: EXTRN ?MustGetToken@FScanner@@QEAAXH@Z:PROC ; FScanner::MustGetToken + Line 1374: EXTRN ?CheckToken@FScanner@@QEAA_NH@Z:PROC ; FScanner::CheckToken + Line 1375: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 1376: EXTRN ?MustGetFloat@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetFloat + Line 1377: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 1378: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 1379: EXTRN ?CacheLump@FResourceLump@@QEAAPEAXXZ:PROC ; FResourceLump::CacheLump + Line 1380: EXTRN ?OpenResourceFile@FResourceFile@@SAPEAV1@PEBDAEAVFileReader@@_N2@Z:PROC ; FResourceFile::OpenResourceFile + Line 1381: EXTRN ?OpenDirectory@FResourceFile@@SAPEAV1@PEBD_N@Z:PROC ; FResourceFile::OpenDirectory + Line 1382: EXTRN ?CheckWarpTransMap@@YA_NAEAVFString@@_N@Z:PROC ; CheckWarpTransMap + Line 1383: EXTRN ?G_InitNew@@YAXPEBD_N@Z:PROC ; G_InitNew + Line 1384: EXTRN ?CalcMapName@@YA?AVFString@@HH@Z:PROC ; CalcMapName + Line 1385: EXTRN ?G_ParseMapInfo@@YAXVFString@@@Z:PROC ; G_ParseMapInfo + Line 1386: EXTRN ?P_SetupWeapons_ntohton@@YAXXZ:PROC ; P_SetupWeapons_ntohton + Line 1387: EXTRN ?D_GetFragCount@@YAHPEAVplayer_t@@@Z:PROC ; D_GetFragCount + Line 1388: EXTRN ?RemoveAllBots@FCajunMaster@@QEAAXPEAUFLevelLocals@@_N@Z:PROC ; FCajunMaster::RemoveAllBots + Line 1389: EXTRN ?M_Responder@@YA_NPEAUevent_t@@@Z:PROC ; M_Responder + Line 1390: EXTRN ?M_Ticker@@YAXXZ:PROC ; M_Ticker + Line 1391: EXTRN ?M_Drawer@@YAXXZ:PROC ; M_Drawer + Line 1392: EXTRN ?M_Init@@YAXXZ:PROC ; M_Init + Line 1393: EXTRN ?M_ClearMenus@@YAXXZ:PROC ; M_ClearMenus + Line 1394: EXTRN ?C_InitConsole@@YAXHH_N@Z:PROC ; C_InitConsole + Line 1395: EXTRN ?C_InitConback@@YAXXZ:PROC ; C_InitConback + Line 1396: EXTRN ?C_NewModeAdjust@@YAXXZ:PROC ; C_NewModeAdjust + Line 1397: EXTRN ?C_Ticker@@YAXXZ:PROC ; C_Ticker + Line 1398: EXTRN ?C_DrawConsole@@YAXXZ:PROC ; C_DrawConsole + Line 1399: EXTRN ?C_HideConsole@@YAXXZ:PROC ; C_HideConsole + Line 1400: EXTRN ?C_Responder@@YA_NPEAUevent_t@@@Z:PROC ; C_Responder + Line 1401: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 1402: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 1403: EXTRN ?ExecCommands@FExecList@@QEBAXXZ:PROC ; FExecList::ExecCommands + Line 1404: EXTRN ?AddPullins@FExecList@@QEBAXAEAV?$TArray@VFString@@V1@@@@Z:PROC ; FExecList::AddPullins + Line 1405: EXTRN ?CheckCheatmode@@YA_N_N@Z:PROC ; CheckCheatmode + Line 1406: EXTRN ?C_ParseCmdLineParams@@YAPEAUFExecList@@PEAU1@@Z:PROC ; C_ParseCmdLineParams + Line 1407: EXTRN ?AddCommandString@@YAXPEBDH@Z:PROC ; AddCommandString + Line 1408: EXTRN ?C_RunDelayedCommands@@YAXXZ:PROC ; C_RunDelayedCommands + Line 1409: EXTRN ?C_ParseExecFile@@YAPEAUFExecList@@PEBDPEAU1@@Z:PROC ; C_ParseExecFile + Line 1410: EXTRN ?C_ClearAliases@@YAXXZ:PROC ; C_ClearAliases + Line 1411: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 1412: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 1413: EXTRN ?execLogfile@@YAXPEBD_N@Z:PROC ; execLogfile + Line 1414: EXTRN ?I_WaitVBL@@YAXH@Z:PROC ; I_WaitVBL + Line 1415: EXTRN ?CT_Init@@YAXXZ:PROC ; CT_Init + Line 1416: EXTRN ?CT_Drawer@@YAXXZ:PROC ; CT_Drawer + Line 1417: EXTRN ?WI_Drawer@@YAXXZ:PROC ; WI_Drawer + Line 1418: EXTRN ?AM_StaticInit@@YAXXZ:PROC ; AM_StaticInit + Line 1419: EXTRN ?AM_ClearColorsets@@YAXXZ:PROC ; AM_ClearColorsets + Line 1420: EXTRN ?AM_Stop@@YAXXZ:PROC ; AM_Stop + Line 1421: EXTRN ?P_CheckMapData@@YA_NPEBD@Z:PROC ; P_CheckMapData + Line 1422: EXTRN ?P_FreeLevelData@@YAXXZ:PROC ; P_FreeLevelData + Line 1423: EXTRN ?P_Init@@YAXXZ:PROC ; P_Init + Line 1424: EXTRN ?R_SetFOV@@YAXAEAUFRenderViewpoint@@U?$TAngle@N@@@Z:PROC ; R_SetFOV + Line 1425: EXTRN ?R_Init@@YAXXZ:PROC ; R_Init + Line 1426: EXTRN ?R_ExecuteSetViewSize@@YAXAEAUFRenderViewpoint@@AEAUFViewWindow@@@Z:PROC ; R_ExecuteSetViewSize + Line 1427: EXTRN ?R_InitSkyMap@@YAXXZ:PROC ; R_InitSkyMap + Line 1428: EXTRN ?R_UpdateSky@@YAX_K@Z:PROC ; R_UpdateSky + Line 1429: EXTRN ??0FIWadManager@@QEAA@PEBD@Z:PROC ; FIWadManager::FIWadManager + Line 1430: EXTRN ?FindIWAD@FIWadManager@@QEAAPEBUFIWADInfo@@AEAV?$TArray@VFString@@V1@@@PEBD11@Z:PROC ; FIWadManager::FindIWAD + Line 1431: EXTRN ?D_LoadDehLumps@@YAHW4DehLumpSource@@@Z:PROC ; D_LoadDehLumps + Line 1432: EXTRN ?D_LoadDehFile@@YA_NPEBD@Z:PROC ; D_LoadDehFile + Line 1433: EXTRN ?FinishDehPatch@@YAXXZ:PROC ; FinishDehPatch + Line 1434: EXTRN ?FileExists@@YA_NPEBD@Z:PROC ; FileExists + Line 1435: EXTRN ?DirEntryExists@@YA_NPEBDPEA_N@Z:PROC ; DirEntryExists + Line 1436: EXTRN ?DefaultExtension@@YAXAEAVFString@@PEBD@Z:PROC ; DefaultExtension + Line 1437: EXTRN ?ExpandEnvVars@@YA?AVFString@@PEBD@Z:PROC ; ExpandEnvVars + Line 1438: EXTRN ?NicePath@@YA?AVFString@@PEBD@Z:PROC ; NicePath + Line 1439: EXTRN ?InitSpawnablesFromMapinfo@@YAXXZ:PROC ; InitSpawnablesFromMapinfo + Line 1440: EXTRN ?PO_LinkToSubsectors@@YAXPEAUFLevelLocals@@@Z:PROC ; PO_LinkToSubsectors + Line 1441: EXTRN ?P_FindParticleSubsectors@@YAXPEAUFLevelLocals@@@Z:PROC ; P_FindParticleSubsectors + Line 1442: EXTRN ?DoInterpolations@FInterpolator@@QEAAXN@Z:PROC ; FInterpolator::DoInterpolations + Line 1443: EXTRN ?RestoreInterpolations@FInterpolator@@QEAAXXZ:PROC ; FInterpolator::RestoreInterpolations + Line 1444: EXTRN ?ClearAllSubsectorLinks@FLevelLocals@@QEAAXXZ:PROC ; FLevelLocals::ClearAllSubsectorLinks + Line 1445: EXTRN ?SetCompatLineOnSide@FLevelLocals@@QEAAX_N@Z:PROC ; FLevelLocals::SetCompatLineOnSide + Line 1446: EXTRN ?ExitLevel@FLevelLocals@@QEAAXH_N@Z:PROC ; FLevelLocals::ExitLevel + Line 1447: EXTRN ?SetSection@FConfigFile@@QEAA_NPEBD_N@Z:PROC ; FConfigFile::SetSection + Line 1448: EXTRN ?NextInSection@FConfigFile@@QEAA_NAEAPEBD0@Z:PROC ; FConfigFile::NextInSection + Line 1449: EXTRN ?GetPosition@FConfigFile@@QEBAXAEAVPosition@1@@Z:PROC ; FConfigFile::GetPosition + Line 1450: EXTRN ?SetPosition@FConfigFile@@QEAAXAEBVPosition@1@@Z:PROC ; FConfigFile::SetPosition + Line 1451: EXTRN ?DoAutoloadSetup@FGameConfigFile@@QEAAXPEAVFIWadManager@@@Z:PROC ; FGameConfigFile::DoAutoloadSetup + Line 1452: EXTRN ?DoGameSetup@FGameConfigFile@@QEAAXPEBD@Z:PROC ; FGameConfigFile::DoGameSetup + Line 1453: EXTRN ?DoKeySetup@FGameConfigFile@@QEAAXPEBD@Z:PROC ; FGameConfigFile::DoKeySetup + Line 1454: EXTRN ?DoModSetup@FGameConfigFile@@QEAAXPEBD@Z:PROC ; FGameConfigFile::DoModSetup + Line 1455: EXTRN ?AddAutoexec@FGameConfigFile@@QEAAXPEAVFArgs@@PEBD@Z:PROC ; FGameConfigFile::AddAutoexec + Line 1456: EXTRN ?ShowPlayerName@DBaseStatusBar@@QEAAXXZ:PROC ; DBaseStatusBar::ShowPlayerName + Line 1457: EXTRN ?CallDraw@DBaseStatusBar@@QEAAXW4EHudState@@N@Z:PROC ; DBaseStatusBar::CallDraw + Line 1458: EXTRN ?DrawBottomStuff@DBaseStatusBar@@QEAAXW4EHudState@@@Z:PROC ; DBaseStatusBar::DrawBottomStuff + Line 1459: EXTRN ?DrawTopStuff@DBaseStatusBar@@QEAAXW4EHudState@@@Z:PROC ; DBaseStatusBar::DrawTopStuff + Line 1460: EXTRN ?AttachToPlayer@DBaseStatusBar@@QEAAXPEAVplayer_t@@@Z:PROC ; DBaseStatusBar::AttachToPlayer + Line 1461: EXTRN ?DrawAltHUD@DBaseStatusBar@@QEAAXXZ:PROC ; DBaseStatusBar::DrawAltHUD + Line 1462: EXTRN ?RefreshViewBorder@DBaseStatusBar@@QEAAXXZ:PROC ; DBaseStatusBar::RefreshViewBorder + Line 1463: EXTRN ?DrawCrosshair@DBaseStatusBar@@QEAAXXZ:PROC ; DBaseStatusBar::DrawCrosshair + Line 1464: EXTRN ?ST_Clear@@YAXXZ:PROC ; ST_Clear + Line 1465: EXTRN ?ReadAllDecals@FDecalLib@@QEAAXXZ:PROC ; FDecalLib::ReadAllDecals + Line 1466: EXTRN ?GetGitHash@@YAPEBDXZ:PROC ; GetGitHash + Line 1467: EXTRN ?GetVersionString@@YAPEBDXZ:PROC ; GetVersionString + Line 1468: EXTRN ?CreateInstance@FStartupScreen@@SAPEAV1@H@Z:PROC ; FStartupScreen::CreateInstance + Line 1469: EXTRN ??_EFStartupScreen@@UEAAPEAXI@Z:PROC ; FStartupScreen::`vector deleting destructor' + Line 1470: EXTRN ?ParseTeamInfo@FTeam@@QEAAXXZ:PROC ; FTeam::ParseTeamInfo + Line 1471: EXTRN ?Load@SBarInfo@@SAXXZ:PROC ; SBarInfo::Load + Line 1472: EXTRN ?NetUpdate@@YAXXZ:PROC ; NetUpdate + Line 1473: EXTRN ?D_QuitNetGame@@YAXXZ:PROC ; D_QuitNetGame + Line 1474: EXTRN ?TryRunTics@@YAXXZ:PROC ; TryRunTics + Line 1475: EXTRN ?Net_NewMakeTic@@YAXXZ:PROC ; Net_NewMakeTic + Line 1476: EXTRN ?Net_WriteByte@@YAXE@Z:PROC ; Net_WriteByte + Line 1477: EXTRN ?Net_WriteFloat@@YAXM@Z:PROC ; Net_WriteFloat + Line 1478: EXTRN ?Net_ClearBuffers@@YAXXZ:PROC ; Net_ClearBuffers + Line 1479: EXTRN ?cht_DoCheat@@YAXPEAVplayer_t@@H@Z:PROC ; cht_DoCheat + Line 1480: EXTRN ?I_UpdateDeviceList@@YAPEAUIJoystickConfig@@XZ:PROC ; I_UpdateDeviceList + Line 1481: EXTRN ?UpdateJoystickMenu@@YAXPEAUIJoystickConfig@@@Z:PROC ; UpdateJoystickMenu + Line 1482: EXTRN ?E_Shutdown@@YAX_N@Z:PROC ; E_Shutdown + Line 1483: EXTRN ?E_Responder@@YA_NPEBUevent_t@@@Z:PROC ; E_Responder + Line 1484: EXTRN ?MaybePrintMessage@CVMAbortException@@QEAAXXZ:PROC ; CVMAbortException::MaybePrintMessage + Line 1485: EXTRN ?StaticInit@PType@@SAXXZ:PROC ; PType::StaticInit + Line 1486: EXTRN ?UpdateVanillaTransparency@@YAXXZ:PROC ; UpdateVanillaTransparency + Line 1487: EXTRN ?UseVanillaTransparency@@YA_NXZ:PROC ; UseVanillaTransparency + Line 1488: EXTRN ?D_DoAnonStats@@YAXXZ:PROC ; D_DoAnonStats + Line 1489: EXTRN ?I_SetWindowTitle@@YAXPEBD@Z:PROC ; I_SetWindowTitle + Line 1490: EXTRN ?ReadStatistics@@YAXXZ:PROC ; ReadStatistics + Line 1491: EXTRN ?G_NewInit@@YAXXZ:PROC ; G_NewInit + Line 1492: EXTRN ?SetupPlayerClasses@@YAXXZ:PROC ; SetupPlayerClasses + Line 1493: EXTRN ?DeinitMenus@@YAXXZ:PROC ; DeinitMenus + Line 1494: EXTRN ?D_CheckNetGame@@YAXXZ:PROC ; D_CheckNetGame + Line 1495: EXTRN ?G_BuildTiccmd@@YAXPEAUticcmd_t@@@Z:PROC ; G_BuildTiccmd + Line 1496: EXTRN ?D_LoadWadSettings@@YAXXZ:PROC ; D_LoadWadSettings + Line 1497: EXTRN ?ParseGLDefs@@YAXXZ:PROC ; ParseGLDefs + Line 1498: EXTRN ?D_ConfirmSendStats@@YAXXZ:PROC ; D_ConfirmSendStats + Line 1499: EXTRN _CxxThrowException:PROC + Line 1500: EXTRN __CxxFrameHandler3:PROC + Line 1501: EXTRN memcpy:PROC + Line 1502: EXTRN memmove:PROC + Line 1503: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 1504: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 1505: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 1506: EXTRN ?rngseed@@3IA:DWORD ; rngseed + Line 1507: EXTRN ?staticrngseed@@3IA:DWORD ; staticrngseed + Line 1508: EXTRN ?use_staticrng@@3_NA:BYTE ; use_staticrng + Line 1509: EXTRN ?gameskill@@3VFIntCVar@@A:BYTE ; gameskill + Line 1510: EXTRN ?netgame@@3_NA:BYTE ; netgame + Line 1511: EXTRN ?menuactive@@3W4EMenuState@@A:DWORD ; menuactive + Line 1512: EXTRN ?paused@@3HA:DWORD ; paused + Line 1513: EXTRN ?pauseext@@3_NA:BYTE ; pauseext + Line 1514: EXTRN ?viewactive@@3_NA:BYTE ; viewactive + Line 1515: EXTRN ?nodrawers@@3_NA:BYTE ; nodrawers + Line 1516: EXTRN ?viewheight@@3HA:DWORD ; viewheight + Line 1517: EXTRN ?viewwidth@@3HA:DWORD ; viewwidth + Line 1518: EXTRN ?usergame@@3_NA:BYTE ; usergame + Line 1519: EXTRN ?demorecording@@3_NA:BYTE ; demorecording + Line 1520: EXTRN ?singledemo@@3_NA:BYTE ; singledemo + Line 1521: EXTRN ?gametic@@3HA:DWORD ; gametic + Line 1522: EXTRN ?setsizeneeded@@3_NA:BYTE ; setsizeneeded + Line 1523: EXTRN ?mouse_sensitivity@@3VFFloatCVar@@A:BYTE ; mouse_sensitivity + Line 1524: EXTRN ?LumpFilterIWAD@@3VFString@@A:QWORD ; LumpFilterIWAD + Line 1525: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 1526: EXTRN ?AllocBytes@GC@@3_KA:QWORD ; GC::AllocBytes + Line 1527: EXTRN ?Threshold@GC@@3_KA:QWORD ; GC::Threshold + Line 1528: EXTRN ?FinalGC@GC@@3_NA:BYTE ; GC::FinalGC + Line 1529: EXTRN ?bShutdown@PClass@@2_NA:BYTE ; PClass::bShutdown + Line 1530: EXTRN ?bVMOperational@PClass@@2_NA:BYTE ; PClass::bVMOperational + Line 1531: EXTRN ?CleanXfac@@3HA:DWORD ; CleanXfac + Line 1532: EXTRN ?CleanYfac@@3HA:DWORD ; CleanYfac + Line 1533: EXTRN ?vid_rendermode@@3VFIntCVar@@A:BYTE ; vid_rendermode + Line 1534: EXTRN ?fullscreen@@3VFBoolCVar@@A:BYTE ; fullscreen + Line 1535: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 1536: EXTRN ?SmallFont@@3PEAVFFont@@EA:QWORD ; SmallFont + Line 1537: EXTRN ?gamestate@@3W4gamestate_t@@A:DWORD ; gamestate + Line 1538: EXTRN ?GameConfig@@3PEAVFGameConfigFile@@EA:QWORD ; GameConfig + Line 1539: EXTRN ?savegamerestore@@3_NA:BYTE ; savegamerestore + Line 1540: EXTRN ?PainFlashes@@3V?$TArray@V?$tuple@PEAVPClass@@VFName@@UPalEntry@@@std@@V12@@@A:BYTE ; PainFlashes + Line 1541: EXTRN ?ColorSets@@3V?$TArray@V?$tuple@PEAVPClass@@HUFPlayerColorSet@@@std@@V12@@@A:BYTE ; ColorSets + Line 1542: EXTRN ?PlayerClasses@@3V?$TArray@VFPlayerClass@@V1@@@A:BYTE ; PlayerClasses + Line 1543: EXTRN ?ConsoleState@@3W4cstate_t@@A:DWORD ; ConsoleState + Line 1544: EXTRN ?Button_Mlook@@3UFButtonStatus@@A:BYTE ; Button_Mlook + Line 1545: EXTRN ?Button_Strafe@@3UFButtonStatus@@A:BYTE ; Button_Strafe + Line 1546: EXTRN ?GSnd@@3PEAVSoundRenderer@@EA:QWORD ; GSnd + Line 1547: EXTRN ?r_viewpoint@@3UFRenderViewpoint@@A:BYTE ; r_viewpoint + Line 1548: EXTRN ?r_viewwindow@@3UFViewWindow@@A:BYTE ; r_viewwindow + Line 1549: EXTRN ?r_NoInterpolate@@3_NA:BYTE ; r_NoInterpolate + Line 1550: EXTRN ?progdir@@3VFString@@A:QWORD ; progdir + Line 1551: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 1552: EXTRN ?r_dynlights@@3VFBoolCVar@@A:BYTE ; r_dynlights + Line 1553: EXTRN ?gl_lights@@3VFBoolCVar@@A:BYTE ; gl_lights + Line 1554: EXTRN ?DecalLibrary@@3VFDecalLib@@A:BYTE ; DecalLibrary + Line 1555: EXTRN ?StartScreen@@3PEAVFStartupScreen@@EA:QWORD ; StartScreen + Line 1556: EXTRN ?TeamLibrary@@3VFTeam@@A:BYTE ; TeamLibrary + Line 1557: EXTRN ?maketic@@3HA:DWORD ; maketic + Line 1558: EXTRN ?netcmds@@3PAY0CE@Uticcmd_t@@A:BYTE ; netcmds + Line 1559: EXTRN ?gameaction@@3W4gameaction_t@@A:DWORD ; gameaction + Line 1560: EXTRN ?ARegHead@@3QEAXEA:QWORD ; ARegHead + Line 1561: EXTRN ?ARegTail@@3QEAXEA:QWORD ; ARegTail + Line 1562: EXTRN ?stacktrace@CVMAbortException@@2VFString@@A:QWORD ; CVMAbortException::stacktrace + Line 1563: EXTRN ?r_UseVanillaTransparency@@3_NA:BYTE ; r_UseVanillaTransparency + Line 1564: EXTRN ?hud_althud@@3VFBoolCVar@@A:BYTE ; hud_althud + Line 1565: EXTRN ?vr_mode@@3VFIntCVar@@A:BYTE ; vr_mode + Line 1566: EXTRN ?turbo@@3VFFloatCVar@@A:BYTE ; turbo + Line 1567: EXTRN ?freelook@@3VFBoolCVar@@A:BYTE ; freelook + Line 1568: EXTRN ?m_pitch@@3VFFloatCVar@@A:BYTE ; m_pitch + Line 1569: EXTRN ?m_yaw@@3VFFloatCVar@@A:BYTE ; m_yaw + Line 1570: EXTRN ?invertmouse@@3VFBoolCVar@@A:BYTE ; invertmouse + Line 1571: EXTRN ?lookstrafe@@3VFBoolCVar@@A:BYTE ; lookstrafe + Line 1572: EXTRN ?screenblocks@@3VFIntCVar@@A:BYTE ; screenblocks + Line 1573: EXTRN ?setmodeneeded@@3_NA:BYTE ; setmodeneeded + Line 1574: EXTRN ?M_DemoNoPlay@@3_NA:BYTE ; M_DemoNoPlay + Line 1575: EXTRN ?insave@@3_NA:BYTE ; insave + Line 1576: EXTRN ?LightDefaults@@3V?$TDeletingArray@PEAVFLightDefaults@@PEAV1@@@A:BYTE ; LightDefaults + Line 1577: EXTRN __ImageBase:BYTE + Line 1578: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\d_net.cod (168 hits) + Line 248: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 249: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 250: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 251: EXTRN atexit:PROC + Line 252: EXTRN __std_terminate:PROC + Line 253: EXTRN exit:PROC + Line 254: EXTRN atoi:PROC + Line 255: EXTRN fclose:PROC + Line 256: EXTRN fopen:PROC + Line 257: EXTRN __stdio_common_vfprintf:PROC + Line 258: EXTRN strrchr:PROC + Line 259: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 260: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 261: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 262: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 263: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 264: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 265: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 266: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 267: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 268: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 269: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 270: EXTRN mysnprintf:PROC + Line 271: EXTRN ?I_StartTic@@YAXXZ:PROC ; I_StartTic + Line 272: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 273: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 274: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 275: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 276: EXTRN ?Step@GC@@YAXXZ:PROC ; GC::Step + Line 277: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 278: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 279: EXTRN ?WriteUserCmdMessage@@YAHPEAUusercmd_t@@PEBU1@PEAPEAE@Z:PROC ; WriteUserCmdMessage + Line 280: EXTRN ?SkipTicCmd@@YAHPEAPEAEH@Z:PROC ; SkipTicCmd + Line 281: EXTRN ?ReadTicCmd@@YAXPEAPEAEHH@Z:PROC ; ReadTicCmd + Line 282: EXTRN ?ReadByte@@YAHPEAPEAE@Z:PROC ; ReadByte + Line 283: EXTRN ?ReadWord@@YAHPEAPEAE@Z:PROC ; ReadWord + Line 284: EXTRN ?ReadLong@@YAHPEAPEAE@Z:PROC ; ReadLong + Line 285: EXTRN ?ReadFloat@@YAMPEAPEAE@Z:PROC ; ReadFloat + Line 286: EXTRN ?ReadString@@YAPEADPEAPEAE@Z:PROC ; ReadString + Line 287: EXTRN ?WriteByte@@YAXEPEAPEAE@Z:PROC ; WriteByte + Line 288: EXTRN ?WriteWord@@YAXFPEAPEAE@Z:PROC ; WriteWord + Line 289: EXTRN ?WriteLong@@YAXHPEAPEAE@Z:PROC ; WriteLong + Line 290: EXTRN ?WriteFloat@@YAXMPEAPEAE@Z:PROC ; WriteFloat + Line 291: EXTRN ?WriteString@@YAXPEBDPEAPEAE@Z:PROC ; WriteString + Line 292: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 293: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 294: EXTRN ?C_ReadCVars@@YAXPEAPEAE@Z:PROC ; C_ReadCVars + Line 295: EXTRN ?C_WriteCVars@@YAXPEAPEAEI_N@Z:PROC ; C_WriteCVars + Line 296: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 297: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 298: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 299: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 300: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 301: EXTRN ?S_Sound@@YAXHVFSoundID@@MM@Z:PROC ; S_Sound + Line 302: EXTRN ?S_ChangeMusic@@YA_NPEBDH_N1@Z:PROC ; S_ChangeMusic + Line 303: EXTRN ?S_PauseSound@@YAX_N0@Z:PROC ; S_PauseSound + Line 304: EXTRN ?S_ResumeSound@@YAX_N@Z:PROC ; S_ResumeSound + Line 305: EXTRN ?S_UpdateSounds@@YAXPEAVAActor@@@Z:PROC ; S_UpdateSounds + Line 306: EXTRN ?GetReplacement@PClassActor@@QEAAPEAV1@_N@Z:PROC ; PClassActor::GetReplacement + Line 307: EXTRN ?StaticSpawn@AActor@@SAPEAV1@PEAVPClassActor@@AEBU?$TVector3@N@@W4replace_t@@_N@Z:PROC ; AActor::StaticSpawn + Line 308: EXTRN ?UseInventory@AActor@@QEAA_NPEAV1@@Z:PROC ; AActor::UseInventory + Line 309: EXTRN ?DropInventory@AActor@@QEAAPEAV1@PEAV1@H@Z:PROC ; AActor::DropInventory + Line 310: EXTRN ?SpawnHealth@AActor@@QEBAHXZ:PROC ; AActor::SpawnHealth + Line 311: EXTRN ?AddToHash@AActor@@QEAAXXZ:PROC ; AActor::AddToHash + Line 312: EXTRN ?IsMapActor@AActor@@QEAA_NXZ:PROC ; AActor::IsMapActor + Line 313: EXTRN ?ClearCounters@AActor@@QEAAXXZ:PROC ; AActor::ClearCounters + Line 314: EXTRN ?AddSlot@FWeaponSlots@@QEAAXHPEAVPClassActor@@_N@Z:PROC ; FWeaponSlots::AddSlot + Line 315: EXTRN ?AddSlotDefault@FWeaponSlots@@QEAAXHPEAVPClassActor@@_N@Z:PROC ; FWeaponSlots::AddSlotDefault + Line 316: EXTRN ?Net_ReadWeapon@@YAPEAVPClassActor@@PEAPEAE@Z:PROC ; Net_ReadWeapon + Line 317: EXTRN ?D_SetupUserInfo@@YAXXZ:PROC ; D_SetupUserInfo + Line 318: EXTRN ?D_DoServerInfoChange@@YAXPEAPEAE_N@Z:PROC ; D_DoServerInfoChange + Line 319: EXTRN ?D_WriteUserInfoStrings@@YAXHPEAPEAE_N@Z:PROC ; D_WriteUserInfoStrings + Line 320: EXTRN ?D_ReadUserInfoStrings@@YAXHPEAPEAE_N@Z:PROC ; D_ReadUserInfoStrings + Line 321: EXTRN ?TryAddBot@FCajunMaster@@QEAAXPEAUFLevelLocals@@PEAPEAEH@Z:PROC ; FCajunMaster::TryAddBot + Line 322: EXTRN ?RemoveAllBots@FCajunMaster@@QEAAXPEAUFLevelLocals@@_N@Z:PROC ; FCajunMaster::RemoveAllBots + Line 323: EXTRN ?P_IsPlayerTotallyFrozen@@YA_NPEBVplayer_t@@@Z:PROC ; P_IsPlayerTotallyFrozen + Line 324: EXTRN ?M_Ticker@@YAXXZ:PROC ; M_Ticker + Line 325: EXTRN ?I_WaitVBL@@YAXH@Z:PROC ; I_WaitVBL + Line 326: EXTRN ?I_InitNetwork@@YA_NXZ:PROC ; I_InitNetwork + Line 327: EXTRN ?I_NetCmd@@YAXXZ:PROC ; I_NetCmd + Line 328: EXTRN ?G_CheckDemoStatus@@YA_NXZ:PROC ; G_CheckDemoStatus + Line 329: EXTRN ?G_Ticker@@YAXXZ:PROC ; G_Ticker + Line 330: EXTRN ?G_BuildSaveName@@YA?AVFString@@PEBDH@Z:PROC ; G_BuildSaveName + Line 331: EXTRN ?C_Ticker@@YAXXZ:PROC ; C_Ticker + Line 332: EXTRN ?C_MidPrint@@YAXPEAVFFont@@PEBD@Z:PROC ; C_MidPrint + Line 333: EXTRN ?CleanseString@@YAPEADPEAD@Z:PROC ; CleanseString + Line 334: EXTRN ?cht_DoMDK@@YAXPEAVplayer_t@@PEBD@Z:PROC ; cht_DoMDK + Line 335: EXTRN ?cht_DoCheat@@YAXPEAVplayer_t@@H@Z:PROC ; cht_DoCheat + Line 336: EXTRN ?cht_Give@@YAXPEAVplayer_t@@PEBDH@Z:PROC ; cht_Give + Line 337: EXTRN ?cht_Take@@YAXPEAVplayer_t@@PEBDH@Z:PROC ; cht_Take + Line 338: EXTRN ?cht_SetInv@@YAXPEAVplayer_t@@PEBDH_N@Z:PROC ; cht_SetInv + Line 339: EXTRN ?cht_Suicide@@YAXPEAVplayer_t@@@Z:PROC ; cht_Suicide + Line 340: EXTRN ?cht_Morph@@YA?AVFString@@PEAVplayer_t@@PEAVPClassActor@@_N@Z:PROC ; cht_Morph + Line 341: EXTRN ?P_PredictPlayer@@YAXPEAVplayer_t@@@Z:PROC ; P_PredictPlayer + Line 342: EXTRN ?P_UnPredictPlayer@@YAXXZ:PROC ; P_UnPredictPlayer + Line 343: EXTRN ?P_SpawnPlayerMissile@@YAPEAVAActor@@PEAV1@NNNPEAVPClassActor@@U?$TAngle@N@@PEAUFTranslatedLineTarget@@PEAPEAV1@_N5H@Z:PROC ; P_SpawnPlayerMissile + Line 344: EXTRN ?P_TeleportMove@@YA_NPEAVAActor@@AEBU?$TVector3@N@@_N2@Z:PROC ; P_TeleportMove + Line 345: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 346: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 347: EXTRN ?CheckCheatmode@@YA_N_N@Z:PROC ; CheckCheatmode + Line 348: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 349: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 350: EXTRN ?ReadNetVars@FGameConfigFile@@QEAAXXZ:PROC ; FGameConfigFile::ReadNetVars + Line 351: EXTRN ?SprayDecal@@YAXPEAVAActor@@PEBDN@Z:PROC ; SprayDecal + Line 352: EXTRN ?P_ConversationCommand@@YAXHHPEAPEAE@Z:PROC ; P_ConversationCommand + Line 353: EXTRN ?CheckParm@FArgs@@QEBAHPEBDH@Z:PROC ; FArgs::CheckParm + Line 354: EXTRN ?CheckValue@FArgs@@QEBAPEBDPEBD@Z:PROC ; FArgs::CheckValue + Line 355: EXTRN ?P_ExecuteSpecial@@YAHHPEAUline_t@@PEAVAActor@@_NHHHHH@Z:PROC ; P_ExecuteSpecial + Line 356: EXTRN ?P_StartScript@@YAHPEAUFLevelLocals@@PEAVAActor@@PEAUline_t@@HPEBDPEBHHH@Z:PROC ; P_StartScript + Line 357: EXTRN ?I_SetFPSLimit@@YAXH@Z:PROC ; I_SetFPSLimit + Line 358: EXTRN ?F_AdvanceIntermission@@YAXXZ:PROC ; F_AdvanceIntermission + Line 359: EXTRN ?GetPortalOffsetPosition@FLevelLocals@@QEAA?AU?$TVector2@N@@NNNN@Z:PROC ; FLevelLocals::GetPortalOffsetPosition + Line 360: EXTRN ?Massacre@FLevelLocals@@QEAAH_NVFName@@@Z:PROC ; FLevelLocals::Massacre + Line 361: EXTRN ?ChangeLevel@FLevelLocals@@QEAAXPEBDHHH@Z:PROC ; FLevelLocals::ChangeLevel + Line 362: EXTRN ?E_Console@@YAXHVFString@@HHH_N@Z:PROC ; E_Console + Line 363: EXTRN ?I_SetFrameTime@@YAXXZ:PROC ; I_SetFrameTime + Line 364: EXTRN ?I_GetTime@@YAHXZ:PROC ; I_GetTime + Line 365: EXTRN ?I_WaitForTic@@YAHH@Z:PROC ; I_WaitForTic + Line 366: EXTRN ?I_msTime@@YA_KXZ:PROC ; I_msTime + Line 367: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 368: EXTRN ?GetVirtualIndex@@YAIPEAVPClass@@PEBD@Z:PROC ; GetVirtualIndex + Line 369: EXTRN ?D_ProcessEvents@@YAXXZ:PROC ; D_ProcessEvents + Line 370: EXTRN ?G_BuildTiccmd@@YAXPEAUticcmd_t@@@Z:PROC ; G_BuildTiccmd + Line 371: EXTRN ?D_DoAdvanceDemo@@YAXXZ:PROC ; D_DoAdvanceDemo + Line 372: EXTRN __CxxFrameHandler3:PROC + Line 373: EXTRN memcpy:PROC + Line 374: EXTRN memset:PROC + Line 375: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 376: EXTRN ?batchrun@@3_NA:BYTE ; batchrun + Line 377: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 378: EXTRN ?AllocBytes@GC@@3_KA:QWORD ; GC::AllocBytes + Line 379: EXTRN ?Threshold@GC@@3_KA:QWORD ; GC::Threshold + Line 380: EXTRN ?startmap@@3VFString@@A:QWORD ; startmap + Line 381: EXTRN ?autostart@@3_NA:BYTE ; autostart + Line 382: EXTRN ?netgame@@3_NA:BYTE ; netgame + Line 383: EXTRN ?multiplayer@@3_NA:BYTE ; multiplayer + Line 384: EXTRN ?paused@@3HA:DWORD ; paused + Line 385: EXTRN ?pauseext@@3_NA:BYTE ; pauseext + Line 386: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 387: EXTRN ?usergame@@3_NA:BYTE ; usergame + Line 388: EXTRN ?demoplayback@@3_NA:BYTE ; demoplayback + Line 389: EXTRN ?demorecording@@3_NA:BYTE ; demorecording + Line 390: EXTRN ?gametic@@3HA:DWORD ; gametic + Line 391: EXTRN ?playeringame@@3PA_NA:BYTE ; playeringame + Line 392: EXTRN ?debugfile@@3PEAU_iobuf@@EA:QWORD ; debugfile + Line 393: EXTRN ?singletics@@3_NA:BYTE ; singletics + Line 394: EXTRN ?Net_Arbitrator@@3HA:DWORD ; Net_Arbitrator + Line 395: EXTRN ?rngseed@@3IA:DWORD ; rngseed + Line 396: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 397: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 398: EXTRN ?SmallFont@@3PEAVFFont@@EA:QWORD ; SmallFont + Line 399: EXTRN ?gamestate@@3W4gamestate_t@@A:DWORD ; gamestate + Line 400: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 401: EXTRN ?GameConfig@@3PEAVFGameConfigFile@@EA:QWORD ; GameConfig + Line 402: EXTRN ?StartScreen@@3PEAVFStartupScreen@@EA:QWORD ; StartScreen + Line 403: EXTRN ?gameaction@@3W4gameaction_t@@A:DWORD ; gameaction + Line 404: EXTRN ?Args@@3PEAVFArgs@@EA:QWORD ; Args + Line 405: EXTRN ?r_NoInterpolate@@3_NA:BYTE ; r_NoInterpolate + Line 406: EXTRN ?level@@3UFLevelLocals@@A:BYTE ; level + Line 407: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 408: EXTRN ?disableautosave@@3VFIntCVar@@A:BYTE ; disableautosave + Line 409: EXTRN ?autosavecount@@3VFIntCVar@@A:BYTE ; autosavecount + Line 410: EXTRN ?savedescription@@3VFString@@A:QWORD ; savedescription + Line 411: EXTRN ?savegamefile@@3VFString@@A:QWORD ; savegamefile + Line 412: EXTRN ?consistancy@@3PAY0CE@FA:BYTE ; consistancy + Line 413: EXTRN ?advancedemo@@3_NA:BYTE ; advancedemo + Line 414: EXTRN __ImageBase:BYTE + Line 415: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\d_netinfo.cod (90 hits) + Line 36: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 244: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 245: EXTRN atexit:PROC + Line 246: EXTRN __std_terminate:PROC + Line 247: EXTRN qsort:PROC + Line 248: EXTRN atoi:PROC + Line 249: EXTRN __stdio_common_vsprintf:PROC + Line 250: EXTRN strchr:PROC + Line 251: EXTRN stricmp:PROC + Line 252: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 253: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 254: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 255: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 256: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_K_N@Z:PROC ; FName::NameManager::FindName + Line 257: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 258: EXTRN ?LockBuffer@FString@@QEAAPEADXZ:PROC ; FString::LockBuffer + Line 259: EXTRN ?UnlockBuffer@FString@@QEAAXXZ:PROC ; FString::UnlockBuffer + Line 260: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 261: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 262: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 263: EXTRN ?ToLower@FString@@QEAAXXZ:PROC ; FString::ToLower + Line 264: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 265: EXTRN mysnprintf:PROC + Line 266: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 267: EXTRN ?ForceSet@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@_N@Z:PROC ; FBaseCVar::ForceSet + Line 268: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 269: EXTRN ?FindCVar@@YAPEAVFBaseCVar@@PEBDPEAPEAV1@@Z:PROC ; FindCVar + Line 270: EXTRN ?C_CreateCVar@@YAPEAVFBaseCVar@@PEBDW4ECVarType@@I@Z:PROC ; C_CreateCVar + Line 271: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 272: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 273: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 274: EXTRN ??0FStringCVar@@QEAA@PEBD0IP6AXAEAV0@@Z@Z:PROC ; FStringCVar::FStringCVar + Line 275: EXTRN ??1FStringCVar@@UEAA@XZ:PROC ; FStringCVar::~FStringCVar + Line 276: EXTRN ??0FColorCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FColorCVar::FColorCVar + Line 277: EXTRN ?ReadByte@@YAHPEAPEAE@Z:PROC ; ReadByte + Line 278: EXTRN ?ReadLong@@YAHPEAPEAE@Z:PROC ; ReadLong + Line 279: EXTRN ?ReadFloat@@YAMPEAPEAE@Z:PROC ; ReadFloat + Line 280: EXTRN ?ReadString@@YAPEADPEAPEAE@Z:PROC ; ReadString + Line 281: EXTRN ?WriteByte@@YAXEPEAPEAE@Z:PROC ; WriteByte + Line 282: EXTRN ?Net_WriteByte@@YAXE@Z:PROC ; Net_WriteByte + Line 283: EXTRN ?Net_WriteLong@@YAXH@Z:PROC ; Net_WriteLong + Line 284: EXTRN ?Net_WriteFloat@@YAXM@Z:PROC ; Net_WriteFloat + Line 285: EXTRN ?Net_WriteString@@YAXPEBD@Z:PROC ; Net_WriteString + Line 286: EXTRN ?Net_WriteBytes@@YAXPEBEH@Z:PROC ; Net_WriteBytes + Line 287: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 288: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 289: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 290: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 291: EXTRN ?RGBtoHSV@@YAXMMMPEAM00@Z:PROC ; RGBtoHSV + Line 292: EXTRN ?HSVtoRGB@@YAXPEAM00MMM@Z:PROC ; HSVtoRGB + Line 293: EXTRN ?R_BuildPlayerTranslation@@YAXH@Z:PROC ; R_BuildPlayerTranslation + Line 294: EXTRN ?PrintMiscActorInfo@@YAXPEAVAActor@@@Z:PROC ; PrintMiscActorInfo + Line 295: EXTRN ?GetColorSet@@YAPEAUFPlayerColorSet@@PEAVPClassActor@@H@Z:PROC ; GetColorSet + Line 296: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 297: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 298: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 299: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 300: EXTRN ?R_FindSkin@@YAHPEBDH@Z:PROC ; R_FindSkin + Line 301: EXTRN ?GetPlayer@DBaseStatusBar@@QEAAHXZ:PROC ; DBaseStatusBar::GetPlayer + Line 302: EXTRN ?AttachToPlayer@DBaseStatusBar@@QEAAXPEAVplayer_t@@@Z:PROC ; DBaseStatusBar::AttachToPlayer + Line 303: EXTRN ?IsValidTeam@FTeam@@QEAA_NI@Z:PROC ; FTeam::IsValidTeam + Line 304: EXTRN ?GetName@FTeam@@QEBAPEBDXZ:PROC ; FTeam::GetName + Line 305: EXTRN ?GetPlayerColor@FTeam@@QEBAHXZ:PROC ; FTeam::GetPlayerColor + Line 306: EXTRN ?GetAllowCustomPlayerColor@FTeam@@QEBA_NXZ:PROC ; FTeam::GetAllowCustomPlayerColor + Line 307: EXTRN ?CleanseString@@YAPEADPEAD@Z:PROC ; CleanseString + Line 308: EXTRN ?BeginObject@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginObject + Line 309: EXTRN ?EndObject@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndObject + Line 310: EXTRN ?GetKey@FSerializer@@QEAAPEBDXZ:PROC ; FSerializer::GetKey + Line 311: EXTRN ?StringPtr@FSerializer@@QEAAAEAV1@PEBDAEAPEBD@Z:PROC ; FSerializer::StringPtr + Line 312: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 313: EXTRN __CxxFrameHandler3:PROC + Line 314: EXTRN memcpy:PROC + Line 315: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 316: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 317: EXTRN ?CVars@@3PEAVFBaseCVar@@EA:QWORD ; CVars + Line 318: EXTRN ?netgame@@3_NA:BYTE ; netgame + Line 319: EXTRN ?deathmatch@@3VFIntCVar@@A:BYTE ; deathmatch + Line 320: EXTRN ?alwaysapplydmflags@@3VFBoolCVar@@A:BYTE ; alwaysapplydmflags + Line 321: EXTRN ?teamplay@@3VFBoolCVar@@A:BYTE ; teamplay + Line 322: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 323: EXTRN ?playeringame@@3PA_NA:BYTE ; playeringame + Line 324: EXTRN ?dmflags2@@3VFIntCVar@@A:BYTE ; dmflags2 + Line 325: EXTRN ?GPalette@@3UFPalette@@A:BYTE ; GPalette + Line 326: EXTRN ?PlayerClasses@@3V?$TArray@VFPlayerClass@@V1@@@A:BYTE ; PlayerClasses + Line 327: EXTRN ?Skins@@3V?$TArray@VFPlayerSkin@@V1@@@A:BYTE ; Skins + Line 328: EXTRN ?StatusBar@@3PEAVDBaseStatusBar@@EA:QWORD ; StatusBar + Line 329: EXTRN ?TeamLibrary@@3VFTeam@@A:BYTE ; TeamLibrary + Line 330: EXTRN ?Teams@@3V?$TArray@VFTeam@@V1@@@A:BYTE ; Teams + Line 331: EXTRN __ImageBase:BYTE + Line 332: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\d_protocol.cod (15 hits) + Line 43: EXTRN ?SetData@FDynamicBuffer@@QEAAXPEBEH@Z:PROC ; FDynamicBuffer::SetData + Line 44: EXTRN ?GetData@FDynamicBuffer@@QEAAPEAEPEAH@Z:PROC ; FDynamicBuffer::GetData + Line 45: EXTRN ?Net_DoCommand@@YAXHPEAPEAEH@Z:PROC ; Net_DoCommand + Line 46: EXTRN ?Net_SkipCommand@@YAXHPEAPEAE@Z:PROC ; Net_SkipCommand + Line 47: EXTRN ?copystring@@YAPEADPEBD@Z:PROC ; copystring + Line 48: EXTRN ?BeginObject@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginObject + Line 49: EXTRN ?EndObject@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndObject + Line 50: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAIPEAI@Z:PROC ; Serialize + Line 51: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAFPEAF@Z:PROC ; Serialize + Line 52: EXTRN ?NetSpecs@@3PAY0CE@VFDynamicBuffer@@A:BYTE ; NetSpecs + Line 53: EXTRN ?netcmds@@3PAY0CE@Uticcmd_t@@A:BYTE ; netcmds + Line 54: EXTRN ?ticdup@@3HA:DWORD ; ticdup + Line 55: EXTRN ?demorecording@@3_NA:BYTE ; demorecording + Line 56: EXTRN ?gametic@@3HA:DWORD ; gametic + Line 57: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\dbopl.cod (19 hits) + Line 84: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 85: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 86: EXTRN atexit:PROC + Line 87: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 88: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 89: EXTRN __imp_InitializeCriticalSection:PROC + Line 90: EXTRN __imp_EnterCriticalSection:PROC + Line 91: EXTRN __imp_LeaveCriticalSection:PROC + Line 92: EXTRN __imp_DeleteCriticalSection:PROC + Line 93: EXTRN _CxxThrowException:PROC + Line 94: EXTRN __CxxFrameHandler3:PROC + Line 95: EXTRN __chkstk:PROC + Line 96: EXTRN memmove:PROC + Line 97: EXTRN memset:PROC + Line 98: EXTRN pow:PROC + Line 99: EXTRN sin:PROC + Line 100: EXTRN __ImageBase:BYTE + Line 101: EXTRN __isa_available:DWORD + Line 102: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\ddstexture.cod (17 hits) + Line 26: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 27: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 28: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 29: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 30: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 31: EXTRN ?OpenLumpReader@FWadCollection@@QEAA?AVFileReader@@H@Z:PROC ; FWadCollection::OpenLumpReader + Line 32: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 33: EXTRN ?CreatePalettedPixels@FImageSource@@MEAA?AV?$TArray@EE@@H@Z:PROC ; FImageSource::CreatePalettedPixels + Line 34: EXTRN ?CopyPixels@FImageSource@@MEAAHPEAVFBitmap@@H@Z:PROC ; FImageSource::CopyPixels + Line 35: EXTRN ?CollectForPrecache@FImageSource@@UEAAXAEAV?$TMap@HU?$pair@HH@std@@U?$THashTraits@H@@U?$TValueTraits@U?$pair@HH@std@@@@@@_N@Z:PROC ; FImageSource::CollectForPrecache + Line 36: EXTRN ??_EFImageSource@@UEAAPEAXI@Z:PROC ; FImageSource::`vector deleting destructor' + Line 37: EXTRN ??_EFDDSTexture@@UEAAPEAXI@Z:PROC ; FDDSTexture::`vector deleting destructor' + Line 38: EXTRN __CxxFrameHandler3:PROC + Line 39: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 40: EXTRN ?RGB256k@@3TColorTable256k@@A:BYTE ; RGB256k + Line 41: EXTRN ?ImageArena@FImageSource@@1VFMemArena@@A:BYTE ; FImageSource::ImageArena + Line 42: EXTRN ?NextID@FImageSource@@1HA:DWORD ; FImageSource::NextID + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\decallib.cod (89 hits) + Line 47: EXTRN ?RegistrationInfo@DThinker@@2UClassReg@@A:BYTE ; DThinker::RegistrationInfo + Line 356: EXTRN _purecall:PROC + Line 357: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 358: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 359: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 360: EXTRN atexit:PROC + Line 361: EXTRN __std_terminate:PROC + Line 362: EXTRN strtoul:PROC + Line 363: EXTRN stricmp:PROC + Line 364: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 365: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 366: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 367: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 368: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_K_N@Z:PROC ; FName::NameManager::FindName + Line 369: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 370: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 371: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 372: EXTRN ??_EFDecalBase@@MEAAPEAXI@Z:PROC ; FDecalBase::`vector deleting destructor' + Line 373: EXTRN ??_EFDecalTemplate@@UEAAPEAXI@Z:PROC ; FDecalTemplate::`vector deleting destructor' + Line 374: EXTRN ??0FScanner@@QEAA@H@Z:PROC ; FScanner::FScanner + Line 375: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 376: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 377: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 378: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 379: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 380: EXTRN ?MustGetFloat@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetFloat + Line 381: EXTRN ?UnGet@FScanner@@QEAAXXZ:PROC ; FScanner::UnGet + Line 382: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 383: EXTRN ?MustMatchString@FScanner@@QEAAHPEBQEBD_K@Z:PROC ; FScanner::MustMatchString + Line 384: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 385: EXTRN ?ScriptMessage@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptMessage + Line 386: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 387: EXTRN ?FindLump@FWadCollection@@QEAAHPEBDPEAH_N@Z:PROC ; FWadCollection::FindLump + Line 388: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 389: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 390: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 391: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 392: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 393: EXTRN ?Pick@FColorMatcher@@QEAAEHHH@Z:PROC ; FColorMatcher::Pick + Line 394: EXTRN ?CheckForTexture@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::CheckForTexture + Line 395: EXTRN ?CreateTexture@FTextureManager@@QEAA?AVFTextureID@@HW4ETextureType@@@Z:PROC ; FTextureManager::CreateTexture + Line 396: EXTRN ?V_GetColor@@YAHPEBIAEAVFScanner@@@Z:PROC ; V_GetColor + Line 397: EXTRN ?IsNum@@YA_NPEBD@Z:PROC ; IsNum + Line 398: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 399: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 400: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 401: EXTRN ?Link@FThinkerCollection@@QEAAXPEAVDThinker@@H@Z:PROC ; FThinkerCollection::Link + Line 402: EXTRN ?StaticType@DThinker@@UEBAPEAVPClass@@XZ:PROC ; DThinker::StaticType + Line 403: EXTRN ?OnDestroy@DThinker@@UEAAXXZ:PROC ; DThinker::OnDestroy + Line 404: EXTRN ??1DThinker@@UEAA@XZ:PROC ; DThinker::~DThinker + Line 405: EXTRN ?Tick@DThinker@@UEAAXXZ:PROC ; DThinker::Tick + Line 406: EXTRN ?PostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::PostBeginPlay + Line 407: EXTRN ?CallPostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::CallPostBeginPlay + Line 408: EXTRN ?PostSerialize@DThinker@@UEAAXXZ:PROC ; DThinker::PostSerialize + Line 409: EXTRN ?Serialize@DThinker@@UEAAXAEAVFSerializer@@@Z:PROC ; DThinker::Serialize + Line 410: EXTRN ?PropagateMark@DThinker@@UEAA_KXZ:PROC ; DThinker::PropagateMark + Line 411: EXTRN ??_EDThinker@@UEAAPEAXI@Z:PROC ; DThinker::`vector deleting destructor' + Line 412: EXTRN ?SetShade@DBaseDecal@@QEAAXI@Z:PROC ; DBaseDecal::SetShade + Line 413: EXTRN ?SetShade@DBaseDecal@@QEAAXHHH@Z:PROC ; DBaseDecal::SetShade + Line 414: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEA_NPEA_N@Z:PROC ; Serialize + Line 415: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 416: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAIPEAI@Z:PROC ; Serialize + Line 417: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEANPEAN@Z:PROC ; Serialize + Line 418: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 419: EXTRN ??_EFDecalGroup@@UEAAPEAXI@Z:PROC ; FDecalGroup::`vector deleting destructor' + Line 420: EXTRN ??_EFDecalAnimator@@UEAAPEAXI@Z:PROC ; FDecalAnimator::`vector deleting destructor' + Line 421: EXTRN ??_EDDecalThinker@@UEAAPEAXI@Z:PROC ; DDecalThinker::`vector deleting destructor' + Line 422: EXTRN ??_EFDecalFaderAnim@@UEAAPEAXI@Z:PROC ; FDecalFaderAnim::`vector deleting destructor' + Line 423: EXTRN ??_EDDecalFader@@UEAAPEAXI@Z:PROC ; DDecalFader::`vector deleting destructor' + Line 424: EXTRN ??_EFDecalColorerAnim@@UEAAPEAXI@Z:PROC ; FDecalColorerAnim::`vector deleting destructor' + Line 425: EXTRN ??_EDDecalColorer@@UEAAPEAXI@Z:PROC ; DDecalColorer::`vector deleting destructor' + Line 426: EXTRN ??_EFDecalStretcherAnim@@UEAAPEAXI@Z:PROC ; FDecalStretcherAnim::`vector deleting destructor' + Line 427: EXTRN ??_EDDecalStretcher@@UEAAPEAXI@Z:PROC ; DDecalStretcher::`vector deleting destructor' + Line 428: EXTRN ??_EFDecalSliderAnim@@UEAAPEAXI@Z:PROC ; FDecalSliderAnim::`vector deleting destructor' + Line 429: EXTRN ??_EDDecalSlider@@UEAAPEAXI@Z:PROC ; DDecalSlider::`vector deleting destructor' + Line 430: EXTRN ??_EFDecalCombinerAnim@@UEAAPEAXI@Z:PROC ; FDecalCombinerAnim::`vector deleting destructor' + Line 431: EXTRN __CxxFrameHandler3:PROC + Line 432: EXTRN memset:PROC + Line 433: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 434: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 435: EXTRN ?LegacyRenderStyles@@3PATFRenderStyle@@A:BYTE ; LegacyRenderStyles + Line 436: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 437: EXTRN ?ColorMatcher@@3VFColorMatcher@@A:QWORD ; ColorMatcher + Line 438: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 439: EXTRN ?AllActorClasses@PClassActor@@2V?$TArray@PEAVPClassActor@@PEAV1@@@A:BYTE ; PClassActor::AllActorClasses + Line 440: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 441: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 442: EXTRN __ImageBase:BYTE + Line 443: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\dobject.cod (41 hits) + Line 163: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 164: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 165: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 166: EXTRN atexit:PROC + Line 167: EXTRN __std_terminate:PROC + Line 168: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 169: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 170: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 171: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 172: EXTRN ?Mark@GC@@YAXPEAPEAVDObject@@@Z:PROC ; GC::Mark + Line 173: EXTRN ??_EDObject@@UEAAPEAXI@Z:PROC ; DObject::`vector deleting destructor' + Line 174: EXTRN ?WriteAllFields@PClass@@QEBAXAEAVFSerializer@@PEBX@Z:PROC ; PClass::WriteAllFields + Line 175: EXTRN ?ReadAllFields@PClass@@QEBA_NAEAVFSerializer@@PEAX@Z:PROC ; PClass::ReadAllFields + Line 176: EXTRN ?FindSymbol@PClass@@QEBAPEAVPSymbol@@VFName@@_N@Z:PROC ; PClass::FindSymbol + Line 177: EXTRN ?BuildFlatPointers@PClass@@QEAAXXZ:PROC ; PClass::BuildFlatPointers + Line 178: EXTRN ?BuildArrayPointers@PClass@@QEAAXXZ:PROC ; PClass::BuildArrayPointers + Line 179: EXTRN ?DestroySpecials@PClass@@QEAAXPEAX@Z:PROC ; PClass::DestroySpecials + Line 180: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 181: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 182: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 183: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 184: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 185: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 186: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 187: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 188: EXTRN ?GetVirtualIndex@@YAIPEAVPClass@@PEBD@Z:PROC ; GetVirtualIndex + Line 189: EXTRN ?I_msTime@@YA_KXZ:PROC ; I_msTime + Line 190: EXTRN __CxxFrameHandler3:PROC + Line 191: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 192: EXTRN ?Gray@GC@@3PEAVDObject@@EA:QWORD ; GC::Gray + Line 193: EXTRN ?Root@GC@@3PEAVDObject@@EA:QWORD ; GC::Root + Line 194: EXTRN ?CurrentWhite@GC@@3IA:DWORD ; GC::CurrentWhite + Line 195: EXTRN ?SweepPos@GC@@3PEAPEAVDObject@@EA:QWORD ; GC::SweepPos + Line 196: EXTRN ?RegistrationInfo@PField@@2UClassReg@@A:BYTE ; PField::RegistrationInfo + Line 197: EXTRN ?AllClasses@PClass@@2V?$TArray@PEAVPClass@@PEAV1@@@A:BYTE ; PClass::AllClasses + Line 198: EXTRN ?bShutdown@PClass@@2_NA:BYTE ; PClass::bShutdown + Line 199: EXTRN ?bVMOperational@PClass@@2_NA:BYTE ; PClass::bVMOperational + Line 200: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 201: EXTRN ?playeringame@@3PA_NA:BYTE ; playeringame + Line 202: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 203: EXTRN ?save_full@@3_NA:BYTE ; save_full + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\dobjgc.cod (33 hits) + Line 26: EXTRN ??_EStat_gc@@UEAAPEAXI@Z:PROC ; Stat_gc::`vector deleting destructor' + Line 98: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 99: EXTRN atexit:PROC + Line 100: EXTRN atoi:PROC + Line 101: EXTRN stricmp:PROC + Line 102: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 103: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 104: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 105: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 106: EXTRN ?AppendFormat@FString@@QEAAXPEBDZZ:PROC ; FString::AppendFormat + Line 107: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 108: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 109: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 110: EXTRN ??0FStat@@QEAA@PEBD@Z:PROC ; FStat::FStat + Line 111: EXTRN ??1FStat@@UEAA@XZ:PROC ; FStat::~FStat + Line 112: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 113: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 114: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 115: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 116: EXTRN ?PropagateMark@player_t@@QEAA_KXZ:PROC ; player_t::PropagateMark + Line 117: EXTRN ?M_MarkMenus@@YAXXZ:PROC ; M_MarkMenus + Line 118: EXTRN ?Mark@FLevelLocals@@QEAAXXZ:PROC ; FLevelLocals::Mark + Line 119: EXTRN __CxxFrameHandler3:PROC + Line 120: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 121: EXTRN ?RegistrationInfo@DObject@@2UClassReg@@A:BYTE ; DObject::RegistrationInfo + Line 122: EXTRN ?StatusBar@@3PEAVDBaseStatusBar@@EA:QWORD ; StatusBar + Line 123: EXTRN ?playeringame@@3PA_NA:BYTE ; playeringame + Line 124: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 125: EXTRN ?CurrentIntermission@DIntermissionController@@2PEAV1@EA:QWORD ; DIntermissionController::CurrentIntermission + Line 126: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 127: EXTRN ?E_FirstEventHandler@@3PEAVDStaticEventHandler@@EA:QWORD ; E_FirstEventHandler + Line 128: EXTRN ?E_LastEventHandler@@3PEAVDStaticEventHandler@@EA:QWORD ; E_LastEventHandler + Line 129: EXTRN ?NextToThink@@3PEAVDThinker@@EA:QWORD ; NextToThink + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\dobjtype.cod (53 hits) + Line 95: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 96: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 97: EXTRN atexit:PROC + Line 98: EXTRN __std_terminate:PROC + Line 99: EXTRN qsort:PROC + Line 100: EXTRN strncmp:PROC + Line 101: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 102: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 103: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 104: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 105: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 106: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 107: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 108: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 109: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 110: EXTRN ?atterm@@YAXP6AXXZ@Z:PROC ; atterm + Line 111: EXTRN ?FullGC@GC@@YAXXZ:PROC ; GC::FullGC + Line 112: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 113: EXTRN ?Release@DObject@@QEAAXXZ:PROC ; DObject::Release + Line 114: EXTRN ??0FMemArena@@QEAA@_K@Z:PROC ; FMemArena::FMemArena + Line 115: EXTRN ??1FMemArena@@QEAA@XZ:PROC ; FMemArena::~FMemArena + Line 116: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 117: EXTRN ?FreeAllBlocks@FMemArena@@QEAAXXZ:PROC ; FMemArena::FreeAllBlocks + Line 118: EXTRN ?FindSymbol@PSymbolTable@@QEBAPEAVPSymbol@@VFName@@_N@Z:PROC ; PSymbolTable::FindSymbol + Line 119: EXTRN ?AddField@PSymbolTable@@QEAAPEAVPField@@VFName@@PEAVPType@@IAEAIPEAI@Z:PROC ; PSymbolTable::AddField + Line 120: EXTRN ?ReadFields@PSymbolTable@@QEBA_NAEAVFSerializer@@PEAXPEBD@Z:PROC ; PSymbolTable::ReadFields + Line 121: EXTRN ?WriteFields@PSymbolTable@@QEBAXAEAVFSerializer@@PEBX1@Z:PROC ; PSymbolTable::WriteFields + Line 122: EXTRN ?NewNamespace@FNamespaceManager@@QEAAPEAVPNamespace@@H@Z:PROC ; FNamespaceManager::NewNamespace + Line 123: EXTRN ?ReleaseSymbols@FNamespaceManager@@QEAAXXZ:PROC ; FNamespaceManager::ReleaseSymbols + Line 124: EXTRN ?BeginObject@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginObject + Line 125: EXTRN ?EndObject@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndObject + Line 126: EXTRN ?GetKey@FSerializer@@QEAAPEBDXZ:PROC ; FSerializer::GetKey + Line 127: EXTRN ?JitRelease@@YAXXZ:PROC ; JitRelease + Line 128: EXTRN ?NewClassType@@YAPEAVPClassType@@PEAVPClass@@@Z:PROC ; NewClassType + Line 129: EXTRN ?Clear@FTypeTable@@QEAAXXZ:PROC ; FTypeTable::Clear + Line 130: EXTRN ?Clear@ScriptUtil@@SAXXZ:PROC ; ScriptUtil::Clear + Line 131: EXTRN __CxxFrameHandler3:PROC + Line 132: EXTRN memcpy:PROC + Line 133: EXTRN memset:PROC + Line 134: EXTRN strcmp:PROC + Line 135: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 136: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 137: EXTRN ?Root@GC@@3PEAVDObject@@EA:QWORD ; GC::Root + Line 138: EXTRN ?RegistrationInfo@DObject@@2UClassReg@@A:BYTE ; DObject::RegistrationInfo + Line 139: EXTRN ?RegistrationInfo@PFunction@@2UClassReg@@A:BYTE ; PFunction::RegistrationInfo + Line 140: EXTRN ?Namespaces@@3UFNamespaceManager@@A:BYTE ; Namespaces + Line 141: EXTRN ?AllActorClasses@PClassActor@@2V?$TArray@PEAVPClassActor@@PEAV1@@@A:BYTE ; PClassActor::AllActorClasses + Line 142: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 143: EXTRN ?CRegHead@@3QEAXEA:QWORD ; CRegHead + Line 144: EXTRN ?CRegTail@@3QEAXEA:QWORD ; CRegTail + Line 145: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 146: EXTRN ?AllFunctions@VMFunction@@2V?$TArray@PEAVVMFunction@@PEAV1@@@A:BYTE ; VMFunction::AllFunctions + Line 147: EXTRN ?TypeTable@@3UFTypeTable@@A:BYTE ; TypeTable + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\doomstat.cod (18 hits) + Line 20: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 21: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 68: EXTRN atexit:PROC + Line 69: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 70: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 71: EXTRN ??0FStringTable@@QEAA@XZ:PROC ; FStringTable::FStringTable + Line 72: EXTRN ??1FStringTable@@QEAA@XZ:PROC ; FStringTable::~FStringTable + Line 73: EXTRN ?LoadStrings@FStringTable@@QEAAX_N@Z:PROC ; FStringTable::LoadStrings + Line 74: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 75: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 76: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 77: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 78: EXTRN ??0FStringCVar@@QEAA@PEBD0IP6AXAEAV0@@Z@Z:PROC ; FStringCVar::FStringCVar + Line 79: EXTRN ??1FStringCVar@@UEAA@XZ:PROC ; FStringCVar::~FStringCVar + Line 80: EXTRN ?SetLanguageIDs@@YAXXZ:PROC ; SetLanguageIDs + Line 81: EXTRN ?LookupLevelName@level_info_t@@QEAA?AVFString@@XZ:PROC ; level_info_t::LookupLevelName + Line 82: EXTRN __CxxFrameHandler3:PROC + Line 83: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\dosbox_opl3.cod (13 hits) + Line 48: EXTRN _purecall:PROC + Line 49: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 50: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 51: EXTRN ??_EOPLChipBase@@UEAAPEAXI@Z:PROC ; OPLChipBase::`vector deleting destructor' + Line 52: EXTRN ??_E?$OPLChipBaseT@VDosBoxOPL3@@@@UEAAPEAXI@Z:PROC ; OPLChipBaseT::`vector deleting destructor' + Line 53: EXTRN ??_E?$OPLChipBaseBufferedT@VDosBoxOPL3@@$0BAA@@@UEAAPEAXI@Z:PROC ; OPLChipBaseBufferedT::`vector deleting destructor' + Line 54: EXTRN ??_EDosBoxOPL3@@UEAAPEAXI@Z:PROC ; DosBoxOPL3::`vector deleting destructor' + Line 55: EXTRN ??0Chip@DBOPL@@QEAA@XZ:PROC ; DBOPL::Chip::Chip + Line 56: EXTRN ?WritePan@Handler@DBOPL@@QEAAXIE@Z:PROC ; DBOPL::Handler::WritePan + Line 57: EXTRN ?WriteReg@Handler@DBOPL@@QEAAXIE@Z:PROC ; DBOPL::Handler::WriteReg + Line 58: EXTRN ?GenerateArr@Handler@DBOPL@@QEAAXPEAFPEA_K@Z:PROC ; DBOPL::Handler::GenerateArr + Line 59: EXTRN ?Init@Handler@DBOPL@@QEAAX_K@Z:PROC ; DBOPL::Handler::Init + Line 60: EXTRN __CxxFrameHandler3:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\dsectoreffect.cod (29 hits) + Line 35: EXTRN ?RegistrationInfo@DThinker@@2UClassReg@@A:BYTE ; DThinker::RegistrationInfo + Line 186: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 187: EXTRN __std_terminate:PROC + Line 188: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 189: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 190: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 191: EXTRN ?StaticType@DThinker@@UEBAPEAVPClass@@XZ:PROC ; DThinker::StaticType + Line 192: EXTRN ?OnDestroy@DThinker@@UEAAXXZ:PROC ; DThinker::OnDestroy + Line 193: EXTRN ??1DThinker@@UEAA@XZ:PROC ; DThinker::~DThinker + Line 194: EXTRN ?Tick@DThinker@@UEAAXXZ:PROC ; DThinker::Tick + Line 195: EXTRN ?PostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::PostBeginPlay + Line 196: EXTRN ?CallPostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::CallPostBeginPlay + Line 197: EXTRN ?PostSerialize@DThinker@@UEAAXXZ:PROC ; DThinker::PostSerialize + Line 198: EXTRN ?Serialize@DThinker@@UEAAXAEAVFSerializer@@@Z:PROC ; DThinker::Serialize + Line 199: EXTRN ?PropagateMark@DThinker@@UEAA_KXZ:PROC ; DThinker::PropagateMark + Line 200: EXTRN ??_EDThinker@@UEAAPEAXI@Z:PROC ; DThinker::`vector deleting destructor' + Line 201: EXTRN ?SetInterpolation@sector_t@@QEAAPEAVDInterpolation@@H_N@Z:PROC ; sector_t::SetInterpolation + Line 202: EXTRN ?CheckOverlap@sector_t@@QEAAXXZ:PROC ; sector_t::CheckOverlap + Line 203: EXTRN ?AdjustFloorClip@@YAXPEBUsector_t@@@Z:PROC ; AdjustFloorClip + Line 204: EXTRN ??_EDSectorEffect@@UEAAPEAXI@Z:PROC ; DSectorEffect::`vector deleting destructor' + Line 205: EXTRN ?P_ChangeSector@@YA_NPEAUsector_t@@HNH_N1@Z:PROC ; P_ChangeSector + Line 206: EXTRN ?DelRef@DInterpolation@@QEAAH_N@Z:PROC ; DInterpolation::DelRef + Line 207: EXTRN ?P_Scroll3dMidtex@@YA_NPEAUsector_t@@HN_N1@Z:PROC ; P_Scroll3dMidtex + Line 208: EXTRN ?P_MoveLinkedSectors@@YA_NPEAUsector_t@@HN_N1@Z:PROC ; P_MoveLinkedSectors + Line 209: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 210: EXTRN ??$Serialize@Usector_t@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUsector_t@@PEAPEAU1@@Z:PROC ; Serialize + Line 211: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 212: EXTRN __CxxFrameHandler3:PROC + Line 213: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\dthinker.cod (57 hits) + Line 28: EXTRN ?RegistrationInfo@DObject@@2UClassReg@@A:BYTE ; DObject::RegistrationInfo + Line 29: EXTRN ??_EStat_think@@UEAAPEAXI@Z:PROC ; Stat_think::`vector deleting destructor' + Line 163: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 164: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 165: EXTRN atexit:PROC + Line 166: EXTRN __std_terminate:PROC + Line 167: EXTRN atoi:PROC + Line 168: EXTRN stricmp:PROC + Line 169: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 170: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 171: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 172: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 173: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 174: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 175: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 176: EXTRN ?Step@GC@@YAXXZ:PROC ; GC::Step + Line 177: EXTRN ?FullGC@GC@@YAXXZ:PROC ; GC::FullGC + Line 178: EXTRN ?Barrier@GC@@YAXPEAVDObject@@0@Z:PROC ; GC::Barrier + Line 179: EXTRN ?Mark@GC@@YAXPEAPEAVDObject@@@Z:PROC ; GC::Mark + Line 180: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 181: EXTRN ??1DObject@@UEAA@XZ:PROC ; DObject::~DObject + Line 182: EXTRN ?Serialize@DObject@@UEAAXAEAVFSerializer@@@Z:PROC ; DObject::Serialize + Line 183: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 184: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 185: EXTRN ?PropagateMark@DObject@@UEAA_KXZ:PROC ; DObject::PropagateMark + Line 186: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 187: EXTRN ??_EDThinker@@UEAAPEAXI@Z:PROC ; DThinker::`vector deleting destructor' + Line 188: EXTRN ??0FStat@@QEAA@PEBD@Z:PROC ; FStat::FStat + Line 189: EXTRN ??1FStat@@UEAA@XZ:PROC ; FStat::~FStat + Line 190: EXTRN ?ArraySize@FSerializer@@QEAAIXZ:PROC ; FSerializer::ArraySize + Line 191: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 192: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 193: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 194: EXTRN ??$Serialize@UFLevelLocals@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUFLevelLocals@@PEAPEAU1@@Z:PROC ; Serialize + Line 195: EXTRN ?MaybePrintMessage@CVMAbortException@@QEAAXXZ:PROC ; CVMAbortException::MaybePrintMessage + Line 196: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 197: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 198: EXTRN ?GetVirtualIndex@@YAIPEAVPClass@@PEBD@Z:PROC ; GetVirtualIndex + Line 199: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 200: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 201: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 202: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 203: EXTRN ?Tick@FDynamicLight@@QEAAXXZ:PROC ; FDynamicLight::Tick + Line 204: EXTRN __CxxFrameHandler3:PROC + Line 205: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 206: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 207: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 208: EXTRN ?AllocBytes@GC@@3_KA:QWORD ; GC::AllocBytes + Line 209: EXTRN ?Threshold@GC@@3_KA:QWORD ; GC::Threshold + Line 210: EXTRN ?State@GC@@3W4EGCState@1@A:DWORD ; GC::State + Line 211: EXTRN ?PerfToMillisec@@3NA:QWORD ; PerfToMillisec + Line 212: EXTRN ?BotSupportCycles@@3Vcycle_t@@A:QWORD ; BotSupportCycles + Line 213: EXTRN ?stacktrace@CVMAbortException@@2VFString@@A:QWORD ; CVMAbortException::stacktrace + Line 214: EXTRN ?ActionCycles@@3Vcycle_t@@A:QWORD ; ActionCycles + Line 215: EXTRN ?BotWTG@@3HA:DWORD ; BotWTG + Line 216: EXTRN __ImageBase:BYTE + Line 217: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\dynarrays.cod (14 hits) + Line 255: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 770: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 771: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 772: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 773: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 774: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 775: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 776: EXTRN ?Barrier@GC@@YAXPEAVDObject@@0@Z:PROC ; GC::Barrier + Line 777: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 778: EXTRN __CxxFrameHandler3:PROC + Line 779: EXTRN memmove:PROC + Line 780: EXTRN memset:PROC + Line 781: EXTRN ?State@GC@@3W4EGCState@1@A:DWORD ; GC::State + Line 782: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\edata.cod (40 hits) + Line 119: EXTRN __std_terminate:PROC + Line 120: EXTRN strchr:PROC + Line 121: EXTRN strtok:PROC + Line 122: EXTRN stricmp:PROC + Line 123: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 124: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 125: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 126: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 127: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 128: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 129: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 130: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 131: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 132: EXTRN ??0FScanner@@QEAA@XZ:PROC ; FScanner::FScanner + Line 133: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 134: EXTRN ?OpenLumpNum@FScanner@@QEAAXH@Z:PROC ; FScanner::OpenLumpNum + Line 135: EXTRN ?SetCMode@FScanner@@QEAAX_N@Z:PROC ; FScanner::SetCMode + Line 136: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 137: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 138: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 139: EXTRN ?CheckString@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::CheckString + Line 140: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 141: EXTRN ?CheckNumber@FScanner@@QEAA_NXZ:PROC ; FScanner::CheckNumber + Line 142: EXTRN ?MustGetFloat@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetFloat + Line 143: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 144: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 145: EXTRN ?R_ColormapNumForName@@YAIPEBD@Z:PROC ; R_ColormapNumForName + Line 146: EXTRN ?R_BlendForColormap@@YAII@Z:PROC ; R_BlendForColormap + Line 147: EXTRN ?SetColor@@YAXPEAUsector_t@@HH@Z:PROC ; SetColor + Line 148: EXTRN ?P_FindLineSpecial@@YAHPEBDPEAH1@Z:PROC ; P_FindLineSpecial + Line 149: EXTRN ?AddLineID@FTagManager@@QEAAXHH@Z:PROC ; FTagManager::AddLineID + Line 150: EXTRN ?P_FindTerrain@@YAHVFName@@@Z:PROC ; P_FindTerrain + Line 151: EXTRN ?LoadModule@FBehaviorContainer@@QEAAPEAVFBehavior@@HPEAVFileReader@@H@Z:PROC ; FBehaviorContainer::LoadModule + Line 152: EXTRN ?TranslateLineDef@FLevelLocals@@QEAAXPEAUline_t@@PEAUmaplinedef_t@@H@Z:PROC ; FLevelLocals::TranslateLineDef + Line 153: EXTRN __CxxFrameHandler3:PROC + Line 154: EXTRN memset:PROC + Line 155: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 156: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 157: EXTRN ?DoomEdMap@@3V?$TMap@HUFDoomEdEntry@@U?$THashTraits@H@@U?$TValueTraits@UFDoomEdEntry@@@@@@A:BYTE ; DoomEdMap + Line 158: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\effect.cod (14 hits) + Line 13: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 14: EXTRN ?set_dry_signal@Reverb@TimidityPlus@@QEAAXPEAHH@Z:PROC ; TimidityPlus::Reverb::set_dry_signal + Line 15: EXTRN ?mix_dry_signal@Reverb@TimidityPlus@@QEAAXPEAHH@Z:PROC ; TimidityPlus::Reverb::mix_dry_signal + Line 16: EXTRN ?init_pink_noise@Reverb@TimidityPlus@@QEAAXPEAUpink_noise@2@@Z:PROC ; TimidityPlus::Reverb::init_pink_noise + Line 17: EXTRN ?do_ch_reverb@Reverb@TimidityPlus@@QEAAXPEAHH@Z:PROC ; TimidityPlus::Reverb::do_ch_reverb + Line 18: EXTRN ?set_ch_reverb@Reverb@TimidityPlus@@QEAAXPEAHHH@Z:PROC ; TimidityPlus::Reverb::set_ch_reverb + Line 19: EXTRN ?init_reverb@Reverb@TimidityPlus@@QEAAXXZ:PROC ; TimidityPlus::Reverb::init_reverb + Line 20: EXTRN ?init_ch_chorus@Reverb@TimidityPlus@@QEAAXXZ:PROC ; TimidityPlus::Reverb::init_ch_chorus + Line 21: EXTRN ?init_ch_delay@Reverb@TimidityPlus@@QEAAXXZ:PROC ; TimidityPlus::Reverb::init_ch_delay + Line 22: EXTRN ?init_eq_gs@Reverb@TimidityPlus@@QEAAXXZ:PROC ; TimidityPlus::Reverb::init_eq_gs + Line 23: EXTRN memset:PROC + Line 24: EXTRN ?timidity_reverb@TimidityPlus@@3HA:DWORD ; TimidityPlus::timidity_reverb + Line 25: EXTRN ?timidity_chorus@TimidityPlus@@3HA:DWORD ; TimidityPlus::timidity_chorus + Line 26: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\emptytexture.cod (12 hits) + Line 19: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 20: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 21: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 22: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 23: EXTRN ?CreatePalettedPixels@FImageSource@@MEAA?AV?$TArray@EE@@H@Z:PROC ; FImageSource::CreatePalettedPixels + Line 24: EXTRN ?CopyPixels@FImageSource@@MEAAHPEAVFBitmap@@H@Z:PROC ; FImageSource::CopyPixels + Line 25: EXTRN ?CollectForPrecache@FImageSource@@UEAAXAEAV?$TMap@HU?$pair@HH@std@@U?$THashTraits@H@@U?$TValueTraits@U?$pair@HH@std@@@@@@_N@Z:PROC ; FImageSource::CollectForPrecache + Line 26: EXTRN ??_EFImageSource@@UEAAPEAXI@Z:PROC ; FImageSource::`vector deleting destructor' + Line 27: EXTRN ??_EFEmptyTexture@@UEAAPEAXI@Z:PROC ; FEmptyTexture::`vector deleting destructor' + Line 28: EXTRN __CxxFrameHandler3:PROC + Line 29: EXTRN ?ImageArena@FImageSource@@1VFMemArena@@A:BYTE ; FImageSource::ImageArena + Line 30: EXTRN ?NextID@FImageSource@@1HA:DWORD ; FImageSource::NextID + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\events.cod (53 hits) + Line 138: EXTRN ?RegistrationInfo@DObject@@2UClassReg@@A:BYTE ; DObject::RegistrationInfo + Line 884: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 885: EXTRN atexit:PROC + Line 886: EXTRN __std_terminate:PROC + Line 887: EXTRN atoi:PROC + Line 888: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 889: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 890: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_K_N@Z:PROC ; FName::NameManager::FindName + Line 891: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 892: EXTRN ??0FString@@QEAA@D@Z:PROC ; FString::FString + Line 893: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 894: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 895: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 896: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 897: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 898: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 899: EXTRN ?Barrier@GC@@YAXPEAVDObject@@0@Z:PROC ; GC::Barrier + Line 900: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 901: EXTRN ??1DObject@@UEAA@XZ:PROC ; DObject::~DObject + Line 902: EXTRN ?Serialize@DObject@@UEAAXAEAVFSerializer@@@Z:PROC ; DObject::Serialize + Line 903: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 904: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 905: EXTRN ?PropagateMark@DObject@@UEAA_KXZ:PROC ; DObject::PropagateMark + Line 906: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 907: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 908: EXTRN ?ArraySize@FSerializer@@QEAAIXZ:PROC ; FSerializer::ArraySize + Line 909: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 910: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 911: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEA_NPEA_N@Z:PROC ; Serialize + Line 912: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 913: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 914: EXTRN ??_EDStaticEventHandler@@UEAAPEAXI@Z:PROC ; DStaticEventHandler::`vector deleting destructor' + Line 915: EXTRN ??_EDEventHandler@@UEAAPEAXI@Z:PROC ; DEventHandler::`vector deleting destructor' + Line 916: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 917: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 918: EXTRN ?GetVirtualIndex@@YAIPEAVPClass@@PEBD@Z:PROC ; GetVirtualIndex + Line 919: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 920: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 921: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 922: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 923: EXTRN ?Net_WriteByte@@YAXE@Z:PROC ; Net_WriteByte + Line 924: EXTRN ?Net_WriteLong@@YAXH@Z:PROC ; Net_WriteLong + Line 925: EXTRN ?Net_WriteString@@YAXPEBD@Z:PROC ; Net_WriteString + Line 926: EXTRN __CxxFrameHandler3:PROC + Line 927: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 928: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 929: EXTRN ?State@GC@@3W4EGCState@1@A:DWORD ; GC::State + Line 930: EXTRN ?r_viewpoint@@3UFRenderViewpoint@@A:BYTE ; r_viewpoint + Line 931: EXTRN ?savegamerestore@@3_NA:BYTE ; savegamerestore + Line 932: EXTRN ?level@@3UFLevelLocals@@A:BYTE ; level + Line 933: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 934: EXTRN ?gamestate@@3W4gamestate_t@@A:DWORD ; gamestate + Line 935: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\exp.cod (9 hits) + Line 11: EXTRN mtherr:PROC + Line 12: EXTRN polevl:PROC + Line 13: EXTRN ldexp:PROC + Line 14: EXTRN floor:PROC + Line 15: EXTRN LOG2E:QWORD + Line 16: EXTRN MAXLOG:QWORD + Line 17: EXTRN MINLOG:QWORD + Line 18: EXTRN MAXNUM:QWORD + Line 19: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\f_wipe.cod (27 hits) + Line 38: EXTRN _purecall:PROC + Line 39: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 40: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 41: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 42: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 43: EXTRN __std_terminate:PROC + Line 44: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 45: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 46: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 47: EXTRN ??1FTexture@@UEAA@XZ:PROC ; FTexture::~FTexture + Line 48: EXTRN ?Get8BitPixels@FTexture@@UEAA?AV?$TArray@EE@@_N@Z:PROC ; FTexture::Get8BitPixels + Line 49: EXTRN ??0FTexture@@IEAA@PEBDH@Z:PROC ; FTexture::FTexture + Line 50: EXTRN ?DrawTexture@DFrameBuffer@@QEAAXPEAVFTexture@@NNHZZ:PROC ; DFrameBuffer::DrawTexture + Line 51: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 52: EXTRN ??_EWiper@@UEAAPEAXI@Z:PROC ; Wiper::`vector deleting destructor' + Line 53: EXTRN ?CopyPixelDataRGB@FBitmap@@QEAAXHHPEBEHHHHHHPEAUFCopyInfo@@HHH@Z:PROC ; FBitmap::CopyPixelDataRGB + Line 54: EXTRN ?ValidateTexture@FMaterial@@SAPEAV1@PEAVFTexture@@_N1@Z:PROC ; FMaterial::ValidateTexture + Line 55: EXTRN ??_EFBurnTexture@@UEAAPEAXI@Z:PROC ; FBurnTexture::`vector deleting destructor' + Line 56: EXTRN ??_EWiper_Crossfade@@UEAAPEAXI@Z:PROC ; Wiper_Crossfade::`vector deleting destructor' + Line 57: EXTRN ??_EWiper_Melt@@UEAAPEAXI@Z:PROC ; Wiper_Melt::`vector deleting destructor' + Line 58: EXTRN ??_EWiper_Burn@@UEAAPEAXI@Z:PROC ; Wiper_Burn::`vector deleting destructor' + Line 59: EXTRN __CxxFrameHandler3:PROC + Line 60: EXTRN memmove:PROC + Line 61: EXTRN memset:PROC + Line 62: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 63: EXTRN ?M_Random@@3VFRandom@@A:BYTE ; M_Random + Line 64: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\fastsin.cod (2 hits) + Line 15: EXTRN c_sin:PROC + Line 16: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\fft4g.cod (4 hits) + Line 30: EXTRN __libm_sse2_sincos_:PROC + Line 31: EXTRN __libm_sse2_sincosf_:PROC + Line 32: EXTRN cosf:PROC + Line 33: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\file_7z.cod (43 hits) + Line 36: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 37: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 38: EXTRN _purecall:PROC + Line 39: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 40: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 41: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 42: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 43: EXTRN ??_V@YAXPEAX_K@Z:PROC ; operator delete[] + Line 44: EXTRN __std_terminate:PROC + Line 45: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 46: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 47: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 48: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 49: EXTRN ?ToLower@FString@@QEAAXXZ:PROC ; FString::ToLower + Line 50: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 51: EXTRN LookToRead2_CreateVTable:PROC + Line 52: EXTRN SzArEx_Init:PROC + Line 53: EXTRN SzArEx_Free:PROC + Line 54: EXTRN SzArEx_GetFileNameUtf16:PROC + Line 55: EXTRN SzArEx_Extract:PROC + Line 56: EXTRN SzArEx_Open:PROC + Line 57: EXTRN CrcGenerateTable:PROC + Line 58: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 59: EXTRN ??1FResourceLump@@UEAA@XZ:PROC ; FResourceLump::~FResourceLump + Line 60: EXTRN ?GetReader@FResourceLump@@UEAAPEAVFileReader@@XZ:PROC ; FResourceLump::GetReader + Line 61: EXTRN ?NewReader@FResourceLump@@UEAA?AVFileReader@@XZ:PROC ; FResourceLump::NewReader + Line 62: EXTRN ?LumpNameSetup@FResourceLump@@QEAAXVFString@@@Z:PROC ; FResourceLump::LumpNameSetup + Line 63: EXTRN ?CheckEmbedded@FResourceLump@@QEAAXXZ:PROC ; FResourceLump::CheckEmbedded + Line 64: EXTRN ?GetRawData@FResourceLump@@UEAA?AUFCompressedBuffer@@XZ:PROC ; FResourceLump::GetRawData + Line 65: EXTRN ??_EFResourceLump@@UEAAPEAXI@Z:PROC ; FResourceLump::`vector deleting destructor' + Line 66: EXTRN ??0FResourceFile@@IEAA@PEBDAEAVFileReader@@@Z:PROC ; FResourceFile::FResourceFile + Line 67: EXTRN ?PostProcessArchive@FResourceFile@@IEAAXPEAX_K@Z:PROC ; FResourceFile::PostProcessArchive + Line 68: EXTRN ??1FResourceFile@@UEAA@XZ:PROC ; FResourceFile::~FResourceFile + Line 69: EXTRN ?FindStrifeTeaserVoices@FResourceFile@@UEAAXXZ:PROC ; FResourceFile::FindStrifeTeaserVoices + Line 70: EXTRN ?FixPathSeperator@@YAXPEAD@Z:PROC ; FixPathSeperator + Line 71: EXTRN ??_EF7ZFile@@UEAAPEAXI@Z:PROC ; F7ZFile::`vector deleting destructor' + Line 72: EXTRN __CxxFrameHandler3:PROC + Line 73: EXTRN memcpy:PROC + Line 74: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 75: EXTRN k7zSignature:BYTE + Line 76: EXTRN g_CrcTable:BYTE + Line 77: EXTRN ?batchrun@@3_NA:BYTE ; batchrun + Line 78: EXTRN ?g_Alloc@@3UISzAlloc@@A:BYTE ; g_Alloc + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\file_directory.cod (42 hits) + Line 30: EXTRN _purecall:PROC + Line 31: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 32: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 33: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 34: EXTRN _errno:PROC + Line 35: EXTRN free:PROC + Line 36: EXTRN _fullpath:PROC + Line 37: EXTRN strstr:PROC + Line 38: EXTRN strerror:PROC + Line 39: EXTRN _findclose:PROC + Line 40: EXTRN _findfirst64i32:PROC + Line 41: EXTRN _findnext64i32:PROC + Line 42: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 43: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 44: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 45: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 46: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 47: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 48: EXTRN ??HFString@@QEBA?AV0@PEBD@Z:PROC ; FString::operator+ + Line 49: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 50: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 51: EXTRN ?ToLower@FString@@QEAAXXZ:PROC ; FString::ToLower + Line 52: EXTRN ?ReplaceChars@FString@@QEAAXDD@Z:PROC ; FString::ReplaceChars + Line 53: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 54: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 55: EXTRN ?OpenFile@FileReader@@QEAA_NPEBD_J1@Z:PROC ; FileReader::OpenFile + Line 56: EXTRN ??1FResourceLump@@UEAA@XZ:PROC ; FResourceLump::~FResourceLump + Line 57: EXTRN ?GetReader@FResourceLump@@UEAAPEAVFileReader@@XZ:PROC ; FResourceLump::GetReader + Line 58: EXTRN ?NewReader@FResourceLump@@UEAA?AVFileReader@@XZ:PROC ; FResourceLump::NewReader + Line 59: EXTRN ?LumpNameSetup@FResourceLump@@QEAAXVFString@@@Z:PROC ; FResourceLump::LumpNameSetup + Line 60: EXTRN ?CheckEmbedded@FResourceLump@@QEAAXXZ:PROC ; FResourceLump::CheckEmbedded + Line 61: EXTRN ?GetRawData@FResourceLump@@UEAA?AUFCompressedBuffer@@XZ:PROC ; FResourceLump::GetRawData + Line 62: EXTRN ??_EFResourceLump@@UEAAPEAXI@Z:PROC ; FResourceLump::`vector deleting destructor' + Line 63: EXTRN ??0FResourceFile@@IEAA@PEBD@Z:PROC ; FResourceFile::FResourceFile + Line 64: EXTRN ?PostProcessArchive@FResourceFile@@IEAAXPEAX_K@Z:PROC ; FResourceFile::PostProcessArchive + Line 65: EXTRN ??1FResourceFile@@UEAA@XZ:PROC ; FResourceFile::~FResourceFile + Line 66: EXTRN ?FindStrifeTeaserVoices@FResourceFile@@UEAAXXZ:PROC ; FResourceFile::FindStrifeTeaserVoices + Line 67: EXTRN ??_EFDirectoryLump@@UEAAPEAXI@Z:PROC ; FDirectoryLump::`vector deleting destructor' + Line 68: EXTRN ??_EFDirectory@@UEAAPEAXI@Z:PROC ; FDirectory::`vector deleting destructor' + Line 69: EXTRN __CxxFrameHandler3:PROC + Line 70: EXTRN memset:PROC + Line 71: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\file_grp.cod (26 hits) + Line 24: EXTRN _purecall:PROC + Line 25: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 26: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 27: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 28: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 29: EXTRN __std_terminate:PROC + Line 30: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 31: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 32: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 33: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 34: EXTRN ??1FResourceLump@@UEAA@XZ:PROC ; FResourceLump::~FResourceLump + Line 35: EXTRN ?GetReader@FResourceLump@@UEAAPEAVFileReader@@XZ:PROC ; FResourceLump::GetReader + Line 36: EXTRN ?NewReader@FResourceLump@@UEAA?AVFileReader@@XZ:PROC ; FResourceLump::NewReader + Line 37: EXTRN ?LumpNameSetup@FResourceLump@@QEAAXVFString@@@Z:PROC ; FResourceLump::LumpNameSetup + Line 38: EXTRN ?GetRawData@FResourceLump@@UEAA?AUFCompressedBuffer@@XZ:PROC ; FResourceLump::GetRawData + Line 39: EXTRN ??_EFResourceLump@@UEAAPEAXI@Z:PROC ; FResourceLump::`vector deleting destructor' + Line 40: EXTRN ??1FResourceFile@@UEAA@XZ:PROC ; FResourceFile::~FResourceFile + Line 41: EXTRN ?FindStrifeTeaserVoices@FResourceFile@@UEAAXXZ:PROC ; FResourceFile::FindStrifeTeaserVoices + Line 42: EXTRN ?GetReader@FUncompressedLump@@UEAAPEAVFileReader@@XZ:PROC ; FUncompressedLump::GetReader + Line 43: EXTRN ?FillCache@FUncompressedLump@@UEAAHXZ:PROC ; FUncompressedLump::FillCache + Line 44: EXTRN ??_EFUncompressedLump@@UEAAPEAXI@Z:PROC ; FUncompressedLump::`vector deleting destructor' + Line 45: EXTRN ??0FUncompressedFile@@IEAA@PEBDAEAVFileReader@@@Z:PROC ; FUncompressedFile::FUncompressedFile + Line 46: EXTRN ??_EFGrpFile@@UEAAPEAXI@Z:PROC ; FGrpFile::`vector deleting destructor' + Line 47: EXTRN __CxxFrameHandler3:PROC + Line 48: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 49: EXTRN ?batchrun@@3_NA:BYTE ; batchrun + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\file_io.cod (10 hits) + Line 8: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 15: EXTRN atexit:PROC + Line 16: EXTRN _errno:PROC + Line 17: EXTRN malloc:PROC + Line 18: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 19: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 20: EXTRN ?_WM_ERROR@@YAXPEBDIH0H@Z:PROC ; _WM_ERROR + Line 21: EXTRN ?OpenSoundFont@FSoundFontManager@@QEAAPEAVFSoundFontReader@@PEBDH@Z:PROC ; FSoundFontManager::OpenSoundFont + Line 22: EXTRN __CxxFrameHandler3:PROC + Line 23: EXTRN ?sfmanager@@3VFSoundFontManager@@A:BYTE ; sfmanager + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\file_lump.cod (25 hits) + Line 23: EXTRN _purecall:PROC + Line 24: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 25: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 26: EXTRN __std_terminate:PROC + Line 27: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 28: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 29: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 30: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 31: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 32: EXTRN ??1FResourceLump@@UEAA@XZ:PROC ; FResourceLump::~FResourceLump + Line 33: EXTRN ?GetReader@FResourceLump@@UEAAPEAVFileReader@@XZ:PROC ; FResourceLump::GetReader + Line 34: EXTRN ?NewReader@FResourceLump@@UEAA?AVFileReader@@XZ:PROC ; FResourceLump::NewReader + Line 35: EXTRN ?GetRawData@FResourceLump@@UEAA?AUFCompressedBuffer@@XZ:PROC ; FResourceLump::GetRawData + Line 36: EXTRN ??_EFResourceLump@@UEAAPEAXI@Z:PROC ; FResourceLump::`vector deleting destructor' + Line 37: EXTRN ??1FResourceFile@@UEAA@XZ:PROC ; FResourceFile::~FResourceFile + Line 38: EXTRN ?FindStrifeTeaserVoices@FResourceFile@@UEAAXXZ:PROC ; FResourceFile::FindStrifeTeaserVoices + Line 39: EXTRN ?GetReader@FUncompressedLump@@UEAAPEAVFileReader@@XZ:PROC ; FUncompressedLump::GetReader + Line 40: EXTRN ?FillCache@FUncompressedLump@@UEAAHXZ:PROC ; FUncompressedLump::FillCache + Line 41: EXTRN ??_EFUncompressedLump@@UEAAPEAXI@Z:PROC ; FUncompressedLump::`vector deleting destructor' + Line 42: EXTRN ??0FUncompressedFile@@IEAA@PEBDAEAVFileReader@@@Z:PROC ; FUncompressedFile::FUncompressedFile + Line 43: EXTRN ?ExtractFileBase@@YA?AVFString@@PEBD_N@Z:PROC ; ExtractFileBase + Line 44: EXTRN ?uppercopy@@YAXPEADPEBD@Z:PROC ; uppercopy + Line 45: EXTRN ??_EFLumpFile@@UEAAPEAXI@Z:PROC ; FLumpFile::`vector deleting destructor' + Line 46: EXTRN __CxxFrameHandler3:PROC + Line 47: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\file_pak.cod (26 hits) + Line 25: EXTRN _purecall:PROC + Line 26: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 27: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 28: EXTRN __std_terminate:PROC + Line 29: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 30: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 31: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 32: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 33: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 34: EXTRN ??1FResourceLump@@UEAA@XZ:PROC ; FResourceLump::~FResourceLump + Line 35: EXTRN ?GetReader@FResourceLump@@UEAAPEAVFileReader@@XZ:PROC ; FResourceLump::GetReader + Line 36: EXTRN ?NewReader@FResourceLump@@UEAA?AVFileReader@@XZ:PROC ; FResourceLump::NewReader + Line 37: EXTRN ?LumpNameSetup@FResourceLump@@QEAAXVFString@@@Z:PROC ; FResourceLump::LumpNameSetup + Line 38: EXTRN ?CheckEmbedded@FResourceLump@@QEAAXXZ:PROC ; FResourceLump::CheckEmbedded + Line 39: EXTRN ?GetRawData@FResourceLump@@UEAA?AUFCompressedBuffer@@XZ:PROC ; FResourceLump::GetRawData + Line 40: EXTRN ??_EFResourceLump@@UEAAPEAXI@Z:PROC ; FResourceLump::`vector deleting destructor' + Line 41: EXTRN ??1FResourceFile@@UEAA@XZ:PROC ; FResourceFile::~FResourceFile + Line 42: EXTRN ?FindStrifeTeaserVoices@FResourceFile@@UEAAXXZ:PROC ; FResourceFile::FindStrifeTeaserVoices + Line 43: EXTRN ?GetReader@FUncompressedLump@@UEAAPEAVFileReader@@XZ:PROC ; FUncompressedLump::GetReader + Line 44: EXTRN ?FillCache@FUncompressedLump@@UEAAHXZ:PROC ; FUncompressedLump::FillCache + Line 45: EXTRN ??_EFUncompressedLump@@UEAAPEAXI@Z:PROC ; FUncompressedLump::`vector deleting destructor' + Line 46: EXTRN ??0FUncompressedFile@@IEAA@PEBDAEAVFileReader@@@Z:PROC ; FUncompressedFile::FUncompressedFile + Line 47: EXTRN ??_EFPakFile@@UEAAPEAXI@Z:PROC ; FPakFile::`vector deleting destructor' + Line 48: EXTRN __CxxFrameHandler3:PROC + Line 49: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 50: EXTRN ?batchrun@@3_NA:BYTE ; batchrun + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\file_rff.cod (27 hits) + Line 34: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 35: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 36: EXTRN _purecall:PROC + Line 37: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 38: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 39: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 40: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 41: EXTRN ??_V@YAXPEAX_K@Z:PROC ; operator delete[] + Line 42: EXTRN strncpy:PROC + Line 43: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 44: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 45: EXTRN ??1FResourceLump@@UEAA@XZ:PROC ; FResourceLump::~FResourceLump + Line 46: EXTRN ?GetReader@FResourceLump@@UEAAPEAVFileReader@@XZ:PROC ; FResourceLump::GetReader + Line 47: EXTRN ?NewReader@FResourceLump@@UEAA?AVFileReader@@XZ:PROC ; FResourceLump::NewReader + Line 48: EXTRN ?LumpNameSetup@FResourceLump@@QEAAXVFString@@@Z:PROC ; FResourceLump::LumpNameSetup + Line 49: EXTRN ?GetRawData@FResourceLump@@UEAA?AUFCompressedBuffer@@XZ:PROC ; FResourceLump::GetRawData + Line 50: EXTRN ??_EFResourceLump@@UEAAPEAXI@Z:PROC ; FResourceLump::`vector deleting destructor' + Line 51: EXTRN ??0FResourceFile@@IEAA@PEBDAEAVFileReader@@@Z:PROC ; FResourceFile::FResourceFile + Line 52: EXTRN ??1FResourceFile@@UEAA@XZ:PROC ; FResourceFile::~FResourceFile + Line 53: EXTRN ?FindStrifeTeaserVoices@FResourceFile@@UEAAXXZ:PROC ; FResourceFile::FindStrifeTeaserVoices + Line 54: EXTRN ?GetReader@FUncompressedLump@@UEAAPEAVFileReader@@XZ:PROC ; FUncompressedLump::GetReader + Line 55: EXTRN ?FillCache@FUncompressedLump@@UEAAHXZ:PROC ; FUncompressedLump::FillCache + Line 56: EXTRN ??_EFUncompressedLump@@UEAAPEAXI@Z:PROC ; FUncompressedLump::`vector deleting destructor' + Line 57: EXTRN ??_EFRFFFile@@UEAAPEAXI@Z:PROC ; FRFFFile::`vector deleting destructor' + Line 58: EXTRN __CxxFrameHandler3:PROC + Line 59: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 60: EXTRN ?batchrun@@3_NA:BYTE ; batchrun + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\file_wad.cod (31 hits) + Line 59: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 60: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 61: EXTRN _purecall:PROC + Line 62: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 63: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 64: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 65: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 66: EXTRN ??_V@YAXPEAX_K@Z:PROC ; operator delete[] + Line 67: EXTRN __std_terminate:PROC + Line 68: EXTRN isdigit:PROC + Line 69: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 70: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 71: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 72: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 73: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 74: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 75: EXTRN ?OpenDecompressor@FileReader@@QEAA_NAEAV1@_JH_N@Z:PROC ; FileReader::OpenDecompressor + Line 76: EXTRN ??1FResourceLump@@UEAA@XZ:PROC ; FResourceLump::~FResourceLump + Line 77: EXTRN ?GetReader@FResourceLump@@UEAAPEAVFileReader@@XZ:PROC ; FResourceLump::GetReader + Line 78: EXTRN ?NewReader@FResourceLump@@UEAA?AVFileReader@@XZ:PROC ; FResourceLump::NewReader + Line 79: EXTRN ?GetRawData@FResourceLump@@UEAA?AUFCompressedBuffer@@XZ:PROC ; FResourceLump::GetRawData + Line 80: EXTRN ??_EFResourceLump@@UEAAPEAXI@Z:PROC ; FResourceLump::`vector deleting destructor' + Line 81: EXTRN ??0FResourceFile@@IEAA@PEBDAEAVFileReader@@@Z:PROC ; FResourceFile::FResourceFile + Line 82: EXTRN ??1FResourceFile@@UEAA@XZ:PROC ; FResourceFile::~FResourceFile + Line 83: EXTRN ?uppercopy@@YAXPEADPEBD@Z:PROC ; uppercopy + Line 84: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 85: EXTRN ??_EFWadFile@@UEAAPEAXI@Z:PROC ; FWadFile::`vector deleting destructor' + Line 86: EXTRN __CxxFrameHandler3:PROC + Line 87: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 88: EXTRN ?batchrun@@3_NA:BYTE ; batchrun + Line 89: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\file_zip.cod (53 hits) + Line 72: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 73: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 74: EXTRN _purecall:PROC + Line 75: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 76: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 77: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 78: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 79: EXTRN ??_V@YAXPEAX_K@Z:PROC ; operator delete[] + Line 80: EXTRN __std_terminate:PROC + Line 81: EXTRN free:PROC + Line 82: EXTRN malloc:PROC + Line 83: EXTRN remove:PROC + Line 84: EXTRN stricmp:PROC + Line 85: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 86: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 87: EXTRN ??0FString@@QEAA@PEBD_K@Z:PROC ; FString::FString + Line 88: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 89: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 90: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 91: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 92: EXTRN ??HFString@@QEBA?AV0@PEBD@Z:PROC ; FString::operator+ + Line 93: EXTRN ?Mid@FString@@QEBA?AV1@_K0@Z:PROC ; FString::Mid + Line 94: EXTRN ?IndexOf@FString@@QEBAJAEBV1@J@Z:PROC ; FString::IndexOf + Line 95: EXTRN ?IndexOf@FString@@QEBAJPEBDJ@Z:PROC ; FString::IndexOf + Line 96: EXTRN ?ToLower@FString@@QEAAXXZ:PROC ; FString::ToLower + Line 97: EXTRN ?ReplaceChars@FString@@QEAAXDD@Z:PROC ; FString::ReplaceChars + Line 98: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 99: EXTRN _localtime64:PROC + Line 100: EXTRN _time64:PROC + Line 101: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 102: EXTRN ?OpenMemory@FileReader@@QEAA_NPEBX_J@Z:PROC ; FileReader::OpenMemory + Line 103: EXTRN ?OpenDecompressor@FileReader@@QEAA_NAEAV1@_JH_N@Z:PROC ; FileReader::OpenDecompressor + Line 104: EXTRN ?Open@FileWriter@@SAPEAV1@PEBD@Z:PROC ; FileWriter::Open + Line 105: EXTRN ??1FResourceLump@@UEAA@XZ:PROC ; FResourceLump::~FResourceLump + Line 106: EXTRN ?GetReader@FResourceLump@@UEAAPEAVFileReader@@XZ:PROC ; FResourceLump::GetReader + Line 107: EXTRN ?NewReader@FResourceLump@@UEAA?AVFileReader@@XZ:PROC ; FResourceLump::NewReader + Line 108: EXTRN ?LumpNameSetup@FResourceLump@@QEAAXVFString@@@Z:PROC ; FResourceLump::LumpNameSetup + Line 109: EXTRN ?CheckEmbedded@FResourceLump@@QEAAXXZ:PROC ; FResourceLump::CheckEmbedded + Line 110: EXTRN ?GetRawData@FResourceLump@@UEAA?AUFCompressedBuffer@@XZ:PROC ; FResourceLump::GetRawData + Line 111: EXTRN ??_EFResourceLump@@UEAAPEAXI@Z:PROC ; FResourceLump::`vector deleting destructor' + Line 112: EXTRN ??0FResourceFile@@IEAA@PEBDAEAVFileReader@@@Z:PROC ; FResourceFile::FResourceFile + Line 113: EXTRN ?PostProcessArchive@FResourceFile@@IEAAXPEAX_K@Z:PROC ; FResourceFile::PostProcessArchive + Line 114: EXTRN ??1FResourceFile@@UEAA@XZ:PROC ; FResourceFile::~FResourceFile + Line 115: EXTRN ?FindStrifeTeaserVoices@FResourceFile@@UEAAXXZ:PROC ; FResourceFile::FindStrifeTeaserVoices + Line 116: EXTRN ??_EFZipFile@@UEAAPEAXI@Z:PROC ; FZipFile::`vector deleting destructor' + Line 117: EXTRN ?Explode@FZipExploder@@QEAAHPEAEIAEAVFileReader@@IH@Z:PROC ; FZipExploder::Explode + Line 118: EXTRN ?ShrinkLoop@@YAHPEAEIAEAVFileReader@@I@Z:PROC ; ShrinkLoop + Line 119: EXTRN __CxxFrameHandler3:PROC + Line 120: EXTRN strcmp:PROC + Line 121: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 122: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 123: EXTRN ?batchrun@@3_NA:BYTE ; batchrun + Line 124: EXTRN __ImageBase:BYTE + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\files.cod (25 hits) + Line 54: EXTRN _purecall:PROC + Line 55: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 56: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 57: EXTRN __std_terminate:PROC + Line 58: EXTRN fclose:PROC + Line 59: EXTRN fgets:PROC + Line 60: EXTRN fopen:PROC + Line 61: EXTRN fread:PROC + Line 62: EXTRN fseek:PROC + Line 63: EXTRN ftell:PROC + Line 64: EXTRN fwrite:PROC + Line 65: EXTRN ?_Xbad_function_call@std@@YAXXZ:PROC ; std::_Xbad_function_call + Line 66: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 67: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 68: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 69: EXTRN ?VFormat@FString@@QEAAXPEBDPEAD@Z:PROC ; FString::VFormat + Line 70: EXTRN ??_EFileReaderInterface@@UEAAPEAXI@Z:PROC ; FileReaderInterface::`vector deleting destructor' + Line 71: EXTRN ??_EMemoryReader@@UEAAPEAXI@Z:PROC ; MemoryReader::`vector deleting destructor' + Line 72: EXTRN ??_EFileWriter@@UEAAPEAXI@Z:PROC ; FileWriter::`vector deleting destructor' + Line 73: EXTRN ??_EStdFileReader@@UEAAPEAXI@Z:PROC ; StdFileReader::`vector deleting destructor' + Line 74: EXTRN ??_EFileReaderRedirect@@UEAAPEAXI@Z:PROC ; FileReaderRedirect::`vector deleting destructor' + Line 75: EXTRN ??_EMemoryArrayReader@@UEAAPEAXI@Z:PROC ; MemoryArrayReader::`vector deleting destructor' + Line 76: EXTRN __CxxFrameHandler3:PROC + Line 77: EXTRN memcpy:PROC + Line 78: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\files_decompress.cod (30 hits) + Line 54: EXTRN _purecall:PROC + Line 55: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 56: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 57: EXTRN free:PROC + Line 58: EXTRN malloc:PROC + Line 59: EXTRN inflate:PROC + Line 60: EXTRN inflateEnd:PROC + Line 61: EXTRN inflateInit_:PROC + Line 62: EXTRN inflateInit2_:PROC + Line 63: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 64: EXTRN LzmaDec_Init:PROC + Line 65: EXTRN LzmaDec_Allocate:PROC + Line 66: EXTRN LzmaDec_Free:PROC + Line 67: EXTRN LzmaDec_DecodeToBuf:PROC + Line 68: EXTRN BZ2_bzDecompressInit:PROC + Line 69: EXTRN BZ2_bzDecompress:PROC + Line 70: EXTRN BZ2_bzDecompressEnd:PROC + Line 71: EXTRN ??_EFileReaderInterface@@UEAAPEAXI@Z:PROC ; FileReaderInterface::`vector deleting destructor' + Line 72: EXTRN ??_EDecompressorBase@@UEAAPEAXI@Z:PROC ; DecompressorBase::`vector deleting destructor' + Line 73: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 74: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 75: EXTRN ?M_ZLibError@@YA?AVFString@@H@Z:PROC ; M_ZLibError + Line 76: EXTRN ??_EDecompressorZ@@UEAAPEAXI@Z:PROC ; DecompressorZ::`vector deleting destructor' + Line 77: EXTRN ??_EDecompressorBZ2@@UEAAPEAXI@Z:PROC ; DecompressorBZ2::`vector deleting destructor' + Line 78: EXTRN ??_EDecompressorLZMA@@UEAAPEAXI@Z:PROC ; DecompressorLZMA::`vector deleting destructor' + Line 79: EXTRN ??_EDecompressorLZSS@@UEAAPEAXI@Z:PROC ; DecompressorLZSS::`vector deleting destructor' + Line 80: EXTRN __CxxFrameHandler3:PROC + Line 81: EXTRN memcpy:PROC + Line 82: EXTRN memmove:PROC + Line 83: EXTRN memset:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\filter.cod (8 hits) + Line 22: EXTRN free:PROC + Line 23: EXTRN ?safe_malloc@TimidityPlus@@YAPEAX_K@Z:PROC ; TimidityPlus::safe_malloc + Line 24: EXTRN __vdecl_sin2:PROC + Line 25: EXTRN exp:PROC + Line 26: EXTRN log:PROC + Line 27: EXTRN memcpy:PROC + Line 28: EXTRN sqrt:PROC + Line 29: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\flattexture.cod (19 hits) + Line 21: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 22: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 23: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 24: EXTRN ?OpenLumpReader@FWadCollection@@QEAA?AVFileReader@@H@Z:PROC ; FWadCollection::OpenLumpReader + Line 25: EXTRN ?LumpLength@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::LumpLength + Line 26: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 27: EXTRN ?CreatePalettedPixels@FImageSource@@MEAA?AV?$TArray@EE@@H@Z:PROC ; FImageSource::CreatePalettedPixels + Line 28: EXTRN ?CopyPixels@FImageSource@@MEAAHPEAVFBitmap@@H@Z:PROC ; FImageSource::CopyPixels + Line 29: EXTRN ?CollectForPrecache@FImageSource@@UEAAXAEAV?$TMap@HU?$pair@HH@std@@U?$THashTraits@H@@U?$TValueTraits@U?$pair@HH@std@@@@@@_N@Z:PROC ; FImageSource::CollectForPrecache + Line 30: EXTRN ??_EFImageSource@@UEAAPEAXI@Z:PROC ; FImageSource::`vector deleting destructor' + Line 31: EXTRN ??_EFFlatTexture@@UEAAPEAXI@Z:PROC ; FFlatTexture::`vector deleting destructor' + Line 32: EXTRN __CxxFrameHandler3:PROC + Line 33: EXTRN memset:PROC + Line 34: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 35: EXTRN ?GPalette@@3UFPalette@@A:BYTE ; GPalette + Line 36: EXTRN ?translationtables@@3PAV?$TAutoGrowArray@VFRemapTablePtr@@PEAUFRemapTable@@@@A:BYTE ; translationtables + Line 37: EXTRN ?GrayMap@ImageHelpers@@3PAEA:BYTE ; ImageHelpers::GrayMap + Line 38: EXTRN ?ImageArena@FImageSource@@1VFMemArena@@A:BYTE ; FImageSource::ImageArena + Line 39: EXTRN ?NextID@FImageSource@@1HA:DWORD ; FImageSource::NextID + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\flatvertices.cod (11 hits) + Line 33: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 34: EXTRN __std_terminate:PROC + Line 35: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 36: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 37: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 38: EXTRN ?BuildVertices@@YA?AV?$TArray@UVertexContainer@@U1@@@AEAV?$TArray@Usector_t@@U1@@@@Z:PROC ; BuildVertices + Line 39: EXTRN __CxxFrameHandler3:PROC + Line 40: EXTRN memcpy:PROC + Line 41: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 42: EXTRN __ImageBase:BYTE + Line 43: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\fmopl.cod (12 hits) + Line 33: EXTRN _purecall:PROC + Line 34: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 35: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 36: EXTRN ??_EOPLEmul@@UEAAPEAXI@Z:PROC ; OPLEmul::`vector deleting destructor' + Line 37: EXTRN ??_EYM3812@@UEAAPEAXI@Z:PROC ; YM3812::`vector deleting destructor' + Line 38: EXTRN floor:PROC + Line 39: EXTRN log:PROC + Line 40: EXTRN memset:PROC + Line 41: EXTRN pow:PROC + Line 42: EXTRN sin:PROC + Line 43: EXTRN __ImageBase:BYTE + Line 44: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\fontchars.cod (16 hits) + Line 26: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 27: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 28: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 29: EXTRN ?OpenLumpReader@FWadCollection@@QEAA?AVFileReader@@H@Z:PROC ; FWadCollection::OpenLumpReader + Line 30: EXTRN ?GetLumpName@FWadCollection@@QEBAXPEADH@Z:PROC ; FWadCollection::GetLumpName + Line 31: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 32: EXTRN ?CreatePalettedPixels@FImageSource@@MEAA?AV?$TArray@EE@@H@Z:PROC ; FImageSource::CreatePalettedPixels + Line 33: EXTRN ?CopyPixels@FImageSource@@MEAAHPEAVFBitmap@@H@Z:PROC ; FImageSource::CopyPixels + Line 34: EXTRN ?GetPalettedPixels@FImageSource@@QEAA?AV?$TArray@EE@@H@Z:PROC ; FImageSource::GetPalettedPixels + Line 35: EXTRN ?CollectForPrecache@FImageSource@@UEAAXAEAV?$TMap@HU?$pair@HH@std@@U?$THashTraits@H@@U?$TValueTraits@U?$pair@HH@std@@@@@@_N@Z:PROC ; FImageSource::CollectForPrecache + Line 36: EXTRN ??_EFImageSource@@UEAAPEAXI@Z:PROC ; FImageSource::`vector deleting destructor' + Line 37: EXTRN ??_EFFontChar1@@UEAAPEAXI@Z:PROC ; FFontChar1::`vector deleting destructor' + Line 38: EXTRN ??_EFFontChar2@@UEAAPEAXI@Z:PROC ; FFontChar2::`vector deleting destructor' + Line 39: EXTRN __CxxFrameHandler3:PROC + Line 40: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 41: EXTRN ?NextID@FImageSource@@1HA:DWORD ; FImageSource::NextID + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\freq.cod (20 hits) + Line 475: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 476: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 477: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 478: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 479: EXTRN ?rdft@TimidityPlus@@YAXHHPEAMPEAH0@Z:PROC ; TimidityPlus::rdft + Line 480: EXTRN _CxxThrowException:PROC + Line 481: EXTRN __CxxFrameHandler3:PROC + Line 482: EXTRN __vdecl_pow2:PROC + Line 483: EXTRN ceil:PROC + Line 484: EXTRN ceilf:PROC + Line 485: EXTRN exp:PROC + Line 486: EXTRN log:PROC + Line 487: EXTRN logf:PROC + Line 488: EXTRN memmove:PROC + Line 489: EXTRN memset:PROC + Line 490: EXTRN pow:PROC + Line 491: EXTRN sqrt:PROC + Line 492: EXTRN sqrtf:PROC + Line 493: EXTRN __ImageBase:BYTE + Line 494: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\g_doomedmap.cod (31 hits) + Line 198: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 199: EXTRN atexit:PROC + Line 200: EXTRN __std_terminate:PROC + Line 201: EXTRN qsort:PROC + Line 202: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 203: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 204: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 205: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 206: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 207: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 208: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 209: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 210: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 211: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 212: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 213: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 214: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 215: EXTRN ?CheckString@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::CheckString + Line 216: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 217: EXTRN ?CheckNumber@FScanner@@QEAA_NXZ:PROC ; FScanner::CheckNumber + Line 218: EXTRN ?MustMatchString@FScanner@@QEAAHPEBQEBD_K@Z:PROC ; FScanner::MustMatchString + Line 219: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 220: EXTRN ?ScriptMessage@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptMessage + Line 221: EXTRN ?ParseOpenBrace@FMapInfoParser@@QEAAXXZ:PROC ; FMapInfoParser::ParseOpenBrace + Line 222: EXTRN ?P_FindLineSpecial@@YAHPEBDPEAH1@Z:PROC ; P_FindLineSpecial + Line 223: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 224: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 225: EXTRN __CxxFrameHandler3:PROC + Line 226: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 227: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 228: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\g_game.cod (289 hits) + Line 166: EXTRN ?SmallFont@@3PEAVFFont@@EA:QWORD ; SmallFont + Line 167: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 168: EXTRN ?IsAlias@FConsoleCommand@@UEAA_NXZ:PROC ; FConsoleCommand::IsAlias + Line 169: EXTRN ?Run@FUnsafeConsoleCommand@@UEAAXAEAVFCommandLine@@PEAVAActor@@H@Z:PROC ; FUnsafeConsoleCommand::Run + Line 170: EXTRN ??_EFUnsafeConsoleCommand@@UEAAPEAXI@Z:PROC ; FUnsafeConsoleCommand::`vector deleting destructor' + Line 171: EXTRN ?AllActorClasses@PClassActor@@2V?$TArray@PEAVPClassActor@@PEAV1@@@A:BYTE ; PClassActor::AllActorClasses + Line 172: EXTRN ?skyflatnum@@3VFTextureID@@A:DWORD ; skyflatnum + Line 173: EXTRN ?RegistrationInfo@DHUDMessageFadeOut@@2UClassReg@@A:BYTE ; DHUDMessageFadeOut::RegistrationInfo + Line 174: EXTRN ?StatusBar@@3PEAVDBaseStatusBar@@EA:QWORD ; StatusBar + Line 175: EXTRN ?AllClasses@PClass@@2V?$TArray@PEAVPClass@@PEAV1@@@A:BYTE ; PClass::AllClasses + Line 176: EXTRN ?automapactive@@3_NA:BYTE ; automapactive + Line 177: EXTRN ?Net_Arbitrator@@3HA:DWORD ; Net_Arbitrator + Line 178: EXTRN ?Skins@@3V?$TArray@VFPlayerSkin@@V1@@@A:BYTE ; Skins + Line 179: EXTRN ?validcount@@3HA:DWORD ; validcount + Line 180: EXTRN ?PlayerClasses@@3V?$TArray@VFPlayerClass@@V1@@@A:BYTE ; PlayerClasses + Line 181: EXTRN ?globalfreeze@@3EA:BYTE ; globalfreeze + Line 1016: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 1017: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 1018: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 1019: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 1020: EXTRN atexit:PROC + Line 1021: EXTRN __std_terminate:PROC + Line 1022: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 1023: EXTRN atoi:PROC + Line 1024: EXTRN fclose:PROC + Line 1025: EXTRN remove:PROC + Line 1026: EXTRN stricmp:PROC + Line 1027: EXTRN strnicmp:PROC + Line 1028: EXTRN compress2:PROC + Line 1029: EXTRN uncompress:PROC + Line 1030: EXTRN crc32:PROC + Line 1031: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 1032: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 1033: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 1034: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 1035: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 1036: EXTRN ??0FString@@QEAA@PEBD_K@Z:PROC ; FString::FString + Line 1037: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 1038: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 1039: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 1040: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 1041: EXTRN ??YFString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator+= + Line 1042: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 1043: EXTRN ?ReplaceChars@FString@@QEAAXDD@Z:PROC ; FString::ReplaceChars + Line 1044: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 1045: EXTRN ?AppendFormat@FString@@QEAAXPEBDZZ:PROC ; FString::AppendFormat + Line 1046: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 1047: EXTRN ?I_GetTime@@YAHXZ:PROC ; I_GetTime + Line 1048: EXTRN ?I_FreezeTime@@YAX_N@Z:PROC ; I_FreezeTime + Line 1049: EXTRN ?GetVersionString@@YAPEBDXZ:PROC ; GetVersionString + Line 1050: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 1051: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 1052: EXTRN mysnprintf:PROC + Line 1053: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 1054: EXTRN ?ForceSet@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@_N@Z:PROC ; FBaseCVar::ForceSet + Line 1055: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 1056: EXTRN ?C_GetMassCVarString@@YA?AVFString@@I_N@Z:PROC ; C_GetMassCVarString + Line 1057: EXTRN ?C_ReadCVars@@YAXPEAPEAE@Z:PROC ; C_ReadCVars + Line 1058: EXTRN ?C_BackupCVars@@YAXXZ:PROC ; C_BackupCVars + Line 1059: EXTRN ?C_WriteCVars@@YAXPEAPEAEI_N@Z:PROC ; C_WriteCVars + Line 1060: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 1061: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 1062: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 1063: EXTRN ??0FStringCVar@@QEAA@PEBD0IP6AXAEAV0@@Z@Z:PROC ; FStringCVar::FStringCVar + Line 1064: EXTRN ??1FStringCVar@@UEAA@XZ:PROC ; FStringCVar::~FStringCVar + Line 1065: EXTRN ?C_RestoreCVars@@YAXXZ:PROC ; C_RestoreCVars + Line 1066: EXTRN ?C_ForgetCVars@@YAXXZ:PROC ; C_ForgetCVars + Line 1067: EXTRN ?StartChunk@@YAXHPEAPEAE@Z:PROC ; StartChunk + Line 1068: EXTRN ?FinishChunk@@YAXPEAPEAE@Z:PROC ; FinishChunk + Line 1069: EXTRN ?UnpackUserCmd@@YAHPEAUusercmd_t@@PEBU1@PEAPEAE@Z:PROC ; UnpackUserCmd + Line 1070: EXTRN ?WriteUserCmdMessage@@YAHPEAUusercmd_t@@PEBU1@PEAPEAE@Z:PROC ; WriteUserCmdMessage + Line 1071: EXTRN ?RunNetSpecs@@YAXHH@Z:PROC ; RunNetSpecs + Line 1072: EXTRN ?ReadByte@@YAHPEAPEAE@Z:PROC ; ReadByte + Line 1073: EXTRN ?ReadWord@@YAHPEAPEAE@Z:PROC ; ReadWord + Line 1074: EXTRN ?ReadLong@@YAHPEAPEAE@Z:PROC ; ReadLong + Line 1075: EXTRN ?WriteByte@@YAXEPEAPEAE@Z:PROC ; WriteByte + Line 1076: EXTRN ?WriteWord@@YAXFPEAPEAE@Z:PROC ; WriteWord + Line 1077: EXTRN ?WriteLong@@YAXHPEAPEAE@Z:PROC ; WriteLong + Line 1078: EXTRN ?D_SetupUserInfo@@YAXXZ:PROC ; D_SetupUserInfo + Line 1079: EXTRN ?D_WriteUserInfoStrings@@YAXHPEAPEAE_N@Z:PROC ; D_WriteUserInfoStrings + Line 1080: EXTRN ?D_ReadUserInfoStrings@@YAXHPEAPEAE_N@Z:PROC ; D_ReadUserInfoStrings + Line 1081: EXTRN ?I_BaseTiccmd@@YAPEAUticcmd_t@@XZ:PROC ; I_BaseTiccmd + Line 1082: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 1083: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 1084: EXTRN c_sqrt:PROC + Line 1085: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 1086: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 1087: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 1088: EXTRN ?FindFunction@PClass@@SAXPEAPEAVVMFunction@@VFName@@1@Z:PROC ; PClass::FindFunction + Line 1089: EXTRN ??4FRemapTable@@QEAAAEAU0@AEBU0@@Z:PROC ; FRemapTable::operator= + Line 1090: EXTRN ?UpdateNative@FRemapTable@@QEAAXXZ:PROC ; FRemapTable::UpdateNative + Line 1091: EXTRN ?TranslationToTable@@YAPEAUFRemapTable@@H@Z:PROC ; TranslationToTable + Line 1092: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 1093: EXTRN ?S_Sound@@YAXHVFSoundID@@MM@Z:PROC ; S_Sound + Line 1094: EXTRN ?S_UpdateSounds@@YAXPEAVAActor@@@Z:PROC ; S_UpdateSounds + Line 1095: EXTRN ?F_Responder@@YA_NPEAUevent_t@@@Z:PROC ; F_Responder + Line 1096: EXTRN ?F_Ticker@@YAXXZ:PROC ; F_Ticker + Line 1097: EXTRN ?F_StartIntermission@@YAXVFName@@E@Z:PROC ; F_StartIntermission + Line 1098: EXTRN ?F_EndFinale@@YAXXZ:PROC ; F_EndFinale + Line 1099: EXTRN ?CheckParm@FArgs@@QEBAHPEBDH@Z:PROC ; FArgs::CheckParm + Line 1100: EXTRN ?CheckValue@FArgs@@QEBAPEBDPEBD@Z:PROC ; FArgs::CheckValue + Line 1101: EXTRN ?M_ScreenShot@@YAXPEBD@Z:PROC ; M_ScreenShot + Line 1102: EXTRN ?M_ZLibError@@YA?AVFString@@H@Z:PROC ; M_ZLibError + Line 1103: EXTRN ?M_GetSavegamesPath@@YA?AVFString@@XZ:PROC ; M_GetSavegamesPath + Line 1104: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 1105: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 1106: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 1107: EXTRN ?StaticClearRandom@FRandom@@SAXXZ:PROC ; FRandom::StaticClearRandom + Line 1108: EXTRN ?StaticSumSeeds@FRandom@@SAIXZ:PROC ; FRandom::StaticSumSeeds + Line 1109: EXTRN ?StaticReadRNGState@FRandom@@SAXAEAVFSerializer@@@Z:PROC ; FRandom::StaticReadRNGState + Line 1110: EXTRN ?StaticWriteRNGState@FRandom@@SAXAEAVFSerializer@@@Z:PROC ; FRandom::StaticWriteRNGState + Line 1111: EXTRN ?OpenFile@FileReader@@QEAA_NPEBD_J1@Z:PROC ; FileReader::OpenFile + Line 1112: EXTRN ?Open@FileWriter@@SAPEAV1@PEBD@Z:PROC ; FileWriter::Open + Line 1113: EXTRN ?Write@FileWriter@@UEAA_KPEBX_K@Z:PROC ; FileWriter::Write + Line 1114: EXTRN ?Tell@FileWriter@@UEAAJXZ:PROC ; FileWriter::Tell + Line 1115: EXTRN ?Seek@FileWriter@@UEAAJJH@Z:PROC ; FileWriter::Seek + Line 1116: EXTRN ??_EFileWriter@@UEAAPEAXI@Z:PROC ; FileWriter::`vector deleting destructor' + Line 1117: EXTRN ?Write@BufferWriter@@UEAA_KPEBX_K@Z:PROC ; BufferWriter::Write + Line 1118: EXTRN ??_EBufferWriter@@UEAAPEAXI@Z:PROC ; BufferWriter::`vector deleting destructor' + Line 1119: EXTRN ?CacheLump@FResourceLump@@QEAAPEAXXZ:PROC ; FResourceLump::CacheLump + Line 1120: EXTRN ?OpenResourceFile@FResourceFile@@SAPEAV1@PEBD_N1@Z:PROC ; FResourceFile::OpenResourceFile + Line 1121: EXTRN ?FindLump@FResourceFile@@QEAAPEAUFResourceLump@@PEBD@Z:PROC ; FResourceFile::FindLump + Line 1122: EXTRN ?G_InitNew@@YAXPEBD_N@Z:PROC ; G_InitNew + Line 1123: EXTRN ?G_ReadSnapshots@@YAXPEAVFResourceFile@@@Z:PROC ; G_ReadSnapshots + Line 1124: EXTRN ?G_WriteSnapshots@@YAXAEAV?$TArray@VFString@@V1@@@AEAV?$TArray@UFCompressedBuffer@@U1@@@@Z:PROC ; G_WriteSnapshots + Line 1125: EXTRN ?G_WriteVisited@@YAXAEAVFSerializer@@@Z:PROC ; G_WriteVisited + Line 1126: EXTRN ?G_ReadVisited@@YAXAEAVFSerializer@@@Z:PROC ; G_ReadVisited + Line 1127: EXTRN ?G_SkillProperty@@YAHW4ESkillProperty@@@Z:PROC ; G_SkillProperty + Line 1128: EXTRN ?FindInventory@AActor@@QEAAPEAV1@VFName@@_N@Z:PROC ; AActor::FindInventory + Line 1129: EXTRN ?IsTeammate@AActor@@QEAA_NPEAV1@@Z:PROC ; AActor::IsTeammate + Line 1130: EXTRN ?GetTag@AActor@@QEBAPEBDPEBD@Z:PROC ; AActor::GetTag + Line 1131: EXTRN ?Clear@FWeaponSlots@@QEAAXXZ:PROC ; FWeaponSlots::Clear + Line 1132: EXTRN ?P_SetupWeapons_ntohton@@YAXXZ:PROC ; P_SetupWeapons_ntohton + Line 1133: EXTRN ?P_WriteDemoWeaponsChunk@@YAXPEAPEAE@Z:PROC ; P_WriteDemoWeaponsChunk + Line 1134: EXTRN ?P_ReadDemoWeaponsChunk@@YAXPEAPEAE@Z:PROC ; P_ReadDemoWeaponsChunk + Line 1135: EXTRN ?Main@FCajunMaster@@QEAAXPEAUFLevelLocals@@@Z:PROC ; FCajunMaster::Main + Line 1136: EXTRN ?RemoveAllBots@FCajunMaster@@QEAAXPEAUFLevelLocals@@_N@Z:PROC ; FCajunMaster::RemoveAllBots + Line 1137: EXTRN ?Clear@DBot@@QEAAXXZ:PROC ; DBot::Clear + Line 1138: EXTRN ??1userinfo_t@@QEAA@XZ:PROC ; userinfo_t::~userinfo_t + Line 1139: EXTRN ??1player_t@@QEAA@XZ:PROC ; player_t::~player_t + Line 1140: EXTRN ?DestroyPSprites@player_t@@QEAAXXZ:PROC ; player_t::DestroyPSprites + Line 1141: EXTRN ?NotifyNewSave@FSavegameManager@@QEAAXAEBVFString@@0_N@Z:PROC ; FSavegameManager::NotifyNewSave + Line 1142: EXTRN ?M_StartControlPanel@@YAX_N@Z:PROC ; M_StartControlPanel + Line 1143: EXTRN ?M_SetMenu@@YAXVFName@@H@Z:PROC ; M_SetMenu + Line 1144: EXTRN ?P_ReadACSDefereds@@YAXAEAVFSerializer@@@Z:PROC ; P_ReadACSDefereds + Line 1145: EXTRN ?P_WriteACSDefereds@@YAXAEAVFSerializer@@@Z:PROC ; P_WriteACSDefereds + Line 1146: EXTRN ?P_Ticker@@YAXXZ:PROC ; P_Ticker + Line 1147: EXTRN ?D_PageTicker@@YAXXZ:PROC ; D_PageTicker + Line 1148: EXTRN ?D_AdvanceDemo@@YAXXZ:PROC ; D_AdvanceDemo + Line 1149: EXTRN ?WI_Ticker@@YAXXZ:PROC ; WI_Ticker + Line 1150: EXTRN ?CT_Responder@@YA_NPEAUevent_t@@@Z:PROC ; CT_Responder + Line 1151: EXTRN ?ST_Responder@@YA_NPEAUevent_t@@@Z:PROC ; ST_Responder + Line 1152: EXTRN ?AM_ToggleMap@@YAXXZ:PROC ; AM_ToggleMap + Line 1153: EXTRN ?C_FullConsole@@YAXXZ:PROC ; C_FullConsole + Line 1154: EXTRN ?C_HideConsole@@YAXXZ:PROC ; C_HideConsole + Line 1155: EXTRN ?C_AdjustBottom@@YAXXZ:PROC ; C_AdjustBottom + Line 1156: EXTRN ?C_DoKey@@YA_NPEAUevent_t@@PEAVFKeyBindings@@1@Z:PROC ; C_DoKey + Line 1157: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 1158: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 1159: EXTRN ?AddCommandString@@YAXPEBDH@Z:PROC ; AddCommandString + Line 1160: EXTRN ?C_RunDelayedCommands@@YAXXZ:PROC ; C_RunDelayedCommands + Line 1161: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 1162: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 1163: EXTRN ?CheckIfWadLoaded@FWadCollection@@QEAAHPEBD@Z:PROC ; FWadCollection::CheckIfWadLoaded + Line 1164: EXTRN ?GetWadName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetWadName + Line 1165: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 1166: EXTRN ?ReadLump@FWadCollection@@QEAAXHPEAX@Z:PROC ; FWadCollection::ReadLump + Line 1167: EXTRN ?LumpLength@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::LumpLength + Line 1168: EXTRN ?GetLumpFile@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpFile + Line 1169: EXTRN ?P_CheckPosition@@YA_NPEAVAActor@@AEBU?$TVector2@N@@_N@Z:PROC ; P_CheckPosition + Line 1170: EXTRN ?P_PlayerStartStomp@@YAXPEAVAActor@@_N@Z:PROC ; P_PlayerStartStomp + Line 1171: EXTRN ??RFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator() + Line 1172: EXTRN ??0DHUDMessageFadeOut@@QEAA@PEAVFFont@@PEBDMMHHW4EColorRange@@MM@Z:PROC ; DHUDMessageFadeOut::DHUDMessageFadeOut + Line 1173: EXTRN ?AttachMessage@DBaseStatusBar@@QEAAXPEAVDHUDMessageBase@@IH@Z:PROC ; DBaseStatusBar::AttachMessage + Line 1174: EXTRN ?ShowPlayerName@DBaseStatusBar@@QEAAXXZ:PROC ; DBaseStatusBar::ShowPlayerName + Line 1175: EXTRN ?AttachToPlayer@DBaseStatusBar@@QEAAXPEAVplayer_t@@@Z:PROC ; DBaseStatusBar::AttachToPlayer + Line 1176: EXTRN ?M_CreateDummyPNG@@YA_NPEAVFileWriter@@@Z:PROC ; M_CreateDummyPNG + Line 1177: EXTRN ?M_AppendPNGText@@YA_NPEAVFileWriter@@PEBD1@Z:PROC ; M_AppendPNGText + Line 1178: EXTRN ?M_FinishPNG@@YA_NPEAVFileWriter@@@Z:PROC ; M_FinishPNG + Line 1179: EXTRN ?FileExists@@YA_NPEBD@Z:PROC ; FileExists + Line 1180: EXTRN ?DefaultExtension@@YAXAEAVFString@@PEBD@Z:PROC ; DefaultExtension + Line 1181: EXTRN ?myasctime@@YAPEBDXZ:PROC ; myasctime + Line 1182: EXTRN ?CreatePath@@YAXPEBD@Z:PROC ; CreatePath + Line 1183: EXTRN ?NicePath@@YA?AVFString@@PEBD@Z:PROC ; NicePath + Line 1184: EXTRN ?SetData@FDynamicBuffer@@QEAAXPEBEH@Z:PROC ; FDynamicBuffer::SetData + Line 1185: EXTRN ?GetData@FDynamicBuffer@@QEAAPEAEPEAH@Z:PROC ; FDynamicBuffer::GetData + Line 1186: EXTRN ?Net_WriteByte@@YAXE@Z:PROC ; Net_WriteByte + Line 1187: EXTRN ?Net_WriteLong@@YAXH@Z:PROC ; Net_WriteLong + Line 1188: EXTRN ?Net_WriteString@@YAXPEBD@Z:PROC ; Net_WriteString + Line 1189: EXTRN ?Net_DoCommand@@YAXHPEAPEAEH@Z:PROC ; Net_DoCommand + Line 1190: EXTRN ?D_Render@@YAXV?$function@$$A6AXXZ@std@@_N@Z:PROC ; D_Render + Line 1191: EXTRN ?P_ReadACSVars@@YAXAEAVFSerializer@@@Z:PROC ; P_ReadACSVars + Line 1192: EXTRN ?P_WriteACSVars@@YAXAEAVFSerializer@@@Z:PROC ; P_WriteACSVars + Line 1193: EXTRN ?StartTypedScripts@FBehaviorContainer@@QEAAXGPEAVAActor@@_NH1@Z:PROC ; FBehaviorContainer::StartTypedScripts + Line 1194: EXTRN ?StopMyScripts@FBehaviorContainer@@QEAAXPEAVAActor@@@Z:PROC ; FBehaviorContainer::StopMyScripts + Line 1195: EXTRN ?P_DisconnectEffect@@YAXPEAVAActor@@@Z:PROC ; P_DisconnectEffect + Line 1196: EXTRN ?I_GetAxes@@YAXQEAM@Z:PROC ; I_GetAxes + Line 1197: EXTRN ?OpenWriter@FSerializer@@QEAA_N_N@Z:PROC ; FSerializer::OpenWriter + Line 1198: EXTRN ?OpenReader@FSerializer@@QEAA_NPEBD_K@Z:PROC ; FSerializer::OpenReader + Line 1199: EXTRN ?Close@FSerializer@@QEAAXXZ:PROC ; FSerializer::Close + Line 1200: EXTRN ?GetCompressedOutput@FSerializer@@QEAA?AUFCompressedBuffer@@XZ:PROC ; FSerializer::GetCompressedOutput + Line 1201: EXTRN ?AddString@FSerializer@@QEAAAEAV1@PEBD0@Z:PROC ; FSerializer::AddString + Line 1202: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 1203: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAIPEAI@Z:PROC ; Serialize + Line 1204: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAEPEAE@Z:PROC ; Serialize + Line 1205: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAVFString@@PEAV2@@Z:PROC ; Serialize + Line 1206: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 1207: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 1208: EXTRN ?GetVirtualIndex@@YAIPEAVPClass@@PEBD@Z:PROC ; GetVirtualIndex + Line 1209: EXTRN ?SnapshotLevel@FLevelLocals@@QEAAXXZ:PROC ; FLevelLocals::SnapshotLevel + Line 1210: EXTRN ?SpawnPlayer@FLevelLocals@@QEAAPEAVAActor@@PEAUFPlayerStart@@HH@Z:PROC ; FLevelLocals::SpawnPlayer + Line 1211: EXTRN ?PointInSubsector@FLevelLocals@@AEAAPEAUsubsector_t@@NN@Z:PROC ; FLevelLocals::PointInSubsector + Line 1212: EXTRN ?IsFreelookAllowed@FLevelLocals@@QEBA_NXZ:PROC ; FLevelLocals::IsFreelookAllowed + Line 1213: EXTRN ?G_SerializeHub@@YAXAEAVFSerializer@@@Z:PROC ; G_SerializeHub + Line 1214: EXTRN ?E_UiTick@@YAXXZ:PROC ; E_UiTick + Line 1215: EXTRN ?E_PostUiTick@@YAXXZ:PROC ; E_PostUiTick + Line 1216: EXTRN ?E_PlayerDisconnected@@YAXH@Z:PROC ; E_PlayerDisconnected + Line 1217: EXTRN ?G_DoNewGame@@YAXXZ:PROC ; G_DoNewGame + Line 1218: EXTRN ?G_DoCompleted@@YAXXZ:PROC ; G_DoCompleted + Line 1219: EXTRN ?G_DoWorldDone@@YAXXZ:PROC ; G_DoWorldDone + Line 1220: EXTRN ?STAT_Serialize@@YAXAEAVFSerializer@@@Z:PROC ; STAT_Serialize + Line 1221: EXTRN ?WriteZip@@YA_NPEBDAEAV?$TArray@VFString@@V1@@@AEAV?$TArray@UFCompressedBuffer@@U1@@@@Z:PROC ; WriteZip + Line 1222: EXTRN _CxxThrowException:PROC + Line 1223: EXTRN __CxxFrameHandler3:PROC + Line 1224: EXTRN ceil:PROC + Line 1225: EXTRN floor:PROC + Line 1226: EXTRN memcpy:PROC + Line 1227: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 1228: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 1229: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 1230: EXTRN ?NextSkill@@3HA:DWORD ; NextSkill + Line 1231: EXTRN ?SaveVersion@@3HA:DWORD ; SaveVersion + Line 1232: EXTRN ?mouse_sensitivity@@3VFFloatCVar@@A:BYTE ; mouse_sensitivity + Line 1233: EXTRN ?singletics@@3_NA:BYTE ; singletics + Line 1234: EXTRN ?ToggleFullscreen@@3_NA:BYTE ; ToggleFullscreen + Line 1235: EXTRN ?dmflags@@3VFIntCVar@@A:BYTE ; dmflags + Line 1236: EXTRN ?dmflags2@@3VFIntCVar@@A:BYTE ; dmflags2 + Line 1237: EXTRN ?AllocBytes@GC@@3_KA:QWORD ; GC::AllocBytes + Line 1238: EXTRN ?Threshold@GC@@3_KA:QWORD ; GC::Threshold + Line 1239: EXTRN ?translationtables@@3PAV?$TAutoGrowArray@VFRemapTablePtr@@PEAUFRemapTable@@@@A:BYTE ; translationtables + Line 1240: EXTRN ?Args@@3PEAVFArgs@@EA:QWORD ; Args + Line 1241: EXTRN ?rngseed@@3IA:DWORD ; rngseed + Line 1242: EXTRN ?savegamerestore@@3_NA:BYTE ; savegamerestore + Line 1243: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 1244: EXTRN ?savegameManager@@3UFSavegameManager@@A:BYTE ; savegameManager + Line 1245: EXTRN ?Bindings@@3VFKeyBindings@@A:BYTE ; Bindings + Line 1246: EXTRN ?DoubleBindings@@3VFKeyBindings@@A:BYTE ; DoubleBindings + Line 1247: EXTRN ?Button_Mlook@@3UFButtonStatus@@A:BYTE ; Button_Mlook + Line 1248: EXTRN ?Button_Klook@@3UFButtonStatus@@A:BYTE ; Button_Klook + Line 1249: EXTRN ?Button_Use@@3UFButtonStatus@@A:BYTE ; Button_Use + Line 1250: EXTRN ?Button_AltAttack@@3UFButtonStatus@@A:BYTE ; Button_AltAttack + Line 1251: EXTRN ?Button_Attack@@3UFButtonStatus@@A:BYTE ; Button_Attack + Line 1252: EXTRN ?Button_Speed@@3UFButtonStatus@@A:BYTE ; Button_Speed + Line 1253: EXTRN ?Button_MoveRight@@3UFButtonStatus@@A:BYTE ; Button_MoveRight + Line 1254: EXTRN ?Button_MoveLeft@@3UFButtonStatus@@A:BYTE ; Button_MoveLeft + Line 1255: EXTRN ?Button_Strafe@@3UFButtonStatus@@A:BYTE ; Button_Strafe + Line 1256: EXTRN ?Button_LookDown@@3UFButtonStatus@@A:BYTE ; Button_LookDown + Line 1257: EXTRN ?Button_LookUp@@3UFButtonStatus@@A:BYTE ; Button_LookUp + Line 1258: EXTRN ?Button_Back@@3UFButtonStatus@@A:BYTE ; Button_Back + Line 1259: EXTRN ?Button_Forward@@3UFButtonStatus@@A:BYTE ; Button_Forward + Line 1260: EXTRN ?Button_Right@@3UFButtonStatus@@A:BYTE ; Button_Right + Line 1261: EXTRN ?Button_Left@@3UFButtonStatus@@A:BYTE ; Button_Left + Line 1262: EXTRN ?Button_MoveDown@@3UFButtonStatus@@A:BYTE ; Button_MoveDown + Line 1263: EXTRN ?Button_MoveUp@@3UFButtonStatus@@A:BYTE ; Button_MoveUp + Line 1264: EXTRN ?Button_Jump@@3UFButtonStatus@@A:BYTE ; Button_Jump + Line 1265: EXTRN ?Button_ShowScores@@3UFButtonStatus@@A:BYTE ; Button_ShowScores + Line 1266: EXTRN ?Button_Crouch@@3UFButtonStatus@@A:BYTE ; Button_Crouch + Line 1267: EXTRN ?Button_Zoom@@3UFButtonStatus@@A:BYTE ; Button_Zoom + Line 1268: EXTRN ?Button_Reload@@3UFButtonStatus@@A:BYTE ; Button_Reload + Line 1269: EXTRN ?Button_User1@@3UFButtonStatus@@A:BYTE ; Button_User1 + Line 1270: EXTRN ?Button_User2@@3UFButtonStatus@@A:BYTE ; Button_User2 + Line 1271: EXTRN ?Button_User3@@3UFButtonStatus@@A:BYTE ; Button_User3 + Line 1272: EXTRN ?Button_User4@@3UFButtonStatus@@A:BYTE ; Button_User4 + Line 1273: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 1274: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 1275: EXTRN ?NetSpecs@@3PAY0CE@VFDynamicBuffer@@A:BYTE ; NetSpecs + Line 1276: EXTRN ?maketic@@3HA:DWORD ; maketic + Line 1277: EXTRN ?netcmds@@3PAY0CE@Uticcmd_t@@A:BYTE ; netcmds + Line 1278: EXTRN ?ticdup@@3HA:DWORD ; ticdup + Line 1279: EXTRN ?LocalViewAngle@@3IA:DWORD ; LocalViewAngle + Line 1280: EXTRN ?LocalViewPitch@@3HA:DWORD ; LocalViewPitch + Line 1281: EXTRN ?LocalKeyboardTurner@@3_NA:BYTE ; LocalKeyboardTurner + Line 1282: EXTRN ?level@@3UFLevelLocals@@A:BYTE ; level + Line 1283: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 1284: EXTRN ?sv_singleplayerrespawn@@3VFBoolCVar@@A:BYTE ; sv_singleplayerrespawn + Line 1285: EXTRN ?lenspot@@3PEAEEA:QWORD ; lenspot + Line 1286: EXTRN ?starttime@@3HA:DWORD ; starttime + Line 1287: EXTRN __ImageBase:BYTE + Line 1288: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\g_hub.cod (18 hits) + Line 31: EXTRN atexit:PROC + Line 32: EXTRN __std_terminate:PROC + Line 33: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 34: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 35: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 36: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 37: EXTRN ??RFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator() + Line 38: EXTRN ?ArraySize@FSerializer@@QEAAIXZ:PROC ; FSerializer::ArraySize + Line 39: EXTRN ?BeginObject@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginObject + Line 40: EXTRN ?EndObject@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndObject + Line 41: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 42: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 43: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 44: EXTRN __CxxFrameHandler3:PROC + Line 45: EXTRN ?multiplayer@@3_NA:BYTE ; multiplayer + Line 46: EXTRN ?deathmatch@@3VFIntCVar@@A:BYTE ; deathmatch + Line 47: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 48: EXTRN ?save_full@@3_NA:BYTE ; save_full + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\g_level.cod (254 hits) + Line 67: EXTRN ?IsAlias@FConsoleCommand@@UEAA_NXZ:PROC ; FConsoleCommand::IsAlias + Line 68: EXTRN ?Run@FUnsafeConsoleCommand@@UEAAXAEAVFCommandLine@@PEAVAActor@@H@Z:PROC ; FUnsafeConsoleCommand::Run + Line 69: EXTRN ??_EFUnsafeConsoleCommand@@UEAAPEAXI@Z:PROC ; FUnsafeConsoleCommand::`vector deleting destructor' + Line 70: EXTRN ?gameaction@@3W4gameaction_t@@A:DWORD ; gameaction + Line 71: EXTRN ?netgame@@3_NA:BYTE ; netgame + Line 72: EXTRN ?multiplayernext@@3_NA:BYTE ; multiplayernext + Line 73: EXTRN ?deathmatch@@3VFIntCVar@@A:BYTE ; deathmatch + Line 74: EXTRN ?newdemoname@@3VFString@@A:QWORD ; newdemoname + Line 75: EXTRN ?newdemomap@@3VFString@@A:QWORD ; newdemomap + Line 76: EXTRN ?RegistrationInfo@DThinker@@2UClassReg@@A:BYTE ; DThinker::RegistrationInfo + Line 77: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 78: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 79: EXTRN ?RegistrationInfo@DObject@@2UClassReg@@A:BYTE ; DObject::RegistrationInfo + Line 468: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 469: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 470: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 471: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 472: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 473: EXTRN atexit:PROC + Line 474: EXTRN __std_terminate:PROC + Line 475: EXTRN strtoll:PROC + Line 476: EXTRN strtoull:PROC + Line 477: EXTRN strstr:PROC + Line 478: EXTRN strncmp:PROC + Line 479: EXTRN stricmp:PROC + Line 480: EXTRN strnicmp:PROC + Line 481: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 482: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 483: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 484: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 485: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_K_N@Z:PROC ; FName::NameManager::FindName + Line 486: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 487: EXTRN ??0FString@@QEAA@PEBD_K@Z:PROC ; FString::FString + Line 488: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 489: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 490: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 491: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 492: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 493: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 494: EXTRN ?ToLower@FString@@QEAAXXZ:PROC ; FString::ToLower + Line 495: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 496: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 497: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 498: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAUacsdefered_t@@PEAU2@@Z:PROC ; Serialize + Line 499: EXTRN ?isValid@level_info_t@@QEAA_NXZ:PROC ; level_info_t::isValid + Line 500: EXTRN ?LookupLevelName@level_info_t@@QEAA?AVFString@@XZ:PROC ; level_info_t::LookupLevelName + Line 501: EXTRN ?CheckLevelRedirect@level_info_t@@QEAAPEAU1@XZ:PROC ; level_info_t::CheckLevelRedirect + Line 502: EXTRN ?CheckWarpTransMap@@YA_NAEAVFString@@_N@Z:PROC ; CheckWarpTransMap + Line 503: EXTRN ?FindClusterInfo@@YAPEAUcluster_info_t@@H@Z:PROC ; FindClusterInfo + Line 504: EXTRN ?FindLevelInfo@@YAPEAUlevel_info_t@@PEBD_N@Z:PROC ; FindLevelInfo + Line 505: EXTRN ?G_ClearSnapshots@@YAXXZ:PROC ; G_ClearSnapshots + Line 506: EXTRN ?P_RemoveDefereds@@YAXXZ:PROC ; P_RemoveDefereds + Line 507: EXTRN ?G_ClearHubInfo@@YAXXZ:PROC ; G_ClearHubInfo + Line 508: EXTRN ?G_SkillProperty@@YAHW4ESkillProperty@@@Z:PROC ; G_SkillProperty + Line 509: EXTRN ?Mark@GC@@YAXPEAPEAVDObject@@@Z:PROC ; GC::Mark + Line 510: EXTRN ?G_PlayerFinishLevel@@YAXHW4EFinishLevelType@@H@Z:PROC ; G_PlayerFinishLevel + Line 511: EXTRN ?S_ChangeMusic@@YA_NPEBDH_N1@Z:PROC ; S_ChangeMusic + Line 512: EXTRN ?S_ResumeSound@@YAX_N@Z:PROC ; S_ResumeSound + Line 513: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 514: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 515: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 516: EXTRN ?StaticClearRandom@FRandom@@SAXXZ:PROC ; FRandom::StaticClearRandom + Line 517: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 518: EXTRN ?ForceSet@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@_N@Z:PROC ; FBaseCVar::ForceSet + Line 519: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 520: EXTRN ?UnlatchCVars@@YAXXZ:PROC ; UnlatchCVars + Line 521: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 522: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 523: EXTRN ?C_RestoreCVars@@YAXXZ:PROC ; C_RestoreCVars + Line 524: EXTRN ?WI_Start@@YAXPEAUwbstartstruct_t@@@Z:PROC ; WI_Start + Line 525: EXTRN ?GetWadName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetWadName + Line 526: EXTRN ?GetLumpFile@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpFile + Line 527: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 528: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 529: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 530: EXTRN ??1DObject@@UEAA@XZ:PROC ; DObject::~DObject + Line 531: EXTRN ?Serialize@DObject@@UEAAXAEAVFSerializer@@@Z:PROC ; DObject::Serialize + Line 532: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 533: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 534: EXTRN ?StaticPointerSubstitution@DObject@@SAXPEAVAActor@@0@Z:PROC ; DObject::StaticPointerSubstitution + Line 535: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 536: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 537: EXTRN ?AM_Stop@@YAXXZ:PROC ; AM_Stop + Line 538: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 539: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 540: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 541: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 542: EXTRN ?ResetButtonStates@@YAXXZ:PROC ; ResetButtonStates + Line 543: EXTRN ?P_OpenMapData@@YAPEAUMapData@@PEBD_N@Z:PROC ; P_OpenMapData + Line 544: EXTRN ?P_CheckMapData@@YA_NPEBD@Z:PROC ; P_CheckMapData + Line 545: EXTRN ?P_SetupLevel@@YAXPEAUFLevelLocals@@H_N@Z:PROC ; P_SetupLevel + Line 546: EXTRN ?P_PlayerStartStomp@@YAXPEAVAActor@@_N@Z:PROC ; P_PlayerStartStomp + Line 547: EXTRN ?P_ResetSightCounters@@YAX_N@Z:PROC ; P_ResetSightCounters + Line 548: EXTRN ?P_FindFloorCeiling@@YAXPEAVAActor@@H@Z:PROC ; P_FindFloorCeiling + Line 549: EXTRN ?CheckForTexture@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::CheckForTexture + Line 550: EXTRN ?GetTextureID@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::GetTextureID + Line 551: EXTRN ?InitSkyMap@@YAXPEAUFLevelLocals@@@Z:PROC ; InitSkyMap + Line 552: EXTRN ?C_HideConsole@@YAXXZ:PROC ; C_HideConsole + Line 553: EXTRN ?C_FlushDisplay@@YAXXZ:PROC ; C_FlushDisplay + Line 554: EXTRN ?F_StartIntermission@@YAXVFName@@E@Z:PROC ; F_StartIntermission + Line 555: EXTRN ?F_StartFinale@@YAXPEBDHHI00HHH_NVFName@@@Z:PROC ; F_StartFinale + Line 556: EXTRN ?DestroyThinkers@FThinkerList@@QEAAXXZ:PROC ; FThinkerList::DestroyThinkers + Line 557: EXTRN ?MarkRoots@FThinkerCollection@@QEAAXXZ:PROC ; FThinkerCollection::MarkRoots + Line 558: EXTRN ?Link@FThinkerCollection@@QEAAXPEAVDThinker@@H@Z:PROC ; FThinkerCollection::Link + Line 559: EXTRN ?StaticType@DThinker@@UEBAPEAVPClass@@XZ:PROC ; DThinker::StaticType + Line 560: EXTRN ?OnDestroy@DThinker@@UEAAXXZ:PROC ; DThinker::OnDestroy + Line 561: EXTRN ??1DThinker@@UEAA@XZ:PROC ; DThinker::~DThinker + Line 562: EXTRN ?Tick@DThinker@@UEAAXXZ:PROC ; DThinker::Tick + Line 563: EXTRN ?PostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::PostBeginPlay + Line 564: EXTRN ?CallPostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::CallPostBeginPlay + Line 565: EXTRN ?PostSerialize@DThinker@@UEAAXXZ:PROC ; DThinker::PostSerialize + Line 566: EXTRN ?Serialize@DThinker@@UEAAXAEAVFSerializer@@@Z:PROC ; DThinker::Serialize + Line 567: EXTRN ?PropagateMark@DThinker@@UEAA_KXZ:PROC ; DThinker::PropagateMark + Line 568: EXTRN ?ChangeStatNum@DThinker@@QEAAXH@Z:PROC ; DThinker::ChangeStatNum + Line 569: EXTRN ??_EDThinker@@UEAAPEAXI@Z:PROC ; DThinker::`vector deleting destructor' + Line 570: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 571: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 572: EXTRN ?P_ClearACSVars@@YAX_N@Z:PROC ; P_ClearACSVars + Line 573: EXTRN ?LockLevelVarStrings@FBehaviorContainer@@QEAAXH@Z:PROC ; FBehaviorContainer::LockLevelVarStrings + Line 574: EXTRN ?UnlockLevelVarStrings@FBehaviorContainer@@QEAAXH@Z:PROC ; FBehaviorContainer::UnlockLevelVarStrings + Line 575: EXTRN ?StartTypedScripts@FBehaviorContainer@@QEAAXGPEAVAActor@@_NH1@Z:PROC ; FBehaviorContainer::StartTypedScripts + Line 576: EXTRN ?FindInventory@AActor@@QEAAPEAV1@VFName@@_N@Z:PROC ; AActor::FindInventory + Line 577: EXTRN ?AddToHash@AActor@@QEAAXXZ:PROC ; AActor::AddToHash + Line 578: EXTRN ?RemoveFromHash@AActor@@QEAAXXZ:PROC ; AActor::RemoveFromHash + Line 579: EXTRN ?LinkToWorld@AActor@@QEAAXPEAUFLinkContext@@_NPEAUsector_t@@@Z:PROC ; AActor::LinkToWorld + Line 580: EXTRN ?UnlinkFromWorld@AActor@@QEAAXPEAUFLinkContext@@@Z:PROC ; AActor::UnlinkFromWorld + Line 581: EXTRN ?SetState@AActor@@QEAA_NPEAUFState@@_N@Z:PROC ; AActor::SetState + Line 582: EXTRN ?DeleteAttachedLights@AActor@@QEAAXXZ:PROC ; AActor::DeleteAttachedLights + Line 583: EXTRN ?Clear@FWeaponSlots@@QEAAXXZ:PROC ; FWeaponSlots::Clear + Line 584: EXTRN ??1FCajunMaster@@QEAA@XZ:PROC ; FCajunMaster::~FCajunMaster + Line 585: EXTRN ?Init@FCajunMaster@@QEAAXXZ:PROC ; FCajunMaster::Init + Line 586: EXTRN ?End@FCajunMaster@@QEAAXXZ:PROC ; FCajunMaster::End + Line 587: EXTRN ?RemoveAllBots@FCajunMaster@@QEAAXPEAUFLevelLocals@@_N@Z:PROC ; FCajunMaster::RemoveAllBots + Line 588: EXTRN ?StartTravel@FCajunMaster@@QEAAXXZ:PROC ; FCajunMaster::StartTravel + Line 589: EXTRN ?FinishTravel@FCajunMaster@@QEAAXXZ:PROC ; FCajunMaster::FinishTravel + Line 590: EXTRN ?DetachAllMessages@DBaseStatusBar@@QEAAXXZ:PROC ; DBaseStatusBar::DetachAllMessages + Line 591: EXTRN ?AttachToPlayer@DBaseStatusBar@@QEAAXPEAVplayer_t@@@Z:PROC ; DBaseStatusBar::AttachToPlayer + Line 592: EXTRN ?ST_CreateStatusBar@@YAX_N@Z:PROC ; ST_CreateStatusBar + Line 593: EXTRN ?Net_WriteByte@@YAXE@Z:PROC ; Net_WriteByte + Line 594: EXTRN ?D_SetupUserInfo@@YAXXZ:PROC ; D_SetupUserInfo + Line 595: EXTRN ??1userinfo_t@@QEAA@XZ:PROC ; userinfo_t::~userinfo_t + Line 596: EXTRN ??1player_t@@QEAA@XZ:PROC ; player_t::~player_t + Line 597: EXTRN ?SetLogText@player_t@@QEAAXPEBD@Z:PROC ; player_t::SetLogText + Line 598: EXTRN ?SendPitchLimits@player_t@@QEBAXXZ:PROC ; player_t::SendPitchLimits + Line 599: EXTRN ?ArraySize@FSerializer@@QEAAIXZ:PROC ; FSerializer::ArraySize + Line 600: EXTRN ?OpenWriter@FSerializer@@QEAA_N_N@Z:PROC ; FSerializer::OpenWriter + Line 601: EXTRN ?OpenReader@FSerializer@@QEAA_NPEAUFCompressedBuffer@@@Z:PROC ; FSerializer::OpenReader + Line 602: EXTRN ?Close@FSerializer@@QEAAXXZ:PROC ; FSerializer::Close + Line 603: EXTRN ?BeginObject@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginObject + Line 604: EXTRN ?EndObject@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndObject + Line 605: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 606: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 607: EXTRN ?GetKey@FSerializer@@QEAAPEBDXZ:PROC ; FSerializer::GetKey + Line 608: EXTRN ?GetCompressedOutput@FSerializer@@QEAA?AUFCompressedBuffer@@XZ:PROC ; FSerializer::GetCompressedOutput + Line 609: EXTRN ?AddString@FSerializer@@QEAAAEAV1@PEBD0@Z:PROC ; FSerializer::AddString + Line 610: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 611: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAVFString@@PEAV2@@Z:PROC ; Serialize + Line 612: EXTRN ??$Serialize@VPClassActor@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAVPClassActor@@PEAPEAV1@@Z:PROC ; Serialize + Line 613: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 614: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 615: EXTRN ?GetVirtualIndex@@YAIPEAVPClass@@PEBD@Z:PROC ; GetVirtualIndex + Line 616: EXTRN ?E_WorldLoaded@@YAXXZ:PROC ; E_WorldLoaded + Line 617: EXTRN ?E_WorldUnloaded@@YAXXZ:PROC ; E_WorldUnloaded + Line 618: EXTRN ?E_WorldLoadedUnsafe@@YAXXZ:PROC ; E_WorldLoadedUnsafe + Line 619: EXTRN ?E_WorldUnloadedUnsafe@@YAXXZ:PROC ; E_WorldUnloadedUnsafe + Line 620: EXTRN ?E_PlayerEntered@@YAXH_N@Z:PROC ; E_PlayerEntered + Line 621: EXTRN ?E_NewGame@@YAXW4EventHandlerType@@@Z:PROC ; E_NewGame + Line 622: EXTRN ?I_SetMusicVolume@@YAXN@Z:PROC ; I_SetMusicVolume + Line 623: EXTRN ?P_InitParticles@@YAXPEAUFLevelLocals@@@Z:PROC ; P_InitParticles + Line 624: EXTRN ?P_ClearParticles@@YAXPEAUFLevelLocals@@@Z:PROC ; P_ClearParticles + Line 625: EXTRN ?Mark@FCanvasTextureInfo@@QEAAXXZ:PROC ; FCanvasTextureInfo::Mark + Line 626: EXTRN ?DoDeferedScripts@FLevelLocals@@QEAAXXZ:PROC ; FLevelLocals::DoDeferedScripts + Line 627: EXTRN ?SpawnPlayer@FLevelLocals@@QEAAPEAVAActor@@PEAUFPlayerStart@@HH@Z:PROC ; FLevelLocals::SpawnPlayer + Line 628: EXTRN ?Serialize@FLevelLocals@@QEAAXAEAVFSerializer@@_N@Z:PROC ; FLevelLocals::Serialize + Line 629: EXTRN ?DoReborn@FLevelLocals@@QEAAXH_N@Z:PROC ; FLevelLocals::DoReborn + Line 630: EXTRN ?PickPlayerStart@FLevelLocals@@QEAAPEAUFPlayerStart@@HH@Z:PROC ; FLevelLocals::PickPlayerStart + Line 631: EXTRN ?PointInRenderSubsector@FLevelLocals@@QEAAPEAUsubsector_t@@HH@Z:PROC ; FLevelLocals::PointInRenderSubsector + Line 632: EXTRN ?P_FreeStrifeConversations@@YAXXZ:PROC ; P_FreeStrifeConversations + Line 633: EXTRN ?G_LeavingHub@@YAXPEAUFLevelLocals@@HPEAUcluster_info_t@@PEAUwbstartstruct_t@@@Z:PROC ; G_LeavingHub + Line 634: EXTRN ?I_GetTime@@YAHXZ:PROC ; I_GetTime + Line 635: EXTRN ?STAT_StartNewGame@@YAXPEBD@Z:PROC ; STAT_StartNewGame + Line 636: EXTRN ?STAT_ChangeLevel@@YAXPEBDPEAUFLevelLocals@@@Z:PROC ; STAT_ChangeLevel + Line 637: EXTRN ?G_VerifySkill@@YAXXZ:PROC ; G_VerifySkill + Line 638: EXTRN ??_EDAutosaver@@UEAAPEAXI@Z:PROC ; DAutosaver::`vector deleting destructor' + Line 639: EXTRN ??_EDSectorMarker@@UEAAPEAXI@Z:PROC ; DSectorMarker::`vector deleting destructor' + Line 640: EXTRN __CxxFrameHandler3:PROC + Line 641: EXTRN memset:PROC + Line 642: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 643: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 644: EXTRN ?D_DrawIcon@@3PEBDEB:QWORD ; D_DrawIcon + Line 645: EXTRN ?wadlevelinfos@@3V?$TArray@Ulevel_info_t@@U1@@@A:BYTE ; wadlevelinfos + Line 646: EXTRN ?AllEpisodes@@3V?$TArray@UFEpisode@@U1@@@A:BYTE ; AllEpisodes + Line 647: EXTRN ?Gray@GC@@3PEAVDObject@@EA:QWORD ; GC::Gray + Line 648: EXTRN ?gamestate@@3W4gamestate_t@@A:DWORD ; gamestate + Line 649: EXTRN ?wipegamestate@@3W4gamestate_t@@A:DWORD ; wipegamestate + Line 650: EXTRN ?SendItemUse@@3PEBVAActor@@EB:QWORD ; SendItemUse + Line 651: EXTRN ?SendItemDrop@@3PEBVAActor@@EB:QWORD ; SendItemDrop + Line 652: EXTRN ?rngseed@@3IA:DWORD ; rngseed + Line 653: EXTRN ?staticrngseed@@3IA:DWORD ; staticrngseed + Line 654: EXTRN ?use_staticrng@@3_NA:BYTE ; use_staticrng + Line 655: EXTRN ?GameSpeed@@3W4EGameSpeed@@A:DWORD ; GameSpeed + Line 656: EXTRN ?gameskill@@3VFIntCVar@@A:BYTE ; gameskill + Line 657: EXTRN ?NextSkill@@3HA:DWORD ; NextSkill + Line 658: EXTRN ?multiplayer@@3_NA:BYTE ; multiplayer + Line 659: EXTRN ?alwaysapplydmflags@@3VFBoolCVar@@A:BYTE ; alwaysapplydmflags + Line 660: EXTRN ?teamplay@@3VFBoolCVar@@A:BYTE ; teamplay + Line 661: EXTRN ?teamdamage@@3VFFloatCVar@@A:BYTE ; teamdamage + Line 662: EXTRN ?SinglePlayerClass@@3PAHA:BYTE ; SinglePlayerClass + Line 663: EXTRN ?automapactive@@3_NA:BYTE ; automapactive + Line 664: EXTRN ?paused@@3HA:DWORD ; paused + Line 665: EXTRN ?viewactive@@3_NA:BYTE ; viewactive + Line 666: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 667: EXTRN ?usergame@@3_NA:BYTE ; usergame + Line 668: EXTRN ?demoplayback@@3_NA:BYTE ; demoplayback + Line 669: EXTRN ?demorecording@@3_NA:BYTE ; demorecording + Line 670: EXTRN ?SaveVersion@@3HA:DWORD ; SaveVersion + Line 671: EXTRN ?gametic@@3HA:DWORD ; gametic + Line 672: EXTRN ?playeringame@@3PA_NA:BYTE ; playeringame + Line 673: EXTRN ?setsizeneeded@@3_NA:BYTE ; setsizeneeded + Line 674: EXTRN ?Net_Arbitrator@@3HA:DWORD ; Net_Arbitrator + Line 675: EXTRN ?dmflags@@3VFIntCVar@@A:BYTE ; dmflags + Line 676: EXTRN ?dmflags2@@3VFIntCVar@@A:BYTE ; dmflags2 + Line 677: EXTRN ?compatflags@@3VFIntCVar@@A:BYTE ; compatflags + Line 678: EXTRN ?compatflags2@@3VFIntCVar@@A:BYTE ; compatflags2 + Line 679: EXTRN ?wminfo@@3Uwbstartstruct_t@@A:BYTE ; wminfo + Line 680: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 681: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 682: EXTRN ?skyflatnum@@3VFTextureID@@A:DWORD ; skyflatnum + Line 683: EXTRN ?BaseBlendA@@3MA:DWORD ; BaseBlendA + Line 684: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 685: EXTRN ?StatusBar@@3PEAVDBaseStatusBar@@EA:QWORD ; StatusBar + Line 686: EXTRN ?SBarInfoScript@@3PAPEAUSBarInfo@@A:BYTE ; SBarInfoScript + Line 687: EXTRN ?PlayerClasses@@3V?$TArray@VFPlayerClass@@V1@@@A:BYTE ; PlayerClasses + Line 688: EXTRN ?LocalViewAngle@@3IA:DWORD ; LocalViewAngle + Line 689: EXTRN ?LocalViewPitch@@3HA:DWORD ; LocalViewPitch + Line 690: EXTRN ?save_full@@3_NA:BYTE ; save_full + Line 691: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 692: EXTRN ?save_formatted@@3VFBoolCVar@@A:BYTE ; save_formatted + Line 693: EXTRN ?sv_gravity@@3VFFloatCVar@@A:BYTE ; sv_gravity + Line 694: EXTRN ?sv_aircontrol@@3VFFloatCVar@@A:BYTE ; sv_aircontrol + Line 695: EXTRN ?disableautosave@@3VFIntCVar@@A:BYTE ; disableautosave + Line 696: EXTRN ?playerclass@@3VFStringCVar@@A:BYTE ; playerclass + Line 697: EXTRN ?TheDefaultLevelInfo@@3Ulevel_info_t@@A:BYTE ; TheDefaultLevelInfo + Line 698: EXTRN ?timingdemo@@3_NA:BYTE ; timingdemo + Line 699: EXTRN ?BackupSaveName@@3VFString@@A:QWORD ; BackupSaveName + Line 700: EXTRN ?mousex@@3HA:DWORD ; mousex + Line 701: EXTRN ?mousey@@3HA:DWORD ; mousey + Line 702: EXTRN ?sendpause@@3_NA:BYTE ; sendpause + Line 703: EXTRN ?sendsave@@3_NA:BYTE ; sendsave + Line 704: EXTRN ?sendturn180@@3_NA:BYTE ; sendturn180 + Line 705: EXTRN ?SendLand@@3_NA:BYTE ; SendLand + Line 706: EXTRN ?NoWipe@@3HA:DWORD ; NoWipe + Line 707: EXTRN ?sv_singleplayerrespawn@@3VFBoolCVar@@A:BYTE ; sv_singleplayerrespawn + Line 708: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\g_mapinfo.cod (96 hits) + Line 267: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 2135: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 2136: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 2137: EXTRN atexit:PROC + Line 2138: EXTRN __std_terminate:PROC + Line 2139: EXTRN atoi:PROC + Line 2140: EXTRN strtoul:PROC + Line 2141: EXTRN strchr:PROC + Line 2142: EXTRN strstr:PROC + Line 2143: EXTRN stricmp:PROC + Line 2144: EXTRN strnicmp:PROC + Line 2145: EXTRN tolower:PROC + Line 2146: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 2147: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 2148: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 2149: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 2150: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_K_N@Z:PROC ; FName::NameManager::FindName + Line 2151: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 2152: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 2153: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 2154: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 2155: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 2156: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 2157: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 2158: EXTRN ?ToUpper@FString@@QEAAXXZ:PROC ; FString::ToUpper + Line 2159: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 2160: EXTRN ?Truncate@FString@@QEAAX_K@Z:PROC ; FString::Truncate + Line 2161: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 2162: EXTRN mysnprintf:PROC + Line 2163: EXTRN c_sqrt:PROC + Line 2164: EXTRN ??0FScanner@@QEAA@XZ:PROC ; FScanner::FScanner + Line 2165: EXTRN ??0FScanner@@QEAA@AEBV0@@Z:PROC ; FScanner::FScanner + Line 2166: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 2167: EXTRN ??4FScanner@@QEAAAEAV0@AEBV0@@Z:PROC ; FScanner::operator= + Line 2168: EXTRN ?OpenLumpNum@FScanner@@QEAAXH@Z:PROC ; FScanner::OpenLumpNum + Line 2169: EXTRN ?SetCMode@FScanner@@QEAAX_N@Z:PROC ; FScanner::SetCMode + Line 2170: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 2171: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 2172: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 2173: EXTRN ?CheckString@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::CheckString + Line 2174: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 2175: EXTRN ?CheckNumber@FScanner@@QEAA_NXZ:PROC ; FScanner::CheckNumber + Line 2176: EXTRN ?MustGetFloat@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetFloat + Line 2177: EXTRN ?CheckFloat@FScanner@@QEAA_NXZ:PROC ; FScanner::CheckFloat + Line 2178: EXTRN ?UnGet@FScanner@@QEAAXXZ:PROC ; FScanner::UnGet + Line 2179: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 2180: EXTRN ?MatchString@FScanner@@QEAAHPEBQEBD_K@Z:PROC ; FScanner::MatchString + Line 2181: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 2182: EXTRN ?ScriptMessage@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptMessage + Line 2183: EXTRN ?ParseGameInfo@FMapInfoParser@@QEAAXXZ:PROC ; FMapInfoParser::ParseGameInfo + Line 2184: EXTRN ?ParseSkill@FMapInfoParser@@QEAAXXZ:PROC ; FMapInfoParser::ParseSkill + Line 2185: EXTRN ?ParseIntermission@FMapInfoParser@@QEAAXXZ:PROC ; FMapInfoParser::ParseIntermission + Line 2186: EXTRN ?ParseDoomEdNums@FMapInfoParser@@QEAAXXZ:PROC ; FMapInfoParser::ParseDoomEdNums + Line 2187: EXTRN ?ParseSpawnNums@FMapInfoParser@@QEAAXXZ:PROC ; FMapInfoParser::ParseSpawnNums + Line 2188: EXTRN ?ParseConversationIDs@FMapInfoParser@@QEAAXXZ:PROC ; FMapInfoParser::ParseConversationIDs + Line 2189: EXTRN ?ParseAMColors@FMapInfoParser@@QEAAX_N@Z:PROC ; FMapInfoParser::ParseAMColors + Line 2190: EXTRN ?CheckEndSequence@FMapInfoParser@@QEAA?AVFName@@XZ:PROC ; FMapInfoParser::CheckEndSequence + Line 2191: EXTRN ?ParseDamageDefinition@FMapInfoParser@@QEAAXXZ:PROC ; FMapInfoParser::ParseDamageDefinition + Line 2192: EXTRN ?ParseUMapInfo@@YAHH@Z:PROC ; ParseUMapInfo + Line 2193: EXTRN ?CommitUMapinfo@@YAXPEAUlevel_info_t@@@Z:PROC ; CommitUMapinfo + Line 2194: EXTRN ?GetWadFullName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetWadFullName + Line 2195: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDHH_N@Z:PROC ; FWadCollection::CheckNumForName + Line 2196: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 2197: EXTRN ?GetNumForFullName@FWadCollection@@QEAAHPEBD@Z:PROC ; FWadCollection::GetNumForFullName + Line 2198: EXTRN ?FindLumpMulti@FWadCollection@@QEAAHPEAPEBDPEAH_N1@Z:PROC ; FWadCollection::FindLumpMulti + Line 2199: EXTRN ?GetLumpFile@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpFile + Line 2200: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 2201: EXTRN ?atterm@@YAXP6AXXZ@Z:PROC ; atterm + Line 2202: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 2203: EXTRN ?V_GetColor@@YAHPEBIAEAVFScanner@@@Z:PROC ; V_GetColor + Line 2204: EXTRN ?P_FindLineSpecial@@YAHPEBDPEAH1@Z:PROC ; P_FindLineSpecial + Line 2205: EXTRN ?P_CheckMapData@@YA_NPEBD@Z:PROC ; P_CheckMapData + Line 2206: EXTRN ??AFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator[] + Line 2207: EXTRN ?UnlockAll@ACSStringPool@@QEAAXXZ:PROC ; ACSStringPool::UnlockAll + Line 2208: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 2209: EXTRN ?S_FindEnvironment@@YAPEAUReverbContainer@@PEBD@Z:PROC ; S_FindEnvironment + Line 2210: EXTRN ?FindInventory@AActor@@QEAAPEAV1@PEAVPClassActor@@_N@Z:PROC ; AActor::FindInventory + Line 2211: EXTRN ?DeinitIntermissions@@YAXXZ:PROC ; DeinitIntermissions + Line 2212: EXTRN __CxxFrameHandler3:PROC + Line 2213: EXTRN memmove:PROC + Line 2214: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 2215: EXTRN ?AllSkills@@3V?$TArray@UFSkillInfo@@U1@@@A:BYTE ; AllSkills + Line 2216: EXTRN ?DefaultSkill@@3HA:DWORD ; DefaultSkill + Line 2217: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 2218: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 2219: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 2220: EXTRN ?GlobalACSStrings@@3VACSStringPool@@A:BYTE ; GlobalACSStrings + Line 2221: EXTRN ?playeringame@@3PA_NA:BYTE ; playeringame + Line 2222: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 2223: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 2224: EXTRN ?YRegHead@@3QEAXEA:QWORD ; YRegHead + Line 2225: EXTRN ?YRegTail@@3QEAXEA:QWORD ; YRegTail + Line 2226: EXTRN ?level@@3UFLevelLocals@@A:BYTE ; level + Line 2227: EXTRN ?HexenMusic@@3V?$TMap@HVFString@@U?$THashTraits@H@@U?$TValueTraits@VFString@@@@@@A:BYTE ; HexenMusic + Line 2228: EXTRN __ImageBase:BYTE + Line 2229: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\g_skill.cod (47 hits) + Line 139: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 140: EXTRN atexit:PROC + Line 141: EXTRN __std_terminate:PROC + Line 142: EXTRN tolower:PROC + Line 143: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 144: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 145: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 146: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 147: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 148: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 149: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 150: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 151: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 152: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 153: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 154: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 155: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 156: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 157: EXTRN ?CheckToken@FScanner@@QEAA_NH@Z:PROC ; FScanner::CheckToken + Line 158: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 159: EXTRN ?CheckNumber@FScanner@@QEAA_NXZ:PROC ; FScanner::CheckNumber + Line 160: EXTRN ?MustGetFloat@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetFloat + Line 161: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 162: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 163: EXTRN ?ScriptMessage@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptMessage + Line 164: EXTRN ?ParseOpenBrace@FMapInfoParser@@QEAAXXZ:PROC ; FMapInfoParser::ParseOpenBrace + Line 165: EXTRN ?ParseCloseBrace@FMapInfoParser@@QEAA_NXZ:PROC ; FMapInfoParser::ParseCloseBrace + Line 166: EXTRN ?CheckAssign@FMapInfoParser@@QEAA_NXZ:PROC ; FMapInfoParser::CheckAssign + Line 167: EXTRN ?ParseAssign@FMapInfoParser@@QEAAXXZ:PROC ; FMapInfoParser::ParseAssign + Line 168: EXTRN ?ParseComma@FMapInfoParser@@QEAAXXZ:PROC ; FMapInfoParser::ParseComma + Line 169: EXTRN ?SkipToNext@FMapInfoParser@@QEAAXXZ:PROC ; FMapInfoParser::SkipToNext + Line 170: EXTRN ?CheckEndOfFile@FMapInfoParser@@QEAAXPEBD@Z:PROC ; FMapInfoParser::CheckEndOfFile + Line 171: EXTRN ?V_ParseFontColor@@YA?AW4EColorRange@@AEAPEBEHH@Z:PROC ; V_ParseFontColor + Line 172: EXTRN ??RFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator() + Line 173: EXTRN __CxxFrameHandler3:PROC + Line 174: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 175: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 176: EXTRN ?gameskill@@3VFIntCVar@@A:BYTE ; gameskill + Line 177: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 178: EXTRN ?infighting@@3VFIntCVar@@A:BYTE ; infighting + Line 179: EXTRN ?dmflags@@3VFIntCVar@@A:BYTE ; dmflags + Line 180: EXTRN ?dmflags2@@3VFIntCVar@@A:BYTE ; dmflags2 + Line 181: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 182: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 183: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 184: EXTRN __ImageBase:BYTE + Line 185: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\gameconfigfile.cod (86 hits) + Line 161: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 162: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 163: EXTRN atexit:PROC + Line 164: EXTRN atof:PROC + Line 165: EXTRN strncpy:PROC + Line 166: EXTRN stricmp:PROC + Line 167: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 168: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 169: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 170: EXTRN ??HFString@@QEBA?AV0@PEBD@Z:PROC ; FString::operator+ + Line 171: EXTRN ?LastIndexOf@FString@@QEBAJD@Z:PROC ; FString::LastIndexOf + Line 172: EXTRN ?Truncate@FString@@QEAAX_K@Z:PROC ; FString::Truncate + Line 173: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 174: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 175: EXTRN mysnprintf:PROC + Line 176: EXTRN ?Printf@FileWriter@@QEAA_KPEBDZZ:PROC ; FileWriter::Printf + Line 177: EXTRN ??0FConfigFile@@QEAA@XZ:PROC ; FConfigFile::FConfigFile + Line 178: EXTRN ??1FConfigFile@@UEAA@XZ:PROC ; FConfigFile::~FConfigFile + Line 179: EXTRN ?CreateSectionAtStart@FConfigFile@@QEAAXPEBD@Z:PROC ; FConfigFile::CreateSectionAtStart + Line 180: EXTRN ?MoveSectionToStart@FConfigFile@@QEAAXPEBD@Z:PROC ; FConfigFile::MoveSectionToStart + Line 181: EXTRN ?SetSectionNote@FConfigFile@@QEAAXPEBD0@Z:PROC ; FConfigFile::SetSectionNote + Line 182: EXTRN ?SetSection@FConfigFile@@QEAA_NPEBD_N@Z:PROC ; FConfigFile::SetSection + Line 183: EXTRN ?SetFirstSection@FConfigFile@@QEAA_NXZ:PROC ; FConfigFile::SetFirstSection + Line 184: EXTRN ?SetNextSection@FConfigFile@@QEAA_NXZ:PROC ; FConfigFile::SetNextSection + Line 185: EXTRN ?GetCurrentSection@FConfigFile@@QEBAPEBDXZ:PROC ; FConfigFile::GetCurrentSection + Line 186: EXTRN ?ClearCurrentSection@FConfigFile@@QEAAXXZ:PROC ; FConfigFile::ClearCurrentSection + Line 187: EXTRN ?DeleteCurrentSection@FConfigFile@@QEAA_NXZ:PROC ; FConfigFile::DeleteCurrentSection + Line 188: EXTRN ?SectionIsEmpty@FConfigFile@@QEAA_NXZ:PROC ; FConfigFile::SectionIsEmpty + Line 189: EXTRN ?NextInSection@FConfigFile@@QEAA_NAEAPEBD0@Z:PROC ; FConfigFile::NextInSection + Line 190: EXTRN ?GetValueForKey@FConfigFile@@QEBAPEBDPEBD@Z:PROC ; FConfigFile::GetValueForKey + Line 191: EXTRN ?SetValueForKey@FConfigFile@@QEAAXPEBD0_N@Z:PROC ; FConfigFile::SetValueForKey + Line 192: EXTRN ?ChangePathName@FConfigFile@@QEAAXPEBD@Z:PROC ; FConfigFile::ChangePathName + Line 193: EXTRN ?LoadConfigFile@FConfigFile@@QEAAXXZ:PROC ; FConfigFile::LoadConfigFile + Line 194: EXTRN ?ReadLine@FConfigFile@@MEBAPEADPEADHPEAX@Z:PROC ; FConfigFile::ReadLine + Line 195: EXTRN ?RenameSection@FConfigFile@@IEBAXPEBD0@Z:PROC ; FConfigFile::RenameSection + Line 196: EXTRN ??_EFGameConfigFile@@UEAAPEAXI@Z:PROC ; FGameConfigFile::`vector deleting destructor' + Line 197: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 198: EXTRN ?ResetToDefault@FBaseCVar@@QEAAXXZ:PROC ; FBaseCVar::ResetToDefault + Line 199: EXTRN ?FindCVar@@YAPEAVFBaseCVar@@PEBDPEAPEAV1@@Z:PROC ; FindCVar + Line 200: EXTRN ?C_ArchiveCVars@@YAXPEAVFConfigFile@@I@Z:PROC ; C_ArchiveCVars + Line 201: EXTRN ?SetGenericRepDefault@FBoolCVar@@UEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBoolCVar::SetGenericRepDefault + Line 202: EXTRN ?SetGenericRepDefault@FIntCVar@@UEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FIntCVar::SetGenericRepDefault + Line 203: EXTRN ??0FStringCVar@@QEAA@PEBD0IP6AXAEAV0@@Z@Z:PROC ; FStringCVar::FStringCVar + Line 204: EXTRN ?SetGenericRepDefault@FColorCVar@@UEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FColorCVar::SetGenericRepDefault + Line 205: EXTRN ?C_ArchiveAliases@@YAXPEAVFConfigFile@@@Z:PROC ; C_ArchiveAliases + Line 206: EXTRN ?C_SetAlias@@YAXPEBD0@Z:PROC ; C_SetAlias + Line 207: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 208: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 209: EXTRN ?ArchiveBindings@FKeyBindings@@QEAAXPEAVFConfigFile@@PEBD@Z:PROC ; FKeyBindings::ArchiveBindings + Line 210: EXTRN ?UnbindAll@FKeyBindings@@QEAAXXZ:PROC ; FKeyBindings::UnbindAll + Line 211: EXTRN ?DoBind@FKeyBindings@@QEAAXPEBD0@Z:PROC ; FKeyBindings::DoBind + Line 212: EXTRN ?C_SetDefaultBindings@@YAXXZ:PROC ; C_SetDefaultBindings + Line 213: EXTRN ?AppendArg@FArgs@@QEAAXVFString@@@Z:PROC ; FArgs::AppendArg + Line 214: EXTRN ?CheckValue@FArgs@@QEBAPEBDPEBD@Z:PROC ; FArgs::CheckValue + Line 215: EXTRN ?FileExists@@YA_NPEBD@Z:PROC ; FileExists + Line 216: EXTRN ?myasctime@@YAPEBDXZ:PROC ; myasctime + Line 217: EXTRN ?ExpandEnvVars@@YA?AVFString@@PEBD@Z:PROC ; ExpandEnvVars + Line 218: EXTRN ?GetVersionString@@YAPEBDXZ:PROC ; GetVersionString + Line 219: EXTRN ?M_SaveCustomKeys@@YAXPEAVFConfigFile@@PEAD1_K@Z:PROC ; M_SaveCustomKeys + Line 220: EXTRN ?M_GetAutoexecPath@@YA?AVFString@@XZ:PROC ; M_GetAutoexecPath + Line 221: EXTRN ?M_GetConfigPath@@YA?AVFString@@_N@Z:PROC ; M_GetConfigPath + Line 222: EXTRN __CxxFrameHandler3:PROC + Line 223: EXTRN strcmp:PROC + Line 224: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 225: EXTRN ?Bindings@@3VFKeyBindings@@A:BYTE ; Bindings + Line 226: EXTRN ?DoubleBindings@@3VFKeyBindings@@A:BYTE ; DoubleBindings + Line 227: EXTRN ?AutomapBindings@@3VFKeyBindings@@A:BYTE ; AutomapBindings + Line 228: EXTRN ?Args@@3PEAVFArgs@@EA:QWORD ; Args + Line 229: EXTRN ?netgame@@3_NA:BYTE ; netgame + Line 230: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 231: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 232: EXTRN ?con_centernotify@@3VFBoolCVar@@A:BYTE ; con_centernotify + Line 233: EXTRN ?msg0color@@3VFIntCVar@@A:BYTE ; msg0color + Line 234: EXTRN ?color@@3VFColorCVar@@A:BYTE ; color + Line 235: EXTRN ?msgmidcolor@@3VFIntCVar@@A:BYTE ; msgmidcolor + Line 236: EXTRN ?msgmidcolor2@@3VFIntCVar@@A:BYTE ; msgmidcolor2 + Line 237: EXTRN ?snd_pitched@@3VFBoolCVar@@A:BYTE ; snd_pitched + Line 238: EXTRN ?am_wallcolor@@3VFColorCVar@@A:BYTE ; am_wallcolor + Line 239: EXTRN ?am_fdwallcolor@@3VFColorCVar@@A:BYTE ; am_fdwallcolor + Line 240: EXTRN ?am_cdwallcolor@@3VFColorCVar@@A:BYTE ; am_cdwallcolor + Line 241: EXTRN ?spc_amp@@3VFFloatCVar@@A:BYTE ; spc_amp + Line 242: EXTRN ?wi_percents@@3VFBoolCVar@@A:BYTE ; wi_percents + Line 243: EXTRN ?gl_texture_hqresizemode@@3VFIntCVar@@A:BYTE ; gl_texture_hqresizemode + Line 244: EXTRN ?gl_texture_hqresizemult@@3VFIntCVar@@A:BYTE ; gl_texture_hqresizemult + Line 245: EXTRN __ImageBase:BYTE + Line 246: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\gens_opn2.cod (17 hits) + Line 48: EXTRN _purecall:PROC + Line 49: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 50: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 51: EXTRN ??_EOPNChipBase@@UEAAPEAXI@Z:PROC ; OPNChipBase::`vector deleting destructor' + Line 52: EXTRN ??_E?$OPNChipBaseT@VGensOPN2@@@@UEAAPEAXI@Z:PROC ; OPNChipBaseT::`vector deleting destructor' + Line 53: EXTRN ??_E?$OPNChipBaseBufferedT@VGensOPN2@@$0BAA@@@UEAAPEAXI@Z:PROC ; OPNChipBaseBufferedT::`vector deleting destructor' + Line 54: EXTRN ??_EGensOPN2@@UEAAPEAXI@Z:PROC ; GensOPN2::`vector deleting destructor' + Line 55: EXTRN ??1Ym2612_Emu@@QEAA@XZ:PROC ; Ym2612_Emu::~Ym2612_Emu + Line 56: EXTRN ?set_rate@Ym2612_Emu@@QEAAPEBDNN@Z:PROC ; Ym2612_Emu::set_rate + Line 57: EXTRN ?reset@Ym2612_Emu@@QEAAXXZ:PROC ; Ym2612_Emu::reset + Line 58: EXTRN ?write0@Ym2612_Emu@@QEAAXHH@Z:PROC ; Ym2612_Emu::write0 + Line 59: EXTRN ?write1@Ym2612_Emu@@QEAAXHH@Z:PROC ; Ym2612_Emu::write1 + Line 60: EXTRN ?write_pan@Ym2612_Emu@@QEAAXHH@Z:PROC ; Ym2612_Emu::write_pan + Line 61: EXTRN ?run@Ym2612_Emu@@QEAAXHPEAF@Z:PROC ; Ym2612_Emu::run + Line 62: EXTRN __CxxFrameHandler3:PROC + Line 63: EXTRN memset:PROC + Line 64: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\gi.cod (38 hits) + Line 493: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 494: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 495: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 496: EXTRN atexit:PROC + Line 497: EXTRN __std_terminate:PROC + Line 498: EXTRN atoi:PROC + Line 499: EXTRN strchr:PROC + Line 500: EXTRN stricmp:PROC + Line 501: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 502: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 503: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 504: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 505: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 506: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 507: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 508: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 509: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 510: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 511: EXTRN ?GetToken@FScanner@@QEAA_NXZ:PROC ; FScanner::GetToken + Line 512: EXTRN ?TokenMustBe@FScanner@@QEAAXH@Z:PROC ; FScanner::TokenMustBe + Line 513: EXTRN ?MustGetToken@FScanner@@QEAAXH@Z:PROC ; FScanner::MustGetToken + Line 514: EXTRN ?CheckToken@FScanner@@QEAA_NH@Z:PROC ; FScanner::CheckToken + Line 515: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 516: EXTRN ?MustGetFloat@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetFloat + Line 517: EXTRN ?MustGetValue@FScanner@@QEAAX_N@Z:PROC ; FScanner::MustGetValue + Line 518: EXTRN ?UnGet@FScanner@@QEAAXXZ:PROC ; FScanner::UnGet + Line 519: EXTRN ?MustMatchString@FScanner@@QEAAHPEBQEBD_K@Z:PROC ; FScanner::MustMatchString + Line 520: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 521: EXTRN ?GetLumpFile@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpFile + Line 522: EXTRN ?V_GetColorFromString@@YAHPEBIPEBDPEAUFScriptPosition@@@Z:PROC ; V_GetColorFromString + Line 523: EXTRN ?V_GetColorStringByName@@YA?AVFString@@PEBDPEAUFScriptPosition@@@Z:PROC ; V_GetColorStringByName + Line 524: EXTRN ?SkipToNext@FMapInfoParser@@QEAAXXZ:PROC ; FMapInfoParser::SkipToNext + Line 525: EXTRN __CxxFrameHandler3:PROC + Line 526: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 527: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 528: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 529: EXTRN ?turbo@@3VFFloatCVar@@A:BYTE ; turbo + Line 530: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\gl_buffers.cod (22 hits) + Line 41: EXTRN _purecall:PROC + Line 42: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 43: EXTRN ??_EIBuffer@@UEAAPEAXI@Z:PROC ; IBuffer::`vector deleting destructor' + Line 44: EXTRN ??_EGLBuffer@OpenGLRenderer@@MEAAPEAXI@Z:PROC ; OpenGLRenderer::GLBuffer::`vector deleting destructor' + Line 45: EXTRN __CxxFrameHandler3:PROC + Line 46: EXTRN _ptrc_glBufferStorage:QWORD + Line 47: EXTRN _ptrc_glBindBuffer:QWORD + Line 48: EXTRN _ptrc_glBufferData:QWORD + Line 49: EXTRN _ptrc_glBufferSubData:QWORD + Line 50: EXTRN _ptrc_glDeleteBuffers:QWORD + Line 51: EXTRN _ptrc_glGenBuffers:QWORD + Line 52: EXTRN _ptrc_glUnmapBuffer:QWORD + Line 53: EXTRN _ptrc_glDisableVertexAttribArray:QWORD + Line 54: EXTRN _ptrc_glEnableVertexAttribArray:QWORD + Line 55: EXTRN _ptrc_glVertexAttribPointer:QWORD + Line 56: EXTRN _ptrc_glBindBufferBase:QWORD + Line 57: EXTRN _ptrc_glBindBufferRange:QWORD + Line 58: EXTRN _ptrc_glMapBufferRange:QWORD + Line 59: EXTRN _ptrc_glCopyBufferSubData:QWORD + Line 60: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 61: EXTRN ?gl_RenderState@OpenGLRenderer@@3VFGLRenderState@1@A:BYTE ; OpenGLRenderer::gl_RenderState + Line 62: EXTRN __ImageBase:BYTE + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\gl_debug.cod (50 hits) + Line 17: EXTRN ??_EStat_gpu@OpenGLRenderer@@UEAAPEAXI@Z:PROC ; OpenGLRenderer::Stat_gpu::`vector deleting destructor' + Line 119: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 120: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 121: EXTRN atexit:PROC + Line 122: EXTRN _Init_thread_header:PROC + Line 123: EXTRN _Init_thread_abort:PROC + Line 124: EXTRN _Init_thread_footer:PROC + Line 125: EXTRN __std_terminate:PROC + Line 126: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 127: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 128: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 129: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 130: EXTRN ??0FString@@QEAA@PEBD_K@Z:PROC ; FString::FString + Line 131: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 132: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 133: EXTRN ??YFString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator+= + Line 134: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 135: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 136: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 137: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 138: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 139: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 140: EXTRN ??0FStat@@QEAA@PEBD@Z:PROC ; FStat::FStat + Line 141: EXTRN ??1FStat@@UEAA@XZ:PROC ; FStat::~FStat + Line 142: EXTRN _CxxThrowException:PROC + Line 143: EXTRN __CxxFrameHandler3:PROC + Line 144: EXTRN memcmp:PROC + Line 145: EXTRN memcpy:PROC + Line 146: EXTRN memmove:PROC + Line 147: EXTRN _Init_thread_epoch:DWORD + Line 148: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 149: EXTRN _ptrc_glDebugMessageCallback:QWORD + Line 150: EXTRN _ptrc_glDebugMessageControl:QWORD + Line 151: EXTRN _ptrc_glGetDebugMessageLog:QWORD + Line 152: EXTRN _ptrc_glObjectLabel:QWORD + Line 153: EXTRN _ptrc_glObjectPtrLabel:QWORD + Line 154: EXTRN _ptrc_glPopDebugGroup:QWORD + Line 155: EXTRN _ptrc_glPushDebugGroup:QWORD + Line 156: EXTRN _ptrc_glDisable:QWORD + Line 157: EXTRN _ptrc_glEnable:QWORD + Line 158: EXTRN _ptrc_glGetIntegerv:QWORD + Line 159: EXTRN _ptrc_glBeginQuery:QWORD + Line 160: EXTRN _ptrc_glDeleteQueries:QWORD + Line 161: EXTRN _ptrc_glEndQuery:QWORD + Line 162: EXTRN _ptrc_glGenQueries:QWORD + Line 163: EXTRN _ptrc_glGetQueryObjectuiv:QWORD + Line 164: EXTRN ?gl@@3URenderContext@@A:BYTE ; gl + Line 165: EXTRN __ImageBase:BYTE + Line 166: EXTRN _fltused:DWORD + Line 167: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\gl_framebuffer.cod (136 hits) + Line 135: EXTRN _purecall:PROC + Line 136: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 137: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 138: EXTRN atexit:PROC + Line 139: EXTRN __std_terminate:PROC + Line 140: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 141: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 142: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 143: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 144: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 145: EXTRN ogl_LoadFunctions:PROC + Line 146: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 147: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 148: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 149: EXTRN ?GetUniqueIndex@FRemapTable@@QEAAHXZ:PROC ; FRemapTable::GetUniqueIndex + Line 150: EXTRN ?TranslationToTable@@YAPEAUFRemapTable@@H@Z:PROC ; TranslationToTable + Line 151: EXTRN ??_EIHardwareTexture@@UEAAPEAXI@Z:PROC ; IHardwareTexture::`vector deleting destructor' + Line 152: EXTRN ??0FWrapperTexture@@QEAA@HHH@Z:PROC ; FWrapperTexture::FWrapperTexture + Line 153: EXTRN ?Update@DFrameBuffer@@UEAAXXZ:PROC ; DFrameBuffer::Update + Line 154: EXTRN ?InitPalette@DFrameBuffer@@QEAAXXZ:PROC ; DFrameBuffer::InitPalette + Line 155: EXTRN ?GetCaps@DFrameBuffer@@UEAAIXZ:PROC ; DFrameBuffer::GetCaps + Line 156: EXTRN ?WriteSavePic@DFrameBuffer@@UEAAXPEAVplayer_t@@PEAVFileWriter@@HH@Z:PROC ; DFrameBuffer::WriteSavePic + Line 157: EXTRN ?SetViewportRects@DFrameBuffer@@UEAAXPEAUIntRect@@@Z:PROC ; DFrameBuffer::SetViewportRects + Line 158: EXTRN ??1SystemBaseFrameBuffer@@UEAA@XZ:PROC ; SystemBaseFrameBuffer::~SystemBaseFrameBuffer + Line 159: EXTRN ?GetClientWidth@SystemBaseFrameBuffer@@UEAAHXZ:PROC ; SystemBaseFrameBuffer::GetClientWidth + Line 160: EXTRN ?GetClientHeight@SystemBaseFrameBuffer@@UEAAHXZ:PROC ; SystemBaseFrameBuffer::GetClientHeight + Line 161: EXTRN ?IsFullscreen@SystemBaseFrameBuffer@@UEAA_NXZ:PROC ; SystemBaseFrameBuffer::IsFullscreen + Line 162: EXTRN ?ToggleFullscreen@SystemBaseFrameBuffer@@UEAAX_N@Z:PROC ; SystemBaseFrameBuffer::ToggleFullscreen + Line 163: EXTRN ?SetWindowSize@SystemBaseFrameBuffer@@UEAAXHH@Z:PROC ; SystemBaseFrameBuffer::SetWindowSize + Line 164: EXTRN ??0SystemGLFrameBuffer@@QEAA@PEAX_N@Z:PROC ; SystemGLFrameBuffer::SystemGLFrameBuffer + Line 165: EXTRN ?SetVSync@SystemGLFrameBuffer@@UEAAX_N@Z:PROC ; SystemGLFrameBuffer::SetVSync + Line 166: EXTRN ?SwapBuffers@SystemGLFrameBuffer@@QEAAXXZ:PROC ; SystemGLFrameBuffer::SwapBuffers + Line 167: EXTRN ??_EOpenGLFrameBuffer@OpenGLRenderer@@UEAAPEAXI@Z:PROC ; OpenGLRenderer::OpenGLFrameBuffer::`vector deleting destructor' + Line 168: EXTRN ?GetLayer@FMaterial@@QEAAPEAVIHardwareTexture@@HHPEAPEAVFTexture@@@Z:PROC ; FMaterial::GetLayer + Line 169: EXTRN ?Reset@FGLRenderState@OpenGLRenderer@@QEAAXXZ:PROC ; OpenGLRenderer::FGLRenderState::Reset + Line 170: EXTRN ??_EIBuffer@@UEAAPEAXI@Z:PROC ; IBuffer::`vector deleting destructor' + Line 171: EXTRN ??_EIVertexBuffer@@UEAAPEAXI@Z:PROC ; IVertexBuffer::`vector deleting destructor' + Line 172: EXTRN ??_EIIndexBuffer@@UEAAPEAXI@Z:PROC ; IIndexBuffer::`vector deleting destructor' + Line 173: EXTRN ??_EIDataBuffer@@UEAAPEAXI@Z:PROC ; IDataBuffer::`vector deleting destructor' + Line 174: EXTRN ?BindCurrentFB@FGLRenderBuffers@OpenGLRenderer@@QEAAXXZ:PROC ; OpenGLRenderer::FGLRenderBuffers::BindCurrentFB + Line 175: EXTRN ??0FGLRenderer@OpenGLRenderer@@QEAA@PEAVOpenGLFrameBuffer@1@@Z:PROC ; OpenGLRenderer::FGLRenderer::FGLRenderer + Line 176: EXTRN ??1FGLRenderer@OpenGLRenderer@@QEAA@XZ:PROC ; OpenGLRenderer::FGLRenderer::~FGLRenderer + Line 177: EXTRN ?Initialize@FGLRenderer@OpenGLRenderer@@QEAAXHH@Z:PROC ; OpenGLRenderer::FGLRenderer::Initialize + Line 178: EXTRN ?ResetSWScene@FGLRenderer@OpenGLRenderer@@QEAAXXZ:PROC ; OpenGLRenderer::FGLRenderer::ResetSWScene + Line 179: EXTRN ?PostProcessScene@FGLRenderer@OpenGLRenderer@@QEAAXHAEBV?$function@$$A6AXXZ@std@@@Z:PROC ; OpenGLRenderer::FGLRenderer::PostProcessScene + Line 180: EXTRN ?ClearTonemapPalette@FGLRenderer@OpenGLRenderer@@QEAAXXZ:PROC ; OpenGLRenderer::FGLRenderer::ClearTonemapPalette + Line 181: EXTRN ?BlurScene@FGLRenderer@OpenGLRenderer@@QEAAXM@Z:PROC ; OpenGLRenderer::FGLRenderer::BlurScene + Line 182: EXTRN ?Flush@FGLRenderer@OpenGLRenderer@@QEAAXXZ:PROC ; OpenGLRenderer::FGLRenderer::Flush + Line 183: EXTRN ?WriteSavePic@FGLRenderer@OpenGLRenderer@@QEAAXPEAVplayer_t@@PEAVFileWriter@@HH@Z:PROC ; OpenGLRenderer::FGLRenderer::WriteSavePic + Line 184: EXTRN ?RenderView@FGLRenderer@OpenGLRenderer@@QEAAPEAUsector_t@@PEAVplayer_t@@@Z:PROC ; OpenGLRenderer::FGLRenderer::RenderView + Line 185: EXTRN ?BeginFrame@FGLRenderer@OpenGLRenderer@@QEAAXXZ:PROC ; OpenGLRenderer::FGLRenderer::BeginFrame + Line 186: EXTRN ??1FHardwareTexture@OpenGLRenderer@@UEAA@XZ:PROC ; OpenGLRenderer::FHardwareTexture::~FHardwareTexture + Line 187: EXTRN ?UnbindAll@FHardwareTexture@OpenGLRenderer@@SAXXZ:PROC ; OpenGLRenderer::FHardwareTexture::UnbindAll + Line 188: EXTRN ?Bind@FHardwareTexture@OpenGLRenderer@@QEAAIH_N@Z:PROC ; OpenGLRenderer::FHardwareTexture::Bind + Line 189: EXTRN ?BindOrCreate@FHardwareTexture@OpenGLRenderer@@QEAA_NPEAVFTexture@@HHHH@Z:PROC ; OpenGLRenderer::FHardwareTexture::BindOrCreate + Line 190: EXTRN ?AllocateBuffer@FHardwareTexture@OpenGLRenderer@@UEAAXHHH@Z:PROC ; OpenGLRenderer::FHardwareTexture::AllocateBuffer + Line 191: EXTRN ?MapBuffer@FHardwareTexture@OpenGLRenderer@@UEAAPEAEXZ:PROC ; OpenGLRenderer::FHardwareTexture::MapBuffer + Line 192: EXTRN ?CreateTexture@FHardwareTexture@OpenGLRenderer@@UEAAIPEAEHHH_NHPEBD@Z:PROC ; OpenGLRenderer::FHardwareTexture::CreateTexture + Line 193: EXTRN ??_EFHardwareTexture@OpenGLRenderer@@UEAAPEAXI@Z:PROC ; OpenGLRenderer::FHardwareTexture::`vector deleting destructor' + Line 194: EXTRN ?SetTextureFilterMode@FSamplerManager@OpenGLRenderer@@QEAAXXZ:PROC ; OpenGLRenderer::FSamplerManager::SetTextureFilterMode + Line 195: EXTRN ?GetVRMode@VRMode@@SAPEBU1@_N@Z:PROC ; VRMode::GetVRMode + Line 196: EXTRN ?AdjustViewport@VRMode@@QEBAXPEAVDFrameBuffer@@@Z:PROC ; VRMode::AdjustViewport + Line 197: EXTRN ??_EFModelRenderer@@UEAAPEAXI@Z:PROC ; FModelRenderer::`vector deleting destructor' + Line 198: EXTRN ?BeginDrawModel@FGLModelRenderer@@UEAAXPEAVAActor@@PEAUFSpriteModelFrame@@AEBVVSMatrix@@_N@Z:PROC ; FGLModelRenderer::BeginDrawModel + Line 199: EXTRN ?EndDrawModel@FGLModelRenderer@@UEAAXPEAVAActor@@PEAUFSpriteModelFrame@@@Z:PROC ; FGLModelRenderer::EndDrawModel + Line 200: EXTRN ?CreateVertexBuffer@FGLModelRenderer@@UEAAPEAVIModelVertexBuffer@@_N0@Z:PROC ; FGLModelRenderer::CreateVertexBuffer + Line 201: EXTRN ?GetViewToWorldMatrix@FGLModelRenderer@@UEAA?AVVSMatrix@@XZ:PROC ; FGLModelRenderer::GetViewToWorldMatrix + Line 202: EXTRN ?BeginDrawHUDModel@FGLModelRenderer@@UEAAXPEAVAActor@@AEBVVSMatrix@@_N@Z:PROC ; FGLModelRenderer::BeginDrawHUDModel + Line 203: EXTRN ?EndDrawHUDModel@FGLModelRenderer@@UEAAXPEAVAActor@@@Z:PROC ; FGLModelRenderer::EndDrawHUDModel + Line 204: EXTRN ?SetInterpolation@FGLModelRenderer@@UEAAXN@Z:PROC ; FGLModelRenderer::SetInterpolation + Line 205: EXTRN ?SetMaterial@FGLModelRenderer@@UEAAXPEAVFTexture@@_NH@Z:PROC ; FGLModelRenderer::SetMaterial + Line 206: EXTRN ?DrawArrays@FGLModelRenderer@@UEAAXHH@Z:PROC ; FGLModelRenderer::DrawArrays + Line 207: EXTRN ?DrawElements@FGLModelRenderer@@UEAAXH_K@Z:PROC ; FGLModelRenderer::DrawElements + Line 208: EXTRN ??_EFGLModelRenderer@@UEAAPEAXI@Z:PROC ; FGLModelRenderer::`vector deleting destructor' + Line 209: EXTRN ??0FSkyVertexBuffer@@QEAA@XZ:PROC ; FSkyVertexBuffer::FSkyVertexBuffer + Line 210: EXTRN ??1FSkyVertexBuffer@@QEAA@XZ:PROC ; FSkyVertexBuffer::~FSkyVertexBuffer + Line 211: EXTRN ??0GLViewpointBuffer@@QEAA@XZ:PROC ; GLViewpointBuffer::GLViewpointBuffer + Line 212: EXTRN ??1GLViewpointBuffer@@QEAA@XZ:PROC ; GLViewpointBuffer::~GLViewpointBuffer + Line 213: EXTRN ??0FLightBuffer@@QEAA@XZ:PROC ; FLightBuffer::FLightBuffer + Line 214: EXTRN ??1FLightBuffer@@QEAA@XZ:PROC ; FLightBuffer::~FLightBuffer + Line 215: EXTRN ??0FShaderProgram@OpenGLRenderer@@QEAA@XZ:PROC ; OpenGLRenderer::FShaderProgram::FShaderProgram + Line 216: EXTRN ?Update@FGLDebug@OpenGLRenderer@@QEAAXXZ:PROC ; OpenGLRenderer::FGLDebug::Update + Line 217: EXTRN ?PushGroup@FGLDebug@OpenGLRenderer@@SAXAEBVFString@@@Z:PROC ; OpenGLRenderer::FGLDebug::PushGroup + Line 218: EXTRN ?PopGroup@FGLDebug@OpenGLRenderer@@SAXXZ:PROC ; OpenGLRenderer::FGLDebug::PopGroup + Line 219: EXTRN ??0GLBuffer@OpenGLRenderer@@IEAA@H@Z:PROC ; OpenGLRenderer::GLBuffer::GLBuffer + Line 220: EXTRN ??1GLBuffer@OpenGLRenderer@@MEAA@XZ:PROC ; OpenGLRenderer::GLBuffer::~GLBuffer + Line 221: EXTRN ?SetData@GLBuffer@OpenGLRenderer@@MEAAX_KPEBX_N@Z:PROC ; OpenGLRenderer::GLBuffer::SetData + Line 222: EXTRN ?SetSubData@GLBuffer@OpenGLRenderer@@MEAAX_K0PEBX@Z:PROC ; OpenGLRenderer::GLBuffer::SetSubData + Line 223: EXTRN ?Map@GLBuffer@OpenGLRenderer@@MEAAXXZ:PROC ; OpenGLRenderer::GLBuffer::Map + Line 224: EXTRN ?Unmap@GLBuffer@OpenGLRenderer@@MEAAXXZ:PROC ; OpenGLRenderer::GLBuffer::Unmap + Line 225: EXTRN ?Resize@GLBuffer@OpenGLRenderer@@MEAAX_K@Z:PROC ; OpenGLRenderer::GLBuffer::Resize + Line 226: EXTRN ?Lock@GLBuffer@OpenGLRenderer@@MEAAPEAXI@Z:PROC ; OpenGLRenderer::GLBuffer::Lock + Line 227: EXTRN ?Unlock@GLBuffer@OpenGLRenderer@@MEAAXXZ:PROC ; OpenGLRenderer::GLBuffer::Unlock + Line 228: EXTRN ?SetFormat@GLVertexBuffer@OpenGLRenderer@@UEAAXHH_KPEBUFVertexBufferAttribute@@@Z:PROC ; OpenGLRenderer::GLVertexBuffer::SetFormat + Line 229: EXTRN ??_EGLVertexBuffer@OpenGLRenderer@@UEAAPEAXI@Z:PROC ; OpenGLRenderer::GLVertexBuffer::`vector deleting destructor' + Line 230: EXTRN ??_EGLIndexBuffer@OpenGLRenderer@@UEAAPEAXI@Z:PROC ; OpenGLRenderer::GLIndexBuffer::`vector deleting destructor' + Line 231: EXTRN ?BindRange@GLDataBuffer@OpenGLRenderer@@UEAAX_K0@Z:PROC ; OpenGLRenderer::GLDataBuffer::BindRange + Line 232: EXTRN ?BindBase@GLDataBuffer@OpenGLRenderer@@UEAAXXZ:PROC ; OpenGLRenderer::GLDataBuffer::BindBase + Line 233: EXTRN ??_EGLDataBuffer@OpenGLRenderer@@UEAAPEAXI@Z:PROC ; OpenGLRenderer::GLDataBuffer::`vector deleting destructor' + Line 234: EXTRN ??0FFlatVertexBuffer@@QEAA@HH@Z:PROC ; FFlatVertexBuffer::FFlatVertexBuffer + Line 235: EXTRN ??1FFlatVertexBuffer@@QEAA@XZ:PROC ; FFlatVertexBuffer::~FFlatVertexBuffer + Line 236: EXTRN ?gl_LoadExtensions@@YAXXZ:PROC ; gl_LoadExtensions + Line 237: EXTRN ?gl_PrintStartupLog@@YAXXZ:PROC ; gl_PrintStartupLog + Line 238: EXTRN ?Draw2D@@YAXPEAVF2DDrawer@@AEAVFRenderState@@@Z:PROC ; Draw2D + Line 239: EXTRN ??_E?$_Ref_count_obj@VFGLDebug@OpenGLRenderer@@@std@@UEAAPEAXI@Z:PROC ; std::_Ref_count_obj::`vector deleting destructor' + Line 240: EXTRN __CxxFrameHandler3:PROC + Line 241: EXTRN memset:PROC + Line 242: EXTRN _ptrc_glBlendFunc:QWORD + Line 243: EXTRN _ptrc_glClear:QWORD + Line 244: EXTRN _ptrc_glClearColor:QWORD + Line 245: EXTRN _ptrc_glClearDepth:QWORD + Line 246: EXTRN _ptrc_glDepthFunc:QWORD + Line 247: EXTRN _ptrc_glDisable:QWORD + Line 248: EXTRN _ptrc_glEnable:QWORD + Line 249: EXTRN _ptrc_glFinish:QWORD + Line 250: EXTRN _ptrc_glGetIntegerv:QWORD + Line 251: EXTRN _ptrc_glPixelStorei:QWORD + Line 252: EXTRN _ptrc_glReadPixels:QWORD + Line 253: EXTRN _ptrc_glCopyTexSubImage2D:QWORD + Line 254: EXTRN _ptrc_glBindFramebuffer:QWORD + Line 255: EXTRN ?active@glcycle_t@@2_NA:BYTE ; glcycle_t::active + Line 256: EXTRN ?vid_rendermode@@3VFIntCVar@@A:BYTE ; vid_rendermode + Line 257: EXTRN ?fullscreen@@3VFBoolCVar@@A:BYTE ; fullscreen + Line 258: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 259: EXTRN ?gl@@3URenderContext@@A:BYTE ; gl + Line 260: EXTRN ?gl_RenderState@OpenGLRenderer@@3VFGLRenderState@1@A:BYTE ; OpenGLRenderer::gl_RenderState + Line 261: EXTRN ?lastbound@FHardwareTexture@OpenGLRenderer@@2PAIA:BYTE ; OpenGLRenderer::FHardwareTexture::lastbound + Line 262: EXTRN ?Finish@@3Vglcycle_t@@A:QWORD ; Finish + Line 263: EXTRN ?twoD@@3Vglcycle_t@@A:QWORD ; twoD + Line 264: EXTRN ?Flush3D@@3Vglcycle_t@@A:QWORD ; Flush3D + Line 265: EXTRN ?vid_vsync@@3VFBoolCVar@@A:BYTE ; vid_vsync + Line 266: EXTRN ?r_drawvoxels@@3VFBoolCVar@@A:BYTE ; r_drawvoxels + Line 267: EXTRN ?gl_tonemap@@3VFIntCVar@@A:BYTE ; gl_tonemap + Line 268: EXTRN ?gl_texture_usehires@@3VFBoolCVar@@A:BYTE ; gl_texture_usehires + Line 269: EXTRN ?vid_hdr_active@@3_NA:BYTE ; vid_hdr_active + Line 270: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\gl_hwtexture.cod (40 hits) + Line 74: EXTRN _purecall:PROC + Line 75: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 76: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 77: EXTRN __std_terminate:PROC + Line 78: EXTRN calloc:PROC + Line 79: EXTRN free:PROC + Line 80: EXTRN ?GetUniqueIndex@FRemapTable@@QEAAHXZ:PROC ; FRemapTable::GetUniqueIndex + Line 81: EXTRN ?TranslationToTable@@YAPEAUFRemapTable@@H@Z:PROC ; TranslationToTable + Line 82: EXTRN ?Resize@IHardwareTexture@@QEAAXHHHHPEAE0@Z:PROC ; IHardwareTexture::Resize + Line 83: EXTRN ??_EIHardwareTexture@@UEAAPEAXI@Z:PROC ; IHardwareTexture::`vector deleting destructor' + Line 84: EXTRN ?CreateTexBuffer@FTexture@@QEAA?AUFTextureBuffer@@HH@Z:PROC ; FTexture::CreateTexBuffer + Line 85: EXTRN ?LabelObject@FGLDebug@OpenGLRenderer@@SAXIIPEBD@Z:PROC ; OpenGLRenderer::FGLDebug::LabelObject + Line 86: EXTRN ??_EFHardwareTexture@OpenGLRenderer@@UEAAPEAXI@Z:PROC ; OpenGLRenderer::FHardwareTexture::`vector deleting destructor' + Line 87: EXTRN ?Bind@FSamplerManager@OpenGLRenderer@@QEAAEHHH@Z:PROC ; OpenGLRenderer::FSamplerManager::Bind + Line 88: EXTRN __CxxFrameHandler3:PROC + Line 89: EXTRN _ptrc_glGetIntegerv:QWORD + Line 90: EXTRN _ptrc_glPixelStorei:QWORD + Line 91: EXTRN _ptrc_glTexImage2D:QWORD + Line 92: EXTRN _ptrc_glBindTexture:QWORD + Line 93: EXTRN _ptrc_glDeleteTextures:QWORD + Line 94: EXTRN _ptrc_glGenTextures:QWORD + Line 95: EXTRN _ptrc_glTexSubImage2D:QWORD + Line 96: EXTRN _ptrc_glActiveTexture:QWORD + Line 97: EXTRN _ptrc_glBindBuffer:QWORD + Line 98: EXTRN _ptrc_glBufferData:QWORD + Line 99: EXTRN _ptrc_glDeleteBuffers:QWORD + Line 100: EXTRN _ptrc_glGenBuffers:QWORD + Line 101: EXTRN _ptrc_glMapBuffer:QWORD + Line 102: EXTRN _ptrc_glUnmapBuffer:QWORD + Line 103: EXTRN _ptrc_glBindRenderbuffer:QWORD + Line 104: EXTRN _ptrc_glFramebufferRenderbuffer:QWORD + Line 105: EXTRN _ptrc_glFramebufferTexture2D:QWORD + Line 106: EXTRN _ptrc_glGenRenderbuffers:QWORD + Line 107: EXTRN _ptrc_glGenerateMipmap:QWORD + Line 108: EXTRN _ptrc_glRenderbufferStorage:QWORD + Line 109: EXTRN ?gl@@3URenderContext@@A:BYTE ; gl + Line 110: EXTRN ?gl_texture_filter@@3VFIntCVar@@A:BYTE ; gl_texture_filter + Line 111: EXTRN ?gl_RenderState@OpenGLRenderer@@3VFGLRenderState@1@A:BYTE ; OpenGLRenderer::gl_RenderState + Line 112: EXTRN ?GLRenderer@OpenGLRenderer@@3PEAVFGLRenderer@1@EA:QWORD ; OpenGLRenderer::GLRenderer + Line 113: EXTRN __ImageBase:BYTE + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\gl_interface.cod (22 hits) + Line 53: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 54: EXTRN atexit:PROC + Line 55: EXTRN __std_terminate:PROC + Line 56: EXTRN strtod:PROC + Line 57: EXTRN strstr:PROC + Line 58: EXTRN stricmp:PROC + Line 59: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 60: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 61: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 62: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 63: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 64: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 65: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 66: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 67: EXTRN ?CheckValue@FArgs@@QEBAPEBDPEBD@Z:PROC ; FArgs::CheckValue + Line 68: EXTRN __CxxFrameHandler3:PROC + Line 69: EXTRN _ptrc_glGetIntegerv:QWORD + Line 70: EXTRN _ptrc_glGetString:QWORD + Line 71: EXTRN _ptrc_glPixelStorei:QWORD + Line 72: EXTRN _ptrc_glGetStringi:QWORD + Line 73: EXTRN ?Args@@3PEAVFArgs@@EA:QWORD ; Args + Line 74: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\gl_load.cod (5 hits) + Line 3361: EXTRN strchr:PROC + Line 3362: EXTRN strncpy:PROC + Line 3363: EXTRN __imp_GetModuleHandleA:PROC + Line 3364: EXTRN __imp_GetProcAddress:PROC + Line 3365: EXTRN __imp_wglGetProcAddress:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\gl_postprocess.cod (47 hits) + Line 54: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 55: EXTRN atexit:PROC + Line 56: EXTRN ?_Xbad_function_call@std@@YAXXZ:PROC ; std::_Xbad_function_call + Line 57: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 58: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 59: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 60: EXTRN ?SuperFastHash@@YAIPEBD_K@Z:PROC ; SuperFastHash + Line 61: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 62: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 63: EXTRN ?Clear@F2DDrawer@@QEAAXXZ:PROC ; F2DDrawer::Clear + Line 64: EXTRN ?Bind@GLVertexBuffer@OpenGLRenderer@@QEAAXPEAH@Z:PROC ; OpenGLRenderer::GLVertexBuffer::Bind + Line 65: EXTRN ?PushGroup@FGLDebug@OpenGLRenderer@@SAXAEBVFString@@@Z:PROC ; OpenGLRenderer::FGLDebug::PushGroup + Line 66: EXTRN ?PopGroup@FGLDebug@OpenGLRenderer@@SAXXZ:PROC ; OpenGLRenderer::FGLDebug::PopGroup + Line 67: EXTRN ?UpdateEffectTextures@FGLRenderBuffers@OpenGLRenderer@@QEAAXXZ:PROC ; OpenGLRenderer::FGLRenderBuffers::UpdateEffectTextures + Line 68: EXTRN ?CompileEffectShaders@FGLRenderBuffers@OpenGLRenderer@@QEAAXXZ:PROC ; OpenGLRenderer::FGLRenderBuffers::CompileEffectShaders + Line 69: EXTRN ?RenderEffect@FGLRenderBuffers@OpenGLRenderer@@QEAAXAEBVFString@@@Z:PROC ; OpenGLRenderer::FGLRenderBuffers::RenderEffect + Line 70: EXTRN ?BindCurrentTexture@FGLRenderBuffers@OpenGLRenderer@@QEAAXHHH@Z:PROC ; OpenGLRenderer::FGLRenderBuffers::BindCurrentTexture + Line 71: EXTRN ?BindCurrentFB@FGLRenderBuffers@OpenGLRenderer@@QEAAXXZ:PROC ; OpenGLRenderer::FGLRenderBuffers::BindCurrentFB + Line 72: EXTRN ?BindOutputFB@FGLRenderBuffers@OpenGLRenderer@@QEAAXXZ:PROC ; OpenGLRenderer::FGLRenderBuffers::BindOutputFB + Line 73: EXTRN ?BindEyeFB@FGLRenderBuffers@OpenGLRenderer@@QEAAXH_N@Z:PROC ; OpenGLRenderer::FGLRenderBuffers::BindEyeFB + Line 74: EXTRN ?BindDitherTexture@FGLRenderBuffers@OpenGLRenderer@@QEAAXH@Z:PROC ; OpenGLRenderer::FGLRenderBuffers::BindDitherTexture + Line 75: EXTRN ?PresentStereo@FGLRenderer@OpenGLRenderer@@QEAAXXZ:PROC ; OpenGLRenderer::FGLRenderer::PresentStereo + Line 76: EXTRN ??0FGLPostProcessState@OpenGLRenderer@@QEAA@XZ:PROC ; OpenGLRenderer::FGLPostProcessState::FGLPostProcessState + Line 77: EXTRN ??1FGLPostProcessState@OpenGLRenderer@@QEAA@XZ:PROC ; OpenGLRenderer::FGLPostProcessState::~FGLPostProcessState + Line 78: EXTRN ?SaveTextureBindings@FGLPostProcessState@OpenGLRenderer@@QEAAXI@Z:PROC ; OpenGLRenderer::FGLPostProcessState::SaveTextureBindings + Line 79: EXTRN ?GetVRMode@VRMode@@SAPEBU1@_N@Z:PROC ; VRMode::GetVRMode + Line 80: EXTRN ?Run@FCustomPostProcessShaders@OpenGLRenderer@@QEAAXVFString@@@Z:PROC ; OpenGLRenderer::FCustomPostProcessShaders::Run + Line 81: EXTRN ?ViewportLinearScale@@YA_NXZ:PROC ; ViewportLinearScale + Line 82: EXTRN __CxxFrameHandler3:PROC + Line 83: EXTRN _ptrc_glClear:QWORD + Line 84: EXTRN _ptrc_glClearColor:QWORD + Line 85: EXTRN _ptrc_glDisable:QWORD + Line 86: EXTRN _ptrc_glEnable:QWORD + Line 87: EXTRN _ptrc_glScissor:QWORD + Line 88: EXTRN _ptrc_glTexParameteri:QWORD + Line 89: EXTRN _ptrc_glViewport:QWORD + Line 90: EXTRN _ptrc_glDrawArrays:QWORD + Line 91: EXTRN _ptrc_glActiveTexture:QWORD + Line 92: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 93: EXTRN ?Gamma@@3VFFloatCVar@@A:BYTE ; Gamma + Line 94: EXTRN ?hw_postprocess@@3VPostprocess@@A:BYTE ; hw_postprocess + Line 95: EXTRN ?vid_brightness@@3VFFloatCVar@@A:BYTE ; vid_brightness + Line 96: EXTRN ?vid_contrast@@3VFFloatCVar@@A:BYTE ; vid_contrast + Line 97: EXTRN ?vid_saturation@@3VFFloatCVar@@A:BYTE ; vid_saturation + Line 98: EXTRN ?gl_satformula@@3VFIntCVar@@A:BYTE ; gl_satformula + Line 99: EXTRN ?vid_hdr_active@@3_NA:BYTE ; vid_hdr_active + Line 100: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\gl_postprocessshader.cod (54 hits) + Line 65: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 66: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 67: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 68: EXTRN atexit:PROC + Line 69: EXTRN __std_terminate:PROC + Line 70: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 71: EXTRN roundf:PROC + Line 72: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 73: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 74: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 75: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 76: EXTRN ??YFString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator+= + Line 77: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 78: EXTRN ?AppendFormat@FString@@QEAAXPEBDZZ:PROC ; FString::AppendFormat + Line 79: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 80: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 81: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 82: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 83: EXTRN ?CreateTexBuffer@FTexture@@QEAA?AUFTextureBuffer@@HH@Z:PROC ; FTexture::CreateTexBuffer + Line 84: EXTRN ?CheckForTexture@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::CheckForTexture + Line 85: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 86: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 87: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 88: EXTRN ?PushGroup@FGLDebug@OpenGLRenderer@@SAXAEBVFString@@@Z:PROC ; OpenGLRenderer::FGLDebug::PushGroup + Line 89: EXTRN ?PopGroup@FGLDebug@OpenGLRenderer@@SAXXZ:PROC ; OpenGLRenderer::FGLDebug::PopGroup + Line 90: EXTRN ?BindCurrentTexture@FGLRenderBuffers@OpenGLRenderer@@QEAAXHHH@Z:PROC ; OpenGLRenderer::FGLRenderBuffers::BindCurrentTexture + Line 91: EXTRN ?BindNextFB@FGLRenderBuffers@OpenGLRenderer@@QEAAXXZ:PROC ; OpenGLRenderer::FGLRenderBuffers::BindNextFB + Line 92: EXTRN ?NextTexture@FGLRenderBuffers@OpenGLRenderer@@QEAAXXZ:PROC ; OpenGLRenderer::FGLRenderBuffers::NextTexture + Line 93: EXTRN ?RenderScreenQuad@FGLRenderer@OpenGLRenderer@@QEAAXXZ:PROC ; OpenGLRenderer::FGLRenderer::RenderScreenQuad + Line 94: EXTRN ??0FGLPostProcessState@OpenGLRenderer@@QEAA@XZ:PROC ; OpenGLRenderer::FGLPostProcessState::FGLPostProcessState + Line 95: EXTRN ??1FGLPostProcessState@OpenGLRenderer@@QEAA@XZ:PROC ; OpenGLRenderer::FGLPostProcessState::~FGLPostProcessState + Line 96: EXTRN ?SaveTextureBindings@FGLPostProcessState@OpenGLRenderer@@QEAAXI@Z:PROC ; OpenGLRenderer::FGLPostProcessState::SaveTextureBindings + Line 97: EXTRN ??0FShaderProgram@OpenGLRenderer@@QEAA@XZ:PROC ; OpenGLRenderer::FShaderProgram::FShaderProgram + Line 98: EXTRN ??1FShaderProgram@OpenGLRenderer@@UEAA@XZ:PROC ; OpenGLRenderer::FShaderProgram::~FShaderProgram + Line 99: EXTRN _CxxThrowException:PROC + Line 100: EXTRN __CxxFrameHandler3:PROC + Line 101: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 102: EXTRN _ptrc_glTexImage2D:QWORD + Line 103: EXTRN _ptrc_glTexParameteri:QWORD + Line 104: EXTRN _ptrc_glBindTexture:QWORD + Line 105: EXTRN _ptrc_glDeleteTextures:QWORD + Line 106: EXTRN _ptrc_glGenTextures:QWORD + Line 107: EXTRN _ptrc_glActiveTexture:QWORD + Line 108: EXTRN _ptrc_glGetUniformLocation:QWORD + Line 109: EXTRN _ptrc_glUniform1f:QWORD + Line 110: EXTRN _ptrc_glUniform1i:QWORD + Line 111: EXTRN _ptrc_glUniform2f:QWORD + Line 112: EXTRN _ptrc_glUniform3f:QWORD + Line 113: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 114: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 115: EXTRN ?gl@@3URenderContext@@A:BYTE ; gl + Line 116: EXTRN ?GLRenderer@OpenGLRenderer@@3PEAVFGLRenderer@1@EA:QWORD ; OpenGLRenderer::GLRenderer + Line 117: EXTRN ?PostProcessShaders@@3V?$TArray@UPostProcessShader@@U1@@@A:BYTE ; PostProcessShaders + Line 118: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\gl_postprocessstate.cod (14 hits) + Line 12: EXTRN __std_terminate:PROC + Line 13: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 14: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 15: EXTRN __CxxFrameHandler3:PROC + Line 16: EXTRN _ptrc_glDisable:QWORD + Line 17: EXTRN _ptrc_glEnable:QWORD + Line 18: EXTRN _ptrc_glGetBooleanv:QWORD + Line 19: EXTRN _ptrc_glGetIntegerv:QWORD + Line 20: EXTRN _ptrc_glBindTexture:QWORD + Line 21: EXTRN _ptrc_glActiveTexture:QWORD + Line 22: EXTRN _ptrc_glBlendFuncSeparate:QWORD + Line 23: EXTRN _ptrc_glBlendEquationSeparate:QWORD + Line 24: EXTRN _ptrc_glUseProgram:QWORD + Line 25: EXTRN _ptrc_glBindSampler:QWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\gl_renderbuffers.cod (75 hits) + Line 146: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 147: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 148: EXTRN atexit:PROC + Line 149: EXTRN __std_terminate:PROC + Line 150: EXTRN __std_type_info_compare:PROC + Line 151: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 152: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 153: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 154: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 155: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 156: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 157: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 158: EXTRN ??YFString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator+= + Line 159: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 160: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 161: EXTRN ?AppendFormat@FString@@QEAAXPEBDZZ:PROC ; FString::AppendFormat + Line 162: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 163: EXTRN ?SuperFastHash@@YAIPEBD_K@Z:PROC ; SuperFastHash + Line 164: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 165: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 166: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 167: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 168: EXTRN ?LabelObject@FGLDebug@OpenGLRenderer@@SAXIIPEBD@Z:PROC ; OpenGLRenderer::FGLDebug::LabelObject + Line 169: EXTRN ?PushGroup@FGLDebug@OpenGLRenderer@@SAXAEBVFString@@@Z:PROC ; OpenGLRenderer::FGLDebug::PushGroup + Line 170: EXTRN ?PopGroup@FGLDebug@OpenGLRenderer@@SAXXZ:PROC ; OpenGLRenderer::FGLDebug::PopGroup + Line 171: EXTRN ?RenderScreenQuad@FGLRenderer@OpenGLRenderer@@QEAAXXZ:PROC ; OpenGLRenderer::FGLRenderer::RenderScreenQuad + Line 172: EXTRN ??0FGLPostProcessState@OpenGLRenderer@@QEAA@XZ:PROC ; OpenGLRenderer::FGLPostProcessState::FGLPostProcessState + Line 173: EXTRN ??1FGLPostProcessState@OpenGLRenderer@@QEAA@XZ:PROC ; OpenGLRenderer::FGLPostProcessState::~FGLPostProcessState + Line 174: EXTRN ?SaveTextureBindings@FGLPostProcessState@OpenGLRenderer@@QEAAXI@Z:PROC ; OpenGLRenderer::FGLPostProcessState::SaveTextureBindings + Line 175: EXTRN ??0FShaderProgram@OpenGLRenderer@@QEAA@XZ:PROC ; OpenGLRenderer::FShaderProgram::FShaderProgram + Line 176: EXTRN ??_E?$_Ref_count_resource@PEAVFShaderProgram@OpenGLRenderer@@U?$default_delete@VFShaderProgram@OpenGLRenderer@@@std@@@std@@UEAAPEAXI@Z:PROC ; std::_Ref_count_resource >::`vector deleting destructor' + Line 177: EXTRN __CxxFrameHandler3:PROC + Line 178: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 179: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 180: EXTRN _ptrc_glInvalidateFramebuffer:QWORD + Line 181: EXTRN _ptrc_glBlendFunc:QWORD + Line 182: EXTRN _ptrc_glClear:QWORD + Line 183: EXTRN _ptrc_glClearColor:QWORD + Line 184: EXTRN _ptrc_glClearDepth:QWORD + Line 185: EXTRN _ptrc_glClearStencil:QWORD + Line 186: EXTRN _ptrc_glDisable:QWORD + Line 187: EXTRN _ptrc_glEnable:QWORD + Line 188: EXTRN _ptrc_glGetBooleanv:QWORD + Line 189: EXTRN _ptrc_glGetDoublev:QWORD + Line 190: EXTRN _ptrc_glGetIntegerv:QWORD + Line 191: EXTRN _ptrc_glTexImage2D:QWORD + Line 192: EXTRN _ptrc_glTexParameteri:QWORD + Line 193: EXTRN _ptrc_glViewport:QWORD + Line 194: EXTRN _ptrc_glBindTexture:QWORD + Line 195: EXTRN _ptrc_glDeleteTextures:QWORD + Line 196: EXTRN _ptrc_glGenTextures:QWORD + Line 197: EXTRN _ptrc_glActiveTexture:QWORD + Line 198: EXTRN _ptrc_glBlendEquation:QWORD + Line 199: EXTRN _ptrc_glBindFramebuffer:QWORD + Line 200: EXTRN _ptrc_glBindRenderbuffer:QWORD + Line 201: EXTRN _ptrc_glBlitFramebuffer:QWORD + Line 202: EXTRN _ptrc_glCheckFramebufferStatus:QWORD + Line 203: EXTRN _ptrc_glDeleteFramebuffers:QWORD + Line 204: EXTRN _ptrc_glDeleteRenderbuffers:QWORD + Line 205: EXTRN _ptrc_glFramebufferRenderbuffer:QWORD + Line 206: EXTRN _ptrc_glFramebufferTexture2D:QWORD + Line 207: EXTRN _ptrc_glGenFramebuffers:QWORD + Line 208: EXTRN _ptrc_glGenRenderbuffers:QWORD + Line 209: EXTRN _ptrc_glRenderbufferStorage:QWORD + Line 210: EXTRN _ptrc_glRenderbufferStorageMultisample:QWORD + Line 211: EXTRN _ptrc_glTexImage2DMultisample:QWORD + Line 212: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 213: EXTRN ?gl@@3URenderContext@@A:BYTE ; gl + Line 214: EXTRN ?gl_shadowmap_quality@@3VFIntCVar@@A:BYTE ; gl_shadowmap_quality + Line 215: EXTRN ?gl_ssao@@3VFIntCVar@@A:BYTE ; gl_ssao + Line 216: EXTRN ?gl_debug_level@@3VFIntCVar@@A:BYTE ; gl_debug_level + Line 217: EXTRN ?hw_postprocess@@3VPostprocess@@A:BYTE ; hw_postprocess + Line 218: EXTRN ?GLRenderer@OpenGLRenderer@@3PEAVFGLRenderer@1@EA:QWORD ; OpenGLRenderer::GLRenderer + Line 219: EXTRN __ImageBase:BYTE + Line 220: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\gl_renderer.cod (98 hits) + Line 43: EXTRN _purecall:PROC + Line 44: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 45: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 46: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 47: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 48: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 49: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 50: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 51: EXTRN ?FlushAll@FTextureManager@@QEAAXXZ:PROC ; FTextureManager::FlushAll + Line 52: EXTRN ?PerformUpdate@IShadowMap@@QEAA_NXZ:PROC ; IShadowMap::PerformUpdate + Line 53: EXTRN ?M_CreatePNG@@YA_NPEAVFileWriter@@PEBEPEBUPalEntry@@W4ESSType@@HHHM@Z:PROC ; M_CreatePNG + Line 54: EXTRN ?I_GetTimeFrac@@YANXZ:PROC ; I_GetTimeFrac + Line 55: EXTRN ?UpdateAll@FCanvasTextureInfo@@QEAAXV?$function@$$A6AXPEAVAActor@@PEAVFCanvasTexture@@N@Z@std@@@Z:PROC ; FCanvasTextureInfo::UpdateAll + Line 56: EXTRN ??0FRenderViewpoint@@QEAA@XZ:PROC ; FRenderViewpoint::FRenderViewpoint + Line 57: EXTRN ??0SWSceneDrawer@@QEAA@XZ:PROC ; SWSceneDrawer::SWSceneDrawer + Line 58: EXTRN ??1SWSceneDrawer@@QEAA@XZ:PROC ; SWSceneDrawer::~SWSceneDrawer + Line 59: EXTRN ?RenderView@SWSceneDrawer@@QEAAPEAUsector_t@@PEAVplayer_t@@@Z:PROC ; SWSceneDrawer::RenderView + Line 60: EXTRN ?ResetProfilingData@@YAXXZ:PROC ; ResetProfilingData + Line 61: EXTRN ?checkBenchActive@@YAXXZ:PROC ; checkBenchActive + Line 62: EXTRN ?LabelObject@FGLDebug@OpenGLRenderer@@SAXIIPEBD@Z:PROC ; OpenGLRenderer::FGLDebug::LabelObject + Line 63: EXTRN ?PushGroup@FGLDebug@OpenGLRenderer@@SAXAEBVFString@@@Z:PROC ; OpenGLRenderer::FGLDebug::PushGroup + Line 64: EXTRN ?PopGroup@FGLDebug@OpenGLRenderer@@SAXXZ:PROC ; OpenGLRenderer::FGLDebug::PopGroup + Line 65: EXTRN ?GetLayer@FMaterial@@QEAAPEAVIHardwareTexture@@HHPEAPEAVFTexture@@@Z:PROC ; FMaterial::GetLayer + Line 66: EXTRN ?ValidateTexture@FMaterial@@SAPEAV1@PEAVFTexture@@_N1@Z:PROC ; FMaterial::ValidateTexture + Line 67: EXTRN ?CheckTimer@FGLRenderState@OpenGLRenderer@@QEAAX_K@Z:PROC ; OpenGLRenderer::FGLRenderState::CheckTimer + Line 68: EXTRN ??0FShaderManager@OpenGLRenderer@@QEAA@XZ:PROC ; OpenGLRenderer::FShaderManager::FShaderManager + Line 69: EXTRN ??1FShaderManager@OpenGLRenderer@@QEAA@XZ:PROC ; OpenGLRenderer::FShaderManager::~FShaderManager + Line 70: EXTRN ??0FGLRenderBuffers@OpenGLRenderer@@QEAA@XZ:PROC ; OpenGLRenderer::FGLRenderBuffers::FGLRenderBuffers + Line 71: EXTRN ??1FGLRenderBuffers@OpenGLRenderer@@QEAA@XZ:PROC ; OpenGLRenderer::FGLRenderBuffers::~FGLRenderBuffers + Line 72: EXTRN ?Setup@FGLRenderBuffers@OpenGLRenderer@@QEAAXHHHH@Z:PROC ; OpenGLRenderer::FGLRenderBuffers::Setup + Line 73: EXTRN ?BindShadowMapFB@FGLRenderBuffers@OpenGLRenderer@@QEAAXXZ:PROC ; OpenGLRenderer::FGLRenderBuffers::BindShadowMapFB + Line 74: EXTRN ?BindShadowMapTexture@FGLRenderBuffers@OpenGLRenderer@@QEAAXH@Z:PROC ; OpenGLRenderer::FGLRenderBuffers::BindShadowMapTexture + Line 75: EXTRN ?RenderScreenQuad@FGLRenderer@OpenGLRenderer@@QEAAXXZ:PROC ; OpenGLRenderer::FGLRenderer::RenderScreenQuad + Line 76: EXTRN ?CopyToBackbuffer@FGLRenderer@OpenGLRenderer@@QEAAXPEBUIntRect@@_N@Z:PROC ; OpenGLRenderer::FGLRenderer::CopyToBackbuffer + Line 77: EXTRN ?RenderViewpoint@FGLRenderer@OpenGLRenderer@@QEAAPEAUsector_t@@AEAUFRenderViewpoint@@PEAVAActor@@PEAUIntRect@@MMM_N3@Z:PROC ; OpenGLRenderer::FGLRenderer::RenderViewpoint + Line 78: EXTRN ?Init@FPresentShaderBase@@MEAAXPEBD0@Z:PROC ; FPresentShaderBase::Init + Line 79: EXTRN ??_EFPresentShaderBase@@UEAAPEAXI@Z:PROC ; FPresentShaderBase::`vector deleting destructor' + Line 80: EXTRN ?Bind@FPresentShader@@UEAAXPEAVIRenderQueue@@@Z:PROC ; FPresentShader::Bind + Line 81: EXTRN ??_EFPresentShader@@UEAAPEAXI@Z:PROC ; FPresentShader::`vector deleting destructor' + Line 82: EXTRN ?Bind@FPresent3DCheckerShader@@UEAAXPEAVIRenderQueue@@@Z:PROC ; FPresent3DCheckerShader::Bind + Line 83: EXTRN ??_EFPresent3DCheckerShader@@UEAAPEAXI@Z:PROC ; FPresent3DCheckerShader::`vector deleting destructor' + Line 84: EXTRN ?Bind@FPresent3DColumnShader@@UEAAXPEAVIRenderQueue@@@Z:PROC ; FPresent3DColumnShader::Bind + Line 85: EXTRN ??_EFPresent3DColumnShader@@UEAAPEAXI@Z:PROC ; FPresent3DColumnShader::`vector deleting destructor' + Line 86: EXTRN ?Bind@FPresent3DRowShader@@UEAAXPEAVIRenderQueue@@@Z:PROC ; FPresent3DRowShader::Bind + Line 87: EXTRN ??_EFPresent3DRowShader@@UEAAPEAXI@Z:PROC ; FPresent3DRowShader::`vector deleting destructor' + Line 88: EXTRN ?Bind@FShadowMapShader@@QEAAXPEAVIRenderQueue@@@Z:PROC ; FShadowMapShader::Bind + Line 89: EXTRN ?hw_ClearFakeFlat@@YAXXZ:PROC ; hw_ClearFakeFlat + Line 90: EXTRN ??0FCustomPostProcessShaders@OpenGLRenderer@@QEAA@XZ:PROC ; OpenGLRenderer::FCustomPostProcessShaders::FCustomPostProcessShaders + Line 91: EXTRN ??1FCustomPostProcessShaders@OpenGLRenderer@@QEAA@XZ:PROC ; OpenGLRenderer::FCustomPostProcessShaders::~FCustomPostProcessShaders + Line 92: EXTRN ?Unbind@FHardwareTexture@OpenGLRenderer@@SAXH@Z:PROC ; OpenGLRenderer::FHardwareTexture::Unbind + Line 93: EXTRN ?BindToFrameBuffer@FHardwareTexture@OpenGLRenderer@@QEAAXHH@Z:PROC ; OpenGLRenderer::FHardwareTexture::BindToFrameBuffer + Line 94: EXTRN ?BindOrCreate@FHardwareTexture@OpenGLRenderer@@QEAA_NPEAVFTexture@@HHHH@Z:PROC ; OpenGLRenderer::FHardwareTexture::BindOrCreate + Line 95: EXTRN ??0FSamplerManager@OpenGLRenderer@@QEAA@XZ:PROC ; OpenGLRenderer::FSamplerManager::FSamplerManager + Line 96: EXTRN ??1FSamplerManager@OpenGLRenderer@@QEAA@XZ:PROC ; OpenGLRenderer::FSamplerManager::~FSamplerManager + Line 97: EXTRN ?Clear@FLightBuffer@@QEAAXXZ:PROC ; FLightBuffer::Clear + Line 98: EXTRN ?Clear@GLViewpointBuffer@@QEAAXXZ:PROC ; GLViewpointBuffer::Clear + Line 99: EXTRN ?FlushModels@@YAXXZ:PROC ; FlushModels + Line 100: EXTRN ??0FGLPostProcessState@OpenGLRenderer@@QEAA@XZ:PROC ; OpenGLRenderer::FGLPostProcessState::FGLPostProcessState + Line 101: EXTRN ??1FGLPostProcessState@OpenGLRenderer@@QEAA@XZ:PROC ; OpenGLRenderer::FGLPostProcessState::~FGLPostProcessState + Line 102: EXTRN __CxxFrameHandler3:PROC + Line 103: EXTRN memset:PROC + Line 104: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 105: EXTRN _ptrc_glDisable:QWORD + Line 106: EXTRN _ptrc_glFinish:QWORD + Line 107: EXTRN _ptrc_glGetIntegerv:QWORD + Line 108: EXTRN _ptrc_glReadPixels:QWORD + Line 109: EXTRN _ptrc_glViewport:QWORD + Line 110: EXTRN _ptrc_glDeleteQueries:QWORD + Line 111: EXTRN _ptrc_glGenQueries:QWORD + Line 112: EXTRN _ptrc_glBindFramebuffer:QWORD + Line 113: EXTRN _ptrc_glBindVertexArray:QWORD + Line 114: EXTRN _ptrc_glDeleteFramebuffers:QWORD + Line 115: EXTRN _ptrc_glDeleteVertexArrays:QWORD + Line 116: EXTRN _ptrc_glGenFramebuffers:QWORD + Line 117: EXTRN _ptrc_glGenVertexArrays:QWORD + Line 118: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 119: EXTRN ?active@glcycle_t@@2_NA:BYTE ; glcycle_t::active + Line 120: EXTRN ?UpdateCycles@IShadowMap@@2Vcycle_t@@A:QWORD ; IShadowMap::UpdateCycles + Line 121: EXTRN ?vid_rendermode@@3VFIntCVar@@A:BYTE ; vid_rendermode + Line 122: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 123: EXTRN ?Gamma@@3VFFloatCVar@@A:BYTE ; Gamma + Line 124: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 125: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 126: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 127: EXTRN ?r_viewpoint@@3UFRenderViewpoint@@A:BYTE ; r_viewpoint + Line 128: EXTRN ?r_viewwindow@@3UFViewWindow@@A:BYTE ; r_viewwindow + Line 129: EXTRN ?r_NoInterpolate@@3_NA:BYTE ; r_NoInterpolate + Line 130: EXTRN ?All@@3Vglcycle_t@@A:QWORD ; All + Line 131: EXTRN ?iter_dlightf@@3HA:DWORD ; iter_dlightf + Line 132: EXTRN ?iter_dlight@@3HA:DWORD ; iter_dlight + Line 133: EXTRN ?draw_dlight@@3HA:DWORD ; draw_dlight + Line 134: EXTRN ?draw_dlightf@@3HA:DWORD ; draw_dlightf + Line 135: EXTRN ?gl@@3URenderContext@@A:BYTE ; gl + Line 136: EXTRN ?gl_shadowmap_quality@@3VFIntCVar@@A:BYTE ; gl_shadowmap_quality + Line 137: EXTRN ?gl_RenderState@OpenGLRenderer@@3VFGLRenderState@1@A:BYTE ; OpenGLRenderer::gl_RenderState + Line 138: EXTRN ?cl_capfps@@3VFBoolCVar@@A:BYTE ; cl_capfps + Line 139: EXTRN ?NoInterpolateView@@3_NA:BYTE ; NoInterpolateView + Line 140: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\gl_renderstate.cod (52 hits) + Line 29: EXTRN _purecall:PROC + Line 94: EXTRN ?loadIdentity@VSMatrix@@QEAAXXZ:PROC ; VSMatrix::loadIdentity + Line 95: EXTRN ?computeNormalMatrix@VSMatrix@@QEAAXPEBM@Z:PROC ; VSMatrix::computeNormalMatrix + Line 96: EXTRN ?GetLayer@FMaterial@@QEAAPEAVIHardwareTexture@@HHPEAPEAVFTexture@@@Z:PROC ; FMaterial::GetLayer + Line 97: EXTRN ?Bind@FShader@OpenGLRenderer@@QEAA_NXZ:PROC ; OpenGLRenderer::FShader::Bind + Line 98: EXTRN ?BindEffect@FShaderManager@OpenGLRenderer@@QEAAPEAVFShader@2@HW4EPassType@2@@Z:PROC ; OpenGLRenderer::FShaderManager::BindEffect + Line 99: EXTRN ?Get@FShaderManager@OpenGLRenderer@@QEAAPEAVFShader@2@I_NW4EPassType@2@@Z:PROC ; OpenGLRenderer::FShaderManager::Get + Line 100: EXTRN ?DoBindUBO@FLightBuffer@@QEAAHI@Z:PROC ; FLightBuffer::DoBindUBO + Line 101: EXTRN ?Unbind@FHardwareTexture@OpenGLRenderer@@SAXH@Z:PROC ; OpenGLRenderer::FHardwareTexture::Unbind + Line 102: EXTRN ?BindOrCreate@FHardwareTexture@OpenGLRenderer@@QEAA_NPEAVFTexture@@HHHH@Z:PROC ; OpenGLRenderer::FHardwareTexture::BindOrCreate + Line 103: EXTRN ?Bind@GLBuffer@OpenGLRenderer@@QEAAXXZ:PROC ; OpenGLRenderer::GLBuffer::Bind + Line 104: EXTRN ?Bind@GLVertexBuffer@OpenGLRenderer@@QEAAXPEAH@Z:PROC ; OpenGLRenderer::GLVertexBuffer::Bind + Line 105: EXTRN ?Set2D@GLViewpointBuffer@@QEAAXAEAVFRenderState@@HH@Z:PROC ; GLViewpointBuffer::Set2D + Line 106: EXTRN _ptrc_glBlendFunc:QWORD + Line 107: EXTRN _ptrc_glClear:QWORD + Line 108: EXTRN _ptrc_glClearColor:QWORD + Line 109: EXTRN _ptrc_glClearDepth:QWORD + Line 110: EXTRN _ptrc_glClearStencil:QWORD + Line 111: EXTRN _ptrc_glColorMask:QWORD + Line 112: EXTRN _ptrc_glDepthFunc:QWORD + Line 113: EXTRN _ptrc_glDepthMask:QWORD + Line 114: EXTRN _ptrc_glDepthRange:QWORD + Line 115: EXTRN _ptrc_glDisable:QWORD + Line 116: EXTRN _ptrc_glEnable:QWORD + Line 117: EXTRN _ptrc_glFrontFace:QWORD + Line 118: EXTRN _ptrc_glIsEnabled:QWORD + Line 119: EXTRN _ptrc_glScissor:QWORD + Line 120: EXTRN _ptrc_glStencilFunc:QWORD + Line 121: EXTRN _ptrc_glStencilOp:QWORD + Line 122: EXTRN _ptrc_glViewport:QWORD + Line 123: EXTRN _ptrc_glDrawArrays:QWORD + Line 124: EXTRN _ptrc_glDrawElements:QWORD + Line 125: EXTRN _ptrc_glPolygonOffset:QWORD + Line 126: EXTRN _ptrc_glBlendEquation:QWORD + Line 127: EXTRN _ptrc_glDrawBuffers:QWORD + Line 128: EXTRN _ptrc_glUniform1f:QWORD + Line 129: EXTRN _ptrc_glUniform1i:QWORD + Line 130: EXTRN _ptrc_glUniform2fv:QWORD + Line 131: EXTRN _ptrc_glUniform4f:QWORD + Line 132: EXTRN _ptrc_glUniform4fv:QWORD + Line 133: EXTRN _ptrc_glUniformMatrix4fv:QWORD + Line 134: EXTRN _ptrc_glVertexAttrib4fv:QWORD + Line 135: EXTRN ?gl@@3URenderContext@@A:BYTE ; gl + Line 136: EXTRN ?gl_texture_usehires@@3VFBoolCVar@@A:BYTE ; gl_texture_usehires + Line 137: EXTRN ?gl_fogmode@@3VFIntCVar@@A:BYTE ; gl_fogmode + Line 138: EXTRN ?LegacyRenderStyles@@3PATFRenderStyle@@A:BYTE ; LegacyRenderStyles + Line 139: EXTRN ?active@glcycle_t@@2_NA:BYTE ; glcycle_t::active + Line 140: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 141: EXTRN ?GLRenderer@OpenGLRenderer@@3PEAVFGLRenderer@1@EA:QWORD ; OpenGLRenderer::GLRenderer + Line 142: EXTRN ?drawcalls@@3Vglcycle_t@@A:QWORD ; drawcalls + Line 143: EXTRN __ImageBase:BYTE + Line 144: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\gl_samplers.cod (15 hits) + Line 18: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 19: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 20: EXTRN ?LabelObject@FGLDebug@OpenGLRenderer@@SAXIIPEBD@Z:PROC ; OpenGLRenderer::FGLDebug::LabelObject + Line 21: EXTRN __CxxFrameHandler3:PROC + Line 22: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 23: EXTRN _ptrc_glBindSampler:QWORD + Line 24: EXTRN _ptrc_glDeleteSamplers:QWORD + Line 25: EXTRN _ptrc_glGenSamplers:QWORD + Line 26: EXTRN _ptrc_glSamplerParameterf:QWORD + Line 27: EXTRN _ptrc_glSamplerParameteri:QWORD + Line 28: EXTRN ?gl_texture_filter@@3VFIntCVar@@A:BYTE ; gl_texture_filter + Line 29: EXTRN ?gl_texture_filter_anisotropic@@3VFFloatCVar@@A:BYTE ; gl_texture_filter_anisotropic + Line 30: EXTRN ?vid_rendermode@@3VFIntCVar@@A:BYTE ; vid_rendermode + Line 31: EXTRN ?TexFilter@OpenGLRenderer@@3PAUTexFilter_s@1@A:BYTE ; OpenGLRenderer::TexFilter + Line 32: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\gl_scene.cod (51 hits) + Line 43: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 44: EXTRN atexit:PROC + Line 45: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 46: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 47: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 48: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 49: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 50: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 51: EXTRN ?R_SetupFrame@@YAXAEAUFRenderViewpoint@@AEAUFViewWindow@@PEAVAActor@@@Z:PROC ; R_SetupFrame + Line 52: EXTRN ?SetAttenuationForLevel@FLightDefaults@@SAX_N@Z:PROC ; FLightDefaults::SetAttenuationForLevel + Line 53: EXTRN ?PushGroup@FGLDebug@OpenGLRenderer@@SAXAEBVFString@@@Z:PROC ; OpenGLRenderer::FGLDebug::PushGroup + Line 54: EXTRN ?PopGroup@FGLDebug@OpenGLRenderer@@SAXXZ:PROC ; OpenGLRenderer::FGLDebug::PopGroup + Line 55: EXTRN ?Apply@FGLRenderState@OpenGLRenderer@@QEAAXXZ:PROC ; OpenGLRenderer::FGLRenderState::Apply + Line 56: EXTRN ?BindSceneFB@FGLRenderBuffers@OpenGLRenderer@@QEAAX_N@Z:PROC ; OpenGLRenderer::FGLRenderBuffers::BindSceneFB + Line 57: EXTRN ?BlitSceneToTexture@FGLRenderBuffers@OpenGLRenderer@@QEAAXXZ:PROC ; OpenGLRenderer::FGLRenderBuffers::BlitSceneToTexture + Line 58: EXTRN ?BlitToEyeTexture@FGLRenderBuffers@OpenGLRenderer@@QEAAXH@Z:PROC ; OpenGLRenderer::FGLRenderBuffers::BlitToEyeTexture + Line 59: EXTRN ?Bind@GLViewpointBuffer@@QEAAHAEAVFRenderState@@I@Z:PROC ; GLViewpointBuffer::Bind + Line 60: EXTRN ?StartDrawInfo@HWDrawInfo@@SAPEAU1@PEAUFLevelLocals@@PEAU1@AEAUFRenderViewpoint@@PEAUHWViewpointUniforms@@@Z:PROC ; HWDrawInfo::StartDrawInfo + Line 61: EXTRN ?EndDrawInfo@HWDrawInfo@@QEAAPEAU1@XZ:PROC ; HWDrawInfo::EndDrawInfo + Line 62: EXTRN ?SetViewArea@HWDrawInfo@@QEAAXXZ:PROC ; HWDrawInfo::SetViewArea + Line 63: EXTRN ?SetFullbrightFlags@HWDrawInfo@@QEAAHPEAVplayer_t@@@Z:PROC ; HWDrawInfo::SetFullbrightFlags + Line 64: EXTRN ?CreateScene@HWDrawInfo@@QEAAXXZ:PROC ; HWDrawInfo::CreateScene + Line 65: EXTRN ?RenderScene@HWDrawInfo@@QEAAXAEAVFRenderState@@@Z:PROC ; HWDrawInfo::RenderScene + Line 66: EXTRN ?RenderTranslucent@HWDrawInfo@@QEAAXAEAVFRenderState@@@Z:PROC ; HWDrawInfo::RenderTranslucent + Line 67: EXTRN ?EndDrawScene@HWDrawInfo@@QEAAXPEAUsector_t@@AEAVFRenderState@@@Z:PROC ; HWDrawInfo::EndDrawScene + Line 68: EXTRN ?DrawEndScene2D@HWDrawInfo@@QEAAXPEAUsector_t@@AEAVFRenderState@@@Z:PROC ; HWDrawInfo::DrawEndScene2D + Line 69: EXTRN ?Set3DViewport@HWDrawInfo@@QEAAXAEAVFRenderState@@@Z:PROC ; HWDrawInfo::Set3DViewport + Line 70: EXTRN ?ProcessScene@HWDrawInfo@@QEAAX_NAEBV?$function@$$A6AXPEAUHWDrawInfo@@H@Z@std@@@Z:PROC ; HWDrawInfo::ProcessScene + Line 71: EXTRN ?SetupView@HWDrawInfo@@QEAAXAEAVFRenderState@@MMM_N1@Z:PROC ; HWDrawInfo::SetupView + Line 72: EXTRN ?RenderFirstSkyPortal@FPortalSceneState@@QEAA_NHPEAUHWDrawInfo@@AEAVFRenderState@@@Z:PROC ; FPortalSceneState::RenderFirstSkyPortal + Line 73: EXTRN ?EndFrame@FPortalSceneState@@QEAAXPEAUHWDrawInfo@@AEAVFRenderState@@@Z:PROC ; FPortalSceneState::EndFrame + Line 74: EXTRN ?GetProjection@VREyeInfo@@QEBA?AVVSMatrix@@MMM@Z:PROC ; VREyeInfo::GetProjection + Line 75: EXTRN ?GetViewShift@VREyeInfo@@QEBA?AU?$TVector3@N@@M@Z:PROC ; VREyeInfo::GetViewShift + Line 76: EXTRN ?GetVRMode@VRMode@@SAPEBU1@_N@Z:PROC ; VRMode::GetVRMode + Line 77: EXTRN ?PostProcessScene@FGLRenderer@OpenGLRenderer@@QEAAXHAEBV?$function@$$A6AXXZ@std@@@Z:PROC ; OpenGLRenderer::FGLRenderer::PostProcessScene + Line 78: EXTRN ?AmbientOccludeScene@FGLRenderer@OpenGLRenderer@@QEAAXM@Z:PROC ; OpenGLRenderer::FGLRenderer::AmbientOccludeScene + Line 79: EXTRN ?UpdateShadowMap@FGLRenderer@OpenGLRenderer@@QEAAXXZ:PROC ; OpenGLRenderer::FGLRenderer::UpdateShadowMap + Line 80: EXTRN __CxxFrameHandler3:PROC + Line 81: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 82: EXTRN _ptrc_glDepthMask:QWORD + Line 83: EXTRN _ptrc_glViewport:QWORD + Line 84: EXTRN _ptrc_glDrawBuffers:QWORD + Line 85: EXTRN ?active@glcycle_t@@2_NA:BYTE ; glcycle_t::active + Line 86: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 87: EXTRN ?r_viewwindow@@3UFViewWindow@@A:BYTE ; r_viewwindow + Line 88: EXTRN ?PostProcess@@3Vglcycle_t@@A:QWORD ; PostProcess + Line 89: EXTRN ?gl_ssao@@3VFIntCVar@@A:BYTE ; gl_ssao + Line 90: EXTRN ?gl_ssao_portals@@3VFIntCVar@@A:BYTE ; gl_ssao_portals + Line 91: EXTRN ?gl_RenderState@OpenGLRenderer@@3VFGLRenderState@1@A:BYTE ; OpenGLRenderer::gl_RenderState + Line 92: EXTRN ?GLRenderer@OpenGLRenderer@@3PEAVFGLRenderer@1@EA:QWORD ; OpenGLRenderer::GLRenderer + Line 93: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\gl_shader.cod (71 hits) + Line 614: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 615: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 616: EXTRN atexit:PROC + Line 617: EXTRN __std_terminate:PROC + Line 618: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 619: EXTRN strstr:PROC + Line 620: EXTRN __std_exception_copy:PROC + Line 621: EXTRN __std_exception_destroy:PROC + Line 622: EXTRN ??_Eexception@std@@UEAAPEAXI@Z:PROC ; std::exception::`vector deleting destructor' + Line 623: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 624: EXTRN ??_Eruntime_error@std@@UEAAPEAXI@Z:PROC ; std::runtime_error::`vector deleting destructor' + Line 625: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 626: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 627: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 628: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 629: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 630: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 631: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 632: EXTRN ??H@YA?AVFString@@PEBDAEBV0@@Z:PROC ; operator+ + Line 633: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 634: EXTRN ?IndexOf@FString@@QEBAJPEBDJ@Z:PROC ; FString::IndexOf + Line 635: EXTRN ?Substitute@FString@@QEAAXPEBD0@Z:PROC ; FString::Substitute + Line 636: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 637: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 638: EXTRN mysnprintf:PROC + Line 639: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 640: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 641: EXTRN ?OpenFile@FileReader@@QEAA_NPEBD_J1@Z:PROC ; FileReader::OpenFile + Line 642: EXTRN ?Open@FileWriter@@SAPEAV1@PEBD@Z:PROC ; FileWriter::Open + Line 643: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 644: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 645: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForFullName + Line 646: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 647: EXTRN ?ExtractFileBase@@YA?AVFString@@PEBD_N@Z:PROC ; ExtractFileBase + Line 648: EXTRN ?CreatePath@@YAXPEBD@Z:PROC ; CreatePath + Line 649: EXTRN ?Init@MD5Context@@QEAAXXZ:PROC ; MD5Context::Init + Line 650: EXTRN ?Update@MD5Context@@QEAAXPEBEI@Z:PROC ; MD5Context::Update + Line 651: EXTRN ?Final@MD5Context@@QEAAXQEAE@Z:PROC ; MD5Context::Final + Line 652: EXTRN ?M_GetCachePath@@YA?AVFString@@_N@Z:PROC ; M_GetCachePath + Line 653: EXTRN ?RemoveLegacyUserUniforms@@YA?AVFString@@V1@@Z:PROC ; RemoveLegacyUserUniforms + Line 654: EXTRN ?LabelObject@FGLDebug@OpenGLRenderer@@SAXIIPEBD@Z:PROC ; OpenGLRenderer::FGLDebug::LabelObject + Line 655: EXTRN _CxxThrowException:PROC + Line 656: EXTRN __CxxFrameHandler3:PROC + Line 657: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 658: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 659: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 660: EXTRN _ptrc_glGetString:QWORD + Line 661: EXTRN _ptrc_glAttachShader:QWORD + Line 662: EXTRN _ptrc_glCompileShader:QWORD + Line 663: EXTRN _ptrc_glCreateProgram:QWORD + Line 664: EXTRN _ptrc_glCreateShader:QWORD + Line 665: EXTRN _ptrc_glDeleteProgram:QWORD + Line 666: EXTRN _ptrc_glDeleteShader:QWORD + Line 667: EXTRN _ptrc_glGetProgramInfoLog:QWORD + Line 668: EXTRN _ptrc_glGetProgramiv:QWORD + Line 669: EXTRN _ptrc_glGetShaderInfoLog:QWORD + Line 670: EXTRN _ptrc_glGetUniformLocation:QWORD + Line 671: EXTRN _ptrc_glLinkProgram:QWORD + Line 672: EXTRN _ptrc_glShaderSource:QWORD + Line 673: EXTRN _ptrc_glUniform1i:QWORD + Line 674: EXTRN _ptrc_glUseProgram:QWORD + Line 675: EXTRN _ptrc_glGetUniformBlockIndex:QWORD + Line 676: EXTRN _ptrc_glUniformBlockBinding:QWORD + Line 677: EXTRN _ptrc_glGetProgramBinary:QWORD + Line 678: EXTRN _ptrc_glProgramBinary:QWORD + Line 679: EXTRN ?usershaders@@3V?$TArray@UUserShaderDesc@@U1@@@A:BYTE ; usershaders + Line 680: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 681: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 682: EXTRN ?gl@@3URenderContext@@A:BYTE ; gl + Line 683: EXTRN ?GLRenderer@OpenGLRenderer@@3PEAVFGLRenderer@1@EA:QWORD ; OpenGLRenderer::GLRenderer + Line 684: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\gl_shaderprogram.cod (52 hits) + Line 42: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 43: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 44: EXTRN _purecall:PROC + Line 45: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 46: EXTRN __std_terminate:PROC + Line 47: EXTRN roundf:PROC + Line 48: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 49: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 50: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 51: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 52: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 53: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 54: EXTRN ??YFString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator+= + Line 55: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 56: EXTRN ?AppendFormat@FString@@QEAAXPEBDZZ:PROC ; FString::AppendFormat + Line 57: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 58: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 59: EXTRN ?LabelObject@FGLDebug@OpenGLRenderer@@SAXIIPEBD@Z:PROC ; OpenGLRenderer::FGLDebug::LabelObject + Line 60: EXTRN ??_EIShaderProgram@@UEAAPEAXI@Z:PROC ; IShaderProgram::`vector deleting destructor' + Line 61: EXTRN ??_EFShaderProgram@OpenGLRenderer@@UEAAPEAXI@Z:PROC ; OpenGLRenderer::FShaderProgram::`vector deleting destructor' + Line 62: EXTRN ?RemoveSamplerBindings@@YA?AVFString@@V1@AEAV?$TArray@U?$pair@VFString@@H@std@@U12@@@@Z:PROC ; RemoveSamplerBindings + Line 63: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 64: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForFullName + Line 65: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 66: EXTRN ?IsShaderCacheActive@OpenGLRenderer@@YA_NXZ:PROC ; OpenGLRenderer::IsShaderCacheActive + Line 67: EXTRN ?LoadCachedProgramBinary@OpenGLRenderer@@YA?AV?$TArray@EE@@AEBVFString@@0AEAI@Z:PROC ; OpenGLRenderer::LoadCachedProgramBinary + Line 68: EXTRN ?SaveCachedProgramBinary@OpenGLRenderer@@YAXAEBVFString@@0AEBV?$TArray@EE@@I@Z:PROC ; OpenGLRenderer::SaveCachedProgramBinary + Line 69: EXTRN __CxxFrameHandler3:PROC + Line 70: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 71: EXTRN _ptrc_glAttachShader:QWORD + Line 72: EXTRN _ptrc_glCompileShader:QWORD + Line 73: EXTRN _ptrc_glCreateProgram:QWORD + Line 74: EXTRN _ptrc_glCreateShader:QWORD + Line 75: EXTRN _ptrc_glDeleteProgram:QWORD + Line 76: EXTRN _ptrc_glDeleteShader:QWORD + Line 77: EXTRN _ptrc_glGetProgramInfoLog:QWORD + Line 78: EXTRN _ptrc_glGetProgramiv:QWORD + Line 79: EXTRN _ptrc_glGetShaderInfoLog:QWORD + Line 80: EXTRN _ptrc_glGetShaderiv:QWORD + Line 81: EXTRN _ptrc_glGetUniformLocation:QWORD + Line 82: EXTRN _ptrc_glLinkProgram:QWORD + Line 83: EXTRN _ptrc_glShaderSource:QWORD + Line 84: EXTRN _ptrc_glUniform1i:QWORD + Line 85: EXTRN _ptrc_glUseProgram:QWORD + Line 86: EXTRN _ptrc_glGetUniformBlockIndex:QWORD + Line 87: EXTRN _ptrc_glUniformBlockBinding:QWORD + Line 88: EXTRN _ptrc_glGetProgramBinary:QWORD + Line 89: EXTRN _ptrc_glProgramBinary:QWORD + Line 90: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 91: EXTRN ?gl@@3URenderContext@@A:BYTE ; gl + Line 92: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 93: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\gl_stereo3d.cod (26 hits) + Line 30: EXTRN ?BindOutputFB@FGLRenderBuffers@OpenGLRenderer@@QEAAXXZ:PROC ; OpenGLRenderer::FGLRenderBuffers::BindOutputFB + Line 31: EXTRN ?BindEyeTexture@FGLRenderBuffers@OpenGLRenderer@@QEAAXHH@Z:PROC ; OpenGLRenderer::FGLRenderBuffers::BindEyeTexture + Line 32: EXTRN ?ClearBorders@FGLRenderer@OpenGLRenderer@@QEAAXXZ:PROC ; OpenGLRenderer::FGLRenderer::ClearBorders + Line 33: EXTRN ?RenderScreenQuad@FGLRenderer@OpenGLRenderer@@QEAAXXZ:PROC ; OpenGLRenderer::FGLRenderer::RenderScreenQuad + Line 34: EXTRN ?DrawPresentTexture@FGLRenderer@OpenGLRenderer@@QEAAXAEBUIntRect@@_N@Z:PROC ; OpenGLRenderer::FGLRenderer::DrawPresentTexture + Line 35: EXTRN ??0FGLPostProcessState@OpenGLRenderer@@QEAA@XZ:PROC ; OpenGLRenderer::FGLPostProcessState::FGLPostProcessState + Line 36: EXTRN ??1FGLPostProcessState@OpenGLRenderer@@QEAA@XZ:PROC ; OpenGLRenderer::FGLPostProcessState::~FGLPostProcessState + Line 37: EXTRN ?SaveTextureBindings@FGLPostProcessState@OpenGLRenderer@@QEAAXI@Z:PROC ; OpenGLRenderer::FGLPostProcessState::SaveTextureBindings + Line 38: EXTRN __CxxFrameHandler3:PROC + Line 39: EXTRN _ptrc_glColorMask:QWORD + Line 40: EXTRN _ptrc_glDrawBuffer:QWORD + Line 41: EXTRN _ptrc_glGetBooleanv:QWORD + Line 42: EXTRN _ptrc_glTexParameteri:QWORD + Line 43: EXTRN _ptrc_glViewport:QWORD + Line 44: EXTRN _ptrc_glActiveTexture:QWORD + Line 45: EXTRN _ptrc_glBindFramebuffer:QWORD + Line 46: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 47: EXTRN ?Gamma@@3VFFloatCVar@@A:BYTE ; Gamma + Line 48: EXTRN ?vr_mode@@3VFIntCVar@@A:BYTE ; vr_mode + Line 49: EXTRN ?vid_saturation@@3VFFloatCVar@@A:BYTE ; vid_saturation + Line 50: EXTRN ?vid_brightness@@3VFFloatCVar@@A:BYTE ; vid_brightness + Line 51: EXTRN ?vid_contrast@@3VFFloatCVar@@A:BYTE ; vid_contrast + Line 52: EXTRN ?gl_satformula@@3VFIntCVar@@A:BYTE ; gl_satformula + Line 53: EXTRN ?gl_dither_bpc@@3VFIntCVar@@A:BYTE ; gl_dither_bpc + Line 54: EXTRN __ImageBase:BYTE + Line 55: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\gl_sysfb.cod (34 hits) + Line 12: EXTRN ?vid_vsync@@3VFBoolCVar@@A:BYTE ; vid_vsync + Line 63: EXTRN _purecall:PROC + Line 64: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 65: EXTRN atexit:PROC + Line 66: EXTRN strstr:PROC + Line 67: EXTRN __imp_wglGetProcAddress:PROC + Line 68: EXTRN __imp_SwapBuffers:PROC + Line 69: EXTRN __imp_GetDC:PROC + Line 70: EXTRN __imp_ReleaseDC:PROC + Line 71: EXTRN ?_Xbad_function_call@std@@YAXXZ:PROC ; std::_Xbad_function_call + Line 72: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 73: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 74: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 75: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 76: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 77: EXTRN ?Update@DFrameBuffer@@UEAAXXZ:PROC ; DFrameBuffer::Update + Line 78: EXTRN ?GetCaps@DFrameBuffer@@UEAAIXZ:PROC ; DFrameBuffer::GetCaps + Line 79: EXTRN ?WriteSavePic@DFrameBuffer@@UEAAXPEAVplayer_t@@PEAVFileWriter@@HH@Z:PROC ; DFrameBuffer::WriteSavePic + Line 80: EXTRN ?WipeStartScreen@DFrameBuffer@@UEAAPEAVFTexture@@XZ:PROC ; DFrameBuffer::WipeStartScreen + Line 81: EXTRN ?WipeEndScreen@DFrameBuffer@@UEAAPEAVFTexture@@XZ:PROC ; DFrameBuffer::WipeEndScreen + Line 82: EXTRN ?SetViewportRects@DFrameBuffer@@UEAAXPEAUIntRect@@@Z:PROC ; DFrameBuffer::SetViewportRects + Line 83: EXTRN ??0SystemBaseFrameBuffer@@QEAA@PEAX_N@Z:PROC ; SystemBaseFrameBuffer::SystemBaseFrameBuffer + Line 84: EXTRN ??1SystemBaseFrameBuffer@@UEAA@XZ:PROC ; SystemBaseFrameBuffer::~SystemBaseFrameBuffer + Line 85: EXTRN ?GetClientWidth@SystemBaseFrameBuffer@@UEAAHXZ:PROC ; SystemBaseFrameBuffer::GetClientWidth + Line 86: EXTRN ?GetClientHeight@SystemBaseFrameBuffer@@UEAAHXZ:PROC ; SystemBaseFrameBuffer::GetClientHeight + Line 87: EXTRN ?IsFullscreen@SystemBaseFrameBuffer@@UEAA_NXZ:PROC ; SystemBaseFrameBuffer::IsFullscreen + Line 88: EXTRN ?ToggleFullscreen@SystemBaseFrameBuffer@@UEAAX_N@Z:PROC ; SystemBaseFrameBuffer::ToggleFullscreen + Line 89: EXTRN ?SetWindowSize@SystemBaseFrameBuffer@@UEAAXHH@Z:PROC ; SystemBaseFrameBuffer::SetWindowSize + Line 90: EXTRN ??_ESystemGLFrameBuffer@@UEAAPEAXI@Z:PROC ; SystemGLFrameBuffer::`vector deleting destructor' + Line 91: EXTRN ?I_FPSLimit@@YAXXZ:PROC ; I_FPSLimit + Line 92: EXTRN ?InitHardware@Win32GLVideo@@QEAA_NPEAUHWND__@@H@Z:PROC ; Win32GLVideo::InitHardware + Line 93: EXTRN __CxxFrameHandler3:PROC + Line 94: EXTRN ?Video@@3PEAVIVideo@@EA:QWORD ; Video + Line 95: EXTRN ?Window@@3PEAUHWND__@@EA:QWORD ; Window + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\gldefs.cod (72 hits) + Line 312: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 313: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 314: EXTRN atexit:PROC + Line 315: EXTRN _Init_thread_header:PROC + Line 316: EXTRN _Init_thread_footer:PROC + Line 317: EXTRN __std_terminate:PROC + Line 318: EXTRN strstr:PROC + Line 319: EXTRN strncpy:PROC + Line 320: EXTRN stricmp:PROC + Line 321: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 322: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 323: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 324: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 325: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_K_N@Z:PROC ; FName::NameManager::FindName + Line 326: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 327: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 328: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 329: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 330: EXTRN ?ToUpper@FString@@QEAAXXZ:PROC ; FString::ToUpper + Line 331: EXTRN ?ToLower@FString@@QEAAXXZ:PROC ; FString::ToLower + Line 332: EXTRN ?AppendFormat@FString@@QEAAXPEBDZZ:PROC ; FString::AppendFormat + Line 333: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 334: EXTRN ?SuperFastHash@@YAIPEBD_K@Z:PROC ; SuperFastHash + Line 335: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 336: EXTRN ??0FScanner@@QEAA@H@Z:PROC ; FScanner::FScanner + Line 337: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 338: EXTRN ?SetCMode@FScanner@@QEAAX_N@Z:PROC ; FScanner::SetCMode + Line 339: EXTRN ?SavePos@FScanner@@QEAA?BUSavedPos@1@XZ:PROC ; FScanner::SavePos + Line 340: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 341: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 342: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 343: EXTRN ?CheckString@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::CheckString + Line 344: EXTRN ?GetToken@FScanner@@QEAA_NXZ:PROC ; FScanner::GetToken + Line 345: EXTRN ?MustGetToken@FScanner@@QEAAXH@Z:PROC ; FScanner::MustGetToken + Line 346: EXTRN ?CheckToken@FScanner@@QEAA_NH@Z:PROC ; FScanner::CheckToken + Line 347: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 348: EXTRN ?CheckNumber@FScanner@@QEAA_NXZ:PROC ; FScanner::CheckNumber + Line 349: EXTRN ?MustGetFloat@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetFloat + Line 350: EXTRN ?CheckFloat@FScanner@@QEAA_NXZ:PROC ; FScanner::CheckFloat + Line 351: EXTRN ?UnGet@FScanner@@QEAAXXZ:PROC ; FScanner::UnGet + Line 352: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 353: EXTRN ?MatchString@FScanner@@QEAAHPEBQEBD_K@Z:PROC ; FScanner::MatchString + Line 354: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 355: EXTRN ?ScriptMessage@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptMessage + Line 356: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 357: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 358: EXTRN ?FindLumpMulti@FWadCollection@@QEAAHPEAPEBDPEAH_N1@Z:PROC ; FWadCollection::FindLumpMulti + Line 359: EXTRN ?GetLumpFile@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpFile + Line 360: EXTRN ?FindTexture@FTextureManager@@QEAAPEAVFTexture@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::FindTexture + Line 361: EXTRN ?CheckForTexture@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::CheckForTexture + Line 362: EXTRN ?GetTextureID@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::GetTextureID + Line 363: EXTRN ?AddTexture@FTextureManager@@QEAA?AVFTextureID@@PEAVFTexture@@@Z:PROC ; FTextureManager::AddTexture + Line 364: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 365: EXTRN ?V_GetColor@@YAHPEBIPEBDPEAUFScriptPosition@@@Z:PROC ; V_GetColor + Line 366: EXTRN ??0FLightDefaults@@QEAA@VFName@@W4ELightType@@@Z:PROC ; FLightDefaults::FLightDefaults + Line 367: EXTRN ??0FSkyBox@@QEAA@PEBD@Z:PROC ; FSkyBox::FSkyBox + Line 368: EXTRN ?AddLightDefaults@@YAXPEAVFLightDefaults@@N@Z:PROC ; AddLightDefaults + Line 369: EXTRN ?InitializeActorLights@@YAXAEAV?$TArray@VFLightAssociation@@V1@@@@Z:PROC ; InitializeActorLights + Line 370: EXTRN __CxxFrameHandler3:PROC + Line 371: EXTRN _Init_thread_epoch:DWORD + Line 372: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 373: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 374: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 375: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 376: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 377: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 378: EXTRN ?PostProcessShaders@@3V?$TArray@UPostProcessShader@@U1@@@A:BYTE ; PostProcessShaders + Line 379: EXTRN ?LightDefaults@@3V?$TDeletingArray@PEAVFLightDefaults@@PEAV1@@@A:BYTE ; LightDefaults + Line 380: EXTRN ?AttenuationIsSet@@3HA:DWORD ; AttenuationIsSet + Line 381: EXTRN __ImageBase:BYTE + Line 382: EXTRN _fltused:DWORD + Line 383: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\glnodes.cod (67 hits) + Line 16: EXTRN ?IsAlias@FConsoleCommand@@UEAA_NXZ:PROC ; FConsoleCommand::IsAlias + Line 17: EXTRN ?Run@FUnsafeConsoleCommand@@UEAAXAEAVFCommandLine@@PEAVAActor@@H@Z:PROC ; FUnsafeConsoleCommand::Run + Line 18: EXTRN ??_EFUnsafeConsoleCommand@@UEAAPEAXI@Z:PROC ; FUnsafeConsoleCommand::`vector deleting destructor' + Line 19: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 115: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 116: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 117: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 118: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 119: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 120: EXTRN atexit:PROC + Line 121: EXTRN __std_terminate:PROC + Line 122: EXTRN remove:PROC + Line 123: EXTRN strrchr:PROC + Line 124: EXTRN strncpy:PROC + Line 125: EXTRN strnicmp:PROC + Line 126: EXTRN compress:PROC + Line 127: EXTRN _rmdir:PROC + Line 128: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 129: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 130: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 131: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 132: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 133: EXTRN ??YFString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator+= + Line 134: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 135: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 136: EXTRN ?Left@FString@@QEBA?AV1@_K@Z:PROC ; FString::Left + Line 137: EXTRN ?Right@FString@@QEBA?AV1@_K@Z:PROC ; FString::Right + Line 138: EXTRN ?IndexOf@FString@@QEBAJDJ@Z:PROC ; FString::IndexOf + Line 139: EXTRN ?ReplaceChars@FString@@QEAAXDD@Z:PROC ; FString::ReplaceChars + Line 140: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 141: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 142: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 143: EXTRN c_sqrt:PROC + Line 144: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 145: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 146: EXTRN ?OpenFile@FileReader@@QEAA_NPEBD_J1@Z:PROC ; FileReader::OpenFile + Line 147: EXTRN ?Open@FileWriter@@SAPEAV1@PEBD@Z:PROC ; FileWriter::Open + Line 148: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 149: EXTRN ?GetWadFullName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetWadFullName + Line 150: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDHH_N@Z:PROC ; FWadCollection::CheckNumForName + Line 151: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 152: EXTRN ?ReopenLumpReader@FWadCollection@@QEAA?AVFileReader@@H_N@Z:PROC ; FWadCollection::ReopenLumpReader + Line 153: EXTRN ?FindLump@FWadCollection@@QEAAHPEBDPEAH_N@Z:PROC ; FWadCollection::FindLump + Line 154: EXTRN ?GetLumpFullName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetLumpFullName + Line 155: EXTRN ?GetLumpFullPath@FWadCollection@@QEBA?AVFString@@H@Z:PROC ; FWadCollection::GetLumpFullPath + Line 156: EXTRN ?GetLumpFile@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpFile + Line 157: EXTRN ?FindMapBounds@FLevel@FNodeBuilder@@QEAAXXZ:PROC ; FNodeBuilder::FLevel::FindMapBounds + Line 158: EXTRN ??0FNodeBuilder@@QEAA@AEAUFLevel@0@AEAV?$TArray@UFPolyStart@FNodeBuilder@@U12@@@1_N@Z:PROC ; FNodeBuilder::FNodeBuilder + Line 159: EXTRN ??1FNodeBuilder@@QEAA@XZ:PROC ; FNodeBuilder::~FNodeBuilder + Line 160: EXTRN ?Extract@FNodeBuilder@@QEAAXAEAUFLevelLocals@@@Z:PROC ; FNodeBuilder::Extract + Line 161: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 162: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 163: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 164: EXTRN ?OpenResourceFile@FResourceFile@@SAPEAV1@PEBD_N1@Z:PROC ; FResourceFile::OpenResourceFile + Line 165: EXTRN ?GetChecksum@MapData@@QEAAXQEAE@Z:PROC ; MapData::GetChecksum + Line 166: EXTRN ?M_GetCachePath@@YA?AVFString@@_N@Z:PROC ; M_GetCachePath + Line 167: EXTRN ?CreatePath@@YAXPEBD@Z:PROC ; CreatePath + Line 168: EXTRN ?ScanDirectory@@YAXAEAV?$TArray@UFFileList@@U1@@@PEBD@Z:PROC ; ScanDirectory + Line 169: EXTRN ?I_msTime@@YA_KXZ:PROC ; I_msTime + Line 170: EXTRN ?LoadExtendedNodes@MapLoader@@QEAA_NAEAVFileReader@@I@Z:PROC ; MapLoader::LoadExtendedNodes + Line 171: EXTRN ?GetPolySpots@MapLoader@@QEAAXPEAUMapData@@AEAV?$TArray@UFPolyStart@FNodeBuilder@@U12@@@1@Z:PROC ; MapLoader::GetPolySpots + Line 172: EXTRN __CxxFrameHandler3:PROC + Line 173: EXTRN memmove:PROC + Line 174: EXTRN memset:PROC + Line 175: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 176: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 177: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\gus_pat.cod (11 hits) + Line 35: EXTRN _errno:PROC + Line 36: EXTRN calloc:PROC + Line 37: EXTRN free:PROC + Line 38: EXTRN malloc:PROC + Line 39: EXTRN strerror:PROC + Line 40: EXTRN ?_WM_ERROR_NEW@@YAXPEBDZZ:PROC ; _WM_ERROR_NEW + Line 41: EXTRN ?_WM_ERROR@@YAXPEBDIH0H@Z:PROC ; _WM_ERROR + Line 42: EXTRN ?_WM_BufferFile@@YAPEAEPEBDPEAK@Z:PROC ; _WM_BufferFile + Line 43: EXTRN memcmp:PROC + Line 44: EXTRN ?_WM_SampleRate@@3GA:WORD ; _WM_SampleRate + Line 45: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hardware.cod (26 hits) + Line 73: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 74: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 75: EXTRN atexit:PROC + Line 76: EXTRN __imp_CloseHandle:PROC + Line 77: EXTRN __imp_WaitForSingleObject:PROC + Line 78: EXTRN __imp_CreateEventA:PROC + Line 79: EXTRN __imp_SetFocus:PROC + Line 80: EXTRN __imp_GetActiveWindow:PROC + Line 81: EXTRN __imp_GetFocus:PROC + Line 82: EXTRN __imp_SetForegroundWindow:PROC + Line 83: EXTRN __imp_timeSetEvent:PROC + Line 84: EXTRN __imp_timeKillEvent:PROC + Line 85: EXTRN putenv:PROC + Line 86: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 87: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 88: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 89: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 90: EXTRN ?atterm@@YAXP6AXXZ@Z:PROC ; atterm + Line 91: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 92: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 93: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 94: EXTRN ??0Win32GLVideo@@QEAA@XZ:PROC ; Win32GLVideo::Win32GLVideo + Line 95: EXTRN __CxxFrameHandler3:PROC + Line 96: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 97: EXTRN ?vid_maxfps@@3VFIntCVar@@A:BYTE ; vid_maxfps + Line 98: EXTRN ?Window@@3PEAUHWND__@@EA:QWORD ; Window + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\helperthread.cod (17 hits) + Line 21: EXTRN _purecall:PROC + Line 22: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 23: EXTRN __imp_CloseHandle:PROC + Line 24: EXTRN __imp_InitializeCriticalSection:PROC + Line 25: EXTRN __imp_EnterCriticalSection:PROC + Line 26: EXTRN __imp_LeaveCriticalSection:PROC + Line 27: EXTRN __imp_DeleteCriticalSection:PROC + Line 28: EXTRN __imp_SetEvent:PROC + Line 29: EXTRN __imp_ResetEvent:PROC + Line 30: EXTRN __imp_WaitForSingleObject:PROC + Line 31: EXTRN __imp_CreateEventA:PROC + Line 32: EXTRN __imp_WaitForMultipleObjects:PROC + Line 33: EXTRN __imp_CreateThread:PROC + Line 34: EXTRN __imp_ExitThread:PROC + Line 35: EXTRN __imp_MsgWaitForMultipleObjects:PROC + Line 36: EXTRN ??_EFHelperThread@@UEAAPEAXI@Z:PROC ; FHelperThread::`vector deleting destructor' + Line 37: EXTRN memset:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hirestex.cod (24 hits) + Line 93: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 94: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 95: EXTRN strstr:PROC + Line 96: EXTRN stricmp:PROC + Line 97: EXTRN _access:PROC + Line 98: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 99: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 100: EXTRN ?IndexOf@FString@@QEBAJPEBDJ@Z:PROC ; FString::IndexOf + Line 101: EXTRN ?ToLower@FString@@QEAAXXZ:PROC ; FString::ToLower + Line 102: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 103: EXTRN ?GetWadFullName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetWadFullName + Line 104: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 105: EXTRN ?AddExternalFile@FWadCollection@@QEAAHPEBD@Z:PROC ; FWadCollection::AddExternalFile + Line 106: EXTRN ?CreateTexture@FTexture@@SAPEAV1@PEBDHW4ETextureType@@@Z:PROC ; FTexture::CreateTexture + Line 107: EXTRN ?CheckTrans@FTexture@@QEAAXPEAEHH@Z:PROC ; FTexture::CheckTrans + Line 108: EXTRN ?AddTexture@FTextureManager@@QEAA?AVFTextureID@@PEAVFTexture@@@Z:PROC ; FTextureManager::AddTexture + Line 109: EXTRN ?CopyPixelDataRGB@FBitmap@@QEAAXHHPEBEHHHHHHPEAUFCopyInfo@@HHH@Z:PROC ; FBitmap::CopyPixelDataRGB + Line 110: EXTRN __CxxFrameHandler3:PROC + Line 111: EXTRN memset:PROC + Line 112: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 113: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 114: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 115: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 116: EXTRN ?progdir@@3VFString@@A:QWORD ; progdir + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hq2x.cod (2 hits) + Line 10: EXTRN ?RGBtoYUV@@3PEAIEA:QWORD ; RGBtoYUV + Line 11: EXTRN __ImageBase:BYTE + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hq2x_asm.cod (3 hits) + Line 19: EXTRN ?Diff@HQnX_asm@@YA_NII@Z:PROC ; HQnX_asm::Diff + Line 20: EXTRN ?LUT16to32@HQnX_asm@@3PAHA:BYTE ; HQnX_asm::LUT16to32 + Line 21: EXTRN __ImageBase:BYTE + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hq3x.cod (2 hits) + Line 10: EXTRN ?RGBtoYUV@@3PEAIEA:QWORD ; RGBtoYUV + Line 11: EXTRN __ImageBase:BYTE + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hq3x_asm.cod (3 hits) + Line 16: EXTRN ?Diff@HQnX_asm@@YA_NII@Z:PROC ; HQnX_asm::Diff + Line 17: EXTRN ?LUT16to32@HQnX_asm@@3PAHA:BYTE ; HQnX_asm::LUT16to32 + Line 18: EXTRN __ImageBase:BYTE + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hq4x.cod (2 hits) + Line 10: EXTRN ?RGBtoYUV@@3PEAIEA:QWORD ; RGBtoYUV + Line 11: EXTRN __ImageBase:BYTE + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hq4x_asm.cod (5 hits) + Line 32: EXTRN _Init_thread_header:PROC + Line 33: EXTRN _Init_thread_footer:PROC + Line 34: EXTRN _Init_thread_epoch:DWORD + Line 35: EXTRN __ImageBase:BYTE + Line 36: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hqnx_asm_Image.cod (3 hits) + Line 14: EXTRN free:PROC + Line 15: EXTRN malloc:PROC + Line 16: EXTRN memcpy:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hqresize.cod (58 hits) + Line 18: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 129: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 130: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 131: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 132: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 133: EXTRN atexit:PROC + Line 134: EXTRN __std_terminate:PROC + Line 135: EXTRN free:PROC + Line 136: EXTRN malloc:PROC + Line 137: EXTRN __std_exception_copy:PROC + Line 138: EXTRN __std_exception_destroy:PROC + Line 139: EXTRN ??_Eexception@std@@UEAAPEAXI@Z:PROC ; std::exception::`vector deleting destructor' + Line 140: EXTRN ??_Ebad_alloc@std@@UEAAPEAXI@Z:PROC ; std::bad_alloc::`vector deleting destructor' + Line 141: EXTRN ??_Elogic_error@std@@UEAAPEAXI@Z:PROC ; std::logic_error::`vector deleting destructor' + Line 142: EXTRN ??_Einvalid_argument@std@@UEAAPEAXI@Z:PROC ; std::invalid_argument::`vector deleting destructor' + Line 143: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 144: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 145: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 146: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 147: EXTRN ??0FFlagCVar@@QEAA@PEBDAEAVFIntCVar@@I@Z:PROC ; FFlagCVar::FFlagCVar + Line 148: EXTRN ?FlushAll@FTextureManager@@QEAAXXZ:PROC ; FTextureManager::FlushAll + Line 149: EXTRN ?hqxInit@@YAXXZ:PROC ; hqxInit + Line 150: EXTRN ?hq2x_32@@YAXPEAI0HH@Z:PROC ; hq2x_32 + Line 151: EXTRN ?hq3x_32@@YAXPEAI0HH@Z:PROC ; hq3x_32 + Line 152: EXTRN ?hq4x_32@@YAXPEAI0HH@Z:PROC ; hq4x_32 + Line 153: EXTRN ??0CImage@HQnX_asm@@QEAA@XZ:PROC ; HQnX_asm::CImage::CImage + Line 154: EXTRN ??1CImage@HQnX_asm@@QEAA@XZ:PROC ; HQnX_asm::CImage::~CImage + Line 155: EXTRN ?SetImage@CImage@HQnX_asm@@QEAAHPEAEHHH@Z:PROC ; HQnX_asm::CImage::SetImage + Line 156: EXTRN ?Convert32To17@CImage@HQnX_asm@@QEAAHXZ:PROC ; HQnX_asm::CImage::Convert32To17 + Line 157: EXTRN ?hq2x_32@HQnX_asm@@YAXPEAHPEAEHHH@Z:PROC ; HQnX_asm::hq2x_32 + Line 158: EXTRN ?hq3x_32@HQnX_asm@@YAXPEAHPEAEHHH@Z:PROC ; HQnX_asm::hq3x_32 + Line 159: EXTRN ?hq4x_32@HQnX_asm@@YAXPEAHPEAEHHH@Z:PROC ; HQnX_asm::hq4x_32 + Line 160: EXTRN ?InitLUTs@HQnX_asm@@YAXXZ:PROC ; HQnX_asm::InitLUTs + Line 161: EXTRN ?scale@xbrz@@YAX_KPEBIPEAIHHW4ColorFormat@1@AEBUScalerCfg@1@HH@Z:PROC ; xbrz::scale + Line 162: EXTRN ?scale@xbrz_old@@YAX_KPEBIPEAIHHAEBUScalerCfg@1@HH@Z:PROC ; xbrz_old::scale + Line 163: EXTRN ?Free@Concurrency@@YAXPEAX@Z:PROC ; Concurrency::Free + Line 164: EXTRN ?_CurrentContext@_Context@details@Concurrency@@SA?AV123@XZ:PROC ; Concurrency::details::_Context::_CurrentContext + Line 165: EXTRN ?_Yield@_Context@details@Concurrency@@SAXXZ:PROC ; Concurrency::details::_Context::_Yield + Line 166: EXTRN ?_IsSynchronouslyBlocked@_Context@details@Concurrency@@QEBA_NXZ:PROC ; Concurrency::details::_Context::_IsSynchronouslyBlocked + Line 167: EXTRN ?_GetNumberOfVirtualProcessors@_CurrentScheduler@details@Concurrency@@SAIXZ:PROC ; Concurrency::details::_CurrentScheduler::_GetNumberOfVirtualProcessors + Line 168: EXTRN ?_Value@_SpinCount@details@Concurrency@@SAIXZ:PROC ; Concurrency::details::_SpinCount::_Value + Line 169: EXTRN ?_UnderlyingYield@details@Concurrency@@YAXXZ:PROC ; Concurrency::details::_UnderlyingYield + Line 170: EXTRN ??_E_Chore@details@Concurrency@@MEAAPEAXI@Z:PROC ; Concurrency::details::_Chore::`vector deleting destructor' + Line 171: EXTRN ?_CheckTaskCollection@_UnrealizedChore@details@Concurrency@@IEAAXXZ:PROC ; Concurrency::details::_UnrealizedChore::_CheckTaskCollection + Line 172: EXTRN ??_E_UnrealizedChore@details@Concurrency@@UEAAPEAXI@Z:PROC ; Concurrency::details::_UnrealizedChore::`vector deleting destructor' + Line 173: EXTRN ??1_StructuredTaskCollection@details@Concurrency@@QEAA@XZ:PROC ; Concurrency::details::_StructuredTaskCollection::~_StructuredTaskCollection + Line 174: EXTRN ?_Schedule@_StructuredTaskCollection@details@Concurrency@@QEAAXPEAV_UnrealizedChore@23@@Z:PROC ; Concurrency::details::_StructuredTaskCollection::_Schedule + Line 175: EXTRN ?_RunAndWait@_StructuredTaskCollection@details@Concurrency@@QEAA?AW4_TaskCollectionStatus@23@PEAV_UnrealizedChore@23@@Z:PROC ; Concurrency::details::_StructuredTaskCollection::_RunAndWait + Line 176: EXTRN ??0_Cancellation_beacon@details@Concurrency@@QEAA@XZ:PROC ; Concurrency::details::_Cancellation_beacon::_Cancellation_beacon + Line 177: EXTRN ??1_Cancellation_beacon@details@Concurrency@@QEAA@XZ:PROC ; Concurrency::details::_Cancellation_beacon::~_Cancellation_beacon + Line 178: EXTRN ?_Confirm_cancel@_Cancellation_beacon@details@Concurrency@@QEAA_NXZ:PROC ; Concurrency::details::_Cancellation_beacon::_Confirm_cancel + Line 179: EXTRN ?_Trace_ppl_function@Concurrency@@YAXAEBU_GUID@@EW4ConcRT_EventType@1@@Z:PROC ; Concurrency::_Trace_ppl_function + Line 180: EXTRN _CxxThrowException:PROC + Line 181: EXTRN __CxxFrameHandler3:PROC + Line 182: EXTRN __chkstk:PROC + Line 183: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 184: EXTRN ?PPLParallelForEventGuid@Concurrency@@3U_GUID@@B:BYTE ; Concurrency::PPLParallelForEventGuid + Line 185: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hu_scores.cod (48 hits) + Line 113: EXTRN atexit:PROC + Line 114: EXTRN qsort:PROC + Line 115: EXTRN stricmp:PROC + Line 116: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 117: EXTRN mysnprintf:PROC + Line 118: EXTRN ?IsValidTeam@FTeam@@QEAA_NI@Z:PROC ; FTeam::IsValidTeam + Line 119: EXTRN ?GetTextColor@FTeam@@QEBAHXZ:PROC ; FTeam::GetTextColor + Line 120: EXTRN ?GetLogo@FTeam@@QEBA?AVFString@@XZ:PROC ; FTeam::GetLogo + Line 121: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 122: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 123: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 124: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 125: EXTRN ?HSVtoRGB@@YAXPEAM00MMM@Z:PROC ; HSVtoRGB + Line 126: EXTRN ?GetTextureID@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::GetTextureID + Line 127: EXTRN ?Dim@DFrameBuffer@@QEAAXUPalEntry@@MHHHHPEATFRenderStyle@@@Z:PROC ; DFrameBuffer::Dim + Line 128: EXTRN ?Clear@DFrameBuffer@@QEAAXHHHHHI@Z:PROC ; DFrameBuffer::Clear + Line 129: EXTRN ?DrawTexture@DFrameBuffer@@QEAAXPEAVFTexture@@NNHZZ:PROC ; DFrameBuffer::DrawTexture + Line 130: EXTRN ?DrawText@DFrameBuffer@@QEAAXPEAVFFont@@HNNPEBDHZZ:PROC ; DFrameBuffer::DrawText + Line 131: EXTRN ?D_GetPlayerColor@@YAXHPEAM00PEAPEAUFPlayerColorSet@@@Z:PROC ; D_GetPlayerColor + Line 132: EXTRN ?StringWidth@FFont@@QEBAHPEBE@Z:PROC ; FFont::StringWidth + Line 133: EXTRN ??RFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator() + Line 134: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 135: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 136: EXTRN __CxxFrameHandler3:PROC + Line 137: EXTRN ?TeamLibrary@@3VFTeam@@A:BYTE ; TeamLibrary + Line 138: EXTRN ?Teams@@3V?$TArray@VFTeam@@V1@@@A:BYTE ; Teams + Line 139: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 140: EXTRN ?CleanXfac@@3HA:DWORD ; CleanXfac + Line 141: EXTRN ?CleanYfac@@3HA:DWORD ; CleanYfac + Line 142: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 143: EXTRN ?multiplayer@@3_NA:BYTE ; multiplayer + Line 144: EXTRN ?deathmatch@@3VFIntCVar@@A:BYTE ; deathmatch + Line 145: EXTRN ?teamplay@@3VFBoolCVar@@A:BYTE ; teamplay + Line 146: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 147: EXTRN ?demoplayback@@3_NA:BYTE ; demoplayback + Line 148: EXTRN ?playeringame@@3PA_NA:BYTE ; playeringame + Line 149: EXTRN ?SmallFont@@3PEAVFFont@@EA:QWORD ; SmallFont + Line 150: EXTRN ?BigFont@@3PEAVFFont@@EA:QWORD ; BigFont + Line 151: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 152: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 153: EXTRN ?netdelay@@3PAY0CE@HA:BYTE ; netdelay + Line 154: EXTRN ?nodeforplayer@@3PAHA:BYTE ; nodeforplayer + Line 155: EXTRN ?ticdup@@3HA:DWORD ; ticdup + Line 156: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 157: EXTRN ?gamestate@@3W4gamestate_t@@A:DWORD ; gamestate + Line 158: EXTRN ?StatusBar@@3PEAVDBaseStatusBar@@EA:QWORD ; StatusBar + Line 159: EXTRN ?timelimit@@3VFFloatCVar@@A:BYTE ; timelimit + Line 160: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hudmessages.cod (42 hits) + Line 39: EXTRN ?RegistrationInfo@DObject@@2UClassReg@@A:BYTE ; DObject::RegistrationInfo + Line 249: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 250: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 251: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 252: EXTRN __std_terminate:PROC + Line 253: EXTRN modff:PROC + Line 254: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 255: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 256: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 257: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 258: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 259: EXTRN ??1DObject@@UEAA@XZ:PROC ; DObject::~DObject + Line 260: EXTRN ?Serialize@DObject@@UEAAXAEAVFSerializer@@@Z:PROC ; DObject::Serialize + Line 261: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 262: EXTRN ?PropagateMark@DObject@@UEAA_KXZ:PROC ; DObject::PropagateMark + Line 263: EXTRN ?V_BreakLines@@YA?AV?$TArray@UFBrokenLines@@U1@@@PEAVFFont@@HPEBE_N@Z:PROC ; V_BreakLines + Line 264: EXTRN ??_EDHUDMessageBase@@UEAAPEAXI@Z:PROC ; DHUDMessageBase::`vector deleting destructor' + Line 265: EXTRN ??_EDHUDMessage@@UEAAPEAXI@Z:PROC ; DHUDMessage::`vector deleting destructor' + Line 266: EXTRN ??_EDHUDMessageFadeOut@@UEAAPEAXI@Z:PROC ; DHUDMessageFadeOut::`vector deleting destructor' + Line 267: EXTRN ??_EDHUDMessageFadeInOut@@UEAAPEAXI@Z:PROC ; DHUDMessageFadeInOut::`vector deleting destructor' + Line 268: EXTRN ??_EDHUDMessageTypeOnFadeOut@@UEAAPEAXI@Z:PROC ; DHUDMessageTypeOnFadeOut::`vector deleting destructor' + Line 269: EXTRN ?VirtualToRealCoordsInt@DFrameBuffer@@QEBAXAEAH000HH_N1@Z:PROC ; DFrameBuffer::VirtualToRealCoordsInt + Line 270: EXTRN ?DrawText@DFrameBuffer@@QEAAXPEAVFFont@@HNNPEBDHZZ:PROC ; DFrameBuffer::DrawText + Line 271: EXTRN ?GetUIScale@@YAHH@Z:PROC ; GetUIScale + Line 272: EXTRN ?copystring@@YAPEADPEBD@Z:PROC ; copystring + Line 273: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEA_NPEA_N@Z:PROC ; Serialize + Line 274: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 275: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAIPEAI@Z:PROC ; Serialize + Line 276: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEANPEAN@Z:PROC ; Serialize + Line 277: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAMPEAM@Z:PROC ; Serialize + Line 278: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 279: EXTRN ??$Serialize@D@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEADPEAPEAD@Z:PROC ; Serialize + Line 280: EXTRN ??$Serialize@VFFont@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAVFFont@@PEAPEAV1@@Z:PROC ; Serialize + Line 281: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEATFRenderStyle@@PEAT2@@Z:PROC ; Serialize + Line 282: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 283: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 284: EXTRN ?GetVirtualIndex@@YAIPEAVPClass@@PEBD@Z:PROC ; GetVirtualIndex + Line 285: EXTRN __CxxFrameHandler3:PROC + Line 286: EXTRN ?LegacyRenderStyles@@3PATFRenderStyle@@A:BYTE ; LegacyRenderStyles + Line 287: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 288: EXTRN ?con_scaletext@@3VFIntCVar@@A:BYTE ; con_scaletext + Line 289: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_aabbtree.cod (6 hits) + Line 32: EXTRN __std_terminate:PROC + Line 33: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 34: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 35: EXTRN __CxxFrameHandler3:PROC + Line 36: EXTRN memmove:PROC + Line 37: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_bsp.cod (93 hits) + Line 22: EXTRN ??_E?$_Ref_count_obj@U?$atomic@_N@std@@@std@@UEAAPEAXI@Z:PROC ; std::_Ref_count_obj >::`vector deleting destructor' + Line 198: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 199: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 200: EXTRN atexit:PROC + Line 201: EXTRN __std_terminate:PROC + Line 202: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 203: EXTRN terminate:PROC + Line 204: EXTRN __std_exception_copy:PROC + Line 205: EXTRN __std_exception_destroy:PROC + Line 206: EXTRN ??_Eexception@std@@UEAAPEAXI@Z:PROC ; std::exception::`vector deleting destructor' + Line 207: EXTRN ?__ExceptionPtrCreate@@YAXPEAX@Z:PROC ; __ExceptionPtrCreate + Line 208: EXTRN ?__ExceptionPtrDestroy@@YAXPEAX@Z:PROC ; __ExceptionPtrDestroy + Line 209: EXTRN ?__ExceptionPtrCopy@@YAXPEAXPEBX@Z:PROC ; __ExceptionPtrCopy + Line 210: EXTRN ?__ExceptionPtrAssign@@YAXPEAXPEBX@Z:PROC ; __ExceptionPtrAssign + Line 211: EXTRN ?__ExceptionPtrToBool@@YA_NPEBX@Z:PROC ; __ExceptionPtrToBool + Line 212: EXTRN ?__ExceptionPtrCurrentException@@YAXPEAX@Z:PROC ; __ExceptionPtrCurrentException + Line 213: EXTRN ?__ExceptionPtrCopyException@@YAXPEAXPEBX1@Z:PROC ; __ExceptionPtrCopyException + Line 214: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 215: EXTRN ??_Elogic_error@std@@UEAAPEAXI@Z:PROC ; std::logic_error::`vector deleting destructor' + Line 216: EXTRN ?_Execute_once@std@@YAHAEAUonce_flag@1@P6AHPEAX1PEAPEAX@Z1@Z:PROC ; std::_Execute_once + Line 217: EXTRN ?_Syserror_map@std@@YAPEBDH@Z:PROC ; std::_Syserror_map + Line 218: EXTRN ??_E_Generic_error_category@std@@UEAAPEAXI@Z:PROC ; std::_Generic_error_category::`vector deleting destructor' + Line 219: EXTRN ?_Xbad_function_call@std@@YAXXZ:PROC ; std::_Xbad_function_call + Line 220: EXTRN _Thrd_start:PROC + Line 221: EXTRN _Thrd_detach:PROC + Line 222: EXTRN _Thrd_join:PROC + Line 223: EXTRN _Thrd_id:PROC + Line 224: EXTRN _Mtx_init:PROC + Line 225: EXTRN _Mtx_destroy:PROC + Line 226: EXTRN _Mtx_init_in_situ:PROC + Line 227: EXTRN _Mtx_destroy_in_situ:PROC + Line 228: EXTRN _Mtx_lock:PROC + Line 229: EXTRN _Mtx_unlock:PROC + Line 230: EXTRN _Cnd_init:PROC + Line 231: EXTRN _Cnd_destroy:PROC + Line 232: EXTRN _Cnd_init_in_situ:PROC + Line 233: EXTRN _Cnd_destroy_in_situ:PROC + Line 234: EXTRN _Cnd_wait:PROC + Line 235: EXTRN _Cnd_broadcast:PROC + Line 236: EXTRN _Cnd_signal:PROC + Line 237: EXTRN _Cnd_register_at_thread_exit:PROC + Line 238: EXTRN _Cnd_unregister_at_thread_exit:PROC + Line 239: EXTRN _Cnd_do_broadcast_at_thread_exit:PROC + Line 240: EXTRN ?_Throw_C_error@std@@YAXH@Z:PROC ; std::_Throw_C_error + Line 241: EXTRN ?_Throw_Cpp_error@std@@YAXH@Z:PROC ; std::_Throw_Cpp_error + Line 242: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 243: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 244: EXTRN ?BuildPolyBSP@subsector_t@@QEAAXXZ:PROC ; subsector_t::BuildPolyBSP + Line 245: EXTRN ?_Throw_future_error@std@@YAXAEBVerror_code@1@@Z:PROC ; std::_Throw_future_error + Line 246: EXTRN ?_Rethrow_future_exception@std@@YAXVexception_ptr@1@@Z:PROC ; std::_Rethrow_future_exception + Line 247: EXTRN ??_Efuture_error@std@@UEAAPEAXI@Z:PROC ; std::future_error::`vector deleting destructor' + Line 248: EXTRN ??_E_Future_error_category@std@@UEAAPEAXI@Z:PROC ; std::_Future_error_category::`vector deleting destructor' + Line 249: EXTRN ??_E?$_Associated_state@H@std@@UEAAPEAXI@Z:PROC ; std::_Associated_state::`vector deleting destructor' + Line 250: EXTRN ?hw_CheckClip@@YA_NPEAUside_t@@PEAUsector_t@@1@Z:PROC ; hw_CheckClip + Line 251: EXTRN ?hw_FakeFlat@@YAPEAUsector_t@@PEAU1@W4area_t@@_N0@Z:PROC ; hw_FakeFlat + Line 252: EXTRN ?hw_CheckViewArea@@YA?AW4area_t@@PEAUvertex_t@@0PEAUsector_t@@1@Z:PROC ; hw_CheckViewArea + Line 253: EXTRN ?IsRangeVisible@Clipper@@AEAA_NII@Z:PROC ; Clipper::IsRangeVisible + Line 254: EXTRN ?AddClipRange@Clipper@@AEAAXII@Z:PROC ; Clipper::AddClipRange + Line 255: EXTRN ?RemoveClipRange@Clipper@@AEAAXII@Z:PROC ; Clipper::RemoveClipRange + Line 256: EXTRN ?PointToPseudoAngle@Clipper@@QEAAINN@Z:PROC ; Clipper::PointToPseudoAngle + Line 257: EXTRN ?CheckBox@Clipper@@QEAA_NPEBM@Z:PROC ; Clipper::CheckBox + Line 258: EXTRN ?Process@GLWall@@QEAAXPEAUHWDrawInfo@@PEAUseg_t@@PEAUsector_t@@2@Z:PROC ; GLWall::Process + Line 259: EXTRN ?ProcessSector@GLFlat@@QEAAXPEAUHWDrawInfo@@PEAUsector_t@@H@Z:PROC ; GLFlat::ProcessSector + Line 260: EXTRN ?Process@GLSprite@@QEAAXPEAUHWDrawInfo@@PEAVAActor@@PEAUsector_t@@W4area_t@@H@Z:PROC ; GLSprite::Process + Line 261: EXTRN ?ProcessParticle@GLSprite@@QEAAXPEAUHWDrawInfo@@PEAUparticle_t@@PEAUsector_t@@@Z:PROC ; GLSprite::ProcessParticle + Line 262: EXTRN ?AddHackedSubsector@HWDrawInfo@@QEAAXPEAUsubsector_t@@@Z:PROC ; HWDrawInfo::AddHackedSubsector + Line 263: EXTRN ?PreparePlayerSprites@HWDrawInfo@@QEAAXPEAUsector_t@@W4area_t@@@Z:PROC ; HWDrawInfo::PreparePlayerSprites + Line 264: EXTRN ?AddSubsectorToPortal@HWDrawInfo@@QEAAXPEAUFSectorPortalGroup@@PEAUsubsector_t@@@Z:PROC ; HWDrawInfo::AddSubsectorToPortal + Line 265: EXTRN ?CheckUpdate@FFlatVertexBuffer@@QEAAXPEAUsector_t@@@Z:PROC ; FFlatVertexBuffer::CheckUpdate + Line 266: EXTRN ??_E?$_Packaged_state@$$A6AXH@Z@std@@UEAAPEAXI@Z:PROC ; std::_Packaged_state::`vector deleting destructor' + Line 267: EXTRN ??_E?$_Ref_count_obj@V?$packaged_task@$$A6AXH@Z@std@@@std@@UEAAPEAXI@Z:PROC ; std::_Ref_count_obj >::`vector deleting destructor' + Line 268: EXTRN _CxxThrowException:PROC + Line 269: EXTRN __CxxFrameHandler3:PROC + Line 270: EXTRN memcpy:PROC + Line 271: EXTRN memmove:PROC + Line 272: EXTRN memset:PROC + Line 273: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 274: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 275: EXTRN ?active@glcycle_t@@2_NA:BYTE ; glcycle_t::active + Line 276: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 277: EXTRN ?validcount@@3HA:DWORD ; validcount + Line 278: EXTRN ?starttime@Clipper@@0IA:DWORD ; Clipper::starttime + Line 279: EXTRN ?SetupWall@@3Vglcycle_t@@A:QWORD ; SetupWall + Line 280: EXTRN ?ClipWall@@3Vglcycle_t@@A:QWORD ; ClipWall + Line 281: EXTRN ?SetupFlat@@3Vglcycle_t@@A:QWORD ; SetupFlat + Line 282: EXTRN ?SetupSprite@@3Vglcycle_t@@A:QWORD ; SetupSprite + Line 283: EXTRN ?Bsp@@3Vglcycle_t@@A:QWORD ; Bsp + Line 284: EXTRN ?MTWait@@3Vglcycle_t@@A:QWORD ; MTWait + Line 285: EXTRN ?WTTotal@@3Vglcycle_t@@A:QWORD ; WTTotal + Line 286: EXTRN ?rendered_lines@@3HA:DWORD ; rendered_lines + Line 287: EXTRN __ImageBase:BYTE + Line 288: EXTRN _fltused:DWORD + Line 289: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_clipper.cod (4 hits) + Line 72: EXTRN ??0FMemArena@@QEAA@_K@Z:PROC ; FMemArena::FMemArena + Line 73: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 74: EXTRN __libm_sse2_sincos_:PROC + Line 75: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_clock.cod (34 hits) + Line 56: EXTRN ??_EStat_rendertimes@@UEAAPEAXI@Z:PROC ; Stat_rendertimes::`vector deleting destructor' + Line 57: EXTRN ??_EStat_renderstats@@UEAAPEAXI@Z:PROC ; Stat_renderstats::`vector deleting destructor' + Line 58: EXTRN ??_EStat_lightstats@@UEAAPEAXI@Z:PROC ; Stat_lightstats::`vector deleting destructor' + Line 145: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 146: EXTRN atexit:PROC + Line 147: EXTRN _Init_thread_header:PROC + Line 148: EXTRN _Init_thread_footer:PROC + Line 149: EXTRN fclose:PROC + Line 150: EXTRN fopen:PROC + Line 151: EXTRN fputs:PROC + Line 152: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 153: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 154: EXTRN ?AppendFormat@FString@@QEAAXPEBDZZ:PROC ; FString::AppendFormat + Line 155: EXTRN ?Truncate@FString@@QEAAX_K@Z:PROC ; FString::Truncate + Line 156: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 157: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 158: EXTRN ?C_HideConsole@@YAXXZ:PROC ; C_HideConsole + Line 159: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 160: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 161: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 162: EXTRN ??0FStat@@QEAA@PEBD@Z:PROC ; FStat::FStat + Line 163: EXTRN ??1FStat@@UEAA@XZ:PROC ; FStat::~FStat + Line 164: EXTRN ?FindStat@FStat@@SAPEAV1@PEBD@Z:PROC ; FStat::FindStat + Line 165: EXTRN ?I_msTime@@YA_KXZ:PROC ; I_msTime + Line 166: EXTRN __CxxFrameHandler3:PROC + Line 167: EXTRN _Init_thread_epoch:DWORD + Line 168: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 169: EXTRN ?ConsoleState@@3W4cstate_t@@A:DWORD ; ConsoleState + Line 170: EXTRN ?r_viewpoint@@3UFRenderViewpoint@@A:BYTE ; r_viewpoint + Line 171: EXTRN ?PerfToMillisec@@3NA:QWORD ; PerfToMillisec + Line 172: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 173: EXTRN ?vid_fps@@3VFBoolCVar@@A:BYTE ; vid_fps + Line 174: EXTRN _fltused:DWORD + Line 175: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_cvars.cod (12 hits) + Line 40: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 41: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 209: EXTRN atexit:PROC + Line 210: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 211: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 212: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 213: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 214: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 215: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 216: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 217: EXTRN ?FlushAll@FTextureManager@@QEAAXXZ:PROC ; FTextureManager::FlushAll + Line 218: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_decal.cod (15 hits) + Line 22: EXTRN ?GetXY@DBaseDecal@@QEBAXPEAUside_t@@AEAN1@Z:PROC ; DBaseDecal::GetXY + Line 23: EXTRN ?ValidateTexture@FMaterial@@SAPEAV1@PEAVFTexture@@_N1@Z:PROC ; FMaterial::ValidateTexture + Line 24: EXTRN ?SetColor@HWDrawInfo@@QEAAXAEAVFRenderState@@HH_NAEBUFColormap@@M1@Z:PROC ; HWDrawInfo::SetColor + Line 25: EXTRN ?SetFog@HWDrawInfo@@QEAAXAEAVFRenderState@@HH_NPEBUFColormap@@1@Z:PROC ; HWDrawInfo::SetFog + Line 26: EXTRN ?GetDynSpriteLight@HWDrawInfo@@QEAAXPEAVAActor@@MMMPEAUFLightNode@@HPEAM@Z:PROC ; HWDrawInfo::GetDynSpriteLight + Line 27: EXTRN ?AddDecal@HWDrawInfo@@QEAAPEAUGLDecal@@_N@Z:PROC ; HWDrawInfo::AddDecal + Line 28: EXTRN ?AllocVertices@FFlatVertexBuffer@@QEAA?AU?$pair@PEAUFFlatVertex@@I@std@@I@Z:PROC ; FFlatVertexBuffer::AllocVertices + Line 29: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 30: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 31: EXTRN ?r_viewpoint@@3UFRenderViewpoint@@A:BYTE ; r_viewpoint + Line 32: EXTRN ?gl_weaponlight@@3VFIntCVar@@A:BYTE ; gl_weaponlight + Line 33: EXTRN ?gl_light_sprites@@3VFBoolCVar@@A:BYTE ; gl_light_sprites + Line 34: EXTRN ?gl_mask_sprite_threshold@@3VFFloatCVar@@A:BYTE ; gl_mask_sprite_threshold + Line 35: EXTRN ?rendered_decals@@3HA:DWORD ; rendered_decals + Line 36: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_draw2d.cod (17 hits) + Line 24: EXTRN atexit:PROC + Line 25: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 26: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 27: EXTRN ?GetUniqueIndex@FRemapTable@@QEAAHXZ:PROC ; FRemapTable::GetUniqueIndex + Line 28: EXTRN ?ScreenToWindowX@DFrameBuffer@@QEAAHH@Z:PROC ; DFrameBuffer::ScreenToWindowX + Line 29: EXTRN ?ScreenToWindowY@DFrameBuffer@@QEAAHH@Z:PROC ; DFrameBuffer::ScreenToWindowY + Line 30: EXTRN ?Set2D@GLViewpointBuffer@@QEAAXAEAVFRenderState@@HH@Z:PROC ; GLViewpointBuffer::Set2D + Line 31: EXTRN ?translate@VSMatrix@@QEAAXMMM@Z:PROC ; VSMatrix::translate + Line 32: EXTRN ?scale@VSMatrix@@QEAAXMMM@Z:PROC ; VSMatrix::scale + Line 33: EXTRN ?loadIdentity@VSMatrix@@QEAAXXZ:PROC ; VSMatrix::loadIdentity + Line 34: EXTRN ?ValidateTexture@FMaterial@@SAPEAV1@PEAVFTexture@@_N1@Z:PROC ; FMaterial::ValidateTexture + Line 35: EXTRN __CxxFrameHandler3:PROC + Line 36: EXTRN ?LegacyRenderStyles@@3PATFRenderStyle@@A:BYTE ; LegacyRenderStyles + Line 37: EXTRN ?active@glcycle_t@@2_NA:BYTE ; glcycle_t::active + Line 38: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 39: EXTRN ?twoD@@3Vglcycle_t@@A:QWORD ; twoD + Line 40: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_drawinfo.cod (82 hits) + Line 101: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 102: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 103: EXTRN _purecall:PROC + Line 104: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 105: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 106: EXTRN atexit:PROC + Line 107: EXTRN __std_terminate:PROC + Line 108: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 109: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 110: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 111: EXTRN ?_Xbad_function_call@std@@YAXXZ:PROC ; std::_Xbad_function_call + Line 112: EXTRN ??1FMemArena@@QEAA@XZ:PROC ; FMemArena::~FMemArena + Line 113: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 114: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 115: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 116: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 117: EXTRN ?AspectMultiplier@@YAHM@Z:PROC ; AspectMultiplier + Line 118: EXTRN ??0FRenderViewpoint@@QEAA@XZ:PROC ; FRenderViewpoint::FRenderViewpoint + Line 119: EXTRN ?SetViewAngle@FRenderViewpoint@@QEAAXAEBUFViewWindow@@@Z:PROC ; FRenderViewpoint::SetViewAngle + Line 120: EXTRN ?R_GetGlobVis@@YANAEBUFViewWindow@@N@Z:PROC ; R_GetGlobVis + Line 121: EXTRN ?PointInRenderSubsector@FLevelLocals@@QEAAPEAUsubsector_t@@HH@Z:PROC ; FLevelLocals::PointInRenderSubsector + Line 122: EXTRN ?translate@VSMatrix@@QEAAXMMM@Z:PROC ; VSMatrix::translate + Line 123: EXTRN ?scale@VSMatrix@@QEAAXMMM@Z:PROC ; VSMatrix::scale + Line 124: EXTRN ?rotate@VSMatrix@@QEAAXMMMM@Z:PROC ; VSMatrix::rotate + Line 125: EXTRN ?loadIdentity@VSMatrix@@QEAAXXZ:PROC ; VSMatrix::loadIdentity + Line 126: EXTRN ?computeNormalMatrix@VSMatrix@@QEAAXPEBM@Z:PROC ; VSMatrix::computeNormalMatrix + Line 127: EXTRN ?ResetRenderDataAllocator@@YAXXZ:PROC ; ResetRenderDataAllocator + Line 128: EXTRN ?Reset@HWDrawList@@QEAAXXZ:PROC ; HWDrawList::Reset + Line 129: EXTRN ?SortWalls@HWDrawList@@QEAAXXZ:PROC ; HWDrawList::SortWalls + Line 130: EXTRN ?SortFlats@HWDrawList@@QEAAXXZ:PROC ; HWDrawList::SortFlats + Line 131: EXTRN ?Draw@HWDrawList@@QEAAXPEAUHWDrawInfo@@AEAVFRenderState@@_N@Z:PROC ; HWDrawList::Draw + Line 132: EXTRN ?DrawWalls@HWDrawList@@QEAAXPEAUHWDrawInfo@@AEAVFRenderState@@_N@Z:PROC ; HWDrawList::DrawWalls + Line 133: EXTRN ?DrawFlats@HWDrawList@@QEAAXPEAUHWDrawInfo@@AEAVFRenderState@@_N@Z:PROC ; HWDrawList::DrawFlats + Line 134: EXTRN ?DrawSorted@HWDrawList@@QEAAXPEAUHWDrawInfo@@AEAVFRenderState@@@Z:PROC ; HWDrawList::DrawSorted + Line 135: EXTRN ?RenderBSP@HWDrawInfo@@QEAAXPEAX@Z:PROC ; HWDrawInfo::RenderBSP + Line 136: EXTRN ?DispatchRenderHacks@HWDrawInfo@@QEAAXXZ:PROC ; HWDrawInfo::DispatchRenderHacks + Line 137: EXTRN ?HandleMissingTextures@HWDrawInfo@@QEAAXW4area_t@@@Z:PROC ; HWDrawInfo::HandleMissingTextures + Line 138: EXTRN ?PrepareUnhandledMissingTextures@HWDrawInfo@@QEAAXXZ:PROC ; HWDrawInfo::PrepareUnhandledMissingTextures + Line 139: EXTRN ?HandleHackedSubsectors@HWDrawInfo@@QEAAXXZ:PROC ; HWDrawInfo::HandleHackedSubsectors + Line 140: EXTRN ?DrawDecals@HWDrawInfo@@QEAAXAEAVFRenderState@@AEAV?$TArray@PEAUGLDecal@@PEAU1@@@@Z:PROC ; HWDrawInfo::DrawDecals + Line 141: EXTRN ?DrawPlayerSprites@HWDrawInfo@@QEAAX_NAEAVFRenderState@@@Z:PROC ; HWDrawInfo::DrawPlayerSprites + Line 142: EXTRN ?SetupStencil@HWPortal@@QEAAXPEAUHWDrawInfo@@AEAVFRenderState@@_N@Z:PROC ; HWPortal::SetupStencil + Line 143: EXTRN ?RemoveStencil@HWPortal@@QEAAXPEAUHWDrawInfo@@AEAVFRenderState@@_N@Z:PROC ; HWPortal::RemoveStencil + Line 144: EXTRN ??_EHWPortal@@UEAAPEAXI@Z:PROC ; HWPortal::`vector deleting destructor' + Line 145: EXTRN ?StartFrame@FPortalSceneState@@QEAAXXZ:PROC ; FPortalSceneState::StartFrame + Line 146: EXTRN ??_EHWScenePortalBase@@UEAAPEAXI@Z:PROC ; HWScenePortalBase::`vector deleting destructor' + Line 147: EXTRN ?Setup@HWSectorStackPortal@@MEAA_NPEAUHWDrawInfo@@AEAVFRenderState@@PEAVClipper@@@Z:PROC ; HWSectorStackPortal::Setup + Line 148: EXTRN ?Shutdown@HWSectorStackPortal@@MEAAXPEAUHWDrawInfo@@AEAVFRenderState@@@Z:PROC ; HWSectorStackPortal::Shutdown + Line 149: EXTRN ?GetName@HWSectorStackPortal@@MEAAPEBDXZ:PROC ; HWSectorStackPortal::GetName + Line 150: EXTRN ??_EHWSectorStackPortal@@UEAAPEAXI@Z:PROC ; HWSectorStackPortal::`vector deleting destructor' + Line 151: EXTRN ?IsHUDModelForPlayerAvailable@@YA_NPEAVplayer_t@@@Z:PROC ; IsHUDModelForPlayerAvailable + Line 152: EXTRN ?Bind@GLViewpointBuffer@@QEAAHAEAVFRenderState@@I@Z:PROC ; GLViewpointBuffer::Bind + Line 153: EXTRN ?SetViewpoint@GLViewpointBuffer@@QEAAHAEAVFRenderState@@PEAUHWViewpointUniforms@@@Z:PROC ; GLViewpointBuffer::SetViewpoint + Line 154: EXTRN ?GetVRMode@VRMode@@SAPEBU1@_N@Z:PROC ; VRMode::GetVRMode + Line 155: EXTRN ?GetHUDSpriteProjection@VRMode@@QEBA?AVVSMatrix@@XZ:PROC ; VRMode::GetHUDSpriteProjection + Line 156: EXTRN ?AngleToPseudo@Clipper@@CAII@Z:PROC ; Clipper::AngleToPseudo + Line 157: EXTRN ?AddClipRange@Clipper@@AEAAXII@Z:PROC ; Clipper::AddClipRange + Line 158: EXTRN ??0Clipper@@QEAA@XZ:PROC ; Clipper::Clipper + Line 159: EXTRN ?Clear@Clipper@@QEAAXXZ:PROC ; Clipper::Clear + Line 160: EXTRN __CxxFrameHandler3:PROC + Line 161: EXTRN memset:PROC + Line 162: EXTRN ?LegacyRenderStyles@@3PATFRenderStyle@@A:BYTE ; LegacyRenderStyles + Line 163: EXTRN ?active@glcycle_t@@2_NA:BYTE ; glcycle_t::active + Line 164: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 165: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 166: EXTRN ?viewheight@@3HA:DWORD ; viewheight + Line 167: EXTRN ?r_viewwindow@@3UFViewWindow@@A:BYTE ; r_viewwindow + Line 168: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 169: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 170: EXTRN ?RenderDataAllocator@@3VFMemArena@@A:BYTE ; RenderDataAllocator + Line 171: EXTRN ?ProcessAll@@3Vglcycle_t@@A:QWORD ; ProcessAll + Line 172: EXTRN ?RenderAll@@3Vglcycle_t@@A:QWORD ; RenderAll + Line 173: EXTRN ?gl_enhanced_nightvision@@3VFBoolCVar@@A:BYTE ; gl_enhanced_nightvision + Line 174: EXTRN ?gl_texture@@3VFBoolCVar@@A:BYTE ; gl_texture + Line 175: EXTRN ?gl_fogmode@@3VFIntCVar@@A:BYTE ; gl_fogmode + Line 176: EXTRN ?gl_lightmode@@3VFIntCVar@@A:BYTE ; gl_lightmode + Line 177: EXTRN ?gl_mask_threshold@@3VFFloatCVar@@A:BYTE ; gl_mask_threshold + Line 178: EXTRN ?gl_mask_sprite_threshold@@3VFFloatCVar@@A:BYTE ; gl_mask_sprite_threshold + Line 179: EXTRN ?gl_enhanced_nv_stealth@@3VFIntCVar@@A:BYTE ; gl_enhanced_nv_stealth + Line 180: EXTRN ?gl_shadowmap_filter@@3VFIntCVar@@A:BYTE ; gl_shadowmap_filter + Line 181: EXTRN ?r_visibility@@3VFFloatCVar@@A:BYTE ; r_visibility + Line 182: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_drawlist.cod (33 hits) + Line 51: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 52: EXTRN ??3@YAXPEAX@Z:PROC ; operator delete + Line 53: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 54: EXTRN atexit:PROC + Line 55: EXTRN _Init_thread_header:PROC + Line 56: EXTRN _Init_thread_footer:PROC + Line 57: EXTRN __std_terminate:PROC + Line 58: EXTRN ??2@YAPEAX_KAEBUnothrow_t@std@@@Z:PROC ; operator new + Line 59: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 60: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 61: EXTRN ??0FMemArena@@QEAA@_K@Z:PROC ; FMemArena::FMemArena + Line 62: EXTRN ??1FMemArena@@QEAA@XZ:PROC ; FMemArena::~FMemArena + Line 63: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 64: EXTRN ?FreeAll@FMemArena@@QEAAXXZ:PROC ; FMemArena::FreeAll + Line 65: EXTRN ?MakeVertices@GLWall@@QEAAXPEAUHWDrawInfo@@_N@Z:PROC ; GLWall::MakeVertices + Line 66: EXTRN ?DrawWall@GLWall@@QEAAXPEAUHWDrawInfo@@AEAVFRenderState@@_N@Z:PROC ; GLWall::DrawWall + Line 67: EXTRN ?DrawFlat@GLFlat@@QEAAXPEAUHWDrawInfo@@AEAVFRenderState@@_N@Z:PROC ; GLFlat::DrawFlat + Line 68: EXTRN ?CreateVertices@GLSprite@@QEAAXPEAUHWDrawInfo@@@Z:PROC ; GLSprite::CreateVertices + Line 69: EXTRN ?DrawSprite@GLSprite@@QEAAXPEAUHWDrawInfo@@AEAVFRenderState@@_N@Z:PROC ; GLSprite::DrawSprite + Line 70: EXTRN __CxxFrameHandler3:PROC + Line 71: EXTRN __chkstk:PROC + Line 72: EXTRN _Init_thread_epoch:DWORD + Line 73: EXTRN ?nothrow@std@@3Unothrow_t@1@B:BYTE ; std::nothrow + Line 74: EXTRN ?active@glcycle_t@@2_NA:BYTE ; glcycle_t::active + Line 75: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 76: EXTRN ?RenderWall@@3Vglcycle_t@@A:QWORD ; RenderWall + Line 77: EXTRN ?RenderFlat@@3Vglcycle_t@@A:QWORD ; RenderFlat + Line 78: EXTRN ?RenderSprite@@3Vglcycle_t@@A:QWORD ; RenderSprite + Line 79: EXTRN ?gl_billboard_mode@@3VFIntCVar@@A:BYTE ; gl_billboard_mode + Line 80: EXTRN ?gl_billboard_faces_camera@@3VFBoolCVar@@A:BYTE ; gl_billboard_faces_camera + Line 81: EXTRN ?gl_billboard_particles@@3VFBoolCVar@@A:BYTE ; gl_billboard_particles + Line 82: EXTRN _fltused:DWORD + Line 83: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_drawlistadd.cod (9 hits) + Line 17: EXTRN ?GetTranslucency@FTexture@@QEAA_NXZ:PROC ; FTexture::GetTranslucency + Line 18: EXTRN ?MakeVertices@GLWall@@QEAAXPEAUHWDrawInfo@@_N@Z:PROC ; GLWall::MakeVertices + Line 19: EXTRN ?ProcessDecals@GLWall@@QEAAXPEAUHWDrawInfo@@@Z:PROC ; GLWall::ProcessDecals + Line 20: EXTRN ?NewWall@HWDrawList@@QEAAPEAVGLWall@@XZ:PROC ; HWDrawList::NewWall + Line 21: EXTRN ?NewFlat@HWDrawList@@QEAAPEAVGLFlat@@XZ:PROC ; HWDrawList::NewFlat + Line 22: EXTRN ?NewSprite@HWDrawList@@QEAAPEAVGLSprite@@XZ:PROC ; HWDrawList::NewSprite + Line 23: EXTRN sqrtf:PROC + Line 24: EXTRN ?passflag@GLWall@@2QBDB:BYTE ; GLWall::passflag + Line 25: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_dynlightdata.cod (16 hits) + Line 36: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 37: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 38: EXTRN atexit:PROC + Line 39: EXTRN __std_terminate:PROC + Line 40: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 41: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 42: EXTRN c_sqrt:PROC + Line 43: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 44: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 45: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 46: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 47: EXTRN __tlregdtor:PROC + Line 48: EXTRN __CxxFrameHandler3:PROC + Line 49: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 50: EXTRN _fltused:DWORD + Line 51: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_fakeflat.cod (11 hits) + Line 17: EXTRN atexit:PROC + Line 18: EXTRN ??0FMemArena@@QEAA@_K@Z:PROC ; FMemArena::FMemArena + Line 19: EXTRN ??1FMemArena@@QEAA@XZ:PROC ; FMemArena::~FMemArena + Line 20: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 21: EXTRN ?FreeAll@FMemArena@@QEAAXXZ:PROC ; FMemArena::FreeAll + Line 22: EXTRN ?CopyPlaneIfValid@secplane_t@@QEBA_NPEAU1@PEBU1@@Z:PROC ; secplane_t::CopyPlaneIfValid + Line 23: EXTRN ?AdjustFloorClip@@YAXPEBUsector_t@@@Z:PROC ; AdjustFloorClip + Line 24: EXTRN memset:PROC + Line 25: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 26: EXTRN ?skyflatnum@@3VFTextureID@@A:DWORD ; skyflatnum + Line 27: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_flats.cod (33 hits) + Line 37: EXTRN ?GetTranslucency@FTexture@@QEAA_NXZ:PROC ; FTexture::GetTranslucency + Line 38: EXTRN ?GetColormap@F3DFloor@@QEAA?AUFColormap@@XZ:PROC ; F3DFloor::GetColormap + Line 39: EXTRN ?P_GetPlaneLight@@YAPEAUlightlist_t@@PEAUsector_t@@PEAUsecplane_t@@_N@Z:PROC ; P_GetPlaneLight + Line 40: EXTRN ?ValidatePortal@sector_t@@QEAAPEAUFSectorPortal@@H@Z:PROC ; sector_t::ValidatePortal + Line 41: EXTRN ?GetFloorLight@@YAHPEBUsector_t@@@Z:PROC ; GetFloorLight + Line 42: EXTRN ?GetCeilingLight@@YAHPEBUsector_t@@@Z:PROC ; GetCeilingLight + Line 43: EXTRN ?translate@VSMatrix@@QEAAXMMM@Z:PROC ; VSMatrix::translate + Line 44: EXTRN ?scale@VSMatrix@@QEAAXMMM@Z:PROC ; VSMatrix::scale + Line 45: EXTRN ?rotate@VSMatrix@@QEAAXMMMM@Z:PROC ; VSMatrix::rotate + Line 46: EXTRN ?loadIdentity@VSMatrix@@QEAAXXZ:PROC ; VSMatrix::loadIdentity + Line 47: EXTRN ?GetLight@FDynLightData@@QEAA_NHAEAVPlane@@PEAUFDynamicLight@@_N@Z:PROC ; FDynLightData::GetLight + Line 48: EXTRN ?ValidateTexture@FMaterial@@SAPEAV1@VFTextureID@@_N11@Z:PROC ; FMaterial::ValidateTexture + Line 49: EXTRN ?SetColor@HWDrawInfo@@QEAAXAEAVFRenderState@@HH_NAEBUFColormap@@M1@Z:PROC ; HWDrawInfo::SetColor + Line 50: EXTRN ?SetFog@HWDrawInfo@@QEAAXAEAVFRenderState@@HH_NPEBUFColormap@@1@Z:PROC ; HWDrawInfo::SetFog + Line 51: EXTRN ?AddFlat@HWDrawInfo@@QEAAXPEAVGLFlat@@_N@Z:PROC ; HWDrawInfo::AddFlat + Line 52: EXTRN ?AllocVertices@FFlatVertexBuffer@@QEAA?AU?$pair@PEAUFFlatVertex@@I@std@@I@Z:PROC ; FFlatVertexBuffer::AllocVertices + Line 53: EXTRN ?UploadLights@FLightBuffer@@QEAAHAEAUFDynLightData@@@Z:PROC ; FLightBuffer::UploadLights + Line 54: EXTRN ?LegacyRenderStyles@@3PATFRenderStyle@@A:BYTE ; LegacyRenderStyles + Line 55: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 56: EXTRN ?gl_plane_reflection_i@@3_NA:BYTE ; gl_plane_reflection_i + Line 57: EXTRN ?skyflatnum@@3VFTextureID@@A:DWORD ; skyflatnum + Line 58: EXTRN ?r_viewpoint@@3UFRenderViewpoint@@A:BYTE ; r_viewpoint + Line 59: EXTRN ?lightdata@@3UFDynLightData@@A:BYTE ; lightdata + Line 60: EXTRN ?gl_weaponlight@@3VFIntCVar@@A:BYTE ; gl_weaponlight + Line 61: EXTRN ?gl_mask_threshold@@3VFFloatCVar@@A:BYTE ; gl_mask_threshold + Line 62: EXTRN ?iter_dlightf@@3HA:DWORD ; iter_dlightf + Line 63: EXTRN ?draw_dlightf@@3HA:DWORD ; draw_dlightf + Line 64: EXTRN ?rendered_flats@@3HA:DWORD ; rendered_flats + Line 65: EXTRN ?flatvertices@@3HA:DWORD ; flatvertices + Line 66: EXTRN ?flatprimitives@@3HA:DWORD ; flatprimitives + Line 67: EXTRN __ImageBase:BYTE + Line 68: EXTRN _fltused:DWORD + Line 69: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_lightbuffer.cod (5 hits) + Line 17: EXTRN strstr:PROC + Line 18: EXTRN memcpy:PROC + Line 19: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 20: EXTRN __ImageBase:BYTE + Line 21: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_lighting.cod (7 hits) + Line 50: EXTRN atexit:PROC + Line 51: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 52: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 53: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 54: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 55: EXTRN ?skyflatnum@@3VFTextureID@@A:DWORD ; skyflatnum + Line 56: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_material.cod (18 hits) + Line 29: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 30: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 31: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 32: EXTRN __std_terminate:PROC + Line 33: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 34: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 35: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 36: EXTRN ?GetUniqueIndex@FRemapTable@@QEAAHXZ:PROC ; FRemapTable::GetUniqueIndex + Line 37: EXTRN ?TranslationToTable@@YAPEAUFRemapTable@@H@Z:PROC ; TranslationToTable + Line 38: EXTRN ?CreateDefaultBrightmap@FTexture@@QEAAXXZ:PROC ; FTexture::CreateDefaultBrightmap + Line 39: EXTRN ?CreateTexBuffer@FTexture@@QEAA?AUFTextureBuffer@@HH@Z:PROC ; FTexture::CreateTexBuffer + Line 40: EXTRN __CxxFrameHandler3:PROC + Line 41: EXTRN memmove:PROC + Line 42: EXTRN ?usershaders@@3V?$TArray@UUserShaderDesc@@U1@@@A:BYTE ; usershaders + Line 43: EXTRN ?r_spriteadjustHW@@3HA:DWORD ; r_spriteadjustHW + Line 44: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 45: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 46: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_models.cod (14 hits) + Line 39: EXTRN _purecall:PROC + Line 40: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 41: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 42: EXTRN atexit:PROC + Line 43: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 44: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 45: EXTRN ?ValidateTexture@FMaterial@@SAPEAV1@PEAVFTexture@@_N1@Z:PROC ; FMaterial::ValidateTexture + Line 46: EXTRN ?inverseMatrix@VSMatrix@@QEAA_NAEAV1@@Z:PROC ; VSMatrix::inverseMatrix + Line 47: EXTRN ??_EIModelVertexBuffer@@UEAAPEAXI@Z:PROC ; IModelVertexBuffer::`vector deleting destructor' + Line 48: EXTRN ??_EFModelVertexBuffer@@UEAAPEAXI@Z:PROC ; FModelVertexBuffer::`vector deleting destructor' + Line 49: EXTRN __CxxFrameHandler3:PROC + Line 50: EXTRN ?LegacyRenderStyles@@3PATFRenderStyle@@A:BYTE ; LegacyRenderStyles + Line 51: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 52: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_portal.cod (58 hits) + Line 9: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 112: EXTRN _purecall:PROC + Line 113: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 114: EXTRN atexit:PROC + Line 115: EXTRN __std_terminate:PROC + Line 116: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 117: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 118: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 119: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 120: EXTRN ?Truncate@FString@@QEAAX_K@Z:PROC ; FString::Truncate + Line 121: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 122: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 123: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 124: EXTRN c_atan2:PROC + Line 125: EXTRN c_sqrt:PROC + Line 126: EXTRN ?GetFloorLight@@YAHPEBUsector_t@@@Z:PROC ; GetFloorLight + Line 127: EXTRN ?GetCeilingLight@@YAHPEBUsector_t@@@Z:PROC ; GetCeilingLight + Line 128: EXTRN ?P_ClipLineToPortal@@YA_NPEAUline_t@@0U?$TVector2@N@@_N2@Z:PROC ; P_ClipLineToPortal + Line 129: EXTRN ?P_TranslatePortalXY@@YAXPEAUline_t@@AEAN1@Z:PROC ; P_TranslatePortalXY + Line 130: EXTRN ?P_TranslatePortalAngle@@YAXPEAUline_t@@AEAU?$TAngle@N@@@Z:PROC ; P_TranslatePortalAngle + Line 131: EXTRN ?P_TranslatePortalZ@@YAXPEAUline_t@@AEAN@Z:PROC ; P_TranslatePortalZ + Line 132: EXTRN ?SetColor@HWDrawInfo@@QEAAXAEAVFRenderState@@HH_NAEBUFColormap@@M1@Z:PROC ; HWDrawInfo::SetColor + Line 133: EXTRN ?SetFog@HWDrawInfo@@QEAAXAEAVFRenderState@@HH_NPEBUFColormap@@1@Z:PROC ; HWDrawInfo::SetFog + Line 134: EXTRN ?SetViewArea@HWDrawInfo@@QEAAXXZ:PROC ; HWDrawInfo::SetViewArea + Line 135: EXTRN ?RenderPortal@HWDrawInfo@@QEAAXPEAVHWPortal@@AEAVFRenderState@@_N@Z:PROC ; HWDrawInfo::RenderPortal + Line 136: EXTRN ?ProcessActorsInPortal@HWDrawInfo@@QEAAXPEAUFLinePortalSpan@@W4area_t@@@Z:PROC ; HWDrawInfo::ProcessActorsInPortal + Line 137: EXTRN ?UpdateCurrentMapSection@HWDrawInfo@@QEAAXXZ:PROC ; HWDrawInfo::UpdateCurrentMapSection + Line 138: EXTRN ?SetupView@HWDrawInfo@@QEAAXAEAVFRenderState@@MMM_N1@Z:PROC ; HWDrawInfo::SetupView + Line 139: EXTRN ?FrustumAngle@HWDrawInfo@@QEAAIXZ:PROC ; HWDrawInfo::FrustumAngle + Line 140: EXTRN ?hw_SetPlaneTextureRotation@@YA_NPEBUGLSectorPlane@@PEAVFMaterial@@AEAVVSMatrix@@@Z:PROC ; hw_SetPlaneTextureRotation + Line 141: EXTRN ?PointInRenderSubsector@FLevelLocals@@QEAAPEAUsubsector_t@@HH@Z:PROC ; FLevelLocals::PointInRenderSubsector + Line 142: EXTRN ?ValidateTexture@FMaterial@@SAPEAV1@VFTextureID@@_N11@Z:PROC ; FMaterial::ValidateTexture + Line 143: EXTRN ?init@GLSkyInfo@@QEAAXPEAUHWDrawInfo@@HUPalEntry@@@Z:PROC ; GLSkyInfo::init + Line 144: EXTRN ??_EHWPortal@@UEAAPEAXI@Z:PROC ; HWPortal::`vector deleting destructor' + Line 145: EXTRN ??_EHWHorizonPortal@@UEAAPEAXI@Z:PROC ; HWHorizonPortal::`vector deleting destructor' + Line 146: EXTRN ?DrawContents@HWSkyPortal@@MEAAXPEAUHWDrawInfo@@AEAVFRenderState@@@Z:PROC ; HWSkyPortal::DrawContents + Line 147: EXTRN ?GetName@HWSkyPortal@@MEAAPEBDXZ:PROC ; HWSkyPortal::GetName + Line 148: EXTRN ??_EHWSkyPortal@@UEAAPEAXI@Z:PROC ; HWSkyPortal::`vector deleting destructor' + Line 149: EXTRN ?AngleToPseudo@Clipper@@CAII@Z:PROC ; Clipper::AngleToPseudo + Line 150: EXTRN ?AddClipRange@Clipper@@AEAAXII@Z:PROC ; Clipper::AddClipRange + Line 151: EXTRN ?RemoveClipRange@Clipper@@AEAAXII@Z:PROC ; Clipper::RemoveClipRange + Line 152: EXTRN ?Clear@Clipper@@QEAAXXZ:PROC ; Clipper::Clear + Line 153: EXTRN ?SetSilhouette@Clipper@@QEAAXXZ:PROC ; Clipper::SetSilhouette + Line 154: EXTRN ?PointToPseudoAngle@Clipper@@QEAAINN@Z:PROC ; Clipper::PointToPseudoAngle + Line 155: EXTRN ?AllocVertices@FFlatVertexBuffer@@QEAA?AU?$pair@PEAUFFlatVertex@@I@std@@I@Z:PROC ; FFlatVertexBuffer::AllocVertices + Line 156: EXTRN __CxxFrameHandler3:PROC + Line 157: EXTRN memmove:PROC + Line 158: EXTRN ?r_viewpoint@@3UFRenderViewpoint@@A:BYTE ; r_viewpoint + Line 159: EXTRN ?LegacyRenderStyles@@3PATFRenderStyle@@A:BYTE ; LegacyRenderStyles + Line 160: EXTRN ?active@glcycle_t@@2_NA:BYTE ; glcycle_t::active + Line 161: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 162: EXTRN ?skyflatnum@@3VFTextureID@@A:DWORD ; skyflatnum + Line 163: EXTRN ?PortalAll@@3Vglcycle_t@@A:QWORD ; PortalAll + Line 164: EXTRN ?rendered_portals@@3HA:DWORD ; rendered_portals + Line 165: EXTRN ?gl_weaponlight@@3VFIntCVar@@A:BYTE ; gl_weaponlight + Line 166: EXTRN ?r_mirror_recursions@@3VFIntCVar@@A:BYTE ; r_mirror_recursions + Line 167: EXTRN ?gl_portals@@3VFBoolCVar@@A:BYTE ; gl_portals + Line 168: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_postprocess.cod (71 hits) + Line 236: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 237: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 238: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 239: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 240: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 241: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 242: EXTRN atexit:PROC + Line 243: EXTRN __std_terminate:PROC + Line 244: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 245: EXTRN log2:PROC + Line 246: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 247: EXTRN __std_type_info_compare:PROC + Line 248: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 249: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 250: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 251: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 252: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 253: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 254: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 255: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 256: EXTRN ??HFString@@QEBA?AV0@PEBD@Z:PROC ; FString::operator+ + Line 257: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 258: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 259: EXTRN ?SuperFastHash@@YAIPEBD_K@Z:PROC ; SuperFastHash + Line 260: EXTRN ?PTM_BestColor@@YAHPEBIHHH_NMHH@Z:PROC ; PTM_BestColor + Line 261: EXTRN ??_EPPEffectManager@@UEAAPEAXI@Z:PROC ; PPEffectManager::`vector deleting destructor' + Line 262: EXTRN ??_EPPBloom@@UEAAPEAXI@Z:PROC ; PPBloom::`vector deleting destructor' + Line 263: EXTRN ??_EPPLensDistort@@UEAAPEAXI@Z:PROC ; PPLensDistort::`vector deleting destructor' + Line 264: EXTRN ??_EPPFXAA@@UEAAPEAXI@Z:PROC ; PPFXAA::`vector deleting destructor' + Line 265: EXTRN ??_EPPCameraExposure@@UEAAPEAXI@Z:PROC ; PPCameraExposure::`vector deleting destructor' + Line 266: EXTRN ??_EPPColormap@@UEAAPEAXI@Z:PROC ; PPColormap::`vector deleting destructor' + Line 267: EXTRN ??_EPPTonemap@@UEAAPEAXI@Z:PROC ; PPTonemap::`vector deleting destructor' + Line 268: EXTRN ??_EPPAmbientOcclusion@@UEAAPEAXI@Z:PROC ; PPAmbientOcclusion::`vector deleting destructor' + Line 269: EXTRN _CxxThrowException:PROC + Line 270: EXTRN __CxxFrameHandler3:PROC + Line 271: EXTRN __chkstk:PROC + Line 272: EXTRN ceil:PROC + Line 273: EXTRN cos:PROC + Line 274: EXTRN expf:PROC + Line 275: EXTRN memset:PROC + Line 276: EXTRN sin:PROC + Line 277: EXTRN sqrtf:PROC + Line 278: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 279: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 280: EXTRN ?GPalette@@3UFPalette@@A:BYTE ; GPalette + Line 281: EXTRN ?SpecialColormaps@@3V?$TArray@UFSpecialColormap@@U1@@@A:BYTE ; SpecialColormaps + Line 282: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 283: EXTRN ?gl_multisample@@3VFIntCVar@@A:BYTE ; gl_multisample + Line 284: EXTRN ?gl_bloom@@3VFBoolCVar@@A:BYTE ; gl_bloom + Line 285: EXTRN ?gl_bloom_amount@@3VFFloatCVar@@A:BYTE ; gl_bloom_amount + Line 286: EXTRN ?gl_tonemap@@3VFIntCVar@@A:BYTE ; gl_tonemap + Line 287: EXTRN ?gl_lens@@3VFBoolCVar@@A:BYTE ; gl_lens + Line 288: EXTRN ?gl_lens_k@@3VFFloatCVar@@A:BYTE ; gl_lens_k + Line 289: EXTRN ?gl_lens_kcube@@3VFFloatCVar@@A:BYTE ; gl_lens_kcube + Line 290: EXTRN ?gl_lens_chromatic@@3VFFloatCVar@@A:BYTE ; gl_lens_chromatic + Line 291: EXTRN ?gl_ssao@@3VFIntCVar@@A:BYTE ; gl_ssao + Line 292: EXTRN ?gl_ssao_strength@@3VFFloatCVar@@A:BYTE ; gl_ssao_strength + Line 293: EXTRN ?gl_ssao_debug@@3VFIntCVar@@A:BYTE ; gl_ssao_debug + Line 294: EXTRN ?gl_ssao_bias@@3VFFloatCVar@@A:BYTE ; gl_ssao_bias + Line 295: EXTRN ?gl_ssao_radius@@3VFFloatCVar@@A:BYTE ; gl_ssao_radius + Line 296: EXTRN ?gl_exposure_scale@@3VFFloatCVar@@A:BYTE ; gl_exposure_scale + Line 297: EXTRN ?gl_exposure_min@@3VFFloatCVar@@A:BYTE ; gl_exposure_min + Line 298: EXTRN ?gl_exposure_base@@3VFFloatCVar@@A:BYTE ; gl_exposure_base + Line 299: EXTRN ?gl_exposure_speed@@3VFFloatCVar@@A:BYTE ; gl_exposure_speed + Line 300: EXTRN ?gl_fxaa@@3VFIntCVar@@A:BYTE ; gl_fxaa + Line 301: EXTRN ?gl_ssao_blur@@3VFFloatCVar@@A:BYTE ; gl_ssao_blur + Line 302: EXTRN ?gl_ssao_exponent@@3VFFloatCVar@@A:BYTE ; gl_ssao_exponent + Line 303: EXTRN ?gl_paltonemap_powtable@@3VFFloatCVar@@A:BYTE ; gl_paltonemap_powtable + Line 304: EXTRN ?gl_paltonemap_reverselookup@@3VFBoolCVar@@A:BYTE ; gl_paltonemap_reverselookup + Line 305: EXTRN ?gl_menu_blur@@3VFFloatCVar@@A:BYTE ; gl_menu_blur + Line 306: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_postprocess_cvars.cod (8 hits) + Line 31: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 164: EXTRN atexit:PROC + Line 165: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 166: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 167: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 168: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 169: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 170: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_postprocessshader.cod (12 hits) + Line 24: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 25: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 86: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 87: EXTRN atexit:PROC + Line 88: EXTRN __std_terminate:PROC + Line 89: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 90: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 91: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 92: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 93: EXTRN ?SuperFastHash@@YAIPEBD_K@Z:PROC ; SuperFastHash + Line 94: EXTRN __CxxFrameHandler3:PROC + Line 95: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_precache.cod (29 hits) + Line 17: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 18: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 19: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 20: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 21: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 22: EXTRN ??_V@YAXPEAX_K@Z:PROC ; operator delete[] + Line 23: EXTRN __std_terminate:PROC + Line 24: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 25: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 26: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 27: EXTRN ?GetUniqueIndex@FRemapTable@@QEAAHXZ:PROC ; FRemapTable::GetUniqueIndex + Line 28: EXTRN ?TranslationToTable@@YAPEAUFRemapTable@@H@Z:PROC ; TranslationToTable + Line 29: EXTRN ?DestroyVertexBuffer@FModel@@QEAAXXZ:PROC ; FModel::DestroyVertexBuffer + Line 30: EXTRN ?FindModelFrame@@YAPEAUFSpriteModelFrame@@PEBVPClass@@HH_N@Z:PROC ; FindModelFrame + Line 31: EXTRN ?Precache@FMaterial@@QEAAXXZ:PROC ; FMaterial::Precache + Line 32: EXTRN ?PrecacheList@FMaterial@@QEAAXAEAV?$TMap@H_NU?$THashTraits@H@@U?$TValueTraits@_N@@@@@Z:PROC ; FMaterial::PrecacheList + Line 33: EXTRN ?ValidateTexture@FMaterial@@SAPEAV1@PEAVFTexture@@_N1@Z:PROC ; FMaterial::ValidateTexture + Line 34: EXTRN ?BeginPrecaching@FImageSource@@SAXXZ:PROC ; FImageSource::BeginPrecaching + Line 35: EXTRN ?EndPrecaching@FImageSource@@SAXXZ:PROC ; FImageSource::EndPrecaching + Line 36: EXTRN ?RegisterForPrecache@FImageSource@@SAXPEAV1@@Z:PROC ; FImageSource::RegisterForPrecache + Line 37: EXTRN __CxxFrameHandler3:PROC + Line 38: EXTRN memmove:PROC + Line 39: EXTRN memset:PROC + Line 40: EXTRN ?SpriteFrames@@3V?$TArray@Uspriteframe_t@@U1@@@A:BYTE ; SpriteFrames + Line 41: EXTRN ?sprites@@3V?$TArray@Uspritedef_t@@U1@@@A:BYTE ; sprites + Line 42: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 43: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 44: EXTRN ?Models@@3V?$TDeletingArray@PEAVFModel@@PEAV1@@@A:BYTE ; Models + Line 45: EXTRN ?gl_precache@@3VFBoolCVar@@A:BYTE ; gl_precache + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_presentshader.cod (16 hits) + Line 52: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 53: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 54: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 55: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 56: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 57: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 58: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 59: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 60: EXTRN ?AppendFormat@FString@@QEAAXPEBDZZ:PROC ; FString::AppendFormat + Line 61: EXTRN _CxxThrowException:PROC + Line 62: EXTRN __CxxFrameHandler3:PROC + Line 63: EXTRN memmove:PROC + Line 64: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 65: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 66: EXTRN __ImageBase:BYTE + Line 67: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_renderhacks.cod (25 hits) + Line 45: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 46: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 47: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 48: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 49: EXTRN ?ValidatePortal@sector_t@@QEAAPEAUFSectorPortal@@H@Z:PROC ; sector_t::ValidatePortal + Line 50: EXTRN ?GetFloorLight@@YAHPEBUsector_t@@@Z:PROC ; GetFloorLight + Line 51: EXTRN ?GetCeilingLight@@YAHPEBUsector_t@@@Z:PROC ; GetCeilingLight + Line 52: EXTRN ?PointInRenderSubsector@FLevelLocals@@QEAAPEAUsubsector_t@@HH@Z:PROC ; FLevelLocals::PointInRenderSubsector + Line 53: EXTRN ?ProcessLowerMiniseg@GLWall@@QEAAXPEAUHWDrawInfo@@PEAUseg_t@@PEAUsector_t@@2@Z:PROC ; GLWall::ProcessLowerMiniseg + Line 54: EXTRN ?ProcessSector@GLFlat@@QEAAXPEAUHWDrawInfo@@PEAUsector_t@@H@Z:PROC ; GLFlat::ProcessSector + Line 55: EXTRN ?GetLight@FDynLightData@@QEAA_NHAEAVPlane@@PEAUFDynamicLight@@_N@Z:PROC ; FDynLightData::GetLight + Line 56: EXTRN ?AllocVertices@FFlatVertexBuffer@@QEAA?AU?$pair@PEAUFFlatVertex@@I@std@@I@Z:PROC ; FFlatVertexBuffer::AllocVertices + Line 57: EXTRN ?UploadLights@FLightBuffer@@QEAAHAEAUFDynLightData@@@Z:PROC ; FLightBuffer::UploadLights + Line 58: EXTRN ?hw_FakeFlat@@YAPEAUsector_t@@PEAU1@W4area_t@@_N0@Z:PROC ; hw_FakeFlat + Line 59: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 60: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 61: EXTRN ?validcount@@3HA:DWORD ; validcount + Line 62: EXTRN ?skyflatnum@@3VFTextureID@@A:DWORD ; skyflatnum + Line 63: EXTRN ?RenderDataAllocator@@3VFMemArena@@A:BYTE ; RenderDataAllocator + Line 64: EXTRN ?iter_dlightf@@3HA:DWORD ; iter_dlightf + Line 65: EXTRN ?draw_dlightf@@3HA:DWORD ; draw_dlightf + Line 66: EXTRN ?rendered_lines@@3HA:DWORD ; rendered_lines + Line 67: EXTRN ?lightdata@@3UFDynLightData@@A:BYTE ; lightdata + Line 68: EXTRN _fltused:DWORD + Line 69: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_renderstate.cod (6 hits) + Line 24: EXTRN ?CalcLightLevel@HWDrawInfo@@QEAAHHH_NH@Z:PROC ; HWDrawInfo::CalcLightLevel + Line 25: EXTRN ?CalcLightColor@HWDrawInfo@@QEAA?AUPalEntry@@HU2@H@Z:PROC ; HWDrawInfo::CalcLightColor + Line 26: EXTRN ?GetFogDensity@HWDrawInfo@@QEAAMHUPalEntry@@HH@Z:PROC ; HWDrawInfo::GetFogDensity + Line 27: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 28: EXTRN ?gl_fogmode@@3VFIntCVar@@A:BYTE ; gl_fogmode + Line 29: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_shaderpatcher.cod (12 hits) + Line 21: EXTRN strtol:PROC + Line 22: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 23: EXTRN ??0FString@@QEAA@PEBD_K@Z:PROC ; FString::FString + Line 24: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 25: EXTRN ?LockBuffer@FString@@QEAAPEADXZ:PROC ; FString::LockBuffer + Line 26: EXTRN ?UnlockBuffer@FString@@QEAAXXZ:PROC ; FString::UnlockBuffer + Line 27: EXTRN ?IndexOf@FString@@QEBAJPEBDJ@Z:PROC ; FString::IndexOf + Line 28: EXTRN ?IndexOf@FString@@QEBAJDJ@Z:PROC ; FString::IndexOf + Line 29: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 30: EXTRN __CxxFrameHandler3:PROC + Line 31: EXTRN strcmp:PROC + Line 32: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_shadowmap.cod (26 hits) + Line 17: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 18: EXTRN ??_EStat_shadowmap@@UEAAPEAXI@Z:PROC ; Stat_shadowmap::`vector deleting destructor' + Line 59: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 60: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 61: EXTRN atexit:PROC + Line 62: EXTRN __std_terminate:PROC + Line 63: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 64: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 65: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 66: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 67: EXTRN ??0LevelAABBTree@hwrenderer@@QEAA@PEAUFLevelLocals@@@Z:PROC ; hwrenderer::LevelAABBTree::LevelAABBTree + Line 68: EXTRN ?RayTest@LevelAABBTree@hwrenderer@@QEAANAEBU?$TVector3@N@@0@Z:PROC ; hwrenderer::LevelAABBTree::RayTest + Line 69: EXTRN ?Update@LevelAABBTree@hwrenderer@@QEAA_NXZ:PROC ; hwrenderer::LevelAABBTree::Update + Line 70: EXTRN ??0FStat@@QEAA@PEBD@Z:PROC ; FStat::FStat + Line 71: EXTRN ??1FStat@@UEAA@XZ:PROC ; FStat::~FStat + Line 72: EXTRN ??_EIShadowMap@@UEAAPEAXI@Z:PROC ; IShadowMap::`vector deleting destructor' + Line 73: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 74: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 75: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 76: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 77: EXTRN __CxxFrameHandler3:PROC + Line 78: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 79: EXTRN ?PerfToMillisec@@3NA:QWORD ; PerfToMillisec + Line 80: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 81: EXTRN ?level@@3UFLevelLocals@@A:BYTE ; level + Line 82: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_shadowmapshader.cod (16 hits) + Line 48: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 49: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 50: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 51: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 52: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 53: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 54: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 55: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 56: EXTRN ?AppendFormat@FString@@QEAAXPEBDZZ:PROC ; FString::AppendFormat + Line 57: EXTRN _CxxThrowException:PROC + Line 58: EXTRN __CxxFrameHandler3:PROC + Line 59: EXTRN memmove:PROC + Line 60: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 61: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 62: EXTRN __ImageBase:BYTE + Line 63: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_sky.cod (11 hits) + Line 28: EXTRN atexit:PROC + Line 29: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 30: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 31: EXTRN ?ValidatePortal@sector_t@@QEAAPEAUFSectorPortal@@H@Z:PROC ; sector_t::ValidatePortal + Line 32: EXTRN ?PutPortal@GLWall@@QEAAXPEAUHWDrawInfo@@HH@Z:PROC ; GLWall::PutPortal + Line 33: EXTRN ?ValidateTexture@FMaterial@@SAPEAV1@VFTextureID@@_N11@Z:PROC ; FMaterial::ValidateTexture + Line 34: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 35: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 36: EXTRN ?skyflatnum@@3VFTextureID@@A:DWORD ; skyflatnum + Line 37: EXTRN ?gl_plane_reflection_i@@3_NA:BYTE ; gl_plane_reflection_i + Line 38: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_skydome.cod (16 hits) + Line 37: EXTRN __std_terminate:PROC + Line 38: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 39: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 40: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 41: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 42: EXTRN ?translate@VSMatrix@@QEAAXMMM@Z:PROC ; VSMatrix::translate + Line 43: EXTRN ?scale@VSMatrix@@QEAAXMMM@Z:PROC ; VSMatrix::scale + Line 44: EXTRN ?rotate@VSMatrix@@QEAAXMMMM@Z:PROC ; VSMatrix::rotate + Line 45: EXTRN ?loadIdentity@VSMatrix@@QEAAXXZ:PROC ; VSMatrix::loadIdentity + Line 46: EXTRN __CxxFrameHandler3:PROC + Line 47: EXTRN floorf:PROC + Line 48: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 49: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 50: EXTRN ?skyoffset@@3VFFloatCVar@@A:BYTE ; skyoffset + Line 51: EXTRN _fltused:DWORD + Line 52: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_skyportal.cod (8 hits) + Line 19: EXTRN ?GetSkyCapColor@FTexture@@QEAA?AUPalEntry@@_N@Z:PROC ; FTexture::GetSkyCapColor + Line 20: EXTRN ?rotate@VSMatrix@@QEAAXMMMM@Z:PROC ; VSMatrix::rotate + Line 21: EXTRN ?loadIdentity@VSMatrix@@QEAAXXZ:PROC ; VSMatrix::loadIdentity + Line 22: EXTRN ?SetupMatrices@FSkyVertexBuffer@@QEAAXPEAUHWDrawInfo@@PEAVFMaterial@@MM_NHAEAVVSMatrix@@3@Z:PROC ; FSkyVertexBuffer::SetupMatrices + Line 23: EXTRN ?SetupView@HWDrawInfo@@QEAAXAEAVFRenderState@@MMM_N1@Z:PROC ; HWDrawInfo::SetupView + Line 24: EXTRN ?ValidateTexture@FMaterial@@SAPEAV1@PEAVFTexture@@_N1@Z:PROC ; FMaterial::ValidateTexture + Line 25: EXTRN ?LegacyRenderStyles@@3PATFRenderStyle@@A:BYTE ; LegacyRenderStyles + Line 26: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_spritelight.cod (15 hits) + Line 28: EXTRN __std_terminate:PROC + Line 29: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 30: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 31: EXTRN c_sqrt:PROC + Line 32: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 33: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 34: EXTRN ?ShadowTest@IShadowMap@@QEAA_NPEAUFDynamicLight@@AEBU?$TVector3@N@@@Z:PROC ; IShadowMap::ShadowTest + Line 35: EXTRN ?AddLightToList@FDynLightData@@QEAAXHPEAUFDynamicLight@@_N@Z:PROC ; FDynLightData::AddLightToList + Line 36: EXTRN __tlregdtor:PROC + Line 37: EXTRN __CxxFrameHandler3:PROC + Line 38: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 39: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 40: EXTRN ?dl_validcount@@3HA:DWORD ; dl_validcount + Line 41: EXTRN _fltused:DWORD + Line 42: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_sprites.cod (85 hits) + Line 79: EXTRN _purecall:PROC + Line 80: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 81: EXTRN __std_terminate:PROC + Line 82: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 83: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 84: EXTRN c_atan2:PROC + Line 85: EXTRN c_sqrt:PROC + Line 86: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 87: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 88: EXTRN ?CheckSpriteGlow@sector_t@@QEAAHHAEBU?$TVector3@N@@@Z:PROC ; sector_t::CheckSpriteGlow + Line 89: EXTRN ?GetFloorLight@@YAHPEBUsector_t@@@Z:PROC ; GetFloorLight + Line 90: EXTRN ?GetCeilingLight@@YAHPEBUsector_t@@@Z:PROC ; GetCeilingLight + Line 91: EXTRN ?CheckFuzz@FRenderStyle@@QEAAXXZ:PROC ; FRenderStyle::CheckFuzz + Line 92: EXTRN ?IsVisible@FRenderStyle@@QEBA_NN@Z:PROC ; FRenderStyle::IsVisible + Line 93: EXTRN ?GetTranslucency@FTexture@@QEAA_NXZ:PROC ; FTexture::GetTranslucency + Line 94: EXTRN ?GetSpriteFrame@spritedef_t@@QEAA?AVFTextureID@@HHU?$TAngle@N@@PEA_N_N@Z:PROC ; spritedef_t::GetSpriteFrame + Line 95: EXTRN ?P_TranslatePortalXY@@YAXPEAUline_t@@AEAN1@Z:PROC ; P_TranslatePortalXY + Line 96: EXTRN ?P_TranslatePortalAngle@@YAXPEAUline_t@@AEAU?$TAngle@N@@@Z:PROC ; P_TranslatePortalAngle + Line 97: EXTRN ?P_TranslatePortalZ@@YAXPEAUline_t@@AEAN@Z:PROC ; P_TranslatePortalZ + Line 98: EXTRN ?IsVisibleToPlayer@AActor@@QEBA_NXZ:PROC ; AActor::IsVisibleToPlayer + Line 99: EXTRN ?IsInsideVisibleAngles@AActor@@QEBA_NXZ:PROC ; AActor::IsInsideVisibleAngles + Line 100: EXTRN ?P_CheckPlayerSprite@@YAXPEAVAActor@@AEAHAEAU?$TVector2@N@@@Z:PROC ; P_CheckPlayerSprite + Line 101: EXTRN ?RenderModel@FModelRenderer@@QEAAXMMMPEAUFSpriteModelFrame@@PEAVAActor@@N@Z:PROC ; FModelRenderer::RenderModel + Line 102: EXTRN ??_EFModelRenderer@@UEAAPEAXI@Z:PROC ; FModelRenderer::`vector deleting destructor' + Line 103: EXTRN ?FindModelFrame@@YAPEAUFSpriteModelFrame@@PEBVPClass@@HH_N@Z:PROC ; FindModelFrame + Line 104: EXTRN ?BeginDrawModel@FGLModelRenderer@@UEAAXPEAVAActor@@PEAUFSpriteModelFrame@@AEBVVSMatrix@@_N@Z:PROC ; FGLModelRenderer::BeginDrawModel + Line 105: EXTRN ?EndDrawModel@FGLModelRenderer@@UEAAXPEAVAActor@@PEAUFSpriteModelFrame@@@Z:PROC ; FGLModelRenderer::EndDrawModel + Line 106: EXTRN ?CreateVertexBuffer@FGLModelRenderer@@UEAAPEAVIModelVertexBuffer@@_N0@Z:PROC ; FGLModelRenderer::CreateVertexBuffer + Line 107: EXTRN ?GetViewToWorldMatrix@FGLModelRenderer@@UEAA?AVVSMatrix@@XZ:PROC ; FGLModelRenderer::GetViewToWorldMatrix + Line 108: EXTRN ?BeginDrawHUDModel@FGLModelRenderer@@UEAAXPEAVAActor@@AEBVVSMatrix@@_N@Z:PROC ; FGLModelRenderer::BeginDrawHUDModel + Line 109: EXTRN ?EndDrawHUDModel@FGLModelRenderer@@UEAAXPEAVAActor@@@Z:PROC ; FGLModelRenderer::EndDrawHUDModel + Line 110: EXTRN ?SetInterpolation@FGLModelRenderer@@UEAAXN@Z:PROC ; FGLModelRenderer::SetInterpolation + Line 111: EXTRN ?SetMaterial@FGLModelRenderer@@UEAAXPEAVFTexture@@_NH@Z:PROC ; FGLModelRenderer::SetMaterial + Line 112: EXTRN ?DrawArrays@FGLModelRenderer@@UEAAXHH@Z:PROC ; FGLModelRenderer::DrawArrays + Line 113: EXTRN ?DrawElements@FGLModelRenderer@@UEAAXH_K@Z:PROC ; FGLModelRenderer::DrawElements + Line 114: EXTRN ??_EFGLModelRenderer@@UEAAPEAXI@Z:PROC ; FGLModelRenderer::`vector deleting destructor' + Line 115: EXTRN ?hw_GetDynModelLight@@YAXPEAVAActor@@AEAUFDynLightData@@@Z:PROC ; hw_GetDynModelLight + Line 116: EXTRN ?SetColor@HWDrawInfo@@QEAAXAEAVFRenderState@@HH_NAEBUFColormap@@M1@Z:PROC ; HWDrawInfo::SetColor + Line 117: EXTRN ?SetFog@HWDrawInfo@@QEAAXAEAVFRenderState@@HH_NPEBUFColormap@@1@Z:PROC ; HWDrawInfo::SetFog + Line 118: EXTRN ?GetFogDensity@HWDrawInfo@@QEAAMHUPalEntry@@HH@Z:PROC ; HWDrawInfo::GetFogDensity + Line 119: EXTRN ?GetDynSpriteLight@HWDrawInfo@@QEAAXPEAVAActor@@PEAUparticle_t@@PEAM@Z:PROC ; HWDrawInfo::GetDynSpriteLight + Line 120: EXTRN ?AddSprite@HWDrawInfo@@QEAAXPEAVGLSprite@@_N@Z:PROC ; HWDrawInfo::AddSprite + Line 121: EXTRN ?hw_FakeFlat@@YAPEAUsector_t@@PEAU1@W4area_t@@_N0@Z:PROC ; hw_FakeFlat + Line 122: EXTRN ?ValidateTexture@FMaterial@@SAPEAV1@VFTextureID@@_N11@Z:PROC ; FMaterial::ValidateTexture + Line 123: EXTRN ?AllocVertices@FFlatVertexBuffer@@QEAA?AU?$pair@PEAUFFlatVertex@@I@std@@I@Z:PROC ; FFlatVertexBuffer::AllocVertices + Line 124: EXTRN ?UploadLights@FLightBuffer@@QEAAHAEAUFDynLightData@@@Z:PROC ; FLightBuffer::UploadLights + Line 125: EXTRN __CxxFrameHandler3:PROC + Line 126: EXTRN __libm_sse2_sincos_:PROC + Line 127: EXTRN __libm_sse2_sincosf_:PROC + Line 128: EXTRN atan2f:PROC + Line 129: EXTRN cosf:PROC + Line 130: EXTRN expf:PROC + Line 131: EXTRN sinf:PROC + Line 132: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 133: EXTRN ?paused@@3HA:DWORD ; paused + Line 134: EXTRN ?LegacyRenderStyles@@3PATFRenderStyle@@A:BYTE ; LegacyRenderStyles + Line 135: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 136: EXTRN ?skyflatnum@@3VFTextureID@@A:DWORD ; skyflatnum + Line 137: EXTRN ?sprites@@3V?$TArray@Uspritedef_t@@U1@@@A:BYTE ; sprites + Line 138: EXTRN ?r_viewpoint@@3UFRenderViewpoint@@A:BYTE ; r_viewpoint + Line 139: EXTRN ?validcount@@3HA:DWORD ; validcount + Line 140: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 141: EXTRN ?r_UseVanillaTransparency@@3_NA:BYTE ; r_UseVanillaTransparency + Line 142: EXTRN ?gl_enhanced_nightvision@@3VFBoolCVar@@A:BYTE ; gl_enhanced_nightvision + Line 143: EXTRN ?gl_weaponlight@@3VFIntCVar@@A:BYTE ; gl_weaponlight + Line 144: EXTRN ?gl_light_sprites@@3VFBoolCVar@@A:BYTE ; gl_light_sprites + Line 145: EXTRN ?gl_light_particles@@3VFBoolCVar@@A:BYTE ; gl_light_particles + Line 146: EXTRN ?gl_mask_sprite_threshold@@3VFFloatCVar@@A:BYTE ; gl_mask_sprite_threshold + Line 147: EXTRN ?gl_usecolorblending@@3VFBoolCVar@@A:BYTE ; gl_usecolorblending + Line 148: EXTRN ?gl_sprite_blend@@3VFBoolCVar@@A:BYTE ; gl_sprite_blend + Line 149: EXTRN ?gl_spriteclip@@3VFIntCVar@@A:BYTE ; gl_spriteclip + Line 150: EXTRN ?gl_sclipthreshold@@3VFFloatCVar@@A:BYTE ; gl_sclipthreshold + Line 151: EXTRN ?gl_sclipfactor@@3VFFloatCVar@@A:BYTE ; gl_sclipfactor + Line 152: EXTRN ?gl_particles_style@@3VFIntCVar@@A:BYTE ; gl_particles_style + Line 153: EXTRN ?gl_billboard_mode@@3VFIntCVar@@A:BYTE ; gl_billboard_mode + Line 154: EXTRN ?gl_billboard_faces_camera@@3VFBoolCVar@@A:BYTE ; gl_billboard_faces_camera + Line 155: EXTRN ?gl_billboard_particles@@3VFBoolCVar@@A:BYTE ; gl_billboard_particles + Line 156: EXTRN ?gl_fuzztype@@3VFIntCVar@@A:BYTE ; gl_fuzztype + Line 157: EXTRN ?rendered_sprites@@3HA:DWORD ; rendered_sprites + Line 158: EXTRN ?lightdata@@3UFDynLightData@@A:BYTE ; lightdata + Line 159: EXTRN ?r_renderercaps@@3IA:DWORD ; r_renderercaps + Line 160: EXTRN ?r_debug_disable_vis_filter@@3VFBoolCVar@@A:BYTE ; r_debug_disable_vis_filter + Line 161: EXTRN ?transsouls@@3VFFloatCVar@@A:BYTE ; transsouls + Line 162: EXTRN _fltused:DWORD + Line 163: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_stereo_cvars.cod (6 hits) + Line 41: EXTRN atexit:PROC + Line 42: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 43: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 44: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 45: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 46: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_vertexbuilder.cod (12 hits) + Line 84: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 85: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 86: EXTRN __std_terminate:PROC + Line 87: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 88: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 89: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 90: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 91: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 92: EXTRN _CxxThrowException:PROC + Line 93: EXTRN __CxxFrameHandler3:PROC + Line 94: EXTRN memmove:PROC + Line 95: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_viewpointbuffer.cod (9 hits) + Line 22: EXTRN __std_terminate:PROC + Line 23: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 24: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 25: EXTRN ?ortho@VSMatrix@@QEAAXMMMMMM@Z:PROC ; VSMatrix::ortho + Line 26: EXTRN ?computeNormalMatrix@VSMatrix@@QEAAXPEBM@Z:PROC ; VSMatrix::computeNormalMatrix + Line 27: EXTRN ?SetDefaults@HWViewpointUniforms@@QEAAXXZ:PROC ; HWViewpointUniforms::SetDefaults + Line 28: EXTRN __CxxFrameHandler3:PROC + Line 29: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 30: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_vrmodes.cod (17 hits) + Line 59: EXTRN atexit:PROC + Line 60: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 61: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 62: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 63: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 64: EXTRN ?loadIdentity@VSMatrix@@QEAAXXZ:PROC ; VSMatrix::loadIdentity + Line 65: EXTRN ?perspective@VSMatrix@@QEAAXMMMM@Z:PROC ; VSMatrix::perspective + Line 66: EXTRN ?ortho@VSMatrix@@QEAAXMMMMMM@Z:PROC ; VSMatrix::ortho + Line 67: EXTRN ?frustum@VSMatrix@@QEAAXMMMMMM@Z:PROC ; VSMatrix::frustum + Line 68: EXTRN atanf:PROC + Line 69: EXTRN cosf:PROC + Line 70: EXTRN sinf:PROC + Line 71: EXTRN tanf:PROC + Line 72: EXTRN ?vid_rendermode@@3VFIntCVar@@A:BYTE ; vid_rendermode + Line 73: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 74: EXTRN __ImageBase:BYTE + Line 75: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_walls.cod (100 hits) + Line 120: EXTRN _purecall:PROC + Line 121: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 122: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 123: EXTRN _Init_thread_header:PROC + Line 124: EXTRN _Init_thread_footer:PROC + Line 125: EXTRN __std_terminate:PROC + Line 126: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 127: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 128: EXTRN c_sqrt:PROC + Line 129: EXTRN ?_Xbad_function_call@std@@YAXXZ:PROC ; std::_Xbad_function_call + Line 130: EXTRN ?GetRawTexture@FTexture@@QEAAPEAV1@XZ:PROC ; FTexture::GetRawTexture + Line 131: EXTRN ?GetTranslucency@FTexture@@QEAA_NXZ:PROC ; FTexture::GetTranslucency + Line 132: EXTRN ?RowOffset@FTexCoordInfo@@QEBAMM@Z:PROC ; FTexCoordInfo::RowOffset + Line 133: EXTRN ?TextureOffset@FTexCoordInfo@@QEBAMM@Z:PROC ; FTexCoordInfo::TextureOffset + Line 134: EXTRN ?TextureAdjustWidth@FTexCoordInfo@@QEBAMXZ:PROC ; FTexCoordInfo::TextureAdjustWidth + Line 135: EXTRN ?GetFromTexture@FTexCoordInfo@@QEAAXPEAVFTexture@@MM_N@Z:PROC ; FTexCoordInfo::GetFromTexture + Line 136: EXTRN ?RecalcVertexHeights@vertex_t@@QEAAXXZ:PROC ; vertex_t::RecalcVertexHeights + Line 137: EXTRN ?P_GetPlaneLight@@YAPEAUlightlist_t@@PEAUsector_t@@PEAUsecplane_t@@_N@Z:PROC ; P_GetPlaneLight + Line 138: EXTRN ?GetWallGlow@sector_t@@QEAA_NPEAM0@Z:PROC ; sector_t::GetWallGlow + Line 139: EXTRN ?GetLightLevel@side_t@@QEBAH_NH0PEAH@Z:PROC ; side_t::GetLightLevel + Line 140: EXTRN ?GetFloorLight@@YAHPEBUsector_t@@@Z:PROC ; GetFloorLight + Line 141: EXTRN ?GetCeilingLight@@YAHPEBUsector_t@@@Z:PROC ; GetCeilingLight + Line 142: EXTRN ?GetLight@FDynLightData@@QEAA_NHAEAVPlane@@PEAUFDynamicLight@@_N@Z:PROC ; FDynLightData::GetLight + Line 143: EXTRN ?GetAreas@FMaterial@@QEBAHPEAPEAUFloatRect@@@Z:PROC ; FMaterial::GetAreas + Line 144: EXTRN ?ValidateTexture@FMaterial@@SAPEAV1@PEAVFTexture@@_N1@Z:PROC ; FMaterial::ValidateTexture + Line 145: EXTRN ?ValidateTexture@FMaterial@@SAPEAV1@VFTextureID@@_N11@Z:PROC ; FMaterial::ValidateTexture + Line 146: EXTRN ?SetColor@HWDrawInfo@@QEAAXAEAVFRenderState@@HH_NAEBUFColormap@@M1@Z:PROC ; HWDrawInfo::SetColor + Line 147: EXTRN ?SetFog@HWDrawInfo@@QEAAXAEAVFRenderState@@HH_NPEBUFColormap@@1@Z:PROC ; HWDrawInfo::SetFog + Line 148: EXTRN ?CheckFog@HWDrawInfo@@QEAA_NPEAUsector_t@@0@Z:PROC ; HWDrawInfo::CheckFog + Line 149: EXTRN ?FindPortal@HWDrawInfo@@QEAAPEAVHWPortal@@PEBX@Z:PROC ; HWDrawInfo::FindPortal + Line 150: EXTRN ?AddUpperMissingTexture@HWDrawInfo@@QEAAXPEAUside_t@@PEAUsubsector_t@@M@Z:PROC ; HWDrawInfo::AddUpperMissingTexture + Line 151: EXTRN ?AddLowerMissingTexture@HWDrawInfo@@QEAAXPEAUside_t@@PEAUsubsector_t@@M@Z:PROC ; HWDrawInfo::AddLowerMissingTexture + Line 152: EXTRN ?ProcessActorsInPortal@HWDrawInfo@@QEAAXPEAUFLinePortalSpan@@W4area_t@@@Z:PROC ; HWDrawInfo::ProcessActorsInPortal + Line 153: EXTRN ?AddWall@HWDrawInfo@@QEAAXPEAVGLWall@@@Z:PROC ; HWDrawInfo::AddWall + Line 154: EXTRN ?AddMirrorSurface@HWDrawInfo@@QEAAXPEAVGLWall@@@Z:PROC ; HWDrawInfo::AddMirrorSurface + Line 155: EXTRN ?MakeVertices@GLWall@@QEAAXPEAUHWDrawInfo@@_N@Z:PROC ; GLWall::MakeVertices + Line 156: EXTRN ?SkyPlane@GLWall@@QEAAXPEAUHWDrawInfo@@PEAUsector_t@@H_N@Z:PROC ; GLWall::SkyPlane + Line 157: EXTRN ?SkyLine@GLWall@@QEAAXPEAUHWDrawInfo@@PEAUsector_t@@PEAUline_t@@@Z:PROC ; GLWall::SkyLine + Line 158: EXTRN ?SkyNormal@GLWall@@QEAAXPEAUHWDrawInfo@@PEAUsector_t@@PEAUvertex_t@@2@Z:PROC ; GLWall::SkyNormal + Line 159: EXTRN ?SkyTop@GLWall@@QEAAXPEAUHWDrawInfo@@PEAUseg_t@@PEAUsector_t@@2PEAUvertex_t@@3@Z:PROC ; GLWall::SkyTop + Line 160: EXTRN ?SkyBottom@GLWall@@QEAAXPEAUHWDrawInfo@@PEAUseg_t@@PEAUsector_t@@2PEAUvertex_t@@3@Z:PROC ; GLWall::SkyBottom + Line 161: EXTRN ?ProcessDecals@GLWall@@QEAAXPEAUHWDrawInfo@@@Z:PROC ; GLWall::ProcessDecals + Line 162: EXTRN ?DrawDecalsForMirror@GLWall@@QEAAXPEAUHWDrawInfo@@AEAVFRenderState@@AEAV?$TArray@PEAUGLDecal@@PEAU1@@@@Z:PROC ; GLWall::DrawDecalsForMirror + Line 163: EXTRN ??_EHWPortal@@UEAAPEAXI@Z:PROC ; HWPortal::`vector deleting destructor' + Line 164: EXTRN ??_EHWScenePortalBase@@UEAAPEAXI@Z:PROC ; HWScenePortalBase::`vector deleting destructor' + Line 165: EXTRN ?ClipSeg@HWLinePortal@@UEAAHPEAUseg_t@@AEBU?$TVector3@N@@@Z:PROC ; HWLinePortal::ClipSeg + Line 166: EXTRN ?ClipSubsector@HWLinePortal@@UEAAHPEAUsubsector_t@@@Z:PROC ; HWLinePortal::ClipSubsector + Line 167: EXTRN ?ClipPoint@HWLinePortal@@UEAAHAEBU?$TVector2@N@@@Z:PROC ; HWLinePortal::ClipPoint + Line 168: EXTRN ??_EHWLinePortal@@UEAAPEAXI@Z:PROC ; HWLinePortal::`vector deleting destructor' + Line 169: EXTRN ?Setup@HWMirrorPortal@@MEAA_NPEAUHWDrawInfo@@AEAVFRenderState@@PEAVClipper@@@Z:PROC ; HWMirrorPortal::Setup + Line 170: EXTRN ?Shutdown@HWMirrorPortal@@MEAAXPEAUHWDrawInfo@@AEAVFRenderState@@@Z:PROC ; HWMirrorPortal::Shutdown + Line 171: EXTRN ?GetName@HWMirrorPortal@@MEAAPEBDXZ:PROC ; HWMirrorPortal::GetName + Line 172: EXTRN ??_EHWMirrorPortal@@UEAAPEAXI@Z:PROC ; HWMirrorPortal::`vector deleting destructor' + Line 173: EXTRN ?Setup@HWLineToLinePortal@@MEAA_NPEAUHWDrawInfo@@AEAVFRenderState@@PEAVClipper@@@Z:PROC ; HWLineToLinePortal::Setup + Line 174: EXTRN ?GetName@HWLineToLinePortal@@MEAAPEBDXZ:PROC ; HWLineToLinePortal::GetName + Line 175: EXTRN ?RenderAttached@HWLineToLinePortal@@MEAAXPEAUHWDrawInfo@@@Z:PROC ; HWLineToLinePortal::RenderAttached + Line 176: EXTRN ??_EHWLineToLinePortal@@UEAAPEAXI@Z:PROC ; HWLineToLinePortal::`vector deleting destructor' + Line 177: EXTRN ?Setup@HWSkyboxPortal@@MEAA_NPEAUHWDrawInfo@@AEAVFRenderState@@PEAVClipper@@@Z:PROC ; HWSkyboxPortal::Setup + Line 178: EXTRN ?Shutdown@HWSkyboxPortal@@MEAAXPEAUHWDrawInfo@@AEAVFRenderState@@@Z:PROC ; HWSkyboxPortal::Shutdown + Line 179: EXTRN ?GetName@HWSkyboxPortal@@MEAAPEBDXZ:PROC ; HWSkyboxPortal::GetName + Line 180: EXTRN ??_EHWSkyboxPortal@@UEAAPEAXI@Z:PROC ; HWSkyboxPortal::`vector deleting destructor' + Line 181: EXTRN ?Setup@HWSectorStackPortal@@MEAA_NPEAUHWDrawInfo@@AEAVFRenderState@@PEAVClipper@@@Z:PROC ; HWSectorStackPortal::Setup + Line 182: EXTRN ?Shutdown@HWSectorStackPortal@@MEAAXPEAUHWDrawInfo@@AEAVFRenderState@@@Z:PROC ; HWSectorStackPortal::Shutdown + Line 183: EXTRN ?GetName@HWSectorStackPortal@@MEAAPEBDXZ:PROC ; HWSectorStackPortal::GetName + Line 184: EXTRN ??_EHWSectorStackPortal@@UEAAPEAXI@Z:PROC ; HWSectorStackPortal::`vector deleting destructor' + Line 185: EXTRN ?Setup@HWPlaneMirrorPortal@@MEAA_NPEAUHWDrawInfo@@AEAVFRenderState@@PEAVClipper@@@Z:PROC ; HWPlaneMirrorPortal::Setup + Line 186: EXTRN ?Shutdown@HWPlaneMirrorPortal@@MEAAXPEAUHWDrawInfo@@AEAVFRenderState@@@Z:PROC ; HWPlaneMirrorPortal::Shutdown + Line 187: EXTRN ?GetName@HWPlaneMirrorPortal@@MEAAPEBDXZ:PROC ; HWPlaneMirrorPortal::GetName + Line 188: EXTRN ??_EHWPlaneMirrorPortal@@UEAAPEAXI@Z:PROC ; HWPlaneMirrorPortal::`vector deleting destructor' + Line 189: EXTRN ??0HWHorizonPortal@@QEAA@PEAUFPortalSceneState@@PEAUGLHorizonInfo@@AEAUFRenderViewpoint@@_N@Z:PROC ; HWHorizonPortal::HWHorizonPortal + Line 190: EXTRN ?DrawContents@HWEEHorizonPortal@@MEAAXPEAUHWDrawInfo@@AEAVFRenderState@@@Z:PROC ; HWEEHorizonPortal::DrawContents + Line 191: EXTRN ?GetName@HWEEHorizonPortal@@MEAAPEBDXZ:PROC ; HWEEHorizonPortal::GetName + Line 192: EXTRN ??_EHWEEHorizonPortal@@UEAAPEAXI@Z:PROC ; HWEEHorizonPortal::`vector deleting destructor' + Line 193: EXTRN ?DrawContents@HWSkyPortal@@MEAAXPEAUHWDrawInfo@@AEAVFRenderState@@@Z:PROC ; HWSkyPortal::DrawContents + Line 194: EXTRN ?GetName@HWSkyPortal@@MEAAPEBDXZ:PROC ; HWSkyPortal::GetName + Line 195: EXTRN ??_EHWSkyPortal@@UEAAPEAXI@Z:PROC ; HWSkyPortal::`vector deleting destructor' + Line 196: EXTRN ?UploadLights@FLightBuffer@@QEAAHAEAUFDynLightData@@@Z:PROC ; FLightBuffer::UploadLights + Line 197: EXTRN __CxxFrameHandler3:PROC + Line 198: EXTRN memcmp:PROC + Line 199: EXTRN _Init_thread_epoch:DWORD + Line 200: EXTRN ?LegacyRenderStyles@@3PATFRenderStyle@@A:BYTE ; LegacyRenderStyles + Line 201: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 202: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 203: EXTRN ?skyflatnum@@3VFTextureID@@A:DWORD ; skyflatnum + Line 204: EXTRN ?r_viewpoint@@3UFRenderViewpoint@@A:BYTE ; r_viewpoint + Line 205: EXTRN ?lightdata@@3UFDynLightData@@A:BYTE ; lightdata + Line 206: EXTRN ?gl_weaponlight@@3VFIntCVar@@A:BYTE ; gl_weaponlight + Line 207: EXTRN ?gl_fogmode@@3VFIntCVar@@A:BYTE ; gl_fogmode + Line 208: EXTRN ?gl_mirror_envmap@@3VFBoolCVar@@A:BYTE ; gl_mirror_envmap + Line 209: EXTRN ?gl_mirrors@@3VFBoolCVar@@A:BYTE ; gl_mirrors + Line 210: EXTRN ?gl_seamless@@3VFBoolCVar@@A:BYTE ; gl_seamless + Line 211: EXTRN ?gl_mask_threshold@@3VFFloatCVar@@A:BYTE ; gl_mask_threshold + Line 212: EXTRN ?gl_mask_sprite_threshold@@3VFFloatCVar@@A:BYTE ; gl_mask_sprite_threshold + Line 213: EXTRN ?iter_dlight@@3HA:DWORD ; iter_dlight + Line 214: EXTRN ?draw_dlight@@3HA:DWORD ; draw_dlight + Line 215: EXTRN ?render_texsplit@@3HA:DWORD ; render_texsplit + Line 216: EXTRN ?vertexcount@@3HA:DWORD ; vertexcount + Line 217: EXTRN __ImageBase:BYTE + Line 218: EXTRN _fltused:DWORD + Line 219: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_walls_vertex.cod (4 hits) + Line 20: EXTRN ?AllocVertices@FFlatVertexBuffer@@QEAA?AU?$pair@PEAUFFlatVertex@@I@std@@I@Z:PROC ; FFlatVertexBuffer::AllocVertices + Line 21: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 22: EXTRN ?gl_seamless@@3VFBoolCVar@@A:BYTE ; gl_seamless + Line 23: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\hw_weapon.cod (60 hits) + Line 39: EXTRN _purecall:PROC + Line 40: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 41: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 42: EXTRN ?CheckSpriteGlow@sector_t@@QEAAHHAEBU?$TVector3@N@@@Z:PROC ; sector_t::CheckSpriteGlow + Line 43: EXTRN ?IsVisible@FRenderStyle@@QEBA_NN@Z:PROC ; FRenderStyle::IsVisible + Line 44: EXTRN ?GetSpriteFrame@spritedef_t@@QEAA?AVFTextureID@@HHU?$TAngle@N@@PEA_N_N@Z:PROC ; spritedef_t::GetSpriteFrame + Line 45: EXTRN ?GetTranslucency@FTexture@@QEAA_NXZ:PROC ; FTexture::GetTranslucency + Line 46: EXTRN ?AlterWeaponSprite@AActor@@QEAAXPEAUvisstyle_t@@@Z:PROC ; AActor::AlterWeaponSprite + Line 47: EXTRN ?GetRenderStyle@DPSprite@@QEAA?AU?$pair@TFRenderStyle@@M@std@@TFRenderStyle@@N@Z:PROC ; DPSprite::GetRenderStyle + Line 48: EXTRN ?GetYAdjust@DPSprite@@QEAAM_N@Z:PROC ; DPSprite::GetYAdjust + Line 49: EXTRN ?P_BobWeapon@@YAXPEAVplayer_t@@PEAM1N@Z:PROC ; P_BobWeapon + Line 50: EXTRN ?FindPSprite@player_t@@QEAAPEAVDPSprite@@H@Z:PROC ; player_t::FindPSprite + Line 51: EXTRN ?RenderHUDModel@FModelRenderer@@QEAAXPEAVDPSprite@@MM@Z:PROC ; FModelRenderer::RenderHUDModel + Line 52: EXTRN ??_EFModelRenderer@@UEAAPEAXI@Z:PROC ; FModelRenderer::`vector deleting destructor' + Line 53: EXTRN ?FindModelFrame@@YAPEAUFSpriteModelFrame@@PEBVPClass@@HH_N@Z:PROC ; FindModelFrame + Line 54: EXTRN ?IsHUDModelForPlayerAvailable@@YA_NPEAVplayer_t@@@Z:PROC ; IsHUDModelForPlayerAvailable + Line 55: EXTRN ?hw_FakeFlat@@YAPEAUsector_t@@PEAU1@W4area_t@@_N0@Z:PROC ; hw_FakeFlat + Line 56: EXTRN ?BeginDrawModel@FGLModelRenderer@@UEAAXPEAVAActor@@PEAUFSpriteModelFrame@@AEBVVSMatrix@@_N@Z:PROC ; FGLModelRenderer::BeginDrawModel + Line 57: EXTRN ?EndDrawModel@FGLModelRenderer@@UEAAXPEAVAActor@@PEAUFSpriteModelFrame@@@Z:PROC ; FGLModelRenderer::EndDrawModel + Line 58: EXTRN ?CreateVertexBuffer@FGLModelRenderer@@UEAAPEAVIModelVertexBuffer@@_N0@Z:PROC ; FGLModelRenderer::CreateVertexBuffer + Line 59: EXTRN ?GetViewToWorldMatrix@FGLModelRenderer@@UEAA?AVVSMatrix@@XZ:PROC ; FGLModelRenderer::GetViewToWorldMatrix + Line 60: EXTRN ?BeginDrawHUDModel@FGLModelRenderer@@UEAAXPEAVAActor@@AEBVVSMatrix@@_N@Z:PROC ; FGLModelRenderer::BeginDrawHUDModel + Line 61: EXTRN ?EndDrawHUDModel@FGLModelRenderer@@UEAAXPEAVAActor@@@Z:PROC ; FGLModelRenderer::EndDrawHUDModel + Line 62: EXTRN ?SetInterpolation@FGLModelRenderer@@UEAAXN@Z:PROC ; FGLModelRenderer::SetInterpolation + Line 63: EXTRN ?SetMaterial@FGLModelRenderer@@UEAAXPEAVFTexture@@_NH@Z:PROC ; FGLModelRenderer::SetMaterial + Line 64: EXTRN ?DrawArrays@FGLModelRenderer@@UEAAXHH@Z:PROC ; FGLModelRenderer::DrawArrays + Line 65: EXTRN ?DrawElements@FGLModelRenderer@@UEAAXH_K@Z:PROC ; FGLModelRenderer::DrawElements + Line 66: EXTRN ??_EFGLModelRenderer@@UEAAPEAXI@Z:PROC ; FGLModelRenderer::`vector deleting destructor' + Line 67: EXTRN ?ValidateTexture@FMaterial@@SAPEAV1@VFTextureID@@_N11@Z:PROC ; FMaterial::ValidateTexture + Line 68: EXTRN ?SetColor@HWDrawInfo@@QEAAXAEAVFRenderState@@HH_NAEBUFColormap@@M1@Z:PROC ; HWDrawInfo::SetColor + Line 69: EXTRN ?CalcLightLevel@HWDrawInfo@@QEAAHHH_NH@Z:PROC ; HWDrawInfo::CalcLightLevel + Line 70: EXTRN ?GetDynSpriteLight@HWDrawInfo@@QEAAXPEAVAActor@@PEAUparticle_t@@PEAM@Z:PROC ; HWDrawInfo::GetDynSpriteLight + Line 71: EXTRN ?hw_GetDynModelLight@@YAXPEAVAActor@@AEAUFDynLightData@@@Z:PROC ; hw_GetDynModelLight + Line 72: EXTRN ?AllocVertices@FFlatVertexBuffer@@QEAA?AU?$pair@PEAUFFlatVertex@@I@std@@I@Z:PROC ; FFlatVertexBuffer::AllocVertices + Line 73: EXTRN ?UploadLights@FLightBuffer@@QEAAHAEAUFDynLightData@@@Z:PROC ; FLightBuffer::UploadLights + Line 74: EXTRN __CxxFrameHandler3:PROC + Line 75: EXTRN ?LegacyRenderStyles@@3PATFRenderStyle@@A:BYTE ; LegacyRenderStyles + Line 76: EXTRN ?CrosshairImage@@3PEAVFTexture@@EA:QWORD ; CrosshairImage + Line 77: EXTRN ?viewwindowx@@3HA:DWORD ; viewwindowx + Line 78: EXTRN ?viewwindowy@@3HA:DWORD ; viewwindowy + Line 79: EXTRN ?viewwidth@@3HA:DWORD ; viewwidth + Line 80: EXTRN ?viewheight@@3HA:DWORD ; viewheight + Line 81: EXTRN ?sprites@@3V?$TArray@Uspritedef_t@@U1@@@A:BYTE ; sprites + Line 82: EXTRN ?r_viewpoint@@3UFRenderViewpoint@@A:BYTE ; r_viewpoint + Line 83: EXTRN ?r_viewwindow@@3UFViewWindow@@A:BYTE ; r_viewwindow + Line 84: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 85: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 86: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 87: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 88: EXTRN ?lightdata@@3UFDynLightData@@A:BYTE ; lightdata + Line 89: EXTRN ?gl_weaponlight@@3VFIntCVar@@A:BYTE ; gl_weaponlight + Line 90: EXTRN ?screenblocks@@3VFIntCVar@@A:BYTE ; screenblocks + Line 91: EXTRN ?gl_light_sprites@@3VFBoolCVar@@A:BYTE ; gl_light_sprites + Line 92: EXTRN ?gl_mask_sprite_threshold@@3VFFloatCVar@@A:BYTE ; gl_mask_sprite_threshold + Line 93: EXTRN ?gl_fuzztype@@3VFIntCVar@@A:BYTE ; gl_fuzztype + Line 94: EXTRN ?transsouls@@3VFFloatCVar@@A:BYTE ; transsouls + Line 95: EXTRN ?r_drawplayersprites@@3VFBoolCVar@@A:BYTE ; r_drawplayersprites + Line 96: EXTRN ?r_deathcamera@@3VFBoolCVar@@A:BYTE ; r_deathcamera + Line 97: EXTRN _fltused:DWORD + Line 98: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\i_cd.cod (32 hits) + Line 57: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 58: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 59: EXTRN atexit:PROC + Line 60: EXTRN toupper:PROC + Line 61: EXTRN __imp_SetThreadPriority:PROC + Line 62: EXTRN __imp_DispatchMessageA:PROC + Line 63: EXTRN __imp_PeekMessageA:PROC + Line 64: EXTRN __imp_DefWindowProcA:PROC + Line 65: EXTRN __imp_RegisterClassA:PROC + Line 66: EXTRN __imp_UnregisterClassA:PROC + Line 67: EXTRN __imp_CreateWindowExA:PROC + Line 68: EXTRN __imp_DestroyWindow:PROC + Line 69: EXTRN __imp_GetWindowLongPtrA:PROC + Line 70: EXTRN __imp_SetWindowLongPtrA:PROC + Line 71: EXTRN __imp_mciSendCommandA:PROC + Line 72: EXTRN strtoul:PROC + Line 73: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 74: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 75: EXTRN ??0FStringCVar@@QEAA@PEBD0IP6AXAEAV0@@Z@Z:PROC ; FStringCVar::FStringCVar + Line 76: EXTRN ??1FStringCVar@@UEAA@XZ:PROC ; FStringCVar::~FStringCVar + Line 77: EXTRN ?atterm@@YAXP6AXXZ@Z:PROC ; atterm + Line 78: EXTRN ?CheckParm@FArgs@@QEBAHPEBDH@Z:PROC ; FArgs::CheckParm + Line 79: EXTRN ??0FHelperThread@@QEAA@XZ:PROC ; FHelperThread::FHelperThread + Line 80: EXTRN ??1FHelperThread@@UEAA@XZ:PROC ; FHelperThread::~FHelperThread + Line 81: EXTRN ?DestroyThread@FHelperThread@@QEAAXXZ:PROC ; FHelperThread::DestroyThread + Line 82: EXTRN ?LaunchThread@FHelperThread@@QEAA_NXZ:PROC ; FHelperThread::LaunchThread + Line 83: EXTRN ?SendMessageA@FHelperThread@@QEAAKKKKK_N@Z:PROC ; FHelperThread::SendMessageA + Line 84: EXTRN ??_EFCDThread@@UEAAPEAXI@Z:PROC ; FCDThread::`vector deleting destructor' + Line 85: EXTRN __CxxFrameHandler3:PROC + Line 86: EXTRN ?Args@@3PEAVFArgs@@EA:QWORD ; Args + Line 87: EXTRN ?g_hInst@@3PEAUHINSTANCE__@@EA:QWORD ; g_hInst + Line 88: EXTRN __ImageBase:BYTE + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\i_crash.cod (72 hits) + Line 123: EXTRN strrchr:PROC + Line 124: EXTRN strstr:PROC + Line 125: EXTRN stricmp:PROC + Line 126: EXTRN __imp_RtlVirtualUnwind:PROC + Line 127: EXTRN __imp_CreateFileA:PROC + Line 128: EXTRN __imp_GetFileSize:PROC + Line 129: EXTRN __imp_ReadFile:PROC + Line 130: EXTRN __imp_SetFilePointer:PROC + Line 131: EXTRN __imp_WriteFile:PROC + Line 132: EXTRN __imp_GetTempPathA:PROC + Line 133: EXTRN __imp_GetTempFileNameA:PROC + Line 134: EXTRN __imp_CloseHandle:PROC + Line 135: EXTRN __imp_HeapAlloc:PROC + Line 136: EXTRN __imp_GetProcessHeap:PROC + Line 137: EXTRN __imp_WaitForSingleObject:PROC + Line 138: EXTRN __imp_GetCurrentProcess:PROC + Line 139: EXTRN __imp_GetCurrentProcessId:PROC + Line 140: EXTRN __imp_CreateThread:PROC + Line 141: EXTRN __imp_GetCurrentThreadId:PROC + Line 142: EXTRN __imp_GetExitCodeThread:PROC + Line 143: EXTRN __imp_GetVersionExA:PROC + Line 144: EXTRN __imp_VirtualQuery:PROC + Line 145: EXTRN __imp_FreeLibrary:PROC + Line 146: EXTRN __imp_GetModuleFileNameA:PROC + Line 147: EXTRN __imp_GetModuleHandleA:PROC + Line 148: EXTRN __imp_GetProcAddress:PROC + Line 149: EXTRN __imp_LoadLibraryA:PROC + Line 150: EXTRN __imp_BitBlt:PROC + Line 151: EXTRN __imp_CreateBitmap:PROC + Line 152: EXTRN __imp_CreateCompatibleBitmap:PROC + Line 153: EXTRN __imp_CreateCompatibleDC:PROC + Line 154: EXTRN __imp_DeleteDC:PROC + Line 155: EXTRN __imp_DeleteObject:PROC + Line 156: EXTRN __imp_GetMapMode:PROC + Line 157: EXTRN __imp_GetStockObject:PROC + Line 158: EXTRN __imp_SelectObject:PROC + Line 159: EXTRN __imp_SetBkColor:PROC + Line 160: EXTRN __imp_SetMapMode:PROC + Line 161: EXTRN __imp_GetObjectA:PROC + Line 162: EXTRN __imp_DPtoLP:PROC + Line 163: EXTRN __imp_SendMessageA:PROC + Line 164: EXTRN __imp_CallWindowProcA:PROC + Line 165: EXTRN __imp_ShowWindow:PROC + Line 166: EXTRN __imp_SetWindowPos:PROC + Line 167: EXTRN __imp_CreateDialogParamA:PROC + Line 168: EXTRN __imp_DialogBoxParamA:PROC + Line 169: EXTRN __imp_EndDialog:PROC + Line 170: EXTRN __imp_GetDlgItem:PROC + Line 171: EXTRN __imp_BeginPaint:PROC + Line 172: EXTRN __imp_EndPaint:PROC + Line 173: EXTRN __imp_GetUpdateRect:PROC + Line 174: EXTRN __imp_SetWindowTextA:PROC + Line 175: EXTRN __imp_GetWindowRect:PROC + Line 176: EXTRN __imp_MessageBoxA:PROC + Line 177: EXTRN __imp_ScreenToClient:PROC + Line 178: EXTRN __imp_GetWindowLongPtrA:PROC + Line 179: EXTRN __imp_SetWindowLongPtrA:PROC + Line 180: EXTRN __imp_GetSaveFileNameA:PROC + Line 181: EXTRN __imp_ShellExecuteA:PROC + Line 182: EXTRN __stdio_common_vsprintf:PROC + Line 183: EXTRN mysnprintf:PROC + Line 184: EXTRN _localtime64:PROC + Line 185: EXTRN _time64:PROC + Line 186: EXTRN deflate:PROC + Line 187: EXTRN deflateEnd:PROC + Line 188: EXTRN crc32:PROC + Line 189: EXTRN deflateInit2_:PROC + Line 190: EXTRN ?I_FlushBufferedConsoleStuff@@YAXXZ:PROC ; I_FlushBufferedConsoleStuff + Line 191: EXTRN __C_specific_handler:PROC + Line 192: EXTRN memcpy:PROC + Line 193: EXTRN memset:PROC + Line 194: EXTRN ?g_hInst@@3PEAUHINSTANCE__@@EA:QWORD ; g_hInst + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\i_dijoy.cod (69 hits) + Line 118: EXTRN _purecall:PROC + Line 119: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 120: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 121: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 122: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 123: EXTRN atexit:PROC + Line 124: EXTRN __std_terminate:PROC + Line 125: EXTRN strstr:PROC + Line 126: EXTRN wcsstr:PROC + Line 127: EXTRN free:PROC + Line 128: EXTRN malloc:PROC + Line 129: EXTRN qsort:PROC + Line 130: EXTRN __imp_CoSetProxyBlanket:PROC + Line 131: EXTRN __imp_CoCreateInstance:PROC + Line 132: EXTRN __imp_SysAllocString:PROC + Line 133: EXTRN __imp_SysFreeString:PROC + Line 134: EXTRN __stdio_common_vswscanf:PROC + Line 135: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 136: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 137: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 138: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 139: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 140: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 141: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 142: EXTRN ?AppendFormat@FString@@QEAAXPEBDZZ:PROC ; FString::AppendFormat + Line 143: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 144: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 145: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 146: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 147: EXTRN ??1IJoystickConfig@@UEAA@XZ:PROC ; IJoystickConfig::~IJoystickConfig + Line 148: EXTRN ?M_LoadJoystickConfig@@YA_NPEAUIJoystickConfig@@@Z:PROC ; M_LoadJoystickConfig + Line 149: EXTRN ?M_SaveJoystickConfig@@YAXPEAUIJoystickConfig@@@Z:PROC ; M_SaveJoystickConfig + Line 150: EXTRN ?Joy_GenerateButtonEvents@@YAXHHHH@Z:PROC ; Joy_GenerateButtonEvents + Line 151: EXTRN ?Joy_XYAxesToButtons@@YAHNN@Z:PROC ; Joy_XYAxesToButtons + Line 152: EXTRN ?Joy_RemoveDeadZone@@YANNNPEAE@Z:PROC ; Joy_RemoveDeadZone + Line 153: EXTRN ?UpdateJoystickMenu@@YAXPEAUIJoystickConfig@@@Z:PROC ; UpdateJoystickMenu + Line 154: EXTRN ??1FInputDevice@@UEAA@XZ:PROC ; FInputDevice::~FInputDevice + Line 155: EXTRN ?ProcessInput@FInputDevice@@UEAAXXZ:PROC ; FInputDevice::ProcessInput + Line 156: EXTRN ?ProcessRawInput@FInputDevice@@UEAA_NPEAUtagRAWINPUT@@H@Z:PROC ; FInputDevice::ProcessRawInput + Line 157: EXTRN ?WndProcHook@FInputDevice@@UEAA_NPEAUHWND__@@I_K_JPEA_J@Z:PROC ; FInputDevice::WndProcHook + Line 158: EXTRN ?I_IsPS2Adapter@@YA_NK@Z:PROC ; I_IsPS2Adapter + Line 159: EXTRN ?D_PostEvent@@YAXPEBUevent_t@@@Z:PROC ; D_PostEvent + Line 160: EXTRN ?FormatGUID@@YAXPEAD_KAEBU_GUID@@@Z:PROC ; FormatGUID + Line 161: EXTRN ?CheckParm@FArgs@@QEBAHPEBDH@Z:PROC ; FArgs::CheckParm + Line 162: EXTRN ??_EFDInputJoystick@@UEAAPEAXI@Z:PROC ; FDInputJoystick::`vector deleting destructor' + Line 163: EXTRN ??_EFDInputJoystickManager@@UEAAPEAXI@Z:PROC ; FDInputJoystickManager::`vector deleting destructor' + Line 164: EXTRN __CxxFrameHandler3:PROC + Line 165: EXTRN __chkstk:PROC + Line 166: EXTRN memcmp:PROC + Line 167: EXTRN memmove:PROC + Line 168: EXTRN memset:PROC + Line 169: EXTRN GUID_XAxis:BYTE + Line 170: EXTRN GUID_YAxis:BYTE + Line 171: EXTRN GUID_ZAxis:BYTE + Line 172: EXTRN GUID_RxAxis:BYTE + Line 173: EXTRN GUID_RyAxis:BYTE + Line 174: EXTRN GUID_RzAxis:BYTE + Line 175: EXTRN GUID_Slider:BYTE + Line 176: EXTRN GUID_Button:BYTE + Line 177: EXTRN GUID_POV:BYTE + Line 178: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 179: EXTRN ?use_joystick@@3VFBoolCVar@@A:BYTE ; use_joystick + Line 180: EXTRN ?JoyDevices@@3PAPEAVFJoystickCollection@@A:BYTE ; JoyDevices + Line 181: EXTRN ?Args@@3PEAVFArgs@@EA:QWORD ; Args + Line 182: EXTRN ?MyGetRawInputDeviceInfoA@@3P6AIPEAXI0PEAI@ZEA:QWORD ; MyGetRawInputDeviceInfoA + Line 183: EXTRN ?MyGetRawInputDeviceList@@3P6AIPEAUtagRAWINPUTDEVICELIST@@PEAII@ZEA:QWORD ; MyGetRawInputDeviceList + Line 184: EXTRN ?g_pdi@@3PEAUIDirectInput8A@@EA:QWORD ; g_pdi + Line 185: EXTRN ?Window@@3PEAUHWND__@@EA:QWORD ; Window + Line 186: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\i_input.cod (75 hits) + Line 4166: EXTRN _purecall:PROC + Line 4167: EXTRN atexit:PROC + Line 4168: EXTRN __imp_GetLastError:PROC + Line 4169: EXTRN __imp_SleepEx:PROC + Line 4170: EXTRN __imp_GetCurrentProcess:PROC + Line 4171: EXTRN __imp_SetPriorityClass:PROC + Line 4172: EXTRN __imp_FreeLibrary:PROC + Line 4173: EXTRN __imp_GetModuleHandleA:PROC + Line 4174: EXTRN __imp_GetProcAddress:PROC + Line 4175: EXTRN __imp_LoadLibraryA:PROC + Line 4176: EXTRN __imp_GlobalAlloc:PROC + Line 4177: EXTRN __imp_GlobalUnlock:PROC + Line 4178: EXTRN __imp_GlobalLock:PROC + Line 4179: EXTRN __imp_TranslateMessage:PROC + Line 4180: EXTRN __imp_DispatchMessageA:PROC + Line 4181: EXTRN __imp_PeekMessageA:PROC + Line 4182: EXTRN __imp_DefWindowProcA:PROC + Line 4183: EXTRN __imp_PostQuitMessage:PROC + Line 4184: EXTRN __imp_OpenClipboard:PROC + Line 4185: EXTRN __imp_CloseClipboard:PROC + Line 4186: EXTRN __imp_SetClipboardData:PROC + Line 4187: EXTRN __imp_GetClipboardData:PROC + Line 4188: EXTRN __imp_EmptyClipboard:PROC + Line 4189: EXTRN __imp_IsClipboardFormatAvailable:PROC + Line 4190: EXTRN __imp_GetKeyState:PROC + Line 4191: EXTRN __imp_MapVirtualKeyA:PROC + Line 4192: EXTRN __imp_SetCapture:PROC + Line 4193: EXTRN __imp_ReleaseCapture:PROC + Line 4194: EXTRN __imp_InvalidateRect:PROC + Line 4195: EXTRN __imp_AdjustWindowRectEx:PROC + Line 4196: EXTRN __imp_SetCursor:PROC + Line 4197: EXTRN exit:PROC + Line 4198: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 4199: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 4200: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 4201: EXTRN ?ResetButtonTriggers@@YAXXZ:PROC ; ResetButtonTriggers + Line 4202: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 4203: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 4204: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 4205: EXTRN ?atterm@@YAXP6AXXZ@Z:PROC ; atterm + Line 4206: EXTRN ?CheckParm@FArgs@@QEBAHPEBDH@Z:PROC ; FArgs::CheckParm + Line 4207: EXTRN ?AllKeysUp@FKeyboard@@QEAAXXZ:PROC ; FKeyboard::AllKeysUp + Line 4208: EXTRN ?I_StartupMouse@@YAXXZ:PROC ; I_StartupMouse + Line 4209: EXTRN ?I_CheckNativeMouse@@YAX_N@Z:PROC ; I_CheckNativeMouse + Line 4210: EXTRN ?I_StartupKeyboard@@YAXXZ:PROC ; I_StartupKeyboard + Line 4211: EXTRN ?I_StartupXInput@@YAXXZ:PROC ; I_StartupXInput + Line 4212: EXTRN ?I_StartupDirectInputJoystick@@YAXXZ:PROC ; I_StartupDirectInputJoystick + Line 4213: EXTRN ?I_StartupRawPS2@@YAXXZ:PROC ; I_StartupRawPS2 + Line 4214: EXTRN ?ScaleCoordsFromWindow@DFrameBuffer@@QEAAXAEAF0@Z:PROC ; DFrameBuffer::ScaleCoordsFromWindow + Line 4215: EXTRN ?S_SetSoundPaused@@YAXH@Z:PROC ; S_SetSoundPaused + Line 4216: EXTRN ?D_PostEvent@@YAXPEBUevent_t@@@Z:PROC ; D_PostEvent + Line 4217: EXTRN ?E_CheckUiProcessors@@YA_NXZ:PROC ; E_CheckUiProcessors + Line 4218: EXTRN __CxxFrameHandler3:PROC + Line 4219: EXTRN __chkstk:PROC + Line 4220: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 4221: EXTRN ?netgame@@3_NA:BYTE ; netgame + Line 4222: EXTRN ?menuactive@@3W4EMenuState@@A:DWORD ; menuactive + Line 4223: EXTRN ?ToggleFullscreen@@3_NA:BYTE ; ToggleFullscreen + Line 4224: EXTRN ?Args@@3PEAVFArgs@@EA:QWORD ; Args + Line 4225: EXTRN ?use_joystick@@3VFBoolCVar@@A:BYTE ; use_joystick + Line 4226: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 4227: EXTRN ?gamestate@@3W4gamestate_t@@A:DWORD ; gamestate + Line 4228: EXTRN ?ConsoleState@@3W4cstate_t@@A:DWORD ; ConsoleState + Line 4229: EXTRN ?g_hInst@@3PEAUHINSTANCE__@@EA:QWORD ; g_hInst + Line 4230: EXTRN ?SessionID@@3KA:DWORD ; SessionID + Line 4231: EXTRN ?Mouse@@3PEAVFMouse@@EA:QWORD ; Mouse + Line 4232: EXTRN ?Keyboard@@3PEAVFKeyboard@@EA:QWORD ; Keyboard + Line 4233: EXTRN ?Window@@3PEAUHWND__@@EA:QWORD ; Window + Line 4234: EXTRN ?language@@3VFStringCVar@@A:BYTE ; language + Line 4235: EXTRN ?use_mouse@@3VFBoolCVar@@A:BYTE ; use_mouse + Line 4236: EXTRN ?CursorState@@3_NA:BYTE ; CursorState + Line 4237: EXTRN ?AppActive@@3_NA:BYTE ; AppActive + Line 4238: EXTRN ?chatmodeon@@3HA:DWORD ; chatmodeon + Line 4239: EXTRN __ImageBase:BYTE + Line 4240: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\i_keyboard.cod (25 hits) + Line 39: EXTRN _purecall:PROC + Line 40: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 41: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 42: EXTRN atexit:PROC + Line 43: EXTRN __std_terminate:PROC + Line 44: EXTRN __imp_GetForegroundWindow:PROC + Line 45: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 46: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 47: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 48: EXTRN ??1FInputDevice@@UEAA@XZ:PROC ; FInputDevice::~FInputDevice + Line 49: EXTRN ?ProcessInput@FInputDevice@@UEAAXXZ:PROC ; FInputDevice::ProcessInput + Line 50: EXTRN ?ProcessRawInput@FInputDevice@@UEAA_NPEAUtagRAWINPUT@@H@Z:PROC ; FInputDevice::ProcessRawInput + Line 51: EXTRN ?WndProcHook@FInputDevice@@UEAA_NPEAUHWND__@@I_K_JPEA_J@Z:PROC ; FInputDevice::WndProcHook + Line 52: EXTRN ??_EFKeyboard@@UEAAPEAXI@Z:PROC ; FKeyboard::`vector deleting destructor' + Line 53: EXTRN ?D_PostEvent@@YAXPEBUevent_t@@@Z:PROC ; D_PostEvent + Line 54: EXTRN ??_EFDInputKeyboard@@UEAAPEAXI@Z:PROC ; FDInputKeyboard::`vector deleting destructor' + Line 55: EXTRN ??_EFRawKeyboard@@UEAAPEAXI@Z:PROC ; FRawKeyboard::`vector deleting destructor' + Line 56: EXTRN __CxxFrameHandler3:PROC + Line 57: EXTRN GUID_SysKeyboard:BYTE + Line 58: EXTRN c_dfDIKeyboard:BYTE + Line 59: EXTRN ?MyRegisterRawInputDevices@@3P6AHPEBUtagRAWINPUTDEVICE@@II@ZEA:QWORD ; MyRegisterRawInputDevices + Line 60: EXTRN ?Window@@3PEAUHWND__@@EA:QWORD ; Window + Line 61: EXTRN ?g_pdi@@3PEAUIDirectInput8A@@EA:QWORD ; g_pdi + Line 62: EXTRN ?g_pdi3@@3PEAUIDirectInputA@@EA:QWORD ; g_pdi3 + Line 63: EXTRN ?GUICapture@@3_NA:BYTE ; GUICapture + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\i_main.cod (139 hits) + Line 174: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 175: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 176: EXTRN atexit:PROC + Line 177: EXTRN __std_terminate:PROC + Line 178: EXTRN strrchr:PROC + Line 179: EXTRN __imp_RtlCaptureContext:PROC + Line 180: EXTRN __imp_GetStdHandle:PROC + Line 181: EXTRN __imp_GetCommandLineA:PROC + Line 182: EXTRN __imp_GetFileInformationByHandle:PROC + Line 183: EXTRN __imp_WriteFile:PROC + Line 184: EXTRN __imp_CloseHandle:PROC + Line 185: EXTRN __imp_DuplicateHandle:PROC + Line 186: EXTRN __imp_SetUnhandledExceptionFilter:PROC + Line 187: EXTRN __imp_GetLastError:PROC + Line 188: EXTRN __imp_HeapAlloc:PROC + Line 189: EXTRN __imp_GetProcessHeap:PROC + Line 190: EXTRN __imp_Sleep:PROC + Line 191: EXTRN __imp_QueueUserAPC:PROC + Line 192: EXTRN __imp_GetCurrentProcess:PROC + Line 193: EXTRN __imp_GetCurrentProcessId:PROC + Line 194: EXTRN __imp_ExitProcess:PROC + Line 195: EXTRN __imp_GetCurrentThread:PROC + Line 196: EXTRN __imp_GetCurrentThreadId:PROC + Line 197: EXTRN __imp_FreeLibrary:PROC + Line 198: EXTRN __imp_GetModuleFileNameA:PROC + Line 199: EXTRN __imp_GetModuleHandleA:PROC + Line 200: EXTRN __imp_GetProcAddress:PROC + Line 201: EXTRN __imp_LoadLibraryA:PROC + Line 202: EXTRN __imp_MulDiv:PROC + Line 203: EXTRN __imp_CreateFontIndirectA:PROC + Line 204: EXTRN __imp_CreateSolidBrush:PROC + Line 205: EXTRN __imp_DeleteObject:PROC + Line 206: EXTRN __imp_GetDeviceCaps:PROC + Line 207: EXTRN __imp_GetStockObject:PROC + Line 208: EXTRN __imp_GetTextExtentPoint32A:PROC + Line 209: EXTRN __imp_SelectObject:PROC + Line 210: EXTRN __imp_SetBkMode:PROC + Line 211: EXTRN __imp_StretchDIBits:PROC + Line 212: EXTRN __imp_SetTextColor:PROC + Line 213: EXTRN __imp_SetTextAlign:PROC + Line 214: EXTRN __imp_GetTextMetricsA:PROC + Line 215: EXTRN __imp_TextOutA:PROC + Line 216: EXTRN __imp_GetMessageA:PROC + Line 217: EXTRN __imp_TranslateMessage:PROC + Line 218: EXTRN __imp_DispatchMessageA:PROC + Line 219: EXTRN __imp_PeekMessageA:PROC + Line 220: EXTRN __imp_SendMessageA:PROC + Line 221: EXTRN __imp_SendMessageW:PROC + Line 222: EXTRN __imp_DefWindowProcA:PROC + Line 223: EXTRN __imp_PostQuitMessage:PROC + Line 224: EXTRN __imp_RegisterClassA:PROC + Line 225: EXTRN __imp_CreateWindowExA:PROC + Line 226: EXTRN __imp_ShowWindow:PROC + Line 227: EXTRN __imp_MoveWindow:PROC + Line 228: EXTRN __imp_SetWindowPos:PROC + Line 229: EXTRN __imp_CreateDialogParamA:PROC + Line 230: EXTRN __imp_GetDlgItem:PROC + Line 231: EXTRN __imp_GetSystemMetrics:PROC + Line 232: EXTRN __imp_DrawIcon:PROC + Line 233: EXTRN __imp_GetDC:PROC + Line 234: EXTRN __imp_ReleaseDC:PROC + Line 235: EXTRN __imp_InvalidateRect:PROC + Line 236: EXTRN __imp_SetWindowTextA:PROC + Line 237: EXTRN __imp_GetWindowTextLengthA:PROC + Line 238: EXTRN __imp_GetClientRect:PROC + Line 239: EXTRN __imp_MessageBoxA:PROC + Line 240: EXTRN __imp_FillRect:PROC + Line 241: EXTRN __imp_SetRect:PROC + Line 242: EXTRN __imp_GetWindowLongA:PROC + Line 243: EXTRN __imp_SetWindowLongA:PROC + Line 244: EXTRN __imp_GetWindowLongPtrA:PROC + Line 245: EXTRN __imp_SetWindowLongPtrA:PROC + Line 246: EXTRN __imp_GetParent:PROC + Line 247: EXTRN __imp_LoadCursorA:PROC + Line 248: EXTRN __imp_LoadIconA:PROC + Line 249: EXTRN __imp_LoadImageA:PROC + Line 250: EXTRN __imp_IsDialogMessageA:PROC + Line 251: EXTRN __imp_MapDialogRect:PROC + Line 252: EXTRN __imp_EnumDisplaySettingsA:PROC + Line 253: EXTRN __imp_AllocConsole:PROC + Line 254: EXTRN __imp_SetConsoleMode:PROC + Line 255: EXTRN __imp_ReadConsoleA:PROC + Line 256: EXTRN __imp_FlushConsoleInputBuffer:PROC + Line 257: EXTRN __imp_timeGetDevCaps:PROC + Line 258: EXTRN __imp_timeBeginPeriod:PROC + Line 259: EXTRN exit:PROC + Line 260: EXTRN __p___argc:PROC + Line 261: EXTRN __p___argv:PROC + Line 262: EXTRN __imp_CoUninitialize:PROC + Line 263: EXTRN __imp_CoInitialize:PROC + Line 264: EXTRN __imp_InitCommonControls:PROC + Line 265: EXTRN _set_new_handler:PROC + Line 266: EXTRN ?I_ShutdownGraphics@@YAXXZ:PROC ; I_ShutdownGraphics + Line 267: EXTRN ?LockBuffer@FString@@QEAAPEADXZ:PROC ; FString::LockBuffer + Line 268: EXTRN ?UnlockBuffer@FString@@QEAAXXZ:PROC ; FString::UnlockBuffer + Line 269: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 270: EXTRN ?Truncate@FString@@QEAAX_K@Z:PROC ; FString::Truncate + Line 271: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 272: EXTRN mysnprintf:PROC + Line 273: EXTRN ?I_DetectOS@@YAXXZ:PROC ; I_DetectOS + Line 274: EXTRN ?I_Quit@@YAXXZ:PROC ; I_Quit + Line 275: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 276: EXTRN ??0FArgs@@QEAA@HPEAPEAD@Z:PROC ; FArgs::FArgs + Line 277: EXTRN ?CheckParm@FArgs@@QEBAHPEBDH@Z:PROC ; FArgs::CheckParm + Line 278: EXTRN ?D_DoomMain@@YAXXZ:PROC ; D_DoomMain + Line 279: EXTRN ?Load@FModule@@QEAA_NV?$initializer_list@PEBD@std@@@Z:PROC ; FModule::Load + Line 280: EXTRN ?Unload@FModule@@QEAAXXZ:PROC ; FModule::Unload + Line 281: EXTRN ?C_InitConsole@@YAXHH_N@Z:PROC ; C_InitConsole + Line 282: EXTRN ?GetGitHash@@YAPEBDXZ:PROC ; GetGitHash + Line 283: EXTRN ?GetGitTime@@YAPEBDXZ:PROC ; GetGitTime + Line 284: EXTRN ?GetVersionString@@YAPEBDXZ:PROC ; GetVersionString + Line 285: EXTRN ?I_InitInput@@YA_NPEAX@Z:PROC ; I_InitInput + Line 286: EXTRN ?I_ShutdownInput@@YAXXZ:PROC ; I_ShutdownInput + Line 287: EXTRN ?GetWadName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetWadName + Line 288: EXTRN ?FixPathSeperator@@YAXPEAD@Z:PROC ; FixPathSeperator + Line 289: EXTRN ?S_StopMusic@@YAX_N@Z:PROC ; S_StopMusic + Line 290: EXTRN ?WndProc@@YA_JPEAUHWND__@@I_K_J@Z:PROC ; WndProc + Line 291: EXTRN ?CreateCrashLog@@YAXPEADKPEAUHWND__@@@Z:PROC ; CreateCrashLog + Line 292: EXTRN ?DisplayCrashLog@@YAXXZ:PROC ; DisplayCrashLog + Line 293: EXTRN ?ST_Util_BitsForBitmap@@YAPEAEPEAUtagBITMAPINFO@@@Z:PROC ; ST_Util_BitsForBitmap + Line 294: EXTRN ?I_FlushBufferedConsoleStuff@@YAXXZ:PROC ; I_FlushBufferedConsoleStuff + Line 295: EXTRN __CxxFrameHandler3:PROC + Line 296: EXTRN memset:PROC + Line 297: EXTRN strcmp:PROC + Line 298: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 299: EXTRN ?batchrun@@3_NA:BYTE ; batchrun + Line 300: EXTRN ?DoomStartupInfo@@3UFStartupInfo@@A:BYTE ; DoomStartupInfo + Line 301: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 302: EXTRN ?progdir@@3VFString@@A:QWORD ; progdir + Line 303: EXTRN ?gamestate@@3W4gamestate_t@@A:DWORD ; gamestate + Line 304: EXTRN ?r_viewpoint@@3UFRenderViewpoint@@A:BYTE ; r_viewpoint + Line 305: EXTRN ?viewactive@@3_NA:BYTE ; viewactive + Line 306: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 307: EXTRN ?stacktrace@CVMAbortException@@2VFString@@A:QWORD ; CVMAbortException::stacktrace + Line 308: EXTRN ?StartScreen@@3PEAVFStartupScreen@@EA:QWORD ; StartScreen + Line 309: EXTRN ?CrashPointers@@3U_EXCEPTION_POINTERS@@A:BYTE ; CrashPointers + Line 310: EXTRN ?StartupBitmap@@3PEAUtagBITMAPINFO@@EA:QWORD ; StartupBitmap + Line 311: EXTRN ?TimerPeriod@@3IA:DWORD ; TimerPeriod + Line 312: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\i_module.cod (4 hits) + Line 12: EXTRN __imp_FreeLibrary:PROC + Line 13: EXTRN __imp_GetModuleHandleA:PROC + Line 14: EXTRN __imp_GetProcAddress:PROC + Line 15: EXTRN __imp_LoadLibraryA:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\i_mouse.cod (45 hits) + Line 93: EXTRN _purecall:PROC + Line 94: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 95: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 96: EXTRN atexit:PROC + Line 97: EXTRN __std_terminate:PROC + Line 98: EXTRN __imp_GetKeyState:PROC + Line 99: EXTRN __imp_GetForegroundWindow:PROC + Line 100: EXTRN __imp_GetClientRect:PROC + Line 101: EXTRN __imp_GetWindowRect:PROC + Line 102: EXTRN __imp_SetCursorPos:PROC + Line 103: EXTRN __imp_SetCursor:PROC + Line 104: EXTRN __imp_GetCursorPos:PROC + Line 105: EXTRN __imp_ClientToScreen:PROC + Line 106: EXTRN __imp_ClipCursor:PROC + Line 107: EXTRN __imp_GetClassLongPtrA:PROC + Line 108: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 109: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 110: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 111: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 112: EXTRN ??1FInputDevice@@UEAA@XZ:PROC ; FInputDevice::~FInputDevice + Line 113: EXTRN ?ProcessInput@FInputDevice@@UEAAXXZ:PROC ; FInputDevice::ProcessInput + Line 114: EXTRN ?ProcessRawInput@FInputDevice@@UEAA_NPEAUtagRAWINPUT@@H@Z:PROC ; FInputDevice::ProcessRawInput + Line 115: EXTRN ?WndProcHook@FInputDevice@@UEAA_NPEAUHWND__@@I_K_JPEA_J@Z:PROC ; FInputDevice::WndProcHook + Line 116: EXTRN ??_EFMouse@@UEAAPEAXI@Z:PROC ; FMouse::`vector deleting destructor' + Line 117: EXTRN ?D_PostEvent@@YAXPEBUevent_t@@@Z:PROC ; D_PostEvent + Line 118: EXTRN ?E_CheckRequireMouse@@YA_NXZ:PROC ; E_CheckRequireMouse + Line 119: EXTRN ??_EFRawMouse@@UEAAPEAXI@Z:PROC ; FRawMouse::`vector deleting destructor' + Line 120: EXTRN ??_EFDInputMouse@@UEAAPEAXI@Z:PROC ; FDInputMouse::`vector deleting destructor' + Line 121: EXTRN ??_EFWin32Mouse@@UEAAPEAXI@Z:PROC ; FWin32Mouse::`vector deleting destructor' + Line 122: EXTRN __CxxFrameHandler3:PROC + Line 123: EXTRN GUID_SysMouse:BYTE + Line 124: EXTRN c_dfDIMouse:BYTE + Line 125: EXTRN c_dfDIMouse2:BYTE + Line 126: EXTRN ?gamestate@@3W4gamestate_t@@A:DWORD ; gamestate + Line 127: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 128: EXTRN ?MyRegisterRawInputDevices@@3P6AHPEBUtagRAWINPUTDEVICE@@II@ZEA:QWORD ; MyRegisterRawInputDevices + Line 129: EXTRN ?menuactive@@3W4EMenuState@@A:DWORD ; menuactive + Line 130: EXTRN ?paused@@3HA:DWORD ; paused + Line 131: EXTRN ?demoplayback@@3_NA:BYTE ; demoplayback + Line 132: EXTRN ?m_use_mouse@@3VFIntCVar@@A:BYTE ; m_use_mouse + Line 133: EXTRN ?Window@@3PEAUHWND__@@EA:QWORD ; Window + Line 134: EXTRN ?g_pdi@@3PEAUIDirectInput8A@@EA:QWORD ; g_pdi + Line 135: EXTRN ?g_pdi3@@3PEAUIDirectInputA@@EA:QWORD ; g_pdi3 + Line 136: EXTRN ?GUICapture@@3_NA:BYTE ; GUICapture + Line 137: EXTRN ?BlockMouseMove@@3HA:DWORD ; BlockMouseMove + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\i_music.cod (75 hits) + Line 39: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 40: EXTRN ?IsAlias@FConsoleCommand@@UEAA_NXZ:PROC ; FConsoleCommand::IsAlias + Line 41: EXTRN ?Run@FUnsafeConsoleCommand@@UEAAXAEAVFCommandLine@@PEAVAActor@@H@Z:PROC ; FUnsafeConsoleCommand::Run + Line 42: EXTRN ??_EFUnsafeConsoleCommand@@UEAAPEAXI@Z:PROC ; FUnsafeConsoleCommand::`vector deleting destructor' + Line 43: EXTRN ?snd_mididevice@@3VFIntCVar@@A:BYTE ; snd_mididevice + Line 44: EXTRN ??_EStat_music@@UEAAPEAXI@Z:PROC ; Stat_music::`vector deleting destructor' + Line 45: EXTRN ?mus_playing@@3UMusPlayingInfo@@A:BYTE ; mus_playing + Line 46: EXTRN ?GSnd@@3PEAVSoundRenderer@@EA:QWORD ; GSnd + Line 212: EXTRN _purecall:PROC + Line 213: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 214: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 215: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 216: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 217: EXTRN atexit:PROC + Line 218: EXTRN __std_terminate:PROC + Line 219: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 220: EXTRN strtod:PROC + Line 221: EXTRN strtol:PROC + Line 222: EXTRN stricmp:PROC + Line 223: EXTRN inflate:PROC + Line 224: EXTRN inflateEnd:PROC + Line 225: EXTRN inflateInit2_:PROC + Line 226: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 227: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 228: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 229: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 230: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 231: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 232: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 233: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 234: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 235: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 236: EXTRN ??_EMusInfo@@UEAAPEAXI@Z:PROC ; MusInfo::`vector deleting destructor' + Line 237: EXTRN ?S_ChangeMusic@@YA_NPEBDH_N1@Z:PROC ; S_ChangeMusic + Line 238: EXTRN ?S_RestartMusic@@YAXXZ:PROC ; S_RestartMusic + Line 239: EXTRN ?S_StopMusic@@YAX_N@Z:PROC ; S_StopMusic + Line 240: EXTRN ?OpenMemoryArray@FileReader@@QEAA_NV?$function@$$A6A_NAEAV?$TArray@EE@@@Z@std@@@Z:PROC ; FileReader::OpenMemoryArray + Line 241: EXTRN ?Open@FileWriter@@SAPEAV1@PEBD@Z:PROC ; FileWriter::Open + Line 242: EXTRN ?WildMidi_Shutdown@@YAHXZ:PROC ; WildMidi_Shutdown + Line 243: EXTRN ?CreateSMF@MIDISource@@QEAAXAEAV?$TArray@EE@@H@Z:PROC ; MIDISource::CreateSMF + Line 244: EXTRN ??0MUSSong2@@QEAA@AEAVFileReader@@@Z:PROC ; MUSSong2::MUSSong2 + Line 245: EXTRN ??0MIDISong2@@QEAA@AEAVFileReader@@@Z:PROC ; MIDISong2::MIDISong2 + Line 246: EXTRN ??0HMISong@@QEAA@AEAVFileReader@@@Z:PROC ; HMISong::HMISong + Line 247: EXTRN ??0XMISong@@QEAA@AEAVFileReader@@@Z:PROC ; XMISong::XMISong + Line 248: EXTRN ?I_InitMusicWin32@@YAXXZ:PROC ; I_InitMusicWin32 + Line 249: EXTRN ?TimidityPP_Shutdown@@YAXXZ:PROC ; TimidityPP_Shutdown + Line 250: EXTRN ??0MIDIStreamer@@QEAA@W4EMidiDevice@@PEBD@Z:PROC ; MIDIStreamer::MIDIStreamer + Line 251: EXTRN ?SetMIDISource@MIDIStreamer@@QEAAXPEAVMIDISource@@@Z:PROC ; MIDIStreamer::SetMIDISource + Line 252: EXTRN ?DumpWave@MIDIStreamer@@QEAA_NPEBDHH@Z:PROC ; MIDIStreamer::DumpWave + Line 253: EXTRN ?DumpOPL@MIDIStreamer@@QEAA_NPEBDH@Z:PROC ; MIDIStreamer::DumpOPL + Line 254: EXTRN ??0OPLMUSSong@@QEAA@AEAVFileReader@@PEBD@Z:PROC ; OPLMUSSong::OPLMUSSong + Line 255: EXTRN ??0CDSong@@QEAA@HH@Z:PROC ; CDSong::CDSong + Line 256: EXTRN ??0CDDAFile@@QEAA@AEAVFileReader@@@Z:PROC ; CDDAFile::CDDAFile + Line 257: EXTRN ?MOD_OpenSong@@YAPEAVMusInfo@@AEAVFileReader@@@Z:PROC ; MOD_OpenSong + Line 258: EXTRN ?GME_CheckFormat@@YAPEBDI@Z:PROC ; GME_CheckFormat + Line 259: EXTRN ?GME_OpenSong@@YAPEAVMusInfo@@AEAVFileReader@@PEBD@Z:PROC ; GME_OpenSong + Line 260: EXTRN ?SndFile_OpenSong@@YAPEAVMusInfo@@AEAVFileReader@@@Z:PROC ; SndFile_OpenSong + Line 261: EXTRN ?CheckParm@FArgs@@QEBAHPEBDH@Z:PROC ; FArgs::CheckParm + Line 262: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 263: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 264: EXTRN ?OpenLumpReader@FWadCollection@@QEAA?AVFileReader@@H@Z:PROC ; FWadCollection::OpenLumpReader + Line 265: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 266: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 267: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 268: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 269: EXTRN ??0FStat@@QEAA@PEBD@Z:PROC ; FStat::FStat + Line 270: EXTRN ??1FStat@@UEAA@XZ:PROC ; FStat::~FStat + Line 271: EXTRN ?FreeAll@Timidity@@YAXXZ:PROC ; Timidity::FreeAll + Line 272: EXTRN ?MUSHeaderSearch@@YAHPEBEH@Z:PROC ; MUSHeaderSearch + Line 273: EXTRN ?I_InitSoundFonts@@YAXXZ:PROC ; I_InitSoundFonts + Line 274: EXTRN dumb_exit:PROC + Line 275: EXTRN __CxxFrameHandler3:PROC + Line 276: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 277: EXTRN ?Args@@3PEAVFArgs@@EA:QWORD ; Args + Line 278: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\i_net.cod (47 hits) + Line 116: EXTRN exit:PROC + Line 117: EXTRN atoi:PROC + Line 118: EXTRN strchr:PROC + Line 119: EXTRN compress2:PROC + Line 120: EXTRN uncompress:PROC + Line 121: EXTRN ??0FString@@QEAA@PEBD_K@Z:PROC ; FString::FString + Line 122: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 123: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 124: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 125: EXTRN bind:PROC + Line 126: EXTRN closesocket:PROC + Line 127: EXTRN ioctlsocket:PROC + Line 128: EXTRN htons:PROC + Line 129: EXTRN inet_addr:PROC + Line 130: EXTRN inet_ntoa:PROC + Line 131: EXTRN ntohl:PROC + Line 132: EXTRN recvfrom:PROC + Line 133: EXTRN sendto:PROC + Line 134: EXTRN socket:PROC + Line 135: EXTRN gethostbyname:PROC + Line 136: EXTRN WSAStartup:PROC + Line 137: EXTRN WSACleanup:PROC + Line 138: EXTRN WSAGetLastError:PROC + Line 139: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 140: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 141: EXTRN mysnprintf:PROC + Line 142: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 143: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 144: EXTRN ?atterm@@YAXP6AXXZ@Z:PROC ; atterm + Line 145: EXTRN ?popterm@@YAXXZ:PROC ; popterm + Line 146: EXTRN ?CheckParm@FArgs@@QEBAHPEBDH@Z:PROC ; FArgs::CheckParm + Line 147: EXTRN ?CheckValue@FArgs@@QEBAPEBDPEBD@Z:PROC ; FArgs::CheckValue + Line 148: EXTRN ?GetArg@FArgs@@QEBAPEBDH@Z:PROC ; FArgs::GetArg + Line 149: EXTRN ?NumArgs@FArgs@@QEBAHXZ:PROC ; FArgs::NumArgs + Line 150: EXTRN ?M_ZLibError@@YA?AVFString@@H@Z:PROC ; M_ZLibError + Line 151: EXTRN __CxxFrameHandler3:PROC + Line 152: EXTRN memcpy:PROC + Line 153: EXTRN memset:PROC + Line 154: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 155: EXTRN ?doomcom@@3Udoomcom_t@@A:BYTE ; doomcom + Line 156: EXTRN ?Args@@3PEAVFArgs@@EA:QWORD ; Args + Line 157: EXTRN ?netgame@@3_NA:BYTE ; netgame + Line 158: EXTRN ?multiplayer@@3_NA:BYTE ; multiplayer + Line 159: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 160: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 161: EXTRN ?StartScreen@@3PEAVFStartupScreen@@EA:QWORD ; StartScreen + Line 162: EXTRN __ImageBase:BYTE + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\i_rawps2.cod (49 hits) + Line 195: EXTRN _purecall:PROC + Line 196: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 197: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 198: EXTRN atexit:PROC + Line 199: EXTRN __std_terminate:PROC + Line 200: EXTRN strchr:PROC + Line 201: EXTRN strrchr:PROC + Line 202: EXTRN strstr:PROC + Line 203: EXTRN free:PROC + Line 204: EXTRN malloc:PROC + Line 205: EXTRN qsort:PROC + Line 206: EXTRN strtoul:PROC + Line 207: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 208: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 209: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 210: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 211: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 212: EXTRN ??YFString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator+= + Line 213: EXTRN ?AppendFormat@FString@@QEAAXPEBDZZ:PROC ; FString::AppendFormat + Line 214: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 215: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 216: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 217: EXTRN ??1IJoystickConfig@@UEAA@XZ:PROC ; IJoystickConfig::~IJoystickConfig + Line 218: EXTRN ?M_LoadJoystickConfig@@YA_NPEAUIJoystickConfig@@@Z:PROC ; M_LoadJoystickConfig + Line 219: EXTRN ?M_SaveJoystickConfig@@YAXPEAUIJoystickConfig@@@Z:PROC ; M_SaveJoystickConfig + Line 220: EXTRN ?Joy_GenerateButtonEvents@@YAXHHHH@Z:PROC ; Joy_GenerateButtonEvents + Line 221: EXTRN ?Joy_GenerateButtonEvents@@YAXHHHPEBH@Z:PROC ; Joy_GenerateButtonEvents + Line 222: EXTRN ?Joy_XYAxesToButtons@@YAHNN@Z:PROC ; Joy_XYAxesToButtons + Line 223: EXTRN ?Joy_RemoveDeadZone@@YANNNPEAE@Z:PROC ; Joy_RemoveDeadZone + Line 224: EXTRN ?UpdateJoystickMenu@@YAXPEAUIJoystickConfig@@@Z:PROC ; UpdateJoystickMenu + Line 225: EXTRN ??1FInputDevice@@UEAA@XZ:PROC ; FInputDevice::~FInputDevice + Line 226: EXTRN ?ProcessInput@FInputDevice@@UEAAXXZ:PROC ; FInputDevice::ProcessInput + Line 227: EXTRN ?ProcessRawInput@FInputDevice@@UEAA_NPEAUtagRAWINPUT@@H@Z:PROC ; FInputDevice::ProcessRawInput + Line 228: EXTRN ?WndProcHook@FInputDevice@@UEAA_NPEAUHWND__@@I_K_JPEA_J@Z:PROC ; FInputDevice::WndProcHook + Line 229: EXTRN ?D_PostEvent@@YAXPEBUevent_t@@@Z:PROC ; D_PostEvent + Line 230: EXTRN ?CheckParm@FArgs@@QEBAHPEBDH@Z:PROC ; FArgs::CheckParm + Line 231: EXTRN ??_EFRawPS2Controller@@UEAAPEAXI@Z:PROC ; FRawPS2Controller::`vector deleting destructor' + Line 232: EXTRN ??_EFRawPS2Manager@@UEAAPEAXI@Z:PROC ; FRawPS2Manager::`vector deleting destructor' + Line 233: EXTRN __CxxFrameHandler3:PROC + Line 234: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 235: EXTRN ?use_joystick@@3VFBoolCVar@@A:BYTE ; use_joystick + Line 236: EXTRN ?JoyDevices@@3PAPEAVFJoystickCollection@@A:BYTE ; JoyDevices + Line 237: EXTRN ?Args@@3PEAVFArgs@@EA:QWORD ; Args + Line 238: EXTRN ?MyGetRawInputDeviceInfoA@@3P6AIPEAXI0PEAI@ZEA:QWORD ; MyGetRawInputDeviceInfoA + Line 239: EXTRN ?MyGetRawInputDeviceList@@3P6AIPEAUtagRAWINPUTDEVICELIST@@PEAII@ZEA:QWORD ; MyGetRawInputDeviceList + Line 240: EXTRN ?MyRegisterRawInputDevices@@3P6AHPEBUtagRAWINPUTDEVICE@@II@ZEA:QWORD ; MyRegisterRawInputDevices + Line 241: EXTRN ?Window@@3PEAUHWND__@@EA:QWORD ; Window + Line 242: EXTRN __ImageBase:BYTE + Line 243: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\i_sound.cod (66 hits) + Line 25: EXTRN ??_EStat_sound@@UEAAPEAXI@Z:PROC ; Stat_sound::`vector deleting destructor' + Line 182: EXTRN _purecall:PROC + Line 183: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 184: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 185: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 186: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 187: EXTRN atexit:PROC + Line 188: EXTRN calloc:PROC + Line 189: EXTRN strncmp:PROC + Line 190: EXTRN stricmp:PROC + Line 191: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 192: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 193: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 194: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 195: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 196: EXTRN ??_ESoundDecoder@@UEAAPEAXI@Z:PROC ; SoundDecoder::`vector deleting destructor' + Line 197: EXTRN ??_ESoundStream@@UEAAPEAXI@Z:PROC ; SoundStream::`vector deleting destructor' + Line 198: EXTRN ??_ESoundRenderer@@UEAAPEAXI@Z:PROC ; SoundRenderer::`vector deleting destructor' + Line 199: EXTRN ?IsOpenALPresent@@YA_NXZ:PROC ; IsOpenALPresent + Line 200: EXTRN ?S_EvictAllChannels@@YAXXZ:PROC ; S_EvictAllChannels + Line 201: EXTRN ?S_StopAllChannels@@YAXXZ:PROC ; S_StopAllChannels + Line 202: EXTRN ?S_RestartMusic@@YAXXZ:PROC ; S_RestartMusic + Line 203: EXTRN ?S_RestoreEvictedChannels@@YAXXZ:PROC ; S_RestoreEvictedChannels + Line 204: EXTRN ?S_UnloadSound@@YAXPEAUsfxinfo_t@@@Z:PROC ; S_UnloadSound + Line 205: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 206: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 207: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 208: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 209: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 210: EXTRN ??0FStringCVar@@QEAA@PEBD0IP6AXAEAV0@@Z@Z:PROC ; FStringCVar::FStringCVar + Line 211: EXTRN ??1FStringCVar@@UEAA@XZ:PROC ; FStringCVar::~FStringCVar + Line 212: EXTRN ?OpenMemory@FileReader@@QEAA_NPEBX_J@Z:PROC ; FileReader::OpenMemory + Line 213: EXTRN ??0FStat@@QEAA@PEBD@Z:PROC ; FStat::FStat + Line 214: EXTRN ??1FStat@@UEAA@XZ:PROC ; FStat::~FStat + Line 215: EXTRN ??0OpenALSoundRenderer@@QEAA@XZ:PROC ; OpenALSoundRenderer::OpenALSoundRenderer + Line 216: EXTRN ?getInfo@MPG123Decoder@@UEAAXPEAHPEAW4ChannelConfig@@PEAW4SampleType@@@Z:PROC ; MPG123Decoder::getInfo + Line 217: EXTRN ?read@MPG123Decoder@@UEAA_KPEAD_K@Z:PROC ; MPG123Decoder::read + Line 218: EXTRN ?seek@MPG123Decoder@@UEAA_N_K_N1@Z:PROC ; MPG123Decoder::seek + Line 219: EXTRN ?getSampleOffset@MPG123Decoder@@UEAA_KXZ:PROC ; MPG123Decoder::getSampleOffset + Line 220: EXTRN ?getSampleLength@MPG123Decoder@@UEAA_KXZ:PROC ; MPG123Decoder::getSampleLength + Line 221: EXTRN ??1MPG123Decoder@@UEAA@XZ:PROC ; MPG123Decoder::~MPG123Decoder + Line 222: EXTRN ?open@MPG123Decoder@@MEAA_NAEAVFileReader@@@Z:PROC ; MPG123Decoder::open + Line 223: EXTRN ??_EMPG123Decoder@@UEAAPEAXI@Z:PROC ; MPG123Decoder::`vector deleting destructor' + Line 224: EXTRN ?getInfo@SndFileDecoder@@UEAAXPEAHPEAW4ChannelConfig@@PEAW4SampleType@@@Z:PROC ; SndFileDecoder::getInfo + Line 225: EXTRN ?read@SndFileDecoder@@UEAA_KPEAD_K@Z:PROC ; SndFileDecoder::read + Line 226: EXTRN ?readAll@SndFileDecoder@@UEAA?AV?$TArray@EE@@XZ:PROC ; SndFileDecoder::readAll + Line 227: EXTRN ?seek@SndFileDecoder@@UEAA_N_K_N1@Z:PROC ; SndFileDecoder::seek + Line 228: EXTRN ?getSampleOffset@SndFileDecoder@@UEAA_KXZ:PROC ; SndFileDecoder::getSampleOffset + Line 229: EXTRN ?getSampleLength@SndFileDecoder@@UEAA_KXZ:PROC ; SndFileDecoder::getSampleLength + Line 230: EXTRN ??1SndFileDecoder@@UEAA@XZ:PROC ; SndFileDecoder::~SndFileDecoder + Line 231: EXTRN ?open@SndFileDecoder@@MEAA_NAEAVFileReader@@@Z:PROC ; SndFileDecoder::open + Line 232: EXTRN ??_ESndFileDecoder@@UEAAPEAXI@Z:PROC ; SndFileDecoder::`vector deleting destructor' + Line 233: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 234: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 235: EXTRN ?I_InitMusic@@YAXXZ:PROC ; I_InitMusic + Line 236: EXTRN ?I_ShutdownMusic@@YAX_N@Z:PROC ; I_ShutdownMusic + Line 237: EXTRN ?CheckParm@FArgs@@QEBAHPEBDH@Z:PROC ; FArgs::CheckParm + Line 238: EXTRN ??_ENullSoundRenderer@@UEAAPEAXI@Z:PROC ; NullSoundRenderer::`vector deleting destructor' + Line 239: EXTRN __CxxFrameHandler3:PROC + Line 240: EXTRN memcpy:PROC + Line 241: EXTRN memset:PROC + Line 242: EXTRN ?batchrun@@3_NA:BYTE ; batchrun + Line 243: EXTRN ?S_sfx@@3V?$TArray@Usfxinfo_t@@U1@@@A:BYTE ; S_sfx + Line 244: EXTRN ?Args@@3PEAVFArgs@@EA:QWORD ; Args + Line 245: EXTRN __ImageBase:BYTE + Line 246: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\i_soundfont.cod (46 hits) + Line 69: EXTRN _purecall:PROC + Line 70: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 71: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 72: EXTRN atexit:PROC + Line 73: EXTRN stricmp:PROC + Line 74: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 75: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 76: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 77: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 78: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 79: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 80: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 81: EXTRN ??HFString@@QEBA?AV0@PEBD@Z:PROC ; FString::operator+ + Line 82: EXTRN ??HFString@@QEBA?AV0@D@Z:PROC ; FString::operator+ + Line 83: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 84: EXTRN ?ReplaceChars@FString@@QEAAXDD@Z:PROC ; FString::ReplaceChars + Line 85: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 86: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 87: EXTRN ??0FStringf@@QEAA@PEBDZZ:PROC ; FStringf::FStringf + Line 88: EXTRN ?OpenFile@FileReader@@QEAA_NPEBD_J1@Z:PROC ; FileReader::OpenFile + Line 89: EXTRN ?OpenMemory@FileReader@@QEAA_NPEBX_J@Z:PROC ; FileReader::OpenMemory + Line 90: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 91: EXTRN ?ReopenLumpReader@FWadCollection@@QEAA?AVFileReader@@H_N@Z:PROC ; FWadCollection::ReopenLumpReader + Line 92: EXTRN ??_EFSoundFontReader@@UEAAPEAXI@Z:PROC ; FSoundFontReader::`vector deleting destructor' + Line 93: EXTRN ??_EFSF2Reader@@UEAAPEAXI@Z:PROC ; FSF2Reader::`vector deleting destructor' + Line 94: EXTRN ??_EFZipPatReader@@UEAAPEAXI@Z:PROC ; FZipPatReader::`vector deleting destructor' + Line 95: EXTRN ??_EFLumpPatchSetReader@@UEAAPEAXI@Z:PROC ; FLumpPatchSetReader::`vector deleting destructor' + Line 96: EXTRN ??_EFPatchSetReader@@UEAAPEAXI@Z:PROC ; FPatchSetReader::`vector deleting destructor' + Line 97: EXTRN ?FileExists@@YA_NPEBD@Z:PROC ; FileExists + Line 98: EXTRN ?ExtractFilePath@@YA?AVFString@@PEBD@Z:PROC ; ExtractFilePath + Line 99: EXTRN ?ExtractFileBase@@YA?AVFString@@PEBD_N@Z:PROC ; ExtractFileBase + Line 100: EXTRN ?NicePath@@YA?AVFString@@PEBD@Z:PROC ; NicePath + Line 101: EXTRN ?IsAbsPath@@YA_NPEBD@Z:PROC ; IsAbsPath + Line 102: EXTRN ?I_FindFirst@@YAPEAXPEBDPEAUfindstate_t@@@Z:PROC ; I_FindFirst + Line 103: EXTRN ?I_FindNext@@YAHPEAXPEAUfindstate_t@@@Z:PROC ; I_FindNext + Line 104: EXTRN ?I_FindClose@@YAHPEAX@Z:PROC ; I_FindClose + Line 105: EXTRN ?SetSection@FConfigFile@@QEAA_NPEBD_N@Z:PROC ; FConfigFile::SetSection + Line 106: EXTRN ?NextInSection@FConfigFile@@QEAA_NAEAPEBD0@Z:PROC ; FConfigFile::NextInSection + Line 107: EXTRN ?OpenResourceFile@FResourceFile@@SAPEAV1@PEBD_N1@Z:PROC ; FResourceFile::OpenResourceFile + Line 108: EXTRN ?FindLump@FResourceFile@@QEAAPEAUFResourceLump@@PEBD@Z:PROC ; FResourceFile::FindLump + Line 109: EXTRN __CxxFrameHandler3:PROC + Line 110: EXTRN memmove:PROC + Line 111: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 112: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 113: EXTRN ?progdir@@3VFString@@A:QWORD ; progdir + Line 114: EXTRN ?GameConfig@@3PEAVFGameConfigFile@@EA:QWORD ; GameConfig + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\i_specialpaths.cod (29 hits) + Line 49: EXTRN __imp_CreateFileA:PROC + Line 50: EXTRN __imp_CloseHandle:PROC + Line 51: EXTRN __imp_GetUserNameA:PROC + Line 52: EXTRN __imp_WideCharToMultiByte:PROC + Line 53: EXTRN __imp_GetACP:PROC + Line 54: EXTRN __imp_CoTaskMemFree:PROC + Line 55: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 56: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 57: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 58: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 59: EXTRN ??YFString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator+= + Line 60: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 61: EXTRN ?Substitute@FString@@QEAAXPEBD0@Z:PROC ; FString::Substitute + Line 62: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 63: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 64: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 65: EXTRN ?FileExists@@YA_NPEBD@Z:PROC ; FileExists + Line 66: EXTRN ?CreatePath@@YAXPEBD@Z:PROC ; CreatePath + Line 67: EXTRN __CxxFrameHandler3:PROC + Line 68: EXTRN FOLDERID_Documents:BYTE + Line 69: EXTRN FOLDERID_RoamingAppData:BYTE + Line 70: EXTRN FOLDERID_LocalAppData:BYTE + Line 71: EXTRN FOLDERID_Pictures:BYTE + Line 72: EXTRN FOLDERID_SavedGames:BYTE + Line 73: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 74: EXTRN ?batchrun@@3_NA:BYTE ; batchrun + Line 75: EXTRN ?progdir@@3VFString@@A:QWORD ; progdir + Line 76: EXTRN ?SHGetFolderPathA@OptWin32@@3V?$TOptProc@$1?Shell32Module@@3VFModule@@AP6AJPEAUHWND__@@HPEAXKPEAD@Z@@A:BYTE ; OptWin32::SHGetFolderPathA + Line 77: EXTRN ?SHGetKnownFolderPath@OptWin32@@3V?$TOptProc@$1?Shell32Module@@3VFModule@@AP6AJAEBU_GUID@@KPEAXPEAPEA_W@Z@@A:BYTE ; OptWin32::SHGetKnownFolderPath + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\i_system.cod (149 hits) + Line 190: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 191: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 192: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 193: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 194: EXTRN atexit:PROC + Line 195: EXTRN __std_terminate:PROC + Line 196: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 197: EXTRN exit:PROC + Line 198: EXTRN strtoul:PROC + Line 199: EXTRN fflush:PROC + Line 200: EXTRN __stdio_common_vfprintf:PROC + Line 201: EXTRN __stdio_common_vsprintf:PROC + Line 202: EXTRN strrchr:PROC + Line 203: EXTRN strncpy:PROC + Line 204: EXTRN stricmp:PROC + Line 205: EXTRN _time64:PROC + Line 206: EXTRN __std_exception_copy:PROC + Line 207: EXTRN __std_exception_destroy:PROC + Line 208: EXTRN ??_Eexception@std@@UEAAPEAXI@Z:PROC ; std::exception::`vector deleting destructor' + Line 209: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 210: EXTRN tolower:PROC + Line 211: EXTRN __imp_FindClose:PROC + Line 212: EXTRN __imp_FindFirstFileA:PROC + Line 213: EXTRN __imp_FindNextFileA:PROC + Line 214: EXTRN __imp_WriteFile:PROC + Line 215: EXTRN __imp_OutputDebugStringA:PROC + Line 216: EXTRN __imp_GetLastError:PROC + Line 217: EXTRN __imp_QueryPerformanceCounter:PROC + Line 218: EXTRN __imp_QueryPerformanceFrequency:PROC + Line 219: EXTRN __imp_GetCurrentProcess:PROC + Line 220: EXTRN __imp_GetCurrentThread:PROC + Line 221: EXTRN __imp_SetThreadPriority:PROC + Line 222: EXTRN __imp_SetPriorityClass:PROC + Line 223: EXTRN __imp_GetVersionExA:PROC + Line 224: EXTRN __imp_GetModuleHandleA:PROC + Line 225: EXTRN __imp_GetProcAddress:PROC + Line 226: EXTRN __imp_LocalFree:PROC + Line 227: EXTRN __imp_GetProcessAffinityMask:PROC + Line 228: EXTRN __imp_SetThreadAffinityMask:PROC + Line 229: EXTRN __imp_FormatMessageA:PROC + Line 230: EXTRN __imp_GetNumaProcessorNode:PROC + Line 231: EXTRN __imp_CreateBitmap:PROC + Line 232: EXTRN __imp_CreateCompatibleBitmap:PROC + Line 233: EXTRN __imp_CreateCompatibleDC:PROC + Line 234: EXTRN __imp_DeleteDC:PROC + Line 235: EXTRN __imp_DeleteObject:PROC + Line 236: EXTRN __imp_GetDeviceCaps:PROC + Line 237: EXTRN __imp_GetStockObject:PROC + Line 238: EXTRN __imp_Rectangle:PROC + Line 239: EXTRN __imp_SelectObject:PROC + Line 240: EXTRN __imp_SetPixelV:PROC + Line 241: EXTRN __imp_CreateDIBSection:PROC + Line 242: EXTRN __imp_SendMessageA:PROC + Line 243: EXTRN __imp_SendMessageW:PROC + Line 244: EXTRN __imp_DialogBoxParamA:PROC + Line 245: EXTRN __imp_EndDialog:PROC + Line 246: EXTRN __imp_GetDlgItem:PROC + Line 247: EXTRN __imp_SetDlgItemTextA:PROC + Line 248: EXTRN __imp_SendDlgItemMessageA:PROC + Line 249: EXTRN __imp_SetFocus:PROC + Line 250: EXTRN __imp_GetAsyncKeyState:PROC + Line 251: EXTRN __imp_SetForegroundWindow:PROC + Line 252: EXTRN __imp_GetDC:PROC + Line 253: EXTRN __imp_ReleaseDC:PROC + Line 254: EXTRN __imp_SetWindowTextA:PROC + Line 255: EXTRN __imp_GetWindowTextA:PROC + Line 256: EXTRN __imp_GetWindowTextLengthA:PROC + Line 257: EXTRN __imp_GetClientRect:PROC + Line 258: EXTRN __imp_MessageBoxA:PROC + Line 259: EXTRN __imp_SetCursor:PROC + Line 260: EXTRN __imp_GetCursorPos:PROC + Line 261: EXTRN __imp_ClientToScreen:PROC + Line 262: EXTRN __imp_SetClassLongPtrA:PROC + Line 263: EXTRN __imp_LoadCursorA:PROC + Line 264: EXTRN __imp_DestroyCursor:PROC + Line 265: EXTRN __imp_CreateIconIndirect:PROC + Line 266: EXTRN __imp_GetLocaleInfoA:PROC + Line 267: EXTRN __imp_SetConsoleTextAttribute:PROC + Line 268: EXTRN __imp_RegCloseKey:PROC + Line 269: EXTRN __imp_RegOpenKeyExA:PROC + Line 270: EXTRN __imp_RegQueryValueExA:PROC + Line 271: EXTRN __imp_timeEndPeriod:PROC + Line 272: EXTRN __imp_CryptAcquireContextA:PROC + Line 273: EXTRN __imp_CryptReleaseContext:PROC + Line 274: EXTRN __imp_CryptGenRandom:PROC + Line 275: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 276: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 277: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 278: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 279: EXTRN ??0FString@@QEAA@PEBD_K@Z:PROC ; FString::FString + Line 280: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 281: EXTRN ?LockNewBuffer@FString@@QEAAPEAD_K@Z:PROC ; FString::LockNewBuffer + Line 282: EXTRN ?UnlockBuffer@FString@@QEAAXXZ:PROC ; FString::UnlockBuffer + Line 283: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 284: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 285: EXTRN ??HFString@@QEBA?AV0@PEBD@Z:PROC ; FString::operator+ + Line 286: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 287: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 288: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 289: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 290: EXTRN myvsnprintf:PROC + Line 291: EXTRN _Thrd_hardware_concurrency:PROC + Line 292: EXTRN ?atterm@@YAXP6AXXZ@Z:PROC ; atterm + Line 293: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 294: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 295: EXTRN ?C_DeinitConsole@@YAXXZ:PROC ; C_DeinitConsole + Line 296: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 297: EXTRN ??0FStringCVar@@QEAA@PEBD0IP6AXAEAV0@@Z@Z:PROC ; FStringCVar::FStringCVar + Line 298: EXTRN ??1FStringCVar@@UEAA@XZ:PROC ; FStringCVar::~FStringCVar + Line 299: EXTRN ?RGBtoHSV@@YAXMMMPEAM00@Z:PROC ; RGBtoHSV + Line 300: EXTRN ?HSVtoRGB@@YAXPEAM00MMM@Z:PROC ; HSVtoRGB + Line 301: EXTRN ?CheckCPUID@@YAXPEAUCPUInfo@@@Z:PROC ; CheckCPUID + Line 302: EXTRN ?DumpCPUInfo@@YAXPEBUCPUInfo@@@Z:PROC ; DumpCPUInfo + Line 303: EXTRN ??_ECDoomError@@UEAAPEAXI@Z:PROC ; CDoomError::`vector deleting destructor' + Line 304: EXTRN ??_ECRecoverableError@@UEAAPEAXI@Z:PROC ; CRecoverableError::`vector deleting destructor' + Line 305: EXTRN ??_ECFatalError@@UEAAPEAXI@Z:PROC ; CFatalError::`vector deleting destructor' + Line 306: EXTRN ?GetVersionString@@YAPEBDXZ:PROC ; GetVersionString + Line 307: EXTRN ?I_InitSound@@YAXXZ:PROC ; I_InitSound + Line 308: EXTRN ?I_ShutdownSound@@YAXXZ:PROC ; I_ShutdownSound + Line 309: EXTRN ?G_CheckDemoStatus@@YA_NXZ:PROC ; G_CheckDemoStatus + Line 310: EXTRN ?I_GetEvent@@YAXXZ:PROC ; I_GetEvent + Line 311: EXTRN ?V_LogColorFromColorRange@@YA?AUPalEntry@@W4EColorRange@@@Z:PROC ; V_LogColorFromColorRange + Line 312: EXTRN ?V_ParseFontColor@@YA?AW4EColorRange@@AEAPEBEHH@Z:PROC ; V_ParseFontColor + Line 313: EXTRN ?CopyPixelDataRGB@FBitmap@@QEAAXHHPEBEHHHHHHPEAUFCopyInfo@@HHH@Z:PROC ; FBitmap::CopyPixelDataRGB + Line 314: EXTRN _CxxThrowException:PROC + Line 315: EXTRN __CxxFrameHandler3:PROC + Line 316: EXTRN memset:PROC + Line 317: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 318: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 319: EXTRN ?batchrun@@3_NA:BYTE ; batchrun + Line 320: EXTRN ?CPU@@3UCPUInfo@@A:BYTE ; CPU + Line 321: EXTRN ?fullscreen@@3VFBoolCVar@@A:BYTE ; fullscreen + Line 322: EXTRN ?GameConfig@@3PEAVFGameConfigFile@@EA:QWORD ; GameConfig + Line 323: EXTRN ?demorecording@@3_NA:BYTE ; demorecording + Line 324: EXTRN ?GetLongPathNameA@OptWin32@@3V?$TOptProc@$1?Kernel32Module@@3VFModule@@AP6AKPEBDPEADK@Z@@A:BYTE ; OptWin32::GetLongPathNameA + Line 325: EXTRN ?language@@3VFStringCVar@@A:BYTE ; language + Line 326: EXTRN ?queryiwad@@3VFBoolCVar@@A:BYTE ; queryiwad + Line 327: EXTRN ?disableautoload@@3VFBoolCVar@@A:BYTE ; disableautoload + Line 328: EXTRN ?autoloadlights@@3VFBoolCVar@@A:BYTE ; autoloadlights + Line 329: EXTRN ?autoloadbrightmaps@@3VFBoolCVar@@A:BYTE ; autoloadbrightmaps + Line 330: EXTRN ?Window@@3PEAUHWND__@@EA:QWORD ; Window + Line 331: EXTRN ?ConWindow@@3PEAUHWND__@@EA:QWORD ; ConWindow + Line 332: EXTRN ?StdOut@@3PEAXEA:QWORD ; StdOut + Line 333: EXTRN ?FancyStdOut@@3_NA:BYTE ; FancyStdOut + Line 334: EXTRN ?g_hInst@@3PEAUHINSTANCE__@@EA:QWORD ; g_hInst + Line 335: EXTRN ?Logfile@@3PEAU_iobuf@@EA:QWORD ; Logfile + Line 336: EXTRN ?NativeMouse@@3_NA:BYTE ; NativeMouse + Line 337: EXTRN ?ConWindowHidden@@3_NA:BYTE ; ConWindowHidden + Line 338: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\i_time.cod (11 hits) + Line 11: EXTRN ?netgame@@3_NA:BYTE ; netgame + Line 44: EXTRN atexit:PROC + Line 45: EXTRN _Xtime_get_ticks:PROC + Line 46: EXTRN _Query_perf_counter:PROC + Line 47: EXTRN _Query_perf_frequency:PROC + Line 48: EXTRN _Thrd_sleep:PROC + Line 49: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 50: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 51: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 52: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 53: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\i_xinput.cod (36 hits) + Line 120: EXTRN _purecall:PROC + Line 121: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 122: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 123: EXTRN atexit:PROC + Line 124: EXTRN __std_terminate:PROC + Line 125: EXTRN __imp_FreeLibrary:PROC + Line 126: EXTRN __imp_GetProcAddress:PROC + Line 127: EXTRN __imp_LoadLibraryA:PROC + Line 128: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 129: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 130: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 131: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 132: EXTRN mysnprintf:PROC + Line 133: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 134: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 135: EXTRN ??1IJoystickConfig@@UEAA@XZ:PROC ; IJoystickConfig::~IJoystickConfig + Line 136: EXTRN ?M_LoadJoystickConfig@@YA_NPEAUIJoystickConfig@@@Z:PROC ; M_LoadJoystickConfig + Line 137: EXTRN ?M_SaveJoystickConfig@@YAXPEAUIJoystickConfig@@@Z:PROC ; M_SaveJoystickConfig + Line 138: EXTRN ?Joy_GenerateButtonEvents@@YAXHHHH@Z:PROC ; Joy_GenerateButtonEvents + Line 139: EXTRN ?Joy_XYAxesToButtons@@YAHNN@Z:PROC ; Joy_XYAxesToButtons + Line 140: EXTRN ?Joy_RemoveDeadZone@@YANNNPEAE@Z:PROC ; Joy_RemoveDeadZone + Line 141: EXTRN ?UpdateJoystickMenu@@YAXPEAUIJoystickConfig@@@Z:PROC ; UpdateJoystickMenu + Line 142: EXTRN ??1FInputDevice@@UEAA@XZ:PROC ; FInputDevice::~FInputDevice + Line 143: EXTRN ?ProcessInput@FInputDevice@@UEAAXXZ:PROC ; FInputDevice::ProcessInput + Line 144: EXTRN ?ProcessRawInput@FInputDevice@@UEAA_NPEAUtagRAWINPUT@@H@Z:PROC ; FInputDevice::ProcessRawInput + Line 145: EXTRN ?WndProcHook@FInputDevice@@UEAA_NPEAUHWND__@@I_K_JPEA_J@Z:PROC ; FInputDevice::WndProcHook + Line 146: EXTRN ?D_PostEvent@@YAXPEBUevent_t@@@Z:PROC ; D_PostEvent + Line 147: EXTRN ?CheckParm@FArgs@@QEBAHPEBDH@Z:PROC ; FArgs::CheckParm + Line 148: EXTRN ??_EFXInputController@@UEAAPEAXI@Z:PROC ; FXInputController::`vector deleting destructor' + Line 149: EXTRN ??_EFXInputManager@@UEAAPEAXI@Z:PROC ; FXInputManager::`vector deleting destructor' + Line 150: EXTRN __CxxFrameHandler3:PROC + Line 151: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 152: EXTRN ?use_joystick@@3VFBoolCVar@@A:BYTE ; use_joystick + Line 153: EXTRN ?JoyDevices@@3PAPEAVFJoystickCollection@@A:BYTE ; JoyDevices + Line 154: EXTRN ?Args@@3PEAVFArgs@@EA:QWORD ; Args + Line 155: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\image.cod (34 hits) + Line 38: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 39: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 40: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 41: EXTRN atexit:PROC + Line 42: EXTRN __std_terminate:PROC + Line 43: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 44: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 45: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 46: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 47: EXTRN ??0FMemArena@@QEAA@_K@Z:PROC ; FMemArena::FMemArena + Line 48: EXTRN ??1FMemArena@@QEAA@XZ:PROC ; FMemArena::~FMemArena + Line 49: EXTRN ?GetPalette@DFrameBuffer@@QEAAPEAUPalEntry@@XZ:PROC ; DFrameBuffer::GetPalette + Line 50: EXTRN ?CopyPixelData@FBitmap@@QEAAXHHPEBEHHHHHPEAUPalEntry@@PEAUFCopyInfo@@@Z:PROC ; FBitmap::CopyPixelData + Line 51: EXTRN ?OpenLumpReader@FWadCollection@@QEAA?AVFileReader@@H@Z:PROC ; FWadCollection::OpenLumpReader + Line 52: EXTRN ?GetLumpName@FWadCollection@@QEBAXAEAVFString@@H@Z:PROC ; FWadCollection::GetLumpName + Line 53: EXTRN ?IMGZImage_TryCreate@@YAPEAVFImageSource@@AEAVFileReader@@H@Z:PROC ; IMGZImage_TryCreate + Line 54: EXTRN ?PNGImage_TryCreate@@YAPEAVFImageSource@@AEAVFileReader@@H@Z:PROC ; PNGImage_TryCreate + Line 55: EXTRN ?JPEGImage_TryCreate@@YAPEAVFImageSource@@AEAVFileReader@@H@Z:PROC ; JPEGImage_TryCreate + Line 56: EXTRN ?DDSImage_TryCreate@@YAPEAVFImageSource@@AEAVFileReader@@H@Z:PROC ; DDSImage_TryCreate + Line 57: EXTRN ?PCXImage_TryCreate@@YAPEAVFImageSource@@AEAVFileReader@@H@Z:PROC ; PCXImage_TryCreate + Line 58: EXTRN ?TGAImage_TryCreate@@YAPEAVFImageSource@@AEAVFileReader@@H@Z:PROC ; TGAImage_TryCreate + Line 59: EXTRN ?RawPageImage_TryCreate@@YAPEAVFImageSource@@AEAVFileReader@@H@Z:PROC ; RawPageImage_TryCreate + Line 60: EXTRN ?FlatImage_TryCreate@@YAPEAVFImageSource@@AEAVFileReader@@H@Z:PROC ; FlatImage_TryCreate + Line 61: EXTRN ?PatchImage_TryCreate@@YAPEAVFImageSource@@AEAVFileReader@@H@Z:PROC ; PatchImage_TryCreate + Line 62: EXTRN ?EmptyImage_TryCreate@@YAPEAVFImageSource@@AEAVFileReader@@H@Z:PROC ; EmptyImage_TryCreate + Line 63: EXTRN ?AutomapImage_TryCreate@@YAPEAVFImageSource@@AEAVFileReader@@H@Z:PROC ; AutomapImage_TryCreate + Line 64: EXTRN __CxxFrameHandler3:PROC + Line 65: EXTRN memcpy:PROC + Line 66: EXTRN memmove:PROC + Line 67: EXTRN memset:PROC + Line 68: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 69: EXTRN ?vid_rendermode@@3VFIntCVar@@A:BYTE ; vid_rendermode + Line 70: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 71: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\imagetexture.cod (11 hits) + Line 18: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 19: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 20: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 21: EXTRN ?GetLumpName@FWadCollection@@QEBAXAEAVFString@@H@Z:PROC ; FWadCollection::GetLumpName + Line 22: EXTRN ??1FTexture@@UEAA@XZ:PROC ; FTexture::~FTexture + Line 23: EXTRN ??0FTexture@@IEAA@PEBDH@Z:PROC ; FTexture::FTexture + Line 24: EXTRN ?GetPalettedPixels@FImageSource@@QEAA?AV?$TArray@EE@@H@Z:PROC ; FImageSource::GetPalettedPixels + Line 25: EXTRN ?GetCachedBitmap@FImageSource@@QEAA?AVFBitmap@@PEAUPalEntry@@HPEAH@Z:PROC ; FImageSource::GetCachedBitmap + Line 26: EXTRN ??_EFImageTexture@@UEAAPEAXI@Z:PROC ; FImageTexture::`vector deleting destructor' + Line 27: EXTRN __CxxFrameHandler3:PROC + Line 28: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\imgztexture.cod (20 hits) + Line 19: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 20: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 21: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 22: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 23: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 24: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 25: EXTRN ?CreatePalettedPixels@FImageSource@@MEAA?AV?$TArray@EE@@H@Z:PROC ; FImageSource::CreatePalettedPixels + Line 26: EXTRN ?CopyPixels@FImageSource@@MEAAHPEAVFBitmap@@H@Z:PROC ; FImageSource::CopyPixels + Line 27: EXTRN ?CopyTranslatedPixels@FImageSource@@IEAAHPEAVFBitmap@@PEAUPalEntry@@@Z:PROC ; FImageSource::CopyTranslatedPixels + Line 28: EXTRN ?CollectForPrecache@FImageSource@@UEAAXAEAV?$TMap@HU?$pair@HH@std@@U?$THashTraits@H@@U?$TValueTraits@U?$pair@HH@std@@@@@@_N@Z:PROC ; FImageSource::CollectForPrecache + Line 29: EXTRN ??_EFImageSource@@UEAAPEAXI@Z:PROC ; FImageSource::`vector deleting destructor' + Line 30: EXTRN ?checkIMGZPalette@@YA_NAEAVFileReader@@@Z:PROC ; checkIMGZPalette + Line 31: EXTRN ??_EFIMGZTexture@@UEAAPEAXI@Z:PROC ; FIMGZTexture::`vector deleting destructor' + Line 32: EXTRN __CxxFrameHandler3:PROC + Line 33: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 34: EXTRN ?GPalette@@3UFPalette@@A:BYTE ; GPalette + Line 35: EXTRN ?translationtables@@3PAV?$TAutoGrowArray@VFRemapTablePtr@@PEAUFRemapTable@@@@A:BYTE ; translationtables + Line 36: EXTRN ?GrayMap@ImageHelpers@@3PAEA:BYTE ; ImageHelpers::GrayMap + Line 37: EXTRN ?ImageArena@FImageSource@@1VFMemArena@@A:BYTE ; FImageSource::ImageArena + Line 38: EXTRN ?NextID@FImageSource@@1HA:DWORD ; FImageSource::NextID + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\info.cod (95 hits) + Line 161: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 162: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 163: EXTRN atexit:PROC + Line 164: EXTRN __std_terminate:PROC + Line 165: EXTRN atoi:PROC + Line 166: EXTRN toupper:PROC + Line 167: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 168: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 169: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 170: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 171: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 172: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 173: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 174: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 175: EXTRN ?AppendFormat@FString@@QEAAXPEBDZZ:PROC ; FString::AppendFormat + Line 176: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 177: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 178: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 179: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 180: EXTRN ?AddField@PClass@@QEAAPEAVPField@@VFName@@PEAVPType@@I@Z:PROC ; PClass::AddField + Line 181: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 182: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 183: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 184: EXTRN ?StaticGetStateName@FState@@SA?AVFString@@PEBU1@@Z:PROC ; FState::StaticGetStateName + Line 185: EXTRN ?Destroy@FStateLabels@@QEAAXXZ:PROC ; FStateLabels::Destroy + Line 186: EXTRN ??1FCommandLine@@QEAA@XZ:PROC ; FCommandLine::~FCommandLine + Line 187: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 188: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 189: EXTRN ?CheckCheatmode@@YA_N_N@Z:PROC ; CheckCheatmode + Line 190: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 191: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 192: EXTRN ?Net_WriteByte@@YAXE@Z:PROC ; Net_WriteByte + Line 193: EXTRN ?Net_WriteWord@@YAXF@Z:PROC ; Net_WriteWord + Line 194: EXTRN ?Net_WriteLong@@YAXH@Z:PROC ; Net_WriteLong + Line 195: EXTRN ?Net_WriteString@@YAXPEBD@Z:PROC ; Net_WriteString + Line 196: EXTRN ?CheckForTexture@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::CheckForTexture + Line 197: EXTRN ??0FScanner@@QEAA@H@Z:PROC ; FScanner::FScanner + Line 198: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 199: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 200: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 201: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 202: EXTRN ?MustGetAnyToken@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetAnyToken + Line 203: EXTRN ?MustGetFloat@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetFloat + Line 204: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 205: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 206: EXTRN ?ParseOpenBrace@FMapInfoParser@@QEAAXXZ:PROC ; FMapInfoParser::ParseOpenBrace + Line 207: EXTRN ?SetReplacement@FSkillInfo@@QEAAXVFName@@0@Z:PROC ; FSkillInfo::SetReplacement + Line 208: EXTRN ?GetReplacement@FSkillInfo@@QEAA?AVFName@@V2@@Z:PROC ; FSkillInfo::GetReplacement + Line 209: EXTRN ?SetReplacedBy@FSkillInfo@@QEAAXVFName@@0@Z:PROC ; FSkillInfo::SetReplacedBy + Line 210: EXTRN ?GetReplacedBy@FSkillInfo@@QEAA?AVFName@@V2@@Z:PROC ; FSkillInfo::GetReplacedBy + Line 211: EXTRN ?MaybePrintMessage@CVMAbortException@@QEAAXXZ:PROC ; CVMAbortException::MaybePrintMessage + Line 212: EXTRN ?ThrowAbortException@@YAXW4EVMAbortException@@PEBDZZ:PROC ; ThrowAbortException + Line 213: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 214: EXTRN ?FindVMFunction@@YAPEAVVMFunction@@PEAVPClass@@PEBD@Z:PROC ; FindVMFunction + Line 215: EXTRN ?E_InitStaticHandlers@@YAX_N@Z:PROC ; E_InitStaticHandlers + Line 216: EXTRN ?E_CheckReplacement@@YA_NPEAVPClassActor@@PEAPEAV1@@Z:PROC ; E_CheckReplacement + Line 217: EXTRN ??1PType@@UEAA@XZ:PROC ; PType::~PType + Line 218: EXTRN ?WriteValue@PType@@UEBAXAEAVFSerializer@@PEBDPEBX@Z:PROC ; PType::WriteValue + Line 219: EXTRN ?ReadValue@PType@@UEBA_NAEAVFSerializer@@PEBDPEAX@Z:PROC ; PType::ReadValue + Line 220: EXTRN ?SetPointer@PType@@UEAAXPEAXIPEAV?$TArray@_K_K@@@Z:PROC ; PType::SetPointer + Line 221: EXTRN ?SetPointerArray@PType@@UEAAXPEAXIPEAV?$TArray@_K_K@@@Z:PROC ; PType::SetPointerArray + Line 222: EXTRN ?SetValue@PType@@UEAAXPEAXH@Z:PROC ; PType::SetValue + Line 223: EXTRN ?SetValue@PType@@UEAAXPEAXN@Z:PROC ; PType::SetValue + Line 224: EXTRN ?GetValueInt@PType@@UEBAHPEAX@Z:PROC ; PType::GetValueInt + Line 225: EXTRN ?GetValueFloat@PType@@UEBANPEAX@Z:PROC ; PType::GetValueFloat + Line 226: EXTRN ?IsMatch@PType@@UEBA_N_J0@Z:PROC ; PType::IsMatch + Line 227: EXTRN ?GetTypeIDs@PType@@UEBAXAEA_J0@Z:PROC ; PType::GetTypeIDs + Line 228: EXTRN ??0PCompoundType@@IEAA@II@Z:PROC ; PCompoundType::PCompoundType + Line 229: EXTRN ?AddType@FTypeTable@@QEAAXPEAVPType@@VFName@@@Z:PROC ; FTypeTable::AddType + Line 230: EXTRN ?FindLump@FWadCollection@@QEAAHPEBDPEAH_N@Z:PROC ; FWadCollection::FindLump + Line 231: EXTRN ?LoadActors@@YAXXZ:PROC ; LoadActors + Line 232: EXTRN ?InitBotStuff@@YAXXZ:PROC ; InitBotStuff + Line 233: EXTRN ?ClearStrifeTypes@@YAXXZ:PROC ; ClearStrifeTypes + Line 234: EXTRN ??_EPActorInfo@@UEAAPEAXI@Z:PROC ; PActorInfo::`vector deleting destructor' + Line 235: EXTRN _CxxThrowException:PROC + Line 236: EXTRN __CxxFrameHandler3:PROC + Line 237: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 238: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 239: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 240: EXTRN ?batchrun@@3_NA:BYTE ; batchrun + Line 241: EXTRN ?gameskill@@3VFIntCVar@@A:BYTE ; gameskill + Line 242: EXTRN ?ClassDataAllocator@@3VFMemArena@@A:BYTE ; ClassDataAllocator + Line 243: EXTRN ?DoomEdMap@@3V?$TMap@HUFDoomEdEntry@@U?$THashTraits@H@@U?$TValueTraits@UFDoomEdEntry@@@@@@A:BYTE ; DoomEdMap + Line 244: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 245: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 246: EXTRN ?AllSkills@@3V?$TArray@UFSkillInfo@@U1@@@A:BYTE ; AllSkills + Line 247: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 248: EXTRN ?sprites@@3V?$TArray@Uspritedef_t@@U1@@@A:BYTE ; sprites + Line 249: EXTRN ?SpawnableThings@@3V?$TMap@HPEAVPClassActor@@U?$THashTraits@H@@U?$TValueTraits@PEAVPClassActor@@@@@@A:BYTE ; SpawnableThings + Line 250: EXTRN ?StrifeTypes@@3V?$TMap@HPEAVPClassActor@@U?$THashTraits@H@@U?$TValueTraits@PEAVPClassActor@@@@@@A:BYTE ; StrifeTypes + Line 251: EXTRN ?stacktrace@CVMAbortException@@2VFString@@A:QWORD ; CVMAbortException::stacktrace + Line 252: EXTRN ?TypeState@@3PEAVPStatePointer@@EA:QWORD ; TypeState + Line 253: EXTRN ?TypeTable@@3UFTypeTable@@A:BYTE ; TypeTable + Line 254: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 255: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\init.cod (2 hits) + Line 25: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 26: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\instrum.cod (43 hits) + Line 116: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 117: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 118: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 119: EXTRN free:PROC + Line 120: EXTRN atoi:PROC + Line 121: EXTRN __stdio_common_vsprintf:PROC + Line 122: EXTRN strchr:PROC + Line 123: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 124: EXTRN ?ctl_cmsg@TimidityPlus@@YAXHHPEBDZZ:PROC ; TimidityPlus::ctl_cmsg + Line 125: EXTRN ?OpenSoundFont@FSoundFontManager@@QEAAPEAVFSoundFontReader@@PEBDH@Z:PROC ; FSoundFontManager::OpenSoundFont + Line 126: EXTRN ?open_file@TimidityPlus@@YAPEAUtimidity_file@1@PEBDPEAVFSoundFontReader@@@Z:PROC ; TimidityPlus::open_file + Line 127: EXTRN ?tf_close@TimidityPlus@@YAXPEAUtimidity_file@1@@Z:PROC ; TimidityPlus::tf_close + Line 128: EXTRN ?skip@TimidityPlus@@YAXPEAUtimidity_file@1@_K@Z:PROC ; TimidityPlus::skip + Line 129: EXTRN ?tf_getc@TimidityPlus@@YAHPEAUtimidity_file@1@@Z:PROC ; TimidityPlus::tf_getc + Line 130: EXTRN ?tf_read@TimidityPlus@@YAJPEAXHHPEAUtimidity_file@1@@Z:PROC ; TimidityPlus::tf_read + Line 131: EXTRN ?safe_malloc@TimidityPlus@@YAPEAX_K@Z:PROC ; TimidityPlus::safe_malloc + Line 132: EXTRN ?safe_strdup@TimidityPlus@@YAPEADPEBD@Z:PROC ; TimidityPlus::safe_strdup + Line 133: EXTRN ?free_ptr_list@TimidityPlus@@YAXPEAXH@Z:PROC ; TimidityPlus::free_ptr_list + Line 134: EXTRN ?extract_sample_file@Instruments@TimidityPlus@@AEAAPEAUInstrument@2@PEAD@Z:PROC ; TimidityPlus::Instruments::extract_sample_file + Line 135: EXTRN ?init_load_soundfont@Instruments@TimidityPlus@@QEAAXXZ:PROC ; TimidityPlus::Instruments::init_load_soundfont + Line 136: EXTRN ?load_soundfont_inst@Instruments@TimidityPlus@@QEAAPEAUInstrument@2@HHHH@Z:PROC ; TimidityPlus::Instruments::load_soundfont_inst + Line 137: EXTRN ?extract_soundfont@Instruments@TimidityPlus@@QEAAPEAUInstrument@2@PEADHHH@Z:PROC ; TimidityPlus::Instruments::extract_soundfont + Line 138: EXTRN ?free_soundfonts@Instruments@TimidityPlus@@QEAAXXZ:PROC ; TimidityPlus::Instruments::free_soundfonts + Line 139: EXTRN ?read_config_file@Instruments@TimidityPlus@@QEAAHPEBDHH@Z:PROC ; TimidityPlus::Instruments::read_config_file + Line 140: EXTRN ?initialize_resampler_coeffs@TimidityPlus@@YAXXZ:PROC ; TimidityPlus::initialize_resampler_coeffs + Line 141: EXTRN ?pre_resample@TimidityPlus@@YAXPEAUSample@1@@Z:PROC ; TimidityPlus::pre_resample + Line 142: EXTRN ?init_tables@TimidityPlus@@YAXXZ:PROC ; TimidityPlus::init_tables + Line 143: EXTRN ?quantity_to_int@TimidityPlus@@YAHPEBUQuantity_@1@H@Z:PROC ; TimidityPlus::quantity_to_int + Line 144: EXTRN ?assign_pitch_to_freq@TimidityPlus@@YAHM@Z:PROC ; TimidityPlus::assign_pitch_to_freq + Line 145: EXTRN ?freq_fourier@Freq@TimidityPlus@@QEAAMPEAUSample@2@PEAH@Z:PROC ; TimidityPlus::Freq::freq_fourier + Line 146: EXTRN __CxxFrameHandler3:PROC + Line 147: EXTRN memcmp:PROC + Line 148: EXTRN memcpy:PROC + Line 149: EXTRN memmove:PROC + Line 150: EXTRN memset:PROC + Line 151: EXTRN pow:PROC + Line 152: EXTRN ?timidity_surround_chorus@TimidityPlus@@3_NA:BYTE ; TimidityPlus::timidity_surround_chorus + Line 153: EXTRN ?playback_rate@TimidityPlus@@3HA:DWORD ; TimidityPlus::playback_rate + Line 154: EXTRN ?control_ratio@TimidityPlus@@3HA:DWORD ; TimidityPlus::control_ratio + Line 155: EXTRN ?sfmanager@@3VFSoundFontManager@@A:BYTE ; sfmanager + Line 156: EXTRN ?static_layer_items@TimidityPlus@@3QBU_LayerItem@1@B:BYTE ; TimidityPlus::static_layer_items + Line 157: EXTRN ?freq_table@TimidityPlus@@3PAHA:BYTE ; TimidityPlus::freq_table + Line 158: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\instrum_dls.cod (14 hits) + Line 122: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 123: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 124: EXTRN free:PROC + Line 125: EXTRN malloc:PROC + Line 126: EXTRN __acrt_iob_func:PROC + Line 127: EXTRN fread:PROC + Line 128: EXTRN __stdio_common_vfprintf:PROC + Line 129: EXTRN mysnprintf:PROC + Line 130: EXTRN ?safe_malloc@Timidity@@YAPEAX_K@Z:PROC ; Timidity::safe_malloc + Line 131: EXTRN ?convert_sample_data@Timidity@@YAXPEAUSample@1@PEBX@Z:PROC ; Timidity::convert_sample_data + Line 132: EXTRN memset:PROC + Line 133: EXTRN pow:PROC + Line 134: EXTRN __ImageBase:BYTE + Line 135: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\instrum_font.cod (10 hits) + Line 25: EXTRN _purecall:PROC + Line 26: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 27: EXTRN stricmp:PROC + Line 28: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 29: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 30: EXTRN ??_EFontFile@Timidity@@UEAAPEAXI@Z:PROC ; Timidity::FontFile::`vector deleting destructor' + Line 31: EXTRN ?ReadSF2@@YAPEAUSFFile@@PEBDAEAVFileReader@@@Z:PROC ; ReadSF2 + Line 32: EXTRN ?LookupFile@FSoundFontReader@@QEAA?AU?$pair@VFileReader@@VFString@@@std@@PEBD@Z:PROC ; FSoundFontReader::LookupFile + Line 33: EXTRN __CxxFrameHandler3:PROC + Line 34: EXTRN ?gus_sfreader@Timidity@@3V?$unique_ptr@VFSoundFontReader@@U?$default_delete@VFSoundFontReader@@@std@@@std@@A:QWORD ; Timidity::gus_sfreader + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\instrum_sf2.cod (27 hits) + Line 23: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 425: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 426: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 427: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 428: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 429: EXTRN __std_terminate:PROC + Line 430: EXTRN _errno:PROC + Line 431: EXTRN strerror:PROC + Line 432: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 433: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 434: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 435: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 436: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 437: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 438: EXTRN ?safe_malloc@Timidity@@YAPEAX_K@Z:PROC ; Timidity::safe_malloc + Line 439: EXTRN ??0Instrument@Timidity@@QEAA@XZ:PROC ; Timidity::Instrument::Instrument + Line 440: EXTRN ??1Instrument@Timidity@@QEAA@XZ:PROC ; Timidity::Instrument::~Instrument + Line 441: EXTRN ??0FontFile@Timidity@@QEAA@VFString@@@Z:PROC ; Timidity::FontFile::FontFile + Line 442: EXTRN ??1FontFile@Timidity@@UEAA@XZ:PROC ; Timidity::FontFile::~FontFile + Line 443: EXTRN ??_ESFFile@@UEAAPEAXI@Z:PROC ; SFFile::`vector deleting destructor' + Line 444: EXTRN ?LookupFile@FSoundFontReader@@QEAA?AU?$pair@VFileReader@@VFString@@@std@@PEBD@Z:PROC ; FSoundFontReader::LookupFile + Line 445: EXTRN _CxxThrowException:PROC + Line 446: EXTRN __CxxFrameHandler3:PROC + Line 447: EXTRN memset:PROC + Line 448: EXTRN pow:PROC + Line 449: EXTRN ?gus_sfreader@Timidity@@3V?$unique_ptr@VFSoundFontReader@@U?$default_delete@VFSoundFontReader@@@std@@@std@@A:QWORD ; Timidity::gus_sfreader + Line 450: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\intermission.cod (77 hits) + Line 35: EXTRN ?RegistrationInfo@DObject@@2UClassReg@@A:BYTE ; DObject::RegistrationInfo + Line 209: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 210: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 211: EXTRN atexit:PROC + Line 212: EXTRN __std_terminate:PROC + Line 213: EXTRN strtoul:PROC + Line 214: EXTRN stricmp:PROC + Line 215: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 216: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 217: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 218: EXTRN ?Barrier@GC@@YAXPEAVDObject@@0@Z:PROC ; GC::Barrier + Line 219: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 220: EXTRN ??1DObject@@UEAA@XZ:PROC ; DObject::~DObject + Line 221: EXTRN ?Serialize@DObject@@UEAAXAEAVFSerializer@@@Z:PROC ; DObject::Serialize + Line 222: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 223: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 224: EXTRN ?PropagateMark@DObject@@UEAA_KXZ:PROC ; DObject::PropagateMark + Line 225: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 226: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 227: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 228: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 229: EXTRN ?V_SetBlend@@YAXHHHH@Z:PROC ; V_SetBlend + Line 230: EXTRN ?CheckForTexture@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::CheckForTexture + Line 231: EXTRN ?FlatFill@DFrameBuffer@@QEAAXHHHHPEAVFTexture@@_N@Z:PROC ; DFrameBuffer::FlatFill + Line 232: EXTRN ?Clear@DFrameBuffer@@QEAAXHHHHHI@Z:PROC ; DFrameBuffer::Clear + Line 233: EXTRN ?DrawTexture@DFrameBuffer@@QEAAXPEAVFTexture@@NNHZZ:PROC ; DFrameBuffer::DrawTexture + Line 234: EXTRN ?FillBorder@DFrameBuffer@@QEAAXPEAVFTexture@@@Z:PROC ; DFrameBuffer::FillBorder + Line 235: EXTRN ?DrawText@DFrameBuffer@@QEAAXPEAVFFont@@HNNPEBDHZZ:PROC ; DFrameBuffer::DrawText + Line 236: EXTRN ?DrawChar@DFrameBuffer@@QEAAXPEAVFFont@@HNNHHZZ:PROC ; DFrameBuffer::DrawChar + Line 237: EXTRN ?D_StartTitle@@YAXXZ:PROC ; D_StartTitle + Line 238: EXTRN ??RFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator() + Line 239: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 240: EXTRN ?S_Sound@@YAXHVFSoundID@@MM@Z:PROC ; S_Sound + Line 241: EXTRN ?S_StopSound@@YAXH@Z:PROC ; S_StopSound + Line 242: EXTRN ?S_StopAllChannels@@YAXXZ:PROC ; S_StopAllChannels + Line 243: EXTRN ?S_ChangeMusic@@YA_NPEBDH_N1@Z:PROC ; S_ChangeMusic + Line 244: EXTRN ?S_ChangeCDMusic@@YA_NHI_N@Z:PROC ; S_ChangeCDMusic + Line 245: EXTRN ?S_FindSkinnedSound@@YAHPEAVAActor@@VFSoundID@@@Z:PROC ; S_FindSkinnedSound + Line 246: EXTRN ?GetColorTranslation@FFont@@QEBAPEAUFRemapTable@@W4EColorRange@@PEAUPalEntry@@@Z:PROC ; FFont::GetColorTranslation + Line 247: EXTRN ?StringWidth@FFont@@QEBAHPEBE@Z:PROC ; FFont::StringWidth + Line 248: EXTRN ??_EDIntermissionScreen@@UEAAPEAXI@Z:PROC ; DIntermissionScreen::`vector deleting destructor' + Line 249: EXTRN ??_EDIntermissionScreenFader@@UEAAPEAXI@Z:PROC ; DIntermissionScreenFader::`vector deleting destructor' + Line 250: EXTRN ??_EDIntermissionScreenText@@UEAAPEAXI@Z:PROC ; DIntermissionScreenText::`vector deleting destructor' + Line 251: EXTRN ??_EDIntermissionScreenCast@@UEAAPEAXI@Z:PROC ; DIntermissionScreenCast::`vector deleting destructor' + Line 252: EXTRN ??_EDIntermissionScreenScroller@@UEAAPEAXI@Z:PROC ; DIntermissionScreenScroller::`vector deleting destructor' + Line 253: EXTRN ??_EDIntermissionController@@UEAAPEAXI@Z:PROC ; DIntermissionController::`vector deleting destructor' + Line 254: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 255: EXTRN ?FindState@PClassActor@@QEBAPEAUFState@@HPEAVFName@@_N@Z:PROC ; PClassActor::FindState + Line 256: EXTRN ?P_ResumeConversation@@YAXXZ:PROC ; P_ResumeConversation + Line 257: EXTRN ?Net_WriteByte@@YAXE@Z:PROC ; Net_WriteByte + Line 258: EXTRN __CxxFrameHandler3:PROC + Line 259: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 260: EXTRN ?State@GC@@3W4EGCState@1@A:DWORD ; GC::State + Line 261: EXTRN ?gamestate@@3W4gamestate_t@@A:DWORD ; gamestate + Line 262: EXTRN ?wipegamestate@@3W4gamestate_t@@A:DWORD ; wipegamestate + Line 263: EXTRN ?gameaction@@3W4gameaction_t@@A:DWORD ; gameaction + Line 264: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 265: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 266: EXTRN ?CleanXfac@@3HA:DWORD ; CleanXfac + Line 267: EXTRN ?CleanYfac@@3HA:DWORD ; CleanYfac + Line 268: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 269: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 270: EXTRN ?SmallFont@@3PEAVFFont@@EA:QWORD ; SmallFont + Line 271: EXTRN ?pr_statetics@FState@@2VFRandom@@A:BYTE ; FState::pr_statetics + Line 272: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 273: EXTRN ?multiplayer@@3_NA:BYTE ; multiplayer + Line 274: EXTRN ?automapactive@@3_NA:BYTE ; automapactive + Line 275: EXTRN ?viewactive@@3_NA:BYTE ; viewactive + Line 276: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 277: EXTRN ?PlayerClasses@@3V?$TArray@VFPlayerClass@@V1@@@A:BYTE ; PlayerClasses + Line 278: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 279: EXTRN ?SpriteFrames@@3V?$TArray@Uspriteframe_t@@U1@@@A:BYTE ; SpriteFrames + Line 280: EXTRN ?Skins@@3V?$TArray@VFPlayerSkin@@V1@@@A:BYTE ; Skins + Line 281: EXTRN ?sprites@@3V?$TArray@Uspritedef_t@@U1@@@A:BYTE ; sprites + Line 282: EXTRN ?Bindings@@3VFKeyBindings@@A:BYTE ; Bindings + Line 283: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 284: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\intermission_parse.cod (55 hits) + Line 131: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 132: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 133: EXTRN __std_terminate:PROC + Line 134: EXTRN strnicmp:PROC + Line 135: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 136: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 137: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 138: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 139: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_K_N@Z:PROC ; FName::NameManager::FindName + Line 140: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 141: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 142: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 143: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 144: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 145: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 146: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 147: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 148: EXTRN ?V_FindFontColor@@YA?AW4EColorRange@@VFName@@@Z:PROC ; V_FindFontColor + Line 149: EXTRN ??_EFIntermissionAction@@UEAAPEAXI@Z:PROC ; FIntermissionAction::`vector deleting destructor' + Line 150: EXTRN ??_EFIntermissionActionFader@@UEAAPEAXI@Z:PROC ; FIntermissionActionFader::`vector deleting destructor' + Line 151: EXTRN ??_EFIntermissionActionWiper@@UEAAPEAXI@Z:PROC ; FIntermissionActionWiper::`vector deleting destructor' + Line 152: EXTRN ??_EFIntermissionActionTextscreen@@UEAAPEAXI@Z:PROC ; FIntermissionActionTextscreen::`vector deleting destructor' + Line 153: EXTRN ??_EFIntermissionActionCast@@UEAAPEAXI@Z:PROC ; FIntermissionActionCast::`vector deleting destructor' + Line 154: EXTRN ??_EFIntermissionActionScroller@@UEAAPEAXI@Z:PROC ; FIntermissionActionScroller::`vector deleting destructor' + Line 155: EXTRN ?F_StartIntermission@@YAXPEAUFIntermissionDescriptor@@_NE@Z:PROC ; F_StartIntermission + Line 156: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 157: EXTRN ?CheckString@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::CheckString + Line 158: EXTRN ?MustGetToken@FScanner@@QEAAXH@Z:PROC ; FScanner::MustGetToken + Line 159: EXTRN ?CheckToken@FScanner@@QEAA_NH@Z:PROC ; FScanner::CheckToken + Line 160: EXTRN ?MustGetFloat@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetFloat + Line 161: EXTRN ?UnGet@FScanner@@QEAAXXZ:PROC ; FScanner::UnGet + Line 162: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 163: EXTRN ?MatchString@FScanner@@QEAAHPEBQEBD_K@Z:PROC ; FScanner::MatchString + Line 164: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 165: EXTRN ?ScriptMessage@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptMessage + Line 166: EXTRN ?ParseAssign@FMapInfoParser@@QEAAXXZ:PROC ; FMapInfoParser::ParseAssign + Line 167: EXTRN ?ParseComma@FMapInfoParser@@QEAAXXZ:PROC ; FMapInfoParser::ParseComma + Line 168: EXTRN ?CheckNumber@FMapInfoParser@@QEAA_NXZ:PROC ; FMapInfoParser::CheckNumber + Line 169: EXTRN ?SkipToNext@FMapInfoParser@@QEAAXXZ:PROC ; FMapInfoParser::SkipToNext + Line 170: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 171: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 172: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 173: EXTRN ?GetLumpFile@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpFile + Line 174: EXTRN __CxxFrameHandler3:PROC + Line 175: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 176: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 177: EXTRN ?IntermissionDescriptors@@3V?$TMap@VFName@@PEAUFIntermissionDescriptor@@U?$THashTraits@VFName@@@@U?$TValueTraits@PEAUFIntermissionDescriptor@@@@@@A:BYTE ; IntermissionDescriptors + Line 178: EXTRN ?RegistrationInfo@DIntermissionScreen@@2UClassReg@@A:BYTE ; DIntermissionScreen::RegistrationInfo + Line 179: EXTRN ?RegistrationInfo@DIntermissionScreenFader@@2UClassReg@@A:BYTE ; DIntermissionScreenFader::RegistrationInfo + Line 180: EXTRN ?RegistrationInfo@DIntermissionScreenText@@2UClassReg@@A:BYTE ; DIntermissionScreenText::RegistrationInfo + Line 181: EXTRN ?RegistrationInfo@DIntermissionScreenCast@@2UClassReg@@A:BYTE ; DIntermissionScreenCast::RegistrationInfo + Line 182: EXTRN ?RegistrationInfo@DIntermissionScreenScroller@@2UClassReg@@A:BYTE ; DIntermissionScreenScroller::RegistrationInfo + Line 183: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 184: EXTRN __ImageBase:BYTE + Line 185: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\isnan.cod (1 hit) + Line 11: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\jit.cod (279 hits) + Line 219: EXTRN ?x86OpData@asmjit@@3UX86OpData@1@B:BYTE ; asmjit::x86OpData + Line 1169: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 1170: EXTRN ??3@YAXPEAX@Z:PROC ; operator delete + Line 1171: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 1172: EXTRN __std_terminate:PROC + Line 1173: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 1174: EXTRN fclose:PROC + Line 1175: EXTRN fwrite:PROC + Line 1176: EXTRN ??2@YAPEAX_KAEBUnothrow_t@std@@@Z:PROC ; operator new + Line 1177: EXTRN __std_exception_copy:PROC + Line 1178: EXTRN __std_exception_destroy:PROC + Line 1179: EXTRN ??_Eexception@std@@UEAAPEAXI@Z:PROC ; std::exception::`vector deleting destructor' + Line 1180: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 1181: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 1182: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 1183: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 1184: EXTRN ??0FString@@QEAA@PEBD_K@Z:PROC ; FString::FString + Line 1185: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 1186: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 1187: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 1188: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 1189: EXTRN ?ThrowAbortException@@YAXW4EVMAbortException@@PEBDZZ:PROC ; ThrowAbortException + Line 1190: EXTRN ?AllocFrame@VMFrameStack@@QEAAPEAUVMFrame@@PEAVVMScriptFunction@@@Z:PROC ; VMFrameStack::AllocFrame + Line 1191: EXTRN ?PopFrame@VMFrameStack@@QEAAPEAUVMFrame@@XZ:PROC ; VMFrameStack::PopFrame + Line 1192: EXTRN ?VMFillParams@@YAXPEAUVMValue@@PEAUVMFrame@@H@Z:PROC ; VMFillParams + Line 1193: EXTRN ?PCToLine@VMScriptFunction@@QEAAHPEBTVMOP@@@Z:PROC ; VMScriptFunction::PCToLine + Line 1194: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 1195: EXTRN ??0StringLogger@asmjit@@QEAA@XZ:PROC ; asmjit::StringLogger::StringLogger + Line 1196: EXTRN ??1StringLogger@asmjit@@UEAA@XZ:PROC ; asmjit::StringLogger::~StringLogger + Line 1197: EXTRN ??0ErrorHandler@asmjit@@QEAA@XZ:PROC ; asmjit::ErrorHandler::ErrorHandler + Line 1198: EXTRN ??1ErrorHandler@asmjit@@UEAA@XZ:PROC ; asmjit::ErrorHandler::~ErrorHandler + Line 1199: EXTRN ??0CodeHolder@asmjit@@QEAA@XZ:PROC ; asmjit::CodeHolder::CodeHolder + Line 1200: EXTRN ??1CodeHolder@asmjit@@QEAA@XZ:PROC ; asmjit::CodeHolder::~CodeHolder + Line 1201: EXTRN ?init@CodeHolder@asmjit@@QEAAIAEBVCodeInfo@2@@Z:PROC ; asmjit::CodeHolder::init + Line 1202: EXTRN ?setLogger@CodeHolder@asmjit@@QEAAXPEAVLogger@2@@Z:PROC ; asmjit::CodeHolder::setLogger + Line 1203: EXTRN ?setErrorHandler@CodeHolder@asmjit@@QEAAIPEAVErrorHandler@2@@Z:PROC ; asmjit::CodeHolder::setErrorHandler + Line 1204: EXTRN ?emit@CodeEmitter@asmjit@@QEAAII@Z:PROC ; asmjit::CodeEmitter::emit + Line 1205: EXTRN ?emit@CodeEmitter@asmjit@@QEAAIIAEBUOperand_@2@@Z:PROC ; asmjit::CodeEmitter::emit + Line 1206: EXTRN ?emit@CodeEmitter@asmjit@@QEAAIIAEBUOperand_@2@0@Z:PROC ; asmjit::CodeEmitter::emit + Line 1207: EXTRN ?emit@CodeEmitter@asmjit@@QEAAIIAEBUOperand_@2@H@Z:PROC ; asmjit::CodeEmitter::emit + Line 1208: EXTRN ?setCursor@CodeBuilder@asmjit@@QEAAPEAVCBNode@2@PEAV32@@Z:PROC ; asmjit::CodeBuilder::setCursor + Line 1209: EXTRN ?_setArg@CCFuncCall@asmjit@@QEAA_NIAEBUOperand_@2@@Z:PROC ; asmjit::CCFuncCall::_setArg + Line 1210: EXTRN ?_setRet@CCFuncCall@asmjit@@QEAA_NIAEBUOperand_@2@@Z:PROC ; asmjit::CCFuncCall::_setRet + Line 1211: EXTRN ?addFunc@CodeCompiler@asmjit@@QEAAPEAVCCFunc@2@AEBUFuncSignature@2@@Z:PROC ; asmjit::CodeCompiler::addFunc + Line 1212: EXTRN ?endFunc@CodeCompiler@asmjit@@QEAAPEAVCBSentinel@2@XZ:PROC ; asmjit::CodeCompiler::endFunc + Line 1213: EXTRN ?addCall@CodeCompiler@asmjit@@QEAAPEAVCCFuncCall@2@IAEBUOperand_@2@AEBUFuncSignature@2@@Z:PROC ; asmjit::CodeCompiler::addCall + Line 1214: EXTRN ?setArg@CodeCompiler@asmjit@@QEAAIIAEBVReg@2@@Z:PROC ; asmjit::CodeCompiler::setArg + Line 1215: EXTRN ?_newReg@CodeCompiler@asmjit@@QEAAIAEAVReg@2@IPEBDPEAD@Z:PROC ; asmjit::CodeCompiler::_newReg + Line 1216: EXTRN ?_newStack@CodeCompiler@asmjit@@QEAAIAEAVMem@2@IIPEBD@Z:PROC ; asmjit::CodeCompiler::_newStack + Line 1217: EXTRN ??0X86Compiler@asmjit@@QEAA@PEAVCodeHolder@1@@Z:PROC ; asmjit::X86Compiler::X86Compiler + Line 1218: EXTRN ??1X86Compiler@asmjit@@UEAA@XZ:PROC ; asmjit::X86Compiler::~X86Compiler + Line 1219: EXTRN ?EmitLI@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLI + Line 1220: EXTRN ?EmitLK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLK + Line 1221: EXTRN ?EmitLKF@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLKF + Line 1222: EXTRN ?EmitLKS@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLKS + Line 1223: EXTRN ?EmitLKP@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLKP + Line 1224: EXTRN ?EmitLK_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLK_R + Line 1225: EXTRN ?EmitLKF_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLKF_R + Line 1226: EXTRN ?EmitLKS_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLKS_R + Line 1227: EXTRN ?EmitLKP_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLKP_R + Line 1228: EXTRN ?EmitLFP@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLFP + Line 1229: EXTRN ?EmitMETA@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMETA + Line 1230: EXTRN ?EmitCLSS@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitCLSS + Line 1231: EXTRN ?EmitLB@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLB + Line 1232: EXTRN ?EmitLB_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLB_R + Line 1233: EXTRN ?EmitLH@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLH + Line 1234: EXTRN ?EmitLH_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLH_R + Line 1235: EXTRN ?EmitLW@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLW + Line 1236: EXTRN ?EmitLW_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLW_R + Line 1237: EXTRN ?EmitLBU@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLBU + Line 1238: EXTRN ?EmitLBU_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLBU_R + Line 1239: EXTRN ?EmitLHU@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLHU + Line 1240: EXTRN ?EmitLHU_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLHU_R + Line 1241: EXTRN ?EmitLSP@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLSP + Line 1242: EXTRN ?EmitLSP_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLSP_R + Line 1243: EXTRN ?EmitLDP@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLDP + Line 1244: EXTRN ?EmitLDP_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLDP_R + Line 1245: EXTRN ?EmitLS@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLS + Line 1246: EXTRN ?EmitLS_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLS_R + Line 1247: EXTRN ?EmitLO@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLO + Line 1248: EXTRN ?EmitLO_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLO_R + Line 1249: EXTRN ?EmitLP@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLP + Line 1250: EXTRN ?EmitLP_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLP_R + Line 1251: EXTRN ?EmitLV2@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLV2 + Line 1252: EXTRN ?EmitLV2_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLV2_R + Line 1253: EXTRN ?EmitLV3@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLV3 + Line 1254: EXTRN ?EmitLV3_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLV3_R + Line 1255: EXTRN ?EmitLCS@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLCS + Line 1256: EXTRN ?EmitLCS_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLCS_R + Line 1257: EXTRN ?EmitLBIT@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLBIT + Line 1258: EXTRN ?EmitSB@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSB + Line 1259: EXTRN ?EmitSB_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSB_R + Line 1260: EXTRN ?EmitSH@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSH + Line 1261: EXTRN ?EmitSH_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSH_R + Line 1262: EXTRN ?EmitSW@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSW + Line 1263: EXTRN ?EmitSW_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSW_R + Line 1264: EXTRN ?EmitSSP@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSSP + Line 1265: EXTRN ?EmitSSP_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSSP_R + Line 1266: EXTRN ?EmitSDP@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSDP + Line 1267: EXTRN ?EmitSDP_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSDP_R + Line 1268: EXTRN ?EmitSS@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSS + Line 1269: EXTRN ?EmitSS_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSS_R + Line 1270: EXTRN ?EmitSP@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSP + Line 1271: EXTRN ?EmitSP_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSP_R + Line 1272: EXTRN ?EmitSO@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSO + Line 1273: EXTRN ?EmitSO_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSO_R + Line 1274: EXTRN ?EmitSV2@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSV2 + Line 1275: EXTRN ?EmitSV2_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSV2_R + Line 1276: EXTRN ?EmitSV3@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSV3 + Line 1277: EXTRN ?EmitSV3_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSV3_R + Line 1278: EXTRN ?EmitSBIT@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSBIT + Line 1279: EXTRN ?EmitMOVE@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMOVE + Line 1280: EXTRN ?EmitMOVEF@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMOVEF + Line 1281: EXTRN ?EmitMOVES@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMOVES + Line 1282: EXTRN ?EmitMOVEA@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMOVEA + Line 1283: EXTRN ?EmitMOVEV2@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMOVEV2 + Line 1284: EXTRN ?EmitMOVEV3@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMOVEV3 + Line 1285: EXTRN ?EmitCAST@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitCAST + Line 1286: EXTRN ?EmitCASTB@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitCASTB + Line 1287: EXTRN ?EmitDYNCAST_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitDYNCAST_R + Line 1288: EXTRN ?EmitDYNCAST_K@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitDYNCAST_K + Line 1289: EXTRN ?EmitDYNCASTC_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitDYNCASTC_R + Line 1290: EXTRN ?EmitDYNCASTC_K@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitDYNCASTC_K + Line 1291: EXTRN ?EmitTEST@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitTEST + Line 1292: EXTRN ?EmitTESTN@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitTESTN + Line 1293: EXTRN ?EmitJMP@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitJMP + Line 1294: EXTRN ?EmitIJMP@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitIJMP + Line 1295: EXTRN ?EmitPARAM@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitPARAM + Line 1296: EXTRN ?EmitPARAMI@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitPARAMI + Line 1297: EXTRN ?EmitCALL@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitCALL + Line 1298: EXTRN ?EmitCALL_K@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitCALL_K + Line 1299: EXTRN ?EmitVTBL@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitVTBL + Line 1300: EXTRN ?EmitSCOPE@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSCOPE + Line 1301: EXTRN ?EmitRESULT@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitRESULT + Line 1302: EXTRN ?EmitRET@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitRET + Line 1303: EXTRN ?EmitRETI@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitRETI + Line 1304: EXTRN ?EmitTHROW@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitTHROW + Line 1305: EXTRN ?EmitBOUND@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitBOUND + Line 1306: EXTRN ?EmitBOUND_K@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitBOUND_K + Line 1307: EXTRN ?EmitBOUND_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitBOUND_R + Line 1308: EXTRN ?EmitCONCAT@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitCONCAT + Line 1309: EXTRN ?EmitLENS@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLENS + Line 1310: EXTRN ?EmitCMPS@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitCMPS + Line 1311: EXTRN ?EmitSLL_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSLL_RR + Line 1312: EXTRN ?EmitSLL_RI@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSLL_RI + Line 1313: EXTRN ?EmitSLL_KR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSLL_KR + Line 1314: EXTRN ?EmitSRL_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSRL_RR + Line 1315: EXTRN ?EmitSRL_RI@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSRL_RI + Line 1316: EXTRN ?EmitSRL_KR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSRL_KR + Line 1317: EXTRN ?EmitSRA_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSRA_RR + Line 1318: EXTRN ?EmitSRA_RI@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSRA_RI + Line 1319: EXTRN ?EmitSRA_KR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSRA_KR + Line 1320: EXTRN ?EmitADD_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitADD_RR + Line 1321: EXTRN ?EmitADD_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitADD_RK + Line 1322: EXTRN ?EmitADDI@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitADDI + Line 1323: EXTRN ?EmitSUB_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSUB_RR + Line 1324: EXTRN ?EmitSUB_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSUB_RK + Line 1325: EXTRN ?EmitSUB_KR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSUB_KR + Line 1326: EXTRN ?EmitMUL_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMUL_RR + Line 1327: EXTRN ?EmitMUL_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMUL_RK + Line 1328: EXTRN ?EmitDIV_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitDIV_RR + Line 1329: EXTRN ?EmitDIV_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitDIV_RK + Line 1330: EXTRN ?EmitDIV_KR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitDIV_KR + Line 1331: EXTRN ?EmitDIVU_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitDIVU_RR + Line 1332: EXTRN ?EmitDIVU_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitDIVU_RK + Line 1333: EXTRN ?EmitDIVU_KR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitDIVU_KR + Line 1334: EXTRN ?EmitMOD_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMOD_RR + Line 1335: EXTRN ?EmitMOD_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMOD_RK + Line 1336: EXTRN ?EmitMOD_KR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMOD_KR + Line 1337: EXTRN ?EmitMODU_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMODU_RR + Line 1338: EXTRN ?EmitMODU_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMODU_RK + Line 1339: EXTRN ?EmitMODU_KR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMODU_KR + Line 1340: EXTRN ?EmitAND_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitAND_RR + Line 1341: EXTRN ?EmitAND_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitAND_RK + Line 1342: EXTRN ?EmitOR_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitOR_RR + Line 1343: EXTRN ?EmitOR_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitOR_RK + Line 1344: EXTRN ?EmitXOR_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitXOR_RR + Line 1345: EXTRN ?EmitXOR_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitXOR_RK + Line 1346: EXTRN ?EmitMIN_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMIN_RR + Line 1347: EXTRN ?EmitMIN_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMIN_RK + Line 1348: EXTRN ?EmitMAX_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMAX_RR + Line 1349: EXTRN ?EmitMAX_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMAX_RK + Line 1350: EXTRN ?EmitMINU_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMINU_RR + Line 1351: EXTRN ?EmitMINU_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMINU_RK + Line 1352: EXTRN ?EmitMAXU_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMAXU_RR + Line 1353: EXTRN ?EmitMAXU_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMAXU_RK + Line 1354: EXTRN ?EmitABS@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitABS + Line 1355: EXTRN ?EmitNEG@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitNEG + Line 1356: EXTRN ?EmitNOT@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitNOT + Line 1357: EXTRN ?EmitEQ_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitEQ_R + Line 1358: EXTRN ?EmitEQ_K@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitEQ_K + Line 1359: EXTRN ?EmitLT_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLT_RR + Line 1360: EXTRN ?EmitLT_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLT_RK + Line 1361: EXTRN ?EmitLT_KR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLT_KR + Line 1362: EXTRN ?EmitLE_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLE_RR + Line 1363: EXTRN ?EmitLE_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLE_RK + Line 1364: EXTRN ?EmitLE_KR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLE_KR + Line 1365: EXTRN ?EmitLTU_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLTU_RR + Line 1366: EXTRN ?EmitLTU_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLTU_RK + Line 1367: EXTRN ?EmitLTU_KR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLTU_KR + Line 1368: EXTRN ?EmitLEU_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLEU_RR + Line 1369: EXTRN ?EmitLEU_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLEU_RK + Line 1370: EXTRN ?EmitLEU_KR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLEU_KR + Line 1371: EXTRN ?EmitADDF_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitADDF_RR + Line 1372: EXTRN ?EmitADDF_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitADDF_RK + Line 1373: EXTRN ?EmitSUBF_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSUBF_RR + Line 1374: EXTRN ?EmitSUBF_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSUBF_RK + Line 1375: EXTRN ?EmitSUBF_KR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSUBF_KR + Line 1376: EXTRN ?EmitMULF_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMULF_RR + Line 1377: EXTRN ?EmitMULF_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMULF_RK + Line 1378: EXTRN ?EmitDIVF_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitDIVF_RR + Line 1379: EXTRN ?EmitDIVF_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitDIVF_RK + Line 1380: EXTRN ?EmitDIVF_KR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitDIVF_KR + Line 1381: EXTRN ?EmitMODF_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMODF_RR + Line 1382: EXTRN ?EmitMODF_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMODF_RK + Line 1383: EXTRN ?EmitMODF_KR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMODF_KR + Line 1384: EXTRN ?EmitPOWF_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitPOWF_RR + Line 1385: EXTRN ?EmitPOWF_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitPOWF_RK + Line 1386: EXTRN ?EmitPOWF_KR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitPOWF_KR + Line 1387: EXTRN ?EmitMINF_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMINF_RR + Line 1388: EXTRN ?EmitMINF_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMINF_RK + Line 1389: EXTRN ?EmitMAXF_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMAXF_RR + Line 1390: EXTRN ?EmitMAXF_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMAXF_RK + Line 1391: EXTRN ?EmitATAN2@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitATAN2 + Line 1392: EXTRN ?EmitFLOP@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitFLOP + Line 1393: EXTRN ?EmitEQF_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitEQF_R + Line 1394: EXTRN ?EmitEQF_K@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitEQF_K + Line 1395: EXTRN ?EmitLTF_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLTF_RR + Line 1396: EXTRN ?EmitLTF_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLTF_RK + Line 1397: EXTRN ?EmitLTF_KR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLTF_KR + Line 1398: EXTRN ?EmitLEF_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLEF_RR + Line 1399: EXTRN ?EmitLEF_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLEF_RK + Line 1400: EXTRN ?EmitLEF_KR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLEF_KR + Line 1401: EXTRN ?EmitNEGV2@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitNEGV2 + Line 1402: EXTRN ?EmitADDV2_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitADDV2_RR + Line 1403: EXTRN ?EmitSUBV2_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSUBV2_RR + Line 1404: EXTRN ?EmitDOTV2_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitDOTV2_RR + Line 1405: EXTRN ?EmitMULVF2_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMULVF2_RR + Line 1406: EXTRN ?EmitMULVF2_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMULVF2_RK + Line 1407: EXTRN ?EmitDIVVF2_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitDIVVF2_RR + Line 1408: EXTRN ?EmitDIVVF2_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitDIVVF2_RK + Line 1409: EXTRN ?EmitLENV2@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLENV2 + Line 1410: EXTRN ?EmitEQV2_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitEQV2_R + Line 1411: EXTRN ?EmitEQV2_K@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitEQV2_K + Line 1412: EXTRN ?EmitNEGV3@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitNEGV3 + Line 1413: EXTRN ?EmitADDV3_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitADDV3_RR + Line 1414: EXTRN ?EmitSUBV3_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSUBV3_RR + Line 1415: EXTRN ?EmitDOTV3_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitDOTV3_RR + Line 1416: EXTRN ?EmitCROSSV_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitCROSSV_RR + Line 1417: EXTRN ?EmitMULVF3_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMULVF3_RR + Line 1418: EXTRN ?EmitMULVF3_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitMULVF3_RK + Line 1419: EXTRN ?EmitDIVVF3_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitDIVVF3_RR + Line 1420: EXTRN ?EmitDIVVF3_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitDIVVF3_RK + Line 1421: EXTRN ?EmitLENV3@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitLENV3 + Line 1422: EXTRN ?EmitEQV3_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitEQV3_R + Line 1423: EXTRN ?EmitEQV3_K@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitEQV3_K + Line 1424: EXTRN ?EmitADDA_RR@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitADDA_RR + Line 1425: EXTRN ?EmitADDA_RK@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitADDA_RK + Line 1426: EXTRN ?EmitSUBA@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitSUBA + Line 1427: EXTRN ?EmitEQA_R@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitEQA_R + Line 1428: EXTRN ?EmitEQA_K@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitEQA_K + Line 1429: EXTRN ??_EAsmJitException@@UEAAPEAXI@Z:PROC ; AsmJitException::`vector deleting destructor' + Line 1430: EXTRN ??_EThrowingErrorHandler@@UEAAPEAXI@Z:PROC ; ThrowingErrorHandler::`vector deleting destructor' + Line 1431: EXTRN ?AddJitFunction@@YAPEAXPEAVCodeHolder@asmjit@@PEAVJitCompiler@@@Z:PROC ; AddJitFunction + Line 1432: EXTRN ?GetHostCodeInfo@@YA?AVCodeInfo@asmjit@@XZ:PROC ; GetHostCodeInfo + Line 1433: EXTRN _CxxThrowException:PROC + Line 1434: EXTRN __CxxFrameHandler3:PROC + Line 1435: EXTRN __chkstk:PROC + Line 1436: EXTRN ?nothrow@std@@3Unothrow_t@1@B:BYTE ; std::nothrow + Line 1437: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 1438: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 1439: EXTRN ?GlobalVMStack@@3VVMFrameStack@@A:BYTE ; GlobalVMStack + Line 1440: EXTRN ?TypeFloat64@@3PEAVPFloat@@EA:QWORD ; TypeFloat64 + Line 1441: EXTRN ?TypeString@@3PEAVPString@@EA:QWORD ; TypeString + Line 1442: EXTRN ?TypeVector2@@3PEAVPStruct@@EA:QWORD ; TypeVector2 + Line 1443: EXTRN ?TypeVector3@@3PEAVPStruct@@EA:QWORD ; TypeVector3 + Line 1444: EXTRN ?VMCalls@@3PAHA:BYTE ; VMCalls + Line 1445: EXTRN __ImageBase:BYTE + Line 1446: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\jit_call.cod (31 hits) + Line 8: EXTRN ?x86OpData@asmjit@@3UX86OpData@1@B:BYTE ; asmjit::x86OpData + Line 90: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 91: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 92: EXTRN atexit:PROC + Line 93: EXTRN __std_terminate:PROC + Line 94: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 95: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 96: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 97: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 98: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 99: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 100: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 101: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 102: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 103: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 104: EXTRN ?emit@CodeEmitter@asmjit@@QEAAIIAEBUOperand_@2@@Z:PROC ; asmjit::CodeEmitter::emit + Line 105: EXTRN ?emit@CodeEmitter@asmjit@@QEAAIIAEBUOperand_@2@0@Z:PROC ; asmjit::CodeEmitter::emit + Line 106: EXTRN ?emit@CodeEmitter@asmjit@@QEAAIIAEBUOperand_@2@H@Z:PROC ; asmjit::CodeEmitter::emit + Line 107: EXTRN ?emit@CodeEmitter@asmjit@@QEAAIIAEBUOperand_@2@_J@Z:PROC ; asmjit::CodeEmitter::emit + Line 108: EXTRN ?setCursor@CodeBuilder@asmjit@@QEAAPEAVCBNode@2@PEAV32@@Z:PROC ; asmjit::CodeBuilder::setCursor + Line 109: EXTRN ?_setArg@CCFuncCall@asmjit@@QEAA_NIAEBUOperand_@2@@Z:PROC ; asmjit::CCFuncCall::_setArg + Line 110: EXTRN ?_setRet@CCFuncCall@asmjit@@QEAA_NIAEBUOperand_@2@@Z:PROC ; asmjit::CCFuncCall::_setRet + Line 111: EXTRN ?addCall@CodeCompiler@asmjit@@QEAAPEAVCCFuncCall@2@IAEBUOperand_@2@AEBUFuncSignature@2@@Z:PROC ; asmjit::CodeCompiler::addCall + Line 112: EXTRN ?_newReg@CodeCompiler@asmjit@@QEAAIAEAVReg@2@IPEBDPEAD@Z:PROC ; asmjit::CodeCompiler::_newReg + Line 113: EXTRN ?EmitThrowExceptionLabel@JitCompiler@@AEAA?AVLabel@asmjit@@W4EVMAbortException@@@Z:PROC ; JitCompiler::EmitThrowExceptionLabel + Line 114: EXTRN ?CheckVMFrame@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::CheckVMFrame + Line 115: EXTRN ?GetCallReturns@JitCompiler@@AEAA?AVX86Gp@asmjit@@XZ:PROC ; JitCompiler::GetCallReturns + Line 116: EXTRN _CxxThrowException:PROC + Line 117: EXTRN __CxxFrameHandler3:PROC + Line 118: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 119: EXTRN __ImageBase:BYTE + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\jit_flow.cod (25 hits) + Line 8: EXTRN ?x86OpData@asmjit@@3UX86OpData@1@B:BYTE ; asmjit::x86OpData + Line 45: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 46: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 47: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 48: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 49: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 50: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 51: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 52: EXTRN ?ValidateCall@FScopeBarrier@@SAXPEAVPClass@@PEAVVMFunction@@H@Z:PROC ; FScopeBarrier::ValidateCall + Line 53: EXTRN ?ThrowAbortException@@YAXW4EVMAbortException@@PEBDZZ:PROC ; ThrowAbortException + Line 54: EXTRN ?PCToLine@VMScriptFunction@@QEAAHPEBTVMOP@@@Z:PROC ; VMScriptFunction::PCToLine + Line 55: EXTRN ?emit@CodeEmitter@asmjit@@QEAAIIAEBUOperand_@2@@Z:PROC ; asmjit::CodeEmitter::emit + Line 56: EXTRN ?emit@CodeEmitter@asmjit@@QEAAIIAEBUOperand_@2@0@Z:PROC ; asmjit::CodeEmitter::emit + Line 57: EXTRN ?emit@CodeEmitter@asmjit@@QEAAIIAEBUOperand_@2@H@Z:PROC ; asmjit::CodeEmitter::emit + Line 58: EXTRN ?emit@CodeEmitter@asmjit@@QEAAIIAEBUOperand_@2@_J@Z:PROC ; asmjit::CodeEmitter::emit + Line 59: EXTRN ?setCursor@CodeBuilder@asmjit@@QEAAPEAVCBNode@2@PEAV32@@Z:PROC ; asmjit::CodeBuilder::setCursor + Line 60: EXTRN ?_setArg@CCFuncCall@asmjit@@QEAA_NIAEBUOperand_@2@@Z:PROC ; asmjit::CCFuncCall::_setArg + Line 61: EXTRN ?addRet@CodeCompiler@asmjit@@QEAAPEAVCCFuncRet@2@AEBUOperand_@2@0@Z:PROC ; asmjit::CodeCompiler::addRet + Line 62: EXTRN ?addCall@CodeCompiler@asmjit@@QEAAPEAVCCFuncCall@2@IAEBUOperand_@2@AEBUFuncSignature@2@@Z:PROC ; asmjit::CodeCompiler::addCall + Line 63: EXTRN ?_newReg@CodeCompiler@asmjit@@QEAAIAEAVReg@2@IPEBDPEAD@Z:PROC ; asmjit::CodeCompiler::_newReg + Line 64: EXTRN ?EmitPopFrame@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::EmitPopFrame + Line 65: EXTRN ?EmitThrowException@JitCompiler@@AEAAXW4EVMAbortException@@@Z:PROC ; JitCompiler::EmitThrowException + Line 66: EXTRN ?EmitThrowExceptionLabel@JitCompiler@@AEAA?AVLabel@asmjit@@W4EVMAbortException@@@Z:PROC ; JitCompiler::EmitThrowExceptionLabel + Line 67: EXTRN _CxxThrowException:PROC + Line 68: EXTRN __CxxFrameHandler3:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\jit_load.cod (20 hits) + Line 8: EXTRN ?x86OpData@asmjit@@3UX86OpData@1@B:BYTE ; asmjit::x86OpData + Line 66: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 67: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 68: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 69: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 70: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 71: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 72: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 73: EXTRN ?emit@CodeEmitter@asmjit@@QEAAIIAEBUOperand_@2@@Z:PROC ; asmjit::CodeEmitter::emit + Line 74: EXTRN ?emit@CodeEmitter@asmjit@@QEAAIIAEBUOperand_@2@0@Z:PROC ; asmjit::CodeEmitter::emit + Line 75: EXTRN ?emit@CodeEmitter@asmjit@@QEAAIIAEBUOperand_@2@H@Z:PROC ; asmjit::CodeEmitter::emit + Line 76: EXTRN ?emit@CodeEmitter@asmjit@@QEAAIIAEBUOperand_@2@_J@Z:PROC ; asmjit::CodeEmitter::emit + Line 77: EXTRN ?_setArg@CCFuncCall@asmjit@@QEAA_NIAEBUOperand_@2@@Z:PROC ; asmjit::CCFuncCall::_setArg + Line 78: EXTRN ?addCall@CodeCompiler@asmjit@@QEAAPEAVCCFuncCall@2@IAEBUOperand_@2@AEBUFuncSignature@2@@Z:PROC ; asmjit::CodeCompiler::addCall + Line 79: EXTRN ?_newReg@CodeCompiler@asmjit@@QEAAIAEAVReg@2@IPEBDPEAD@Z:PROC ; asmjit::CodeCompiler::_newReg + Line 80: EXTRN ?EmitNullPointerThrow@JitCompiler@@AEAAXHW4EVMAbortException@@@Z:PROC ; JitCompiler::EmitNullPointerThrow + Line 81: EXTRN ?EmitThrowExceptionLabel@JitCompiler@@AEAA?AVLabel@asmjit@@W4EVMAbortException@@@Z:PROC ; JitCompiler::EmitThrowExceptionLabel + Line 82: EXTRN ?CheckVMFrame@JitCompiler@@AEAAXXZ:PROC ; JitCompiler::CheckVMFrame + Line 83: EXTRN _CxxThrowException:PROC + Line 84: EXTRN __CxxFrameHandler3:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\jit_math.cod (52 hits) + Line 8: EXTRN ?x86OpData@asmjit@@3UX86OpData@1@B:BYTE ; asmjit::x86OpData + Line 186: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 187: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 188: EXTRN __std_terminate:PROC + Line 189: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 190: EXTRN stricmp:PROC + Line 191: EXTRN fabs:PROC + Line 192: EXTRN ceil:PROC + Line 193: EXTRN floor:PROC + Line 194: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 195: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 196: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 197: EXTRN ??HFString@@QEBA?AV0@AEBV0@@Z:PROC ; FString::operator+ + Line 198: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 199: EXTRN c_asin:PROC + Line 200: EXTRN c_acos:PROC + Line 201: EXTRN c_atan:PROC + Line 202: EXTRN c_atan2:PROC + Line 203: EXTRN c_tan:PROC + Line 204: EXTRN c_sqrt:PROC + Line 205: EXTRN c_sinh:PROC + Line 206: EXTRN c_cosh:PROC + Line 207: EXTRN c_tanh:PROC + Line 208: EXTRN c_exp:PROC + Line 209: EXTRN c_log:PROC + Line 210: EXTRN c_log10:PROC + Line 211: EXTRN c_pow:PROC + Line 212: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 213: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 214: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 215: EXTRN ?emit@CodeEmitter@asmjit@@QEAAIIAEBUOperand_@2@@Z:PROC ; asmjit::CodeEmitter::emit + Line 216: EXTRN ?emit@CodeEmitter@asmjit@@QEAAIIAEBUOperand_@2@0@Z:PROC ; asmjit::CodeEmitter::emit + Line 217: EXTRN ?emit@CodeEmitter@asmjit@@QEAAIIAEBUOperand_@2@00@Z:PROC ; asmjit::CodeEmitter::emit + Line 218: EXTRN ?emit@CodeEmitter@asmjit@@QEAAIIAEBUOperand_@2@H@Z:PROC ; asmjit::CodeEmitter::emit + Line 219: EXTRN ?_setArg@CCFuncCall@asmjit@@QEAA_NIAEBUOperand_@2@@Z:PROC ; asmjit::CCFuncCall::_setArg + Line 220: EXTRN ?_setRet@CCFuncCall@asmjit@@QEAA_NIAEBUOperand_@2@@Z:PROC ; asmjit::CCFuncCall::_setRet + Line 221: EXTRN ?addCall@CodeCompiler@asmjit@@QEAAPEAVCCFuncCall@2@IAEBUOperand_@2@AEBUFuncSignature@2@@Z:PROC ; asmjit::CodeCompiler::addCall + Line 222: EXTRN ?_newReg@CodeCompiler@asmjit@@QEAAIAEAVReg@2@IPEBDPEAD@Z:PROC ; asmjit::CodeCompiler::_newReg + Line 223: EXTRN ?_newConst@CodeCompiler@asmjit@@QEAAIAEAVMem@2@IPEBX_K@Z:PROC ; asmjit::CodeCompiler::_newConst + Line 224: EXTRN ?EmitThrowException@JitCompiler@@AEAAXW4EVMAbortException@@@Z:PROC ; JitCompiler::EmitThrowException + Line 225: EXTRN ?EmitThrowExceptionLabel@JitCompiler@@AEAA?AVLabel@asmjit@@W4EVMAbortException@@@Z:PROC ; JitCompiler::EmitThrowExceptionLabel + Line 226: EXTRN ?CheckRegD@JitCompiler@@AEAA?AVX86Gp@asmjit@@HH@Z:PROC ; JitCompiler::CheckRegD + Line 227: EXTRN ?CheckRegF@JitCompiler@@AEAA?AVX86Xmm@asmjit@@HH@Z:PROC ; JitCompiler::CheckRegF + Line 228: EXTRN ?CheckRegF@JitCompiler@@AEAA?AVX86Xmm@asmjit@@HHH@Z:PROC ; JitCompiler::CheckRegF + Line 229: EXTRN ?CheckRegF@JitCompiler@@AEAA?AVX86Xmm@asmjit@@HHHH@Z:PROC ; JitCompiler::CheckRegF + Line 230: EXTRN ?CheckRegS@JitCompiler@@AEAA?AVX86Gp@asmjit@@HH@Z:PROC ; JitCompiler::CheckRegS + Line 231: EXTRN _CxxThrowException:PROC + Line 232: EXTRN __CxxFrameHandler3:PROC + Line 233: EXTRN floor:PROC + Line 234: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 235: EXTRN __ImageBase:BYTE + Line 236: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\jit_move.cod (29 hits) + Line 8: EXTRN ?x86OpData@asmjit@@3UX86OpData@1@B:BYTE ; asmjit::x86OpData + Line 74: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 75: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 76: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 77: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 78: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_K_N@Z:PROC ; FName::NameManager::FindName + Line 79: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 80: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 81: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 82: EXTRN ?ToLong@FString@@QEBAJH@Z:PROC ; FString::ToLong + Line 83: EXTRN ?ToDouble@FString@@QEBANXZ:PROC ; FString::ToDouble + Line 84: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 85: EXTRN ?emit@CodeEmitter@asmjit@@QEAAIIAEBUOperand_@2@@Z:PROC ; asmjit::CodeEmitter::emit + Line 86: EXTRN ?emit@CodeEmitter@asmjit@@QEAAIIAEBUOperand_@2@0@Z:PROC ; asmjit::CodeEmitter::emit + Line 87: EXTRN ?emit@CodeEmitter@asmjit@@QEAAIIAEBUOperand_@2@H@Z:PROC ; asmjit::CodeEmitter::emit + Line 88: EXTRN ?_setArg@CCFuncCall@asmjit@@QEAA_NIAEBUOperand_@2@@Z:PROC ; asmjit::CCFuncCall::_setArg + Line 89: EXTRN ?_setRet@CCFuncCall@asmjit@@QEAA_NIAEBUOperand_@2@@Z:PROC ; asmjit::CCFuncCall::_setRet + Line 90: EXTRN ?addCall@CodeCompiler@asmjit@@QEAAPEAVCCFuncCall@2@IAEBUOperand_@2@AEBUFuncSignature@2@@Z:PROC ; asmjit::CodeCompiler::addCall + Line 91: EXTRN ?_newReg@CodeCompiler@asmjit@@QEAAIAEAVReg@2@IPEBDPEAD@Z:PROC ; asmjit::CodeCompiler::_newReg + Line 92: EXTRN ?V_GetColor@@YAHPEBIPEBDPEAUFScriptPosition@@@Z:PROC ; V_GetColor + Line 93: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 94: EXTRN _CxxThrowException:PROC + Line 95: EXTRN __CxxFrameHandler3:PROC + Line 96: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 97: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 98: EXTRN ?S_sfx@@3V?$TArray@Usfxinfo_t@@U1@@@A:BYTE ; S_sfx + Line 99: EXTRN ?sprites@@3V?$TArray@Uspritedef_t@@U1@@@A:BYTE ; sprites + Line 100: EXTRN __ImageBase:BYTE + Line 101: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\jit_runtime.cod (45 hits) + Line 8: EXTRN ?x86OpData@asmjit@@3UX86OpData@1@B:BYTE ; asmjit::x86OpData + Line 32: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 33: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 34: EXTRN atexit:PROC + Line 35: EXTRN __std_terminate:PROC + Line 36: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 37: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 38: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 39: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 40: EXTRN ??YFString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator+= + Line 41: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 42: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 43: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 44: EXTRN __imp_RtlCaptureContext:PROC + Line 45: EXTRN __imp_RtlAddFunctionTable:PROC + Line 46: EXTRN __imp_RtlDeleteFunctionTable:PROC + Line 47: EXTRN __imp_RtlLookupFunctionEntry:PROC + Line 48: EXTRN __imp_RtlVirtualUnwind:PROC + Line 49: EXTRN __imp_GetCurrentProcess:PROC + Line 50: EXTRN ?init@FuncFrameLayout@asmjit@@QEAAIAEBVFuncDetail@2@AEBUFuncFrameInfo@2@@Z:PROC ; asmjit::FuncFrameLayout::init + Line 51: EXTRN ??0CodeHolder@asmjit@@QEAA@XZ:PROC ; asmjit::CodeHolder::CodeHolder + Line 52: EXTRN ??1CodeHolder@asmjit@@QEAA@XZ:PROC ; asmjit::CodeHolder::~CodeHolder + Line 53: EXTRN ?init@CodeHolder@asmjit@@QEAAIAEBVCodeInfo@2@@Z:PROC ; asmjit::CodeHolder::init + Line 54: EXTRN ?getCodeSize@CodeHolder@asmjit@@QEBA_KXZ:PROC ; asmjit::CodeHolder::getCodeSize + Line 55: EXTRN ?relocate@CodeHolder@asmjit@@QEBA_KPEAX_K@Z:PROC ; asmjit::CodeHolder::relocate + Line 56: EXTRN ?emit@CodeEmitter@asmjit@@QEAAIIAEBUOperand_@2@@Z:PROC ; asmjit::CodeEmitter::emit + Line 57: EXTRN ?emit@CodeEmitter@asmjit@@QEAAIIAEBUOperand_@2@0@Z:PROC ; asmjit::CodeEmitter::emit + Line 58: EXTRN ?emit@CodeEmitter@asmjit@@QEAAIIAEBUOperand_@2@H@Z:PROC ; asmjit::CodeEmitter::emit + Line 59: EXTRN ?emit@CodeEmitter@asmjit@@QEAAIIAEBUOperand_@2@_J@Z:PROC ; asmjit::CodeEmitter::emit + Line 60: EXTRN ?allocVirtualMemory@OSUtils@asmjit@@SAPEAX_KPEA_KI@Z:PROC ; asmjit::OSUtils::allocVirtualMemory + Line 61: EXTRN ?releaseVirtualMemory@OSUtils@asmjit@@SAIPEAX_K@Z:PROC ; asmjit::OSUtils::releaseVirtualMemory + Line 62: EXTRN ??0JitRuntime@asmjit@@QEAA@XZ:PROC ; asmjit::JitRuntime::JitRuntime + Line 63: EXTRN ??1JitRuntime@asmjit@@UEAA@XZ:PROC ; asmjit::JitRuntime::~JitRuntime + Line 64: EXTRN ??0X86Assembler@asmjit@@QEAA@PEAVCodeHolder@1@@Z:PROC ; asmjit::X86Assembler::X86Assembler + Line 65: EXTRN ??1X86Assembler@asmjit@@UEAA@XZ:PROC ; asmjit::X86Assembler::~X86Assembler + Line 66: EXTRN ?Codegen@JitCompiler@@QEAAPEAVCCFunc@asmjit@@XZ:PROC ; JitCompiler::Codegen + Line 67: EXTRN __imp_SymCleanup:PROC + Line 68: EXTRN __imp_SymGetLineFromAddr64:PROC + Line 69: EXTRN __imp_SymInitialize:PROC + Line 70: EXTRN __imp_SymGetSymFromAddr64:PROC + Line 71: EXTRN __CxxFrameHandler3:PROC + Line 72: EXTRN memcpy:PROC + Line 73: EXTRN memset:PROC + Line 74: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 75: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\jit_store.cod (17 hits) + Line 8: EXTRN ?x86OpData@asmjit@@3UX86OpData@1@B:BYTE ; asmjit::x86OpData + Line 56: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 57: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 58: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 59: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 60: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 61: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 62: EXTRN ?Barrier@GC@@YAXPEAVDObject@@0@Z:PROC ; GC::Barrier + Line 63: EXTRN ?emit@CodeEmitter@asmjit@@QEAAIIAEBUOperand_@2@0@Z:PROC ; asmjit::CodeEmitter::emit + Line 64: EXTRN ?emit@CodeEmitter@asmjit@@QEAAIIAEBUOperand_@2@H@Z:PROC ; asmjit::CodeEmitter::emit + Line 65: EXTRN ?_setArg@CCFuncCall@asmjit@@QEAA_NIAEBUOperand_@2@@Z:PROC ; asmjit::CCFuncCall::_setArg + Line 66: EXTRN ?addCall@CodeCompiler@asmjit@@QEAAPEAVCCFuncCall@2@IAEBUOperand_@2@AEBUFuncSignature@2@@Z:PROC ; asmjit::CodeCompiler::addCall + Line 67: EXTRN ?_newReg@CodeCompiler@asmjit@@QEAAIAEAVReg@2@IPEBDPEAD@Z:PROC ; asmjit::CodeCompiler::_newReg + Line 68: EXTRN ?EmitNullPointerThrow@JitCompiler@@AEAAXHW4EVMAbortException@@@Z:PROC ; JitCompiler::EmitNullPointerThrow + Line 69: EXTRN _CxxThrowException:PROC + Line 70: EXTRN __CxxFrameHandler3:PROC + Line 71: EXTRN ?State@GC@@3W4EGCState@1@A:DWORD ; GC::State + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\joystickmenu.cod (23 hits) + Line 188: EXTRN atexit:PROC + Line 189: EXTRN __std_terminate:PROC + Line 190: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 191: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 192: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 193: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 194: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 195: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 196: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 197: EXTRN ?Barrier@GC@@YAXPEAVDObject@@0@Z:PROC ; GC::Barrier + Line 198: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 199: EXTRN ?GetItem@DOptionMenuDescriptor@@QEAAPEAVDMenuItemBase@@VFName@@@Z:PROC ; DOptionMenuDescriptor::GetItem + Line 200: EXTRN ?SetValue@DMenuItemBase@@QEAA_NHH@Z:PROC ; DMenuItemBase::SetValue + Line 201: EXTRN ?CreateOptionMenuItemJoyConfigMenu@@YAPEAVDMenuItemBase@@PEBDPEAUIJoystickConfig@@@Z:PROC ; CreateOptionMenuItemJoyConfigMenu + Line 202: EXTRN ?I_GetJoysticks@@YAXAEAV?$TArray@PEAUIJoystickConfig@@PEAU1@@@@Z:PROC ; I_GetJoysticks + Line 203: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 204: EXTRN __CxxFrameHandler3:PROC + Line 205: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 206: EXTRN ?CurrentMenu@@3PEAVDMenu@@EA:QWORD ; CurrentMenu + Line 207: EXTRN ?RegistrationInfo@DOptionMenuDescriptor@@2UClassReg@@A:BYTE ; DOptionMenuDescriptor::RegistrationInfo + Line 208: EXTRN ?MenuDescriptors@@3V?$TMap@VFName@@PEAVDMenuDescriptor@@U?$THashTraits@VFName@@@@U?$TValueTraits@PEAVDMenuDescriptor@@@@@@A:BYTE ; MenuDescriptors + Line 209: EXTRN ?use_joystick@@3VFBoolCVar@@A:BYTE ; use_joystick + Line 210: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\jpegtexture.cod (39 hits) + Line 41: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 42: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 43: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 44: EXTRN __std_terminate:PROC + Line 45: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 46: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 47: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 48: EXTRN jpeg_std_error:PROC + Line 49: EXTRN jpeg_CreateDecompress:PROC + Line 50: EXTRN jpeg_destroy_decompress:PROC + Line 51: EXTRN jpeg_read_header:PROC + Line 52: EXTRN jpeg_start_decompress:PROC + Line 53: EXTRN jpeg_read_scanlines:PROC + Line 54: EXTRN jpeg_finish_decompress:PROC + Line 55: EXTRN jpeg_resync_to_restart:PROC + Line 56: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 57: EXTRN ?OpenLumpReader@FWadCollection@@QEAA?AVFileReader@@H@Z:PROC ; FWadCollection::OpenLumpReader + Line 58: EXTRN ?GetLumpFullPath@FWadCollection@@QEBA?AVFString@@H@Z:PROC ; FWadCollection::GetLumpFullPath + Line 59: EXTRN ?CopyPixelDataRGB@FBitmap@@QEAAXHHPEBEHHHHHHPEAUFCopyInfo@@HHH@Z:PROC ; FBitmap::CopyPixelDataRGB + Line 60: EXTRN ?CopyPixelData@FBitmap@@QEAAXHHPEBEHHHHHPEAUPalEntry@@PEAUFCopyInfo@@@Z:PROC ; FBitmap::CopyPixelData + Line 61: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 62: EXTRN ?CreatePalettedPixels@FImageSource@@MEAA?AV?$TArray@EE@@H@Z:PROC ; FImageSource::CreatePalettedPixels + Line 63: EXTRN ?CopyPixels@FImageSource@@MEAAHPEAVFBitmap@@H@Z:PROC ; FImageSource::CopyPixels + Line 64: EXTRN ?CollectForPrecache@FImageSource@@UEAAXAEAV?$TMap@HU?$pair@HH@std@@U?$THashTraits@H@@U?$TValueTraits@U?$pair@HH@std@@@@@@_N@Z:PROC ; FImageSource::CollectForPrecache + Line 65: EXTRN ??_EFImageSource@@UEAAPEAXI@Z:PROC ; FImageSource::`vector deleting destructor' + Line 66: EXTRN ??_EFJPEGTexture@@UEAAPEAXI@Z:PROC ; FJPEGTexture::`vector deleting destructor' + Line 67: EXTRN _CxxThrowException:PROC + Line 68: EXTRN __CxxFrameHandler3:PROC + Line 69: EXTRN __chkstk:PROC + Line 70: EXTRN memset:PROC + Line 71: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 72: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 73: EXTRN ?RGB256k@@3TColorTable256k@@A:BYTE ; RGB256k + Line 74: EXTRN ?GPalette@@3UFPalette@@A:BYTE ; GPalette + Line 75: EXTRN ?translationtables@@3PAV?$TAutoGrowArray@VFRemapTablePtr@@PEAUFRemapTable@@@@A:BYTE ; translationtables + Line 76: EXTRN ?GrayMap@ImageHelpers@@3PAEA:BYTE ; ImageHelpers::GrayMap + Line 77: EXTRN ?ImageArena@FImageSource@@1VFMemArena@@A:BYTE ; FImageSource::ImageArena + Line 78: EXTRN ?NextID@FImageSource@@1HA:DWORD ; FImageSource::NextID + Line 79: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\keysections.cod (33 hits) + Line 38: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 39: EXTRN atexit:PROC + Line 40: EXTRN __std_terminate:PROC + Line 41: EXTRN stricmp:PROC + Line 42: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 43: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 44: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 45: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 46: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 47: EXTRN mysnprintf:PROC + Line 48: EXTRN ?ArchiveBindings@FKeyBindings@@QEAAXPEAVFConfigFile@@PEBD@Z:PROC ; FKeyBindings::ArchiveBindings + Line 49: EXTRN ?DoBind@FKeyBindings@@QEAAXPEBD0@Z:PROC ; FKeyBindings::DoBind + Line 50: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 51: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 52: EXTRN ?AddCommandString@@YAXPEBDH@Z:PROC ; AddCommandString + Line 53: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 54: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 55: EXTRN ?SetSection@FConfigFile@@QEAA_NPEBD_N@Z:PROC ; FConfigFile::SetSection + Line 56: EXTRN ?ClearCurrentSection@FConfigFile@@QEAAXXZ:PROC ; FConfigFile::ClearCurrentSection + Line 57: EXTRN ?NextInSection@FConfigFile@@QEAA_NAEAPEBD0@Z:PROC ; FConfigFile::NextInSection + Line 58: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 59: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 60: EXTRN ?FindLump@FWadCollection@@QEAAHPEBDPEAH_N@Z:PROC ; FWadCollection::FindLump + Line 61: EXTRN ?LumpLength@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::LumpLength + Line 62: EXTRN __CxxFrameHandler3:PROC + Line 63: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 64: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 65: EXTRN ?Bindings@@3VFKeyBindings@@A:BYTE ; Bindings + Line 66: EXTRN ?DoubleBindings@@3VFKeyBindings@@A:BYTE ; DoubleBindings + Line 67: EXTRN ?ParsingKeyConf@@3_NA:BYTE ; ParsingKeyConf + Line 68: EXTRN ?GameConfig@@3PEAVFGameConfigFile@@EA:QWORD ; GameConfig + Line 69: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 70: EXTRN ?KeyConfWeapons@@3V?$TArray@VFString@@V1@@@A:BYTE ; KeyConfWeapons + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\loadsavemenu.cod (61 hits) + Line 367: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 368: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 369: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 370: EXTRN atexit:PROC + Line 371: EXTRN __std_terminate:PROC + Line 372: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 373: EXTRN remove:PROC + Line 374: EXTRN strncmp:PROC + Line 375: EXTRN strncpy:PROC + Line 376: EXTRN stricmp:PROC + Line 377: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 378: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 379: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 380: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 381: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 382: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 383: EXTRN ??YFString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator+= + Line 384: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 385: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 386: EXTRN ?I_FindFirst@@YAPEAXPEBDPEAUfindstate_t@@@Z:PROC ; I_FindFirst + Line 387: EXTRN ?I_FindNext@@YAHPEAXPEAUfindstate_t@@@Z:PROC ; I_FindNext + Line 388: EXTRN ?I_FindClose@@YAHPEAX@Z:PROC ; I_FindClose + Line 389: EXTRN ?OpenFile@FileReader@@QEAA_NPEBD_J1@Z:PROC ; FileReader::OpenFile + Line 390: EXTRN ?OpenMemoryArray@FileReader@@QEAA_NV?$function@$$A6A_NAEAV?$TArray@EE@@@Z@std@@@Z:PROC ; FileReader::OpenMemoryArray + Line 391: EXTRN ?CacheLump@FResourceLump@@QEAAPEAXXZ:PROC ; FResourceLump::CacheLump + Line 392: EXTRN ?ReleaseCache@FResourceLump@@QEAAHXZ:PROC ; FResourceLump::ReleaseCache + Line 393: EXTRN ?OpenResourceFile@FResourceFile@@SAPEAV1@PEBD_N1@Z:PROC ; FResourceFile::OpenResourceFile + Line 394: EXTRN ?FindLump@FResourceFile@@QEAAPEAUFResourceLump@@PEBD@Z:PROC ; FResourceFile::FindLump + Line 395: EXTRN ?DrawTexture@DFrameBuffer@@QEAAXPEAVFTexture@@NNHZZ:PROC ; DFrameBuffer::DrawTexture + Line 396: EXTRN ?DrawText@DFrameBuffer@@QEAAXPEAVFFont@@HNNPEBDHZZ:PROC ; DFrameBuffer::DrawText + Line 397: EXTRN ?M_ClearMenus@@YAXXZ:PROC ; M_ClearMenus + Line 398: EXTRN ?G_LoadGame@@YAXPEBD_N@Z:PROC ; G_LoadGame + Line 399: EXTRN ?G_SaveGame@@YAXPEBD0@Z:PROC ; G_SaveGame + Line 400: EXTRN ?G_BuildSaveName@@YA?AVFString@@PEBDH@Z:PROC ; G_BuildSaveName + Line 401: EXTRN ?G_CheckSaveGameWads@@YA_NAEAVFSerializer@@_N@Z:PROC ; G_CheckSaveGameWads + Line 402: EXTRN ??1PNGHandle@@QEAA@XZ:PROC ; PNGHandle::~PNGHandle + Line 403: EXTRN ?M_VerifyPNG@@YAPEAUPNGHandle@@AEAVFileReader@@@Z:PROC ; M_VerifyPNG + Line 404: EXTRN ?M_GetPNGText@@YAPEADPEAUPNGHandle@@PEBD@Z:PROC ; M_GetPNGText + Line 405: EXTRN ?M_GetPNGText@@YA_NPEAUPNGHandle@@PEBDPEAD_K@Z:PROC ; M_GetPNGText + Line 406: EXTRN ?PNGTexture_CreateFromFile@@YAPEAVFTexture@@PEAUPNGHandle@@AEBVFString@@@Z:PROC ; PNGTexture_CreateFromFile + Line 407: EXTRN ?GetWadName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetWadName + Line 408: EXTRN ?V_BreakLines@@YA?AV?$TArray@UFBrokenLines@@U1@@@PEAVFFont@@HPEBE_N@Z:PROC ; V_BreakLines + Line 409: EXTRN ??AFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator[] + Line 410: EXTRN ?OpenReader@FSerializer@@QEAA_NPEBD_K@Z:PROC ; FSerializer::OpenReader + Line 411: EXTRN ?Close@FSerializer@@QEAAXXZ:PROC ; FSerializer::Close + Line 412: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 413: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAVFString@@PEAV2@@Z:PROC ; Serialize + Line 414: EXTRN ?FileExists@@YA_NPEBD@Z:PROC ; FileExists + Line 415: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 416: EXTRN __CxxFrameHandler3:PROC + Line 417: EXTRN memcpy:PROC + Line 418: EXTRN memmove:PROC + Line 419: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 420: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 421: EXTRN ?CleanXfac@@3HA:DWORD ; CleanXfac + Line 422: EXTRN ?CleanYfac@@3HA:DWORD ; CleanYfac + Line 423: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 424: EXTRN ?SmallFont@@3PEAVFFont@@EA:QWORD ; SmallFont + Line 425: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 426: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 427: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\log.cod (9 hits) + Line 16: EXTRN mtherr:PROC + Line 17: EXTRN frexp:PROC + Line 18: EXTRN ldexp:PROC + Line 19: EXTRN polevl:PROC + Line 20: EXTRN p1evl:PROC + Line 21: EXTRN isnan:PROC + Line 22: EXTRN INFINITY:QWORD + Line 23: EXTRN NAN:QWORD + Line 24: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\log10.cod (9 hits) + Line 17: EXTRN mtherr:PROC + Line 18: EXTRN frexp:PROC + Line 19: EXTRN ldexp:PROC + Line 20: EXTRN polevl:PROC + Line 21: EXTRN p1evl:PROC + Line 22: EXTRN isnan:PROC + Line 23: EXTRN INFINITY:QWORD + Line 24: EXTRN NAN:QWORD + Line 25: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\m_alloc.cod (6 hits) + Line 15: EXTRN free:PROC + Line 16: EXTRN malloc:PROC + Line 17: EXTRN _msize:PROC + Line 18: EXTRN realloc:PROC + Line 19: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 20: EXTRN ?AllocBytes@GC@@3_KA:QWORD ; GC::AllocBytes + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\m_argv.cod (17 hits) + Line 34: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 35: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 36: EXTRN __std_terminate:PROC + Line 37: EXTRN stricmp:PROC + Line 38: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 39: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 40: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 41: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 42: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 43: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 44: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 45: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 46: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 47: EXTRN ?I_GetLongPathName@@YA?AVFString@@V1@@Z:PROC ; I_GetLongPathName + Line 48: EXTRN __CxxFrameHandler3:PROC + Line 49: EXTRN memmove:PROC + Line 50: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\m_bbox.cod (2 hits) + Line 13: EXTRN ?P_VanillaPointOnLineSide@@YAHNNPEBUline_t@@@Z:PROC ; P_VanillaPointOnLineSide + Line 14: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\m_cheat.cod (65 hits) + Line 21: EXTRN ?RegistrationInfo@DThinker@@2UClassReg@@A:BYTE ; DThinker::RegistrationInfo + Line 200: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 201: EXTRN atexit:PROC + Line 202: EXTRN __std_terminate:PROC + Line 203: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 204: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 205: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 206: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 207: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 208: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 209: EXTRN mysnprintf:PROC + Line 210: EXTRN ?Barrier@GC@@YAXPEAVDObject@@0@Z:PROC ; GC::Barrier + Line 211: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 212: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 213: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 214: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 215: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 216: EXTRN ?FindFunction@PClass@@SAXPEAPEAVVMFunction@@VFName@@1@Z:PROC ; PClass::FindFunction + Line 217: EXTRN ?Link@FThinkerCollection@@QEAAXPEAVDThinker@@H@Z:PROC ; FThinkerCollection::Link + Line 218: EXTRN ?StaticType@DThinker@@UEBAPEAVPClass@@XZ:PROC ; DThinker::StaticType + Line 219: EXTRN ?OnDestroy@DThinker@@UEAAXXZ:PROC ; DThinker::OnDestroy + Line 220: EXTRN ??1DThinker@@UEAA@XZ:PROC ; DThinker::~DThinker + Line 221: EXTRN ?Tick@DThinker@@UEAAXXZ:PROC ; DThinker::Tick + Line 222: EXTRN ?PostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::PostBeginPlay + Line 223: EXTRN ?CallPostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::CallPostBeginPlay + Line 224: EXTRN ?PostSerialize@DThinker@@UEAAXXZ:PROC ; DThinker::PostSerialize + Line 225: EXTRN ?Serialize@DThinker@@UEAAXAEAVFSerializer@@@Z:PROC ; DThinker::Serialize + Line 226: EXTRN ?PropagateMark@DThinker@@UEAA_KXZ:PROC ; DThinker::PropagateMark + Line 227: EXTRN ??_EDThinker@@UEAAPEAXI@Z:PROC ; DThinker::`vector deleting destructor' + Line 228: EXTRN ?FindInventory@AActor@@QEAAPEAV1@PEAVPClassActor@@_N@Z:PROC ; AActor::FindInventory + Line 229: EXTRN ?FindInventory@AActor@@QEAAPEAV1@VFName@@_N@Z:PROC ; AActor::FindInventory + Line 230: EXTRN ?GiveInventoryType@AActor@@QEAAPEAV1@PEAVPClassActor@@@Z:PROC ; AActor::GiveInventoryType + Line 231: EXTRN ?Resurrect@player_t@@QEAA_NXZ:PROC ; player_t::Resurrect + Line 232: EXTRN ??RFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator() + Line 233: EXTRN ?P_AimLineAttack@@YA?AU?$TAngle@N@@PEAVAActor@@U1@NPEAUFTranslatedLineTarget@@1H00@Z:PROC ; P_AimLineAttack + Line 234: EXTRN ?P_LineAttack@@YAPEAVAActor@@PEAV1@U?$TAngle@N@@N1HVFName@@2HPEAUFTranslatedLineTarget@@PEAHNNN@Z:PROC ; P_LineAttack + Line 235: EXTRN ?P_DamageMobj@@YAHPEAVAActor@@00HVFName@@HU?$TAngle@N@@@Z:PROC ; P_DamageMobj + Line 236: EXTRN ?P_GiveBody@@YA_NPEAVAActor@@HH@Z:PROC ; P_GiveBody + Line 237: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 238: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 239: EXTRN ?CheckCheatmode@@YA_N_N@Z:PROC ; CheckCheatmode + Line 240: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 241: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 242: EXTRN ?Net_WriteByte@@YAXE@Z:PROC ; Net_WriteByte + Line 243: EXTRN ?Net_WriteString@@YAXPEBD@Z:PROC ; Net_WriteString + Line 244: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 245: EXTRN ?R_ResetViewInterpolation@@YAXXZ:PROC ; R_ResetViewInterpolation + Line 246: EXTRN ?Massacre@FLevelLocals@@QEAAH_NVFName@@@Z:PROC ; FLevelLocals::Massacre + Line 247: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 248: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 249: EXTRN ?GetVirtualIndex@@YAIPEAVPClass@@PEBD@Z:PROC ; GetVirtualIndex + Line 250: EXTRN ??_EDSuicider@@UEAAPEAXI@Z:PROC ; DSuicider::`vector deleting destructor' + Line 251: EXTRN __CxxFrameHandler3:PROC + Line 252: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 253: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 254: EXTRN ?deathmatch@@3VFIntCVar@@A:BYTE ; deathmatch + Line 255: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 256: EXTRN ?deh@@3UDehInfo@@A:BYTE ; deh + Line 257: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 258: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 259: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 260: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 261: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 262: EXTRN __ImageBase:BYTE + Line 263: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\m_joy.cod (23 hits) + Line 9: EXTRN ?joy_ps2raw@@3VFBoolCVar@@A:BYTE ; joy_ps2raw + Line 10: EXTRN ?joy_dinput@@3VFBoolCVar@@A:BYTE ; joy_dinput + Line 11: EXTRN ?joy_xinput@@3VFBoolCVar@@A:BYTE ; joy_xinput + Line 37: EXTRN atexit:PROC + Line 38: EXTRN atof:PROC + Line 39: EXTRN atoi:PROC + Line 40: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 41: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 42: EXTRN ??YFString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator+= + Line 43: EXTRN mysnprintf:PROC + Line 44: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 45: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 46: EXTRN ?SetSection@FConfigFile@@QEAA_NPEBD_N@Z:PROC ; FConfigFile::SetSection + Line 47: EXTRN ?ClearCurrentSection@FConfigFile@@QEAAXXZ:PROC ; FConfigFile::ClearCurrentSection + Line 48: EXTRN ?DeleteCurrentSection@FConfigFile@@QEAA_NXZ:PROC ; FConfigFile::DeleteCurrentSection + Line 49: EXTRN ?SectionIsEmpty@FConfigFile@@QEAA_NXZ:PROC ; FConfigFile::SectionIsEmpty + Line 50: EXTRN ?GetValueForKey@FConfigFile@@QEBAPEBDPEBD@Z:PROC ; FConfigFile::GetValueForKey + Line 51: EXTRN ?SetValueForKey@FConfigFile@@QEAAXPEBD0_N@Z:PROC ; FConfigFile::SetValueForKey + Line 52: EXTRN ?D_PostEvent@@YAXPEBUevent_t@@@Z:PROC ; D_PostEvent + Line 53: EXTRN __CxxFrameHandler3:PROC + Line 54: EXTRN atan2:PROC + Line 55: EXTRN ?GameConfig@@3PEAVFGameConfigFile@@EA:QWORD ; GameConfig + Line 56: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\m_misc.cod (67 hits) + Line 20: EXTRN ?IsAlias@FConsoleCommand@@UEAA_NXZ:PROC ; FConsoleCommand::IsAlias + Line 21: EXTRN ?Run@FUnsafeConsoleCommand@@UEAAXAEAVFCommandLine@@PEAVAActor@@H@Z:PROC ; FUnsafeConsoleCommand::Run + Line 22: EXTRN ??_EFUnsafeConsoleCommand@@UEAAPEAXI@Z:PROC ; FUnsafeConsoleCommand::`vector deleting destructor' + Line 113: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 114: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 115: EXTRN atexit:PROC + Line 116: EXTRN __std_terminate:PROC + Line 117: EXTRN _errno:PROC + Line 118: EXTRN strerror:PROC + Line 119: EXTRN stricmp:PROC + Line 120: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 121: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 122: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 123: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 124: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 125: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 126: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 127: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 128: EXTRN ?LastIndexOfAny@FString@@QEBAJPEBD@Z:PROC ; FString::LastIndexOfAny + Line 129: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 130: EXTRN _localtime64:PROC + Line 131: EXTRN _time64:PROC + Line 132: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 133: EXTRN mysnprintf:PROC + Line 134: EXTRN ?GetVersionString@@YAPEBDXZ:PROC ; GetVersionString + Line 135: EXTRN ?atterm@@YAXP6AXXZ@Z:PROC ; atterm + Line 136: EXTRN ?I_WriteIniFailed@@YA_NXZ:PROC ; I_WriteIniFailed + Line 137: EXTRN ??0FArgs@@QEAA@XZ:PROC ; FArgs::FArgs + Line 138: EXTRN ?AppendArg@FArgs@@QEAAXVFString@@@Z:PROC ; FArgs::AppendArg + Line 139: EXTRN ?RemoveArg@FArgs@@QEAAXH@Z:PROC ; FArgs::RemoveArg + Line 140: EXTRN ?CheckValue@FArgs@@QEBAPEBDPEBD@Z:PROC ; FArgs::CheckValue + Line 141: EXTRN ?GetArg@FArgs@@QEBAPEBDH@Z:PROC ; FArgs::GetArg + Line 142: EXTRN ?NumArgs@FArgs@@QEBAHXZ:PROC ; FArgs::NumArgs + Line 143: EXTRN ?OpenFile@FileReader@@QEAA_NPEBD_J1@Z:PROC ; FileReader::OpenFile + Line 144: EXTRN ?Open@FileWriter@@SAPEAV1@PEBD@Z:PROC ; FileWriter::Open + Line 145: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 146: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 147: EXTRN ??0FStringCVar@@QEAA@PEBD0IP6AXAEAV0@@Z@Z:PROC ; FStringCVar::FStringCVar + Line 148: EXTRN ??1FStringCVar@@UEAA@XZ:PROC ; FStringCVar::~FStringCVar + Line 149: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 150: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 151: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 152: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 153: EXTRN ?GetFlashedPalette@DFrameBuffer@@QEAAXQEAUPalEntry@@@Z:PROC ; DFrameBuffer::GetFlashedPalette + Line 154: EXTRN ?M_GetScreenshotsPath@@YA?AVFString@@XZ:PROC ; M_GetScreenshotsPath + Line 155: EXTRN ?M_CreatePNG@@YA_NPEAVFileWriter@@PEBEPEBUPalEntry@@W4ESSType@@HHHM@Z:PROC ; M_CreatePNG + Line 156: EXTRN ?M_AppendPNGText@@YA_NPEAVFileWriter@@PEBD1@Z:PROC ; M_AppendPNGText + Line 157: EXTRN ?M_FinishPNG@@YA_NPEAVFileWriter@@@Z:PROC ; M_FinishPNG + Line 158: EXTRN ?FileExists@@YA_NPEBD@Z:PROC ; FileExists + Line 159: EXTRN ?DefaultExtension@@YAXAEAVFString@@PEBD@Z:PROC ; DefaultExtension + Line 160: EXTRN ?CreatePath@@YAXPEBD@Z:PROC ; CreatePath + Line 161: EXTRN ?NicePath@@YA?AVFString@@PEBD@Z:PROC ; NicePath + Line 162: EXTRN ?G_ScreenShot@@YAXPEAD@Z:PROC ; G_ScreenShot + Line 163: EXTRN ?ChangePathName@FConfigFile@@QEAAXPEBD@Z:PROC ; FConfigFile::ChangePathName + Line 164: EXTRN ?WriteConfigFile@FConfigFile@@QEBA_NXZ:PROC ; FConfigFile::WriteConfigFile + Line 165: EXTRN ??0FGameConfigFile@@QEAA@XZ:PROC ; FGameConfigFile::FGameConfigFile + Line 166: EXTRN ?DoGlobalSetup@FGameConfigFile@@QEAAXXZ:PROC ; FGameConfigFile::DoGlobalSetup + Line 167: EXTRN ?ArchiveGlobalData@FGameConfigFile@@QEAAXXZ:PROC ; FGameConfigFile::ArchiveGlobalData + Line 168: EXTRN ?ArchiveGameData@FGameConfigFile@@QEAAXPEBD@Z:PROC ; FGameConfigFile::ArchiveGameData + Line 169: EXTRN __CxxFrameHandler3:PROC + Line 170: EXTRN __chkstk:PROC + Line 171: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 172: EXTRN ?Args@@3PEAVFArgs@@EA:QWORD ; Args + Line 173: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 174: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 175: EXTRN ?longsavemessages@@3VFBoolCVar@@A:BYTE ; longsavemessages + Line 176: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\m_png.cod (27 hits) + Line 43: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 44: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 45: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 46: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 47: EXTRN atexit:PROC + Line 48: EXTRN __std_terminate:PROC + Line 49: EXTRN strncmp:PROC + Line 50: EXTRN strncpy:PROC + Line 51: EXTRN deflate:PROC + Line 52: EXTRN deflateEnd:PROC + Line 53: EXTRN inflate:PROC + Line 54: EXTRN inflateEnd:PROC + Line 55: EXTRN crc32:PROC + Line 56: EXTRN deflateInit_:PROC + Line 57: EXTRN inflateInit_:PROC + Line 58: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 59: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 60: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 61: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 62: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 63: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 64: EXTRN __CxxFrameHandler3:PROC + Line 65: EXTRN __chkstk:PROC + Line 66: EXTRN memcpy:PROC + Line 67: EXTRN memset:PROC + Line 68: EXTRN __ImageBase:BYTE + Line 69: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\m_random.cod (29 hits) + Line 49: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 50: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 51: EXTRN atexit:PROC + Line 52: EXTRN __std_terminate:PROC + Line 53: EXTRN atoi:PROC + Line 54: EXTRN stricmp:PROC + Line 55: EXTRN crc32:PROC + Line 56: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 57: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 58: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 59: EXTRN ?InitByArray@FRandom@@QEAAXPEAIH@Z:PROC ; FRandom::InitByArray + Line 60: EXTRN ?ArraySize@FSerializer@@QEAAIXZ:PROC ; FSerializer::ArraySize + Line 61: EXTRN ?BeginObject@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginObject + Line 62: EXTRN ?EndObject@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndObject + Line 63: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 64: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 65: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 66: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAIPEAI@Z:PROC ; Serialize + Line 67: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 68: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 69: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 70: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 71: EXTRN __CxxFrameHandler3:PROC + Line 72: EXTRN ?save_full@@3_NA:BYTE ; save_full + Line 73: EXTRN ?pr_spawnmobj@@3VFRandom@@A:BYTE ; pr_spawnmobj + Line 74: EXTRN ?pr_acs@@3VFRandom@@A:BYTE ; pr_acs + Line 75: EXTRN ?pr_chase@@3VFRandom@@A:BYTE ; pr_chase + Line 76: EXTRN ?pr_exrandom@@3VFRandom@@A:BYTE ; pr_exrandom + Line 77: EXTRN ?pr_damagemobj@@3VFRandom@@A:BYTE ; pr_damagemobj + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\mame_opn2.cod (12 hits) + Line 43: EXTRN _purecall:PROC + Line 44: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 45: EXTRN ??_EOPNChipBase@@UEAAPEAXI@Z:PROC ; OPNChipBase::`vector deleting destructor' + Line 46: EXTRN ??_E?$OPNChipBaseT@VMameOPN2@@@@UEAAPEAXI@Z:PROC ; OPNChipBaseT::`vector deleting destructor' + Line 47: EXTRN ??_EMameOPN2@@UEAAPEAXI@Z:PROC ; MameOPN2::`vector deleting destructor' + Line 48: EXTRN ym2612_init:PROC + Line 49: EXTRN ym2612_shutdown:PROC + Line 50: EXTRN ym2612_reset_chip:PROC + Line 51: EXTRN ym2612_pre_generate:PROC + Line 52: EXTRN ym2612_generate_one_native:PROC + Line 53: EXTRN ym2612_write:PROC + Line 54: EXTRN ym2612_write_pan:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\mame_ym2612fm.cod (8 hits) + Line 33: EXTRN free:PROC + Line 34: EXTRN malloc:PROC + Line 35: EXTRN log:PROC + Line 36: EXTRN memset:PROC + Line 37: EXTRN pow:PROC + Line 38: EXTRN sin:PROC + Line 39: EXTRN __ImageBase:BYTE + Line 40: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\maploader.cod (138 hits) + Line 206: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 207: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 208: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 209: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 210: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 211: EXTRN ??_V@YAXPEAX_K@Z:PROC ; operator delete[] + Line 212: EXTRN atexit:PROC + Line 213: EXTRN __std_terminate:PROC + Line 214: EXTRN strtol:PROC + Line 215: EXTRN strtoll:PROC + Line 216: EXTRN strtoul:PROC + Line 217: EXTRN strncmp:PROC + Line 218: EXTRN strncpy:PROC + Line 219: EXTRN strnicmp:PROC + Line 220: EXTRN isxdigit:PROC + Line 221: EXTRN __std_exception_copy:PROC + Line 222: EXTRN __std_exception_destroy:PROC + Line 223: EXTRN ??_Eexception@std@@UEAAPEAXI@Z:PROC ; std::exception::`vector deleting destructor' + Line 224: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 225: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 226: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 227: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 228: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 229: EXTRN ?CopyCStrPart@FString@@QEAAAEAV1@PEBD_K@Z:PROC ; FString::CopyCStrPart + Line 230: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 231: EXTRN ?SuperFastHash@@YAIPEBD_K@Z:PROC ; SuperFastHash + Line 232: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 233: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 234: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 235: EXTRN ??HFTextureID@@QEAA?AV0@H@Z:PROC ; FTextureID::operator+ + Line 236: EXTRN c_atan2:PROC + Line 237: EXTRN c_sqrt:PROC + Line 238: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 239: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 240: EXTRN ?AddToBox@FBoundingBox@@QEAAXAEBU?$TVector2@N@@@Z:PROC ; FBoundingBox::AddToBox + Line 241: EXTRN ?R_ColormapNumForName@@YAIPEBD@Z:PROC ; R_ColormapNumForName + Line 242: EXTRN ?P_Recalculate3DFloors@@YAXPEAUsector_t@@@Z:PROC ; P_Recalculate3DFloors + Line 243: EXTRN ?CheckOverlap@sector_t@@QEAAXXZ:PROC ; sector_t::CheckOverlap + Line 244: EXTRN ?AdjustLine@line_t@@QEAAXXZ:PROC ; line_t::AdjustLine + Line 245: EXTRN ?AdjustFloorClip@@YAXPEBUsector_t@@@Z:PROC ; AdjustFloorClip + Line 246: EXTRN ?FindMapBounds@FLevel@FNodeBuilder@@QEAAXXZ:PROC ; FNodeBuilder::FLevel::FindMapBounds + Line 247: EXTRN ??0FNodeBuilder@@QEAA@AEAUFLevel@0@AEAV?$TArray@UFPolyStart@FNodeBuilder@@U12@@@1_N@Z:PROC ; FNodeBuilder::FNodeBuilder + Line 248: EXTRN ??1FNodeBuilder@@QEAA@XZ:PROC ; FNodeBuilder::~FNodeBuilder + Line 249: EXTRN ?Extract@FNodeBuilder@@QEAAXAEAUFLevelLocals@@@Z:PROC ; FNodeBuilder::Extract + Line 250: EXTRN ?GetOldVertexTable@FNodeBuilder@@QEAAPEBHXZ:PROC ; FNodeBuilder::GetOldVertexTable + Line 251: EXTRN ?OpenDecompressor@FileReader@@QEAA_NAEAV1@_JH_N@Z:PROC ; FileReader::OpenDecompressor + Line 252: EXTRN ?isValid@level_info_t@@QEAA_NXZ:PROC ; level_info_t::isValid + Line 253: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 254: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 255: EXTRN ?CheckForTexture@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::CheckForTexture + Line 256: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 257: EXTRN ?FindSymbol@PClass@@QEBAPEAVPSymbol@@VFName@@_N@Z:PROC ; PClass::FindSymbol + Line 258: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 259: EXTRN ?InitPortalGroups@@YAXPEAUFLevelLocals@@@Z:PROC ; InitPortalGroups + Line 260: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 261: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 262: EXTRN ?LoadModule@FBehaviorContainer@@QEAAPEAVFBehavior@@HPEAVFileReader@@H@Z:PROC ; FBehaviorContainer::LoadModule + Line 263: EXTRN ?LoadDefaultModules@FBehaviorContainer@@QEAAXXZ:PROC ; FBehaviorContainer::LoadDefaultModules + Line 264: EXTRN ?UnloadModules@FBehaviorContainer@@QEAAXXZ:PROC ; FBehaviorContainer::UnloadModules + Line 265: EXTRN ?CheckAllGood@FBehaviorContainer@@QEAA_NXZ:PROC ; FBehaviorContainer::CheckAllGood + Line 266: EXTRN ?SectorHasTags@FTagManager@@AEBA_NPEBUsector_t@@@Z:PROC ; FTagManager::SectorHasTags + Line 267: EXTRN ?GetFirstSectorTag@FTagManager@@AEBAHH@Z:PROC ; FTagManager::GetFirstSectorTag + Line 268: EXTRN ?SectorHasTag@FTagManager@@AEBA_NHH@Z:PROC ; FTagManager::SectorHasTag + Line 269: EXTRN ?LineHasID@FTagManager@@AEBA_NHH@Z:PROC ; FTagManager::LineHasID + Line 270: EXTRN ?HashTags@FTagManager@@AEAAXXZ:PROC ; FTagManager::HashTags + Line 271: EXTRN ?AddSectorTag@FTagManager@@QEAAXHH@Z:PROC ; FTagManager::AddSectorTag + Line 272: EXTRN ?AddLineID@FTagManager@@QEAAXHH@Z:PROC ; FTagManager::AddLineID + Line 273: EXTRN ?RemoveSectorTags@FTagManager@@QEAAXH@Z:PROC ; FTagManager::RemoveSectorTags + Line 274: EXTRN ?S_FindEnvironment@@YAPEAUReverbContainer@@H@Z:PROC ; S_FindEnvironment + Line 275: EXTRN ?AddToHash@AActor@@QEAAXXZ:PROC ; AActor::AddToHash + Line 276: EXTRN ?P_InitHealthGroups@@YAXPEAUFLevelLocals@@@Z:PROC ; P_InitHealthGroups + Line 277: EXTRN ?CreateSections@@YAXPEAUFLevelLocals@@@Z:PROC ; CreateSections + Line 278: EXTRN ?TranslateLineDef@FLevelLocals@@QEAAXPEAUline_t@@PEAUmaplinedef_t@@H@Z:PROC ; FLevelLocals::TranslateLineDef + Line 279: EXTRN ?FinalizePortals@FLevelLocals@@QEAAXXZ:PROC ; FLevelLocals::FinalizePortals + Line 280: EXTRN ?SpawnMapThing@FLevelLocals@@QEAAPEAVAActor@@HPEAUFMapThing@@H@Z:PROC ; FLevelLocals::SpawnMapThing + Line 281: EXTRN ?ClearDynamic3DFloorData@FLevelLocals@@QEAAXXZ:PROC ; FLevelLocals::ClearDynamic3DFloorData + Line 282: EXTRN ?CheckCompatibility@MapLoader@@AEAA?AVFName@@PEAUMapData@@@Z:PROC ; MapLoader::CheckCompatibility + Line 283: EXTRN ?SetCompatibilityParams@MapLoader@@AEAAXVFName@@@Z:PROC ; MapLoader::SetCompatibilityParams + Line 284: EXTRN ?ProcessEDMapthing@MapLoader@@AEAAXPEAUFMapThing@@H@Z:PROC ; MapLoader::ProcessEDMapthing + Line 285: EXTRN ?ProcessEDLinedef@MapLoader@@AEAAXPEAUline_t@@H@Z:PROC ; MapLoader::ProcessEDLinedef + Line 286: EXTRN ?InitRenderInfo@MapLoader@@AEAAXXZ:PROC ; MapLoader::InitRenderInfo + Line 287: EXTRN ?FixMinisegReferences@MapLoader@@AEAAXXZ:PROC ; MapLoader::FixMinisegReferences + Line 288: EXTRN ?FixHoles@MapLoader@@AEAAXXZ:PROC ; MapLoader::FixHoles + Line 289: EXTRN ?SpawnSpecials@MapLoader@@AEAAXXZ:PROC ; MapLoader::SpawnSpecials + Line 290: EXTRN ?Spawn3DFloors@MapLoader@@AEAAXXZ:PROC ; MapLoader::Spawn3DFloors + Line 291: EXTRN ?PO_Init@MapLoader@@AEAAXXZ:PROC ; MapLoader::PO_Init + Line 292: EXTRN ?LoadMapinfoACSLump@MapLoader@@QEAAXXZ:PROC ; MapLoader::LoadMapinfoACSLump + Line 293: EXTRN ?LoadGLNodes@MapLoader@@QEAA_NPEAUMapData@@@Z:PROC ; MapLoader::LoadGLNodes + Line 294: EXTRN ?CheckNodes@MapLoader@@QEAA_NPEAUMapData@@_NH@Z:PROC ; MapLoader::CheckNodes + Line 295: EXTRN ?ParseTextMap@MapLoader@@QEAAXPEAUMapData@@AEAV?$TMap@VFString@@UFMissingCount@@U?$THashTraits@VFString@@@@U?$TValueTraits@UFMissingCount@@@@@@@Z:PROC ; MapLoader::ParseTextMap + Line 296: EXTRN ?SetRenderSector@MapLoader@@QEAAXXZ:PROC ; MapLoader::SetRenderSector + Line 297: EXTRN ?SpawnSlopeMakers@MapLoader@@QEAAXPEAUFMapThing@@0PEBH@Z:PROC ; MapLoader::SpawnSlopeMakers + Line 298: EXTRN ?SetSlopes@MapLoader@@QEAAXXZ:PROC ; MapLoader::SetSlopes + Line 299: EXTRN ?CopySlopes@MapLoader@@QEAAXXZ:PROC ; MapLoader::CopySlopes + Line 300: EXTRN ?P_LoadTranslator@@YAXPEBD@Z:PROC ; P_LoadTranslator + Line 301: EXTRN ?P_TranslateSectorSpecial@@YAHH@Z:PROC ; P_TranslateSectorSpecial + Line 302: EXTRN ??_ECDoomError@@UEAAPEAXI@Z:PROC ; CDoomError::`vector deleting destructor' + Line 303: EXTRN ??_ECRecoverableError@@UEAAPEAXI@Z:PROC ; CRecoverableError::`vector deleting destructor' + Line 304: EXTRN ??0FMemLump@@QEAA@XZ:PROC ; FMemLump::FMemLump + Line 305: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 306: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 307: EXTRN ?OpenLumpReader@FWadCollection@@QEAA?AVFileReader@@H@Z:PROC ; FWadCollection::OpenLumpReader + Line 308: EXTRN ?LumpLength@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::LumpLength + Line 309: EXTRN ?GetLumpName@FWadCollection@@QEBAXPEADH@Z:PROC ; FWadCollection::GetLumpName + Line 310: EXTRN ?P_LoadStrifeConversations@@YAXPEAUFLevelLocals@@PEAUMapData@@PEBD@Z:PROC ; P_LoadStrifeConversations + Line 311: EXTRN ?I_msTime@@YA_KXZ:PROC ; I_msTime + Line 312: EXTRN ?CheckParm@FArgs@@QEBAHPEBDH@Z:PROC ; FArgs::CheckParm + Line 313: EXTRN ?CheckValue@FArgs@@QEBAPEBDPEBD@Z:PROC ; FArgs::CheckValue + Line 314: EXTRN ?T_LoadScripts@@YAXPEAUFLevelLocals@@PEAUMapData@@@Z:PROC ; T_LoadScripts + Line 315: EXTRN ?CreateVBO@FFlatVertexBuffer@@QEAAXAEAV?$TArray@Usector_t@@U1@@@@Z:PROC ; FFlatVertexBuffer::CreateVBO + Line 316: EXTRN _CxxThrowException:PROC + Line 317: EXTRN __CxxFrameHandler3:PROC + Line 318: EXTRN __chkstk:PROC + Line 319: EXTRN memmove:PROC + Line 320: EXTRN memset:PROC + Line 321: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 322: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 323: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 324: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 325: EXTRN ?savegamerestore@@3_NA:BYTE ; savegamerestore + Line 326: EXTRN ?GPalette@@3UFPalette@@A:BYTE ; GPalette + Line 327: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 328: EXTRN ?skyflatnum@@3VFTextureID@@A:DWORD ; skyflatnum + Line 329: EXTRN ?RegistrationInfo@PField@@2UClassReg@@A:BYTE ; PField::RegistrationInfo + Line 330: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 331: EXTRN ?DefaultEnvironments@@3PAPEAUReverbContainer@@A:BYTE ; DefaultEnvironments + Line 332: EXTRN ?DoomEdMap@@3V?$TMap@HUFDoomEdEntry@@U?$THashTraits@H@@U?$TValueTraits@UFDoomEdEntry@@@@@@A:BYTE ; DoomEdMap + Line 333: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 334: EXTRN ?playeringame@@3PA_NA:BYTE ; playeringame + Line 335: EXTRN ?developer@@3VFIntCVar@@A:BYTE ; developer + Line 336: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 337: EXTRN ?TypeBool@@3PEAVPBool@@EA:QWORD ; TypeBool + Line 338: EXTRN ?TypeString@@3PEAVPString@@EA:QWORD ; TypeString + Line 339: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 340: EXTRN ?Args@@3PEAVFArgs@@EA:QWORD ; Args + Line 341: EXTRN ?SWRenderer@@3PEAUFRenderer@@EA:QWORD ; SWRenderer + Line 342: EXTRN __ImageBase:BYTE + Line 343: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\matrix.cod (5 hits) + Line 38: EXTRN __libm_sse2_sincosf_:PROC + Line 39: EXTRN cosf:PROC + Line 40: EXTRN sinf:PROC + Line 41: EXTRN tan:PROC + Line 42: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\mblock.cod (3 hits) + Line 13: EXTRN free:PROC + Line 14: EXTRN ?safe_malloc@TimidityPlus@@YAPEAX_K@Z:PROC ; TimidityPlus::safe_malloc + Line 15: EXTRN memcpy:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\md5.cod (13 hits) + Line 25: EXTRN atexit:PROC + Line 26: EXTRN _errno:PROC + Line 27: EXTRN strerror:PROC + Line 28: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 29: EXTRN ?OpenFile@FileReader@@QEAA_NPEBD_J1@Z:PROC ; FileReader::OpenFile + Line 30: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 31: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 32: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 33: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 34: EXTRN __CxxFrameHandler3:PROC + Line 35: EXTRN __chkstk:PROC + Line 36: EXTRN memcpy:PROC + Line 37: EXTRN memset:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\md5check.cod (7 hits) + Line 1181: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 1182: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 1183: EXTRN mysnprintf:PROC + Line 1184: EXTRN ?Init@MD5Context@@QEAAXXZ:PROC ; MD5Context::Init + Line 1185: EXTRN ?Update@MD5Context@@QEAAXPEBEI@Z:PROC ; MD5Context::Update + Line 1186: EXTRN ?Final@MD5Context@@QEAAXQEAE@Z:PROC ; MD5Context::Final + Line 1187: EXTRN memcmp:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\memarena.cod (12 hits) + Line 28: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 29: EXTRN fwrite:PROC + Line 30: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 31: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 32: EXTRN ??0FString@@QEAA@PEBD_K@Z:PROC ; FString::FString + Line 33: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 34: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 35: EXTRN ?SuperFastHash@@YAIPEBD_K@Z:PROC ; SuperFastHash + Line 36: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 37: EXTRN __CxxFrameHandler3:PROC + Line 38: EXTRN memcmp:PROC + Line 39: EXTRN memset:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\menu.cod (103 hits) + Line 193: EXTRN ?RegistrationInfo@DObject@@2UClassReg@@A:BYTE ; DObject::RegistrationInfo + Line 1152: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 1153: EXTRN atexit:PROC + Line 1154: EXTRN __std_terminate:PROC + Line 1155: EXTRN strncpy:PROC + Line 1156: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 1157: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 1158: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 1159: EXTRN ??0FString@@QEAA@D@Z:PROC ; FString::FString + Line 1160: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 1161: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 1162: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 1163: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 1164: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 1165: EXTRN ?C_SetCVarsToDefaults@@YAXXZ:PROC ; C_SetCVarsToDefaults + Line 1166: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 1167: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 1168: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 1169: EXTRN ??0FColorCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FColorCVar::FColorCVar + Line 1170: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 1171: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 1172: EXTRN ?C_DoCommand@@YAXPEBDH@Z:PROC ; C_DoCommand + Line 1173: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 1174: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 1175: EXTRN ?PressKey@FButtonStatus@@QEAA_NH@Z:PROC ; FButtonStatus::PressKey + Line 1176: EXTRN ?ReleaseKey@FButtonStatus@@QEAA_NH@Z:PROC ; FButtonStatus::ReleaseKey + Line 1177: EXTRN ?ResetButtonStates@@YAXXZ:PROC ; ResetButtonStates + Line 1178: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 1179: EXTRN ?Barrier@GC@@YAXPEAVDObject@@0@Z:PROC ; GC::Barrier + Line 1180: EXTRN ?Mark@GC@@YAXPEAPEAVDObject@@@Z:PROC ; GC::Mark + Line 1181: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 1182: EXTRN ??1DObject@@UEAA@XZ:PROC ; DObject::~DObject + Line 1183: EXTRN ?Serialize@DObject@@UEAAXAEAVFSerializer@@@Z:PROC ; DObject::Serialize + Line 1184: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 1185: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 1186: EXTRN ?PropagateMark@DObject@@UEAA_KXZ:PROC ; DObject::PropagateMark + Line 1187: EXTRN ?FindSymbol@PClass@@QEBAPEAVPSymbol@@VFName@@_N@Z:PROC ; PClass::FindSymbol + Line 1188: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 1189: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 1190: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 1191: EXTRN ?S_Sound@@YAXHVFSoundID@@MM@Z:PROC ; S_Sound + Line 1192: EXTRN ?G_DeferedInitNew@@YAXPEAUFGameStartup@@@Z:PROC ; G_DeferedInitNew + Line 1193: EXTRN ?Dim@DFrameBuffer@@QEAAXUPalEntry@@MHHHHPEATFRenderStyle@@@Z:PROC ; DFrameBuffer::Dim + Line 1194: EXTRN ?GetPrintableDisplayName@@YA?AVFString@@PEAVPClassActor@@@Z:PROC ; GetPrintableDisplayName + Line 1195: EXTRN ?C_ToggleConsole@@YAXXZ:PROC ; C_ToggleConsole + Line 1196: EXTRN ?C_HideConsole@@YAXXZ:PROC ; C_HideConsole + Line 1197: EXTRN ?C_SetDefaultBindings@@YAXXZ:PROC ; C_SetDefaultBindings + Line 1198: EXTRN ?P_CheckTickerPaused@@YA_NXZ:PROC ; P_CheckTickerPaused + Line 1199: EXTRN ?G_ScreenShot@@YAXPEAD@Z:PROC ; G_ScreenShot + Line 1200: EXTRN ?I_SetMouseCapture@@YAXXZ:PROC ; I_SetMouseCapture + Line 1201: EXTRN ?I_ReleaseMouseCapture@@YAXXZ:PROC ; I_ReleaseMouseCapture + Line 1202: EXTRN ?DoGlobalSetup@FGameConfigFile@@QEAAXXZ:PROC ; FGameConfigFile::DoGlobalSetup + Line 1203: EXTRN ?DoGameSetup@FGameConfigFile@@QEAAXPEBD@Z:PROC ; FGameConfigFile::DoGameSetup + Line 1204: EXTRN ?DoModSetup@FGameConfigFile@@QEAAXPEBD@Z:PROC ; FGameConfigFile::DoModSetup + Line 1205: EXTRN ??RFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator() + Line 1206: EXTRN ?R_SetViewSize@@YAXH@Z:PROC ; R_SetViewSize + Line 1207: EXTRN ??_EDMenuDescriptor@@UEAAPEAXI@Z:PROC ; DMenuDescriptor::`vector deleting destructor' + Line 1208: EXTRN ??_EDListMenuDescriptor@@UEAAPEAXI@Z:PROC ; DListMenuDescriptor::`vector deleting destructor' + Line 1209: EXTRN ??_EDOptionMenuDescriptor@@UEAAPEAXI@Z:PROC ; DOptionMenuDescriptor::`vector deleting destructor' + Line 1210: EXTRN ??_EDMenu@@UEAAPEAXI@Z:PROC ; DMenu::`vector deleting destructor' + Line 1211: EXTRN ??_EDMenuItemBase@@UEAAPEAXI@Z:PROC ; DMenuItemBase::`vector deleting destructor' + Line 1212: EXTRN ?M_CreateMenus@@YAXXZ:PROC ; M_CreateMenus + Line 1213: EXTRN ?M_ParseMenuDefs@@YAXXZ:PROC ; M_ParseMenuDefs + Line 1214: EXTRN ?M_StartupSkillMenu@@YAXPEAUFGameStartup@@@Z:PROC ; M_StartupSkillMenu + Line 1215: EXTRN ?M_StartMessage@@YAXPEBDHVFName@@@Z:PROC ; M_StartMessage + Line 1216: EXTRN ?MaybePrintMessage@CVMAbortException@@QEAAXXZ:PROC ; CVMAbortException::MaybePrintMessage + Line 1217: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 1218: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 1219: EXTRN ?GetVirtualIndex@@YAIPEAVPClass@@PEBD@Z:PROC ; GetVirtualIndex + Line 1220: EXTRN ??0FUiEvent@@QEAA@PEBUevent_t@@@Z:PROC ; FUiEvent::FUiEvent + Line 1221: EXTRN ??0FInputEvent@@QEAA@PEBUevent_t@@@Z:PROC ; FInputEvent::FInputEvent + Line 1222: EXTRN ?ActivateEndGameMenu@@YAXXZ:PROC ; ActivateEndGameMenu + Line 1223: EXTRN __CxxFrameHandler3:PROC + Line 1224: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 1225: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 1226: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 1227: EXTRN ?devparm@@3_NA:BYTE ; devparm + Line 1228: EXTRN ?netgame@@3_NA:BYTE ; netgame + Line 1229: EXTRN ?multiplayer@@3_NA:BYTE ; multiplayer + Line 1230: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 1231: EXTRN ?usergame@@3_NA:BYTE ; usergame + Line 1232: EXTRN ?demoplayback@@3_NA:BYTE ; demoplayback + Line 1233: EXTRN ?State@GC@@3W4EGCState@1@A:DWORD ; GC::State + Line 1234: EXTRN ?RegistrationInfo@PField@@2UClassReg@@A:BYTE ; PField::RegistrationInfo + Line 1235: EXTRN ?RegistrationInfo@PFunction@@2UClassReg@@A:BYTE ; PFunction::RegistrationInfo + Line 1236: EXTRN ?AllSkills@@3V?$TArray@UFSkillInfo@@U1@@@A:BYTE ; AllSkills + Line 1237: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 1238: EXTRN ?PlayerClasses@@3V?$TArray@VFPlayerClass@@V1@@@A:BYTE ; PlayerClasses + Line 1239: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 1240: EXTRN ?ConsoleState@@3W4cstate_t@@A:DWORD ; ConsoleState + Line 1241: EXTRN ?gamestate@@3W4gamestate_t@@A:DWORD ; gamestate + Line 1242: EXTRN ?gameaction@@3W4gameaction_t@@A:DWORD ; gameaction + Line 1243: EXTRN ?chatmodeon@@3HA:DWORD ; chatmodeon + Line 1244: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 1245: EXTRN ?GameConfig@@3PEAVFGameConfigFile@@EA:QWORD ; GameConfig + Line 1246: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 1247: EXTRN ?MenuDescriptors@@3V?$TMap@VFName@@PEAVDMenuDescriptor@@U?$THashTraits@VFName@@@@U?$TValueTraits@PEAVDMenuDescriptor@@@@@@A:BYTE ; MenuDescriptors + Line 1248: EXTRN ?stacktrace@CVMAbortException@@2VFString@@A:QWORD ; CVMAbortException::stacktrace + Line 1249: EXTRN ?DefaultListMenuClass@@3PEAVPClass@@EA:QWORD ; DefaultListMenuClass + Line 1250: EXTRN ?DefaultOptionMenuClass@@3PEAVPClass@@EA:QWORD ; DefaultOptionMenuClass + Line 1251: EXTRN ?screenblocks@@3VFIntCVar@@A:BYTE ; screenblocks + Line 1252: EXTRN __ImageBase:BYTE + Line 1253: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\menudef.cod (117 hits) + Line 237: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 238: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 239: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 240: EXTRN atexit:PROC + Line 241: EXTRN __std_terminate:PROC + Line 242: EXTRN strtod:PROC + Line 243: EXTRN strtoll:PROC + Line 244: EXTRN stricmp:PROC + Line 245: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 246: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 247: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 248: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 249: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_K_N@Z:PROC ; FName::NameManager::FindName + Line 250: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 251: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 252: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 253: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 254: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 255: EXTRN ?ReplaceChars@FString@@QEAAXPEBDD@Z:PROC ; FString::ReplaceChars + Line 256: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 257: EXTRN ??0FStringf@@QEAA@PEBDZZ:PROC ; FStringf::FStringf + Line 258: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 259: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 260: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 261: EXTRN ?atterm@@YAXP6AXXZ@Z:PROC ; atterm + Line 262: EXTRN ?Barrier@GC@@YAXPEAVDObject@@0@Z:PROC ; GC::Barrier + Line 263: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 264: EXTRN ??1DObject@@UEAA@XZ:PROC ; DObject::~DObject + Line 265: EXTRN ?Serialize@DObject@@UEAAXAEAVFSerializer@@@Z:PROC ; DObject::Serialize + Line 266: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 267: EXTRN ?FindSymbol@PClass@@QEBAPEAVPSymbol@@VFName@@_N@Z:PROC ; PClass::FindSymbol + Line 268: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 269: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 270: EXTRN ?FindCVar@@YAPEAVFBaseCVar@@PEBDPEAPEAV1@@Z:PROC ; FindCVar + Line 271: EXTRN ?CheckForTexture@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::CheckForTexture + Line 272: EXTRN ??0FScanner@@QEAA@H@Z:PROC ; FScanner::FScanner + Line 273: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 274: EXTRN ?SetCMode@FScanner@@QEAAX_N@Z:PROC ; FScanner::SetCMode + Line 275: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 276: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 277: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 278: EXTRN ?CheckString@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::CheckString + Line 279: EXTRN ?GetNumber@FScanner@@QEAA_NXZ:PROC ; FScanner::GetNumber + Line 280: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 281: EXTRN ?MustGetFloat@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetFloat + Line 282: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 283: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 284: EXTRN ?ScriptMessage@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptMessage + Line 285: EXTRN ?GetTextColor@FSkillInfo@@QEBAHXZ:PROC ; FSkillInfo::GetTextColor + Line 286: EXTRN ?V_GetColor@@YAHPEBIAEAVFScanner@@@Z:PROC ; V_GetColor + Line 287: EXTRN ?GetPrintableDisplayName@@YA?AVFString@@PEAVPClassActor@@@Z:PROC ; GetPrintableDisplayName + Line 288: EXTRN ?FindFont@FFont@@SAPEAV1@VFName@@@Z:PROC ; FFont::FindFont + Line 289: EXTRN ?V_FindFontColor@@YA?AW4EColorRange@@VFName@@@Z:PROC ; V_FindFontColor + Line 290: EXTRN ?V_GetFont@@YAPEAVFFont@@PEBD@Z:PROC ; V_GetFont + Line 291: EXTRN ?ClearSaveGames@FSavegameManager@@QEAAXXZ:PROC ; FSavegameManager::ClearSaveGames + Line 292: EXTRN ?StaticType@DMenuDescriptor@@UEBAPEAVPClass@@XZ:PROC ; DMenuDescriptor::StaticType + Line 293: EXTRN ??_EDMenuDescriptor@@UEAAPEAXI@Z:PROC ; DMenuDescriptor::`vector deleting destructor' + Line 294: EXTRN ?StaticType@DListMenuDescriptor@@UEBAPEAVPClass@@XZ:PROC ; DListMenuDescriptor::StaticType + Line 295: EXTRN ?PropagateMark@DListMenuDescriptor@@UEAA_KXZ:PROC ; DListMenuDescriptor::PropagateMark + Line 296: EXTRN ??_EDListMenuDescriptor@@UEAAPEAXI@Z:PROC ; DListMenuDescriptor::`vector deleting destructor' + Line 297: EXTRN ?StaticType@DOptionMenuDescriptor@@UEBAPEAVPClass@@XZ:PROC ; DOptionMenuDescriptor::StaticType + Line 298: EXTRN ?GetItem@DOptionMenuDescriptor@@QEAAPEAVDMenuItemBase@@VFName@@@Z:PROC ; DOptionMenuDescriptor::GetItem + Line 299: EXTRN ?PropagateMark@DOptionMenuDescriptor@@UEAA_KXZ:PROC ; DOptionMenuDescriptor::PropagateMark + Line 300: EXTRN ??_EDOptionMenuDescriptor@@UEAAPEAXI@Z:PROC ; DOptionMenuDescriptor::`vector deleting destructor' + Line 301: EXTRN ?CreateOptionMenuItemStaticText@@YAPEAVDMenuItemBase@@PEBDH@Z:PROC ; CreateOptionMenuItemStaticText + Line 302: EXTRN ?CreateOptionMenuItemSubmenu@@YAPEAVDMenuItemBase@@PEBDVFName@@H@Z:PROC ; CreateOptionMenuItemSubmenu + Line 303: EXTRN ?CreateOptionMenuItemControl@@YAPEAVDMenuItemBase@@PEBDVFName@@PEAVFKeyBindings@@@Z:PROC ; CreateOptionMenuItemControl + Line 304: EXTRN ?CreateListMenuItemPatch@@YAPEAVDMenuItemBase@@NNHHVFTextureID@@VFName@@H@Z:PROC ; CreateListMenuItemPatch + Line 305: EXTRN ?CreateListMenuItemText@@YAPEAVDMenuItemBase@@NNHHPEBDPEAVFFont@@UPalEntry@@2VFName@@H@Z:PROC ; CreateListMenuItemText + Line 306: EXTRN ?CreateOptionMenuItemCommand@@YAPEAVDMenuItemBase@@PEBDVFName@@_N@Z:PROC ; CreateOptionMenuItemCommand + Line 307: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDHH_N@Z:PROC ; FWadCollection::CheckNumForName + Line 308: EXTRN ?FindLump@FWadCollection@@QEAAHPEBDPEAH_N@Z:PROC ; FWadCollection::FindLump + Line 309: EXTRN ?I_BuildMIDIMenuList@@YAXPEAUFOptionValues@@@Z:PROC ; I_BuildMIDIMenuList + Line 310: EXTRN ?IsOpenALPresent@@YA_NXZ:PROC ; IsOpenALPresent + Line 311: EXTRN ?strbin1@@YA?AVFString@@PEBD@Z:PROC ; strbin1 + Line 312: EXTRN ?VMCallWithDefaults@@YAHPEAVVMFunction@@AEAV?$TArray@UVMValue@@U1@@@PEAUVMReturn@@H@Z:PROC ; VMCallWithDefaults + Line 313: EXTRN ?DescriptiveName@PType@@QEBAPEBDXZ:PROC ; PType::DescriptiveName + Line 314: EXTRN ?NewPointer@@YAPEAVPPointer@@PEAVPType@@_N@Z:PROC ; NewPointer + Line 315: EXTRN ?NewPointer@@YAPEAVPPointer@@PEAVPClass@@_N@Z:PROC ; NewPointer + Line 316: EXTRN ?NewStruct@@YAPEAVPStruct@@VFName@@PEAVPTypeBase@@_N@Z:PROC ; NewStruct + Line 317: EXTRN ?CheckParm@FArgs@@QEBAHPEBDH@Z:PROC ; FArgs::CheckParm + Line 318: EXTRN ?I_BuildALDeviceList@@YAXPEAUFOptionValues@@@Z:PROC ; I_BuildALDeviceList + Line 319: EXTRN ?I_BuildALResamplersList@@YAXPEAUFOptionValues@@@Z:PROC ; I_BuildALResamplersList + Line 320: EXTRN adl_getBanksCount:PROC + Line 321: EXTRN adl_getBankNames:PROC + Line 322: EXTRN __CxxFrameHandler3:PROC + Line 323: EXTRN memmove:PROC + Line 324: EXTRN memset:PROC + Line 325: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 326: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 327: EXTRN ?State@GC@@3W4EGCState@1@A:DWORD ; GC::State + Line 328: EXTRN ?RegistrationInfo@PFunction@@2UClassReg@@A:BYTE ; PFunction::RegistrationInfo + Line 329: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 330: EXTRN ?AllSkills@@3V?$TArray@UFSkillInfo@@U1@@@A:BYTE ; AllSkills + Line 331: EXTRN ?DefaultSkill@@3HA:DWORD ; DefaultSkill + Line 332: EXTRN ?AllEpisodes@@3V?$TArray@UFEpisode@@U1@@@A:BYTE ; AllEpisodes + Line 333: EXTRN ?PlayerClasses@@3V?$TArray@VFPlayerClass@@V1@@@A:BYTE ; PlayerClasses + Line 334: EXTRN ?savegameManager@@3UFSavegameManager@@A:BYTE ; savegameManager + Line 335: EXTRN ?CurrentMenu@@3PEAVDMenu@@EA:QWORD ; CurrentMenu + Line 336: EXTRN ?RegistrationInfo@DListMenuDescriptor@@2UClassReg@@A:BYTE ; DListMenuDescriptor::RegistrationInfo + Line 337: EXTRN ?RegistrationInfo@DOptionMenuDescriptor@@2UClassReg@@A:BYTE ; DOptionMenuDescriptor::RegistrationInfo + Line 338: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 339: EXTRN ?Bindings@@3VFKeyBindings@@A:BYTE ; Bindings + Line 340: EXTRN ?KeySections@@3V?$TArray@UFKeySection@@U1@@@A:BYTE ; KeySections + Line 341: EXTRN ?GameNames@@3PAPEBDA:BYTE ; GameNames + Line 342: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 343: EXTRN ?TypeBool@@3PEAVPBool@@EA:QWORD ; TypeBool + Line 344: EXTRN ?TypeString@@3PEAVPString@@EA:QWORD ; TypeString + Line 345: EXTRN ?TypeName@@3PEAVPName@@EA:QWORD ; TypeName + Line 346: EXTRN ?TypeColor@@3PEAVPColor@@EA:QWORD ; TypeColor + Line 347: EXTRN ?TypeTextureID@@3PEAVPTextureID@@EA:QWORD ; TypeTextureID + Line 348: EXTRN ?TypeFont@@3PEAVPPointer@@EA:QWORD ; TypeFont + Line 349: EXTRN ?Args@@3PEAVFArgs@@EA:QWORD ; Args + Line 350: EXTRN ?sfmanager@@3VFSoundFontManager@@A:BYTE ; sfmanager + Line 351: EXTRN ?restart@@3HA:DWORD ; restart + Line 352: EXTRN _fltused:DWORD + Line 353: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\messagebox.cod (42 hits) + Line 96: EXTRN atexit:PROC + Line 97: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 98: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 99: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 100: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 101: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 102: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 103: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 104: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 105: EXTRN ?S_Sound@@YAXHVFSoundID@@MM@Z:PROC ; S_Sound + Line 106: EXTRN ?M_ActivateMenu@@YAXPEAVDMenu@@@Z:PROC ; M_ActivateMenu + Line 107: EXTRN ?M_ClearMenus@@YAXXZ:PROC ; M_ClearMenus + Line 108: EXTRN ?M_StartControlPanel@@YAX_N@Z:PROC ; M_StartControlPanel + Line 109: EXTRN ?M_SetMenu@@YAXVFName@@H@Z:PROC ; M_SetMenu + Line 110: EXTRN ?D_StartTitle@@YAXXZ:PROC ; D_StartTitle + Line 111: EXTRN ??RFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator() + Line 112: EXTRN ?I_WaitVBL@@YAXH@Z:PROC ; I_WaitVBL + Line 113: EXTRN ?ST_Endoom@@YAXXZ:PROC ; ST_Endoom + Line 114: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 115: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 116: EXTRN ?G_LoadGame@@YAXPEBD_N@Z:PROC ; G_LoadGame + Line 117: EXTRN ?G_SaveGame@@YAXPEBD0@Z:PROC ; G_SaveGame + Line 118: EXTRN ?G_CheckDemoStatus@@YA_NXZ:PROC ; G_CheckDemoStatus + Line 119: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 120: EXTRN ?GetVirtualIndex@@YAIPEAVPClass@@PEBD@Z:PROC ; GetVirtualIndex + Line 121: EXTRN __CxxFrameHandler3:PROC + Line 122: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 123: EXTRN ?netgame@@3_NA:BYTE ; netgame + Line 124: EXTRN ?multiplayer@@3_NA:BYTE ; multiplayer + Line 125: EXTRN ?menuactive@@3W4EMenuState@@A:DWORD ; menuactive + Line 126: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 127: EXTRN ?usergame@@3_NA:BYTE ; usergame + Line 128: EXTRN ?gametic@@3HA:DWORD ; gametic + Line 129: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 130: EXTRN ?snd_menuvolume@@3VFFloatCVar@@A:BYTE ; snd_menuvolume + Line 131: EXTRN ?savegameManager@@3UFSavegameManager@@A:BYTE ; savegameManager + Line 132: EXTRN ?CurrentMenu@@3PEAVDMenu@@EA:QWORD ; CurrentMenu + Line 133: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 134: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 135: EXTRN ?gamestate@@3W4gamestate_t@@A:DWORD ; gamestate + Line 136: EXTRN ?saveloadconfirmation@@3VFBoolCVar@@A:BYTE ; saveloadconfirmation + Line 137: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\midisource.cod (6 hits) + Line 43: EXTRN ?_Xbad_function_call@std@@YAXXZ:PROC ; std::_Xbad_function_call + Line 44: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 45: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 46: EXTRN __CxxFrameHandler3:PROC + Line 47: EXTRN memcpy:PROC + Line 48: EXTRN memset:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\midisource_hmi.cod (23 hits) + Line 48: EXTRN _purecall:PROC + Line 49: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 50: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 51: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 52: EXTRN __std_terminate:PROC + Line 53: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 54: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 55: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 56: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 57: EXTRN ?VolumeControllerChange@MIDISource@@IEAAHHH@Z:PROC ; MIDISource::VolumeControllerChange + Line 58: EXTRN ?SetTempo@MIDISource@@IEAAXH@Z:PROC ; MIDISource::SetTempo + Line 59: EXTRN ?CheckCaps@MIDISource@@UEAAXH@Z:PROC ; MIDISource::CheckCaps + Line 60: EXTRN ?PrecacheData@MIDISource@@UEAA?AV?$TArray@GG@@XZ:PROC ; MIDISource::PrecacheData + Line 61: EXTRN ?SetMIDISubsong@MIDISource@@UEAA_NH@Z:PROC ; MIDISource::SetMIDISubsong + Line 62: EXTRN ??_EMIDISource@@UEAAPEAXI@Z:PROC ; MIDISource::`vector deleting destructor' + Line 63: EXTRN ??_EHMISong@@UEAAPEAXI@Z:PROC ; HMISong::`vector deleting destructor' + Line 64: EXTRN __CxxFrameHandler3:PROC + Line 65: EXTRN memcmp:PROC + Line 66: EXTRN memcpy:PROC + Line 67: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 68: EXTRN ?MIDI_EventLengths@@3PADA:BYTE ; MIDI_EventLengths + Line 69: EXTRN ?MIDI_CommonLengths@@3PADA:BYTE ; MIDI_CommonLengths + Line 70: EXTRN __ImageBase:BYTE + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\midisource_mus.cod (17 hits) + Line 30: EXTRN _purecall:PROC + Line 31: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 32: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 33: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 34: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 35: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 36: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 37: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 38: EXTRN ?VolumeControllerChange@MIDISource@@IEAAHHH@Z:PROC ; MIDISource::VolumeControllerChange + Line 39: EXTRN ?CheckCaps@MIDISource@@UEAAXH@Z:PROC ; MIDISource::CheckCaps + Line 40: EXTRN ?PrecacheData@MIDISource@@UEAA?AV?$TArray@GG@@XZ:PROC ; MIDISource::PrecacheData + Line 41: EXTRN ?SetMIDISubsong@MIDISource@@UEAA_NH@Z:PROC ; MIDISource::SetMIDISubsong + Line 42: EXTRN ??_EMIDISource@@UEAAPEAXI@Z:PROC ; MIDISource::`vector deleting destructor' + Line 43: EXTRN ??_EMUSSong2@@UEAAPEAXI@Z:PROC ; MUSSong2::`vector deleting destructor' + Line 44: EXTRN __CxxFrameHandler3:PROC + Line 45: EXTRN memcpy:PROC + Line 46: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\midisource_smf.cod (22 hits) + Line 34: EXTRN _purecall:PROC + Line 35: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 36: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 37: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 38: EXTRN __std_terminate:PROC + Line 39: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 40: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 41: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 42: EXTRN ?VolumeControllerChange@MIDISource@@IEAAHHH@Z:PROC ; MIDISource::VolumeControllerChange + Line 43: EXTRN ?SetTempo@MIDISource@@IEAAXH@Z:PROC ; MIDISource::SetTempo + Line 44: EXTRN ?ClampLoopCount@MIDISource@@IEAAHH@Z:PROC ; MIDISource::ClampLoopCount + Line 45: EXTRN ?CheckCaps@MIDISource@@UEAAXH@Z:PROC ; MIDISource::CheckCaps + Line 46: EXTRN ?PrecacheData@MIDISource@@UEAA?AV?$TArray@GG@@XZ:PROC ; MIDISource::PrecacheData + Line 47: EXTRN ?SetMIDISubsong@MIDISource@@UEAA_NH@Z:PROC ; MIDISource::SetMIDISubsong + Line 48: EXTRN ??_EMIDISource@@UEAAPEAXI@Z:PROC ; MIDISource::`vector deleting destructor' + Line 49: EXTRN ??_EMIDISong2@@UEAAPEAXI@Z:PROC ; MIDISong2::`vector deleting destructor' + Line 50: EXTRN __CxxFrameHandler3:PROC + Line 51: EXTRN memcpy:PROC + Line 52: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 53: EXTRN ?MIDI_EventLengths@@3PADA:BYTE ; MIDI_EventLengths + Line 54: EXTRN ?MIDI_CommonLengths@@3PADA:BYTE ; MIDI_CommonLengths + Line 55: EXTRN __ImageBase:BYTE + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\midisource_xmi.cod (26 hits) + Line 39: EXTRN _purecall:PROC + Line 40: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 41: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 42: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 43: EXTRN __std_terminate:PROC + Line 44: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 45: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 46: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 47: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 48: EXTRN ?VolumeControllerChange@MIDISource@@IEAAHHH@Z:PROC ; MIDISource::VolumeControllerChange + Line 49: EXTRN ?ClampLoopCount@MIDISource@@IEAAHH@Z:PROC ; MIDISource::ClampLoopCount + Line 50: EXTRN ?CheckCaps@MIDISource@@UEAAXH@Z:PROC ; MIDISource::CheckCaps + Line 51: EXTRN ?PrecacheData@MIDISource@@UEAA?AV?$TArray@GG@@XZ:PROC ; MIDISource::PrecacheData + Line 52: EXTRN ?SetMIDISubsong@MIDISource@@UEAA_NH@Z:PROC ; MIDISource::SetMIDISubsong + Line 53: EXTRN ??_EMIDISource@@UEAAPEAXI@Z:PROC ; MIDISource::`vector deleting destructor' + Line 54: EXTRN ?AddNoteOff@NoteOffQueue@@QEAAXIEE@Z:PROC ; NoteOffQueue::AddNoteOff + Line 55: EXTRN ?AdvanceTime@NoteOffQueue@@QEAAXI@Z:PROC ; NoteOffQueue::AdvanceTime + Line 56: EXTRN ?Pop@NoteOffQueue@@QEAA_NAEAUAutoNoteOff@@@Z:PROC ; NoteOffQueue::Pop + Line 57: EXTRN ??_EXMISong@@UEAAPEAXI@Z:PROC ; XMISong::`vector deleting destructor' + Line 58: EXTRN __CxxFrameHandler3:PROC + Line 59: EXTRN memcpy:PROC + Line 60: EXTRN memset:PROC + Line 61: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 62: EXTRN ?MIDI_EventLengths@@3PADA:BYTE ; MIDI_EventLengths + Line 63: EXTRN ?MIDI_CommonLengths@@3PADA:BYTE ; MIDI_CommonLengths + Line 64: EXTRN __ImageBase:BYTE + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\mix.cod (25 hits) + Line 64: EXTRN atexit:PROC + Line 65: EXTRN ?free_voice@Player@TimidityPlus@@QEAAXH@Z:PROC ; TimidityPlus::Player::free_voice + Line 66: EXTRN ?recompute_voice_filter@Player@TimidityPlus@@QEAAXH@Z:PROC ; TimidityPlus::Player::recompute_voice_filter + Line 67: EXTRN ?recompute_freq@Player@TimidityPlus@@QEAAXH@Z:PROC ; TimidityPlus::Player::recompute_freq + Line 68: EXTRN ?resample_voice@Resampler@TimidityPlus@@QEAAPEAHHPEAH@Z:PROC ; TimidityPlus::Resampler::resample_voice + Line 69: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 70: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 71: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 72: EXTRN __chkstk:PROC + Line 73: EXTRN memset:PROC + Line 74: EXTRN pow:PROC + Line 75: EXTRN sin:PROC + Line 76: EXTRN ?timidity_modulation_envelope@TimidityPlus@@3_NA:BYTE ; TimidityPlus::timidity_modulation_envelope + Line 77: EXTRN ?playback_rate@TimidityPlus@@3HA:DWORD ; TimidityPlus::playback_rate + Line 78: EXTRN ?control_ratio@TimidityPlus@@3HA:DWORD ; TimidityPlus::control_ratio + Line 79: EXTRN ?attack_vol_table@TimidityPlus@@3PANA:BYTE ; TimidityPlus::attack_vol_table + Line 80: EXTRN ?sc_eg_attack_table@TimidityPlus@@3PAMA:BYTE ; TimidityPlus::sc_eg_attack_table + Line 81: EXTRN ?sc_eg_decay_table@TimidityPlus@@3PAMA:BYTE ; TimidityPlus::sc_eg_decay_table + Line 82: EXTRN ?sc_eg_release_table@TimidityPlus@@3PAMA:BYTE ; TimidityPlus::sc_eg_release_table + Line 83: EXTRN ?sb_vol_table@TimidityPlus@@3PANA:BYTE ; TimidityPlus::sb_vol_table + Line 84: EXTRN ?modenv_vol_table@TimidityPlus@@3PANA:BYTE ; TimidityPlus::modenv_vol_table + Line 85: EXTRN ?chamberlin_filter_db_to_q_table@TimidityPlus@@3QBMB:BYTE ; TimidityPlus::chamberlin_filter_db_to_q_table + Line 86: EXTRN __ImageBase:BYTE + Line 87: EXTRN __isa_available:DWORD + Line 88: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\models.cod (108 hits) + Line 129: EXTRN _purecall:PROC + Line 130: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 131: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 132: EXTRN atexit:PROC + Line 133: EXTRN __std_terminate:PROC + Line 134: EXTRN stricmp:PROC + Line 135: EXTRN strnicmp:PROC + Line 136: EXTRN toupper:PROC + Line 137: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 138: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 139: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 140: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 141: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 142: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 143: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 144: EXTRN ??HFString@@QEBA?AV0@PEBD@Z:PROC ; FString::operator+ + Line 145: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 146: EXTRN ?LastIndexOf@FString@@QEBAJD@Z:PROC ; FString::LastIndexOf + Line 147: EXTRN ?LastIndexOf@FString@@QEBAJPEBD@Z:PROC ; FString::LastIndexOf + Line 148: EXTRN ?Substitute@FString@@QEAAXPEBD0@Z:PROC ; FString::Substitute + Line 149: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 150: EXTRN ?Truncate@FString@@QEAAX_K@Z:PROC ; FString::Truncate + Line 151: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 152: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 153: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 154: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 155: EXTRN ?FindLump@FWadCollection@@QEAAHPEBDPEAH_N@Z:PROC ; FWadCollection::FindLump + Line 156: EXTRN ?LumpLength@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::LumpLength + Line 157: EXTRN ?GetLumpFullName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetLumpFullName + Line 158: EXTRN ?FixPathSeperator@@YAXPEAD@Z:PROC ; FixPathSeperator + Line 159: EXTRN ??0FScanner@@QEAA@XZ:PROC ; FScanner::FScanner + Line 160: EXTRN ??0FScanner@@QEAA@H@Z:PROC ; FScanner::FScanner + Line 161: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 162: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 163: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 164: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 165: EXTRN ?CheckString@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::CheckString + Line 166: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 167: EXTRN ?MustGetFloat@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetFloat + Line 168: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 169: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 170: EXTRN ?ScriptMessage@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptMessage + Line 171: EXTRN get_crc_table:PROC + Line 172: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 173: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 174: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 175: EXTRN ?CheckForTexture@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::CheckForTexture + Line 176: EXTRN ?FindPSprite@player_t@@QEAAPEAVDPSprite@@H@Z:PROC ; player_t::FindPSprite + Line 177: EXTRN ?translate@VSMatrix@@QEAAXMMM@Z:PROC ; VSMatrix::translate + Line 178: EXTRN ?scale@VSMatrix@@QEAAXMMM@Z:PROC ; VSMatrix::scale + Line 179: EXTRN ?rotate@VSMatrix@@QEAAXMMMM@Z:PROC ; VSMatrix::rotate + Line 180: EXTRN ?loadIdentity@VSMatrix@@QEAAXXZ:PROC ; VSMatrix::loadIdentity + Line 181: EXTRN ?R_LoadKVX@@YAPEAUFVoxel@@H@Z:PROC ; R_LoadKVX + Line 182: EXTRN ??_EFModel@@UEAAPEAXI@Z:PROC ; FModel::`vector deleting destructor' + Line 183: EXTRN ??1FDMDModel@@UEAA@XZ:PROC ; FDMDModel::~FDMDModel + Line 184: EXTRN ?Load@FDMDModel@@UEAA_NPEBDH0H@Z:PROC ; FDMDModel::Load + Line 185: EXTRN ?FindFrame@FDMDModel@@UEAAHPEBD@Z:PROC ; FDMDModel::FindFrame + Line 186: EXTRN ?RenderFrame@FDMDModel@@UEAAXPEAVFModelRenderer@@PEAVFTexture@@HHNH@Z:PROC ; FDMDModel::RenderFrame + Line 187: EXTRN ?LoadGeometry@FDMDModel@@UEAAXXZ:PROC ; FDMDModel::LoadGeometry + Line 188: EXTRN ?AddSkins@FDMDModel@@UEAAXPEAE@Z:PROC ; FDMDModel::AddSkins + Line 189: EXTRN ?BuildVertexBuffer@FDMDModel@@UEAAXPEAVFModelRenderer@@@Z:PROC ; FDMDModel::BuildVertexBuffer + Line 190: EXTRN ??_EFDMDModel@@UEAAPEAXI@Z:PROC ; FDMDModel::`vector deleting destructor' + Line 191: EXTRN ??1FMD2Model@@UEAA@XZ:PROC ; FMD2Model::~FMD2Model + Line 192: EXTRN ?Load@FMD2Model@@UEAA_NPEBDH0H@Z:PROC ; FMD2Model::Load + Line 193: EXTRN ?LoadGeometry@FMD2Model@@UEAAXXZ:PROC ; FMD2Model::LoadGeometry + Line 194: EXTRN ??_EFMD2Model@@UEAAPEAXI@Z:PROC ; FMD2Model::`vector deleting destructor' + Line 195: EXTRN ?Load@FMD3Model@@UEAA_NPEBDH0H@Z:PROC ; FMD3Model::Load + Line 196: EXTRN ?FindFrame@FMD3Model@@UEAAHPEBD@Z:PROC ; FMD3Model::FindFrame + Line 197: EXTRN ?RenderFrame@FMD3Model@@UEAAXPEAVFModelRenderer@@PEAVFTexture@@HHNH@Z:PROC ; FMD3Model::RenderFrame + Line 198: EXTRN ?BuildVertexBuffer@FMD3Model@@UEAAXPEAVFModelRenderer@@@Z:PROC ; FMD3Model::BuildVertexBuffer + Line 199: EXTRN ?AddSkins@FMD3Model@@UEAAXPEAE@Z:PROC ; FMD3Model::AddSkins + Line 200: EXTRN ??_EFMD3Model@@UEAAPEAXI@Z:PROC ; FMD3Model::`vector deleting destructor' + Line 201: EXTRN ??0FVoxelModel@@QEAA@PEAUFVoxel@@_N@Z:PROC ; FVoxelModel::FVoxelModel + Line 202: EXTRN ?Load@FUE1Model@@UEAA_NPEBDH0H@Z:PROC ; FUE1Model::Load + Line 203: EXTRN ?FindFrame@FUE1Model@@UEAAHPEBD@Z:PROC ; FUE1Model::FindFrame + Line 204: EXTRN ?RenderFrame@FUE1Model@@UEAAXPEAVFModelRenderer@@PEAVFTexture@@HHNH@Z:PROC ; FUE1Model::RenderFrame + Line 205: EXTRN ?BuildVertexBuffer@FUE1Model@@UEAAXPEAVFModelRenderer@@@Z:PROC ; FUE1Model::BuildVertexBuffer + Line 206: EXTRN ?AddSkins@FUE1Model@@UEAAXPEAE@Z:PROC ; FUE1Model::AddSkins + Line 207: EXTRN ??1FUE1Model@@UEAA@XZ:PROC ; FUE1Model::~FUE1Model + Line 208: EXTRN ??_EFUE1Model@@UEAAPEAXI@Z:PROC ; FUE1Model::`vector deleting destructor' + Line 209: EXTRN ??1FOBJModel@@UEAA@XZ:PROC ; FOBJModel::~FOBJModel + Line 210: EXTRN ?Load@FOBJModel@@UEAA_NPEBDH0H@Z:PROC ; FOBJModel::Load + Line 211: EXTRN ?FindFrame@FOBJModel@@UEAAHPEBD@Z:PROC ; FOBJModel::FindFrame + Line 212: EXTRN ?RenderFrame@FOBJModel@@UEAAXPEAVFModelRenderer@@PEAVFTexture@@HHNH@Z:PROC ; FOBJModel::RenderFrame + Line 213: EXTRN ?BuildVertexBuffer@FOBJModel@@UEAAXPEAVFModelRenderer@@@Z:PROC ; FOBJModel::BuildVertexBuffer + Line 214: EXTRN ?AddSkins@FOBJModel@@UEAAXPEAE@Z:PROC ; FOBJModel::AddSkins + Line 215: EXTRN ??_EFOBJModel@@UEAAPEAXI@Z:PROC ; FOBJModel::`vector deleting destructor' + Line 216: EXTRN ?I_GetTime@@YAHXZ:PROC ; I_GetTime + Line 217: EXTRN ?I_GetTimeFrac@@YANXZ:PROC ; I_GetTimeFrac + Line 218: EXTRN __CxxFrameHandler3:PROC + Line 219: EXTRN __libm_sse2_sincos_:PROC + Line 220: EXTRN atan:PROC + Line 221: EXTRN memset:PROC + Line 222: EXTRN strcmp:PROC + Line 223: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 224: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 225: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 226: EXTRN ?ConsoleState@@3W4cstate_t@@A:DWORD ; ConsoleState + Line 227: EXTRN ?menuactive@@3W4EMenuState@@A:DWORD ; menuactive + Line 228: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 229: EXTRN ?SpriteFrames@@3V?$TArray@Uspriteframe_t@@U1@@@A:BYTE ; SpriteFrames + Line 230: EXTRN ?sprites@@3V?$TArray@Uspritedef_t@@U1@@@A:BYTE ; sprites + Line 231: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 232: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 233: EXTRN ?Voxels@@3V?$TDeletingArray@PEAUFVoxel@@PEAU1@@@A:BYTE ; Voxels + Line 234: EXTRN ?VoxelDefs@@3V?$TDeletingArray@PEAUFVoxelDef@@PEAU1@@@A:BYTE ; VoxelDefs + Line 235: EXTRN ?r_drawvoxels@@3VFBoolCVar@@A:BYTE ; r_drawvoxels + Line 236: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\models_md2.cod (17 hits) + Line 33: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 34: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 35: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 36: EXTRN stricmp:PROC + Line 37: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 38: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 39: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 40: EXTRN ?LoadSkin@@YA?AVFTextureID@@PEBD0@Z:PROC ; LoadSkin + Line 41: EXTRN ??1FModel@@UEAA@XZ:PROC ; FModel::~FModel + Line 42: EXTRN ??_EFDMDModel@@UEAAPEAXI@Z:PROC ; FDMDModel::`vector deleting destructor' + Line 43: EXTRN __CxxFrameHandler3:PROC + Line 44: EXTRN cosf:PROC + Line 45: EXTRN memcpy:PROC + Line 46: EXTRN sinf:PROC + Line 47: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 48: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 49: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\models_md3.cod (16 hits) + Line 22: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 23: EXTRN __std_terminate:PROC + Line 24: EXTRN strncpy:PROC + Line 25: EXTRN stricmp:PROC + Line 26: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 27: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 28: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 29: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 30: EXTRN ?FixPathSeperator@@YAXPEAD@Z:PROC ; FixPathSeperator + Line 31: EXTRN ?LoadSkin@@YA?AVFTextureID@@PEBD0@Z:PROC ; LoadSkin + Line 32: EXTRN __CxxFrameHandler3:PROC + Line 33: EXTRN cos:PROC + Line 34: EXTRN sin:PROC + Line 35: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 36: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 37: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\models_obj.cod (45 hits) + Line 56: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 57: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 58: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 59: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 60: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 61: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 62: EXTRN ??_V@YAXPEAX_K@Z:PROC ; operator delete[] + Line 63: EXTRN __std_terminate:PROC + Line 64: EXTRN atoi:PROC + Line 65: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 66: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 67: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 68: EXTRN ??0FString@@QEAA@PEBD_K@Z:PROC ; FString::FString + Line 69: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 70: EXTRN ?LockBuffer@FString@@QEAAPEADXZ:PROC ; FString::LockBuffer + Line 71: EXTRN ?UnlockBuffer@FString@@QEAAXXZ:PROC ; FString::UnlockBuffer + Line 72: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 73: EXTRN ?IndexOf@FString@@QEBAJPEBDJ@Z:PROC ; FString::IndexOf + Line 74: EXTRN ?IndexOf@FString@@QEBAJDJ@Z:PROC ; FString::IndexOf + Line 75: EXTRN ?IndexOfAny@FString@@QEBAJPEBDJ@Z:PROC ; FString::IndexOfAny + Line 76: EXTRN ?ReplaceChars@FString@@QEAAXDD@Z:PROC ; FString::ReplaceChars + Line 77: EXTRN ?Split@FString@@QEBA?AV?$TArray@VFString@@V1@@@PEBDW4EmptyTokenType@1@@Z:PROC ; FString::Split + Line 78: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 79: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 80: EXTRN ?GetLumpFullPath@FWadCollection@@QEBA?AVFString@@H@Z:PROC ; FWadCollection::GetLumpFullPath + Line 81: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 82: EXTRN ?OpenString@FScanner@@QEAAXPEBDVFString@@@Z:PROC ; FScanner::OpenString + Line 83: EXTRN ?Close@FScanner@@QEAAXXZ:PROC ; FScanner::Close + Line 84: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 85: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 86: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 87: EXTRN ?MustGetFloat@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetFloat + Line 88: EXTRN ?UnGet@FScanner@@QEAAXXZ:PROC ; FScanner::UnGet + Line 89: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 90: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 91: EXTRN ?ScriptMessage@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptMessage + Line 92: EXTRN ?LoadSkin@@YA?AVFTextureID@@PEBD0@Z:PROC ; LoadSkin + Line 93: EXTRN ??1FModel@@UEAA@XZ:PROC ; FModel::~FModel + Line 94: EXTRN ??_EFOBJModel@@UEAAPEAXI@Z:PROC ; FOBJModel::`vector deleting destructor' + Line 95: EXTRN __CxxFrameHandler3:PROC + Line 96: EXTRN memcpy:PROC + Line 97: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 98: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 99: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 100: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\models_ue1.cod (23 hits) + Line 37: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 38: EXTRN __std_terminate:PROC + Line 39: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 40: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 41: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 42: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 43: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 44: EXTRN ?IndexOf@FString@@QEBAJPEBDJ@Z:PROC ; FString::IndexOf + Line 45: EXTRN ?Substitute@FString@@QEAAXPEBD0@Z:PROC ; FString::Substitute + Line 46: EXTRN ??0FMemLump@@QEAA@XZ:PROC ; FMemLump::FMemLump + Line 47: EXTRN ??4FMemLump@@QEAAAEAV0@AEBV0@@Z:PROC ; FMemLump::operator= + Line 48: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 49: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 50: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 51: EXTRN ?GetLumpFullName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetLumpFullName + Line 52: EXTRN c_sqrt:PROC + Line 53: EXTRN ??1FModel@@UEAA@XZ:PROC ; FModel::~FModel + Line 54: EXTRN ??_EFUE1Model@@UEAAPEAXI@Z:PROC ; FUE1Model::`vector deleting destructor' + Line 55: EXTRN __CxxFrameHandler3:PROC + Line 56: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 57: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 58: EXTRN __isa_available:DWORD + Line 59: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\models_voxel.cod (31 hits) + Line 44: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 45: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 46: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 47: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 48: EXTRN __std_terminate:PROC + Line 49: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 50: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 51: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 52: EXTRN ?Pick@FColorMatcher@@QEAAEHHH@Z:PROC ; FColorMatcher::Pick + Line 53: EXTRN ?CopyPixelData@FBitmap@@QEAAXHHPEBEHHHHHPEAUPalEntry@@PEAUFCopyInfo@@@Z:PROC ; FBitmap::CopyPixelData + Line 54: EXTRN ?AddTexture@FTextureManager@@QEAA?AVFTextureID@@PEAVFTexture@@@Z:PROC ; FTextureManager::AddTexture + Line 55: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 56: EXTRN ??1FVoxelMipLevel@@QEAA@XZ:PROC ; FVoxelMipLevel::~FVoxelMipLevel + Line 57: EXTRN ?GetSlabData@FVoxelMipLevel@@QEBAPEAE_N@Z:PROC ; FVoxelMipLevel::GetSlabData + Line 58: EXTRN ??0FModel@@QEAA@XZ:PROC ; FModel::FModel + Line 59: EXTRN ??1FModel@@UEAA@XZ:PROC ; FModel::~FModel + Line 60: EXTRN ??_EFVoxelModel@@UEAAPEAXI@Z:PROC ; FVoxelModel::`vector deleting destructor' + Line 61: EXTRN ?CreatePalettedPixels@FImageSource@@MEAA?AV?$TArray@EE@@H@Z:PROC ; FImageSource::CreatePalettedPixels + Line 62: EXTRN ?CopyPixels@FImageSource@@MEAAHPEAVFBitmap@@H@Z:PROC ; FImageSource::CopyPixels + Line 63: EXTRN ?CollectForPrecache@FImageSource@@UEAAXAEAV?$TMap@HU?$pair@HH@std@@U?$THashTraits@H@@U?$TValueTraits@U?$pair@HH@std@@@@@@_N@Z:PROC ; FImageSource::CollectForPrecache + Line 64: EXTRN ??_EFImageSource@@UEAAPEAXI@Z:PROC ; FImageSource::`vector deleting destructor' + Line 65: EXTRN ??0FImageTexture@@QEAA@PEAVFImageSource@@PEBD@Z:PROC ; FImageTexture::FImageTexture + Line 66: EXTRN ??_EFVoxelTexture@@UEAAPEAXI@Z:PROC ; FVoxelTexture::`vector deleting destructor' + Line 67: EXTRN __CxxFrameHandler3:PROC + Line 68: EXTRN memcpy:PROC + Line 69: EXTRN ?ColorMatcher@@3VFColorMatcher@@A:QWORD ; ColorMatcher + Line 70: EXTRN ?GPalette@@3UFPalette@@A:BYTE ; GPalette + Line 71: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 72: EXTRN ?ImageArena@FImageSource@@1VFMemArena@@A:BYTE ; FImageSource::ImageArena + Line 73: EXTRN ?NextID@FImageSource@@1HA:DWORD ; FImageSource::NextID + Line 74: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\mpg123_decoder.cod (13 hits) + Line 102: EXTRN _purecall:PROC + Line 103: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 104: EXTRN atexit:PROC + Line 105: EXTRN __std_terminate:PROC + Line 106: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 107: EXTRN ?readAll@SoundDecoder@@UEAA?AV?$TArray@EE@@XZ:PROC ; SoundDecoder::readAll + Line 108: EXTRN ??_ESoundDecoder@@UEAAPEAXI@Z:PROC ; SoundDecoder::`vector deleting destructor' + Line 109: EXTRN ??_EMPG123Decoder@@UEAAPEAXI@Z:PROC ; MPG123Decoder::`vector deleting destructor' + Line 110: EXTRN ?Load@FModule@@QEAA_NV?$initializer_list@PEBD@std@@@Z:PROC ; FModule::Load + Line 111: EXTRN ?Unload@FModule@@QEAAXXZ:PROC ; FModule::Unload + Line 112: EXTRN ?NicePath@@YA?AVFString@@PEBD@Z:PROC ; NicePath + Line 113: EXTRN __CxxFrameHandler3:PROC + Line 114: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\mtherr.cod (2 hits) + Line 54: EXTRN __acrt_iob_func:PROC + Line 55: EXTRN __stdio_common_vfprintf:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\multipatchtexture.cod (28 hits) + Line 23: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 24: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 25: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 26: EXTRN __std_terminate:PROC + Line 27: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 28: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 29: EXTRN ?TranslationToTable@@YAPEAUFRemapTable@@H@Z:PROC ; TranslationToTable + Line 30: EXTRN ?CopyPixelDataRGB@FBitmap@@QEAAXHHPEBEHHHHHHPEAUFCopyInfo@@HHH@Z:PROC ; FBitmap::CopyPixelDataRGB + Line 31: EXTRN ?ClipCopyPixelRect@@YA_NPEBUFClipRect@@AEAH1AEAPEBE1111H@Z:PROC ; ClipCopyPixelRect + Line 32: EXTRN ?Pick@FColorMatcher@@QEAAEHHH@Z:PROC ; FColorMatcher::Pick + Line 33: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 34: EXTRN ?CreatePalettedPixels@FImageSource@@MEAA?AV?$TArray@EE@@H@Z:PROC ; FImageSource::CreatePalettedPixels + Line 35: EXTRN ?CopyPixels@FImageSource@@MEAAHPEAVFBitmap@@H@Z:PROC ; FImageSource::CopyPixels + Line 36: EXTRN ?GetCachedPalettedPixels@FImageSource@@QEAA?AUPalettedPixels@@H@Z:PROC ; FImageSource::GetCachedPalettedPixels + Line 37: EXTRN ?GetCachedBitmap@FImageSource@@QEAA?AVFBitmap@@PEAUPalEntry@@HPEAH@Z:PROC ; FImageSource::GetCachedBitmap + Line 38: EXTRN ?CollectForPrecache@FImageSource@@UEAAXAEAV?$TMap@HU?$pair@HH@std@@U?$THashTraits@H@@U?$TValueTraits@U?$pair@HH@std@@@@@@_N@Z:PROC ; FImageSource::CollectForPrecache + Line 39: EXTRN ??_EFImageSource@@UEAAPEAXI@Z:PROC ; FImageSource::`vector deleting destructor' + Line 40: EXTRN ??_EFMultiPatchTexture@@UEAAPEAXI@Z:PROC ; FMultiPatchTexture::`vector deleting destructor' + Line 41: EXTRN __CxxFrameHandler3:PROC + Line 42: EXTRN memcpy:PROC + Line 43: EXTRN memset:PROC + Line 44: EXTRN ?ColorMatcher@@3VFColorMatcher@@A:QWORD ; ColorMatcher + Line 45: EXTRN ?GPalette@@3UFPalette@@A:BYTE ; GPalette + Line 46: EXTRN ?RGB256k@@3TColorTable256k@@A:BYTE ; RGB256k + Line 47: EXTRN ?SpecialColormaps@@3V?$TArray@UFSpecialColormap@@U1@@@A:BYTE ; SpecialColormaps + Line 48: EXTRN ?DesaturateColormap@@3PAY0BAA@EA:BYTE ; DesaturateColormap + Line 49: EXTRN ?ImageArena@FImageSource@@1VFMemArena@@A:BYTE ; FImageSource::ImageArena + Line 50: EXTRN ?NextID@FImageSource@@1HA:DWORD ; FImageSource::NextID + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\multipatchtexturebuilder.cod (57 hits) + Line 95: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 96: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 97: EXTRN __std_terminate:PROC + Line 98: EXTRN stricmp:PROC + Line 99: EXTRN strnicmp:PROC + Line 100: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 101: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 102: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 103: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 104: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 105: EXTRN ?ToUpper@FString@@QEAAXXZ:PROC ; FString::ToUpper + Line 106: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 107: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 108: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 109: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 110: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 111: EXTRN ?OpenLumpReader@FWadCollection@@QEAA?AVFileReader@@H@Z:PROC ; FWadCollection::OpenLumpReader + Line 112: EXTRN ?LumpLength@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::LumpLength + Line 113: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 114: EXTRN ?SetCMode@FScanner@@QEAAX_N@Z:PROC ; FScanner::SetCMode + Line 115: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 116: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 117: EXTRN ?CheckString@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::CheckString + Line 118: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 119: EXTRN ?CheckNumber@FScanner@@QEAA_NXZ:PROC ; FScanner::CheckNumber + Line 120: EXTRN ?MustGetFloat@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetFloat + Line 121: EXTRN ?UnGet@FScanner@@QEAAXXZ:PROC ; FScanner::UnGet + Line 122: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 123: EXTRN ?MatchString@FScanner@@QEAAHPEBQEBD_K@Z:PROC ; FScanner::MatchString + Line 124: EXTRN ?MustMatchString@FScanner@@QEAAHPEBQEBD_K@Z:PROC ; FScanner::MustMatchString + Line 125: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 126: EXTRN ?ScriptMessage@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptMessage + Line 127: EXTRN ??0FScriptPosition@@QEAA@AEBU0@@Z:PROC ; FScriptPosition::FScriptPosition + Line 128: EXTRN ??0FScriptPosition@@QEAA@AEAVFScanner@@@Z:PROC ; FScriptPosition::FScriptPosition + Line 129: EXTRN ??4FScriptPosition@@QEAAAEAU0@AEBU0@@Z:PROC ; FScriptPosition::operator= + Line 130: EXTRN ?Message@FScriptPosition@@QEBAXHPEBDZZ:PROC ; FScriptPosition::Message + Line 131: EXTRN ??0FRemapTable@@QEAA@H@Z:PROC ; FRemapTable::FRemapTable + Line 132: EXTRN ??1FRemapTable@@QEAA@XZ:PROC ; FRemapTable::~FRemapTable + Line 133: EXTRN ?MakeIdentity@FRemapTable@@QEAAXXZ:PROC ; FRemapTable::MakeIdentity + Line 134: EXTRN ?AddToTranslation@FRemapTable@@QEAA_NPEBD@Z:PROC ; FRemapTable::AddToTranslation + Line 135: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 136: EXTRN ?CheckForTexture@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::CheckForTexture + Line 137: EXTRN ?ListTextures@FTextureManager@@QEAAHPEBDAEAV?$TArray@VFTextureID@@V1@@@_N@Z:PROC ; FTextureManager::ListTextures + Line 138: EXTRN ?AddTexture@FTextureManager@@QEAA?AVFTextureID@@PEAVFTexture@@@Z:PROC ; FTextureManager::AddTexture + Line 139: EXTRN ?AddSpecialColormap@@YAHMMMMMM@Z:PROC ; AddSpecialColormap + Line 140: EXTRN ?V_GetColor@@YAHPEBIAEAVFScanner@@@Z:PROC ; V_GetColor + Line 141: EXTRN ??0FImageTexture@@QEAA@PEAVFImageSource@@PEBD@Z:PROC ; FImageTexture::FImageTexture + Line 142: EXTRN ??0FMultiPatchTexture@@QEAA@HHAEBV?$TArray@UTexPart@@U1@@@_N1@Z:PROC ; FMultiPatchTexture::FMultiPatchTexture + Line 143: EXTRN __CxxFrameHandler3:PROC + Line 144: EXTRN memmove:PROC + Line 145: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 146: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 147: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 148: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 149: EXTRN ?StartScreen@@3PEAVFStartupScreen@@EA:QWORD ; StartScreen + Line 150: EXTRN ?ImageArena@FImageSource@@1VFMemArena@@A:BYTE ; FImageSource::ImageArena + Line 151: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\music_adlmidi_mididevice.cod (61 hits) + Line 17: EXTRN ?currSong@@3PEAVMusInfo@@EA:QWORD ; currSong + Line 79: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 80: EXTRN atexit:PROC + Line 81: EXTRN __std_terminate:PROC + Line 82: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 83: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 84: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 85: EXTRN ??0FStringCVar@@QEAA@PEBD0IP6AXAEAV0@@Z@Z:PROC ; FStringCVar::FStringCVar + Line 86: EXTRN ??1FStringCVar@@UEAA@XZ:PROC ; FStringCVar::~FStringCVar + Line 87: EXTRN ?PrepareHeader@MIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; MIDIDevice::PrepareHeader + Line 88: EXTRN ?UnprepareHeader@MIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; MIDIDevice::UnprepareHeader + Line 89: EXTRN ?FakeVolume@MIDIDevice@@UEAA_NXZ:PROC ; MIDIDevice::FakeVolume + Line 90: EXTRN ?InitPlayback@MIDIDevice@@UEAAXXZ:PROC ; MIDIDevice::InitPlayback + Line 91: EXTRN ?Update@MIDIDevice@@UEAA_NXZ:PROC ; MIDIDevice::Update + Line 92: EXTRN ?PrecacheInstruments@MIDIDevice@@UEAAXPEBGH@Z:PROC ; MIDIDevice::PrecacheInstruments + Line 93: EXTRN ?FluidSettingInt@MIDIDevice@@UEAAXPEBDH@Z:PROC ; MIDIDevice::FluidSettingInt + Line 94: EXTRN ?FluidSettingNum@MIDIDevice@@UEAAXPEBDN@Z:PROC ; MIDIDevice::FluidSettingNum + Line 95: EXTRN ?FluidSettingStr@MIDIDevice@@UEAAXPEBD0@Z:PROC ; MIDIDevice::FluidSettingStr + Line 96: EXTRN ?WildMidiSetOption@MIDIDevice@@UEAAXHH@Z:PROC ; MIDIDevice::WildMidiSetOption + Line 97: EXTRN ?Preprocess@MIDIDevice@@UEAA_NPEAVMIDIStreamer@@_N@Z:PROC ; MIDIDevice::Preprocess + Line 98: EXTRN ?GetStats@MIDIDevice@@UEAA?AVFString@@XZ:PROC ; MIDIDevice::GetStats + Line 99: EXTRN ??0SoftSynthMIDIDevice@@QEAA@HHH@Z:PROC ; SoftSynthMIDIDevice::SoftSynthMIDIDevice + Line 100: EXTRN ??1SoftSynthMIDIDevice@@UEAA@XZ:PROC ; SoftSynthMIDIDevice::~SoftSynthMIDIDevice + Line 101: EXTRN ?Close@SoftSynthMIDIDevice@@UEAAXXZ:PROC ; SoftSynthMIDIDevice::Close + Line 102: EXTRN ?IsOpen@SoftSynthMIDIDevice@@UEBA_NXZ:PROC ; SoftSynthMIDIDevice::IsOpen + Line 103: EXTRN ?GetTechnology@SoftSynthMIDIDevice@@UEBAHXZ:PROC ; SoftSynthMIDIDevice::GetTechnology + Line 104: EXTRN ?SetTempo@SoftSynthMIDIDevice@@UEAAHH@Z:PROC ; SoftSynthMIDIDevice::SetTempo + Line 105: EXTRN ?SetTimeDiv@SoftSynthMIDIDevice@@UEAAHH@Z:PROC ; SoftSynthMIDIDevice::SetTimeDiv + Line 106: EXTRN ?StreamOut@SoftSynthMIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; SoftSynthMIDIDevice::StreamOut + Line 107: EXTRN ?StreamOutSync@SoftSynthMIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; SoftSynthMIDIDevice::StreamOutSync + Line 108: EXTRN ?Resume@SoftSynthMIDIDevice@@UEAAHXZ:PROC ; SoftSynthMIDIDevice::Resume + Line 109: EXTRN ?Stop@SoftSynthMIDIDevice@@UEAAXXZ:PROC ; SoftSynthMIDIDevice::Stop + Line 110: EXTRN ?Pause@SoftSynthMIDIDevice@@UEAA_N_N@Z:PROC ; SoftSynthMIDIDevice::Pause + Line 111: EXTRN ?CalcTickRate@SoftSynthMIDIDevice@@MEAAXXZ:PROC ; SoftSynthMIDIDevice::CalcTickRate + Line 112: EXTRN ?OpenStream@SoftSynthMIDIDevice@@IEAAHHHP6AXPEAX@Z0@Z:PROC ; SoftSynthMIDIDevice::OpenStream + Line 113: EXTRN ?ServiceStream@SoftSynthMIDIDevice@@MEAA_NPEAXH@Z:PROC ; SoftSynthMIDIDevice::ServiceStream + Line 114: EXTRN ??_EADLMIDIDevice@@UEAAPEAXI@Z:PROC ; ADLMIDIDevice::`vector deleting destructor' + Line 115: EXTRN ?MIDIDeviceChanged@@YAXH_N@Z:PROC ; MIDIDeviceChanged + Line 116: EXTRN adl_setNumChips:PROC + Line 117: EXTRN adl_setBank:PROC + Line 118: EXTRN adl_setSoftPanEnabled:PROC + Line 119: EXTRN adl_setVolumeRangeModel:PROC + Line 120: EXTRN adl_openBankFile:PROC + Line 121: EXTRN adl_switchEmulator:PROC + Line 122: EXTRN adl_setRunAtPcmRate:PROC + Line 123: EXTRN adl_init:PROC + Line 124: EXTRN adl_close:PROC + Line 125: EXTRN adl_generateFormat:PROC + Line 126: EXTRN adl_rt_resetState:PROC + Line 127: EXTRN adl_rt_noteOn:PROC + Line 128: EXTRN adl_rt_noteOff:PROC + Line 129: EXTRN adl_rt_noteAfterTouch:PROC + Line 130: EXTRN adl_rt_channelAfterTouch:PROC + Line 131: EXTRN adl_rt_controllerChange:PROC + Line 132: EXTRN adl_rt_patchChange:PROC + Line 133: EXTRN adl_rt_pitchBendML:PROC + Line 134: EXTRN ?FindSoundFont@FSoundFontManager@@QEBAPEBUFSoundFontInfo@@PEBDH@Z:PROC ; FSoundFontManager::FindSoundFont + Line 135: EXTRN __CxxFrameHandler3:PROC + Line 136: EXTRN ?sfmanager@@3VFSoundFontManager@@A:BYTE ; sfmanager + Line 137: EXTRN __ImageBase:BYTE + Line 138: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\music_cd.cod (29 hits) + Line 22: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 23: EXTRN __std_terminate:PROC + Line 24: EXTRN ??0MusInfo@@QEAA@XZ:PROC ; MusInfo::MusInfo + Line 25: EXTRN ??1MusInfo@@UEAA@XZ:PROC ; MusInfo::~MusInfo + Line 26: EXTRN ?MusicVolumeChanged@MusInfo@@UEAAXXZ:PROC ; MusInfo::MusicVolumeChanged + Line 27: EXTRN ?IsMIDI@MusInfo@@UEBA_NXZ:PROC ; MusInfo::IsMIDI + Line 28: EXTRN ?SetPosition@MusInfo@@UEAA_NI@Z:PROC ; MusInfo::SetPosition + Line 29: EXTRN ?SetSubsong@MusInfo@@UEAA_NH@Z:PROC ; MusInfo::SetSubsong + Line 30: EXTRN ?Update@MusInfo@@UEAAXXZ:PROC ; MusInfo::Update + Line 31: EXTRN ?GetStats@MusInfo@@UEAA?AVFString@@XZ:PROC ; MusInfo::GetStats + Line 32: EXTRN ?GetOPLDumper@MusInfo@@UEAAPEAV1@PEBD@Z:PROC ; MusInfo::GetOPLDumper + Line 33: EXTRN ?GetWaveDumper@MusInfo@@UEAAPEAV1@PEBDH@Z:PROC ; MusInfo::GetWaveDumper + Line 34: EXTRN ?FluidSettingInt@MusInfo@@UEAAXPEBDH@Z:PROC ; MusInfo::FluidSettingInt + Line 35: EXTRN ?FluidSettingNum@MusInfo@@UEAAXPEBDN@Z:PROC ; MusInfo::FluidSettingNum + Line 36: EXTRN ?FluidSettingStr@MusInfo@@UEAAXPEBD0@Z:PROC ; MusInfo::FluidSettingStr + Line 37: EXTRN ?WildMidiSetOption@MusInfo@@UEAAXHH@Z:PROC ; MusInfo::WildMidiSetOption + Line 38: EXTRN ?GMEDepthChanged@MusInfo@@UEAAXM@Z:PROC ; MusInfo::GMEDepthChanged + Line 39: EXTRN ??_ECDSong@@UEAAPEAXI@Z:PROC ; CDSong::`vector deleting destructor' + Line 40: EXTRN ??_ECDDAFile@@UEAAPEAXI@Z:PROC ; CDDAFile::`vector deleting destructor' + Line 41: EXTRN ?CD_Init@@YA_NXZ:PROC ; CD_Init + Line 42: EXTRN ?CD_InitID@@YA_NIH@Z:PROC ; CD_InitID + Line 43: EXTRN ?CD_Play@@YA_NH_N@Z:PROC ; CD_Play + Line 44: EXTRN ?CD_PlayCD@@YA_N_N@Z:PROC ; CD_PlayCD + Line 45: EXTRN ?CD_Stop@@YAXXZ:PROC ; CD_Stop + Line 46: EXTRN ?CD_Pause@@YAXXZ:PROC ; CD_Pause + Line 47: EXTRN ?CD_Resume@@YA_NXZ:PROC ; CD_Resume + Line 48: EXTRN ?CD_GetMode@@YA?AW4ECDModes@@XZ:PROC ; CD_GetMode + Line 49: EXTRN ?CD_CheckTrack@@YA_NH@Z:PROC ; CD_CheckTrack + Line 50: EXTRN __CxxFrameHandler3:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\music_dumb.cod (79 hits) + Line 96: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 97: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 98: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 99: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 100: EXTRN atexit:PROC + Line 101: EXTRN __std_terminate:PROC + Line 102: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 103: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 104: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 105: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 106: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 107: EXTRN ?CreateCriticalSection@@YAPEAVFInternalCriticalSection@@XZ:PROC ; CreateCriticalSection + Line 108: EXTRN ?DeleteCriticalSection@@YAXPEAVFInternalCriticalSection@@@Z:PROC ; DeleteCriticalSection + Line 109: EXTRN ?EnterCriticalSection@@YAXPEAVFInternalCriticalSection@@@Z:PROC ; EnterCriticalSection + Line 110: EXTRN ?LeaveCriticalSection@@YAXPEAVFInternalCriticalSection@@@Z:PROC ; LeaveCriticalSection + Line 111: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 112: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 113: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 114: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 115: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 116: EXTRN ??0MusInfo@@QEAA@XZ:PROC ; MusInfo::MusInfo + Line 117: EXTRN ?MusicVolumeChanged@MusInfo@@UEAAXXZ:PROC ; MusInfo::MusicVolumeChanged + Line 118: EXTRN ?IsMIDI@MusInfo@@UEBA_NXZ:PROC ; MusInfo::IsMIDI + Line 119: EXTRN ?Update@MusInfo@@UEAAXXZ:PROC ; MusInfo::Update + Line 120: EXTRN ?GetOPLDumper@MusInfo@@UEAAPEAV1@PEBD@Z:PROC ; MusInfo::GetOPLDumper + Line 121: EXTRN ?GetWaveDumper@MusInfo@@UEAAPEAV1@PEBDH@Z:PROC ; MusInfo::GetWaveDumper + Line 122: EXTRN ?FluidSettingInt@MusInfo@@UEAAXPEBDH@Z:PROC ; MusInfo::FluidSettingInt + Line 123: EXTRN ?FluidSettingNum@MusInfo@@UEAAXPEBDN@Z:PROC ; MusInfo::FluidSettingNum + Line 124: EXTRN ?FluidSettingStr@MusInfo@@UEAAXPEBD0@Z:PROC ; MusInfo::FluidSettingStr + Line 125: EXTRN ?WildMidiSetOption@MusInfo@@UEAAXHH@Z:PROC ; MusInfo::WildMidiSetOption + Line 126: EXTRN ?GMEDepthChanged@MusInfo@@UEAAXM@Z:PROC ; MusInfo::GMEDepthChanged + Line 127: EXTRN ??1StreamSong@@UEAA@XZ:PROC ; StreamSong::~StreamSong + Line 128: EXTRN ?Play@StreamSong@@UEAAX_NH@Z:PROC ; StreamSong::Play + Line 129: EXTRN ?Pause@StreamSong@@UEAAXXZ:PROC ; StreamSong::Pause + Line 130: EXTRN ?Resume@StreamSong@@UEAAXXZ:PROC ; StreamSong::Resume + Line 131: EXTRN ?Stop@StreamSong@@UEAAXXZ:PROC ; StreamSong::Stop + Line 132: EXTRN ?IsPlaying@StreamSong@@UEAA_NXZ:PROC ; StreamSong::IsPlaying + Line 133: EXTRN ?SetPosition@StreamSong@@UEAA_NI@Z:PROC ; StreamSong::SetPosition + Line 134: EXTRN ?SetSubsong@StreamSong@@UEAA_NH@Z:PROC ; StreamSong::SetSubsong + Line 135: EXTRN ?GetStats@StreamSong@@UEAA?AVFString@@XZ:PROC ; StreamSong::GetStats + Line 136: EXTRN ??_EStreamSong@@UEAAPEAXI@Z:PROC ; StreamSong::`vector deleting destructor' + Line 137: EXTRN dumbfile_open_ex:PROC + Line 138: EXTRN dumbfile_close:PROC + Line 139: EXTRN unload_duh:PROC + Line 140: EXTRN duh_get_tag:PROC + Line 141: EXTRN duh_start_sigrenderer:PROC + Line 142: EXTRN duh_sigrenderer_generate_samples:PROC + Line 143: EXTRN duh_end_sigrenderer:PROC + Line 144: EXTRN duh_get_it_sigdata:PROC + Line 145: EXTRN duh_get_it_sigrenderer:PROC + Line 146: EXTRN dumb_it_start_at_order:PROC + Line 147: EXTRN dumb_it_set_ramp_style:PROC + Line 148: EXTRN dumb_it_set_loop_callback:PROC + Line 149: EXTRN dumb_it_set_xm_speed_zero_callback:PROC + Line 150: EXTRN dumb_it_set_global_volume_zero_callback:PROC + Line 151: EXTRN dumb_it_callback_terminate:PROC + Line 152: EXTRN dumb_read_it_quick:PROC + Line 153: EXTRN dumb_read_xm_quick:PROC + Line 154: EXTRN dumb_read_s3m_quick:PROC + Line 155: EXTRN dumb_read_stm_quick:PROC + Line 156: EXTRN dumb_read_mod_quick:PROC + Line 157: EXTRN dumb_read_ptm_quick:PROC + Line 158: EXTRN dumb_read_669_quick:PROC + Line 159: EXTRN dumb_read_psm_quick:PROC + Line 160: EXTRN dumb_read_old_psm_quick:PROC + Line 161: EXTRN dumb_read_mtm_quick:PROC + Line 162: EXTRN dumb_read_riff_quick:PROC + Line 163: EXTRN dumb_read_asy_quick:PROC + Line 164: EXTRN dumb_read_okt_quick:PROC + Line 165: EXTRN dumb_silence:PROC + Line 166: EXTRN dumb_it_set_resampling_quality:PROC + Line 167: EXTRN ??_Einput_mod@@UEAAPEAXI@Z:PROC ; input_mod::`vector deleting destructor' + Line 168: EXTRN __CxxFrameHandler3:PROC + Line 169: EXTRN memcmp:PROC + Line 170: EXTRN memcpy:PROC + Line 171: EXTRN memset:PROC + Line 172: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 173: EXTRN ?GSnd@@3PEAVSoundRenderer@@EA:QWORD ; GSnd + Line 174: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\music_fluidsynth_mididevice.cod (64 hits) + Line 63: EXTRN ?currSong@@3PEAVMusInfo@@EA:QWORD ; currSong + Line 399: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 400: EXTRN atexit:PROC + Line 401: EXTRN __std_terminate:PROC + Line 402: EXTRN free:PROC + Line 403: EXTRN __acrt_iob_func:PROC + Line 404: EXTRN __stdio_common_vfprintf:PROC + Line 405: EXTRN strcspn:PROC + Line 406: EXTRN strtok:PROC + Line 407: EXTRN strdup:PROC + Line 408: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 409: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 410: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 411: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 412: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 413: EXTRN ?EnterCriticalSection@@YAXPEAVFInternalCriticalSection@@@Z:PROC ; EnterCriticalSection + Line 414: EXTRN ?LeaveCriticalSection@@YAXPEAVFInternalCriticalSection@@@Z:PROC ; LeaveCriticalSection + Line 415: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 416: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 417: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 418: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 419: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 420: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 421: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 422: EXTRN ??0FStringCVar@@QEAA@PEBD0IP6AXAEAV0@@Z@Z:PROC ; FStringCVar::FStringCVar + Line 423: EXTRN ??1FStringCVar@@UEAA@XZ:PROC ; FStringCVar::~FStringCVar + Line 424: EXTRN ?PrepareHeader@MIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; MIDIDevice::PrepareHeader + Line 425: EXTRN ?UnprepareHeader@MIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; MIDIDevice::UnprepareHeader + Line 426: EXTRN ?FakeVolume@MIDIDevice@@UEAA_NXZ:PROC ; MIDIDevice::FakeVolume + Line 427: EXTRN ?InitPlayback@MIDIDevice@@UEAAXXZ:PROC ; MIDIDevice::InitPlayback + Line 428: EXTRN ?Update@MIDIDevice@@UEAA_NXZ:PROC ; MIDIDevice::Update + Line 429: EXTRN ?PrecacheInstruments@MIDIDevice@@UEAAXPEBGH@Z:PROC ; MIDIDevice::PrecacheInstruments + Line 430: EXTRN ?WildMidiSetOption@MIDIDevice@@UEAAXHH@Z:PROC ; MIDIDevice::WildMidiSetOption + Line 431: EXTRN ?Preprocess@MIDIDevice@@UEAA_NPEAVMIDIStreamer@@_N@Z:PROC ; MIDIDevice::Preprocess + Line 432: EXTRN ??0SoftSynthMIDIDevice@@QEAA@HHH@Z:PROC ; SoftSynthMIDIDevice::SoftSynthMIDIDevice + Line 433: EXTRN ??1SoftSynthMIDIDevice@@UEAA@XZ:PROC ; SoftSynthMIDIDevice::~SoftSynthMIDIDevice + Line 434: EXTRN ?Close@SoftSynthMIDIDevice@@UEAAXXZ:PROC ; SoftSynthMIDIDevice::Close + Line 435: EXTRN ?IsOpen@SoftSynthMIDIDevice@@UEBA_NXZ:PROC ; SoftSynthMIDIDevice::IsOpen + Line 436: EXTRN ?GetTechnology@SoftSynthMIDIDevice@@UEBAHXZ:PROC ; SoftSynthMIDIDevice::GetTechnology + Line 437: EXTRN ?SetTempo@SoftSynthMIDIDevice@@UEAAHH@Z:PROC ; SoftSynthMIDIDevice::SetTempo + Line 438: EXTRN ?SetTimeDiv@SoftSynthMIDIDevice@@UEAAHH@Z:PROC ; SoftSynthMIDIDevice::SetTimeDiv + Line 439: EXTRN ?StreamOut@SoftSynthMIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; SoftSynthMIDIDevice::StreamOut + Line 440: EXTRN ?StreamOutSync@SoftSynthMIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; SoftSynthMIDIDevice::StreamOutSync + Line 441: EXTRN ?Resume@SoftSynthMIDIDevice@@UEAAHXZ:PROC ; SoftSynthMIDIDevice::Resume + Line 442: EXTRN ?Stop@SoftSynthMIDIDevice@@UEAAXXZ:PROC ; SoftSynthMIDIDevice::Stop + Line 443: EXTRN ?Pause@SoftSynthMIDIDevice@@UEAA_N_N@Z:PROC ; SoftSynthMIDIDevice::Pause + Line 444: EXTRN ?CalcTickRate@SoftSynthMIDIDevice@@MEAAXXZ:PROC ; SoftSynthMIDIDevice::CalcTickRate + Line 445: EXTRN ?OpenStream@SoftSynthMIDIDevice@@IEAAHHHP6AXPEAX@Z0@Z:PROC ; SoftSynthMIDIDevice::OpenStream + Line 446: EXTRN ?ServiceStream@SoftSynthMIDIDevice@@MEAA_NPEAXH@Z:PROC ; SoftSynthMIDIDevice::ServiceStream + Line 447: EXTRN ?Load@FModule@@QEAA_NV?$initializer_list@PEBD@std@@@Z:PROC ; FModule::Load + Line 448: EXTRN ?Unload@FModule@@QEAAXXZ:PROC ; FModule::Unload + Line 449: EXTRN ??_EFluidSynthMIDIDevice@@UEAAPEAXI@Z:PROC ; FluidSynthMIDIDevice::`vector deleting destructor' + Line 450: EXTRN ?MIDIDeviceChanged@@YAXH_N@Z:PROC ; MIDIDeviceChanged + Line 451: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 452: EXTRN ?FileExists@@YA_NPEBD@Z:PROC ; FileExists + Line 453: EXTRN ?NicePath@@YA?AVFString@@PEBD@Z:PROC ; NicePath + Line 454: EXTRN ?FindSoundFont@FSoundFontManager@@QEBAPEBUFSoundFontInfo@@PEBDH@Z:PROC ; FSoundFontManager::FindSoundFont + Line 455: EXTRN GetSystemDirectoryA:PROC + Line 456: EXTRN __CxxFrameHandler3:PROC + Line 457: EXTRN strcmp:PROC + Line 458: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 459: EXTRN ?sfmanager@@3VFSoundFontManager@@A:BYTE ; sfmanager + Line 460: EXTRN __ImageBase:BYTE + Line 461: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\music_gme.cod (56 hits) + Line 10: EXTRN ?currSong@@3PEAVMusInfo@@EA:QWORD ; currSong + Line 46: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 47: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 48: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 49: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 50: EXTRN atexit:PROC + Line 51: EXTRN __std_terminate:PROC + Line 52: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 53: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 54: EXTRN ?CreateCriticalSection@@YAPEAVFInternalCriticalSection@@XZ:PROC ; CreateCriticalSection + Line 55: EXTRN ?DeleteCriticalSection@@YAXPEAVFInternalCriticalSection@@@Z:PROC ; DeleteCriticalSection + Line 56: EXTRN ?EnterCriticalSection@@YAXPEAVFInternalCriticalSection@@@Z:PROC ; EnterCriticalSection + Line 57: EXTRN ?LeaveCriticalSection@@YAXPEAVFInternalCriticalSection@@@Z:PROC ; LeaveCriticalSection + Line 58: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 59: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 60: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 61: EXTRN ??0MusInfo@@QEAA@XZ:PROC ; MusInfo::MusInfo + Line 62: EXTRN ?MusicVolumeChanged@MusInfo@@UEAAXXZ:PROC ; MusInfo::MusicVolumeChanged + Line 63: EXTRN ?IsMIDI@MusInfo@@UEBA_NXZ:PROC ; MusInfo::IsMIDI + Line 64: EXTRN ?Update@MusInfo@@UEAAXXZ:PROC ; MusInfo::Update + Line 65: EXTRN ?GetOPLDumper@MusInfo@@UEAAPEAV1@PEBD@Z:PROC ; MusInfo::GetOPLDumper + Line 66: EXTRN ?GetWaveDumper@MusInfo@@UEAAPEAV1@PEBDH@Z:PROC ; MusInfo::GetWaveDumper + Line 67: EXTRN ?FluidSettingInt@MusInfo@@UEAAXPEBDH@Z:PROC ; MusInfo::FluidSettingInt + Line 68: EXTRN ?FluidSettingNum@MusInfo@@UEAAXPEBDN@Z:PROC ; MusInfo::FluidSettingNum + Line 69: EXTRN ?FluidSettingStr@MusInfo@@UEAAXPEBD0@Z:PROC ; MusInfo::FluidSettingStr + Line 70: EXTRN ?WildMidiSetOption@MusInfo@@UEAAXHH@Z:PROC ; MusInfo::WildMidiSetOption + Line 71: EXTRN ?GMEDepthChanged@MusInfo@@UEAAXM@Z:PROC ; MusInfo::GMEDepthChanged + Line 72: EXTRN ??1StreamSong@@UEAA@XZ:PROC ; StreamSong::~StreamSong + Line 73: EXTRN ?Play@StreamSong@@UEAAX_NH@Z:PROC ; StreamSong::Play + Line 74: EXTRN ?Pause@StreamSong@@UEAAXXZ:PROC ; StreamSong::Pause + Line 75: EXTRN ?Resume@StreamSong@@UEAAXXZ:PROC ; StreamSong::Resume + Line 76: EXTRN ?Stop@StreamSong@@UEAAXXZ:PROC ; StreamSong::Stop + Line 77: EXTRN ?IsPlaying@StreamSong@@UEAA_NXZ:PROC ; StreamSong::IsPlaying + Line 78: EXTRN ?SetPosition@StreamSong@@UEAA_NI@Z:PROC ; StreamSong::SetPosition + Line 79: EXTRN ?SetSubsong@StreamSong@@UEAA_NH@Z:PROC ; StreamSong::SetSubsong + Line 80: EXTRN ?GetStats@StreamSong@@UEAA?AVFString@@XZ:PROC ; StreamSong::GetStats + Line 81: EXTRN ??_EStreamSong@@UEAAPEAXI@Z:PROC ; StreamSong::`vector deleting destructor' + Line 82: EXTRN gme_start_track:PROC + Line 83: EXTRN gme_play:PROC + Line 84: EXTRN gme_delete:PROC + Line 85: EXTRN gme_set_fade:PROC + Line 86: EXTRN gme_track_ended:PROC + Line 87: EXTRN gme_tell:PROC + Line 88: EXTRN gme_track_info:PROC + Line 89: EXTRN gme_free_info:PROC + Line 90: EXTRN gme_set_stereo_depth:PROC + Line 91: EXTRN gme_identify_header:PROC + Line 92: EXTRN gme_identify_extension:PROC + Line 93: EXTRN gme_new_emu:PROC + Line 94: EXTRN gme_load_data:PROC + Line 95: EXTRN ??_EGMESong@@UEAAPEAXI@Z:PROC ; GMESong::`vector deleting destructor' + Line 96: EXTRN __CxxFrameHandler3:PROC + Line 97: EXTRN memset:PROC + Line 98: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 99: EXTRN ?GSnd@@3PEAVSoundRenderer@@EA:QWORD ; GSnd + Line 100: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\music_libsndfile.cod (43 hits) + Line 39: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 40: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 41: EXTRN atexit:PROC + Line 42: EXTRN __std_terminate:PROC + Line 43: EXTRN strnicmp:PROC + Line 44: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 45: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 46: EXTRN ?CreateCriticalSection@@YAPEAVFInternalCriticalSection@@XZ:PROC ; CreateCriticalSection + Line 47: EXTRN ?DeleteCriticalSection@@YAXPEAVFInternalCriticalSection@@@Z:PROC ; DeleteCriticalSection + Line 48: EXTRN ?EnterCriticalSection@@YAXPEAVFInternalCriticalSection@@@Z:PROC ; EnterCriticalSection + Line 49: EXTRN ?LeaveCriticalSection@@YAXPEAVFInternalCriticalSection@@@Z:PROC ; LeaveCriticalSection + Line 50: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 51: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 52: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 53: EXTRN ?CreateDecoder@SoundRenderer@@SAPEAUSoundDecoder@@AEAVFileReader@@@Z:PROC ; SoundRenderer::CreateDecoder + Line 54: EXTRN ??0MusInfo@@QEAA@XZ:PROC ; MusInfo::MusInfo + Line 55: EXTRN ?MusicVolumeChanged@MusInfo@@UEAAXXZ:PROC ; MusInfo::MusicVolumeChanged + Line 56: EXTRN ?IsMIDI@MusInfo@@UEBA_NXZ:PROC ; MusInfo::IsMIDI + Line 57: EXTRN ?Update@MusInfo@@UEAAXXZ:PROC ; MusInfo::Update + Line 58: EXTRN ?GetOPLDumper@MusInfo@@UEAAPEAV1@PEBD@Z:PROC ; MusInfo::GetOPLDumper + Line 59: EXTRN ?GetWaveDumper@MusInfo@@UEAAPEAV1@PEBDH@Z:PROC ; MusInfo::GetWaveDumper + Line 60: EXTRN ?FluidSettingInt@MusInfo@@UEAAXPEBDH@Z:PROC ; MusInfo::FluidSettingInt + Line 61: EXTRN ?FluidSettingNum@MusInfo@@UEAAXPEBDN@Z:PROC ; MusInfo::FluidSettingNum + Line 62: EXTRN ?FluidSettingStr@MusInfo@@UEAAXPEBD0@Z:PROC ; MusInfo::FluidSettingStr + Line 63: EXTRN ?WildMidiSetOption@MusInfo@@UEAAXHH@Z:PROC ; MusInfo::WildMidiSetOption + Line 64: EXTRN ?GMEDepthChanged@MusInfo@@UEAAXM@Z:PROC ; MusInfo::GMEDepthChanged + Line 65: EXTRN ?S_ParseTimeTag@@YA_NPEBDPEA_NPEAI@Z:PROC ; S_ParseTimeTag + Line 66: EXTRN ??1StreamSong@@UEAA@XZ:PROC ; StreamSong::~StreamSong + Line 67: EXTRN ?Play@StreamSong@@UEAAX_NH@Z:PROC ; StreamSong::Play + Line 68: EXTRN ?Pause@StreamSong@@UEAAXXZ:PROC ; StreamSong::Pause + Line 69: EXTRN ?Resume@StreamSong@@UEAAXXZ:PROC ; StreamSong::Resume + Line 70: EXTRN ?Stop@StreamSong@@UEAAXXZ:PROC ; StreamSong::Stop + Line 71: EXTRN ?IsPlaying@StreamSong@@UEAA_NXZ:PROC ; StreamSong::IsPlaying + Line 72: EXTRN ?SetPosition@StreamSong@@UEAA_NI@Z:PROC ; StreamSong::SetPosition + Line 73: EXTRN ?SetSubsong@StreamSong@@UEAA_NH@Z:PROC ; StreamSong::SetSubsong + Line 74: EXTRN ?GetStats@StreamSong@@UEAA?AVFString@@XZ:PROC ; StreamSong::GetStats + Line 75: EXTRN ??_EStreamSong@@UEAAPEAXI@Z:PROC ; StreamSong::`vector deleting destructor' + Line 76: EXTRN ??_ESndFileSong@@UEAAPEAXI@Z:PROC ; SndFileSong::`vector deleting destructor' + Line 77: EXTRN __CxxFrameHandler3:PROC + Line 78: EXTRN memset:PROC + Line 79: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 80: EXTRN ?GSnd@@3PEAVSoundRenderer@@EA:QWORD ; GSnd + Line 81: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\music_midi_base.cod (23 hits) + Line 68: EXTRN atexit:PROC + Line 69: EXTRN __imp_midiOutGetNumDevs:PROC + Line 70: EXTRN __imp_midiOutGetDevCapsA:PROC + Line 71: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 72: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 73: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 74: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 75: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 76: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 77: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 78: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 79: EXTRN ?Start@MusInfo@@QEAAX_NMH@Z:PROC ; MusInfo::Start + Line 80: EXTRN ?S_ChangeMusic@@YA_NPEBDH_N1@Z:PROC ; S_ChangeMusic + Line 81: EXTRN ?S_MIDIDeviceChanged@@YAXXZ:PROC ; S_MIDIDeviceChanged + Line 82: EXTRN ?S_StopMusic@@YAX_N@Z:PROC ; S_StopMusic + Line 83: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 84: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 85: EXTRN __CxxFrameHandler3:PROC + Line 86: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 87: EXTRN ?currSong@@3PEAVMusInfo@@EA:QWORD ; currSong + Line 88: EXTRN ?mus_playing@@3UMusPlayingInfo@@A:BYTE ; mus_playing + Line 89: EXTRN __ImageBase:BYTE + Line 90: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\music_midistream.cod (37 hits) + Line 84: EXTRN _purecall:PROC + Line 85: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 86: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 87: EXTRN __std_terminate:PROC + Line 88: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 89: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 90: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 91: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 92: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 93: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 94: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 95: EXTRN ??0MusInfo@@QEAA@XZ:PROC ; MusInfo::MusInfo + Line 96: EXTRN ??1MusInfo@@UEAA@XZ:PROC ; MusInfo::~MusInfo + Line 97: EXTRN ?SetPosition@MusInfo@@UEAA_NI@Z:PROC ; MusInfo::SetPosition + Line 98: EXTRN ?GetOPLDumper@MusInfo@@UEAAPEAV1@PEBD@Z:PROC ; MusInfo::GetOPLDumper + Line 99: EXTRN ?GetWaveDumper@MusInfo@@UEAAPEAV1@PEBDH@Z:PROC ; MusInfo::GetWaveDumper + Line 100: EXTRN ?GMEDepthChanged@MusInfo@@UEAAXM@Z:PROC ; MusInfo::GMEDepthChanged + Line 101: EXTRN ??_EMIDIDevice@@UEAAPEAXI@Z:PROC ; MIDIDevice::`vector deleting destructor' + Line 102: EXTRN ?CreateWinMIDIDevice@@YAPEAVMIDIDevice@@H@Z:PROC ; CreateWinMIDIDevice + Line 103: EXTRN ?CreateTimidityPPMIDIDevice@@YAPEAVMIDIDevice@@PEBDH@Z:PROC ; CreateTimidityPPMIDIDevice + Line 104: EXTRN ??0OPLMIDIDevice@@QEAA@PEBD@Z:PROC ; OPLMIDIDevice::OPLMIDIDevice + Line 105: EXTRN ??0OPLDumperMIDIDevice@@QEAA@PEBD@Z:PROC ; OPLDumperMIDIDevice::OPLDumperMIDIDevice + Line 106: EXTRN ??0TimidityMIDIDevice@@QEAA@PEBDH@Z:PROC ; TimidityMIDIDevice::TimidityMIDIDevice + Line 107: EXTRN ??0MIDIWaveWriter@@QEAA@PEBDPEAVSoftSynthMIDIDevice@@@Z:PROC ; MIDIWaveWriter::MIDIWaveWriter + Line 108: EXTRN ??0WildMIDIDevice@@QEAA@PEBDH@Z:PROC ; WildMIDIDevice::WildMIDIDevice + Line 109: EXTRN ??0FluidSynthMIDIDevice@@QEAA@PEBDH@Z:PROC ; FluidSynthMIDIDevice::FluidSynthMIDIDevice + Line 110: EXTRN ??0ADLMIDIDevice@@QEAA@PEBD@Z:PROC ; ADLMIDIDevice::ADLMIDIDevice + Line 111: EXTRN ??0OPNMIDIDevice@@QEAA@PEBD@Z:PROC ; OPNMIDIDevice::OPNMIDIDevice + Line 112: EXTRN ??_EMIDIStreamer@@UEAAPEAXI@Z:PROC ; MIDIStreamer::`vector deleting destructor' + Line 113: EXTRN __CxxFrameHandler3:PROC + Line 114: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 115: EXTRN ?relative_volume@@3MA:DWORD ; relative_volume + Line 116: EXTRN ?snd_musicvolume@@3VFFloatCVar@@A:BYTE ; snd_musicvolume + Line 117: EXTRN ?snd_mididevice@@3VFIntCVar@@A:BYTE ; snd_mididevice + Line 118: EXTRN ?mididevice@@3IA:DWORD ; mididevice + Line 119: EXTRN __ImageBase:BYTE + Line 120: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\music_opl.cod (43 hits) + Line 11: EXTRN ?currSong@@3PEAVMusInfo@@EA:QWORD ; currSong + Line 49: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 50: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 51: EXTRN atexit:PROC + Line 52: EXTRN __std_terminate:PROC + Line 53: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 54: EXTRN ?ServiceStream@OPLmusicBlock@@QEAA_NPEAXH@Z:PROC ; OPLmusicBlock::ServiceStream + Line 55: EXTRN ?ResetChips@OPLmusicBlock@@QEAAXXZ:PROC ; OPLmusicBlock::ResetChips + Line 56: EXTRN ??0OPLmusicFile@@QEAA@AEAVFileReader@@@Z:PROC ; OPLmusicFile::OPLmusicFile + Line 57: EXTRN ??0OPLmusicFile@@QEAA@PEBV0@PEBD@Z:PROC ; OPLmusicFile::OPLmusicFile + Line 58: EXTRN ?SetLooping@OPLmusicFile@@QEAAX_N@Z:PROC ; OPLmusicFile::SetLooping + Line 59: EXTRN ?Dump@OPLmusicFile@@QEAAXXZ:PROC ; OPLmusicFile::Dump + Line 60: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 61: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 62: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 63: EXTRN ??0MusInfo@@QEAA@XZ:PROC ; MusInfo::MusInfo + Line 64: EXTRN ?MusicVolumeChanged@MusInfo@@UEAAXXZ:PROC ; MusInfo::MusicVolumeChanged + Line 65: EXTRN ?IsMIDI@MusInfo@@UEBA_NXZ:PROC ; MusInfo::IsMIDI + Line 66: EXTRN ?Update@MusInfo@@UEAAXXZ:PROC ; MusInfo::Update + Line 67: EXTRN ?GetOPLDumper@MusInfo@@UEAAPEAV1@PEBD@Z:PROC ; MusInfo::GetOPLDumper + Line 68: EXTRN ?GetWaveDumper@MusInfo@@UEAAPEAV1@PEBDH@Z:PROC ; MusInfo::GetWaveDumper + Line 69: EXTRN ?FluidSettingInt@MusInfo@@UEAAXPEBDH@Z:PROC ; MusInfo::FluidSettingInt + Line 70: EXTRN ?FluidSettingNum@MusInfo@@UEAAXPEBDN@Z:PROC ; MusInfo::FluidSettingNum + Line 71: EXTRN ?FluidSettingStr@MusInfo@@UEAAXPEBD0@Z:PROC ; MusInfo::FluidSettingStr + Line 72: EXTRN ?WildMidiSetOption@MusInfo@@UEAAXHH@Z:PROC ; MusInfo::WildMidiSetOption + Line 73: EXTRN ?GMEDepthChanged@MusInfo@@UEAAXM@Z:PROC ; MusInfo::GMEDepthChanged + Line 74: EXTRN ??1StreamSong@@UEAA@XZ:PROC ; StreamSong::~StreamSong + Line 75: EXTRN ?Play@StreamSong@@UEAAX_NH@Z:PROC ; StreamSong::Play + Line 76: EXTRN ?Pause@StreamSong@@UEAAXXZ:PROC ; StreamSong::Pause + Line 77: EXTRN ?Resume@StreamSong@@UEAAXXZ:PROC ; StreamSong::Resume + Line 78: EXTRN ?Stop@StreamSong@@UEAAXXZ:PROC ; StreamSong::Stop + Line 79: EXTRN ?IsPlaying@StreamSong@@UEAA_NXZ:PROC ; StreamSong::IsPlaying + Line 80: EXTRN ?SetPosition@StreamSong@@UEAA_NI@Z:PROC ; StreamSong::SetPosition + Line 81: EXTRN ?SetSubsong@StreamSong@@UEAA_NH@Z:PROC ; StreamSong::SetSubsong + Line 82: EXTRN ?GetStats@StreamSong@@UEAA?AVFString@@XZ:PROC ; StreamSong::GetStats + Line 83: EXTRN ??_EStreamSong@@UEAAPEAXI@Z:PROC ; StreamSong::`vector deleting destructor' + Line 84: EXTRN ??_EOPLMUSSong@@UEAAPEAXI@Z:PROC ; OPLMUSSong::`vector deleting destructor' + Line 85: EXTRN ??_EOPLMUSDumper@@UEAAPEAXI@Z:PROC ; OPLMUSDumper::`vector deleting destructor' + Line 86: EXTRN ?MIDIDeviceChanged@@YAXH_N@Z:PROC ; MIDIDeviceChanged + Line 87: EXTRN __CxxFrameHandler3:PROC + Line 88: EXTRN ?GSnd@@3PEAVSoundRenderer@@EA:QWORD ; GSnd + Line 89: EXTRN ?snd_musicvolume@@3VFFloatCVar@@A:BYTE ; snd_musicvolume + Line 90: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\music_opl_mididevice.cod (60 hits) + Line 36: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 37: EXTRN atexit:PROC + Line 38: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 39: EXTRN ?AppendCStrPart@FString@@QEAAAEAV1@PEBD_K@Z:PROC ; FString::AppendCStrPart + Line 40: EXTRN ?changeModulation@musicBlock@@QEAAXIH@Z:PROC ; musicBlock::changeModulation + Line 41: EXTRN ?changeSustain@musicBlock@@QEAAXIH@Z:PROC ; musicBlock::changeSustain + Line 42: EXTRN ?changeVolume@musicBlock@@QEAAXIH_N@Z:PROC ; musicBlock::changeVolume + Line 43: EXTRN ?changePanning@musicBlock@@QEAAXIH@Z:PROC ; musicBlock::changePanning + Line 44: EXTRN ?notesOff@musicBlock@@QEAAXIH@Z:PROC ; musicBlock::notesOff + Line 45: EXTRN ?allNotesOff@musicBlock@@QEAAXIH@Z:PROC ; musicBlock::allNotesOff + Line 46: EXTRN ?changeExtended@musicBlock@@QEAAXIEH@Z:PROC ; musicBlock::changeExtended + Line 47: EXTRN ?resetControllers@musicBlock@@QEAAXIH@Z:PROC ; musicBlock::resetControllers + Line 48: EXTRN ?programChange@musicBlock@@QEAAXIH@Z:PROC ; musicBlock::programChange + Line 49: EXTRN ?resetAllControllers@musicBlock@@QEAAXH@Z:PROC ; musicBlock::resetAllControllers + Line 50: EXTRN ?changePitch@musicBlock@@QEAAXIHH@Z:PROC ; musicBlock::changePitch + Line 51: EXTRN ?noteOn@musicBlock@@QEAAXIEH@Z:PROC ; musicBlock::noteOn + Line 52: EXTRN ?noteOff@musicBlock@@QEAAXIE@Z:PROC ; musicBlock::noteOff + Line 53: EXTRN ?stopAllVoices@musicBlock@@QEAAXXZ:PROC ; musicBlock::stopAllVoices + Line 54: EXTRN ??0OPLmusicBlock@@QEAA@XZ:PROC ; OPLmusicBlock::OPLmusicBlock + Line 55: EXTRN ??1OPLmusicBlock@@UEAA@XZ:PROC ; OPLmusicBlock::~OPLmusicBlock + Line 56: EXTRN ?ServiceStream@OPLmusicBlock@@QEAA_NPEAXH@Z:PROC ; OPLmusicBlock::ServiceStream + Line 57: EXTRN ?Restart@OPLmusicBlock@@UEAAXXZ:PROC ; OPLmusicBlock::Restart + Line 58: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 59: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 60: EXTRN ?PrepareHeader@MIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; MIDIDevice::PrepareHeader + Line 61: EXTRN ?UnprepareHeader@MIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; MIDIDevice::UnprepareHeader + Line 62: EXTRN ?FakeVolume@MIDIDevice@@UEAA_NXZ:PROC ; MIDIDevice::FakeVolume + Line 63: EXTRN ?InitPlayback@MIDIDevice@@UEAAXXZ:PROC ; MIDIDevice::InitPlayback + Line 64: EXTRN ?Update@MIDIDevice@@UEAA_NXZ:PROC ; MIDIDevice::Update + Line 65: EXTRN ?PrecacheInstruments@MIDIDevice@@UEAAXPEBGH@Z:PROC ; MIDIDevice::PrecacheInstruments + Line 66: EXTRN ?FluidSettingInt@MIDIDevice@@UEAAXPEBDH@Z:PROC ; MIDIDevice::FluidSettingInt + Line 67: EXTRN ?FluidSettingNum@MIDIDevice@@UEAAXPEBDN@Z:PROC ; MIDIDevice::FluidSettingNum + Line 68: EXTRN ?FluidSettingStr@MIDIDevice@@UEAAXPEBD0@Z:PROC ; MIDIDevice::FluidSettingStr + Line 69: EXTRN ?WildMidiSetOption@MIDIDevice@@UEAAXHH@Z:PROC ; MIDIDevice::WildMidiSetOption + Line 70: EXTRN ?Preprocess@MIDIDevice@@UEAA_NPEAVMIDIStreamer@@_N@Z:PROC ; MIDIDevice::Preprocess + Line 71: EXTRN ??0SoftSynthMIDIDevice@@QEAA@HHH@Z:PROC ; SoftSynthMIDIDevice::SoftSynthMIDIDevice + Line 72: EXTRN ??1SoftSynthMIDIDevice@@UEAA@XZ:PROC ; SoftSynthMIDIDevice::~SoftSynthMIDIDevice + Line 73: EXTRN ?Close@SoftSynthMIDIDevice@@UEAAXXZ:PROC ; SoftSynthMIDIDevice::Close + Line 74: EXTRN ?IsOpen@SoftSynthMIDIDevice@@UEBA_NXZ:PROC ; SoftSynthMIDIDevice::IsOpen + Line 75: EXTRN ?SetTempo@SoftSynthMIDIDevice@@UEAAHH@Z:PROC ; SoftSynthMIDIDevice::SetTempo + Line 76: EXTRN ?SetTimeDiv@SoftSynthMIDIDevice@@UEAAHH@Z:PROC ; SoftSynthMIDIDevice::SetTimeDiv + Line 77: EXTRN ?StreamOut@SoftSynthMIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; SoftSynthMIDIDevice::StreamOut + Line 78: EXTRN ?StreamOutSync@SoftSynthMIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; SoftSynthMIDIDevice::StreamOutSync + Line 79: EXTRN ?Resume@SoftSynthMIDIDevice@@UEAAHXZ:PROC ; SoftSynthMIDIDevice::Resume + Line 80: EXTRN ?Stop@SoftSynthMIDIDevice@@UEAAXXZ:PROC ; SoftSynthMIDIDevice::Stop + Line 81: EXTRN ?Pause@SoftSynthMIDIDevice@@UEAA_N_N@Z:PROC ; SoftSynthMIDIDevice::Pause + Line 82: EXTRN ?CalcTickRate@SoftSynthMIDIDevice@@MEAAXXZ:PROC ; SoftSynthMIDIDevice::CalcTickRate + Line 83: EXTRN ?PlayTick@SoftSynthMIDIDevice@@IEAAHXZ:PROC ; SoftSynthMIDIDevice::PlayTick + Line 84: EXTRN ?OpenStream@SoftSynthMIDIDevice@@IEAAHHHP6AXPEAX@Z0@Z:PROC ; SoftSynthMIDIDevice::OpenStream + Line 85: EXTRN ??_EOPLMIDIDevice@@UEAAPEAXI@Z:PROC ; OPLMIDIDevice::`vector deleting destructor' + Line 86: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 87: EXTRN ?OpenLumpReader@FWadCollection@@QEAA?AVFileReader@@H@Z:PROC ; FWadCollection::OpenLumpReader + Line 88: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 89: EXTRN ?OPL_SetCore@@YAXPEBD@Z:PROC ; OPL_SetCore + Line 90: EXTRN __CxxFrameHandler3:PROC + Line 91: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 92: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 93: EXTRN ?opl_numchips@@3VFIntCVar@@A:BYTE ; opl_numchips + Line 94: EXTRN __ImageBase:BYTE + Line 95: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\music_opldumper_mididevice.cod (56 hits) + Line 58: EXTRN _purecall:PROC + Line 59: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 60: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 61: EXTRN __std_terminate:PROC + Line 62: EXTRN stricmp:PROC + Line 63: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 64: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 65: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 66: EXTRN ??1OPLio@@UEAA@XZ:PROC ; OPLio::~OPLio + Line 67: EXTRN ?WriteInitState@OPLio@@QEAAX_N@Z:PROC ; OPLio::WriteInitState + Line 68: EXTRN ?Init@OPLio@@UEAAHI_N0@Z:PROC ; OPLio::Init + Line 69: EXTRN ?Reset@OPLio@@UEAAXXZ:PROC ; OPLio::Reset + Line 70: EXTRN ?WriteRegister@OPLio@@UEAAXHIE@Z:PROC ; OPLio::WriteRegister + Line 71: EXTRN ?SetClockRate@OPLio@@UEAAXN@Z:PROC ; OPLio::SetClockRate + Line 72: EXTRN ?WriteDelay@OPLio@@UEAAXH@Z:PROC ; OPLio::WriteDelay + Line 73: EXTRN ??_EOPLio@@UEAAPEAXI@Z:PROC ; OPLio::`vector deleting destructor' + Line 74: EXTRN ??_EDiskWriterIO@@UEAAPEAXI@Z:PROC ; DiskWriterIO::`vector deleting destructor' + Line 75: EXTRN ??1OPLmusicBlock@@UEAA@XZ:PROC ; OPLmusicBlock::~OPLmusicBlock + Line 76: EXTRN ?Restart@OPLmusicBlock@@UEAAXXZ:PROC ; OPLmusicBlock::Restart + Line 77: EXTRN ?Open@FileWriter@@SAPEAV1@PEBD@Z:PROC ; FileWriter::Open + Line 78: EXTRN ?PrepareHeader@MIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; MIDIDevice::PrepareHeader + Line 79: EXTRN ?UnprepareHeader@MIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; MIDIDevice::UnprepareHeader + Line 80: EXTRN ?FakeVolume@MIDIDevice@@UEAA_NXZ:PROC ; MIDIDevice::FakeVolume + Line 81: EXTRN ?InitPlayback@MIDIDevice@@UEAAXXZ:PROC ; MIDIDevice::InitPlayback + Line 82: EXTRN ?Update@MIDIDevice@@UEAA_NXZ:PROC ; MIDIDevice::Update + Line 83: EXTRN ?PrecacheInstruments@MIDIDevice@@UEAAXPEBGH@Z:PROC ; MIDIDevice::PrecacheInstruments + Line 84: EXTRN ?FluidSettingInt@MIDIDevice@@UEAAXPEBDH@Z:PROC ; MIDIDevice::FluidSettingInt + Line 85: EXTRN ?FluidSettingNum@MIDIDevice@@UEAAXPEBDN@Z:PROC ; MIDIDevice::FluidSettingNum + Line 86: EXTRN ?FluidSettingStr@MIDIDevice@@UEAAXPEBD0@Z:PROC ; MIDIDevice::FluidSettingStr + Line 87: EXTRN ?WildMidiSetOption@MIDIDevice@@UEAAXHH@Z:PROC ; MIDIDevice::WildMidiSetOption + Line 88: EXTRN ?Preprocess@MIDIDevice@@UEAA_NPEAVMIDIStreamer@@_N@Z:PROC ; MIDIDevice::Preprocess + Line 89: EXTRN ??1SoftSynthMIDIDevice@@UEAA@XZ:PROC ; SoftSynthMIDIDevice::~SoftSynthMIDIDevice + Line 90: EXTRN ?IsOpen@SoftSynthMIDIDevice@@UEBA_NXZ:PROC ; SoftSynthMIDIDevice::IsOpen + Line 91: EXTRN ?SetTempo@SoftSynthMIDIDevice@@UEAAHH@Z:PROC ; SoftSynthMIDIDevice::SetTempo + Line 92: EXTRN ?SetTimeDiv@SoftSynthMIDIDevice@@UEAAHH@Z:PROC ; SoftSynthMIDIDevice::SetTimeDiv + Line 93: EXTRN ?StreamOut@SoftSynthMIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; SoftSynthMIDIDevice::StreamOut + Line 94: EXTRN ?StreamOutSync@SoftSynthMIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; SoftSynthMIDIDevice::StreamOutSync + Line 95: EXTRN ?Pause@SoftSynthMIDIDevice@@UEAA_N_N@Z:PROC ; SoftSynthMIDIDevice::Pause + Line 96: EXTRN ??0OPLMIDIDevice@@QEAA@PEBD@Z:PROC ; OPLMIDIDevice::OPLMIDIDevice + Line 97: EXTRN ?Open@OPLMIDIDevice@@UEAAHP6AXPEAX@Z0@Z:PROC ; OPLMIDIDevice::Open + Line 98: EXTRN ?Close@OPLMIDIDevice@@UEAAXXZ:PROC ; OPLMIDIDevice::Close + Line 99: EXTRN ?GetTechnology@OPLMIDIDevice@@UEBAHXZ:PROC ; OPLMIDIDevice::GetTechnology + Line 100: EXTRN ?GetStats@OPLMIDIDevice@@UEAA?AVFString@@XZ:PROC ; OPLMIDIDevice::GetStats + Line 101: EXTRN ?CalcTickRate@OPLMIDIDevice@@MEAAXXZ:PROC ; OPLMIDIDevice::CalcTickRate + Line 102: EXTRN ?PlayTick@OPLMIDIDevice@@MEAAHXZ:PROC ; OPLMIDIDevice::PlayTick + Line 103: EXTRN ?HandleEvent@OPLMIDIDevice@@MEAAXHHH@Z:PROC ; OPLMIDIDevice::HandleEvent + Line 104: EXTRN ?HandleLongEvent@OPLMIDIDevice@@MEAAXPEBEH@Z:PROC ; OPLMIDIDevice::HandleLongEvent + Line 105: EXTRN ?ComputeOutput@OPLMIDIDevice@@MEAAXPEAMH@Z:PROC ; OPLMIDIDevice::ComputeOutput + Line 106: EXTRN ?ServiceStream@OPLMIDIDevice@@MEAA_NPEAXH@Z:PROC ; OPLMIDIDevice::ServiceStream + Line 107: EXTRN ??_EOPLDumperMIDIDevice@@UEAAPEAXI@Z:PROC ; OPLDumperMIDIDevice::`vector deleting destructor' + Line 108: EXTRN ??_EOPLEmul@@UEAAPEAXI@Z:PROC ; OPLEmul::`vector deleting destructor' + Line 109: EXTRN ??_EOPLDump@@UEAAPEAXI@Z:PROC ; OPLDump::`vector deleting destructor' + Line 110: EXTRN ??_EOPL_RDOSdump@@UEAAPEAXI@Z:PROC ; OPL_RDOSdump::`vector deleting destructor' + Line 111: EXTRN ??_EOPL_DOSBOXdump@@UEAAPEAXI@Z:PROC ; OPL_DOSBOXdump::`vector deleting destructor' + Line 112: EXTRN __CxxFrameHandler3:PROC + Line 113: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\music_opnmidi_mididevice.cod (64 hits) + Line 15: EXTRN ?currSong@@3PEAVMusInfo@@EA:QWORD ; currSong + Line 68: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 69: EXTRN atexit:PROC + Line 70: EXTRN __std_terminate:PROC + Line 71: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 72: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 73: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 74: EXTRN ??0FStringCVar@@QEAA@PEBD0IP6AXAEAV0@@Z@Z:PROC ; FStringCVar::FStringCVar + Line 75: EXTRN ??1FStringCVar@@UEAA@XZ:PROC ; FStringCVar::~FStringCVar + Line 76: EXTRN ?PrepareHeader@MIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; MIDIDevice::PrepareHeader + Line 77: EXTRN ?UnprepareHeader@MIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; MIDIDevice::UnprepareHeader + Line 78: EXTRN ?FakeVolume@MIDIDevice@@UEAA_NXZ:PROC ; MIDIDevice::FakeVolume + Line 79: EXTRN ?InitPlayback@MIDIDevice@@UEAAXXZ:PROC ; MIDIDevice::InitPlayback + Line 80: EXTRN ?Update@MIDIDevice@@UEAA_NXZ:PROC ; MIDIDevice::Update + Line 81: EXTRN ?PrecacheInstruments@MIDIDevice@@UEAAXPEBGH@Z:PROC ; MIDIDevice::PrecacheInstruments + Line 82: EXTRN ?FluidSettingInt@MIDIDevice@@UEAAXPEBDH@Z:PROC ; MIDIDevice::FluidSettingInt + Line 83: EXTRN ?FluidSettingNum@MIDIDevice@@UEAAXPEBDN@Z:PROC ; MIDIDevice::FluidSettingNum + Line 84: EXTRN ?FluidSettingStr@MIDIDevice@@UEAAXPEBD0@Z:PROC ; MIDIDevice::FluidSettingStr + Line 85: EXTRN ?WildMidiSetOption@MIDIDevice@@UEAAXHH@Z:PROC ; MIDIDevice::WildMidiSetOption + Line 86: EXTRN ?Preprocess@MIDIDevice@@UEAA_NPEAVMIDIStreamer@@_N@Z:PROC ; MIDIDevice::Preprocess + Line 87: EXTRN ?GetStats@MIDIDevice@@UEAA?AVFString@@XZ:PROC ; MIDIDevice::GetStats + Line 88: EXTRN ??0SoftSynthMIDIDevice@@QEAA@HHH@Z:PROC ; SoftSynthMIDIDevice::SoftSynthMIDIDevice + Line 89: EXTRN ??1SoftSynthMIDIDevice@@UEAA@XZ:PROC ; SoftSynthMIDIDevice::~SoftSynthMIDIDevice + Line 90: EXTRN ?Close@SoftSynthMIDIDevice@@UEAAXXZ:PROC ; SoftSynthMIDIDevice::Close + Line 91: EXTRN ?IsOpen@SoftSynthMIDIDevice@@UEBA_NXZ:PROC ; SoftSynthMIDIDevice::IsOpen + Line 92: EXTRN ?GetTechnology@SoftSynthMIDIDevice@@UEBAHXZ:PROC ; SoftSynthMIDIDevice::GetTechnology + Line 93: EXTRN ?SetTempo@SoftSynthMIDIDevice@@UEAAHH@Z:PROC ; SoftSynthMIDIDevice::SetTempo + Line 94: EXTRN ?SetTimeDiv@SoftSynthMIDIDevice@@UEAAHH@Z:PROC ; SoftSynthMIDIDevice::SetTimeDiv + Line 95: EXTRN ?StreamOut@SoftSynthMIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; SoftSynthMIDIDevice::StreamOut + Line 96: EXTRN ?StreamOutSync@SoftSynthMIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; SoftSynthMIDIDevice::StreamOutSync + Line 97: EXTRN ?Resume@SoftSynthMIDIDevice@@UEAAHXZ:PROC ; SoftSynthMIDIDevice::Resume + Line 98: EXTRN ?Stop@SoftSynthMIDIDevice@@UEAAXXZ:PROC ; SoftSynthMIDIDevice::Stop + Line 99: EXTRN ?Pause@SoftSynthMIDIDevice@@UEAA_N_N@Z:PROC ; SoftSynthMIDIDevice::Pause + Line 100: EXTRN ?CalcTickRate@SoftSynthMIDIDevice@@MEAAXXZ:PROC ; SoftSynthMIDIDevice::CalcTickRate + Line 101: EXTRN ?OpenStream@SoftSynthMIDIDevice@@IEAAHHHP6AXPEAX@Z0@Z:PROC ; SoftSynthMIDIDevice::OpenStream + Line 102: EXTRN ?ServiceStream@SoftSynthMIDIDevice@@MEAA_NPEAXH@Z:PROC ; SoftSynthMIDIDevice::ServiceStream + Line 103: EXTRN ??_EOPNMIDIDevice@@UEAAPEAXI@Z:PROC ; OPNMIDIDevice::`vector deleting destructor' + Line 104: EXTRN ?MIDIDeviceChanged@@YAXH_N@Z:PROC ; MIDIDeviceChanged + Line 105: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 106: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 107: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 108: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 109: EXTRN opn2_setNumChips:PROC + Line 110: EXTRN opn2_setSoftPanEnabled:PROC + Line 111: EXTRN opn2_openBankFile:PROC + Line 112: EXTRN opn2_openBankData:PROC + Line 113: EXTRN opn2_switchEmulator:PROC + Line 114: EXTRN opn2_setRunAtPcmRate:PROC + Line 115: EXTRN opn2_init:PROC + Line 116: EXTRN opn2_close:PROC + Line 117: EXTRN opn2_generateFormat:PROC + Line 118: EXTRN opn2_rt_resetState:PROC + Line 119: EXTRN opn2_rt_noteOn:PROC + Line 120: EXTRN opn2_rt_noteOff:PROC + Line 121: EXTRN opn2_rt_noteAfterTouch:PROC + Line 122: EXTRN opn2_rt_channelAfterTouch:PROC + Line 123: EXTRN opn2_rt_controllerChange:PROC + Line 124: EXTRN opn2_rt_patchChange:PROC + Line 125: EXTRN opn2_rt_pitchBendML:PROC + Line 126: EXTRN ?FindSoundFont@FSoundFontManager@@QEBAPEBUFSoundFontInfo@@PEBDH@Z:PROC ; FSoundFontManager::FindSoundFont + Line 127: EXTRN __CxxFrameHandler3:PROC + Line 128: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 129: EXTRN ?sfmanager@@3VFSoundFontManager@@A:BYTE ; sfmanager + Line 130: EXTRN __ImageBase:BYTE + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\music_softsynth_mididevice.cod (31 hits) + Line 48: EXTRN _purecall:PROC + Line 49: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 50: EXTRN atexit:PROC + Line 51: EXTRN __std_terminate:PROC + Line 52: EXTRN ?CreateCriticalSection@@YAPEAVFInternalCriticalSection@@XZ:PROC ; CreateCriticalSection + Line 53: EXTRN ?DeleteCriticalSection@@YAXPEAVFInternalCriticalSection@@@Z:PROC ; DeleteCriticalSection + Line 54: EXTRN ?EnterCriticalSection@@YAXPEAVFInternalCriticalSection@@@Z:PROC ; EnterCriticalSection + Line 55: EXTRN ?LeaveCriticalSection@@YAXPEAVFInternalCriticalSection@@@Z:PROC ; LeaveCriticalSection + Line 56: EXTRN mysnprintf:PROC + Line 57: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 58: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 59: EXTRN ??0MIDIDevice@@QEAA@XZ:PROC ; MIDIDevice::MIDIDevice + Line 60: EXTRN ??1MIDIDevice@@UEAA@XZ:PROC ; MIDIDevice::~MIDIDevice + Line 61: EXTRN ?PrepareHeader@MIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; MIDIDevice::PrepareHeader + Line 62: EXTRN ?UnprepareHeader@MIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; MIDIDevice::UnprepareHeader + Line 63: EXTRN ?FakeVolume@MIDIDevice@@UEAA_NXZ:PROC ; MIDIDevice::FakeVolume + Line 64: EXTRN ?InitPlayback@MIDIDevice@@UEAAXXZ:PROC ; MIDIDevice::InitPlayback + Line 65: EXTRN ?Update@MIDIDevice@@UEAA_NXZ:PROC ; MIDIDevice::Update + Line 66: EXTRN ?PrecacheInstruments@MIDIDevice@@UEAAXPEBGH@Z:PROC ; MIDIDevice::PrecacheInstruments + Line 67: EXTRN ?FluidSettingInt@MIDIDevice@@UEAAXPEBDH@Z:PROC ; MIDIDevice::FluidSettingInt + Line 68: EXTRN ?FluidSettingNum@MIDIDevice@@UEAAXPEBDN@Z:PROC ; MIDIDevice::FluidSettingNum + Line 69: EXTRN ?FluidSettingStr@MIDIDevice@@UEAAXPEBD0@Z:PROC ; MIDIDevice::FluidSettingStr + Line 70: EXTRN ?WildMidiSetOption@MIDIDevice@@UEAAXHH@Z:PROC ; MIDIDevice::WildMidiSetOption + Line 71: EXTRN ?Preprocess@MIDIDevice@@UEAA_NPEAVMIDIStreamer@@_N@Z:PROC ; MIDIDevice::Preprocess + Line 72: EXTRN ?GetStats@MIDIDevice@@UEAA?AVFString@@XZ:PROC ; MIDIDevice::GetStats + Line 73: EXTRN ??_ESoftSynthMIDIDevice@@UEAAPEAXI@Z:PROC ; SoftSynthMIDIDevice::`vector deleting destructor' + Line 74: EXTRN ?I_DebugPrint@@YAXPEBD@Z:PROC ; I_DebugPrint + Line 75: EXTRN __CxxFrameHandler3:PROC + Line 76: EXTRN memset:PROC + Line 77: EXTRN ?GSnd@@3PEAVSoundRenderer@@EA:QWORD ; GSnd + Line 78: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\music_stream.cod (19 hits) + Line 24: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 25: EXTRN __std_terminate:PROC + Line 26: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 27: EXTRN ??0MusInfo@@QEAA@XZ:PROC ; MusInfo::MusInfo + Line 28: EXTRN ??1MusInfo@@UEAA@XZ:PROC ; MusInfo::~MusInfo + Line 29: EXTRN ?MusicVolumeChanged@MusInfo@@UEAAXXZ:PROC ; MusInfo::MusicVolumeChanged + Line 30: EXTRN ?IsMIDI@MusInfo@@UEBA_NXZ:PROC ; MusInfo::IsMIDI + Line 31: EXTRN ?Update@MusInfo@@UEAAXXZ:PROC ; MusInfo::Update + Line 32: EXTRN ?GetOPLDumper@MusInfo@@UEAAPEAV1@PEBD@Z:PROC ; MusInfo::GetOPLDumper + Line 33: EXTRN ?GetWaveDumper@MusInfo@@UEAAPEAV1@PEBDH@Z:PROC ; MusInfo::GetWaveDumper + Line 34: EXTRN ?FluidSettingInt@MusInfo@@UEAAXPEBDH@Z:PROC ; MusInfo::FluidSettingInt + Line 35: EXTRN ?FluidSettingNum@MusInfo@@UEAAXPEBDN@Z:PROC ; MusInfo::FluidSettingNum + Line 36: EXTRN ?FluidSettingStr@MusInfo@@UEAAXPEBD0@Z:PROC ; MusInfo::FluidSettingStr + Line 37: EXTRN ?WildMidiSetOption@MusInfo@@UEAAXHH@Z:PROC ; MusInfo::WildMidiSetOption + Line 38: EXTRN ?GMEDepthChanged@MusInfo@@UEAAXM@Z:PROC ; MusInfo::GMEDepthChanged + Line 39: EXTRN ??_EStreamSong@@UEAAPEAXI@Z:PROC ; StreamSong::`vector deleting destructor' + Line 40: EXTRN __CxxFrameHandler3:PROC + Line 41: EXTRN ?GSnd@@3PEAVSoundRenderer@@EA:QWORD ; GSnd + Line 42: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\music_timidity_mididevice.cod (48 hits) + Line 29: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 30: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 31: EXTRN __std_terminate:PROC + Line 32: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 33: EXTRN ??YFString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator+= + Line 34: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 35: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 36: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 37: EXTRN ?AppendFormat@FString@@QEAAXPEBDZZ:PROC ; FString::AppendFormat + Line 38: EXTRN ?EnterCriticalSection@@YAXPEAVFInternalCriticalSection@@@Z:PROC ; EnterCriticalSection + Line 39: EXTRN ?LeaveCriticalSection@@YAXPEAVFInternalCriticalSection@@@Z:PROC ; LeaveCriticalSection + Line 40: EXTRN ?PrepareHeader@MIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; MIDIDevice::PrepareHeader + Line 41: EXTRN ?UnprepareHeader@MIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; MIDIDevice::UnprepareHeader + Line 42: EXTRN ?FakeVolume@MIDIDevice@@UEAA_NXZ:PROC ; MIDIDevice::FakeVolume + Line 43: EXTRN ?InitPlayback@MIDIDevice@@UEAAXXZ:PROC ; MIDIDevice::InitPlayback + Line 44: EXTRN ?Update@MIDIDevice@@UEAA_NXZ:PROC ; MIDIDevice::Update + Line 45: EXTRN ?FluidSettingInt@MIDIDevice@@UEAAXPEBDH@Z:PROC ; MIDIDevice::FluidSettingInt + Line 46: EXTRN ?FluidSettingNum@MIDIDevice@@UEAAXPEBDN@Z:PROC ; MIDIDevice::FluidSettingNum + Line 47: EXTRN ?FluidSettingStr@MIDIDevice@@UEAAXPEBD0@Z:PROC ; MIDIDevice::FluidSettingStr + Line 48: EXTRN ?WildMidiSetOption@MIDIDevice@@UEAAXHH@Z:PROC ; MIDIDevice::WildMidiSetOption + Line 49: EXTRN ?Preprocess@MIDIDevice@@UEAA_NPEAVMIDIStreamer@@_N@Z:PROC ; MIDIDevice::Preprocess + Line 50: EXTRN ??0SoftSynthMIDIDevice@@QEAA@HHH@Z:PROC ; SoftSynthMIDIDevice::SoftSynthMIDIDevice + Line 51: EXTRN ??1SoftSynthMIDIDevice@@UEAA@XZ:PROC ; SoftSynthMIDIDevice::~SoftSynthMIDIDevice + Line 52: EXTRN ?Close@SoftSynthMIDIDevice@@UEAAXXZ:PROC ; SoftSynthMIDIDevice::Close + Line 53: EXTRN ?IsOpen@SoftSynthMIDIDevice@@UEBA_NXZ:PROC ; SoftSynthMIDIDevice::IsOpen + Line 54: EXTRN ?GetTechnology@SoftSynthMIDIDevice@@UEBAHXZ:PROC ; SoftSynthMIDIDevice::GetTechnology + Line 55: EXTRN ?SetTempo@SoftSynthMIDIDevice@@UEAAHH@Z:PROC ; SoftSynthMIDIDevice::SetTempo + Line 56: EXTRN ?SetTimeDiv@SoftSynthMIDIDevice@@UEAAHH@Z:PROC ; SoftSynthMIDIDevice::SetTimeDiv + Line 57: EXTRN ?StreamOut@SoftSynthMIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; SoftSynthMIDIDevice::StreamOut + Line 58: EXTRN ?StreamOutSync@SoftSynthMIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; SoftSynthMIDIDevice::StreamOutSync + Line 59: EXTRN ?Resume@SoftSynthMIDIDevice@@UEAAHXZ:PROC ; SoftSynthMIDIDevice::Resume + Line 60: EXTRN ?Stop@SoftSynthMIDIDevice@@UEAAXXZ:PROC ; SoftSynthMIDIDevice::Stop + Line 61: EXTRN ?Pause@SoftSynthMIDIDevice@@UEAA_N_N@Z:PROC ; SoftSynthMIDIDevice::Pause + Line 62: EXTRN ?CalcTickRate@SoftSynthMIDIDevice@@MEAAXXZ:PROC ; SoftSynthMIDIDevice::CalcTickRate + Line 63: EXTRN ?OpenStream@SoftSynthMIDIDevice@@IEAAHHHP6AXPEAX@Z0@Z:PROC ; SoftSynthMIDIDevice::OpenStream + Line 64: EXTRN ?ServiceStream@SoftSynthMIDIDevice@@MEAA_NPEAXH@Z:PROC ; SoftSynthMIDIDevice::ServiceStream + Line 65: EXTRN ??_ETimidityMIDIDevice@@UEAAPEAXI@Z:PROC ; TimidityMIDIDevice::`vector deleting destructor' + Line 66: EXTRN ??0Renderer@Timidity@@QEAA@MPEBD@Z:PROC ; Timidity::Renderer::Renderer + Line 67: EXTRN ??1Renderer@Timidity@@QEAA@XZ:PROC ; Timidity::Renderer::~Renderer + Line 68: EXTRN ?HandleEvent@Renderer@Timidity@@QEAAXHHH@Z:PROC ; Timidity::Renderer::HandleEvent + Line 69: EXTRN ?HandleLongMessage@Renderer@Timidity@@QEAAXPEBEH@Z:PROC ; Timidity::Renderer::HandleLongMessage + Line 70: EXTRN ?ComputeOutput@Renderer@Timidity@@QEAAXPEAMH@Z:PROC ; Timidity::Renderer::ComputeOutput + Line 71: EXTRN ?MarkInstrument@Renderer@Timidity@@QEAAXHHH@Z:PROC ; Timidity::Renderer::MarkInstrument + Line 72: EXTRN ?Reset@Renderer@Timidity@@QEAAXXZ:PROC ; Timidity::Renderer::Reset + Line 73: EXTRN ?load_missing_instruments@Renderer@Timidity@@QEAAHXZ:PROC ; Timidity::Renderer::load_missing_instruments + Line 74: EXTRN __CxxFrameHandler3:PROC + Line 75: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 76: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\music_timiditypp_mididevice.cod (59 hits) + Line 12: EXTRN ?currSong@@3PEAVMusInfo@@EA:QWORD ; currSong + Line 48: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 49: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 50: EXTRN atexit:PROC + Line 51: EXTRN __std_terminate:PROC + Line 52: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 53: EXTRN ?VFormat@FString@@QEAAXPEBDPEAD@Z:PROC ; FString::VFormat + Line 54: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 55: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 56: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 57: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 58: EXTRN ??0FStringCVar@@QEAA@PEBD0IP6AXAEAV0@@Z@Z:PROC ; FStringCVar::FStringCVar + Line 59: EXTRN ??1FStringCVar@@UEAA@XZ:PROC ; FStringCVar::~FStringCVar + Line 60: EXTRN ?PrepareHeader@MIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; MIDIDevice::PrepareHeader + Line 61: EXTRN ?UnprepareHeader@MIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; MIDIDevice::UnprepareHeader + Line 62: EXTRN ?FakeVolume@MIDIDevice@@UEAA_NXZ:PROC ; MIDIDevice::FakeVolume + Line 63: EXTRN ?InitPlayback@MIDIDevice@@UEAAXXZ:PROC ; MIDIDevice::InitPlayback + Line 64: EXTRN ?Update@MIDIDevice@@UEAA_NXZ:PROC ; MIDIDevice::Update + Line 65: EXTRN ?FluidSettingInt@MIDIDevice@@UEAAXPEBDH@Z:PROC ; MIDIDevice::FluidSettingInt + Line 66: EXTRN ?FluidSettingNum@MIDIDevice@@UEAAXPEBDN@Z:PROC ; MIDIDevice::FluidSettingNum + Line 67: EXTRN ?FluidSettingStr@MIDIDevice@@UEAAXPEBD0@Z:PROC ; MIDIDevice::FluidSettingStr + Line 68: EXTRN ?WildMidiSetOption@MIDIDevice@@UEAAXHH@Z:PROC ; MIDIDevice::WildMidiSetOption + Line 69: EXTRN ?Preprocess@MIDIDevice@@UEAA_NPEAVMIDIStreamer@@_N@Z:PROC ; MIDIDevice::Preprocess + Line 70: EXTRN ?GetStats@MIDIDevice@@UEAA?AVFString@@XZ:PROC ; MIDIDevice::GetStats + Line 71: EXTRN ??0SoftSynthMIDIDevice@@QEAA@HHH@Z:PROC ; SoftSynthMIDIDevice::SoftSynthMIDIDevice + Line 72: EXTRN ??1SoftSynthMIDIDevice@@UEAA@XZ:PROC ; SoftSynthMIDIDevice::~SoftSynthMIDIDevice + Line 73: EXTRN ?Close@SoftSynthMIDIDevice@@UEAAXXZ:PROC ; SoftSynthMIDIDevice::Close + Line 74: EXTRN ?IsOpen@SoftSynthMIDIDevice@@UEBA_NXZ:PROC ; SoftSynthMIDIDevice::IsOpen + Line 75: EXTRN ?GetTechnology@SoftSynthMIDIDevice@@UEBAHXZ:PROC ; SoftSynthMIDIDevice::GetTechnology + Line 76: EXTRN ?SetTempo@SoftSynthMIDIDevice@@UEAAHH@Z:PROC ; SoftSynthMIDIDevice::SetTempo + Line 77: EXTRN ?SetTimeDiv@SoftSynthMIDIDevice@@UEAAHH@Z:PROC ; SoftSynthMIDIDevice::SetTimeDiv + Line 78: EXTRN ?StreamOut@SoftSynthMIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; SoftSynthMIDIDevice::StreamOut + Line 79: EXTRN ?StreamOutSync@SoftSynthMIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; SoftSynthMIDIDevice::StreamOutSync + Line 80: EXTRN ?Resume@SoftSynthMIDIDevice@@UEAAHXZ:PROC ; SoftSynthMIDIDevice::Resume + Line 81: EXTRN ?Stop@SoftSynthMIDIDevice@@UEAAXXZ:PROC ; SoftSynthMIDIDevice::Stop + Line 82: EXTRN ?Pause@SoftSynthMIDIDevice@@UEAA_N_N@Z:PROC ; SoftSynthMIDIDevice::Pause + Line 83: EXTRN ?CalcTickRate@SoftSynthMIDIDevice@@MEAAXXZ:PROC ; SoftSynthMIDIDevice::CalcTickRate + Line 84: EXTRN ?OpenStream@SoftSynthMIDIDevice@@IEAAHHHP6AXPEAX@Z0@Z:PROC ; SoftSynthMIDIDevice::OpenStream + Line 85: EXTRN ?ServiceStream@SoftSynthMIDIDevice@@MEAA_NPEAXH@Z:PROC ; SoftSynthMIDIDevice::ServiceStream + Line 86: EXTRN ?MIDIDeviceChanged@@YAXH_N@Z:PROC ; MIDIDeviceChanged + Line 87: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 88: EXTRN ?free_global_mblock@TimidityPlus@@YAHXZ:PROC ; TimidityPlus::free_global_mblock + Line 89: EXTRN ??0Instruments@TimidityPlus@@QEAA@XZ:PROC ; TimidityPlus::Instruments::Instruments + Line 90: EXTRN ?load@Instruments@TimidityPlus@@QEAA_NPEBD@Z:PROC ; TimidityPlus::Instruments::load + Line 91: EXTRN ??1Instruments@TimidityPlus@@QEAA@XZ:PROC ; TimidityPlus::Instruments::~Instruments + Line 92: EXTRN ?PrecacheInstruments@Instruments@TimidityPlus@@QEAAXPEBGH@Z:PROC ; TimidityPlus::Instruments::PrecacheInstruments + Line 93: EXTRN ??0Player@TimidityPlus@@QEAA@PEAVInstruments@1@@Z:PROC ; TimidityPlus::Player::Player + Line 94: EXTRN ??1Player@TimidityPlus@@QEAA@XZ:PROC ; TimidityPlus::Player::~Player + Line 95: EXTRN ?playmidi_stream_init@Player@TimidityPlus@@QEAAXXZ:PROC ; TimidityPlus::Player::playmidi_stream_init + Line 96: EXTRN ?compute_data@Player@TimidityPlus@@QEAAHPEAMH@Z:PROC ; TimidityPlus::Player::compute_data + Line 97: EXTRN ?send_event@Player@TimidityPlus@@QEAAHHHH@Z:PROC ; TimidityPlus::Player::send_event + Line 98: EXTRN ?send_long_event@Player@TimidityPlus@@QEAAXPEBEH@Z:PROC ; TimidityPlus::Player::send_long_event + Line 99: EXTRN ?free_gauss_table@TimidityPlus@@YAXXZ:PROC ; TimidityPlus::free_gauss_table + Line 100: EXTRN ?set_playback_rate@TimidityPlus@@YAXH@Z:PROC ; TimidityPlus::set_playback_rate + Line 101: EXTRN ??_ETimidityPPMIDIDevice@@UEAAPEAXI@Z:PROC ; TimidityPPMIDIDevice::`vector deleting destructor' + Line 102: EXTRN __CxxFrameHandler3:PROC + Line 103: EXTRN memcmp:PROC + Line 104: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 105: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\music_wavewriter_mididevice.cod (25 hits) + Line 31: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 32: EXTRN __std_terminate:PROC + Line 33: EXTRN _errno:PROC + Line 34: EXTRN strerror:PROC + Line 35: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 36: EXTRN ?Open@FileWriter@@SAPEAV1@PEBD@Z:PROC ; FileWriter::Open + Line 37: EXTRN ?PrepareHeader@MIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; MIDIDevice::PrepareHeader + Line 38: EXTRN ?UnprepareHeader@MIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; MIDIDevice::UnprepareHeader + Line 39: EXTRN ?FakeVolume@MIDIDevice@@UEAA_NXZ:PROC ; MIDIDevice::FakeVolume + Line 40: EXTRN ?InitPlayback@MIDIDevice@@UEAAXXZ:PROC ; MIDIDevice::InitPlayback + Line 41: EXTRN ?Update@MIDIDevice@@UEAA_NXZ:PROC ; MIDIDevice::Update + Line 42: EXTRN ?PrecacheInstruments@MIDIDevice@@UEAAXPEBGH@Z:PROC ; MIDIDevice::PrecacheInstruments + Line 43: EXTRN ?FluidSettingInt@MIDIDevice@@UEAAXPEBDH@Z:PROC ; MIDIDevice::FluidSettingInt + Line 44: EXTRN ?FluidSettingNum@MIDIDevice@@UEAAXPEBDN@Z:PROC ; MIDIDevice::FluidSettingNum + Line 45: EXTRN ?FluidSettingStr@MIDIDevice@@UEAAXPEBD0@Z:PROC ; MIDIDevice::FluidSettingStr + Line 46: EXTRN ?WildMidiSetOption@MIDIDevice@@UEAAXHH@Z:PROC ; MIDIDevice::WildMidiSetOption + Line 47: EXTRN ?Preprocess@MIDIDevice@@UEAA_NPEAVMIDIStreamer@@_N@Z:PROC ; MIDIDevice::Preprocess + Line 48: EXTRN ?GetStats@MIDIDevice@@UEAA?AVFString@@XZ:PROC ; MIDIDevice::GetStats + Line 49: EXTRN ??0SoftSynthMIDIDevice@@QEAA@HHH@Z:PROC ; SoftSynthMIDIDevice::SoftSynthMIDIDevice + Line 50: EXTRN ??1SoftSynthMIDIDevice@@UEAA@XZ:PROC ; SoftSynthMIDIDevice::~SoftSynthMIDIDevice + Line 51: EXTRN ?Close@SoftSynthMIDIDevice@@UEAAXXZ:PROC ; SoftSynthMIDIDevice::Close + Line 52: EXTRN ?Pause@SoftSynthMIDIDevice@@UEAA_N_N@Z:PROC ; SoftSynthMIDIDevice::Pause + Line 53: EXTRN ??_EMIDIWaveWriter@@UEAAPEAXI@Z:PROC ; MIDIWaveWriter::`vector deleting destructor' + Line 54: EXTRN __CxxFrameHandler3:PROC + Line 55: EXTRN __chkstk:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\music_wildmidi_mididevice.cod (54 hits) + Line 13: EXTRN ?currSong@@3PEAVMusInfo@@EA:QWORD ; currSong + Line 54: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 55: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 56: EXTRN atexit:PROC + Line 57: EXTRN __std_terminate:PROC + Line 58: EXTRN stricmp:PROC + Line 59: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 60: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 61: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 62: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 63: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 64: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 65: EXTRN ??0FStringCVar@@QEAA@PEBD0IP6AXAEAV0@@Z@Z:PROC ; FStringCVar::FStringCVar + Line 66: EXTRN ??1FStringCVar@@UEAA@XZ:PROC ; FStringCVar::~FStringCVar + Line 67: EXTRN ?WildMidi_Init@@YAHPEBDGG@Z:PROC ; WildMidi_Init + Line 68: EXTRN ?WildMidi_Shutdown@@YAHXZ:PROC ; WildMidi_Shutdown + Line 69: EXTRN ?WildMidi_GetSampleRate@@YAHXZ:PROC ; WildMidi_GetSampleRate + Line 70: EXTRN ??0WildMidi_Renderer@@QEAA@XZ:PROC ; WildMidi_Renderer::WildMidi_Renderer + Line 71: EXTRN ??1WildMidi_Renderer@@QEAA@XZ:PROC ; WildMidi_Renderer::~WildMidi_Renderer + Line 72: EXTRN ?ShortEvent@WildMidi_Renderer@@QEAAXHHH@Z:PROC ; WildMidi_Renderer::ShortEvent + Line 73: EXTRN ?LongEvent@WildMidi_Renderer@@QEAAXPEBEH@Z:PROC ; WildMidi_Renderer::LongEvent + Line 74: EXTRN ?ComputeOutput@WildMidi_Renderer@@QEAAXPEAMH@Z:PROC ; WildMidi_Renderer::ComputeOutput + Line 75: EXTRN ?LoadInstrument@WildMidi_Renderer@@QEAAXHHH@Z:PROC ; WildMidi_Renderer::LoadInstrument + Line 76: EXTRN ?GetVoiceCount@WildMidi_Renderer@@QEAAHXZ:PROC ; WildMidi_Renderer::GetVoiceCount + Line 77: EXTRN ?SetOption@WildMidi_Renderer@@QEAAXHH@Z:PROC ; WildMidi_Renderer::SetOption + Line 78: EXTRN ?PrepareHeader@MIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; MIDIDevice::PrepareHeader + Line 79: EXTRN ?UnprepareHeader@MIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; MIDIDevice::UnprepareHeader + Line 80: EXTRN ?FakeVolume@MIDIDevice@@UEAA_NXZ:PROC ; MIDIDevice::FakeVolume + Line 81: EXTRN ?InitPlayback@MIDIDevice@@UEAAXXZ:PROC ; MIDIDevice::InitPlayback + Line 82: EXTRN ?Update@MIDIDevice@@UEAA_NXZ:PROC ; MIDIDevice::Update + Line 83: EXTRN ?FluidSettingInt@MIDIDevice@@UEAAXPEBDH@Z:PROC ; MIDIDevice::FluidSettingInt + Line 84: EXTRN ?FluidSettingNum@MIDIDevice@@UEAAXPEBDN@Z:PROC ; MIDIDevice::FluidSettingNum + Line 85: EXTRN ?FluidSettingStr@MIDIDevice@@UEAAXPEBD0@Z:PROC ; MIDIDevice::FluidSettingStr + Line 86: EXTRN ?Preprocess@MIDIDevice@@UEAA_NPEAVMIDIStreamer@@_N@Z:PROC ; MIDIDevice::Preprocess + Line 87: EXTRN ??0SoftSynthMIDIDevice@@QEAA@HHH@Z:PROC ; SoftSynthMIDIDevice::SoftSynthMIDIDevice + Line 88: EXTRN ??1SoftSynthMIDIDevice@@UEAA@XZ:PROC ; SoftSynthMIDIDevice::~SoftSynthMIDIDevice + Line 89: EXTRN ?Close@SoftSynthMIDIDevice@@UEAAXXZ:PROC ; SoftSynthMIDIDevice::Close + Line 90: EXTRN ?IsOpen@SoftSynthMIDIDevice@@UEBA_NXZ:PROC ; SoftSynthMIDIDevice::IsOpen + Line 91: EXTRN ?GetTechnology@SoftSynthMIDIDevice@@UEBAHXZ:PROC ; SoftSynthMIDIDevice::GetTechnology + Line 92: EXTRN ?SetTempo@SoftSynthMIDIDevice@@UEAAHH@Z:PROC ; SoftSynthMIDIDevice::SetTempo + Line 93: EXTRN ?SetTimeDiv@SoftSynthMIDIDevice@@UEAAHH@Z:PROC ; SoftSynthMIDIDevice::SetTimeDiv + Line 94: EXTRN ?StreamOut@SoftSynthMIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; SoftSynthMIDIDevice::StreamOut + Line 95: EXTRN ?StreamOutSync@SoftSynthMIDIDevice@@UEAAHPEAUMidiHeader@@@Z:PROC ; SoftSynthMIDIDevice::StreamOutSync + Line 96: EXTRN ?Resume@SoftSynthMIDIDevice@@UEAAHXZ:PROC ; SoftSynthMIDIDevice::Resume + Line 97: EXTRN ?Stop@SoftSynthMIDIDevice@@UEAAXXZ:PROC ; SoftSynthMIDIDevice::Stop + Line 98: EXTRN ?Pause@SoftSynthMIDIDevice@@UEAA_N_N@Z:PROC ; SoftSynthMIDIDevice::Pause + Line 99: EXTRN ?CalcTickRate@SoftSynthMIDIDevice@@MEAAXXZ:PROC ; SoftSynthMIDIDevice::CalcTickRate + Line 100: EXTRN ?OpenStream@SoftSynthMIDIDevice@@IEAAHHHP6AXPEAX@Z0@Z:PROC ; SoftSynthMIDIDevice::OpenStream + Line 101: EXTRN ?ServiceStream@SoftSynthMIDIDevice@@MEAA_NPEAXH@Z:PROC ; SoftSynthMIDIDevice::ServiceStream + Line 102: EXTRN ??_EWildMIDIDevice@@UEAAPEAXI@Z:PROC ; WildMIDIDevice::`vector deleting destructor' + Line 103: EXTRN ?MIDIDeviceChanged@@YAXH_N@Z:PROC ; MIDIDeviceChanged + Line 104: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 105: EXTRN __CxxFrameHandler3:PROC + Line 106: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\music_win_mididevice.cod (45 hits) + Line 79: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 80: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 81: EXTRN atexit:PROC + Line 82: EXTRN strncmp:PROC + Line 83: EXTRN __imp_CloseHandle:PROC + Line 84: EXTRN __imp_SetEvent:PROC + Line 85: EXTRN __imp_ResetEvent:PROC + Line 86: EXTRN __imp_WaitForSingleObject:PROC + Line 87: EXTRN __imp_CreateEventA:PROC + Line 88: EXTRN __imp_Sleep:PROC + Line 89: EXTRN __imp_WaitForMultipleObjects:PROC + Line 90: EXTRN __imp_CreateThread:PROC + Line 91: EXTRN __imp_GetCurrentThread:PROC + Line 92: EXTRN __imp_SetThreadPriority:PROC + Line 93: EXTRN __imp_GetExitCodeThread:PROC + Line 94: EXTRN __imp_midiStreamOpen:PROC + Line 95: EXTRN __imp_midiStreamClose:PROC + Line 96: EXTRN __imp_midiStreamProperty:PROC + Line 97: EXTRN __imp_midiStreamOut:PROC + Line 98: EXTRN __imp_midiStreamRestart:PROC + Line 99: EXTRN __imp_midiStreamStop:PROC + Line 100: EXTRN __imp_midiOutGetDevCapsA:PROC + Line 101: EXTRN __imp_midiOutGetVolume:PROC + Line 102: EXTRN __imp_midiOutSetVolume:PROC + Line 103: EXTRN __imp_midiOutPrepareHeader:PROC + Line 104: EXTRN __imp_midiOutUnprepareHeader:PROC + Line 105: EXTRN __imp_midiOutShortMsg:PROC + Line 106: EXTRN __imp_midiOutReset:PROC + Line 107: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 108: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 109: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 110: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 111: EXTRN ??0MIDIDevice@@QEAA@XZ:PROC ; MIDIDevice::MIDIDevice + Line 112: EXTRN ??1MIDIDevice@@UEAA@XZ:PROC ; MIDIDevice::~MIDIDevice + Line 113: EXTRN ?FluidSettingInt@MIDIDevice@@UEAAXPEBDH@Z:PROC ; MIDIDevice::FluidSettingInt + Line 114: EXTRN ?FluidSettingNum@MIDIDevice@@UEAAXPEBDN@Z:PROC ; MIDIDevice::FluidSettingNum + Line 115: EXTRN ?FluidSettingStr@MIDIDevice@@UEAAXPEBD0@Z:PROC ; MIDIDevice::FluidSettingStr + Line 116: EXTRN ?WildMidiSetOption@MIDIDevice@@UEAAXHH@Z:PROC ; MIDIDevice::WildMidiSetOption + Line 117: EXTRN ?Preprocess@MIDIDevice@@UEAA_NPEAVMIDIStreamer@@_N@Z:PROC ; MIDIDevice::Preprocess + Line 118: EXTRN ?GetStats@MIDIDevice@@UEAA?AVFString@@XZ:PROC ; MIDIDevice::GetStats + Line 119: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 120: EXTRN ??_EWinMIDIDevice@@UEAAPEAXI@Z:PROC ; WinMIDIDevice::`vector deleting destructor' + Line 121: EXTRN __CxxFrameHandler3:PROC + Line 122: EXTRN memset:PROC + Line 123: EXTRN __ImageBase:BYTE + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\musicblock.cod (11 hits) + Line 34: EXTRN atexit:PROC + Line 35: EXTRN ?WriteFrequency@OPLio@@QEAAXIIII@Z:PROC ; OPLio::WriteFrequency + Line 36: EXTRN ?WriteVolume@OPLio@@QEAAXIPEAUGenMidiVoice@@III@Z:PROC ; OPLio::WriteVolume + Line 37: EXTRN ?WritePan@OPLio@@QEAAXIPEAUGenMidiVoice@@H@Z:PROC ; OPLio::WritePan + Line 38: EXTRN ?WriteTremolo@OPLio@@QEAAXIPEAUGenMidiVoice@@_N@Z:PROC ; OPLio::WriteTremolo + Line 39: EXTRN ?WriteInstrument@OPLio@@QEAAXIPEAUGenMidiVoice@@_N@Z:PROC ; OPLio::WriteInstrument + Line 40: EXTRN ?MuteChannel@OPLio@@QEAAXI@Z:PROC ; OPLio::MuteChannel + Line 41: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 42: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 43: EXTRN memset:PROC + Line 44: EXTRN __ImageBase:BYTE + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\name.cod (12 hits) + Line 4760: EXTRN atexit:PROC + Line 4761: EXTRN __std_terminate:PROC + Line 4762: EXTRN stricmp:PROC + Line 4763: EXTRN strnicmp:PROC + Line 4764: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 4765: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 4766: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 4767: EXTRN ?MakeKey@@YAIPEBD@Z:PROC ; MakeKey + Line 4768: EXTRN ?MakeKey@@YAIPEBD_K@Z:PROC ; MakeKey + Line 4769: EXTRN ?C_ClearTabCommands@@YAXXZ:PROC ; C_ClearTabCommands + Line 4770: EXTRN __CxxFrameHandler3:PROC + Line 4771: EXTRN memset:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\nodebuild.cod (27 hits) + Line 49: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 50: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 51: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 52: EXTRN __std_terminate:PROC + Line 53: EXTRN qsort:PROC + Line 54: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 55: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 56: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 57: EXTRN ??0FEventTree@@QEAA@XZ:PROC ; FEventTree::FEventTree + Line 58: EXTRN ??1FEventTree@@QEAA@XZ:PROC ; FEventTree::~FEventTree + Line 59: EXTRN ?DeleteAll@FEventTree@@QEAAXXZ:PROC ; FEventTree::DeleteAll + Line 60: EXTRN ??0FVertexMap@FNodeBuilder@@QEAA@AEAV1@HHHH@Z:PROC ; FNodeBuilder::FVertexMap::FVertexMap + Line 61: EXTRN ??0FVertexMapSimple@FNodeBuilder@@QEAA@AEAV1@@Z:PROC ; FNodeBuilder::FVertexMapSimple::FVertexMapSimple + Line 62: EXTRN ?FindUsedVertices@FNodeBuilder@@AEAAXPEAUvertex_t@@H@Z:PROC ; FNodeBuilder::FindUsedVertices + Line 63: EXTRN ?MakeSegsFromSides@FNodeBuilder@@AEAAXXZ:PROC ; FNodeBuilder::MakeSegsFromSides + Line 64: EXTRN ?GroupSegPlanes@FNodeBuilder@@AEAAXXZ:PROC ; FNodeBuilder::GroupSegPlanes + Line 65: EXTRN ?GroupSegPlanesSimple@FNodeBuilder@@AEAAXXZ:PROC ; FNodeBuilder::GroupSegPlanesSimple + Line 66: EXTRN ?FindPolyContainers@FNodeBuilder@@AEAAXAEAV?$TArray@UFPolyStart@FNodeBuilder@@U12@@@0@Z:PROC ; FNodeBuilder::FindPolyContainers + Line 67: EXTRN ?AddSegToBBox@FNodeBuilder@@AEAAXQEAHPEBUFPrivSeg@1@@Z:PROC ; FNodeBuilder::AddSegToBBox + Line 68: EXTRN ?ClassifyLine@FNodeBuilder@@AEAAHAEAUnode_t@@PEBUFPrivVert@1@1QEAH@Z:PROC ; FNodeBuilder::ClassifyLine + Line 69: EXTRN ?FixSplitSharers@FNodeBuilder@@AEAAXAEBUnode_t@@@Z:PROC ; FNodeBuilder::FixSplitSharers + Line 70: EXTRN ?AddIntersection@FNodeBuilder@@AEAANAEBUnode_t@@H@Z:PROC ; FNodeBuilder::AddIntersection + Line 71: EXTRN ?AddMinisegs@FNodeBuilder@@AEAAXAEBUnode_t@@IAEAI1@Z:PROC ; FNodeBuilder::AddMinisegs + Line 72: EXTRN ?AddMiniseg@FNodeBuilder@@AEAAIHHIII@Z:PROC ; FNodeBuilder::AddMiniseg + Line 73: EXTRN __CxxFrameHandler3:PROC + Line 74: EXTRN memset:PROC + Line 75: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\nodebuild_classify_nosse2.cod (1 hit) + Line 14: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\nodebuild_events.cod (7 hits) + Line 25: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 26: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 27: EXTRN __stdio_common_vsprintf:PROC + Line 28: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 29: EXTRN c_sqrt:PROC + Line 30: EXTRN __CxxFrameHandler3:PROC + Line 31: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\nodebuild_extract.cod (11 hits) + Line 25: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 26: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 27: EXTRN __std_terminate:PROC + Line 28: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 29: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 30: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 31: EXTRN ?PointToAngle@FNodeBuilder@@SAIHH@Z:PROC ; FNodeBuilder::PointToAngle + Line 32: EXTRN __CxxFrameHandler3:PROC + Line 33: EXTRN memcpy:PROC + Line 34: EXTRN memset:PROC + Line 35: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\nodebuild_gl.cod (10 hits) + Line 18: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 19: EXTRN ?GetMinimum@FEventTree@@QEAAPEAUFEvent@@XZ:PROC ; FEventTree::GetMinimum + Line 20: EXTRN ?GetNewNode@FEventTree@@QEAAPEAUFEvent@@XZ:PROC ; FEventTree::GetNewNode + Line 21: EXTRN ?Insert@FEventTree@@QEAAXPEAUFEvent@@@Z:PROC ; FEventTree::Insert + Line 22: EXTRN ?FindEvent@FEventTree@@QEBAPEAUFEvent@@N@Z:PROC ; FEventTree::FindEvent + Line 23: EXTRN ?Successor@FEventTree@@AEBAPEAUFEvent@@PEAU2@@Z:PROC ; FEventTree::Successor + Line 24: EXTRN ?Predecessor@FEventTree@@AEBAPEAUFEvent@@PEAU2@@Z:PROC ; FEventTree::Predecessor + Line 25: EXTRN ?PointToAngle@FNodeBuilder@@SAIHH@Z:PROC ; FNodeBuilder::PointToAngle + Line 26: EXTRN ?SplitSeg@FNodeBuilder@@AEAAIIHH@Z:PROC ; FNodeBuilder::SplitSeg + Line 27: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\nodebuild_utility.cod (20 hits) + Line 57: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 58: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 59: EXTRN _purecall:PROC + Line 60: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 61: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 62: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 63: EXTRN ??_V@YAXPEAX_K@Z:PROC ; operator delete[] + Line 64: EXTRN __std_terminate:PROC + Line 65: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 66: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 67: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 68: EXTRN c_atan2:PROC + Line 69: EXTRN ??_EIVertexMap@FNodeBuilder@@UEAAPEAXI@Z:PROC ; FNodeBuilder::IVertexMap::`vector deleting destructor' + Line 70: EXTRN ??_EFVertexMap@FNodeBuilder@@UEAAPEAXI@Z:PROC ; FNodeBuilder::FVertexMap::`vector deleting destructor' + Line 71: EXTRN ??_EFVertexMapSimple@FNodeBuilder@@UEAAPEAXI@Z:PROC ; FNodeBuilder::FVertexMapSimple::`vector deleting destructor' + Line 72: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 73: EXTRN __CxxFrameHandler3:PROC + Line 74: EXTRN __chkstk:PROC + Line 75: EXTRN memset:PROC + Line 76: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\nuked_opl3.cod (12 hits) + Line 43: EXTRN _purecall:PROC + Line 44: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 45: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 46: EXTRN ??_EOPLChipBase@@UEAAPEAXI@Z:PROC ; OPLChipBase::`vector deleting destructor' + Line 47: EXTRN ??_E?$OPLChipBaseT@VNukedOPL3@@@@UEAAPEAXI@Z:PROC ; OPLChipBaseT::`vector deleting destructor' + Line 48: EXTRN ??_ENukedOPL3@@UEAAPEAXI@Z:PROC ; NukedOPL3::`vector deleting destructor' + Line 49: EXTRN OPL3_Generate:PROC + Line 50: EXTRN OPL3_Reset:PROC + Line 51: EXTRN OPL3_WriteRegBuffered:PROC + Line 52: EXTRN OPL3_WritePan:PROC + Line 53: EXTRN __CxxFrameHandler3:PROC + Line 54: EXTRN memset:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\nuked_opl3_v174.cod (12 hits) + Line 43: EXTRN _purecall:PROC + Line 44: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 45: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 46: EXTRN ??_EOPLChipBase@@UEAAPEAXI@Z:PROC ; OPLChipBase::`vector deleting destructor' + Line 47: EXTRN ??_E?$OPLChipBaseT@VNukedOPL3v174@@@@UEAAPEAXI@Z:PROC ; OPLChipBaseT::`vector deleting destructor' + Line 48: EXTRN ??_ENukedOPL3v174@@UEAAPEAXI@Z:PROC ; NukedOPL3v174::`vector deleting destructor' + Line 49: EXTRN OPL3v17_Generate:PROC + Line 50: EXTRN OPL3v17_Reset:PROC + Line 51: EXTRN OPL3v17_WritePan:PROC + Line 52: EXTRN OPL3v17_WriteReg:PROC + Line 53: EXTRN __CxxFrameHandler3:PROC + Line 54: EXTRN memset:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\nuked_opn2.cod (12 hits) + Line 43: EXTRN _purecall:PROC + Line 44: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 45: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 46: EXTRN ??_EOPNChipBase@@UEAAPEAXI@Z:PROC ; OPNChipBase::`vector deleting destructor' + Line 47: EXTRN ??_E?$OPNChipBaseT@VNukedOPN2@@@@UEAAPEAXI@Z:PROC ; OPNChipBaseT::`vector deleting destructor' + Line 48: EXTRN ??_ENukedOPN2@@UEAAPEAXI@Z:PROC ; NukedOPN2::`vector deleting destructor' + Line 49: EXTRN OPN2_Reset:PROC + Line 50: EXTRN OPN2_SetChipType:PROC + Line 51: EXTRN OPN2_WritePan:PROC + Line 52: EXTRN OPN2_WriteBuffered:PROC + Line 53: EXTRN OPN2_Generate:PROC + Line 54: EXTRN __CxxFrameHandler3:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\nukedopl3.cod (8 hits) + Line 80: EXTRN _purecall:PROC + Line 81: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 82: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 83: EXTRN ??_EOPLEmul@@UEAAPEAXI@Z:PROC ; OPLEmul::`vector deleting destructor' + Line 84: EXTRN ??_ENukedOPL3@0@UEAAPEAXI@Z:PROC ; NukedOPL3::NukedOPL3::`vector deleting destructor' + Line 85: EXTRN memset:PROC + Line 86: EXTRN __ImageBase:BYTE + Line 87: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\nukedopl3_174.cod (2 hits) + Line 24: EXTRN memset:PROC + Line 25: EXTRN __ImageBase:BYTE + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\oalsound.cod (101 hits) + Line 827: EXTRN _purecall:PROC + Line 828: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 829: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 830: EXTRN atexit:PROC + Line 831: EXTRN __std_terminate:PROC + Line 832: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 833: EXTRN terminate:PROC + Line 834: EXTRN __std_exception_copy:PROC + Line 835: EXTRN __std_exception_destroy:PROC + Line 836: EXTRN ??_Eexception@std@@UEAAPEAXI@Z:PROC ; std::exception::`vector deleting destructor' + Line 837: EXTRN strchr:PROC + Line 838: EXTRN strrchr:PROC + Line 839: EXTRN strstr:PROC + Line 840: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 841: EXTRN _Thrd_start:PROC + Line 842: EXTRN _Xtime_get_ticks:PROC + Line 843: EXTRN _Query_perf_counter:PROC + Line 844: EXTRN _Query_perf_frequency:PROC + Line 845: EXTRN ??_Eruntime_error@std@@UEAAPEAXI@Z:PROC ; std::runtime_error::`vector deleting destructor' + Line 846: EXTRN ?_Execute_once@std@@YAHAEAUonce_flag@1@P6AHPEAX1PEAPEAX@Z1@Z:PROC ; std::_Execute_once + Line 847: EXTRN ??_E_System_error@std@@UEAAPEAXI@Z:PROC ; std::_System_error::`vector deleting destructor' + Line 848: EXTRN ??_Esystem_error@std@@UEAAPEAXI@Z:PROC ; std::system_error::`vector deleting destructor' + Line 849: EXTRN ?_Syserror_map@std@@YAPEBDH@Z:PROC ; std::_Syserror_map + Line 850: EXTRN ??_E_Generic_error_category@std@@UEAAPEAXI@Z:PROC ; std::_Generic_error_category::`vector deleting destructor' + Line 851: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 852: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 853: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 854: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 855: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 856: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 857: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 858: EXTRN ?AppendFormat@FString@@QEAAXPEBDZZ:PROC ; FString::AppendFormat + Line 859: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 860: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 861: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 862: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 863: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 864: EXTRN ??0FStringCVar@@QEAA@PEBD0IP6AXAEAV0@@Z@Z:PROC ; FStringCVar::FStringCVar + Line 865: EXTRN ??1FStringCVar@@UEAA@XZ:PROC ; FStringCVar::~FStringCVar + Line 866: EXTRN _Thrd_join:PROC + Line 867: EXTRN _Thrd_id:PROC + Line 868: EXTRN _Mtx_init:PROC + Line 869: EXTRN _Mtx_destroy:PROC + Line 870: EXTRN _Mtx_init_in_situ:PROC + Line 871: EXTRN _Mtx_destroy_in_situ:PROC + Line 872: EXTRN _Mtx_current_owns:PROC + Line 873: EXTRN _Mtx_lock:PROC + Line 874: EXTRN _Mtx_unlock:PROC + Line 875: EXTRN _Cnd_init:PROC + Line 876: EXTRN _Cnd_destroy:PROC + Line 877: EXTRN _Cnd_init_in_situ:PROC + Line 878: EXTRN _Cnd_destroy_in_situ:PROC + Line 879: EXTRN _Cnd_wait:PROC + Line 880: EXTRN _Cnd_timedwait:PROC + Line 881: EXTRN _Cnd_broadcast:PROC + Line 882: EXTRN _Cnd_signal:PROC + Line 883: EXTRN _Cnd_do_broadcast_at_thread_exit:PROC + Line 884: EXTRN ?_Throw_C_error@std@@YAXH@Z:PROC ; std::_Throw_C_error + Line 885: EXTRN ?_Throw_Cpp_error@std@@YAXH@Z:PROC ; std::_Throw_Cpp_error + Line 886: EXTRN c_sqrt:PROC + Line 887: EXTRN ?FindLoopTags@@YAXAEAVFileReader@@PEAIPEA_N12@Z:PROC ; FindLoopTags + Line 888: EXTRN ?GetSampleTypeName@@YAPEBDW4SampleType@@@Z:PROC ; GetSampleTypeName + Line 889: EXTRN ?GetChannelConfigName@@YAPEBDW4ChannelConfig@@@Z:PROC ; GetChannelConfigName + Line 890: EXTRN ??1SoundStream@@UEAA@XZ:PROC ; SoundStream::~SoundStream + Line 891: EXTRN ?SetPosition@SoundStream@@UEAA_NI@Z:PROC ; SoundStream::SetPosition + Line 892: EXTRN ?SetOrder@SoundStream@@UEAA_NH@Z:PROC ; SoundStream::SetOrder + Line 893: EXTRN ?GetStats@SoundStream@@UEAA?AVFString@@XZ:PROC ; SoundStream::GetStats + Line 894: EXTRN ??_ESoundStream@@UEAAPEAXI@Z:PROC ; SoundStream::`vector deleting destructor' + Line 895: EXTRN ??0SoundRenderer@@QEAA@XZ:PROC ; SoundRenderer::SoundRenderer + Line 896: EXTRN ??1SoundRenderer@@UEAA@XZ:PROC ; SoundRenderer::~SoundRenderer + Line 897: EXTRN ?DecodeSample@SoundRenderer@@UEAAPEAFHPEBXHW4ECodecType@@@Z:PROC ; SoundRenderer::DecodeSample + Line 898: EXTRN ?DrawWaveDebug@SoundRenderer@@UEAAXH@Z:PROC ; SoundRenderer::DrawWaveDebug + Line 899: EXTRN ?CreateDecoder@SoundRenderer@@SAPEAUSoundDecoder@@AEAVFileReader@@@Z:PROC ; SoundRenderer::CreateDecoder + Line 900: EXTRN ?S_ChannelEnded@@YAXPEAUFISoundChannel@@@Z:PROC ; S_ChannelEnded + Line 901: EXTRN ?S_GetChannel@@YAPEAUFISoundChannel@@PEAX@Z:PROC ; S_GetChannel + Line 902: EXTRN ?S_FindEnvironment@@YAPEAUReverbContainer@@H@Z:PROC ; S_FindEnvironment + Line 903: EXTRN ?OpenMemory@FileReader@@QEAA_NPEBX_J@Z:PROC ; FileReader::OpenMemory + Line 904: EXTRN ??_EOpenALSoundRenderer@@UEAAPEAXI@Z:PROC ; OpenALSoundRenderer::`vector deleting destructor' + Line 905: EXTRN ?AddCommandString@@YAXPEBDH@Z:PROC ; AddCommandString + Line 906: EXTRN ?Load@FModule@@QEAA_NV?$initializer_list@PEBD@std@@@Z:PROC ; FModule::Load + Line 907: EXTRN ?Unload@FModule@@QEAAXXZ:PROC ; FModule::Unload + Line 908: EXTRN ?NicePath@@YA?AVFString@@PEBD@Z:PROC ; NicePath + Line 909: EXTRN ??_EOpenALSoundStream@@UEAAPEAXI@Z:PROC ; OpenALSoundStream::`vector deleting destructor' + Line 910: EXTRN _CxxThrowException:PROC + Line 911: EXTRN __CxxFrameHandler3:PROC + Line 912: EXTRN __libm_sse2_sincosf_:PROC + Line 913: EXTRN memcpy:PROC + Line 914: EXTRN memmove:PROC + Line 915: EXTRN pow:PROC + Line 916: EXTRN powf:PROC + Line 917: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 918: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 919: EXTRN ?DefaultEnvironments@@3PAPEAUReverbContainer@@A:BYTE ; DefaultEnvironments + Line 920: EXTRN ?S_SoundCurve@@3V?$TArray@EE@@A:BYTE ; S_SoundCurve + Line 921: EXTRN ?Channels@@3PEAUFSoundChan@@EA:QWORD ; Channels + Line 922: EXTRN ?snd_channels@@3VFIntCVar@@A:BYTE ; snd_channels + Line 923: EXTRN ?snd_samplerate@@3VFIntCVar@@A:BYTE ; snd_samplerate + Line 924: EXTRN ?snd_waterreverb@@3VFBoolCVar@@A:BYTE ; snd_waterreverb + Line 925: EXTRN ?snd_pitched@@3VFBoolCVar@@A:BYTE ; snd_pitched + Line 926: EXTRN ?snd_hrtf@@3VFIntCVar@@A:BYTE ; snd_hrtf + Line 927: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\olddecorations.cod (39 hits) + Line 126: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 127: EXTRN __std_terminate:PROC + Line 128: EXTRN strtoll:PROC + Line 129: EXTRN strchr:PROC + Line 130: EXTRN strtok:PROC + Line 131: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 132: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 133: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 134: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 135: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 136: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 137: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 138: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 139: EXTRN ?SetAction@FState@@QEAAXPEBD@Z:PROC ; FState::SetAction + Line 140: EXTRN ?FindState@PClassActor@@QEBAPEAUFState@@HPEAVFName@@_N@Z:PROC ; PClassActor::FindState + Line 141: EXTRN ?GetSpriteIndex@@YAHPEBD_N@Z:PROC ; GetSpriteIndex + Line 142: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 143: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 144: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 145: EXTRN ?MustGetFloat@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetFloat + Line 146: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 147: EXTRN ?MustMatchString@FScanner@@QEAAHPEBQEBD_K@Z:PROC ; FScanner::MustMatchString + Line 148: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 149: EXTRN ??0FScriptPosition@@QEAA@AEBU0@@Z:PROC ; FScriptPosition::FScriptPosition + Line 150: EXTRN ??0FScriptPosition@@QEAA@AEAVFScanner@@@Z:PROC ; FScriptPosition::FScriptPosition + Line 151: EXTRN ?SetStateLabel@FStateDefinitions@@QEAAXPEBDPEAUFState@@E@Z:PROC ; FStateDefinitions::SetStateLabel + Line 152: EXTRN ?InstallStates@FStateDefinitions@@QEAAXPEAVPClassActor@@PEAVAActor@@@Z:PROC ; FStateDefinitions::InstallStates + Line 153: EXTRN ?MakeStateDefines@FStateDefinitions@@QEAAXPEBVPClassActor@@@Z:PROC ; FStateDefinitions::MakeStateDefines + Line 154: EXTRN ?SaveStateSourceLines@@YAXPEAUFState@@AEAV?$TArray@UFScriptPosition@@U1@@@@Z:PROC ; SaveStateSourceLines + Line 155: EXTRN ?HandleActorFlag@@YAXAEAVFScanner@@AEAUBaggage@@PEBD2H@Z:PROC ; HandleActorFlag + Line 156: EXTRN ?DecoDerivedClass@@YAPEAVPClassActor@@AEBUFScriptPosition@@PEAV1@VFName@@@Z:PROC ; DecoDerivedClass + Line 157: EXTRN __CxxFrameHandler3:PROC + Line 158: EXTRN memcpy:PROC + Line 159: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 160: EXTRN ?ClassDataAllocator@@3VFMemArena@@A:BYTE ; ClassDataAllocator + Line 161: EXTRN ?LegacyRenderStyles@@3PATFRenderStyle@@A:BYTE ; LegacyRenderStyles + Line 162: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 163: EXTRN ?TypeString@@3PEAVPString@@EA:QWORD ; TypeString + Line 164: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\opl.cod (15 hits) + Line 74: EXTRN _purecall:PROC + Line 75: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 76: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 77: EXTRN atexit:PROC + Line 78: EXTRN ??_EOPLEmul@@UEAAPEAXI@Z:PROC ; OPLEmul::`vector deleting destructor' + Line 79: EXTRN ??0FRandom@@QEAA@XZ:PROC ; FRandom::FRandom + Line 80: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 81: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 82: EXTRN ??_EDBOPL@@UEAAPEAXI@Z:PROC ; DBOPL::`vector deleting destructor' + Line 83: EXTRN __chkstk:PROC + Line 84: EXTRN memset:PROC + Line 85: EXTRN pow:PROC + Line 86: EXTRN sin:PROC + Line 87: EXTRN __ImageBase:BYTE + Line 88: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\opl_mus_player.cod (30 hits) + Line 42: EXTRN _purecall:PROC + Line 43: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 44: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 45: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 46: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 47: EXTRN __std_terminate:PROC + Line 48: EXTRN ?CreateCriticalSection@@YAPEAVFInternalCriticalSection@@XZ:PROC ; CreateCriticalSection + Line 49: EXTRN ?DeleteCriticalSection@@YAXPEAVFInternalCriticalSection@@@Z:PROC ; DeleteCriticalSection + Line 50: EXTRN ?EnterCriticalSection@@YAXPEAVFInternalCriticalSection@@@Z:PROC ; EnterCriticalSection + Line 51: EXTRN ?LeaveCriticalSection@@YAXPEAVFInternalCriticalSection@@@Z:PROC ; LeaveCriticalSection + Line 52: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 53: EXTRN ??1OPLio@@UEAA@XZ:PROC ; OPLio::~OPLio + Line 54: EXTRN ?Init@OPLio@@UEAAHI_N0@Z:PROC ; OPLio::Init + Line 55: EXTRN ?Reset@OPLio@@UEAAXXZ:PROC ; OPLio::Reset + Line 56: EXTRN ?WriteRegister@OPLio@@UEAAXHIE@Z:PROC ; OPLio::WriteRegister + Line 57: EXTRN ?SetClockRate@OPLio@@UEAAXN@Z:PROC ; OPLio::SetClockRate + Line 58: EXTRN ?WriteDelay@OPLio@@UEAAXH@Z:PROC ; OPLio::WriteDelay + Line 59: EXTRN ??_EOPLio@@UEAAPEAXI@Z:PROC ; OPLio::`vector deleting destructor' + Line 60: EXTRN ??0DiskWriterIO@@QEAA@PEBD@Z:PROC ; DiskWriterIO::DiskWriterIO + Line 61: EXTRN ??0musicBlock@@QEAA@XZ:PROC ; musicBlock::musicBlock + Line 62: EXTRN ??1musicBlock@@QEAA@XZ:PROC ; musicBlock::~musicBlock + Line 63: EXTRN ?resetAllControllers@musicBlock@@QEAAXH@Z:PROC ; musicBlock::resetAllControllers + Line 64: EXTRN ?stopAllVoices@musicBlock@@QEAAXXZ:PROC ; musicBlock::stopAllVoices + Line 65: EXTRN ??_EOPLmusicBlock@@UEAAPEAXI@Z:PROC ; OPLmusicBlock::`vector deleting destructor' + Line 66: EXTRN ??_EOPLmusicFile@@UEAAPEAXI@Z:PROC ; OPLmusicFile::`vector deleting destructor' + Line 67: EXTRN __CxxFrameHandler3:PROC + Line 68: EXTRN memcpy:PROC + Line 69: EXTRN memset:PROC + Line 70: EXTRN ?opl_numchips@@3VFIntCVar@@A:BYTE ; opl_numchips + Line 71: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\OPL3.cod (28 hits) + Line 339: EXTRN _purecall:PROC + Line 340: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 341: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 342: EXTRN atexit:PROC + Line 343: EXTRN __std_terminate:PROC + Line 344: EXTRN ??_EOPLEmul@@UEAAPEAXI@Z:PROC ; OPLEmul::`vector deleting destructor' + Line 345: EXTRN ??0FRandom@@QEAA@XZ:PROC ; FRandom::FRandom + Line 346: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 347: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 348: EXTRN ??_EChannel@JavaOPL3@@UEAAPEAXI@Z:PROC ; JavaOPL3::Channel::`vector deleting destructor' + Line 349: EXTRN ??_EChannel2op@JavaOPL3@@UEAAPEAXI@Z:PROC ; JavaOPL3::Channel2op::`vector deleting destructor' + Line 350: EXTRN ??_EChannel4op@JavaOPL3@@UEAAPEAXI@Z:PROC ; JavaOPL3::Channel4op::`vector deleting destructor' + Line 351: EXTRN ??_EDisabledChannel@JavaOPL3@@UEAAPEAXI@Z:PROC ; JavaOPL3::DisabledChannel::`vector deleting destructor' + Line 352: EXTRN ??_ERhythmChannel@JavaOPL3@@UEAAPEAXI@Z:PROC ; JavaOPL3::RhythmChannel::`vector deleting destructor' + Line 353: EXTRN ??_EHighHatSnareDrumChannel@JavaOPL3@@UEAAPEAXI@Z:PROC ; JavaOPL3::HighHatSnareDrumChannel::`vector deleting destructor' + Line 354: EXTRN ??_ETomTomTopCymbalChannel@JavaOPL3@@UEAAPEAXI@Z:PROC ; JavaOPL3::TomTomTopCymbalChannel::`vector deleting destructor' + Line 355: EXTRN ??_EBassDrumChannel@JavaOPL3@@UEAAPEAXI@Z:PROC ; JavaOPL3::BassDrumChannel::`vector deleting destructor' + Line 356: EXTRN ??_EOPL3@JavaOPL3@@UEAAPEAXI@Z:PROC ; JavaOPL3::OPL3::`vector deleting destructor' + Line 357: EXTRN __CxxFrameHandler3:PROC + Line 358: EXTRN floor:PROC + Line 359: EXTRN log:PROC + Line 360: EXTRN log10:PROC + Line 361: EXTRN memset:PROC + Line 362: EXTRN pow:PROC + Line 363: EXTRN sin:PROC + Line 364: EXTRN sqrt:PROC + Line 365: EXTRN __ImageBase:BYTE + Line 366: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\oplio.cod (11 hits) + Line 28: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 29: EXTRN ??_EOPLio@@UEAAPEAXI@Z:PROC ; OPLio::`vector deleting destructor' + Line 30: EXTRN ?YM3812Create@@YAPEAVOPLEmul@@_N@Z:PROC ; YM3812Create + Line 31: EXTRN ?DBOPLCreate@@YAPEAVOPLEmul@@_N@Z:PROC ; DBOPLCreate + Line 32: EXTRN ?JavaOPLCreate@@YAPEAVOPLEmul@@_N@Z:PROC ; JavaOPLCreate + Line 33: EXTRN ?NukedOPL3Create@@YAPEAVOPLEmul@@_N@Z:PROC ; NukedOPL3Create + Line 34: EXTRN cos:PROC + Line 35: EXTRN sin:PROC + Line 36: EXTRN ?current_opl_core@@3HA:DWORD ; current_opl_core + Line 37: EXTRN __ImageBase:BYTE + Line 38: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\opnmidi.cod (52 hits) + Line 152: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 153: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 154: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 155: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 156: EXTRN __std_terminate:PROC + Line 157: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 158: EXTRN free:PROC + Line 159: EXTRN malloc:PROC + Line 160: EXTRN ??2@YAPEAX_KAEBUnothrow_t@std@@@Z:PROC ; operator new + Line 161: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 162: EXTRN ?cvt_OPNI_to_FMIns@@YAXAEAUopnInstMeta2@@AEBUOPN2_Instrument@@@Z:PROC ; cvt_OPNI_to_FMIns + Line 163: EXTRN ?cvt_FMIns_to_OPNI@@YAXAEAUOPN2_Instrument@@AEBUopnInstMeta2@@@Z:PROC ; cvt_FMIns_to_OPNI + Line 164: EXTRN ??1OPN2@@QEAA@XZ:PROC ; OPN2::~OPN2 + Line 165: EXTRN ?setupLocked@OPN2@@QEAA_NXZ:PROC ; OPN2::setupLocked + Line 166: EXTRN ?commitLFOSetup@OPN2@@QEAAXXZ:PROC ; OPN2::commitLFOSetup + Line 167: EXTRN ?setVolumeScaleModel@OPN2@@QEAAXW4OPNMIDI_VolumeModels@@@Z:PROC ; OPN2::setVolumeScaleModel + Line 168: EXTRN ?getVolumeScaleModel@OPN2@@QEAA?AW4OPNMIDI_VolumeModels@@XZ:PROC ; OPN2::getVolumeScaleModel + Line 169: EXTRN ??0OPNMIDIplay@@QEAA@K@Z:PROC ; OPNMIDIplay::OPNMIDIplay + Line 170: EXTRN ?partialReset@OPNMIDIplay@@QEAAXXZ:PROC ; OPNMIDIplay::partialReset + Line 171: EXTRN ?resetMIDI@OPNMIDIplay@@QEAAXXZ:PROC ; OPNMIDIplay::resetMIDI + Line 172: EXTRN ?getErrorString@OPNMIDIplay@@QEAAAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ:PROC ; OPNMIDIplay::getErrorString + Line 173: EXTRN ?setErrorString@OPNMIDIplay@@QEAAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z:PROC ; OPNMIDIplay::setErrorString + Line 174: EXTRN ?LoadBank@OPNMIDIplay@@QEAA_NAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z:PROC ; OPNMIDIplay::LoadBank + Line 175: EXTRN ?LoadBank@OPNMIDIplay@@QEAA_NPEBX_K@Z:PROC ; OPNMIDIplay::LoadBank + Line 176: EXTRN ?TickIterators@OPNMIDIplay@@QEAAXN@Z:PROC ; OPNMIDIplay::TickIterators + Line 177: EXTRN ?realTime_ResetState@OPNMIDIplay@@QEAAXXZ:PROC ; OPNMIDIplay::realTime_ResetState + Line 178: EXTRN ?realTime_NoteOn@OPNMIDIplay@@QEAA_NEEE@Z:PROC ; OPNMIDIplay::realTime_NoteOn + Line 179: EXTRN ?realTime_NoteOff@OPNMIDIplay@@QEAAXEE@Z:PROC ; OPNMIDIplay::realTime_NoteOff + Line 180: EXTRN ?realTime_NoteAfterTouch@OPNMIDIplay@@QEAAXEEE@Z:PROC ; OPNMIDIplay::realTime_NoteAfterTouch + Line 181: EXTRN ?realTime_ChannelAfterTouch@OPNMIDIplay@@QEAAXEE@Z:PROC ; OPNMIDIplay::realTime_ChannelAfterTouch + Line 182: EXTRN ?realTime_Controller@OPNMIDIplay@@QEAAXEEE@Z:PROC ; OPNMIDIplay::realTime_Controller + Line 183: EXTRN ?realTime_PatchChange@OPNMIDIplay@@QEAAXEE@Z:PROC ; OPNMIDIplay::realTime_PatchChange + Line 184: EXTRN ?realTime_PitchBend@OPNMIDIplay@@QEAAXEG@Z:PROC ; OPNMIDIplay::realTime_PitchBend + Line 185: EXTRN ?realTime_PitchBend@OPNMIDIplay@@QEAAXEEE@Z:PROC ; OPNMIDIplay::realTime_PitchBend + Line 186: EXTRN ?realTime_BankChangeLSB@OPNMIDIplay@@QEAAXEE@Z:PROC ; OPNMIDIplay::realTime_BankChangeLSB + Line 187: EXTRN ?realTime_BankChangeMSB@OPNMIDIplay@@QEAAXEE@Z:PROC ; OPNMIDIplay::realTime_BankChangeMSB + Line 188: EXTRN ?realTime_BankChange@OPNMIDIplay@@QEAAXEG@Z:PROC ; OPNMIDIplay::realTime_BankChange + Line 189: EXTRN ?setDeviceId@OPNMIDIplay@@QEAAXE@Z:PROC ; OPNMIDIplay::setDeviceId + Line 190: EXTRN ?realTime_SysEx@OPNMIDIplay@@QEAA_NPEBE_K@Z:PROC ; OPNMIDIplay::realTime_SysEx + Line 191: EXTRN ?realTime_panic@OPNMIDIplay@@QEAAXXZ:PROC ; OPNMIDIplay::realTime_panic + Line 192: EXTRN ?describeChannels@OPNMIDIplay@@QEAAXPEAD0_K@Z:PROC ; OPNMIDIplay::describeChannels + Line 193: EXTRN ?opn2_isEmulatorAvailable@@YA_NH@Z:PROC ; opn2_isEmulatorAvailable + Line 194: EXTRN _CxxThrowException:PROC + Line 195: EXTRN __CxxFrameHandler3:PROC + Line 196: EXTRN __chkstk:PROC + Line 197: EXTRN memcpy:PROC + Line 198: EXTRN memmove:PROC + Line 199: EXTRN memset:PROC + Line 200: EXTRN ?nothrow@std@@3Unothrow_t@1@B:BYTE ; std::nothrow + Line 201: EXTRN ?OPN2MIDI_ErrorString@@3V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@A:BYTE ; OPN2MIDI_ErrorString + Line 202: EXTRN __ImageBase:BYTE + Line 203: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\opnmidi_load.cod (25 hits) + Line 42: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 43: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 44: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 45: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 46: EXTRN __std_terminate:PROC + Line 47: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 48: EXTRN __imp_MultiByteToWideChar:PROC + Line 49: EXTRN free:PROC + Line 50: EXTRN malloc:PROC + Line 51: EXTRN _wfopen:PROC + Line 52: EXTRN fclose:PROC + Line 53: EXTRN fread:PROC + Line 54: EXTRN fseek:PROC + Line 55: EXTRN ftell:PROC + Line 56: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 57: EXTRN ?applySetup@OPNMIDIplay@@QEAAXXZ:PROC ; OPNMIDIplay::applySetup + Line 58: EXTRN WOPN_Free:PROC + Line 59: EXTRN WOPN_LoadBankFromMem:PROC + Line 60: EXTRN _CxxThrowException:PROC + Line 61: EXTRN __CxxFrameHandler3:PROC + Line 62: EXTRN __chkstk:PROC + Line 63: EXTRN memcpy:PROC + Line 64: EXTRN memmove:PROC + Line 65: EXTRN memset:PROC + Line 66: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\opnmidi_midiplay.cod (29 hits) + Line 182: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 183: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 184: EXTRN __std_terminate:PROC + Line 185: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 186: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 187: EXTRN ??0OPN2@@QEAA@XZ:PROC ; OPN2::OPN2 + Line 188: EXTRN ??1OPN2@@QEAA@XZ:PROC ; OPN2::~OPN2 + Line 189: EXTRN ?noteOff@OPN2@@QEAAX_K@Z:PROC ; OPN2::noteOff + Line 190: EXTRN ?noteOn@OPN2@@QEAAX_KN@Z:PROC ; OPN2::noteOn + Line 191: EXTRN ?touchNote@OPN2@@QEAAX_KEE@Z:PROC ; OPN2::touchNote + Line 192: EXTRN ?setPatch@OPN2@@QEAAX_KAEBUopnInstData@@@Z:PROC ; OPN2::setPatch + Line 193: EXTRN ?setPan@OPN2@@QEAAX_KE@Z:PROC ; OPN2::setPan + Line 194: EXTRN ?setVolumeScaleModel@OPN2@@QEAAXW4OPNMIDI_VolumeModels@@@Z:PROC ; OPN2::setVolumeScaleModel + Line 195: EXTRN ?reset@OPN2@@QEAAXHKPEAX@Z:PROC ; OPN2::reset + Line 196: EXTRN ?opn2_getLowestEmulator@@YAHXZ:PROC ; opn2_getLowestEmulator + Line 197: EXTRN _CxxThrowException:PROC + Line 198: EXTRN __CxxFrameHandler3:PROC + Line 199: EXTRN __chkstk:PROC + Line 200: EXTRN exp:PROC + Line 201: EXTRN log:PROC + Line 202: EXTRN memcmp:PROC + Line 203: EXTRN memcpy:PROC + Line 204: EXTRN memmove:PROC + Line 205: EXTRN memset:PROC + Line 206: EXTRN pow:PROC + Line 207: EXTRN sin:PROC + Line 208: EXTRN ?m_emptyInstrument@OPN2@@2UopnInstMeta2@@B:BYTE ; OPN2::m_emptyInstrument + Line 209: EXTRN __ImageBase:BYTE + Line 210: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\opnmidi_opn2.cod (19 hits) + Line 61: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 62: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 63: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 64: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 65: EXTRN __std_terminate:PROC + Line 66: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 67: EXTRN abort:PROC + Line 68: EXTRN round:PROC + Line 69: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 70: EXTRN ??0NukedOPN2@@QEAA@XZ:PROC ; NukedOPN2::NukedOPN2 + Line 71: EXTRN ??0MameOPN2@@QEAA@XZ:PROC ; MameOPN2::MameOPN2 + Line 72: EXTRN ??0GensOPN2@@QEAA@XZ:PROC ; GensOPN2::GensOPN2 + Line 73: EXTRN _CxxThrowException:PROC + Line 74: EXTRN __CxxFrameHandler3:PROC + Line 75: EXTRN __chkstk:PROC + Line 76: EXTRN memcpy:PROC + Line 77: EXTRN memmove:PROC + Line 78: EXTRN memset:PROC + Line 79: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\opnmidi_private.cod (3 hits) + Line 10: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 11: EXTRN atexit:PROC + Line 12: EXTRN _invalid_parameter_noinfo_noreturn:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_3dfloors.cod (20 hits) + Line 45: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 46: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 47: EXTRN atexit:PROC + Line 48: EXTRN __std_terminate:PROC + Line 49: EXTRN strtoll:PROC + Line 50: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 51: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 52: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 53: EXTRN ?TriggerSectorActions@sector_t@@QEAA_NPEAVAActor@@H@Z:PROC ; sector_t::TriggerSectorActions + Line 54: EXTRN ?GetTerrain@@YAHPEBUsector_t@@H@Z:PROC ; GetTerrain + Line 55: EXTRN ?P_PlayerInSpecialSector@@YAXPEAVplayer_t@@PEAUsector_t@@@Z:PROC ; P_PlayerInSpecialSector + Line 56: EXTRN ?P_PlayerOnSpecialFlat@@YAXPEAVplayer_t@@H@Z:PROC ; P_PlayerOnSpecialFlat + Line 57: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 58: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 59: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 60: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 61: EXTRN __CxxFrameHandler3:PROC + Line 62: EXTRN memmove:PROC + Line 63: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 64: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_3dmidtex.cod (15 hits) + Line 22: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 23: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 24: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 25: EXTRN ?P_ChangeSector@@YA_NPEAUsector_t@@HNH_N1@Z:PROC ; P_ChangeSector + Line 26: EXTRN ?RowOffset@FTexCoordInfo@@QEBAMM@Z:PROC ; FTexCoordInfo::RowOffset + Line 27: EXTRN ?GetFromTexture@FTexCoordInfo@@QEAAXPEAVFTexture@@MM_N@Z:PROC ; FTexCoordInfo::GetFromTexture + Line 28: EXTRN ?SetInterpolation@side_t@@QEAAPEAVDInterpolation@@H@Z:PROC ; side_t::SetInterpolation + Line 29: EXTRN ?LineHasID@FTagManager@@AEBA_NPEBUline_t@@H@Z:PROC ; FTagManager::LineHasID + Line 30: EXTRN ?Next@FSectorTagIterator@@QEAAHXZ:PROC ; FSectorTagIterator::Next + Line 31: EXTRN ?Next@FLineIdIterator@@QEAAHXZ:PROC ; FLineIdIterator::Next + Line 32: EXTRN memset:PROC + Line 33: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 34: EXTRN ?DefaultTerrainType@@3GA:WORD ; DefaultTerrainType + Line 35: EXTRN ?TerrainTypes@@3VFTerrainTypeArray@@A:BYTE ; TerrainTypes + Line 36: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_acs.cod (291 hits) + Line 32: EXTRN ?RegistrationInfo@DObject@@2UClassReg@@A:BYTE ; DObject::RegistrationInfo + Line 33: EXTRN ?RegistrationInfo@DThinker@@2UClassReg@@A:BYTE ; DThinker::RegistrationInfo + Line 34: EXTRN ??_EStat_ACS@@UEAAPEAXI@Z:PROC ; Stat_ACS::`vector deleting destructor' + Line 521: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 522: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 523: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 524: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 525: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 526: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 527: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 528: EXTRN ??_V@YAXPEAX_K@Z:PROC ; operator delete[] + Line 529: EXTRN atexit:PROC + Line 530: EXTRN __std_terminate:PROC + Line 531: EXTRN qsort:PROC + Line 532: EXTRN strtol:PROC + Line 533: EXTRN strtoll:PROC + Line 534: EXTRN strncmp:PROC + Line 535: EXTRN stricmp:PROC + Line 536: EXTRN strnicmp:PROC + Line 537: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 538: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 539: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 540: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 541: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_K_N@Z:PROC ; FName::NameManager::FindName + Line 542: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 543: EXTRN ??0FString@@QEAA@PEBD_K@Z:PROC ; FString::FString + Line 544: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 545: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 546: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 547: EXTRN ??YFString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator+= + Line 548: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 549: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 550: EXTRN ?ToUpper@FString@@QEAAXXZ:PROC ; FString::ToUpper + Line 551: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 552: EXTRN ?AppendFormat@FString@@QEAAXPEBDZZ:PROC ; FString::AppendFormat + Line 553: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 554: EXTRN ??0FStringf@@QEAA@PEBDZZ:PROC ; FStringf::FStringf + Line 555: EXTRN ?SuperFastHash@@YAIPEBD_K@Z:PROC ; SuperFastHash + Line 556: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 557: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 558: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 559: EXTRN mysnprintf:PROC + Line 560: EXTRN c_atan2:PROC + Line 561: EXTRN c_sqrt:PROC + Line 562: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 563: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 564: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 565: EXTRN ?Barrier@GC@@YAXPEAVDObject@@0@Z:PROC ; GC::Barrier + Line 566: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 567: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 568: EXTRN ??1DObject@@UEAA@XZ:PROC ; DObject::~DObject + Line 569: EXTRN ?Serialize@DObject@@UEAAXAEAVFSerializer@@@Z:PROC ; DObject::Serialize + Line 570: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 571: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 572: EXTRN ?PropagateMark@DObject@@UEAA_KXZ:PROC ; DObject::PropagateMark + Line 573: EXTRN ?FindSymbol@PClass@@QEBAPEAVPSymbol@@VFName@@_N@Z:PROC ; PClass::FindSymbol + Line 574: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 575: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 576: EXTRN ?P_MoveThing@@YA_NPEAVAActor@@AEBU?$TVector3@N@@_N@Z:PROC ; P_MoveThing + Line 577: EXTRN ?P_Thing_SetVelocity@@YAXPEAVAActor@@AEBU?$TVector3@N@@_N2@Z:PROC ; P_Thing_SetVelocity + Line 578: EXTRN ?P_Thing_CanRaise@@YA_NPEAVAActor@@@Z:PROC ; P_Thing_CanRaise + Line 579: EXTRN ?P_GetSpawnableType@@YAPEAVPClassActor@@H@Z:PROC ; P_GetSpawnableType + Line 580: EXTRN ?P_Thing_CheckInputNum@@YAHPEAVplayer_t@@H@Z:PROC ; P_Thing_CheckInputNum + Line 581: EXTRN ?P_Thing_Warp@@YAHPEAVAActor@@0NNNU?$TAngle@N@@HNN1@Z:PROC ; P_Thing_Warp + Line 582: EXTRN ?P_Thing_CheckProximity@@YAHPEAVAActor@@PEAVPClass@@NHHH_N@Z:PROC ; P_Thing_CheckProximity + Line 583: EXTRN ?P_TestMobjLocation@@YAHPEAVAActor@@@Z:PROC ; P_TestMobjLocation + Line 584: EXTRN ?P_CheckSight@@YAHPEAVAActor@@0H@Z:PROC ; P_CheckSight + Line 585: EXTRN ?P_LineAttack@@YAPEAVAActor@@PEAV1@U?$TAngle@N@@N1HVFName@@2HPEAUFTranslatedLineTarget@@PEAHNNN@Z:PROC ; P_LineAttack + Line 586: EXTRN ?P_DamageMobj@@YAHPEAVAActor@@00HVFName@@HU?$TAngle@N@@@Z:PROC ; P_DamageMobj + Line 587: EXTRN ?ForceSet@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@_N@Z:PROC ; FBaseCVar::ForceSet + Line 588: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 589: EXTRN ?FindCVar@@YAPEAVFBaseCVar@@PEBDPEAPEAV1@@Z:PROC ; FindCVar + Line 590: EXTRN ?GetCVar@@YAPEAVFBaseCVar@@PEAVAActor@@PEBD@Z:PROC ; GetCVar + Line 591: EXTRN ?GetUserCVar@@YAPEAVFBaseCVar@@HPEBD@Z:PROC ; GetUserCVar + Line 592: EXTRN ?Link@FThinkerCollection@@QEAAXPEAVDThinker@@H@Z:PROC ; FThinkerCollection::Link + Line 593: EXTRN ?StaticType@DThinker@@UEBAPEAVPClass@@XZ:PROC ; DThinker::StaticType + Line 594: EXTRN ?OnDestroy@DThinker@@UEAAXXZ:PROC ; DThinker::OnDestroy + Line 595: EXTRN ??1DThinker@@UEAA@XZ:PROC ; DThinker::~DThinker + Line 596: EXTRN ?Tick@DThinker@@UEAAXXZ:PROC ; DThinker::Tick + Line 597: EXTRN ?PostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::PostBeginPlay + Line 598: EXTRN ?CallPostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::CallPostBeginPlay + Line 599: EXTRN ?PostSerialize@DThinker@@UEAAXXZ:PROC ; DThinker::PostSerialize + Line 600: EXTRN ?Serialize@DThinker@@UEAAXAEAVFSerializer@@@Z:PROC ; DThinker::Serialize + Line 601: EXTRN ?PropagateMark@DThinker@@UEAA_KXZ:PROC ; DThinker::PropagateMark + Line 602: EXTRN ??_EDThinker@@UEAAPEAXI@Z:PROC ; DThinker::`vector deleting destructor' + Line 603: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 604: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 605: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 606: EXTRN ?S_Sound@@YAXHVFSoundID@@MM@Z:PROC ; S_Sound + Line 607: EXTRN ?S_Sound@@YAXPEAVAActor@@HVFSoundID@@MM@Z:PROC ; S_Sound + Line 608: EXTRN ?S_Sound@@YAXPEBUsector_t@@HVFSoundID@@MM@Z:PROC ; S_Sound + Line 609: EXTRN ?S_PlaySound@@YAXPEAVAActor@@HVFSoundID@@MM_N@Z:PROC ; S_PlaySound + Line 610: EXTRN ?S_StopSound@@YAXPEAVAActor@@H@Z:PROC ; S_StopSound + Line 611: EXTRN ?S_IsActorPlayingSomething@@YA_NPEAVAActor@@HH@Z:PROC ; S_IsActorPlayingSomething + Line 612: EXTRN ?S_ChangeSoundVolume@@YAXPEAVAActor@@HN@Z:PROC ; S_ChangeSoundVolume + Line 613: EXTRN ?S_ChangeMusic@@YA_NPEBDH_N1@Z:PROC ; S_ChangeMusic + Line 614: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 615: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 616: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 617: EXTRN ?FindStateByString@PClassActor@@QEAAPEAUFState@@PEBD_N@Z:PROC ; PClassActor::FindStateByString + Line 618: EXTRN ?GetReplacement@PClassActor@@QEAAPEAV1@_N@Z:PROC ; PClassActor::GetReplacement + Line 619: EXTRN ??0FRemapTable@@QEAA@H@Z:PROC ; FRemapTable::FRemapTable + Line 620: EXTRN ?MakeIdentity@FRemapTable@@QEAAXXZ:PROC ; FRemapTable::MakeIdentity + Line 621: EXTRN ?UpdateNative@FRemapTable@@QEAAXXZ:PROC ; FRemapTable::UpdateNative + Line 622: EXTRN ?AddIndexRange@FRemapTable@@QEAA_NHHHH@Z:PROC ; FRemapTable::AddIndexRange + Line 623: EXTRN ?AddColorRange@FRemapTable@@QEAA_NHHHHHHHH@Z:PROC ; FRemapTable::AddColorRange + Line 624: EXTRN ?AddDesaturation@FRemapTable@@QEAA_NHHNNNNNN@Z:PROC ; FRemapTable::AddDesaturation + Line 625: EXTRN ?AddColourisation@FRemapTable@@QEAA_NHHHHH@Z:PROC ; FRemapTable::AddColourisation + Line 626: EXTRN ?AddTint@FRemapTable@@QEAA_NHHHHHH@Z:PROC ; FRemapTable::AddTint + Line 627: EXTRN ?CheckForTexture@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::CheckForTexture + Line 628: EXTRN ?GetTextureID@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::GetTextureID + Line 629: EXTRN ??0FScanner@@QEAA@H@Z:PROC ; FScanner::FScanner + Line 630: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 631: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 632: EXTRN ?FindLevelInfo@@YAPEAUlevel_info_t@@PEBD_N@Z:PROC ; FindLevelInfo + Line 633: EXTRN ?G_SkillProperty@@YAHW4ESkillProperty@@@Z:PROC ; G_SkillProperty + Line 634: EXTRN ?G_SkillName@@YAPEBDXZ:PROC ; G_SkillName + Line 635: EXTRN ??0FStat@@QEAA@PEBD@Z:PROC ; FStat::FStat + Line 636: EXTRN ??1FStat@@UEAA@XZ:PROC ; FStat::~FStat + Line 637: EXTRN ?StaticSpawn@AActor@@SAPEAV1@PEAVPClassActor@@AEBU?$TVector3@N@@W4replace_t@@_N@Z:PROC ; AActor::StaticSpawn + Line 638: EXTRN ?UseInventory@AActor@@QEAA_NPEAV1@@Z:PROC ; AActor::UseInventory + Line 639: EXTRN ?DropInventory@AActor@@QEAAPEAV1@PEAV1@H@Z:PROC ; AActor::DropInventory + Line 640: EXTRN ?CheckLocalView@AActor@@QEBA_NH@Z:PROC ; AActor::CheckLocalView + Line 641: EXTRN ?FindInventory@AActor@@QEAAPEAV1@PEAVPClassActor@@_N@Z:PROC ; AActor::FindInventory + Line 642: EXTRN ?FindInventory@AActor@@QEAAPEAV1@VFName@@_N@Z:PROC ; AActor::FindInventory + Line 643: EXTRN ?GiveInventoryType@AActor@@QEAAPEAV1@PEAVPClassActor@@@Z:PROC ; AActor::GiveInventoryType + Line 644: EXTRN ?SetShade@AActor@@QEAAXI@Z:PROC ; AActor::SetShade + Line 645: EXTRN ?IsHostile@AActor@@QEAA_NPEAV1@@Z:PROC ; AActor::IsHostile + Line 646: EXTRN ?GetSpecies@AActor@@QEAA?AVFName@@XZ:PROC ; AActor::GetSpecies + Line 647: EXTRN ?SetTranslation@AActor@@QEAAXVFName@@@Z:PROC ; AActor::SetTranslation + Line 648: EXTRN ?SetPitch@AActor@@QEAAXU?$TAngle@N@@_N1@Z:PROC ; AActor::SetPitch + Line 649: EXTRN ?SetAngle@AActor@@QEAAXU?$TAngle@N@@_N@Z:PROC ; AActor::SetAngle + Line 650: EXTRN ?SetRoll@AActor@@QEAAXU?$TAngle@N@@_N@Z:PROC ; AActor::SetRoll + Line 651: EXTRN ?GetMissileDamage@AActor@@QEAAHHH@Z:PROC ; AActor::GetMissileDamage + Line 652: EXTRN ?GetTag@AActor@@QEBAPEBDPEBD@Z:PROC ; AActor::GetTag + Line 653: EXTRN ?SetTag@AActor@@QEAAXPEBD@Z:PROC ; AActor::SetTag + Line 654: EXTRN ?AddToHash@AActor@@QEAAXXZ:PROC ; AActor::AddToHash + Line 655: EXTRN ?RemoveFromHash@AActor@@QEAAXXZ:PROC ; AActor::RemoveFromHash + Line 656: EXTRN ?IsMapActor@AActor@@QEAA_NXZ:PROC ; AActor::IsMapActor + Line 657: EXTRN ?SetState@AActor@@QEAA_NPEAUFState@@_N@Z:PROC ; AActor::SetState + Line 658: EXTRN ?ClearCounters@AActor@@QEAAXXZ:PROC ; AActor::ClearCounters + Line 659: EXTRN ?P_LinePickActor@@YAPEAVAActor@@PEAV1@U?$TAngle@N@@N1V?$TFlags@W4ActorFlag@@I@@I@Z:PROC ; P_LinePickActor + Line 660: EXTRN ?P_BulletSlope@@YA?AU?$TAngle@N@@PEAVAActor@@PEAUFTranslatedLineTarget@@H@Z:PROC ; P_BulletSlope + Line 661: EXTRN ?SetFogDensity@sector_t@@QEAAXH@Z:PROC ; sector_t::SetFogDensity + Line 662: EXTRN ?NextHighestCeilingAt@@YANPEAUsector_t@@NNNNHPEAPEAU1@PEAPEAUF3DFloor@@@Z:PROC ; NextHighestCeilingAt + Line 663: EXTRN ?NextLowestFloorAt@@YANPEAUsector_t@@NNNHNPEAPEAU1@PEAPEAUF3DFloor@@@Z:PROC ; NextLowestFloorAt + Line 664: EXTRN ?AdjustFloorClip@@YAXPEBUsector_t@@@Z:PROC ; AdjustFloorClip + Line 665: EXTRN ?P_SectorDamage@@YAXPEAUFLevelLocals@@HHVFName@@PEAVPClassActor@@H@Z:PROC ; P_SectorDamage + Line 666: EXTRN ?SectorHasTag@FTagManager@@AEBA_NPEBUsector_t@@H@Z:PROC ; FTagManager::SectorHasTag + Line 667: EXTRN ?Next@FSectorTagIterator@@QEAAHXZ:PROC ; FSectorTagIterator::Next + Line 668: EXTRN ?Next@FLineIdIterator@@QEAAHXZ:PROC ; FLineIdIterator::Next + Line 669: EXTRN ?P_StartQuakeXYZ@@YA_NPEAUFLevelLocals@@PEAVAActor@@HHHHHHHVFSoundID@@HNNNHHNN@Z:PROC ; P_StartQuakeXYZ + Line 670: EXTRN ?P_StartQuake@@YA_NPEAUFLevelLocals@@PEAVAActor@@HHHHHVFSoundID@@@Z:PROC ; P_StartQuake + Line 671: EXTRN ??_EDACSThinker@@UEAAPEAXI@Z:PROC ; DACSThinker::`vector deleting destructor' + Line 672: EXTRN ?P_ExecuteSpecial@@YAHHPEAUline_t@@PEAVAActor@@_NHHHHH@Z:PROC ; P_ExecuteSpecial + Line 673: EXTRN ?P_DropItem@@YAPEAVAActor@@PEAV1@PEAVPClassActor@@HH@Z:PROC ; P_DropItem + Line 674: EXTRN ?AddToConsole@@YAXHPEBD@Z:PROC ; AddToConsole + Line 675: EXTRN ?C_MidPrint@@YAXPEAVFFont@@PEBD@Z:PROC ; C_MidPrint + Line 676: EXTRN ?C_MidPrintBold@@YAXPEAVFFont@@PEBD@Z:PROC ; C_MidPrintBold + Line 677: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 678: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 679: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 680: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 681: EXTRN ?SN_StartSequence@@YAPEAVDSeqNode@@PEAVAActor@@PEBDH@Z:PROC ; SN_StartSequence + Line 682: EXTRN ?SN_StartSequence@@YAPEAVDSeqNode@@PEAUsector_t@@HPEBDH@Z:PROC ; SN_StartSequence + Line 683: EXTRN ?SN_StartSequence@@YAPEAVDSeqNode@@PEAUFPolyObj@@PEBDH@Z:PROC ; SN_StartSequence + Line 684: EXTRN ?V_FindFontColor@@YA?AW4EColorRange@@VFName@@@Z:PROC ; V_FindFontColor + Line 685: EXTRN ?V_GetFont@@YAPEAVFFont@@PEBD@Z:PROC ; V_GetFont + Line 686: EXTRN ??0DHUDMessage@@QEAA@PEAVFFont@@PEBDMMHHW4EColorRange@@M@Z:PROC ; DHUDMessage::DHUDMessage + Line 687: EXTRN ??0DHUDMessageFadeOut@@QEAA@PEAVFFont@@PEBDMMHHW4EColorRange@@MM@Z:PROC ; DHUDMessageFadeOut::DHUDMessageFadeOut + Line 688: EXTRN ??0DHUDMessageFadeInOut@@QEAA@PEAVFFont@@PEBDMMHHW4EColorRange@@MMM@Z:PROC ; DHUDMessageFadeInOut::DHUDMessageFadeInOut + Line 689: EXTRN ??0DHUDMessageTypeOnFadeOut@@QEAA@PEAVFFont@@PEBDMMHHW4EColorRange@@MMM@Z:PROC ; DHUDMessageTypeOnFadeOut::DHUDMessageTypeOnFadeOut + Line 690: EXTRN ?AttachMessage@DBaseStatusBar@@QEAAXPEAVDHUDMessageBase@@IH@Z:PROC ; DBaseStatusBar::AttachMessage + Line 691: EXTRN ?ShootDecal@@YAPEAVDBaseDecal@@PEAUFLevelLocals@@PEBVFDecalTemplate@@PEAUsector_t@@NNNU?$TAngle@N@@N_N@Z:PROC ; ShootDecal + Line 692: EXTRN ?Construct@DFlashFader@@QEAAXMMMMMMMMMPEAVAActor@@_N@Z:PROC ; DFlashFader::Construct + Line 693: EXTRN ?Cancel@DFlashFader@@QEAAXXZ:PROC ; DFlashFader::Cancel + Line 694: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 695: EXTRN ?ReadLump@FWadCollection@@QEAAXHPEAX@Z:PROC ; FWadCollection::ReadLump + Line 696: EXTRN ?FindLump@FWadCollection@@QEAAHPEBDPEAH_N@Z:PROC ; FWadCollection::FindLump + Line 697: EXTRN ?LumpLength@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::LumpLength + Line 698: EXTRN ?GetLumpName@FWadCollection@@QEBAXPEADH@Z:PROC ; FWadCollection::GetLumpName + Line 699: EXTRN ?GetLumpFullName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetLumpFullName + Line 700: EXTRN ?InitSkyMap@@YAXPEAUFLevelLocals@@@Z:PROC ; InitSkyMap + Line 701: EXTRN ??RFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator() + Line 702: EXTRN ?G_StartSlideshow@@YAXPEAUFLevelLocals@@VFName@@@Z:PROC ; G_StartSlideshow + Line 703: EXTRN ?GetKeysForCommand@FKeyBindings@@QEAAHPEBDPEAH1@Z:PROC ; FKeyBindings::GetKeysForCommand + Line 704: EXTRN ?strbin@@YAHPEAD@Z:PROC ; strbin + Line 705: EXTRN ?GetUDMFInt@@YAHPEAUFLevelLocals@@HHVFName@@@Z:PROC ; GetUDMFInt + Line 706: EXTRN ?GetUDMFFloat@@YANPEAUFLevelLocals@@HHVFName@@@Z:PROC ; GetUDMFFloat + Line 707: EXTRN ?PO_Busy@@YA_NPEAUFLevelLocals@@H@Z:PROC ; PO_Busy + Line 708: EXTRN ?COPY_AAPTR@@YAPEAVAActor@@PEAV1@H@Z:PROC ; COPY_AAPTR + Line 709: EXTRN ?ASSIGN_AAPTR@@YAXPEAVAActor@@H0H@Z:PROC ; ASSIGN_AAPTR + Line 710: EXTRN ?ArraySize@FSerializer@@QEAAIXZ:PROC ; FSerializer::ArraySize + Line 711: EXTRN ?BeginObject@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginObject + Line 712: EXTRN ?EndObject@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndObject + Line 713: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 714: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 715: EXTRN ?GetKey@FSerializer@@QEAAPEBDXZ:PROC ; FSerializer::GetKey + Line 716: EXTRN ?Args@FSerializer@@QEAAAEAV1@PEBDPEAH1H@Z:PROC ; FSerializer::Args + Line 717: EXTRN ?StringPtr@FSerializer@@QEAAAEAV1@PEBDAEAPEBD@Z:PROC ; FSerializer::StringPtr + Line 718: EXTRN ?ScriptNum@FSerializer@@QEAAAEAV1@PEBDAEAH@Z:PROC ; FSerializer::ScriptNum + Line 719: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEA_NPEA_N@Z:PROC ; Serialize + Line 720: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 721: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAIPEAI@Z:PROC ; Serialize + Line 722: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAGPEAG@Z:PROC ; Serialize + Line 723: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEANPEAN@Z:PROC ; Serialize + Line 724: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 725: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAVFString@@PEAV2@@Z:PROC ; Serialize + Line 726: EXTRN ??$Serialize@Usector_t@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUsector_t@@PEAPEAU1@@Z:PROC ; Serialize + Line 727: EXTRN ??$Serialize@Uline_t@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUline_t@@PEAPEAU1@@Z:PROC ; Serialize + Line 728: EXTRN ??$Serialize@VFFont@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAVFFont@@PEAPEAV1@@Z:PROC ; Serialize + Line 729: EXTRN ??$Serialize@UFLevelLocals@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUFLevelLocals@@PEAPEAU1@@Z:PROC ; Serialize + Line 730: EXTRN ?GetDecalByName@FDecalLib@@QEBAPEBVFDecalTemplate@@PEBD@Z:PROC ; FDecalLib::GetDecalByName + Line 731: EXTRN ?P_FindTerrain@@YAHVFName@@@Z:PROC ; P_FindTerrain + Line 732: EXTRN ?P_SpawnParticle@@YAXPEAUFLevelLocals@@AEBU?$TVector3@N@@11UPalEntry@@NHNNNH@Z:PROC ; P_SpawnParticle + Line 733: EXTRN ?P_MorphActor@@YA_NPEAVAActor@@0PEAVPClassActor@@1HH11@Z:PROC ; P_MorphActor + Line 734: EXTRN ?P_UnmorphActor@@YA_NPEAVAActor@@0H_N@Z:PROC ; P_UnmorphActor + Line 735: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 736: EXTRN ?VMCallWithDefaults@@YAHPEAVVMFunction@@AEAV?$TArray@UVMValue@@U1@@@PEAUVMReturn@@H@Z:PROC ; VMCallWithDefaults + Line 737: EXTRN ?ModActorFlag@@YA_NPEAVAActor@@AEBVFString@@_N2@Z:PROC ; ModActorFlag + Line 738: EXTRN ?CheckActorFlag@@YAHPEAVAActor@@PEBD_N@Z:PROC ; CheckActorFlag + Line 739: EXTRN ?P_GetHealthGroup@@YAPEAUFHealthGroup@@PEAUFLevelLocals@@H@Z:PROC ; P_GetHealthGroup + Line 740: EXTRN ?Add@FCanvasTextureInfo@@QEAAXPEAVAActor@@VFTextureID@@N@Z:PROC ; FCanvasTextureInfo::Add + Line 741: EXTRN ?SetMusicVolume@FLevelLocals@@QEAAXM@Z:PROC ; FLevelLocals::SetMusicVolume + Line 742: EXTRN ?IsTIDUsed@FLevelLocals@@QEAA_NH@Z:PROC ; FLevelLocals::IsTIDUsed + Line 743: EXTRN ?FindUniqueTID@FLevelLocals@@QEAAHHH@Z:PROC ; FLevelLocals::FindUniqueTID + Line 744: EXTRN ?AirControlChanged@FLevelLocals@@QEAAXXZ:PROC ; FLevelLocals::AirControlChanged + Line 745: EXTRN ?ReplaceTextures@FLevelLocals@@QEAAXPEBD0H@Z:PROC ; FLevelLocals::ReplaceTextures + Line 746: EXTRN ?EV_Thing_Projectile@FLevelLocals@@QEAA_NHPEAVAActor@@HPEBDU?$TAngle@N@@NNH0HH_N@Z:PROC ; FLevelLocals::EV_Thing_Projectile + Line 747: EXTRN ?EV_Thing_Damage@FLevelLocals@@QEAAHHPEAVAActor@@HVFName@@@Z:PROC ; FLevelLocals::EV_Thing_Damage + Line 748: EXTRN ?ChangeLevel@FLevelLocals@@QEAAXPEBDHHH@Z:PROC ; FLevelLocals::ChangeLevel + Line 749: EXTRN ?PointInSubsector@FLevelLocals@@AEAAPEAUsubsector_t@@NN@Z:PROC ; FLevelLocals::PointInSubsector + Line 750: EXTRN ?DescriptiveName@PType@@QEBAPEBDXZ:PROC ; PType::DescriptiveName + Line 751: EXTRN ?NewPointer@@YAPEAVPPointer@@PEAVPClass@@_N@Z:PROC ; NewPointer + Line 752: EXTRN ?Exec@ScriptUtil@@SAHVFName@@ZZ:PROC ; ScriptUtil::Exec + Line 753: EXTRN ??_EDLevelScript@@UEAAPEAXI@Z:PROC ; DLevelScript::`vector deleting destructor' + Line 754: EXTRN ??_EDPlaneWatcher@@UEAAPEAXI@Z:PROC ; DPlaneWatcher::`vector deleting destructor' + Line 755: EXTRN __CxxFrameHandler3:PROC + Line 756: EXTRN __chkstk:PROC + Line 757: EXTRN memcmp:PROC + Line 758: EXTRN memmove:PROC + Line 759: EXTRN memset:PROC + Line 760: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 761: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 762: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 763: EXTRN ?RegistrationInfo@PField@@2UClassReg@@A:BYTE ; PField::RegistrationInfo + Line 764: EXTRN ?RegistrationInfo@PFunction@@2UClassReg@@A:BYTE ; PFunction::RegistrationInfo + Line 765: EXTRN ?netgame@@3_NA:BYTE ; netgame + Line 766: EXTRN ?multiplayer@@3_NA:BYTE ; multiplayer + Line 767: EXTRN ?deathmatch@@3VFIntCVar@@A:BYTE ; deathmatch + Line 768: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 769: EXTRN ?playeringame@@3PA_NA:BYTE ; playeringame + Line 770: EXTRN ?Net_Arbitrator@@3HA:DWORD ; Net_Arbitrator + Line 771: EXTRN ?dmflags@@3VFIntCVar@@A:BYTE ; dmflags + Line 772: EXTRN ?dmflags2@@3VFIntCVar@@A:BYTE ; dmflags2 + Line 773: EXTRN ?S_sfx@@3V?$TArray@Usfxinfo_t@@U1@@@A:BYTE ; S_sfx + Line 774: EXTRN ?LegacyRenderStyles@@3PATFRenderStyle@@A:BYTE ; LegacyRenderStyles + Line 775: EXTRN ?translationtables@@3PAV?$TAutoGrowArray@VFRemapTablePtr@@PEAUFRemapTable@@@@A:BYTE ; translationtables + Line 776: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 777: EXTRN ?PerfToMillisec@@3NA:QWORD ; PerfToMillisec + Line 778: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 779: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 780: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 781: EXTRN ?NamedACSToNormalACS@@3PAEA:BYTE ; NamedACSToNormalACS + Line 782: EXTRN ?SmallFont@@3PEAVFFont@@EA:QWORD ; SmallFont + Line 783: EXTRN ?RegistrationInfo@DHUDMessage@@2UClassReg@@A:BYTE ; DHUDMessage::RegistrationInfo + Line 784: EXTRN ?RegistrationInfo@DHUDMessageFadeOut@@2UClassReg@@A:BYTE ; DHUDMessageFadeOut::RegistrationInfo + Line 785: EXTRN ?RegistrationInfo@DHUDMessageFadeInOut@@2UClassReg@@A:BYTE ; DHUDMessageFadeInOut::RegistrationInfo + Line 786: EXTRN ?RegistrationInfo@DHUDMessageTypeOnFadeOut@@2UClassReg@@A:BYTE ; DHUDMessageTypeOnFadeOut::RegistrationInfo + Line 787: EXTRN ?StatusBar@@3PEAVDBaseStatusBar@@EA:QWORD ; StatusBar + Line 788: EXTRN ?RegistrationInfo@DFlashFader@@2UClassReg@@A:BYTE ; DFlashFader::RegistrationInfo + Line 789: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 790: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 791: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 792: EXTRN ?gamestate@@3W4gamestate_t@@A:DWORD ; gamestate + Line 793: EXTRN ?Bindings@@3VFKeyBindings@@A:BYTE ; Bindings + Line 794: EXTRN ?KeyNames@@3PAPEBDA:BYTE ; KeyNames + Line 795: EXTRN ?save_full@@3_NA:BYTE ; save_full + Line 796: EXTRN ?DecalLibrary@@3VFDecalLib@@A:BYTE ; DecalLibrary + Line 797: EXTRN ?Terrains@@3V?$TArray@UFTerrainDef@@U1@@@A:BYTE ; Terrains + Line 798: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 799: EXTRN ?TypeSInt32@@3PEAVPInt@@EA:QWORD ; TypeSInt32 + Line 800: EXTRN ?TypeBool@@3PEAVPBool@@EA:QWORD ; TypeBool + Line 801: EXTRN ?TypeFloat64@@3PEAVPFloat@@EA:QWORD ; TypeFloat64 + Line 802: EXTRN ?TypeString@@3PEAVPString@@EA:QWORD ; TypeString + Line 803: EXTRN ?TypeName@@3PEAVPName@@EA:QWORD ; TypeName + Line 804: EXTRN ?TypeSound@@3PEAVPSound@@EA:QWORD ; TypeSound + Line 805: EXTRN ?TypeColor@@3PEAVPColor@@EA:QWORD ; TypeColor + Line 806: EXTRN ?sv_cheats@@3VFBoolCVar@@A:BYTE ; sv_cheats + Line 807: EXTRN __ImageBase:BYTE + Line 808: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_actionfunctions.cod (151 hits) + Line 364: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 365: EXTRN ?StateLabels@@3UFStateLabelStorage@@A:BYTE ; StateLabels + Line 366: EXTRN ?con_midtime@@3VFFloatCVar@@A:BYTE ; con_midtime + Line 367: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 368: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 369: EXTRN ?LegacyRenderStyles@@3PATFRenderStyle@@A:BYTE ; LegacyRenderStyles + Line 370: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 371: EXTRN ?Skins@@3V?$TArray@VFPlayerSkin@@V1@@@A:BYTE ; Skins + Line 372: EXTRN ?stacktrace@CVMAbortException@@2VFString@@A:QWORD ; CVMAbortException::stacktrace + Line 373: EXTRN ?RegistrationInfo@PField@@2UClassReg@@A:BYTE ; PField::RegistrationInfo + Line 374: EXTRN ?StatusBar@@3PEAVDBaseStatusBar@@EA:QWORD ; StatusBar + Line 375: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 376: EXTRN ?RegistrationInfo@DFlashFader@@2UClassReg@@A:BYTE ; DFlashFader::RegistrationInfo + Line 377: EXTRN ?SmallFont@@3PEAVFFont@@EA:QWORD ; SmallFont + Line 378: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 379: EXTRN ?playeringame@@3PA_NA:BYTE ; playeringame + Line 380: EXTRN ?TypeSInt32@@3PEAVPInt@@EA:QWORD ; TypeSInt32 + Line 381: EXTRN ?TypeUInt32@@3PEAVPInt@@EA:QWORD ; TypeUInt32 + Line 382: EXTRN ?TypeBool@@3PEAVPBool@@EA:QWORD ; TypeBool + Line 383: EXTRN ?TypeState@@3PEAVPStatePointer@@EA:QWORD ; TypeState + Line 384: EXTRN ?actionParams@@3V?$TArray@UVMValue@@U1@@@A:BYTE ; actionParams + Line 1783: EXTRN atexit:PROC + Line 1784: EXTRN __std_terminate:PROC + Line 1785: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 1786: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 1787: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 1788: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 1789: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 1790: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 1791: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 1792: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 1793: EXTRN ?AppendFormat@FString@@QEAAXPEBDZZ:PROC ; FString::AppendFormat + Line 1794: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 1795: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 1796: EXTRN c_atan2:PROC + Line 1797: EXTRN c_sqrt:PROC + Line 1798: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 1799: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 1800: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 1801: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 1802: EXTRN ?FindSymbol@PClass@@QEBAPEAVPSymbol@@VFName@@_N@Z:PROC ; PClass::FindSymbol + Line 1803: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 1804: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 1805: EXTRN ?Link@FThinkerCollection@@QEAAXPEAVDThinker@@H@Z:PROC ; FThinkerCollection::Link + Line 1806: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 1807: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 1808: EXTRN ?S_Sound@@YAXPEAVAActor@@HVFSoundID@@MM@Z:PROC ; S_Sound + Line 1809: EXTRN ?S_StopSound@@YAXPEAVAActor@@H@Z:PROC ; S_StopSound + Line 1810: EXTRN ?S_IsActorPlayingSomething@@YA_NPEAVAActor@@HH@Z:PROC ; S_IsActorPlayingSomething + Line 1811: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 1812: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 1813: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 1814: EXTRN ?CheckCallerType@FState@@QEAAXPEAVAActor@@0@Z:PROC ; FState::CheckCallerType + Line 1815: EXTRN ?StaticFindStateOwner@FState@@SAPEAVPClassActor@@PEBU1@@Z:PROC ; FState::StaticFindStateOwner + Line 1816: EXTRN ?StaticGetStateName@FState@@SA?AVFString@@PEBU1@@Z:PROC ; FState::StaticGetStateName + Line 1817: EXTRN ?FindState@PClassActor@@QEBAPEAUFState@@HPEAVFName@@_N@Z:PROC ; PClassActor::FindState + Line 1818: EXTRN ?GetReplacement@PClassActor@@QEAAPEAV1@_N@Z:PROC ; PClassActor::GetReplacement + Line 1819: EXTRN ?GetState@FStateLabelStorage@@QEAAPEAUFState@@HPEAVPClassActor@@_N@Z:PROC ; FStateLabelStorage::GetState + Line 1820: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 1821: EXTRN ?GetCVar@@YAPEAVFBaseCVar@@PEAVAActor@@PEBD@Z:PROC ; GetCVar + Line 1822: EXTRN ?StaticSpawn@AActor@@SAPEAV1@PEAVPClassActor@@AEBU?$TVector3@N@@W4replace_t@@_N@Z:PROC ; AActor::StaticSpawn + Line 1823: EXTRN ?CheckMeleeRange@AActor@@QEAA_NXZ:PROC ; AActor::CheckMeleeRange + Line 1824: EXTRN ?RestoreSpecialPosition@AActor@@QEAAXXZ:PROC ; AActor::RestoreSpecialPosition + Line 1825: EXTRN ?DropInventory@AActor@@QEAAPEAV1@PEAV1@H@Z:PROC ; AActor::DropInventory + Line 1826: EXTRN ?CheckLocalView@AActor@@QEBA_NH@Z:PROC ; AActor::CheckLocalView + Line 1827: EXTRN ?FindInventory@AActor@@QEAAPEAV1@PEAVPClassActor@@_N@Z:PROC ; AActor::FindInventory + Line 1828: EXTRN ?CopyFriendliness@AActor@@QEAAXPEAV1@_N1@Z:PROC ; AActor::CopyFriendliness + Line 1829: EXTRN ?IsFriend@AActor@@QEAA_NPEAV1@@Z:PROC ; AActor::IsFriend + Line 1830: EXTRN ?IsHostile@AActor@@QEAA_NPEAV1@@Z:PROC ; AActor::IsHostile + Line 1831: EXTRN ?GetSpecies@AActor@@QEAA?AVFName@@XZ:PROC ; AActor::GetSpecies + Line 1832: EXTRN ?SetTranslation@AActor@@QEAAXVFName@@@Z:PROC ; AActor::SetTranslation + Line 1833: EXTRN ?SpawnHealth@AActor@@QEBAHXZ:PROC ; AActor::SpawnHealth + Line 1834: EXTRN ?SetPitch@AActor@@QEAAXU?$TAngle@N@@_N1@Z:PROC ; AActor::SetPitch + Line 1835: EXTRN ?SetAngle@AActor@@QEAAXU?$TAngle@N@@_N@Z:PROC ; AActor::SetAngle + Line 1836: EXTRN ?SetRoll@AActor@@QEAAXU?$TAngle@N@@_N@Z:PROC ; AActor::SetRoll + Line 1837: EXTRN ?GetMissileDamage@AActor@@QEAAHHH@Z:PROC ; AActor::GetMissileDamage + Line 1838: EXTRN ?LinkToWorld@AActor@@QEAAXPEAUFLinkContext@@_NPEAUsector_t@@@Z:PROC ; AActor::LinkToWorld + Line 1839: EXTRN ?UnlinkFromWorld@AActor@@QEAAXPEAUFLinkContext@@@Z:PROC ; AActor::UnlinkFromWorld + Line 1840: EXTRN ?SetState@AActor@@QEAA_NPEAUFState@@_N@Z:PROC ; AActor::SetState + Line 1841: EXTRN ?ClearCounters@AActor@@QEAAXXZ:PROC ; AActor::ClearCounters + Line 1842: EXTRN ?NextHighestCeilingAt@@YANPEAUsector_t@@NNNNHPEAPEAU1@PEAPEAUF3DFloor@@@Z:PROC ; NextHighestCeilingAt + Line 1843: EXTRN ?NextLowestFloorAt@@YANPEAUsector_t@@NNNHNPEAPEAU1@PEAPEAUF3DFloor@@@Z:PROC ; NextLowestFloorAt + Line 1844: EXTRN ?HighestCeilingAt@@YANPEAUsector_t@@NNPEAPEAU1@@Z:PROC ; HighestCeilingAt + Line 1845: EXTRN ?LowestFloorAt@@YANPEAUsector_t@@NNPEAPEAU1@@Z:PROC ; LowestFloorAt + Line 1846: EXTRN ?CallTryPickup@@YA_NPEAVAActor@@0PEAPEAV1@@Z:PROC ; CallTryPickup + Line 1847: EXTRN ?strbin1@@YA?AVFString@@PEBD@Z:PROC ; strbin1 + Line 1848: EXTRN ?P_ExecuteSpecial@@YAHHPEAUline_t@@PEAVAActor@@_NHHHHH@Z:PROC ; P_ExecuteSpecial + Line 1849: EXTRN ?P_SpawnParticle@@YAXPEAUFLevelLocals@@AEBU?$TVector3@N@@11UPalEntry@@NHNNNH@Z:PROC ; P_SpawnParticle + Line 1850: EXTRN ?P_HitFriend@@YAHPEAVAActor@@@Z:PROC ; P_HitFriend + Line 1851: EXTRN ?A_Unblock@@YAXPEAVAActor@@_N@Z:PROC ; A_Unblock + Line 1852: EXTRN ?A_BossDeath@@YAXPEAVAActor@@@Z:PROC ; A_BossDeath + Line 1853: EXTRN ?A_FaceTarget@@YAXPEAVAActor@@@Z:PROC ; A_FaceTarget + Line 1854: EXTRN ?P_SeekerMissile@@YA_NPEAVAActor@@NN_N1@Z:PROC ; P_SeekerMissile + Line 1855: EXTRN ?P_SpawnPuff@@YAPEAVAActor@@PEAV1@PEAVPClassActor@@AEBU?$TVector3@N@@U?$TAngle@N@@3HH0@Z:PROC ; P_SpawnPuff + Line 1856: EXTRN ?P_SpawnBlood@@YAXAEBU?$TVector3@N@@U?$TAngle@N@@HPEAVAActor@@@Z:PROC ; P_SpawnBlood + Line 1857: EXTRN ?P_ExplodeMissile@@YAXPEAVAActor@@PEAUline_t@@0_N@Z:PROC ; P_ExplodeMissile + Line 1858: EXTRN ?P_SpawnMissileXYZ@@YAPEAVAActor@@U?$TVector3@N@@PEAV1@1PEAVPClassActor@@_N1@Z:PROC ; P_SpawnMissileXYZ + Line 1859: EXTRN ?P_SpawnMissileAngleZSpeed@@YAPEAVAActor@@PEAV1@NPEAVPClassActor@@U?$TAngle@N@@NN0_N@Z:PROC ; P_SpawnMissileAngleZSpeed + Line 1860: EXTRN ?P_RemoveThing@@YAXPEAVAActor@@@Z:PROC ; P_RemoveThing + Line 1861: EXTRN ?P_Thing_Raise@@YA_NPEAVAActor@@0H@Z:PROC ; P_Thing_Raise + Line 1862: EXTRN ?P_Thing_CanRaise@@YA_NPEAVAActor@@@Z:PROC ; P_Thing_CanRaise + Line 1863: EXTRN ?P_Thing_CheckInputNum@@YAHPEAVplayer_t@@H@Z:PROC ; P_Thing_CheckInputNum + Line 1864: EXTRN ?P_Thing_Warp@@YAHPEAVAActor@@0NNNU?$TAngle@N@@HNN1@Z:PROC ; P_Thing_Warp + Line 1865: EXTRN ?P_Thing_CheckProximity@@YAHPEAVAActor@@PEAVPClass@@NHHH_N@Z:PROC ; P_Thing_CheckProximity + Line 1866: EXTRN ?P_RoughMonsterSearch@@YAPEAVAActor@@PEAV1@H_N1@Z:PROC ; P_RoughMonsterSearch + Line 1867: EXTRN ?P_TestMobjLocation@@YAHPEAVAActor@@@Z:PROC ; P_TestMobjLocation + Line 1868: EXTRN ?P_CheckPosition@@YA_NPEAVAActor@@AEBU?$TVector2@N@@_N@Z:PROC ; P_CheckPosition + Line 1869: EXTRN ?P_TryMove@@YA_NPEAVAActor@@AEBU?$TVector2@N@@HPEBUsecplane_t@@_N@Z:PROC ; P_TryMove + Line 1870: EXTRN ?P_CheckMove@@YA_NPEAVAActor@@AEBU?$TVector2@N@@H@Z:PROC ; P_CheckMove + Line 1871: EXTRN ?P_TeleportMove@@YA_NPEAVAActor@@AEBU?$TVector3@N@@_N2@Z:PROC ; P_TeleportMove + Line 1872: EXTRN ?P_CheckSight@@YAHPEAVAActor@@0H@Z:PROC ; P_CheckSight + Line 1873: EXTRN ?P_AimLineAttack@@YA?AU?$TAngle@N@@PEAVAActor@@U1@NPEAUFTranslatedLineTarget@@1H00@Z:PROC ; P_AimLineAttack + Line 1874: EXTRN ?P_LineAttack@@YAPEAVAActor@@PEAV1@U?$TAngle@N@@N1HVFName@@2HPEAUFTranslatedLineTarget@@PEAHNNN@Z:PROC ; P_LineAttack + Line 1875: EXTRN ?P_TraceBleed@@YAXHPEAVAActor@@0@Z:PROC ; P_TraceBleed + Line 1876: EXTRN ?P_RailAttack@@YAXPEAUFRailParams@@@Z:PROC ; P_RailAttack + Line 1877: EXTRN ?P_CheckMissileSpawn@@YA_NPEAVAActor@@N@Z:PROC ; P_CheckMissileSpawn + Line 1878: EXTRN ?P_DamageMobj@@YAHPEAVAActor@@00HVFName@@HU?$TAngle@N@@@Z:PROC ; P_DamageMobj + Line 1879: EXTRN ?P_GiveBody@@YA_NPEAVAActor@@HH@Z:PROC ; P_GiveBody + Line 1880: EXTRN ?C_MidPrint@@YAXPEAVFFont@@PEBD@Z:PROC ; C_MidPrint + Line 1881: EXTRN ?C_MidPrintBold@@YAXPEAVFFont@@PEBD@Z:PROC ; C_MidPrintBold + Line 1882: EXTRN ?SprayDecal@@YAXPEAVAActor@@PEBDN@Z:PROC ; SprayDecal + Line 1883: EXTRN ?Construct@DFlashFader@@QEAAXMMMMMMMMMPEAVAActor@@_N@Z:PROC ; DFlashFader::Construct + Line 1884: EXTRN ?V_GetFont@@YAPEAVFFont@@PEBD@Z:PROC ; V_GetFont + Line 1885: EXTRN ?GetSpotWithMinMaxDistance@DSpotState@@QEAAPEAVAActor@@PEAVPClassActor@@NNNN@Z:PROC ; DSpotState::GetSpotWithMinMaxDistance + Line 1886: EXTRN ?COPY_AAPTR@@YAPEAVAActor@@PEAV1@H@Z:PROC ; COPY_AAPTR + Line 1887: EXTRN ?VerifyTargetChain@@YAXPEAVAActor@@_N@Z:PROC ; VerifyTargetChain + Line 1888: EXTRN ?VerifyMasterChain@@YAXPEAVAActor@@@Z:PROC ; VerifyMasterChain + Line 1889: EXTRN ?ASSIGN_AAPTR@@YAXPEAVAActor@@H0H@Z:PROC ; ASSIGN_AAPTR + Line 1890: EXTRN ?Trace@@YA_NAEBU?$TVector3@N@@PEAUsector_t@@0NV?$TFlags@W4ActorFlag@@I@@IPEAVAActor@@AEAUFTraceResults@@IP6A?AW4ETraceStatus@@4PEAX@Z5@Z:PROC ; Trace + Line 1891: EXTRN ??RFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator() + Line 1892: EXTRN ?FindPSprite@player_t@@QEAAPEAVDPSprite@@H@Z:PROC ; player_t::FindPSprite + Line 1893: EXTRN ??0FMultiBlockThingsIterator@@QEAA@AEAUFPortalGroupArray@@PEAUFLevelLocals@@NNNNN_NPEAUsector_t@@@Z:PROC ; FMultiBlockThingsIterator::FMultiBlockThingsIterator + Line 1894: EXTRN ?Next@FMultiBlockThingsIterator@@QEAA_NPEAUCheckResult@1@@Z:PROC ; FMultiBlockThingsIterator::Next + Line 1895: EXTRN ?GetFirstSectorTag@FTagManager@@AEBAHPEBUsector_t@@@Z:PROC ; FTagManager::GetFirstSectorTag + Line 1896: EXTRN ?P_SpawnTeleportFog@@YAXPEAVAActor@@AEBU?$TVector3@N@@_N2@Z:PROC ; P_SpawnTeleportFog + Line 1897: EXTRN ?P_StartQuakeXYZ@@YA_NPEAUFLevelLocals@@PEAVAActor@@HHHHHHHVFSoundID@@HNNNHHNN@Z:PROC ; P_StartQuakeXYZ + Line 1898: EXTRN ?P_StartQuake@@YA_NPEAUFLevelLocals@@PEAVAActor@@HHHHHVFSoundID@@@Z:PROC ; P_StartQuake + Line 1899: EXTRN ?MaybePrintMessage@CVMAbortException@@QEAAXXZ:PROC ; CVMAbortException::MaybePrintMessage + Line 1900: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 1901: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 1902: EXTRN ?ModActorFlag@@YA_NPEAVAActor@@AEBVFString@@_N2@Z:PROC ; ModActorFlag + Line 1903: EXTRN ?CheckActorFlag@@YAHPEAVAActor@@PEBD_N@Z:PROC ; CheckActorFlag + Line 1904: EXTRN ?TranslateLineDef@FLevelLocals@@QEAAXPEAUline_t@@PEAUmaplinedef_t@@H@Z:PROC ; FLevelLocals::TranslateLineDef + Line 1905: EXTRN ?GetPortalOffsetPosition@FLevelLocals@@QEAA?AU?$TVector2@N@@NNNN@Z:PROC ; FLevelLocals::GetPortalOffsetPosition + Line 1906: EXTRN ?PointInSubsector@FLevelLocals@@AEAAPEAUsubsector_t@@NN@Z:PROC ; FLevelLocals::PointInSubsector + Line 1907: EXTRN ?R_ClearPastViewer@@YAXPEAVAActor@@@Z:PROC ; R_ClearPastViewer + Line 1908: EXTRN ?GetSpotState@@YAPEAVDSpotState@@PEAUFLevelLocals@@H@Z:PROC ; GetSpotState + Line 1909: EXTRN _CxxThrowException:PROC + Line 1910: EXTRN __CxxFrameHandler3:PROC + Line 1911: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 1912: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_ceiling.cod (63 hits) + Line 18: EXTRN ?RegistrationInfo@DMovingCeiling@@2UClassReg@@A:BYTE ; DMovingCeiling::RegistrationInfo + Line 109: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 110: EXTRN __std_terminate:PROC + Line 111: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 112: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 113: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 114: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 115: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 116: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 117: EXTRN ?SN_StartSequence@@YAPEAVDSeqNode@@PEAUsector_t@@HHW4seqtype_t@@H_N@Z:PROC ; SN_StartSequence + Line 118: EXTRN ?SN_StartSequence@@YAPEAVDSeqNode@@PEAUsector_t@@HPEBDH@Z:PROC ; SN_StartSequence + Line 119: EXTRN ?SN_StartSequence@@YAPEAVDSeqNode@@PEAUsector_t@@HVFName@@H@Z:PROC ; SN_StartSequence + Line 120: EXTRN ?SN_StopSequence@@YAXPEAUsector_t@@H@Z:PROC ; SN_StopSequence + Line 121: EXTRN ?SN_IsMakingLoopingSound@@YA_NPEAUsector_t@@@Z:PROC ; SN_IsMakingLoopingSound + Line 122: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAUsecspecial_t@@PEAU2@@Z:PROC ; Serialize + Line 123: EXTRN ?MoveCeiling@sector_t@@QEAA?AW4EMoveResult@@NNHH_N@Z:PROC ; sector_t::MoveCeiling + Line 124: EXTRN ?FindHighestFloorSurrounding@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindHighestFloorSurrounding + Line 125: EXTRN ?FindLowestCeilingSurrounding@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindLowestCeilingSurrounding + Line 126: EXTRN ?FindHighestCeilingSurrounding@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindHighestCeilingSurrounding + Line 127: EXTRN ?FindNextLowestCeiling@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindNextLowestCeiling + Line 128: EXTRN ?FindNextHighestCeiling@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindNextHighestCeiling + Line 129: EXTRN ?FindHighestFloorPoint@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindHighestFloorPoint + Line 130: EXTRN ?FindShortestUpperAround@@YANPEAUsector_t@@@Z:PROC ; FindShortestUpperAround + Line 131: EXTRN ?FindModelFloorSector@@YAPEAUsector_t@@PEAU1@N@Z:PROC ; FindModelFloorSector + Line 132: EXTRN ?FindModelCeilingSector@@YAPEAUsector_t@@PEAU1@N@Z:PROC ; FindModelCeilingSector + Line 133: EXTRN ?PlaneMoving@@YAHPEAUsector_t@@H@Z:PROC ; PlaneMoving + Line 134: EXTRN ?GetSpecial@@YAXPEAUsector_t@@PEAUsecspecial_t@@@Z:PROC ; GetSpecial + Line 135: EXTRN ?SetSpecial@@YAXPEAUsector_t@@PEBUsecspecial_t@@@Z:PROC ; SetSpecial + Line 136: EXTRN ?AdjustFloorClip@@YAXPEBUsector_t@@@Z:PROC ; AdjustFloorClip + Line 137: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 138: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEANPEAN@Z:PROC ; Serialize + Line 139: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAVFTextureID@@PEAV2@@Z:PROC ; Serialize + Line 140: EXTRN ?Link@FThinkerCollection@@QEAAXPEAVDThinker@@H@Z:PROC ; FThinkerCollection::Link + Line 141: EXTRN ?StaticType@DThinker@@UEBAPEAVPClass@@XZ:PROC ; DThinker::StaticType + Line 142: EXTRN ?OnDestroy@DThinker@@UEAAXXZ:PROC ; DThinker::OnDestroy + Line 143: EXTRN ??1DThinker@@UEAA@XZ:PROC ; DThinker::~DThinker + Line 144: EXTRN ?Tick@DThinker@@UEAAXXZ:PROC ; DThinker::Tick + Line 145: EXTRN ?PostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::PostBeginPlay + Line 146: EXTRN ?CallPostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::CallPostBeginPlay + Line 147: EXTRN ?PostSerialize@DThinker@@UEAAXXZ:PROC ; DThinker::PostSerialize + Line 148: EXTRN ?Serialize@DThinker@@UEAAXAEAVFSerializer@@@Z:PROC ; DThinker::Serialize + Line 149: EXTRN ?PropagateMark@DThinker@@UEAA_KXZ:PROC ; DThinker::PropagateMark + Line 150: EXTRN ??_EDThinker@@UEAAPEAXI@Z:PROC ; DThinker::`vector deleting destructor' + Line 151: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 152: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 153: EXTRN ?StaticType@DSectorEffect@@UEBAPEAVPClass@@XZ:PROC ; DSectorEffect::StaticType + Line 154: EXTRN ?Serialize@DSectorEffect@@UEAAXAEAVFSerializer@@@Z:PROC ; DSectorEffect::Serialize + Line 155: EXTRN ?OnDestroy@DSectorEffect@@UEAAXXZ:PROC ; DSectorEffect::OnDestroy + Line 156: EXTRN ??_EDSectorEffect@@UEAAPEAXI@Z:PROC ; DSectorEffect::`vector deleting destructor' + Line 157: EXTRN ?StaticType@DMover@@UEBAPEAVPClass@@XZ:PROC ; DMover::StaticType + Line 158: EXTRN ?StopInterpolation@DMover@@QEAAX_N@Z:PROC ; DMover::StopInterpolation + Line 159: EXTRN ?Serialize@DMover@@MEAAXAEAVFSerializer@@@Z:PROC ; DMover::Serialize + Line 160: EXTRN ?OnDestroy@DMover@@MEAAXXZ:PROC ; DMover::OnDestroy + Line 161: EXTRN ??_EDMover@@UEAAPEAXI@Z:PROC ; DMover::`vector deleting destructor' + Line 162: EXTRN ?StaticType@DMovingCeiling@@UEBAPEAVPClass@@XZ:PROC ; DMovingCeiling::StaticType + Line 163: EXTRN ?Construct@DMovingCeiling@@IEAAXPEAUsector_t@@_N@Z:PROC ; DMovingCeiling::Construct + Line 164: EXTRN ??_EDMovingCeiling@@UEAAPEAXI@Z:PROC ; DMovingCeiling::`vector deleting destructor' + Line 165: EXTRN ?Next@FSectorTagIterator@@QEAAHXZ:PROC ; FSectorTagIterator::Next + Line 166: EXTRN ??_EDCeiling@@UEAAPEAXI@Z:PROC ; DCeiling::`vector deleting destructor' + Line 167: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 168: EXTRN __CxxFrameHandler3:PROC + Line 169: EXTRN __ImageBase:BYTE + Line 170: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_conversation.cod (81 hits) + Line 417: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 418: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 419: EXTRN atexit:PROC + Line 420: EXTRN __std_terminate:PROC + Line 421: EXTRN strnicmp:PROC + Line 422: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 423: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 424: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 425: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 426: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 427: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 428: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 429: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 430: EXTRN mysnprintf:PROC + Line 431: EXTRN c_atan2:PROC + Line 432: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 433: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 434: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 435: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 436: EXTRN ?FindFunction@PClass@@SAXPEAPEAVVMFunction@@VFName@@1@Z:PROC ; PClass::FindFunction + Line 437: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 438: EXTRN ?S_Sound@@YAXHVFSoundID@@MM@Z:PROC ; S_Sound + Line 439: EXTRN ?S_Sound@@YAXPEAVAActor@@HVFSoundID@@MM@Z:PROC ; S_Sound + Line 440: EXTRN ?S_StopSound@@YAXPEAVAActor@@H@Z:PROC ; S_StopSound + Line 441: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 442: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 443: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 444: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 445: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 446: EXTRN ?StaticSpawn@AActor@@SAPEAV1@PEAVPClassActor@@AEBU?$TVector3@N@@W4replace_t@@_N@Z:PROC ; AActor::StaticSpawn + Line 447: EXTRN ?FindInventory@AActor@@QEAAPEAV1@PEAVPClassActor@@_N@Z:PROC ; AActor::FindInventory + Line 448: EXTRN ?ConversationAnimation@AActor@@QEAAXH@Z:PROC ; AActor::ConversationAnimation + Line 449: EXTRN ?ClearCounters@AActor@@QEAAXXZ:PROC ; AActor::ClearCounters + Line 450: EXTRN ?P_ParseUSDF@@YA_NPEAUFLevelLocals@@HAEAVFileReader@@H@Z:PROC ; P_ParseUSDF + Line 451: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 452: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 453: EXTRN ?ReopenLumpReader@FWadCollection@@QEAA?AVFileReader@@H_N@Z:PROC ; FWadCollection::ReopenLumpReader + Line 454: EXTRN ?LumpLength@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::LumpLength + Line 455: EXTRN ?GetLumpFullName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetLumpFullName + Line 456: EXTRN ?A_FaceTarget@@YAXPEAVAActor@@@Z:PROC ; A_FaceTarget + Line 457: EXTRN ??RFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator() + Line 458: EXTRN ?I_SetMusicVolume@@YAXN@Z:PROC ; I_SetMusicVolume + Line 459: EXTRN ?ReadByte@@YAHPEAPEAE@Z:PROC ; ReadByte + Line 460: EXTRN ?ReadWord@@YAHPEAPEAE@Z:PROC ; ReadWord + Line 461: EXTRN ?Net_WriteByte@@YAXE@Z:PROC ; Net_WriteByte + Line 462: EXTRN ?Net_WriteWord@@YAXF@Z:PROC ; Net_WriteWord + Line 463: EXTRN ?AddToConsole@@YAXHPEBD@Z:PROC ; AddToConsole + Line 464: EXTRN ??0DHUDMessageFadeOut@@QEAA@PEAVFFont@@PEBDMMHHW4EColorRange@@MM@Z:PROC ; DHUDMessageFadeOut::DHUDMessageFadeOut + Line 465: EXTRN ?AttachMessage@DBaseStatusBar@@QEAAXPEAVDHUDMessageBase@@IH@Z:PROC ; DBaseStatusBar::AttachMessage + Line 466: EXTRN ?P_ExecuteSpecial@@YAHHPEAUline_t@@PEAVAActor@@_NHHHHH@Z:PROC ; P_ExecuteSpecial + Line 467: EXTRN ?CallTryPickup@@YA_NPEAVAActor@@0PEAPEAV1@@Z:PROC ; CallTryPickup + Line 468: EXTRN ?PlayIdle@@YAXPEAVAActor@@@Z:PROC ; PlayIdle + Line 469: EXTRN ?SetLogNumber@player_t@@QEAAXH@Z:PROC ; player_t::SetLogNumber + Line 470: EXTRN ?SetLogText@player_t@@QEAAXPEBD@Z:PROC ; player_t::SetLogText + Line 471: EXTRN ?M_ActivateMenu@@YAXPEAVDMenu@@@Z:PROC ; M_ActivateMenu + Line 472: EXTRN ?M_StartControlPanel@@YAX_N@Z:PROC ; M_StartControlPanel + Line 473: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 474: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 475: EXTRN ?GetVirtualIndex@@YAIPEAVPClass@@PEBD@Z:PROC ; GetVirtualIndex + Line 476: EXTRN __CxxFrameHandler3:PROC + Line 477: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 478: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 479: EXTRN ?CleanWidth@@3HA:DWORD ; CleanWidth + Line 480: EXTRN ?CleanHeight@@3HA:DWORD ; CleanHeight + Line 481: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 482: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 483: EXTRN ?SmallFont@@3PEAVFFont@@EA:QWORD ; SmallFont + Line 484: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 485: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 486: EXTRN ?gameaction@@3W4gameaction_t@@A:DWORD ; gameaction + Line 487: EXTRN ?menuactive@@3W4EMenuState@@A:DWORD ; menuactive + Line 488: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 489: EXTRN ?demoplayback@@3_NA:BYTE ; demoplayback + Line 490: EXTRN ?playeringame@@3PA_NA:BYTE ; playeringame + Line 491: EXTRN ?RegistrationInfo@DHUDMessageFadeOut@@2UClassReg@@A:BYTE ; DHUDMessageFadeOut::RegistrationInfo + Line 492: EXTRN ?StatusBar@@3PEAVDBaseStatusBar@@EA:QWORD ; StatusBar + Line 493: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 494: EXTRN ?CurrentMenu@@3PEAVDMenu@@EA:QWORD ; CurrentMenu + Line 495: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 496: EXTRN __ImageBase:BYTE + Line 497: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_destructible.cod (27 hits) + Line 322: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 323: EXTRN __std_terminate:PROC + Line 324: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 325: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 326: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 327: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 328: EXTRN c_sqrt:PROC + Line 329: EXTRN ?TriggerSectorActions@sector_t@@QEAA_NPEAVAActor@@H@Z:PROC ; sector_t::TriggerSectorActions + Line 330: EXTRN ?P_ActivateLine@@YA_NPEAUline_t@@PEAVAActor@@HHPEAU?$TVector3@N@@@Z:PROC ; P_ActivateLine + Line 331: EXTRN ?GetMissileDamage@AActor@@QEAAHHH@Z:PROC ; AActor::GetMissileDamage + Line 332: EXTRN ?Trace@@YA_NAEBU?$TVector3@N@@PEAUsector_t@@0NV?$TFlags@W4ActorFlag@@I@@IPEAVAActor@@AEAUFTraceResults@@IP6A?AW4ETraceStatus@@4PEAX@Z5@Z:PROC ; Trace + Line 333: EXTRN ?P_VanillaPointOnLineSide@@YAHNNPEBUline_t@@@Z:PROC ; P_VanillaPointOnLineSide + Line 334: EXTRN ??0FBlockLinesIterator@@QEAA@PEAUFLevelLocals@@AEBVFBoundingBox@@@Z:PROC ; FBlockLinesIterator::FBlockLinesIterator + Line 335: EXTRN ?Next@FBlockLinesIterator@@QEAAPEAUline_t@@XZ:PROC ; FBlockLinesIterator::Next + Line 336: EXTRN ?ArraySize@FSerializer@@QEAAIXZ:PROC ; FSerializer::ArraySize + Line 337: EXTRN ?BeginObject@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginObject + Line 338: EXTRN ?EndObject@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndObject + Line 339: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 340: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 341: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 342: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 343: EXTRN ?E_WorldSectorDamaged@@YAHPEAUsector_t@@PEAVAActor@@HVFName@@HU?$TVector3@N@@_N@Z:PROC ; E_WorldSectorDamaged + Line 344: EXTRN ?E_WorldLineDamaged@@YAHPEAUline_t@@PEAVAActor@@HVFName@@HU?$TVector3@N@@_N@Z:PROC ; E_WorldLineDamaged + Line 345: EXTRN __CxxFrameHandler3:PROC + Line 346: EXTRN ?skyflatnum@@3VFTextureID@@A:DWORD ; skyflatnum + Line 347: EXTRN ?splashfactor@@3VFFloatCVar@@A:BYTE ; splashfactor + Line 348: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_doors.cod (64 hits) + Line 16: EXTRN ?RegistrationInfo@DMovingCeiling@@2UClassReg@@A:BYTE ; DMovingCeiling::RegistrationInfo + Line 113: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 114: EXTRN __std_terminate:PROC + Line 115: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 116: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 117: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 118: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 119: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 120: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 121: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 122: EXTRN ?S_Sound@@YAXPEAVAActor@@HVFSoundID@@MM@Z:PROC ; S_Sound + Line 123: EXTRN ?SN_StartSequence@@YAPEAVDSeqNode@@PEAUsector_t@@HHW4seqtype_t@@H_N@Z:PROC ; SN_StartSequence + Line 124: EXTRN ?SN_StartSequence@@YAPEAVDSeqNode@@PEAUsector_t@@HPEBDH@Z:PROC ; SN_StartSequence + Line 125: EXTRN ?SN_StartSequence@@YAPEAVDSeqNode@@PEAUsector_t@@HVFName@@H@Z:PROC ; SN_StartSequence + Line 126: EXTRN ?SN_CheckSequence@@YAPEAVDSeqNode@@PEAUsector_t@@H@Z:PROC ; SN_CheckSequence + Line 127: EXTRN ?SN_StopSequence@@YAXPEAUsector_t@@H@Z:PROC ; SN_StopSequence + Line 128: EXTRN ?SN_AreModesSame@@YA_NHW4seqtype_t@@HH@Z:PROC ; SN_AreModesSame + Line 129: EXTRN ?SN_AreModesSame@@YA_NVFName@@HH@Z:PROC ; SN_AreModesSame + Line 130: EXTRN ?MoveCeiling@sector_t@@QEAA?AW4EMoveResult@@NNHH_N@Z:PROC ; sector_t::MoveCeiling + Line 131: EXTRN ?FindLowestCeilingSurrounding@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindLowestCeilingSurrounding + Line 132: EXTRN ?FindHighestFloorPoint@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindHighestFloorPoint + Line 133: EXTRN ?FindLowestCeilingPoint@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindLowestCeilingPoint + Line 134: EXTRN ?PlaneMoving@@YAHPEAUsector_t@@H@Z:PROC ; PlaneMoving + Line 135: EXTRN ?P_CheckKeys@@YAHPEAVAActor@@H_N1@Z:PROC ; P_CheckKeys + Line 136: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEA_NPEA_N@Z:PROC ; Serialize + Line 137: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 138: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEANPEAN@Z:PROC ; Serialize + Line 139: EXTRN ??$Serialize@Uline_t@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUline_t@@PEAPEAU1@@Z:PROC ; Serialize + Line 140: EXTRN ??$Serialize@Uvertex_t@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUvertex_t@@PEAPEAU1@@Z:PROC ; Serialize + Line 141: EXTRN ??$Serialize@UFDoorAnimation@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUFDoorAnimation@@PEAPEAU1@@Z:PROC ; Serialize + Line 142: EXTRN ?Link@FThinkerCollection@@QEAAXPEAVDThinker@@H@Z:PROC ; FThinkerCollection::Link + Line 143: EXTRN ?StaticType@DThinker@@UEBAPEAVPClass@@XZ:PROC ; DThinker::StaticType + Line 144: EXTRN ?OnDestroy@DThinker@@UEAAXXZ:PROC ; DThinker::OnDestroy + Line 145: EXTRN ??1DThinker@@UEAA@XZ:PROC ; DThinker::~DThinker + Line 146: EXTRN ?Tick@DThinker@@UEAAXXZ:PROC ; DThinker::Tick + Line 147: EXTRN ?PostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::PostBeginPlay + Line 148: EXTRN ?CallPostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::CallPostBeginPlay + Line 149: EXTRN ?PostSerialize@DThinker@@UEAAXXZ:PROC ; DThinker::PostSerialize + Line 150: EXTRN ?Serialize@DThinker@@UEAAXAEAVFSerializer@@@Z:PROC ; DThinker::Serialize + Line 151: EXTRN ?PropagateMark@DThinker@@UEAA_KXZ:PROC ; DThinker::PropagateMark + Line 152: EXTRN ??_EDThinker@@UEAAPEAXI@Z:PROC ; DThinker::`vector deleting destructor' + Line 153: EXTRN ?FindAnimatedDoor@FTextureManager@@QEAAPEAUFDoorAnimation@@VFTextureID@@@Z:PROC ; FTextureManager::FindAnimatedDoor + Line 154: EXTRN ?StaticType@DSectorEffect@@UEBAPEAVPClass@@XZ:PROC ; DSectorEffect::StaticType + Line 155: EXTRN ?Serialize@DSectorEffect@@UEAAXAEAVFSerializer@@@Z:PROC ; DSectorEffect::Serialize + Line 156: EXTRN ?OnDestroy@DSectorEffect@@UEAAXXZ:PROC ; DSectorEffect::OnDestroy + Line 157: EXTRN ??_EDSectorEffect@@UEAAPEAXI@Z:PROC ; DSectorEffect::`vector deleting destructor' + Line 158: EXTRN ?StaticType@DMover@@UEBAPEAVPClass@@XZ:PROC ; DMover::StaticType + Line 159: EXTRN ?Serialize@DMover@@MEAAXAEAVFSerializer@@@Z:PROC ; DMover::Serialize + Line 160: EXTRN ?OnDestroy@DMover@@MEAAXXZ:PROC ; DMover::OnDestroy + Line 161: EXTRN ??_EDMover@@UEAAPEAXI@Z:PROC ; DMover::`vector deleting destructor' + Line 162: EXTRN ?StaticType@DMovingCeiling@@UEBAPEAVPClass@@XZ:PROC ; DMovingCeiling::StaticType + Line 163: EXTRN ?Construct@DMovingCeiling@@IEAAXPEAUsector_t@@_N@Z:PROC ; DMovingCeiling::Construct + Line 164: EXTRN ??_EDMovingCeiling@@UEAAPEAXI@Z:PROC ; DMovingCeiling::`vector deleting destructor' + Line 165: EXTRN ?Next@FSectorTagIterator@@QEAAHXZ:PROC ; FSectorTagIterator::Next + Line 166: EXTRN ??_EDDoor@@UEAAPEAXI@Z:PROC ; DDoor::`vector deleting destructor' + Line 167: EXTRN ??_EDAnimatedDoor@@UEAAPEAXI@Z:PROC ; DAnimatedDoor::`vector deleting destructor' + Line 168: EXTRN ?EV_LightTurnOnPartway@FLevelLocals@@QEAAXHN@Z:PROC ; FLevelLocals::EV_LightTurnOnPartway + Line 169: EXTRN __CxxFrameHandler3:PROC + Line 170: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 171: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 172: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 173: EXTRN ?RegistrationInfo@DPlat@@2UClassReg@@A:BYTE ; DPlat::RegistrationInfo + Line 174: EXTRN __ImageBase:BYTE + Line 175: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_effect.cod (43 hits) + Line 15: EXTRN ?gamestate@@3W4gamestate_t@@A:DWORD ; gamestate + Line 16: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 282: EXTRN atexit:PROC + Line 283: EXTRN __std_terminate:PROC + Line 284: EXTRN atoi:PROC + Line 285: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 286: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 287: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 288: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 289: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 290: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 291: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 292: EXTRN c_atan2:PROC + Line 293: EXTRN c_sqrt:PROC + Line 294: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 295: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 296: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 297: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 298: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 299: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 300: EXTRN ?S_Sound@@YAXPEAVAActor@@HVFSoundID@@MM@Z:PROC ; S_Sound + Line 301: EXTRN ?S_Sound@@YAXPEAUFLevelLocals@@AEBU?$TVector3@N@@HVFSoundID@@MM@Z:PROC ; S_Sound + Line 302: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 303: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 304: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 305: EXTRN ?Pick@FColorMatcher@@QEAAEHHH@Z:PROC ; FColorMatcher::Pick + Line 306: EXTRN ?StaticSpawn@AActor@@SAPEAV1@PEAVPClassActor@@AEBU?$TVector3@N@@W4replace_t@@_N@Z:PROC ; AActor::StaticSpawn + Line 307: EXTRN ?CheckValue@FArgs@@QEBAPEBDPEBD@Z:PROC ; FArgs::CheckValue + Line 308: EXTRN ?GetPortalOffsetPosition@FLevelLocals@@QEAA?AU?$TVector2@N@@NNNN@Z:PROC ; FLevelLocals::GetPortalOffsetPosition + Line 309: EXTRN ?PointInRenderSubsector@FLevelLocals@@QEAAPEAUsubsector_t@@HH@Z:PROC ; FLevelLocals::PointInRenderSubsector + Line 310: EXTRN __CxxFrameHandler3:PROC + Line 311: EXTRN memset:PROC + Line 312: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 313: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 314: EXTRN ?M_Random@@3VFRandom@@A:BYTE ; M_Random + Line 315: EXTRN ?ColorMatcher@@3VFColorMatcher@@A:QWORD ; ColorMatcher + Line 316: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 317: EXTRN ?Args@@3PEAVFArgs@@EA:QWORD ; Args + Line 318: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 319: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 320: EXTRN ?r_viewpoint@@3UFRenderViewpoint@@A:BYTE ; r_viewpoint + Line 321: EXTRN __ImageBase:BYTE + Line 322: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_enemy.cod (96 hits) + Line 67: EXTRN ?multiplayer@@3_NA:BYTE ; multiplayer + Line 68: EXTRN ?deathmatch@@3VFIntCVar@@A:BYTE ; deathmatch + Line 69: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 70: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 71: EXTRN ?StateLabels@@3UFStateLabelStorage@@A:BYTE ; StateLabels + Line 411: EXTRN atexit:PROC + Line 412: EXTRN __std_terminate:PROC + Line 413: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 414: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 415: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 416: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 417: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 418: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 419: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 420: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 421: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 422: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 423: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 424: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 425: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 426: EXTRN c_asin:PROC + Line 427: EXTRN c_atan2:PROC + Line 428: EXTRN c_sqrt:PROC + Line 429: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 430: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 431: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 432: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 433: EXTRN ?FindFunction@PClass@@SAXPEAPEAVVMFunction@@VFName@@1@Z:PROC ; PClass::FindFunction + Line 434: EXTRN ?P_BlockmapSearch@@YAPEAVAActor@@PEAV1@HP6APEAV1@0HPEAX@Z1@Z:PROC ; P_BlockmapSearch + Line 435: EXTRN ?P_TestMobjZ@@YAHPEAVAActor@@_NPEAPEAV1@@Z:PROC ; P_TestMobjZ + Line 436: EXTRN ?P_CheckPosition@@YA_NPEAVAActor@@AEBU?$TVector2@N@@_N@Z:PROC ; P_CheckPosition + Line 437: EXTRN ?P_TryMove@@YA_NPEAVAActor@@AEBU?$TVector2@N@@HPEBUsecplane_t@@AEAUFCheckPosition@@_N@Z:PROC ; P_TryMove + Line 438: EXTRN ?P_TryMove@@YA_NPEAVAActor@@AEBU?$TVector2@N@@HPEBUsecplane_t@@_N@Z:PROC ; P_TryMove + Line 439: EXTRN ?P_CheckSight@@YAHPEAVAActor@@0H@Z:PROC ; P_CheckSight + Line 440: EXTRN ?P_AimLineAttack@@YA?AU?$TAngle@N@@PEAVAActor@@U1@NPEAUFTranslatedLineTarget@@1H00@Z:PROC ; P_AimLineAttack + Line 441: EXTRN ?P_RailAttack@@YAXPEAUFRailParams@@@Z:PROC ; P_RailAttack + Line 442: EXTRN ?P_GetMoveFactor@@YANPEBVAActor@@PEAN@Z:PROC ; P_GetMoveFactor + Line 443: EXTRN ?BoxOnLineSide@FBoundingBox@@QEBAHPEBUline_t@@@Z:PROC ; FBoundingBox::BoxOnLineSide + Line 444: EXTRN ?P_CheckFor3DFloorHit@@YA_NPEAVAActor@@N_N@Z:PROC ; P_CheckFor3DFloorHit + Line 445: EXTRN ?P_Find3DFloor@@YAHPEAUsector_t@@AEBU?$TVector3@N@@_N2AEAN@Z:PROC ; P_Find3DFloor + Line 446: EXTRN ?TriggerSectorActions@sector_t@@QEAA_NPEAVAActor@@H@Z:PROC ; sector_t::TriggerSectorActions + Line 447: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 448: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 449: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 450: EXTRN ??0FBlockLinesIterator@@QEAA@PEAUFLevelLocals@@AEBVFBoundingBox@@@Z:PROC ; FBlockLinesIterator::FBlockLinesIterator + Line 451: EXTRN ?Next@FBlockLinesIterator@@QEAAPEAUline_t@@XZ:PROC ; FBlockLinesIterator::Next + Line 452: EXTRN ??0FMultiBlockThingsIterator@@QEAA@AEAUFPortalGroupArray@@PEAUFLevelLocals@@NNNNN_NPEAUsector_t@@@Z:PROC ; FMultiBlockThingsIterator::FMultiBlockThingsIterator + Line 453: EXTRN ?Next@FMultiBlockThingsIterator@@QEAA_NPEAUCheckResult@1@@Z:PROC ; FMultiBlockThingsIterator::Next + Line 454: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 455: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 456: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 457: EXTRN ?S_Sound@@YAXPEAVAActor@@HVFSoundID@@MM@Z:PROC ; S_Sound + Line 458: EXTRN ?FindState@PClassActor@@QEBAPEAUFState@@HPEAVFName@@_N@Z:PROC ; PClassActor::FindState + Line 459: EXTRN ?GetReplacee@PClassActor@@QEAAPEAV1@_N@Z:PROC ; PClassActor::GetReplacee + Line 460: EXTRN ?GetState@FStateLabelStorage@@QEAAPEAUFState@@HPEAVPClassActor@@_N@Z:PROC ; FStateLabelStorage::GetState + Line 461: EXTRN ?G_SkillProperty@@YAHW4ESkillProperty@@@Z:PROC ; G_SkillProperty + Line 462: EXTRN ?G_SkillProperty@@YANW4EFSkillProperty@@@Z:PROC ; G_SkillProperty + Line 463: EXTRN ?PlayActiveSound@AActor@@QEAAXXZ:PROC ; AActor::PlayActiveSound + Line 464: EXTRN ?CopyFriendliness@AActor@@QEAAXPEAV1@_N1@Z:PROC ; AActor::CopyFriendliness + Line 465: EXTRN ?Massacre@AActor@@QEAA_NXZ:PROC ; AActor::Massacre + Line 466: EXTRN ?GetTeam@AActor@@QEAAHXZ:PROC ; AActor::GetTeam + Line 467: EXTRN ?IsFriend@AActor@@QEAA_NPEAV1@@Z:PROC ; AActor::IsFriend + Line 468: EXTRN ?GetSpecies@AActor@@QEAA?AVFName@@XZ:PROC ; AActor::GetSpecies + Line 469: EXTRN ?SpawnHealth@AActor@@QEBAHXZ:PROC ; AActor::SpawnHealth + Line 470: EXTRN ?GetMissileDamage@AActor@@QEAAHHH@Z:PROC ; AActor::GetMissileDamage + Line 471: EXTRN ?SetState@AActor@@QEAA_NPEAUFState@@_N@Z:PROC ; AActor::SetState + Line 472: EXTRN ?isFast@AActor@@QEAA_NXZ:PROC ; AActor::isFast + Line 473: EXTRN ?SetIdle@AActor@@QEAAX_N@Z:PROC ; AActor::SetIdle + Line 474: EXTRN ?GetRaiseState@AActor@@QEAAPEAUFState@@XZ:PROC ; AActor::GetRaiseState + Line 475: EXTRN ?Revive@AActor@@QEAAXXZ:PROC ; AActor::Revive + Line 476: EXTRN ?P_ExecuteSpecial@@YAHHPEAUline_t@@PEAVAActor@@_NHHHHH@Z:PROC ; P_ExecuteSpecial + Line 477: EXTRN ?P_ActivateLine@@YA_NPEAUline_t@@PEAVAActor@@HHPEAU?$TVector3@N@@@Z:PROC ; P_ActivateLine + Line 478: EXTRN ?TranslateLineDef@FLevelLocals@@QEAAXPEAUline_t@@PEAUmaplinedef_t@@H@Z:PROC ; FLevelLocals::TranslateLineDef + Line 479: EXTRN ?GetPortalOffsetPosition@FLevelLocals@@QEAA?AU?$TVector2@N@@NNNN@Z:PROC ; FLevelLocals::GetPortalOffsetPosition + Line 480: EXTRN ?EV_DoDoor@FLevelLocals@@QEAA_NW4EVlDoor@DDoor@@PEAUline_t@@PEAVAActor@@HNHHH_NH@Z:PROC ; FLevelLocals::EV_DoDoor + Line 481: EXTRN ?EV_DoFloor@FLevelLocals@@QEAA_NW4EFloor@DFloor@@PEAUline_t@@HNNHH_N2@Z:PROC ; FLevelLocals::EV_DoFloor + Line 482: EXTRN ?ExitLevel@FLevelLocals@@QEAAXH_N@Z:PROC ; FLevelLocals::ExitLevel + Line 483: EXTRN ?PointInSubsector@FLevelLocals@@AEAAPEAUsubsector_t@@NN@Z:PROC ; FLevelLocals::PointInSubsector + Line 484: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 485: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 486: EXTRN ?GetVirtualIndex@@YAIPEAVPClass@@PEBD@Z:PROC ; GetVirtualIndex + Line 487: EXTRN __CxxFrameHandler3:PROC + Line 488: EXTRN floor:PROC + Line 489: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 490: EXTRN ?spechit@@3V?$TArray@Uspechit_t@@U1@@@A:BYTE ; spechit + Line 491: EXTRN ?alwaysapplydmflags@@3VFBoolCVar@@A:BYTE ; alwaysapplydmflags + Line 492: EXTRN ?teamplay@@3VFBoolCVar@@A:BYTE ; teamplay + Line 493: EXTRN ?playeringame@@3PA_NA:BYTE ; playeringame + Line 494: EXTRN ?dmflags@@3VFIntCVar@@A:BYTE ; dmflags + Line 495: EXTRN ?validcount@@3HA:DWORD ; validcount + Line 496: EXTRN ?LegacyRenderStyles@@3PATFRenderStyle@@A:BYTE ; LegacyRenderStyles + Line 497: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 498: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 499: EXTRN ?gamestate@@3W4gamestate_t@@A:DWORD ; gamestate + Line 500: EXTRN __ImageBase:BYTE + Line 501: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_floor.cod (80 hits) + Line 35: EXTRN ?RegistrationInfo@DMover@@2UClassReg@@A:BYTE ; DMover::RegistrationInfo + Line 36: EXTRN ?RegistrationInfo@DMovingFloor@@2UClassReg@@A:BYTE ; DMovingFloor::RegistrationInfo + Line 232: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 233: EXTRN __std_terminate:PROC + Line 234: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 235: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 236: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 237: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 238: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 239: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 240: EXTRN ?P_ChangeSector@@YA_NPEAUsector_t@@HNH_N1@Z:PROC ; P_ChangeSector + Line 241: EXTRN ?SN_StartSequence@@YAPEAVDSeqNode@@PEAUsector_t@@HHW4seqtype_t@@H_N@Z:PROC ; SN_StartSequence + Line 242: EXTRN ?SN_StartSequence@@YAPEAVDSeqNode@@PEAUsector_t@@HPEBDH@Z:PROC ; SN_StartSequence + Line 243: EXTRN ?SN_StartSequence@@YAPEAVDSeqNode@@PEAUsector_t@@HVFName@@H@Z:PROC ; SN_StartSequence + Line 244: EXTRN ?SN_StopSequence@@YAXPEAUsector_t@@H@Z:PROC ; SN_StopSequence + Line 245: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAUsecspecial_t@@PEAU2@@Z:PROC ; Serialize + Line 246: EXTRN ?MoveFloor@sector_t@@QEAA?AW4EMoveResult@@NNHH_N0@Z:PROC ; sector_t::MoveFloor + Line 247: EXTRN ?MoveCeiling@sector_t@@QEAA?AW4EMoveResult@@NNHH_N@Z:PROC ; sector_t::MoveCeiling + Line 248: EXTRN ?NextSpecialSector@sector_t@@QEBAPEAU1@HPEAU1@@Z:PROC ; sector_t::NextSpecialSector + Line 249: EXTRN ?SetInterpolation@sector_t@@QEAAPEAVDInterpolation@@H_N@Z:PROC ; sector_t::SetInterpolation + Line 250: EXTRN ?CheckOverlap@sector_t@@QEAAXXZ:PROC ; sector_t::CheckOverlap + Line 251: EXTRN ?FindLowestFloorSurrounding@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindLowestFloorSurrounding + Line 252: EXTRN ?FindHighestFloorSurrounding@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindHighestFloorSurrounding + Line 253: EXTRN ?FindNextHighestFloor@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindNextHighestFloor + Line 254: EXTRN ?FindNextLowestFloor@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindNextLowestFloor + Line 255: EXTRN ?FindLowestCeilingSurrounding@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindLowestCeilingSurrounding + Line 256: EXTRN ?FindHighestFloorPoint@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindHighestFloorPoint + Line 257: EXTRN ?FindShortestTextureAround@@YANPEAUsector_t@@@Z:PROC ; FindShortestTextureAround + Line 258: EXTRN ?FindModelFloorSector@@YAPEAUsector_t@@PEAU1@N@Z:PROC ; FindModelFloorSector + Line 259: EXTRN ?FindModelCeilingSector@@YAPEAUsector_t@@PEAU1@N@Z:PROC ; FindModelCeilingSector + Line 260: EXTRN ?FindLowestCeilingPoint@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindLowestCeilingPoint + Line 261: EXTRN ?PlaneMoving@@YAHPEAUsector_t@@H@Z:PROC ; PlaneMoving + Line 262: EXTRN ?TransferSpecial@@YAXPEAUsector_t@@0@Z:PROC ; TransferSpecial + Line 263: EXTRN ?GetSpecial@@YAXPEAUsector_t@@PEAUsecspecial_t@@@Z:PROC ; GetSpecial + Line 264: EXTRN ?SetSpecial@@YAXPEAUsector_t@@PEBUsecspecial_t@@@Z:PROC ; SetSpecial + Line 265: EXTRN ?AdjustFloorClip@@YAXPEBUsector_t@@@Z:PROC ; AdjustFloorClip + Line 266: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEA_NPEA_N@Z:PROC ; Serialize + Line 267: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 268: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEANPEAN@Z:PROC ; Serialize + Line 269: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAVFTextureID@@PEAV2@@Z:PROC ; Serialize + Line 270: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 271: EXTRN ?P_Scroll3dMidtex@@YA_NPEAUsector_t@@HN_N1@Z:PROC ; P_Scroll3dMidtex + Line 272: EXTRN ?P_MoveLinkedSectors@@YA_NPEAUsector_t@@HN_N1@Z:PROC ; P_MoveLinkedSectors + Line 273: EXTRN ?Link@FThinkerCollection@@QEAAXPEAVDThinker@@H@Z:PROC ; FThinkerCollection::Link + Line 274: EXTRN ?StaticType@DThinker@@UEBAPEAVPClass@@XZ:PROC ; DThinker::StaticType + Line 275: EXTRN ?OnDestroy@DThinker@@UEAAXXZ:PROC ; DThinker::OnDestroy + Line 276: EXTRN ??1DThinker@@UEAA@XZ:PROC ; DThinker::~DThinker + Line 277: EXTRN ?Tick@DThinker@@UEAAXXZ:PROC ; DThinker::Tick + Line 278: EXTRN ?PostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::PostBeginPlay + Line 279: EXTRN ?CallPostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::CallPostBeginPlay + Line 280: EXTRN ?PostSerialize@DThinker@@UEAAXXZ:PROC ; DThinker::PostSerialize + Line 281: EXTRN ?Serialize@DThinker@@UEAAXAEAVFSerializer@@@Z:PROC ; DThinker::Serialize + Line 282: EXTRN ?PropagateMark@DThinker@@UEAA_KXZ:PROC ; DThinker::PropagateMark + Line 283: EXTRN ??_EDThinker@@UEAAPEAXI@Z:PROC ; DThinker::`vector deleting destructor' + Line 284: EXTRN ?StaticType@DSectorEffect@@UEBAPEAVPClass@@XZ:PROC ; DSectorEffect::StaticType + Line 285: EXTRN ?Serialize@DSectorEffect@@UEAAXAEAVFSerializer@@@Z:PROC ; DSectorEffect::Serialize + Line 286: EXTRN ?OnDestroy@DSectorEffect@@UEAAXXZ:PROC ; DSectorEffect::OnDestroy + Line 287: EXTRN ??_EDSectorEffect@@UEAAPEAXI@Z:PROC ; DSectorEffect::`vector deleting destructor' + Line 288: EXTRN ?StaticType@DMover@@UEBAPEAVPClass@@XZ:PROC ; DMover::StaticType + Line 289: EXTRN ?Construct@DMover@@IEAAXPEAUsector_t@@@Z:PROC ; DMover::Construct + Line 290: EXTRN ?StopInterpolation@DMover@@QEAAX_N@Z:PROC ; DMover::StopInterpolation + Line 291: EXTRN ?Serialize@DMover@@MEAAXAEAVFSerializer@@@Z:PROC ; DMover::Serialize + Line 292: EXTRN ?OnDestroy@DMover@@MEAAXXZ:PROC ; DMover::OnDestroy + Line 293: EXTRN ??_EDMover@@UEAAPEAXI@Z:PROC ; DMover::`vector deleting destructor' + Line 294: EXTRN ?StaticType@DMovingFloor@@UEBAPEAVPClass@@XZ:PROC ; DMovingFloor::StaticType + Line 295: EXTRN ?Construct@DMovingFloor@@IEAAXPEAUsector_t@@@Z:PROC ; DMovingFloor::Construct + Line 296: EXTRN ??_EDMovingFloor@@UEAAPEAXI@Z:PROC ; DMovingFloor::`vector deleting destructor' + Line 297: EXTRN ?Next@FSectorTagIterator@@QEAAHXZ:PROC ; FSectorTagIterator::Next + Line 298: EXTRN ?NextCompat@FSectorTagIterator@@QEAAH_NH@Z:PROC ; FSectorTagIterator::NextCompat + Line 299: EXTRN ??_EDFloor@@UEAAPEAXI@Z:PROC ; DFloor::`vector deleting destructor' + Line 300: EXTRN ??_EDElevator@@UEAAPEAXI@Z:PROC ; DElevator::`vector deleting destructor' + Line 301: EXTRN ??_EDWaggleBase@@UEAAPEAXI@Z:PROC ; DWaggleBase::`vector deleting destructor' + Line 302: EXTRN ??_EDFloorWaggle@@UEAAPEAXI@Z:PROC ; DFloorWaggle::`vector deleting destructor' + Line 303: EXTRN ??_EDCeilingWaggle@@UEAAPEAXI@Z:PROC ; DCeilingWaggle::`vector deleting destructor' + Line 304: EXTRN ?DelRef@DInterpolation@@QEAAH_N@Z:PROC ; DInterpolation::DelRef + Line 305: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 306: EXTRN __CxxFrameHandler3:PROC + Line 307: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 308: EXTRN __ImageBase:BYTE + Line 309: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_glnodes.cod (68 hits) + Line 16: EXTRN ?IsAlias@FConsoleCommand@@UEAA_NXZ:PROC ; FConsoleCommand::IsAlias + Line 17: EXTRN ?Run@FUnsafeConsoleCommand@@UEAAXAEAVFCommandLine@@PEAVAPlayerPawn@@H@Z:PROC ; FUnsafeConsoleCommand::Run + Line 18: EXTRN ??_EFUnsafeConsoleCommand@@UEAAPEAXI@Z:PROC ; FUnsafeConsoleCommand::`vector deleting destructor' + Line 19: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 113: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 114: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 115: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 116: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 117: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 118: EXTRN atexit:PROC + Line 119: EXTRN __std_terminate:PROC + Line 120: EXTRN remove:PROC + Line 121: EXTRN strrchr:PROC + Line 122: EXTRN strncpy:PROC + Line 123: EXTRN strnicmp:PROC + Line 124: EXTRN compress:PROC + Line 125: EXTRN _rmdir:PROC + Line 126: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 127: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 128: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 129: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 130: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 131: EXTRN ??YFString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator+= + Line 132: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 133: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 134: EXTRN ?Left@FString@@QEBA?AV1@_K@Z:PROC ; FString::Left + Line 135: EXTRN ?Right@FString@@QEBA?AV1@_K@Z:PROC ; FString::Right + Line 136: EXTRN ?IndexOf@FString@@QEBAJDJ@Z:PROC ; FString::IndexOf + Line 137: EXTRN ?ReplaceChars@FString@@QEAAXDD@Z:PROC ; FString::ReplaceChars + Line 138: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 139: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 140: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 141: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAPlayerPawn@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 142: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 143: EXTRN ?OpenFile@FileReader@@QEAA_NPEBD_J1@Z:PROC ; FileReader::OpenFile + Line 144: EXTRN ?Open@FileWriter@@SAPEAV1@PEBD@Z:PROC ; FileWriter::Open + Line 145: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 146: EXTRN ?GetWadFullName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetWadFullName + Line 147: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDHH_N@Z:PROC ; FWadCollection::CheckNumForName + Line 148: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 149: EXTRN ?ReopenLumpReader@FWadCollection@@QEAA?AVFileReader@@H_N@Z:PROC ; FWadCollection::ReopenLumpReader + Line 150: EXTRN ?FindLump@FWadCollection@@QEAAHPEBDPEAH_N@Z:PROC ; FWadCollection::FindLump + Line 151: EXTRN ?GetLumpFullName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetLumpFullName + Line 152: EXTRN ?GetLumpFullPath@FWadCollection@@QEBA?AVFString@@H@Z:PROC ; FWadCollection::GetLumpFullPath + Line 153: EXTRN ?GetLumpFile@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpFile + Line 154: EXTRN c_sqrt:PROC + Line 155: EXTRN ?FindMapBounds@FLevel@FNodeBuilder@@QEAAXXZ:PROC ; FNodeBuilder::FLevel::FindMapBounds + Line 156: EXTRN ??0FNodeBuilder@@QEAA@AEAUFLevel@0@AEAV?$TArray@UFPolyStart@FNodeBuilder@@U12@@@1_N@Z:PROC ; FNodeBuilder::FNodeBuilder + Line 157: EXTRN ??1FNodeBuilder@@QEAA@XZ:PROC ; FNodeBuilder::~FNodeBuilder + Line 158: EXTRN ?Extract@FNodeBuilder@@QEAAXAEAUFLevelLocals@@@Z:PROC ; FNodeBuilder::Extract + Line 159: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 160: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 161: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 162: EXTRN ?OpenResourceFile@FResourceFile@@SAPEAV1@PEBD_N1@Z:PROC ; FResourceFile::OpenResourceFile + Line 163: EXTRN ?GetChecksum@MapData@@QEAAXQEAE@Z:PROC ; MapData::GetChecksum + Line 164: EXTRN ?LoadExtendedNodes@MapLoader@@QEAAXAEAVFileReader@@I@Z:PROC ; MapLoader::LoadExtendedNodes + Line 165: EXTRN ?GetPolySpots@MapLoader@@QEAAXPEAUMapData@@AEAV?$TArray@UFPolyStart@FNodeBuilder@@U12@@@1@Z:PROC ; MapLoader::GetPolySpots + Line 166: EXTRN ?M_GetCachePath@@YA?AVFString@@_N@Z:PROC ; M_GetCachePath + Line 167: EXTRN ?CreatePath@@YAXPEBD@Z:PROC ; CreatePath + Line 168: EXTRN ?ScanDirectory@@YAXAEAV?$TArray@UFFileList@@U1@@@PEBD@Z:PROC ; ScanDirectory + Line 169: EXTRN ?I_msTime@@YA_KXZ:PROC ; I_msTime + Line 170: EXTRN __CxxFrameHandler3:PROC + Line 171: EXTRN memmove:PROC + Line 172: EXTRN memset:PROC + Line 173: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 174: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 175: EXTRN ?level@@3UFLevelLocals@@A:BYTE ; level + Line 176: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_interaction.cod (95 hits) + Line 292: EXTRN atexit:PROC + Line 293: EXTRN stricmp:PROC + Line 294: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 295: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 296: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 297: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 298: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 299: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 300: EXTRN ??RFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator() + Line 301: EXTRN ??AFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator[] + Line 302: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 303: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 304: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 305: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 306: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 307: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 308: EXTRN ?I_Tactile@@YAXHHH@Z:PROC ; I_Tactile + Line 309: EXTRN ?AnnounceKill@@YA_NPEAVAActor@@0@Z:PROC ; AnnounceKill + Line 310: EXTRN ?AnnounceTelefrag@@YA_NPEAVAActor@@0@Z:PROC ; AnnounceTelefrag + Line 311: EXTRN ?AnnounceSpree@@YA_NPEAVAActor@@@Z:PROC ; AnnounceSpree + Line 312: EXTRN ?AnnounceSpreeLoss@@YA_NPEAVAActor@@@Z:PROC ; AnnounceSpreeLoss + Line 313: EXTRN ?AnnounceMultikill@@YA_NPEAVAActor@@@Z:PROC ; AnnounceMultikill + Line 314: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 315: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 316: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 317: EXTRN ?FindFunction@PClass@@SAXPEAPEAVVMFunction@@VFName@@1@Z:PROC ; PClass::FindFunction + Line 318: EXTRN ?AM_Stop@@YAXXZ:PROC ; AM_Stop + Line 319: EXTRN ?C_HideConsole@@YAXXZ:PROC ; C_HideConsole + Line 320: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 321: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 322: EXTRN ?CheckCheatmode@@YA_N_N@Z:PROC ; CheckCheatmode + Line 323: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 324: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 325: EXTRN ?P_ExplodeMissile@@YAXPEAVAActor@@PEAUline_t@@0_N@Z:PROC ; P_ExplodeMissile + Line 326: EXTRN ?P_CheckSight@@YAHPEAVAActor@@0H@Z:PROC ; P_CheckSight + Line 327: EXTRN ?P_GiveBody@@YA_NPEAVAActor@@HH@Z:PROC ; P_GiveBody + Line 328: EXTRN ?P_ActivateThingSpecial@@YA_NPEAVAActor@@0_N@Z:PROC ; P_ActivateThingSpecial + Line 329: EXTRN ?StartTypedScripts@FBehaviorContainer@@QEAAXGPEAVAActor@@_NH1@Z:PROC ; FBehaviorContainer::StartTypedScripts + Line 330: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 331: EXTRN ?S_Sound@@YAXPEAVAActor@@HVFSoundID@@MM@Z:PROC ; S_Sound + Line 332: EXTRN ?GetObituary@DamageTypeDefinition@@SA?AVFString@@VFName@@@Z:PROC ; DamageTypeDefinition::GetObituary + Line 333: EXTRN ?FindState@PClassActor@@QEBAPEAUFState@@HPEAVFName@@_N@Z:PROC ; PClassActor::FindState + Line 334: EXTRN ?G_SkillProperty@@YAHW4ESkillProperty@@@Z:PROC ; G_SkillProperty + Line 335: EXTRN ?G_SkillProperty@@YANW4EFSkillProperty@@@Z:PROC ; G_SkillProperty + Line 336: EXTRN ?AbsorbDamage@AActor@@QEAAHHVFName@@@Z:PROC ; AActor::AbsorbDamage + Line 337: EXTRN ?CallDoSpecialDamage@AActor@@QEAAHPEAV1@HVFName@@@Z:PROC ; AActor::CallDoSpecialDamage + Line 338: EXTRN ?CallTakeSpecialDamage@AActor@@QEAAHPEAV1@0HVFName@@@Z:PROC ; AActor::CallTakeSpecialDamage + Line 339: EXTRN ?CallTouch@AActor@@QEAAXPEAV1@@Z:PROC ; AActor::CallTouch + Line 340: EXTRN ?Howl@AActor@@QEAAXXZ:PROC ; AActor::Howl + Line 341: EXTRN ?CheckLocalView@AActor@@QEBA_NH@Z:PROC ; AActor::CheckLocalView + Line 342: EXTRN ?FindInventory@AActor@@QEAAPEAV1@PEAVPClassActor@@_N@Z:PROC ; AActor::FindInventory + Line 343: EXTRN ?GiveInventoryType@AActor@@QEAAPEAV1@PEAVPClassActor@@@Z:PROC ; AActor::GiveInventoryType + Line 344: EXTRN ?IsTeammate@AActor@@QEAA_NPEAV1@@Z:PROC ; AActor::IsTeammate + Line 345: EXTRN ?IsFriend@AActor@@QEAA_NPEAV1@@Z:PROC ; AActor::IsFriend + Line 346: EXTRN ?IsHostile@AActor@@QEAA_NPEAV1@@Z:PROC ; AActor::IsHostile + Line 347: EXTRN ?GetSpecies@AActor@@QEAA?AVFName@@XZ:PROC ; AActor::GetSpecies + Line 348: EXTRN ?GetGibHealth@AActor@@QEBAHXZ:PROC ; AActor::GetGibHealth + Line 349: EXTRN ?SetState@AActor@@QEAA_NPEAUFState@@_N@Z:PROC ; AActor::SetState + Line 350: EXTRN ?ApplyDamageFactor@AActor@@QEBAHVFName@@H@Z:PROC ; AActor::ApplyDamageFactor + Line 351: EXTRN ?GetModifiedDamage@AActor@@QEAAHVFName@@H_N@Z:PROC ; AActor::GetModifiedDamage + Line 352: EXTRN ?D_GetFragCount@@YAHPEAVplayer_t@@@Z:PROC ; D_GetFragCount + Line 353: EXTRN ??0DHUDMessageFadeOut@@QEAA@PEAVFFont@@PEBDMMHHW4EColorRange@@MM@Z:PROC ; DHUDMessageFadeOut::DHUDMessageFadeOut + Line 354: EXTRN ?AttachMessage@DBaseStatusBar@@QEAAXPEAVDHUDMessageBase@@IH@Z:PROC ; DBaseStatusBar::AttachMessage + Line 355: EXTRN ?Net_WriteByte@@YAXE@Z:PROC ; Net_WriteByte + Line 356: EXTRN ?Net_WriteString@@YAXPEBD@Z:PROC ; Net_WriteString + Line 357: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 358: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 359: EXTRN ?GetVirtualIndex@@YAIPEAVPClass@@PEBD@Z:PROC ; GetVirtualIndex + Line 360: EXTRN ?GetInfighting@FLevelLocals@@QEAAHXZ:PROC ; FLevelLocals::GetInfighting + Line 361: EXTRN ?ExitLevel@FLevelLocals@@QEAAXH_N@Z:PROC ; FLevelLocals::ExitLevel + Line 362: EXTRN ?E_WorldThingDied@@YAXPEAVAActor@@0@Z:PROC ; E_WorldThingDied + Line 363: EXTRN ?E_WorldThingDamaged@@YAXPEAVAActor@@00HVFName@@HU?$TAngle@N@@@Z:PROC ; E_WorldThingDamaged + Line 364: EXTRN ?E_PlayerDied@@YAXH@Z:PROC ; E_PlayerDied + Line 365: EXTRN __CxxFrameHandler3:PROC + Line 366: EXTRN memcpy:PROC + Line 367: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 368: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 369: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 370: EXTRN ?multiplayer@@3_NA:BYTE ; multiplayer + Line 371: EXTRN ?deathmatch@@3VFIntCVar@@A:BYTE ; deathmatch + Line 372: EXTRN ?automapactive@@3_NA:BYTE ; automapactive + Line 373: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 374: EXTRN ?demoplayback@@3_NA:BYTE ; demoplayback + Line 375: EXTRN ?deh@@3UDehInfo@@A:BYTE ; deh + Line 376: EXTRN ?dmflags2@@3VFIntCVar@@A:BYTE ; dmflags2 + Line 377: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 378: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 379: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 380: EXTRN ?SmallFont@@3PEAVFFont@@EA:QWORD ; SmallFont + Line 381: EXTRN ?RegistrationInfo@DHUDMessageFadeOut@@2UClassReg@@A:BYTE ; DHUDMessageFadeOut::RegistrationInfo + Line 382: EXTRN ?StatusBar@@3PEAVDBaseStatusBar@@EA:QWORD ; StatusBar + Line 383: EXTRN ?show_obituaries@@3VFBoolCVar@@A:BYTE ; show_obituaries + Line 384: EXTRN ?fraglimit@@3VFIntCVar@@A:BYTE ; fraglimit + Line 385: EXTRN __ImageBase:BYTE + Line 386: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_lights.cod (49 hits) + Line 44: EXTRN ?RegistrationInfo@DSectorEffect@@2UClassReg@@A:BYTE ; DSectorEffect::RegistrationInfo + Line 261: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 262: EXTRN atexit:PROC + Line 263: EXTRN __std_terminate:PROC + Line 264: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 265: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 266: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 267: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 268: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 269: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 270: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 271: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 272: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 273: EXTRN ?Link@FThinkerCollection@@QEAAXPEAVDThinker@@H@Z:PROC ; FThinkerCollection::Link + Line 274: EXTRN ?StaticType@DThinker@@UEBAPEAVPClass@@XZ:PROC ; DThinker::StaticType + Line 275: EXTRN ?OnDestroy@DThinker@@UEAAXXZ:PROC ; DThinker::OnDestroy + Line 276: EXTRN ??1DThinker@@UEAA@XZ:PROC ; DThinker::~DThinker + Line 277: EXTRN ?Tick@DThinker@@UEAAXXZ:PROC ; DThinker::Tick + Line 278: EXTRN ?PostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::PostBeginPlay + Line 279: EXTRN ?CallPostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::CallPostBeginPlay + Line 280: EXTRN ?PostSerialize@DThinker@@UEAAXXZ:PROC ; DThinker::PostSerialize + Line 281: EXTRN ?Serialize@DThinker@@UEAAXAEAVFSerializer@@@Z:PROC ; DThinker::Serialize + Line 282: EXTRN ?PropagateMark@DThinker@@UEAA_KXZ:PROC ; DThinker::PropagateMark + Line 283: EXTRN ??_EDThinker@@UEAAPEAXI@Z:PROC ; DThinker::`vector deleting destructor' + Line 284: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 285: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 286: EXTRN ?NextSpecialSector@sector_t@@QEBAPEAU1@HPEAU1@@Z:PROC ; sector_t::NextSpecialSector + Line 287: EXTRN ?FindMinSurroundingLight@@YAHPEBUsector_t@@H@Z:PROC ; FindMinSurroundingLight + Line 288: EXTRN ?StaticType@DSectorEffect@@UEBAPEAVPClass@@XZ:PROC ; DSectorEffect::StaticType + Line 289: EXTRN ?Construct@DSectorEffect@@QEAAXPEAUsector_t@@@Z:PROC ; DSectorEffect::Construct + Line 290: EXTRN ?Serialize@DSectorEffect@@UEAAXAEAVFSerializer@@@Z:PROC ; DSectorEffect::Serialize + Line 291: EXTRN ?OnDestroy@DSectorEffect@@UEAAXXZ:PROC ; DSectorEffect::OnDestroy + Line 292: EXTRN ??_EDSectorEffect@@UEAAPEAXI@Z:PROC ; DSectorEffect::`vector deleting destructor' + Line 293: EXTRN ?SectorHasTag@FTagManager@@AEBA_NPEBUsector_t@@H@Z:PROC ; FTagManager::SectorHasTag + Line 294: EXTRN ?Next@FSectorTagIterator@@QEAAHXZ:PROC ; FSectorTagIterator::Next + Line 295: EXTRN ??_EDLighting@@UEAAPEAXI@Z:PROC ; DLighting::`vector deleting destructor' + Line 296: EXTRN ??_EDFireFlicker@@UEAAPEAXI@Z:PROC ; DFireFlicker::`vector deleting destructor' + Line 297: EXTRN ??_EDFlicker@@UEAAPEAXI@Z:PROC ; DFlicker::`vector deleting destructor' + Line 298: EXTRN ??_EDLightFlash@@UEAAPEAXI@Z:PROC ; DLightFlash::`vector deleting destructor' + Line 299: EXTRN ??_EDStrobe@@UEAAPEAXI@Z:PROC ; DStrobe::`vector deleting destructor' + Line 300: EXTRN ??_EDGlow@@UEAAPEAXI@Z:PROC ; DGlow::`vector deleting destructor' + Line 301: EXTRN ??_EDGlow2@@UEAAPEAXI@Z:PROC ; DGlow2::`vector deleting destructor' + Line 302: EXTRN ??_EDPhased@@UEAAPEAXI@Z:PROC ; DPhased::`vector deleting destructor' + Line 303: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEA_NPEA_N@Z:PROC ; Serialize + Line 304: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 305: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAEPEAE@Z:PROC ; Serialize + Line 306: EXTRN __CxxFrameHandler3:PROC + Line 307: EXTRN ?validcount@@3HA:DWORD ; validcount + Line 308: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_linkedsectors.cod (12 hits) + Line 48: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 49: EXTRN ?P_ChangeSector@@YA_NPEAUsector_t@@HNH_N1@Z:PROC ; P_ChangeSector + Line 50: EXTRN ?SetInterpolation@sector_t@@QEAAPEAVDInterpolation@@H_N@Z:PROC ; sector_t::SetInterpolation + Line 51: EXTRN ?CheckOverlap@sector_t@@QEAAXXZ:PROC ; sector_t::CheckOverlap + Line 52: EXTRN ?PlaneMoving@@YAHPEAUsector_t@@H@Z:PROC ; PlaneMoving + Line 53: EXTRN ?SectorHasTag@FTagManager@@AEBA_NPEBUsector_t@@H@Z:PROC ; FTagManager::SectorHasTag + Line 54: EXTRN ?Next@FSectorTagIterator@@QEAAHXZ:PROC ; FSectorTagIterator::Next + Line 55: EXTRN ?Next@FLineIdIterator@@QEAAHXZ:PROC ; FLineIdIterator::Next + Line 56: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 57: EXTRN memmove:PROC + Line 58: EXTRN __ImageBase:BYTE + Line 59: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_lnspec.cod (142 hits) + Line 283: EXTRN ?AllSkills@@3V?$TArray@UFSkillInfo@@U1@@@A:BYTE ; AllSkills + Line 284: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 285: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 286: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 287: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 288: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 289: EXTRN ?gameaction@@3W4gameaction_t@@A:DWORD ; gameaction + Line 290: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 291: EXTRN ?SpawnableThings@@3V?$TMap@HPEAVPClassActor@@U?$THashTraits@H@@U?$TValueTraits@PEAVPClassActor@@@@@@A:BYTE ; SpawnableThings + Line 292: EXTRN ?NextSkill@@3HA:DWORD ; NextSkill + Line 293: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 294: EXTRN ?playeringame@@3PA_NA:BYTE ; playeringame + Line 295: EXTRN ?deh@@3UDehInfo@@A:BYTE ; deh + Line 296: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 3086: EXTRN atexit:PROC + Line 3087: EXTRN __std_terminate:PROC + Line 3088: EXTRN qsort:PROC + Line 3089: EXTRN stricmp:PROC + Line 3090: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 3091: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 3092: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 3093: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 3094: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 3095: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 3096: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 3097: EXTRN mysnprintf:PROC + Line 3098: EXTRN c_sqrt:PROC + Line 3099: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 3100: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 3101: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 3102: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 3103: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 3104: EXTRN ?P_RemoveThing@@YAXPEAVAActor@@@Z:PROC ; P_RemoveThing + Line 3105: EXTRN ?P_Thing_Raise@@YA_NPEAVAActor@@0H@Z:PROC ; P_Thing_Raise + Line 3106: EXTRN ?P_DamageMobj@@YAHPEAVAActor@@00HVFName@@HU?$TAngle@N@@@Z:PROC ; P_DamageMobj + Line 3107: EXTRN ?P_GiveBody@@YA_NPEAVAActor@@HH@Z:PROC ; P_GiveBody + Line 3108: EXTRN ?P_NoiseAlert@@YAXPEAVAActor@@0_NN@Z:PROC ; P_NoiseAlert + Line 3109: EXTRN ?FindLevelInfo@@YAPEAUlevel_info_t@@PEBD_N@Z:PROC ; FindLevelInfo + Line 3110: EXTRN ?FindLevelByNum@@YAPEAUlevel_info_t@@H@Z:PROC ; FindLevelByNum + Line 3111: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 3112: EXTRN ?S_Sound@@YAXHVFSoundID@@MM@Z:PROC ; S_Sound + Line 3113: EXTRN ?S_Sound@@YAXPEAVAActor@@HVFSoundID@@MM@Z:PROC ; S_Sound + Line 3114: EXTRN ?S_StopSound@@YAXH@Z:PROC ; S_StopSound + Line 3115: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 3116: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 3117: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 3118: EXTRN ?FindState@PClassActor@@QEBAPEAUFState@@HPEAVFName@@_N@Z:PROC ; PClassActor::FindState + Line 3119: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 3120: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 3121: EXTRN ?StaticSpawn@AActor@@SAPEAV1@PEAVPClassActor@@AEBU?$TVector3@N@@W4replace_t@@_N@Z:PROC ; AActor::StaticSpawn + Line 3122: EXTRN ?CallActivate@AActor@@QEAAXPEAV1@@Z:PROC ; AActor::CallActivate + Line 3123: EXTRN ?CallDeactivate@AActor@@QEAAXPEAV1@@Z:PROC ; AActor::CallDeactivate + Line 3124: EXTRN ?UseInventory@AActor@@QEAA_NPEAV1@@Z:PROC ; AActor::UseInventory + Line 3125: EXTRN ?CheckLocalView@AActor@@QEBA_NH@Z:PROC ; AActor::CheckLocalView + Line 3126: EXTRN ?FindInventory@AActor@@QEAAPEAV1@PEAVPClassActor@@_N@Z:PROC ; AActor::FindInventory + Line 3127: EXTRN ?FindInventory@AActor@@QEAAPEAV1@VFName@@_N@Z:PROC ; AActor::FindInventory + Line 3128: EXTRN ?GiveInventoryType@AActor@@QEAAPEAV1@PEAVPClassActor@@@Z:PROC ; AActor::GiveInventoryType + Line 3129: EXTRN ?ConversationAnimation@AActor@@QEAAXH@Z:PROC ; AActor::ConversationAnimation + Line 3130: EXTRN ?SpawnHealth@AActor@@QEBAHXZ:PROC ; AActor::SpawnHealth + Line 3131: EXTRN ?AddToHash@AActor@@QEAAXXZ:PROC ; AActor::AddToHash + Line 3132: EXTRN ?RemoveFromHash@AActor@@QEAAXXZ:PROC ; AActor::RemoveFromHash + Line 3133: EXTRN ?SetState@AActor@@QEAA_NPEAUFState@@_N@Z:PROC ; AActor::SetState + Line 3134: EXTRN ?ClassForSpawn@@YAPEAVPClassActor@@VFName@@@Z:PROC ; ClassForSpawn + Line 3135: EXTRN ?P_CheckKeys@@YAHPEAVAActor@@H_N1@Z:PROC ; P_CheckKeys + Line 3136: EXTRN ?P_StartConversation@@YAXPEAVAActor@@0_N1@Z:PROC ; P_StartConversation + Line 3137: EXTRN ?P_AddSectorLinks@@YA_NPEAUsector_t@@HHH@Z:PROC ; P_AddSectorLinks + Line 3138: EXTRN ?Net_WriteByte@@YAXE@Z:PROC ; Net_WriteByte + Line 3139: EXTRN ??AFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator[] + Line 3140: EXTRN ?RemoveForceField@@YAXPEAUsector_t@@@Z:PROC ; RemoveForceField + Line 3141: EXTRN ?SetColor@@YAXPEAUsector_t@@HH@Z:PROC ; SetColor + Line 3142: EXTRN ?SetFade@@YAXPEAUsector_t@@H@Z:PROC ; SetFade + Line 3143: EXTRN ?EV_RotatePoly@@YA_NPEAUFLevelLocals@@PEAUline_t@@HHHH_N@Z:PROC ; EV_RotatePoly + Line 3144: EXTRN ?EV_MovePoly@@YA_NPEAUFLevelLocals@@PEAUline_t@@HNU?$TAngle@N@@N_N@Z:PROC ; EV_MovePoly + Line 3145: EXTRN ?EV_MovePolyTo@@YA_NPEAUFLevelLocals@@PEAUline_t@@HNAEBU?$TVector2@N@@_N@Z:PROC ; EV_MovePolyTo + Line 3146: EXTRN ?EV_OpenPolyDoor@@YA_NPEAUFLevelLocals@@PEAUline_t@@HNU?$TAngle@N@@HNW4podoortype_t@@@Z:PROC ; EV_OpenPolyDoor + Line 3147: EXTRN ?EV_StopPoly@@YA_NPEAUFLevelLocals@@H@Z:PROC ; EV_StopPoly + Line 3148: EXTRN ?SetLogNumber@player_t@@QEAAXH@Z:PROC ; player_t::SetLogNumber + Line 3149: EXTRN ?R_ClearPastViewer@@YAXPEAVAActor@@@Z:PROC ; R_ClearPastViewer + Line 3150: EXTRN ?T_RunScript@@YA_NPEAUFLevelLocals@@HPEAVAActor@@@Z:PROC ; T_RunScript + Line 3151: EXTRN ?P_SetSectorFriction@@YAXPEAUFLevelLocals@@HH_N@Z:PROC ; P_SetSectorFriction + Line 3152: EXTRN ?SectorHasTag@FTagManager@@AEBA_NPEBUsector_t@@H@Z:PROC ; FTagManager::SectorHasTag + Line 3153: EXTRN ?Next@FSectorTagIterator@@QEAAHXZ:PROC ; FSectorTagIterator::Next + Line 3154: EXTRN ?Next@FLineIdIterator@@QEAAHXZ:PROC ; FLineIdIterator::Next + Line 3155: EXTRN ?P_ChangeSwitchTexture@@YA_NPEAUside_t@@HEPEA_N@Z:PROC ; P_ChangeSwitchTexture + Line 3156: EXTRN ?P_StartScript@@YAHPEAUFLevelLocals@@PEAVAActor@@PEAUline_t@@HPEBDPEBHHH@Z:PROC ; P_StartScript + Line 3157: EXTRN ?P_SuspendScript@@YAXPEAUFLevelLocals@@HPEBD@Z:PROC ; P_SuspendScript + Line 3158: EXTRN ?P_TerminateScript@@YAXPEAUFLevelLocals@@HPEBD@Z:PROC ; P_TerminateScript + Line 3159: EXTRN ?P_StartQuake@@YA_NPEAUFLevelLocals@@PEAVAActor@@HHHHHVFSoundID@@@Z:PROC ; P_StartQuake + Line 3160: EXTRN ?P_SetHealthGroupHealth@@YAXPEAUFLevelLocals@@HH@Z:PROC ; P_SetHealthGroupHealth + Line 3161: EXTRN ?CheckIfExitIsGood@FLevelLocals@@QEAA_NPEAVAActor@@PEAUlevel_info_t@@@Z:PROC ; FLevelLocals::CheckIfExitIsGood + Line 3162: EXTRN ?GetConversation@FLevelLocals@@QEAAHH@Z:PROC ; FLevelLocals::GetConversation + Line 3163: EXTRN ?ChangePortal@FLevelLocals@@QEAA_NPEAUline_t@@HH@Z:PROC ; FLevelLocals::ChangePortal + Line 3164: EXTRN ?AdjustPusher@FLevelLocals@@QEAAXHHH_N@Z:PROC ; FLevelLocals::AdjustPusher + Line 3165: EXTRN ?Massacre@FLevelLocals@@QEAAH_NVFName@@@Z:PROC ; FLevelLocals::Massacre + Line 3166: EXTRN ?ForceLightning@FLevelLocals@@QEAAXH@Z:PROC ; FLevelLocals::ForceLightning + Line 3167: EXTRN ?AlignFlat@FLevelLocals@@QEAA_NHHH@Z:PROC ; FLevelLocals::AlignFlat + Line 3168: EXTRN ?EV_Thing_Spawn@FLevelLocals@@QEAA_NHPEAVAActor@@HU?$TAngle@N@@_NH@Z:PROC ; FLevelLocals::EV_Thing_Spawn + Line 3169: EXTRN ?EV_Thing_Move@FLevelLocals@@QEAA_NHPEAVAActor@@H_N@Z:PROC ; FLevelLocals::EV_Thing_Move + Line 3170: EXTRN ?EV_Thing_Projectile@FLevelLocals@@QEAA_NHPEAVAActor@@HPEBDU?$TAngle@N@@NNH0HH_N@Z:PROC ; FLevelLocals::EV_Thing_Projectile + Line 3171: EXTRN ?EV_Thing_Damage@FLevelLocals@@QEAAHHPEAVAActor@@HVFName@@@Z:PROC ; FLevelLocals::EV_Thing_Damage + Line 3172: EXTRN ?EV_DoPlat@FLevelLocals@@QEAA_NHPEAUline_t@@W4EPlatType@DPlat@@NNHHH@Z:PROC ; FLevelLocals::EV_DoPlat + Line 3173: EXTRN ?EV_StopPlat@FLevelLocals@@QEAAXH_N@Z:PROC ; FLevelLocals::EV_StopPlat + Line 3174: EXTRN ?EV_DoPillar@FLevelLocals@@QEAA_NW4EPillar@DPillar@@PEAUline_t@@HNNNH_N@Z:PROC ; FLevelLocals::EV_DoPillar + Line 3175: EXTRN ?EV_DoDoor@FLevelLocals@@QEAA_NW4EVlDoor@DDoor@@PEAUline_t@@PEAVAActor@@HNHHH_NH@Z:PROC ; FLevelLocals::EV_DoDoor + Line 3176: EXTRN ?EV_SlidingDoor@FLevelLocals@@QEAA_NPEAUline_t@@PEAVAActor@@HHHW4EADType@DAnimatedDoor@@@Z:PROC ; FLevelLocals::EV_SlidingDoor + Line 3177: EXTRN ?EV_DoCeiling@FLevelLocals@@QEAA_NW4ECeiling@DCeiling@@PEAUline_t@@HNNNHHHW4ECrushMode@3@@Z:PROC ; FLevelLocals::EV_DoCeiling + Line 3178: EXTRN ?EV_CeilingCrushStop@FLevelLocals@@QEAA_NH_N@Z:PROC ; FLevelLocals::EV_CeilingCrushStop + Line 3179: EXTRN ?EV_StopCeiling@FLevelLocals@@QEAA_NHPEAUline_t@@@Z:PROC ; FLevelLocals::EV_StopCeiling + Line 3180: EXTRN ?EV_BuildStairs@FLevelLocals@@QEAA_NHW4EStair@DFloor@@PEAUline_t@@NNHHHH@Z:PROC ; FLevelLocals::EV_BuildStairs + Line 3181: EXTRN ?EV_DoFloor@FLevelLocals@@QEAA_NW4EFloor@DFloor@@PEAUline_t@@HNNHH_N2@Z:PROC ; FLevelLocals::EV_DoFloor + Line 3182: EXTRN ?EV_FloorCrushStop@FLevelLocals@@QEAA_NHPEAUline_t@@@Z:PROC ; FLevelLocals::EV_FloorCrushStop + Line 3183: EXTRN ?EV_StopFloor@FLevelLocals@@QEAA_NHPEAUline_t@@@Z:PROC ; FLevelLocals::EV_StopFloor + Line 3184: EXTRN ?EV_DoDonut@FLevelLocals@@QEAA_NHPEAUline_t@@NN@Z:PROC ; FLevelLocals::EV_DoDonut + Line 3185: EXTRN ?EV_DoElevator@FLevelLocals@@QEAA_NPEAUline_t@@W4EElevator@DElevator@@NNH@Z:PROC ; FLevelLocals::EV_DoElevator + Line 3186: EXTRN ?EV_StartWaggle@FLevelLocals@@QEAA_NHPEAUline_t@@HHHH_N@Z:PROC ; FLevelLocals::EV_StartWaggle + Line 3187: EXTRN ?EV_DoChange@FLevelLocals@@QEAA_NPEAUline_t@@W4EChange@@H@Z:PROC ; FLevelLocals::EV_DoChange + Line 3188: EXTRN ?EV_StartLightFlickering@FLevelLocals@@QEAAXHHH@Z:PROC ; FLevelLocals::EV_StartLightFlickering + Line 3189: EXTRN ?EV_StartLightStrobing@FLevelLocals@@QEAAXHHHHH@Z:PROC ; FLevelLocals::EV_StartLightStrobing + Line 3190: EXTRN ?EV_StartLightStrobing@FLevelLocals@@QEAAXHHH@Z:PROC ; FLevelLocals::EV_StartLightStrobing + Line 3191: EXTRN ?EV_TurnTagLightsOff@FLevelLocals@@QEAAXH@Z:PROC ; FLevelLocals::EV_TurnTagLightsOff + Line 3192: EXTRN ?EV_LightTurnOn@FLevelLocals@@QEAAXHH@Z:PROC ; FLevelLocals::EV_LightTurnOn + Line 3193: EXTRN ?EV_LightChange@FLevelLocals@@QEAAXHH@Z:PROC ; FLevelLocals::EV_LightChange + Line 3194: EXTRN ?EV_StartLightGlowing@FLevelLocals@@QEAAXHHHH@Z:PROC ; FLevelLocals::EV_StartLightGlowing + Line 3195: EXTRN ?EV_StartLightFading@FLevelLocals@@QEAAXHHH@Z:PROC ; FLevelLocals::EV_StartLightFading + Line 3196: EXTRN ?EV_StopLightEffect@FLevelLocals@@QEAAXH@Z:PROC ; FLevelLocals::EV_StopLightEffect + Line 3197: EXTRN ?EV_Teleport@FLevelLocals@@QEAA_NHHPEAUline_t@@HPEAVAActor@@H@Z:PROC ; FLevelLocals::EV_Teleport + Line 3198: EXTRN ?EV_SilentLineTeleport@FLevelLocals@@QEAA_NPEAUline_t@@HPEAVAActor@@HH@Z:PROC ; FLevelLocals::EV_SilentLineTeleport + Line 3199: EXTRN ?EV_TeleportOther@FLevelLocals@@QEAA_NHH_N@Z:PROC ; FLevelLocals::EV_TeleportOther + Line 3200: EXTRN ?EV_TeleportGroup@FLevelLocals@@QEAA_NHPEAVAActor@@HH_N1@Z:PROC ; FLevelLocals::EV_TeleportGroup + Line 3201: EXTRN ?EV_TeleportSector@FLevelLocals@@QEAA_NHHH_NH@Z:PROC ; FLevelLocals::EV_TeleportSector + Line 3202: EXTRN ?ChangeLevel@FLevelLocals@@QEAAXPEBDHHH@Z:PROC ; FLevelLocals::ChangeLevel + Line 3203: EXTRN ?GetSecretExitMap@FLevelLocals@@QEAAPEBDXZ:PROC ; FLevelLocals::GetSecretExitMap + Line 3204: EXTRN ?ExitLevel@FLevelLocals@@QEAAXH_N@Z:PROC ; FLevelLocals::ExitLevel + Line 3205: EXTRN ?SecretExitLevel@FLevelLocals@@QEAAXH@Z:PROC ; FLevelLocals::SecretExitLevel + Line 3206: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 3207: EXTRN ?SetWallScroller@@YAXPEAUFLevelLocals@@HHNNW4EScrollPos@@@Z:PROC ; SetWallScroller + Line 3208: EXTRN ?SetScroller@@YAXPEAUFLevelLocals@@HW4EScroll@@NN@Z:PROC ; SetScroller + Line 3209: EXTRN __CxxFrameHandler3:PROC + Line 3210: EXTRN ?level@@3UFLevelLocals@@A:BYTE ; level + Line 3211: EXTRN __ImageBase:BYTE + Line 3212: EXTRN __isa_available:DWORD + Line 3213: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_map.cod (140 hits) + Line 265: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 266: EXTRN atexit:PROC + Line 267: EXTRN __std_terminate:PROC + Line 268: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 269: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 270: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 271: EXTRN c_atan:PROC + Line 272: EXTRN c_atan2:PROC + Line 273: EXTRN c_sqrt:PROC + Line 274: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 275: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 276: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 277: EXTRN ?BoxOnLineSide@FBoundingBox@@QEBAHPEBUline_t@@@Z:PROC ; FBoundingBox::BoxOnLineSide + Line 278: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 279: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 280: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 281: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 282: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 283: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 284: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 285: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 286: EXTRN ?P_SpawnPuff@@YAPEAVAActor@@PEAV1@PEAVPClassActor@@AEBU?$TVector3@N@@U?$TAngle@N@@3HH0@Z:PROC ; P_SpawnPuff + Line 287: EXTRN ?P_SpawnBlood@@YAXAEBU?$TVector3@N@@U?$TAngle@N@@HPEAVAActor@@@Z:PROC ; P_SpawnBlood + Line 288: EXTRN ?P_BloodSplatter@@YAXAEBU?$TVector3@N@@PEAVAActor@@U?$TAngle@N@@@Z:PROC ; P_BloodSplatter + Line 289: EXTRN ?P_RipperBlood@@YAXPEAVAActor@@0@Z:PROC ; P_RipperBlood + Line 290: EXTRN ?P_ExplodeMissile@@YAXPEAVAActor@@PEAUline_t@@0_N@Z:PROC ; P_ExplodeMissile + Line 291: EXTRN ?P_CheckFakeFloorTriggers@@YAXPEAVAActor@@N_N@Z:PROC ; P_CheckFakeFloorTriggers + Line 292: EXTRN ?P_CheckSight@@YAHPEAVAActor@@0H@Z:PROC ; P_CheckSight + Line 293: EXTRN ?P_HitWater@@YA_NPEAVAActor@@PEAUsector_t@@AEBU?$TVector3@N@@_N33@Z:PROC ; P_HitWater + Line 294: EXTRN ?P_TouchSpecialThing@@YAXPEAVAActor@@0@Z:PROC ; P_TouchSpecialThing + Line 295: EXTRN ?P_DamageMobj@@YAHPEAVAActor@@00HVFName@@HU?$TAngle@N@@@Z:PROC ; P_DamageMobj + Line 296: EXTRN ?P_PoisonMobj@@YAXPEAVAActor@@00HHHVFName@@@Z:PROC ; P_PoisonMobj + Line 297: EXTRN ?P_GiveBody@@YA_NPEAVAActor@@HH@Z:PROC ; P_GiveBody + Line 298: EXTRN ?P_Recalculate3DFloors@@YAXPEAUsector_t@@@Z:PROC ; P_Recalculate3DFloors + Line 299: EXTRN ?TriggerSectorActions@sector_t@@QEAA_NPEAVAActor@@H@Z:PROC ; sector_t::TriggerSectorActions + Line 300: EXTRN ?NextHighestCeilingAt@@YANPEAUsector_t@@NNNNHPEAPEAU1@PEAPEAUF3DFloor@@@Z:PROC ; NextHighestCeilingAt + Line 301: EXTRN ?NextLowestFloorAt@@YANPEAUsector_t@@NNNHNPEAPEAU1@PEAPEAUF3DFloor@@@Z:PROC ; NextLowestFloorAt + Line 302: EXTRN ?GetTerrain@@YAHPEBUsector_t@@H@Z:PROC ; GetTerrain + Line 303: EXTRN ?CheckPortalPlane@@YAXPEAUsector_t@@H@Z:PROC ; CheckPortalPlane + Line 304: EXTRN ?GetFriction@@YANPEBUsector_t@@HPEAN@Z:PROC ; GetFriction + Line 305: EXTRN ?HighestCeilingAt@@YANPEAUsector_t@@NNPEAPEAU1@@Z:PROC ; HighestCeilingAt + Line 306: EXTRN ?LowestFloorAt@@YANPEAUsector_t@@NNPEAPEAU1@@Z:PROC ; LowestFloorAt + Line 307: EXTRN ?P_ActivateLine@@YA_NPEAUline_t@@PEAVAActor@@HHPEAU?$TVector3@N@@@Z:PROC ; P_ActivateLine + Line 308: EXTRN ?P_PredictLine@@YA_NPEAUline_t@@PEAVAActor@@HH@Z:PROC ; P_PredictLine + Line 309: EXTRN ?FrictionToMoveFactor@@YANN@Z:PROC ; FrictionToMoveFactor + Line 310: EXTRN ?P_StartScript@@YAHPEAUFLevelLocals@@PEAVAActor@@PEAUline_t@@HPEBDPEBHHH@Z:PROC ; P_StartScript + Line 311: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 312: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 313: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 314: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 315: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 316: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 317: EXTRN ?S_Sound@@YAXPEAVAActor@@HVFSoundID@@MM@Z:PROC ; S_Sound + Line 318: EXTRN ?S_GetSoundPlayingInfo@@YA_NPEBVAActor@@H@Z:PROC ; S_GetSoundPlayingInfo + Line 319: EXTRN ?FindState@PClassActor@@QEBAPEAUFState@@HPEAVFName@@_N@Z:PROC ; PClassActor::FindState + Line 320: EXTRN ?GetReplacement@PClassActor@@QEAAPEAV1@_N@Z:PROC ; PClassActor::GetReplacement + Line 321: EXTRN ?P_TranslatePortalXY@@YAXPEAUline_t@@AEAN1@Z:PROC ; P_TranslatePortalXY + Line 322: EXTRN ?P_TranslatePortalVXVY@@YAXPEAUline_t@@AEAN1@Z:PROC ; P_TranslatePortalVXVY + Line 323: EXTRN ?P_TranslatePortalAngle@@YAXPEAUline_t@@AEAU?$TAngle@N@@@Z:PROC ; P_TranslatePortalAngle + Line 324: EXTRN ?P_TranslatePortalZ@@YAXPEAUline_t@@AEAN@Z:PROC ; P_TranslatePortalZ + Line 325: EXTRN ?StaticSpawn@AActor@@SAPEAV1@PEAVPClassActor@@AEBU?$TVector3@N@@W4replace_t@@_N@Z:PROC ; AActor::StaticSpawn + Line 326: EXTRN ?CallActivate@AActor@@QEAAXPEAV1@@Z:PROC ; AActor::CallActivate + Line 327: EXTRN ?CallDeactivate@AActor@@QEAAXPEAV1@@Z:PROC ; AActor::CallDeactivate + Line 328: EXTRN ?CallDie@AActor@@QEAAXPEAV1@0HVFName@@@Z:PROC ; AActor::CallDie + Line 329: EXTRN ?CallSlam@AActor@@QEAA_NPEAV1@@Z:PROC ; AActor::CallSlam + Line 330: EXTRN ?PlayBounceSound@AActor@@QEAAX_N@Z:PROC ; AActor::PlayBounceSound + Line 331: EXTRN ?FloorBounceMissile@AActor@@QEAA_NAEAUsecplane_t@@@Z:PROC ; AActor::FloorBounceMissile + Line 332: EXTRN ?SpecialMissileHit@AActor@@QEAAHPEAV1@@Z:PROC ; AActor::SpecialMissileHit + Line 333: EXTRN ?CheckLocalView@AActor@@QEBA_NH@Z:PROC ; AActor::CheckLocalView + Line 334: EXTRN ?ConversationAnimation@AActor@@QEAAXH@Z:PROC ; AActor::ConversationAnimation + Line 335: EXTRN ?CallGrind@AActor@@QEAA_N_N@Z:PROC ; AActor::CallGrind + Line 336: EXTRN ?IsFriend@AActor@@QEAA_NPEAV1@@Z:PROC ; AActor::IsFriend + Line 337: EXTRN ?IsHostile@AActor@@QEAA_NPEAV1@@Z:PROC ; AActor::IsHostile + Line 338: EXTRN ?CheckPortalTransition@AActor@@QEAAX_N@Z:PROC ; AActor::CheckPortalTransition + Line 339: EXTRN ?GetPortalTransition@AActor@@QEAA?AU?$TVector3@N@@NPEAPEAUsector_t@@@Z:PROC ; AActor::GetPortalTransition + Line 340: EXTRN ?GetSpecies@AActor@@QEAA?AVFName@@XZ:PROC ; AActor::GetSpecies + Line 341: EXTRN ?GetBloodType@AActor@@QEBAPEAVPClassActor@@H@Z:PROC ; AActor::GetBloodType + Line 342: EXTRN ?GetMissileDamage@AActor@@QEAAHHH@Z:PROC ; AActor::GetMissileDamage + Line 343: EXTRN ?IsSentient@AActor@@QEBA_NXZ:PROC ; AActor::IsSentient + Line 344: EXTRN ?CheckSectorTransition@AActor@@QEAAXPEAUsector_t@@@Z:PROC ; AActor::CheckSectorTransition + Line 345: EXTRN ?UpdateRenderSectorList@AActor@@QEAAXXZ:PROC ; AActor::UpdateRenderSectorList + Line 346: EXTRN ?LinkToWorld@AActor@@QEAAXPEAUFLinkContext@@_NPEAUsector_t@@@Z:PROC ; AActor::LinkToWorld + Line 347: EXTRN ?UnlinkFromWorld@AActor@@QEAAXPEAUFLinkContext@@@Z:PROC ; AActor::UnlinkFromWorld + Line 348: EXTRN ?AdjustFloorClip@AActor@@QEAAXXZ:PROC ; AActor::AdjustFloorClip + Line 349: EXTRN ?SetState@AActor@@QEAA_NPEAUFState@@_N@Z:PROC ; AActor::SetState + Line 350: EXTRN ?IsDangerous@FCajunMaster@@QEAA_NPEAUsector_t@@@Z:PROC ; FCajunMaster::IsDangerous + Line 351: EXTRN ?P_VanillaPointOnLineSide@@YAHNNPEBUline_t@@@Z:PROC ; P_VanillaPointOnLineSide + Line 352: EXTRN ?P_LineOpening@@YAXAEAUFLineOpening@@PEAVAActor@@PEBUline_t@@AEBU?$TVector2@N@@PEBU4@H@Z:PROC ; P_LineOpening + Line 353: EXTRN ??0FBlockLinesIterator@@QEAA@PEAUFLevelLocals@@AEBVFBoundingBox@@@Z:PROC ; FBlockLinesIterator::FBlockLinesIterator + Line 354: EXTRN ?Next@FBlockLinesIterator@@QEAAPEAUline_t@@XZ:PROC ; FBlockLinesIterator::Next + Line 355: EXTRN ??0FMultiBlockLinesIterator@@QEAA@AEAUFPortalGroupArray@@PEAVAActor@@N@Z:PROC ; FMultiBlockLinesIterator::FMultiBlockLinesIterator + Line 356: EXTRN ??0FMultiBlockLinesIterator@@QEAA@AEAUFPortalGroupArray@@PEAUFLevelLocals@@NNNNNPEAUsector_t@@@Z:PROC ; FMultiBlockLinesIterator::FMultiBlockLinesIterator + Line 357: EXTRN ?Next@FMultiBlockLinesIterator@@QEAA_NPEAUCheckResult@1@@Z:PROC ; FMultiBlockLinesIterator::Next + Line 358: EXTRN ??0FMultiBlockThingsIterator@@QEAA@AEAUFPortalGroupArray@@PEAVAActor@@N_N@Z:PROC ; FMultiBlockThingsIterator::FMultiBlockThingsIterator + Line 359: EXTRN ??0FMultiBlockThingsIterator@@QEAA@AEAUFPortalGroupArray@@PEAUFLevelLocals@@NNNNN_NPEAUsector_t@@@Z:PROC ; FMultiBlockThingsIterator::FMultiBlockThingsIterator + Line 360: EXTRN ?Next@FMultiBlockThingsIterator@@QEAA_NPEAUCheckResult@1@@Z:PROC ; FMultiBlockThingsIterator::Next + Line 361: EXTRN ?AddLineIntercepts@FPathTraverse@@MEAAXHH@Z:PROC ; FPathTraverse::AddLineIntercepts + Line 362: EXTRN ?AddThingIntercepts@FPathTraverse@@MEAAXHHAEAVFBlockThingsIterator@@_N@Z:PROC ; FPathTraverse::AddThingIntercepts + Line 363: EXTRN ?Next@FPathTraverse@@QEAAPEAUintercept_t@@XZ:PROC ; FPathTraverse::Next + Line 364: EXTRN ?init@FPathTraverse@@QEAAXNNNNHN@Z:PROC ; FPathTraverse::init + Line 365: EXTRN ?PortalRelocate@FPathTraverse@@QEAAHPEAUintercept_t@@HPEAU?$TVector3@N@@@Z:PROC ; FPathTraverse::PortalRelocate + Line 366: EXTRN ??1FPathTraverse@@UEAA@XZ:PROC ; FPathTraverse::~FPathTraverse + Line 367: EXTRN ??_EFPathTraverse@@UEAAPEAXI@Z:PROC ; FPathTraverse::`vector deleting destructor' + Line 368: EXTRN ?P_InterceptVector@@YANPEBUdivline_t@@0@Z:PROC ; P_InterceptVector + Line 369: EXTRN ?P_ExecuteSpecial@@YAHHPEAUline_t@@PEAVAActor@@_NHHHHH@Z:PROC ; P_ExecuteSpecial + Line 370: EXTRN ?P_DrawRailTrail@@YAXPEAVAActor@@AEAV?$TArray@USPortalHit@@U1@@@HHNHPEAVPClassActor@@U?$TAngle@N@@HNNH3@Z:PROC ; P_DrawRailTrail + Line 371: EXTRN ?P_DrawSplash2@@YAXPEAUFLevelLocals@@HAEBU?$TVector3@N@@U?$TAngle@N@@HH@Z:PROC ; P_DrawSplash2 + Line 372: EXTRN ?Trace@@YA_NAEBU?$TVector3@N@@PEAUsector_t@@0NV?$TFlags@W4ActorFlag@@I@@IPEAVAActor@@AEAUFTraceResults@@IP6A?AW4ETraceStatus@@4PEAX@Z5@Z:PROC ; Trace + Line 373: EXTRN ?R_ResetViewInterpolation@@YAXXZ:PROC ; R_ResetViewInterpolation + Line 374: EXTRN ?R_AddInterpolationPoint@@YAXAEBUDVector3a@@@Z:PROC ; R_AddInterpolationPoint + Line 375: EXTRN ?P_GetMidTexturePosition@@YA_NPEBUline_t@@HPEAN1@Z:PROC ; P_GetMidTexturePosition + Line 376: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 377: EXTRN ?GetVirtualIndex@@YAIPEAVPClass@@PEBD@Z:PROC ; GetVirtualIndex + Line 378: EXTRN ?StaticCreate@DImpactDecal@@SAPEAV1@PEAUFLevelLocals@@PEBDAEBU?$TVector3@N@@PEAUside_t@@PEAUF3DFloor@@UPalEntry@@@Z:PROC ; DImpactDecal::StaticCreate + Line 379: EXTRN ?StaticCreate@DImpactDecal@@SAPEAV1@PEAUFLevelLocals@@PEBVFDecalTemplate@@AEBU?$TVector3@N@@PEAUside_t@@PEAUF3DFloor@@UPalEntry@@@Z:PROC ; DImpactDecal::StaticCreate + Line 380: EXTRN ?P_StartConversation@@YAXPEAVAActor@@0_N1@Z:PROC ; P_StartConversation + Line 381: EXTRN ?P_GeometryLineAttack@@YAXAEAUFTraceResults@@PEAVAActor@@HVFName@@@Z:PROC ; P_GeometryLineAttack + Line 382: EXTRN ?P_GeometryRadiusAttack@@YAXPEAVAActor@@0HHVFName@@H@Z:PROC ; P_GeometryRadiusAttack + Line 383: EXTRN ?P_ProjectileHitLinedef@@YA_NPEAVAActor@@PEAUline_t@@@Z:PROC ; P_ProjectileHitLinedef + Line 384: EXTRN ?GetInfighting@FLevelLocals@@QEAAHXZ:PROC ; FLevelLocals::GetInfighting + Line 385: EXTRN ?GetPortalOffsetPosition@FLevelLocals@@QEAA?AU?$TVector2@N@@NNNN@Z:PROC ; FLevelLocals::GetPortalOffsetPosition + Line 386: EXTRN ?PointInSubsector@FLevelLocals@@AEAAPEAUsubsector_t@@NN@Z:PROC ; FLevelLocals::PointInSubsector + Line 387: EXTRN ?IsFreelookAllowed@FLevelLocals@@QEBA_NXZ:PROC ; FLevelLocals::IsFreelookAllowed + Line 388: EXTRN __CxxFrameHandler3:PROC + Line 389: EXTRN memmove:PROC + Line 390: EXTRN memset:PROC + Line 391: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 392: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 393: EXTRN ?M_Random@@3VFRandom@@A:BYTE ; M_Random + Line 394: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 395: EXTRN ?var_friction@@3VFBoolCVar@@A:BYTE ; var_friction + Line 396: EXTRN ?dmflags2@@3VFIntCVar@@A:BYTE ; dmflags2 + Line 397: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 398: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 399: EXTRN ?validcount@@3HA:DWORD ; validcount + Line 400: EXTRN ?Terrains@@3V?$TArray@UFTerrainDef@@U1@@@A:BYTE ; Terrains + Line 401: EXTRN ?skyflatnum@@3VFTextureID@@A:DWORD ; skyflatnum + Line 402: EXTRN ?pr_bounce@@3VFRandom@@A:BYTE ; pr_bounce + Line 403: EXTRN ?cl_bloodtype@@3VFIntCVar@@A:BYTE ; cl_bloodtype + Line 404: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_maputl.cod (36 hits) + Line 87: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 88: EXTRN atexit:PROC + Line 89: EXTRN __std_terminate:PROC + Line 90: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 91: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 92: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 93: EXTRN c_atan2:PROC + Line 94: EXTRN c_sqrt:PROC + Line 95: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 96: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 97: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 98: EXTRN ?P_FindFloorCeiling@@YAXPEAVAActor@@H@Z:PROC ; P_FindFloorCeiling + Line 99: EXTRN ?P_DelSeclist@@YAXPEAUmsecnode_t@@PEQsector_t@@PEAU1@@Z:PROC ; P_DelSeclist + Line 100: EXTRN ?P_CreateSecNodeList@@YAPEAUmsecnode_t@@PEAVAActor@@NPEAU1@PEQsector_t@@PEAU1@@Z:PROC ; P_CreateSecNodeList + Line 101: EXTRN ?P_LineOpening_XFloors@@YAXAEAUFLineOpening@@PEAVAActor@@PEBUline_t@@NN_N@Z:PROC ; P_LineOpening_XFloors + Line 102: EXTRN ?NextLowestFloorAt@@YANPEAUsector_t@@NNNHNPEAPEAU1@PEAPEAUF3DFloor@@@Z:PROC ; NextLowestFloorAt + Line 103: EXTRN ?GetTerrain@@YAHPEBUsector_t@@H@Z:PROC ; GetTerrain + Line 104: EXTRN ?P_VanillaPointOnLineSide@@YAHNNPEBUline_t@@@Z:PROC ; P_VanillaPointOnLineSide + Line 105: EXTRN ??_EFPathTraverse@@UEAAPEAXI@Z:PROC ; FPathTraverse::`vector deleting destructor' + Line 106: EXTRN ?P_LineOpening_3dMidtex@@YA_NPEAVAActor@@PEBUline_t@@AEAUFLineOpening@@_N@Z:PROC ; P_LineOpening_3dMidtex + Line 107: EXTRN ?Create@FBlockNode@@SAPEAU1@PEAVAActor@@HHH@Z:PROC ; FBlockNode::Create + Line 108: EXTRN ?Release@FBlockNode@@QEAAXXZ:PROC ; FBlockNode::Release + Line 109: EXTRN ?P_TranslatePortalXY@@YAXPEAUline_t@@AEAN1@Z:PROC ; P_TranslatePortalXY + Line 110: EXTRN ?P_TranslatePortalZ@@YAXPEAUline_t@@AEAN@Z:PROC ; P_TranslatePortalZ + Line 111: EXTRN ?IsOkayToAttack@AActor@@QEAA_NPEAV1@@Z:PROC ; AActor::IsOkayToAttack + Line 112: EXTRN ?CanSeek@AActor@@QEBA_NPEAV1@@Z:PROC ; AActor::CanSeek + Line 113: EXTRN ?UpdateRenderSectorList@AActor@@QEAAXXZ:PROC ; AActor::UpdateRenderSectorList + Line 114: EXTRN ?ClearRenderSectorList@AActor@@QEAAXXZ:PROC ; AActor::ClearRenderSectorList + Line 115: EXTRN ?ClearRenderLineList@AActor@@QEAAXXZ:PROC ; AActor::ClearRenderLineList + Line 116: EXTRN ?CollectConnectedGroups@FLevelLocals@@QEAA_NHAEBU?$TVector3@N@@NNAEAUFPortalGroupArray@@@Z:PROC ; FLevelLocals::CollectConnectedGroups + Line 117: EXTRN __CxxFrameHandler3:PROC + Line 118: EXTRN memset:PROC + Line 119: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 120: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 121: EXTRN ?validcount@@3HA:DWORD ; validcount + Line 122: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_mobj.cod (210 hits) + Line 184: EXTRN ?RegistrationInfo@DThinker@@2UClassReg@@A:BYTE ; DThinker::RegistrationInfo + Line 1378: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 1379: EXTRN atexit:PROC + Line 1380: EXTRN __std_terminate:PROC + Line 1381: EXTRN atoi:PROC + Line 1382: EXTRN __stdio_common_vfprintf:PROC + Line 1383: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 1384: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 1385: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 1386: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 1387: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 1388: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 1389: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 1390: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 1391: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 1392: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 1393: EXTRN c_atan2:PROC + Line 1394: EXTRN c_sqrt:PROC + Line 1395: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 1396: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 1397: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 1398: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 1399: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 1400: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 1401: EXTRN ?StaticPointerSubstitution@DObject@@SAXPEAVAActor@@0@Z:PROC ; DObject::StaticPointerSubstitution + Line 1402: EXTRN ??0FSharedStringArena@@QEAA@XZ:PROC ; FSharedStringArena::FSharedStringArena + Line 1403: EXTRN ??1FSharedStringArena@@QEAA@XZ:PROC ; FSharedStringArena::~FSharedStringArena + Line 1404: EXTRN ?Alloc@FSharedStringArena@@QEAAPEAVFString@@PEBD@Z:PROC ; FSharedStringArena::Alloc + Line 1405: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 1406: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 1407: EXTRN ?FindFunction@PClass@@SAXPEAPEAVVMFunction@@VFName@@1@Z:PROC ; PClass::FindFunction + Line 1408: EXTRN ?P_SetupPsprites@@YAXPEAVplayer_t@@_N@Z:PROC ; P_SetupPsprites + Line 1409: EXTRN ?P_FallingDamage@@YAXPEAVAActor@@@Z:PROC ; P_FallingDamage + Line 1410: EXTRN ?P_PredictionLerpReset@@YAXXZ:PROC ; P_PredictionLerpReset + Line 1411: EXTRN ?P_CheckPosition@@YA_NPEAVAActor@@AEBU?$TVector2@N@@_N@Z:PROC ; P_CheckPosition + Line 1412: EXTRN ?P_CheckOnmobj@@YAPEAVAActor@@PEAV1@@Z:PROC ; P_CheckOnmobj + Line 1413: EXTRN ?P_TryMove@@YA_NPEAVAActor@@AEBU?$TVector2@N@@HPEBUsecplane_t@@AEAUFCheckPosition@@_N@Z:PROC ; P_TryMove + Line 1414: EXTRN ?P_SlideMove@@YAXPEAVAActor@@AEBU?$TVector2@N@@H@Z:PROC ; P_SlideMove + Line 1415: EXTRN ?P_BounceWall@@YA_NPEAVAActor@@@Z:PROC ; P_BounceWall + Line 1416: EXTRN ?P_BounceActor@@YA_NPEAVAActor@@0_N@Z:PROC ; P_BounceActor + Line 1417: EXTRN ?P_CheckSight@@YAHPEAVAActor@@0H@Z:PROC ; P_CheckSight + Line 1418: EXTRN ?P_FindFloorCeiling@@YAXPEAVAActor@@H@Z:PROC ; P_FindFloorCeiling + Line 1419: EXTRN ?P_AimLineAttack@@YA?AU?$TAngle@N@@PEAVAActor@@U1@NPEAUFTranslatedLineTarget@@1H00@Z:PROC ; P_AimLineAttack + Line 1420: EXTRN ?P_TraceBleed@@YAXHPEAVAActor@@0@Z:PROC ; P_TraceBleed + Line 1421: EXTRN ?P_GetFriction@@YANPEBVAActor@@PEAN@Z:PROC ; P_GetFriction + Line 1422: EXTRN ?P_CheckSlopeWalk@@YAPEBUsecplane_t@@PEAVAActor@@AEAU?$TVector2@N@@@Z:PROC ; P_CheckSlopeWalk + Line 1423: EXTRN ?P_DamageMobj@@YAHPEAVAActor@@00HVFName@@HU?$TAngle@N@@@Z:PROC ; P_DamageMobj + Line 1424: EXTRN ?P_PoisonPlayer@@YA_NPEAVplayer_t@@PEAVAActor@@1H@Z:PROC ; P_PoisonPlayer + Line 1425: EXTRN ?P_CheckFor3DFloorHit@@YA_NPEAVAActor@@N_N@Z:PROC ; P_CheckFor3DFloorHit + Line 1426: EXTRN ?P_CheckFor3DCeilingHit@@YA_NPEAVAActor@@N_N@Z:PROC ; P_CheckFor3DCeilingHit + Line 1427: EXTRN ?P_FindFloorPlane@@YA?AUsecplane_t@@PEAUsector_t@@AEBU?$TVector3@N@@@Z:PROC ; P_FindFloorPlane + Line 1428: EXTRN ?TriggerSectorActions@sector_t@@QEAA_NPEAVAActor@@H@Z:PROC ; sector_t::TriggerSectorActions + Line 1429: EXTRN ?GetTerrain@@YAHPEBUsector_t@@H@Z:PROC ; GetTerrain + Line 1430: EXTRN ?GetFriction@@YANPEBUsector_t@@HPEAN@Z:PROC ; GetFriction + Line 1431: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 1432: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 1433: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 1434: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 1435: EXTRN ?P_GetLineSpecialInfo@@YAPEAUFLineSpecial@@H@Z:PROC ; P_GetLineSpecialInfo + Line 1436: EXTRN ?P_ActivateThingSpecial@@YA_NPEAVAActor@@0_N@Z:PROC ; P_ActivateThingSpecial + Line 1437: EXTRN ?P_DrawSplash2@@YAXPEAUFLevelLocals@@HAEBU?$TVector3@N@@U?$TAngle@N@@HH@Z:PROC ; P_DrawSplash2 + Line 1438: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 1439: EXTRN ?S_Sound@@YAXPEAVAActor@@HVFSoundID@@MM@Z:PROC ; S_Sound + Line 1440: EXTRN ?S_Sound@@YAXPEAUFLevelLocals@@AEBU?$TVector3@N@@HVFSoundID@@MM@Z:PROC ; S_Sound + Line 1441: EXTRN ?S_IsActorPlayingSomething@@YA_NPEAVAActor@@HH@Z:PROC ; S_IsActorPlayingSomething + Line 1442: EXTRN ?S_RelinkSound@@YAXPEAVAActor@@0@Z:PROC ; S_RelinkSound + Line 1443: EXTRN ?S_AreSoundsEquivalent@@YA_NPEAVAActor@@PEBD1@Z:PROC ; S_AreSoundsEquivalent + Line 1444: EXTRN ?Pick@FColorMatcher@@QEAAEHHH@Z:PROC ; FColorMatcher::Pick + Line 1445: EXTRN ?IsVisible@FRenderStyle@@QEBA_NN@Z:PROC ; FRenderStyle::IsVisible + Line 1446: EXTRN ?R_BuildPlayerTranslation@@YAXH@Z:PROC ; R_BuildPlayerTranslation + Line 1447: EXTRN ?R_FindCustomTranslation@@YAHVFName@@@Z:PROC ; R_FindCustomTranslation + Line 1448: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAVFTextureID@@PEAV2@@Z:PROC ; Serialize + Line 1449: EXTRN ?V_GetColor@@YAHPEBIPEBDPEAUFScriptPosition@@@Z:PROC ; V_GetColor + Line 1450: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 1451: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 1452: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 1453: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 1454: EXTRN ?CallAction@FState@@QEAA_NPEAVAActor@@0PEAUFStateParamInfo@@PEAPEAU1@@Z:PROC ; FState::CallAction + Line 1455: EXTRN ?StaticGetStateName@FState@@SA?AVFString@@PEBU1@@Z:PROC ; FState::StaticGetStateName + Line 1456: EXTRN ?ApplyMobjDamageFactor@DamageTypeDefinition@@SAHHVFName@@QEBUDmgFactors@@@Z:PROC ; DamageTypeDefinition::ApplyMobjDamageFactor + Line 1457: EXTRN ?FindState@PClassActor@@QEBAPEAUFState@@HPEAVFName@@_N@Z:PROC ; PClassActor::FindState + Line 1458: EXTRN ?GetReplacement@PClassActor@@QEAAPEAV1@_N@Z:PROC ; PClassActor::GetReplacement + Line 1459: EXTRN ?Link@FThinkerCollection@@QEAAXPEAVDThinker@@H@Z:PROC ; FThinkerCollection::Link + Line 1460: EXTRN ?StaticType@DThinker@@UEBAPEAVPClass@@XZ:PROC ; DThinker::StaticType + Line 1461: EXTRN ?OnDestroy@DThinker@@UEAAXXZ:PROC ; DThinker::OnDestroy + Line 1462: EXTRN ??1DThinker@@UEAA@XZ:PROC ; DThinker::~DThinker + Line 1463: EXTRN ?Tick@DThinker@@UEAAXXZ:PROC ; DThinker::Tick + Line 1464: EXTRN ?PostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::PostBeginPlay + Line 1465: EXTRN ?CallPostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::CallPostBeginPlay + Line 1466: EXTRN ?PostSerialize@DThinker@@UEAAXXZ:PROC ; DThinker::PostSerialize + Line 1467: EXTRN ?Serialize@DThinker@@UEAAXAEAVFSerializer@@@Z:PROC ; DThinker::Serialize + Line 1468: EXTRN ?PropagateMark@DThinker@@UEAA_KXZ:PROC ; DThinker::PropagateMark + Line 1469: EXTRN ??_EDThinker@@UEAAPEAXI@Z:PROC ; DThinker::`vector deleting destructor' + Line 1470: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 1471: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 1472: EXTRN ?G_SkillProperty@@YAHW4ESkillProperty@@@Z:PROC ; G_SkillProperty + Line 1473: EXTRN ?G_SkillProperty@@YANW4EFSkillProperty@@@Z:PROC ; G_SkillProperty + Line 1474: EXTRN ?Die@AActor@@UEAAXPEAV1@0HVFName@@@Z:PROC ; AActor::Die + Line 1475: EXTRN ?CallDie@AActor@@QEAAXPEAV1@0HVFName@@@Z:PROC ; AActor::CallDie + Line 1476: EXTRN ?SetOrigin@AActor@@UEAAXNNN_N@Z:PROC ; AActor::SetOrigin + Line 1477: EXTRN ?UpdateRenderSectorList@AActor@@QEAAXXZ:PROC ; AActor::UpdateRenderSectorList + Line 1478: EXTRN ?ClearRenderSectorList@AActor@@QEAAXXZ:PROC ; AActor::ClearRenderSectorList + Line 1479: EXTRN ?ClearRenderLineList@AActor@@QEAAXXZ:PROC ; AActor::ClearRenderLineList + Line 1480: EXTRN ?SetDynamicLights@AActor@@QEAAXXZ:PROC ; AActor::SetDynamicLights + Line 1481: EXTRN ?LinkToWorld@AActor@@QEAAXPEAUFLinkContext@@_NPEAUsector_t@@@Z:PROC ; AActor::LinkToWorld + Line 1482: EXTRN ?UnlinkFromWorld@AActor@@QEAAXPEAUFLinkContext@@@Z:PROC ; AActor::UnlinkFromWorld + Line 1483: EXTRN ?HasSpecialDeathStates@AActor@@QEBA_NXZ:PROC ; AActor::HasSpecialDeathStates + Line 1484: EXTRN ?DeleteAttachedLights@AActor@@QEAAXXZ:PROC ; AActor::DeleteAttachedLights + Line 1485: EXTRN ??_EAActor@@UEAAPEAXI@Z:PROC ; AActor::`vector deleting destructor' + Line 1486: EXTRN ?CallTryPickup@@YA_NPEAVAActor@@0PEAPEAV1@@Z:PROC ; CallTryPickup + Line 1487: EXTRN ?BotTick@FCajunMaster@@QEAAXPEAVAActor@@@Z:PROC ; FCajunMaster::BotTick + Line 1488: EXTRN ?StaticCreate@DImpactDecal@@SAPEAV1@PEAUFLevelLocals@@PEBVFDecalTemplate@@AEBU?$TVector3@N@@PEAUside_t@@PEAUF3DFloor@@UPalEntry@@@Z:PROC ; DImpactDecal::StaticCreate + Line 1489: EXTRN ?GetPlayer@DBaseStatusBar@@QEAAHXZ:PROC ; DBaseStatusBar::GetPlayer + Line 1490: EXTRN ?AttachToPlayer@DBaseStatusBar@@QEAAXPEAVplayer_t@@@Z:PROC ; DBaseStatusBar::AttachToPlayer + Line 1491: EXTRN ?StartTypedScripts@FBehaviorContainer@@QEAAXGPEAVAActor@@_NH1@Z:PROC ; FBehaviorContainer::StartTypedScripts + Line 1492: EXTRN ?StopMyScripts@FBehaviorContainer@@QEAAXPEAVAActor@@@Z:PROC ; FBehaviorContainer::StopMyScripts + Line 1493: EXTRN ?P_NoiseAlert@@YAXPEAVAActor@@0_NN@Z:PROC ; P_NoiseAlert + Line 1494: EXTRN ?A_BossDeath@@YAXPEAVAActor@@@Z:PROC ; A_BossDeath + Line 1495: EXTRN ?A_Face@@YAXPEAVAActor@@0U?$TAngle@N@@111HN@Z:PROC ; A_Face + Line 1496: EXTRN ??RFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator() + Line 1497: EXTRN ?R_FindSkin@@YAHPEBDH@Z:PROC ; R_FindSkin + Line 1498: EXTRN ?GetFirstSectorTag@FTagManager@@AEBAHPEBUsector_t@@@Z:PROC ; FTagManager::GetFirstSectorTag + Line 1499: EXTRN ?P_SpawnTeleportFog@@YAXPEAVAActor@@AEBU?$TVector3@N@@_N2@Z:PROC ; P_SpawnTeleportFog + Line 1500: EXTRN ?ArraySize@FSerializer@@QEAAIXZ:PROC ; FSerializer::ArraySize + Line 1501: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 1502: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 1503: EXTRN ?Args@FSerializer@@QEAAAEAV1@PEBDPEAH1H@Z:PROC ; FSerializer::Args + Line 1504: EXTRN ?Terrain@FSerializer@@QEAAAEAV1@PEBDAEAHPEAH@Z:PROC ; FSerializer::Terrain + Line 1505: EXTRN ?Sprite@FSerializer@@QEAAAEAV1@PEBDAEAHPEAH@Z:PROC ; FSerializer::Sprite + Line 1506: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 1507: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAIPEAI@Z:PROC ; Serialize + Line 1508: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEACPEAC@Z:PROC ; Serialize + Line 1509: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAEPEAE@Z:PROC ; Serialize + Line 1510: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAFPEAF@Z:PROC ; Serialize + Line 1511: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAGPEAG@Z:PROC ; Serialize + Line 1512: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEANPEAN@Z:PROC ; Serialize + Line 1513: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 1514: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAVFName@@PEAV2@@Z:PROC ; Serialize + Line 1515: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAVFSoundID@@PEAV2@@Z:PROC ; Serialize + Line 1516: EXTRN ??$Serialize@Usector_t@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUsector_t@@PEAPEAU1@@Z:PROC ; Serialize + Line 1517: EXTRN ??$Serialize@Vplayer_t@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAVplayer_t@@PEAPEAV1@@Z:PROC ; Serialize + Line 1518: EXTRN ??$Serialize@Uline_t@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUline_t@@PEAPEAU1@@Z:PROC ; Serialize + Line 1519: EXTRN ??$Serialize@VPClassActor@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAVPClassActor@@PEAPEAV1@@Z:PROC ; Serialize + Line 1520: EXTRN ??$Serialize@UFStrifeDialogueNode@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUFStrifeDialogueNode@@PEAPEAU1@@Z:PROC ; Serialize + Line 1521: EXTRN ??$Serialize@VFString@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAVFString@@PEAPEAV1@@Z:PROC ; Serialize + Line 1522: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAUFState@@PEAPEAU2@PEA_N@Z:PROC ; Serialize + Line 1523: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEATFRenderStyle@@PEAT2@@Z:PROC ; Serialize + Line 1524: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 1525: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 1526: EXTRN ?GetVirtualIndex@@YAIPEAVPClass@@PEBD@Z:PROC ; GetVirtualIndex + Line 1527: EXTRN ?GetFlagName@@YAPEBDIH@Z:PROC ; GetFlagName + Line 1528: EXTRN ?PlayIdle@@YAXPEAVAActor@@@Z:PROC ; PlayIdle + Line 1529: EXTRN ?SkinNumChanged@userinfo_t@@QEAAHH@Z:PROC ; userinfo_t::SkinNumChanged + Line 1530: EXTRN ?GetSpawnClass@player_t@@QEAAHXZ:PROC ; player_t::GetSpawnClass + Line 1531: EXTRN ?P_ProjectileHitLinedef@@YA_NPEAVAActor@@PEAUline_t@@@Z:PROC ; P_ProjectileHitLinedef + Line 1532: EXTRN ?P_ProjectileHitPlane@@YA_NPEAVAActor@@H@Z:PROC ; P_ProjectileHitPlane + Line 1533: EXTRN ?GetConversation@FLevelLocals@@QEAAHH@Z:PROC ; FLevelLocals::GetConversation + Line 1534: EXTRN ?GetConversation@FLevelLocals@@QEAAHVFName@@@Z:PROC ; FLevelLocals::GetConversation + Line 1535: EXTRN ?GetPortalOffsetPosition@FLevelLocals@@QEAA?AU?$TVector2@N@@NNNN@Z:PROC ; FLevelLocals::GetPortalOffsetPosition + Line 1536: EXTRN ?PlayerReborn@FLevelLocals@@QEAAXH@Z:PROC ; FLevelLocals::PlayerReborn + Line 1537: EXTRN ?PointInSubsector@FLevelLocals@@AEAAPEAUsubsector_t@@NN@Z:PROC ; FLevelLocals::PointInSubsector + Line 1538: EXTRN ?IsFreelookAllowed@FLevelLocals@@QEBA_NXZ:PROC ; FLevelLocals::IsFreelookAllowed + Line 1539: EXTRN ?E_WorldThingSpawned@@YAXPEAVAActor@@@Z:PROC ; E_WorldThingSpawned + Line 1540: EXTRN ?E_WorldThingRevived@@YAXPEAVAActor@@@Z:PROC ; E_WorldThingRevived + Line 1541: EXTRN ?E_WorldThingDestroyed@@YAXPEAVAActor@@@Z:PROC ; E_WorldThingDestroyed + Line 1542: EXTRN ?E_PlayerRespawned@@YAXH@Z:PROC ; E_PlayerRespawned + Line 1543: EXTRN ?T_AddSpawnedThing@@YAXPEAUFLevelLocals@@PEAVAActor@@@Z:PROC ; T_AddSpawnedThing + Line 1544: EXTRN __CxxFrameHandler3:PROC + Line 1545: EXTRN memcmp:PROC + Line 1546: EXTRN memcpy:PROC + Line 1547: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 1548: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 1549: EXTRN ?multiplayer@@3_NA:BYTE ; multiplayer + Line 1550: EXTRN ?deathmatch@@3VFIntCVar@@A:BYTE ; deathmatch + Line 1551: EXTRN ?teamplay@@3VFBoolCVar@@A:BYTE ; teamplay + Line 1552: EXTRN ?SinglePlayerClass@@3PAHA:BYTE ; SinglePlayerClass + Line 1553: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 1554: EXTRN ?demoplayback@@3_NA:BYTE ; demoplayback + Line 1555: EXTRN ?playeringame@@3PA_NA:BYTE ; playeringame + Line 1556: EXTRN ?debugfile@@3PEAU_iobuf@@EA:QWORD ; debugfile + Line 1557: EXTRN ?deh@@3UDehInfo@@A:BYTE ; deh + Line 1558: EXTRN ?dmflags@@3VFIntCVar@@A:BYTE ; dmflags + Line 1559: EXTRN ?dmflags2@@3VFIntCVar@@A:BYTE ; dmflags2 + Line 1560: EXTRN ?ColorMatcher@@3VFColorMatcher@@A:QWORD ; ColorMatcher + Line 1561: EXTRN ?LegacyRenderStyles@@3PATFRenderStyle@@A:BYTE ; LegacyRenderStyles + Line 1562: EXTRN ?Splashes@@3V?$TArray@UFSplashDef@@U1@@@A:BYTE ; Splashes + Line 1563: EXTRN ?Terrains@@3V?$TArray@UFTerrainDef@@U1@@@A:BYTE ; Terrains + Line 1564: EXTRN ?pr_statetics@FState@@2VFRandom@@A:BYTE ; FState::pr_statetics + Line 1565: EXTRN ?DoomEdMap@@3V?$TMap@HUFDoomEdEntry@@U?$THashTraits@H@@U?$TValueTraits@UFDoomEdEntry@@@@@@A:BYTE ; DoomEdMap + Line 1566: EXTRN ?savegamerestore@@3_NA:BYTE ; savegamerestore + Line 1567: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 1568: EXTRN ?StatusBar@@3PEAVDBaseStatusBar@@EA:QWORD ; StatusBar + Line 1569: EXTRN ?skyflatnum@@3VFTextureID@@A:DWORD ; skyflatnum + Line 1570: EXTRN ?gameaction@@3W4gameaction_t@@A:DWORD ; gameaction + Line 1571: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 1572: EXTRN ?Skins@@3V?$TArray@VFPlayerSkin@@V1@@@A:BYTE ; Skins + Line 1573: EXTRN ?sprites@@3V?$TArray@Uspritedef_t@@U1@@@A:BYTE ; sprites + Line 1574: EXTRN ?save_full@@3_NA:BYTE ; save_full + Line 1575: EXTRN ?r_viewpoint@@3UFRenderViewpoint@@A:BYTE ; r_viewpoint + Line 1576: EXTRN ?PlayerClasses@@3V?$TArray@VFPlayerClass@@V1@@@A:BYTE ; PlayerClasses + Line 1577: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 1578: EXTRN ?level@@3UFLevelLocals@@A:BYTE ; level + Line 1579: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 1580: EXTRN ?cl_rockettrails@@3VFIntCVar@@A:BYTE ; cl_rockettrails + Line 1581: EXTRN ?chasedemo@@3VFBoolCVar@@A:BYTE ; chasedemo + Line 1582: EXTRN ?sv_singleplayerrespawn@@3VFBoolCVar@@A:BYTE ; sv_singleplayerrespawn + Line 1583: EXTRN ?fov@@3VFFloatCVar@@A:BYTE ; fov + Line 1584: EXTRN ?demonew@@3_NA:BYTE ; demonew + Line 1585: EXTRN __ImageBase:BYTE + Line 1586: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_openmap.cod (31 hits) + Line 40: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 41: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 42: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 43: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 44: EXTRN _Init_thread_header:PROC + Line 45: EXTRN _Init_thread_footer:PROC + Line 46: EXTRN __std_terminate:PROC + Line 47: EXTRN strncpy:PROC + Line 48: EXTRN stricmp:PROC + Line 49: EXTRN strnicmp:PROC + Line 50: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 51: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 52: EXTRN ?OpenResourceFile@FResourceFile@@SAPEAV1@PEBDAEAVFileReader@@_N2@Z:PROC ; FResourceFile::OpenResourceFile + Line 53: EXTRN ?OpenResourceFile@FResourceFile@@SAPEAV1@PEBD_N1@Z:PROC ; FResourceFile::OpenResourceFile + Line 54: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 55: EXTRN ?FileExists@@YA_NPEBD@Z:PROC ; FileExists + Line 56: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 57: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 58: EXTRN ?ReopenLumpReader@FWadCollection@@QEAA?AVFileReader@@H_N@Z:PROC ; FWadCollection::ReopenLumpReader + Line 59: EXTRN ?GetLumpFullName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetLumpFullName + Line 60: EXTRN ?GetLumpFile@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpFile + Line 61: EXTRN ?IsEncryptedFile@FWadCollection@@QEBA_NH@Z:PROC ; FWadCollection::IsEncryptedFile + Line 62: EXTRN ?Init@MD5Context@@QEAAXXZ:PROC ; MD5Context::Init + Line 63: EXTRN ?Update@MD5Context@@QEAAXAEAVFileReader@@I@Z:PROC ; MD5Context::Update + Line 64: EXTRN ?Final@MD5Context@@QEAAXQEAE@Z:PROC ; MD5Context::Final + Line 65: EXTRN _CxxThrowException:PROC + Line 66: EXTRN __CxxFrameHandler3:PROC + Line 67: EXTRN _Init_thread_epoch:DWORD + Line 68: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 69: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 70: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_pillar.cod (47 hits) + Line 13: EXTRN ?RegistrationInfo@DMover@@2UClassReg@@A:BYTE ; DMover::RegistrationInfo + Line 67: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 68: EXTRN __std_terminate:PROC + Line 69: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 70: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 71: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 72: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 73: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 74: EXTRN ?Link@FThinkerCollection@@QEAAXPEAVDThinker@@H@Z:PROC ; FThinkerCollection::Link + Line 75: EXTRN ?StaticType@DThinker@@UEBAPEAVPClass@@XZ:PROC ; DThinker::StaticType + Line 76: EXTRN ?OnDestroy@DThinker@@UEAAXXZ:PROC ; DThinker::OnDestroy + Line 77: EXTRN ??1DThinker@@UEAA@XZ:PROC ; DThinker::~DThinker + Line 78: EXTRN ?Tick@DThinker@@UEAAXXZ:PROC ; DThinker::Tick + Line 79: EXTRN ?PostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::PostBeginPlay + Line 80: EXTRN ?CallPostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::CallPostBeginPlay + Line 81: EXTRN ?PostSerialize@DThinker@@UEAAXXZ:PROC ; DThinker::PostSerialize + Line 82: EXTRN ?Serialize@DThinker@@UEAAXAEAVFSerializer@@@Z:PROC ; DThinker::Serialize + Line 83: EXTRN ?PropagateMark@DThinker@@UEAA_KXZ:PROC ; DThinker::PropagateMark + Line 84: EXTRN ??_EDThinker@@UEAAPEAXI@Z:PROC ; DThinker::`vector deleting destructor' + Line 85: EXTRN ?MoveFloor@sector_t@@QEAA?AW4EMoveResult@@NNHH_N0@Z:PROC ; sector_t::MoveFloor + Line 86: EXTRN ?MoveCeiling@sector_t@@QEAA?AW4EMoveResult@@NNHH_N@Z:PROC ; sector_t::MoveCeiling + Line 87: EXTRN ?SetInterpolation@sector_t@@QEAAPEAVDInterpolation@@H_N@Z:PROC ; sector_t::SetInterpolation + Line 88: EXTRN ?FindLowestFloorSurrounding@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindLowestFloorSurrounding + Line 89: EXTRN ?FindHighestCeilingSurrounding@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindHighestCeilingSurrounding + Line 90: EXTRN ?PlaneMoving@@YAHPEAUsector_t@@H@Z:PROC ; PlaneMoving + Line 91: EXTRN ?StaticType@DSectorEffect@@UEBAPEAVPClass@@XZ:PROC ; DSectorEffect::StaticType + Line 92: EXTRN ?Serialize@DSectorEffect@@UEAAXAEAVFSerializer@@@Z:PROC ; DSectorEffect::Serialize + Line 93: EXTRN ?OnDestroy@DSectorEffect@@UEAAXXZ:PROC ; DSectorEffect::OnDestroy + Line 94: EXTRN ??_EDSectorEffect@@UEAAPEAXI@Z:PROC ; DSectorEffect::`vector deleting destructor' + Line 95: EXTRN ?StaticType@DMover@@UEBAPEAVPClass@@XZ:PROC ; DMover::StaticType + Line 96: EXTRN ?Construct@DMover@@IEAAXPEAUsector_t@@@Z:PROC ; DMover::Construct + Line 97: EXTRN ?Serialize@DMover@@MEAAXAEAVFSerializer@@@Z:PROC ; DMover::Serialize + Line 98: EXTRN ?OnDestroy@DMover@@MEAAXXZ:PROC ; DMover::OnDestroy + Line 99: EXTRN ??_EDMover@@UEAAPEAXI@Z:PROC ; DMover::`vector deleting destructor' + Line 100: EXTRN ?Next@FSectorTagIterator@@QEAAHXZ:PROC ; FSectorTagIterator::Next + Line 101: EXTRN ??_EDPillar@@UEAAPEAXI@Z:PROC ; DPillar::`vector deleting destructor' + Line 102: EXTRN ?SN_StartSequence@@YAPEAVDSeqNode@@PEAUsector_t@@HHW4seqtype_t@@H_N@Z:PROC ; SN_StartSequence + Line 103: EXTRN ?SN_StartSequence@@YAPEAVDSeqNode@@PEAUsector_t@@HPEBDH@Z:PROC ; SN_StartSequence + Line 104: EXTRN ?SN_StartSequence@@YAPEAVDSeqNode@@PEAUsector_t@@HVFName@@H@Z:PROC ; SN_StartSequence + Line 105: EXTRN ?SN_StopSequence@@YAXPEAUsector_t@@H@Z:PROC ; SN_StopSequence + Line 106: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEA_NPEA_N@Z:PROC ; Serialize + Line 107: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 108: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEANPEAN@Z:PROC ; Serialize + Line 109: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 110: EXTRN ?DelRef@DInterpolation@@QEAAH_N@Z:PROC ; DInterpolation::DelRef + Line 111: EXTRN __CxxFrameHandler3:PROC + Line 112: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_plats.cod (57 hits) + Line 13: EXTRN ?RegistrationInfo@DMovingFloor@@2UClassReg@@A:BYTE ; DMovingFloor::RegistrationInfo + Line 74: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 75: EXTRN atexit:PROC + Line 76: EXTRN __std_terminate:PROC + Line 77: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 78: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 79: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 80: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 81: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 82: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 83: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 84: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 85: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 86: EXTRN ?SN_StartSequence@@YAPEAVDSeqNode@@PEAUsector_t@@HHW4seqtype_t@@H_N@Z:PROC ; SN_StartSequence + Line 87: EXTRN ?SN_StartSequence@@YAPEAVDSeqNode@@PEAUsector_t@@HPEBDH@Z:PROC ; SN_StartSequence + Line 88: EXTRN ?SN_StartSequence@@YAPEAVDSeqNode@@PEAUsector_t@@HVFName@@H@Z:PROC ; SN_StartSequence + Line 89: EXTRN ?SN_StopSequence@@YAXPEAUsector_t@@H@Z:PROC ; SN_StopSequence + Line 90: EXTRN ?MoveFloor@sector_t@@QEAA?AW4EMoveResult@@NNHH_N0@Z:PROC ; sector_t::MoveFloor + Line 91: EXTRN ?FindLowestFloorSurrounding@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindLowestFloorSurrounding + Line 92: EXTRN ?FindHighestFloorSurrounding@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindHighestFloorSurrounding + Line 93: EXTRN ?FindNextHighestFloor@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindNextHighestFloor + Line 94: EXTRN ?FindNextLowestFloor@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindNextLowestFloor + Line 95: EXTRN ?FindLowestCeilingSurrounding@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindLowestCeilingSurrounding + Line 96: EXTRN ?FindLowestCeilingPoint@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindLowestCeilingPoint + Line 97: EXTRN ?PlaneMoving@@YAHPEAUsector_t@@H@Z:PROC ; PlaneMoving + Line 98: EXTRN ?AdjustFloorClip@@YAXPEBUsector_t@@@Z:PROC ; AdjustFloorClip + Line 99: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 100: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEANPEAN@Z:PROC ; Serialize + Line 101: EXTRN ?Link@FThinkerCollection@@QEAAXPEAVDThinker@@H@Z:PROC ; FThinkerCollection::Link + Line 102: EXTRN ?StaticType@DThinker@@UEBAPEAVPClass@@XZ:PROC ; DThinker::StaticType + Line 103: EXTRN ?OnDestroy@DThinker@@UEAAXXZ:PROC ; DThinker::OnDestroy + Line 104: EXTRN ??1DThinker@@UEAA@XZ:PROC ; DThinker::~DThinker + Line 105: EXTRN ?Tick@DThinker@@UEAAXXZ:PROC ; DThinker::Tick + Line 106: EXTRN ?PostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::PostBeginPlay + Line 107: EXTRN ?CallPostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::CallPostBeginPlay + Line 108: EXTRN ?PostSerialize@DThinker@@UEAAXXZ:PROC ; DThinker::PostSerialize + Line 109: EXTRN ?Serialize@DThinker@@UEAAXAEAVFSerializer@@@Z:PROC ; DThinker::Serialize + Line 110: EXTRN ?PropagateMark@DThinker@@UEAA_KXZ:PROC ; DThinker::PropagateMark + Line 111: EXTRN ??_EDThinker@@UEAAPEAXI@Z:PROC ; DThinker::`vector deleting destructor' + Line 112: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 113: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 114: EXTRN ?StaticType@DSectorEffect@@UEBAPEAVPClass@@XZ:PROC ; DSectorEffect::StaticType + Line 115: EXTRN ?Serialize@DSectorEffect@@UEAAXAEAVFSerializer@@@Z:PROC ; DSectorEffect::Serialize + Line 116: EXTRN ?OnDestroy@DSectorEffect@@UEAAXXZ:PROC ; DSectorEffect::OnDestroy + Line 117: EXTRN ??_EDSectorEffect@@UEAAPEAXI@Z:PROC ; DSectorEffect::`vector deleting destructor' + Line 118: EXTRN ?StaticType@DMover@@UEBAPEAVPClass@@XZ:PROC ; DMover::StaticType + Line 119: EXTRN ?Serialize@DMover@@MEAAXAEAVFSerializer@@@Z:PROC ; DMover::Serialize + Line 120: EXTRN ?OnDestroy@DMover@@MEAAXXZ:PROC ; DMover::OnDestroy + Line 121: EXTRN ??_EDMover@@UEAAPEAXI@Z:PROC ; DMover::`vector deleting destructor' + Line 122: EXTRN ?StaticType@DMovingFloor@@UEBAPEAVPClass@@XZ:PROC ; DMovingFloor::StaticType + Line 123: EXTRN ?Construct@DMovingFloor@@IEAAXPEAUsector_t@@@Z:PROC ; DMovingFloor::Construct + Line 124: EXTRN ??_EDMovingFloor@@UEAAPEAXI@Z:PROC ; DMovingFloor::`vector deleting destructor' + Line 125: EXTRN ?Next@FSectorTagIterator@@QEAAHXZ:PROC ; FSectorTagIterator::Next + Line 126: EXTRN ??_EDPlat@@UEAAPEAXI@Z:PROC ; DPlat::`vector deleting destructor' + Line 127: EXTRN __CxxFrameHandler3:PROC + Line 128: EXTRN __ImageBase:BYTE + Line 129: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_pspr.cod (62 hits) + Line 121: EXTRN ?RegistrationInfo@DObject@@2UClassReg@@A:BYTE ; DObject::RegistrationInfo + Line 122: EXTRN ?StateLabels@@3UFStateLabelStorage@@A:BYTE ; StateLabels + Line 123: EXTRN ??_EStat_psprites@@UEAAPEAXI@Z:PROC ; Stat_psprites::`vector deleting destructor' + Line 124: EXTRN ?bot_observer@@3VFBoolCVar@@A:BYTE ; bot_observer + Line 683: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 684: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 685: EXTRN atexit:PROC + Line 686: EXTRN __std_terminate:PROC + Line 687: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 688: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 689: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 690: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 691: EXTRN ?AppendFormat@FString@@QEAAXPEBDZZ:PROC ; FString::AppendFormat + Line 692: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 693: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 694: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 695: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 696: EXTRN ?Barrier@GC@@YAXPEAVDObject@@0@Z:PROC ; GC::Barrier + Line 697: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 698: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 699: EXTRN ??1DObject@@UEAA@XZ:PROC ; DObject::~DObject + Line 700: EXTRN ?Serialize@DObject@@UEAAXAEAVFSerializer@@@Z:PROC ; DObject::Serialize + Line 701: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 702: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 703: EXTRN ?PropagateMark@DObject@@UEAA_KXZ:PROC ; DObject::PropagateMark + Line 704: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 705: EXTRN ?FindFunction@PClass@@SAXPEAPEAVVMFunction@@VFName@@1@Z:PROC ; PClass::FindFunction + Line 706: EXTRN ?P_AimLineAttack@@YA?AU?$TAngle@N@@PEAVAActor@@U1@NPEAUFTranslatedLineTarget@@1H00@Z:PROC ; P_AimLineAttack + Line 707: EXTRN ?CheckFuzz@FRenderStyle@@QEAAXXZ:PROC ; FRenderStyle::CheckFuzz + Line 708: EXTRN ??_EDPSprite@@UEAAPEAXI@Z:PROC ; DPSprite::`vector deleting destructor' + Line 709: EXTRN ?CallAction@FState@@QEAA_NPEAVAActor@@0PEAUFStateParamInfo@@PEAPEAU1@@Z:PROC ; FState::CallAction + Line 710: EXTRN ?StaticFindStateOwner@FState@@SAPEAVPClassActor@@PEBU1@@Z:PROC ; FState::StaticFindStateOwner + Line 711: EXTRN ?StaticGetStateName@FState@@SA?AVFString@@PEBU1@@Z:PROC ; FState::StaticGetStateName + Line 712: EXTRN ?FindState@PClassActor@@QEBAPEAUFState@@HPEAVFName@@_N@Z:PROC ; PClassActor::FindState + Line 713: EXTRN ?GetState@FStateLabelStorage@@QEAAPEAUFState@@HPEAVPClassActor@@_N@Z:PROC ; FStateLabelStorage::GetState + Line 714: EXTRN ??0FStat@@QEAA@PEBD@Z:PROC ; FStat::FStat + Line 715: EXTRN ??1FStat@@UEAA@XZ:PROC ; FStat::~FStat + Line 716: EXTRN ?FindInventory@AActor@@QEAAPEAV1@VFName@@_N@Z:PROC ; AActor::FindInventory + Line 717: EXTRN ?Sprite@FSerializer@@QEAAAEAV1@PEBDAEAHPEAH@Z:PROC ; FSerializer::Sprite + Line 718: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 719: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEANPEAN@Z:PROC ; Serialize + Line 720: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 721: EXTRN ??$Serialize@Vplayer_t@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAVplayer_t@@PEAPEAV1@@Z:PROC ; Serialize + Line 722: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAUFState@@PEAPEAU2@PEA_N@Z:PROC ; Serialize + Line 723: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEATFRenderStyle@@PEAT2@@Z:PROC ; Serialize + Line 724: EXTRN ?IsFreelookAllowed@FLevelLocals@@QEBA_NXZ:PROC ; FLevelLocals::IsFreelookAllowed + Line 725: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 726: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 727: EXTRN ?GetVirtualIndex@@YAIPEAVPClass@@PEBD@Z:PROC ; GetVirtualIndex + Line 728: EXTRN __CxxFrameHandler3:PROC + Line 729: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 730: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 731: EXTRN ?State@GC@@3W4EGCState@1@A:DWORD ; GC::State + Line 732: EXTRN ?playeringame@@3PA_NA:BYTE ; playeringame + Line 733: EXTRN ?dmflags2@@3VFIntCVar@@A:BYTE ; dmflags2 + Line 734: EXTRN ?LegacyRenderStyles@@3PATFRenderStyle@@A:BYTE ; LegacyRenderStyles + Line 735: EXTRN ?pr_statetics@FState@@2VFRandom@@A:BYTE ; FState::pr_statetics + Line 736: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 737: EXTRN ?WP_NOCHANGE@@3PEAVAActor@@EA:QWORD ; WP_NOCHANGE + Line 738: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 739: EXTRN ?StatusBar@@3PEAVDBaseStatusBar@@EA:QWORD ; StatusBar + Line 740: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_pusher.cod (47 hits) + Line 14: EXTRN ?RegistrationInfo@DThinker@@2UClassReg@@A:BYTE ; DThinker::RegistrationInfo + Line 77: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 78: EXTRN atexit:PROC + Line 79: EXTRN __std_terminate:PROC + Line 80: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 81: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 82: EXTRN c_atan2:PROC + Line 83: EXTRN c_sqrt:PROC + Line 84: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 85: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 86: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 87: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 88: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 89: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 90: EXTRN ?Link@FThinkerCollection@@QEAAXPEAVDThinker@@H@Z:PROC ; FThinkerCollection::Link + Line 91: EXTRN ?StaticType@DThinker@@UEBAPEAVPClass@@XZ:PROC ; DThinker::StaticType + Line 92: EXTRN ?OnDestroy@DThinker@@UEAAXXZ:PROC ; DThinker::OnDestroy + Line 93: EXTRN ??1DThinker@@UEAA@XZ:PROC ; DThinker::~DThinker + Line 94: EXTRN ?Tick@DThinker@@UEAAXXZ:PROC ; DThinker::Tick + Line 95: EXTRN ?PostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::PostBeginPlay + Line 96: EXTRN ?CallPostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::CallPostBeginPlay + Line 97: EXTRN ?PostSerialize@DThinker@@UEAAXXZ:PROC ; DThinker::PostSerialize + Line 98: EXTRN ?Serialize@DThinker@@UEAAXAEAVFSerializer@@@Z:PROC ; DThinker::Serialize + Line 99: EXTRN ?PropagateMark@DThinker@@UEAA_KXZ:PROC ; DThinker::PropagateMark + Line 100: EXTRN ??_EDThinker@@UEAAPEAXI@Z:PROC ; DThinker::`vector deleting destructor' + Line 101: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 102: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 103: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 104: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 105: EXTRN ?IsSentient@AActor@@QEBA_NXZ:PROC ; AActor::IsSentient + Line 106: EXTRN ?SectorHasTag@FTagManager@@AEBA_NHH@Z:PROC ; FTagManager::SectorHasTag + Line 107: EXTRN ?Next@FSectorTagIterator@@QEAAHXZ:PROC ; FSectorTagIterator::Next + Line 108: EXTRN ?ArraySize@FSerializer@@QEAAIXZ:PROC ; FSerializer::ArraySize + Line 109: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 110: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 111: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 112: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEANPEAN@Z:PROC ; Serialize + Line 113: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 114: EXTRN ??0FMultiBlockThingsIterator@@QEAA@AEAUFPortalGroupArray@@PEAVAActor@@N_N@Z:PROC ; FMultiBlockThingsIterator::FMultiBlockThingsIterator + Line 115: EXTRN ?Next@FMultiBlockThingsIterator@@QEAA_NPEAUCheckResult@1@@Z:PROC ; FMultiBlockThingsIterator::Next + Line 116: EXTRN ?P_CheckSight@@YAHPEAVAActor@@0H@Z:PROC ; P_CheckSight + Line 117: EXTRN ??_EDPusher@@UEAAPEAXI@Z:PROC ; DPusher::`vector deleting destructor' + Line 118: EXTRN __CxxFrameHandler3:PROC + Line 119: EXTRN memcmp:PROC + Line 120: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 121: EXTRN ?save_full@@3_NA:BYTE ; save_full + Line 122: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_saveg.cod (91 hits) + Line 201: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 202: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 203: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 204: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 205: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 206: EXTRN ??_V@YAXPEAX_K@Z:PROC ; operator delete[] + Line 207: EXTRN __std_terminate:PROC + Line 208: EXTRN stricmp:PROC + Line 209: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 210: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 211: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 212: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 213: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 214: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 215: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 216: EXTRN ?DestroyAllThinkers@FThinkerCollection@@QEAAXXZ:PROC ; FThinkerCollection::DestroyAllThinkers + Line 217: EXTRN ?SerializeThinkers@FThinkerCollection@@QEAAXAEAVFSerializer@@_N@Z:PROC ; FThinkerCollection::SerializeThinkers + Line 218: EXTRN ?P_Recalculate3DFloors@@YAXPEAUsector_t@@@Z:PROC ; P_Recalculate3DFloors + Line 219: EXTRN ?R_FindSkin@@YAHPEBDH@Z:PROC ; R_FindSkin + Line 220: EXTRN ?S_SerializeSounds@@YAXAEAVFSerializer@@@Z:PROC ; S_SerializeSounds + Line 221: EXTRN ?S_ChangeMusic@@YA_NPEBDH_N1@Z:PROC ; S_ChangeMusic + Line 222: EXTRN ?S_ChangeCDMusic@@YA_NHI_N@Z:PROC ; S_ChangeCDMusic + Line 223: EXTRN ?S_GetMusic@@YAHPEAPEBD@Z:PROC ; S_GetMusic + Line 224: EXTRN ?S_FindEnvironment@@YAPEAUReverbContainer@@H@Z:PROC ; S_FindEnvironment + Line 225: EXTRN ?StaticSerializeTranslations@FRemapTable@@SAXAEAVFSerializer@@@Z:PROC ; FRemapTable::StaticSerializeTranslations + Line 226: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAVFTextureID@@PEAV2@@Z:PROC ; Serialize + Line 227: EXTRN ?InitPortalGroups@@YAXPEAUFLevelLocals@@@Z:PROC ; InitPortalGroups + Line 228: EXTRN ?Clear@FWeaponSlots@@QEAAXXZ:PROC ; FWeaponSlots::Clear + Line 229: EXTRN ?SetupWeaponSlots@FWeaponSlots@@SAXPEAVAActor@@@Z:PROC ; FWeaponSlots::SetupWeaponSlots + Line 230: EXTRN ??1userinfo_t@@QEAA@XZ:PROC ; userinfo_t::~userinfo_t + Line 231: EXTRN ?SkinNumChanged@userinfo_t@@QEAAHH@Z:PROC ; userinfo_t::SkinNumChanged + Line 232: EXTRN ?PlayerClassChanged@userinfo_t@@QEAAHPEBD@Z:PROC ; userinfo_t::PlayerClassChanged + Line 233: EXTRN ??1player_t@@QEAA@XZ:PROC ; player_t::~player_t + Line 234: EXTRN ??4player_t@@QEAAAEAV0@AEBV0@@Z:PROC ; player_t::operator= + Line 235: EXTRN ?Serialize@player_t@@QEAAXAEAVFSerializer@@@Z:PROC ; player_t::Serialize + Line 236: EXTRN ?SendPitchLimits@player_t@@QEBAXXZ:PROC ; player_t::SendPitchLimits + Line 237: EXTRN ?ClearInterpolations@FInterpolator@@QEAAXXZ:PROC ; FInterpolator::ClearInterpolations + Line 238: EXTRN ??0FPolyObj@@QEAA@XZ:PROC ; FPolyObj::FPolyObj + Line 239: EXTRN ?MovePolyobj@FPolyObj@@QEAA_NAEBU?$TVector2@N@@_N@Z:PROC ; FPolyObj::MovePolyobj + Line 240: EXTRN ?RotatePolyobj@FPolyObj@@QEAA_NU?$TAngle@N@@_N@Z:PROC ; FPolyObj::RotatePolyobj + Line 241: EXTRN ?SerializeModuleStates@FBehaviorContainer@@QEAAXAEAVFSerializer@@@Z:PROC ; FBehaviorContainer::SerializeModuleStates + Line 242: EXTRN ?SerializeMessages@DBaseStatusBar@@QEAAXAEAVFSerializer@@@Z:PROC ; DBaseStatusBar::SerializeMessages + Line 243: EXTRN ?InitSkyMap@@YAXPEAUFLevelLocals@@@Z:PROC ; InitSkyMap + Line 244: EXTRN ?ArraySize@FSerializer@@QEAAIXZ:PROC ; FSerializer::ArraySize + Line 245: EXTRN ?ReadObjects@FSerializer@@QEAAX_N@Z:PROC ; FSerializer::ReadObjects + Line 246: EXTRN ?BeginObject@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginObject + Line 247: EXTRN ?EndObject@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndObject + Line 248: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 249: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 250: EXTRN ?GetSize@FSerializer@@QEAAIPEBD@Z:PROC ; FSerializer::GetSize + Line 251: EXTRN ?Args@FSerializer@@QEAAAEAV1@PEBDPEAH1H@Z:PROC ; FSerializer::Args + Line 252: EXTRN ?Terrain@FSerializer@@QEAAAEAV1@PEBDAEAHPEAH@Z:PROC ; FSerializer::Terrain + Line 253: EXTRN ?StringPtr@FSerializer@@QEAAAEAV1@PEBDAEAPEBD@Z:PROC ; FSerializer::StringPtr + Line 254: EXTRN ?canSkip@FSerializer@@QEBA_NXZ:PROC ; FSerializer::canSkip + Line 255: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEA_NPEA_N@Z:PROC ; Serialize + Line 256: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 257: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAIPEAI@Z:PROC ; Serialize + Line 258: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEACPEAC@Z:PROC ; Serialize + Line 259: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAEPEAE@Z:PROC ; Serialize + Line 260: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAFPEAF@Z:PROC ; Serialize + Line 261: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAGPEAG@Z:PROC ; Serialize + Line 262: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEANPEAN@Z:PROC ; Serialize + Line 263: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAMPEAM@Z:PROC ; Serialize + Line 264: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 265: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAVFName@@PEAV2@@Z:PROC ; Serialize + Line 266: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAUFInterpolator@@PEAU2@@Z:PROC ; Serialize + Line 267: EXTRN ??$Serialize@Usector_t@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUsector_t@@PEAPEAU1@@Z:PROC ; Serialize + Line 268: EXTRN ??$Serialize@Uline_t@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUline_t@@PEAPEAU1@@Z:PROC ; Serialize + Line 269: EXTRN ?P_SerializeHealthGroups@@YAXPEAUFLevelLocals@@AEAVFSerializer@@@Z:PROC ; P_SerializeHealthGroups + Line 270: EXTRN ?Serialize@FCanvasTextureInfo@@QEAAXAEAVFSerializer@@@Z:PROC ; FCanvasTextureInfo::Serialize + Line 271: EXTRN ?SetMusicVolume@FLevelLocals@@QEAAXM@Z:PROC ; FLevelLocals::SetMusicVolume + Line 272: EXTRN ?SetCompatLineOnSide@FLevelLocals@@QEAAX_N@Z:PROC ; FLevelLocals::SetCompatLineOnSide + Line 273: EXTRN ?FinalizePortals@FLevelLocals@@QEAAXXZ:PROC ; FLevelLocals::FinalizePortals + Line 274: EXTRN ?SpawnPlayer@FLevelLocals@@QEAAPEAVAActor@@PEAUFPlayerStart@@HH@Z:PROC ; FLevelLocals::SpawnPlayer + Line 275: EXTRN ?AirControlChanged@FLevelLocals@@QEAAXXZ:PROC ; FLevelLocals::AirControlChanged + Line 276: EXTRN ?RecreateAllAttachedLights@FLevelLocals@@QEAAXXZ:PROC ; FLevelLocals::RecreateAllAttachedLights + Line 277: EXTRN ?E_SerializeEvents@@YAXAEAVFSerializer@@@Z:PROC ; E_SerializeEvents + Line 278: EXTRN __CxxFrameHandler3:PROC + Line 279: EXTRN memcmp:PROC + Line 280: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 281: EXTRN ?Skins@@3V?$TArray@VFPlayerSkin@@V1@@@A:BYTE ; Skins + Line 282: EXTRN ?multiplayer@@3_NA:BYTE ; multiplayer + Line 283: EXTRN ?deathmatch@@3VFIntCVar@@A:BYTE ; deathmatch + Line 284: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 285: EXTRN ?SaveVersion@@3HA:DWORD ; SaveVersion + Line 286: EXTRN ?playeringame@@3PA_NA:BYTE ; playeringame + Line 287: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 288: EXTRN ?StatusBar@@3PEAVDBaseStatusBar@@EA:QWORD ; StatusBar + Line 289: EXTRN ?save_full@@3_NA:BYTE ; save_full + Line 290: EXTRN ?level@@3UFLevelLocals@@A:BYTE ; level + Line 291: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_scroll.cod (47 hits) + Line 13: EXTRN ?RegistrationInfo@DThinker@@2UClassReg@@A:BYTE ; DThinker::RegistrationInfo + Line 74: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 75: EXTRN __std_terminate:PROC + Line 76: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 77: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 78: EXTRN c_atan2:PROC + Line 79: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 80: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 81: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 82: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 83: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 84: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 85: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 86: EXTRN ?Link@FThinkerCollection@@QEAAXPEAVDThinker@@H@Z:PROC ; FThinkerCollection::Link + Line 87: EXTRN ?StaticType@DThinker@@UEBAPEAVPClass@@XZ:PROC ; DThinker::StaticType + Line 88: EXTRN ?OnDestroy@DThinker@@UEAAXXZ:PROC ; DThinker::OnDestroy + Line 89: EXTRN ??1DThinker@@UEAA@XZ:PROC ; DThinker::~DThinker + Line 90: EXTRN ?Tick@DThinker@@UEAAXXZ:PROC ; DThinker::Tick + Line 91: EXTRN ?PostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::PostBeginPlay + Line 92: EXTRN ?CallPostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::CallPostBeginPlay + Line 93: EXTRN ?PostSerialize@DThinker@@UEAAXXZ:PROC ; DThinker::PostSerialize + Line 94: EXTRN ?Serialize@DThinker@@UEAAXAEAVFSerializer@@@Z:PROC ; DThinker::Serialize + Line 95: EXTRN ?PropagateMark@DThinker@@UEAA_KXZ:PROC ; DThinker::PropagateMark + Line 96: EXTRN ??_EDThinker@@UEAAPEAXI@Z:PROC ; DThinker::`vector deleting destructor' + Line 97: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 98: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 99: EXTRN ?SetInterpolation@sector_t@@QEAAPEAVDInterpolation@@H_N@Z:PROC ; sector_t::SetInterpolation + Line 100: EXTRN ?SetInterpolation@side_t@@QEAAPEAVDInterpolation@@H@Z:PROC ; side_t::SetInterpolation + Line 101: EXTRN ?SectorHasTag@FTagManager@@AEBA_NPEBUsector_t@@H@Z:PROC ; FTagManager::SectorHasTag + Line 102: EXTRN ?LineHasID@FTagManager@@AEBA_NPEBUline_t@@H@Z:PROC ; FTagManager::LineHasID + Line 103: EXTRN ?Next@FSectorTagIterator@@QEAAHXZ:PROC ; FSectorTagIterator::Next + Line 104: EXTRN ?Next@FLineIdIterator@@QEAAHXZ:PROC ; FLineIdIterator::Next + Line 105: EXTRN ?ArraySize@FSerializer@@QEAAIXZ:PROC ; FSerializer::ArraySize + Line 106: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 107: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 108: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 109: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEANPEAN@Z:PROC ; Serialize + Line 110: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 111: EXTRN ??$Serialize@Usector_t@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUsector_t@@PEAPEAU1@@Z:PROC ; Serialize + Line 112: EXTRN ??$Serialize@Uside_t@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUside_t@@PEAPEAU1@@Z:PROC ; Serialize + Line 113: EXTRN ?DelRef@DInterpolation@@QEAAH_N@Z:PROC ; DInterpolation::DelRef + Line 114: EXTRN ?AddScroller@FLevelLocals@@QEAAXH@Z:PROC ; FLevelLocals::AddScroller + Line 115: EXTRN ??_EDScroller@@UEAAPEAXI@Z:PROC ; DScroller::`vector deleting destructor' + Line 116: EXTRN __CxxFrameHandler3:PROC + Line 117: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 118: EXTRN ?save_full@@3_NA:BYTE ; save_full + Line 119: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_secnodes.cod (11 hits) + Line 41: EXTRN atexit:PROC + Line 42: EXTRN ?BoxOnLineSide@FBoundingBox@@QEBAHPEBUline_t@@@Z:PROC ; FBoundingBox::BoxOnLineSide + Line 43: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 44: EXTRN ??0FMemArena@@QEAA@_K@Z:PROC ; FMemArena::FMemArena + Line 45: EXTRN ??1FMemArena@@QEAA@XZ:PROC ; FMemArena::~FMemArena + Line 46: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 47: EXTRN ?PointInSubsector@FLevelLocals@@AEAAPEAUsubsector_t@@NN@Z:PROC ; FLevelLocals::PointInSubsector + Line 48: EXTRN ??0FBlockLinesIterator@@QEAA@PEAUFLevelLocals@@AEBVFBoundingBox@@@Z:PROC ; FBlockLinesIterator::FBlockLinesIterator + Line 49: EXTRN ?Next@FBlockLinesIterator@@QEAAPEAUline_t@@XZ:PROC ; FBlockLinesIterator::Next + Line 50: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 51: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_sectors.cod (46 hits) + Line 122: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 123: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 124: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 125: EXTRN atexit:PROC + Line 126: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 127: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 128: EXTRN c_atan2:PROC + Line 129: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 130: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 131: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 132: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 133: EXTRN ?P_RecalculateAttachedLights@@YAXPEAUsector_t@@@Z:PROC ; P_RecalculateAttachedLights + Line 134: EXTRN ?IsLinked@sector_t@@QEBA_NPEAU1@_N@Z:PROC ; sector_t::IsLinked + Line 135: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 136: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 137: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 138: EXTRN ??0FNodeBuilder@@QEAA@AEAUFLevel@0@@Z:PROC ; FNodeBuilder::FNodeBuilder + Line 139: EXTRN ??1FNodeBuilder@@QEAA@XZ:PROC ; FNodeBuilder::~FNodeBuilder + Line 140: EXTRN ?Clear@FNodeBuilder@@QEAAXXZ:PROC ; FNodeBuilder::Clear + Line 141: EXTRN ?AddPolySegs@FNodeBuilder@@QEAAXPEAUFPolySeg@@H@Z:PROC ; FNodeBuilder::AddPolySegs + Line 142: EXTRN ?AddSegs@FNodeBuilder@@QEAAXPEAUseg_t@@H@Z:PROC ; FNodeBuilder::AddSegs + Line 143: EXTRN ?BuildMini@FNodeBuilder@@QEAAX_N@Z:PROC ; FNodeBuilder::BuildMini + Line 144: EXTRN ?ExtractMini@FNodeBuilder@@QEAAXPEAUFMiniBSP@@@Z:PROC ; FNodeBuilder::ExtractMini + Line 145: EXTRN ?GetGlowColor@FTexture@@QEAAXPEAM@Z:PROC ; FTexture::GetGlowColor + Line 146: EXTRN ?GetTextureID@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::GetTextureID + Line 147: EXTRN ?BeginObject@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginObject + Line 148: EXTRN ?EndObject@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndObject + Line 149: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 150: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAFPEAF@Z:PROC ; Serialize + Line 151: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAVFName@@PEAV2@@Z:PROC ; Serialize + Line 152: EXTRN ?AdjustFloorClip@AActor@@QEAAXXZ:PROC ; AActor::AdjustFloorClip + Line 153: EXTRN ?PointInSubsector@FLevelLocals@@AEAAPEAUsubsector_t@@NN@Z:PROC ; FLevelLocals::PointInSubsector + Line 154: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 155: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 156: EXTRN ?GetVirtualIndex@@YAIPEAVPClass@@PEBD@Z:PROC ; GetVirtualIndex + Line 157: EXTRN __CxxFrameHandler3:PROC + Line 158: EXTRN atan:PROC + Line 159: EXTRN memmove:PROC + Line 160: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 161: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 162: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 163: EXTRN ?DefaultTerrainType@@3GA:WORD ; DefaultTerrainType + Line 164: EXTRN ?TerrainTypes@@3VFTerrainTypeArray@@A:BYTE ; TerrainTypes + Line 165: EXTRN ?Terrains@@3V?$TArray@UFTerrainDef@@U1@@@A:BYTE ; Terrains + Line 166: EXTRN ?skyflatnum@@3VFTextureID@@A:DWORD ; skyflatnum + Line 167: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_setup.cod (87 hits) + Line 11: EXTRN ?gamestate@@3W4gamestate_t@@A:DWORD ; gamestate + Line 71: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 72: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 73: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 74: EXTRN ??_V@YAXPEAX_K@Z:PROC ; operator delete[] + Line 75: EXTRN atexit:PROC + Line 76: EXTRN __std_terminate:PROC + Line 77: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 78: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 79: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 80: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 81: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 82: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 83: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 84: EXTRN ??HFTextureID@@QEAA?AV0@H@Z:PROC ; FTextureID::operator+ + Line 85: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 86: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 87: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 88: EXTRN ?atterm@@YAXP6AXXZ@Z:PROC ; atterm + Line 89: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 90: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 91: EXTRN ?DestroyThinkers@FThinkerList@@QEAAXXZ:PROC ; FThinkerList::DestroyThinkers + Line 92: EXTRN ?DestroyAllThinkers@FThinkerCollection@@QEAAXXZ:PROC ; FThinkerCollection::DestroyAllThinkers + Line 93: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 94: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 95: EXTRN ?S_Start@@YAXXZ:PROC ; S_Start + Line 96: EXTRN ?S_PrecacheLevel@@YAXPEAUFLevelLocals@@@Z:PROC ; S_PrecacheLevel + Line 97: EXTRN ??1FRemapTable@@QEAA@XZ:PROC ; FRemapTable::~FRemapTable + Line 98: EXTRN ?CheckForTexture@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::CheckForTexture + Line 99: EXTRN ?FindSwitch@FTextureManager@@QEAAPEAUFSwitchDef@@VFTextureID@@@Z:PROC ; FTextureManager::FindSwitch + Line 100: EXTRN ?FindAnimatedDoor@FTextureManager@@QEAAPEAUFDoorAnimation@@VFTextureID@@@Z:PROC ; FTextureManager::FindAnimatedDoor + Line 101: EXTRN ?ClearCounters@AActor@@QEAAXXZ:PROC ; AActor::ClearCounters + Line 102: EXTRN ?P_ClearParticles@@YAXPEAUFLevelLocals@@@Z:PROC ; P_ClearParticles + Line 103: EXTRN ?P_InitEffects@@YAXXZ:PROC ; P_InitEffects + Line 104: EXTRN ?P_InitTerrainTypes@@YAXXZ:PROC ; P_InitTerrainTypes + Line 105: EXTRN ?C_MidPrint@@YAXPEAVFFont@@PEBD@Z:PROC ; C_MidPrint + Line 106: EXTRN ?UnloadModules@FBehaviorContainer@@QEAAXXZ:PROC ; FBehaviorContainer::UnloadModules + Line 107: EXTRN ?AnnounceGameStart@@YA_NXZ:PROC ; AnnounceGameStart + Line 108: EXTRN ??1FStrifeDialogueNode@@QEAA@XZ:PROC ; FStrifeDialogueNode::~FStrifeDialogueNode + Line 109: EXTRN ?P_InitKeyMessages@@YAXXZ:PROC ; P_InitKeyMessages + Line 110: EXTRN ?SN_StopAllSequences@@YAXPEAUFLevelLocals@@@Z:PROC ; SN_StopAllSequences + Line 111: EXTRN ?ST_Clear@@YAXXZ:PROC ; ST_Clear + Line 112: EXTRN ?GetChecksum@MapData@@QEAAXQEAE@Z:PROC ; MapData::GetChecksum + Line 113: EXTRN ?P_OpenMapData@@YAPEAUMapData@@PEBD_N@Z:PROC ; P_OpenMapData + Line 114: EXTRN ?ClearInterpolations@FInterpolator@@QEAAXXZ:PROC ; FInterpolator::ClearInterpolations + Line 115: EXTRN ?R_InitSprites@@YAXXZ:PROC ; R_InitSprites + Line 116: EXTRN ?R_FreePastViewers@@YAXXZ:PROC ; R_FreePastViewers + Line 117: EXTRN ?EmptyList@FCanvasTextureInfo@@QEAAXXZ:PROC ; FCanvasTextureInfo::EmptyList + Line 118: EXTRN ?SetMusicVolume@FLevelLocals@@QEAAXM@Z:PROC ; FLevelLocals::SetMusicVolume + Line 119: EXTRN ?ClearAllSubsectorLinks@FLevelLocals@@QEAAXXZ:PROC ; FLevelLocals::ClearAllSubsectorLinks + Line 120: EXTRN ?SetCompatLineOnSide@FLevelLocals@@QEAAX_N@Z:PROC ; FLevelLocals::SetCompatLineOnSide + Line 121: EXTRN ?SpawnPlayer@FLevelLocals@@QEAAPEAVAActor@@PEAUFPlayerStart@@HH@Z:PROC ; FLevelLocals::SpawnPlayer + Line 122: EXTRN ?StartLightning@FLevelLocals@@QEAAXXZ:PROC ; FLevelLocals::StartLightning + Line 123: EXTRN ?DeathMatchSpawnPlayer@FLevelLocals@@QEAAXH@Z:PROC ; FLevelLocals::DeathMatchSpawnPlayer + Line 124: EXTRN ?PickPlayerStart@FLevelLocals@@QEAAPEAUFPlayerStart@@HH@Z:PROC ; FLevelLocals::PickPlayerStart + Line 125: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 126: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 127: EXTRN ?E_InitStaticHandlers@@YAX_N@Z:PROC ; E_InitStaticHandlers + Line 128: EXTRN ?E_Shutdown@@YAX_N@Z:PROC ; E_Shutdown + Line 129: EXTRN ?E_NewGame@@YAXW4EventHandlerType@@@Z:PROC ; E_NewGame + Line 130: EXTRN ?I_msTimeFS@@YA_KXZ:PROC ; I_msTimeFS + Line 131: EXTRN ?LoadLevel@MapLoader@@QEAAXPEAUMapData@@PEBDH@Z:PROC ; MapLoader::LoadLevel + Line 132: EXTRN ?AM_Create@@YAPEAVDAutomapBase@@PEAUFLevelLocals@@@Z:PROC ; AM_Create + Line 133: EXTRN ?T_PreprocessScripts@@YAXPEAUFLevelLocals@@@Z:PROC ; T_PreprocessScripts + Line 134: EXTRN ?hw_PrecacheTexture@@YAXPEAEAEAV?$TMap@PEAVPClassActor@@_NU?$THashTraits@PEAVPClassActor@@@@U?$TValueTraits@_N@@@@@Z:PROC ; hw_PrecacheTexture + Line 135: EXTRN __CxxFrameHandler3:PROC + Line 136: EXTRN memcpy:PROC + Line 137: EXTRN memset:PROC + Line 138: EXTRN ?deathmatch@@3VFIntCVar@@A:BYTE ; deathmatch + Line 139: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 140: EXTRN ?demoplayback@@3_NA:BYTE ; demoplayback + Line 141: EXTRN ?playeringame@@3PA_NA:BYTE ; playeringame + Line 142: EXTRN ?precache@@3_NA:BYTE ; precache + Line 143: EXTRN ?dmflags2@@3VFIntCVar@@A:BYTE ; dmflags2 + Line 144: EXTRN ?translationtables@@3PAV?$TAutoGrowArray@VFRemapTablePtr@@PEAUFRemapTable@@@@A:BYTE ; translationtables + Line 145: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 146: EXTRN ?savegamerestore@@3_NA:BYTE ; savegamerestore + Line 147: EXTRN ?vid_rendermode@@3VFIntCVar@@A:BYTE ; vid_rendermode + Line 148: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 149: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 150: EXTRN ?wminfo@@3Uwbstartstruct_t@@A:BYTE ; wminfo + Line 151: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 152: EXTRN ?SWRenderer@@3PEAUFRenderer@@EA:QWORD ; SWRenderer + Line 153: EXTRN ?R_OldBlend@@3IA:DWORD ; R_OldBlend + Line 154: EXTRN ?level@@3UFLevelLocals@@A:BYTE ; level + Line 155: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 156: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_sight.cod (25 hits) + Line 14: EXTRN ??_EStat_sight@@UEAAPEAXI@Z:PROC ; Stat_sight::`vector deleting destructor' + Line 57: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 58: EXTRN atexit:PROC + Line 59: EXTRN __std_terminate:PROC + Line 60: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 61: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 62: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 63: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 64: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 65: EXTRN c_sqrt:PROC + Line 66: EXTRN ?P_InterceptVector@@YANPEBUdivline_t@@0@Z:PROC ; P_InterceptVector + Line 67: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 68: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 69: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 70: EXTRN ?IsVisible@FRenderStyle@@QEBA_NN@Z:PROC ; FRenderStyle::IsVisible + Line 71: EXTRN ??0FStat@@QEAA@PEBD@Z:PROC ; FStat::FStat + Line 72: EXTRN ??1FStat@@UEAA@XZ:PROC ; FStat::~FStat + Line 73: EXTRN ?GetPortalTransition@AActor@@QEAA?AU?$TVector3@N@@NPEAPEAUsector_t@@@Z:PROC ; AActor::GetPortalTransition + Line 74: EXTRN ?PointInSubsector@FLevelLocals@@AEAAPEAUsubsector_t@@NN@Z:PROC ; FLevelLocals::PointInSubsector + Line 75: EXTRN __CxxFrameHandler3:PROC + Line 76: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 77: EXTRN ?validcount@@3HA:DWORD ; validcount + Line 78: EXTRN ?PerfToSec@@3NA:QWORD ; PerfToSec + Line 79: EXTRN ?PerfToMillisec@@3NA:QWORD ; PerfToMillisec + Line 80: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_slopes.cod (18 hits) + Line 37: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 38: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 39: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 40: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 41: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 42: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 43: EXTRN c_sqrt:PROC + Line 44: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 45: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 46: EXTRN ?P_PointInSubsector@@YAPEAUsubsector_t@@NN@Z:PROC ; P_PointInSubsector + Line 47: EXTRN ?Next@FSectorTagIterator@@QEAAHXZ:PROC ; FSectorTagIterator::Next + Line 48: EXTRN ?Next@FLineIdIterator@@QEAAHXZ:PROC ; FLineIdIterator::Next + Line 49: EXTRN __CxxFrameHandler3:PROC + Line 50: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 51: EXTRN ?ib_compatflags@@3HA:DWORD ; ib_compatflags + Line 52: EXTRN ?tagManager@@3VFTagManager@@A:BYTE ; tagManager + Line 53: EXTRN ?level@@3UFLevelLocals@@A:BYTE ; level + Line 54: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_spec.cod (78 hits) + Line 31: EXTRN ?RegistrationInfo@DThinker@@2UClassReg@@A:BYTE ; DThinker::RegistrationInfo + Line 192: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 193: EXTRN atexit:PROC + Line 194: EXTRN __std_terminate:PROC + Line 195: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 196: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 197: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 198: EXTRN ?AppendFormat@FString@@QEAAXPEBDZZ:PROC ; FString::AppendFormat + Line 199: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 200: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 201: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 202: EXTRN ?FindClusterInfo@@YAPEAUcluster_info_t@@H@Z:PROC ; FindClusterInfo + Line 203: EXTRN ??RFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator() + Line 204: EXTRN ??AFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator[] + Line 205: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 206: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 207: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 208: EXTRN ?LowestFloorAt@@YANPEAUsector_t@@NNPEAPEAU1@@Z:PROC ; LowestFloorAt + Line 209: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEA_NPEA_N@Z:PROC ; Serialize + Line 210: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 211: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAEPEAE@Z:PROC ; Serialize + Line 212: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAFPEAF@Z:PROC ; Serialize + Line 213: EXTRN ??$Serialize@Usector_t@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUsector_t@@PEAPEAU1@@Z:PROC ; Serialize + Line 214: EXTRN ?E_WorldLinePreActivated@@YAXPEAUline_t@@PEAVAActor@@HPEA_N@Z:PROC ; E_WorldLinePreActivated + Line 215: EXTRN ?E_WorldLineActivated@@YAXPEAUline_t@@PEAVAActor@@H@Z:PROC ; E_WorldLineActivated + Line 216: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 217: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 218: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 219: EXTRN ?P_HitWater@@YA_NPEAVAActor@@PEAUsector_t@@AEBU?$TVector3@N@@_N33@Z:PROC ; P_HitWater + Line 220: EXTRN ?P_DamageMobj@@YAHPEAVAActor@@00HVFName@@HU?$TAngle@N@@@Z:PROC ; P_DamageMobj + Line 221: EXTRN ?P_GiveBody@@YA_NPEAVAActor@@HH@Z:PROC ; P_GiveBody + Line 222: EXTRN ?StaticType@DThinker@@UEBAPEAVPClass@@XZ:PROC ; DThinker::StaticType + Line 223: EXTRN ?OnDestroy@DThinker@@UEAAXXZ:PROC ; DThinker::OnDestroy + Line 224: EXTRN ??1DThinker@@UEAA@XZ:PROC ; DThinker::~DThinker + Line 225: EXTRN ?Tick@DThinker@@UEAAXXZ:PROC ; DThinker::Tick + Line 226: EXTRN ?PostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::PostBeginPlay + Line 227: EXTRN ?CallPostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::CallPostBeginPlay + Line 228: EXTRN ?PostSerialize@DThinker@@UEAAXXZ:PROC ; DThinker::PostSerialize + Line 229: EXTRN ?Serialize@DThinker@@UEAAXAEAVFSerializer@@@Z:PROC ; DThinker::Serialize + Line 230: EXTRN ?PropagateMark@DThinker@@UEAA_KXZ:PROC ; DThinker::PropagateMark + Line 231: EXTRN ??_EDThinker@@UEAAPEAXI@Z:PROC ; DThinker::`vector deleting destructor' + Line 232: EXTRN ?LineHasID@FTagManager@@AEBA_NPEBUline_t@@H@Z:PROC ; FTagManager::LineHasID + Line 233: EXTRN ?Next@FSectorTagIterator@@QEAAHXZ:PROC ; FSectorTagIterator::Next + Line 234: EXTRN ?Next@FLineIdIterator@@QEAAHXZ:PROC ; FLineIdIterator::Next + Line 235: EXTRN ?P_ChangeSwitchTexture@@YA_NPEAUside_t@@HEPEA_N@Z:PROC ; P_ChangeSwitchTexture + Line 236: EXTRN ?P_CheckSwitchRange@@YA_NPEAVAActor@@PEAUline_t@@HPEBU?$TVector3@N@@@Z:PROC ; P_CheckSwitchRange + Line 237: EXTRN ?P_ExecuteSpecial@@YAHHPEAUline_t@@PEAVAActor@@_NHHHHH@Z:PROC ; P_ExecuteSpecial + Line 238: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 239: EXTRN ?S_Sound@@YAXHVFSoundID@@MM@Z:PROC ; S_Sound + Line 240: EXTRN ?S_Sound@@YAXPEAVAActor@@HVFSoundID@@MM@Z:PROC ; S_Sound + Line 241: EXTRN ?CheckLocalView@AActor@@QEBA_NH@Z:PROC ; AActor::CheckLocalView + Line 242: EXTRN ?FindInventory@AActor@@QEAAPEAV1@PEAVPClassActor@@_N@Z:PROC ; AActor::FindInventory + Line 243: EXTRN ?P_CheckKeys@@YAHPEAVAActor@@H_N1@Z:PROC ; P_CheckKeys + Line 244: EXTRN ?ExitLevel@FLevelLocals@@QEAAXH_N@Z:PROC ; FLevelLocals::ExitLevel + Line 245: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 246: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 247: EXTRN ?GetVirtualIndex@@YAIPEAVPClass@@PEBD@Z:PROC ; GetVirtualIndex + Line 248: EXTRN ?C_MidPrint@@YAXPEAVFFont@@PEBD@Z:PROC ; C_MidPrint + Line 249: EXTRN ??_EDLightTransfer@@UEAAPEAXI@Z:PROC ; DLightTransfer::`vector deleting destructor' + Line 250: EXTRN ??_EDWallLightTransfer@@UEAAPEAXI@Z:PROC ; DWallLightTransfer::`vector deleting destructor' + Line 251: EXTRN __CxxFrameHandler3:PROC + Line 252: EXTRN ?multiplayer@@3_NA:BYTE ; multiplayer + Line 253: EXTRN ?deathmatch@@3VFIntCVar@@A:BYTE ; deathmatch + Line 254: EXTRN ?alwaysapplydmflags@@3VFBoolCVar@@A:BYTE ; alwaysapplydmflags + Line 255: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 256: EXTRN ?developer@@3VFIntCVar@@A:BYTE ; developer + Line 257: EXTRN ?dmflags@@3VFIntCVar@@A:BYTE ; dmflags + Line 258: EXTRN ?dmflags2@@3VFIntCVar@@A:BYTE ; dmflags2 + Line 259: EXTRN ?gameaction@@3W4gameaction_t@@A:DWORD ; gameaction + Line 260: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 261: EXTRN ?SmallFont@@3PEAVFFont@@EA:QWORD ; SmallFont + Line 262: EXTRN ?Splashes@@3V?$TArray@UFSplashDef@@U1@@@A:BYTE ; Splashes + Line 263: EXTRN ?Terrains@@3V?$TArray@UFTerrainDef@@U1@@@A:BYTE ; Terrains + Line 264: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 265: EXTRN ?cl_predict_specials@@3VFBoolCVar@@A:BYTE ; cl_predict_specials + Line 266: EXTRN ?timelimit@@3VFFloatCVar@@A:BYTE ; timelimit + Line 267: EXTRN __ImageBase:BYTE + Line 268: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_states.cod (47 hits) + Line 57: EXTRN ?SpriteFrames@@3V?$TArray@Uspriteframe_t@@U1@@@A:BYTE ; SpriteFrames + Line 58: EXTRN ?Skins@@3V?$TArray@VFPlayerSkin@@V1@@@A:BYTE ; Skins + Line 59: EXTRN ?sprites@@3V?$TArray@Uspritedef_t@@U1@@@A:BYTE ; sprites + Line 346: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 347: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 348: EXTRN atexit:PROC + Line 349: EXTRN _Init_thread_header:PROC + Line 350: EXTRN _Init_thread_abort:PROC + Line 351: EXTRN _Init_thread_footer:PROC + Line 352: EXTRN __std_terminate:PROC + Line 353: EXTRN qsort:PROC + Line 354: EXTRN strtoll:PROC + Line 355: EXTRN strchr:PROC + Line 356: EXTRN strstr:PROC + Line 357: EXTRN strtok:PROC + Line 358: EXTRN stricmp:PROC + Line 359: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 360: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 361: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 362: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 363: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 364: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 365: EXTRN ??HFString@@QEBA?AV0@PEBD@Z:PROC ; FString::operator+ + Line 366: EXTRN ??HFString@@QEBA?AV0@D@Z:PROC ; FString::operator+ + Line 367: EXTRN ??0FStringf@@QEAA@PEBDZZ:PROC ; FStringf::FStringf + Line 368: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 369: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 370: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 371: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 372: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 373: EXTRN ??0FScriptPosition@@QEAA@AEBU0@@Z:PROC ; FScriptPosition::FScriptPosition + Line 374: EXTRN ?copystring@@YAPEADPEBD@Z:PROC ; copystring + Line 375: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 376: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 377: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 378: EXTRN ?SaveStateSourceLines@@YAXPEAUFState@@AEAV?$TArray@UFScriptPosition@@U1@@@@Z:PROC ; SaveStateSourceLines + Line 379: EXTRN __CxxFrameHandler3:PROC + Line 380: EXTRN memcpy:PROC + Line 381: EXTRN memmove:PROC + Line 382: EXTRN _Init_thread_epoch:DWORD + Line 383: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 384: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 385: EXTRN ?ClassDataAllocator@@3VFMemArena@@A:BYTE ; ClassDataAllocator + Line 386: EXTRN ?AllActorClasses@PClassActor@@2V?$TArray@PEAVPClassActor@@PEAV1@@@A:BYTE ; PClassActor::AllActorClasses + Line 387: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 388: EXTRN _fltused:DWORD + Line 389: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_switch.cod (52 hits) + Line 13: EXTRN ?RegistrationInfo@DThinker@@2UClassReg@@A:BYTE ; DThinker::RegistrationInfo + Line 70: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 71: EXTRN atexit:PROC + Line 72: EXTRN __std_terminate:PROC + Line 73: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 74: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 75: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 76: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 77: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 78: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 79: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 80: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 81: EXTRN ?P_GetMidTexturePosition@@YA_NPEBUline_t@@HPEAN1@Z:PROC ; P_GetMidTexturePosition + Line 82: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 83: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 84: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 85: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 86: EXTRN ?S_Sound@@YAXPEAUFLevelLocals@@AEBU?$TVector3@N@@HVFSoundID@@MM@Z:PROC ; S_Sound + Line 87: EXTRN ?ArraySize@FSerializer@@QEAAIXZ:PROC ; FSerializer::ArraySize + Line 88: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 89: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 90: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEA_NPEA_N@Z:PROC ; Serialize + Line 91: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 92: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAIPEAI@Z:PROC ; Serialize + Line 93: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEACPEAC@Z:PROC ; Serialize + Line 94: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEANPEAN@Z:PROC ; Serialize + Line 95: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAVFTextureID@@PEAV2@@Z:PROC ; Serialize + Line 96: EXTRN ??$Serialize@Uside_t@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUside_t@@PEAPEAU1@@Z:PROC ; Serialize + Line 97: EXTRN ?P_LineOpening@@YAXAEAUFLineOpening@@PEAVAActor@@PEBUline_t@@AEBU?$TVector2@N@@PEBU4@H@Z:PROC ; P_LineOpening + Line 98: EXTRN ?P_InterceptVector@@YANPEBUdivline_t@@0@Z:PROC ; P_InterceptVector + Line 99: EXTRN ?Link@FThinkerCollection@@QEAAXPEAVDThinker@@H@Z:PROC ; FThinkerCollection::Link + Line 100: EXTRN ?StaticType@DThinker@@UEBAPEAVPClass@@XZ:PROC ; DThinker::StaticType + Line 101: EXTRN ?OnDestroy@DThinker@@UEAAXXZ:PROC ; DThinker::OnDestroy + Line 102: EXTRN ??1DThinker@@UEAA@XZ:PROC ; DThinker::~DThinker + Line 103: EXTRN ?Tick@DThinker@@UEAAXXZ:PROC ; DThinker::Tick + Line 104: EXTRN ?PostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::PostBeginPlay + Line 105: EXTRN ?CallPostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::CallPostBeginPlay + Line 106: EXTRN ?PostSerialize@DThinker@@UEAAXXZ:PROC ; DThinker::PostSerialize + Line 107: EXTRN ?Serialize@DThinker@@UEAAXAEAVFSerializer@@@Z:PROC ; DThinker::Serialize + Line 108: EXTRN ?PropagateMark@DThinker@@UEAA_KXZ:PROC ; DThinker::PropagateMark + Line 109: EXTRN ??_EDThinker@@UEAAPEAXI@Z:PROC ; DThinker::`vector deleting destructor' + Line 110: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 111: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 112: EXTRN ?FindSwitch@FTextureManager@@QEAAPEAUFSwitchDef@@VFTextureID@@@Z:PROC ; FTextureManager::FindSwitch + Line 113: EXTRN ?PointInSubsector@FLevelLocals@@AEAAPEAUsubsector_t@@NN@Z:PROC ; FLevelLocals::PointInSubsector + Line 114: EXTRN ??_EDActiveButton@@UEAAPEAXI@Z:PROC ; DActiveButton::`vector deleting destructor' + Line 115: EXTRN __CxxFrameHandler3:PROC + Line 116: EXTRN memcmp:PROC + Line 117: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 118: EXTRN ?save_full@@3_NA:BYTE ; save_full + Line 119: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 120: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_tags.cod (7 hits) + Line 37: EXTRN atexit:PROC + Line 38: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 39: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 40: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 41: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 42: EXTRN memset:PROC + Line 43: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_teleport.cod (33 hits) + Line 92: EXTRN atexit:PROC + Line 93: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 94: EXTRN c_atan2:PROC + Line 95: EXTRN c_sqrt:PROC + Line 96: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 97: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 98: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 99: EXTRN ?P_TeleportMove@@YA_NPEAVAActor@@AEBU?$TVector3@N@@_N2@Z:PROC ; P_TeleportMove + Line 100: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 101: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 102: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 103: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 104: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 105: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 106: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 107: EXTRN ?StaticSpawn@AActor@@SAPEAV1@PEAVPClassActor@@AEBU?$TVector3@N@@W4replace_t@@_N@Z:PROC ; AActor::StaticSpawn + Line 108: EXTRN ?PlayIdle@@YAXPEAVAActor@@@Z:PROC ; PlayIdle + Line 109: EXTRN ?R_ResetViewInterpolation@@YAXXZ:PROC ; R_ResetViewInterpolation + Line 110: EXTRN ?SectorHasTag@FTagManager@@AEBA_NPEBUsector_t@@H@Z:PROC ; FTagManager::SectorHasTag + Line 111: EXTRN ?Next@FSectorTagIterator@@QEAAHXZ:PROC ; FSectorTagIterator::Next + Line 112: EXTRN ?Next@FLineIdIterator@@QEAAHXZ:PROC ; FLineIdIterator::Next + Line 113: EXTRN ?GetPortalOffsetPosition@FLevelLocals@@QEAA?AU?$TVector2@N@@NNNN@Z:PROC ; FLevelLocals::GetPortalOffsetPosition + Line 114: EXTRN ?PointInSubsector@FLevelLocals@@AEAAPEAUsubsector_t@@NN@Z:PROC ; FLevelLocals::PointInSubsector + Line 115: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 116: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 117: EXTRN ?GetVirtualIndex@@YAIPEAVPClass@@PEBD@Z:PROC ; GetVirtualIndex + Line 118: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 119: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 120: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 121: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 122: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 123: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 124: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_terrain.cod (31 hits) + Line 408: EXTRN atexit:PROC + Line 409: EXTRN __std_terminate:PROC + Line 410: EXTRN stricmp:PROC + Line 411: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 412: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 413: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 414: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 415: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 416: EXTRN ?CheckForTexture@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::CheckForTexture + Line 417: EXTRN ?FindLump@FWadCollection@@QEAAHPEBDPEAH_N@Z:PROC ; FWadCollection::FindLump + Line 418: EXTRN ??0FScanner@@QEAA@H@Z:PROC ; FScanner::FScanner + Line 419: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 420: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 421: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 422: EXTRN ?CheckString@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::CheckString + Line 423: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 424: EXTRN ?MustGetFloat@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetFloat + Line 425: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 426: EXTRN ?MustMatchString@FScanner@@QEAAHPEBQEBD_K@Z:PROC ; FScanner::MustMatchString + Line 427: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 428: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 429: EXTRN __CxxFrameHandler3:PROC + Line 430: EXTRN memset:PROC + Line 431: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 432: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 433: EXTRN ?GameNames@@3PAPEBDA:BYTE ; GameNames + Line 434: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 435: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 436: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 437: EXTRN __ImageBase:BYTE + Line 438: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_things.cod (71 hits) + Line 140: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 141: EXTRN atexit:PROC + Line 142: EXTRN __std_terminate:PROC + Line 143: EXTRN qsort:PROC + Line 144: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 145: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 146: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 147: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 148: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 149: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 150: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 151: EXTRN c_asin:PROC + Line 152: EXTRN c_acos:PROC + Line 153: EXTRN c_atan2:PROC + Line 154: EXTRN c_sqrt:PROC + Line 155: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 156: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 157: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 158: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 159: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 160: EXTRN ?P_CanResurrect@@YA_NPEAVAActor@@0@Z:PROC ; P_CanResurrect + Line 161: EXTRN ?P_TestMobjLocation@@YAHPEAVAActor@@@Z:PROC ; P_TestMobjLocation + Line 162: EXTRN ?P_CheckPosition@@YA_NPEAVAActor@@AEBU?$TVector2@N@@_N@Z:PROC ; P_CheckPosition + Line 163: EXTRN ?P_TryMove@@YA_NPEAVAActor@@AEBU?$TVector2@N@@HPEBUsecplane_t@@_N@Z:PROC ; P_TryMove + Line 164: EXTRN ?P_CheckSight@@YAHPEAVAActor@@0H@Z:PROC ; P_CheckSight + Line 165: EXTRN ?P_CheckMissileSpawn@@YA_NPEAVAActor@@N@Z:PROC ; P_CheckMissileSpawn + Line 166: EXTRN ?P_PlaySpawnSound@@YAXPEAVAActor@@0@Z:PROC ; P_PlaySpawnSound + Line 167: EXTRN ?P_DamageMobj@@YAHPEAVAActor@@00HVFName@@HU?$TAngle@N@@@Z:PROC ; P_DamageMobj + Line 168: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 169: EXTRN ?S_Sound@@YAXPEAVAActor@@HVFSoundID@@MM@Z:PROC ; S_Sound + Line 170: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 171: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 172: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 173: EXTRN ?GetReplacement@PClassActor@@QEAAPEAV1@_N@Z:PROC ; PClassActor::GetReplacement + Line 174: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 175: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 176: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 177: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 178: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 179: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 180: EXTRN ?CheckString@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::CheckString + Line 181: EXTRN ?CheckNumber@FScanner@@QEAA_NXZ:PROC ; FScanner::CheckNumber + Line 182: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 183: EXTRN ?ScriptMessage@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptMessage + Line 184: EXTRN ?ParseOpenBrace@FMapInfoParser@@QEAAXXZ:PROC ; FMapInfoParser::ParseOpenBrace + Line 185: EXTRN ?StaticSpawn@AActor@@SAPEAV1@PEAVPClassActor@@AEBU?$TVector3@N@@W4replace_t@@_N@Z:PROC ; AActor::StaticSpawn + Line 186: EXTRN ?CopyFriendliness@AActor@@QEAAXPEAV1@_N1@Z:PROC ; AActor::CopyFriendliness + Line 187: EXTRN ?SpawnHealth@AActor@@QEBAHXZ:PROC ; AActor::SpawnHealth + Line 188: EXTRN ?SetPitch@AActor@@QEAAXU?$TAngle@N@@_N1@Z:PROC ; AActor::SetPitch + Line 189: EXTRN ?AddToHash@AActor@@QEAAXXZ:PROC ; AActor::AddToHash + Line 190: EXTRN ?IsMapActor@AActor@@QEAA_NXZ:PROC ; AActor::IsMapActor + Line 191: EXTRN ?SetState@AActor@@QEAA_NPEAUFState@@_N@Z:PROC ; AActor::SetState + Line 192: EXTRN ?ClearCounters@AActor@@QEAAXXZ:PROC ; AActor::ClearCounters + Line 193: EXTRN ?GetRaiseState@AActor@@QEAAPEAUFState@@XZ:PROC ; AActor::GetRaiseState + Line 194: EXTRN ?Revive@AActor@@QEAAXXZ:PROC ; AActor::Revive + Line 195: EXTRN ?R_ResetViewInterpolation@@YAXXZ:PROC ; R_ResetViewInterpolation + Line 196: EXTRN ?P_SpawnTeleportFog@@YAXPEAVAActor@@AEBU?$TVector3@N@@_N2@Z:PROC ; P_SpawnTeleportFog + Line 197: EXTRN ?COPY_AAPTR@@YAPEAVAActor@@PEAV1@H@Z:PROC ; COPY_AAPTR + Line 198: EXTRN ?GetPortalOffsetPosition@FLevelLocals@@QEAA?AU?$TVector2@N@@NNNN@Z:PROC ; FLevelLocals::GetPortalOffsetPosition + Line 199: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 200: EXTRN __CxxFrameHandler3:PROC + Line 201: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 202: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 203: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 204: EXTRN ?StrifeTypes@@3V?$TMap@HPEAVPClassActor@@U?$THashTraits@H@@U?$TValueTraits@PEAVPClassActor@@@@@@A:BYTE ; StrifeTypes + Line 205: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 206: EXTRN ?dmflags@@3VFIntCVar@@A:BYTE ; dmflags + Line 207: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 208: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 209: EXTRN __ImageBase:BYTE + Line 210: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_tick.cod (36 hits) + Line 14: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 15: EXTRN ?P_PlayerThink@@YAXPEAVplayer_t@@@Z:PROC ; P_PlayerThink + Line 16: EXTRN ?P_ResetSightCounters@@YAX_N@Z:PROC ; P_ResetSightCounters + Line 17: EXTRN ?P_ThinkParticles@@YAXPEAUFLevelLocals@@@Z:PROC ; P_ThinkParticles + Line 18: EXTRN ?P_RunEffects@@YAXPEAUFLevelLocals@@@Z:PROC ; P_RunEffects + Line 19: EXTRN ?S_PauseSound@@YAX_N0@Z:PROC ; S_PauseSound + Line 20: EXTRN ?S_ResumeSound@@YAX_N@Z:PROC ; S_ResumeSound + Line 21: EXTRN ?RunThinkers@FThinkerCollection@@QEAAXPEAUFLevelLocals@@@Z:PROC ; FThinkerCollection::RunThinkers + Line 22: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 23: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 24: EXTRN ?CallTick@DBaseStatusBar@@QEAAXXZ:PROC ; DBaseStatusBar::CallTick + Line 25: EXTRN ?UpdateInterpolations@FInterpolator@@QEAAXXZ:PROC ; FInterpolator::UpdateInterpolations + Line 26: EXTRN ?NewTick@DPSprite@@SAXXZ:PROC ; DPSprite::NewTick + Line 27: EXTRN ?R_ClearInterpolationPath@@YAXXZ:PROC ; R_ClearInterpolationPath + Line 28: EXTRN ?P_UpdateSpecials@@YAXPEAUFLevelLocals@@@Z:PROC ; P_UpdateSpecials + Line 29: EXTRN ?Tick@FLevelLocals@@QEAAXXZ:PROC ; FLevelLocals::Tick + Line 30: EXTRN ?E_WorldTick@@YAXXZ:PROC ; E_WorldTick + Line 31: EXTRN ?ConsoleState@@3W4cstate_t@@A:DWORD ; ConsoleState + Line 32: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 33: EXTRN ?netgame@@3_NA:BYTE ; netgame + Line 34: EXTRN ?menuactive@@3W4EMenuState@@A:DWORD ; menuactive + Line 35: EXTRN ?paused@@3HA:DWORD ; paused + Line 36: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 37: EXTRN ?demoplayback@@3_NA:BYTE ; demoplayback + Line 38: EXTRN ?demorecording@@3_NA:BYTE ; demorecording + Line 39: EXTRN ?playeringame@@3PA_NA:BYTE ; playeringame + Line 40: EXTRN ?StatusBar@@3PEAVDBaseStatusBar@@EA:QWORD ; StatusBar + Line 41: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 42: EXTRN ?r_NoInterpolate@@3_NA:BYTE ; r_NoInterpolate + Line 43: EXTRN ?level@@3UFLevelLocals@@A:BYTE ; level + Line 44: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 45: EXTRN ?gamestate@@3W4gamestate_t@@A:DWORD ; gamestate + Line 46: EXTRN ?wipegamestate@@3W4gamestate_t@@A:DWORD ; wipegamestate + Line 47: EXTRN ?globalfreeze@@3EA:BYTE ; globalfreeze + Line 48: EXTRN ?globalchangefreeze@@3EA:BYTE ; globalchangefreeze + Line 49: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_trace.cod (36 hits) + Line 56: EXTRN ?RegistrationInfo@DObject@@2UClassReg@@A:BYTE ; DObject::RegistrationInfo + Line 325: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 326: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 327: EXTRN __std_terminate:PROC + Line 328: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 329: EXTRN c_atan2:PROC + Line 330: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 331: EXTRN ??1DObject@@UEAA@XZ:PROC ; DObject::~DObject + Line 332: EXTRN ?Serialize@DObject@@UEAAXAEAVFSerializer@@@Z:PROC ; DObject::Serialize + Line 333: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 334: EXTRN ?PropagateMark@DObject@@UEAA_KXZ:PROC ; DObject::PropagateMark + Line 335: EXTRN ?P_TranslatePortalXY@@YAXPEAUline_t@@AEAN1@Z:PROC ; P_TranslatePortalXY + Line 336: EXTRN ?P_TranslatePortalVXVY@@YAXPEAUline_t@@AEAN1@Z:PROC ; P_TranslatePortalVXVY + Line 337: EXTRN ?P_TranslatePortalZ@@YAXPEAUline_t@@AEAN@Z:PROC ; P_TranslatePortalZ + Line 338: EXTRN ??_EDLineTracer@@UEAAPEAXI@Z:PROC ; DLineTracer::`vector deleting destructor' + Line 339: EXTRN ?GetTerrain@@YAHPEBUsector_t@@H@Z:PROC ; GetTerrain + Line 340: EXTRN ?AdjustFloorClip@@YAXPEBUsector_t@@@Z:PROC ; AdjustFloorClip + Line 341: EXTRN ?P_VanillaPointOnLineSide@@YAHNNPEBUline_t@@@Z:PROC ; P_VanillaPointOnLineSide + Line 342: EXTRN ?AddLineIntercepts@FPathTraverse@@MEAAXHH@Z:PROC ; FPathTraverse::AddLineIntercepts + Line 343: EXTRN ?AddThingIntercepts@FPathTraverse@@MEAAXHHAEAVFBlockThingsIterator@@_N@Z:PROC ; FPathTraverse::AddThingIntercepts + Line 344: EXTRN ?Next@FPathTraverse@@QEAAPEAUintercept_t@@XZ:PROC ; FPathTraverse::Next + Line 345: EXTRN ?init@FPathTraverse@@QEAAXNNNNHN@Z:PROC ; FPathTraverse::init + Line 346: EXTRN ?PortalRelocate@FPathTraverse@@QEAAHPEAUintercept_t@@HPEAU?$TVector3@N@@@Z:PROC ; FPathTraverse::PortalRelocate + Line 347: EXTRN ?PortalRelocate@FPathTraverse@@QEAAXAEBU?$TVector2@N@@HN@Z:PROC ; FPathTraverse::PortalRelocate + Line 348: EXTRN ??1FPathTraverse@@UEAA@XZ:PROC ; FPathTraverse::~FPathTraverse + Line 349: EXTRN ??_EFPathTraverse@@UEAAPEAXI@Z:PROC ; FPathTraverse::`vector deleting destructor' + Line 350: EXTRN ?P_ActivateLine@@YA_NPEAUline_t@@PEAVAActor@@HHPEAU?$TVector3@N@@@Z:PROC ; P_ActivateLine + Line 351: EXTRN ?PointInSubsector@FLevelLocals@@AEAAPEAUsubsector_t@@NN@Z:PROC ; FLevelLocals::PointInSubsector + Line 352: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 353: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 354: EXTRN ?GetVirtualIndex@@YAIPEAVPClass@@PEBD@Z:PROC ; GetVirtualIndex + Line 355: EXTRN __CxxFrameHandler3:PROC + Line 356: EXTRN memset:PROC + Line 357: EXTRN ?skyflatnum@@3VFTextureID@@A:DWORD ; skyflatnum + Line 358: EXTRN ?Terrains@@3V?$TArray@UFTerrainDef@@U1@@@A:BYTE ; Terrains + Line 359: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_udmf.cod (74 hits) + Line 112: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 113: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 114: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 115: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 116: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 117: EXTRN ??_V@YAXPEAX_K@Z:PROC ; operator delete[] + Line 118: EXTRN atexit:PROC + Line 119: EXTRN __std_terminate:PROC + Line 120: EXTRN qsort:PROC + Line 121: EXTRN strtod:PROC + Line 122: EXTRN strtoll:PROC + Line 123: EXTRN stricmp:PROC + Line 124: EXTRN strnicmp:PROC + Line 125: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 126: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 127: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 128: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 129: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_K_N@Z:PROC ; FName::NameManager::FindName + Line 130: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 131: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 132: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 133: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 134: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 135: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 136: EXTRN c_sqrt:PROC + Line 137: EXTRN ?CheckOverlap@sector_t@@QEAAXXZ:PROC ; sector_t::CheckOverlap + Line 138: EXTRN ?AdjustLine@line_t@@QEAAXXZ:PROC ; line_t::AdjustLine + Line 139: EXTRN ?P_LoadTranslator@@YAXPEBD@Z:PROC ; P_LoadTranslator + Line 140: EXTRN ?P_TranslateLineDef@@YAXPEAUline_t@@PEAUmaplinedef_t@@H@Z:PROC ; P_TranslateLineDef + Line 141: EXTRN ?P_TranslateSectorSpecial@@YAHH@Z:PROC ; P_TranslateSectorSpecial + Line 142: EXTRN ?SetTexture@MapLoader@@AEAAXPEAUsector_t@@HHPEBDAEAV?$TMap@VFString@@UFMissingCount@@U?$THashTraits@VFString@@@@U?$TValueTraits@UFMissingCount@@@@@@_N@Z:PROC ; MapLoader::SetTexture + Line 143: EXTRN ?FinishLoadingLineDef@MapLoader@@AEAAXPEAUline_t@@H@Z:PROC ; MapLoader::FinishLoadingLineDef + Line 144: EXTRN ?ProcessSideTextures@MapLoader@@AEAAX_NPEAUside_t@@PEAUsector_t@@PEAUintmapsidedef_t@@HHPEAFAEAV?$TMap@VFString@@UFMissingCount@@U?$THashTraits@VFString@@@@U?$TValueTraits@UFMissingCount@@@@@@@Z:PROC ; MapLoader::ProcessSideTextures + Line 145: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 146: EXTRN ??0FScanner@@QEAA@XZ:PROC ; FScanner::FScanner + Line 147: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 148: EXTRN ?OpenMem@FScanner@@QEAAXPEBD0H@Z:PROC ; FScanner::OpenMem + Line 149: EXTRN ?OpenString@FScanner@@QEAAXPEBDVFString@@@Z:PROC ; FScanner::OpenString + Line 150: EXTRN ?SetCMode@FScanner@@QEAAX_N@Z:PROC ; FScanner::SetCMode + Line 151: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 152: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 153: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 154: EXTRN ?CheckString@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::CheckString + Line 155: EXTRN ?GetToken@FScanner@@QEAA_NXZ:PROC ; FScanner::GetToken + Line 156: EXTRN ?MustGetAnyToken@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetAnyToken + Line 157: EXTRN ?MustGetToken@FScanner@@QEAAXH@Z:PROC ; FScanner::MustGetToken + Line 158: EXTRN ?CheckToken@FScanner@@QEAA_NH@Z:PROC ; FScanner::CheckToken + Line 159: EXTRN ?CheckNumber@FScanner@@QEAA_NXZ:PROC ; FScanner::CheckNumber + Line 160: EXTRN ?UnGet@FScanner@@QEAAXXZ:PROC ; FScanner::UnGet + Line 161: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 162: EXTRN ?ScriptMessage@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptMessage + Line 163: EXTRN ?GetLumpFullName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetLumpFullName + Line 164: EXTRN ?AddSectorTag@FTagManager@@QEAAXHH@Z:PROC ; FTagManager::AddSectorTag + Line 165: EXTRN ?AddLineID@FTagManager@@QEAAXHH@Z:PROC ; FTagManager::AddLineID + Line 166: EXTRN ?P_FindTerrain@@YAHVFName@@@Z:PROC ; P_FindTerrain + Line 167: EXTRN ?P_CreateScroller@@YAXW4EScroll@@NNHHHW4EScrollPos@@@Z:PROC ; P_CreateScroller + Line 168: EXTRN __CxxFrameHandler3:PROC + Line 169: EXTRN memcpy:PROC + Line 170: EXTRN memmove:PROC + Line 171: EXTRN memset:PROC + Line 172: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 173: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 174: EXTRN ?developer@@3VFIntCVar@@A:BYTE ; developer + Line 175: EXTRN ?MapThingsConverted@@3V?$TArray@UFMapThing@@U1@@@A:BYTE ; MapThingsConverted + Line 176: EXTRN ?ForceNodeBuild@@3_NA:BYTE ; ForceNodeBuild + Line 177: EXTRN ?GameNames@@3PAPEBDA:BYTE ; GameNames + Line 178: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 179: EXTRN ?skyflatnum@@3VFTextureID@@A:DWORD ; skyflatnum + Line 180: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 181: EXTRN ?tagManager@@3VFTagManager@@A:BYTE ; tagManager + Line 182: EXTRN ?DoomEdMap@@3V?$TMap@HUFDoomEdEntry@@U?$THashTraits@H@@U?$TValueTraits@UFDoomEdEntry@@@@@@A:BYTE ; DoomEdMap + Line 183: EXTRN ?level@@3UFLevelLocals@@A:BYTE ; level + Line 184: EXTRN __ImageBase:BYTE + Line 185: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_usdf.cod (44 hits) + Line 33: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 34: EXTRN __std_terminate:PROC + Line 35: EXTRN atoi:PROC + Line 36: EXTRN strnicmp:PROC + Line 37: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 38: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 39: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 40: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 41: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 42: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 43: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 44: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 45: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 46: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 47: EXTRN ?P_FindLineSpecial@@YAHPEBDPEAH1@Z:PROC ; P_FindLineSpecial + Line 48: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 49: EXTRN ?GetStrifeType@@YAPEAVPClassActor@@H@Z:PROC ; GetStrifeType + Line 50: EXTRN ?LoadScriptFile@@YA_NPEAUFLevelLocals@@PEBD_NH@Z:PROC ; LoadScriptFile + Line 51: EXTRN ??0FScanner@@QEAA@XZ:PROC ; FScanner::FScanner + Line 52: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 53: EXTRN ?OpenMem@FScanner@@QEAAXPEBD0H@Z:PROC ; FScanner::OpenMem + Line 54: EXTRN ?SetCMode@FScanner@@QEAAX_N@Z:PROC ; FScanner::SetCMode + Line 55: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 56: EXTRN ?CheckString@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::CheckString + Line 57: EXTRN ?MustGetToken@FScanner@@QEAAXH@Z:PROC ; FScanner::MustGetToken + Line 58: EXTRN ?CheckToken@FScanner@@QEAA_NH@Z:PROC ; FScanner::CheckToken + Line 59: EXTRN ?UnGet@FScanner@@QEAAXXZ:PROC ; FScanner::UnGet + Line 60: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 61: EXTRN ?ScriptMessage@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptMessage + Line 62: EXTRN ?Skip@UDMFParserBase@@IEAAXXZ:PROC ; UDMFParserBase::Skip + Line 63: EXTRN ?ParseKey@UDMFParserBase@@IEAA?AVFName@@_NPEA_N@Z:PROC ; UDMFParserBase::ParseKey + Line 64: EXTRN ?CheckInt@UDMFParserBase@@IEAAHPEBD@Z:PROC ; UDMFParserBase::CheckInt + Line 65: EXTRN ?CheckBool@UDMFParserBase@@IEAA_NPEBD@Z:PROC ; UDMFParserBase::CheckBool + Line 66: EXTRN ?CheckString@UDMFParserBase@@IEAAPEBDPEBD@Z:PROC ; UDMFParserBase::CheckString + Line 67: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 68: EXTRN ?GetLumpFullName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetLumpFullName + Line 69: EXTRN ?SetConversation@FLevelLocals@@QEAAXHPEAVPClassActor@@H@Z:PROC ; FLevelLocals::SetConversation + Line 70: EXTRN __CxxFrameHandler3:PROC + Line 71: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 72: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 73: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 74: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 75: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 76: EXTRN __ImageBase:BYTE + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_user.cod (135 hits) + Line 312: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 313: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 314: EXTRN ?sprites@@3V?$TArray@Uspritedef_t@@U1@@@A:BYTE ; sprites + Line 315: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 316: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 317: EXTRN ?dmflags@@3VFIntCVar@@A:BYTE ; dmflags + Line 1837: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 1838: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 1839: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 1840: EXTRN atexit:PROC + Line 1841: EXTRN __std_terminate:PROC + Line 1842: EXTRN qsort:PROC + Line 1843: EXTRN __stdio_common_vfprintf:PROC + Line 1844: EXTRN stricmp:PROC + Line 1845: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 1846: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 1847: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 1848: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 1849: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 1850: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 1851: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 1852: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 1853: EXTRN ??HFString@@QEBA?AV0@PEBD@Z:PROC ; FString::operator+ + Line 1854: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 1855: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 1856: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 1857: EXTRN mysnprintf:PROC + Line 1858: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 1859: EXTRN ?Mark@GC@@YAXPEAPEAVDObject@@@Z:PROC ; GC::Mark + Line 1860: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 1861: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 1862: EXTRN ?P_GetThingFloorType@@YAHPEAVAActor@@@Z:PROC ; P_GetThingFloorType + Line 1863: EXTRN ?P_TalkFacing@@YA_NPEAVAActor@@@Z:PROC ; P_TalkFacing + Line 1864: EXTRN ?P_UseLines@@YAXPEAVplayer_t@@@Z:PROC ; P_UseLines + Line 1865: EXTRN ?P_DelSeclist@@YAXPEAUmsecnode_t@@PEQsector_t@@PEAU1@@Z:PROC ; P_DelSeclist + Line 1866: EXTRN ?P_DelSeclist@@YAXPEAUportnode_t@@PEQFLinePortal@@PEAU1@@Z:PROC ; P_DelSeclist + Line 1867: EXTRN ?P_DamageMobj@@YAHPEAVAActor@@00HVFName@@HU?$TAngle@N@@@Z:PROC ; P_DamageMobj + Line 1868: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 1869: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 1870: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 1871: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 1872: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 1873: EXTRN ?S_Sound@@YAXPEAVAActor@@HVFSoundID@@MM@Z:PROC ; S_Sound + Line 1874: EXTRN ?S_StopSound@@YAXPEAVAActor@@H@Z:PROC ; S_StopSound + Line 1875: EXTRN ?S_IsActorPlayingSomething@@YA_NPEAVAActor@@HH@Z:PROC ; S_IsActorPlayingSomething + Line 1876: EXTRN ?S_ChangeMusic@@YA_NPEBDH_N1@Z:PROC ; S_ChangeMusic + Line 1877: EXTRN ?S_FindSkinnedSound@@YAHPEAVAActor@@VFSoundID@@@Z:PROC ; S_FindSkinnedSound + Line 1878: EXTRN ?S_FindSkinnedSoundEx@@YAHPEAVAActor@@PEBD1@Z:PROC ; S_FindSkinnedSoundEx + Line 1879: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 1880: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 1881: EXTRN ?P_BringUpWeapon@@YAXPEAVplayer_t@@@Z:PROC ; P_BringUpWeapon + Line 1882: EXTRN ?P_NoiseAlert@@YAXPEAVAActor@@0_NN@Z:PROC ; P_NoiseAlert + Line 1883: EXTRN ?CheckLocalView@AActor@@QEBA_NH@Z:PROC ; AActor::CheckLocalView + Line 1884: EXTRN ?FindInventory@AActor@@QEAAPEAV1@PEAVPClassActor@@_N@Z:PROC ; AActor::FindInventory + Line 1885: EXTRN ?UnlinkFromWorld@AActor@@QEAAXPEAUFLinkContext@@@Z:PROC ; AActor::UnlinkFromWorld + Line 1886: EXTRN ?SetState@AActor@@QEAA_NPEAUFState@@_N@Z:PROC ; AActor::SetState + Line 1887: EXTRN ?Revive@AActor@@QEAAXXZ:PROC ; AActor::Revive + Line 1888: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 1889: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 1890: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 1891: EXTRN ?GetLumpFile@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpFile + Line 1892: EXTRN ?P_PlayerOnSpecial3DFloor@@YAXPEAVplayer_t@@@Z:PROC ; P_PlayerOnSpecial3DFloor + Line 1893: EXTRN ?AddToConsole@@YAXHPEBD@Z:PROC ; AddToConsole + Line 1894: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 1895: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 1896: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 1897: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 1898: EXTRN ?Net_WriteByte@@YAXE@Z:PROC ; Net_WriteByte + Line 1899: EXTRN ?Net_WriteFloat@@YAXM@Z:PROC ; Net_WriteFloat + Line 1900: EXTRN ?ArraySize@FSerializer@@QEAAIXZ:PROC ; FSerializer::ArraySize + Line 1901: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 1902: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 1903: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEA_NPEA_N@Z:PROC ; Serialize + Line 1904: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 1905: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAIPEAI@Z:PROC ; Serialize + Line 1906: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEACPEAC@Z:PROC ; Serialize + Line 1907: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAEPEAE@Z:PROC ; Serialize + Line 1908: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAFPEAF@Z:PROC ; Serialize + Line 1909: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAGPEAG@Z:PROC ; Serialize + Line 1910: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEANPEAN@Z:PROC ; Serialize + Line 1911: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAMPEAM@Z:PROC ; Serialize + Line 1912: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 1913: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAVFName@@PEAV2@@Z:PROC ; Serialize + Line 1914: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAVFString@@PEAV2@@Z:PROC ; Serialize + Line 1915: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAUticcmd_t@@PEAU2@@Z:PROC ; Serialize + Line 1916: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAUusercmd_t@@PEAU2@@Z:PROC ; Serialize + Line 1917: EXTRN ??$Serialize@VPClassActor@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAVPClassActor@@PEAPEAV1@@Z:PROC ; Serialize + Line 1918: EXTRN ?Clear@FWeaponSlots@@QEAAXXZ:PROC ; FWeaponSlots::Clear + Line 1919: EXTRN ??1userinfo_t@@QEAA@XZ:PROC ; userinfo_t::~userinfo_t + Line 1920: EXTRN ?SkinChanged@userinfo_t@@QEAAHPEBDH@Z:PROC ; userinfo_t::SkinChanged + Line 1921: EXTRN ?ReadUserInfo@@YAXAEAVFSerializer@@AEAUuserinfo_t@@AEAVFString@@@Z:PROC ; ReadUserInfo + Line 1922: EXTRN ?WriteUserInfo@@YAXAEAVFSerializer@@AEAUuserinfo_t@@@Z:PROC ; WriteUserInfo + Line 1923: EXTRN ?DestroyPSprites@player_t@@QEAAXXZ:PROC ; player_t::DestroyPSprites + Line 1924: EXTRN ?R_RebuildViewInterpolation@@YAXPEAVplayer_t@@@Z:PROC ; R_RebuildViewInterpolation + Line 1925: EXTRN ?R_GetViewInterpolationStatus@@YA_NXZ:PROC ; R_GetViewInterpolationStatus + Line 1926: EXTRN ?P_UnmorphActor@@YA_NPEAVAActor@@0H_N@Z:PROC ; P_UnmorphActor + Line 1927: EXTRN ?P_PlayerInSpecialSector@@YAXPEAVplayer_t@@PEAUsector_t@@@Z:PROC ; P_PlayerInSpecialSector + Line 1928: EXTRN ?P_PlayerOnSpecialFlat@@YAXPEAVplayer_t@@H@Z:PROC ; P_PlayerOnSpecialFlat + Line 1929: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 1930: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 1931: EXTRN ?GetVirtualIndex@@YAIPEAVPClass@@PEBD@Z:PROC ; GetVirtualIndex + Line 1932: EXTRN ?StartTypedScripts@FBehaviorContainer@@QEAAXGPEAVAActor@@_NH1@Z:PROC ; FBehaviorContainer::StartTypedScripts + Line 1933: EXTRN ?GetPortalOffsetPosition@FLevelLocals@@QEAA?AU?$TVector2@N@@NNNN@Z:PROC ; FLevelLocals::GetPortalOffsetPosition + Line 1934: EXTRN ?AirControlChanged@FLevelLocals@@QEAAXXZ:PROC ; FLevelLocals::AirControlChanged + Line 1935: EXTRN ?E_PlayerRespawned@@YAXH@Z:PROC ; E_PlayerRespawned + Line 1936: EXTRN ??$P_AddSecnode@Umsecnode_t@@Usector_t@@@@YAPEAUmsecnode_t@@PEAUsector_t@@PEAVAActor@@PEAU0@AEAPEAU0@@Z:PROC ; P_AddSecnode + Line 1937: EXTRN ??$P_DelSecnode@Umsecnode_t@@Usector_t@@@@YAPEAUmsecnode_t@@PEAU0@PEQsector_t@@PEAU0@@Z:PROC ; P_DelSecnode + Line 1938: EXTRN ??$P_AddSecnode@Uportnode_t@@UFLinePortal@@@@YAPEAUportnode_t@@PEAUFLinePortal@@PEAVAActor@@PEAU0@AEAPEAU0@@Z:PROC ; P_AddSecnode + Line 1939: EXTRN ??$P_DelSecnode@Uportnode_t@@UFLinePortal@@@@YAPEAUportnode_t@@PEAU0@PEQFLinePortal@@PEAU0@@Z:PROC ; P_DelSecnode + Line 1940: EXTRN __CxxFrameHandler3:PROC + Line 1941: EXTRN memcmp:PROC + Line 1942: EXTRN memcpy:PROC + Line 1943: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 1944: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 1945: EXTRN ?netgame@@3_NA:BYTE ; netgame + Line 1946: EXTRN ?demoplayback@@3_NA:BYTE ; demoplayback + Line 1947: EXTRN ?gametic@@3HA:DWORD ; gametic + Line 1948: EXTRN ?debugfile@@3PEAU_iobuf@@EA:QWORD ; debugfile + Line 1949: EXTRN ?singletics@@3_NA:BYTE ; singletics + Line 1950: EXTRN ?developer@@3VFIntCVar@@A:BYTE ; developer + Line 1951: EXTRN ?Net_Arbitrator@@3HA:DWORD ; Net_Arbitrator + Line 1952: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 1953: EXTRN ?vid_rendermode@@3VFIntCVar@@A:BYTE ; vid_rendermode + Line 1954: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 1955: EXTRN ?gamestate@@3W4gamestate_t@@A:DWORD ; gamestate + Line 1956: EXTRN ?ParsingKeyConf@@3_NA:BYTE ; ParsingKeyConf + Line 1957: EXTRN ?localcmds@@3PAUticcmd_t@@A:BYTE ; localcmds + Line 1958: EXTRN ?maketic@@3HA:DWORD ; maketic + Line 1959: EXTRN ?ticdup@@3HA:DWORD ; ticdup + Line 1960: EXTRN ?save_full@@3_NA:BYTE ; save_full + Line 1961: EXTRN ?WP_NOCHANGE@@3PEAVAActor@@EA:QWORD ; WP_NOCHANGE + Line 1962: EXTRN ?Skins@@3V?$TArray@VFPlayerSkin@@V1@@@A:BYTE ; Skins + Line 1963: EXTRN ?maxviewpitch@@3VFFloatCVar@@A:BYTE ; maxviewpitch + Line 1964: EXTRN ?cl_oldfreelooklimit@@3VFBoolCVar@@A:BYTE ; cl_oldfreelooklimit + Line 1965: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\p_xlat.cod (11 hits) + Line 33: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 34: EXTRN ?AddLineID@FTagManager@@QEAAXHH@Z:PROC ; FTagManager::AddLineID + Line 35: EXTRN ?SimpleLineTranslations@@3V?$TAutoGrowArray@UFLineTrans@@U1@@@A:BYTE ; SimpleLineTranslations + Line 36: EXTRN ?XlatExpressions@@3V?$TArray@HH@@A:BYTE ; XlatExpressions + Line 37: EXTRN ?Boomish@@3PAUFBoomTranslator@@A:BYTE ; Boomish + Line 38: EXTRN ?NumBoomish@@3HA:DWORD ; NumBoomish + Line 39: EXTRN ?SectorTranslations@@3V?$TAutoGrowArray@UFSectorTrans@@U1@@@A:BYTE ; SectorTranslations + Line 40: EXTRN ?SectorMasks@@3V?$TArray@UFSectorMask@@U1@@@A:BYTE ; SectorMasks + Line 41: EXTRN ?LineFlagTranslations@@3PAUFLineFlagTrans@@A:BYTE ; LineFlagTranslations + Line 42: EXTRN __ImageBase:BYTE + Line 43: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\parse_xlat.cod (26 hits) + Line 10: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 223: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 224: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 225: EXTRN _purecall:PROC + Line 226: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 227: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 228: EXTRN atexit:PROC + Line 229: EXTRN __std_terminate:PROC + Line 230: EXTRN free:PROC + Line 231: EXTRN malloc:PROC + Line 232: EXTRN stricmp:PROC + Line 233: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 234: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 235: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 236: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 237: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 238: EXTRN ?AddSym@FParseContext@@QEAAXPEADH@Z:PROC ; FParseContext::AddSym + Line 239: EXTRN ?PrintError@FParseContext@@QEAAHPEBD@Z:PROC ; FParseContext::PrintError + Line 240: EXTRN ?ParseLump@FParseContext@@QEAAXPEBD@Z:PROC ; FParseContext::ParseLump + Line 241: EXTRN ??_EFParseContext@@UEAAPEAXI@Z:PROC ; FParseContext::`vector deleting destructor' + Line 242: EXTRN ??_EXlatParseContext@@UEAAPEAXI@Z:PROC ; XlatParseContext::`vector deleting destructor' + Line 243: EXTRN __CxxFrameHandler3:PROC + Line 244: EXTRN memmove:PROC + Line 245: EXTRN memset:PROC + Line 246: EXTRN ?XlatExprEval@@3PAP6APEBHPEAHPEBHPEAUFXlatExprState@@@ZA:BYTE ; XlatExprEval + Line 247: EXTRN __ImageBase:BYTE + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\parsecontext.cod (19 hits) + Line 20: EXTRN __std_terminate:PROC + Line 21: EXTRN strtod:PROC + Line 22: EXTRN strtoll:PROC + Line 23: EXTRN strncpy:PROC + Line 24: EXTRN strnicmp:PROC + Line 25: EXTRN isalpha:PROC + Line 26: EXTRN isdigit:PROC + Line 27: EXTRN isspace:PROC + Line 28: EXTRN isalnum:PROC + Line 29: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 30: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 31: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 32: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 33: EXTRN ?ReadLumpIntoArray@FWadCollection@@QEAA?AV?$TArray@EE@@HH@Z:PROC ; FWadCollection::ReadLumpIntoArray + Line 34: EXTRN ?P_FindLineSpecial@@YAHPEBDPEAH1@Z:PROC ; P_FindLineSpecial + Line 35: EXTRN __CxxFrameHandler3:PROC + Line 36: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 37: EXTRN __ImageBase:BYTE + Line 38: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\patchtexture.cod (23 hits) + Line 23: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 24: EXTRN __std_terminate:PROC + Line 25: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 26: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 27: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 28: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 29: EXTRN ?LumpLength@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::LumpLength + Line 30: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 31: EXTRN ?CreatePalettedPixels@FImageSource@@MEAA?AV?$TArray@EE@@H@Z:PROC ; FImageSource::CreatePalettedPixels + Line 32: EXTRN ?CopyPixels@FImageSource@@MEAAHPEAVFBitmap@@H@Z:PROC ; FImageSource::CopyPixels + Line 33: EXTRN ?CopyTranslatedPixels@FImageSource@@IEAAHPEAVFBitmap@@PEAUPalEntry@@@Z:PROC ; FImageSource::CopyTranslatedPixels + Line 34: EXTRN ?CollectForPrecache@FImageSource@@UEAAXAEAV?$TMap@HU?$pair@HH@std@@U?$THashTraits@H@@U?$TValueTraits@U?$pair@HH@std@@@@@@_N@Z:PROC ; FImageSource::CollectForPrecache + Line 35: EXTRN ??_EFImageSource@@UEAAPEAXI@Z:PROC ; FImageSource::`vector deleting destructor' + Line 36: EXTRN ?checkPatchForAlpha@@YA_NPEBXI@Z:PROC ; checkPatchForAlpha + Line 37: EXTRN ??_EFPatchTexture@@UEAAPEAXI@Z:PROC ; FPatchTexture::`vector deleting destructor' + Line 38: EXTRN __CxxFrameHandler3:PROC + Line 39: EXTRN memset:PROC + Line 40: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 41: EXTRN ?GPalette@@3UFPalette@@A:BYTE ; GPalette + Line 42: EXTRN ?translationtables@@3PAV?$TAutoGrowArray@VFRemapTablePtr@@PEAUFRemapTable@@@@A:BYTE ; translationtables + Line 43: EXTRN ?ImageArena@FImageSource@@1VFMemArena@@A:BYTE ; FImageSource::ImageArena + Line 44: EXTRN ?NextID@FImageSource@@1HA:DWORD ; FImageSource::NextID + Line 45: EXTRN ?GrayMap@ImageHelpers@@3PAEA:BYTE ; ImageHelpers::GrayMap + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\pcxtexture.cod (23 hits) + Line 26: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 27: EXTRN __std_terminate:PROC + Line 28: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 29: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 30: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 31: EXTRN ?OpenLumpReader@FWadCollection@@QEAA?AVFileReader@@H@Z:PROC ; FWadCollection::OpenLumpReader + Line 32: EXTRN ?CopyPixelDataRGB@FBitmap@@QEAAXHHPEBEHHHHHHPEAUFCopyInfo@@HHH@Z:PROC ; FBitmap::CopyPixelDataRGB + Line 33: EXTRN ?CopyPixelData@FBitmap@@QEAAXHHPEBEHHHHHPEAUPalEntry@@PEAUFCopyInfo@@@Z:PROC ; FBitmap::CopyPixelData + Line 34: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 35: EXTRN ?Pick@FColorMatcher@@QEAAEHHH@Z:PROC ; FColorMatcher::Pick + Line 36: EXTRN ?CreatePalettedPixels@FImageSource@@MEAA?AV?$TArray@EE@@H@Z:PROC ; FImageSource::CreatePalettedPixels + Line 37: EXTRN ?CopyPixels@FImageSource@@MEAAHPEAVFBitmap@@H@Z:PROC ; FImageSource::CopyPixels + Line 38: EXTRN ?CollectForPrecache@FImageSource@@UEAAXAEAV?$TMap@HU?$pair@HH@std@@U?$THashTraits@H@@U?$TValueTraits@U?$pair@HH@std@@@@@@_N@Z:PROC ; FImageSource::CollectForPrecache + Line 39: EXTRN ??_EFImageSource@@UEAAPEAXI@Z:PROC ; FImageSource::`vector deleting destructor' + Line 40: EXTRN ??_EFPCXTexture@@UEAAPEAXI@Z:PROC ; FPCXTexture::`vector deleting destructor' + Line 41: EXTRN __CxxFrameHandler3:PROC + Line 42: EXTRN memset:PROC + Line 43: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 44: EXTRN ?RGB256k@@3TColorTable256k@@A:BYTE ; RGB256k + Line 45: EXTRN ?ColorMatcher@@3VFColorMatcher@@A:QWORD ; ColorMatcher + Line 46: EXTRN ?GrayMap@ImageHelpers@@3PAEA:BYTE ; ImageHelpers::GrayMap + Line 47: EXTRN ?ImageArena@FImageSource@@1VFMemArena@@A:BYTE ; FImageSource::ImageArena + Line 48: EXTRN ?NextID@FImageSource@@1HA:DWORD ; FImageSource::NextID + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\playermenu.cod (24 hits) + Line 51: EXTRN ?Skins@@3V?$TArray@VFPlayerSkin@@V1@@@A:BYTE ; Skins + Line 52: EXTRN ?team@@3VFIntCVar@@A:BYTE ; team + Line 53: EXTRN ?autoaim@@3VFFloatCVar@@A:BYTE ; autoaim + Line 54: EXTRN ?neverswitchonpickup@@3VFBoolCVar@@A:BYTE ; neverswitchonpickup + Line 55: EXTRN ?cl_run@@3VFBoolCVar@@A:BYTE ; cl_run + Line 56: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 57: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 58: EXTRN ?CurrentMenu@@3PEAVDMenu@@EA:QWORD ; CurrentMenu + Line 59: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 231: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 232: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 233: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 234: EXTRN mysnprintf:PROC + Line 235: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 236: EXTRN ?cvar_set@@YAPEAVFBaseCVar@@PEBD0@Z:PROC ; cvar_set + Line 237: EXTRN ?GetPrintableDisplayName@@YA?AVFString@@PEAVPClassActor@@@Z:PROC ; GetPrintableDisplayName + Line 238: EXTRN ?SkinNumChanged@userinfo_t@@QEAAHH@Z:PROC ; userinfo_t::SkinNumChanged + Line 239: EXTRN ?PlayerClassNumChanged@userinfo_t@@QEAAHH@Z:PROC ; userinfo_t::PlayerClassNumChanged + Line 240: EXTRN ?ColorChanged@userinfo_t@@QEAAII@Z:PROC ; userinfo_t::ColorChanged + Line 241: EXTRN ?ColorSetChanged@userinfo_t@@QEAAHH@Z:PROC ; userinfo_t::ColorSetChanged + Line 242: EXTRN ?C_DoCommand@@YAXPEBDH@Z:PROC ; C_DoCommand + Line 243: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 244: EXTRN __CxxFrameHandler3:PROC + Line 245: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\playmidi.cod (111 hits) + Line 41: EXTRN ?currSong@@3PEAVMusInfo@@EA:QWORD ; currSong + Line 482: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 483: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 484: EXTRN atexit:PROC + Line 485: EXTRN __std_terminate:PROC + Line 486: EXTRN free:PROC + Line 487: EXTRN ?ctl_cmsg@TimidityPlus@@YAXHHPEBDZZ:PROC ; TimidityPlus::ctl_cmsg + Line 488: EXTRN ?init_mblock@TimidityPlus@@YAXPEAUMBlockList@1@@Z:PROC ; TimidityPlus::init_mblock + Line 489: EXTRN ?new_segment@TimidityPlus@@YAPEAXPEAUMBlockList@1@_K@Z:PROC ; TimidityPlus::new_segment + Line 490: EXTRN ?reuse_mblock@TimidityPlus@@YAXPEAUMBlockList@1@@Z:PROC ; TimidityPlus::reuse_mblock + Line 491: EXTRN ?int_rand@TimidityPlus@@YAHH@Z:PROC ; TimidityPlus::int_rand + Line 492: EXTRN ?safe_malloc@TimidityPlus@@YAPEAX_K@Z:PROC ; TimidityPlus::safe_malloc + Line 493: EXTRN ?instrument_map@Instruments@TimidityPlus@@QEBAHHPEAH0@Z:PROC ; TimidityPlus::Instruments::instrument_map + Line 494: EXTRN ?find_altassign@Instruments@TimidityPlus@@QEAAPEAUAlternateAssign@2@PEAU32@H@Z:PROC ; TimidityPlus::Instruments::find_altassign + Line 495: EXTRN ?play_midi_load_instrument@Instruments@TimidityPlus@@QEAAPEAUInstrument@2@HHHPEA_N@Z:PROC ; TimidityPlus::Instruments::play_midi_load_instrument + Line 496: EXTRN ?init_userdrum@Instruments@TimidityPlus@@QEAAXXZ:PROC ; TimidityPlus::Instruments::init_userdrum + Line 497: EXTRN ?free_userinst@Instruments@TimidityPlus@@QEAAXXZ:PROC ; TimidityPlus::Instruments::free_userinst + Line 498: EXTRN ?parse_sysex_event_multi@SysexConvert@TimidityPlus@@QEAAHPEBEHPEAUMidiEvent@2@PEAVInstruments@2@@Z:PROC ; TimidityPlus::SysexConvert::parse_sysex_event_multi + Line 499: EXTRN ?parse_sysex_event@SysexConvert@TimidityPlus@@QEAAHPEBEHPEAUMidiEvent@2@PEAVInstruments@2@@Z:PROC ; TimidityPlus::SysexConvert::parse_sysex_event + Line 500: EXTRN ?initialize_resampler_coeffs@TimidityPlus@@YAXXZ:PROC ; TimidityPlus::initialize_resampler_coeffs + Line 501: EXTRN ?mix_voice@Mixer@TimidityPlus@@QEAAXPEAHHH@Z:PROC ; TimidityPlus::Mixer::mix_voice + Line 502: EXTRN ?recompute_envelope@Mixer@TimidityPlus@@QEAAHH@Z:PROC ; TimidityPlus::Mixer::recompute_envelope + Line 503: EXTRN ?apply_envelope_to_amp@Mixer@TimidityPlus@@QEAAHH@Z:PROC ; TimidityPlus::Mixer::apply_envelope_to_amp + Line 504: EXTRN ?recompute_modulation_envelope@Mixer@TimidityPlus@@QEAAHH@Z:PROC ; TimidityPlus::Mixer::recompute_modulation_envelope + Line 505: EXTRN ?apply_modulation_envelope@Mixer@TimidityPlus@@QEAAHH@Z:PROC ; TimidityPlus::Mixer::apply_modulation_envelope + Line 506: EXTRN ?free_cache_data@Recache@TimidityPlus@@AEAAXXZ:PROC ; TimidityPlus::Recache::free_cache_data + Line 507: EXTRN ?resamp_cache_reset@Recache@TimidityPlus@@QEAAXXZ:PROC ; TimidityPlus::Recache::resamp_cache_reset + Line 508: EXTRN ?resamp_cache_refer_alloff@Recache@TimidityPlus@@QEAAXHH@Z:PROC ; TimidityPlus::Recache::resamp_cache_refer_alloff + Line 509: EXTRN ?resamp_cache_fetch@Recache@TimidityPlus@@QEAAPEAUcache_hash@2@PEAUSample@2@H@Z:PROC ; TimidityPlus::Recache::resamp_cache_fetch + Line 510: EXTRN ?set_dry_signal@Reverb@TimidityPlus@@QEAAXPEAHH@Z:PROC ; TimidityPlus::Reverb::set_dry_signal + Line 511: EXTRN ?set_dry_signal_xg@Reverb@TimidityPlus@@QEAAXPEAHHH@Z:PROC ; TimidityPlus::Reverb::set_dry_signal_xg + Line 512: EXTRN ?mix_dry_signal@Reverb@TimidityPlus@@QEAAXPEAHH@Z:PROC ; TimidityPlus::Reverb::mix_dry_signal + Line 513: EXTRN ?free_effect_buffers@Reverb@TimidityPlus@@QEAAXXZ:PROC ; TimidityPlus::Reverb::free_effect_buffers + Line 514: EXTRN ?get_pink_noise_light@Reverb@TimidityPlus@@QEAAMPEAUpink_noise@2@@Z:PROC ; TimidityPlus::Reverb::get_pink_noise_light + Line 515: EXTRN ?calc_filter_shelving_high@Reverb@TimidityPlus@@QEAAXPEAUfilter_shelving@2@@Z:PROC ; TimidityPlus::Reverb::calc_filter_shelving_high + Line 516: EXTRN ?calc_filter_shelving_low@Reverb@TimidityPlus@@QEAAXPEAUfilter_shelving@2@@Z:PROC ; TimidityPlus::Reverb::calc_filter_shelving_low + Line 517: EXTRN ?do_insertion_effect_gs@Reverb@TimidityPlus@@QEAAXPEAHH@Z:PROC ; TimidityPlus::Reverb::do_insertion_effect_gs + Line 518: EXTRN ?do_insertion_effect_xg@Reverb@TimidityPlus@@QEAAXPEAHHPEAUeffect_xg_t@2@@Z:PROC ; TimidityPlus::Reverb::do_insertion_effect_xg + Line 519: EXTRN ?do_ch_reverb@Reverb@TimidityPlus@@QEAAXPEAHH@Z:PROC ; TimidityPlus::Reverb::do_ch_reverb + Line 520: EXTRN ?set_ch_reverb@Reverb@TimidityPlus@@QEAAXPEAHHH@Z:PROC ; TimidityPlus::Reverb::set_ch_reverb + Line 521: EXTRN ?init_reverb@Reverb@TimidityPlus@@QEAAXXZ:PROC ; TimidityPlus::Reverb::init_reverb + Line 522: EXTRN ?do_ch_chorus@Reverb@TimidityPlus@@QEAAXPEAHH@Z:PROC ; TimidityPlus::Reverb::do_ch_chorus + Line 523: EXTRN ?set_ch_chorus@Reverb@TimidityPlus@@QEAAXPEAHHH@Z:PROC ; TimidityPlus::Reverb::set_ch_chorus + Line 524: EXTRN ?init_ch_chorus@Reverb@TimidityPlus@@QEAAXXZ:PROC ; TimidityPlus::Reverb::init_ch_chorus + Line 525: EXTRN ?do_ch_chorus_xg@Reverb@TimidityPlus@@QEAAXPEAHH@Z:PROC ; TimidityPlus::Reverb::do_ch_chorus_xg + Line 526: EXTRN ?set_ch_delay@Reverb@TimidityPlus@@QEAAXPEAHHH@Z:PROC ; TimidityPlus::Reverb::set_ch_delay + Line 527: EXTRN ?init_ch_delay@Reverb@TimidityPlus@@QEAAXXZ:PROC ; TimidityPlus::Reverb::init_ch_delay + Line 528: EXTRN ?do_multi_eq_xg@Reverb@TimidityPlus@@QEAAXPEAHH@Z:PROC ; TimidityPlus::Reverb::do_multi_eq_xg + Line 529: EXTRN ?recompute_delay_status_gs@Reverb@TimidityPlus@@QEAAXXZ:PROC ; TimidityPlus::Reverb::recompute_delay_status_gs + Line 530: EXTRN ?set_delay_macro_gs@Reverb@TimidityPlus@@QEAAXH@Z:PROC ; TimidityPlus::Reverb::set_delay_macro_gs + Line 531: EXTRN ?recompute_reverb_status_gs@Reverb@TimidityPlus@@QEAAXXZ:PROC ; TimidityPlus::Reverb::recompute_reverb_status_gs + Line 532: EXTRN ?set_reverb_macro_gm2@Reverb@TimidityPlus@@QEAAXH@Z:PROC ; TimidityPlus::Reverb::set_reverb_macro_gm2 + Line 533: EXTRN ?set_reverb_macro_gs@Reverb@TimidityPlus@@QEAAXH@Z:PROC ; TimidityPlus::Reverb::set_reverb_macro_gs + Line 534: EXTRN ?recompute_chorus_status_gs@Reverb@TimidityPlus@@QEAAXXZ:PROC ; TimidityPlus::Reverb::recompute_chorus_status_gs + Line 535: EXTRN ?set_chorus_macro_gs@Reverb@TimidityPlus@@QEAAXH@Z:PROC ; TimidityPlus::Reverb::set_chorus_macro_gs + Line 536: EXTRN ?recompute_eq_status_gs@Reverb@TimidityPlus@@QEAAXXZ:PROC ; TimidityPlus::Reverb::recompute_eq_status_gs + Line 537: EXTRN ?set_multi_eq_type_xg@Reverb@TimidityPlus@@QEAAXH@Z:PROC ; TimidityPlus::Reverb::set_multi_eq_type_xg + Line 538: EXTRN ?recompute_multi_eq_xg@Reverb@TimidityPlus@@QEAAXXZ:PROC ; TimidityPlus::Reverb::recompute_multi_eq_xg + Line 539: EXTRN ?recompute_effect_xg@Reverb@TimidityPlus@@QEAAXPEAUeffect_xg_t@2@@Z:PROC ; TimidityPlus::Reverb::recompute_effect_xg + Line 540: EXTRN ?realloc_effect_xg@Reverb@TimidityPlus@@QEAAXPEAUeffect_xg_t@2@@Z:PROC ; TimidityPlus::Reverb::realloc_effect_xg + Line 541: EXTRN ?init_all_effect_xg@Reverb@TimidityPlus@@QEAAXXZ:PROC ; TimidityPlus::Reverb::init_all_effect_xg + Line 542: EXTRN ?recompute_insertion_effect_gs@Reverb@TimidityPlus@@QEAAXXZ:PROC ; TimidityPlus::Reverb::recompute_insertion_effect_gs + Line 543: EXTRN ?realloc_insertion_effect_gs@Reverb@TimidityPlus@@QEAAXXZ:PROC ; TimidityPlus::Reverb::realloc_insertion_effect_gs + Line 544: EXTRN ?init_effect_status@Reverb@TimidityPlus@@QEAAXH@Z:PROC ; TimidityPlus::Reverb::init_effect_status + Line 545: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 546: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 547: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 548: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 549: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 550: EXTRN ?lookup_triangular@TimidityPlus@@YANH@Z:PROC ; TimidityPlus::lookup_triangular + Line 551: EXTRN ?init_tables@TimidityPlus@@YAXXZ:PROC ; TimidityPlus::init_tables + Line 552: EXTRN ??0FRandom@@QEAA@XZ:PROC ; FRandom::FRandom + Line 553: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 554: EXTRN ?init_effect@Effect@TimidityPlus@@QEAAXXZ:PROC ; TimidityPlus::Effect::init_effect + Line 555: EXTRN ?do_effect@Effect@TimidityPlus@@QEAAXPEAHH@Z:PROC ; TimidityPlus::Effect::do_effect + Line 556: EXTRN ?CreateCriticalSection@@YAPEAVFInternalCriticalSection@@XZ:PROC ; CreateCriticalSection + Line 557: EXTRN ?DeleteCriticalSection@@YAXPEAVFInternalCriticalSection@@@Z:PROC ; DeleteCriticalSection + Line 558: EXTRN ?EnterCriticalSection@@YAXPEAVFInternalCriticalSection@@@Z:PROC ; EnterCriticalSection + Line 559: EXTRN ?LeaveCriticalSection@@YAXPEAVFInternalCriticalSection@@@Z:PROC ; LeaveCriticalSection + Line 560: EXTRN ?MIDIDeviceChanged@@YAXH_N@Z:PROC ; MIDIDeviceChanged + Line 561: EXTRN __CxxFrameHandler3:PROC + Line 562: EXTRN exp:PROC + Line 563: EXTRN floor:PROC + Line 564: EXTRN log:PROC + Line 565: EXTRN memset:PROC + Line 566: EXTRN pow:PROC + Line 567: EXTRN ?pitch_freq_table@TimidityPlus@@3QBMB:BYTE ; TimidityPlus::pitch_freq_table + Line 568: EXTRN ?freq_table@TimidityPlus@@3PAHA:BYTE ; TimidityPlus::freq_table + Line 569: EXTRN ?freq_table_tuning@TimidityPlus@@3PAY0IA@HA:BYTE ; TimidityPlus::freq_table_tuning + Line 570: EXTRN ?freq_table_pytha@TimidityPlus@@3PAY0IA@HA:BYTE ; TimidityPlus::freq_table_pytha + Line 571: EXTRN ?freq_table_meantone@TimidityPlus@@3PAY0IA@HA:BYTE ; TimidityPlus::freq_table_meantone + Line 572: EXTRN ?freq_table_pureint@TimidityPlus@@3PAY0IA@HA:BYTE ; TimidityPlus::freq_table_pureint + Line 573: EXTRN ?def_vol_table@TimidityPlus@@3PANA:BYTE ; TimidityPlus::def_vol_table + Line 574: EXTRN ?gs_vol_table@TimidityPlus@@3PANA:BYTE ; TimidityPlus::gs_vol_table + Line 575: EXTRN ?xg_vol_table@TimidityPlus@@3PEANEA:QWORD ; TimidityPlus::xg_vol_table + Line 576: EXTRN ?pan_table@TimidityPlus@@3PEANEA:QWORD ; TimidityPlus::pan_table + Line 577: EXTRN ?bend_fine@TimidityPlus@@3PANA:BYTE ; TimidityPlus::bend_fine + Line 578: EXTRN ?bend_coarse@TimidityPlus@@3PANA:BYTE ; TimidityPlus::bend_coarse + Line 579: EXTRN ?midi_time_table@TimidityPlus@@3QBNB:BYTE ; TimidityPlus::midi_time_table + Line 580: EXTRN ?midi_time_table2@TimidityPlus@@3QBNB:BYTE ; TimidityPlus::midi_time_table2 + Line 581: EXTRN ?perceived_vol_table@TimidityPlus@@3PANA:BYTE ; TimidityPlus::perceived_vol_table + Line 582: EXTRN ?gm2_vol_table@TimidityPlus@@3PANA:BYTE ; TimidityPlus::gm2_vol_table + Line 583: EXTRN ?sc_vel_table@TimidityPlus@@3PANA:BYTE ; TimidityPlus::sc_vel_table + Line 584: EXTRN ?sc_vol_table@TimidityPlus@@3PANA:BYTE ; TimidityPlus::sc_vol_table + Line 585: EXTRN ?sc_pan_table@TimidityPlus@@3PANA:BYTE ; TimidityPlus::sc_pan_table + Line 586: EXTRN ?gm2_pan_table@TimidityPlus@@3PANA:BYTE ; TimidityPlus::gm2_pan_table + Line 587: EXTRN ?sc_drum_level_table@TimidityPlus@@3PANA:BYTE ; TimidityPlus::sc_drum_level_table + Line 588: EXTRN ?pan_delay_table@TimidityPlus@@3QBMB:BYTE ; TimidityPlus::pan_delay_table + Line 589: EXTRN ?eq_freq_table_xg@TimidityPlus@@3QBMB:BYTE ; TimidityPlus::eq_freq_table_xg + Line 590: EXTRN __ImageBase:BYTE + Line 591: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\pngtexture.cod (34 hits) + Line 40: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 41: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 42: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 43: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 44: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 45: EXTRN __std_terminate:PROC + Line 46: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 47: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 48: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 49: EXTRN ?OpenLumpReader@FWadCollection@@QEAA?AVFileReader@@H@Z:PROC ; FWadCollection::OpenLumpReader + Line 50: EXTRN ?GetLumpFullName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetLumpFullName + Line 51: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 52: EXTRN ?MakeRemap@FPalette@@QEBAXPEBIPEAEPEBEH@Z:PROC ; FPalette::MakeRemap + Line 53: EXTRN ??1FTexture@@UEAA@XZ:PROC ; FTexture::~FTexture + Line 54: EXTRN ?Get8BitPixels@FTexture@@UEAA?AV?$TArray@EE@@_N@Z:PROC ; FTexture::Get8BitPixels + Line 55: EXTRN ??0FTexture@@IEAA@PEBDH@Z:PROC ; FTexture::FTexture + Line 56: EXTRN ?M_FindPNGChunk@@YAIPEAUPNGHandle@@I@Z:PROC ; M_FindPNGChunk + Line 57: EXTRN ?M_ReadIDAT@@YA_NAEAVFileReader@@PEAEHHHEEEI@Z:PROC ; M_ReadIDAT + Line 58: EXTRN ?CopyPixelDataRGB@FBitmap@@QEAAXHHPEBEHHHHHHPEAUFCopyInfo@@HHH@Z:PROC ; FBitmap::CopyPixelDataRGB + Line 59: EXTRN ?CopyPixelData@FBitmap@@QEAAXHHPEBEHHHHHPEAUPalEntry@@PEAUFCopyInfo@@@Z:PROC ; FBitmap::CopyPixelData + Line 60: EXTRN ?CreatePalettedPixels@FImageSource@@MEAA?AV?$TArray@EE@@H@Z:PROC ; FImageSource::CreatePalettedPixels + Line 61: EXTRN ?CopyPixels@FImageSource@@MEAAHPEAVFBitmap@@H@Z:PROC ; FImageSource::CopyPixels + Line 62: EXTRN ?CollectForPrecache@FImageSource@@UEAAXAEAV?$TMap@HU?$pair@HH@std@@U?$THashTraits@H@@U?$TValueTraits@U?$pair@HH@std@@@@@@_N@Z:PROC ; FImageSource::CollectForPrecache + Line 63: EXTRN ??_EFImageSource@@UEAAPEAXI@Z:PROC ; FImageSource::`vector deleting destructor' + Line 64: EXTRN ??_EFPNGTexture@@UEAAPEAXI@Z:PROC ; FPNGTexture::`vector deleting destructor' + Line 65: EXTRN ??_EFPNGFileTexture@@UEAAPEAXI@Z:PROC ; FPNGFileTexture::`vector deleting destructor' + Line 66: EXTRN __CxxFrameHandler3:PROC + Line 67: EXTRN memset:PROC + Line 68: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 69: EXTRN ?RGB256k@@3TColorTable256k@@A:BYTE ; RGB256k + Line 70: EXTRN ?GPalette@@3UFPalette@@A:BYTE ; GPalette + Line 71: EXTRN ?GrayMap@ImageHelpers@@3PAEA:BYTE ; ImageHelpers::GrayMap + Line 72: EXTRN ?ImageArena@FImageSource@@1VFMemArena@@A:BYTE ; FImageSource::ImageArena + Line 73: EXTRN ?NextID@FImageSource@@1HA:DWORD ; FImageSource::NextID + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\po_man.cod (71 hits) + Line 29: EXTRN ?RegistrationInfo@DThinker@@2UClassReg@@A:BYTE ; DThinker::RegistrationInfo + Line 228: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 229: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 230: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 231: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 232: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 233: EXTRN atexit:PROC + Line 234: EXTRN _Init_thread_header:PROC + Line 235: EXTRN _Init_thread_abort:PROC + Line 236: EXTRN _Init_thread_footer:PROC + Line 237: EXTRN __std_terminate:PROC + Line 238: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 239: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 240: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 241: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 242: EXTRN c_atan2:PROC + Line 243: EXTRN c_sqrt:PROC + Line 244: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 245: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 246: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 247: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 248: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 249: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 250: EXTRN ?P_TryMove@@YA_NPEAVAActor@@AEBU?$TVector2@N@@HPEBUsecplane_t@@_N@Z:PROC ; P_TryMove + Line 251: EXTRN ?P_CheckMove@@YA_NPEAVAActor@@AEBU?$TVector2@N@@H@Z:PROC ; P_CheckMove + Line 252: EXTRN ?P_FindFloorCeiling@@YAXPEAVAActor@@H@Z:PROC ; P_FindFloorCeiling + Line 253: EXTRN ?P_TraceBleed@@YAXHPEAVAActor@@@Z:PROC ; P_TraceBleed + Line 254: EXTRN ?P_DamageMobj@@YAHPEAVAActor@@00HVFName@@HU?$TAngle@N@@@Z:PROC ; P_DamageMobj + Line 255: EXTRN ?AddToBox@FBoundingBox@@QEAAXAEBU?$TVector2@N@@@Z:PROC ; FBoundingBox::AddToBox + Line 256: EXTRN ?BoxOnLineSide@FBoundingBox@@QEBAHPEBUline_t@@@Z:PROC ; FBoundingBox::BoxOnLineSide + Line 257: EXTRN ?SN_StartSequence@@YAPEAVDSeqNode@@PEAUFPolyObj@@HW4seqtype_t@@H_N@Z:PROC ; SN_StartSequence + Line 258: EXTRN ?SN_StopSequence@@YAXPEAUFPolyObj@@@Z:PROC ; SN_StopSequence + Line 259: EXTRN ?Link@FThinkerCollection@@QEAAXPEAVDThinker@@H@Z:PROC ; FThinkerCollection::Link + Line 260: EXTRN ?StaticType@DThinker@@UEBAPEAVPClass@@XZ:PROC ; DThinker::StaticType + Line 261: EXTRN ?OnDestroy@DThinker@@UEAAXXZ:PROC ; DThinker::OnDestroy + Line 262: EXTRN ??1DThinker@@UEAA@XZ:PROC ; DThinker::~DThinker + Line 263: EXTRN ?Tick@DThinker@@UEAAXXZ:PROC ; DThinker::Tick + Line 264: EXTRN ?PostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::PostBeginPlay + Line 265: EXTRN ?CallPostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::CallPostBeginPlay + Line 266: EXTRN ?PostSerialize@DThinker@@UEAAXXZ:PROC ; DThinker::PostSerialize + Line 267: EXTRN ?Serialize@DThinker@@UEAAXAEAVFSerializer@@@Z:PROC ; DThinker::Serialize + Line 268: EXTRN ?PropagateMark@DThinker@@UEAA_KXZ:PROC ; DThinker::PropagateMark + Line 269: EXTRN ??_EDThinker@@UEAAPEAXI@Z:PROC ; DThinker::`vector deleting destructor' + Line 270: EXTRN ?CallGrind@AActor@@QEAA_N_N@Z:PROC ; AActor::CallGrind + Line 271: EXTRN ?P_LineOpening_3dMidtex@@YA_NPEAVAActor@@PEBUline_t@@AEAUFLineOpening@@_N@Z:PROC ; P_LineOpening_3dMidtex + Line 272: EXTRN ?DelRef@DInterpolation@@QEAAH_N@Z:PROC ; DInterpolation::DelRef + Line 273: EXTRN ?AdjustLine@line_t@@QEAAXXZ:PROC ; line_t::AdjustLine + Line 274: EXTRN ??_EDPolyAction@@UEAAPEAXI@Z:PROC ; DPolyAction::`vector deleting destructor' + Line 275: EXTRN ?SetInterpolation@FPolyObj@@QEAAPEAVDInterpolation@@XZ:PROC ; FPolyObj::SetInterpolation + Line 276: EXTRN ?ArraySize@FSerializer@@QEAAIXZ:PROC ; FSerializer::ArraySize + Line 277: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 278: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 279: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEA_NPEA_N@Z:PROC ; Serialize + Line 280: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 281: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEANPEAN@Z:PROC ; Serialize + Line 282: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 283: EXTRN ??$Serialize@UFPolyObj@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUFPolyObj@@PEAPEAU1@@Z:PROC ; Serialize + Line 284: EXTRN ?init@FBlockThingsIterator@@QEAAXAEBVFBoundingBox@@@Z:PROC ; FBlockThingsIterator::init + Line 285: EXTRN ?Next@FBlockThingsIterator@@QEAAPEAVAActor@@_N@Z:PROC ; FBlockThingsIterator::Next + Line 286: EXTRN ?GetPortalOffsetPosition@FLevelLocals@@QEAA?AU?$TVector2@N@@NNNN@Z:PROC ; FLevelLocals::GetPortalOffsetPosition + Line 287: EXTRN ??_EDRotatePoly@@UEAAPEAXI@Z:PROC ; DRotatePoly::`vector deleting destructor' + Line 288: EXTRN ??_EDMovePoly@@UEAAPEAXI@Z:PROC ; DMovePoly::`vector deleting destructor' + Line 289: EXTRN ??_EDMovePolyTo@@UEAAPEAXI@Z:PROC ; DMovePolyTo::`vector deleting destructor' + Line 290: EXTRN ??_EDPolyDoor@@UEAAPEAXI@Z:PROC ; DPolyDoor::`vector deleting destructor' + Line 291: EXTRN __CxxFrameHandler3:PROC + Line 292: EXTRN memcmp:PROC + Line 293: EXTRN _Init_thread_epoch:DWORD + Line 294: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 295: EXTRN ?save_full@@3_NA:BYTE ; save_full + Line 296: EXTRN _fltused:DWORD + Line 297: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\polevl.cod (1 hit) + Line 10: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\poly_all.cod (219 hits) + Line 165: EXTRN ??_EStat_polyfps@@UEAAPEAXI@Z:PROC ; Stat_polyfps::`vector deleting destructor' + Line 166: EXTRN ?GPalette@@3UFPalette@@A:BYTE ; GPalette + Line 167: EXTRN ?RGB256k@@3TColorTable256k@@A:BYTE ; RGB256k + Line 168: EXTRN ?fuzzoffset@swrenderer@@3PAHA:BYTE ; swrenderer::fuzzoffset + Line 169: EXTRN ?fuzz_random_x_offset@swrenderer@@3PAHA:BYTE ; swrenderer::fuzz_random_x_offset + Line 170: EXTRN ?fuzzpos@swrenderer@@3HA:DWORD ; swrenderer::fuzzpos + Line 171: EXTRN ?viewheight@@3HA:DWORD ; viewheight + Line 1633: EXTRN _purecall:PROC + Line 1634: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 1635: EXTRN ??3@YAXPEAX@Z:PROC ; operator delete + Line 1636: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 1637: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 1638: EXTRN atexit:PROC + Line 1639: EXTRN _Init_thread_header:PROC + Line 1640: EXTRN _Init_thread_abort:PROC + Line 1641: EXTRN _Init_thread_footer:PROC + Line 1642: EXTRN __std_terminate:PROC + Line 1643: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 1644: EXTRN ??2@YAPEAX_KAEBUnothrow_t@std@@@Z:PROC ; operator new + Line 1645: EXTRN terminate:PROC + Line 1646: EXTRN __std_exception_copy:PROC + Line 1647: EXTRN __std_exception_destroy:PROC + Line 1648: EXTRN ??_Eexception@std@@UEAAPEAXI@Z:PROC ; std::exception::`vector deleting destructor' + Line 1649: EXTRN __std_reverse_trivially_swappable_8:PROC + Line 1650: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 1651: EXTRN ??_Eruntime_error@std@@UEAAPEAXI@Z:PROC ; std::runtime_error::`vector deleting destructor' + Line 1652: EXTRN ?_Execute_once@std@@YAHAEAUonce_flag@1@P6AHPEAX1PEAPEAX@Z1@Z:PROC ; std::_Execute_once + Line 1653: EXTRN ??_E_System_error@std@@UEAAPEAXI@Z:PROC ; std::_System_error::`vector deleting destructor' + Line 1654: EXTRN ??_Esystem_error@std@@UEAAPEAXI@Z:PROC ; std::system_error::`vector deleting destructor' + Line 1655: EXTRN ?_Syserror_map@std@@YAPEBDH@Z:PROC ; std::_Syserror_map + Line 1656: EXTRN ??_E_Generic_error_category@std@@UEAAPEAXI@Z:PROC ; std::_Generic_error_category::`vector deleting destructor' + Line 1657: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 1658: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 1659: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 1660: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 1661: EXTRN ?AppendFormat@FString@@QEAAXPEBDZZ:PROC ; FString::AppendFormat + Line 1662: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 1663: EXTRN c_atan2:PROC + Line 1664: EXTRN c_sqrt:PROC + Line 1665: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 1666: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 1667: EXTRN ?CheckFuzz@FRenderStyle@@QEAAXXZ:PROC ; FRenderStyle::CheckFuzz + Line 1668: EXTRN ?IsVisible@FRenderStyle@@QEBA_NN@Z:PROC ; FRenderStyle::IsVisible + Line 1669: EXTRN ?TranslationToTable@@YAPEAUFRemapTable@@H@Z:PROC ; TranslationToTable + Line 1670: EXTRN ?GetSkyCapColor@FTexture@@QEAA?AUPalEntry@@_N@Z:PROC ; FTexture::GetSkyCapColor + Line 1671: EXTRN ?GetSoftwareTexture@FTexture@@QEAAPEAVFSoftwareTexture@@XZ:PROC ; FTexture::GetSoftwareTexture + Line 1672: EXTRN ?PalCheck@FTextureManager@@QEAA?AVFTextureID@@V2@@Z:PROC ; FTextureManager::PalCheck + Line 1673: EXTRN ?_Xbad_function_call@std@@YAXXZ:PROC ; std::_Xbad_function_call + Line 1674: EXTRN _Thrd_start:PROC + Line 1675: EXTRN _Xtime_get_ticks:PROC + Line 1676: EXTRN _Thrd_join:PROC + Line 1677: EXTRN _Thrd_hardware_concurrency:PROC + Line 1678: EXTRN _Thrd_id:PROC + Line 1679: EXTRN _Mtx_init:PROC + Line 1680: EXTRN _Mtx_destroy:PROC + Line 1681: EXTRN _Mtx_init_in_situ:PROC + Line 1682: EXTRN _Mtx_destroy_in_situ:PROC + Line 1683: EXTRN _Mtx_current_owns:PROC + Line 1684: EXTRN _Mtx_lock:PROC + Line 1685: EXTRN _Mtx_unlock:PROC + Line 1686: EXTRN _Cnd_init:PROC + Line 1687: EXTRN _Cnd_destroy:PROC + Line 1688: EXTRN _Cnd_init_in_situ:PROC + Line 1689: EXTRN _Cnd_destroy_in_situ:PROC + Line 1690: EXTRN _Cnd_wait:PROC + Line 1691: EXTRN _Cnd_timedwait:PROC + Line 1692: EXTRN _Cnd_broadcast:PROC + Line 1693: EXTRN _Cnd_signal:PROC + Line 1694: EXTRN _Cnd_do_broadcast_at_thread_exit:PROC + Line 1695: EXTRN ?_Throw_C_error@std@@YAXH@Z:PROC ; std::_Throw_C_error + Line 1696: EXTRN ?_Throw_Cpp_error@std@@YAXH@Z:PROC ; std::_Throw_Cpp_error + Line 1697: EXTRN ??0FStat@@QEAA@PEBD@Z:PROC ; FStat::FStat + Line 1698: EXTRN ??1FStat@@UEAA@XZ:PROC ; FStat::~FStat + Line 1699: EXTRN ?DrawTexture@DFrameBuffer@@QEAAXPEAVFTexture@@NNHZZ:PROC ; DFrameBuffer::DrawTexture + Line 1700: EXTRN ?AspectPspriteOffset@@YANM@Z:PROC ; AspectPspriteOffset + Line 1701: EXTRN ?AspectMultiplier@@YAHM@Z:PROC ; AspectMultiplier + Line 1702: EXTRN ?CopyPlaneIfValid@secplane_t@@QEBA_NPEAU1@PEBU1@@Z:PROC ; secplane_t::CopyPlaneIfValid + Line 1703: EXTRN ?P_GetPlaneLight@@YAPEAUlightlist_t@@PEAUsector_t@@PEAUsecplane_t@@_N@Z:PROC ; P_GetPlaneLight + Line 1704: EXTRN ?ValidatePortal@sector_t@@QEAAPEAUFSectorPortal@@H@Z:PROC ; sector_t::ValidatePortal + Line 1705: EXTRN ?GetLightLevel@side_t@@QEBAH_NH0PEAH@Z:PROC ; side_t::GetLightLevel + Line 1706: EXTRN ?BuildPolyBSP@subsector_t@@QEAAXXZ:PROC ; subsector_t::BuildPolyBSP + Line 1707: EXTRN ?AdjustFloorClip@@YAXPEBUsector_t@@@Z:PROC ; AdjustFloorClip + Line 1708: EXTRN ?GetFloorLight@@YAHPEBUsector_t@@@Z:PROC ; GetFloorLight + Line 1709: EXTRN ?GetCeilingLight@@YAHPEBUsector_t@@@Z:PROC ; GetCeilingLight + Line 1710: EXTRN ?P_TranslatePortalXY@@YAXPEAUline_t@@AEAN1@Z:PROC ; P_TranslatePortalXY + Line 1711: EXTRN ?P_TranslatePortalAngle@@YAXPEAUline_t@@AEAU?$TAngle@N@@@Z:PROC ; P_TranslatePortalAngle + Line 1712: EXTRN ?P_TranslatePortalZ@@YAXPEAUline_t@@AEAN@Z:PROC ; P_TranslatePortalZ + Line 1713: EXTRN ?GetSpriteFrame@spritedef_t@@QEAA?AVFTextureID@@HHU?$TAngle@N@@PEA_N_N@Z:PROC ; spritedef_t::GetSpriteFrame + Line 1714: EXTRN ?AlterWeaponSprite@AActor@@QEAAXPEAUvisstyle_t@@@Z:PROC ; AActor::AlterWeaponSprite + Line 1715: EXTRN ?IsVisibleToPlayer@AActor@@QEBA_NXZ:PROC ; AActor::IsVisibleToPlayer + Line 1716: EXTRN ?GetRenderStyle@DPSprite@@QEAA?AU?$pair@TFRenderStyle@@M@std@@TFRenderStyle@@N@Z:PROC ; DPSprite::GetRenderStyle + Line 1717: EXTRN ?GetYAdjust@DPSprite@@QEAAM_N@Z:PROC ; DPSprite::GetYAdjust + Line 1718: EXTRN ?P_BobWeapon@@YAXPEAVplayer_t@@PEAM1N@Z:PROC ; P_BobWeapon + Line 1719: EXTRN ?FindPSprite@player_t@@QEAAPEAVDPSprite@@H@Z:PROC ; player_t::FindPSprite + Line 1720: EXTRN ?PointInRenderSubsector@FLevelLocals@@QEAAPEAUsubsector_t@@HH@Z:PROC ; FLevelLocals::PointInRenderSubsector + Line 1721: EXTRN ?loadMatrix@VSMatrix@@QEAAXPEBM@Z:PROC ; VSMatrix::loadMatrix + Line 1722: EXTRN ?inverseMatrix@VSMatrix@@QEAA_NAEAV1@@Z:PROC ; VSMatrix::inverseMatrix + Line 1723: EXTRN ?RenderModel@FModelRenderer@@QEAAXMMMPEAUFSpriteModelFrame@@PEAVAActor@@N@Z:PROC ; FModelRenderer::RenderModel + Line 1724: EXTRN ?RenderHUDModel@FModelRenderer@@QEAAXPEAVDPSprite@@MM@Z:PROC ; FModelRenderer::RenderHUDModel + Line 1725: EXTRN ??_EFModelRenderer@@UEAAPEAXI@Z:PROC ; FModelRenderer::`vector deleting destructor' + Line 1726: EXTRN ??_EIModelVertexBuffer@@UEAAPEAXI@Z:PROC ; IModelVertexBuffer::`vector deleting destructor' + Line 1727: EXTRN ?FindModelFrame@@YAPEAUFSpriteModelFrame@@PEBVPClass@@HH_N@Z:PROC ; FindModelFrame + Line 1728: EXTRN ?IsHUDModelForPlayerAvailable@@YA_NPEAVplayer_t@@@Z:PROC ; IsHUDModelForPlayerAvailable + Line 1729: EXTRN ??0FRenderViewpoint@@QEAA@XZ:PROC ; FRenderViewpoint::FRenderViewpoint + Line 1730: EXTRN ?SetViewAngle@FRenderViewpoint@@QEAAXAEBUFViewWindow@@@Z:PROC ; FRenderViewpoint::SetViewAngle + Line 1731: EXTRN ?R_SetupFrame@@YAXAEAUFRenderViewpoint@@AEAUFViewWindow@@PEAVAActor@@@Z:PROC ; R_SetupFrame + Line 1732: EXTRN ?R_ExecuteSetViewSize@@YAXAEAUFRenderViewpoint@@AEAUFViewWindow@@@Z:PROC ; R_ExecuteSetViewSize + Line 1733: EXTRN ?R_SetWindow@@YAXAEAUFRenderViewpoint@@AEAUFViewWindow@@HHHH_N@Z:PROC ; R_SetWindow + Line 1734: EXTRN ?R_GetGlobVis@@YANAEBUFViewWindow@@N@Z:PROC ; R_GetGlobVis + Line 1735: EXTRN ?R_InitFuzzTable@swrenderer@@YAXH@Z:PROC ; swrenderer::R_InitFuzzTable + Line 1736: EXTRN ?R_UpdateFuzzPosFrameStart@swrenderer@@YAXXZ:PROC ; swrenderer::R_UpdateFuzzPosFrameStart + Line 1737: EXTRN ??_EDrawerCommand@@UEAAPEAXI@Z:PROC ; DrawerCommand::`vector deleting destructor' + Line 1738: EXTRN ??0MemcpyCommand@@QEAA@PEAXPEBXHHHH@Z:PROC ; MemcpyCommand::MemcpyCommand + Line 1739: EXTRN ?Execute@MemcpyCommand@@UEAAXPEAVDrawerThread@@@Z:PROC ; MemcpyCommand::Execute + Line 1740: EXTRN ?Execute@DrawerThreads@@SAXV?$shared_ptr@VDrawerCommandQueue@@@std@@@Z:PROC ; DrawerThreads::Execute + Line 1741: EXTRN ?WaitForWorkers@DrawerThreads@@SAXXZ:PROC ; DrawerThreads::WaitForWorkers + Line 1742: EXTRN ?Instance@DrawerThreads@@CAPEAV1@XZ:PROC ; DrawerThreads::Instance + Line 1743: EXTRN ??0DrawerCommandQueue@@QEAA@PEAVRenderMemory@@@Z:PROC ; DrawerCommandQueue::DrawerCommandQueue + Line 1744: EXTRN ?AllocMemory@DrawerCommandQueue@@AEAAPEAX_K@Z:PROC ; DrawerCommandQueue::AllocMemory + Line 1745: EXTRN ??_EPolyDrawerCommand@@UEAAPEAXI@Z:PROC ; PolyDrawerCommand::`vector deleting destructor' + Line 1746: EXTRN ??_EPolySetTransformCommand@@UEAAPEAXI@Z:PROC ; PolySetTransformCommand::`vector deleting destructor' + Line 1747: EXTRN ??_EPolySetCullCCWCommand@@UEAAPEAXI@Z:PROC ; PolySetCullCCWCommand::`vector deleting destructor' + Line 1748: EXTRN ??_EPolySetTwoSidedCommand@@UEAAPEAXI@Z:PROC ; PolySetTwoSidedCommand::`vector deleting destructor' + Line 1749: EXTRN ??_EPolySetWeaponSceneCommand@@UEAAPEAXI@Z:PROC ; PolySetWeaponSceneCommand::`vector deleting destructor' + Line 1750: EXTRN ??_EPolySetModelVertexShaderCommand@@UEAAPEAXI@Z:PROC ; PolySetModelVertexShaderCommand::`vector deleting destructor' + Line 1751: EXTRN ??_EPolyClearStencilCommand@@UEAAPEAXI@Z:PROC ; PolyClearStencilCommand::`vector deleting destructor' + Line 1752: EXTRN ??_EPolySetViewportCommand@@UEAAPEAXI@Z:PROC ; PolySetViewportCommand::`vector deleting destructor' + Line 1753: EXTRN ??_EDrawPolyTrianglesCommand@@UEAAPEAXI@Z:PROC ; DrawPolyTrianglesCommand::`vector deleting destructor' + Line 1754: EXTRN ??_EDrawRectCommand@@UEAAPEAXI@Z:PROC ; DrawRectCommand::`vector deleting destructor' + Line 1755: EXTRN ??_EPolyTranslucentObject@@UEAAPEAXI@Z:PROC ; PolyTranslucentObject::`vector deleting destructor' + Line 1756: EXTRN ?Instance@CameraLight@swrenderer@@SAPEAV12@XZ:PROC ; swrenderer::CameraLight::Instance + Line 1757: EXTRN ?SetCamera@CameraLight@swrenderer@@QEAAXAEAUFRenderViewpoint@@PEAVDCanvas@@PEAVAActor@@@Z:PROC ; swrenderer::CameraLight::SetCamera + Line 1758: EXTRN ?Clear@RenderMemory@@QEAAXXZ:PROC ; RenderMemory::Clear + Line 1759: EXTRN ?AllocBytes@RenderMemory@@AEAAPEAXH@Z:PROC ; RenderMemory::AllocBytes + Line 1760: EXTRN ?NetUpdate@@YAXXZ:PROC ; NetUpdate + Line 1761: EXTRN ?GetSpecialLights@@YAPEAUFDynamicColormap@@UPalEntry@@0H@Z:PROC ; GetSpecialLights + Line 1762: EXTRN ?GetXY@DBaseDecal@@QEBAXPEAUside_t@@AEAN1@Z:PROC ; DBaseDecal::GetXY + Line 1763: EXTRN ?PeekThreadedErrorPane@@YAXXZ:PROC ; PeekThreadedErrorPane + Line 1764: EXTRN ??_EPolyTranslucentParticle@@UEAAPEAXI@Z:PROC ; PolyTranslucentParticle::`vector deleting destructor' + Line 1765: EXTRN ??_EPolyTranslucent3DFloorPlane@@UEAAPEAXI@Z:PROC ; PolyTranslucent3DFloorPlane::`vector deleting destructor' + Line 1766: EXTRN ??_EPolyModelRenderer@@UEAAPEAXI@Z:PROC ; PolyModelRenderer::`vector deleting destructor' + Line 1767: EXTRN ??_EPolyModelVertexBuffer@@UEAAPEAXI@Z:PROC ; PolyModelVertexBuffer::`vector deleting destructor' + Line 1768: EXTRN ??_EPolyTranslucentWall@@UEAAPEAXI@Z:PROC ; PolyTranslucentWall::`vector deleting destructor' + Line 1769: EXTRN ??_EPolyTranslucentThing@@UEAAPEAXI@Z:PROC ; PolyTranslucentThing::`vector deleting destructor' + Line 1770: EXTRN ??_E?$_Ref_count_obj@VDrawerCommandQueue@@@std@@UEAAPEAXI@Z:PROC ; std::_Ref_count_obj::`vector deleting destructor' + Line 1771: EXTRN ??_E?$_Ref_count_obj@VPolyTriangleThreadData@@@std@@UEAAPEAXI@Z:PROC ; std::_Ref_count_obj::`vector deleting destructor' + Line 1772: EXTRN _CxxThrowException:PROC + Line 1773: EXTRN __CxxFrameHandler3:PROC + Line 1774: EXTRN __chkstk:PROC + Line 1775: EXTRN __libm_sse2_sincos_:PROC + Line 1776: EXTRN __libm_sse2_sincosf_:PROC + Line 1777: EXTRN asin:PROC + Line 1778: EXTRN atan:PROC + Line 1779: EXTRN fmod:PROC + Line 1780: EXTRN memcmp:PROC + Line 1781: EXTRN memcpy:PROC + Line 1782: EXTRN memmove:PROC + Line 1783: EXTRN memset:PROC + Line 1784: EXTRN tan:PROC + Line 1785: EXTRN _Init_thread_epoch:DWORD + Line 1786: EXTRN ?nothrow@std@@3Unothrow_t@1@B:BYTE ; std::nothrow + Line 1787: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 1788: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 1789: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 1790: EXTRN ?RGB32k@@3TColorTable32k@@A:BYTE ; RGB32k + Line 1791: EXTRN ?LegacyRenderStyles@@3PATFRenderStyle@@A:BYTE ; LegacyRenderStyles + Line 1792: EXTRN ?r_spriteadjustSW@@3HA:DWORD ; r_spriteadjustSW + Line 1793: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 1794: EXTRN ?SpecialColormaps@@3V?$TArray@UFSpecialColormap@@U1@@@A:BYTE ; SpecialColormaps + Line 1795: EXTRN ?PerfToMillisec@@3NA:QWORD ; PerfToMillisec + Line 1796: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 1797: EXTRN ?skyflatnum@@3VFTextureID@@A:DWORD ; skyflatnum + Line 1798: EXTRN ?SpriteFrames@@3V?$TArray@Uspriteframe_t@@U1@@@A:BYTE ; SpriteFrames + Line 1799: EXTRN ?viewwindowx@@3HA:DWORD ; viewwindowx + Line 1800: EXTRN ?viewwindowy@@3HA:DWORD ; viewwindowy + Line 1801: EXTRN ?viewwidth@@3HA:DWORD ; viewwidth + Line 1802: EXTRN ?sprites@@3V?$TArray@Uspritedef_t@@U1@@@A:BYTE ; sprites + Line 1803: EXTRN ?paused@@3HA:DWORD ; paused + Line 1804: EXTRN ?viewactive@@3_NA:BYTE ; viewactive + Line 1805: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 1806: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 1807: EXTRN ?CrosshairImage@@3PEAVFTexture@@EA:QWORD ; CrosshairImage + Line 1808: EXTRN ?Models@@3V?$TDeletingArray@PEAVFModel@@PEAV1@@@A:BYTE ; Models + Line 1809: EXTRN ?r_viewpoint@@3UFRenderViewpoint@@A:BYTE ; r_viewpoint + Line 1810: EXTRN ?r_viewwindow@@3UFViewWindow@@A:BYTE ; r_viewwindow + Line 1811: EXTRN ?R_OldBlend@@3IA:DWORD ; R_OldBlend + Line 1812: EXTRN ?r_multithreaded@@3VFIntCVar@@A:BYTE ; r_multithreaded + Line 1813: EXTRN ?r_drawfuzz@@3VFIntCVar@@A:BYTE ; r_drawfuzz + Line 1814: EXTRN ?transsouls@@3VFFloatCVar@@A:BYTE ; transsouls + Line 1815: EXTRN ?r_dynlights@@3VFBoolCVar@@A:BYTE ; r_dynlights + Line 1816: EXTRN ?FrameCycles@@3Vcycle_t@@A:QWORD ; FrameCycles + Line 1817: EXTRN ?realcolormaps@@3UFSWColormap@@A:BYTE ; realcolormaps + Line 1818: EXTRN ?NormalLight@@3UFDynamicColormap@@A:BYTE ; NormalLight + Line 1819: EXTRN ?FullNormalLight@@3UFDynamicColormap@@A:BYTE ; FullNormalLight + Line 1820: EXTRN ?SpecialSWColormaps@@3V?$TArray@UFSWColormap@@U1@@@A:BYTE ; SpecialSWColormaps + Line 1821: EXTRN ?screenblocks@@3VFIntCVar@@A:BYTE ; screenblocks + Line 1822: EXTRN ?r_visibility@@3VFFloatCVar@@A:BYTE ; r_visibility + Line 1823: EXTRN ?r_models@@3VFBoolCVar@@A:BYTE ; r_models + Line 1824: EXTRN ?r_modelscene@@3_NA:BYTE ; r_modelscene + Line 1825: EXTRN ?r_scene_multithreaded@@3VFIntCVar@@A:BYTE ; r_scene_multithreaded + Line 1826: EXTRN ?gl_particles_style@@3VFIntCVar@@A:BYTE ; gl_particles_style + Line 1827: EXTRN ?r_3dfloors@@3VFIntCVar@@A:BYTE ; r_3dfloors + Line 1828: EXTRN ?r_drawplayersprites@@3VFBoolCVar@@A:BYTE ; r_drawplayersprites + Line 1829: EXTRN ?r_deathcamera@@3VFBoolCVar@@A:BYTE ; r_deathcamera + Line 1830: EXTRN ?r_fullbrightignoresectorcolor@@3VFBoolCVar@@A:BYTE ; r_fullbrightignoresectorcolor + Line 1831: EXTRN ?r_portal_recursions@@3VFIntCVar@@A:BYTE ; r_portal_recursions + Line 1832: EXTRN ?model_distance_cull@@3NA:QWORD ; model_distance_cull + Line 1833: EXTRN ?skyoffset@@3VFFloatCVar@@A:BYTE ; skyoffset + Line 1834: EXTRN ?r_skymode@@3VFIntCVar@@A:BYTE ; r_skymode + Line 1835: EXTRN ?r_UseVanillaTransparency@@3_NA:BYTE ; r_UseVanillaTransparency + Line 1836: EXTRN ?r_debug_disable_vis_filter@@3VFBoolCVar@@A:BYTE ; r_debug_disable_vis_filter + Line 1837: EXTRN ?gl_sclipthreshold@@3VFFloatCVar@@A:BYTE ; gl_sclipthreshold + Line 1838: EXTRN ?r_renderercaps@@3IA:DWORD ; r_renderercaps + Line 1839: EXTRN ?r_drawmirrors@@3VFBoolCVar@@A:BYTE ; r_drawmirrors + Line 1840: EXTRN ?r_fogboundary@@3VFBoolCVar@@A:BYTE ; r_fogboundary + Line 1841: EXTRN __ImageBase:BYTE + Line 1842: EXTRN __isa_available:DWORD + Line 1843: EXTRN _fltused:DWORD + Line 1844: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\polyobjects.cod (19 hits) + Line 28: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 29: EXTRN atexit:PROC + Line 30: EXTRN _Init_thread_header:PROC + Line 31: EXTRN _Init_thread_footer:PROC + Line 32: EXTRN __std_terminate:PROC + Line 33: EXTRN qsort:PROC + Line 34: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 35: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 36: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 37: EXTRN ??0FPolyObj@@QEAA@XZ:PROC ; FPolyObj::FPolyObj + Line 38: EXTRN ?LinkPolyobj@FPolyObj@@QEAAXXZ:PROC ; FPolyObj::LinkPolyobj + Line 39: EXTRN ?CalcCenter@FPolyObj@@QEAAXXZ:PROC ; FPolyObj::CalcCenter + Line 40: EXTRN ?PointInRenderSubsector@FLevelLocals@@QEAAPEAUsubsector_t@@HH@Z:PROC ; FLevelLocals::PointInRenderSubsector + Line 41: EXTRN __CxxFrameHandler3:PROC + Line 42: EXTRN memset:PROC + Line 43: EXTRN _Init_thread_epoch:DWORD + Line 44: EXTRN ?validcount@@3HA:DWORD ; validcount + Line 45: EXTRN _fltused:DWORD + Line 46: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\portal.cod (44 hits) + Line 236: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 237: EXTRN atexit:PROC + Line 238: EXTRN __std_terminate:PROC + Line 239: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 240: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 241: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 242: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 243: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 244: EXTRN c_atan2:PROC + Line 245: EXTRN c_sin:PROC + Line 246: EXTRN c_cos:PROC + Line 247: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 248: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 249: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 250: EXTRN ?BoxOnLineSide@FBoundingBox@@QEBAHPEBUline_t@@@Z:PROC ; FBoundingBox::BoxOnLineSide + Line 251: EXTRN ?CheckPortalPlane@@YAXPEAUsector_t@@H@Z:PROC ; CheckPortalPlane + Line 252: EXTRN ?Next@FLineIdIterator@@QEAAHXZ:PROC ; FLineIdIterator::Next + Line 253: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 254: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 255: EXTRN ?LinkToWorld@AActor@@QEAAXPEAUFLinkContext@@_NPEAUsector_t@@@Z:PROC ; AActor::LinkToWorld + Line 256: EXTRN ?UnlinkFromWorld@AActor@@QEAAXPEAUFLinkContext@@@Z:PROC ; AActor::UnlinkFromWorld + Line 257: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 258: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 259: EXTRN ??0FBlockLinesIterator@@QEAA@PEAUFLevelLocals@@AEBVFBoundingBox@@@Z:PROC ; FBlockLinesIterator::FBlockLinesIterator + Line 260: EXTRN ?Next@FBlockLinesIterator@@QEAAPEAUline_t@@XZ:PROC ; FBlockLinesIterator::Next + Line 261: EXTRN ?AddLineIntercepts@FPathTraverse@@MEAAXHH@Z:PROC ; FPathTraverse::AddLineIntercepts + Line 262: EXTRN ?AddThingIntercepts@FPathTraverse@@MEAAXHHAEAVFBlockThingsIterator@@_N@Z:PROC ; FPathTraverse::AddThingIntercepts + Line 263: EXTRN ?Next@FPathTraverse@@QEAAPEAUintercept_t@@XZ:PROC ; FPathTraverse::Next + Line 264: EXTRN ?init@FPathTraverse@@QEAAXNNNNHN@Z:PROC ; FPathTraverse::init + Line 265: EXTRN ??1FPathTraverse@@UEAA@XZ:PROC ; FPathTraverse::~FPathTraverse + Line 266: EXTRN ??_EFPathTraverse@@UEAAPEAXI@Z:PROC ; FPathTraverse::`vector deleting destructor' + Line 267: EXTRN ?P_InterceptVector@@YANPEBUdivline_t@@0@Z:PROC ; P_InterceptVector + Line 268: EXTRN ?PointInSubsector@FLevelLocals@@AEAAPEAUsubsector_t@@NN@Z:PROC ; FLevelLocals::PointInSubsector + Line 269: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 270: EXTRN ??_EFLinePortalTraverse@@UEAAPEAXI@Z:PROC ; FLinePortalTraverse::`vector deleting destructor' + Line 271: EXTRN __CxxFrameHandler3:PROC + Line 272: EXTRN memmove:PROC + Line 273: EXTRN memset:PROC + Line 274: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 275: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 276: EXTRN ?validcount@@3HA:DWORD ; validcount + Line 277: EXTRN ?intercepts@FPathTraverse@@1V?$TArray@Uintercept_t@@U1@@@A:BYTE ; FPathTraverse::intercepts + Line 278: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 279: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\portalgroups.cod (25 hits) + Line 55: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 56: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 57: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 58: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 59: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 60: EXTRN atexit:PROC + Line 61: EXTRN _Init_thread_header:PROC + Line 62: EXTRN _Init_thread_abort:PROC + Line 63: EXTRN _Init_thread_footer:PROC + Line 64: EXTRN __std_terminate:PROC + Line 65: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 66: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 67: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 68: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 69: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 70: EXTRN c_atan2:PROC + Line 71: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 72: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 73: EXTRN __CxxFrameHandler3:PROC + Line 74: EXTRN memcpy:PROC + Line 75: EXTRN memset:PROC + Line 76: EXTRN _Init_thread_epoch:DWORD + Line 77: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 78: EXTRN _fltused:DWORD + Line 79: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\pow.cod (16 hits) + Line 29: EXTRN mtherr:PROC + Line 30: EXTRN frexp:PROC + Line 31: EXTRN ldexp:PROC + Line 32: EXTRN polevl:PROC + Line 33: EXTRN p1evl:PROC + Line 34: EXTRN c_powi:PROC + Line 35: EXTRN signbit:PROC + Line 36: EXTRN isnan:PROC + Line 37: EXTRN isfinite:PROC + Line 38: EXTRN floor:PROC + Line 39: EXTRN MAXNUM:QWORD + Line 40: EXTRN INFINITY:QWORD + Line 41: EXTRN NAN:QWORD + Line 42: EXTRN NEGZERO:QWORD + Line 43: EXTRN __ImageBase:BYTE + Line 44: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\powi.cod (8 hits) + Line 16: EXTRN mtherr:PROC + Line 17: EXTRN frexp:PROC + Line 18: EXTRN NEGZERO:QWORD + Line 19: EXTRN INFINITY:QWORD + Line 20: EXTRN MAXLOG:QWORD + Line 21: EXTRN MINLOG:QWORD + Line 22: EXTRN LOGE2:QWORD + Line 23: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\quantity.cod (8 hits) + Line 27: EXTRN strtod:PROC + Line 28: EXTRN strtol:PROC + Line 29: EXTRN ?ctl_cmsg@TimidityPlus@@YAXHHPEBDZZ:PROC ; TimidityPlus::ctl_cmsg + Line 30: EXTRN pow:PROC + Line 31: EXTRN ?playback_rate@TimidityPlus@@3HA:DWORD ; TimidityPlus::playback_rate + Line 32: EXTRN ?control_ratio@TimidityPlus@@3HA:DWORD ; TimidityPlus::control_ratio + Line 33: EXTRN __ImageBase:BYTE + Line 34: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\r_all.cod (363 hits) + Line 70: EXTRN ??_EStat_fps@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::Stat_fps::`vector deleting destructor' + Line 71: EXTRN ??_EStat_fps_accumulated@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::Stat_fps_accumulated::`vector deleting destructor' + Line 72: EXTRN ??_EStat_wallcycles@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::Stat_wallcycles::`vector deleting destructor' + Line 73: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 74: EXTRN ?usergame@@3_NA:BYTE ; usergame + Line 75: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 1478: EXTRN _purecall:PROC + Line 1479: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 1480: EXTRN ??3@YAXPEAX@Z:PROC ; operator delete + Line 1481: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 1482: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 1483: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 1484: EXTRN atexit:PROC + Line 1485: EXTRN _Init_thread_header:PROC + Line 1486: EXTRN _Init_thread_footer:PROC + Line 1487: EXTRN __std_terminate:PROC + Line 1488: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 1489: EXTRN ??2@YAPEAX_KAEBUnothrow_t@std@@@Z:PROC ; operator new + Line 1490: EXTRN atoi:PROC + Line 1491: EXTRN _dtest:PROC + Line 1492: EXTRN log2:PROC + Line 1493: EXTRN terminate:PROC + Line 1494: EXTRN __std_exception_copy:PROC + Line 1495: EXTRN __std_exception_destroy:PROC + Line 1496: EXTRN ??_Eexception@std@@UEAAPEAXI@Z:PROC ; std::exception::`vector deleting destructor' + Line 1497: EXTRN strnicmp:PROC + Line 1498: EXTRN __std_reverse_trivially_swappable_8:PROC + Line 1499: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 1500: EXTRN ??_Eruntime_error@std@@UEAAPEAXI@Z:PROC ; std::runtime_error::`vector deleting destructor' + Line 1501: EXTRN ?_Execute_once@std@@YAHAEAUonce_flag@1@P6AHPEAX1PEAPEAX@Z1@Z:PROC ; std::_Execute_once + Line 1502: EXTRN ??_E_System_error@std@@UEAAPEAXI@Z:PROC ; std::_System_error::`vector deleting destructor' + Line 1503: EXTRN ??_Esystem_error@std@@UEAAPEAXI@Z:PROC ; std::system_error::`vector deleting destructor' + Line 1504: EXTRN ?_Syserror_map@std@@YAPEBDH@Z:PROC ; std::_Syserror_map + Line 1505: EXTRN ??_E_Generic_error_category@std@@UEAAPEAXI@Z:PROC ; std::_Generic_error_category::`vector deleting destructor' + Line 1506: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 1507: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 1508: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 1509: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 1510: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 1511: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 1512: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 1513: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 1514: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 1515: EXTRN mysnprintf:PROC + Line 1516: EXTRN c_atan2:PROC + Line 1517: EXTRN c_tan:PROC + Line 1518: EXTRN c_sqrt:PROC + Line 1519: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 1520: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 1521: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 1522: EXTRN ?ForceSet@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@_N@Z:PROC ; FBaseCVar::ForceSet + Line 1523: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 1524: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 1525: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 1526: EXTRN ??0FStringCVar@@QEAA@PEBD0IP6AXAEAV0@@Z@Z:PROC ; FStringCVar::FStringCVar + Line 1527: EXTRN ??1FStringCVar@@UEAA@XZ:PROC ; FStringCVar::~FStringCVar + Line 1528: EXTRN ?BestColor@@YAHPEBIHHHHH@Z:PROC ; BestColor + Line 1529: EXTRN ?DoBlending@@YAXPEBUPalEntry@@PEAU1@HHHHH@Z:PROC ; DoBlending + Line 1530: EXTRN ?Pick@FColorMatcher@@QEAAEHHH@Z:PROC ; FColorMatcher::Pick + Line 1531: EXTRN ?CheckFuzz@FRenderStyle@@QEAAXXZ:PROC ; FRenderStyle::CheckFuzz + Line 1532: EXTRN ?IsVisible@FRenderStyle@@QEBA_NN@Z:PROC ; FRenderStyle::IsVisible + Line 1533: EXTRN ?TranslationToTable@@YAPEAUFRemapTable@@H@Z:PROC ; TranslationToTable + Line 1534: EXTRN ?GetSkyCapColor@FTexture@@QEAA?AUPalEntry@@_N@Z:PROC ; FTexture::GetSkyCapColor + Line 1535: EXTRN ?GetRawTexture@FTexture@@QEAAPEAV1@XZ:PROC ; FTexture::GetRawTexture + Line 1536: EXTRN ?GetSoftwareTexture@FTexture@@QEAAPEAVFSoftwareTexture@@XZ:PROC ; FTexture::GetSoftwareTexture + Line 1537: EXTRN ?PalCheck@FTextureManager@@QEAA?AVFTextureID@@V2@@Z:PROC ; FTextureManager::PalCheck + Line 1538: EXTRN _Thrd_start:PROC + Line 1539: EXTRN _Xtime_get_ticks:PROC + Line 1540: EXTRN _Thrd_join:PROC + Line 1541: EXTRN _Thrd_hardware_concurrency:PROC + Line 1542: EXTRN _Thrd_id:PROC + Line 1543: EXTRN _Mtx_init:PROC + Line 1544: EXTRN _Mtx_destroy:PROC + Line 1545: EXTRN _Mtx_init_in_situ:PROC + Line 1546: EXTRN _Mtx_destroy_in_situ:PROC + Line 1547: EXTRN _Mtx_current_owns:PROC + Line 1548: EXTRN _Mtx_lock:PROC + Line 1549: EXTRN _Mtx_unlock:PROC + Line 1550: EXTRN _Cnd_init:PROC + Line 1551: EXTRN _Cnd_destroy:PROC + Line 1552: EXTRN _Cnd_init_in_situ:PROC + Line 1553: EXTRN _Cnd_destroy_in_situ:PROC + Line 1554: EXTRN _Cnd_wait:PROC + Line 1555: EXTRN _Cnd_timedwait:PROC + Line 1556: EXTRN _Cnd_broadcast:PROC + Line 1557: EXTRN _Cnd_signal:PROC + Line 1558: EXTRN _Cnd_do_broadcast_at_thread_exit:PROC + Line 1559: EXTRN ?_Throw_C_error@std@@YAXH@Z:PROC ; std::_Throw_C_error + Line 1560: EXTRN ?_Throw_Cpp_error@std@@YAXH@Z:PROC ; std::_Throw_Cpp_error + Line 1561: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 1562: EXTRN ?atterm@@YAXP6AXXZ@Z:PROC ; atterm + Line 1563: EXTRN ?I_GetNumaNodeCount@@YAHXZ:PROC ; I_GetNumaNodeCount + Line 1564: EXTRN ?I_GetNumaNodeThreadCount@@YAHH@Z:PROC ; I_GetNumaNodeThreadCount + Line 1565: EXTRN ?I_SetThreadNumaNode@@YAXAEAVthread@std@@H@Z:PROC ; I_SetThreadNumaNode + Line 1566: EXTRN ??0FMemArena@@QEAA@_K@Z:PROC ; FMemArena::FMemArena + Line 1567: EXTRN ??1FMemArena@@QEAA@XZ:PROC ; FMemArena::~FMemArena + Line 1568: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 1569: EXTRN ?FreeAll@FMemArena@@QEAAXXZ:PROC ; FMemArena::FreeAll + Line 1570: EXTRN ??0FStat@@QEAA@PEBD@Z:PROC ; FStat::FStat + Line 1571: EXTRN ??1FStat@@UEAA@XZ:PROC ; FStat::~FStat + Line 1572: EXTRN ??0DCanvas@@QEAA@HH_N@Z:PROC ; DCanvas::DCanvas + Line 1573: EXTRN ??1DCanvas@@QEAA@XZ:PROC ; DCanvas::~DCanvas + Line 1574: EXTRN ?GetFlashedPalette@DFrameBuffer@@QEAAXQEAUPalEntry@@@Z:PROC ; DFrameBuffer::GetFlashedPalette + Line 1575: EXTRN ?DrawTexture@DFrameBuffer@@QEAAXPEAVFTexture@@NNHZZ:PROC ; DFrameBuffer::DrawTexture + Line 1576: EXTRN ?V_GetColorFromString@@YAHPEBIPEBDPEAUFScriptPosition@@@Z:PROC ; V_GetColorFromString + Line 1577: EXTRN ?V_GetColorStringByName@@YA?AVFString@@PEBDPEAUFScriptPosition@@@Z:PROC ; V_GetColorStringByName + Line 1578: EXTRN ?ActiveRatio@@YAMHHPEAM@Z:PROC ; ActiveRatio + Line 1579: EXTRN ?AspectBaseHeight@@YAHM@Z:PROC ; AspectBaseHeight + Line 1580: EXTRN ?AspectPspriteOffset@@YANM@Z:PROC ; AspectPspriteOffset + Line 1581: EXTRN ?AspectMultiplier@@YAHM@Z:PROC ; AspectMultiplier + Line 1582: EXTRN ?AspectTallerThanWide@@YA_NM@Z:PROC ; AspectTallerThanWide + Line 1583: EXTRN ?CopyPlaneIfValid@secplane_t@@QEBA_NPEAU1@PEBU1@@Z:PROC ; secplane_t::CopyPlaneIfValid + Line 1584: EXTRN ?P_GetPlaneLight@@YAPEAUlightlist_t@@PEAUsector_t@@PEAUsecplane_t@@_N@Z:PROC ; P_GetPlaneLight + Line 1585: EXTRN ?ValidatePortal@sector_t@@QEAAPEAUFSectorPortal@@H@Z:PROC ; sector_t::ValidatePortal + Line 1586: EXTRN ?GetLightLevel@side_t@@QEBAH_NH0PEAH@Z:PROC ; side_t::GetLightLevel + Line 1587: EXTRN ?BuildPolyBSP@subsector_t@@QEAAXXZ:PROC ; subsector_t::BuildPolyBSP + Line 1588: EXTRN ?AdjustFloorClip@@YAXPEBUsector_t@@@Z:PROC ; AdjustFloorClip + Line 1589: EXTRN ?GetFloorLight@@YAHPEBUsector_t@@@Z:PROC ; GetFloorLight + Line 1590: EXTRN ?GetCeilingLight@@YAHPEBUsector_t@@@Z:PROC ; GetCeilingLight + Line 1591: EXTRN ?P_ClipLineToPortal@@YA_NPEAUline_t@@0U?$TVector2@N@@_N2@Z:PROC ; P_ClipLineToPortal + Line 1592: EXTRN ?P_TranslatePortalXY@@YAXPEAUline_t@@AEAN1@Z:PROC ; P_TranslatePortalXY + Line 1593: EXTRN ?P_TranslatePortalAngle@@YAXPEAUline_t@@AEAU?$TAngle@N@@@Z:PROC ; P_TranslatePortalAngle + Line 1594: EXTRN ?P_TranslatePortalZ@@YAXPEAUline_t@@AEAN@Z:PROC ; P_TranslatePortalZ + Line 1595: EXTRN ?GetSpriteFrame@spritedef_t@@QEAA?AVFTextureID@@HHU?$TAngle@N@@PEA_N_N@Z:PROC ; spritedef_t::GetSpriteFrame + Line 1596: EXTRN ?AlterWeaponSprite@AActor@@QEAAXPEAUvisstyle_t@@@Z:PROC ; AActor::AlterWeaponSprite + Line 1597: EXTRN ?IsVisibleToPlayer@AActor@@QEBA_NXZ:PROC ; AActor::IsVisibleToPlayer + Line 1598: EXTRN ?IsInsideVisibleAngles@AActor@@QEBA_NXZ:PROC ; AActor::IsInsideVisibleAngles + Line 1599: EXTRN ?GetRenderStyle@DPSprite@@QEAA?AU?$pair@TFRenderStyle@@M@std@@TFRenderStyle@@N@Z:PROC ; DPSprite::GetRenderStyle + Line 1600: EXTRN ?GetYAdjust@DPSprite@@QEAAM_N@Z:PROC ; DPSprite::GetYAdjust + Line 1601: EXTRN ?P_BobWeapon@@YAXPEAVplayer_t@@PEAM1N@Z:PROC ; P_BobWeapon + Line 1602: EXTRN ?SendPitchLimits@player_t@@QEBAXXZ:PROC ; player_t::SendPitchLimits + Line 1603: EXTRN ?FindPSprite@player_t@@QEAAPEAVDPSprite@@H@Z:PROC ; player_t::FindPSprite + Line 1604: EXTRN ?P_CheckPlayerSprite@@YAXPEAVAActor@@AEAHAEAU?$TVector2@N@@@Z:PROC ; P_CheckPlayerSprite + Line 1605: EXTRN ?UpdateAll@FCanvasTextureInfo@@QEAAXV?$function@$$A6AXPEAVAActor@@PEAVFCanvasTexture@@N@Z@std@@@Z:PROC ; FCanvasTextureInfo::UpdateAll + Line 1606: EXTRN ?UpdatePixels@FSWCanvasTexture@@QEAAX_N@Z:PROC ; FSWCanvasTexture::UpdatePixels + Line 1607: EXTRN ??_ESWPixelFormatDrawers@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::SWPixelFormatDrawers::`vector deleting destructor' + Line 1608: EXTRN ?GetXY@DBaseDecal@@QEBAXPEAUside_t@@AEAN1@Z:PROC ; DBaseDecal::GetXY + Line 1609: EXTRN ??_EVisibleSegmentRenderer@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::VisibleSegmentRenderer::`vector deleting destructor' + Line 1610: EXTRN ??_ESWRenderLine@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::SWRenderLine::`vector deleting destructor' + Line 1611: EXTRN ??0FRenderViewpoint@@QEAA@XZ:PROC ; FRenderViewpoint::FRenderViewpoint + Line 1612: EXTRN ?SetViewAngle@FRenderViewpoint@@QEAAXAEBUFViewWindow@@@Z:PROC ; FRenderViewpoint::SetViewAngle + Line 1613: EXTRN ?R_SetFOV@@YAXAEAUFRenderViewpoint@@U?$TAngle@N@@@Z:PROC ; R_SetFOV + Line 1614: EXTRN ?R_SetupFrame@@YAXAEAUFRenderViewpoint@@AEAUFViewWindow@@PEAVAActor@@@Z:PROC ; R_SetupFrame + Line 1615: EXTRN ?R_ExecuteSetViewSize@@YAXAEAUFRenderViewpoint@@AEAUFViewWindow@@@Z:PROC ; R_ExecuteSetViewSize + Line 1616: EXTRN ?R_SetWindow@@YAXAEAUFRenderViewpoint@@AEAUFViewWindow@@HHHH_N@Z:PROC ; R_SetWindow + Line 1617: EXTRN ?R_ClampVisibility@@YANN@Z:PROC ; R_ClampVisibility + Line 1618: EXTRN ?Null@Mat4f@@SA?AV1@XZ:PROC ; Mat4f::Null + Line 1619: EXTRN ?Translate@Mat4f@@SA?AV1@MMM@Z:PROC ; Mat4f::Translate + Line 1620: EXTRN ?Scale@Mat4f@@SA?AV1@MMM@Z:PROC ; Mat4f::Scale + Line 1621: EXTRN ?Rotate@Mat4f@@SA?AV1@MMMM@Z:PROC ; Mat4f::Rotate + Line 1622: EXTRN ?SwapYZ@Mat4f@@SA?AV1@XZ:PROC ; Mat4f::SwapYZ + Line 1623: EXTRN ?Frustum@Mat4f@@SA?AV1@MMMMMMW4Handedness@@W4ClipZRange@@@Z:PROC ; Mat4f::Frustum + Line 1624: EXTRN ??DMat4f@@QEBA?AV?$Vec4@M@@AEBV1@@Z:PROC ; Mat4f::operator* + Line 1625: EXTRN ??DMat4f@@QEBA?AV0@AEBV0@@Z:PROC ; Mat4f::operator* + Line 1626: EXTRN ??_EVisibleSprite@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::VisibleSprite::`vector deleting destructor' + Line 1627: EXTRN ??_EDrawerCommand@@UEAAPEAXI@Z:PROC ; DrawerCommand::`vector deleting destructor' + Line 1628: EXTRN ??_EMemcpyCommand@@UEAAPEAXI@Z:PROC ; MemcpyCommand::`vector deleting destructor' + Line 1629: EXTRN ??_EDrawFuzzColumnRGBACommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawFuzzColumnRGBACommand::`vector deleting destructor' + Line 1630: EXTRN ??_EDrawScaledFuzzColumnRGBACommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawScaledFuzzColumnRGBACommand::`vector deleting destructor' + Line 1631: EXTRN ??_EFillSpanRGBACommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::FillSpanRGBACommand::`vector deleting destructor' + Line 1632: EXTRN ??_EDrawFogBoundaryLineRGBACommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawFogBoundaryLineRGBACommand::`vector deleting destructor' + Line 1633: EXTRN ??_EDrawTiltedSpanRGBACommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawTiltedSpanRGBACommand::`vector deleting destructor' + Line 1634: EXTRN ??_EDrawColoredSpanRGBACommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawColoredSpanRGBACommand::`vector deleting destructor' + Line 1635: EXTRN ??_EDrawParticleColumnRGBACommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawParticleColumnRGBACommand::`vector deleting destructor' + Line 1636: EXTRN ??_EDrawVoxelBlocksRGBACommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawVoxelBlocksRGBACommand::`vector deleting destructor' + Line 1637: EXTRN ??_ESWTruecolorDrawers@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::SWTruecolorDrawers::`vector deleting destructor' + Line 1638: EXTRN ??_EPalWall1Command@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::PalWall1Command::`vector deleting destructor' + Line 1639: EXTRN ??_EDrawWall1PalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawWall1PalCommand::`vector deleting destructor' + Line 1640: EXTRN ??_EDrawWallMasked1PalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawWallMasked1PalCommand::`vector deleting destructor' + Line 1641: EXTRN ??_EDrawWallAdd1PalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawWallAdd1PalCommand::`vector deleting destructor' + Line 1642: EXTRN ??_EDrawWallAddClamp1PalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawWallAddClamp1PalCommand::`vector deleting destructor' + Line 1643: EXTRN ??_EDrawWallSubClamp1PalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawWallSubClamp1PalCommand::`vector deleting destructor' + Line 1644: EXTRN ??_EDrawWallRevSubClamp1PalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawWallRevSubClamp1PalCommand::`vector deleting destructor' + Line 1645: EXTRN ??_EPalSkyCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::PalSkyCommand::`vector deleting destructor' + Line 1646: EXTRN ??_EDrawSingleSky1PalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawSingleSky1PalCommand::`vector deleting destructor' + Line 1647: EXTRN ??_EDrawDoubleSky1PalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawDoubleSky1PalCommand::`vector deleting destructor' + Line 1648: EXTRN ??_EPalColumnCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::PalColumnCommand::`vector deleting destructor' + Line 1649: EXTRN ??_EDrawColumnPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawColumnPalCommand::`vector deleting destructor' + Line 1650: EXTRN ??_EFillColumnPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::FillColumnPalCommand::`vector deleting destructor' + Line 1651: EXTRN ??_EFillColumnAddPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::FillColumnAddPalCommand::`vector deleting destructor' + Line 1652: EXTRN ??_EFillColumnAddClampPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::FillColumnAddClampPalCommand::`vector deleting destructor' + Line 1653: EXTRN ??_EFillColumnSubClampPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::FillColumnSubClampPalCommand::`vector deleting destructor' + Line 1654: EXTRN ??_EFillColumnRevSubClampPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::FillColumnRevSubClampPalCommand::`vector deleting destructor' + Line 1655: EXTRN ??_EDrawColumnAddPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawColumnAddPalCommand::`vector deleting destructor' + Line 1656: EXTRN ??_EDrawColumnTranslatedPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawColumnTranslatedPalCommand::`vector deleting destructor' + Line 1657: EXTRN ??_EDrawColumnTlatedAddPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawColumnTlatedAddPalCommand::`vector deleting destructor' + Line 1658: EXTRN ??_EDrawColumnShadedPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawColumnShadedPalCommand::`vector deleting destructor' + Line 1659: EXTRN ??_EDrawColumnAddClampShadedPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawColumnAddClampShadedPalCommand::`vector deleting destructor' + Line 1660: EXTRN ??_EDrawColumnAddClampPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawColumnAddClampPalCommand::`vector deleting destructor' + Line 1661: EXTRN ??_EDrawColumnAddClampTranslatedPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawColumnAddClampTranslatedPalCommand::`vector deleting destructor' + Line 1662: EXTRN ??_EDrawColumnSubClampPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawColumnSubClampPalCommand::`vector deleting destructor' + Line 1663: EXTRN ??_EDrawColumnSubClampTranslatedPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawColumnSubClampTranslatedPalCommand::`vector deleting destructor' + Line 1664: EXTRN ??_EDrawColumnRevSubClampPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawColumnRevSubClampPalCommand::`vector deleting destructor' + Line 1665: EXTRN ??_EDrawColumnRevSubClampTranslatedPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawColumnRevSubClampTranslatedPalCommand::`vector deleting destructor' + Line 1666: EXTRN ??_EDrawFuzzColumnPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawFuzzColumnPalCommand::`vector deleting destructor' + Line 1667: EXTRN ??_EDrawScaledFuzzColumnPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawScaledFuzzColumnPalCommand::`vector deleting destructor' + Line 1668: EXTRN ??_EPalSpanCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::PalSpanCommand::`vector deleting destructor' + Line 1669: EXTRN ??_EDrawSpanPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawSpanPalCommand::`vector deleting destructor' + Line 1670: EXTRN ??_EDrawSpanMaskedPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawSpanMaskedPalCommand::`vector deleting destructor' + Line 1671: EXTRN ??_EDrawSpanTranslucentPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawSpanTranslucentPalCommand::`vector deleting destructor' + Line 1672: EXTRN ??_EDrawSpanMaskedTranslucentPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawSpanMaskedTranslucentPalCommand::`vector deleting destructor' + Line 1673: EXTRN ??_EDrawSpanAddClampPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawSpanAddClampPalCommand::`vector deleting destructor' + Line 1674: EXTRN ??_EDrawSpanMaskedAddClampPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawSpanMaskedAddClampPalCommand::`vector deleting destructor' + Line 1675: EXTRN ??_EFillSpanPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::FillSpanPalCommand::`vector deleting destructor' + Line 1676: EXTRN ??_EDrawTiltedSpanPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawTiltedSpanPalCommand::`vector deleting destructor' + Line 1677: EXTRN ??_EDrawColoredSpanPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawColoredSpanPalCommand::`vector deleting destructor' + Line 1678: EXTRN ??_EDrawFogBoundaryLinePalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawFogBoundaryLinePalCommand::`vector deleting destructor' + Line 1679: EXTRN ??_EDrawParticleColumnPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawParticleColumnPalCommand::`vector deleting destructor' + Line 1680: EXTRN ??_EDrawVoxelBlocksPalCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawVoxelBlocksPalCommand::`vector deleting destructor' + Line 1681: EXTRN ??_ESWPalDrawers@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::SWPalDrawers::`vector deleting destructor' + Line 1682: EXTRN ?M_CreatePNG@@YA_NPEAVFileWriter@@PEBEPEBUPalEntry@@W4ESSType@@HHHM@Z:PROC ; M_CreatePNG + Line 1683: EXTRN ??_EFRenderer@@UEAAPEAXI@Z:PROC ; FRenderer::`vector deleting destructor' + Line 1684: EXTRN ??_EFSoftwareRenderer@@UEAAPEAXI@Z:PROC ; FSoftwareRenderer::`vector deleting destructor' + Line 1685: EXTRN ?GetSlabData@FVoxelMipLevel@@QEBAPEAE_N@Z:PROC ; FVoxelMipLevel::GetSlabData + Line 1686: EXTRN ?CreateBgraSlabData@FVoxel@@QEAAXXZ:PROC ; FVoxel::CreateBgraSlabData + Line 1687: EXTRN ?Remap@FVoxel@@QEAAXXZ:PROC ; FVoxel::Remap + Line 1688: EXTRN ?Instance@PolyZBuffer@@SAPEAV1@XZ:PROC ; PolyZBuffer::Instance + Line 1689: EXTRN ?Instance@PolyStencilBuffer@@SAPEAV1@XZ:PROC ; PolyStencilBuffer::Instance + Line 1690: EXTRN ?SetLight@PolyDrawArgs@@QEAAXPEAUFSWColormap@@IN_N@Z:PROC ; PolyDrawArgs::SetLight + Line 1691: EXTRN ?SetStyle@PolyDrawArgs@@QEAAXAEBTFRenderStyle@@NIIPEAVFSoftwareTexture@@_N@Z:PROC ; PolyDrawArgs::SetStyle + Line 1692: EXTRN ?ResizeBuffers@PolyTriangleDrawer@@SAXPEAVDCanvas@@@Z:PROC ; PolyTriangleDrawer::ResizeBuffers + Line 1693: EXTRN ?ClearStencil@PolyTriangleDrawer@@SAXAEBV?$shared_ptr@VDrawerCommandQueue@@@std@@E@Z:PROC ; PolyTriangleDrawer::ClearStencil + Line 1694: EXTRN ?SetViewport@PolyTriangleDrawer@@SAXAEBV?$shared_ptr@VDrawerCommandQueue@@@std@@HHHHPEAVDCanvas@@@Z:PROC ; PolyTriangleDrawer::SetViewport + Line 1695: EXTRN ?SetCullCCW@PolyTriangleDrawer@@SAXAEBV?$shared_ptr@VDrawerCommandQueue@@@std@@_N@Z:PROC ; PolyTriangleDrawer::SetCullCCW + Line 1696: EXTRN ?SetTwoSided@PolyTriangleDrawer@@SAXAEBV?$shared_ptr@VDrawerCommandQueue@@@std@@_N@Z:PROC ; PolyTriangleDrawer::SetTwoSided + Line 1697: EXTRN ?SetWeaponScene@PolyTriangleDrawer@@SAXAEBV?$shared_ptr@VDrawerCommandQueue@@@std@@_N@Z:PROC ; PolyTriangleDrawer::SetWeaponScene + Line 1698: EXTRN ?SetModelVertexShader@PolyTriangleDrawer@@SAXAEBV?$shared_ptr@VDrawerCommandQueue@@@std@@HHM@Z:PROC ; PolyTriangleDrawer::SetModelVertexShader + Line 1699: EXTRN ?SetTransform@PolyTriangleDrawer@@SAXAEBV?$shared_ptr@VDrawerCommandQueue@@@std@@PEBVMat4f@@1@Z:PROC ; PolyTriangleDrawer::SetTransform + Line 1700: EXTRN ?DrawArray@PolyTriangleDrawer@@SAXAEBV?$shared_ptr@VDrawerCommandQueue@@@std@@AEBVPolyDrawArgs@@PEBXHW4PolyDrawMode@@@Z:PROC ; PolyTriangleDrawer::DrawArray + Line 1701: EXTRN ?DrawElements@PolyTriangleDrawer@@SAXAEBV?$shared_ptr@VDrawerCommandQueue@@@std@@AEBVPolyDrawArgs@@PEBXPEBIHW4PolyDrawMode@@@Z:PROC ; PolyTriangleDrawer::DrawElements + Line 1702: EXTRN ?RenderView@PolyRenderer@@QEAAXPEAVplayer_t@@PEAVDCanvas@@PEAX@Z:PROC ; PolyRenderer::RenderView + Line 1703: EXTRN ?RenderViewToCanvas@PolyRenderer@@QEAAXPEAVAActor@@PEAVDCanvas@@HHHH_N@Z:PROC ; PolyRenderer::RenderViewToCanvas + Line 1704: EXTRN ?RenderRemainingPlayerSprites@PolyRenderer@@QEAAXXZ:PROC ; PolyRenderer::RenderRemainingPlayerSprites + Line 1705: EXTRN ?Instance@PolyRenderer@@SAPEAV1@XZ:PROC ; PolyRenderer::Instance + Line 1706: EXTRN ?BeginPrecaching@FImageSource@@SAXXZ:PROC ; FImageSource::BeginPrecaching + Line 1707: EXTRN ?EndPrecaching@FImageSource@@SAXXZ:PROC ; FImageSource::EndPrecaching + Line 1708: EXTRN ?RegisterForPrecache@FImageSource@@SAXPEAV1@@Z:PROC ; FImageSource::RegisterForPrecache + Line 1709: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 1710: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 1711: EXTRN ?OpenLumpReader@FWadCollection@@QEAA?AVFileReader@@H@Z:PROC ; FWadCollection::OpenLumpReader + Line 1712: EXTRN ?LumpLength@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::LumpLength + Line 1713: EXTRN ?GetNumLumps@FWadCollection@@QEBAHXZ:PROC ; FWadCollection::GetNumLumps + Line 1714: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 1715: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 1716: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 1717: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 1718: EXTRN ??_EDepthColumnCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DepthColumnCommand::`vector deleting destructor' + Line 1719: EXTRN ??_EDepthSpanCommand@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DepthSpanCommand::`vector deleting destructor' + Line 1720: EXTRN ??_EDrawSkySingle32Command@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawSkySingle32Command::`vector deleting destructor' + Line 1721: EXTRN ??_EDrawSkyDouble32Command@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawSkyDouble32Command::`vector deleting destructor' + Line 1722: EXTRN ??_E?$DrawSprite32T@UOpaqueSprite@DrawSprite32TModes@swrenderer@@UTextureSampler@23@@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawSprite32T::`vector deleting destructor' + Line 1723: EXTRN ?PeekThreadedErrorPane@@YAXXZ:PROC ; PeekThreadedErrorPane + Line 1724: EXTRN ?NetUpdate@@YAXXZ:PROC ; NetUpdate + Line 1725: EXTRN ??_EFarClipLine@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::FarClipLine::`vector deleting destructor' + Line 1726: EXTRN ??_ERenderSprite@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::RenderSprite::`vector deleting destructor' + Line 1727: EXTRN ??_ERenderWallSprite@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::RenderWallSprite::`vector deleting destructor' + Line 1728: EXTRN ??_ERenderVoxel@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::RenderVoxel::`vector deleting destructor' + Line 1729: EXTRN ??_ERenderParticle@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::RenderParticle::`vector deleting destructor' + Line 1730: EXTRN ?loadMatrix@VSMatrix@@QEAAXPEBM@Z:PROC ; VSMatrix::loadMatrix + Line 1731: EXTRN ?inverseMatrix@VSMatrix@@QEAA_NAEAV1@@Z:PROC ; VSMatrix::inverseMatrix + Line 1732: EXTRN ?RenderModel@FModelRenderer@@QEAAXMMMPEAUFSpriteModelFrame@@PEAVAActor@@N@Z:PROC ; FModelRenderer::RenderModel + Line 1733: EXTRN ?RenderHUDModel@FModelRenderer@@QEAAXPEAVDPSprite@@MM@Z:PROC ; FModelRenderer::RenderHUDModel + Line 1734: EXTRN ??_EFModelRenderer@@UEAAPEAXI@Z:PROC ; FModelRenderer::`vector deleting destructor' + Line 1735: EXTRN ??_EIModelVertexBuffer@@UEAAPEAXI@Z:PROC ; IModelVertexBuffer::`vector deleting destructor' + Line 1736: EXTRN ?FindModelFrame@@YAPEAUFSpriteModelFrame@@PEBVPClass@@HH_N@Z:PROC ; FindModelFrame + Line 1737: EXTRN ?IsHUDModelForPlayerAvailable@@YA_NPEAVplayer_t@@@Z:PROC ; IsHUDModelForPlayerAvailable + Line 1738: EXTRN ??_ERenderModel@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::RenderModel::`vector deleting destructor' + Line 1739: EXTRN ??_ESWModelRenderer@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::SWModelRenderer::`vector deleting destructor' + Line 1740: EXTRN ??_ESWModelVertexBuffer@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::SWModelVertexBuffer::`vector deleting destructor' + Line 1741: EXTRN ?P_VanillaPointOnLineSide@@YAHNNPEBUline_t@@@Z:PROC ; P_VanillaPointOnLineSide + Line 1742: EXTRN ??_E?$DrawWall32T@UOpaqueWall@DrawWall32TModes@swrenderer@@@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawWall32T::`vector deleting destructor' + Line 1743: EXTRN ??_E?$DrawWall32T@UMaskedWall@DrawWall32TModes@swrenderer@@@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawWall32T::`vector deleting destructor' + Line 1744: EXTRN ??_E?$DrawWall32T@UAddClampWall@DrawWall32TModes@swrenderer@@@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawWall32T::`vector deleting destructor' + Line 1745: EXTRN ??_E?$DrawWall32T@USubClampWall@DrawWall32TModes@swrenderer@@@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawWall32T::`vector deleting destructor' + Line 1746: EXTRN ??_E?$DrawWall32T@URevSubClampWall@DrawWall32TModes@swrenderer@@@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawWall32T::`vector deleting destructor' + Line 1747: EXTRN ??_E?$DrawSprite32T@UOpaqueSprite@DrawSprite32TModes@swrenderer@@UFillSampler@23@@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawSprite32T::`vector deleting destructor' + Line 1748: EXTRN ??_E?$DrawSprite32T@UAddClampSprite@DrawSprite32TModes@swrenderer@@UFillSampler@23@@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawSprite32T::`vector deleting destructor' + Line 1749: EXTRN ??_E?$DrawSprite32T@USubClampSprite@DrawSprite32TModes@swrenderer@@UFillSampler@23@@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawSprite32T::`vector deleting destructor' + Line 1750: EXTRN ??_E?$DrawSprite32T@URevSubClampSprite@DrawSprite32TModes@swrenderer@@UFillSampler@23@@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawSprite32T::`vector deleting destructor' + Line 1751: EXTRN ??_E?$DrawSprite32T@UAddClampSprite@DrawSprite32TModes@swrenderer@@UTextureSampler@23@@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawSprite32T::`vector deleting destructor' + Line 1752: EXTRN ??_E?$DrawSprite32T@UOpaqueSprite@DrawSprite32TModes@swrenderer@@UTranslatedSampler@23@@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawSprite32T::`vector deleting destructor' + Line 1753: EXTRN ??_E?$DrawSprite32T@UAddClampSprite@DrawSprite32TModes@swrenderer@@UTranslatedSampler@23@@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawSprite32T::`vector deleting destructor' + Line 1754: EXTRN ??_E?$DrawSprite32T@UShadedSprite@DrawSprite32TModes@swrenderer@@UShadedSampler@23@@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawSprite32T::`vector deleting destructor' + Line 1755: EXTRN ??_E?$DrawSprite32T@UAddClampShadedSprite@DrawSprite32TModes@swrenderer@@UShadedSampler@23@@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawSprite32T::`vector deleting destructor' + Line 1756: EXTRN ??_E?$DrawSprite32T@USubClampSprite@DrawSprite32TModes@swrenderer@@UTextureSampler@23@@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawSprite32T::`vector deleting destructor' + Line 1757: EXTRN ??_E?$DrawSprite32T@USubClampSprite@DrawSprite32TModes@swrenderer@@UTranslatedSampler@23@@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawSprite32T::`vector deleting destructor' + Line 1758: EXTRN ??_E?$DrawSprite32T@URevSubClampSprite@DrawSprite32TModes@swrenderer@@UTextureSampler@23@@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawSprite32T::`vector deleting destructor' + Line 1759: EXTRN ??_E?$DrawSprite32T@URevSubClampSprite@DrawSprite32TModes@swrenderer@@UTranslatedSampler@23@@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawSprite32T::`vector deleting destructor' + Line 1760: EXTRN ??_E?$DrawSpan32T@UOpaqueSpan@DrawSpan32TModes@swrenderer@@@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawSpan32T::`vector deleting destructor' + Line 1761: EXTRN ??_E?$DrawSpan32T@UMaskedSpan@DrawSpan32TModes@swrenderer@@@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawSpan32T::`vector deleting destructor' + Line 1762: EXTRN ??_E?$DrawSpan32T@UTranslucentSpan@DrawSpan32TModes@swrenderer@@@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawSpan32T::`vector deleting destructor' + Line 1763: EXTRN ??_E?$DrawSpan32T@UAddClampSpan@DrawSpan32TModes@swrenderer@@@swrenderer@@UEAAPEAXI@Z:PROC ; swrenderer::DrawSpan32T::`vector deleting destructor' + Line 1764: EXTRN ??_E?$_Ref_count_obj@VDrawerCommandQueue@@@std@@UEAAPEAXI@Z:PROC ; std::_Ref_count_obj::`vector deleting destructor' + Line 1765: EXTRN ??_E?$_Ref_count@VDrawerCommandQueue@@@std@@UEAAPEAXI@Z:PROC ; std::_Ref_count::`vector deleting destructor' + Line 1766: EXTRN _CxxThrowException:PROC + Line 1767: EXTRN __CxxFrameHandler3:PROC + Line 1768: EXTRN __chkstk:PROC + Line 1769: EXTRN __libm_sse2_sincos_:PROC + Line 1770: EXTRN asin:PROC + Line 1771: EXTRN atan:PROC + Line 1772: EXTRN fmod:PROC + Line 1773: EXTRN memcpy:PROC + Line 1774: EXTRN memmove:PROC + Line 1775: EXTRN memset:PROC + Line 1776: EXTRN tan:PROC + Line 1777: EXTRN _Init_thread_epoch:DWORD + Line 1778: EXTRN ?nothrow@std@@3Unothrow_t@1@B:BYTE ; std::nothrow + Line 1779: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 1780: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 1781: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 1782: EXTRN ?GPalette@@3UFPalette@@A:BYTE ; GPalette + Line 1783: EXTRN ?RGB32k@@3TColorTable32k@@A:BYTE ; RGB32k + Line 1784: EXTRN ?RGB256k@@3TColorTable256k@@A:BYTE ; RGB256k + Line 1785: EXTRN ?Col2RGB8@@3PAY0BAA@IA:BYTE ; Col2RGB8 + Line 1786: EXTRN ?Col2RGB8_LessPrecision@@3PAPEAIA:BYTE ; Col2RGB8_LessPrecision + Line 1787: EXTRN ?Col2RGB8_Inverse@@3PAY0BAA@IA:BYTE ; Col2RGB8_Inverse + Line 1788: EXTRN ?ColorMatcher@@3VFColorMatcher@@A:QWORD ; ColorMatcher + Line 1789: EXTRN ?LegacyRenderStyles@@3PATFRenderStyle@@A:BYTE ; LegacyRenderStyles + Line 1790: EXTRN ?r_spriteadjustSW@@3HA:DWORD ; r_spriteadjustSW + Line 1791: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 1792: EXTRN ?fakecmaps@@3V?$TArray@UFakeCmap@@U1@@@A:BYTE ; fakecmaps + Line 1793: EXTRN ?SpecialColormaps@@3V?$TArray@UFSpecialColormap@@U1@@@A:BYTE ; SpecialColormaps + Line 1794: EXTRN ?PerfToSec@@3NA:QWORD ; PerfToSec + Line 1795: EXTRN ?PerfToMillisec@@3NA:QWORD ; PerfToMillisec + Line 1796: EXTRN ?vid_rendermode@@3VFIntCVar@@A:BYTE ; vid_rendermode + Line 1797: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 1798: EXTRN ?Gamma@@3VFFloatCVar@@A:BYTE ; Gamma + Line 1799: EXTRN ?skyflatnum@@3VFTextureID@@A:DWORD ; skyflatnum + Line 1800: EXTRN ?freelookviewheight@@3HA:DWORD ; freelookviewheight + Line 1801: EXTRN ?SpriteFrames@@3V?$TArray@Uspriteframe_t@@U1@@@A:BYTE ; SpriteFrames + Line 1802: EXTRN ?viewwindowx@@3HA:DWORD ; viewwindowx + Line 1803: EXTRN ?viewwindowy@@3HA:DWORD ; viewwindowy + Line 1804: EXTRN ?viewwidth@@3HA:DWORD ; viewwidth + Line 1805: EXTRN ?viewheight@@3HA:DWORD ; viewheight + Line 1806: EXTRN ?sprites@@3V?$TArray@Uspritedef_t@@U1@@@A:BYTE ; sprites + Line 1807: EXTRN ?paused@@3HA:DWORD ; paused + Line 1808: EXTRN ?viewactive@@3_NA:BYTE ; viewactive + Line 1809: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 1810: EXTRN ?r_drawtrans@@3VFBoolCVar@@A:BYTE ; r_drawtrans + Line 1811: EXTRN ?transsouls@@3VFFloatCVar@@A:BYTE ; transsouls + Line 1812: EXTRN ?FrameCycles@@3Vcycle_t@@A:QWORD ; FrameCycles + Line 1813: EXTRN ?r_viewpoint@@3UFRenderViewpoint@@A:BYTE ; r_viewpoint + Line 1814: EXTRN ?r_viewwindow@@3UFViewWindow@@A:BYTE ; r_viewwindow + Line 1815: EXTRN ?validcount@@3HA:DWORD ; validcount + Line 1816: EXTRN ?R_OldBlend@@3IA:DWORD ; R_OldBlend + Line 1817: EXTRN ?r_drawvoxels@@3VFBoolCVar@@A:BYTE ; r_drawvoxels + Line 1818: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 1819: EXTRN ?gl_particles_style@@3VFIntCVar@@A:BYTE ; gl_particles_style + Line 1820: EXTRN ?r_skymode@@3VFIntCVar@@A:BYTE ; r_skymode + Line 1821: EXTRN ?Models@@3V?$TDeletingArray@PEAVFModel@@PEAV1@@@A:BYTE ; Models + Line 1822: EXTRN ?r_debug_disable_vis_filter@@3VFBoolCVar@@A:BYTE ; r_debug_disable_vis_filter + Line 1823: EXTRN ?r_renderercaps@@3IA:DWORD ; r_renderercaps + Line 1824: EXTRN ?r_clearbuffer@@3VFIntCVar@@A:BYTE ; r_clearbuffer + Line 1825: EXTRN ?CrosshairImage@@3PEAVFTexture@@EA:QWORD ; CrosshairImage + Line 1826: EXTRN ?r_drawplayersprites@@3VFBoolCVar@@A:BYTE ; r_drawplayersprites + Line 1827: EXTRN ?r_deathcamera@@3VFBoolCVar@@A:BYTE ; r_deathcamera + Line 1828: EXTRN ?r_UseVanillaTransparency@@3_NA:BYTE ; r_UseVanillaTransparency + Line 1829: EXTRN ?gl_light_sprites@@3VFBoolCVar@@A:BYTE ; gl_light_sprites + Line 1830: EXTRN ?r_visibility@@3VFFloatCVar@@A:BYTE ; r_visibility + Line 1831: EXTRN __ImageBase:BYTE + Line 1832: EXTRN __isa_available:DWORD + Line 1833: EXTRN _fltused:DWORD + Line 1834: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\r_canvastexture.cod (15 hits) + Line 25: EXTRN ?_Xbad_function_call@std@@YAXXZ:PROC ; std::_Xbad_function_call + Line 26: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 27: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 28: EXTRN ?Mark@GC@@YAXPEAPEAVDObject@@@Z:PROC ; GC::Mark + Line 29: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAVFTextureID@@PEAV2@@Z:PROC ; Serialize + Line 30: EXTRN ?CheckForTexture@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::CheckForTexture + Line 31: EXTRN ?BeginObject@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginObject + Line 32: EXTRN ?EndObject@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndObject + Line 33: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 34: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 35: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEANPEAN@Z:PROC ; Serialize + Line 36: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 37: EXTRN __CxxFrameHandler3:PROC + Line 38: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 39: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\r_interpolate.cod (49 hits) + Line 32: EXTRN ?RegistrationInfo@DObject@@2UClassReg@@A:BYTE ; DObject::RegistrationInfo + Line 33: EXTRN ??_EStat_interpolations@@UEAAPEAXI@Z:PROC ; Stat_interpolations::`vector deleting destructor' + Line 221: EXTRN _purecall:PROC + Line 222: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 223: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 224: EXTRN atexit:PROC + Line 225: EXTRN __std_terminate:PROC + Line 226: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 227: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 228: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 229: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 230: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 231: EXTRN ?P_Start3dMidtexInterpolations@@YAXAEAV?$TArray@PEAVDInterpolation@@PEAV1@@@PEAUsector_t@@_N@Z:PROC ; P_Start3dMidtexInterpolations + Line 232: EXTRN ?P_StartLinkedSectorInterpolations@@YAXAEAV?$TArray@PEAVDInterpolation@@PEAV1@@@PEAUsector_t@@_N@Z:PROC ; P_StartLinkedSectorInterpolations + Line 233: EXTRN ??0FStat@@QEAA@PEBD@Z:PROC ; FStat::FStat + Line 234: EXTRN ??1FStat@@UEAA@XZ:PROC ; FStat::~FStat + Line 235: EXTRN ?Barrier@GC@@YAXPEAVDObject@@0@Z:PROC ; GC::Barrier + Line 236: EXTRN ?Mark@GC@@YAXPEAPEAVDObject@@@Z:PROC ; GC::Mark + Line 237: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 238: EXTRN ??1DObject@@UEAA@XZ:PROC ; DObject::~DObject + Line 239: EXTRN ?Serialize@DObject@@UEAAXAEAVFSerializer@@@Z:PROC ; DObject::Serialize + Line 240: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 241: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 242: EXTRN ?PropagateMark@DObject@@UEAA_KXZ:PROC ; DObject::PropagateMark + Line 243: EXTRN ??_EDInterpolation@@UEAAPEAXI@Z:PROC ; DInterpolation::`vector deleting destructor' + Line 244: EXTRN ?P_RecalculateAttached3DFloors@@YAXPEAUsector_t@@@Z:PROC ; P_RecalculateAttached3DFloors + Line 245: EXTRN ?CheckOverlap@sector_t@@QEAAXXZ:PROC ; sector_t::CheckOverlap + Line 246: EXTRN ?CheckPortalPlane@@YAXPEAUsector_t@@H@Z:PROC ; CheckPortalPlane + Line 247: EXTRN ?ClearSubsectorLinks@FPolyObj@@QEAAXXZ:PROC ; FPolyObj::ClearSubsectorLinks + Line 248: EXTRN ?ArraySize@FSerializer@@QEAAIXZ:PROC ; FSerializer::ArraySize + Line 249: EXTRN ?BeginObject@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginObject + Line 250: EXTRN ?EndObject@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndObject + Line 251: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 252: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 253: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEA_NPEA_N@Z:PROC ; Serialize + Line 254: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 255: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEANPEAN@Z:PROC ; Serialize + Line 256: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 257: EXTRN ??$Serialize@UFPolyObj@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUFPolyObj@@PEAPEAU1@@Z:PROC ; Serialize + Line 258: EXTRN ??$Serialize@Usector_t@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUsector_t@@PEAPEAU1@@Z:PROC ; Serialize + Line 259: EXTRN ??$Serialize@Uside_t@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUside_t@@PEAPEAU1@@Z:PROC ; Serialize + Line 260: EXTRN ??_EDSectorPlaneInterpolation@@UEAAPEAXI@Z:PROC ; DSectorPlaneInterpolation::`vector deleting destructor' + Line 261: EXTRN ??_EDSectorScrollInterpolation@@UEAAPEAXI@Z:PROC ; DSectorScrollInterpolation::`vector deleting destructor' + Line 262: EXTRN ??_EDWallScrollInterpolation@@UEAAPEAXI@Z:PROC ; DWallScrollInterpolation::`vector deleting destructor' + Line 263: EXTRN ??_EDPolyobjInterpolation@@UEAAPEAXI@Z:PROC ; DPolyobjInterpolation::`vector deleting destructor' + Line 264: EXTRN __CxxFrameHandler3:PROC + Line 265: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 266: EXTRN ?State@GC@@3W4EGCState@1@A:DWORD ; GC::State + Line 267: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\r_sections.cod (24 hits) + Line 72: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 73: EXTRN atexit:PROC + Line 74: EXTRN __std_terminate:PROC + Line 75: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 76: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 77: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 78: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 79: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 80: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 81: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 82: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 83: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 84: EXTRN c_atan2:PROC + Line 85: EXTRN ??0FMemArena@@QEAA@_K@Z:PROC ; FMemArena::FMemArena + Line 86: EXTRN ??1FMemArena@@QEAA@XZ:PROC ; FMemArena::~FMemArena + Line 87: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 88: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 89: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 90: EXTRN __CxxFrameHandler3:PROC + Line 91: EXTRN memmove:PROC + Line 92: EXTRN memset:PROC + Line 93: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 94: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 95: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\r_sky.cod (11 hits) + Line 36: EXTRN atexit:PROC + Line 37: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 38: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 39: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 40: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 41: EXTRN ?CheckForTexture@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::CheckForTexture + Line 42: EXTRN ?IsFreelookAllowed@FLevelLocals@@QEBA_NXZ:PROC ; FLevelLocals::IsFreelookAllowed + Line 43: EXTRN fmod:PROC + Line 44: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 45: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 46: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\r_swscene.cod (37 hits) + Line 39: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 40: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 41: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 42: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 43: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 44: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 45: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 46: EXTRN ?GetUniqueIndex@FRemapTable@@QEAAHXZ:PROC ; FRemapTable::GetUniqueIndex + Line 47: EXTRN ?TranslationToTable@@YAPEAUFRemapTable@@H@Z:PROC ; TranslationToTable + Line 48: EXTRN ?CheckForTexture@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::CheckForTexture + Line 49: EXTRN ?AddTexture@FTextureManager@@QEAA?AVFTextureID@@PEAVFTexture@@@Z:PROC ; FTextureManager::AddTexture + Line 50: EXTRN ??0FWrapperTexture@@QEAA@HHH@Z:PROC ; FWrapperTexture::FWrapperTexture + Line 51: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 52: EXTRN ?ValidateTexture@FMaterial@@SAPEAV1@PEAVFTexture@@_N1@Z:PROC ; FMaterial::ValidateTexture + Line 53: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 54: EXTRN ?Clear@F2DDrawer@@QEAAXXZ:PROC ; F2DDrawer::Clear + Line 55: EXTRN ??0DCanvas@@QEAA@HH_N@Z:PROC ; DCanvas::DCanvas + Line 56: EXTRN ??1DCanvas@@QEAA@XZ:PROC ; DCanvas::~DCanvas + Line 57: EXTRN ?DrawTexture@DFrameBuffer@@QEAAXPEAVFTexture@@NNHZZ:PROC ; DFrameBuffer::DrawTexture + Line 58: EXTRN ?Instance@CameraLight@swrenderer@@SAPEAV12@XZ:PROC ; swrenderer::CameraLight::Instance + Line 59: EXTRN ?CreatePalettedPixels@FImageSource@@MEAA?AV?$TArray@EE@@H@Z:PROC ; FImageSource::CreatePalettedPixels + Line 60: EXTRN ?CopyPixels@FImageSource@@MEAAHPEAVFBitmap@@H@Z:PROC ; FImageSource::CopyPixels + Line 61: EXTRN ?CollectForPrecache@FImageSource@@UEAAXAEAV?$TMap@HU?$pair@HH@std@@U?$THashTraits@H@@U?$TValueTraits@U?$pair@HH@std@@@@@@_N@Z:PROC ; FImageSource::CollectForPrecache + Line 62: EXTRN ??_EFImageSource@@UEAAPEAXI@Z:PROC ; FImageSource::`vector deleting destructor' + Line 63: EXTRN ??0FImageTexture@@QEAA@PEAVFImageSource@@PEBD@Z:PROC ; FImageTexture::FImageTexture + Line 64: EXTRN ??_EFSWPaletteTexture@@UEAAPEAXI@Z:PROC ; FSWPaletteTexture::`vector deleting destructor' + Line 65: EXTRN __CxxFrameHandler3:PROC + Line 66: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 67: EXTRN ?GPalette@@3UFPalette@@A:BYTE ; GPalette + Line 68: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 69: EXTRN ?SWRenderer@@3PEAUFRenderer@@EA:QWORD ; SWRenderer + Line 70: EXTRN ?r_viewpoint@@3UFRenderViewpoint@@A:BYTE ; r_viewpoint + Line 71: EXTRN ?vid_rendermode@@3VFIntCVar@@A:BYTE ; vid_rendermode + Line 72: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 73: EXTRN ?ImageArena@FImageSource@@1VFMemArena@@A:BYTE ; FImageSource::ImageArena + Line 74: EXTRN ?NextID@FImageSource@@1HA:DWORD ; FImageSource::NextID + Line 75: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\r_swtexture.cod (24 hits) + Line 50: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 51: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 52: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 53: EXTRN __std_terminate:PROC + Line 54: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 55: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 56: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 57: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 58: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 59: EXTRN ?CreateTexBuffer@FTexture@@QEAA?AUFTextureBuffer@@HH@Z:PROC ; FTexture::CreateTexBuffer + Line 60: EXTRN ??_EFSoftwareTexture@@UEAAPEAXI@Z:PROC ; FSoftwareTexture::`vector deleting destructor' + Line 61: EXTRN ??0FWarpTexture@@QEAA@PEAVFTexture@@H@Z:PROC ; FWarpTexture::FWarpTexture + Line 62: EXTRN ??1FSWCanvasTexture@@UEAA@XZ:PROC ; FSWCanvasTexture::~FSWCanvasTexture + Line 63: EXTRN ?GetPixelsBgra@FSWCanvasTexture@@UEAAPEBIXZ:PROC ; FSWCanvasTexture::GetPixelsBgra + Line 64: EXTRN ?GetPixels@FSWCanvasTexture@@UEAAPEBEH@Z:PROC ; FSWCanvasTexture::GetPixels + Line 65: EXTRN ?Unload@FSWCanvasTexture@@UEAAXXZ:PROC ; FSWCanvasTexture::Unload + Line 66: EXTRN ??_EFSWCanvasTexture@@UEAAPEAXI@Z:PROC ; FSWCanvasTexture::`vector deleting destructor' + Line 67: EXTRN _CxxThrowException:PROC + Line 68: EXTRN __CxxFrameHandler3:PROC + Line 69: EXTRN memset:PROC + Line 70: EXTRN powf:PROC + Line 71: EXTRN ?RGB256k@@3TColorTable256k@@A:BYTE ; RGB256k + Line 72: EXTRN ?gl_texture_usehires@@3VFBoolCVar@@A:BYTE ; gl_texture_usehires + Line 73: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\r_translate.cod (64 hits) + Line 20: EXTRN ?ColorMatcher@@3VFColorMatcher@@A:QWORD ; ColorMatcher + Line 21: EXTRN ?PlayerClasses@@3V?$TArray@VFPlayerClass@@V1@@@A:BYTE ; PlayerClasses + Line 22: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 23: EXTRN ?Skins@@3V?$TArray@VFPlayerSkin@@V1@@@A:BYTE ; Skins + Line 210: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 211: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 212: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 213: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 214: EXTRN atexit:PROC + Line 215: EXTRN __std_terminate:PROC + Line 216: EXTRN round:PROC + Line 217: EXTRN crc32:PROC + Line 218: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 219: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 220: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 221: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 222: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 223: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 224: EXTRN ?RGBtoHSV@@YAXMMMPEAM00@Z:PROC ; RGBtoHSV + Line 225: EXTRN ?HSVtoRGB@@YAXPEAM00MMM@Z:PROC ; HSVtoRGB + Line 226: EXTRN ?Pick@FColorMatcher@@QEAAEHHH@Z:PROC ; FColorMatcher::Pick + Line 227: EXTRN ?D_GetPlayerColor@@YAXHPEAM00PEAPEAUFPlayerColorSet@@@Z:PROC ; D_GetPlayerColor + Line 228: EXTRN ??0FScanner@@QEAA@XZ:PROC ; FScanner::FScanner + Line 229: EXTRN ??0FScanner@@QEAA@H@Z:PROC ; FScanner::FScanner + Line 230: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 231: EXTRN ?OpenMem@FScanner@@QEAAXPEBD0H@Z:PROC ; FScanner::OpenMem + Line 232: EXTRN ?SetCMode@FScanner@@QEAAX_N@Z:PROC ; FScanner::SetCMode + Line 233: EXTRN ?GetToken@FScanner@@QEAA_NXZ:PROC ; FScanner::GetToken + Line 234: EXTRN ?MustGetAnyToken@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetAnyToken + Line 235: EXTRN ?TokenMustBe@FScanner@@QEAAXH@Z:PROC ; FScanner::TokenMustBe + Line 236: EXTRN ?MustGetToken@FScanner@@QEAAXH@Z:PROC ; FScanner::MustGetToken + Line 237: EXTRN ?CheckToken@FScanner@@QEAA_NH@Z:PROC ; FScanner::CheckToken + Line 238: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 239: EXTRN ?ScriptMessage@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptMessage + Line 240: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 241: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 242: EXTRN ?FindLump@FWadCollection@@QEAAHPEBDPEAH_N@Z:PROC ; FWadCollection::FindLump + Line 243: EXTRN ?LumpLength@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::LumpLength + Line 244: EXTRN ?ArraySize@FSerializer@@QEAAIXZ:PROC ; FSerializer::ArraySize + Line 245: EXTRN ?BeginObject@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginObject + Line 246: EXTRN ?EndObject@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndObject + Line 247: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 248: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 249: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 250: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAIPEAI@Z:PROC ; Serialize + Line 251: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAEPEAE@Z:PROC ; Serialize + Line 252: EXTRN ?GetColorSet@@YAPEAUFPlayerColorSet@@PEAVPClassActor@@H@Z:PROC ; GetColorSet + Line 253: EXTRN ?R_FindSkin@@YAHPEBDH@Z:PROC ; R_FindSkin + Line 254: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 255: EXTRN __CxxFrameHandler3:PROC + Line 256: EXTRN memcmp:PROC + Line 257: EXTRN memcpy:PROC + Line 258: EXTRN memset:PROC + Line 259: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 260: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 261: EXTRN ?GPalette@@3UFPalette@@A:BYTE ; GPalette + Line 262: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 263: EXTRN ?save_full@@3_NA:BYTE ; save_full + Line 264: EXTRN ?OtherGameSkinRemap@@3PAEA:BYTE ; OtherGameSkinRemap + Line 265: EXTRN ?OtherGameSkinPalette@@3PAUPalEntry@@A:BYTE ; OtherGameSkinPalette + Line 266: EXTRN ?sprites@@3V?$TArray@Uspritedef_t@@U1@@@A:BYTE ; sprites + Line 267: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 268: EXTRN __ImageBase:BYTE + Line 269: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\r_utility.cod (66 hits) + Line 39: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 40: EXTRN ?netgame@@3_NA:BYTE ; netgame + Line 41: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 42: EXTRN ?usergame@@3_NA:BYTE ; usergame + Line 201: EXTRN atexit:PROC + Line 202: EXTRN __std_terminate:PROC + Line 203: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 204: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 205: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 206: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 207: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 208: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 209: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 210: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 211: EXTRN ??0FRandom@@QEAA@XZ:PROC ; FRandom::FRandom + Line 212: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 213: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 214: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 215: EXTRN c_sqrt:PROC + Line 216: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 217: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 218: EXTRN ?R_InitTranslationTables@@YAXXZ:PROC ; R_InitTranslationTables + Line 219: EXTRN ?R_DeinitTranslationTables@@YAXXZ:PROC ; R_DeinitTranslationTables + Line 220: EXTRN ?R_InitSkyMap@@YAXXZ:PROC ; R_InitSkyMap + Line 221: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 222: EXTRN ?atterm@@YAXP6AXXZ@Z:PROC ; atterm + Line 223: EXTRN ?R_DeinitColormaps@@YAXXZ:PROC ; R_DeinitColormaps + Line 224: EXTRN ?SetClearColor@DFrameBuffer@@QEAAXH@Z:PROC ; DFrameBuffer::SetClearColor + Line 225: EXTRN ?ActiveRatio@@YAMHHPEAM@Z:PROC ; ActiveRatio + Line 226: EXTRN ?AspectBaseHeight@@YAHM@Z:PROC ; AspectBaseHeight + Line 227: EXTRN ?AspectMultiplier@@YAHM@Z:PROC ; AspectMultiplier + Line 228: EXTRN ?AspectTallerThanWide@@YA_NM@Z:PROC ; AspectTallerThanWide + Line 229: EXTRN ?StaticGetQuakeIntensities@DEarthquake@@SAHNPEAVAActor@@AEAUFQuakeJiggers@@@Z:PROC ; DEarthquake::StaticGetQuakeIntensities + Line 230: EXTRN ?SendPitchLimits@player_t@@QEBAXXZ:PROC ; player_t::SendPitchLimits + Line 231: EXTRN ?P_AimCamera@@YAXPEAVAActor@@AEAU?$TVector3@N@@AEAU?$TAngle@N@@AEAPEAUsector_t@@AEA_N@Z:PROC ; P_AimCamera + Line 232: EXTRN ?PointInRenderSubsector@FLevelLocals@@QEAAPEAUsubsector_t@@HH@Z:PROC ; FLevelLocals::PointInRenderSubsector + Line 233: EXTRN ?I_GetTime@@YAHXZ:PROC ; I_GetTime + Line 234: EXTRN ?I_GetTimeFrac@@YANXZ:PROC ; I_GetTimeFrac + Line 235: EXTRN ?CreateSWRenderer@@YAPEAUFRenderer@@XZ:PROC ; CreateSWRenderer + Line 236: EXTRN __CxxFrameHandler3:PROC + Line 237: EXTRN asin:PROC + Line 238: EXTRN atan:PROC + Line 239: EXTRN cos:PROC + Line 240: EXTRN memmove:PROC + Line 241: EXTRN memset:PROC + Line 242: EXTRN sin:PROC + Line 243: EXTRN sqrt:PROC + Line 244: EXTRN tan:PROC + Line 245: EXTRN ?paused@@3HA:DWORD ; paused + Line 246: EXTRN ?demoplayback@@3_NA:BYTE ; demoplayback + Line 247: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 248: EXTRN ?GPalette@@3UFPalette@@A:BYTE ; GPalette + Line 249: EXTRN ?BaseBlendR@@3HA:DWORD ; BaseBlendR + Line 250: EXTRN ?BaseBlendG@@3HA:DWORD ; BaseBlendG + Line 251: EXTRN ?BaseBlendB@@3HA:DWORD ; BaseBlendB + Line 252: EXTRN ?BaseBlendA@@3MA:DWORD ; BaseBlendA + Line 253: EXTRN ?fakecmaps@@3V?$TArray@UFakeCmap@@U1@@@A:BYTE ; fakecmaps + Line 254: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 255: EXTRN ?StartScreen@@3PEAVFStartupScreen@@EA:QWORD ; StartScreen + Line 256: EXTRN ?SWRenderer@@3PEAUFRenderer@@EA:QWORD ; SWRenderer + Line 257: EXTRN ?StatusBar@@3PEAVDBaseStatusBar@@EA:QWORD ; StatusBar + Line 258: EXTRN ?gamestate@@3W4gamestate_t@@A:DWORD ; gamestate + Line 259: EXTRN ?DrawFSHUD@@3_NA:BYTE ; DrawFSHUD + Line 260: EXTRN ?cl_capfps@@3VFBoolCVar@@A:BYTE ; cl_capfps + Line 261: EXTRN ?cl_noprediction@@3VFBoolCVar@@A:BYTE ; cl_noprediction + Line 262: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\r_vanillatrans.cod (5 hits) + Line 33: EXTRN atexit:PROC + Line 34: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 35: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 36: EXTRN ?FindLump@FWadCollection@@QEAAHPEBDPEAH_N@Z:PROC ; FWadCollection::FindLump + Line 37: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\r_videoscale.cod (18 hits) + Line 19: EXTRN ?setsizeneeded@@3_NA:BYTE ; setsizeneeded + Line 97: EXTRN atexit:PROC + Line 98: EXTRN atof:PROC + Line 99: EXTRN atoi:PROC + Line 100: EXTRN stricmp:PROC + Line 101: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 102: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 103: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 104: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 105: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 106: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 107: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 108: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 109: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 110: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 111: EXTRN ?ActiveRatio@@YAMHHPEAM@Z:PROC ; ActiveRatio + Line 112: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 113: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\rawpagetexture.cod (27 hits) + Line 24: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 25: EXTRN __std_terminate:PROC + Line 26: EXTRN stricmp:PROC + Line 27: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 28: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 29: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 30: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 31: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 32: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 33: EXTRN ?LumpLength@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::LumpLength + Line 34: EXTRN ?GetLumpName@FWadCollection@@QEBAXAEAVFString@@H@Z:PROC ; FWadCollection::GetLumpName + Line 35: EXTRN ?CopyPixelData@FBitmap@@QEAAXHHPEBEHHHHHPEAUPalEntry@@PEAUFCopyInfo@@@Z:PROC ; FBitmap::CopyPixelData + Line 36: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 37: EXTRN ?CreatePalettedPixels@FImageSource@@MEAA?AV?$TArray@EE@@H@Z:PROC ; FImageSource::CreatePalettedPixels + Line 38: EXTRN ?CopyPixels@FImageSource@@MEAAHPEAVFBitmap@@H@Z:PROC ; FImageSource::CopyPixels + Line 39: EXTRN ?CollectForPrecache@FImageSource@@UEAAXAEAV?$TMap@HU?$pair@HH@std@@U?$THashTraits@H@@U?$TValueTraits@U?$pair@HH@std@@@@@@_N@Z:PROC ; FImageSource::CollectForPrecache + Line 40: EXTRN ??_EFImageSource@@UEAAPEAXI@Z:PROC ; FImageSource::`vector deleting destructor' + Line 41: EXTRN ??_EFRawPageTexture@@UEAAPEAXI@Z:PROC ; FRawPageTexture::`vector deleting destructor' + Line 42: EXTRN __CxxFrameHandler3:PROC + Line 43: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 44: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 45: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 46: EXTRN ?GPalette@@3UFPalette@@A:BYTE ; GPalette + Line 47: EXTRN ?translationtables@@3PAV?$TAutoGrowArray@VFRemapTablePtr@@PEAUFRemapTable@@@@A:BYTE ; translationtables + Line 48: EXTRN ?GrayMap@ImageHelpers@@3PAEA:BYTE ; ImageHelpers::GrayMap + Line 49: EXTRN ?ImageArena@FImageSource@@1VFMemArena@@A:BYTE ; FImageSource::ImageArena + Line 50: EXTRN ?NextID@FImageSource@@1HA:DWORD ; FImageSource::NextID + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\readmidic.cod (5 hits) + Line 15: EXTRN ?ctl_cmsg@TimidityPlus@@YAXHHPEBDZZ:PROC ; TimidityPlus::ctl_cmsg + Line 16: EXTRN ?get_userdrum@Instruments@TimidityPlus@@QEAAPEAUUserDrumset@12@HH@Z:PROC ; TimidityPlus::Instruments::get_userdrum + Line 17: EXTRN ?recompute_userdrum_altassign@Instruments@TimidityPlus@@QEAAXHH@Z:PROC ; TimidityPlus::Instruments::recompute_userdrum_altassign + Line 18: EXTRN __ImageBase:BYTE + Line 19: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\recache.cod (10 hits) + Line 29: EXTRN free:PROC + Line 30: EXTRN ?init_mblock@TimidityPlus@@YAXPEAUMBlockList@1@@Z:PROC ; TimidityPlus::init_mblock + Line 31: EXTRN ?new_segment@TimidityPlus@@YAPEAXPEAUMBlockList@1@_K@Z:PROC ; TimidityPlus::new_segment + Line 32: EXTRN ?reuse_mblock@TimidityPlus@@YAXPEAUMBlockList@1@@Z:PROC ; TimidityPlus::reuse_mblock + Line 33: EXTRN ?safe_large_malloc@TimidityPlus@@YAPEAX_K@Z:PROC ; TimidityPlus::safe_large_malloc + Line 34: EXTRN ?get_note_freq@TimidityPlus@@YAHPEAUSample@1@H@Z:PROC ; TimidityPlus::get_note_freq + Line 35: EXTRN ?do_resamplation@TimidityPlus@@YAHPEAFIPEAUresample_rec@1@@Z:PROC ; TimidityPlus::do_resamplation + Line 36: EXTRN memset:PROC + Line 37: EXTRN ?playback_rate@TimidityPlus@@3HA:DWORD ; TimidityPlus::playback_rate + Line 38: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\renderinfo.cod (14 hits) + Line 42: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 43: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 44: EXTRN __std_terminate:PROC + Line 45: EXTRN qsort:PROC + Line 46: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 47: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 48: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 49: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 50: EXTRN c_sqrt:PROC + Line 51: EXTRN __CxxFrameHandler3:PROC + Line 52: EXTRN memmove:PROC + Line 53: EXTRN memset:PROC + Line 54: EXTRN ?skyflatnum@@3VFTextureID@@A:DWORD ; skyflatnum + Line 55: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\renderstyle.cod (11 hits) + Line 105: EXTRN atexit:PROC + Line 106: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 107: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 108: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 109: EXTRN ?ArraySize@FSerializer@@QEAAIXZ:PROC ; FSerializer::ArraySize + Line 110: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 111: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 112: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAEPEAE@Z:PROC ; Serialize + Line 113: EXTRN memcmp:PROC + Line 114: EXTRN ?save_full@@3_NA:BYTE ; save_full + Line 115: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\resample.cod (16 hits) + Line 41: EXTRN free:PROC + Line 42: EXTRN ?ctl_cmsg@TimidityPlus@@YAXHHPEBDZZ:PROC ; TimidityPlus::ctl_cmsg + Line 43: EXTRN ?safe_malloc@TimidityPlus@@YAPEAX_K@Z:PROC ; TimidityPlus::safe_malloc + Line 44: EXTRN ?safe_realloc@TimidityPlus@@YAPEAXPEAX_K@Z:PROC ; TimidityPlus::safe_realloc + Line 45: EXTRN ?recompute_freq@Player@TimidityPlus@@QEAAXH@Z:PROC ; TimidityPlus::Player::recompute_freq + Line 46: EXTRN ?lookup_triangular@TimidityPlus@@YANH@Z:PROC ; TimidityPlus::lookup_triangular + Line 47: EXTRN ?get_note_freq@TimidityPlus@@YAHPEAUSample@1@H@Z:PROC ; TimidityPlus::get_note_freq + Line 48: EXTRN __vdecl_sin2:PROC + Line 49: EXTRN pow:PROC + Line 50: EXTRN sin:PROC + Line 51: EXTRN ?playback_rate@TimidityPlus@@3HA:DWORD ; TimidityPlus::playback_rate + Line 52: EXTRN ?freq_table@TimidityPlus@@3PAHA:BYTE ; TimidityPlus::freq_table + Line 53: EXTRN ?bend_fine@TimidityPlus@@3PANA:BYTE ; TimidityPlus::bend_fine + Line 54: EXTRN ?bend_coarse@TimidityPlus@@3PANA:BYTE ; TimidityPlus::bend_coarse + Line 55: EXTRN __ImageBase:BYTE + Line 56: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\resolutionmenu.cod (21 hits) + Line 42: EXTRN atexit:PROC + Line 43: EXTRN atoi:PROC + Line 44: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 45: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 46: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 47: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 48: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 49: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 50: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 51: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 52: EXTRN ?V_OutputResized@@YAXHH@Z:PROC ; V_OutputResized + Line 53: EXTRN ?M_PreviousMenu@@YAXXZ:PROC ; M_PreviousMenu + Line 54: EXTRN ?fullscreen@@3VFBoolCVar@@A:BYTE ; fullscreen + Line 55: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 56: EXTRN ?vid_scale_customlinear@@3VFBoolCVar@@A:BYTE ; vid_scale_customlinear + Line 57: EXTRN ?vid_scale_customstretched@@3VFBoolCVar@@A:BYTE ; vid_scale_customstretched + Line 58: EXTRN ?vid_scale_customwidth@@3VFIntCVar@@A:BYTE ; vid_scale_customwidth + Line 59: EXTRN ?vid_scale_customheight@@3VFIntCVar@@A:BYTE ; vid_scale_customheight + Line 60: EXTRN ?vid_scalemode@@3VFIntCVar@@A:BYTE ; vid_scalemode + Line 61: EXTRN ?vid_scalefactor@@3VFFloatCVar@@A:BYTE ; vid_scalefactor + Line 62: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\resourcefile.cod (62 hits) + Line 8: EXTRN ?CheckWad@@YAPEAVFResourceFile@@PEBDAEAVFileReader@@_N@Z:PROC ; CheckWad + Line 9: EXTRN ?CheckGRP@@YAPEAVFResourceFile@@PEBDAEAVFileReader@@_N@Z:PROC ; CheckGRP + Line 10: EXTRN ?CheckRFF@@YAPEAVFResourceFile@@PEBDAEAVFileReader@@_N@Z:PROC ; CheckRFF + Line 11: EXTRN ?CheckPak@@YAPEAVFResourceFile@@PEBDAEAVFileReader@@_N@Z:PROC ; CheckPak + Line 12: EXTRN ?CheckZip@@YAPEAVFResourceFile@@PEBDAEAVFileReader@@_N@Z:PROC ; CheckZip + Line 13: EXTRN ?Check7Z@@YAPEAVFResourceFile@@PEBDAEAVFileReader@@_N@Z:PROC ; Check7Z + Line 14: EXTRN ?CheckLump@@YAPEAVFResourceFile@@PEBDAEAVFileReader@@_N@Z:PROC ; CheckLump + Line 89: EXTRN _purecall:PROC + Line 90: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 91: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 92: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 93: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 94: EXTRN qsort:PROC + Line 95: EXTRN strchr:PROC + Line 96: EXTRN strstr:PROC + Line 97: EXTRN strncmp:PROC + Line 98: EXTRN stricmp:PROC + Line 99: EXTRN strnicmp:PROC + Line 100: EXTRN crc32:PROC + Line 101: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 102: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 103: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 104: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 105: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 106: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 107: EXTRN ??HFString@@QEBA?AV0@AEBV0@@Z:PROC ; FString::operator+ + Line 108: EXTRN ??HFString@@QEBA?AV0@D@Z:PROC ; FString::operator+ + Line 109: EXTRN ??YFString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator+= + Line 110: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 111: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 112: EXTRN ?Left@FString@@QEBA?AV1@_K@Z:PROC ; FString::Left + Line 113: EXTRN ?Mid@FString@@QEBA?AV1@_K0@Z:PROC ; FString::Mid + Line 114: EXTRN ?IndexOf@FString@@QEBAJDJ@Z:PROC ; FString::IndexOf + Line 115: EXTRN ?LastIndexOf@FString@@QEBAJD@Z:PROC ; FString::LastIndexOf + Line 116: EXTRN ?Truncate@FString@@QEAAX_K@Z:PROC ; FString::Truncate + Line 117: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 118: EXTRN ??_EFileReaderInterface@@UEAAPEAXI@Z:PROC ; FileReaderInterface::`vector deleting destructor' + Line 119: EXTRN ?Tell@MemoryReader@@UEBAJXZ:PROC ; MemoryReader::Tell + Line 120: EXTRN ?Seek@MemoryReader@@UEAAJJH@Z:PROC ; MemoryReader::Seek + Line 121: EXTRN ?Read@MemoryReader@@UEAAJPEAXJ@Z:PROC ; MemoryReader::Read + Line 122: EXTRN ?Gets@MemoryReader@@UEAAPEADPEADH@Z:PROC ; MemoryReader::Gets + Line 123: EXTRN ??_EMemoryReader@@UEAAPEAXI@Z:PROC ; MemoryReader::`vector deleting destructor' + Line 124: EXTRN ?OpenFile@FileReader@@QEAA_NPEBD_J1@Z:PROC ; FileReader::OpenFile + Line 125: EXTRN ??_EFResourceLump@@UEAAPEAXI@Z:PROC ; FResourceLump::`vector deleting destructor' + Line 126: EXTRN ??_EFResourceFile@@UEAAPEAXI@Z:PROC ; FResourceFile::`vector deleting destructor' + Line 127: EXTRN ??_EFUncompressedLump@@UEAAPEAXI@Z:PROC ; FUncompressedLump::`vector deleting destructor' + Line 128: EXTRN ??_EFUncompressedFile@@UEAAPEAXI@Z:PROC ; FUncompressedFile::`vector deleting destructor' + Line 129: EXTRN ??_EFExternalLump@@UEAAPEAXI@Z:PROC ; FExternalLump::`vector deleting destructor' + Line 130: EXTRN ?ExtractFileBase@@YA?AVFString@@PEBD_N@Z:PROC ; ExtractFileBase + Line 131: EXTRN ?uppercopy@@YAXPEADPEBD@Z:PROC ; uppercopy + Line 132: EXTRN ??_EFLumpReader@@UEAAPEAXI@Z:PROC ; FLumpReader::`vector deleting destructor' + Line 133: EXTRN ?CheckDir@@YAPEAVFResourceFile@@PEBD_N@Z:PROC ; CheckDir + Line 134: EXTRN __CxxFrameHandler3:PROC + Line 135: EXTRN memchr:PROC + Line 136: EXTRN memcpy:PROC + Line 137: EXTRN memmove:PROC + Line 138: EXTRN memset:PROC + Line 139: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 140: EXTRN ?GameNames@@3PAPEBDA:BYTE ; GameNames + Line 141: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 142: EXTRN ?LumpFilterIWAD@@3VFString@@A:QWORD ; LumpFilterIWAD + Line 143: EXTRN __ImageBase:BYTE + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\reverb.cod (8 hits) + Line 34: EXTRN free:PROC + Line 35: EXTRN malloc:PROC + Line 36: EXTRN cos:PROC + Line 37: EXTRN pow:PROC + Line 38: EXTRN sin:PROC + Line 39: EXTRN sinh:PROC + Line 40: EXTRN sqrt:PROC + Line 41: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\s_advsound.cod (86 hits) + Line 392: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 393: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 394: EXTRN atexit:PROC + Line 395: EXTRN __std_terminate:PROC + Line 396: EXTRN qsort:PROC + Line 397: EXTRN rand:PROC + Line 398: EXTRN atof:PROC + Line 399: EXTRN stricmp:PROC + Line 400: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 401: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 402: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 403: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 404: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 405: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 406: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 407: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 408: EXTRN ??YFString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator+= + Line 409: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 410: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 411: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 412: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 413: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 414: EXTRN ?atterm@@YAXP6AXXZ@Z:PROC ; atterm + Line 415: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 416: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 417: EXTRN ?S_CacheSound@@YAXPEAUsfxinfo_t@@@Z:PROC ; S_CacheSound + Line 418: EXTRN ?S_Sound@@YAXPEAVAActor@@HVFSoundID@@MM@Z:PROC ; S_Sound + Line 419: EXTRN ?S_SoundMinMaxDist@@YAXPEAVAActor@@HVFSoundID@@MMM@Z:PROC ; S_SoundMinMaxDist + Line 420: EXTRN ?S_StopSound@@YAXPEAVAActor@@H@Z:PROC ; S_StopSound + Line 421: EXTRN ?S_StopAllChannels@@YAXXZ:PROC ; S_StopAllChannels + Line 422: EXTRN ?S_UnloadSound@@YAXPEAUsfxinfo_t@@@Z:PROC ; S_UnloadSound + Line 423: EXTRN ?S_LoadSound@@YAPEAUsfxinfo_t@@PEAU1@PEAUFSoundLoadBuffer@@@Z:PROC ; S_LoadSound + Line 424: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 425: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 426: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 427: EXTRN ??0FScanner@@QEAA@H@Z:PROC ; FScanner::FScanner + Line 428: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 429: EXTRN ?SetCMode@FScanner@@QEAAX_N@Z:PROC ; FScanner::SetCMode + Line 430: EXTRN ?SavePos@FScanner@@QEAA?BUSavedPos@1@XZ:PROC ; FScanner::SavePos + Line 431: EXTRN ?RestorePos@FScanner@@QEAAXAEBUSavedPos@1@@Z:PROC ; FScanner::RestorePos + Line 432: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 433: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 434: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 435: EXTRN ?CheckString@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::CheckString + Line 436: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 437: EXTRN ?CheckNumber@FScanner@@QEAA_NXZ:PROC ; FScanner::CheckNumber + Line 438: EXTRN ?MustGetFloat@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetFloat + Line 439: EXTRN ?CheckFloat@FScanner@@QEAA_NXZ:PROC ; FScanner::CheckFloat + Line 440: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 441: EXTRN ?MatchString@FScanner@@QEAAHPEBQEBD_K@Z:PROC ; FScanner::MatchString + Line 442: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 443: EXTRN ?ScriptMessage@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptMessage + Line 444: EXTRN ?FindLevelInfo@@YAPEAUlevel_info_t@@PEBD_N@Z:PROC ; FindLevelInfo + Line 445: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 446: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 447: EXTRN ?MakeKey@@YAIPEBD@Z:PROC ; MakeKey + Line 448: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 449: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 450: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 451: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 452: EXTRN ?FindLump@FWadCollection@@QEAAHPEBDPEAH_N@Z:PROC ; FWadCollection::FindLump + Line 453: EXTRN ?CheckLumpName@FWadCollection@@QEAA_NHPEBD@Z:PROC ; FWadCollection::CheckLumpName + Line 454: EXTRN ?GetLumpName@FWadCollection@@QEBAXPEADH@Z:PROC ; FWadCollection::GetLumpName + Line 455: EXTRN ?GetLumpFullName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetLumpFullName + Line 456: EXTRN ?GetLumpFile@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpFile + Line 457: EXTRN ?GetLumpNamespace@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpNamespace + Line 458: EXTRN ?GetLumpIndexNum@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpIndexNum + Line 459: EXTRN ?GetNumLumps@FWadCollection@@QEBAHXZ:PROC ; FWadCollection::GetNumLumps + Line 460: EXTRN ?D_GenderToInt@@YAHPEBD@Z:PROC ; D_GenderToInt + Line 461: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 462: EXTRN ?IsFloat@@YA_NPEBD@Z:PROC ; IsFloat + Line 463: EXTRN __CxxFrameHandler3:PROC + Line 464: EXTRN memset:PROC + Line 465: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 466: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 467: EXTRN ?S_Rolloff@@3UFRolloffInfo@@A:BYTE ; S_Rolloff + Line 468: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 469: EXTRN ?GameNames@@3PAPEBDA:BYTE ; GameNames + Line 470: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 471: EXTRN ?GSnd@@3PEAVSoundRenderer@@EA:QWORD ; GSnd + Line 472: EXTRN ?GenderNames@@3PAPEBDA:BYTE ; GenderNames + Line 473: EXTRN ?PlayerClasses@@3V?$TArray@VFPlayerClass@@V1@@@A:BYTE ; PlayerClasses + Line 474: EXTRN ?Skins@@3V?$TArray@VFPlayerSkin@@V1@@@A:BYTE ; Skins + Line 475: EXTRN ?sfx_empty@@3HA:DWORD ; sfx_empty + Line 476: EXTRN __ImageBase:BYTE + Line 477: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\s_environment.cod (57 hits) + Line 122: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 123: EXTRN ?ForcedEnvironment@@3PEAUReverbContainer@@EA:QWORD ; ForcedEnvironment + Line 124: EXTRN ?RegistrationInfo@PFunction@@2UClassReg@@A:BYTE ; PFunction::RegistrationInfo + Line 1923: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 1924: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 1925: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 1926: EXTRN atexit:PROC + Line 1927: EXTRN __std_terminate:PROC + Line 1928: EXTRN atoi:PROC + Line 1929: EXTRN strncpy:PROC + Line 1930: EXTRN stricmp:PROC + Line 1931: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 1932: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 1933: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 1934: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_K_N@Z:PROC ; FName::NameManager::FindName + Line 1935: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 1936: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 1937: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 1938: EXTRN ??HFString@@QEBA?AV0@PEBD@Z:PROC ; FString::operator+ + Line 1939: EXTRN ??0FStringf@@QEAA@PEBDZZ:PROC ; FStringf::FStringf + Line 1940: EXTRN mysnprintf:PROC + Line 1941: EXTRN ??0FScanner@@QEAA@XZ:PROC ; FScanner::FScanner + Line 1942: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 1943: EXTRN ?OpenLumpNum@FScanner@@QEAAXH@Z:PROC ; FScanner::OpenLumpNum + Line 1944: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 1945: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 1946: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 1947: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 1948: EXTRN ?MustGetFloat@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetFloat + Line 1949: EXTRN ?MustMatchString@FScanner@@QEAAHPEBQEBD_K@Z:PROC ; FScanner::MustMatchString + Line 1950: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 1951: EXTRN ?copystring@@YAPEADPEBD@Z:PROC ; copystring + Line 1952: EXTRN ?Open@FileWriter@@SAPEAV1@PEBD@Z:PROC ; FileWriter::Open + Line 1953: EXTRN ?Printf@FileWriter@@QEAA_KPEBDZZ:PROC ; FileWriter::Printf + Line 1954: EXTRN ?FindLump@FWadCollection@@QEAAHPEBDPEAH_N@Z:PROC ; FWadCollection::FindLump + Line 1955: EXTRN ?atterm@@YAXP6AXXZ@Z:PROC ; atterm + Line 1956: EXTRN ?M_GetDocumentsPath@@YA?AVFString@@XZ:PROC ; M_GetDocumentsPath + Line 1957: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 1958: EXTRN ?ForceSet@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@_N@Z:PROC ; FBaseCVar::ForceSet + Line 1959: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 1960: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 1961: EXTRN ??0FStringCVar@@QEAA@PEBD0IP6AXAEAV0@@Z@Z:PROC ; FStringCVar::FStringCVar + Line 1962: EXTRN ??1FStringCVar@@UEAA@XZ:PROC ; FStringCVar::~FStringCVar + Line 1963: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 1964: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 1965: EXTRN ?C_DoCommand@@YAXPEBDH@Z:PROC ; C_DoCommand + Line 1966: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 1967: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 1968: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 1969: EXTRN ?FindSymbol@PClass@@QEBAPEAVPSymbol@@VFName@@_N@Z:PROC ; PClass::FindSymbol + Line 1970: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 1971: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 1972: EXTRN ?M_StartMessage@@YAXPEBDHVFName@@@Z:PROC ; M_StartMessage + Line 1973: EXTRN __CxxFrameHandler3:PROC + Line 1974: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 1975: EXTRN __ImageBase:BYTE + Line 1976: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\s_playlist.cod (24 hits) + Line 30: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 31: EXTRN _errno:PROC + Line 32: EXTRN rand:PROC + Line 33: EXTRN strerror:PROC + Line 34: EXTRN strncmp:PROC + Line 35: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 36: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 37: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 38: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 39: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 40: EXTRN ??HFString@@QEBA?AV0@AEBV0@@Z:PROC ; FString::operator+ + Line 41: EXTRN ?Mid@FString@@QEBA?AV1@_K0@Z:PROC ; FString::Mid + Line 42: EXTRN ?IndexOf@FString@@QEBAJPEBDJ@Z:PROC ; FString::IndexOf + Line 43: EXTRN ?IndexOf@FString@@QEBAJDJ@Z:PROC ; FString::IndexOf + Line 44: EXTRN ?StripRight@FString@@QEAAXPEBD@Z:PROC ; FString::StripRight + Line 45: EXTRN ?ReplaceChars@FString@@QEAAXDD@Z:PROC ; FString::ReplaceChars + Line 46: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 47: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 48: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 49: EXTRN ?ExtractFilePath@@YA?AVFString@@PEBD@Z:PROC ; ExtractFilePath + Line 50: EXTRN ?OpenFile@FileReader@@QEAA_NPEBD_J1@Z:PROC ; FileReader::OpenFile + Line 51: EXTRN __CxxFrameHandler3:PROC + Line 52: EXTRN strcmp:PROC + Line 53: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\s_sndseq.cod (79 hits) + Line 96: EXTRN ?RegistrationInfo@DObject@@2UClassReg@@A:BYTE ; DObject::RegistrationInfo + Line 633: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 634: EXTRN atexit:PROC + Line 635: EXTRN __std_terminate:PROC + Line 636: EXTRN atoi:PROC + Line 637: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 638: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 639: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 640: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 641: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 642: EXTRN ??0FScanner@@QEAA@H@Z:PROC ; FScanner::FScanner + Line 643: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 644: EXTRN ?SetCMode@FScanner@@QEAAX_N@Z:PROC ; FScanner::SetCMode + Line 645: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 646: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 647: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 648: EXTRN ?CheckNumber@FScanner@@QEAA_NXZ:PROC ; FScanner::CheckNumber + Line 649: EXTRN ?MustGetFloat@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetFloat + Line 650: EXTRN ?CheckFloat@FScanner@@QEAA_NXZ:PROC ; FScanner::CheckFloat + Line 651: EXTRN ?UnGet@FScanner@@QEAAXXZ:PROC ; FScanner::UnGet + Line 652: EXTRN ?MustMatchString@FScanner@@QEAAHPEBQEBD_K@Z:PROC ; FScanner::MustMatchString + Line 653: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 654: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 655: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 656: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 657: EXTRN ?MarkUsed@sfxinfo_t@@QEAAXXZ:PROC ; sfxinfo_t::MarkUsed + Line 658: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 659: EXTRN ?S_Sound@@YAXPEAVAActor@@HVFSoundID@@MM@Z:PROC ; S_Sound + Line 660: EXTRN ?S_Sound@@YAXPEBUFPolyObj@@HVFSoundID@@MM@Z:PROC ; S_Sound + Line 661: EXTRN ?S_Sound@@YAXPEBUsector_t@@HVFSoundID@@MM@Z:PROC ; S_Sound + Line 662: EXTRN ?S_StopSound@@YAXPEAVAActor@@H@Z:PROC ; S_StopSound + Line 663: EXTRN ?S_StopSound@@YAXPEBUsector_t@@H@Z:PROC ; S_StopSound + Line 664: EXTRN ?S_StopSound@@YAXPEBUFPolyObj@@H@Z:PROC ; S_StopSound + Line 665: EXTRN ?S_GetSoundPlayingInfo@@YA_NPEBUsector_t@@H@Z:PROC ; S_GetSoundPlayingInfo + Line 666: EXTRN ?S_GetSoundPlayingInfo@@YA_NPEBUFPolyObj@@H@Z:PROC ; S_GetSoundPlayingInfo + Line 667: EXTRN ?S_IsActorPlayingSomething@@YA_NPEAVAActor@@HH@Z:PROC ; S_IsActorPlayingSomething + Line 668: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 669: EXTRN ?Barrier@GC@@YAXPEAVDObject@@0@Z:PROC ; GC::Barrier + Line 670: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 671: EXTRN ??1DObject@@UEAA@XZ:PROC ; DObject::~DObject + Line 672: EXTRN ?Serialize@DObject@@UEAAXAEAVFSerializer@@@Z:PROC ; DObject::Serialize + Line 673: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 674: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 675: EXTRN ?PropagateMark@DObject@@UEAA_KXZ:PROC ; DObject::PropagateMark + Line 676: EXTRN ??_EDSeqNode@@UEAAPEAXI@Z:PROC ; DSeqNode::`vector deleting destructor' + Line 677: EXTRN ?FindLump@FWadCollection@@QEAAHPEBDPEAH_N@Z:PROC ; FWadCollection::FindLump + Line 678: EXTRN ?IsNum@@YA_NPEBD@Z:PROC ; IsNum + Line 679: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 680: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 681: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 682: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 683: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 684: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 685: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 686: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAIPEAI@Z:PROC ; Serialize + Line 687: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAMPEAM@Z:PROC ; Serialize + Line 688: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 689: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAVFName@@PEAV2@@Z:PROC ; Serialize + Line 690: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAVFSoundID@@PEAV2@@Z:PROC ; Serialize + Line 691: EXTRN ??$Serialize@UFPolyObj@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUFPolyObj@@PEAPEAU1@@Z:PROC ; Serialize + Line 692: EXTRN ??$Serialize@Usector_t@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUsector_t@@PEAPEAU1@@Z:PROC ; Serialize + Line 693: EXTRN ??$Serialize@UFLevelLocals@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUFLevelLocals@@PEAPEAU1@@Z:PROC ; Serialize + Line 694: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 695: EXTRN ??_EDSeqActorNode@@UEAAPEAXI@Z:PROC ; DSeqActorNode::`vector deleting destructor' + Line 696: EXTRN ??_EDSeqPolyNode@@UEAAPEAXI@Z:PROC ; DSeqPolyNode::`vector deleting destructor' + Line 697: EXTRN ??_EDSeqSectorNode@@UEAAPEAXI@Z:PROC ; DSeqSectorNode::`vector deleting destructor' + Line 698: EXTRN __CxxFrameHandler3:PROC + Line 699: EXTRN memcpy:PROC + Line 700: EXTRN memset:PROC + Line 701: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 702: EXTRN ?paused@@3HA:DWORD ; paused + Line 703: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 704: EXTRN ?S_sfx@@3V?$TArray@Usfxinfo_t@@U1@@@A:BYTE ; S_sfx + Line 705: EXTRN ?State@GC@@3W4EGCState@1@A:DWORD ; GC::State + Line 706: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 707: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 708: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 709: EXTRN __ImageBase:BYTE + Line 710: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\s_sound.cod (144 hits) + Line 52: EXTRN ?IsAlias@FConsoleCommand@@UEAA_NXZ:PROC ; FConsoleCommand::IsAlias + Line 53: EXTRN ?Run@FUnsafeConsoleCommand@@UEAAXAEAVFCommandLine@@PEAVAActor@@H@Z:PROC ; FUnsafeConsoleCommand::Run + Line 54: EXTRN ??_EFUnsafeConsoleCommand@@UEAAPEAXI@Z:PROC ; FUnsafeConsoleCommand::`vector deleting destructor' + Line 432: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 433: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 434: EXTRN atexit:PROC + Line 435: EXTRN __std_terminate:PROC + Line 436: EXTRN atoi:PROC + Line 437: EXTRN strtoul:PROC + Line 438: EXTRN strchr:PROC + Line 439: EXTRN strncmp:PROC + Line 440: EXTRN stricmp:PROC + Line 441: EXTRN strnicmp:PROC + Line 442: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 443: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 444: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 445: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 446: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 447: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 448: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 449: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 450: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 451: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 452: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 453: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 454: EXTRN mysnprintf:PROC + Line 455: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 456: EXTRN ?atterm@@YAXP6AXXZ@Z:PROC ; atterm + Line 457: EXTRN c_sqrt:PROC + Line 458: EXTRN ?LoadSoundVoc@SoundRenderer@@QEAA?AU?$pair@USoundHandle@@_N@std@@PEAEH_N@Z:PROC ; SoundRenderer::LoadSoundVoc + Line 459: EXTRN ?I_UpdateMusic@@YAXXZ:PROC ; I_UpdateMusic + Line 460: EXTRN ?I_RegisterSong@@YAPEAVMusInfo@@AEAVFileReader@@PEAUMidiDeviceSetting@@@Z:PROC ; I_RegisterSong + Line 461: EXTRN ?I_RegisterCDSong@@YAPEAVMusInfo@@HH@Z:PROC ; I_RegisterCDSong + Line 462: EXTRN ?Start@MusInfo@@QEAAX_NMH@Z:PROC ; MusInfo::Start + Line 463: EXTRN ?CD_Stop@@YAXXZ:PROC ; CD_Stop + Line 464: EXTRN ?CD_Pause@@YAXXZ:PROC ; CD_Pause + Line 465: EXTRN ?CD_Resume@@YA_NXZ:PROC ; CD_Resume + Line 466: EXTRN ?CD_Eject@@YAXXZ:PROC ; CD_Eject + Line 467: EXTRN ?CD_UnEject@@YA_NXZ:PROC ; CD_UnEject + Line 468: EXTRN ?MarkUsed@sfxinfo_t@@QEAAXXZ:PROC ; sfxinfo_t::MarkUsed + Line 469: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 470: EXTRN ?S_PickReplacement@@YAHH@Z:PROC ; S_PickReplacement + Line 471: EXTRN ?S_CacheRandomSound@@YAXPEAUsfxinfo_t@@@Z:PROC ; S_CacheRandomSound + Line 472: EXTRN ?S_ParseSndInfo@@YAX_N@Z:PROC ; S_ParseSndInfo + Line 473: EXTRN ?S_FindSkinnedSound@@YAHPEAVAActor@@VFSoundID@@@Z:PROC ; S_FindSkinnedSound + Line 474: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 475: EXTRN ?SN_StopAllSequences@@YAXPEAUFLevelLocals@@@Z:PROC ; SN_StopAllSequences + Line 476: EXTRN ?S_ParseSndSeq@@YAXH@Z:PROC ; S_ParseSndSeq + Line 477: EXTRN ?SN_UpdateActiveSequences@@YAXPEAUFLevelLocals@@@Z:PROC ; SN_UpdateActiveSequences + Line 478: EXTRN ??0FPlayList@@QEAA@PEBD@Z:PROC ; FPlayList::FPlayList + Line 479: EXTRN ??1FPlayList@@QEAA@XZ:PROC ; FPlayList::~FPlayList + Line 480: EXTRN ?ChangeList@FPlayList@@QEAA_NPEBD@Z:PROC ; FPlayList::ChangeList + Line 481: EXTRN ?GetNumSongs@FPlayList@@QEBAHXZ:PROC ; FPlayList::GetNumSongs + Line 482: EXTRN ?SetPosition@FPlayList@@QEAAHH@Z:PROC ; FPlayList::SetPosition + Line 483: EXTRN ?GetPosition@FPlayList@@QEBAHXZ:PROC ; FPlayList::GetPosition + Line 484: EXTRN ?Advance@FPlayList@@QEAAHXZ:PROC ; FPlayList::Advance + Line 485: EXTRN ?Backup@FPlayList@@QEAAHXZ:PROC ; FPlayList::Backup + Line 486: EXTRN ?Shuffle@FPlayList@@QEAAXXZ:PROC ; FPlayList::Shuffle + Line 487: EXTRN ?GetSong@FPlayList@@QEBAPEBDH@Z:PROC ; FPlayList::GetSong + Line 488: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 489: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 490: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 491: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 492: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 493: EXTRN ?OpenFile@FileReader@@QEAA_NPEBD_J1@Z:PROC ; FileReader::OpenFile + Line 494: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 495: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 496: EXTRN ?ReadLump@FWadCollection@@QEAAXHPEAX@Z:PROC ; FWadCollection::ReadLump + Line 497: EXTRN ?OpenLumpReader@FWadCollection@@QEAA?AVFileReader@@H@Z:PROC ; FWadCollection::OpenLumpReader + Line 498: EXTRN ?ReopenLumpReader@FWadCollection@@QEAA?AVFileReader@@H_N@Z:PROC ; FWadCollection::ReopenLumpReader + Line 499: EXTRN ?LumpLength@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::LumpLength + Line 500: EXTRN ?GetLumpName@FWadCollection@@QEBAXPEADH@Z:PROC ; FWadCollection::GetLumpName + Line 501: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 502: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 503: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 504: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 505: EXTRN ?FileExists@@YA_NPEBD@Z:PROC ; FileExists + Line 506: EXTRN ?DrawText@DFrameBuffer@@QEAAXPEAVFFont@@HNNPEBDHZZ:PROC ; DFrameBuffer::DrawText + Line 507: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 508: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 509: EXTRN ?isValid@level_info_t@@QEAA_NXZ:PROC ; level_info_t::isValid + Line 510: EXTRN ?FindLevelInfo@@YAPEAUlevel_info_t@@PEBD_N@Z:PROC ; FindLevelInfo + Line 511: EXTRN ?CalcMapName@@YA?AVFString@@HH@Z:PROC ; CalcMapName + Line 512: EXTRN ?StaticSpawn@AActor@@SAPEAV1@PEAVPClassActor@@AEBU?$TVector3@N@@W4replace_t@@_N@Z:PROC ; AActor::StaticSpawn + Line 513: EXTRN ?CheckLocalView@AActor@@QEBA_NH@Z:PROC ; AActor::CheckLocalView + Line 514: EXTRN ?ClassForSpawn@@YAPEAVPClassActor@@VFName@@@Z:PROC ; ClassForSpawn + Line 515: EXTRN ??RFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator() + Line 516: EXTRN ??AFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator[] + Line 517: EXTRN ?ClosestPoint@sector_t@@QEBAXAEBU?$TVector2@N@@AEAU2@@Z:PROC ; sector_t::ClosestPoint + Line 518: EXTRN ?ClosestPoint@FPolyObj@@QEBAXAEBU?$TVector2@N@@AEAU2@PEAPEAUside_t@@@Z:PROC ; FPolyObj::ClosestPoint + Line 519: EXTRN ?ArraySize@FSerializer@@QEAAIXZ:PROC ; FSerializer::ArraySize + Line 520: EXTRN ?BeginObject@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginObject + Line 521: EXTRN ?EndObject@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndObject + Line 522: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 523: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 524: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEA_KPEA_K@Z:PROC ; Serialize + Line 525: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 526: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEACPEAC@Z:PROC ; Serialize + Line 527: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAEPEAE@Z:PROC ; Serialize + Line 528: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAFPEAF@Z:PROC ; Serialize + Line 529: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAMPEAM@Z:PROC ; Serialize + Line 530: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 531: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAVFSoundID@@PEAV2@@Z:PROC ; Serialize + Line 532: EXTRN ??$Serialize@$$CBUFPolyObj@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEBUFPolyObj@@PEAPEBU1@@Z:PROC ; Serialize + Line 533: EXTRN ??$Serialize@$$CBUsector_t@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEBUsector_t@@PEAPEBU1@@Z:PROC ; Serialize + Line 534: EXTRN ?PointInSubsector@FLevelLocals@@AEAAPEAUsubsector_t@@NN@Z:PROC ; FLevelLocals::PointInSubsector + Line 535: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 536: EXTRN ?GetVirtualIndex@@YAIPEAVPClass@@PEBD@Z:PROC ; GetVirtualIndex + Line 537: EXTRN ?S_GetMusicVolume@@YAMPEBD@Z:PROC ; S_GetMusicVolume + Line 538: EXTRN ?S_AddLocalSndInfo@@YAXH@Z:PROC ; S_AddLocalSndInfo + Line 539: EXTRN __CxxFrameHandler3:PROC + Line 540: EXTRN log10:PROC + Line 541: EXTRN memset:PROC + Line 542: EXTRN powf:PROC + Line 543: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 544: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 545: EXTRN ?GSnd@@3PEAVSoundRenderer@@EA:QWORD ; GSnd + Line 546: EXTRN ?nosfx@@3_NA:BYTE ; nosfx + Line 547: EXTRN ?nosound@@3_NA:BYTE ; nosound + Line 548: EXTRN ?nomusic@@3HA:DWORD ; nomusic + Line 549: EXTRN ?S_sfx@@3V?$TArray@Usfxinfo_t@@U1@@@A:BYTE ; S_sfx + Line 550: EXTRN ?MusicAliases@@3V?$TMap@VFName@@V1@U?$THashTraits@VFName@@@@U?$TValueTraits@VFName@@@@@@A:BYTE ; MusicAliases + Line 551: EXTRN ?MidiDevices@@3V?$TMap@VFName@@UMidiDeviceSetting@@U?$THashTraits@VFName@@@@U?$TValueTraits@UMidiDeviceSetting@@@@@@A:BYTE ; MidiDevices + Line 552: EXTRN ?M_Random@@3VFRandom@@A:BYTE ; M_Random + Line 553: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 554: EXTRN ?netgame@@3_NA:BYTE ; netgame + Line 555: EXTRN ?snd_musicvolume@@3VFFloatCVar@@A:BYTE ; snd_musicvolume + Line 556: EXTRN ?paused@@3HA:DWORD ; paused + Line 557: EXTRN ?pauseext@@3_NA:BYTE ; pauseext + Line 558: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 559: EXTRN ?compatflags@@3VFIntCVar@@A:BYTE ; compatflags + Line 560: EXTRN ?compatflags2@@3VFIntCVar@@A:BYTE ; compatflags2 + Line 561: EXTRN ?CleanYfac@@3HA:DWORD ; CleanYfac + Line 562: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 563: EXTRN ?SmallFont@@3PEAVFFont@@EA:QWORD ; SmallFont + Line 564: EXTRN ?savegamerestore@@3_NA:BYTE ; savegamerestore + Line 565: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 566: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 567: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 568: EXTRN ?save_full@@3_NA:BYTE ; save_full + Line 569: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 570: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 571: EXTRN ?gamestate@@3W4gamestate_t@@A:DWORD ; gamestate + Line 572: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\sbar_mugshot.cod (27 hits) + Line 52: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 53: EXTRN atexit:PROC + Line 54: EXTRN __std_terminate:PROC + Line 55: EXTRN strchr:PROC + Line 56: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 57: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 58: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_K_N@Z:PROC ; FName::NameManager::FindName + Line 59: EXTRN ??0FString@@QEAA@PEBD_K@Z:PROC ; FString::FString + Line 60: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 61: EXTRN ?LockBuffer@FString@@QEAAPEADXZ:PROC ; FString::LockBuffer + Line 62: EXTRN ?UnlockBuffer@FString@@QEAAXXZ:PROC ; FString::UnlockBuffer + Line 63: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 64: EXTRN ??YFString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator+= + Line 65: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 66: EXTRN c_atan2:PROC + Line 67: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 68: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 69: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 70: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 71: EXTRN ?CheckForTexture@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::CheckForTexture + Line 72: EXTRN __CxxFrameHandler3:PROC + Line 73: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 74: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 75: EXTRN ?M_Random@@3VFRandom@@A:BYTE ; M_Random + Line 76: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 77: EXTRN ?Skins@@3V?$TArray@VFPlayerSkin@@V1@@@A:BYTE ; Skins + Line 78: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\sbarinfo.cod (157 hits) + Line 89: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 90: EXTRN ?automapactive@@3_NA:BYTE ; automapactive + Line 808: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 809: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 810: EXTRN _purecall:PROC + Line 811: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 812: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 813: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 814: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 815: EXTRN atexit:PROC + Line 816: EXTRN _Init_thread_header:PROC + Line 817: EXTRN _Init_thread_footer:PROC + Line 818: EXTRN __std_terminate:PROC + Line 819: EXTRN stricmp:PROC + Line 820: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 821: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 822: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 823: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 824: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_K_N@Z:PROC ; FName::NameManager::FindName + Line 825: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 826: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 827: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 828: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 829: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 830: EXTRN ??HFString@@QEBA?AV0@AEBV0@@Z:PROC ; FString::operator+ + Line 831: EXTRN ?ToUpper@FString@@QEAAXXZ:PROC ; FString::ToUpper + Line 832: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 833: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 834: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 835: EXTRN ?FindCVar@@YAPEAVFBaseCVar@@PEBDPEAPEAV1@@Z:PROC ; FindCVar + Line 836: EXTRN ?GetCVar@@YAPEAVFBaseCVar@@PEAVAActor@@PEBD@Z:PROC ; GetCVar + Line 837: EXTRN ?StringWidth@FFont@@QEBAHPEBE@Z:PROC ; FFont::StringWidth + Line 838: EXTRN ?V_ParseFontColor@@YA?AW4EColorRange@@AEAPEBEHH@Z:PROC ; V_ParseFontColor + Line 839: EXTRN ?V_GetFont@@YAPEAVFFont@@PEBD@Z:PROC ; V_GetFont + Line 840: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 841: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 842: EXTRN ?atterm@@YAXP6AXXZ@Z:PROC ; atterm + Line 843: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 844: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 845: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 846: EXTRN ?FindFunction@PClass@@SAXPEAPEAVVMFunction@@VFName@@1@Z:PROC ; PClass::FindFunction + Line 847: EXTRN ?FindTexture@FTextureManager@@QEAAPEAVFTexture@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::FindTexture + Line 848: EXTRN ?Clear@DFrameBuffer@@QEAAXHHHHHI@Z:PROC ; DFrameBuffer::Clear + Line 849: EXTRN ?DrawTexture@DFrameBuffer@@QEAAXPEAVFTexture@@NNHZZ:PROC ; DFrameBuffer::DrawTexture + Line 850: EXTRN ?DrawChar@DFrameBuffer@@QEAAXPEAVFFont@@HNNHHZZ:PROC ; DFrameBuffer::DrawChar + Line 851: EXTRN ?ActiveRatio@@YAMHHPEAM@Z:PROC ; ActiveRatio + Line 852: EXTRN ??0FImageCollection@@QEAA@XZ:PROC ; FImageCollection::FImageCollection + Line 853: EXTRN ?Init@FImageCollection@@QEAAXPEAPEBDHW4ETextureType@@@Z:PROC ; FImageCollection::Init + Line 854: EXTRN ?Uninit@FImageCollection@@QEAAXXZ:PROC ; FImageCollection::Uninit + Line 855: EXTRN ??AFImageCollection@@QEBAPEAVFTexture@@H@Z:PROC ; FImageCollection::operator[] + Line 856: EXTRN ?V_BreakLines@@YA?AV?$TArray@UFBrokenLines@@U1@@@PEAVFFont@@HPEBE_N@Z:PROC ; V_BreakLines + Line 857: EXTRN ??0FMugShotFrame@@QEAA@XZ:PROC ; FMugShotFrame::FMugShotFrame + Line 858: EXTRN ??1FMugShotFrame@@QEAA@XZ:PROC ; FMugShotFrame::~FMugShotFrame + Line 859: EXTRN ??0FMugShotState@@QEAA@VFName@@@Z:PROC ; FMugShotState::FMugShotState + Line 860: EXTRN ?GetFace@FMugShot@@QEAAPEAVFTexture@@PEAVplayer_t@@PEBDHW4StateFlags@1@@Z:PROC ; FMugShot::GetFace + Line 861: EXTRN ?FindMugShotStateIndex@@YAHVFName@@@Z:PROC ; FindMugShotStateIndex + Line 862: EXTRN ?SetSize@DBaseStatusBar@@QEAAXHHHHH@Z:PROC ; DBaseStatusBar::SetSize + Line 863: EXTRN ?GetHUDScale@DBaseStatusBar@@QEBA?AU?$TVector2@N@@XZ:PROC ; DBaseStatusBar::GetHUDScale + Line 864: EXTRN ?StatusbarToRealCoords@DBaseStatusBar@@QEBAXAEAN000@Z:PROC ; DBaseStatusBar::StatusbarToRealCoords + Line 865: EXTRN ?ValidateInvFirst@DBaseStatusBar@@QEBAPEAVAActor@@H@Z:PROC ; DBaseStatusBar::ValidateInvFirst + Line 866: EXTRN ?GetInventoryIcon@@YAHPEAVAActor@@IPEAH@Z:PROC ; GetInventoryIcon + Line 867: EXTRN ?GetWadFullName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetWadFullName + Line 868: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 869: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 870: EXTRN ?FindLump@FWadCollection@@QEAAHPEBDPEAH_N@Z:PROC ; FWadCollection::FindLump + Line 871: EXTRN ?GetLumpFile@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpFile + Line 872: EXTRN ??0FRandom@@QEAA@XZ:PROC ; FRandom::FRandom + Line 873: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 874: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 875: EXTRN ??0FScanner@@QEAA@H@Z:PROC ; FScanner::FScanner + Line 876: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 877: EXTRN ?SetCMode@FScanner@@QEAAX_N@Z:PROC ; FScanner::SetCMode + Line 878: EXTRN ?MustGetToken@FScanner@@QEAAXH@Z:PROC ; FScanner::MustGetToken + Line 879: EXTRN ?CheckToken@FScanner@@QEAA_NH@Z:PROC ; FScanner::CheckToken + Line 880: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 881: EXTRN ?UnGet@FScanner@@QEAAXXZ:PROC ; FScanner::UnGet + Line 882: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 883: EXTRN ?MatchString@FScanner@@QEAAHPEBQEBD_K@Z:PROC ; FScanner::MatchString + Line 884: EXTRN ?MustMatchString@FScanner@@QEAAHPEBQEBD_K@Z:PROC ; FScanner::MustMatchString + Line 885: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 886: EXTRN ?ScriptMessage@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptMessage + Line 887: EXTRN ??0FScriptPosition@@QEAA@AEAVFScanner@@@Z:PROC ; FScriptPosition::FScriptPosition + Line 888: EXTRN ?Message@FScriptPosition@@QEBAXHPEBDZZ:PROC ; FScriptPosition::Message + Line 889: EXTRN ?G_SkillName@@YAPEBDXZ:PROC ; G_SkillName + Line 890: EXTRN ?FindInventory@AActor@@QEAAPEAV1@PEAVPClassActor@@_N@Z:PROC ; AActor::FindInventory + Line 891: EXTRN ?FindInventory@AActor@@QEAAPEAV1@VFName@@_N@Z:PROC ; AActor::FindInventory + Line 892: EXTRN ?GetSpecies@AActor@@QEAA?AVFName@@XZ:PROC ; AActor::GetSpecies + Line 893: EXTRN ?GetTag@AActor@@QEBAPEBDPEBD@Z:PROC ; AActor::GetTag + Line 894: EXTRN ?GetPrintableDisplayName@@YA?AVFString@@PEAVPClassActor@@@Z:PROC ; GetPrintableDisplayName + Line 895: EXTRN ?LookupString@FBehaviorContainer@@QEAAPEBDI@Z:PROC ; FBehaviorContainer::LookupString + Line 896: EXTRN ??AFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator[] + Line 897: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 898: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 899: EXTRN ??_ESBarInfoCommand@@UEAAPEAXI@Z:PROC ; SBarInfoCommand::`vector deleting destructor' + Line 900: EXTRN ??_ESBarInfoCommandFlowControl@@UEAAPEAXI@Z:PROC ; SBarInfoCommandFlowControl::`vector deleting destructor' + Line 901: EXTRN ??_ESBarInfoNegatableFlowControl@@UEAAPEAXI@Z:PROC ; SBarInfoNegatableFlowControl::`vector deleting destructor' + Line 902: EXTRN ??_ESBarInfoMainBlock@@UEAAPEAXI@Z:PROC ; SBarInfoMainBlock::`vector deleting destructor' + Line 903: EXTRN ??_ECommandDrawImage@@UEAAPEAXI@Z:PROC ; CommandDrawImage::`vector deleting destructor' + Line 904: EXTRN ??_ECommandDrawSwitchableImage@@UEAAPEAXI@Z:PROC ; CommandDrawSwitchableImage::`vector deleting destructor' + Line 905: EXTRN ??_ECommandDrawString@@UEAAPEAXI@Z:PROC ; CommandDrawString::`vector deleting destructor' + Line 906: EXTRN ??_ECommandDrawNumber@@UEAAPEAXI@Z:PROC ; CommandDrawNumber::`vector deleting destructor' + Line 907: EXTRN ??_ECommandDrawMugShot@@UEAAPEAXI@Z:PROC ; CommandDrawMugShot::`vector deleting destructor' + Line 908: EXTRN ??_ECommandDrawSelectedInventory@@UEAAPEAXI@Z:PROC ; CommandDrawSelectedInventory::`vector deleting destructor' + Line 909: EXTRN ??_ECommandGameMode@@UEAAPEAXI@Z:PROC ; CommandGameMode::`vector deleting destructor' + Line 910: EXTRN ??_ECommandUsesAmmo@@UEAAPEAXI@Z:PROC ; CommandUsesAmmo::`vector deleting destructor' + Line 911: EXTRN ??_ECommandUsesSecondaryAmmo@@UEAAPEAXI@Z:PROC ; CommandUsesSecondaryAmmo::`vector deleting destructor' + Line 912: EXTRN ??_ECommandInventoryBarNotVisible@@UEAAPEAXI@Z:PROC ; CommandInventoryBarNotVisible::`vector deleting destructor' + Line 913: EXTRN ??_ECommandAspectRatio@@UEAAPEAXI@Z:PROC ; CommandAspectRatio::`vector deleting destructor' + Line 914: EXTRN ??_ECommandDrawShader@@UEAAPEAXI@Z:PROC ; CommandDrawShader::`vector deleting destructor' + Line 915: EXTRN ??_ECommandDrawInventoryBar@@UEAAPEAXI@Z:PROC ; CommandDrawInventoryBar::`vector deleting destructor' + Line 916: EXTRN ??_ECommandDrawKeyBar@@UEAAPEAXI@Z:PROC ; CommandDrawKeyBar::`vector deleting destructor' + Line 917: EXTRN ??_ECommandDrawBar@@UEAAPEAXI@Z:PROC ; CommandDrawBar::`vector deleting destructor' + Line 918: EXTRN ??_ECommandIsSelected@@UEAAPEAXI@Z:PROC ; CommandIsSelected::`vector deleting destructor' + Line 919: EXTRN ??_ECommandPlayerClass@@UEAAPEAXI@Z:PROC ; CommandPlayerClass::`vector deleting destructor' + Line 920: EXTRN ??_ECommandPlayerType@@UEAAPEAXI@Z:PROC ; CommandPlayerType::`vector deleting destructor' + Line 921: EXTRN ??_ECommandHasWeaponPiece@@UEAAPEAXI@Z:PROC ; CommandHasWeaponPiece::`vector deleting destructor' + Line 922: EXTRN ??_ECommandDrawGem@@UEAAPEAXI@Z:PROC ; CommandDrawGem::`vector deleting destructor' + Line 923: EXTRN ??_ECommandWeaponAmmo@@UEAAPEAXI@Z:PROC ; CommandWeaponAmmo::`vector deleting destructor' + Line 924: EXTRN ??_ECommandInInventory@@UEAAPEAXI@Z:PROC ; CommandInInventory::`vector deleting destructor' + Line 925: EXTRN ??_ECommandAlpha@@UEAAPEAXI@Z:PROC ; CommandAlpha::`vector deleting destructor' + Line 926: EXTRN ??_ECommandIfHealth@@UEAAPEAXI@Z:PROC ; CommandIfHealth::`vector deleting destructor' + Line 927: EXTRN ??_ECommandIfInvulnerable@@UEAAPEAXI@Z:PROC ; CommandIfInvulnerable::`vector deleting destructor' + Line 928: EXTRN ??_ECommandIfWaterLevel@@UEAAPEAXI@Z:PROC ; CommandIfWaterLevel::`vector deleting destructor' + Line 929: EXTRN ??_ECommandIfCVarInt@@UEAAPEAXI@Z:PROC ; CommandIfCVarInt::`vector deleting destructor' + Line 930: EXTRN __CxxFrameHandler3:PROC + Line 931: EXTRN ceil:PROC + Line 932: EXTRN memmove:PROC + Line 933: EXTRN pow:PROC + Line 934: EXTRN _Init_thread_epoch:DWORD + Line 935: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 936: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 937: EXTRN ?batchrun@@3_NA:BYTE ; batchrun + Line 938: EXTRN ?multiplayer@@3_NA:BYTE ; multiplayer + Line 939: EXTRN ?deathmatch@@3VFIntCVar@@A:BYTE ; deathmatch + Line 940: EXTRN ?teamplay@@3VFBoolCVar@@A:BYTE ; teamplay + Line 941: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 942: EXTRN ?NumTextColors@@3HA:DWORD ; NumTextColors + Line 943: EXTRN ?SmallFont@@3PEAVFFont@@EA:QWORD ; SmallFont + Line 944: EXTRN ?GPalette@@3UFPalette@@A:BYTE ; GPalette + Line 945: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 946: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 947: EXTRN ?MugShotStates@@3V?$TArray@UFMugShotState@@U1@@@A:BYTE ; MugShotStates + Line 948: EXTRN ?StatusBar@@3PEAVDBaseStatusBar@@EA:QWORD ; StatusBar + Line 949: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 950: EXTRN ?AllActorClasses@PClassActor@@2V?$TArray@PEAVPClassActor@@PEAV1@@@A:BYTE ; PClassActor::AllActorClasses + Line 951: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 952: EXTRN ?PlayerClasses@@3V?$TArray@VFPlayerClass@@V1@@@A:BYTE ; PlayerClasses + Line 953: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 954: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 955: EXTRN ?ACS_GlobalVars@@3U?$BoundsCheckingArray@H$0EA@@@A:BYTE ; ACS_GlobalVars + Line 956: EXTRN ?ACS_GlobalArrays@@3U?$BoundsCheckingArray@V?$TMap@HHU?$THashTraits@H@@UInitIntToZero@@@@$0EA@@@A:BYTE ; ACS_GlobalArrays + Line 957: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 958: EXTRN ?fraglimit@@3VFIntCVar@@A:BYTE ; fraglimit + Line 959: EXTRN ?vid_fps@@3VFBoolCVar@@A:BYTE ; vid_fps + Line 960: EXTRN __ImageBase:BYTE + Line 961: EXTRN _fltused:DWORD + Line 962: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\sbkconv.cod (5 hits) + Line 21: EXTRN __acrt_iob_func:PROC + Line 22: EXTRN __stdio_common_vfprintf:PROC + Line 23: EXTRN log:PROC + Line 24: EXTRN log10:PROC + Line 25: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\sc_man.cod (43 hits) + Line 263: EXTRN atexit:PROC + Line 264: EXTRN __std_terminate:PROC + Line 265: EXTRN strtod:PROC + Line 266: EXTRN strtoll:PROC + Line 267: EXTRN strtoull:PROC + Line 268: EXTRN stricmp:PROC + Line 269: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 270: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 271: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_K_N@Z:PROC ; FName::NameManager::FindName + Line 272: EXTRN ??0FString@@QEAA@PEBD_K@Z:PROC ; FString::FString + Line 273: EXTRN ??0FString@@QEAA@D@Z:PROC ; FString::FString + Line 274: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 275: EXTRN ?LockBuffer@FString@@QEAAPEADXZ:PROC ; FString::LockBuffer + Line 276: EXTRN ?UnlockBuffer@FString@@QEAAXXZ:PROC ; FString::UnlockBuffer + Line 277: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 278: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 279: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 280: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 281: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 282: EXTRN ?AppendCStrPart@FString@@QEAAAEAV1@PEBD_K@Z:PROC ; FString::AppendCStrPart + Line 283: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 284: EXTRN ?VFormat@FString@@QEAAXPEBDPEAD@Z:PROC ; FString::VFormat + Line 285: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 286: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 287: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 288: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 289: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 290: EXTRN ?OpenFile@FileReader@@QEAA_NPEBD_J1@Z:PROC ; FileReader::OpenFile + Line 291: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 292: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 293: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 294: EXTRN ?GetLumpFullPath@FWadCollection@@QEBA?AVFString@@H@Z:PROC ; FWadCollection::GetLumpFullPath + Line 295: EXTRN ?strbin@@YAHPEAD@Z:PROC ; strbin + Line 296: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 297: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 298: EXTRN __CxxFrameHandler3:PROC + Line 299: EXTRN memcpy:PROC + Line 300: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 301: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 302: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 303: EXTRN ?developer@@3VFIntCVar@@A:BYTE ; developer + Line 304: EXTRN __ImageBase:BYTE + Line 305: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\scopebarrier.cod (6 hits) + Line 35: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 36: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 37: EXTRN ?ThrowAbortException@@YAXW4EVMAbortException@@PEBDZZ:PROC ; ThrowAbortException + Line 38: EXTRN __CxxFrameHandler3:PROC + Line 39: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 40: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\scriptutil.cod (12 hits) + Line 19: EXTRN atexit:PROC + Line 20: EXTRN __std_terminate:PROC + Line 21: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 22: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 23: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 24: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 25: EXTRN ?FindFunction@PClass@@SAPEAVVMFunction@@VFName@@0@Z:PROC ; PClass::FindFunction + Line 26: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 27: EXTRN _CxxThrowException:PROC + Line 28: EXTRN __CxxFrameHandler3:PROC + Line 29: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 30: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\serializer.cod (65 hits) + Line 224: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 225: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 226: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 227: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 228: EXTRN atexit:PROC + Line 229: EXTRN _Init_thread_header:PROC + Line 230: EXTRN _Init_thread_footer:PROC + Line 231: EXTRN __std_terminate:PROC + Line 232: EXTRN free:PROC + Line 233: EXTRN malloc:PROC + Line 234: EXTRN realloc:PROC + Line 235: EXTRN deflate:PROC + Line 236: EXTRN deflateEnd:PROC + Line 237: EXTRN crc32:PROC + Line 238: EXTRN deflateInit2_:PROC + Line 239: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 240: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 241: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 242: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 243: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_K_N@Z:PROC ; FName::NameManager::FindName + Line 244: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 245: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 246: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 247: EXTRN ?Decompress@FCompressedBuffer@@QEAA_NPEAD@Z:PROC ; FCompressedBuffer::Decompress + Line 248: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 249: EXTRN ?SerializeUserVars@DObject@@QEAAXAEAVFSerializer@@@Z:PROC ; DObject::SerializeUserVars + Line 250: EXTRN ?CheckIfSerialized@DObject@@QEBAXXZ:PROC ; DObject::CheckIfSerialized + Line 251: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 252: EXTRN ?Alloc@FSharedStringArena@@QEAAPEAVFString@@PEBD@Z:PROC ; FSharedStringArena::Alloc + Line 253: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 254: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 255: EXTRN ?GetLinkedTexture@FWadCollection@@QEAAPEAVFTexture@@H@Z:PROC ; FWadCollection::GetLinkedTexture + Line 256: EXTRN ?GetLumpFullName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetLumpFullName + Line 257: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 258: EXTRN ?GetTextureID@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::GetTextureID + Line 259: EXTRN ?P_FindTerrain@@YAHVFName@@@Z:PROC ; P_FindTerrain + Line 260: EXTRN ?P_GetTerrainName@@YA?AVFName@@H@Z:PROC ; P_GetTerrainName + Line 261: EXTRN ?StaticFindStateOwner@FState@@SAPEAVPClassActor@@PEBU1@@Z:PROC ; FState::StaticFindStateOwner + Line 262: EXTRN ?V_GetFont@@YAPEAVFFont@@PEBD@Z:PROC ; V_GetFont + Line 263: EXTRN ?copystring@@YAPEADPEBD@Z:PROC ; copystring + Line 264: EXTRN _CxxThrowException:PROC + Line 265: EXTRN __CxxFrameHandler3:PROC + Line 266: EXTRN __chkstk:PROC + Line 267: EXTRN memcmp:PROC + Line 268: EXTRN memcpy:PROC + Line 269: EXTRN memmove:PROC + Line 270: EXTRN memset:PROC + Line 271: EXTRN _Init_thread_epoch:DWORD + Line 272: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 273: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 274: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 275: EXTRN ?sprites@@3V?$TArray@Uspritedef_t@@U1@@@A:BYTE ; sprites + Line 276: EXTRN ?NumStdSprites@@3IA:DWORD ; NumStdSprites + Line 277: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 278: EXTRN ?S_sfx@@3V?$TArray@Usfxinfo_t@@U1@@@A:BYTE ; S_sfx + Line 279: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 280: EXTRN ?RegistrationInfo@DThinker@@2UClassReg@@A:BYTE ; DThinker::RegistrationInfo + Line 281: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 282: EXTRN ?mStringPropertyData@AActor@@2VFSharedStringArena@@A:BYTE ; AActor::mStringPropertyData + Line 283: EXTRN ?WP_NOCHANGE@@3PEAVAActor@@EA:QWORD ; WP_NOCHANGE + Line 284: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 285: EXTRN ?SmallFont@@3PEAVFFont@@EA:QWORD ; SmallFont + Line 286: EXTRN __ImageBase:BYTE + Line 287: EXTRN _fltused:DWORD + Line 288: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\sffile.cod (9 hits) + Line 68: EXTRN free:PROC + Line 69: EXTRN strncmp:PROC + Line 70: EXTRN ?ctl_cmsg@TimidityPlus@@YAXHHPEBDZZ:PROC ; TimidityPlus::ctl_cmsg + Line 71: EXTRN ?skip@TimidityPlus@@YAXPEAUtimidity_file@1@_K@Z:PROC ; TimidityPlus::skip + Line 72: EXTRN ?tf_read@TimidityPlus@@YAJPEAXHHPEAUtimidity_file@1@@Z:PROC ; TimidityPlus::tf_read + Line 73: EXTRN ?tf_tell@TimidityPlus@@YAJPEAUtimidity_file@1@@Z:PROC ; TimidityPlus::tf_tell + Line 74: EXTRN ?safe_malloc@TimidityPlus@@YAPEAX_K@Z:PROC ; TimidityPlus::safe_malloc + Line 75: EXTRN memcpy:PROC + Line 76: EXTRN __ImageBase:BYTE + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\SFMT.cod (1 hit) + Line 19: EXTRN memset:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\shadertexture.cod (20 hits) + Line 20: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 21: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 22: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 23: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 24: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 25: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 26: EXTRN ??0FStringf@@QEAA@PEBDZZ:PROC ; FStringf::FStringf + Line 27: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 28: EXTRN ?CopyPixelData@FBitmap@@QEAAXHHPEBEHHHHHPEAUPalEntry@@PEAUFCopyInfo@@@Z:PROC ; FBitmap::CopyPixelData + Line 29: EXTRN ?CreatePalettedPixels@FImageSource@@MEAA?AV?$TArray@EE@@H@Z:PROC ; FImageSource::CreatePalettedPixels + Line 30: EXTRN ?CopyPixels@FImageSource@@MEAAHPEAVFBitmap@@H@Z:PROC ; FImageSource::CopyPixels + Line 31: EXTRN ?CollectForPrecache@FImageSource@@UEAAXAEAV?$TMap@HU?$pair@HH@std@@U?$THashTraits@H@@U?$TValueTraits@U?$pair@HH@std@@@@@@_N@Z:PROC ; FImageSource::CollectForPrecache + Line 32: EXTRN ??_EFImageSource@@UEAAPEAXI@Z:PROC ; FImageSource::`vector deleting destructor' + Line 33: EXTRN ??0FImageTexture@@QEAA@PEAVFImageSource@@PEBD@Z:PROC ; FImageTexture::FImageTexture + Line 34: EXTRN ??_EFBarShader@@UEAAPEAXI@Z:PROC ; FBarShader::`vector deleting destructor' + Line 35: EXTRN __CxxFrameHandler3:PROC + Line 36: EXTRN ?translationtables@@3PAV?$TAutoGrowArray@VFRemapTablePtr@@PEAUFRemapTable@@@@A:BYTE ; translationtables + Line 37: EXTRN ?GrayMap@ImageHelpers@@3PAEA:BYTE ; ImageHelpers::GrayMap + Line 38: EXTRN ?ImageArena@FImageSource@@1VFMemArena@@A:BYTE ; FImageSource::ImageArena + Line 39: EXTRN ?NextID@FImageSource@@1HA:DWORD ; FImageSource::NextID + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\shared_hud.cod (15 hits) + Line 201: EXTRN atexit:PROC + Line 202: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 203: EXTRN ?FindFunction@PClass@@SAXPEAPEAVVMFunction@@VFName@@1@Z:PROC ; PClass::FindFunction + Line 204: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 205: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 206: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 207: EXTRN ?GetUIScale@@YAHH@Z:PROC ; GetUIScale + Line 208: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 209: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 210: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 211: EXTRN ?StatusBar@@3PEAVDBaseStatusBar@@EA:QWORD ; StatusBar + Line 212: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 213: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 214: EXTRN ?hud_aspectscale@@3VFBoolCVar@@A:BYTE ; hud_aspectscale + Line 215: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\shared_sbar.cod (117 hits) + Line 35: EXTRN ?setsizeneeded@@3_NA:BYTE ; setsizeneeded + Line 36: EXTRN ?RegistrationInfo@DObject@@2UClassReg@@A:BYTE ; DObject::RegistrationInfo + Line 284: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 285: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 286: EXTRN atexit:PROC + Line 287: EXTRN __std_terminate:PROC + Line 288: EXTRN atoi:PROC + Line 289: EXTRN __stdio_common_vfprintf:PROC + Line 290: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 291: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 292: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 293: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 294: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 295: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 296: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 297: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 298: EXTRN mysnprintf:PROC + Line 299: EXTRN ?Barrier@GC@@YAXPEAVDObject@@0@Z:PROC ; GC::Barrier + Line 300: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 301: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 302: EXTRN ??1DObject@@UEAA@XZ:PROC ; DObject::~DObject + Line 303: EXTRN ?Serialize@DObject@@UEAAXAEAVFSerializer@@@Z:PROC ; DObject::Serialize + Line 304: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 305: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 306: EXTRN ?PropagateMark@DObject@@UEAA_KXZ:PROC ; DObject::PropagateMark + Line 307: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 308: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 309: EXTRN ?FindFunction@PClass@@SAPEAVVMFunction@@VFName@@0@Z:PROC ; PClass::FindFunction + Line 310: EXTRN ?FindFunction@PClass@@SAXPEAPEAVVMFunction@@VFName@@1@Z:PROC ; PClass::FindFunction + Line 311: EXTRN ?StringWidth@FFont@@QEBAHPEBE@Z:PROC ; FFont::StringWidth + Line 312: EXTRN ?V_ParseFontColor@@YA?AW4EColorRange@@AEAPEBEHH@Z:PROC ; V_ParseFontColor + Line 313: EXTRN ?V_BreakLines@@YA?AV?$TArray@UFBrokenLines@@U1@@@PEAVFFont@@HPEBE_N@Z:PROC ; V_BreakLines + Line 314: EXTRN ?CallTick@DHUDMessageBase@@QEAA_NXZ:PROC ; DHUDMessageBase::CallTick + Line 315: EXTRN ?CallScreenSizeChanged@DHUDMessageBase@@QEAAXXZ:PROC ; DHUDMessageBase::CallScreenSizeChanged + Line 316: EXTRN ?CallDraw@DHUDMessageBase@@QEAAXHH@Z:PROC ; DHUDMessageBase::CallDraw + Line 317: EXTRN ??0DHUDMessageFadeOut@@QEAA@PEAVFFont@@PEBDMMHHW4EColorRange@@MM@Z:PROC ; DHUDMessageFadeOut::DHUDMessageFadeOut + Line 318: EXTRN ??0FMugShot@@QEAA@XZ:PROC ; FMugShot::FMugShot + Line 319: EXTRN ?Reset@FMugShot@@QEAAXXZ:PROC ; FMugShot::Reset + Line 320: EXTRN ?Tick@FMugShot@@QEAAXPEAVplayer_t@@@Z:PROC ; FMugShot::Tick + Line 321: EXTRN ??_EDBaseStatusBar@@UEAAPEAXI@Z:PROC ; DBaseStatusBar::`vector deleting destructor' + Line 322: EXTRN ?CreateCustomStatusBar@@YAPEAVDBaseStatusBar@@H@Z:PROC ; CreateCustomStatusBar + Line 323: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 324: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 325: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 326: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 327: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 328: EXTRN ??0FColorCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FColorCVar::FColorCVar + Line 329: EXTRN ??0FFlagCVar@@QEAA@PEBDAEAVFIntCVar@@I@Z:PROC ; FFlagCVar::FFlagCVar + Line 330: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 331: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 332: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 333: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 334: EXTRN ?CheckForTexture@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::CheckForTexture + Line 335: EXTRN ?GetTextureID@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::GetTextureID + Line 336: EXTRN ?V_CalcCleanFacs@@YAXHHHHPEAH000@Z:PROC ; V_CalcCleanFacs + Line 337: EXTRN ?SetClipRect@DFrameBuffer@@QEAAXHHHH@Z:PROC ; DFrameBuffer::SetClipRect + Line 338: EXTRN ?Dim@DFrameBuffer@@QEAAXUPalEntry@@MHHHHPEATFRenderStyle@@@Z:PROC ; DFrameBuffer::Dim + Line 339: EXTRN ?FlatFill@DFrameBuffer@@QEAAXHHHHPEAVFTexture@@_N@Z:PROC ; DFrameBuffer::FlatFill + Line 340: EXTRN ?DrawTexture@DFrameBuffer@@QEAAXPEAVFTexture@@NNHZZ:PROC ; DFrameBuffer::DrawTexture + Line 341: EXTRN ?VirtualToRealCoords@DFrameBuffer@@QEBAXAEAN000NN_N1@Z:PROC ; DFrameBuffer::VirtualToRealCoords + Line 342: EXTRN ?DrawText@DFrameBuffer@@QEAAXPEAVFFont@@HNNPEBDHZZ:PROC ; DFrameBuffer::DrawText + Line 343: EXTRN ?DrawChar@DFrameBuffer@@QEAAXPEAVFFont@@HNNHHZZ:PROC ; DFrameBuffer::DrawChar + Line 344: EXTRN ?DrawFrame@DFrameBuffer@@QEAAXHHHH@Z:PROC ; DFrameBuffer::DrawFrame + Line 345: EXTRN ?DrawBorder@DFrameBuffer@@QEAAXVFTextureID@@HHHH@Z:PROC ; DFrameBuffer::DrawBorder + Line 346: EXTRN ?ActiveRatio@@YAMHHPEAM@Z:PROC ; ActiveRatio + Line 347: EXTRN ?AspectTallerThanWide@@YA_NM@Z:PROC ; AspectTallerThanWide + Line 348: EXTRN ?GetUIScale@@YAHH@Z:PROC ; GetUIScale + Line 349: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 350: EXTRN ?GetLumpFile@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpFile + Line 351: EXTRN ?S_NoiseDebug@@YAXXZ:PROC ; S_NoiseDebug + Line 352: EXTRN ?FindState@PClassActor@@QEBAPEAUFState@@HPEAVFName@@_N@Z:PROC ; PClassActor::FindState + Line 353: EXTRN ?ArraySize@FSerializer@@QEAAIXZ:PROC ; FSerializer::ArraySize + Line 354: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 355: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 356: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 357: EXTRN ?ThrowAbortException@@YAXW4EVMAbortException@@PEBDZZ:PROC ; ThrowAbortException + Line 358: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 359: EXTRN ?GetVirtualIndex@@YAIPEAVPClass@@PEBD@Z:PROC ; GetVirtualIndex + Line 360: EXTRN ?E_RenderOverlay@@YAXW4EHudState@@@Z:PROC ; E_RenderOverlay + Line 361: EXTRN __CxxFrameHandler3:PROC + Line 362: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 363: EXTRN ?State@GC@@3W4EGCState@1@A:DWORD ; GC::State + Line 364: EXTRN ?NumTextColors@@3HA:DWORD ; NumTextColors + Line 365: EXTRN ?SmallFont@@3PEAVFFont@@EA:QWORD ; SmallFont + Line 366: EXTRN ?RegistrationInfo@DHUDMessageFadeOut@@2UClassReg@@A:BYTE ; DHUDMessageFadeOut::RegistrationInfo + Line 367: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 368: EXTRN ?CleanXfac@@3HA:DWORD ; CleanXfac + Line 369: EXTRN ?CleanYfac@@3HA:DWORD ; CleanYfac + Line 370: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 371: EXTRN ?con_scaletext@@3VFIntCVar@@A:BYTE ; con_scaletext + Line 372: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 373: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 374: EXTRN ?netgame@@3_NA:BYTE ; netgame + Line 375: EXTRN ?automapactive@@3_NA:BYTE ; automapactive + Line 376: EXTRN ?viewactive@@3_NA:BYTE ; viewactive + Line 377: EXTRN ?viewwindowx@@3HA:DWORD ; viewwindowx + Line 378: EXTRN ?viewwindowy@@3HA:DWORD ; viewwindowy + Line 379: EXTRN ?viewheight@@3HA:DWORD ; viewheight + Line 380: EXTRN ?viewwidth@@3HA:DWORD ; viewwidth + Line 381: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 382: EXTRN ?demoplayback@@3_NA:BYTE ; demoplayback + Line 383: EXTRN ?demover@@3HA:DWORD ; demover + Line 384: EXTRN ?playeringame@@3PA_NA:BYTE ; playeringame + Line 385: EXTRN ?debugfile@@3PEAU_iobuf@@EA:QWORD ; debugfile + Line 386: EXTRN ?ticdup@@3HA:DWORD ; ticdup + Line 387: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 388: EXTRN ?save_full@@3_NA:BYTE ; save_full + Line 389: EXTRN ?SpriteFrames@@3V?$TArray@Uspriteframe_t@@U1@@@A:BYTE ; SpriteFrames + Line 390: EXTRN ?sprites@@3V?$TArray@Uspritedef_t@@U1@@@A:BYTE ; sprites + Line 391: EXTRN ?r_viewpoint@@3UFRenderViewpoint@@A:BYTE ; r_viewpoint + Line 392: EXTRN ?setblocks@@3HA:DWORD ; setblocks + Line 393: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 394: EXTRN ?SBarInfoScript@@3PAPEAUSBarInfo@@A:BYTE ; SBarInfoScript + Line 395: EXTRN ?gamestate@@3W4gamestate_t@@A:DWORD ; gamestate + Line 396: EXTRN ?noisedebug@@3VFBoolCVar@@A:BYTE ; noisedebug + Line 397: EXTRN ?vid_fps@@3VFBoolCVar@@A:BYTE ; vid_fps + Line 398: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\sin.cod (9 hits) + Line 16: EXTRN mtherr:PROC + Line 17: EXTRN polevl:PROC + Line 18: EXTRN ldexp:PROC + Line 19: EXTRN isnan:PROC + Line 20: EXTRN isfinite:PROC + Line 21: EXTRN floor:PROC + Line 22: EXTRN PIO4:QWORD + Line 23: EXTRN NAN:QWORD + Line 24: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\sinh.cod (9 hits) + Line 14: EXTRN mtherr:PROC + Line 15: EXTRN c_exp:PROC + Line 16: EXTRN polevl:PROC + Line 17: EXTRN p1evl:PROC + Line 18: EXTRN INFINITY:QWORD + Line 19: EXTRN MINLOG:QWORD + Line 20: EXTRN MAXLOG:QWORD + Line 21: EXTRN LOGE2:QWORD + Line 22: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\skyboxtexture.cod (9 hits) + Line 16: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 17: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 18: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 19: EXTRN ??1FTexture@@UEAA@XZ:PROC ; FTexture::~FTexture + Line 20: EXTRN ??0FTexture@@IEAA@PEBDH@Z:PROC ; FTexture::FTexture + Line 21: EXTRN ?CheckForTexture@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::CheckForTexture + Line 22: EXTRN ??_EFSkyBox@@UEAAPEAXI@Z:PROC ; FSkyBox::`vector deleting destructor' + Line 23: EXTRN __CxxFrameHandler3:PROC + Line 24: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\slopes.cod (15 hits) + Line 38: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 39: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 40: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 41: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 42: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 43: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 44: EXTRN c_sqrt:PROC + Line 45: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 46: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 47: EXTRN ?Next@FSectorTagIterator@@QEAAHXZ:PROC ; FSectorTagIterator::Next + Line 48: EXTRN ?Next@FLineIdIterator@@QEAAHXZ:PROC ; FLineIdIterator::Next + Line 49: EXTRN ?PointInSubsector@FLevelLocals@@AEAAPEAUsubsector_t@@NN@Z:PROC ; FLevelLocals::PointInSubsector + Line 50: EXTRN __CxxFrameHandler3:PROC + Line 51: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 52: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\smplfile.cod (21 hits) + Line 74: EXTRN free:PROC + Line 75: EXTRN malloc:PROC + Line 76: EXTRN strrchr:PROC + Line 77: EXTRN _stricmp:PROC + Line 78: EXTRN strdup:PROC + Line 79: EXTRN ldexp:PROC + Line 80: EXTRN ?ctl_cmsg@TimidityPlus@@YAXHHPEBDZZ:PROC ; TimidityPlus::ctl_cmsg + Line 81: EXTRN ?open_file@TimidityPlus@@YAPEAUtimidity_file@1@PEBDPEAVFSoundFontReader@@@Z:PROC ; TimidityPlus::open_file + Line 82: EXTRN ?tf_close@TimidityPlus@@YAXPEAUtimidity_file@1@@Z:PROC ; TimidityPlus::tf_close + Line 83: EXTRN ?tf_read@TimidityPlus@@YAJPEAXHHPEAUtimidity_file@1@@Z:PROC ; TimidityPlus::tf_read + Line 84: EXTRN ?tf_seek@TimidityPlus@@YAJPEAUtimidity_file@1@JH@Z:PROC ; TimidityPlus::tf_seek + Line 85: EXTRN ?tf_tell@TimidityPlus@@YAJPEAUtimidity_file@1@@Z:PROC ; TimidityPlus::tf_tell + Line 86: EXTRN ?safe_malloc@TimidityPlus@@YAPEAX_K@Z:PROC ; TimidityPlus::safe_malloc + Line 87: EXTRN ?convert_envelope_offset@Instruments@TimidityPlus@@AEAAHE@Z:PROC ; TimidityPlus::Instruments::convert_envelope_offset + Line 88: EXTRN ?free_instrument@Instruments@TimidityPlus@@QEAAXPEAUInstrument@2@@Z:PROC ; TimidityPlus::Instruments::free_instrument + Line 89: EXTRN ?pre_resample@TimidityPlus@@YAXPEAUSample@1@@Z:PROC ; TimidityPlus::pre_resample + Line 90: EXTRN pow:PROC + Line 91: EXTRN ?playback_rate@TimidityPlus@@3HA:DWORD ; TimidityPlus::playback_rate + Line 92: EXTRN ?control_ratio@TimidityPlus@@3HA:DWORD ; TimidityPlus::control_ratio + Line 93: EXTRN ?freq_table@TimidityPlus@@3PAHA:BYTE ; TimidityPlus::freq_table + Line 94: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\sndfile_decoder.cod (15 hits) + Line 63: EXTRN _purecall:PROC + Line 64: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 65: EXTRN atexit:PROC + Line 66: EXTRN __std_terminate:PROC + Line 67: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 68: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 69: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 70: EXTRN ?readAll@SoundDecoder@@UEAA?AV?$TArray@EE@@XZ:PROC ; SoundDecoder::readAll + Line 71: EXTRN ??_ESoundDecoder@@UEAAPEAXI@Z:PROC ; SoundDecoder::`vector deleting destructor' + Line 72: EXTRN ??_ESndFileDecoder@@UEAAPEAXI@Z:PROC ; SndFileDecoder::`vector deleting destructor' + Line 73: EXTRN ?Load@FModule@@QEAA_NV?$initializer_list@PEBD@std@@@Z:PROC ; FModule::Load + Line 74: EXTRN ?Unload@FModule@@QEAAXXZ:PROC ; FModule::Unload + Line 75: EXTRN ?NicePath@@YA?AVFString@@PEBD@Z:PROC ; NicePath + Line 76: EXTRN __CxxFrameHandler3:PROC + Line 77: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\sndfont.cod (37 hits) + Line 80: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 81: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 82: EXTRN free:PROC + Line 83: EXTRN __acrt_iob_func:PROC + Line 84: EXTRN __stdio_common_vfprintf:PROC + Line 85: EXTRN ?ctl_cmsg@TimidityPlus@@YAXHHPEBDZZ:PROC ; TimidityPlus::ctl_cmsg + Line 86: EXTRN ?init_mblock@TimidityPlus@@YAXPEAUMBlockList@1@@Z:PROC ; TimidityPlus::init_mblock + Line 87: EXTRN ?new_segment@TimidityPlus@@YAPEAXPEAUMBlockList@1@_K@Z:PROC ; TimidityPlus::new_segment + Line 88: EXTRN ?reuse_mblock@TimidityPlus@@YAXPEAUMBlockList@1@@Z:PROC ; TimidityPlus::reuse_mblock + Line 89: EXTRN ?strdup_mblock@TimidityPlus@@YAPEADPEAUMBlockList@1@PEBD@Z:PROC ; TimidityPlus::strdup_mblock + Line 90: EXTRN ?open_file@TimidityPlus@@YAPEAUtimidity_file@1@PEBDPEAVFSoundFontReader@@@Z:PROC ; TimidityPlus::open_file + Line 91: EXTRN ?tf_close@TimidityPlus@@YAXPEAUtimidity_file@1@@Z:PROC ; TimidityPlus::tf_close + Line 92: EXTRN ?tf_read@TimidityPlus@@YAJPEAXHHPEAUtimidity_file@1@@Z:PROC ; TimidityPlus::tf_read + Line 93: EXTRN ?tf_seek@TimidityPlus@@YAJPEAUtimidity_file@1@JH@Z:PROC ; TimidityPlus::tf_seek + Line 94: EXTRN ?safe_malloc@TimidityPlus@@YAPEAX_K@Z:PROC ; TimidityPlus::safe_malloc + Line 95: EXTRN ?safe_large_malloc@TimidityPlus@@YAPEAX_K@Z:PROC ; TimidityPlus::safe_large_malloc + Line 96: EXTRN ?sbk_to_sf2@TimidityPlus@@YAHHHPEBU_LayerItem@1@@Z:PROC ; TimidityPlus::sbk_to_sf2 + Line 97: EXTRN ?load_soundfont@Instruments@TimidityPlus@@AEAAHPEAU_SFInfo@2@PEAUtimidity_file@2@@Z:PROC ; TimidityPlus::Instruments::load_soundfont + Line 98: EXTRN ?free_soundfont@Instruments@TimidityPlus@@AEAAXPEAU_SFInfo@2@@Z:PROC ; TimidityPlus::Instruments::free_soundfont + Line 99: EXTRN ?correct_samples@Instruments@TimidityPlus@@AEAAXPEAU_SFInfo@2@@Z:PROC ; TimidityPlus::Instruments::correct_samples + Line 100: EXTRN ?alloc_instrument_bank@Instruments@TimidityPlus@@QEAAXHH@Z:PROC ; TimidityPlus::Instruments::alloc_instrument_bank + Line 101: EXTRN ?assign_pitch_to_freq@TimidityPlus@@YAHM@Z:PROC ; TimidityPlus::assign_pitch_to_freq + Line 102: EXTRN ?freq_fourier@Freq@TimidityPlus@@QEAAMPEAUSample@2@PEAH@Z:PROC ; TimidityPlus::Freq::freq_fourier + Line 103: EXTRN ?pre_resample@TimidityPlus@@YAXPEAUSample@1@@Z:PROC ; TimidityPlus::pre_resample + Line 104: EXTRN __CxxFrameHandler3:PROC + Line 105: EXTRN memset:PROC + Line 106: EXTRN pow:PROC + Line 107: EXTRN ?timidity_surround_chorus@TimidityPlus@@3_NA:BYTE ; TimidityPlus::timidity_surround_chorus + Line 108: EXTRN ?timidity_modulation_envelope@TimidityPlus@@3_NA:BYTE ; TimidityPlus::timidity_modulation_envelope + Line 109: EXTRN ?playback_rate@TimidityPlus@@3HA:DWORD ; TimidityPlus::playback_rate + Line 110: EXTRN ?control_ratio@TimidityPlus@@3HA:DWORD ; TimidityPlus::control_ratio + Line 111: EXTRN ?freq_table@TimidityPlus@@3PAHA:BYTE ; TimidityPlus::freq_table + Line 112: EXTRN ?bend_fine@TimidityPlus@@3PANA:BYTE ; TimidityPlus::bend_fine + Line 113: EXTRN ?bend_coarse@TimidityPlus@@3PANA:BYTE ; TimidityPlus::bend_coarse + Line 114: EXTRN ?cb_to_amp_table@TimidityPlus@@3QBMB:BYTE ; TimidityPlus::cb_to_amp_table + Line 115: EXTRN __ImageBase:BYTE + Line 116: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\sourcedtexture.cod (19 hits) + Line 23: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 24: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 25: EXTRN __std_terminate:PROC + Line 26: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 27: EXTRN ??1FTexture@@UEAA@XZ:PROC ; FTexture::~FTexture + Line 28: EXTRN ?GetColumnBgra@FTexture@@UEAAPEBIIPEAPEBUSpan@1@@Z:PROC ; FTexture::GetColumnBgra + Line 29: EXTRN ?GetPixelsBgra@FTexture@@UEAAPEBIXZ:PROC ; FTexture::GetPixelsBgra + Line 30: EXTRN ?GetRedirect@FTexture@@UEAAPEAV1@_N@Z:PROC ; FTexture::GetRedirect + Line 31: EXTRN ?GetRawTexture@FTexture@@UEAAPEAV1@XZ:PROC ; FTexture::GetRawTexture + Line 32: EXTRN ?Unload@FTexture@@UEAAXXZ:PROC ; FTexture::Unload + Line 33: EXTRN ?FillBuffer@FTexture@@UEAAXPEAEHHW4FTextureFormat@@@Z:PROC ; FTexture::FillBuffer + Line 34: EXTRN ?CheckModified@FTexture@@UEAA_NXZ:PROC ; FTexture::CheckModified + Line 35: EXTRN ?HackHack@FTexture@@UEAAXH@Z:PROC ; FTexture::HackHack + Line 36: EXTRN ??0FTexture@@IEAA@PEBDH@Z:PROC ; FTexture::FTexture + Line 37: EXTRN ?CreateSpans@FTexture@@IEBAPEAPEAUSpan@1@PEBE@Z:PROC ; FTexture::CreateSpans + Line 38: EXTRN ?FreeSpans@FTexture@@IEBAXPEAPEAUSpan@1@@Z:PROC ; FTexture::FreeSpans + Line 39: EXTRN ?CalcBitSize@FTexture@@IEAAXXZ:PROC ; FTexture::CalcBitSize + Line 40: EXTRN ??_EFSourcedTexture@@UEAAPEAXI@Z:PROC ; FSourcedTexture::`vector deleting destructor' + Line 41: EXTRN __CxxFrameHandler3:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\specials.cod (57 hits) + Line 45: EXTRN __std_terminate:PROC + Line 46: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 47: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 48: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 49: EXTRN c_sqrt:PROC + Line 50: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 51: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 52: EXTRN ?P_Recalculate3DFloors@@YAXPEAUsector_t@@@Z:PROC ; P_Recalculate3DFloors + Line 53: EXTRN ?P_Add3DFloor@@YAXPEAUsector_t@@0PEAUline_t@@HH@Z:PROC ; P_Add3DFloor + Line 54: EXTRN ?AdjustFloorClip@@YAXPEBUsector_t@@@Z:PROC ; AdjustFloorClip + Line 55: EXTRN ?Link@FThinkerCollection@@QEAAXPEAVDThinker@@H@Z:PROC ; FThinkerCollection::Link + Line 56: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 57: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 58: EXTRN ?P_SetSectorFriction@@YAXPEAUFLevelLocals@@HH_N@Z:PROC ; P_SetSectorFriction + Line 59: EXTRN ?SectorHasTag@FTagManager@@AEBA_NPEBUsector_t@@H@Z:PROC ; FTagManager::SectorHasTag + Line 60: EXTRN ?GetFirstLineID@FTagManager@@AEBAHPEBUline_t@@@Z:PROC ; FTagManager::GetFirstLineID + Line 61: EXTRN ?AddLineID@FTagManager@@QEAAXHH@Z:PROC ; FTagManager::AddLineID + Line 62: EXTRN ?Next@FSectorTagIterator@@QEAAHXZ:PROC ; FSectorTagIterator::Next + Line 63: EXTRN ?Next@FLineIdIterator@@QEAAHXZ:PROC ; FLineIdIterator::Next + Line 64: EXTRN ?Construct@DDoor@@QEAAXPEAUsector_t@@W4EVlDoor@1@NHHH@Z:PROC ; DDoor::Construct + Line 65: EXTRN ?P_GetLineSpecialInfo@@YAPEAUFLineSpecial@@H@Z:PROC ; P_GetLineSpecialInfo + Line 66: EXTRN ?StartTypedScripts@FBehaviorContainer@@QEAAXGPEAVAActor@@_NH1@Z:PROC ; FBehaviorContainer::StartTypedScripts + Line 67: EXTRN ?P_Attach3dMidtexLinesToSector@@YAXPEAUsector_t@@HH_N@Z:PROC ; P_Attach3dMidtexLinesToSector + Line 68: EXTRN ?P_AddSectorLinks@@YA_NPEAUsector_t@@HHH@Z:PROC ; P_AddSectorLinks + Line 69: EXTRN ?P_AddSectorLinksByID@@YAXPEAUsector_t@@HH@Z:PROC ; P_AddSectorLinksByID + Line 70: EXTRN ?FindPortalDestination@FLevelLocals@@AEAAPEAUline_t@@PEAU2@H@Z:PROC ; FLevelLocals::FindPortalDestination + Line 71: EXTRN ?GetSkyboxPortal@FLevelLocals@@QEAAIPEAVAActor@@@Z:PROC ; FLevelLocals::GetSkyboxPortal + Line 72: EXTRN ?GetPortal@FLevelLocals@@QEAAIHHPEAUsector_t@@0AEBU?$TVector2@N@@@Z:PROC ; FLevelLocals::GetPortal + Line 73: EXTRN ?GetStackPortal@FLevelLocals@@QEAAIPEAVAActor@@H@Z:PROC ; FLevelLocals::GetStackPortal + Line 74: EXTRN ?PointInSubsector@FLevelLocals@@AEAAPEAUsubsector_t@@NN@Z:PROC ; FLevelLocals::PointInSubsector + Line 75: EXTRN ?Construct@DLightTransfer@@QEAAXPEAUsector_t@@H_N@Z:PROC ; DLightTransfer::Construct + Line 76: EXTRN ?Construct@DWallLightTransfer@@QEAAXPEAUsector_t@@HE@Z:PROC ; DWallLightTransfer::Construct + Line 77: EXTRN ?Construct@DFireFlicker@@QEAAXPEAUsector_t@@@Z:PROC ; DFireFlicker::Construct + Line 78: EXTRN ?Construct@DLightFlash@@QEAAXPEAUsector_t@@@Z:PROC ; DLightFlash::Construct + Line 79: EXTRN ?Construct@DStrobe@@QEAAXPEAUsector_t@@HH_N@Z:PROC ; DStrobe::Construct + Line 80: EXTRN ?Construct@DGlow@@QEAAXPEAUsector_t@@@Z:PROC ; DGlow::Construct + Line 81: EXTRN ?Construct@DPhased@@QEAAXPEAUsector_t@@HH@Z:PROC ; DPhased::Construct + Line 82: EXTRN ?Construct@DPusher@@QEAAXW4EPusher@1@PEAUline_t@@HHPEAVAActor@@H@Z:PROC ; DPusher::Construct + Line 83: EXTRN ?Construct@DScroller@@QEAAXW4EScroll@@NNPEAUsector_t@@1PEAUside_t@@HW4EScrollPos@@@Z:PROC ; DScroller::Construct + Line 84: EXTRN ?Construct@DScroller@@QEAAXNNPEBUline_t@@PEAUsector_t@@HW4EScrollPos@@@Z:PROC ; DScroller::Construct + Line 85: EXTRN ?ProcessEDSectors@MapLoader@@QEAAXXZ:PROC ; MapLoader::ProcessEDSectors + Line 86: EXTRN __CxxFrameHandler3:PROC + Line 87: EXTRN ?RegistrationInfo@DDoor@@2UClassReg@@A:BYTE ; DDoor::RegistrationInfo + Line 88: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 89: EXTRN ?skyflatnum@@3VFTextureID@@A:DWORD ; skyflatnum + Line 90: EXTRN ?RegistrationInfo@DLightTransfer@@2UClassReg@@A:BYTE ; DLightTransfer::RegistrationInfo + Line 91: EXTRN ?RegistrationInfo@DWallLightTransfer@@2UClassReg@@A:BYTE ; DWallLightTransfer::RegistrationInfo + Line 92: EXTRN ?RegistrationInfo@DFireFlicker@@2UClassReg@@A:BYTE ; DFireFlicker::RegistrationInfo + Line 93: EXTRN ?RegistrationInfo@DLightFlash@@2UClassReg@@A:BYTE ; DLightFlash::RegistrationInfo + Line 94: EXTRN ?RegistrationInfo@DStrobe@@2UClassReg@@A:BYTE ; DStrobe::RegistrationInfo + Line 95: EXTRN ?RegistrationInfo@DGlow@@2UClassReg@@A:BYTE ; DGlow::RegistrationInfo + Line 96: EXTRN ?RegistrationInfo@DPhased@@2UClassReg@@A:BYTE ; DPhased::RegistrationInfo + Line 97: EXTRN ?RegistrationInfo@DPusher@@2UClassReg@@A:BYTE ; DPusher::RegistrationInfo + Line 98: EXTRN ?RegistrationInfo@DScroller@@2UClassReg@@A:BYTE ; DScroller::RegistrationInfo + Line 99: EXTRN ?forcewater@@3VFBoolCVar@@A:BYTE ; forcewater + Line 100: EXTRN __ImageBase:BYTE + Line 101: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\sprites.cod (63 hits) + Line 323: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 324: EXTRN atexit:PROC + Line 325: EXTRN __std_terminate:PROC + Line 326: EXTRN atof:PROC + Line 327: EXTRN strncpy:PROC + Line 328: EXTRN stricmp:PROC + Line 329: EXTRN toupper:PROC + Line 330: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 331: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 332: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 333: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 334: EXTRN ??0FString@@QEAA@PEBD_K@Z:PROC ; FString::FString + Line 335: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 336: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 337: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 338: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 339: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 340: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 341: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 342: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 343: EXTRN ?GetNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::GetNumForName + Line 344: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 345: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 346: EXTRN ?FindLump@FWadCollection@@QEAAHPEBDPEAH_N@Z:PROC ; FWadCollection::FindLump + Line 347: EXTRN ?GetLumpName@FWadCollection@@QEBAXPEADH@Z:PROC ; FWadCollection::GetLumpName + Line 348: EXTRN ?GetLumpNamespace@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpNamespace + Line 349: EXTRN ?GetNumLumps@FWadCollection@@QEBAHXZ:PROC ; FWadCollection::GetNumLumps + Line 350: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 351: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 352: EXTRN ?S_HashSounds@@YAXXZ:PROC ; S_HashSounds + Line 353: EXTRN ?S_FindSoundNoHash@@YAHPEBD@Z:PROC ; S_FindSoundNoHash + Line 354: EXTRN ?S_AddPlayerSound@@YAHPEBDHHH_N@Z:PROC ; S_AddPlayerSound + Line 355: EXTRN ?S_AddPlayerSoundExisting@@YAHPEBDHHH_N@Z:PROC ; S_AddPlayerSoundExisting + Line 356: EXTRN ?S_ShrinkPlayerSoundLists@@YAXXZ:PROC ; S_ShrinkPlayerSoundLists + Line 357: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 358: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 359: EXTRN ?Pick@FColorMatcher@@QEAAEHHH@Z:PROC ; FColorMatcher::Pick + Line 360: EXTRN ?CreateTexture@FTextureManager@@QEAA?AVFTextureID@@HW4ETextureType@@@Z:PROC ; FTextureManager::CreateTexture + Line 361: EXTRN ??0FScanner@@QEAA@H@Z:PROC ; FScanner::FScanner + Line 362: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 363: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 364: EXTRN ?D_GenderToInt@@YAHPEBD@Z:PROC ; D_GenderToInt + Line 365: EXTRN ?D_PlayerClassToInt@@YAHPEBD@Z:PROC ; D_PlayerClassToInt + Line 366: EXTRN ?CheckSkin@FPlayerClass@@QEAA_NH@Z:PROC ; FPlayerClass::CheckSkin + Line 367: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 368: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 369: EXTRN ?R_LoadVoxelDef@@YAPEAUFVoxelDef@@HH@Z:PROC ; R_LoadVoxelDef + Line 370: EXTRN ?R_InitVoxels@@YAXXZ:PROC ; R_InitVoxels + Line 371: EXTRN ?InitModels@@YAXXZ:PROC ; InitModels + Line 372: EXTRN __CxxFrameHandler3:PROC + Line 373: EXTRN memmove:PROC + Line 374: EXTRN memset:PROC + Line 375: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 376: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 377: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 378: EXTRN ?deh@@3UDehInfo@@A:BYTE ; deh + Line 379: EXTRN ?ColorMatcher@@3VFColorMatcher@@A:QWORD ; ColorMatcher + Line 380: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 381: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 382: EXTRN ?PlayerClasses@@3V?$TArray@VFPlayerClass@@V1@@@A:BYTE ; PlayerClasses + Line 383: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 384: EXTRN __ImageBase:BYTE + Line 385: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\sqrt.cod (5 hits) + Line 13: EXTRN mtherr:PROC + Line 14: EXTRN frexp:PROC + Line 15: EXTRN ldexp:PROC + Line 16: EXTRN SQRT2:QWORD + Line 17: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\st_start.cod (84 hits) + Line 194: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 195: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 196: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 197: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 198: EXTRN atexit:PROC + Line 199: EXTRN __std_terminate:PROC + Line 200: EXTRN __imp_GetMessageA:PROC + Line 201: EXTRN __imp_TranslateMessage:PROC + Line 202: EXTRN __imp_DispatchMessageA:PROC + Line 203: EXTRN __imp_SendMessageA:PROC + Line 204: EXTRN __imp_PostQuitMessage:PROC + Line 205: EXTRN __imp_CreateWindowExA:PROC + Line 206: EXTRN __imp_DestroyWindow:PROC + Line 207: EXTRN __imp_MoveWindow:PROC + Line 208: EXTRN __imp_SetWindowPos:PROC + Line 209: EXTRN __imp_CreateDialogParamA:PROC + Line 210: EXTRN __imp_GetDlgItem:PROC + Line 211: EXTRN __imp_SetDlgItemTextA:PROC + Line 212: EXTRN __imp_SendDlgItemMessageA:PROC + Line 213: EXTRN __imp_SetFocus:PROC + Line 214: EXTRN __imp_SetTimer:PROC + Line 215: EXTRN __imp_KillTimer:PROC + Line 216: EXTRN __imp_InvalidateRect:PROC + Line 217: EXTRN __imp_GetClientRect:PROC + Line 218: EXTRN __imp_GetWindowRect:PROC + Line 219: EXTRN __imp_AdjustWindowRectEx:PROC + Line 220: EXTRN __imp_GetWindowLongA:PROC + Line 221: EXTRN __imp_SetWindowLongA:PROC + Line 222: EXTRN __imp_IsDialogMessageA:PROC + Line 223: EXTRN __imp_EnumDisplaySettingsA:PROC + Line 224: EXTRN ??0FStartupScreen@@QEAA@H@Z:PROC ; FStartupScreen::FStartupScreen + Line 225: EXTRN ??1FStartupScreen@@UEAA@XZ:PROC ; FStartupScreen::~FStartupScreen + Line 226: EXTRN ?LoadingStatus@FStartupScreen@@UEAAXPEBDH@Z:PROC ; FStartupScreen::LoadingStatus + Line 227: EXTRN ?AppendStatusLine@FStartupScreen@@UEAAXPEBD@Z:PROC ; FStartupScreen::AppendStatusLine + Line 228: EXTRN exit:PROC + Line 229: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 230: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 231: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 232: EXTRN ?VFormat@FString@@QEAAXPEBDPEAD@Z:PROC ; FString::VFormat + Line 233: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 234: EXTRN mysnprintf:PROC + Line 235: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 236: EXTRN ?I_GetEvent@@YAXXZ:PROC ; I_GetEvent + Line 237: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 238: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 239: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 240: EXTRN ?I_ShutdownGraphics@@YAXXZ:PROC ; I_ShutdownGraphics + Line 241: EXTRN ?ReadPalette@@YAXHPEAE@Z:PROC ; ReadPalette + Line 242: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 243: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 244: EXTRN ?ReadLump@FWadCollection@@QEAAXHPEAX@Z:PROC ; FWadCollection::ReadLump + Line 245: EXTRN ?OpenLumpReader@FWadCollection@@QEAA?AVFileReader@@H@Z:PROC ; FWadCollection::OpenLumpReader + Line 246: EXTRN ?LumpLength@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::LumpLength + Line 247: EXTRN ?GetLumpFile@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpFile + Line 248: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 249: EXTRN ?S_Sound@@YAXHVFSoundID@@MM@Z:PROC ; S_Sound + Line 250: EXTRN ?S_ChangeMusic@@YA_NPEBDH_N1@Z:PROC ; S_ChangeMusic + Line 251: EXTRN ?S_StopMusic@@YAX_N@Z:PROC ; S_StopMusic + Line 252: EXTRN ?CheckParm@FArgs@@QEBAHPEBDH@Z:PROC ; FArgs::CheckParm + Line 253: EXTRN ??_EFBasicStartupScreen@@UEAAPEAXI@Z:PROC ; FBasicStartupScreen::`vector deleting destructor' + Line 254: EXTRN ??_EFGraphicalStartupScreen@@UEAAPEAXI@Z:PROC ; FGraphicalStartupScreen::`vector deleting destructor' + Line 255: EXTRN ??_EFHereticStartupScreen@@UEAAPEAXI@Z:PROC ; FHereticStartupScreen::`vector deleting destructor' + Line 256: EXTRN ??_EFHexenStartupScreen@@UEAAPEAXI@Z:PROC ; FHexenStartupScreen::`vector deleting destructor' + Line 257: EXTRN ??_EFStrifeStartupScreen@@UEAAPEAXI@Z:PROC ; FStrifeStartupScreen::`vector deleting destructor' + Line 258: EXTRN ?RestoreConView@@YAXXZ:PROC ; RestoreConView + Line 259: EXTRN ?LayoutMainWindow@@YAXPEAUHWND__@@0@Z:PROC ; LayoutMainWindow + Line 260: EXTRN ?LayoutNetStartPane@@YAHPEAUHWND__@@H@Z:PROC ; LayoutNetStartPane + Line 261: EXTRN __CxxFrameHandler3:PROC + Line 262: EXTRN __chkstk:PROC + Line 263: EXTRN memcpy:PROC + Line 264: EXTRN memset:PROC + Line 265: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 266: EXTRN ?batchrun@@3_NA:BYTE ; batchrun + Line 267: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 268: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 269: EXTRN ?Args@@3PEAVFArgs@@EA:QWORD ; Args + Line 270: EXTRN ?DoomStartupInfo@@3UFStartupInfo@@A:BYTE ; DoomStartupInfo + Line 271: EXTRN ?g_hInst@@3PEAUHINSTANCE__@@EA:QWORD ; g_hInst + Line 272: EXTRN ?Window@@3PEAUHWND__@@EA:QWORD ; Window + Line 273: EXTRN ?ProgressBar@@3PEAUHWND__@@EA:QWORD ; ProgressBar + Line 274: EXTRN ?NetStartPane@@3PEAUHWND__@@EA:QWORD ; NetStartPane + Line 275: EXTRN ?StartupScreen@@3PEAUHWND__@@EA:QWORD ; StartupScreen + Line 276: EXTRN ?GameTitleWindow@@3PEAUHWND__@@EA:QWORD ; GameTitleWindow + Line 277: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\st_stuff.cod (17 hits) + Line 24: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 25: EXTRN ?automapactive@@3_NA:BYTE ; automapactive + Line 26: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 27: EXTRN ?ticker@@3VFBoolCVar@@A:BYTE ; ticker + Line 28: EXTRN ?noisedebug@@3VFBoolCVar@@A:BYTE ; noisedebug + Line 29: EXTRN ?am_cheat@@3VFIntCVar@@A:BYTE ; am_cheat + Line 890: EXTRN atexit:PROC + Line 891: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 892: EXTRN mysnprintf:PROC + Line 893: EXTRN ??RFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator() + Line 894: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 895: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 896: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 897: EXTRN ?CheckCheatmode@@YA_N_N@Z:PROC ; CheckCheatmode + Line 898: EXTRN ?C_DoCommand@@YAXPEBDH@Z:PROC ; C_DoCommand + Line 899: EXTRN ?Net_WriteByte@@YAXE@Z:PROC ; Net_WriteByte + Line 900: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\statistics.cod (76 hits) + Line 17: EXTRN ??_EStat_statistics@@UEAAPEAXI@Z:PROC ; Stat_statistics::`vector deleting destructor' + Line 103: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 104: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 105: EXTRN atexit:PROC + Line 106: EXTRN __std_terminate:PROC + Line 107: EXTRN qsort:PROC + Line 108: EXTRN strtol:PROC + Line 109: EXTRN __stdio_common_vsscanf:PROC + Line 110: EXTRN strncmp:PROC + Line 111: EXTRN strncpy:PROC + Line 112: EXTRN stricmp:PROC + Line 113: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 114: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 115: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 116: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 117: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 118: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 119: EXTRN ??HFString@@QEBA?AV0@AEBV0@@Z:PROC ; FString::operator+ + Line 120: EXTRN ??HFString@@QEBA?AV0@PEBD@Z:PROC ; FString::operator+ + Line 121: EXTRN ?ToUpper@FString@@QEAAXXZ:PROC ; FString::ToUpper + Line 122: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 123: EXTRN ?AppendFormat@FString@@QEAAXPEBDZZ:PROC ; FString::AppendFormat + Line 124: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 125: EXTRN _localtime64:PROC + Line 126: EXTRN _time64:PROC + Line 127: EXTRN strnatcasecmp:PROC + Line 128: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 129: EXTRN mysnprintf:PROC + Line 130: EXTRN ??0FScanner@@QEAA@XZ:PROC ; FScanner::FScanner + Line 131: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 132: EXTRN ?OpenFile@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::OpenFile + Line 133: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 134: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 135: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 136: EXTRN ?CheckString@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::CheckString + Line 137: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 138: EXTRN ?Open@FileWriter@@SAPEAV1@PEBD@Z:PROC ; FileWriter::Open + Line 139: EXTRN ?Printf@FileWriter@@QEAA_KPEBDZZ:PROC ; FileWriter::Printf + Line 140: EXTRN ?CheckLevelRedirect@level_info_t@@QEAAPEAU1@XZ:PROC ; level_info_t::CheckLevelRedirect + Line 141: EXTRN ?FindLevelInfo@@YAPEAUlevel_info_t@@PEBD_N@Z:PROC ; FindLevelInfo + Line 142: EXTRN ?G_SkillProperty@@YAHW4ESkillProperty@@@Z:PROC ; G_SkillProperty + Line 143: EXTRN ??AFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator[] + Line 144: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 145: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 146: EXTRN ??0FStringCVar@@QEAA@PEBD0IP6AXAEAV0@@Z@Z:PROC ; FStringCVar::FStringCVar + Line 147: EXTRN ??1FStringCVar@@UEAA@XZ:PROC ; FStringCVar::~FStringCVar + Line 148: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 149: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 150: EXTRN ?Net_WriteByte@@YAXE@Z:PROC ; Net_WriteByte + Line 151: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 152: EXTRN ??0FStat@@QEAA@PEBD@Z:PROC ; FStat::FStat + Line 153: EXTRN ??1FStat@@UEAA@XZ:PROC ; FStat::~FStat + Line 154: EXTRN ?GetWadName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetWadName + Line 155: EXTRN ?GetLumpFile@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpFile + Line 156: EXTRN ?P_OpenMapData@@YAPEAUMapData@@PEBD_N@Z:PROC ; P_OpenMapData + Line 157: EXTRN ?ExtractFileBase@@YA?AVFString@@PEBD_N@Z:PROC ; ExtractFileBase + Line 158: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 159: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 160: EXTRN ?ArraySize@FSerializer@@QEAAIXZ:PROC ; FSerializer::ArraySize + Line 161: EXTRN ?BeginObject@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginObject + Line 162: EXTRN ?EndObject@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndObject + Line 163: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 164: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 165: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 166: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAVFString@@PEAV2@@Z:PROC ; Serialize + Line 167: EXTRN __CxxFrameHandler3:PROC + Line 168: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 169: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 170: EXTRN ?AllEpisodes@@3V?$TArray@UFEpisode@@U1@@@A:BYTE ; AllEpisodes + Line 171: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 172: EXTRN ?multiplayer@@3_NA:BYTE ; multiplayer + Line 173: EXTRN ?deathmatch@@3VFIntCVar@@A:BYTE ; deathmatch + Line 174: EXTRN ?gamestate@@3W4gamestate_t@@A:DWORD ; gamestate + Line 175: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 176: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 177: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\stats.cod (18 hits) + Line 34: EXTRN _purecall:PROC + Line 35: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 36: EXTRN atexit:PROC + Line 37: EXTRN stricmp:PROC + Line 38: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 39: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 40: EXTRN ??_EFStat@@UEAAPEAXI@Z:PROC ; FStat::`vector deleting destructor' + Line 41: EXTRN ?DrawText@DFrameBuffer@@QEAAXPEAVFFont@@HNNPEBDHZZ:PROC ; DFrameBuffer::DrawText + Line 42: EXTRN ?GetUIScale@@YAHH@Z:PROC ; GetUIScale + Line 43: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 44: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 45: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 46: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 47: EXTRN __CxxFrameHandler3:PROC + Line 48: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 49: EXTRN ?con_scale@@3VFIntCVar@@A:BYTE ; con_scale + Line 50: EXTRN ?ConFont@@3PEAVFFont@@EA:QWORD ; ConFont + Line 51: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\stringtable.cod (25 hits) + Line 34: EXTRN stricmp:PROC + Line 35: EXTRN tolower:PROC + Line 36: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 37: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 38: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 39: EXTRN ??0FString@@QEAA@PEBD_K@Z:PROC ; FString::FString + Line 40: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 41: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 42: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 43: EXTRN ?FindLump@FWadCollection@@QEAAHPEBDPEAH_N@Z:PROC ; FWadCollection::FindLump + Line 44: EXTRN ??0FScanner@@QEAA@H@Z:PROC ; FScanner::FScanner + Line 45: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 46: EXTRN ?SetCMode@FScanner@@QEAAX_N@Z:PROC ; FScanner::SetCMode + Line 47: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 48: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 49: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 50: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 51: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 52: EXTRN ?isText@FScanner@@QEAA_NXZ:PROC ; FScanner::isText + Line 53: EXTRN ?MakeKey@@YAIPEBD@Z:PROC ; MakeKey + Line 54: EXTRN __CxxFrameHandler3:PROC + Line 55: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 56: EXTRN ?LanguageIDs@@3PAIA:BYTE ; LanguageIDs + Line 57: EXTRN ?GameNames@@3PAPEBDA:BYTE ; GameNames + Line 58: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\strnatcmp.cod (3 hits) + Line 10: EXTRN isdigit:PROC + Line 11: EXTRN isspace:PROC + Line 12: EXTRN toupper:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\swcanvastexture.cod (19 hits) + Line 28: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 29: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 30: EXTRN __std_terminate:PROC + Line 31: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 32: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 33: EXTRN ??0DCanvas@@QEAA@HH_N@Z:PROC ; DCanvas::DCanvas + Line 34: EXTRN ??1DCanvas@@QEAA@XZ:PROC ; DCanvas::~DCanvas + Line 35: EXTRN ?FreeAllSpans@FSoftwareTexture@@IEAAXXZ:PROC ; FSoftwareTexture::FreeAllSpans + Line 36: EXTRN ?GetColumn@FSoftwareTexture@@UEAAPEBEHIPEAPEBUFSoftwareTextureSpan@@@Z:PROC ; FSoftwareTexture::GetColumn + Line 37: EXTRN ?GetColumnBgra@FSoftwareTexture@@UEAAPEBIIPEAPEBUFSoftwareTextureSpan@@@Z:PROC ; FSoftwareTexture::GetColumnBgra + Line 38: EXTRN ?GetPixelsBgra@FSoftwareTexture@@UEAAPEBIXZ:PROC ; FSoftwareTexture::GetPixelsBgra + Line 39: EXTRN ?GetPixels@FSoftwareTexture@@UEAAPEBEH@Z:PROC ; FSoftwareTexture::GetPixels + Line 40: EXTRN ??_EFSoftwareTexture@@UEAAPEAXI@Z:PROC ; FSoftwareTexture::`vector deleting destructor' + Line 41: EXTRN ??_EFSWCanvasTexture@@UEAAPEAXI@Z:PROC ; FSWCanvasTexture::`vector deleting destructor' + Line 42: EXTRN __CxxFrameHandler3:PROC + Line 43: EXTRN memset:PROC + Line 44: EXTRN ?GPalette@@3UFPalette@@A:BYTE ; GPalette + Line 45: EXTRN ?RGB32k@@3TColorTable32k@@A:BYTE ; RGB32k + Line 46: EXTRN __ImageBase:BYTE + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\symbols.cod (39 hits) + Line 47: EXTRN ?RegistrationInfo@DObject@@2UClassReg@@A:BYTE ; DObject::RegistrationInfo + Line 276: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 277: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 278: EXTRN atexit:PROC + Line 279: EXTRN __std_terminate:PROC + Line 280: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 281: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 282: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 283: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 284: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 285: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 286: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 287: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 288: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 289: EXTRN ??1DObject@@UEAA@XZ:PROC ; DObject::~DObject + Line 290: EXTRN ?Serialize@DObject@@UEAAXAEAVFSerializer@@@Z:PROC ; DObject::Serialize + Line 291: EXTRN ?Release@DObject@@QEAAXXZ:PROC ; DObject::Release + Line 292: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 293: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 294: EXTRN ?PropagateMark@DObject@@UEAA_KXZ:PROC ; DObject::PropagateMark + Line 295: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 296: EXTRN ??_EPSymbol@@UEAAPEAXI@Z:PROC ; PSymbol::`vector deleting destructor' + Line 297: EXTRN ??_EPSymbolType@@UEAAPEAXI@Z:PROC ; PSymbolType::`vector deleting destructor' + Line 298: EXTRN ??_EPSymbolTreeNode@@UEAAPEAXI@Z:PROC ; PSymbolTreeNode::`vector deleting destructor' + Line 299: EXTRN ??_EPField@@UEAAPEAXI@Z:PROC ; PField::`vector deleting destructor' + Line 300: EXTRN ??_EPProperty@@UEAAPEAXI@Z:PROC ; PProperty::`vector deleting destructor' + Line 301: EXTRN ??_EPPropFlag@@UEAAPEAXI@Z:PROC ; PPropFlag::`vector deleting destructor' + Line 302: EXTRN ??_EPSymbolConst@@UEAAPEAXI@Z:PROC ; PSymbolConst::`vector deleting destructor' + Line 303: EXTRN ??_EPSymbolConstNumeric@@UEAAPEAXI@Z:PROC ; PSymbolConstNumeric::`vector deleting destructor' + Line 304: EXTRN ??_EPSymbolConstString@@UEAAPEAXI@Z:PROC ; PSymbolConstString::`vector deleting destructor' + Line 305: EXTRN ??_EPFunction@@UEAAPEAXI@Z:PROC ; PFunction::`vector deleting destructor' + Line 306: EXTRN ?GetKey@FSerializer@@QEAAPEBDXZ:PROC ; FSerializer::GetKey + Line 307: EXTRN __CxxFrameHandler3:PROC + Line 308: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 309: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 310: EXTRN ?ClassDataAllocator@@3VFMemArena@@A:BYTE ; ClassDataAllocator + Line 311: EXTRN ?TypeBool@@3PEAVPBool@@EA:QWORD ; TypeBool + Line 312: EXTRN ?TypeString@@3PEAVPString@@EA:QWORD ; TypeString + Line 313: EXTRN ?TypeTable@@3UFTypeTable@@A:BYTE ; TypeTable + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\t_cmd.cod (20 hits) + Line 48: EXTRN strtoull:PROC + Line 49: EXTRN strncpy:PROC + Line 50: EXTRN strnicmp:PROC + Line 51: EXTRN mysnprintf:PROC + Line 52: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 53: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 54: EXTRN ?AddCommandString@@YAXPEBDH@Z:PROC ; AddCommandString + Line 55: EXTRN ??0FScanner@@QEAA@XZ:PROC ; FScanner::FScanner + Line 56: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 57: EXTRN ?OpenMem@FScanner@@QEAAXPEBD0H@Z:PROC ; FScanner::OpenMem + Line 58: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 59: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 60: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 61: EXTRN ?MustGetFloat@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetFloat + Line 62: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 63: EXTRN ?ChangeLevel@FLevelLocals@@QEAAXPEBDHHH@Z:PROC ; FLevelLocals::ChangeLevel + Line 64: EXTRN __CxxFrameHandler3:PROC + Line 65: EXTRN ?dmflags@@3VFIntCVar@@A:BYTE ; dmflags + Line 66: EXTRN ?AllSkills@@3V?$TArray@UFSkillInfo@@U1@@@A:BYTE ; AllSkills + Line 67: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\t_func.cod (150 hits) + Line 13: EXTRN ?RegistrationInfo@DLighting@@2UClassReg@@A:BYTE ; DLighting::RegistrationInfo + Line 563: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 564: EXTRN atexit:PROC + Line 565: EXTRN __std_terminate:PROC + Line 566: EXTRN strncpy:PROC + Line 567: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 568: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 569: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 570: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_K_N@Z:PROC ; FName::NameManager::FindName + Line 571: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 572: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 573: EXTRN ?LockBuffer@FString@@QEAAPEADXZ:PROC ; FString::LockBuffer + Line 574: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 575: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 576: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 577: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 578: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 579: EXTRN mysnprintf:PROC + Line 580: EXTRN c_asin:PROC + Line 581: EXTRN c_acos:PROC + Line 582: EXTRN c_atan:PROC + Line 583: EXTRN c_atan2:PROC + Line 584: EXTRN c_tan:PROC + Line 585: EXTRN c_sqrt:PROC + Line 586: EXTRN c_exp:PROC + Line 587: EXTRN c_log:PROC + Line 588: EXTRN c_pow:PROC + Line 589: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 590: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 591: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 592: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 593: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 594: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 595: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 596: EXTRN ?FindFunction@PClass@@SAXPEAPEAVVMFunction@@VFName@@1@Z:PROC ; PClass::FindFunction + Line 597: EXTRN ?P_SpawnMissile@@YAPEAVAActor@@PEAV1@0PEAVPClassActor@@0@Z:PROC ; P_SpawnMissile + Line 598: EXTRN ?P_TestMobjLocation@@YAHPEAVAActor@@@Z:PROC ; P_TestMobjLocation + Line 599: EXTRN ?P_AimLineAttack@@YA?AU?$TAngle@N@@PEAVAActor@@U1@NPEAUFTranslatedLineTarget@@1H00@Z:PROC ; P_AimLineAttack + Line 600: EXTRN ?P_LineAttack@@YAPEAVAActor@@PEAV1@U?$TAngle@N@@N1HVFName@@2HPEAUFTranslatedLineTarget@@PEAHNNN@Z:PROC ; P_LineAttack + Line 601: EXTRN ?P_CheckMissileSpawn@@YA_NPEAVAActor@@N@Z:PROC ; P_CheckMissileSpawn + Line 602: EXTRN ?P_RadiusAttack@@YAHPEAVAActor@@0HHVFName@@HH@Z:PROC ; P_RadiusAttack + Line 603: EXTRN ?P_DamageMobj@@YAHPEAVAActor@@00HVFName@@HU?$TAngle@N@@@Z:PROC ; P_DamageMobj + Line 604: EXTRN ?MoveFloor@sector_t@@QEAA?AW4EMoveResult@@NNHH_N0@Z:PROC ; sector_t::MoveFloor + Line 605: EXTRN ?MoveCeiling@sector_t@@QEAA?AW4EMoveResult@@NNHH_N@Z:PROC ; sector_t::MoveCeiling + Line 606: EXTRN ?AdjustFloorClip@@YAXPEBUsector_t@@@Z:PROC ; AdjustFloorClip + Line 607: EXTRN ?SetColor@@YAXPEAUsector_t@@HH@Z:PROC ; SetColor + Line 608: EXTRN ?P_GetLineSpecialInfo@@YAPEAUFLineSpecial@@H@Z:PROC ; P_GetLineSpecialInfo + Line 609: EXTRN ?P_GetMaxLineSpecial@@YAHXZ:PROC ; P_GetMaxLineSpecial + Line 610: EXTRN ?P_ExecuteSpecial@@YAHHPEAUline_t@@PEAVAActor@@_NHHHHH@Z:PROC ; P_ExecuteSpecial + Line 611: EXTRN ?Link@FThinkerCollection@@QEAAXPEAVDThinker@@H@Z:PROC ; FThinkerCollection::Link + Line 612: EXTRN ?StaticType@DThinker@@UEBAPEAVPClass@@XZ:PROC ; DThinker::StaticType + Line 613: EXTRN ?OnDestroy@DThinker@@UEAAXXZ:PROC ; DThinker::OnDestroy + Line 614: EXTRN ??1DThinker@@UEAA@XZ:PROC ; DThinker::~DThinker + Line 615: EXTRN ?Tick@DThinker@@UEAAXXZ:PROC ; DThinker::Tick + Line 616: EXTRN ?PostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::PostBeginPlay + Line 617: EXTRN ?CallPostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::CallPostBeginPlay + Line 618: EXTRN ?PostSerialize@DThinker@@UEAAXXZ:PROC ; DThinker::PostSerialize + Line 619: EXTRN ?Serialize@DThinker@@UEAAXAEAVFSerializer@@@Z:PROC ; DThinker::Serialize + Line 620: EXTRN ?PropagateMark@DThinker@@UEAA_KXZ:PROC ; DThinker::PropagateMark + Line 621: EXTRN ??_EDThinker@@UEAAPEAXI@Z:PROC ; DThinker::`vector deleting destructor' + Line 622: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 623: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 624: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 625: EXTRN ?S_Sound@@YAXHVFSoundID@@MM@Z:PROC ; S_Sound + Line 626: EXTRN ?S_Sound@@YAXPEAVAActor@@HVFSoundID@@MM@Z:PROC ; S_Sound + Line 627: EXTRN ?S_Sound@@YAXPEBUsector_t@@HVFSoundID@@MM@Z:PROC ; S_Sound + Line 628: EXTRN ?S_ChangeMusic@@YA_NPEBDH_N1@Z:PROC ; S_ChangeMusic + Line 629: EXTRN ?S_HashSounds@@YAXXZ:PROC ; S_HashSounds + Line 630: EXTRN ?S_AddSound@@YAHPEBD0PEAVFScanner@@@Z:PROC ; S_AddSound + Line 631: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 632: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 633: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 634: EXTRN ?FindState@PClassActor@@QEBAPEAUFState@@HPEAVFName@@_N@Z:PROC ; PClassActor::FindState + Line 635: EXTRN ?GetReplacement@PClassActor@@QEAAPEAV1@_N@Z:PROC ; PClassActor::GetReplacement + Line 636: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 637: EXTRN ?GetTextureID@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::GetTextureID + Line 638: EXTRN ?G_SkillProperty@@YAHW4ESkillProperty@@@Z:PROC ; G_SkillProperty + Line 639: EXTRN ?StaticSpawn@AActor@@SAPEAV1@PEAVPClassActor@@AEBU?$TVector3@N@@W4replace_t@@_N@Z:PROC ; AActor::StaticSpawn + Line 640: EXTRN ?CallActivate@AActor@@QEAAXPEAV1@@Z:PROC ; AActor::CallActivate + Line 641: EXTRN ?CheckLocalView@AActor@@QEBA_NH@Z:PROC ; AActor::CheckLocalView + Line 642: EXTRN ?FindInventory@AActor@@QEAAPEAV1@PEAVPClassActor@@_N@Z:PROC ; AActor::FindInventory + Line 643: EXTRN ?GiveInventoryType@AActor@@QEAAPEAV1@PEAVPClassActor@@@Z:PROC ; AActor::GiveInventoryType + Line 644: EXTRN ?SetAngle@AActor@@QEAAXU?$TAngle@N@@_N@Z:PROC ; AActor::SetAngle + Line 645: EXTRN ?IsMapActor@AActor@@QEAA_NXZ:PROC ; AActor::IsMapActor + Line 646: EXTRN ?SetState@AActor@@QEAA_NPEAUFState@@_N@Z:PROC ; AActor::SetState + Line 647: EXTRN ?ClearCounters@AActor@@QEAAXXZ:PROC ; AActor::ClearCounters + Line 648: EXTRN ?Revive@AActor@@QEAAXXZ:PROC ; AActor::Revive + Line 649: EXTRN ?intvalue@@YAHAEBUsvalue_t@@@Z:PROC ; intvalue + Line 650: EXTRN ?fixedvalue@@YAHAEBUsvalue_t@@@Z:PROC ; fixedvalue + Line 651: EXTRN ?floatvalue@@YANAEBUsvalue_t@@@Z:PROC ; floatvalue + Line 652: EXTRN ?stringvalue@@YAPEBDAEBUsvalue_t@@@Z:PROC ; stringvalue + Line 653: EXTRN ?actorvalue@@YAPEAVAActor@@PEAUFLevelLocals@@AEBUsvalue_t@@@Z:PROC ; actorvalue + Line 654: EXTRN ?NewVariable@DFsScript@@QEAAPEAUDFsVariable@@PEBDH@Z:PROC ; DFsScript::NewVariable + Line 655: EXTRN ?NewFunction@DFsScript@@QEAAXPEBDP8FParser@@EAAXXZ@Z:PROC ; DFsScript::NewFunction + Line 656: EXTRN ?LabelValue@DFsScript@@QEAAPEADAEBUsvalue_t@@@Z:PROC ; DFsScript::LabelValue + Line 657: EXTRN ?SectionEnd@DFsScript@@QEAAPEADPEBUDFsSection@@@Z:PROC ; DFsScript::SectionEnd + Line 658: EXTRN ?ParseInclude@DFsScript@@QEAAXPEAUFLevelLocals@@PEAD@Z:PROC ; DFsScript::ParseInclude + Line 659: EXTRN ??0DRunningScript@@QEAA@PEAVAActor@@PEAVDFsScript@@H@Z:PROC ; DRunningScript::DRunningScript + Line 660: EXTRN ?AddRunningScript@DFraggleThinker@@QEAAXPEAVDRunningScript@@@Z:PROC ; DFraggleThinker::AddRunningScript + Line 661: EXTRN ?script_error@@YAXPEBDZZ:PROC ; script_error + Line 662: EXTRN ?FS_EmulateCmd@@YAXPEAUFLevelLocals@@PEAD@Z:PROC ; FS_EmulateCmd + Line 663: EXTRN ?C_MidPrint@@YAXPEAVFFont@@PEBD@Z:PROC ; C_MidPrint + Line 664: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 665: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAEPEAE@Z:PROC ; Serialize + Line 666: EXTRN ?StaticType@DSectorEffect@@UEBAPEAVPClass@@XZ:PROC ; DSectorEffect::StaticType + Line 667: EXTRN ?Construct@DSectorEffect@@QEAAXPEAUsector_t@@@Z:PROC ; DSectorEffect::Construct + Line 668: EXTRN ?Serialize@DSectorEffect@@UEAAXAEAVFSerializer@@@Z:PROC ; DSectorEffect::Serialize + Line 669: EXTRN ?OnDestroy@DSectorEffect@@UEAAXXZ:PROC ; DSectorEffect::OnDestroy + Line 670: EXTRN ??_EDSectorEffect@@UEAAPEAXI@Z:PROC ; DSectorEffect::`vector deleting destructor' + Line 671: EXTRN ?GetFirstSectorTag@FTagManager@@AEBAHPEBUsector_t@@@Z:PROC ; FTagManager::GetFirstSectorTag + Line 672: EXTRN ?SectorHasTag@FTagManager@@AEBA_NPEBUsector_t@@H@Z:PROC ; FTagManager::SectorHasTag + Line 673: EXTRN ?Next@FSectorTagIterator@@QEAAHXZ:PROC ; FSectorTagIterator::Next + Line 674: EXTRN ?Next@FLineIdIterator@@QEAAHXZ:PROC ; FLineIdIterator::Next + Line 675: EXTRN ?StaticType@DLighting@@UEBAPEAVPClass@@XZ:PROC ; DLighting::StaticType + Line 676: EXTRN ??_EDLighting@@UEAAPEAXI@Z:PROC ; DLighting::`vector deleting destructor' + Line 677: EXTRN ?R_ResetViewInterpolation@@YAXXZ:PROC ; R_ResetViewInterpolation + Line 678: EXTRN ?TranslateLineDef@FLevelLocals@@QEAAXPEAUline_t@@PEAUmaplinedef_t@@H@Z:PROC ; FLevelLocals::TranslateLineDef + Line 679: EXTRN ?CreateCeiling@FLevelLocals@@QEAA_NPEAUsector_t@@W4ECeiling@DCeiling@@PEAUline_t@@HNNNHHHW4ECrushMode@4@@Z:PROC ; FLevelLocals::CreateCeiling + Line 680: EXTRN ?CreateFloor@FLevelLocals@@QEAA_NPEAUsector_t@@W4EFloor@DFloor@@PEAUline_t@@NNHH_N3@Z:PROC ; FLevelLocals::CreateFloor + Line 681: EXTRN ?EV_DoDoor@FLevelLocals@@QEAA_NW4EVlDoor@DDoor@@PEAUline_t@@PEAVAActor@@HNHHH_NH@Z:PROC ; FLevelLocals::EV_DoDoor + Line 682: EXTRN ?EV_Teleport@FLevelLocals@@QEAA_NHHPEAUline_t@@HPEAVAActor@@H@Z:PROC ; FLevelLocals::EV_Teleport + Line 683: EXTRN ?ExitLevel@FLevelLocals@@QEAAXH_N@Z:PROC ; FLevelLocals::ExitLevel + Line 684: EXTRN ?SecretExitLevel@FLevelLocals@@QEAAXH@Z:PROC ; FLevelLocals::SecretExitLevel + Line 685: EXTRN ?PointInSubsector@FLevelLocals@@AEAAPEAUsubsector_t@@NN@Z:PROC ; FLevelLocals::PointInSubsector + Line 686: EXTRN ?Exec@ScriptUtil@@SAHVFName@@ZZ:PROC ; ScriptUtil::Exec + Line 687: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 688: EXTRN ??_EDLightLevel@@UEAAPEAXI@Z:PROC ; DLightLevel::`vector deleting destructor' + Line 689: EXTRN ?CheckInventory@@YAHPEAVAActor@@PEBD_N@Z:PROC ; CheckInventory + Line 690: EXTRN _CxxThrowException:PROC + Line 691: EXTRN __CxxFrameHandler3:PROC + Line 692: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 693: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 694: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 695: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 696: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 697: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 698: EXTRN ?RegistrationInfo@DRunningScript@@2UClassReg@@A:BYTE ; DRunningScript::RegistrationInfo + Line 699: EXTRN ?multiplayer@@3_NA:BYTE ; multiplayer + Line 700: EXTRN ?deathmatch@@3VFIntCVar@@A:BYTE ; deathmatch + Line 701: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 702: EXTRN ?gametic@@3HA:DWORD ; gametic + Line 703: EXTRN ?playeringame@@3PA_NA:BYTE ; playeringame + Line 704: EXTRN ?WP_NOCHANGE@@3PEAVAActor@@EA:QWORD ; WP_NOCHANGE + Line 705: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 706: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 707: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 708: EXTRN ?SmallFont@@3PEAVFFont@@EA:QWORD ; SmallFont + Line 709: EXTRN ?con_midtime@@3VFFloatCVar@@A:BYTE ; con_midtime + Line 710: EXTRN __ImageBase:BYTE + Line 711: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\t_load.cod (40 hits) + Line 34: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 35: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 36: EXTRN strchr:PROC + Line 37: EXTRN strstr:PROC + Line 38: EXTRN strnicmp:PROC + Line 39: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 40: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 41: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 42: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 43: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 44: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 45: EXTRN ?ReadLump@FWadCollection@@QEAAXHPEAX@Z:PROC ; FWadCollection::ReadLump + Line 46: EXTRN ?LumpLength@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::LumpLength + Line 47: EXTRN ??0FScanner@@QEAA@XZ:PROC ; FScanner::FScanner + Line 48: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 49: EXTRN ?OpenMem@FScanner@@QEAAXPEBD0H@Z:PROC ; FScanner::OpenMem + Line 50: EXTRN ?Close@FScanner@@QEAAXXZ:PROC ; FScanner::Close + Line 51: EXTRN ?SetCMode@FScanner@@QEAAX_N@Z:PROC ; FScanner::SetCMode + Line 52: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 53: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 54: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 55: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 56: EXTRN ?S_ChangeMusic@@YA_NPEBDH_N1@Z:PROC ; S_ChangeMusic + Line 57: EXTRN ?GetTextureID@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::GetTextureID + Line 58: EXTRN ?InitSkyMap@@YAXPEAUFLevelLocals@@@Z:PROC ; InitSkyMap + Line 59: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 60: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 61: EXTRN ?Link@FThinkerCollection@@QEAAXPEAVDThinker@@H@Z:PROC ; FThinkerCollection::Link + Line 62: EXTRN ?Construct@DFraggleThinker@@QEAAXXZ:PROC ; DFraggleThinker::Construct + Line 63: EXTRN ?FS_EmulateCmd@@YAXPEAUFLevelLocals@@PEAD@Z:PROC ; FS_EmulateCmd + Line 64: EXTRN ?copystring@@YAPEADPEBD@Z:PROC ; copystring + Line 65: EXTRN ?FS_ChangeMusic@@YA_NPEBD@Z:PROC ; FS_ChangeMusic + Line 66: EXTRN __CxxFrameHandler3:PROC + Line 67: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 68: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 69: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 70: EXTRN ?RegistrationInfo@DFraggleThinker@@2UClassReg@@A:BYTE ; DFraggleThinker::RegistrationInfo + Line 71: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 72: EXTRN ?SimpleLineTranslations@@3V?$TAutoGrowArray@UFLineTrans@@U1@@@A:BYTE ; SimpleLineTranslations + Line 73: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\t_oper.cod (14 hits) + Line 51: EXTRN ?OPstructure@FParser@@QEAAXAEAUsvalue_t@@HHH@Z:PROC ; FParser::OPstructure + Line 235: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 236: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 237: EXTRN ?intvalue@@YAHAEBUsvalue_t@@@Z:PROC ; intvalue + Line 238: EXTRN ?fixedvalue@@YAHAEBUsvalue_t@@@Z:PROC ; fixedvalue + Line 239: EXTRN ?floatvalue@@YANAEBUsvalue_t@@@Z:PROC ; floatvalue + Line 240: EXTRN ?GetValue@DFsVariable@@QEAAXAEAUsvalue_t@@@Z:PROC ; DFsVariable::GetValue + Line 241: EXTRN ?SetValue@DFsVariable@@QEAAXPEAUFLevelLocals@@AEBUsvalue_t@@@Z:PROC ; DFsVariable::SetValue + Line 242: EXTRN ?FindVariable@DFsScript@@QEAAPEAUDFsVariable@@PEBDPEAV1@@Z:PROC ; DFsScript::FindVariable + Line 243: EXTRN ?EvaluateExpression@FParser@@QEAAXAEAUsvalue_t@@HH@Z:PROC ; FParser::EvaluateExpression + Line 244: EXTRN ?script_error@@YAXPEBDZZ:PROC ; script_error + Line 245: EXTRN __CxxFrameHandler3:PROC + Line 246: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 247: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\t_parse.cod (41 hits) + Line 85: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 86: EXTRN atexit:PROC + Line 87: EXTRN atof:PROC + Line 88: EXTRN atoi:PROC + Line 89: EXTRN strchr:PROC + Line 90: EXTRN strncpy:PROC + Line 91: EXTRN __std_exception_copy:PROC + Line 92: EXTRN __std_exception_destroy:PROC + Line 93: EXTRN ??_Eexception@std@@UEAAPEAXI@Z:PROC ; std::exception::`vector deleting destructor' + Line 94: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 95: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 96: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 97: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 98: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 99: EXTRN ?VFormat@FString@@QEAAXPEBDPEAD@Z:PROC ; FString::VFormat + Line 100: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 101: EXTRN myvsnprintf:PROC + Line 102: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 103: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 104: EXTRN ??_ECDoomError@@UEAAPEAXI@Z:PROC ; CDoomError::`vector deleting destructor' + Line 105: EXTRN ??_ECFraggleScriptError@@UEAAPEAXI@Z:PROC ; CFraggleScriptError::`vector deleting destructor' + Line 106: EXTRN ?GetValue@DFsVariable@@QEAAXAEAUsvalue_t@@@Z:PROC ; DFsVariable::GetValue + Line 107: EXTRN ?FindVariable@DFsScript@@QEAAPEAUDFsVariable@@PEBDPEAV1@@Z:PROC ; DFsScript::FindVariable + Line 108: EXTRN ?FindSectionStart@DFsScript@@QEAAPEAUDFsSection@@PEBD@Z:PROC ; DFsScript::FindSectionStart + Line 109: EXTRN ?FindSectionEnd@DFsScript@@QEAAPEAUDFsSection@@PEBD@Z:PROC ; DFsScript::FindSectionEnd + Line 110: EXTRN ?EvaluateFunction@FParser@@QEAAXAEAUsvalue_t@@HH@Z:PROC ; FParser::EvaluateFunction + Line 111: EXTRN ?spec_brace@FParser@@QEAAXXZ:PROC ; FParser::spec_brace + Line 112: EXTRN ?spec_if@FParser@@QEAA_NXZ:PROC ; FParser::spec_if + Line 113: EXTRN ?spec_elseif@FParser@@QEAA_N_N@Z:PROC ; FParser::spec_elseif + Line 114: EXTRN ?spec_else@FParser@@QEAAX_N@Z:PROC ; FParser::spec_else + Line 115: EXTRN ?spec_for@FParser@@QEAAXXZ:PROC ; FParser::spec_for + Line 116: EXTRN ?spec_while@FParser@@QEAAXXZ:PROC ; FParser::spec_while + Line 117: EXTRN ?spec_variable@FParser@@QEAA_NXZ:PROC ; FParser::spec_variable + Line 118: EXTRN _CxxThrowException:PROC + Line 119: EXTRN __CxxFrameHandler3:PROC + Line 120: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 121: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 122: EXTRN ?operators@FParser@@2PAUoperator_t@1@A:BYTE ; FParser::operators + Line 123: EXTRN ?num_operators@FParser@@2HA:DWORD ; FParser::num_operators + Line 124: EXTRN __ImageBase:BYTE + Line 125: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\t_prepro.cod (36 hits) + Line 13: EXTRN ?RegistrationInfo@DObject@@2UClassReg@@A:BYTE ; DObject::RegistrationInfo + Line 77: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 78: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 79: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 80: EXTRN __std_terminate:PROC + Line 81: EXTRN strcspn:PROC + Line 82: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 83: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 84: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 85: EXTRN ??0FString@@QEAA@PEBD_K@Z:PROC ; FString::FString + Line 86: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 87: EXTRN ?Printf@@YAHHPEBDZZ:PROC ; Printf + Line 88: EXTRN ?Barrier@GC@@YAXPEAVDObject@@0@Z:PROC ; GC::Barrier + Line 89: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 90: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 91: EXTRN ??1DObject@@UEAA@XZ:PROC ; DObject::~DObject + Line 92: EXTRN ?Serialize@DObject@@UEAAXAEAVFSerializer@@@Z:PROC ; DObject::Serialize + Line 93: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 94: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 95: EXTRN ?PropagateMark@DObject@@UEAA_KXZ:PROC ; DObject::PropagateMark + Line 96: EXTRN ??_EDFsSection@@UEAAPEAXI@Z:PROC ; DFsSection::`vector deleting destructor' + Line 97: EXTRN ?NewVariable@DFsScript@@QEAAPEAUDFsVariable@@PEBDH@Z:PROC ; DFsScript::NewVariable + Line 98: EXTRN ?GetTokens@FParser@@QEAAPEADPEAD@Z:PROC ; FParser::GetTokens + Line 99: EXTRN ?ErrorMessage@FParser@@QEAAXVFString@@@Z:PROC ; FParser::ErrorMessage + Line 100: EXTRN ?Run@FParser@@QEAAXPEAD00@Z:PROC ; FParser::Run + Line 101: EXTRN ?script_error@@YAXPEBDZZ:PROC ; script_error + Line 102: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 103: EXTRN ?ReadLump@FWadCollection@@QEAAXHPEAX@Z:PROC ; FWadCollection::ReadLump + Line 104: EXTRN ?LumpLength@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::LumpLength + Line 105: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 106: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 107: EXTRN __CxxFrameHandler3:PROC + Line 108: EXTRN __chkstk:PROC + Line 109: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 110: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 111: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\t_script.cod (57 hits) + Line 24: EXTRN ?RegistrationInfo@DObject@@2UClassReg@@A:BYTE ; DObject::RegistrationInfo + Line 25: EXTRN ?RegistrationInfo@DThinker@@2UClassReg@@A:BYTE ; DThinker::RegistrationInfo + Line 464: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 465: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 466: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 467: EXTRN atexit:PROC + Line 468: EXTRN __std_terminate:PROC + Line 469: EXTRN atoi:PROC + Line 470: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 471: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 472: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 473: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 474: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 475: EXTRN ?Barrier@GC@@YAXPEAVDObject@@0@Z:PROC ; GC::Barrier + Line 476: EXTRN ?Mark@GC@@YAXPEAPEAVDObject@@@Z:PROC ; GC::Mark + Line 477: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 478: EXTRN ??1DObject@@UEAA@XZ:PROC ; DObject::~DObject + Line 479: EXTRN ?Serialize@DObject@@UEAAXAEAVFSerializer@@@Z:PROC ; DObject::Serialize + Line 480: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 481: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 482: EXTRN ?PropagateMark@DObject@@UEAA_KXZ:PROC ; DObject::PropagateMark + Line 483: EXTRN ?StaticType@DThinker@@UEBAPEAVPClass@@XZ:PROC ; DThinker::StaticType + Line 484: EXTRN ?OnDestroy@DThinker@@UEAAXXZ:PROC ; DThinker::OnDestroy + Line 485: EXTRN ??1DThinker@@UEAA@XZ:PROC ; DThinker::~DThinker + Line 486: EXTRN ?Tick@DThinker@@UEAAXXZ:PROC ; DThinker::Tick + Line 487: EXTRN ?PostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::PostBeginPlay + Line 488: EXTRN ?CallPostBeginPlay@DThinker@@UEAAXXZ:PROC ; DThinker::CallPostBeginPlay + Line 489: EXTRN ?PostSerialize@DThinker@@UEAAXXZ:PROC ; DThinker::PostSerialize + Line 490: EXTRN ?Serialize@DThinker@@UEAAXAEAVFSerializer@@@Z:PROC ; DThinker::Serialize + Line 491: EXTRN ?PropagateMark@DThinker@@UEAA_KXZ:PROC ; DThinker::PropagateMark + Line 492: EXTRN ??_EDThinker@@UEAAPEAXI@Z:PROC ; DThinker::`vector deleting destructor' + Line 493: EXTRN ?ClearVariables@DFsScript@@QEAAX_N@Z:PROC ; DFsScript::ClearVariables + Line 494: EXTRN ?ClearSections@DFsScript@@QEAAXXZ:PROC ; DFsScript::ClearSections + Line 495: EXTRN ?Preprocess@DFsScript@@QEAAXPEAUFLevelLocals@@@Z:PROC ; DFsScript::Preprocess + Line 496: EXTRN ??_EDFsScript@@UEAAPEAXI@Z:PROC ; DFsScript::`vector deleting destructor' + Line 497: EXTRN ?Run@FParser@@QEAAXPEAD00@Z:PROC ; FParser::Run + Line 498: EXTRN ??_EDRunningScript@@UEAAPEAXI@Z:PROC ; DRunningScript::`vector deleting destructor' + Line 499: EXTRN ?InitFunctions@DFraggleThinker@@QEAAXXZ:PROC ; DFraggleThinker::InitFunctions + Line 500: EXTRN ??_EDFraggleThinker@@UEAAPEAXI@Z:PROC ; DFraggleThinker::`vector deleting destructor' + Line 501: EXTRN ?Next@FSectorTagIterator@@QEAAHXZ:PROC ; FSectorTagIterator::Next + Line 502: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 503: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 504: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 505: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 506: EXTRN ?ArraySize@FSerializer@@QEAAIXZ:PROC ; FSerializer::ArraySize + Line 507: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 508: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 509: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEA_NPEA_N@Z:PROC ; Serialize + Line 510: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 511: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 512: EXTRN ??$Serialize@D@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEADPEAPEAD@Z:PROC ; Serialize + Line 513: EXTRN __CxxFrameHandler3:PROC + Line 514: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 515: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 516: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 517: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 518: EXTRN ?save_full@@3_NA:BYTE ; save_full + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\t_spec.cod (25 hits) + Line 52: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 53: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 54: EXTRN malloc:PROC + Line 55: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 56: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 57: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 58: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 59: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 60: EXTRN ?Barrier@GC@@YAXPEAVDObject@@0@Z:PROC ; GC::Barrier + Line 61: EXTRN ?intvalue@@YAHAEBUsvalue_t@@@Z:PROC ; intvalue + Line 62: EXTRN ??0DFsScript@@QEAA@XZ:PROC ; DFsScript::DFsScript + Line 63: EXTRN ?NewVariable@DFsScript@@QEAAPEAUDFsVariable@@PEBDH@Z:PROC ; DFsScript::NewVariable + Line 64: EXTRN ?VariableForName@DFsScript@@QEAAPEAUDFsVariable@@PEBD@Z:PROC ; DFsScript::VariableForName + Line 65: EXTRN ?SectionStart@DFsScript@@QEAAPEADPEBUDFsSection@@@Z:PROC ; DFsScript::SectionStart + Line 66: EXTRN ?SectionEnd@DFsScript@@QEAAPEADPEBUDFsSection@@@Z:PROC ; DFsScript::SectionEnd + Line 67: EXTRN ?SectionLoop@DFsScript@@QEAAPEADPEBUDFsSection@@@Z:PROC ; DFsScript::SectionLoop + Line 68: EXTRN ?Preprocess@DFsScript@@QEAAXPEAUFLevelLocals@@@Z:PROC ; DFsScript::Preprocess + Line 69: EXTRN ?FindOperator@FParser@@QEAAHHHPEBD@Z:PROC ; FParser::FindOperator + Line 70: EXTRN ?EvaluateExpression@FParser@@QEAAXAEAUsvalue_t@@HH@Z:PROC ; FParser::EvaluateExpression + Line 71: EXTRN ?RunLineSpecial@FParser@@QEAAXPEBUFLineSpecial@@@Z:PROC ; FParser::RunLineSpecial + Line 72: EXTRN ?script_error@@YAXPEBDZZ:PROC ; script_error + Line 73: EXTRN __CxxFrameHandler3:PROC + Line 74: EXTRN memcpy:PROC + Line 75: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 76: EXTRN ?RegistrationInfo@DFsScript@@2UClassReg@@A:BYTE ; DFsScript::RegistrationInfo + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\t_variable.cod (29 hits) + Line 13: EXTRN ?RegistrationInfo@DObject@@2UClassReg@@A:BYTE ; DObject::RegistrationInfo + Line 76: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 77: EXTRN __std_terminate:PROC + Line 78: EXTRN atof:PROC + Line 79: EXTRN atoi:PROC + Line 80: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 81: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 82: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 83: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 84: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 85: EXTRN mysnprintf:PROC + Line 86: EXTRN ?Barrier@GC@@YAXPEAVDObject@@0@Z:PROC ; GC::Barrier + Line 87: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 88: EXTRN ??1DObject@@UEAA@XZ:PROC ; DObject::~DObject + Line 89: EXTRN ?Serialize@DObject@@UEAAXAEAVFSerializer@@@Z:PROC ; DObject::Serialize + Line 90: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 91: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 92: EXTRN ?PropagateMark@DObject@@UEAA_KXZ:PROC ; DObject::PropagateMark + Line 93: EXTRN ?IsMapActor@AActor@@QEAA_NXZ:PROC ; AActor::IsMapActor + Line 94: EXTRN ??_EDFsVariable@@UEAAPEAXI@Z:PROC ; DFsVariable::`vector deleting destructor' + Line 95: EXTRN ?script_error@@YAXPEBDZZ:PROC ; script_error + Line 96: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAHPEAH@Z:PROC ; Serialize + Line 97: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 98: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAVFString@@PEAV2@@Z:PROC ; Serialize + Line 99: EXTRN __CxxFrameHandler3:PROC + Line 100: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 101: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 102: EXTRN __ImageBase:BYTE + Line 103: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\tables.cod (9 hits) + Line 4473: EXTRN __vdecl_log2:PROC + Line 4474: EXTRN __vdecl_pow2:PROC + Line 4475: EXTRN __vdecl_sin2:PROC + Line 4476: EXTRN log:PROC + Line 4477: EXTRN pow:PROC + Line 4478: EXTRN sin:PROC + Line 4479: EXTRN __ImageBase:BYTE + Line 4480: EXTRN __isa_available:DWORD + Line 4481: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\tan.cod (11 hits) + Line 16: EXTRN mtherr:PROC + Line 17: EXTRN polevl:PROC + Line 18: EXTRN p1evl:PROC + Line 19: EXTRN ldexp:PROC + Line 20: EXTRN isnan:PROC + Line 21: EXTRN isfinite:PROC + Line 22: EXTRN floor:PROC + Line 23: EXTRN PIO4:QWORD + Line 24: EXTRN INFINITY:QWORD + Line 25: EXTRN NAN:QWORD + Line 26: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\tanh.cod (5 hits) + Line 16: EXTRN c_exp:PROC + Line 17: EXTRN polevl:PROC + Line 18: EXTRN p1evl:PROC + Line 19: EXTRN MAXLOG:QWORD + Line 20: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\teaminfo.cod (33 hits) + Line 168: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 169: EXTRN atexit:PROC + Line 170: EXTRN __std_terminate:PROC + Line 171: EXTRN stricmp:PROC + Line 172: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 173: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 174: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 175: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 176: EXTRN ?AppendFormat@FString@@QEAAXPEBDZZ:PROC ; FString::AppendFormat + Line 177: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 178: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 179: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 180: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 181: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 182: EXTRN ??0FScanner@@QEAA@H@Z:PROC ; FScanner::FScanner + Line 183: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 184: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 185: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 186: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 187: EXTRN ?CheckString@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::CheckString + Line 188: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 189: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 190: EXTRN ?MatchString@FScanner@@QEAAHPEBQEBD_K@Z:PROC ; FScanner::MatchString + Line 191: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 192: EXTRN ?V_ParseFontColor@@YA?AW4EColorRange@@AEAPEBEHH@Z:PROC ; V_ParseFontColor + Line 193: EXTRN ?V_GetColor@@YAHPEBIAEAVFScanner@@@Z:PROC ; V_GetColor + Line 194: EXTRN ?FindLump@FWadCollection@@QEAAHPEBDPEAH_N@Z:PROC ; FWadCollection::FindLump + Line 195: EXTRN __CxxFrameHandler3:PROC + Line 196: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 197: EXTRN ?GameNames@@3PAPEBDA:BYTE ; GameNames + Line 198: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 199: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 200: EXTRN __ImageBase:BYTE + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\texture.cod (52 hits) + Line 12: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 89: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 90: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 91: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 92: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 93: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 94: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 95: EXTRN atexit:PROC + Line 96: EXTRN __std_terminate:PROC + Line 97: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 98: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 99: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 100: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 101: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 102: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 103: EXTRN ?LastIndexOf@FString@@QEBAJD@Z:PROC ; FString::LastIndexOf + Line 104: EXTRN ?ToUpper@FString@@QEAAXXZ:PROC ; FString::ToUpper + Line 105: EXTRN ?Truncate@FString@@QEAAX_K@Z:PROC ; FString::Truncate + Line 106: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 107: EXTRN ??0FStringf@@QEAA@PEBDZZ:PROC ; FStringf::FStringf + Line 108: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 109: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 110: EXTRN ?SetLinkedTexture@FWadCollection@@QEAAXHPEAVFTexture@@@Z:PROC ; FWadCollection::SetLinkedTexture + Line 111: EXTRN ?GetLinkedTexture@FWadCollection@@QEAAPEAVFTexture@@H@Z:PROC ; FWadCollection::GetLinkedTexture + Line 112: EXTRN ?GetLumpName@FWadCollection@@QEBAXAEAVFString@@H@Z:PROC ; FWadCollection::GetLumpName + Line 113: EXTRN ?GetLumpFullName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetLumpFullName + Line 114: EXTRN ?GetUniqueIndex@FRemapTable@@QEAAHXZ:PROC ; FRemapTable::GetUniqueIndex + Line 115: EXTRN ?TranslationToTable@@YAPEAUFRemapTable@@H@Z:PROC ; TranslationToTable + Line 116: EXTRN ?CopyPixelDataRGB@FBitmap@@QEAAXHHPEBEHHHHHHPEAUFCopyInfo@@HHH@Z:PROC ; FBitmap::CopyPixelDataRGB + Line 117: EXTRN ?Pick@FColorMatcher@@QEAAEHHH@Z:PROC ; FColorMatcher::Pick + Line 118: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 119: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 120: EXTRN ?CreateUpsampledTextureBuffer@FTexture@@QEAAXAEAUFTextureBuffer@@_N1@Z:PROC ; FTexture::CreateUpsampledTextureBuffer + Line 121: EXTRN ?LoadHiresTexture@FTexture@@AEAA_NAEAUFTextureBuffer@@_N@Z:PROC ; FTexture::LoadHiresTexture + Line 122: EXTRN ??_EFTexture@@UEAAPEAXI@Z:PROC ; FTexture::`vector deleting destructor' + Line 123: EXTRN ?FindTexture@FTextureManager@@QEAAPEAVFTexture@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::FindTexture + Line 124: EXTRN ?AddTexture@FTextureManager@@QEAA?AVFTextureID@@PEAVFTexture@@@Z:PROC ; FTextureManager::AddTexture + Line 125: EXTRN ?SpriteAdjustChanged@FTextureManager@@QEAAXXZ:PROC ; FTextureManager::SpriteAdjustChanged + Line 126: EXTRN ??_EFWrapperTexture@@UEAAPEAXI@Z:PROC ; FWrapperTexture::`vector deleting destructor' + Line 127: EXTRN ??1FMaterial@@QEAA@XZ:PROC ; FMaterial::~FMaterial + Line 128: EXTRN ?SetSpriteRect@FMaterial@@QEAAXXZ:PROC ; FMaterial::SetSpriteRect + Line 129: EXTRN ?GetImage@FImageSource@@SAPEAV1@HW4ETextureType@@@Z:PROC ; FImageSource::GetImage + Line 130: EXTRN ??0FImageTexture@@QEAA@PEAVFImageSource@@PEBD@Z:PROC ; FImageTexture::FImageTexture + Line 131: EXTRN ?CreateBrightmapTexture@@YAPEAVFTexture@@PEAVFImageSource@@@Z:PROC ; CreateBrightmapTexture + Line 132: EXTRN __CxxFrameHandler3:PROC + Line 133: EXTRN memset:PROC + Line 134: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 135: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 136: EXTRN ?AllPalettes@FUniquePalette@@0V?$TArray@UPalData@FUniquePalette@@U12@@@A:BYTE ; FUniquePalette::AllPalettes + Line 137: EXTRN ?ColorMatcher@@3VFColorMatcher@@A:QWORD ; ColorMatcher + Line 138: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 139: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\texturemanager.cod (101 hits) + Line 28: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 188: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 189: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 190: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 191: EXTRN atexit:PROC + Line 192: EXTRN __std_terminate:PROC + Line 193: EXTRN strchr:PROC + Line 194: EXTRN stricmp:PROC + Line 195: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 196: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 197: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 198: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 199: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 200: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 201: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 202: EXTRN ?Left@FString@@QEBA?AV1@_K@Z:PROC ; FString::Left + Line 203: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 204: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 205: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 206: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 207: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 208: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 209: EXTRN ?GetFirstLump@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetFirstLump + Line 210: EXTRN ?GetLastLump@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLastLump + Line 211: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 212: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDHH_N@Z:PROC ; FWadCollection::CheckNumForName + Line 213: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 214: EXTRN ?SetLinkedTexture@FWadCollection@@QEAAXHPEAVFTexture@@@Z:PROC ; FWadCollection::SetLinkedTexture + Line 215: EXTRN ?GetLinkedTexture@FWadCollection@@QEAAPEAVFTexture@@H@Z:PROC ; FWadCollection::GetLinkedTexture + Line 216: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 217: EXTRN ?OpenLumpReader@FWadCollection@@QEAA?AVFileReader@@H@Z:PROC ; FWadCollection::OpenLumpReader + Line 218: EXTRN ?ReopenLumpReader@FWadCollection@@QEAA?AVFileReader@@H_N@Z:PROC ; FWadCollection::ReopenLumpReader + Line 219: EXTRN ?FindLump@FWadCollection@@QEAAHPEBDPEAH_N@Z:PROC ; FWadCollection::FindLump + Line 220: EXTRN ?CheckLumpName@FWadCollection@@QEAA_NHPEBD@Z:PROC ; FWadCollection::CheckLumpName + Line 221: EXTRN ?GetLumpFlags@FWadCollection@@QEAAHH@Z:PROC ; FWadCollection::GetLumpFlags + Line 222: EXTRN ?GetLumpName@FWadCollection@@QEBAXPEADH@Z:PROC ; FWadCollection::GetLumpName + Line 223: EXTRN ?GetLumpName@FWadCollection@@QEBAXAEAVFString@@H@Z:PROC ; FWadCollection::GetLumpName + Line 224: EXTRN ?GetLumpFullName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetLumpFullName + Line 225: EXTRN ?GetLumpFullPath@FWadCollection@@QEBA?AVFString@@H@Z:PROC ; FWadCollection::GetLumpFullPath + Line 226: EXTRN ?GetLumpFile@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpFile + Line 227: EXTRN ?GetLumpNamespace@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpNamespace + Line 228: EXTRN ?GetNumLumps@FWadCollection@@QEBAHXZ:PROC ; FWadCollection::GetNumLumps + Line 229: EXTRN ?GetNumWads@FWadCollection@@QEBAHXZ:PROC ; FWadCollection::GetNumWads + Line 230: EXTRN ??0FRemapTable@@QEAA@H@Z:PROC ; FRemapTable::FRemapTable + Line 231: EXTRN ??1FRemapTable@@QEAA@XZ:PROC ; FRemapTable::~FRemapTable + Line 232: EXTRN ?MakeIdentity@FRemapTable@@QEAAXXZ:PROC ; FRemapTable::MakeIdentity + Line 233: EXTRN ?MakeKey@@YAIPEBD@Z:PROC ; MakeKey + Line 234: EXTRN ??0FScanner@@QEAA@XZ:PROC ; FScanner::FScanner + Line 235: EXTRN ??0FScanner@@QEAA@H@Z:PROC ; FScanner::FScanner + Line 236: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 237: EXTRN ?OpenLumpNum@FScanner@@QEAAXH@Z:PROC ; FScanner::OpenLumpNum + Line 238: EXTRN ?SetCMode@FScanner@@QEAAX_N@Z:PROC ; FScanner::SetCMode + Line 239: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 240: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 241: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 242: EXTRN ?CheckString@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::CheckString + Line 243: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 244: EXTRN ?UnGet@FScanner@@QEAAXXZ:PROC ; FScanner::UnGet + Line 245: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 246: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 247: EXTRN ?ScriptMessage@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptMessage + Line 248: EXTRN ?ExtractFileBase@@YA?AVFString@@PEBD_N@Z:PROC ; ExtractFileBase + Line 249: EXTRN ?FreeAll@FMemArena@@QEAAXXZ:PROC ; FMemArena::FreeAll + Line 250: EXTRN ?ReadPalette@@YAXHPEAE@Z:PROC ; ReadPalette + Line 251: EXTRN ?Pick@FColorMatcher@@QEAAEHHH@Z:PROC ; FColorMatcher::Pick + Line 252: EXTRN ?CreateTexture@FTexture@@SAPEAV1@PEBDHW4ETextureType@@@Z:PROC ; FTexture::CreateTexture + Line 253: EXTRN ?AddAutoMaterials@FTexture@@QEAAXXZ:PROC ; FTexture::AddAutoMaterials + Line 254: EXTRN ?SetFrontSkyLayer@FTexture@@IEAAXXZ:PROC ; FTexture::SetFrontSkyLayer + Line 255: EXTRN ?InitGrayMap@FTexture@@KAXXZ:PROC ; FTexture::InitGrayMap + Line 256: EXTRN ?SetScaledSize@FTexture@@IEAAXHH@Z:PROC ; FTexture::SetScaledSize + Line 257: EXTRN ?CheckRealHeight@FTexture@@QEAAHXZ:PROC ; FTexture::CheckRealHeight + Line 258: EXTRN ?SetSpriteAdjust@FTexture@@QEAAXXZ:PROC ; FTexture::SetSpriteAdjust + Line 259: EXTRN ?InitBuildTiles@FTextureManager@@AEAAXXZ:PROC ; FTextureManager::InitBuildTiles + Line 260: EXTRN ?FixAnimations@FTextureManager@@AEAAXXZ:PROC ; FTextureManager::FixAnimations + Line 261: EXTRN ?InitAnimated@FTextureManager@@AEAAXXZ:PROC ; FTextureManager::InitAnimated + Line 262: EXTRN ?InitAnimDefs@FTextureManager@@AEAAXXZ:PROC ; FTextureManager::InitAnimDefs + Line 263: EXTRN ?SetTranslation@FTextureManager@@AEAAXVFTextureID@@0@Z:PROC ; FTextureManager::SetTranslation + Line 264: EXTRN ?InitSwitchList@FTextureManager@@AEAAXXZ:PROC ; FTextureManager::InitSwitchList + Line 265: EXTRN ?R_InitSkyMap@@YAXXZ:PROC ; R_InitSkyMap + Line 266: EXTRN ??0FImageTexture@@QEAA@PEAVFImageSource@@PEBD@Z:PROC ; FImageTexture::FImageTexture + Line 267: EXTRN ?AddTexturesLumps@FMultipatchTextureBuilder@@QEAAXHHH@Z:PROC ; FMultipatchTextureBuilder::AddTexturesLumps + Line 268: EXTRN ?ParseTexture@FMultipatchTextureBuilder@@QEAAXAEAVFScanner@@W4ETextureType@@@Z:PROC ; FMultipatchTextureBuilder::ParseTexture + Line 269: EXTRN ?ResolveAllPatches@FMultipatchTextureBuilder@@QEAAXXZ:PROC ; FMultipatchTextureBuilder::ResolveAllPatches + Line 270: EXTRN ?CreateShaderTexture@@YAPEAVFTexture@@_N0@Z:PROC ; CreateShaderTexture + Line 271: EXTRN __CxxFrameHandler3:PROC + Line 272: EXTRN memmove:PROC + Line 273: EXTRN memset:PROC + Line 274: EXTRN sin:PROC + Line 275: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 276: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 277: EXTRN ?SpriteFrames@@3V?$TArray@Uspriteframe_t@@U1@@@A:BYTE ; SpriteFrames + Line 278: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 279: EXTRN ?StartScreen@@3PEAVFStartupScreen@@EA:QWORD ; StartScreen + Line 280: EXTRN ?wadlevelinfos@@3V?$TArray@Ulevel_info_t@@U1@@@A:BYTE ; wadlevelinfos + Line 281: EXTRN ?ColorMatcher@@3VFColorMatcher@@A:QWORD ; ColorMatcher + Line 282: EXTRN ?vid_rendermode@@3VFIntCVar@@A:BYTE ; vid_rendermode + Line 283: EXTRN ?ImageArena@FImageSource@@1VFMemArena@@A:BYTE ; FImageSource::ImageArena + Line 284: EXTRN ?ImageForLump@FImageSource@@1V?$TArray@PEAVFImageSource@@PEAV1@@@A:BYTE ; FImageSource::ImageForLump + Line 285: EXTRN ?NextID@FImageSource@@1HA:DWORD ; FImageSource::NextID + Line 286: EXTRN __ImageBase:BYTE + Line 287: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\tgatexture.cod (24 hits) + Line 22: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 23: EXTRN __std_terminate:PROC + Line 24: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 25: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 26: EXTRN ?OpenLumpReader@FWadCollection@@QEAA?AVFileReader@@H@Z:PROC ; FWadCollection::OpenLumpReader + Line 27: EXTRN ?CopyPixelDataRGB@FBitmap@@QEAAXHHPEBEHHHHHHPEAUFCopyInfo@@HHH@Z:PROC ; FBitmap::CopyPixelDataRGB + Line 28: EXTRN ?CopyPixelData@FBitmap@@QEAAXHHPEBEHHHHHPEAUPalEntry@@PEAUFCopyInfo@@@Z:PROC ; FBitmap::CopyPixelData + Line 29: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 30: EXTRN ?Pick@FColorMatcher@@QEAAEHHH@Z:PROC ; FColorMatcher::Pick + Line 31: EXTRN ?CreatePalettedPixels@FImageSource@@MEAA?AV?$TArray@EE@@H@Z:PROC ; FImageSource::CreatePalettedPixels + Line 32: EXTRN ?CopyPixels@FImageSource@@MEAAHPEAVFBitmap@@H@Z:PROC ; FImageSource::CopyPixels + Line 33: EXTRN ?CollectForPrecache@FImageSource@@UEAAXAEAV?$TMap@HU?$pair@HH@std@@U?$THashTraits@H@@U?$TValueTraits@U?$pair@HH@std@@@@@@_N@Z:PROC ; FImageSource::CollectForPrecache + Line 34: EXTRN ??_EFImageSource@@UEAAPEAXI@Z:PROC ; FImageSource::`vector deleting destructor' + Line 35: EXTRN ??_EFTGATexture@@UEAAPEAXI@Z:PROC ; FTGATexture::`vector deleting destructor' + Line 36: EXTRN __CxxFrameHandler3:PROC + Line 37: EXTRN memset:PROC + Line 38: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 39: EXTRN ?RGB256k@@3TColorTable256k@@A:BYTE ; RGB256k + Line 40: EXTRN ?GPalette@@3UFPalette@@A:BYTE ; GPalette + Line 41: EXTRN ?ColorMatcher@@3VFColorMatcher@@A:QWORD ; ColorMatcher + Line 42: EXTRN ?translationtables@@3PAV?$TAutoGrowArray@VFRemapTablePtr@@PEAUFRemapTable@@@@A:BYTE ; translationtables + Line 43: EXTRN ?GrayMap@ImageHelpers@@3PAEA:BYTE ; ImageHelpers::GrayMap + Line 44: EXTRN ?ImageArena@FImageSource@@1VFMemArena@@A:BYTE ; FImageSource::ImageArena + Line 45: EXTRN ?NextID@FImageSource@@1HA:DWORD ; FImageSource::NextID + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\thingdef.cod (66 hits) + Line 66: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 67: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 68: EXTRN atexit:PROC + Line 69: EXTRN __std_terminate:PROC + Line 70: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 71: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 72: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 73: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 74: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 75: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 76: EXTRN ??0FStringf@@QEAA@PEBDZZ:PROC ; FStringf::FStringf + Line 77: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 78: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 79: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 80: EXTRN ??1DObject@@UEAA@XZ:PROC ; DObject::~DObject + Line 81: EXTRN ?Serialize@DObject@@UEAAXAEAVFSerializer@@@Z:PROC ; DObject::Serialize + Line 82: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 83: EXTRN ?PropagateMark@DObject@@UEAA_KXZ:PROC ; DObject::PropagateMark + Line 84: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 85: EXTRN ?StaticType@PSymbol@@UEBAPEAVPClass@@XZ:PROC ; PSymbol::StaticType + Line 86: EXTRN ??_EPSymbol@@UEAAPEAXI@Z:PROC ; PSymbol::`vector deleting destructor' + Line 87: EXTRN ?StaticType@PFunction@@UEBAPEAVPClass@@XZ:PROC ; PFunction::StaticType + Line 88: EXTRN ?AddVariant@PFunction@@QEAAIPEAVPPrototype@@AEAV?$TArray@II@@AEAV?$TArray@VFName@@V1@@@PEAVVMFunction@@HH@Z:PROC ; PFunction::AddVariant + Line 89: EXTRN ??_EPFunction@@UEAAPEAXI@Z:PROC ; PFunction::`vector deleting destructor' + Line 90: EXTRN ?FindSymbolInTable@PSymbolTable@@QEAAPEAVPSymbol@@VFName@@AEAPEAU1@@Z:PROC ; PSymbolTable::FindSymbolInTable + Line 91: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 92: EXTRN ?StaticGetStateName@FState@@SA?AVFString@@PEBU1@@Z:PROC ; FState::StaticGetStateName + Line 93: EXTRN ?FindLabel@FStateLabels@@QEAAPEAUFStateLabel@@VFName@@@Z:PROC ; FStateLabels::FindLabel + Line 94: EXTRN ?FindState@PClassActor@@QEBAPEAUFState@@HPEAVFName@@_N@Z:PROC ; PClassActor::FindState + Line 95: EXTRN ??0FScriptPosition@@QEAA@AEBU0@@Z:PROC ; FScriptPosition::FScriptPosition + Line 96: EXTRN ??0FScriptPosition@@QEAA@VFString@@H@Z:PROC ; FScriptPosition::FScriptPosition + Line 97: EXTRN ??4FScriptPosition@@QEAAAEAU0@AEBU0@@Z:PROC ; FScriptPosition::operator= + Line 98: EXTRN ?Message@FScriptPosition@@QEBAXHPEBDZZ:PROC ; FScriptPosition::Message + Line 99: EXTRN ?AddFunction@FFunctionBuildList@@QEAAPEAVVMFunction@@PEAVPNamespace@@AEBUVersionInfo@@PEAVPFunction@@PEAVFxExpression@@AEBVFString@@_NHHH@Z:PROC ; FFunctionBuildList::AddFunction + Line 100: EXTRN ?Build@FFunctionBuildList@@QEAAXXZ:PROC ; FFunctionBuildList::Build + Line 101: EXTRN ?NewPointer@@YAPEAVPPointer@@PEAVPType@@_N@Z:PROC ; NewPointer + Line 102: EXTRN ?NewPointer@@YAPEAVPPointer@@PEAVPClass@@_N@Z:PROC ; NewPointer + Line 103: EXTRN ?NewStruct@@YAPEAVPStruct@@VFName@@PEAVPTypeBase@@_N@Z:PROC ; NewStruct + Line 104: EXTRN ?NewPrototype@@YAPEAVPPrototype@@AEBV?$TArray@PEAVPType@@PEAV1@@@0@Z:PROC ; NewPrototype + Line 105: EXTRN ??0FxIntCast@@QEAA@PEAVFxExpression@@_N11@Z:PROC ; FxIntCast::FxIntCast + Line 106: EXTRN ??0FxReturnStatement@@QEAA@PEAVFxExpression@@AEBUFScriptPosition@@@Z:PROC ; FxReturnStatement::FxReturnStatement + Line 107: EXTRN ?InstallStates@FStateDefinitions@@QEAAXPEAVPClassActor@@PEAVAActor@@@Z:PROC ; FStateDefinitions::InstallStates + Line 108: EXTRN ?FinishStates@FStateDefinitions@@QEAAHPEAVPClassActor@@@Z:PROC ; FStateDefinitions::FinishStates + Line 109: EXTRN ?MakeStateDefines@FStateDefinitions@@QEAAXPEBVPClassActor@@@Z:PROC ; FStateDefinitions::MakeStateDefines + Line 110: EXTRN ?InitThingdef@@YAXXZ:PROC ; InitThingdef + Line 111: EXTRN ?ParseScripts@@YAXXZ:PROC ; ParseScripts + Line 112: EXTRN ?ParseAllDecorate@@YAXXZ:PROC ; ParseAllDecorate + Line 113: EXTRN ?SynthesizeFlagFields@@YAXXZ:PROC ; SynthesizeFlagFields + Line 114: EXTRN _CxxThrowException:PROC + Line 115: EXTRN __CxxFrameHandler3:PROC + Line 116: EXTRN memmove:PROC + Line 117: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 118: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 119: EXTRN ?batchrun@@3_NA:BYTE ; batchrun + Line 120: EXTRN ?RegistrationInfo@PFunction@@2UClassReg@@A:BYTE ; PFunction::RegistrationInfo + Line 121: EXTRN ?bVMOperational@PClass@@2_NA:BYTE ; PClass::bVMOperational + Line 122: EXTRN ?AllActorClasses@PClassActor@@2V?$TArray@PEAVPClassActor@@PEAV1@@@A:BYTE ; PClassActor::AllActorClasses + Line 123: EXTRN ?WarnCounter@FScriptPosition@@2HA:DWORD ; FScriptPosition::WarnCounter + Line 124: EXTRN ?ErrorCounter@FScriptPosition@@2HA:DWORD ; FScriptPosition::ErrorCounter + Line 125: EXTRN ?StrictErrors@FScriptPosition@@2_NA:BYTE ; FScriptPosition::StrictErrors + Line 126: EXTRN ?PerfToMillisec@@3NA:QWORD ; PerfToMillisec + Line 127: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 128: EXTRN ?FunctionBuildList@@3VFFunctionBuildList@@A:BYTE ; FunctionBuildList + Line 129: EXTRN ?TypeSInt32@@3PEAVPInt@@EA:QWORD ; TypeSInt32 + Line 130: EXTRN ?FxAlloc@@3VFMemArena@@A:BYTE ; FxAlloc + Line 131: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\thingdef_data.cod (58 hits) + Line 315: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 3688: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 3689: EXTRN atexit:PROC + Line 3690: EXTRN __std_terminate:PROC + Line 3691: EXTRN qsort:PROC + Line 3692: EXTRN stricmp:PROC + Line 3693: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 3694: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 3695: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 3696: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_K_N@Z:PROC ; FName::NameManager::FindName + Line 3697: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 3698: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 3699: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 3700: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 3701: EXTRN ??YFString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator+= + Line 3702: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 3703: EXTRN ?Mid@FString@@QEBA?AV1@_K0@Z:PROC ; FString::Mid + Line 3704: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 3705: EXTRN ?AppendFormat@FString@@QEAAXPEBDZZ:PROC ; FString::AppendFormat + Line 3706: EXTRN ?IsInt@FString@@QEBA_NXZ:PROC ; FString::IsInt + Line 3707: EXTRN ?ToLong@FString@@QEBAJH@Z:PROC ; FString::ToLong + Line 3708: EXTRN ?ToDouble@FString@@QEBANXZ:PROC ; FString::ToDouble + Line 3709: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 3710: EXTRN ??0FStringf@@QEAA@PEBDZZ:PROC ; FStringf::FStringf + Line 3711: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 3712: EXTRN ?FindSymbol@PClass@@QEBAPEAVPSymbol@@VFName@@_N@Z:PROC ; PClass::FindSymbol + Line 3713: EXTRN ?ThrowAbortException@@YAXW4EVMAbortException@@PEBDZZ:PROC ; ThrowAbortException + Line 3714: EXTRN ??_EVMFunction@@UEAAPEAXI@Z:PROC ; VMFunction::`vector deleting destructor' + Line 3715: EXTRN ?NativeScriptCall@VMNativeFunction@@CAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMNativeFunction::NativeScriptCall + Line 3716: EXTRN ??_EVMNativeFunction@@UEAAPEAXI@Z:PROC ; VMNativeFunction::`vector deleting destructor' + Line 3717: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 3718: EXTRN ??$Serialize@Usector_t@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUsector_t@@PEAPEAU1@@Z:PROC ; Serialize + Line 3719: EXTRN ??$Serialize@Vplayer_t@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAVplayer_t@@PEAPEAV1@@Z:PROC ; Serialize + Line 3720: EXTRN ??$Serialize@Uline_t@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUline_t@@PEAPEAU1@@Z:PROC ; Serialize + Line 3721: EXTRN ??$Serialize@Uside_t@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUside_t@@PEAPEAU1@@Z:PROC ; Serialize + Line 3722: EXTRN ??$Serialize@Uvertex_t@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAUvertex_t@@PEAPEAU1@@Z:PROC ; Serialize + Line 3723: EXTRN ??$Serialize@VFFont@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAVFFont@@PEAPEAV1@@Z:PROC ; Serialize + Line 3724: EXTRN ?NewPointer@@YAPEAVPPointer@@PEAVPType@@_N@Z:PROC ; NewPointer + Line 3725: EXTRN ?NewStruct@@YAPEAVPStruct@@VFName@@PEAVPTypeBase@@_N@Z:PROC ; NewStruct + Line 3726: EXTRN __CxxFrameHandler3:PROC + Line 3727: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 3728: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 3729: EXTRN ?ClassDataAllocator@@3VFMemArena@@A:BYTE ; ClassDataAllocator + Line 3730: EXTRN ?RegistrationInfo@PPropFlag@@2UClassReg@@A:BYTE ; PPropFlag::RegistrationInfo + Line 3731: EXTRN ?RegistrationInfo@PFunction@@2UClassReg@@A:BYTE ; PFunction::RegistrationInfo + Line 3732: EXTRN ?ARegHead@@3QEAXEA:QWORD ; ARegHead + Line 3733: EXTRN ?ARegTail@@3QEAXEA:QWORD ; ARegTail + Line 3734: EXTRN ?CRegHead@@3QEAXEA:QWORD ; CRegHead + Line 3735: EXTRN ?CRegTail@@3QEAXEA:QWORD ; CRegTail + Line 3736: EXTRN ?FRegHead@@3QEAXEA:QWORD ; FRegHead + Line 3737: EXTRN ?FRegTail@@3QEAXEA:QWORD ; FRegTail + Line 3738: EXTRN ?GRegHead@@3QEAXEA:QWORD ; GRegHead + Line 3739: EXTRN ?GRegTail@@3QEAXEA:QWORD ; GRegTail + Line 3740: EXTRN ?AllFunctions@VMFunction@@2V?$TArray@PEAVVMFunction@@PEAV1@@@A:BYTE ; VMFunction::AllFunctions + Line 3741: EXTRN ?TypeSInt16@@3PEAVPInt@@EA:QWORD ; TypeSInt16 + Line 3742: EXTRN ?TypeSInt32@@3PEAVPInt@@EA:QWORD ; TypeSInt32 + Line 3743: EXTRN __ImageBase:BYTE + Line 3744: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\thingdef_exp.cod (81 hits) + Line 35: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 36: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 37: EXTRN atexit:PROC + Line 38: EXTRN __std_terminate:PROC + Line 39: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 40: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 41: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 42: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 43: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 44: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 45: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 46: EXTRN ?FindSymbol@PClass@@QEBAPEAVPSymbol@@VFName@@_N@Z:PROC ; PClass::FindSymbol + Line 47: EXTRN ??0FRandom@@QEAA@PEBD@Z:PROC ; FRandom::FRandom + Line 48: EXTRN ??1FRandom@@QEAA@XZ:PROC ; FRandom::~FRandom + Line 49: EXTRN ?StaticFindRNG@FRandom@@SAPEAV1@PEBD@Z:PROC ; FRandom::StaticFindRNG + Line 50: EXTRN ?TokenName@FScanner@@SA?AVFString@@HPEBD@Z:PROC ; FScanner::TokenName + Line 51: EXTRN ?GetToken@FScanner@@QEAA_NXZ:PROC ; FScanner::GetToken + Line 52: EXTRN ?MustGetToken@FScanner@@QEAAXH@Z:PROC ; FScanner::MustGetToken + Line 53: EXTRN ?CheckToken@FScanner@@QEAA_NH@Z:PROC ; FScanner::CheckToken + Line 54: EXTRN ?UnGet@FScanner@@QEAAXXZ:PROC ; FScanner::UnGet + Line 55: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 56: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 57: EXTRN ??0FScriptPosition@@QEAA@AEBU0@@Z:PROC ; FScriptPosition::FScriptPosition + Line 58: EXTRN ??0FScriptPosition@@QEAA@AEAVFScanner@@@Z:PROC ; FScriptPosition::FScriptPosition + Line 59: EXTRN ?ParseFunctionParameters@@YAXAEAVFScanner@@PEAVPClassActor@@AEAV?$TArray@PEAVFxExpression@@PEAV1@@@PEAVPFunction@@VFString@@PEAVFStateDefinitions@@@Z:PROC ; ParseFunctionParameters + Line 60: EXTRN ??0FCompileContext@@QEAA@PEAVPNamespace@@PEAVPContainerType@@_N@Z:PROC ; FCompileContext::FCompileContext + Line 61: EXTRN ?Resolve@FxExpression@@UEAAPEAV1@AEAUFCompileContext@@@Z:PROC ; FxExpression::Resolve + Line 62: EXTRN ?isConstant@FxExpression@@UEBA_NXZ:PROC ; FxExpression::isConstant + Line 63: EXTRN ?RequestAddress@FxExpression@@UEAA_NAEAUFCompileContext@@PEA_N@Z:PROC ; FxExpression::RequestAddress + Line 64: EXTRN ?ReturnProto@FxExpression@@UEAAPEAVPPrototype@@XZ:PROC ; FxExpression::ReturnProto + Line 65: EXTRN ?GetDirectFunction@FxExpression@@UEAAPEAVVMFunction@@PEAVPFunction@@AEBUVersionInfo@@@Z:PROC ; FxExpression::GetDirectFunction + Line 66: EXTRN ?Emit@FxExpression@@UEAA?AUExpEmit@@PEAVVMFunctionBuilder@@@Z:PROC ; FxExpression::Emit + Line 67: EXTRN ?EmitCompare@FxExpression@@UEAAXPEAVVMFunctionBuilder@@_NAEAV?$TArray@_K_K@@2@Z:PROC ; FxExpression::EmitCompare + Line 68: EXTRN ??_EFxExpression@@UEAAPEAXI@Z:PROC ; FxExpression::`vector deleting destructor' + Line 69: EXTRN ??0FxIdentifier@@QEAA@VFName@@AEBUFScriptPosition@@@Z:PROC ; FxIdentifier::FxIdentifier + Line 70: EXTRN ?Emit@FxConstant@@UEAA?AUExpEmit@@PEAVVMFunctionBuilder@@@Z:PROC ; FxConstant::Emit + Line 71: EXTRN ??_EFxConstant@@UEAAPEAXI@Z:PROC ; FxConstant::`vector deleting destructor' + Line 72: EXTRN ??0FxBoolCast@@QEAA@PEAVFxExpression@@_N@Z:PROC ; FxBoolCast::FxBoolCast + Line 73: EXTRN ??0FxIntCast@@QEAA@PEAVFxExpression@@_N11@Z:PROC ; FxIntCast::FxIntCast + Line 74: EXTRN ??0FxFloatCast@@QEAA@PEAVFxExpression@@@Z:PROC ; FxFloatCast::FxFloatCast + Line 75: EXTRN ??0FxPlusSign@@QEAA@PEAVFxExpression@@@Z:PROC ; FxPlusSign::FxPlusSign + Line 76: EXTRN ??0FxMinusSign@@QEAA@PEAVFxExpression@@@Z:PROC ; FxMinusSign::FxMinusSign + Line 77: EXTRN ??0FxUnaryNotBitwise@@QEAA@PEAVFxExpression@@@Z:PROC ; FxUnaryNotBitwise::FxUnaryNotBitwise + Line 78: EXTRN ??0FxUnaryNotBoolean@@QEAA@PEAVFxExpression@@@Z:PROC ; FxUnaryNotBoolean::FxUnaryNotBoolean + Line 79: EXTRN ??0FxPreIncrDecr@@QEAA@PEAVFxExpression@@H@Z:PROC ; FxPreIncrDecr::FxPreIncrDecr + Line 80: EXTRN ??0FxPostIncrDecr@@QEAA@PEAVFxExpression@@H@Z:PROC ; FxPostIncrDecr::FxPostIncrDecr + Line 81: EXTRN ??0FxAssign@@QEAA@PEAVFxExpression@@0_N@Z:PROC ; FxAssign::FxAssign + Line 82: EXTRN ??0FxAssignSelf@@QEAA@AEBUFScriptPosition@@@Z:PROC ; FxAssignSelf::FxAssignSelf + Line 83: EXTRN ??0FxAddSub@@QEAA@HPEAVFxExpression@@0@Z:PROC ; FxAddSub::FxAddSub + Line 84: EXTRN ??0FxMulDiv@@QEAA@HPEAVFxExpression@@0@Z:PROC ; FxMulDiv::FxMulDiv + Line 85: EXTRN ??0FxCompareRel@@QEAA@HPEAVFxExpression@@0@Z:PROC ; FxCompareRel::FxCompareRel + Line 86: EXTRN ??0FxCompareEq@@QEAA@HPEAVFxExpression@@0@Z:PROC ; FxCompareEq::FxCompareEq + Line 87: EXTRN ??0FxBitOp@@QEAA@HPEAVFxExpression@@0@Z:PROC ; FxBitOp::FxBitOp + Line 88: EXTRN ??0FxShift@@QEAA@HPEAVFxExpression@@0@Z:PROC ; FxShift::FxShift + Line 89: EXTRN ??0FxBinaryLogical@@QEAA@HPEAVFxExpression@@0@Z:PROC ; FxBinaryLogical::FxBinaryLogical + Line 90: EXTRN ??0FxConditional@@QEAA@PEAVFxExpression@@00@Z:PROC ; FxConditional::FxConditional + Line 91: EXTRN ??0FxAbs@@QEAA@PEAVFxExpression@@@Z:PROC ; FxAbs::FxAbs + Line 92: EXTRN ??0FxATan2@@QEAA@PEAVFxExpression@@0AEBUFScriptPosition@@@Z:PROC ; FxATan2::FxATan2 + Line 93: EXTRN ??0FxMinMax@@QEAA@AEAV?$TArray@PEAVFxExpression@@PEAV1@@@VFName@@AEBUFScriptPosition@@@Z:PROC ; FxMinMax::FxMinMax + Line 94: EXTRN ??0FxRandom@@QEAA@PEAVFRandom@@PEAVFxExpression@@1AEBUFScriptPosition@@_N@Z:PROC ; FxRandom::FxRandom + Line 95: EXTRN ??0FxRandomPick@@QEAA@PEAVFRandom@@AEAV?$TArray@PEAVFxExpression@@PEAV1@@@_NAEBUFScriptPosition@@2@Z:PROC ; FxRandomPick::FxRandomPick + Line 96: EXTRN ??0FxFRandom@@QEAA@PEAVFRandom@@PEAVFxExpression@@1AEBUFScriptPosition@@@Z:PROC ; FxFRandom::FxFRandom + Line 97: EXTRN ??0FxRandom2@@QEAA@PEAVFRandom@@PEAVFxExpression@@AEBUFScriptPosition@@_N@Z:PROC ; FxRandom2::FxRandom2 + Line 98: EXTRN ??0FxSelf@@QEAA@AEBUFScriptPosition@@_N@Z:PROC ; FxSelf::FxSelf + Line 99: EXTRN ??0FxArrayElement@@QEAA@PEAVFxExpression@@0@Z:PROC ; FxArrayElement::FxArrayElement + Line 100: EXTRN ??0FxFunctionCall@@QEAA@VFName@@0AEAV?$TDeletingArray@PEAVFxExpression@@PEAV1@@@AEBUFScriptPosition@@@Z:PROC ; FxFunctionCall::FxFunctionCall + Line 101: EXTRN ??0FxVMFunctionCall@@QEAA@PEAVFxExpression@@PEAVPFunction@@AEAV?$TDeletingArray@PEAVFxExpression@@PEAV1@@@AEBUFScriptPosition@@_N@Z:PROC ; FxVMFunctionCall::FxVMFunctionCall + Line 102: EXTRN ??0FxRuntimeStateIndex@@QEAA@PEAVFxExpression@@@Z:PROC ; FxRuntimeStateIndex::FxRuntimeStateIndex + Line 103: EXTRN ??0FxMultiNameState@@QEAA@PEBDAEBUFScriptPosition@@PEAVPClassActor@@@Z:PROC ; FxMultiNameState::FxMultiNameState + Line 104: EXTRN __CxxFrameHandler3:PROC + Line 105: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 106: EXTRN ?RegistrationInfo@PFunction@@2UClassReg@@A:BYTE ; PFunction::RegistrationInfo + Line 107: EXTRN ?TypeSInt32@@3PEAVPInt@@EA:QWORD ; TypeSInt32 + Line 108: EXTRN ?TypeBool@@3PEAVPBool@@EA:QWORD ; TypeBool + Line 109: EXTRN ?TypeFloat64@@3PEAVPFloat@@EA:QWORD ; TypeFloat64 + Line 110: EXTRN ?TypeString@@3PEAVPString@@EA:QWORD ; TypeString + Line 111: EXTRN ?TypeName@@3PEAVPName@@EA:QWORD ; TypeName + Line 112: EXTRN ?TypeState@@3PEAVPStatePointer@@EA:QWORD ; TypeState + Line 113: EXTRN ?FxAlloc@@3VFMemArena@@A:BYTE ; FxAlloc + Line 114: EXTRN __ImageBase:BYTE + Line 115: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\thingdef_parse.cod (143 hits) + Line 155: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 156: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 157: EXTRN atexit:PROC + Line 158: EXTRN _Init_thread_header:PROC + Line 159: EXTRN _Init_thread_footer:PROC + Line 160: EXTRN __std_terminate:PROC + Line 161: EXTRN strchr:PROC + Line 162: EXTRN stricmp:PROC + Line 163: EXTRN strlwr:PROC + Line 164: EXTRN strnicmp:PROC + Line 165: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 166: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 167: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 168: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 169: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_K_N@Z:PROC ; FName::NameManager::FindName + Line 170: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 171: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 172: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 173: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 174: EXTRN ??YFString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator+= + Line 175: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 176: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 177: EXTRN ?Insert@FString@@QEAAX_KPEBD@Z:PROC ; FString::Insert + Line 178: EXTRN ?Substitute@FString@@QEAAXPEBD0@Z:PROC ; FString::Substitute + Line 179: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 180: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 181: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 182: EXTRN ??1DObject@@UEAA@XZ:PROC ; DObject::~DObject + Line 183: EXTRN ?Serialize@DObject@@UEAAXAEAVFSerializer@@@Z:PROC ; DObject::Serialize + Line 184: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 185: EXTRN ?PropagateMark@DObject@@UEAA_KXZ:PROC ; DObject::PropagateMark + Line 186: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 187: EXTRN ?StaticType@PSymbol@@UEBAPEAVPClass@@XZ:PROC ; PSymbol::StaticType + Line 188: EXTRN ??_EPSymbol@@UEAAPEAXI@Z:PROC ; PSymbol::`vector deleting destructor' + Line 189: EXTRN ?StaticType@PSymbolConst@@UEBAPEAVPClass@@XZ:PROC ; PSymbolConst::StaticType + Line 190: EXTRN ??_EPSymbolConst@@UEAAPEAXI@Z:PROC ; PSymbolConst::`vector deleting destructor' + Line 191: EXTRN ?StaticType@PSymbolConstNumeric@@UEBAPEAVPClass@@XZ:PROC ; PSymbolConstNumeric::StaticType + Line 192: EXTRN ??_EPSymbolConstNumeric@@UEAAPEAXI@Z:PROC ; PSymbolConstNumeric::`vector deleting destructor' + Line 193: EXTRN ?FindSymbol@PSymbolTable@@QEBAPEAVPSymbol@@VFName@@_N@Z:PROC ; PSymbolTable::FindSymbol + Line 194: EXTRN ?AddSymbol@PSymbolTable@@QEAAPEAVPSymbol@@PEAV2@@Z:PROC ; PSymbolTable::AddSymbol + Line 195: EXTRN ?NewNamespace@FNamespaceManager@@QEAAPEAVPNamespace@@H@Z:PROC ; FNamespaceManager::NewNamespace + Line 196: EXTRN ?FindSymbol@PClass@@QEBAPEAVPSymbol@@VFName@@_N@Z:PROC ; PClass::FindSymbol + Line 197: EXTRN ?AddField@PClass@@QEAAPEAVPField@@VFName@@PEAVPType@@I@Z:PROC ; PClass::AddField + Line 198: EXTRN ?CreateDerivedClass@PClass@@QEAAPEAV1@VFName@@I@Z:PROC ; PClass::CreateDerivedClass + Line 199: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 200: EXTRN ?FindClassTentative@PClass@@QEAAPEAV1@VFName@@@Z:PROC ; PClass::FindClassTentative + Line 201: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 202: EXTRN ?Apply@DamageTypeDefinition@@QEAAXVFName@@@Z:PROC ; DamageTypeDefinition::Apply + Line 203: EXTRN ?SetReplacement@PClassActor@@QEAA_NVFName@@@Z:PROC ; PClassActor::SetReplacement + Line 204: EXTRN ?FindState@PClassActor@@QEBAPEAUFState@@HPEAVFName@@_N@Z:PROC ; PClassActor::FindState + Line 205: EXTRN ??0FScanner@@QEAA@XZ:PROC ; FScanner::FScanner + Line 206: EXTRN ??0FScanner@@QEAA@H@Z:PROC ; FScanner::FScanner + Line 207: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 208: EXTRN ?Open@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::Open + Line 209: EXTRN ?SetCMode@FScanner@@QEAAX_N@Z:PROC ; FScanner::SetCMode + Line 210: EXTRN ?SetEscape@FScanner@@QEAAX_N@Z:PROC ; FScanner::SetEscape + Line 211: EXTRN ?SavePos@FScanner@@QEAA?BUSavedPos@1@XZ:PROC ; FScanner::SavePos + Line 212: EXTRN ?RestorePos@FScanner@@QEAAXAEBUSavedPos@1@@Z:PROC ; FScanner::RestorePos + Line 213: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 214: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 215: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 216: EXTRN ?CheckString@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::CheckString + Line 217: EXTRN ?GetToken@FScanner@@QEAA_NXZ:PROC ; FScanner::GetToken + Line 218: EXTRN ?MustGetAnyToken@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetAnyToken + Line 219: EXTRN ?MustGetToken@FScanner@@QEAAXH@Z:PROC ; FScanner::MustGetToken + Line 220: EXTRN ?CheckToken@FScanner@@QEAA_NH@Z:PROC ; FScanner::CheckToken + Line 221: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 222: EXTRN ?CheckNumber@FScanner@@QEAA_NXZ:PROC ; FScanner::CheckNumber + Line 223: EXTRN ?MustGetFloat@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetFloat + Line 224: EXTRN ?CheckFloat@FScanner@@QEAA_NXZ:PROC ; FScanner::CheckFloat + Line 225: EXTRN ?UnGet@FScanner@@QEAAXXZ:PROC ; FScanner::UnGet + Line 226: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 227: EXTRN ?MustMatchString@FScanner@@QEAAHPEBQEBD_K@Z:PROC ; FScanner::MustMatchString + Line 228: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 229: EXTRN ?ScriptMessage@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptMessage + Line 230: EXTRN ??0FScriptPosition@@QEAA@AEBU0@@Z:PROC ; FScriptPosition::FScriptPosition + Line 231: EXTRN ??0FScriptPosition@@QEAA@AEAVFScanner@@@Z:PROC ; FScriptPosition::FScriptPosition + Line 232: EXTRN ??4FScriptPosition@@QEAAAEAU0@AEBU0@@Z:PROC ; FScriptPosition::operator= + Line 233: EXTRN ?Message@FScriptPosition@@QEBAXHPEBDZZ:PROC ; FScriptPosition::Message + Line 234: EXTRN ?V_GetColor@@YAHPEBIAEAVFScanner@@@Z:PROC ; V_GetColor + Line 235: EXTRN ?strbin1@@YA?AVFString@@PEBD@Z:PROC ; strbin1 + Line 236: EXTRN ?ChangeSideInObjectFlags@FScopeBarrier@@SA?AW4EScopeFlags@@W42@H@Z:PROC ; FScopeBarrier::ChangeSideInObjectFlags + Line 237: EXTRN ?FinalizeClass@@YAXPEAVPClass@@AEAVFStateDefinitions@@@Z:PROC ; FinalizeClass + Line 238: EXTRN ?FindFlag@@YAPEAUFFlagDef@@PEBVPClass@@PEBD1_N@Z:PROC ; FindFlag + Line 239: EXTRN ?HandleDeprecatedFlags@@YAXPEAVAActor@@PEAVPClassActor@@_NH@Z:PROC ; HandleDeprecatedFlags + Line 240: EXTRN ?ModActorFlag@@YAXPEAVAActor@@PEAUFFlagDef@@_N@Z:PROC ; ModActorFlag + Line 241: EXTRN ?SetStateLabel@FStateDefinitions@@QEAAXPEBDPEAUFState@@E@Z:PROC ; FStateDefinitions::SetStateLabel + Line 242: EXTRN ?MakeStateDefines@FStateDefinitions@@QEAAXPEBVPClassActor@@@Z:PROC ; FStateDefinitions::MakeStateDefines + Line 243: EXTRN ?ParseExpression@@YAPEAVFxExpression@@AEAVFScanner@@PEAVPClassActor@@PEAVPNamespace@@@Z:PROC ; ParseExpression + Line 244: EXTRN ?ParseStates@@YAXAEAVFScanner@@PEAVPClassActor@@PEAVAActor@@AEAUBaggage@@@Z:PROC ; ParseStates + Line 245: EXTRN ?FindProperty@@YAPEAUFPropertyInfo@@PEBD@Z:PROC ; FindProperty + Line 246: EXTRN ?MatchString@@YAHPEBDPEAPEBD@Z:PROC ; MatchString + Line 247: EXTRN ?DescriptiveName@PType@@QEBAPEBDXZ:PROC ; PType::DescriptiveName + Line 248: EXTRN ?NewArray@@YAPEAVPArray@@PEAVPType@@I@Z:PROC ; NewArray + Line 249: EXTRN ?Resolve@FxExpression@@UEAAPEAV1@AEAUFCompileContext@@@Z:PROC ; FxExpression::Resolve + Line 250: EXTRN ?isConstant@FxExpression@@UEBA_NXZ:PROC ; FxExpression::isConstant + Line 251: EXTRN ?RequestAddress@FxExpression@@UEAA_NAEAUFCompileContext@@PEA_N@Z:PROC ; FxExpression::RequestAddress + Line 252: EXTRN ?ReturnProto@FxExpression@@UEAAPEAVPPrototype@@XZ:PROC ; FxExpression::ReturnProto + Line 253: EXTRN ?GetDirectFunction@FxExpression@@UEAAPEAVVMFunction@@PEAVPFunction@@AEBUVersionInfo@@@Z:PROC ; FxExpression::GetDirectFunction + Line 254: EXTRN ?Emit@FxExpression@@UEAA?AUExpEmit@@PEAVVMFunctionBuilder@@@Z:PROC ; FxExpression::Emit + Line 255: EXTRN ?EmitCompare@FxExpression@@UEAAXPEAVVMFunctionBuilder@@_NAEAV?$TArray@_K_K@@2@Z:PROC ; FxExpression::EmitCompare + Line 256: EXTRN ??_EFxExpression@@UEAAPEAXI@Z:PROC ; FxExpression::`vector deleting destructor' + Line 257: EXTRN ?Emit@FxConstant@@UEAA?AUExpEmit@@PEAVVMFunctionBuilder@@@Z:PROC ; FxConstant::Emit + Line 258: EXTRN ??_EFxConstant@@UEAAPEAXI@Z:PROC ; FxConstant::`vector deleting destructor' + Line 259: EXTRN ??0FxBoolCast@@QEAA@PEAVFxExpression@@_N@Z:PROC ; FxBoolCast::FxBoolCast + Line 260: EXTRN ??0FxIntCast@@QEAA@PEAVFxExpression@@_N11@Z:PROC ; FxIntCast::FxIntCast + Line 261: EXTRN ??0FxFloatCast@@QEAA@PEAVFxExpression@@@Z:PROC ; FxFloatCast::FxFloatCast + Line 262: EXTRN ??0FxClassTypeCast@@QEAA@PEAVPClassPointer@@PEAVFxExpression@@_N@Z:PROC ; FxClassTypeCast::FxClassTypeCast + Line 263: EXTRN ??0FxRuntimeStateIndex@@QEAA@PEAVFxExpression@@@Z:PROC ; FxRuntimeStateIndex::FxRuntimeStateIndex + Line 264: EXTRN ??0FxMultiNameState@@QEAA@PEBDAEBUFScriptPosition@@PEAVPClassActor@@@Z:PROC ; FxMultiNameState::FxMultiNameState + Line 265: EXTRN ?GetWadFullName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetWadFullName + Line 266: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 267: EXTRN ?FindLump@FWadCollection@@QEAAHPEBDPEAH_N@Z:PROC ; FWadCollection::FindLump + Line 268: EXTRN ?GetLumpFullPath@FWadCollection@@QEBA?AVFString@@H@Z:PROC ; FWadCollection::GetLumpFullPath + Line 269: EXTRN ?GetLumpFile@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpFile + Line 270: EXTRN ?CheckParm@FArgs@@QEBAHPEBDH@Z:PROC ; FArgs::CheckParm + Line 271: EXTRN ?ParseOldDecoration@@YAXAEAVFScanner@@W4EDefinitionType@@PEAVPNamespace@@@Z:PROC ; ParseOldDecoration + Line 272: EXTRN __CxxFrameHandler3:PROC + Line 273: EXTRN _Init_thread_epoch:DWORD + Line 274: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 275: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 276: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 277: EXTRN ?RegistrationInfo@PProperty@@2UClassReg@@A:BYTE ; PProperty::RegistrationInfo + Line 278: EXTRN ?RegistrationInfo@PSymbolConstNumeric@@2UClassReg@@A:BYTE ; PSymbolConstNumeric::RegistrationInfo + Line 279: EXTRN ?Namespaces@@3UFNamespaceManager@@A:BYTE ; Namespaces + Line 280: EXTRN ?ErrorCounter@FScriptPosition@@2HA:DWORD ; FScriptPosition::ErrorCounter + Line 281: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 282: EXTRN ?TypeSInt32@@3PEAVPInt@@EA:QWORD ; TypeSInt32 + Line 283: EXTRN ?TypeUInt32@@3PEAVPInt@@EA:QWORD ; TypeUInt32 + Line 284: EXTRN ?TypeBool@@3PEAVPBool@@EA:QWORD ; TypeBool + Line 285: EXTRN ?TypeFloat64@@3PEAVPFloat@@EA:QWORD ; TypeFloat64 + Line 286: EXTRN ?TypeString@@3PEAVPString@@EA:QWORD ; TypeString + Line 287: EXTRN ?TypeName@@3PEAVPName@@EA:QWORD ; TypeName + Line 288: EXTRN ?TypeSound@@3PEAVPSound@@EA:QWORD ; TypeSound + Line 289: EXTRN ?TypeColor@@3PEAVPColor@@EA:QWORD ; TypeColor + Line 290: EXTRN ?TypeStateLabel@@3PEAVPStateLabel@@EA:QWORD ; TypeStateLabel + Line 291: EXTRN ?FxAlloc@@3VFMemArena@@A:BYTE ; FxAlloc + Line 292: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 293: EXTRN ?Args@@3PEAVFArgs@@EA:QWORD ; Args + Line 294: EXTRN ?strictdecorate@@3VFBoolCVar@@A:BYTE ; strictdecorate + Line 295: EXTRN __ImageBase:BYTE + Line 296: EXTRN _fltused:DWORD + Line 297: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\thingdef_properties.cod (63 hits) + Line 283: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 284: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 285: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 286: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 287: EXTRN ?Teams@@3V?$TArray@VFTeam@@V1@@@A:BYTE ; Teams + Line 288: EXTRN ?ClassDataAllocator@@3VFMemArena@@A:BYTE ; ClassDataAllocator + Line 289: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 290: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 291: EXTRN ?PainFlashes@@3V?$TArray@V?$tuple@PEAVPClass@@VFName@@UPalEntry@@@std@@V12@@@A:BYTE ; PainFlashes + Line 292: EXTRN ?ColorSets@@3V?$TArray@V?$tuple@PEAVPClass@@HUFPlayerColorSet@@@std@@V12@@@A:BYTE ; ColorSets + Line 293: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 294: EXTRN ?ColorMatcher@@3VFColorMatcher@@A:QWORD ; ColorMatcher + Line 295: EXTRN ?LegacyRenderStyles@@3PATFRenderStyle@@A:BYTE ; LegacyRenderStyles + Line 1795: EXTRN strchr:PROC + Line 1796: EXTRN stricmp:PROC + Line 1797: EXTRN strnicmp:PROC + Line 1798: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 1799: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 1800: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_K_N@Z:PROC ; FName::NameManager::FindName + Line 1801: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 1802: EXTRN ??0FString@@QEAA@PEBD_K@Z:PROC ; FString::FString + Line 1803: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 1804: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 1805: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 1806: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 1807: EXTRN ?ToUpper@FString@@QEAAXXZ:PROC ; FString::ToUpper + Line 1808: EXTRN ?ReplaceChars@FString@@QEAAXDD@Z:PROC ; FString::ReplaceChars + Line 1809: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 1810: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 1811: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 1812: EXTRN ?FindCVar@@YAPEAVFBaseCVar@@PEBDPEAPEAV1@@Z:PROC ; FindCVar + Line 1813: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 1814: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 1815: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 1816: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 1817: EXTRN ?FindClassTentative@PClass@@QEAAPEAV1@VFName@@@Z:PROC ; PClass::FindClassTentative + Line 1818: EXTRN ?SetDamageFactor@PClassActor@@QEAAXVFName@@N@Z:PROC ; PClassActor::SetDamageFactor + Line 1819: EXTRN ?SetPainChance@PClassActor@@QEAAXVFName@@H@Z:PROC ; PClassActor::SetPainChance + Line 1820: EXTRN ?GetSpriteIndex@@YAHPEBD_N@Z:PROC ; GetSpriteIndex + Line 1821: EXTRN ?Pick@FColorMatcher@@QEAAEHHH@Z:PROC ; FColorMatcher::Pick + Line 1822: EXTRN ??0FRemapTable@@QEAA@H@Z:PROC ; FRemapTable::FRemapTable + Line 1823: EXTRN ??1FRemapTable@@QEAA@XZ:PROC ; FRemapTable::~FRemapTable + Line 1824: EXTRN ?MakeIdentity@FRemapTable@@QEAAXXZ:PROC ; FRemapTable::MakeIdentity + Line 1825: EXTRN ?AddToTranslation@FRemapTable@@QEAA_NPEBD@Z:PROC ; FRemapTable::AddToTranslation + Line 1826: EXTRN ?StoreTranslation@FRemapTable@@QEAAHH@Z:PROC ; FRemapTable::StoreTranslation + Line 1827: EXTRN ?CreateBloodTranslation@@YAHUPalEntry@@@Z:PROC ; CreateBloodTranslation + Line 1828: EXTRN ?R_FindCustomTranslation@@YAHVFName@@@Z:PROC ; R_FindCustomTranslation + Line 1829: EXTRN ?CheckForTexture@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::CheckForTexture + Line 1830: EXTRN ?Message@FScriptPosition@@QEBAXHPEBDZZ:PROC ; FScriptPosition::Message + Line 1831: EXTRN ?AddSpecialColormap@@YAHMMMMMM@Z:PROC ; AddSpecialColormap + Line 1832: EXTRN ?V_GetColor@@YAHPEBIPEBDPEAUFScriptPosition@@@Z:PROC ; V_GetColor + Line 1833: EXTRN ??4AActor@@QEAAAEAV0@AEBV0@@Z:PROC ; AActor::operator= + Line 1834: EXTRN ?SetTag@AActor@@QEAAXPEBD@Z:PROC ; AActor::SetTag + Line 1835: EXTRN ?LinkToWorld@AActor@@QEAAXPEAUFLinkContext@@_NPEAUsector_t@@@Z:PROC ; AActor::LinkToWorld + Line 1836: EXTRN ?UnlinkFromWorld@AActor@@QEAAXPEAUFLinkContext@@@Z:PROC ; AActor::UnlinkFromWorld + Line 1837: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 1838: EXTRN ?GetLumpFile@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpFile + Line 1839: EXTRN ?FindFlag@@YAPEAUFFlagDef@@PEBVPClass@@PEBD1_N@Z:PROC ; FindFlag + Line 1840: EXTRN ?MakeStateDefines@FStateDefinitions@@QEAAXPEBVPClassActor@@@Z:PROC ; FStateDefinitions::MakeStateDefines + Line 1841: EXTRN ?CreateDamageFunction@@YAXPEAVPNamespace@@AEBUVersionInfo@@PEAVPClassActor@@PEAVAActor@@PEAVFxExpression@@_NH@Z:PROC ; CreateDamageFunction + Line 1842: EXTRN __CxxFrameHandler3:PROC + Line 1843: EXTRN __ImageBase:BYTE + Line 1844: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\thingdef_states.cod (87 hits) + Line 86: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 87: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 88: EXTRN __std_terminate:PROC + Line 89: EXTRN stricmp:PROC + Line 90: EXTRN strlwr:PROC + Line 91: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 92: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 93: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 94: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 95: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 96: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 97: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 98: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 99: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 100: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 101: EXTRN ??0FStringf@@QEAA@PEBDZZ:PROC ; FStringf::FStringf + Line 102: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 103: EXTRN ?FindSymbol@PClass@@QEBAPEAVPSymbol@@VFName@@_N@Z:PROC ; PClass::FindSymbol + Line 104: EXTRN ?GetSpriteIndex@@YAHPEBD_N@Z:PROC ; GetSpriteIndex + Line 105: EXTRN ?AddStateLight@@YAXPEAUFState@@PEBD@Z:PROC ; AddStateLight + Line 106: EXTRN ?SetEscape@FScanner@@QEAAX_N@Z:PROC ; FScanner::SetEscape + Line 107: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 108: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 109: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 110: EXTRN ?CheckString@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::CheckString + Line 111: EXTRN ?MustGetToken@FScanner@@QEAAXH@Z:PROC ; FScanner::MustGetToken + Line 112: EXTRN ?CheckToken@FScanner@@QEAA_NH@Z:PROC ; FScanner::CheckToken + Line 113: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 114: EXTRN ?CheckNumber@FScanner@@QEAA_NXZ:PROC ; FScanner::CheckNumber + Line 115: EXTRN ?UnGet@FScanner@@QEAAXXZ:PROC ; FScanner::UnGet + Line 116: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 117: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 118: EXTRN ?ScriptMessage@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptMessage + Line 119: EXTRN ??0FScriptPosition@@QEAA@AEBU0@@Z:PROC ; FScriptPosition::FScriptPosition + Line 120: EXTRN ??0FScriptPosition@@QEAA@AEAVFScanner@@@Z:PROC ; FScriptPosition::FScriptPosition + Line 121: EXTRN ??4FScriptPosition@@QEAAAEAU0@AEBU0@@Z:PROC ; FScriptPosition::operator= + Line 122: EXTRN ?P_FindLineSpecial@@YAHPEBDPEAH1@Z:PROC ; P_FindLineSpecial + Line 123: EXTRN ?AddStateLabel@FStateDefinitions@@QEAAXPEBD@Z:PROC ; FStateDefinitions::AddStateLabel + Line 124: EXTRN ?GetStateLabelIndex@FStateDefinitions@@QEAAHVFName@@@Z:PROC ; FStateDefinitions::GetStateLabelIndex + Line 125: EXTRN ?SetGotoLabel@FStateDefinitions@@QEAA_NPEBD@Z:PROC ; FStateDefinitions::SetGotoLabel + Line 126: EXTRN ?SetStop@FStateDefinitions@@QEAA_NXZ:PROC ; FStateDefinitions::SetStop + Line 127: EXTRN ?SetWait@FStateDefinitions@@QEAA_NXZ:PROC ; FStateDefinitions::SetWait + Line 128: EXTRN ?SetLoop@FStateDefinitions@@QEAA_NXZ:PROC ; FStateDefinitions::SetLoop + Line 129: EXTRN ?AddStates@FStateDefinitions@@QEAAHPEAUFState@@PEBDAEBUFScriptPosition@@@Z:PROC ; FStateDefinitions::AddStates + Line 130: EXTRN ?ParseExpression@@YAPEAVFxExpression@@AEAVFScanner@@PEAVPClassActor@@PEAVPNamespace@@@Z:PROC ; ParseExpression + Line 131: EXTRN ?CreateAnonymousFunction@@YAPEAVPFunction@@PEAVPContainerType@@PEAVPType@@H@Z:PROC ; CreateAnonymousFunction + Line 132: EXTRN ?ParseParameter@@YAPEAVFxExpression@@AEAVFScanner@@PEAVPClassActor@@PEAVPType@@@Z:PROC ; ParseParameter + Line 133: EXTRN ?AddFunction@FFunctionBuildList@@QEAAPEAVVMFunction@@PEAVPNamespace@@AEBUVersionInfo@@PEAVPFunction@@PEAVFxExpression@@AEBVFString@@_NHHH@Z:PROC ; FFunctionBuildList::AddFunction + Line 134: EXTRN ?Resolve@FxExpression@@UEAAPEAV1@AEAUFCompileContext@@@Z:PROC ; FxExpression::Resolve + Line 135: EXTRN ?isConstant@FxExpression@@UEBA_NXZ:PROC ; FxExpression::isConstant + Line 136: EXTRN ?RequestAddress@FxExpression@@UEAA_NAEAUFCompileContext@@PEA_N@Z:PROC ; FxExpression::RequestAddress + Line 137: EXTRN ?ReturnProto@FxExpression@@UEAAPEAVPPrototype@@XZ:PROC ; FxExpression::ReturnProto + Line 138: EXTRN ?GetDirectFunction@FxExpression@@UEAAPEAVVMFunction@@PEAVPFunction@@AEBUVersionInfo@@@Z:PROC ; FxExpression::GetDirectFunction + Line 139: EXTRN ?Emit@FxExpression@@UEAA?AUExpEmit@@PEAVVMFunctionBuilder@@@Z:PROC ; FxExpression::Emit + Line 140: EXTRN ?EmitCompare@FxExpression@@UEAAXPEAVVMFunctionBuilder@@_NAEAV?$TArray@_K_K@@2@Z:PROC ; FxExpression::EmitCompare + Line 141: EXTRN ??_EFxExpression@@UEAAPEAXI@Z:PROC ; FxExpression::`vector deleting destructor' + Line 142: EXTRN ?Emit@FxConstant@@UEAA?AUExpEmit@@PEAVVMFunctionBuilder@@@Z:PROC ; FxConstant::Emit + Line 143: EXTRN ??_EFxConstant@@UEAAPEAXI@Z:PROC ; FxConstant::`vector deleting destructor' + Line 144: EXTRN ??0FxIntCast@@QEAA@PEAVFxExpression@@_N11@Z:PROC ; FxIntCast::FxIntCast + Line 145: EXTRN ??0FxSelf@@QEAA@AEBUFScriptPosition@@_N@Z:PROC ; FxSelf::FxSelf + Line 146: EXTRN ??0FxVMFunctionCall@@QEAA@PEAVFxExpression@@PEAVPFunction@@AEAV?$TDeletingArray@PEAVFxExpression@@PEAV1@@@AEBUFScriptPosition@@_N@Z:PROC ; FxVMFunctionCall::FxVMFunctionCall + Line 147: EXTRN ?Resolve@FxSequence@@UEAAPEAVFxExpression@@AEAUFCompileContext@@@Z:PROC ; FxSequence::Resolve + Line 148: EXTRN ?Emit@FxSequence@@UEAA?AUExpEmit@@PEAVVMFunctionBuilder@@@Z:PROC ; FxSequence::Emit + Line 149: EXTRN ?GetDirectFunction@FxSequence@@UEAAPEAVVMFunction@@PEAVPFunction@@AEBUVersionInfo@@@Z:PROC ; FxSequence::GetDirectFunction + Line 150: EXTRN ?CheckReturn@FxSequence@@UEAA_NXZ:PROC ; FxSequence::CheckReturn + Line 151: EXTRN ??_EFxSequence@@UEAAPEAXI@Z:PROC ; FxSequence::`vector deleting destructor' + Line 152: EXTRN ?Resolve@FxCompoundStatement@@UEAAPEAVFxExpression@@AEAUFCompileContext@@@Z:PROC ; FxCompoundStatement::Resolve + Line 153: EXTRN ?Emit@FxCompoundStatement@@UEAA?AUExpEmit@@PEAVVMFunctionBuilder@@@Z:PROC ; FxCompoundStatement::Emit + Line 154: EXTRN ??_EFxCompoundStatement@@UEAAPEAXI@Z:PROC ; FxCompoundStatement::`vector deleting destructor' + Line 155: EXTRN ??0FxIfStatement@@QEAA@PEAVFxExpression@@00AEBUFScriptPosition@@@Z:PROC ; FxIfStatement::FxIfStatement + Line 156: EXTRN ??0FxWhileLoop@@QEAA@PEAVFxExpression@@0AEBUFScriptPosition@@@Z:PROC ; FxWhileLoop::FxWhileLoop + Line 157: EXTRN ??0FxDoWhileLoop@@QEAA@PEAVFxExpression@@0AEBUFScriptPosition@@@Z:PROC ; FxDoWhileLoop::FxDoWhileLoop + Line 158: EXTRN ??0FxForLoop@@QEAA@PEAVFxExpression@@000AEBUFScriptPosition@@@Z:PROC ; FxForLoop::FxForLoop + Line 159: EXTRN ??0FxJumpStatement@@QEAA@HAEBUFScriptPosition@@@Z:PROC ; FxJumpStatement::FxJumpStatement + Line 160: EXTRN ??0FxReturnStatement@@QEAA@PEAVFxExpression@@AEBUFScriptPosition@@@Z:PROC ; FxReturnStatement::FxReturnStatement + Line 161: EXTRN ?Resolve@FxStateByIndex@@UEAAPEAVFxExpression@@AEAUFCompileContext@@@Z:PROC ; FxStateByIndex::Resolve + Line 162: EXTRN ??_EFxStateByIndex@@UEAAPEAXI@Z:PROC ; FxStateByIndex::`vector deleting destructor' + Line 163: EXTRN __CxxFrameHandler3:PROC + Line 164: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 165: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 166: EXTRN ?RegistrationInfo@PFunction@@2UClassReg@@A:BYTE ; PFunction::RegistrationInfo + Line 167: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 168: EXTRN ?FunctionBuildList@@3VFFunctionBuildList@@A:BYTE ; FunctionBuildList + Line 169: EXTRN ?TypeSInt32@@3PEAVPInt@@EA:QWORD ; TypeSInt32 + Line 170: EXTRN ?TypeString@@3PEAVPString@@EA:QWORD ; TypeString + Line 171: EXTRN ?TypeStateLabel@@3PEAVPStateLabel@@EA:QWORD ; TypeStateLabel + Line 172: EXTRN ?FxAlloc@@3VFMemArena@@A:BYTE ; FxAlloc + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\timidity.cod (58 hits) + Line 17: EXTRN ?currSong@@3PEAVMusInfo@@EA:QWORD ; currSong + Line 130: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 131: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 132: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 133: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 134: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 135: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 136: EXTRN atexit:PROC + Line 137: EXTRN atoi:PROC + Line 138: EXTRN getenv:PROC + Line 139: EXTRN __stdio_common_vsprintf:PROC + Line 140: EXTRN strchr:PROC + Line 141: EXTRN stricmp:PROC + Line 142: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 143: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 144: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 145: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 146: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 147: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 148: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 149: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 150: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 151: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 152: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 153: EXTRN ??0FStringCVar@@QEAA@PEBD0IP6AXAEAV0@@Z@Z:PROC ; FStringCVar::FStringCVar + Line 154: EXTRN ??1FStringCVar@@UEAA@XZ:PROC ; FStringCVar::~FStringCVar + Line 155: EXTRN ??0FCommandLine@@QEAA@PEBD_N@Z:PROC ; FCommandLine::FCommandLine + Line 156: EXTRN ??1FCommandLine@@QEAA@XZ:PROC ; FCommandLine::~FCommandLine + Line 157: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 158: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 159: EXTRN ?Shift@FCommandLine@@QEAAXXZ:PROC ; FCommandLine::Shift + Line 160: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 161: EXTRN ?I_DebugPrint@@YAXPEBD@Z:PROC ; I_DebugPrint + Line 162: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 163: EXTRN ?OpenLumpReader@FWadCollection@@QEAA?AVFileReader@@H@Z:PROC ; FWadCollection::OpenLumpReader + Line 164: EXTRN ?LookupFile@FSoundFontReader@@QEAA?AU?$pair@VFileReader@@VFString@@@std@@PEBD@Z:PROC ; FSoundFontReader::LookupFile + Line 165: EXTRN ?AddPath@FSoundFontReader@@QEAAXPEBD@Z:PROC ; FSoundFontReader::AddPath + Line 166: EXTRN ??0FPatchSetReader@@QEAA@XZ:PROC ; FPatchSetReader::FPatchSetReader + Line 167: EXTRN ?OpenSoundFont@FSoundFontManager@@QEAAPEAVFSoundFontReader@@PEBDH@Z:PROC ; FSoundFontManager::OpenSoundFont + Line 168: EXTRN ?MIDIDeviceChanged@@YAXH_N@Z:PROC ; MIDIDeviceChanged + Line 169: EXTRN ?free_instruments@Timidity@@YAXXZ:PROC ; Timidity::free_instruments + Line 170: EXTRN ??0ToneBank@Timidity@@QEAA@XZ:PROC ; Timidity::ToneBank::ToneBank + Line 171: EXTRN ??1ToneBank@Timidity@@QEAA@XZ:PROC ; Timidity::ToneBank::~ToneBank + Line 172: EXTRN ?font_freeall@Timidity@@YAXXZ:PROC ; Timidity::font_freeall + Line 173: EXTRN ?font_add@Timidity@@YAXPEBDH@Z:PROC ; Timidity::font_add + Line 174: EXTRN ?font_remove@Timidity@@YAXPEBD@Z:PROC ; Timidity::font_remove + Line 175: EXTRN ?font_order@Timidity@@YAXHHHH@Z:PROC ; Timidity::font_order + Line 176: EXTRN ?mix_voice@Timidity@@YAXPEAURenderer@1@PEAMPEAUVoice@1@H@Z:PROC ; Timidity::mix_voice + Line 177: EXTRN ?set_default_instrument@Renderer@Timidity@@QEAAHPEBD@Z:PROC ; Timidity::Renderer::set_default_instrument + Line 178: EXTRN ?FreeDLS@Timidity@@YAXPEAUDLS_Data@1@@Z:PROC ; Timidity::FreeDLS + Line 179: EXTRN __CxxFrameHandler3:PROC + Line 180: EXTRN memset:PROC + Line 181: EXTRN strcmp:PROC + Line 182: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 183: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 184: EXTRN ?sfmanager@@3VFSoundFontManager@@A:BYTE ; sfmanager + Line 185: EXTRN __ImageBase:BYTE + Line 186: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\types.cod (105 hits) + Line 367: EXTRN _purecall:PROC + Line 368: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 369: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 370: EXTRN atexit:PROC + Line 371: EXTRN __std_terminate:PROC + Line 372: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 373: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 374: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 375: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 376: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_K_N@Z:PROC ; FName::NameManager::FindName + Line 377: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 378: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 379: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 380: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 381: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 382: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 383: EXTRN ??4VersionInfo@@QEAAXPEBD@Z:PROC ; VersionInfo::operator= + Line 384: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 385: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 386: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 387: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 388: EXTRN ??1DObject@@UEAA@XZ:PROC ; DObject::~DObject + Line 389: EXTRN ?Serialize@DObject@@UEAAXAEAVFSerializer@@@Z:PROC ; DObject::Serialize + Line 390: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 391: EXTRN ?PropagateMark@DObject@@UEAA_KXZ:PROC ; DObject::PropagateMark + Line 392: EXTRN ?StaticType@PSymbol@@UEBAPEAVPClass@@XZ:PROC ; PSymbol::StaticType + Line 393: EXTRN ??_EPSymbol@@UEAAPEAXI@Z:PROC ; PSymbol::`vector deleting destructor' + Line 394: EXTRN ?StaticType@PSymbolType@@UEBAPEAVPClass@@XZ:PROC ; PSymbolType::StaticType + Line 395: EXTRN ??_EPSymbolType@@UEAAPEAXI@Z:PROC ; PSymbolType::`vector deleting destructor' + Line 396: EXTRN ??0PField@@QEAA@VFName@@PEAVPType@@I_KH@Z:PROC ; PField::PField + Line 397: EXTRN ?StaticType@PSymbolConst@@UEBAPEAVPClass@@XZ:PROC ; PSymbolConst::StaticType + Line 398: EXTRN ??_EPSymbolConst@@UEAAPEAXI@Z:PROC ; PSymbolConst::`vector deleting destructor' + Line 399: EXTRN ?StaticType@PSymbolConstNumeric@@UEBAPEAVPClass@@XZ:PROC ; PSymbolConstNumeric::StaticType + Line 400: EXTRN ??_EPSymbolConstNumeric@@UEAAPEAXI@Z:PROC ; PSymbolConstNumeric::`vector deleting destructor' + Line 401: EXTRN ??0PSymbolTable@@QEAA@XZ:PROC ; PSymbolTable::PSymbolTable + Line 402: EXTRN ??1PSymbolTable@@QEAA@XZ:PROC ; PSymbolTable::~PSymbolTable + Line 403: EXTRN ?SetParentTable@PSymbolTable@@QEAAXPEAU1@@Z:PROC ; PSymbolTable::SetParentTable + Line 404: EXTRN ?AddSymbol@PSymbolTable@@QEAAPEAVPSymbol@@PEAV2@@Z:PROC ; PSymbolTable::AddSymbol + Line 405: EXTRN ?AddField@PSymbolTable@@QEAAPEAVPField@@VFName@@PEAVPType@@IAEAIPEAI@Z:PROC ; PSymbolTable::AddField + Line 406: EXTRN ?AddNativeField@PSymbolTable@@QEAAPEAVPField@@VFName@@PEAVPType@@_KIH@Z:PROC ; PSymbolTable::AddNativeField + Line 407: EXTRN ?ReadFields@PSymbolTable@@QEBA_NAEAVFSerializer@@PEAXPEBD@Z:PROC ; PSymbolTable::ReadFields + Line 408: EXTRN ?WriteFields@PSymbolTable@@QEBAXAEAVFSerializer@@PEBX1@Z:PROC ; PSymbolTable::WriteFields + Line 409: EXTRN ?AddField@PClass@@QEAAPEAVPField@@VFName@@PEAVPType@@I@Z:PROC ; PClass::AddField + Line 410: EXTRN ?ArraySize@FSerializer@@QEAAIXZ:PROC ; FSerializer::ArraySize + Line 411: EXTRN ?BeginObject@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginObject + Line 412: EXTRN ?EndObject@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndObject + Line 413: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 414: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 415: EXTRN ?Sprite@FSerializer@@QEAAAEAV1@PEBDAEAHPEAH@Z:PROC ; FSerializer::Sprite + Line 416: EXTRN ?StringPtr@FSerializer@@QEAAAEAV1@PEBDAEAPEBD@Z:PROC ; FSerializer::StringPtr + Line 417: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEA_JPEA_J@Z:PROC ; Serialize + Line 418: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEA_KPEA_K@Z:PROC ; Serialize + Line 419: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEANPEAN@Z:PROC ; Serialize + Line 420: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAMPEAM@Z:PROC ; Serialize + Line 421: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAVFTextureID@@PEAV2@@Z:PROC ; Serialize + Line 422: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAVDObject@@PEAPEAV2@PEA_N@Z:PROC ; Serialize + Line 423: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAVFString@@PEAV2@@Z:PROC ; Serialize + Line 424: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAUNumericValue@@PEAU2@@Z:PROC ; Serialize + Line 425: EXTRN ??$Serialize@VPClass@@@@YAAEAVFSerializer@@AEAV0@PEBDAEAPEAVPClass@@PEAPEAV1@@Z:PROC ; Serialize + Line 426: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAPEAUFState@@PEAPEAU2@PEA_N@Z:PROC ; Serialize + Line 427: EXTRN ??_EPType@@UEAAPEAXI@Z:PROC ; PType::`vector deleting destructor' + Line 428: EXTRN ??_EPErrorType@@UEAAPEAXI@Z:PROC ; PErrorType::`vector deleting destructor' + Line 429: EXTRN ??_EPVoidType@@UEAAPEAXI@Z:PROC ; PVoidType::`vector deleting destructor' + Line 430: EXTRN ??_EPBasicType@@UEAAPEAXI@Z:PROC ; PBasicType::`vector deleting destructor' + Line 431: EXTRN ??_EPCompoundType@@UEAAPEAXI@Z:PROC ; PCompoundType::`vector deleting destructor' + Line 432: EXTRN ??_EPContainerType@@UEAAPEAXI@Z:PROC ; PContainerType::`vector deleting destructor' + Line 433: EXTRN ??_EPInt@@UEAAPEAXI@Z:PROC ; PInt::`vector deleting destructor' + Line 434: EXTRN ??_EPBool@@UEAAPEAXI@Z:PROC ; PBool::`vector deleting destructor' + Line 435: EXTRN ??_EPFloat@@UEAAPEAXI@Z:PROC ; PFloat::`vector deleting destructor' + Line 436: EXTRN ??_EPString@@UEAAPEAXI@Z:PROC ; PString::`vector deleting destructor' + Line 437: EXTRN ??_EPName@@UEAAPEAXI@Z:PROC ; PName::`vector deleting destructor' + Line 438: EXTRN ??_EPSound@@UEAAPEAXI@Z:PROC ; PSound::`vector deleting destructor' + Line 439: EXTRN ??_EPSpriteID@@UEAAPEAXI@Z:PROC ; PSpriteID::`vector deleting destructor' + Line 440: EXTRN ??_EPTextureID@@UEAAPEAXI@Z:PROC ; PTextureID::`vector deleting destructor' + Line 441: EXTRN ??_EPColor@@UEAAPEAXI@Z:PROC ; PColor::`vector deleting destructor' + Line 442: EXTRN ??_EPStateLabel@@UEAAPEAXI@Z:PROC ; PStateLabel::`vector deleting destructor' + Line 443: EXTRN ??_EPPointer@@UEAAPEAXI@Z:PROC ; PPointer::`vector deleting destructor' + Line 444: EXTRN ??_EPStatePointer@@UEAAPEAXI@Z:PROC ; PStatePointer::`vector deleting destructor' + Line 445: EXTRN ??_EPObjectPointer@@UEAAPEAXI@Z:PROC ; PObjectPointer::`vector deleting destructor' + Line 446: EXTRN ??_EPClassPointer@@UEAAPEAXI@Z:PROC ; PClassPointer::`vector deleting destructor' + Line 447: EXTRN ??_EPEnum@@UEAAPEAXI@Z:PROC ; PEnum::`vector deleting destructor' + Line 448: EXTRN ??_EPArray@@UEAAPEAXI@Z:PROC ; PArray::`vector deleting destructor' + Line 449: EXTRN ??_EPStaticArray@@UEAAPEAXI@Z:PROC ; PStaticArray::`vector deleting destructor' + Line 450: EXTRN ??_EPDynArray@@UEAAPEAXI@Z:PROC ; PDynArray::`vector deleting destructor' + Line 451: EXTRN ??_EPMap@@UEAAPEAXI@Z:PROC ; PMap::`vector deleting destructor' + Line 452: EXTRN ??_EPStruct@@UEAAPEAXI@Z:PROC ; PStruct::`vector deleting destructor' + Line 453: EXTRN ??_EPPrototype@@UEAAPEAXI@Z:PROC ; PPrototype::`vector deleting destructor' + Line 454: EXTRN ??_EPClassType@@UEAAPEAXI@Z:PROC ; PClassType::`vector deleting destructor' + Line 455: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 456: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 457: EXTRN __CxxFrameHandler3:PROC + Line 458: EXTRN memcpy:PROC + Line 459: EXTRN memset:PROC + Line 460: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 461: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 462: EXTRN ?ClassDataAllocator@@3VFMemArena@@A:BYTE ; ClassDataAllocator + Line 463: EXTRN ?S_sfx@@3V?$TArray@Usfxinfo_t@@U1@@@A:BYTE ; S_sfx + Line 464: EXTRN ?RegistrationInfo@PSymbolType@@2UClassReg@@A:BYTE ; PSymbolType::RegistrationInfo + Line 465: EXTRN ?RegistrationInfo@PField@@2UClassReg@@A:BYTE ; PField::RegistrationInfo + Line 466: EXTRN ?RegistrationInfo@PSymbolConstNumeric@@2UClassReg@@A:BYTE ; PSymbolConstNumeric::RegistrationInfo + Line 467: EXTRN ?Namespaces@@3UFNamespaceManager@@A:BYTE ; Namespaces + Line 468: EXTRN ?RegistrationInfo@DThinker@@2UClassReg@@A:BYTE ; DThinker::RegistrationInfo + Line 469: EXTRN __ImageBase:BYTE + Line 470: EXTRN _fltused:DWORD + Line 471: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\udmf.cod (69 hits) + Line 109: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 110: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 111: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 112: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 113: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 114: EXTRN ??_V@YAXPEAX_K@Z:PROC ; operator delete[] + Line 115: EXTRN __std_terminate:PROC + Line 116: EXTRN qsort:PROC + Line 117: EXTRN strtod:PROC + Line 118: EXTRN strtoll:PROC + Line 119: EXTRN stricmp:PROC + Line 120: EXTRN strnicmp:PROC + Line 121: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 122: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 123: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 124: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 125: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_K_N@Z:PROC ; FName::NameManager::FindName + Line 126: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 127: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 128: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 129: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 130: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 131: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 132: EXTRN c_sqrt:PROC + Line 133: EXTRN ?CheckOverlap@sector_t@@QEAAXXZ:PROC ; sector_t::CheckOverlap + Line 134: EXTRN ?AdjustLine@line_t@@QEAAXXZ:PROC ; line_t::AdjustLine + Line 135: EXTRN ?P_LoadTranslator@@YAXPEBD@Z:PROC ; P_LoadTranslator + Line 136: EXTRN ?P_TranslateSectorSpecial@@YAHH@Z:PROC ; P_TranslateSectorSpecial + Line 137: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 138: EXTRN ??0FScanner@@QEAA@XZ:PROC ; FScanner::FScanner + Line 139: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 140: EXTRN ?OpenMem@FScanner@@QEAAXPEBD0H@Z:PROC ; FScanner::OpenMem + Line 141: EXTRN ?OpenString@FScanner@@QEAAXPEBDVFString@@@Z:PROC ; FScanner::OpenString + Line 142: EXTRN ?SetCMode@FScanner@@QEAAX_N@Z:PROC ; FScanner::SetCMode + Line 143: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 144: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 145: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 146: EXTRN ?CheckString@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::CheckString + Line 147: EXTRN ?GetToken@FScanner@@QEAA_NXZ:PROC ; FScanner::GetToken + Line 148: EXTRN ?MustGetAnyToken@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetAnyToken + Line 149: EXTRN ?MustGetToken@FScanner@@QEAAXH@Z:PROC ; FScanner::MustGetToken + Line 150: EXTRN ?CheckToken@FScanner@@QEAA_NH@Z:PROC ; FScanner::CheckToken + Line 151: EXTRN ?CheckNumber@FScanner@@QEAA_NXZ:PROC ; FScanner::CheckNumber + Line 152: EXTRN ?UnGet@FScanner@@QEAAXXZ:PROC ; FScanner::UnGet + Line 153: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 154: EXTRN ?ScriptMessage@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptMessage + Line 155: EXTRN ?GetLumpFullName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetLumpFullName + Line 156: EXTRN ?AddSectorTag@FTagManager@@QEAAXHH@Z:PROC ; FTagManager::AddSectorTag + Line 157: EXTRN ?AddLineID@FTagManager@@QEAAXHH@Z:PROC ; FTagManager::AddLineID + Line 158: EXTRN ?P_FindTerrain@@YAHVFName@@@Z:PROC ; P_FindTerrain + Line 159: EXTRN ?TranslateLineDef@FLevelLocals@@QEAAXPEAUline_t@@PEAUmaplinedef_t@@H@Z:PROC ; FLevelLocals::TranslateLineDef + Line 160: EXTRN ?CreateScroller@MapLoader@@AEAAXW4EScroll@@NNPEAUsector_t@@HW4EScrollPos@@@Z:PROC ; MapLoader::CreateScroller + Line 161: EXTRN ?SetTexture@MapLoader@@AEAAXPEAUsector_t@@HHPEBDAEAV?$TMap@VFString@@UFMissingCount@@U?$THashTraits@VFString@@@@U?$TValueTraits@UFMissingCount@@@@@@_N@Z:PROC ; MapLoader::SetTexture + Line 162: EXTRN ?FinishLoadingLineDef@MapLoader@@AEAAXPEAUline_t@@H@Z:PROC ; MapLoader::FinishLoadingLineDef + Line 163: EXTRN ?ProcessSideTextures@MapLoader@@AEAAX_NPEAUside_t@@PEAUsector_t@@PEAUintmapsidedef_t@@HHPEAFAEAV?$TMap@VFString@@UFMissingCount@@U?$THashTraits@VFString@@@@U?$TValueTraits@UFMissingCount@@@@@@@Z:PROC ; MapLoader::ProcessSideTextures + Line 164: EXTRN __CxxFrameHandler3:PROC + Line 165: EXTRN memcpy:PROC + Line 166: EXTRN memmove:PROC + Line 167: EXTRN memset:PROC + Line 168: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 169: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 170: EXTRN ?developer@@3VFIntCVar@@A:BYTE ; developer + Line 171: EXTRN ?GameNames@@3PAPEBDA:BYTE ; GameNames + Line 172: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 173: EXTRN ?skyflatnum@@3VFTextureID@@A:DWORD ; skyflatnum + Line 174: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 175: EXTRN ?DoomEdMap@@3V?$TMap@HUFDoomEdEntry@@U?$THashTraits@H@@U?$TValueTraits@UFDoomEdEntry@@@@@@A:BYTE ; DoomEdMap + Line 176: EXTRN __ImageBase:BYTE + Line 177: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\umapinfo.cod (41 hits) + Line 70: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 71: EXTRN atexit:PROC + Line 72: EXTRN __std_terminate:PROC + Line 73: EXTRN stricmp:PROC + Line 74: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 75: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 76: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 77: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 78: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 79: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 80: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 81: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 82: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 83: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 84: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 85: EXTRN ?Split@FString@@QEBA?AV?$TArray@VFString@@V1@@@PEBDW4EmptyTokenType@1@@Z:PROC ; FString::Split + Line 86: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 87: EXTRN ?uppercopy@@YAXPEADPEBD@Z:PROC ; uppercopy + Line 88: EXTRN ??0FScanner@@QEAA@H@Z:PROC ; FScanner::FScanner + Line 89: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 90: EXTRN ?GetToken@FScanner@@QEAA_NXZ:PROC ; FScanner::GetToken + Line 91: EXTRN ?MustGetAnyToken@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetAnyToken + Line 92: EXTRN ?TokenMustBe@FScanner@@QEAAXH@Z:PROC ; FScanner::TokenMustBe + Line 93: EXTRN ?MustGetToken@FScanner@@QEAAXH@Z:PROC ; FScanner::MustGetToken + Line 94: EXTRN ?CheckToken@FScanner@@QEAA_NH@Z:PROC ; FScanner::CheckToken + Line 95: EXTRN ?CheckValue@FScanner@@QEAA_N_N@Z:PROC ; FScanner::CheckValue + Line 96: EXTRN ?MustGetValue@FScanner@@QEAAX_N@Z:PROC ; FScanner::MustGetValue + Line 97: EXTRN ?MustGetBoolToken@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetBoolToken + Line 98: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 99: EXTRN ?Reset@level_info_t@@QEAAXXZ:PROC ; level_info_t::Reset + Line 100: EXTRN ?FindLevelInfo@@YAPEAUlevel_info_t@@PEBD_N@Z:PROC ; FindLevelInfo + Line 101: EXTRN ?P_LoadTranslator@@YAXPEBD@Z:PROC ; P_LoadTranslator + Line 102: EXTRN ?MakeEndPic@@YA?AVFName@@PEBD@Z:PROC ; MakeEndPic + Line 103: EXTRN __CxxFrameHandler3:PROC + Line 104: EXTRN memmove:PROC + Line 105: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 106: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 107: EXTRN ?wadlevelinfos@@3V?$TArray@Ulevel_info_t@@U1@@@A:BYTE ; wadlevelinfos + Line 108: EXTRN ?AllEpisodes@@3V?$TArray@UFEpisode@@U1@@@A:BYTE ; AllEpisodes + Line 109: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 110: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\v_2ddrawer.cod (24 hits) + Line 25: EXTRN ?RegistrationInfo@DObject@@2UClassReg@@A:BYTE ; DObject::RegistrationInfo + Line 135: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 136: EXTRN __std_terminate:PROC + Line 137: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 138: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 139: EXTRN c_sqrt:PROC + Line 140: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 141: EXTRN ??1DObject@@UEAA@XZ:PROC ; DObject::~DObject + Line 142: EXTRN ?Serialize@DObject@@UEAAXAEAVFSerializer@@@Z:PROC ; DObject::Serialize + Line 143: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 144: EXTRN ?PropagateMark@DObject@@UEAA_KXZ:PROC ; DObject::PropagateMark + Line 145: EXTRN ?CheckFuzz@FRenderStyle@@QEAAXXZ:PROC ; FRenderStyle::CheckFuzz + Line 146: EXTRN ??_EDShape2D@@UEAAPEAXI@Z:PROC ; DShape2D::`vector deleting destructor' + Line 147: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 148: EXTRN __CxxFrameHandler3:PROC + Line 149: EXTRN cos:PROC + Line 150: EXTRN memset:PROC + Line 151: EXTRN sin:PROC + Line 152: EXTRN ?LegacyRenderStyles@@3PATFRenderStyle@@A:BYTE ; LegacyRenderStyles + Line 153: EXTRN ?GPalette@@3UFPalette@@A:BYTE ; GPalette + Line 154: EXTRN ?vid_rendermode@@3VFIntCVar@@A:BYTE ; vid_rendermode + Line 155: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 156: EXTRN ?transsouls@@3VFFloatCVar@@A:BYTE ; transsouls + Line 157: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\v_blend.cod (9 hits) + Line 42: EXTRN atexit:PROC + Line 43: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 44: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 45: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 46: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 47: EXTRN ?GetVirtualIndex@@YAIPEAVPClass@@PEBD@Z:PROC ; GetVirtualIndex + Line 48: EXTRN ?paletteflash@@3VFIntCVar@@A:BYTE ; paletteflash + Line 49: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 50: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\v_collection.cod (6 hits) + Line 17: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 18: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 19: EXTRN ?PalCheck@FTextureManager@@QEAA?AVFTextureID@@V2@@Z:PROC ; FTextureManager::PalCheck + Line 20: EXTRN ?CheckForTexture@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::CheckForTexture + Line 21: EXTRN __CxxFrameHandler3:PROC + Line 22: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\v_draw.cod (48 hits) + Line 65: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 66: EXTRN ?StatusBar@@3PEAVDBaseStatusBar@@EA:QWORD ; StatusBar + Line 67: EXTRN ?GPalette@@3UFPalette@@A:BYTE ; GPalette + Line 68: EXTRN ?viewwindowx@@3HA:DWORD ; viewwindowx + Line 69: EXTRN ?viewwindowy@@3HA:DWORD ; viewwindowy + Line 70: EXTRN ?viewwidth@@3HA:DWORD ; viewwidth + Line 71: EXTRN ?viewheight@@3HA:DWORD ; viewheight + Line 72: EXTRN ?setsizeneeded@@3_NA:BYTE ; setsizeneeded + Line 73: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 329: EXTRN atexit:PROC + Line 330: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 331: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 332: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 333: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 334: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 335: EXTRN ?V_AddBlend@@YAXMMMMQEAM@Z:PROC ; V_AddBlend + Line 336: EXTRN ?V_AddPlayerBlend@@YAXPEAVplayer_t@@QEAMMH@Z:PROC ; V_AddPlayerBlend + Line 337: EXTRN ?Pick@FColorMatcher@@QEAAEHHH@Z:PROC ; FColorMatcher::Pick + Line 338: EXTRN ?TranslationToTable@@YAPEAUFRemapTable@@H@Z:PROC ; TranslationToTable + Line 339: EXTRN ?GetTextureID@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::GetTextureID + Line 340: EXTRN ?R_BlendForColormap@@YAII@Z:PROC ; R_BlendForColormap + Line 341: EXTRN ?AddTexture@F2DDrawer@@QEAAXPEAVFTexture@@AEAUDrawParms@@@Z:PROC ; F2DDrawer::AddTexture + Line 342: EXTRN ?AddShape@F2DDrawer@@QEAAXPEAVFTexture@@PEAVDShape2D@@AEAUDrawParms@@@Z:PROC ; F2DDrawer::AddShape + Line 343: EXTRN ?AddPoly@F2DDrawer@@QEAAXPEAVFTexture@@PEAU?$TVector2@M@@HNNNNU?$TAngle@N@@AEBUFColormap@@UPalEntry@@HPEAI_K@Z:PROC ; F2DDrawer::AddPoly + Line 344: EXTRN ?AddFlatFill@F2DDrawer@@QEAAXHHHHPEAVFTexture@@_N@Z:PROC ; F2DDrawer::AddFlatFill + Line 345: EXTRN ?AddColorOnlyQuad@F2DDrawer@@QEAAXHHHHUPalEntry@@PEATFRenderStyle@@@Z:PROC ; F2DDrawer::AddColorOnlyQuad + Line 346: EXTRN ?AddLine@F2DDrawer@@QEAAXHHHHHIE@Z:PROC ; F2DDrawer::AddLine + Line 347: EXTRN ?AddThickLine@F2DDrawer@@QEAAXHHHHNIE@Z:PROC ; F2DDrawer::AddThickLine + Line 348: EXTRN ?AddPixel@F2DDrawer@@QEAAXHHHI@Z:PROC ; F2DDrawer::AddPixel + Line 349: EXTRN ?ActiveRatio@@YAMHHPEAM@Z:PROC ; ActiveRatio + Line 350: EXTRN ?AspectBaseWidth@@YAHM@Z:PROC ; AspectBaseWidth + Line 351: EXTRN ?AspectBaseHeight@@YAHM@Z:PROC ; AspectBaseHeight + Line 352: EXTRN ?AspectMultiplier@@YAHM@Z:PROC ; AspectMultiplier + Line 353: EXTRN ?AspectTallerThanWide@@YA_NM@Z:PROC ; AspectTallerThanWide + Line 354: EXTRN ?GetHUDScale@DBaseStatusBar@@QEBA?AU?$TVector2@N@@XZ:PROC ; DBaseStatusBar::GetHUDScale + Line 355: EXTRN ?CallScreenSizeChanged@DBaseStatusBar@@QEAAXXZ:PROC ; DBaseStatusBar::CallScreenSizeChanged + Line 356: EXTRN ?ThrowAbortException@@YAXW4EVMAbortException@@PEBDZZ:PROC ; ThrowAbortException + Line 357: EXTRN ?LegacyRenderStyles@@3PATFRenderStyle@@A:BYTE ; LegacyRenderStyles + Line 358: EXTRN ?ColorMatcher@@3VFColorMatcher@@A:QWORD ; ColorMatcher + Line 359: EXTRN ?vid_rendermode@@3VFIntCVar@@A:BYTE ; vid_rendermode + Line 360: EXTRN ?r_viewpoint@@3UFRenderViewpoint@@A:BYTE ; r_viewpoint + Line 361: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 362: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 363: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 364: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 365: EXTRN ?gl_enhanced_nightvision@@3VFBoolCVar@@A:BYTE ; gl_enhanced_nightvision + Line 366: EXTRN __ImageBase:BYTE + Line 367: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\v_font.cod (79 hits) + Line 136: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 137: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 138: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 139: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 140: EXTRN atexit:PROC + Line 141: EXTRN __std_terminate:PROC + Line 142: EXTRN qsort:PROC + Line 143: EXTRN strncmp:PROC + Line 144: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 145: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 146: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 147: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 148: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_K_N@Z:PROC ; FName::NameManager::FindName + Line 149: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 150: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 151: EXTRN mysnprintf:PROC + Line 152: EXTRN ??_EFFont@@UEAAPEAXI@Z:PROC ; FFont::`vector deleting destructor' + Line 153: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 154: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 155: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 156: EXTRN ?Pick@FColorMatcher@@QEAAEHHH@Z:PROC ; FColorMatcher::Pick + Line 157: EXTRN ??0FRemapTable@@QEAA@H@Z:PROC ; FRemapTable::FRemapTable + Line 158: EXTRN ??0FRemapTable@@QEAA@AEBU0@@Z:PROC ; FRemapTable::FRemapTable + Line 159: EXTRN ??1FRemapTable@@QEAA@XZ:PROC ; FRemapTable::~FRemapTable + Line 160: EXTRN ??4FRemapTable@@QEAAAEAU0@AEBU0@@Z:PROC ; FRemapTable::operator= + Line 161: EXTRN ?PalCheck@FTextureManager@@QEAA?AVFTextureID@@V2@@Z:PROC ; FTextureManager::PalCheck + Line 162: EXTRN ?CheckForTexture@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::CheckForTexture + Line 163: EXTRN ?AddTexture@FTextureManager@@QEAA?AVFTextureID@@PEAVFTexture@@@Z:PROC ; FTextureManager::AddTexture + Line 164: EXTRN ?V_GetColor@@YAHPEBIAEAVFScanner@@@Z:PROC ; V_GetColor + Line 165: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 166: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 167: EXTRN ?GetNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::GetNumForName + Line 168: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 169: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 170: EXTRN ?OpenLumpReader@FWadCollection@@QEAA?AVFileReader@@H@Z:PROC ; FWadCollection::OpenLumpReader + Line 171: EXTRN ?FindLump@FWadCollection@@QEAAHPEBDPEAH_N@Z:PROC ; FWadCollection::FindLump + Line 172: EXTRN ?GetLumpFile@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpFile + Line 173: EXTRN ??0FScanner@@QEAA@XZ:PROC ; FScanner::FScanner + Line 174: EXTRN ??0FScanner@@QEAA@H@Z:PROC ; FScanner::FScanner + Line 175: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 176: EXTRN ?OpenLumpNum@FScanner@@QEAAXH@Z:PROC ; FScanner::OpenLumpNum + Line 177: EXTRN ?Close@FScanner@@QEAAXXZ:PROC ; FScanner::Close + Line 178: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 179: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 180: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 181: EXTRN ?CheckString@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::CheckString + Line 182: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 183: EXTRN ?CheckNumber@FScanner@@QEAA_NXZ:PROC ; FScanner::CheckNumber + Line 184: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 185: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 186: EXTRN ?ScriptMessage@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptMessage + Line 187: EXTRN ?GetCharFromString@@YAHAEAPEBE@Z:PROC ; GetCharFromString + Line 188: EXTRN ?GetPalettedPixels@FImageSource@@QEAA?AV?$TArray@EE@@H@Z:PROC ; FImageSource::GetPalettedPixels + Line 189: EXTRN ??0FImageTexture@@QEAA@PEAVFImageSource@@PEBD@Z:PROC ; FImageTexture::FImageTexture + Line 190: EXTRN ??0FFontChar1@@QEAA@PEAVFImageSource@@@Z:PROC ; FFontChar1::FFontChar1 + Line 191: EXTRN ?SetSourceRemap@FFontChar1@@QEAAXPEBE@Z:PROC ; FFontChar1::SetSourceRemap + Line 192: EXTRN ??0FFontChar2@@QEAA@HHHHHH@Z:PROC ; FFontChar2::FFontChar2 + Line 193: EXTRN ?SetSourceRemap@FFontChar2@@QEAAXPEBE@Z:PROC ; FFontChar2::SetSourceRemap + Line 194: EXTRN ??_EFSingleLumpFont@@UEAAPEAXI@Z:PROC ; FSingleLumpFont::`vector deleting destructor' + Line 195: EXTRN ??_EFSinglePicFont@@UEAAPEAXI@Z:PROC ; FSinglePicFont::`vector deleting destructor' + Line 196: EXTRN ??_EFSpecialFont@@UEAAPEAXI@Z:PROC ; FSpecialFont::`vector deleting destructor' + Line 197: EXTRN __CxxFrameHandler3:PROC + Line 198: EXTRN memcpy:PROC + Line 199: EXTRN memset:PROC + Line 200: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 201: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 202: EXTRN ?SmallFont@@3PEAVFFont@@EA:QWORD ; SmallFont + Line 203: EXTRN ?SmallFont2@@3PEAVFFont@@EA:QWORD ; SmallFont2 + Line 204: EXTRN ?BigFont@@3PEAVFFont@@EA:QWORD ; BigFont + Line 205: EXTRN ?ConFont@@3PEAVFFont@@EA:QWORD ; ConFont + Line 206: EXTRN ?IntermissionFont@@3PEAVFFont@@EA:QWORD ; IntermissionFont + Line 207: EXTRN ?GPalette@@3UFPalette@@A:BYTE ; GPalette + Line 208: EXTRN ?ColorMatcher@@3VFColorMatcher@@A:QWORD ; ColorMatcher + Line 209: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 210: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 211: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 212: EXTRN ?ImageArena@FImageSource@@1VFMemArena@@A:BYTE ; FImageSource::ImageArena + Line 213: EXTRN ?PrintColors@@3PAHA:BYTE ; PrintColors + Line 214: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\v_framebuffer.cod (45 hits) + Line 87: EXTRN _purecall:PROC + Line 88: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 89: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 90: EXTRN atexit:PROC + Line 91: EXTRN __std_terminate:PROC + Line 92: EXTRN roundf:PROC + Line 93: EXTRN ?_Xbad_function_call@std@@YAXXZ:PROC ; std::_Xbad_function_call + Line 94: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 95: EXTRN mysnprintf:PROC + Line 96: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 97: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 98: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 99: EXTRN ?DoBlending@@YAXPEBUPalEntry@@PEAU1@HHHHH@Z:PROC ; DoBlending + Line 100: EXTRN ??1IShadowMap@@UEAA@XZ:PROC ; IShadowMap::~IShadowMap + Line 101: EXTRN ??_EIShadowMap@@UEAAPEAXI@Z:PROC ; IShadowMap::`vector deleting destructor' + Line 102: EXTRN ?V_OutputResized@@YAXHH@Z:PROC ; V_OutputResized + Line 103: EXTRN ?Dim@DFrameBuffer@@QEAAXUPalEntry@@MHHHHPEATFRenderStyle@@@Z:PROC ; DFrameBuffer::Dim + Line 104: EXTRN ?Clear@DFrameBuffer@@QEAAXHHHHHI@Z:PROC ; DFrameBuffer::Clear + Line 105: EXTRN ?DrawText@DFrameBuffer@@QEAAXPEAVFFont@@HNNPEBDHZZ:PROC ; DFrameBuffer::DrawText + Line 106: EXTRN ??_EDFrameBuffer@@UEAAPEAXI@Z:PROC ; DFrameBuffer::`vector deleting destructor' + Line 107: EXTRN ?GetUIScale@@YAHH@Z:PROC ; GetUIScale + Line 108: EXTRN ?StringWidth@FFont@@QEBAHPEBE@Z:PROC ; FFont::StringWidth + Line 109: EXTRN ?ViewportScaledWidth@@YAHHH@Z:PROC ; ViewportScaledWidth + Line 110: EXTRN ?ViewportScaledHeight@@YAHHH@Z:PROC ; ViewportScaledHeight + Line 111: EXTRN ?ViewportIsScaled43@@YA_NXZ:PROC ; ViewportIsScaled43 + Line 112: EXTRN ?I_GetTime@@YAHXZ:PROC ; I_GetTime + Line 113: EXTRN ?CheckBench@@YAXXZ:PROC ; CheckBench + Line 114: EXTRN ?OutputResized@FFlatVertexBuffer@@QEAAXHH@Z:PROC ; FFlatVertexBuffer::OutputResized + Line 115: EXTRN __CxxFrameHandler3:PROC + Line 116: EXTRN pow:PROC + Line 117: EXTRN ?GPalette@@3UFPalette@@A:BYTE ; GPalette + Line 118: EXTRN ?translationtables@@3PAV?$TAutoGrowArray@VFRemapTablePtr@@PEAUFRemapTable@@@@A:BYTE ; translationtables + Line 119: EXTRN ?vid_rendermode@@3VFIntCVar@@A:BYTE ; vid_rendermode + Line 120: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 121: EXTRN ?con_scale@@3VFIntCVar@@A:BYTE ; con_scale + Line 122: EXTRN ?ConFont@@3PEAVFFont@@EA:QWORD ; ConFont + Line 123: EXTRN ?viewwindowx@@3HA:DWORD ; viewwindowx + Line 124: EXTRN ?viewwindowy@@3HA:DWORD ; viewwindowy + Line 125: EXTRN ?viewwidth@@3HA:DWORD ; viewwidth + Line 126: EXTRN ?viewheight@@3HA:DWORD ; viewheight + Line 127: EXTRN ?SWRenderer@@3PEAUFRenderer@@EA:QWORD ; SWRenderer + Line 128: EXTRN ?ticker@@3VFBoolCVar@@A:BYTE ; ticker + Line 129: EXTRN ?screenblocks@@3VFIntCVar@@A:BYTE ; screenblocks + Line 130: EXTRN ?r_drawvoxels@@3VFBoolCVar@@A:BYTE ; r_drawvoxels + Line 131: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\v_palette.cod (45 hits) + Line 16: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 76: EXTRN atexit:PROC + Line 77: EXTRN qsort:PROC + Line 78: EXTRN atof:PROC + Line 79: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 80: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 81: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 82: EXTRN ??0FScanner@@QEAA@XZ:PROC ; FScanner::FScanner + Line 83: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 84: EXTRN ?OpenMem@FScanner@@QEAAXPEBD0H@Z:PROC ; FScanner::OpenMem + Line 85: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 86: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 87: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 88: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 89: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 90: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 91: EXTRN ??0FFloatCVar@@QEAA@PEBDMIP6AXAEAV0@@Z@Z:PROC ; FFloatCVar::FFloatCVar + Line 92: EXTRN ??0FColorMatcher@@QEAA@XZ:PROC ; FColorMatcher::FColorMatcher + Line 93: EXTRN ?SetPalette@FColorMatcher@@QEAAXPEBI@Z:PROC ; FColorMatcher::SetPalette + Line 94: EXTRN ?R_InitColormaps@@YAXXZ:PROC ; R_InitColormaps + Line 95: EXTRN ?DoBlending_SSE2@@YAXPEBUPalEntry@@PEAU1@HHHHH@Z:PROC ; DoBlending_SSE2 + Line 96: EXTRN ?SetFlash@DFrameBuffer@@QEAA_NUPalEntry@@H@Z:PROC ; DFrameBuffer::SetFlash + Line 97: EXTRN ?V_GetColorFromString@@YAHPEBIPEBDPEAUFScriptPosition@@@Z:PROC ; V_GetColorFromString + Line 98: EXTRN ?V_GetColorStringByName@@YA?AVFString@@PEBDPEAUFScriptPosition@@@Z:PROC ; V_GetColorStringByName + Line 99: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 100: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 101: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 102: EXTRN ?GetLumpFullName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetLumpFullName + Line 103: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 104: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 105: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 106: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 107: EXTRN __CxxFrameHandler3:PROC + Line 108: EXTRN __chkstk:PROC + Line 109: EXTRN __vdecl_pow2:PROC + Line 110: EXTRN floorf:PROC + Line 111: EXTRN memcpy:PROC + Line 112: EXTRN memset:PROC + Line 113: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 114: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 115: EXTRN ?BaseBlendR@@3HA:DWORD ; BaseBlendR + Line 116: EXTRN ?BaseBlendG@@3HA:DWORD ; BaseBlendG + Line 117: EXTRN ?BaseBlendB@@3HA:DWORD ; BaseBlendB + Line 118: EXTRN ?BaseBlendA@@3MA:DWORD ; BaseBlendA + Line 119: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\v_pfx.cod (2 hits) + Line 17: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 18: EXTRN memcpy:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\v_text.cod (46 hits) + Line 40: EXTRN ??_EDBrokenLines@@UEAAPEAXI@Z:PROC ; DBrokenLines::`vector deleting destructor' + Line 41: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 42: EXTRN ?RegistrationInfo@DObject@@2UClassReg@@A:BYTE ; DObject::RegistrationInfo + Line 43: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 44: EXTRN ?PropagateMark@DObject@@UEAA_KXZ:PROC ; DObject::PropagateMark + Line 45: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 185: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 186: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 187: EXTRN __std_terminate:PROC + Line 188: EXTRN iswspace:PROC + Line 189: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 190: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 191: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 192: EXTRN ??0FString@@QEAA@PEBD_K@Z:PROC ; FString::FString + Line 193: EXTRN ??0FString@@QEAA@D@Z:PROC ; FString::FString + Line 194: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 195: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 196: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 197: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 198: EXTRN ??YFString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator+= + Line 199: EXTRN ?AppendCStrPart@FString@@QEAAAEAV1@PEBD_K@Z:PROC ; FString::AppendCStrPart + Line 200: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 201: EXTRN ?GetColorTranslation@FFont@@QEBAPEAUFRemapTable@@W4EColorRange@@PEAUPalEntry@@@Z:PROC ; FFont::GetColorTranslation + Line 202: EXTRN ?StringWidth@FFont@@QEBAHPEBE@Z:PROC ; FFont::StringWidth + Line 203: EXTRN ?V_ParseFontColor@@YA?AW4EColorRange@@AEAPEBEHH@Z:PROC ; V_ParseFontColor + Line 204: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 205: EXTRN ??1DObject@@UEAA@XZ:PROC ; DObject::~DObject + Line 206: EXTRN ?DrawTextureParms@DFrameBuffer@@IEAAXPEAVFTexture@@AEAUDrawParms@@@Z:PROC ; DFrameBuffer::DrawTextureParms + Line 207: EXTRN ?SetTextureParms@DFrameBuffer@@QEBA_NPEAUDrawParms@@PEAVFTexture@@NN@Z:PROC ; DFrameBuffer::SetTextureParms + Line 208: EXTRN ??RFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator() + Line 209: EXTRN ?ThrowAbortException@@YAXW4EVMAbortException@@PEBDZZ:PROC ; ThrowAbortException + Line 210: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 211: EXTRN ?ArraySize@FSerializer@@QEAAIXZ:PROC ; FSerializer::ArraySize + Line 212: EXTRN ?BeginObject@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginObject + Line 213: EXTRN ?EndObject@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndObject + Line 214: EXTRN ?BeginArray@FSerializer@@QEAA_NPEBD@Z:PROC ; FSerializer::BeginArray + Line 215: EXTRN ?EndArray@FSerializer@@QEAAXXZ:PROC ; FSerializer::EndArray + Line 216: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAIPEAI@Z:PROC ; Serialize + Line 217: EXTRN ?Serialize@@YAAEAVFSerializer@@AEAV1@PEBDAEAVFString@@PEAV2@@Z:PROC ; Serialize + Line 218: EXTRN ?ListGetInt@@YAHAEAUVMVa_List@@@Z:PROC ; ListGetInt + Line 219: EXTRN ??$ParseDrawTextureTags@UVa_List@@@DFrameBuffer@@IEBA_NPEAVFTexture@@NNIAEAUVa_List@@PEAUDrawParms@@_N@Z:PROC ; DFrameBuffer::ParseDrawTextureTags + Line 220: EXTRN ??$ParseDrawTextureTags@UVMVa_List@@@DFrameBuffer@@IEBA_NPEAVFTexture@@NNIAEAUVMVa_List@@PEAUDrawParms@@_N@Z:PROC ; DFrameBuffer::ParseDrawTextureTags + Line 221: EXTRN __CxxFrameHandler3:PROC + Line 222: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 223: EXTRN ?NumTextColors@@3HA:DWORD ; NumTextColors + Line 224: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\v_video.cod (88 hits) + Line 74: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 75: EXTRN ?cl_capfps@@3VFBoolCVar@@A:BYTE ; cl_capfps + Line 76: EXTRN ?CleanWidth@@3HA:DWORD ; CleanWidth + Line 77: EXTRN ?CleanHeight@@3HA:DWORD ; CleanHeight + Line 78: EXTRN ?CleanXfac@@3HA:DWORD ; CleanXfac + Line 79: EXTRN ?CleanYfac@@3HA:DWORD ; CleanYfac + Line 80: EXTRN ?CleanWidth_1@@3HA:DWORD ; CleanWidth_1 + Line 81: EXTRN ?CleanHeight_1@@3HA:DWORD ; CleanHeight_1 + Line 82: EXTRN ?CleanXfac_1@@3HA:DWORD ; CleanXfac_1 + Line 83: EXTRN ?CleanYfac_1@@3HA:DWORD ; CleanYfac_1 + Line 84: EXTRN ?StatusBar@@3PEAVDBaseStatusBar@@EA:QWORD ; StatusBar + Line 85: EXTRN ?consoleplayer@@3HA:DWORD ; consoleplayer + Line 86: EXTRN ?usergame@@3_NA:BYTE ; usergame + Line 87: EXTRN ?setsizeneeded@@3_NA:BYTE ; setsizeneeded + Line 452: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 453: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 454: EXTRN atexit:PROC + Line 455: EXTRN __std_terminate:PROC + Line 456: EXTRN atoi:PROC + Line 457: EXTRN strtol:PROC + Line 458: EXTRN strtoul:PROC + Line 459: EXTRN strnicmp:PROC + Line 460: EXTRN roundf:PROC + Line 461: EXTRN ?_Xbad_function_call@std@@YAXXZ:PROC ; std::_Xbad_function_call + Line 462: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 463: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 464: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 465: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 466: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 467: EXTRN ?atterm@@YAXP6AXXZ@Z:PROC ; atterm + Line 468: EXTRN ?I_InitGraphics@@YAXXZ:PROC ; I_InitGraphics + Line 469: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 470: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 471: EXTRN ?ResetColors@FBaseCVar@@SAXXZ:PROC ; FBaseCVar::ResetColors + Line 472: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 473: EXTRN ?SetGenericRepDefault@FBoolCVar@@UEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBoolCVar::SetGenericRepDefault + Line 474: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 475: EXTRN ?C_NewModeAdjust@@YAXXZ:PROC ; C_NewModeAdjust + Line 476: EXTRN ?CheckParm@FArgs@@QEBAHPEBDH@Z:PROC ; FArgs::CheckParm + Line 477: EXTRN ?CheckValue@FArgs@@QEBAPEBDPEBD@Z:PROC ; FArgs::CheckValue + Line 478: EXTRN ?InitPalette@@YAXXZ:PROC ; InitPalette + Line 479: EXTRN ?Pick@FColorMatcher@@QEAAEHHH@Z:PROC ; FColorMatcher::Pick + Line 480: EXTRN ??0DFrameBuffer@@QEAA@HH@Z:PROC ; DFrameBuffer::DFrameBuffer + Line 481: EXTRN ??1DFrameBuffer@@UEAA@XZ:PROC ; DFrameBuffer::~DFrameBuffer + Line 482: EXTRN ?GetPalette@DFrameBuffer@@QEAAPEAUPalEntry@@XZ:PROC ; DFrameBuffer::GetPalette + Line 483: EXTRN ?SetVSync@DFrameBuffer@@UEAAX_N@Z:PROC ; DFrameBuffer::SetVSync + Line 484: EXTRN ?GetCaps@DFrameBuffer@@UEAAIXZ:PROC ; DFrameBuffer::GetCaps + Line 485: EXTRN ?WriteSavePic@DFrameBuffer@@UEAAXPEAVplayer_t@@PEAVFileWriter@@HH@Z:PROC ; DFrameBuffer::WriteSavePic + Line 486: EXTRN ?WipeStartScreen@DFrameBuffer@@UEAAPEAVFTexture@@XZ:PROC ; DFrameBuffer::WipeStartScreen + Line 487: EXTRN ?WipeEndScreen@DFrameBuffer@@UEAAPEAVFTexture@@XZ:PROC ; DFrameBuffer::WipeEndScreen + Line 488: EXTRN ?SetViewportRects@DFrameBuffer@@UEAAXPEAUIntRect@@@Z:PROC ; DFrameBuffer::SetViewportRects + Line 489: EXTRN ?V_ClearFonts@@YAXXZ:PROC ; V_ClearFonts + Line 490: EXTRN ??0FScriptPosition@@QEAA@AEAVFScanner@@@Z:PROC ; FScriptPosition::FScriptPosition + Line 491: EXTRN ?Message@FScriptPosition@@QEBAXHPEBDZZ:PROC ; FScriptPosition::Message + Line 492: EXTRN ??0FMemLump@@QEAA@XZ:PROC ; FMemLump::FMemLump + Line 493: EXTRN ??4FMemLump@@QEAAAEAV0@AEBV0@@Z:PROC ; FMemLump::operator= + Line 494: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 495: EXTRN ?CheckNumForName@FWadCollection@@QEAAHPEBDH@Z:PROC ; FWadCollection::CheckNumForName + Line 496: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 497: EXTRN ?LumpLength@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::LumpLength + Line 498: EXTRN ?GetNumLumps@FWadCollection@@QEBAHXZ:PROC ; FWadCollection::GetNumLumps + Line 499: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 500: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 501: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 502: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 503: EXTRN ?ParseHex@@YAHPEBDPEAUFScriptPosition@@@Z:PROC ; ParseHex + Line 504: EXTRN ?CallScreenSizeChanged@DBaseStatusBar@@QEAAXXZ:PROC ; DBaseStatusBar::CallScreenSizeChanged + Line 505: EXTRN ?ST_LoadCrosshair@@YAX_N@Z:PROC ; ST_LoadCrosshair + Line 506: EXTRN ?I_SetFPSLimit@@YAXH@Z:PROC ; I_SetFPSLimit + Line 507: EXTRN ?SendPitchLimits@player_t@@QEBAXXZ:PROC ; player_t::SendPitchLimits + Line 508: EXTRN ?ViewportIsScaled43@@YA_NXZ:PROC ; ViewportIsScaled43 + Line 509: EXTRN ??_EDDummyFrameBuffer@@UEAAPEAXI@Z:PROC ; DDummyFrameBuffer::`vector deleting destructor' + Line 510: EXTRN __CxxFrameHandler3:PROC + Line 511: EXTRN memset:PROC + Line 512: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 513: EXTRN ?CPU@@3UCPUInfo@@A:BYTE ; CPU + Line 514: EXTRN ?Video@@3PEAVIVideo@@EA:QWORD ; Video + Line 515: EXTRN ?Args@@3PEAVFArgs@@EA:QWORD ; Args + Line 516: EXTRN ?GPalette@@3UFPalette@@A:BYTE ; GPalette + Line 517: EXTRN ?ColorMatcher@@3VFColorMatcher@@A:QWORD ; ColorMatcher + Line 518: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 519: EXTRN ?R_OldBlend@@3IA:DWORD ; R_OldBlend + Line 520: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 521: EXTRN ?menu_resolution_custom_width@@3VFIntCVar@@A:BYTE ; menu_resolution_custom_width + Line 522: EXTRN ?menu_resolution_custom_height@@3VFIntCVar@@A:BYTE ; menu_resolution_custom_height + Line 523: EXTRN __ImageBase:BYTE + Line 524: EXTRN _fltused:DWORD + Line 525: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\vmbuilder.cod (70 hits) + Line 753: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 754: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 755: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 756: EXTRN atexit:PROC + Line 757: EXTRN __std_terminate:PROC + Line 758: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 759: EXTRN fclose:PROC + Line 760: EXTRN fflush:PROC + Line 761: EXTRN fopen:PROC + Line 762: EXTRN __stdio_common_vfprintf:PROC + Line 763: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 764: EXTRN ?_Xbad_function_call@std@@YAXXZ:PROC ; std::_Xbad_function_call + Line 765: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 766: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 767: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 768: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 769: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 770: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 771: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 772: EXTRN ?SuperFastHash@@YAIPEBD_K@Z:PROC ; SuperFastHash + Line 773: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 774: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 775: EXTRN ?FreeAllBlocks@FMemArena@@QEAAXXZ:PROC ; FMemArena::FreeAllBlocks + Line 776: EXTRN ?GetImplicitArgs@PFunction@@QEAAHXZ:PROC ; PFunction::GetImplicitArgs + Line 777: EXTRN ?CreateRegUse@VMFunction@@IEAAXXZ:PROC ; VMFunction::CreateRegUse + Line 778: EXTRN ??0VMScriptFunction@@QEAA@VFName@@@Z:PROC ; VMScriptFunction::VMScriptFunction + Line 779: EXTRN ?Alloc@VMScriptFunction@@QEAAXHHHHHH@Z:PROC ; VMScriptFunction::Alloc + Line 780: EXTRN ??0ExpEmit@@QEAA@PEAVVMFunctionBuilder@@HH@Z:PROC ; ExpEmit::ExpEmit + Line 781: EXTRN ?Free@ExpEmit@@QEAAXPEAVVMFunctionBuilder@@@Z:PROC ; ExpEmit::Free + Line 782: EXTRN ?DumpFunction@@YAXPEAU_iobuf@@PEAVVMScriptFunction@@PEBDH@Z:PROC ; DumpFunction + Line 783: EXTRN ?EncodeRegType@@YAHUExpEmit@@@Z:PROC ; EncodeRegType + Line 784: EXTRN ??0FScriptPosition@@QEAA@AEBU0@@Z:PROC ; FScriptPosition::FScriptPosition + Line 785: EXTRN ?Message@FScriptPosition@@QEBAXHPEBDZZ:PROC ; FScriptPosition::Message + Line 786: EXTRN ?NewPrototype@@YAPEAVPPrototype@@AEBV?$TArray@PEAVPType@@PEAV1@@@0@Z:PROC ; NewPrototype + Line 787: EXTRN ??0FCompileContext@@QEAA@PEAVPNamespace@@PEAVPFunction@@PEAVPPrototype@@_NHHHAEBUVersionInfo@@@Z:PROC ; FCompileContext::FCompileContext + Line 788: EXTRN ?Resolve@FxExpression@@UEAAPEAV1@AEAUFCompileContext@@@Z:PROC ; FxExpression::Resolve + Line 789: EXTRN ?isConstant@FxExpression@@UEBA_NXZ:PROC ; FxExpression::isConstant + Line 790: EXTRN ?RequestAddress@FxExpression@@UEAA_NAEAUFCompileContext@@PEA_N@Z:PROC ; FxExpression::RequestAddress + Line 791: EXTRN ?ReturnProto@FxExpression@@UEAAPEAVPPrototype@@XZ:PROC ; FxExpression::ReturnProto + Line 792: EXTRN ?GetDirectFunction@FxExpression@@UEAAPEAVVMFunction@@PEAVPFunction@@AEBUVersionInfo@@@Z:PROC ; FxExpression::GetDirectFunction + Line 793: EXTRN ?Emit@FxExpression@@UEAA?AUExpEmit@@PEAVVMFunctionBuilder@@@Z:PROC ; FxExpression::Emit + Line 794: EXTRN ?EmitCompare@FxExpression@@UEAAXPEAVVMFunctionBuilder@@_NAEAV?$TArray@_K_K@@2@Z:PROC ; FxExpression::EmitCompare + Line 795: EXTRN ??_EFxExpression@@UEAAPEAXI@Z:PROC ; FxExpression::`vector deleting destructor' + Line 796: EXTRN ?Resolve@FxSequence@@UEAAPEAVFxExpression@@AEAUFCompileContext@@@Z:PROC ; FxSequence::Resolve + Line 797: EXTRN ?Emit@FxSequence@@UEAA?AUExpEmit@@PEAVVMFunctionBuilder@@@Z:PROC ; FxSequence::Emit + Line 798: EXTRN ?GetDirectFunction@FxSequence@@UEAAPEAVVMFunction@@PEAVPFunction@@AEBUVersionInfo@@@Z:PROC ; FxSequence::GetDirectFunction + Line 799: EXTRN ?CheckReturn@FxSequence@@UEAA_NXZ:PROC ; FxSequence::CheckReturn + Line 800: EXTRN ??_EFxSequence@@UEAAPEAXI@Z:PROC ; FxSequence::`vector deleting destructor' + Line 801: EXTRN ?Resolve@FxCompoundStatement@@UEAAPEAVFxExpression@@AEAUFCompileContext@@@Z:PROC ; FxCompoundStatement::Resolve + Line 802: EXTRN ?Emit@FxCompoundStatement@@UEAA?AUExpEmit@@PEAVVMFunctionBuilder@@@Z:PROC ; FxCompoundStatement::Emit + Line 803: EXTRN ??_EFxCompoundStatement@@UEAAPEAXI@Z:PROC ; FxCompoundStatement::`vector deleting destructor' + Line 804: EXTRN ??0FxReturnStatement@@QEAA@PEAVFxExpression@@AEBUFScriptPosition@@@Z:PROC ; FxReturnStatement::FxReturnStatement + Line 805: EXTRN ??0FxLocalVariableDeclaration@@QEAA@PEAVPType@@VFName@@PEAVFxExpression@@HAEBUFScriptPosition@@@Z:PROC ; FxLocalVariableDeclaration::FxLocalVariableDeclaration + Line 806: EXTRN ?CheckParm@FArgs@@QEBAHPEBDH@Z:PROC ; FArgs::CheckParm + Line 807: EXTRN ?JitDumpLog@@YAXPEAU_iobuf@@PEAVVMScriptFunction@@@Z:PROC ; JitDumpLog + Line 808: EXTRN _CxxThrowException:PROC + Line 809: EXTRN __CxxFrameHandler3:PROC + Line 810: EXTRN memcpy:PROC + Line 811: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 812: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 813: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 814: EXTRN ?ClassDataAllocator@@3VFMemArena@@A:BYTE ; ClassDataAllocator + Line 815: EXTRN ?AllFunctions@VMFunction@@2V?$TArray@PEAVVMFunction@@PEAV1@@@A:BYTE ; VMFunction::AllFunctions + Line 816: EXTRN ?ErrorCounter@FScriptPosition@@2HA:DWORD ; FScriptPosition::ErrorCounter + Line 817: EXTRN ?StrictErrors@FScriptPosition@@2_NA:BYTE ; FScriptPosition::StrictErrors + Line 818: EXTRN ?FxAlloc@@3VFMemArena@@A:BYTE ; FxAlloc + Line 819: EXTRN ?Args@@3PEAVFArgs@@EA:QWORD ; Args + Line 820: EXTRN ?vm_jit@@3VFBoolCVar@@A:BYTE ; vm_jit + Line 821: EXTRN __ImageBase:BYTE + Line 822: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\vmdisasm.cod (5 hits) + Line 1229: EXTRN __stdio_common_vfprintf:PROC + Line 1230: EXTRN mysnprintf:PROC + Line 1231: EXTRN ?VPrintf@@YAHHPEBDPEAD@Z:PROC ; VPrintf + Line 1232: EXTRN __ImageBase:BYTE + Line 1233: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\vmexec.cod (56 hits) + Line 136: EXTRN stricmp:PROC + Line 137: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_K_N@Z:PROC ; FName::NameManager::FindName + Line 138: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 139: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 140: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 141: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 142: EXTRN ??HFString@@QEBA?AV0@AEBV0@@Z:PROC ; FString::operator+ + Line 143: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 144: EXTRN ?AppendFormat@FString@@QEAAXPEBDZZ:PROC ; FString::AppendFormat + Line 145: EXTRN ?ToLong@FString@@QEBAJH@Z:PROC ; FString::ToLong + Line 146: EXTRN ?ToDouble@FString@@QEBANXZ:PROC ; FString::ToDouble + Line 147: EXTRN c_asin:PROC + Line 148: EXTRN c_acos:PROC + Line 149: EXTRN c_atan:PROC + Line 150: EXTRN c_atan2:PROC + Line 151: EXTRN c_tan:PROC + Line 152: EXTRN c_sqrt:PROC + Line 153: EXTRN c_sinh:PROC + Line 154: EXTRN c_cosh:PROC + Line 155: EXTRN c_tanh:PROC + Line 156: EXTRN c_exp:PROC + Line 157: EXTRN c_log:PROC + Line 158: EXTRN c_log10:PROC + Line 159: EXTRN c_pow:PROC + Line 160: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 161: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 162: EXTRN ?Barrier@GC@@YAXPEAVDObject@@0@Z:PROC ; GC::Barrier + Line 163: EXTRN ?V_GetColor@@YAHPEBIPEBDPEAUFScriptPosition@@@Z:PROC ; V_GetColor + Line 164: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 165: EXTRN ?ValidateCall@FScopeBarrier@@SAXPEAVPClass@@PEAVVMFunction@@H@Z:PROC ; FScopeBarrier::ValidateCall + Line 166: EXTRN ?MaybePrintMessage@CVMAbortException@@QEAAXXZ:PROC ; CVMAbortException::MaybePrintMessage + Line 167: EXTRN ?ThrowAbortException@@YAXW4EVMAbortException@@PEBDZZ:PROC ; ThrowAbortException + Line 168: EXTRN ??0VMFrameStack@@QEAA@XZ:PROC ; VMFrameStack::VMFrameStack + Line 169: EXTRN ??1VMFrameStack@@QEAA@XZ:PROC ; VMFrameStack::~VMFrameStack + Line 170: EXTRN ?AllocFrame@VMFrameStack@@QEAAPEAUVMFrame@@PEAVVMScriptFunction@@@Z:PROC ; VMFrameStack::AllocFrame + Line 171: EXTRN ?PopFrame@VMFrameStack@@QEAAPEAUVMFrame@@XZ:PROC ; VMFrameStack::PopFrame + Line 172: EXTRN ?PCToLine@VMScriptFunction@@QEAAHPEBTVMOP@@@Z:PROC ; VMScriptFunction::PCToLine + Line 173: EXTRN _wassert:PROC + Line 174: EXTRN __tlregdtor:PROC + Line 175: EXTRN _CxxThrowException:PROC + Line 176: EXTRN __CxxFrameHandler3:PROC + Line 177: EXTRN ceil:PROC + Line 178: EXTRN floor:PROC + Line 179: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 180: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 181: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 182: EXTRN ?State@GC@@3W4EGCState@1@A:DWORD ; GC::State + Line 183: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 184: EXTRN ?S_sfx@@3V?$TArray@Usfxinfo_t@@U1@@@A:BYTE ; S_sfx + Line 185: EXTRN ?sprites@@3V?$TArray@Uspritedef_t@@U1@@@A:BYTE ; sprites + Line 186: EXTRN ?stacktrace@CVMAbortException@@2VFString@@A:QWORD ; CVMAbortException::stacktrace + Line 187: EXTRN ?VMCycles@@3PAVcycle_t@@A:BYTE ; VMCycles + Line 188: EXTRN ?VMCalls@@3PAHA:BYTE ; VMCalls + Line 189: EXTRN __ImageBase:BYTE + Line 190: EXTRN _fltused:DWORD + Line 191: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\vmframe.cod (50 hits) + Line 22: EXTRN ??_EStat_VM@@UEAAPEAXI@Z:PROC ; Stat_VM::`vector deleting destructor' + Line 159: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 160: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 161: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 162: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 163: EXTRN atexit:PROC + Line 164: EXTRN __std_terminate:PROC + Line 165: EXTRN strncpy:PROC + Line 166: EXTRN stricmp:PROC + Line 167: EXTRN __std_exception_copy:PROC + Line 168: EXTRN __std_exception_destroy:PROC + Line 169: EXTRN ??_Eexception@std@@UEAAPEAXI@Z:PROC ; std::exception::`vector deleting destructor' + Line 170: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 171: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 172: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 173: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 174: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 175: EXTRN ?AppendFormat@FString@@QEAAXPEBDZZ:PROC ; FString::AppendFormat + Line 176: EXTRN ??0FStringf@@QEAA@PEBDZZ:PROC ; FStringf::FStringf + Line 177: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 178: EXTRN mysnprintf:PROC + Line 179: EXTRN myvsnprintf:PROC + Line 180: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 181: EXTRN ??0FStat@@QEAA@PEBD@Z:PROC ; FStat::FStat + Line 182: EXTRN ??1FStat@@UEAA@XZ:PROC ; FStat::~FStat + Line 183: EXTRN ?argc@FCommandLine@@QEAAHXZ:PROC ; FCommandLine::argc + Line 184: EXTRN ??AFCommandLine@@QEAAPEADH@Z:PROC ; FCommandLine::operator[] + Line 185: EXTRN ??0FConsoleCommand@@QEAA@PEBDP6AXAEAVFCommandLine@@PEAVAActor@@H@Z@Z:PROC ; FConsoleCommand::FConsoleCommand + Line 186: EXTRN ??1FConsoleCommand@@UEAA@XZ:PROC ; FConsoleCommand::~FConsoleCommand + Line 187: EXTRN ??_ECDoomError@@UEAAPEAXI@Z:PROC ; CDoomError::`vector deleting destructor' + Line 188: EXTRN ??_ECVMAbortException@@UEAAPEAXI@Z:PROC ; CVMAbortException::`vector deleting destructor' + Line 189: EXTRN ??_EVMFunction@@UEAAPEAXI@Z:PROC ; VMFunction::`vector deleting destructor' + Line 190: EXTRN ?FStringFormat@@YA?AVFString@@PEAUVMValue@@HPEAUVMReturn@@HH@Z:PROC ; FStringFormat + Line 191: EXTRN ?VMSelectEngine@@YAXW4EVMEngine@@@Z:PROC ; VMSelectEngine + Line 192: EXTRN ??_EVMScriptFunction@@UEAAPEAXI@Z:PROC ; VMScriptFunction::`vector deleting destructor' + Line 193: EXTRN ?JitCompile@@YAP6AHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@ZPEAVVMScriptFunction@@@Z:PROC ; JitCompile + Line 194: EXTRN ?JitCaptureStackTrace@@YA?AVFString@@H_N@Z:PROC ; JitCaptureStackTrace + Line 195: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 196: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 197: EXTRN _CxxThrowException:PROC + Line 198: EXTRN __CxxFrameHandler3:PROC + Line 199: EXTRN memmove:PROC + Line 200: EXTRN memset:PROC + Line 201: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 202: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 203: EXTRN ?ClassDataAllocator@@3VFMemArena@@A:BYTE ; ClassDataAllocator + Line 204: EXTRN ?PerfToMillisec@@3NA:QWORD ; PerfToMillisec + Line 205: EXTRN ?VMExec@@3P6AHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@ZEA:QWORD ; VMExec + Line 206: EXTRN __ImageBase:BYTE + Line 207: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\vmiterators.cod (32 hits) + Line 100: EXTRN ??_EDThinkerIterator@@UEAAPEAXI@Z:PROC ; DThinkerIterator::`vector deleting destructor' + Line 101: EXTRN ??_EDBlockLinesIterator@@UEAAPEAXI@Z:PROC ; DBlockLinesIterator::`vector deleting destructor' + Line 102: EXTRN ??_EDBlockThingsIterator@@UEAAPEAXI@Z:PROC ; DBlockThingsIterator::`vector deleting destructor' + Line 103: EXTRN ??_EDSectorTagIterator@@UEAAPEAXI@Z:PROC ; DSectorTagIterator::`vector deleting destructor' + Line 104: EXTRN ??_EDLineIdIterator@@UEAAPEAXI@Z:PROC ; DLineIdIterator::`vector deleting destructor' + Line 105: EXTRN ??_EDActorIterator@@UEAAPEAXI@Z:PROC ; DActorIterator::`vector deleting destructor' + Line 106: EXTRN ?RegistrationInfo@DObject@@2UClassReg@@A:BYTE ; DObject::RegistrationInfo + Line 107: EXTRN ?Serialize@DObject@@UEAAXAEAVFSerializer@@@Z:PROC ; DObject::Serialize + Line 108: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 109: EXTRN ?PropagateMark@DObject@@UEAA_KXZ:PROC ; DObject::PropagateMark + Line 110: EXTRN ?level@@3UFLevelLocals@@A:BYTE ; level + Line 408: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 409: EXTRN __std_terminate:PROC + Line 410: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 411: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 412: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 413: EXTRN ??1DObject@@UEAA@XZ:PROC ; DObject::~DObject + Line 414: EXTRN ??0FThinkerIterator@@QEAA@PEAUFLevelLocals@@PEBVPClass@@H@Z:PROC ; FThinkerIterator::FThinkerIterator + Line 415: EXTRN ?Next@FThinkerIterator@@QEAAPEAVDThinker@@_N@Z:PROC ; FThinkerIterator::Next + Line 416: EXTRN ?Reinit@FThinkerIterator@@QEAAXXZ:PROC ; FThinkerIterator::Reinit + Line 417: EXTRN ?Next@FSectorTagIterator@@QEAAHXZ:PROC ; FSectorTagIterator::Next + Line 418: EXTRN ?NextCompat@FSectorTagIterator@@QEAAH_NH@Z:PROC ; FSectorTagIterator::NextCompat + Line 419: EXTRN ?Next@FLineIdIterator@@QEAAHXZ:PROC ; FLineIdIterator::Next + Line 420: EXTRN ??0FMultiBlockLinesIterator@@QEAA@AEAUFPortalGroupArray@@PEAVAActor@@N@Z:PROC ; FMultiBlockLinesIterator::FMultiBlockLinesIterator + Line 421: EXTRN ??0FMultiBlockLinesIterator@@QEAA@AEAUFPortalGroupArray@@PEAUFLevelLocals@@NNNNNPEAUsector_t@@@Z:PROC ; FMultiBlockLinesIterator::FMultiBlockLinesIterator + Line 422: EXTRN ?Next@FMultiBlockLinesIterator@@QEAA_NPEAUCheckResult@1@@Z:PROC ; FMultiBlockLinesIterator::Next + Line 423: EXTRN ??0FMultiBlockThingsIterator@@QEAA@AEAUFPortalGroupArray@@PEAVAActor@@N_N@Z:PROC ; FMultiBlockThingsIterator::FMultiBlockThingsIterator + Line 424: EXTRN ??0FMultiBlockThingsIterator@@QEAA@AEAUFPortalGroupArray@@PEAUFLevelLocals@@NNNNN_NPEAUsector_t@@@Z:PROC ; FMultiBlockThingsIterator::FMultiBlockThingsIterator + Line 425: EXTRN ?Next@FMultiBlockThingsIterator@@QEAA_NPEAUCheckResult@1@@Z:PROC ; FMultiBlockThingsIterator::Next + Line 426: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 427: EXTRN __CxxFrameHandler3:PROC + Line 428: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\vmthunks.cod (139 hits) + Line 942: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 943: EXTRN ?StatusBar@@3PEAVDBaseStatusBar@@EA:QWORD ; StatusBar + Line 944: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 945: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 946: EXTRN ?am_showmaplabel@@3VFIntCVar@@A:BYTE ; am_showmaplabel + Line 947: EXTRN ?setsizeneeded@@3_NA:BYTE ; setsizeneeded + Line 948: EXTRN ?ACS_GlobalVars@@3U?$BoundsCheckingArray@H$0EA@@@A:BYTE ; ACS_GlobalVars + Line 949: EXTRN ?ACS_GlobalArrays@@3U?$BoundsCheckingArray@V?$TMap@HHU?$THashTraits@H@@UInitIntToZero@@@@$0EA@@@A:BYTE ; ACS_GlobalArrays + Line 950: EXTRN ?level@@3UFLevelLocals@@A:BYTE ; level + Line 951: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 952: EXTRN ?GStrings@@3VFStringTable@@A:BYTE ; GStrings + Line 3835: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 3836: EXTRN __std_terminate:PROC + Line 3837: EXTRN __stdio_common_vsprintf:PROC + Line 3838: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 3839: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 3840: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 3841: EXTRN ??0FString@@QEAA@D@Z:PROC ; FString::FString + Line 3842: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 3843: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 3844: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 3845: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 3846: EXTRN ??YFString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator+= + Line 3847: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 3848: EXTRN ?Left@FString@@QEBA?AV1@_K@Z:PROC ; FString::Left + Line 3849: EXTRN ?Mid@FString@@QEBA?AV1@_K0@Z:PROC ; FString::Mid + Line 3850: EXTRN ?IndexOf@FString@@QEBAJAEBV1@J@Z:PROC ; FString::IndexOf + Line 3851: EXTRN ?LastIndexOfBroken@FString@@QEBAJAEBV1@J@Z:PROC ; FString::LastIndexOfBroken + Line 3852: EXTRN ?LastIndexOf@FString@@QEBAJAEBV1@J@Z:PROC ; FString::LastIndexOf + Line 3853: EXTRN ?ToUpper@FString@@QEAAXXZ:PROC ; FString::ToUpper + Line 3854: EXTRN ?ToLower@FString@@QEAAXXZ:PROC ; FString::ToLower + Line 3855: EXTRN ?Substitute@FString@@QEAAXAEBV1@0@Z:PROC ; FString::Substitute + Line 3856: EXTRN ?ToLong@FString@@QEBAJH@Z:PROC ; FString::ToLong + Line 3857: EXTRN ?ToDouble@FString@@QEBANXZ:PROC ; FString::ToDouble + Line 3858: EXTRN ?Truncate@FString@@QEAAX_K@Z:PROC ; FString::Truncate + Line 3859: EXTRN ?Remove@FString@@QEAAX_K0@Z:PROC ; FString::Remove + Line 3860: EXTRN ?Split@FString@@QEBAXAEAV?$TArray@VFString@@V1@@@AEBV1@W4EmptyTokenType@1@@Z:PROC ; FString::Split + Line 3861: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 3862: EXTRN c_atan2:PROC + Line 3863: EXTRN c_sqrt:PROC + Line 3864: EXTRN ?strbin1@@YA?AVFString@@PEBD@Z:PROC ; strbin1 + Line 3865: EXTRN ?ThrowAbortException@@YAXW4EVMAbortException@@PEBDZZ:PROC ; ThrowAbortException + Line 3866: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 3867: EXTRN ?Barrier@GC@@YAXPEAVDObject@@0@Z:PROC ; GC::Barrier + Line 3868: EXTRN ?CheckOverlap@sector_t@@QEAAXXZ:PROC ; sector_t::CheckOverlap + Line 3869: EXTRN ?FindLowestFloorSurrounding@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindLowestFloorSurrounding + Line 3870: EXTRN ?FindHighestFloorSurrounding@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindHighestFloorSurrounding + Line 3871: EXTRN ?FindNextHighestFloor@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindNextHighestFloor + Line 3872: EXTRN ?FindNextLowestFloor@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindNextLowestFloor + Line 3873: EXTRN ?FindLowestCeilingSurrounding@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindLowestCeilingSurrounding + Line 3874: EXTRN ?FindHighestCeilingSurrounding@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindHighestCeilingSurrounding + Line 3875: EXTRN ?FindNextLowestCeiling@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindNextLowestCeiling + Line 3876: EXTRN ?FindNextHighestCeiling@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindNextHighestCeiling + Line 3877: EXTRN ?FindMinSurroundingLight@@YAHPEBUsector_t@@H@Z:PROC ; FindMinSurroundingLight + Line 3878: EXTRN ?FindHighestFloorPoint@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindHighestFloorPoint + Line 3879: EXTRN ?FindShortestTextureAround@@YANPEAUsector_t@@@Z:PROC ; FindShortestTextureAround + Line 3880: EXTRN ?FindShortestUpperAround@@YANPEAUsector_t@@@Z:PROC ; FindShortestUpperAround + Line 3881: EXTRN ?FindModelFloorSector@@YAPEAUsector_t@@PEAU1@N@Z:PROC ; FindModelFloorSector + Line 3882: EXTRN ?FindModelCeilingSector@@YAPEAUsector_t@@PEAU1@N@Z:PROC ; FindModelCeilingSector + Line 3883: EXTRN ?FindLowestCeilingPoint@@YANPEBUsector_t@@PEAPEAUvertex_t@@@Z:PROC ; FindLowestCeilingPoint + Line 3884: EXTRN ?NextHighestCeilingAt@@YANPEAUsector_t@@NNNNHPEAPEAU1@PEAPEAUF3DFloor@@@Z:PROC ; NextHighestCeilingAt + Line 3885: EXTRN ?NextLowestFloorAt@@YANPEAUsector_t@@NNNHNPEAPEAU1@PEAPEAUF3DFloor@@@Z:PROC ; NextLowestFloorAt + Line 3886: EXTRN ?RemoveForceField@@YAXPEAUsector_t@@@Z:PROC ; RemoveForceField + Line 3887: EXTRN ?PlaneMoving@@YAHPEAUsector_t@@H@Z:PROC ; PlaneMoving + Line 3888: EXTRN ?TransferSpecial@@YAXPEAUsector_t@@0@Z:PROC ; TransferSpecial + Line 3889: EXTRN ?GetSpecial@@YAXPEAUsector_t@@PEAUsecspecial_t@@@Z:PROC ; GetSpecial + Line 3890: EXTRN ?SetSpecial@@YAXPEAUsector_t@@PEBUsecspecial_t@@@Z:PROC ; SetSpecial + Line 3891: EXTRN ?GetTerrain@@YAHPEBUsector_t@@H@Z:PROC ; GetTerrain + Line 3892: EXTRN ?CheckPortalPlane@@YAXPEAUsector_t@@H@Z:PROC ; CheckPortalPlane + Line 3893: EXTRN ?AdjustFloorClip@@YAXPEBUsector_t@@@Z:PROC ; AdjustFloorClip + Line 3894: EXTRN ?SetColor@@YAXPEAUsector_t@@HH@Z:PROC ; SetColor + Line 3895: EXTRN ?SetFade@@YAXPEAUsector_t@@H@Z:PROC ; SetFade + Line 3896: EXTRN ?GetFloorLight@@YAHPEBUsector_t@@@Z:PROC ; GetFloorLight + Line 3897: EXTRN ?GetCeilingLight@@YAHPEBUsector_t@@@Z:PROC ; GetCeilingLight + Line 3898: EXTRN ?GetFriction@@YANPEBUsector_t@@HPEAN@Z:PROC ; GetFriction + Line 3899: EXTRN ?HighestCeilingAt@@YANPEAUsector_t@@NNPEAPEAU1@@Z:PROC ; HighestCeilingAt + Line 3900: EXTRN ?LowestFloorAt@@YANPEAUsector_t@@NNPEAPEAU1@@Z:PROC ; LowestFloorAt + Line 3901: EXTRN ?FindClusterInfo@@YAPEAUcluster_info_t@@H@Z:PROC ; FindClusterInfo + Line 3902: EXTRN ?CheckForTexture@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::CheckForTexture + Line 3903: EXTRN _localtime64:PROC + Line 3904: EXTRN _time64:PROC + Line 3905: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 3906: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 3907: EXTRN ??1DObject@@UEAA@XZ:PROC ; DObject::~DObject + Line 3908: EXTRN ?Serialize@DObject@@UEAAXAEAVFSerializer@@@Z:PROC ; DObject::Serialize + Line 3909: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 3910: EXTRN ?PropagateMark@DObject@@UEAA_KXZ:PROC ; DObject::PropagateMark + Line 3911: EXTRN ?LookupString@FBehaviorContainer@@QEAAPEBDI@Z:PROC ; FBehaviorContainer::LookupString + Line 3912: EXTRN ?S_FindEnvironment@@YAPEAUReverbContainer@@PEBD@Z:PROC ; S_FindEnvironment + Line 3913: EXTRN ?S_FindEnvironment@@YAPEAUReverbContainer@@H@Z:PROC ; S_FindEnvironment + Line 3914: EXTRN ?LocateWeapon@FWeaponSlots@@QEAA_NPEAVPClassActor@@QEAH1@Z:PROC ; FWeaponSlots::LocateWeapon + Line 3915: EXTRN ?SetupWeaponSlots@FWeaponSlots@@SAXPEAVAActor@@@Z:PROC ; FWeaponSlots::SetupWeaponSlots + Line 3916: EXTRN ?GetPortalOffsetPosition@FLevelLocals@@QEAA?AU?$TVector2@N@@NNNN@Z:PROC ; FLevelLocals::GetPortalOffsetPosition + Line 3917: EXTRN ?ReplaceTextures@FLevelLocals@@QEAAXPEBD0H@Z:PROC ; FLevelLocals::ReplaceTextures + Line 3918: EXTRN ?PointInSubsector@FLevelLocals@@AEAAPEAUsubsector_t@@NN@Z:PROC ; FLevelLocals::PointInSubsector + Line 3919: EXTRN ?FindFont@FFont@@SAPEAV1@VFName@@@Z:PROC ; FFont::FindFont + Line 3920: EXTRN ?StringWidth@FFont@@QEBAHPEBE@Z:PROC ; FFont::StringWidth + Line 3921: EXTRN ?V_FindFontColor@@YA?AW4EColorRange@@VFName@@@Z:PROC ; V_FindFontColor + Line 3922: EXTRN ?V_GetFont@@YAPEAVFFont@@PEBD@Z:PROC ; V_GetFont + Line 3923: EXTRN ??RFStringTable@@QEBAPEBDPEBD@Z:PROC ; FStringTable::operator() + Line 3924: EXTRN ?SetState@FMugShot@@QEAA_NPEBD_N1@Z:PROC ; FMugShot::SetState + Line 3925: EXTRN ?GetFace@FMugShot@@QEAAPEAVFTexture@@PEAVplayer_t@@PEBDHW4StateFlags@1@@Z:PROC ; FMugShot::GetFace + Line 3926: EXTRN ?StaticType@DHUDFont@@UEBAPEAVPClass@@XZ:PROC ; DHUDFont::StaticType + Line 3927: EXTRN ??_EDHUDFont@@UEAAPEAXI@Z:PROC ; DHUDFont::`vector deleting destructor' + Line 3928: EXTRN ?SetSize@DBaseStatusBar@@QEAAXHHHHH@Z:PROC ; DBaseStatusBar::SetSize + Line 3929: EXTRN ?AttachMessage@DBaseStatusBar@@QEAAXPEAVDHUDMessageBase@@IH@Z:PROC ; DBaseStatusBar::AttachMessage + Line 3930: EXTRN ?DetachMessage@DBaseStatusBar@@QEAAPEAVDHUDMessageBase@@PEAV2@@Z:PROC ; DBaseStatusBar::DetachMessage + Line 3931: EXTRN ?DetachMessage@DBaseStatusBar@@QEAAPEAVDHUDMessageBase@@I@Z:PROC ; DBaseStatusBar::DetachMessage + Line 3932: EXTRN ?DetachAllMessages@DBaseStatusBar@@QEAAXXZ:PROC ; DBaseStatusBar::DetachAllMessages + Line 3933: EXTRN ?GetHUDScale@DBaseStatusBar@@QEBA?AU?$TVector2@N@@XZ:PROC ; DBaseStatusBar::GetHUDScale + Line 3934: EXTRN ?DrawGraphic@DBaseStatusBar@@QEAAXVFTextureID@@NNHNNNNN@Z:PROC ; DBaseStatusBar::DrawGraphic + Line 3935: EXTRN ?TransformRect@DBaseStatusBar@@QEAAXAEAN000H@Z:PROC ; DBaseStatusBar::TransformRect + Line 3936: EXTRN ?Fill@DBaseStatusBar@@QEAAXUPalEntry@@NNNNH@Z:PROC ; DBaseStatusBar::Fill + Line 3937: EXTRN ?SetClipRect@DBaseStatusBar@@QEAAXNNNNH@Z:PROC ; DBaseStatusBar::SetClipRect + Line 3938: EXTRN ?BeginStatusBar@DBaseStatusBar@@QEAAXHHH_N@Z:PROC ; DBaseStatusBar::BeginStatusBar + Line 3939: EXTRN ?BeginHUD@DBaseStatusBar@@QEAAXHHN_N@Z:PROC ; DBaseStatusBar::BeginHUD + Line 3940: EXTRN ?StatusbarToRealCoords@DBaseStatusBar@@QEBAXAEAN000@Z:PROC ; DBaseStatusBar::StatusbarToRealCoords + Line 3941: EXTRN ?GetInventoryIcon@@YAHPEAVAActor@@IPEAH@Z:PROC ; GetInventoryIcon + Line 3942: EXTRN ??0DSpotState@@QEAA@XZ:PROC ; DSpotState::DSpotState + Line 3943: EXTRN ?AddSpot@DSpotState@@QEAA_NPEAVAActor@@@Z:PROC ; DSpotState::AddSpot + Line 3944: EXTRN ?RemoveSpot@DSpotState@@QEAA_NPEAVAActor@@@Z:PROC ; DSpotState::RemoveSpot + Line 3945: EXTRN ?GetNextInList@DSpotState@@QEAAPEAVAActor@@PEAVPClassActor@@H@Z:PROC ; DSpotState::GetNextInList + Line 3946: EXTRN ?GetSpotWithMinMaxDistance@DSpotState@@QEAAPEAVAActor@@PEAVPClassActor@@NNNN@Z:PROC ; DSpotState::GetSpotWithMinMaxDistance + Line 3947: EXTRN ?GetRandomSpot@DSpotState@@QEAAPEAVAActor@@PEAVPClassActor@@_N@Z:PROC ; DSpotState::GetRandomSpot + Line 3948: EXTRN ?GetUDMFInt@@YAHPEAUFLevelLocals@@HHVFName@@@Z:PROC ; GetUDMFInt + Line 3949: EXTRN ?GetUDMFFloat@@YANPEAUFLevelLocals@@HHVFName@@@Z:PROC ; GetUDMFFloat + Line 3950: EXTRN ?GetUDMFString@@YA?AVFString@@PEAUFLevelLocals@@HHVFName@@@Z:PROC ; GetUDMFString + Line 3951: EXTRN ?Net_GetLatency@@YAHPEAH0@Z:PROC ; Net_GetLatency + Line 3952: EXTRN ?SetCameraToTexture@@YAXPEAVAActor@@AEBVFString@@N@Z:PROC ; SetCameraToTexture + Line 3953: EXTRN ?GetBottomAlignOffset@@YANPEAVFFont@@H@Z:PROC ; GetBottomAlignOffset + Line 3954: EXTRN ?SBar_DrawString@@YAXPEAVDBaseStatusBar@@PEAVDHUDFont@@AEBVFString@@NNHHNHH@Z:PROC ; SBar_DrawString + Line 3955: EXTRN ?FormatNumber@@YAXHHHHAEBVFString@@PEAV1@@Z:PROC ; FormatNumber + Line 3956: EXTRN ?IsPointInMap@@YAHPEAUFLevelLocals@@NNN@Z:PROC ; IsPointInMap + Line 3957: EXTRN __CxxFrameHandler3:PROC + Line 3958: EXTRN ?State@GC@@3W4EGCState@1@A:DWORD ; GC::State + Line 3959: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 3960: EXTRN ?RegistrationInfo@DHUDFont@@2UClassReg@@A:BYTE ; DHUDFont::RegistrationInfo + Line 3961: EXTRN ?RegistrationInfo@DSpotState@@2UClassReg@@A:BYTE ; DSpotState::RegistrationInfo + Line 3962: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\vmthunks_actors.cod (109 hits) + Line 850: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 851: EXTRN ?mStringPropertyData@AActor@@2VFSharedStringArena@@A:BYTE ; AActor::mStringPropertyData + Line 852: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 853: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 854: EXTRN ?spechit@@3V?$TArray@Uspechit_t@@U1@@@A:BYTE ; spechit + Line 855: EXTRN ?Terrains@@3V?$TArray@UFTerrainDef@@U1@@@A:BYTE ; Terrains + Line 856: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 857: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 858: EXTRN ?fasttrig@@3UFFastTrig@@A:BYTE ; fasttrig + Line 3957: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 3958: EXTRN __std_terminate:PROC + Line 3959: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 3960: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 3961: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 3962: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 3963: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 3964: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 3965: EXTRN c_atan2:PROC + Line 3966: EXTRN c_sqrt:PROC + Line 3967: EXTRN ?sin@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::sin + Line 3968: EXTRN ?cos@FFastTrig@@QEAANI@Z:PROC ; FFastTrig::cos + Line 3969: EXTRN ?Alloc@FSharedStringArena@@QEAAPEAVFString@@AEBV2@@Z:PROC ; FSharedStringArena::Alloc + Line 3970: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 3971: EXTRN ?P_CheckFor3DFloorHit@@YA_NPEAVAActor@@N_N@Z:PROC ; P_CheckFor3DFloorHit + Line 3972: EXTRN ?P_CheckFor3DCeilingHit@@YA_NPEAVAActor@@N_N@Z:PROC ; P_CheckFor3DCeilingHit + Line 3973: EXTRN ?StaticPointerSubstitution@DObject@@SAXPEAVAActor@@0@Z:PROC ; DObject::StaticPointerSubstitution + Line 3974: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 3975: EXTRN ?P_GetThingFloorType@@YAHPEAVAActor@@@Z:PROC ; P_GetThingFloorType + Line 3976: EXTRN ?P_GetSpawnableType@@YAPEAVPClassActor@@H@Z:PROC ; P_GetSpawnableType + Line 3977: EXTRN ?P_RoughMonsterSearch@@YAPEAVAActor@@PEAV1@H_N1@Z:PROC ; P_RoughMonsterSearch + Line 3978: EXTRN ?P_TestMobjLocation@@YAHPEAVAActor@@@Z:PROC ; P_TestMobjLocation + Line 3979: EXTRN ?P_TestMobjZ@@YAHPEAVAActor@@_NPEAPEAV1@@Z:PROC ; P_TestMobjZ + Line 3980: EXTRN ?P_CheckPosition@@YA_NPEAVAActor@@AEBU?$TVector2@N@@_N@Z:PROC ; P_CheckPosition + Line 3981: EXTRN ?P_CheckPosition@@YA_NPEAVAActor@@AEBU?$TVector2@N@@AEAUFCheckPosition@@_N@Z:PROC ; P_CheckPosition + Line 3982: EXTRN ?P_TryMove@@YA_NPEAVAActor@@AEBU?$TVector2@N@@HPEBUsecplane_t@@AEAUFCheckPosition@@_N@Z:PROC ; P_TryMove + Line 3983: EXTRN ?P_TryMove@@YA_NPEAVAActor@@AEBU?$TVector2@N@@HPEBUsecplane_t@@_N@Z:PROC ; P_TryMove + Line 3984: EXTRN ?P_CheckMove@@YA_NPEAVAActor@@AEBU?$TVector2@N@@AEAUFCheckPosition@@H@Z:PROC ; P_CheckMove + Line 3985: EXTRN ?P_CheckMove@@YA_NPEAVAActor@@AEBU?$TVector2@N@@H@Z:PROC ; P_CheckMove + Line 3986: EXTRN ?P_TeleportMove@@YA_NPEAVAActor@@AEBU?$TVector3@N@@_N2@Z:PROC ; P_TeleportMove + Line 3987: EXTRN ?P_CheckSight@@YAHPEAVAActor@@0H@Z:PROC ; P_CheckSight + Line 3988: EXTRN ?P_UsePuzzleItem@@YAHPEAVAActor@@H@Z:PROC ; P_UsePuzzleItem + Line 3989: EXTRN ?P_FindFloorCeiling@@YAXPEAVAActor@@H@Z:PROC ; P_FindFloorCeiling + Line 3990: EXTRN ?P_AimLineAttack@@YA?AU?$TAngle@N@@PEAVAActor@@U1@NPEAUFTranslatedLineTarget@@1H00@Z:PROC ; P_AimLineAttack + Line 3991: EXTRN ?P_LineAttack@@YAPEAVAActor@@PEAV1@U?$TAngle@N@@N1HVFName@@PEAVPClassActor@@HPEAUFTranslatedLineTarget@@PEAHNNN@Z:PROC ; P_LineAttack + Line 3992: EXTRN ?P_TraceBleed@@YAXHPEAVAActor@@U?$TAngle@N@@1@Z:PROC ; P_TraceBleed + Line 3993: EXTRN ?P_TraceBleed@@YAXHPEAVAActor@@0@Z:PROC ; P_TraceBleed + Line 3994: EXTRN ?P_TraceBleed@@YAXHPEAUFTranslatedLineTarget@@PEAVAActor@@@Z:PROC ; P_TraceBleed + Line 3995: EXTRN ?P_TraceBleed@@YAXHPEAVAActor@@@Z:PROC ; P_TraceBleed + Line 3996: EXTRN ?P_RailAttack@@YAXPEAUFRailParams@@@Z:PROC ; P_RailAttack + Line 3997: EXTRN ?P_GetRadiusDamage@@YAHPEAVAActor@@0HHH_N@Z:PROC ; P_GetRadiusDamage + Line 3998: EXTRN ?P_RadiusAttack@@YAHPEAVAActor@@0HHVFName@@HH@Z:PROC ; P_RadiusAttack + Line 3999: EXTRN ?P_GetMoveFactor@@YANPEBVAActor@@PEAN@Z:PROC ; P_GetMoveFactor + Line 4000: EXTRN ?P_ActivateLine@@YA_NPEAUline_t@@PEAVAActor@@HHPEAU?$TVector3@N@@@Z:PROC ; P_ActivateLine + Line 4001: EXTRN ?P_GiveSecret@@YAXPEAUFLevelLocals@@PEAVAActor@@_N2H@Z:PROC ; P_GiveSecret + Line 4002: EXTRN ?S_StopSound@@YAXPEAVAActor@@H@Z:PROC ; S_StopSound + Line 4003: EXTRN ?S_ChangeSoundVolume@@YAXPEAVAActor@@HN@Z:PROC ; S_ChangeSoundVolume + Line 4004: EXTRN ?S_MarkPlayerSounds@@YAXPEAVAActor@@@Z:PROC ; S_MarkPlayerSounds + Line 4005: EXTRN ?A_PlaySound@@YAXPEAVAActor@@HHNHNH@Z:PROC ; A_PlaySound + Line 4006: EXTRN ?Apply@DmgFactors@@QEAAHVFName@@H@Z:PROC ; DmgFactors::Apply + Line 4007: EXTRN ?GetReplacement@PClassActor@@QEAAPEAV1@_N@Z:PROC ; PClassActor::GetReplacement + Line 4008: EXTRN ?GetReplacee@PClassActor@@QEAAPEAV1@_N@Z:PROC ; PClassActor::GetReplacee + Line 4009: EXTRN ?GetSpriteIndex@@YAHPEBD_N@Z:PROC ; GetSpriteIndex + Line 4010: EXTRN ?RestoreSpecialPosition@AActor@@QEAAXXZ:PROC ; AActor::RestoreSpecialPosition + Line 4011: EXTRN ?IsTeammate@AActor@@QEAA_NPEAV1@@Z:PROC ; AActor::IsTeammate + Line 4012: EXTRN ?IsFriend@AActor@@QEAA_NPEAV1@@Z:PROC ; AActor::IsFriend + Line 4013: EXTRN ?IsHostile@AActor@@QEAA_NPEAV1@@Z:PROC ; AActor::IsHostile + Line 4014: EXTRN ?GetSpecies@AActor@@QEAA?AVFName@@XZ:PROC ; AActor::GetSpecies + Line 4015: EXTRN ?SpawnHealth@AActor@@QEBAHXZ:PROC ; AActor::SpawnHealth + Line 4016: EXTRN ?GetMissileDamage@AActor@@QEAAHHH@Z:PROC ; AActor::GetMissileDamage + Line 4017: EXTRN ?GetTag@AActor@@QEBAPEBDPEBD@Z:PROC ; AActor::GetTag + Line 4018: EXTRN ?AddToHash@AActor@@QEAAXXZ:PROC ; AActor::AddToHash + Line 4019: EXTRN ?RemoveFromHash@AActor@@QEAAXXZ:PROC ; AActor::RemoveFromHash + Line 4020: EXTRN ?LinkToWorld@AActor@@QEAAXPEAUFLinkContext@@_NPEAUsector_t@@@Z:PROC ; AActor::LinkToWorld + Line 4021: EXTRN ?UnlinkFromWorld@AActor@@QEAAXPEAUFLinkContext@@@Z:PROC ; AActor::UnlinkFromWorld + Line 4022: EXTRN ?SetIdle@AActor@@QEAAX_N@Z:PROC ; AActor::SetIdle + Line 4023: EXTRN ?ClearCounters@AActor@@QEAAXXZ:PROC ; AActor::ClearCounters + Line 4024: EXTRN ?Revive@AActor@@QEAAXXZ:PROC ; AActor::Revive + Line 4025: EXTRN ?ApplyDamageFactor@AActor@@QEBAHVFName@@H@Z:PROC ; AActor::ApplyDamageFactor + Line 4026: EXTRN ?GetModifiedDamage@AActor@@QEAAHVFName@@H_N@Z:PROC ; AActor::GetModifiedDamage + Line 4027: EXTRN ?P_DrawSplash@@YAXPEAUFLevelLocals@@HAEBU?$TVector3@N@@U?$TAngle@N@@H@Z:PROC ; P_DrawSplash + Line 4028: EXTRN ?FindUniqueTID@FLevelLocals@@QEAAHHH@Z:PROC ; FLevelLocals::FindUniqueTID + Line 4029: EXTRN ?GetPortalOffsetPosition@FLevelLocals@@QEAA?AU?$TVector2@N@@NNNN@Z:PROC ; FLevelLocals::GetPortalOffsetPosition + Line 4030: EXTRN ?P_CheckKeys@@YAHPEAVAActor@@H_N1@Z:PROC ; P_CheckKeys + Line 4031: EXTRN ?P_GetKeyTypeCount@@YAHXZ:PROC ; P_GetKeyTypeCount + Line 4032: EXTRN ?P_GetKeyType@@YAPEAVPClassActor@@H@Z:PROC ; P_GetKeyType + Line 4033: EXTRN ?COPY_AAPTR@@YAPEAVAActor@@PEAV1@H@Z:PROC ; COPY_AAPTR + Line 4034: EXTRN ?I_SetMusicVolume@@YAXN@Z:PROC ; I_SetMusicVolume + Line 4035: EXTRN ?P_LineTrace@@YAHPEAVAActor@@U?$TAngle@N@@N1HNNNPEAUFLineTraceData@@@Z:PROC ; P_LineTrace + Line 4036: EXTRN ?P_HitFriend@@YAHPEAVAActor@@@Z:PROC ; P_HitFriend + Line 4037: EXTRN ?P_NoiseAlert@@YAXPEAVAActor@@0_NN@Z:PROC ; P_NoiseAlert + Line 4038: EXTRN ?P_Move@@YAHPEAVAActor@@@Z:PROC ; P_Move + Line 4039: EXTRN ?P_NewChaseDir@@YAXPEAVAActor@@@Z:PROC ; P_NewChaseDir + Line 4040: EXTRN ?P_RandomChaseDir@@YAXPEAVAActor@@@Z:PROC ; P_RandomChaseDir + Line 4041: EXTRN ?P_IsVisible@@YAHPEAVAActor@@0HPEAUFLookExParams@@@Z:PROC ; P_IsVisible + Line 4042: EXTRN ?P_LookForMonsters@@YAHPEAVAActor@@@Z:PROC ; P_LookForMonsters + Line 4043: EXTRN ?P_LookForTID@@YAHPEAVAActor@@HPEAUFLookExParams@@@Z:PROC ; P_LookForTID + Line 4044: EXTRN ?P_LookForEnemies@@YAHPEAVAActor@@HPEAUFLookExParams@@@Z:PROC ; P_LookForEnemies + Line 4045: EXTRN ?P_LookForPlayers@@YAHPEAVAActor@@HPEAUFLookExParams@@@Z:PROC ; P_LookForPlayers + Line 4046: EXTRN ?A_Unblock@@YAXPEAVAActor@@_N@Z:PROC ; A_Unblock + Line 4047: EXTRN ?A_BossDeath@@YAXPEAVAActor@@@Z:PROC ; A_BossDeath + Line 4048: EXTRN ?A_Wander@@YAXPEAVAActor@@H@Z:PROC ; A_Wander + Line 4049: EXTRN ?A_DoChase@@YAXPEAVAActor@@_NPEAUFState@@2111H@Z:PROC ; A_DoChase + Line 4050: EXTRN ?A_Face@@YAXPEAVAActor@@0U?$TAngle@N@@111HN@Z:PROC ; A_Face + Line 4051: EXTRN ?P_CheckForResurrection@@YA_NPEAVAActor@@_N@Z:PROC ; P_CheckForResurrection + Line 4052: EXTRN ?CheckBossDeath@@YAHPEAVAActor@@@Z:PROC ; CheckBossDeath + Line 4053: EXTRN ?PrintPickupMessage@@YAX_NAEBVFString@@@Z:PROC ; PrintPickupMessage + Line 4054: EXTRN ?GetDefaultSpeed@@YANPEAVPClassActor@@@Z:PROC ; GetDefaultSpeed + Line 4055: EXTRN __CxxFrameHandler3:PROC + Line 4056: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\voxels.cod (37 hits) + Line 44: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 45: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 46: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 47: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 48: EXTRN ??_U@YAPEAX_K@Z:PROC ; operator new[] + Line 49: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 50: EXTRN atexit:PROC + Line 51: EXTRN __std_terminate:PROC + Line 52: EXTRN toupper:PROC + Line 53: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 54: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 55: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 56: EXTRN ??1FMemLump@@QEAA@XZ:PROC ; FMemLump::~FMemLump + Line 57: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 58: EXTRN ?ReadLump@FWadCollection@@QEAA?AVFMemLump@@H@Z:PROC ; FWadCollection::ReadLump + Line 59: EXTRN ?FindLump@FWadCollection@@QEAAHPEBDPEAH_N@Z:PROC ; FWadCollection::FindLump + Line 60: EXTRN ?GetLumpFullName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetLumpFullName + Line 61: EXTRN ?BestColor@@YAHPEBIHHHHH@Z:PROC ; BestColor + Line 62: EXTRN ??0FScanner@@QEAA@H@Z:PROC ; FScanner::FScanner + Line 63: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 64: EXTRN ?SetCMode@FScanner@@QEAAX_N@Z:PROC ; FScanner::SetCMode + Line 65: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 66: EXTRN ?GetToken@FScanner@@QEAA_NXZ:PROC ; FScanner::GetToken + Line 67: EXTRN ?MustGetAnyToken@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetAnyToken + Line 68: EXTRN ?TokenMustBe@FScanner@@QEAAXH@Z:PROC ; FScanner::TokenMustBe + Line 69: EXTRN ?MustGetToken@FScanner@@QEAAXH@Z:PROC ; FScanner::MustGetToken + Line 70: EXTRN ?CheckToken@FScanner@@QEAA_NH@Z:PROC ; FScanner::CheckToken + Line 71: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 72: EXTRN ?ScriptMessage@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptMessage + Line 73: EXTRN ?GetSpriteIndex@@YAHPEBD_N@Z:PROC ; GetSpriteIndex + Line 74: EXTRN ?VOX_AddVoxel@@YAXHHPEAUFVoxelDef@@@Z:PROC ; VOX_AddVoxel + Line 75: EXTRN __CxxFrameHandler3:PROC + Line 76: EXTRN memcmp:PROC + Line 77: EXTRN memcpy:PROC + Line 78: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 79: EXTRN ?GPalette@@3UFPalette@@A:BYTE ; GPalette + Line 80: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\w_wad.cod (52 hits) + Line 161: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 162: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 163: EXTRN atexit:PROC + Line 164: EXTRN __std_terminate:PROC + Line 165: EXTRN __stdio_common_vfprintf:PROC + Line 166: EXTRN __stdio_common_vsprintf:PROC + Line 167: EXTRN strrchr:PROC + Line 168: EXTRN strpbrk:PROC + Line 169: EXTRN stricmp:PROC + Line 170: EXTRN strnicmp:PROC + Line 171: EXTRN toupper:PROC + Line 172: EXTRN get_crc_table:PROC + Line 173: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 174: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 175: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 176: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 177: EXTRN ??4FString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator= + Line 178: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 179: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 180: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 181: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 182: EXTRN ?LastIndexOf@FString@@QEBAJD@Z:PROC ; FString::LastIndexOf + Line 183: EXTRN ?ToUpper@FString@@QEAAXXZ:PROC ; FString::ToUpper + Line 184: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 185: EXTRN ?Truncate@FString@@QEAAX_K@Z:PROC ; FString::Truncate + Line 186: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 187: EXTRN ?AllocBuffer@FString@@IEAAX_K@Z:PROC ; FString::AllocBuffer + Line 188: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 189: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 190: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 191: EXTRN ?CheckParm@FArgs@@QEBAHPEBDH@Z:PROC ; FArgs::CheckParm + Line 192: EXTRN ?DirEntryExists@@YA_NPEBDPEA_N@Z:PROC ; DirEntryExists + Line 193: EXTRN ?MakeKey@@YAIPEBD@Z:PROC ; MakeKey + Line 194: EXTRN ?OpenFile@FileReader@@QEAA_NPEBD_J1@Z:PROC ; FileReader::OpenFile + Line 195: EXTRN ?OpenFilePart@FileReader@@QEAA_NAEAV1@_J1@Z:PROC ; FileReader::OpenFilePart + Line 196: EXTRN ?OpenResourceFile@FResourceFile@@SAPEAV1@PEBDAEAVFileReader@@_N2@Z:PROC ; FResourceFile::OpenResourceFile + Line 197: EXTRN ?OpenDirectory@FResourceFile@@SAPEAV1@PEBD_N@Z:PROC ; FResourceFile::OpenDirectory + Line 198: EXTRN ??0FExternalLump@@QEAA@PEBDH@Z:PROC ; FExternalLump::FExternalLump + Line 199: EXTRN ?Init@MD5Context@@QEAAXXZ:PROC ; MD5Context::Init + Line 200: EXTRN ?Update@MD5Context@@QEAAXAEAVFileReader@@I@Z:PROC ; MD5Context::Update + Line 201: EXTRN ?Final@MD5Context@@QEAAXQEAE@Z:PROC ; MD5Context::Final + Line 202: EXTRN __imp_FormatMessageA:PROC + Line 203: EXTRN __imp_LocalFree:PROC + Line 204: EXTRN __imp_GetLastError:PROC + Line 205: EXTRN __CxxFrameHandler3:PROC + Line 206: EXTRN memset:PROC + Line 207: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 208: EXTRN ?batchrun@@3_NA:BYTE ; batchrun + Line 209: EXTRN ?Args@@3PEAVFArgs@@EA:QWORD ; Args + Line 210: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 211: EXTRN ?hashfile@@3PEAU_iobuf@@EA:QWORD ; hashfile + Line 212: EXTRN ?nospriterename@@3_NA:BYTE ; nospriterename + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\warptexture.cod (20 hits) + Line 33: EXTRN ??_L@YAXPEAX_K1P6AX0@Z2@Z:PROC ; `eh vector constructor iterator' + Line 34: EXTRN ??_M@YAXPEAX_K1P6AX0@Z@Z:PROC ; `eh vector destructor iterator' + Line 35: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 36: EXTRN __std_terminate:PROC + Line 37: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 38: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 39: EXTRN ?FreeAllSpans@FSoftwareTexture@@IEAAXXZ:PROC ; FSoftwareTexture::FreeAllSpans + Line 40: EXTRN ??0FSoftwareTexture@@QEAA@PEAVFTexture@@@Z:PROC ; FSoftwareTexture::FSoftwareTexture + Line 41: EXTRN ?GetColumn@FSoftwareTexture@@UEAAPEBEHIPEAPEBUFSoftwareTextureSpan@@@Z:PROC ; FSoftwareTexture::GetColumn + Line 42: EXTRN ?GetColumnBgra@FSoftwareTexture@@UEAAPEBIIPEAPEBUFSoftwareTextureSpan@@@Z:PROC ; FSoftwareTexture::GetColumnBgra + Line 43: EXTRN ?GetPixelsBgra@FSoftwareTexture@@UEAAPEBIXZ:PROC ; FSoftwareTexture::GetPixelsBgra + Line 44: EXTRN ?GetPixels@FSoftwareTexture@@UEAAPEBEH@Z:PROC ; FSoftwareTexture::GetPixels + Line 45: EXTRN ??_EFSoftwareTexture@@UEAAPEAXI@Z:PROC ; FSoftwareTexture::`vector deleting destructor' + Line 46: EXTRN ??_EFWarpTexture@@UEAAPEAXI@Z:PROC ; FWarpTexture::`vector deleting destructor' + Line 47: EXTRN __CxxFrameHandler3:PROC + Line 48: EXTRN __chkstk:PROC + Line 49: EXTRN memcpy:PROC + Line 50: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 51: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 52: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\wi_stuff.cod (80 hits) + Line 100: EXTRN ?RegistrationInfo@DObject@@2UClassReg@@A:BYTE ; DObject::RegistrationInfo + Line 101: EXTRN ?players@@3PAVplayer_t@@A:BYTE ; players + Line 565: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 566: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 567: EXTRN atexit:PROC + Line 568: EXTRN __std_terminate:PROC + Line 569: EXTRN qsort:PROC + Line 570: EXTRN stricmp:PROC + Line 571: EXTRN strnicmp:PROC + Line 572: EXTRN tolower:PROC + Line 573: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 574: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 575: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 576: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 577: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 578: EXTRN ??4FString@@QEAAAEAV0@$$QEAV0@@Z:PROC ; FString::operator= + Line 579: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 580: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 581: EXTRN ?GenRand32@FRandom@@QEAAIXZ:PROC ; FRandom::GenRand32 + Line 582: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 583: EXTRN mysnprintf:PROC + Line 584: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 585: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 586: EXTRN ??0FScanner@@QEAA@H@Z:PROC ; FScanner::FScanner + Line 587: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 588: EXTRN ?GetString@FScanner@@QEAA_NXZ:PROC ; FScanner::GetString + Line 589: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 590: EXTRN ?MustGetStringName@FScanner@@QEAAXPEBD@Z:PROC ; FScanner::MustGetStringName + Line 591: EXTRN ?CheckString@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::CheckString + Line 592: EXTRN ?MustGetNumber@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetNumber + Line 593: EXTRN ?UnGet@FScanner@@QEAAXXZ:PROC ; FScanner::UnGet + Line 594: EXTRN ?Compare@FScanner@@QEAA_NPEBD@Z:PROC ; FScanner::Compare + Line 595: EXTRN ?MustMatchString@FScanner@@QEAAHPEBQEBD_K@Z:PROC ; FScanner::MustMatchString + Line 596: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 597: EXTRN ?LookupLevelName@level_info_t@@QEAA?AVFString@@XZ:PROC ; level_info_t::LookupLevelName + Line 598: EXTRN ?FindLevelInfo@@YAPEAUlevel_info_t@@PEBD_N@Z:PROC ; FindLevelInfo + Line 599: EXTRN ?S_StopAllChannels@@YAXXZ:PROC ; S_StopAllChannels + Line 600: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 601: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 602: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 603: EXTRN ?AddSoftRoot@GC@@YAXPEAVDObject@@@Z:PROC ; GC::AddSoftRoot + Line 604: EXTRN ?DelSoftRoot@GC@@YAXPEAVDObject@@@Z:PROC ; GC::DelSoftRoot + Line 605: EXTRN ?ScriptVar@DObject@@QEAAPEAXVFName@@PEAVPType@@@Z:PROC ; DObject::ScriptVar + Line 606: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 607: EXTRN ??1DObject@@UEAA@XZ:PROC ; DObject::~DObject + Line 608: EXTRN ?Serialize@DObject@@UEAAXAEAVFSerializer@@@Z:PROC ; DObject::Serialize + Line 609: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 610: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 611: EXTRN ?PropagateMark@DObject@@UEAA_KXZ:PROC ; DObject::PropagateMark + Line 612: EXTRN ?CreateNew@PClass@@QEAAPEAVDObject@@XZ:PROC ; PClass::CreateNew + Line 613: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 614: EXTRN ?V_SetBlend@@YAXHHHH@Z:PROC ; V_SetBlend + Line 615: EXTRN ?CheckForTexture@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::CheckForTexture + Line 616: EXTRN ?GetTextureID@FTextureManager@@QEAA?AVFTextureID@@PEBDW4ETextureType@@I@Z:PROC ; FTextureManager::GetTextureID + Line 617: EXTRN ?FlatFill@DFrameBuffer@@QEAAXHHHHPEAVFTexture@@_N@Z:PROC ; DFrameBuffer::FlatFill + Line 618: EXTRN ?Clear@DFrameBuffer@@QEAAXHHHHHI@Z:PROC ; DFrameBuffer::Clear + Line 619: EXTRN ?DrawTexture@DFrameBuffer@@QEAAXPEAVFTexture@@NNHZZ:PROC ; DFrameBuffer::DrawTexture + Line 620: EXTRN ?FillBorder@DFrameBuffer@@QEAAXPEAVFTexture@@@Z:PROC ; DFrameBuffer::FillBorder + Line 621: EXTRN ?HU_GetPlayerWidths@@YAXAEAH00@Z:PROC ; HU_GetPlayerWidths + Line 622: EXTRN ?HU_GetRowColor@@YAHPEAVplayer_t@@_N@Z:PROC ; HU_GetRowColor + Line 623: EXTRN ?comparepoints@@YAHPEBX0@Z:PROC ; comparepoints + Line 624: EXTRN ?compareteams@@YAHPEBX0@Z:PROC ; compareteams + Line 625: EXTRN ?SN_StopAllSequences@@YAXPEAUFLevelLocals@@@Z:PROC ; SN_StopAllSequences + Line 626: EXTRN ?VMCall@@YAHPEAVVMFunction@@PEAUVMValue@@HPEAUVMReturn@@H@Z:PROC ; VMCall + Line 627: EXTRN ?NullParam@@YAXPEBD@Z:PROC ; NullParam + Line 628: EXTRN ?GetVirtualIndex@@YAIPEAVPClass@@PEBD@Z:PROC ; GetVirtualIndex + Line 629: EXTRN ??_EDInterBackground@@UEAAPEAXI@Z:PROC ; DInterBackground::`vector deleting destructor' + Line 630: EXTRN __CxxFrameHandler3:PROC + Line 631: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 632: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 633: EXTRN ?M_Random@@3VFRandom@@A:BYTE ; M_Random + Line 634: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 635: EXTRN ?multiplayer@@3_NA:BYTE ; multiplayer + Line 636: EXTRN ?deathmatch@@3VFIntCVar@@A:BYTE ; deathmatch + Line 637: EXTRN ?TexMan@@3VFTextureManager@@A:BYTE ; TexMan + Line 638: EXTRN ?screen@@3PEAVDFrameBuffer@@EA:QWORD ; screen + Line 639: EXTRN ?gameinfo@@3Ugameinfo_t@@A:BYTE ; gameinfo + Line 640: EXTRN ?currentUILevel@@3PEAUFLevelLocals@@EA:QWORD ; currentUILevel + Line 641: EXTRN __ImageBase:BYTE + Line 642: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\wildmidi_lib.cod (34 hits) + Line 111: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 112: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 113: EXTRN atexit:PROC + Line 114: EXTRN __std_terminate:PROC + Line 115: EXTRN _errno:PROC + Line 116: EXTRN free:PROC + Line 117: EXTRN malloc:PROC + Line 118: EXTRN realloc:PROC + Line 119: EXTRN atof:PROC + Line 120: EXTRN atoi:PROC + Line 121: EXTRN strrchr:PROC + Line 122: EXTRN strncpy:PROC + Line 123: EXTRN stricmp:PROC + Line 124: EXTRN strnicmp:PROC + Line 125: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 126: EXTRN ?_WM_ERROR@@YAXPEBDIH0H@Z:PROC ; _WM_ERROR + Line 127: EXTRN ?_WM_BufferFile@@YAPEAEPEBDPEAK@Z:PROC ; _WM_BufferFile + Line 128: EXTRN ?_WM_InitReader@@YA_NPEBD@Z:PROC ; _WM_InitReader + Line 129: EXTRN ?_WM_reset_reverb@@YAXPEAU_rvb@@@Z:PROC ; _WM_reset_reverb + Line 130: EXTRN ?_WM_init_reverb@@YAPEAU_rvb@@HMMMM@Z:PROC ; _WM_init_reverb + Line 131: EXTRN ?_WM_free_reverb@@YAXPEAU_rvb@@@Z:PROC ; _WM_free_reverb + Line 132: EXTRN ?_WM_do_reverb@@YAXPEAU_rvb@@PEAHH@Z:PROC ; _WM_do_reverb + Line 133: EXTRN ?_WM_load_gus_pat@@YAPEAU_sample@@PEBDH@Z:PROC ; _WM_load_gus_pat + Line 134: EXTRN ?CreateCriticalSection@@YAPEAVFInternalCriticalSection@@XZ:PROC ; CreateCriticalSection + Line 135: EXTRN ?DeleteCriticalSection@@YAXPEAVFInternalCriticalSection@@@Z:PROC ; DeleteCriticalSection + Line 136: EXTRN ?EnterCriticalSection@@YAXPEAVFInternalCriticalSection@@@Z:PROC ; EnterCriticalSection + Line 137: EXTRN ?LeaveCriticalSection@@YAXPEAVFInternalCriticalSection@@@Z:PROC ; LeaveCriticalSection + Line 138: EXTRN __CxxFrameHandler3:PROC + Line 139: EXTRN memset:PROC + Line 140: EXTRN pow:PROC + Line 141: EXTRN sin:PROC + Line 142: EXTRN ?wm_sfreader@@3V?$unique_ptr@VFSoundFontReader@@U?$default_delete@VFSoundFontReader@@@std@@@std@@A:QWORD ; wm_sfreader + Line 143: EXTRN __ImageBase:BYTE + Line 144: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\win32basevideo.cod (14 hits) + Line 29: EXTRN _purecall:PROC + Line 30: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 31: EXTRN atexit:PROC + Line 32: EXTRN __imp_GetMonitorInfoA:PROC + Line 33: EXTRN __imp_EnumDisplayMonitors:PROC + Line 34: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 35: EXTRN mysnprintf:PROC + Line 36: EXTRN ?I_SetWndProc@@YAXXZ:PROC ; I_SetWndProc + Line 37: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 38: EXTRN ??0FIntCVar@@QEAA@PEBDHIP6AXAEAV0@@Z@Z:PROC ; FIntCVar::FIntCVar + Line 39: EXTRN ?DumpAdapters@IVideo@@UEAAXXZ:PROC ; IVideo::DumpAdapters + Line 40: EXTRN ??_EIVideo@@UEAAPEAXI@Z:PROC ; IVideo::`vector deleting destructor' + Line 41: EXTRN ??_EWin32BaseVideo@@UEAAPEAXI@Z:PROC ; Win32BaseVideo::`vector deleting destructor' + Line 42: EXTRN __CxxFrameHandler3:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\win32glvideo.cod (49 hits) + Line 64: EXTRN _purecall:PROC + Line 65: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 66: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 67: EXTRN atexit:PROC + Line 68: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 69: EXTRN __imp_GetModuleHandleA:PROC + Line 70: EXTRN __imp_ChoosePixelFormat:PROC + Line 71: EXTRN __imp_DescribePixelFormat:PROC + Line 72: EXTRN __imp_GetDeviceCaps:PROC + Line 73: EXTRN __imp_SetPixelFormat:PROC + Line 74: EXTRN __imp_wglCreateContext:PROC + Line 75: EXTRN __imp_wglDeleteContext:PROC + Line 76: EXTRN __imp_wglGetProcAddress:PROC + Line 77: EXTRN __imp_wglMakeCurrent:PROC + Line 78: EXTRN __imp_DefWindowProcA:PROC + Line 79: EXTRN __imp_RegisterClassA:PROC + Line 80: EXTRN __imp_UnregisterClassA:PROC + Line 81: EXTRN __imp_CreateWindowExA:PROC + Line 82: EXTRN __imp_DestroyWindow:PROC + Line 83: EXTRN __imp_ShowWindow:PROC + Line 84: EXTRN __imp_GetDC:PROC + Line 85: EXTRN __imp_ReleaseDC:PROC + Line 86: EXTRN __imp_AdjustWindowRectEx:PROC + Line 87: EXTRN __imp_GetDesktopWindow:PROC + Line 88: EXTRN __imp_LoadCursorA:PROC + Line 89: EXTRN __imp_LoadIconA:PROC + Line 90: EXTRN strtod:PROC + Line 91: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 92: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 93: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 94: EXTRN ??1FBaseCVar@@UEAA@XZ:PROC ; FBaseCVar::~FBaseCVar + Line 95: EXTRN ?SetGenericRep@FBaseCVar@@QEAAXTUCVarValue@@W4ECVarType@@@Z:PROC ; FBaseCVar::SetGenericRep + Line 96: EXTRN ??0FBoolCVar@@QEAA@PEBD_NIP6AXAEAV0@@Z@Z:PROC ; FBoolCVar::FBoolCVar + Line 97: EXTRN ?DumpAdapters@IVideo@@UEAAXXZ:PROC ; IVideo::DumpAdapters + Line 98: EXTRN ??_EIVideo@@UEAAPEAXI@Z:PROC ; IVideo::`vector deleting destructor' + Line 99: EXTRN ?CheckValue@FArgs@@QEBAPEBDPEBD@Z:PROC ; FArgs::CheckValue + Line 100: EXTRN ??0Win32BaseVideo@@QEAA@XZ:PROC ; Win32BaseVideo::Win32BaseVideo + Line 101: EXTRN ?DumpAdapters@Win32BaseVideo@@UEAAXXZ:PROC ; Win32BaseVideo::DumpAdapters + Line 102: EXTRN ??_EWin32GLVideo@@UEAAPEAXI@Z:PROC ; Win32GLVideo::`vector deleting destructor' + Line 103: EXTRN ??0OpenGLFrameBuffer@OpenGLRenderer@@QEAA@PEAX_N@Z:PROC ; OpenGLRenderer::OpenGLFrameBuffer::OpenGLFrameBuffer + Line 104: EXTRN _CxxThrowException:PROC + Line 105: EXTRN __CxxFrameHandler3:PROC + Line 106: EXTRN memmove:PROC + Line 107: EXTRN ?fullscreen@@3VFBoolCVar@@A:BYTE ; fullscreen + Line 108: EXTRN ?Args@@3PEAVFArgs@@EA:QWORD ; Args + Line 109: EXTRN ?vr_enable_quadbuffered@@3VFBoolCVar@@A:BYTE ; vr_enable_quadbuffered + Line 110: EXTRN ?vid_hdr@@3VFBoolCVar@@A:BYTE ; vid_hdr + Line 111: EXTRN ?vid_hdr_active@@3_NA:BYTE ; vid_hdr_active + Line 112: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\wm_error.cod (4 hits) + Line 33: EXTRN __acrt_iob_func:PROC + Line 34: EXTRN __stdio_common_vfprintf:PROC + Line 35: EXTRN strerror:PROC + Line 36: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\wopl_file.cod (4 hits) + Line 27: EXTRN strncpy:PROC + Line 28: EXTRN calloc:PROC + Line 29: EXTRN free:PROC + Line 30: EXTRN memcmp:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\wopn_file.cod (4 hits) + Line 37: EXTRN strncpy:PROC + Line 38: EXTRN calloc:PROC + Line 39: EXTRN free:PROC + Line 40: EXTRN memcmp:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\worldtexture.cod (22 hits) + Line 19: EXTRN _purecall:PROC + Line 20: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 21: EXTRN ??_V@YAXPEAX@Z:PROC ; operator delete[] + Line 22: EXTRN __std_terminate:PROC + Line 23: EXTRN ??1FTexture@@UEAA@XZ:PROC ; FTexture::~FTexture + Line 24: EXTRN ?GetColumnBgra@FTexture@@UEAAPEBIIPEAPEBUSpan@1@@Z:PROC ; FTexture::GetColumnBgra + Line 25: EXTRN ?GetPixelsBgra@FTexture@@UEAAPEBIXZ:PROC ; FTexture::GetPixelsBgra + Line 26: EXTRN ?CopyTrueColorPixels@FTexture@@UEAAHPEAVFBitmap@@HHHPEAUFCopyInfo@@@Z:PROC ; FTexture::CopyTrueColorPixels + Line 27: EXTRN ?CopyTrueColorTranslated@FTexture@@UEAAHPEAVFBitmap@@HHHPEAUPalEntry@@PEAUFCopyInfo@@@Z:PROC ; FTexture::CopyTrueColorTranslated + Line 28: EXTRN ?UseBasePalette@FTexture@@UEAA_NXZ:PROC ; FTexture::UseBasePalette + Line 29: EXTRN ?GetRedirect@FTexture@@UEAAPEAV1@XZ:PROC ; FTexture::GetRedirect + Line 30: EXTRN ?GetRawTexture@FTexture@@UEAAPEAV1@XZ:PROC ; FTexture::GetRawTexture + Line 31: EXTRN ?Unload@FTexture@@UEAAXXZ:PROC ; FTexture::Unload + Line 32: EXTRN ?GetFormat@FTexture@@UEAA?AW4FTextureFormat@@XZ:PROC ; FTexture::GetFormat + Line 33: EXTRN ?FillBuffer@FTexture@@UEAAXPEAEHHW4FTextureFormat@@@Z:PROC ; FTexture::FillBuffer + Line 34: EXTRN ?SetFrontSkyLayer@FTexture@@UEAAXXZ:PROC ; FTexture::SetFrontSkyLayer + Line 35: EXTRN ?CheckModified@FTexture@@UEAA_NTFRenderStyle@@@Z:PROC ; FTexture::CheckModified + Line 36: EXTRN ??0FTexture@@IEAA@PEBDH@Z:PROC ; FTexture::FTexture + Line 37: EXTRN ?CreateSpans@FTexture@@IEBAPEAPEAUSpan@1@PEBE@Z:PROC ; FTexture::CreateSpans + Line 38: EXTRN ?FreeSpans@FTexture@@IEBAXPEAPEAUSpan@1@@Z:PROC ; FTexture::FreeSpans + Line 39: EXTRN ??_EFWorldTexture@@MEAAPEAXI@Z:PROC ; FWorldTexture::`vector deleting destructor' + Line 40: EXTRN __CxxFrameHandler3:PROC + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\x86.cod (3 hits) + Line 30: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 31: EXTRN memset:PROC + Line 32: EXTRN ?batchrun@@3_NA:BYTE ; batchrun + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\xbrz.cod (15 hits) + Line 30: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 31: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 32: EXTRN atexit:PROC + Line 33: EXTRN _Init_thread_header:PROC + Line 34: EXTRN _Init_thread_abort:PROC + Line 35: EXTRN _Init_thread_footer:PROC + Line 36: EXTRN _invalid_parameter_noinfo_noreturn:PROC + Line 37: EXTRN ?_Xlength_error@std@@YAXPEBD@Z:PROC ; std::_Xlength_error + Line 38: EXTRN _CxxThrowException:PROC + Line 39: EXTRN __CxxFrameHandler3:PROC + Line 40: EXTRN memmove:PROC + Line 41: EXTRN memset:PROC + Line 42: EXTRN _Init_thread_epoch:DWORD + Line 43: EXTRN _fltused:DWORD + Line 44: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\xbrz_old.cod (1 hit) + Line 17: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\Ym2612_Emu.cod (8 hits) + Line 65: EXTRN free:PROC + Line 66: EXTRN malloc:PROC + Line 67: EXTRN log10:PROC + Line 68: EXTRN memset:PROC + Line 69: EXTRN pow:PROC + Line 70: EXTRN sin:PROC + Line 71: EXTRN __ImageBase:BYTE + Line 72: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\ym3438.cod (2 hits) + Line 40: EXTRN memset:PROC + Line 41: EXTRN __ImageBase:BYTE + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\zcc_compile.cod (238 hits) + Line 311: EXTRN ??2@YAPEAX_K@Z:PROC ; operator new + Line 312: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 313: EXTRN ?__global_delete@@YAXPEAX_K@Z:PROC ; __global_delete + Line 314: EXTRN atexit:PROC + Line 315: EXTRN _Init_thread_header:PROC + Line 316: EXTRN _Init_thread_footer:PROC + Line 317: EXTRN __std_terminate:PROC + Line 318: EXTRN stricmp:PROC + Line 319: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 320: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 321: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 322: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 323: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_K_N@Z:PROC ; FName::NameManager::FindName + Line 324: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 325: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 326: EXTRN ??4FString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator= + Line 327: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 328: EXTRN ??YFString@@QEAAAEAV0@D@Z:PROC ; FString::operator+= + Line 329: EXTRN ?Insert@FString@@QEAAX_KPEBD@Z:PROC ; FString::Insert + Line 330: EXTRN ?Format@FString@@QEAAXPEBDZZ:PROC ; FString::Format + Line 331: EXTRN ?AppendFormat@FString@@QEAAXPEBDZZ:PROC ; FString::AppendFormat + Line 332: EXTRN ?VAppendFormat@FString@@QEAAXPEBDPEAD@Z:PROC ; FString::VAppendFormat + Line 333: EXTRN ?Truncate@FString@@QEAAX_K@Z:PROC ; FString::Truncate + Line 334: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 335: EXTRN ??0FStringf@@QEAA@PEBDZZ:PROC ; FStringf::FStringf + Line 336: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 337: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 338: EXTRN ??0DObject@@QEAA@XZ:PROC ; DObject::DObject + Line 339: EXTRN ??1DObject@@UEAA@XZ:PROC ; DObject::~DObject + Line 340: EXTRN ?Serialize@DObject@@UEAAXAEAVFSerializer@@@Z:PROC ; DObject::Serialize + Line 341: EXTRN ?Destroy@DObject@@QEAAXXZ:PROC ; DObject::Destroy + Line 342: EXTRN ?PointerSubstitution@DObject@@UEAA_KPEAV1@0@Z:PROC ; DObject::PointerSubstitution + Line 343: EXTRN ?PropagateMark@DObject@@UEAA_KXZ:PROC ; DObject::PropagateMark + Line 344: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 345: EXTRN ??0FSharedStringArena@@QEAA@XZ:PROC ; FSharedStringArena::FSharedStringArena + Line 346: EXTRN ??1FSharedStringArena@@QEAA@XZ:PROC ; FSharedStringArena::~FSharedStringArena + Line 347: EXTRN ?Alloc@FSharedStringArena@@QEAAPEAVFString@@AEBV2@@Z:PROC ; FSharedStringArena::Alloc + Line 348: EXTRN ?StaticType@PSymbol@@UEBAPEAVPClass@@XZ:PROC ; PSymbol::StaticType + Line 349: EXTRN ??_EPSymbol@@UEAAPEAXI@Z:PROC ; PSymbol::`vector deleting destructor' + Line 350: EXTRN ?StaticType@PSymbolType@@UEBAPEAVPClass@@XZ:PROC ; PSymbolType::StaticType + Line 351: EXTRN ??_EPSymbolType@@UEAAPEAXI@Z:PROC ; PSymbolType::`vector deleting destructor' + Line 352: EXTRN ?StaticType@PSymbolTreeNode@@UEBAPEAVPClass@@XZ:PROC ; PSymbolTreeNode::StaticType + Line 353: EXTRN ??_EPSymbolTreeNode@@UEAAPEAXI@Z:PROC ; PSymbolTreeNode::`vector deleting destructor' + Line 354: EXTRN ??0PField@@QEAA@VFName@@PEAVPType@@I_KH@Z:PROC ; PField::PField + Line 355: EXTRN ??0PProperty@@QEAA@VFName@@AEAV?$TArray@PEAVPField@@PEAV1@@@@Z:PROC ; PProperty::PProperty + Line 356: EXTRN ??0PPropFlag@@QEAA@VFName@@PEAVPField@@H_N@Z:PROC ; PPropFlag::PPropFlag + Line 357: EXTRN ?StaticType@PSymbolConst@@UEBAPEAVPClass@@XZ:PROC ; PSymbolConst::StaticType + Line 358: EXTRN ??_EPSymbolConst@@UEAAPEAXI@Z:PROC ; PSymbolConst::`vector deleting destructor' + Line 359: EXTRN ?StaticType@PSymbolConstNumeric@@UEBAPEAVPClass@@XZ:PROC ; PSymbolConstNumeric::StaticType + Line 360: EXTRN ??_EPSymbolConstNumeric@@UEAAPEAXI@Z:PROC ; PSymbolConstNumeric::`vector deleting destructor' + Line 361: EXTRN ??0PSymbolConstString@@QEAA@VFName@@AEBVFString@@@Z:PROC ; PSymbolConstString::PSymbolConstString + Line 362: EXTRN ?StaticType@PFunction@@UEBAPEAVPClass@@XZ:PROC ; PFunction::StaticType + Line 363: EXTRN ?AddVariant@PFunction@@QEAAIPEAVPPrototype@@AEAV?$TArray@II@@AEAV?$TArray@VFName@@V1@@@PEAVVMFunction@@HH@Z:PROC ; PFunction::AddVariant + Line 364: EXTRN ??_EPFunction@@UEAAPEAXI@Z:PROC ; PFunction::`vector deleting destructor' + Line 365: EXTRN ??0PSymbolTable@@QEAA@XZ:PROC ; PSymbolTable::PSymbolTable + Line 366: EXTRN ??1PSymbolTable@@QEAA@XZ:PROC ; PSymbolTable::~PSymbolTable + Line 367: EXTRN ?SetParentTable@PSymbolTable@@QEAAXPEAU1@@Z:PROC ; PSymbolTable::SetParentTable + Line 368: EXTRN ?FindSymbol@PSymbolTable@@QEBAPEAVPSymbol@@VFName@@_N@Z:PROC ; PSymbolTable::FindSymbol + Line 369: EXTRN ?AddSymbol@PSymbolTable@@QEAAPEAVPSymbol@@PEAV2@@Z:PROC ; PSymbolTable::AddSymbol + Line 370: EXTRN ?ReplaceSymbol@PSymbolTable@@QEAAXPEAVPSymbol@@@Z:PROC ; PSymbolTable::ReplaceSymbol + Line 371: EXTRN ?InitializeDefaults@PClass@@QEAAXXZ:PROC ; PClass::InitializeDefaults + Line 372: EXTRN ?FindVirtualIndex@PClass@@QEAAHVFName@@PEAUVariant@PFunction@@PEAV4@@Z:PROC ; PClass::FindVirtualIndex + Line 373: EXTRN ?FindSymbol@PClass@@QEBAPEAVPSymbol@@VFName@@_N@Z:PROC ; PClass::FindSymbol + Line 374: EXTRN ?CreateDerivedClass@PClass@@QEAAPEAV1@VFName@@I@Z:PROC ; PClass::CreateDerivedClass + Line 375: EXTRN ?FindClass@PClass@@SAPEAV1@VFName@@@Z:PROC ; PClass::FindClass + Line 376: EXTRN ?FindClassTentative@PClass@@QEAAPEAV1@VFName@@@Z:PROC ; PClass::FindClassTentative + Line 377: EXTRN ?S_FindSound@@YAHPEBD@Z:PROC ; S_FindSound + Line 378: EXTRN ?SetReplacement@PClassActor@@QEAA_NVFName@@@Z:PROC ; PClassActor::SetReplacement + Line 379: EXTRN ?GetSpriteIndex@@YAHPEBD_N@Z:PROC ; GetSpriteIndex + Line 380: EXTRN ?AddStateLight@@YAXPEAUFState@@PEBD@Z:PROC ; AddStateLight + Line 381: EXTRN ??0FScriptPosition@@QEAA@AEBU0@@Z:PROC ; FScriptPosition::FScriptPosition + Line 382: EXTRN ??0FScriptPosition@@QEAA@VFString@@H@Z:PROC ; FScriptPosition::FScriptPosition + Line 383: EXTRN ?Message@FScriptPosition@@QEBAXHPEBDZZ:PROC ; FScriptPosition::Message + Line 384: EXTRN ?V_GetColor@@YAHPEBIPEBDPEAUFScriptPosition@@@Z:PROC ; V_GetColor + Line 385: EXTRN ?SideFromFlags@FScopeBarrier@@SAHH@Z:PROC ; FScopeBarrier::SideFromFlags + Line 386: EXTRN ?SideFromObjectFlags@FScopeBarrier@@SAHW4EScopeFlags@@@Z:PROC ; FScopeBarrier::SideFromObjectFlags + Line 387: EXTRN ?ChangeSideInFlags@FScopeBarrier@@SAHHH@Z:PROC ; FScopeBarrier::ChangeSideInFlags + Line 388: EXTRN ?ChangeSideInObjectFlags@FScopeBarrier@@SA?AW4EScopeFlags@@W42@H@Z:PROC ; FScopeBarrier::ChangeSideInObjectFlags + Line 389: EXTRN ?FinalizeClass@@YAXPEAVPClass@@AEAVFStateDefinitions@@@Z:PROC ; FinalizeClass + Line 390: EXTRN ?FindFlag@@YAPEAUFFlagDef@@PEBVPClass@@PEBD1_N@Z:PROC ; FindFlag + Line 391: EXTRN ?HandleDeprecatedFlags@@YAXPEAVAActor@@PEAVPClassActor@@_NH@Z:PROC ; HandleDeprecatedFlags + Line 392: EXTRN ?ModActorFlag@@YAXPEAVAActor@@PEAUFFlagDef@@_N@Z:PROC ; ModActorFlag + Line 393: EXTRN ?AddStateLabel@FStateDefinitions@@QEAAXPEBD@Z:PROC ; FStateDefinitions::AddStateLabel + Line 394: EXTRN ?GetStateLabelIndex@FStateDefinitions@@QEAAHVFName@@@Z:PROC ; FStateDefinitions::GetStateLabelIndex + Line 395: EXTRN ?MakeStateDefines@FStateDefinitions@@QEAAXPEBVPClassActor@@@Z:PROC ; FStateDefinitions::MakeStateDefines + Line 396: EXTRN ?SetGotoLabel@FStateDefinitions@@QEAA_NPEBD@Z:PROC ; FStateDefinitions::SetGotoLabel + Line 397: EXTRN ?SetStop@FStateDefinitions@@QEAA_NXZ:PROC ; FStateDefinitions::SetStop + Line 398: EXTRN ?SetWait@FStateDefinitions@@QEAA_NXZ:PROC ; FStateDefinitions::SetWait + Line 399: EXTRN ?SetLoop@FStateDefinitions@@QEAA_NXZ:PROC ; FStateDefinitions::SetLoop + Line 400: EXTRN ?AddStates@FStateDefinitions@@QEAAHPEAUFState@@PEBDAEBUFScriptPosition@@@Z:PROC ; FStateDefinitions::AddStates + Line 401: EXTRN ?FindFunction@@YAPEAUAFuncDesc@@PEAVPContainerType@@PEBD@Z:PROC ; FindFunction + Line 402: EXTRN ?FindField@@YAPEAUFieldDesc@@PEAVPContainerType@@PEBD@Z:PROC ; FindField + Line 403: EXTRN ?SetImplicitArgs@@YAXPEAV?$TArray@PEAVPType@@PEAV1@@@PEAV?$TArray@II@@PEAV?$TArray@VFName@@V1@@@PEAVPContainerType@@IH@Z:PROC ; SetImplicitArgs + Line 404: EXTRN ?CreateAnonymousFunction@@YAPEAVPFunction@@PEAVPContainerType@@PEAVPType@@H@Z:PROC ; CreateAnonymousFunction + Line 405: EXTRN ?CreateDamageFunction@@YAXPEAVPNamespace@@AEBUVersionInfo@@PEAVPClassActor@@PEAVAActor@@PEAVFxExpression@@_NH@Z:PROC ; CreateDamageFunction + Line 406: EXTRN ?FindProperty@@YAPEAUFPropertyInfo@@PEBD@Z:PROC ; FindProperty + Line 407: EXTRN ?PrintString@@YAHHPEBD@Z:PROC ; PrintString + Line 408: EXTRN ?GetLumpFile@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpFile + Line 409: EXTRN ?DescriptiveName@PType@@QEBAPEBDXZ:PROC ; PType::DescriptiveName + Line 410: EXTRN ?NewMap@@YAPEAVPMap@@PEAVPType@@0@Z:PROC ; NewMap + Line 411: EXTRN ?NewArray@@YAPEAVPArray@@PEAVPType@@I@Z:PROC ; NewArray + Line 412: EXTRN ?NewStaticArray@@YAPEAVPStaticArray@@PEAVPType@@@Z:PROC ; NewStaticArray + Line 413: EXTRN ?NewDynArray@@YAPEAVPDynArray@@PEAVPType@@@Z:PROC ; NewDynArray + Line 414: EXTRN ?NewPointer@@YAPEAVPPointer@@PEAVPType@@_N@Z:PROC ; NewPointer + Line 415: EXTRN ?NewClassPointer@@YAPEAVPClassPointer@@PEAVPClass@@@Z:PROC ; NewClassPointer + Line 416: EXTRN ?NewEnum@@YAPEAVPEnum@@VFName@@PEAVPTypeBase@@@Z:PROC ; NewEnum + Line 417: EXTRN ?NewStruct@@YAPEAVPStruct@@VFName@@PEAVPTypeBase@@_N@Z:PROC ; NewStruct + Line 418: EXTRN ?NewPrototype@@YAPEAVPPrototype@@AEBV?$TArray@PEAVPType@@PEAV1@@@0@Z:PROC ; NewPrototype + Line 419: EXTRN ?NewClassType@@YAPEAVPClassType@@PEAVPClass@@@Z:PROC ; NewClassType + Line 420: EXTRN ?InitNode@ZCC_AST@@QEAAPEAUZCC_TreeNode@@_KW4EZCCTreeNodeType@@PEAU2@@Z:PROC ; ZCC_AST::InitNode + Line 421: EXTRN ?AddFunction@FFunctionBuildList@@QEAAPEAVVMFunction@@PEAVPNamespace@@AEBUVersionInfo@@PEAVPFunction@@PEAVFxExpression@@AEBVFString@@_NHHH@Z:PROC ; FFunctionBuildList::AddFunction + Line 422: EXTRN ??0FCompileContext@@QEAA@PEAVPNamespace@@PEAVPContainerType@@_N@Z:PROC ; FCompileContext::FCompileContext + Line 423: EXTRN ?Resolve@FxExpression@@UEAAPEAV1@AEAUFCompileContext@@@Z:PROC ; FxExpression::Resolve + Line 424: EXTRN ?isConstant@FxExpression@@UEBA_NXZ:PROC ; FxExpression::isConstant + Line 425: EXTRN ?RequestAddress@FxExpression@@UEAA_NAEAUFCompileContext@@PEA_N@Z:PROC ; FxExpression::RequestAddress + Line 426: EXTRN ?ReturnProto@FxExpression@@UEAAPEAVPPrototype@@XZ:PROC ; FxExpression::ReturnProto + Line 427: EXTRN ?GetDirectFunction@FxExpression@@UEAAPEAVVMFunction@@PEAVPFunction@@AEBUVersionInfo@@@Z:PROC ; FxExpression::GetDirectFunction + Line 428: EXTRN ?Emit@FxExpression@@UEAA?AUExpEmit@@PEAVVMFunctionBuilder@@@Z:PROC ; FxExpression::Emit + Line 429: EXTRN ?EmitCompare@FxExpression@@UEAAXPEAVVMFunctionBuilder@@_NAEAV?$TArray@_K_K@@2@Z:PROC ; FxExpression::EmitCompare + Line 430: EXTRN ??_EFxExpression@@UEAAPEAXI@Z:PROC ; FxExpression::`vector deleting destructor' + Line 431: EXTRN ??0FxIdentifier@@QEAA@VFName@@AEBUFScriptPosition@@@Z:PROC ; FxIdentifier::FxIdentifier + Line 432: EXTRN ??0FxMemberIdentifier@@QEAA@PEAVFxExpression@@VFName@@AEBUFScriptPosition@@@Z:PROC ; FxMemberIdentifier::FxMemberIdentifier + Line 433: EXTRN ?Emit@FxConstant@@UEAA?AUExpEmit@@PEAVVMFunctionBuilder@@@Z:PROC ; FxConstant::Emit + Line 434: EXTRN ??_EFxConstant@@UEAAPEAXI@Z:PROC ; FxConstant::`vector deleting destructor' + Line 435: EXTRN ??0FxVectorValue@@QEAA@PEAVFxExpression@@00AEBUFScriptPosition@@@Z:PROC ; FxVectorValue::FxVectorValue + Line 436: EXTRN ??0FxIntCast@@QEAA@PEAVFxExpression@@_N11@Z:PROC ; FxIntCast::FxIntCast + Line 437: EXTRN ??0FxFloatCast@@QEAA@PEAVFxExpression@@@Z:PROC ; FxFloatCast::FxFloatCast + Line 438: EXTRN ??0FxStringCast@@QEAA@PEAVFxExpression@@@Z:PROC ; FxStringCast::FxStringCast + Line 439: EXTRN ??0FxTypeCast@@QEAA@PEAVFxExpression@@PEAVPType@@_N2@Z:PROC ; FxTypeCast::FxTypeCast + Line 440: EXTRN ??0FxPlusSign@@QEAA@PEAVFxExpression@@@Z:PROC ; FxPlusSign::FxPlusSign + Line 441: EXTRN ??0FxMinusSign@@QEAA@PEAVFxExpression@@@Z:PROC ; FxMinusSign::FxMinusSign + Line 442: EXTRN ??0FxUnaryNotBitwise@@QEAA@PEAVFxExpression@@@Z:PROC ; FxUnaryNotBitwise::FxUnaryNotBitwise + Line 443: EXTRN ??0FxUnaryNotBoolean@@QEAA@PEAVFxExpression@@@Z:PROC ; FxUnaryNotBoolean::FxUnaryNotBoolean + Line 444: EXTRN ??0FxSizeAlign@@QEAA@PEAVFxExpression@@H@Z:PROC ; FxSizeAlign::FxSizeAlign + Line 445: EXTRN ??0FxPreIncrDecr@@QEAA@PEAVFxExpression@@H@Z:PROC ; FxPreIncrDecr::FxPreIncrDecr + Line 446: EXTRN ??0FxPostIncrDecr@@QEAA@PEAVFxExpression@@H@Z:PROC ; FxPostIncrDecr::FxPostIncrDecr + Line 447: EXTRN ??0FxAssign@@QEAA@PEAVFxExpression@@0_N@Z:PROC ; FxAssign::FxAssign + Line 448: EXTRN ??0FxMultiAssign@@QEAA@AEAV?$TDeletingArray@PEAVFxExpression@@PEAV1@@@PEAVFxExpression@@AEBUFScriptPosition@@@Z:PROC ; FxMultiAssign::FxMultiAssign + Line 449: EXTRN ??0FxAssignSelf@@QEAA@AEBUFScriptPosition@@@Z:PROC ; FxAssignSelf::FxAssignSelf + Line 450: EXTRN ??0FxAddSub@@QEAA@HPEAVFxExpression@@0@Z:PROC ; FxAddSub::FxAddSub + Line 451: EXTRN ??0FxMulDiv@@QEAA@HPEAVFxExpression@@0@Z:PROC ; FxMulDiv::FxMulDiv + Line 452: EXTRN ??0FxPow@@QEAA@PEAVFxExpression@@0@Z:PROC ; FxPow::FxPow + Line 453: EXTRN ??0FxCompareRel@@QEAA@HPEAVFxExpression@@0@Z:PROC ; FxCompareRel::FxCompareRel + Line 454: EXTRN ??0FxCompareEq@@QEAA@HPEAVFxExpression@@0@Z:PROC ; FxCompareEq::FxCompareEq + Line 455: EXTRN ??0FxBitOp@@QEAA@HPEAVFxExpression@@0@Z:PROC ; FxBitOp::FxBitOp + Line 456: EXTRN ??0FxShift@@QEAA@HPEAVFxExpression@@0@Z:PROC ; FxShift::FxShift + Line 457: EXTRN ??0FxLtGtEq@@QEAA@PEAVFxExpression@@0@Z:PROC ; FxLtGtEq::FxLtGtEq + Line 458: EXTRN ??0FxConcat@@QEAA@PEAVFxExpression@@0@Z:PROC ; FxConcat::FxConcat + Line 459: EXTRN ??0FxBinaryLogical@@QEAA@HPEAVFxExpression@@0@Z:PROC ; FxBinaryLogical::FxBinaryLogical + Line 460: EXTRN ??0FxDotCross@@QEAA@HPEAVFxExpression@@0@Z:PROC ; FxDotCross::FxDotCross + Line 461: EXTRN ??0FxTypeCheck@@QEAA@PEAVFxExpression@@0@Z:PROC ; FxTypeCheck::FxTypeCheck + Line 462: EXTRN ??0FxConditional@@QEAA@PEAVFxExpression@@00@Z:PROC ; FxConditional::FxConditional + Line 463: EXTRN ??0FxSelf@@QEAA@AEBUFScriptPosition@@_N@Z:PROC ; FxSelf::FxSelf + Line 464: EXTRN ?Emit@FxSelf@@UEAA?AUExpEmit@@PEAVVMFunctionBuilder@@@Z:PROC ; FxSelf::Emit + Line 465: EXTRN ?Resolve@FxSuper@@UEAAPEAVFxExpression@@AEAUFCompileContext@@@Z:PROC ; FxSuper::Resolve + Line 466: EXTRN ??_EFxSuper@@UEAAPEAXI@Z:PROC ; FxSuper::`vector deleting destructor' + Line 467: EXTRN ??0FxArrayElement@@QEAA@PEAVFxExpression@@0@Z:PROC ; FxArrayElement::FxArrayElement + Line 468: EXTRN ??0FxFunctionCall@@QEAA@VFName@@0AEAV?$TDeletingArray@PEAVFxExpression@@PEAV1@@@AEBUFScriptPosition@@@Z:PROC ; FxFunctionCall::FxFunctionCall + Line 469: EXTRN ??0FxMemberFunctionCall@@QEAA@PEAVFxExpression@@VFName@@AEAV?$TDeletingArray@PEAVFxExpression@@PEAV1@@@AEBUFScriptPosition@@@Z:PROC ; FxMemberFunctionCall::FxMemberFunctionCall + Line 470: EXTRN ??0FxVMFunctionCall@@QEAA@PEAVFxExpression@@PEAVPFunction@@AEAV?$TDeletingArray@PEAVFxExpression@@PEAV1@@@AEBUFScriptPosition@@_N@Z:PROC ; FxVMFunctionCall::FxVMFunctionCall + Line 471: EXTRN ?Resolve@FxSequence@@UEAAPEAVFxExpression@@AEAUFCompileContext@@@Z:PROC ; FxSequence::Resolve + Line 472: EXTRN ?Emit@FxSequence@@UEAA?AUExpEmit@@PEAVVMFunctionBuilder@@@Z:PROC ; FxSequence::Emit + Line 473: EXTRN ?GetDirectFunction@FxSequence@@UEAAPEAVVMFunction@@PEAVPFunction@@AEBUVersionInfo@@@Z:PROC ; FxSequence::GetDirectFunction + Line 474: EXTRN ?CheckReturn@FxSequence@@UEAA_NXZ:PROC ; FxSequence::CheckReturn + Line 475: EXTRN ??_EFxSequence@@UEAAPEAXI@Z:PROC ; FxSequence::`vector deleting destructor' + Line 476: EXTRN ?Resolve@FxCompoundStatement@@UEAAPEAVFxExpression@@AEAUFCompileContext@@@Z:PROC ; FxCompoundStatement::Resolve + Line 477: EXTRN ?Emit@FxCompoundStatement@@UEAA?AUExpEmit@@PEAVVMFunctionBuilder@@@Z:PROC ; FxCompoundStatement::Emit + Line 478: EXTRN ??_EFxCompoundStatement@@UEAAPEAXI@Z:PROC ; FxCompoundStatement::`vector deleting destructor' + Line 479: EXTRN ??0FxSwitchStatement@@QEAA@PEAVFxExpression@@AEAV?$TDeletingArray@PEAVFxExpression@@PEAV1@@@AEBUFScriptPosition@@@Z:PROC ; FxSwitchStatement::FxSwitchStatement + Line 480: EXTRN ??0FxCaseStatement@@QEAA@PEAVFxExpression@@AEBUFScriptPosition@@@Z:PROC ; FxCaseStatement::FxCaseStatement + Line 481: EXTRN ??0FxIfStatement@@QEAA@PEAVFxExpression@@00AEBUFScriptPosition@@@Z:PROC ; FxIfStatement::FxIfStatement + Line 482: EXTRN ??0FxWhileLoop@@QEAA@PEAVFxExpression@@0AEBUFScriptPosition@@@Z:PROC ; FxWhileLoop::FxWhileLoop + Line 483: EXTRN ??0FxDoWhileLoop@@QEAA@PEAVFxExpression@@0AEBUFScriptPosition@@@Z:PROC ; FxDoWhileLoop::FxDoWhileLoop + Line 484: EXTRN ??0FxForLoop@@QEAA@PEAVFxExpression@@000AEBUFScriptPosition@@@Z:PROC ; FxForLoop::FxForLoop + Line 485: EXTRN ??0FxJumpStatement@@QEAA@HAEBUFScriptPosition@@@Z:PROC ; FxJumpStatement::FxJumpStatement + Line 486: EXTRN ??0FxReturnStatement@@QEAA@PEAVFxExpression@@AEBUFScriptPosition@@@Z:PROC ; FxReturnStatement::FxReturnStatement + Line 487: EXTRN ??0FxReturnStatement@@QEAA@AEAV?$TDeletingArray@PEAVFxExpression@@PEAV1@@@AEBUFScriptPosition@@@Z:PROC ; FxReturnStatement::FxReturnStatement + Line 488: EXTRN ??0FxClassPtrCast@@QEAA@PEAVPClass@@PEAVFxExpression@@@Z:PROC ; FxClassPtrCast::FxClassPtrCast + Line 489: EXTRN ??_EFxNop@@UEAAPEAXI@Z:PROC ; FxNop::`vector deleting destructor' + Line 490: EXTRN ??0FxLocalVariableDeclaration@@QEAA@PEAVPType@@VFName@@PEAVFxExpression@@HAEBUFScriptPosition@@@Z:PROC ; FxLocalVariableDeclaration::FxLocalVariableDeclaration + Line 491: EXTRN ??0FxStaticArray@@QEAA@PEAVPType@@VFName@@AEAV?$TDeletingArray@PEAVFxExpression@@PEAV1@@@AEBUFScriptPosition@@@Z:PROC ; FxStaticArray::FxStaticArray + Line 492: EXTRN ??_EFxNamedNode@@UEAAPEAXI@Z:PROC ; FxNamedNode::`vector deleting destructor' + Line 493: EXTRN ??0FxLocalArrayDeclaration@@QEAA@PEAVPType@@VFName@@AEAV?$TDeletingArray@PEAVFxExpression@@PEAV1@@@HAEBUFScriptPosition@@@Z:PROC ; FxLocalArrayDeclaration::FxLocalArrayDeclaration + Line 494: EXTRN ?P_FindLineSpecial@@YAHPEBDPEAH1@Z:PROC ; P_FindLineSpecial + Line 495: EXTRN ?isActor@@YA_NPEAVPContainerType@@@Z:PROC ; isActor + Line 496: EXTRN ?AddActorInfo@@YAXPEAVPClass@@@Z:PROC ; AddActorInfo + Line 497: EXTRN __CxxFrameHandler3:PROC + Line 498: EXTRN memmove:PROC + Line 499: EXTRN memset:PROC + Line 500: EXTRN _Init_thread_epoch:DWORD + Line 501: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 502: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 503: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 504: EXTRN ?RegistrationInfo@DObject@@2UClassReg@@A:BYTE ; DObject::RegistrationInfo + Line 505: EXTRN ?ClassDataAllocator@@3VFMemArena@@A:BYTE ; ClassDataAllocator + Line 506: EXTRN ?RegistrationInfo@PSymbolType@@2UClassReg@@A:BYTE ; PSymbolType::RegistrationInfo + Line 507: EXTRN ?RegistrationInfo@PSymbolTreeNode@@2UClassReg@@A:BYTE ; PSymbolTreeNode::RegistrationInfo + Line 508: EXTRN ?RegistrationInfo@PField@@2UClassReg@@A:BYTE ; PField::RegistrationInfo + Line 509: EXTRN ?RegistrationInfo@PProperty@@2UClassReg@@A:BYTE ; PProperty::RegistrationInfo + Line 510: EXTRN ?RegistrationInfo@PPropFlag@@2UClassReg@@A:BYTE ; PPropFlag::RegistrationInfo + Line 511: EXTRN ?RegistrationInfo@PSymbolConst@@2UClassReg@@A:BYTE ; PSymbolConst::RegistrationInfo + Line 512: EXTRN ?RegistrationInfo@PSymbolConstNumeric@@2UClassReg@@A:BYTE ; PSymbolConstNumeric::RegistrationInfo + Line 513: EXTRN ?RegistrationInfo@PSymbolConstString@@2UClassReg@@A:BYTE ; PSymbolConstString::RegistrationInfo + Line 514: EXTRN ?RegistrationInfo@PFunction@@2UClassReg@@A:BYTE ; PFunction::RegistrationInfo + Line 515: EXTRN ?AllClasses@PClass@@2V?$TArray@PEAVPClass@@PEAV1@@@A:BYTE ; PClass::AllClasses + Line 516: EXTRN ?WarnCounter@FScriptPosition@@2HA:DWORD ; FScriptPosition::WarnCounter + Line 517: EXTRN ?ErrorCounter@FScriptPosition@@2HA:DWORD ; FScriptPosition::ErrorCounter + Line 518: EXTRN ?errorout@FScriptPosition@@2_NA:BYTE ; FScriptPosition::errorout + Line 519: EXTRN ?RegistrationInfo@AActor@@2UClassReg@@A:BYTE ; AActor::RegistrationInfo + Line 520: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 521: EXTRN ?TypeError@@3PEAVPErrorType@@EA:QWORD ; TypeError + Line 522: EXTRN ?TypeAuto@@3PEAVPErrorType@@EA:QWORD ; TypeAuto + Line 523: EXTRN ?TypeSInt8@@3PEAVPInt@@EA:QWORD ; TypeSInt8 + Line 524: EXTRN ?TypeUInt8@@3PEAVPInt@@EA:QWORD ; TypeUInt8 + Line 525: EXTRN ?TypeSInt16@@3PEAVPInt@@EA:QWORD ; TypeSInt16 + Line 526: EXTRN ?TypeUInt16@@3PEAVPInt@@EA:QWORD ; TypeUInt16 + Line 527: EXTRN ?TypeSInt32@@3PEAVPInt@@EA:QWORD ; TypeSInt32 + Line 528: EXTRN ?TypeUInt32@@3PEAVPInt@@EA:QWORD ; TypeUInt32 + Line 529: EXTRN ?TypeBool@@3PEAVPBool@@EA:QWORD ; TypeBool + Line 530: EXTRN ?TypeFloat32@@3PEAVPFloat@@EA:QWORD ; TypeFloat32 + Line 531: EXTRN ?TypeFloat64@@3PEAVPFloat@@EA:QWORD ; TypeFloat64 + Line 532: EXTRN ?TypeString@@3PEAVPString@@EA:QWORD ; TypeString + Line 533: EXTRN ?TypeName@@3PEAVPName@@EA:QWORD ; TypeName + Line 534: EXTRN ?TypeSound@@3PEAVPSound@@EA:QWORD ; TypeSound + Line 535: EXTRN ?TypeColor@@3PEAVPColor@@EA:QWORD ; TypeColor + Line 536: EXTRN ?TypeTextureID@@3PEAVPTextureID@@EA:QWORD ; TypeTextureID + Line 537: EXTRN ?TypeSpriteID@@3PEAVPSpriteID@@EA:QWORD ; TypeSpriteID + Line 538: EXTRN ?TypeVector2@@3PEAVPStruct@@EA:QWORD ; TypeVector2 + Line 539: EXTRN ?TypeVector3@@3PEAVPStruct@@EA:QWORD ; TypeVector3 + Line 540: EXTRN ?TypeState@@3PEAVPStatePointer@@EA:QWORD ; TypeState + Line 541: EXTRN ?TypeStateLabel@@3PEAVPStateLabel@@EA:QWORD ; TypeStateLabel + Line 542: EXTRN ?TypeNullPtr@@3PEAVPPointer@@EA:QWORD ; TypeNullPtr + Line 543: EXTRN ?TypeVoidPtr@@3PEAVPPointer@@EA:QWORD ; TypeVoidPtr + Line 544: EXTRN ?FunctionBuildList@@3VFFunctionBuildList@@A:BYTE ; FunctionBuildList + Line 545: EXTRN ?FxAlloc@@3VFMemArena@@A:BYTE ; FxAlloc + Line 546: EXTRN __ImageBase:BYTE + Line 547: EXTRN _fltused:DWORD + Line 548: EXTRN _tls_index:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\zcc_parser.cod (82 hits) + Line 1091: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 1092: EXTRN atexit:PROC + Line 1093: EXTRN __std_terminate:PROC + Line 1094: EXTRN free:PROC + Line 1095: EXTRN malloc:PROC + Line 1096: EXTRN realloc:PROC + Line 1097: EXTRN strtoll:PROC + Line 1098: EXTRN strtoull:PROC + Line 1099: EXTRN ?M_Malloc@@YAPEAX_K@Z:PROC ; M_Malloc + Line 1100: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 1101: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 1102: EXTRN ?FindName@NameManager@FName@@QEAAHPEBD_N@Z:PROC ; FName::NameManager::FindName + Line 1103: EXTRN ??0FString@@QEAA@PEBD@Z:PROC ; FString::FString + Line 1104: EXTRN ??1FString@@QEAA@XZ:PROC ; FString::~FString + Line 1105: EXTRN ??HFString@@QEBA?AV0@AEBV0@@Z:PROC ; FString::operator+ + Line 1106: EXTRN ??YFString@@QEAAAEAV0@AEBV0@@Z:PROC ; FString::operator+= + Line 1107: EXTRN ??YFString@@QEAAAEAV0@PEBD@Z:PROC ; FString::operator+= + Line 1108: EXTRN ?ReplaceChars@FString@@QEAAXPEBDD@Z:PROC ; FString::ReplaceChars + Line 1109: EXTRN ?AttachToOther@FString@@IEAAXAEBV1@@Z:PROC ; FString::AttachToOther + Line 1110: EXTRN ?Printf@@YAHPEBDZZ:PROC ; Printf + Line 1111: EXTRN ?DPrintf@@YAHHPEBDZZ:PROC ; DPrintf + Line 1112: EXTRN ??4VersionInfo@@QEAAXPEBD@Z:PROC ; VersionInfo::operator= + Line 1113: EXTRN ?I_Error@@YAXPEBDZZ:PROC ; I_Error + Line 1114: EXTRN ?I_FatalError@@YAXPEBDZZ:PROC ; I_FatalError + Line 1115: EXTRN ??0FMemArena@@QEAA@_K@Z:PROC ; FMemArena::FMemArena + Line 1116: EXTRN ??1FMemArena@@QEAA@XZ:PROC ; FMemArena::~FMemArena + Line 1117: EXTRN ?Alloc@FMemArena@@QEAAPEAX_K@Z:PROC ; FMemArena::Alloc + Line 1118: EXTRN ??0FSharedStringArena@@QEAA@XZ:PROC ; FSharedStringArena::FSharedStringArena + Line 1119: EXTRN ??1FSharedStringArena@@QEAA@XZ:PROC ; FSharedStringArena::~FSharedStringArena + Line 1120: EXTRN ?Alloc@FSharedStringArena@@QEAAPEAVFString@@AEBV2@@Z:PROC ; FSharedStringArena::Alloc + Line 1121: EXTRN ?Alloc@FSharedStringArena@@QEAAPEAVFString@@PEBD@Z:PROC ; FSharedStringArena::Alloc + Line 1122: EXTRN ?Alloc@FSharedStringArena@@QEAAPEAVFString@@PEBD_K@Z:PROC ; FSharedStringArena::Alloc + Line 1123: EXTRN ??0PSymbolTable@@QEAA@XZ:PROC ; PSymbolTable::PSymbolTable + Line 1124: EXTRN ??1PSymbolTable@@QEAA@XZ:PROC ; PSymbolTable::~PSymbolTable + Line 1125: EXTRN ?NewNamespace@FNamespaceManager@@QEAAPEAVPNamespace@@H@Z:PROC ; FNamespaceManager::NewNamespace + Line 1126: EXTRN ??0FScanner@@QEAA@XZ:PROC ; FScanner::FScanner + Line 1127: EXTRN ??1FScanner@@QEAA@XZ:PROC ; FScanner::~FScanner + Line 1128: EXTRN ?OpenLumpNum@FScanner@@QEAAXH@Z:PROC ; FScanner::OpenLumpNum + Line 1129: EXTRN ?SetStateMode@FScanner@@QEAAX_N@Z:PROC ; FScanner::SetStateMode + Line 1130: EXTRN ?SavePos@FScanner@@QEAA?BUSavedPos@1@XZ:PROC ; FScanner::SavePos + Line 1131: EXTRN ?RestorePos@FScanner@@QEAAXAEBUSavedPos@1@@Z:PROC ; FScanner::RestorePos + Line 1132: EXTRN ?TokenName@FScanner@@SA?AVFString@@HPEBD@Z:PROC ; FScanner::TokenName + Line 1133: EXTRN ?MustGetString@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetString + Line 1134: EXTRN ?GetToken@FScanner@@QEAA_NXZ:PROC ; FScanner::GetToken + Line 1135: EXTRN ?MustGetAnyToken@FScanner@@QEAAXXZ:PROC ; FScanner::MustGetAnyToken + Line 1136: EXTRN ?UnGet@FScanner@@QEAAXXZ:PROC ; FScanner::UnGet + Line 1137: EXTRN ?GetMessageLine@FScanner@@QEAAHXZ:PROC ; FScanner::GetMessageLine + Line 1138: EXTRN ?ScriptError@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptError + Line 1139: EXTRN ?ScriptMessage@FScanner@@QEAAXPEBDZZ:PROC ; FScanner::ScriptMessage + Line 1140: EXTRN ??0FScriptPosition@@QEAA@AEBU0@@Z:PROC ; FScriptPosition::FScriptPosition + Line 1141: EXTRN ??0FScriptPosition@@QEAA@VFString@@H@Z:PROC ; FScriptPosition::FScriptPosition + Line 1142: EXTRN ?Message@FScriptPosition@@QEBAXHPEBDZZ:PROC ; FScriptPosition::Message + Line 1143: EXTRN ?Open@FileWriter@@SAPEAV1@PEBD@Z:PROC ; FileWriter::Open + Line 1144: EXTRN ?GetWadFullName@FWadCollection@@QEBAPEBDH@Z:PROC ; FWadCollection::GetWadFullName + Line 1145: EXTRN ?CheckNumForFullName@FWadCollection@@QEAAHPEBD_NH1@Z:PROC ; FWadCollection::CheckNumForFullName + Line 1146: EXTRN ?FindLump@FWadCollection@@QEAAHPEBDPEAH_N@Z:PROC ; FWadCollection::FindLump + Line 1147: EXTRN ?GetLumpFullPath@FWadCollection@@QEBA?AVFString@@H@Z:PROC ; FWadCollection::GetLumpFullPath + Line 1148: EXTRN ?GetLumpFile@FWadCollection@@QEBAHH@Z:PROC ; FWadCollection::GetLumpFile + Line 1149: EXTRN ?CheckParm@FArgs@@QEBAHPEBDH@Z:PROC ; FArgs::CheckParm + Line 1150: EXTRN ?ZCC_PrintAST@@YA?AVFString@@PEAUZCC_TreeNode@@@Z:PROC ; ZCC_PrintAST + Line 1151: EXTRN ??0ZCCCompiler@@QEAA@AEAUZCC_AST@@PEAVDObject@@AEAUPSymbolTable@@PEAVPNamespace@@HAEBUVersionInfo@@@Z:PROC ; ZCCCompiler::ZCCCompiler + Line 1152: EXTRN ??1ZCCCompiler@@QEAA@XZ:PROC ; ZCCCompiler::~ZCCCompiler + Line 1153: EXTRN ?Compile@ZCCCompiler@@QEAAHXZ:PROC ; ZCCCompiler::Compile + Line 1154: EXTRN __CxxFrameHandler3:PROC + Line 1155: EXTRN ?NameData@FName@@1UNameManager@1@A:BYTE ; FName::NameData + Line 1156: EXTRN ?NullString@FString@@1UFNullStringData@@A:BYTE ; FString::NullString + Line 1157: EXTRN ?Namespaces@@3UFNamespaceManager@@A:BYTE ; Namespaces + Line 1158: EXTRN ?WarnCounter@FScriptPosition@@2HA:DWORD ; FScriptPosition::WarnCounter + Line 1159: EXTRN ?ErrorCounter@FScriptPosition@@2HA:DWORD ; FScriptPosition::ErrorCounter + Line 1160: EXTRN ?Wads@@3VFWadCollection@@A:BYTE ; Wads + Line 1161: EXTRN ?Args@@3PEAVFArgs@@EA:QWORD ; Args + Line 1162: EXTRN ?TypeSInt32@@3PEAVPInt@@EA:QWORD ; TypeSInt32 + Line 1163: EXTRN ?TypeUInt32@@3PEAVPInt@@EA:QWORD ; TypeUInt32 + Line 1164: EXTRN ?TypeBool@@3PEAVPBool@@EA:QWORD ; TypeBool + Line 1165: EXTRN ?TypeFloat64@@3PEAVPFloat@@EA:QWORD ; TypeFloat64 + Line 1166: EXTRN ?TypeString@@3PEAVPString@@EA:QWORD ; TypeString + Line 1167: EXTRN ?TypeName@@3PEAVPName@@EA:QWORD ; TypeName + Line 1168: EXTRN ?TypeVector2@@3PEAVPStruct@@EA:QWORD ; TypeVector2 + Line 1169: EXTRN ?TypeVector3@@3PEAVPStruct@@EA:QWORD ; TypeVector3 + Line 1170: EXTRN ?TypeNullPtr@@3PEAVPPointer@@EA:QWORD ; TypeNullPtr + Line 1171: EXTRN __ImageBase:BYTE + Line 1172: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\zstrformat.cod (5 hits) + Line 85: EXTRN localeconv:PROC + Line 86: EXTRN dtoa:PROC + Line 87: EXTRN freedtoa:PROC + Line 88: EXTRN memcpy:PROC + Line 89: EXTRN _fltused:DWORD + C:\Programming\Doom-Dev\GZDoom\build_vc2017-64\src\Release\zstring.cod (30 hits) + Line 135: EXTRN ??3@YAXPEAX_K@Z:PROC ; operator delete + Line 136: EXTRN strtod:PROC + Line 137: EXTRN strtoll:PROC + Line 138: EXTRN strtoull:PROC + Line 139: EXTRN isupper:PROC + Line 140: EXTRN isspace:PROC + Line 141: EXTRN toupper:PROC + Line 142: EXTRN tolower:PROC + Line 143: EXTRN strchr:PROC + Line 144: EXTRN strstr:PROC + Line 145: EXTRN strncmp:PROC + Line 146: EXTRN strpbrk:PROC + Line 147: EXTRN __std_exception_copy:PROC + Line 148: EXTRN __std_exception_destroy:PROC + Line 149: EXTRN ??_Eexception@std@@UEAAPEAXI@Z:PROC ; std::exception::`vector deleting destructor' + Line 150: EXTRN ??_Ebad_alloc@std@@UEAAPEAXI@Z:PROC ; std::bad_alloc::`vector deleting destructor' + Line 151: EXTRN ?M_Realloc@@YAPEAXPEAX_K@Z:PROC ; M_Realloc + Line 152: EXTRN ?M_Free@@YAXPEAX@Z:PROC ; M_Free + Line 153: EXTRN ?VWorker@StringFormat@@YAHP6AHPEAXPEBDH@Z01PEAD@Z:PROC ; StringFormat::VWorker + Line 154: EXTRN __imp_HeapCreate:PROC + Line 155: EXTRN __imp_HeapAlloc:PROC + Line 156: EXTRN __imp_HeapReAlloc:PROC + Line 157: EXTRN __imp_HeapFree:PROC + Line 158: EXTRN _CxxThrowException:PROC + Line 159: EXTRN __CxxFrameHandler3:PROC + Line 160: EXTRN memcpy:PROC + Line 161: EXTRN memmove:PROC + Line 162: EXTRN memset:PROC + Line 163: EXTRN ??_7type_info@@6B@:QWORD ; type_info::`vftable' + Line 164: EXTRN _fltused:DWORD diff --git a/externs.zip b/externs.zip new file mode 100644 index 0000000000000000000000000000000000000000..e56c17d38166b52fafa5b6fa94b39460436338eb GIT binary patch literal 246757 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

4x?tUPgeDbE(blt+Ytj@moIBXNo*>7%Z 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

~2 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 zVGvhealth = health; + + // now set health of all linked objects to the same as this one + for (unsigned i = 0; i < grp->lines.Size(); i++) + { + line_t* lline = grp->lines[i]; + lline->health = health; + } + // + for (unsigned i = 0; i < grp->sectors.Size(); i++) + { + sector_t* lsector = grp->sectors[i]; + if (lsector->healthceilinggroup == grp->id) + lsector->healthceiling = health; + if (lsector->healthfloorgroup == grp->id) + lsector->healthfloor = health; + if (lsector->health3dgroup == grp->id) + lsector->health3d = health; + } +} + +void P_SetHealthGroupHealth(FLevelLocals *Level, int id, int health) +{ + P_SetHealthGroupHealth(P_GetHealthGroup(Level, id), health); +} + +void P_DamageHealthGroup(FHealthGroup* grp, void* object, AActor* source, int damage, FName damagetype, int side, int part, DVector3 position, bool isradius) +{ + if (!grp) return; + int group = grp->id; + + // now set health of all linked objects to the same as this one + for (unsigned i = 0; i < grp->lines.Size(); i++) + { + line_t* lline = grp->lines[i]; + if (lline == object) + continue; + lline->health = grp->health + damage; + P_DamageLinedef(lline, source, damage, damagetype, side, position, isradius, false); + } + // + for (unsigned i = 0; i < grp->sectors.Size(); i++) + { + sector_t* lsector = grp->sectors[i]; + + if (lsector->healthceilinggroup == group && (lsector != object || part != SECPART_Ceiling)) + { + lsector->healthceiling = grp->health + damage; + P_DamageSector(lsector, source, damage, damagetype, SECPART_Ceiling, position, isradius, false); + } + + if (lsector->healthfloorgroup == group && (lsector != object || part != SECPART_Floor)) + { + lsector->healthfloor = grp->health + damage; + P_DamageSector(lsector, source, damage, damagetype, SECPART_Floor, position, isradius, false); + } + + if (lsector->health3dgroup == group && (lsector != object || part != SECPART_3D)) + { + lsector->health3d = grp->health + damage; + P_DamageSector(lsector, source, damage, damagetype, SECPART_3D, position, isradius, false); + } + } +} + +void P_DamageLinedef(line_t* line, AActor* source, int damage, FName damagetype, int side, DVector3 position, bool isradius, bool dogroups) +{ + if (damage < 0) damage = 0; + + if (dogroups) + { + damage = E_WorldLineDamaged(line, source, damage, damagetype, side, position, isradius); + if (damage < 0) damage = 0; + } + + if (!damage) return; + + line->health -= damage; + if (line->health < 0) line->health = 0; + + // callbacks here + // first off, call special if needed + if ((line->activation & SPAC_Damage) || ((line->activation & SPAC_Death) && !line->health)) + { + int activateon = SPAC_Damage; + if (!line->health) activateon |= SPAC_Death; + P_ActivateLine(line, source, side, activateon&line->activation, &position); + } + + if (dogroups && line->healthgroup) + { + FHealthGroup* grp = P_GetHealthGroup(line->GetLevel(), line->healthgroup); + if (grp) + grp->health = line->health; + P_DamageHealthGroup(grp, line, source, damage, damagetype, side, -1, position, isradius); + } + + //Printf("P_DamageLinedef: %d damage (type=%s, source=%p), new health = %d\n", damage, damagetype.GetChars(), source, line->health); +} + +void P_DamageSector(sector_t* sector, AActor* source, int damage, FName damagetype, int part, DVector3 position, bool isradius, bool dogroups) +{ + if (damage < 0) damage = 0; + + if (dogroups) + { + damage = E_WorldSectorDamaged(sector, source, damage, damagetype, part, position, isradius); + if (damage < 0) damage = 0; + } + + if (!damage) return; + + int* sectorhealth; + int group; + int dmg; + int dth; + switch (part) + { + case SECPART_Ceiling: + sectorhealth = §or->healthceiling; + group = sector->healthceilinggroup; + dmg = SECSPAC_DamageCeiling; + dth = SECSPAC_DeathCeiling; + break; + case SECPART_Floor: + sectorhealth = §or->healthfloor; + group = sector->healthfloorgroup; + dmg = SECSPAC_DamageFloor; + dth = SECSPAC_DeathFloor; + break; + case SECPART_3D: + sectorhealth = §or->health3d; + group = sector->health3dgroup; + dmg = SECSPAC_Damage3D; + dth = SECSPAC_Death3D; + break; + default: + return; + } + + int newhealth = *sectorhealth - damage; + if (newhealth < 0) newhealth = 0; + + *sectorhealth = newhealth; + + // callbacks here + if (sector->SecActTarget) + { + sector->TriggerSectorActions(source, dmg); + if (newhealth == 0) + sector->TriggerSectorActions(source, dth); + } + + if (dogroups && group) + { + FHealthGroup* grp = P_GetHealthGroup(sector->Level, group); + if (grp) + grp->health = newhealth; + P_DamageHealthGroup(grp, sector, source, damage, damagetype, 0, part, position, isradius); + } + + //Printf("P_DamageSector: %d damage (type=%s, position=%s, source=%p), new health = %d\n", damage, damagetype.GetChars(), (part == SECPART_Ceiling) ? "ceiling" : "floor", source, newhealth); +} + + +//=========================================================================== +// +// +// +//=========================================================================== + +FHealthGroup* P_GetHealthGroup(FLevelLocals *Level, int id) +{ + FHealthGroup* grp = Level->healthGroups.CheckKey(id); + return grp; +} + +FHealthGroup* P_GetHealthGroupOrNew(FLevelLocals *Level, int id, int health) +{ + FHealthGroup* grp = Level->healthGroups.CheckKey(id); + if (!grp) + { + FHealthGroup newgrp; + newgrp.id = id; + newgrp.health = health; + grp = &(Level->healthGroups.Insert(id, newgrp)); + } + return grp; +} + +void P_InitHealthGroups(FLevelLocals *Level) +{ + Level->healthGroups.Clear(); + TArray groupsInError; + for (unsigned i = 0; i < Level->lines.Size(); i++) + { + line_t* lline = &Level->lines[i]; + if (lline->healthgroup > 0) + { + FHealthGroup* grp = P_GetHealthGroupOrNew(Level, lline->healthgroup, lline->health); + if (grp->health != lline->health) + { + Printf(TEXTCOLOR_RED "Warning: line %d in health group %d has different starting health (line health = %d, group health = %d)\n", i, lline->healthgroup, lline->health, grp->health); + groupsInError.Push(lline->healthgroup); + if (lline->health > grp->health) + grp->health = lline->health; + } + grp->lines.Push(lline); + } + } + for (unsigned i = 0; i < Level->sectors.Size(); i++) + { + sector_t* lsector = &Level->sectors[i]; + if (lsector->healthceilinggroup > 0) + { + FHealthGroup* grp = P_GetHealthGroupOrNew(Level, lsector->healthceilinggroup, lsector->healthceiling); + if (grp->health != lsector->healthceiling) + { + Printf(TEXTCOLOR_RED "Warning: sector ceiling %d in health group %d has different starting health (ceiling health = %d, group health = %d)\n", i, lsector->healthceilinggroup, lsector->healthceiling, grp->health); + groupsInError.Push(lsector->healthceilinggroup); + if (lsector->healthceiling > grp->health) + grp->health = lsector->healthceiling; + } + grp->sectors.Push(lsector); + } + if (lsector->healthfloorgroup > 0) + { + FHealthGroup* grp = P_GetHealthGroupOrNew(Level, lsector->healthfloorgroup, lsector->healthfloor); + if (grp->health != lsector->healthfloor) + { + Printf(TEXTCOLOR_RED "Warning: sector floor %d in health group %d has different starting health (floor health = %d, group health = %d)\n", i, lsector->healthfloorgroup, lsector->healthfloor, grp->health); + groupsInError.Push(lsector->healthfloorgroup); + if (lsector->healthfloor > grp->health) + grp->health = lsector->healthfloor; + } + if (lsector->healthceilinggroup != lsector->healthfloorgroup) + grp->sectors.Push(lsector); + } + } + for (unsigned i = 0; i < groupsInError.Size(); i++) + { + FHealthGroup* grp = P_GetHealthGroup(Level, groupsInError[i]); + Printf(TEXTCOLOR_GOLD "Health group %d is using the highest found health value of %d", groupsInError[i], grp->health); + } +} + +//========================================================================== +// +// P_GeometryLineAttack +// +// Applies hitscan damage to geometry (lines and sectors with health>0) +//========================================================================== + +void P_GeometryLineAttack(FTraceResults& trace, AActor* thing, int damage, FName damageType) +{ + // [ZZ] hitscan geometry damage logic + // + + // check 3d floor, but still allow the wall to take generic damage + if (trace.HitType == TRACE_HitWall && trace.Tier == TIER_FFloor) + { + if (trace.ffloor && trace.ffloor->model && trace.ffloor->model->health3d) + P_DamageSector(trace.ffloor->model, thing, damage, damageType, SECPART_3D, trace.HitPos, false, true); + } + + if (trace.HitType == TRACE_HitWall && P_CheckLinedefVulnerable(trace.Line, trace.Side)) + { + if (trace.Tier == TIER_Lower || trace.Tier == TIER_Upper) // process back sector health if any + { + sector_t* backsector = (trace.Line->sidedef[!trace.Side] ? trace.Line->sidedef[!trace.Side]->sector : nullptr); + int sectorhealth = 0; + if (backsector && trace.Tier == TIER_Lower && backsector->healthfloor > 0 && P_CheckLinedefVulnerable(trace.Line, trace.Side, SECPART_Floor)) + sectorhealth = backsector->healthfloor; + if (backsector && trace.Tier == TIER_Upper && backsector->healthceiling > 0 && P_CheckLinedefVulnerable(trace.Line, trace.Side, SECPART_Ceiling)) + sectorhealth = backsector->healthceiling; + if (sectorhealth > 0) + { + P_DamageSector(backsector, thing, damage, damageType, (trace.Tier == TIER_Upper) ? SECPART_Ceiling : SECPART_Floor, trace.HitPos, false, true); + } + } + // always process linedef health if any + if (trace.Line->health > 0) + { + P_DamageLinedef(trace.Line, thing, damage, damageType, trace.Side, trace.HitPos, false, true); + } + // fake floors are not handled + } + else if (trace.HitType == TRACE_HitFloor || trace.HitType == TRACE_HitCeiling) + { + // check for 3d floors. if a 3d floor was hit, it'll block any interaction with the sector planes at the same point, if present. + // i.e. if there are 3d floors at the same height as the sector's real floor/ceiling, and they blocked the shot, then it won't damage. + bool hit3dfloors = false; + sector_t* sector = trace.Sector; + for (auto f : sector->e->XFloor.ffloors) + { + if (!(f->flags & FF_EXISTS)) continue; + if (!(f->flags & FF_SOLID) || (f->flags & FF_SHOOTTHROUGH)) continue; + + if (!f->model) continue; + if (trace.HitType == TRACE_HitFloor && fabs(f->top.plane->ZatPoint(trace.HitPos.XY())-trace.HitPos.Z) <= EQUAL_EPSILON) + { + if (f->model->health3d) + P_DamageSector(f->model, thing, damage, damageType, SECPART_3D, trace.HitPos, false, true); + hit3dfloors = true; + } + else if (trace.HitType == TRACE_HitCeiling && fabs(f->bottom.plane->ZatPoint(trace.HitPos.XY())-trace.HitPos.Z) <= EQUAL_EPSILON) + { + if (f->model->health3d) + P_DamageSector(f->model, thing, damage, damageType, SECPART_3D, trace.HitPos, false, true); + hit3dfloors = true; + } + } + + if (hit3dfloors) + return; + + int sectorhealth = 0; + if (trace.HitType == TRACE_HitFloor && trace.Sector->healthfloor > 0 && P_CheckSectorVulnerable(trace.Sector, SECPART_Floor)) + sectorhealth = trace.Sector->healthfloor; + if (trace.HitType == TRACE_HitCeiling && trace.Sector->healthceiling > 0 && P_CheckSectorVulnerable(trace.Sector, SECPART_Ceiling)) + sectorhealth = trace.Sector->healthceiling; + if (sectorhealth > 0) + { + P_DamageSector(trace.Sector, thing, damage, damageType, (trace.HitType == TRACE_HitCeiling) ? SECPART_Ceiling : SECPART_Floor, trace.HitPos, false, true); + } + } +} + +//========================================================================== +// +// P_GeometryRadiusAttack +// +// Applies radius damage to destructible geometry (lines and sectors with health>0) +//========================================================================== + +struct pgra_data_t +{ + DVector3 pos; + line_t* line; + sector_t* sector; + int secpart; +}; + +// we use this horizontally for 2D wall distance, and in a bit fancier way for 3D wall distance +static DVector2 PGRA_ClosestPointOnLine2D(DVector2 x, DVector2 p1, DVector2 p2) +{ + DVector2 p2p1 = (p2 - p1); + DVector2 xp1 = (x - p1); + double r = p2p1 | xp1; + double len = p2p1.Length(); + r /= len; + + if (r < 0) + return p1; + if (r > len) + return p2; + + return p1 + p2p1.Unit() * r; +} + +static bool PGRA_CheckExplosionBlocked(DVector3 pt, DVector3 check, sector_t* checksector) +{ + // simple solid geometry sight check between "check" and "pt" + // expected - Trace hits nothing + check.Z += EQUAL_EPSILON; // this is so that floor under the rocket doesn't block explosion + DVector3 ptVec = (pt - check); + double ptDst = ptVec.Length() - 0.5; + ptVec.MakeUnit(); + FTraceResults res; + bool isblocked = Trace(check, checksector, ptVec, ptDst, 0, ML_BLOCKEVERYTHING, nullptr, res); + return isblocked; +} + +static void PGRA_InsertIfCloser(TMap& damageGroupPos, int group, DVector3 pt, DVector3 check, sector_t* checksector, sector_t* sector, line_t* line, int secpart) +{ + if (PGRA_CheckExplosionBlocked(pt, check, checksector)) + return; + + pgra_data_t* existing = damageGroupPos.CheckKey(group); + // not present or distance is closer + if (!existing || (((*existing).pos - check).Length() > (pt - check).Length())) + { + if (!existing) existing = &damageGroupPos.Insert(group, pgra_data_t()); + existing->pos = pt; + existing->line = line; + existing->sector = sector; + existing->secpart = secpart; + } +} + +EXTERN_CVAR(Float, splashfactor); + +void P_GeometryRadiusAttack(AActor* bombspot, AActor* bombsource, int bombdamage, int bombdistance, FName damagetype, int fulldamagedistance) +{ + TMap damageGroupPos; + + double bombdistancefloat = 1. / (double)(bombdistance - fulldamagedistance); + + // now, this is not entirely correct... but sector actions still _do_ require a valid source actor to trigger anything + if (!bombspot) + return; + if (!bombsource) + bombsource = bombspot; + + // check current sector floor and ceiling. this is the only *sector* checked, otherwise only use lines + // a bit imprecise, but should work + sector_t* srcsector = bombspot->Sector; + + if (srcsector->healthceiling > 0) + { + double dstceiling = srcsector->ceilingplane.Normal() | (bombspot->Pos() + srcsector->ceilingplane.Normal()*srcsector->ceilingplane.D); + DVector3 spotTo = bombspot->Pos() - srcsector->ceilingplane.Normal() * dstceiling; + int grp = srcsector->healthceilinggroup; + if (grp <= 0) + grp = 0x80000000 | (srcsector->sectornum & 0x0FFFFFFF); + PGRA_InsertIfCloser(damageGroupPos, grp, spotTo, bombspot->Pos(), srcsector, srcsector, nullptr, SECPART_Ceiling); + } + + if (srcsector->healthfloor > 0) + { + double dstfloor = srcsector->floorplane.Normal() | (bombspot->Pos() + srcsector->floorplane.Normal()*srcsector->floorplane.D); + DVector3 spotTo = bombspot->Pos() - srcsector->floorplane.Normal() * dstfloor; + int grp = srcsector->healthfloorgroup; + if (grp <= 0) + grp = 0x40000000 | (srcsector->sectornum & 0x0FFFFFFF); + PGRA_InsertIfCloser(damageGroupPos, grp, spotTo, bombspot->Pos(), srcsector, srcsector, nullptr, SECPART_Floor); + } + + for (auto f : srcsector->e->XFloor.ffloors) + { + if (!(f->flags & FF_EXISTS)) continue; + if (!(f->flags & FF_SOLID)) continue; + + if (!f->model || !f->model->health3d) continue; + + double ff_top = f->top.plane->ZatPoint(bombspot->Pos()); + double ff_bottom = f->bottom.plane->ZatPoint(bombspot->Pos()); + if (ff_top < ff_bottom) // ignore eldritch geometry + continue; + + int grp = f->model->health3dgroup; + if (grp <= 0) + grp = 0x20000000 | (f->model->sectornum & 0x0FFFFFFF); + + DVector3 spotTo; + + if (bombspot->Z() < ff_bottom) // use bottom plane + { + double dst = f->bottom.plane->Normal() | (bombspot->Pos() + f->bottom.plane->Normal()*f->bottom.plane->D); + spotTo = bombspot->Pos() - f->bottom.plane->Normal() * dst; + } + else if (bombspot->Z() > ff_top) // use top plane + { + double dst = f->top.plane->Normal() | (bombspot->Pos() + f->top.plane->Normal()*f->top.plane->D); + spotTo = bombspot->Pos() - f->top.plane->Normal() * dst; + } + else // explosion right inside the floor. do 100% damage + { + spotTo = bombspot->Pos(); + } + + PGRA_InsertIfCloser(damageGroupPos, grp, spotTo, bombspot->Pos(), srcsector, f->model, nullptr, SECPART_3D); + } + + // enumerate all lines around + FBoundingBox bombbox(bombspot->X(), bombspot->Y(), bombdistance); + FBlockLinesIterator it(bombbox); + line_t* ln; + int vc = validcount; + TArray lines; + while ((ln = it.Next())) // iterator and Trace both use validcount and interfere with each other + lines.Push(ln); + for (unsigned i = 0; i < lines.Size(); i++) + { + ln = lines[i]; + DVector2 pos2d = bombspot->Pos().XY(); + int sd = P_PointOnLineSide(pos2d, ln); + + side_t* side = ln->sidedef[sd]; + if (!side) continue; + sector_t* sector = side->sector; + side_t* otherside = ln->sidedef[!sd]; + sector_t* othersector = otherside ? otherside->sector : nullptr; + if (!ln->health && (!othersector || (!othersector->healthfloor && !othersector->healthceiling && !othersector->e->XFloor.ffloors.Size()))) + continue; // non-interactive geometry + + DVector2 to2d = PGRA_ClosestPointOnLine2D(bombspot->Pos().XY(), side->V1()->p, side->V2()->p); + // this gives us x/y + double distto2d = (to2d - pos2d).Length(); + double z_top1, z_top2, z_bottom1, z_bottom2; // here, z_top1 is closest to the ceiling, and z_bottom1 is closest to the floor. + z_top1 = sector->ceilingplane.ZatPoint(to2d); + z_top2 = othersector ? othersector->ceilingplane.ZatPoint(to2d) : z_top1; + z_bottom1 = sector->floorplane.ZatPoint(to2d); + z_bottom2 = othersector ? othersector->floorplane.ZatPoint(to2d) : z_bottom1; + DVector3 to3d_fullheight(to2d.X, to2d.Y, clamp(bombspot->Z(), z_bottom1, z_top1)); + + if (ln->health && P_CheckLinedefVulnerable(ln, sd)) + { + bool cantdamage = false; + bool linefullheight = !othersector || !!(ln->flags & (ML_BLOCKEVERYTHING)); + // decide specific position to affect on a line. + if (!linefullheight) + { + z_top2 = othersector->ceilingplane.ZatPoint(to2d); + z_bottom2 = othersector->floorplane.ZatPoint(to2d); + double bombz = bombspot->Z(); + if (z_top2 > z_top1) + z_top2 = z_top1; + if (z_bottom2 < z_bottom1) + z_bottom2 = z_bottom1; + if (bombz <= z_top2 && bombz >= z_bottom2) // between top and bottom opening + to3d_fullheight.Z = (z_top2 - bombz < bombz - z_bottom2) ? z_top2 : z_bottom2; + else if (bombz < z_bottom2 && bombz >= z_bottom1) + to3d_fullheight.Z = clamp(bombz, z_bottom1, z_bottom2); + else if (bombz > z_top2 && bombz <= z_top1) + to3d_fullheight.Z = clamp(bombz, z_top2, z_top1); + else cantdamage = true; + } + + if (!cantdamage) + { + if (ln->healthgroup) + { + PGRA_InsertIfCloser(damageGroupPos, ln->healthgroup, to3d_fullheight, bombspot->Pos(), srcsector, nullptr, ln, -1); + } + else if (!PGRA_CheckExplosionBlocked(to3d_fullheight, bombspot->Pos(), srcsector)) + { + // otherwise just damage line + double dst = (to3d_fullheight - bombspot->Pos()).Length(); + int damage = 0; + if (dst < bombdistance) + { + dst = clamp(dst - (double)fulldamagedistance, 0, dst); + damage = (int)((double)bombdamage * (1. - dst * bombdistancefloat)); + if (bombsource == bombspot) + damage = (int)(damage * splashfactor); + } + P_DamageLinedef(ln, bombsource, damage, damagetype, sd, to3d_fullheight, true, true); + } + } + } + + if (othersector && othersector->healthceiling && P_CheckLinedefVulnerable(ln, sd, SECPART_Ceiling)) + { + if (z_top2 < z_top1) // we have front side to hit against + { + DVector3 to3d_upper(to2d.X, to2d.Y, clamp(bombspot->Z(), z_top2, z_top1)); + int grp = othersector->healthceilinggroup; + if (grp <= 0) + grp = 0x80000000 | (othersector->sectornum & 0x0FFFFFFF); + PGRA_InsertIfCloser(damageGroupPos, grp, to3d_upper, bombspot->Pos(), srcsector, othersector, nullptr, SECPART_Ceiling); + } + } + + if (othersector && othersector->healthfloor && P_CheckLinedefVulnerable(ln, sd, SECPART_Floor)) + { + if (z_bottom2 > z_bottom1) // we have front side to hit against + { + DVector3 to3d_lower(to2d.X, to2d.Y, clamp(bombspot->Z(), z_bottom1, z_bottom2)); + int grp = othersector->healthfloorgroup; + if (grp <= 0) + grp = 0x40000000 | (othersector->sectornum & 0x0FFFFFFF); + PGRA_InsertIfCloser(damageGroupPos, grp, to3d_lower, bombspot->Pos(), srcsector, othersector, nullptr, SECPART_Floor); + } + } + + // check 3d floors + if (othersector) + { + for (auto f : othersector->e->XFloor.ffloors) + { + if (!(f->flags & FF_EXISTS)) continue; + if (!(f->flags & FF_SOLID)) continue; + + if (!f->model || !f->model->health3d) continue; + + // 3d floors over real ceiling, or under real floor, are ignored + double z_ff_top = clamp(f->top.plane->ZatPoint(to2d), z_bottom2, z_top2); + double z_ff_bottom = clamp(f->bottom.plane->ZatPoint(to2d), z_bottom2, z_top2); + if (z_ff_top < z_ff_bottom) + continue; // also ignore eldritch geometry + + DVector3 to3d_ffloor(to2d.X, to2d.Y, clamp(bombspot->Z(), z_ff_bottom, z_ff_top)); + int grp = f->model->health3dgroup; + if (grp <= 0) + grp = 0x20000000 | (f->model->sectornum & 0x0FFFFFFF); + PGRA_InsertIfCloser(damageGroupPos, grp, to3d_ffloor, bombspot->Pos(), srcsector, f->model, nullptr, SECPART_3D); + } + } + + } + + // damage health groups and sectors. + // if group & 0x80000000, this is sector ceiling without health group + // if grpup & 0x40000000, this is sector floor without health group + // otherwise this is some object in health group + TMap::ConstIterator damageGroupIt(damageGroupPos); + TMap::ConstPair* damageGroupPair; + while (damageGroupIt.NextPair(damageGroupPair)) + { + DVector3 pos = damageGroupPair->Value.pos; + double dst = (pos - bombspot->Pos()).Length(); + int damage = 0; + if (dst < bombdistance) + { + dst = clamp(dst - (double)fulldamagedistance, 0, dst); + damage = (int)((double)bombdamage * (1. - dst * bombdistancefloat)); + if (bombsource == bombspot) + damage = (int)(damage * splashfactor); + } + + // for debug + //P_SpawnParticle(damageGroupPair->Value.pos, DVector3(), DVector3(), PalEntry(0xFF, 0x00, 0x00), 1.0, 35, 5.0, 0.0, 0.0, 0); + + int grp = damageGroupPair->Key; + if (grp & 0x80000000) // sector ceiling + { + assert(damageGroupPair->Value.sector != nullptr); + P_DamageSector(damageGroupPair->Value.sector, bombsource, damage, damagetype, SECPART_Ceiling, pos, true, true); + } + else if (grp & 0x40000000) // sector floor + { + assert(damageGroupPair->Value.sector != nullptr); + P_DamageSector(damageGroupPair->Value.sector, bombsource, damage, damagetype, SECPART_Floor, pos, true, true); + } + else if (grp & 0x20000000) // sector 3d + { + assert(damageGroupPair->Value.sector != nullptr); + P_DamageSector(damageGroupPair->Value.sector, bombsource, damage, damagetype, SECPART_3D, pos, true, true); + } + else + { + assert((damageGroupPair->Value.sector != nullptr) != (damageGroupPair->Value.line != nullptr)); + if (damageGroupPair->Value.line != nullptr) + P_DamageLinedef(damageGroupPair->Value.line, bombsource, damage, damagetype, P_PointOnLineSide(pos.XY(), damageGroupPair->Value.line), pos, true, true); + else P_DamageSector(damageGroupPair->Value.sector, bombsource, damage, damagetype, damageGroupPair->Value.secpart, pos, true, true); + } + } +} + +//========================================================================== +// +// P_ProjectileHitLinedef +// +// Called if P_ExplodeMissile was called against a wall. +//========================================================================== + +bool P_ProjectileHitLinedef(AActor* mo, line_t* line) +{ + bool washit = false; + // detect 3d floor hit + if (mo->Blocking3DFloor) + { + if (mo->Blocking3DFloor->health3d > 0) + { + P_DamageSector(mo->Blocking3DFloor, mo, mo->GetMissileDamage((mo->flags4 & MF4_STRIFEDAMAGE) ? 3 : 7, 1), mo->DamageType, SECPART_3D, mo->Pos(), false, true); + washit = true; + } + } + + int wside = P_PointOnLineSide(mo->Pos(), line); + int oside = !wside; + side_t* otherside = line->sidedef[oside]; + // check if hit upper or lower part + if (otherside) + { + sector_t* othersector = otherside->sector; + // find closest pos from line to MO. + // this logic is so that steep slopes work correctly (value at the line is used, instead of value below the rocket actor) + DVector2 moRelPos = line->v1->p - mo->Pos().XY(); + DVector2 lineNormal = line->delta.Rotated90CW().Unit(); + double moRelDst = lineNormal | moRelPos; + DVector2 moPos = mo->Pos().XY() - lineNormal*fabs(moRelDst); + + double otherfloorz = othersector->floorplane.ZatPoint(moPos); + double otherceilingz = othersector->ceilingplane.ZatPoint(moPos); + double zbottom = mo->Pos().Z; + double ztop = mo->Pos().Z + mo->Height; + if (zbottom < (otherfloorz + EQUAL_EPSILON) && othersector->healthfloor > 0 && P_CheckLinedefVulnerable(line, wside, SECPART_Floor)) + { + P_DamageSector(othersector, mo, mo->GetMissileDamage((mo->flags4 & MF4_STRIFEDAMAGE) ? 3 : 7, 1), mo->DamageType, SECPART_Floor, mo->Pos(), false, true); + washit = true; + } + if (ztop > (otherceilingz - EQUAL_EPSILON) && othersector->healthceiling > 0 && P_CheckLinedefVulnerable(line, wside, SECPART_Ceiling)) + { + P_DamageSector(othersector, mo, mo->GetMissileDamage((mo->flags4 & MF4_STRIFEDAMAGE) ? 3 : 7, 1), mo->DamageType, SECPART_Ceiling, mo->Pos(), false, true); + washit = true; + } + } + + if (line->health > 0 && P_CheckLinedefVulnerable(line, wside)) + { + P_DamageLinedef(line, mo, mo->GetMissileDamage((mo->flags4 & MF4_STRIFEDAMAGE) ? 3 : 7, 1), mo->DamageType, wside, mo->Pos(), false, true); + washit = true; + } + + return washit; +} + +// part = -1 means "detect from blocking" +bool P_ProjectileHitPlane(AActor* mo, int part) +{ + if (part < 0) + { + if (mo->BlockingCeiling) + part = SECPART_Ceiling; + else if (mo->BlockingFloor) + part = SECPART_Floor; + } + + // detect 3d floor hit + if (mo->Blocking3DFloor) + { + if (mo->Blocking3DFloor->health3d > 0) + { + P_DamageSector(mo->Blocking3DFloor, mo, mo->GetMissileDamage((mo->flags4 & MF4_STRIFEDAMAGE) ? 3 : 7, 1), mo->DamageType, SECPART_3D, mo->Pos(), false, true); + return true; + } + + return false; + } + + if (part == SECPART_Floor && mo->Sector->healthfloor > 0 && P_CheckSectorVulnerable(mo->Sector, SECPART_Floor)) + { + P_DamageSector(mo->Sector, mo, mo->GetMissileDamage((mo->flags4 & MF4_STRIFEDAMAGE) ? 3 : 7, 1), mo->DamageType, SECPART_Floor, mo->Pos(), false, true); + return true; + } + else if (part == SECPART_Ceiling && mo->Sector->healthceiling > 0 && P_CheckSectorVulnerable(mo->Sector, SECPART_Ceiling)) + { + P_DamageSector(mo->Sector, mo, mo->GetMissileDamage((mo->flags4 & MF4_STRIFEDAMAGE) ? 3 : 7, 1), mo->DamageType, SECPART_Ceiling, mo->Pos(), false, true); + return true; + } + + return false; +} + +//========================================================================== +// +// P_CheckLinedefVulnerable +// +// If sectorpart is <0: returns if linedef is damageable directly +// If sectorpart is valid (SECPART_ enum): returns if sector on sidedef is +// damageable through this line at specified sectorpart +//========================================================================== + +bool P_CheckLinedefVulnerable(line_t* line, int side, int sectorpart) +{ + if (line->special == Line_Horizon) + return false; + side_t* sidedef = line->sidedef[side]; + if (!sidedef) + return false; + return true; +} + +//========================================================================== +// +// P_CheckSectorVulnerable +// +// Returns true if sector's floor or ceiling is directly damageable +//========================================================================== + +bool P_CheckSectorVulnerable(sector_t* sector, int part) +{ + if (part == SECPART_3D) + return true; + FTextureID texture = sector->GetTexture((part == SECPART_Ceiling) ? sector_t::ceiling : sector_t::floor); + secplane_t* plane = (part == SECPART_Ceiling) ? §or->ceilingplane : §or->floorplane; + if (texture == skyflatnum) + return false; + return true; +} + +/// + +FSerializer &Serialize(FSerializer &arc, const char *key, FHealthGroup& g, FHealthGroup *def) +{ + if (arc.BeginObject(key)) + { + arc("id", g.id) + ("health", g.health) + .EndObject(); + } + return arc; +} + +void P_SerializeHealthGroups(FSerializer& arc) +{ + // todo : stuff + if (arc.BeginArray("healthgroups")) + { + if (arc.isReading()) + { + TArray readGroups; + int sz = arc.ArraySize(); + for (int i = 0; i < sz; i++) + { + FHealthGroup grp; + arc(nullptr, grp); + FHealthGroup* existinggrp = P_GetHealthGroup(grp.id); + if (!existinggrp) + continue; + existinggrp->health = grp.health; + } + } + else + { + TMap::ConstIterator it(level.healthGroups); + TMap::ConstPair* pair; + while (it.NextPair(pair)) + { + FHealthGroup grp = pair->Value; + arc(nullptr, grp); + } + } + + arc.EndArray(); + } +} + +// ===================== zscript interface ===================== +// +// ============================================================= + +DEFINE_FIELD_X(HealthGroup, FHealthGroup, id) +DEFINE_FIELD_X(HealthGroup, FHealthGroup, health) +DEFINE_FIELD_X(HealthGroup, FHealthGroup, sectors) +DEFINE_FIELD_X(HealthGroup, FHealthGroup, lines) + +DEFINE_ACTION_FUNCTION(FHealthGroup, Find) +{ + PARAM_PROLOGUE; + PARAM_INT(id); + FHealthGroup* grp = P_GetHealthGroup(id); + ACTION_RETURN_POINTER(grp); +} + +DEFINE_ACTION_FUNCTION(FHealthGroup, SetHealth) +{ + PARAM_SELF_STRUCT_PROLOGUE(FHealthGroup); + PARAM_INT(health); + P_SetHealthGroupHealth(self, health); + return 0; +} + +DEFINE_ACTION_FUNCTION(FDestructible, DamageSector) +{ + PARAM_PROLOGUE; + PARAM_POINTER(sec, sector_t); + PARAM_OBJECT(source, AActor); + PARAM_INT(damage); + PARAM_NAME(damagetype); + PARAM_INT(part); + PARAM_FLOAT(position_x); + PARAM_FLOAT(position_y); + PARAM_FLOAT(position_z); + PARAM_BOOL(isradius); + P_DamageSector(sec, source, damage, damagetype, part, DVector3(position_x, position_y, position_z), isradius, true); + return 0; +} + +DEFINE_ACTION_FUNCTION(FDestructible, DamageLinedef) +{ + PARAM_PROLOGUE; + PARAM_POINTER(def, line_t); + PARAM_OBJECT(source, AActor); + PARAM_INT(damage); + PARAM_NAME(damagetype); + PARAM_INT(side); + PARAM_FLOAT(position_x); + PARAM_FLOAT(position_y); + PARAM_FLOAT(position_z); + PARAM_BOOL(isradius); + P_DamageLinedef(def, source, damage, damagetype, side, DVector3(position_x, position_y, position_z), isradius, true); + return 0; +} + +DEFINE_ACTION_FUNCTION(FDestructible, GeometryLineAttack) +{ + PARAM_PROLOGUE; + PARAM_POINTER(trace, FTraceResults); + PARAM_OBJECT(thing, AActor); + PARAM_INT(damage); + PARAM_NAME(damagetype); + P_GeometryLineAttack(*trace, thing, damage, damagetype); + return 0; +} + +DEFINE_ACTION_FUNCTION(FDestructible, GeometryRadiusAttack) +{ + PARAM_PROLOGUE; + PARAM_OBJECT(bombspot, AActor); + PARAM_OBJECT(bombsource, AActor); + PARAM_INT(bombdamage); + PARAM_INT(bombdistance); + PARAM_NAME(damagetype); + PARAM_INT(fulldamagedistance); + P_GeometryRadiusAttack(bombspot, bombsource, bombdamage, bombdistance, damagetype, fulldamagedistance); + return 0; +} + +DEFINE_ACTION_FUNCTION(FDestructible, ProjectileHitLinedef) +{ + PARAM_PROLOGUE; + PARAM_OBJECT(projectile, AActor); + PARAM_POINTER(def, line_t); + ACTION_RETURN_BOOL(P_ProjectileHitLinedef(projectile, def)); +} + +DEFINE_ACTION_FUNCTION(FDestructible, ProjectileHitPlane) +{ + PARAM_PROLOGUE; + PARAM_OBJECT(projectile, AActor); + PARAM_INT(part); + ACTION_RETURN_BOOL(P_ProjectileHitPlane(projectile, part)); +} + +DEFINE_ACTION_FUNCTION(FDestructible, CheckLinedefVulnerable) +{ + PARAM_PROLOGUE; + PARAM_POINTER(def, line_t); + PARAM_INT(side); + PARAM_INT(part); + ACTION_RETURN_BOOL(P_CheckLinedefVulnerable(def, side, part)); +} + +DEFINE_ACTION_FUNCTION(FDestructible, CheckSectorVulnerable) +{ + PARAM_PROLOGUE; + PARAM_POINTER(sec, sector_t); + PARAM_INT(part); + ACTION_RETURN_BOOL(P_CheckSectorVulnerable(sec, part)); +} + +DEFINE_ACTION_FUNCTION(_Line, GetHealth) +{ + PARAM_SELF_STRUCT_PROLOGUE(line_t); + if (self->healthgroup) + { + FHealthGroup* grp = P_GetHealthGroup(self->healthgroup); + if (grp) ACTION_RETURN_INT(grp->health); + } + + ACTION_RETURN_INT(self->health); +} + +DEFINE_ACTION_FUNCTION(_Line, SetHealth) +{ + PARAM_SELF_STRUCT_PROLOGUE(line_t); + PARAM_INT(newhealth); + + if (newhealth < 0) + newhealth = 0; + + self->health = newhealth; + if (self->healthgroup) + { + FHealthGroup* grp = P_GetHealthGroup(self->healthgroup); + if (grp) P_SetHealthGroupHealth(grp, newhealth); + } + + return 0; +} + +DEFINE_ACTION_FUNCTION(_Sector, GetHealth) +{ + PARAM_SELF_STRUCT_PROLOGUE(sector_t); + PARAM_INT(part); + + FHealthGroup* grp; + switch (part) + { + case SECPART_Floor: + ACTION_RETURN_INT((self->healthfloorgroup && (grp = P_GetHealthGroup(self->healthfloorgroup))) ? grp->health : self->healthfloor); + case SECPART_Ceiling: + ACTION_RETURN_INT((self->healthceilinggroup && (grp = P_GetHealthGroup(self->healthceilinggroup))) ? grp->health : self->healthceiling); + case SECPART_3D: + ACTION_RETURN_INT((self->health3dgroup && (grp = P_GetHealthGroup(self->health3dgroup))) ? grp->health : self->health3d); + default: + ACTION_RETURN_INT(0); + } +} + +DEFINE_ACTION_FUNCTION(_Sector, SetHealth) +{ + PARAM_SELF_STRUCT_PROLOGUE(sector_t); + PARAM_INT(part); + PARAM_INT(newhealth); + + if (newhealth < 0) + newhealth = 0; + + int group; + int* health; + switch (part) + { + case SECPART_Floor: + group = self->healthfloorgroup; + health = &self->healthfloor; + break; + case SECPART_Ceiling: + group = self->healthceilinggroup; + health = &self->healthceiling; + break; + case SECPART_3D: + group = self->health3dgroup; + health = &self->health3d; + break; + default: + return 0; + } + + FHealthGroup* grp = group ? P_GetHealthGroup(group) : nullptr; + *health = newhealth; + if (grp) P_SetHealthGroupHealth(grp, newhealth); + return 0; +} \ No newline at end of file diff --git a/p_destructible.h b/p_destructible.h new file mode 100644 index 000000000..bd6423323 --- /dev/null +++ b/p_destructible.h @@ -0,0 +1,43 @@ +#pragma once + +#include "tarray.h" +#include "r_defs.h" +#include "p_trace.h" + +// [ZZ] Destructible geometry related +struct FHealthGroup +{ + TArray sectors; + TArray lines; + int health; + int id; +}; + +// for P_DamageSector +enum +{ + SECPART_Floor = 0, + SECPART_Ceiling = 1, + SECPART_3D = 2 +}; + + +void P_SetHealthGroupHealth(FHealthGroup* group, int health); +void P_SetHealthGroupHealth(FLevelLocals *Level, int group, int health); + +void P_InitHealthGroups(FLevelLocals *Level); +FHealthGroup* P_GetHealthGroup(FLevelLocals *Level, int id); +FHealthGroup* P_GetHealthGroupOrNew(FLevelLocals *Level, int id, int startinghealth); + +void P_DamageSector(sector_t* sector, AActor* source, int damage, FName damagetype, int part, DVector3 position, bool isradius, bool dogroups); +void P_DamageLinedef(line_t* line, AActor* source, int damage, FName damagetype, int side, DVector3 position, bool isradius, bool dogroups); + +void P_GeometryLineAttack(FTraceResults& trace, AActor* thing, int damage, FName damageType); +void P_GeometryRadiusAttack(AActor* bombspot, AActor* bombsource, int bombdamage, int bombdistance, FName damagetype, int fulldamagedistance); +bool P_ProjectileHitLinedef(AActor* projectile, line_t* line); +bool P_ProjectileHitPlane(AActor* projectile, int part); + +bool P_CheckLinedefVulnerable(line_t* line, int side, int part = -1); +bool P_CheckSectorVulnerable(sector_t* sector, int part); + +void P_SerializeHealthGroups(FSerializer& arc); \ No newline at end of file diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index dff262f26..3c59a8c37 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -875,7 +875,6 @@ set( FASTMATH_SOURCES ) set (PCH_SOURCES - actorptrselect.cpp am_map.cpp b_bot.cpp b_func.cpp @@ -908,7 +907,6 @@ set (PCH_SOURCES dobjgc.cpp dobjtype.cpp doomstat.cpp - dthinker.cpp f_wipe.cpp g_cvars.cpp g_doomedmap.cpp @@ -934,8 +932,6 @@ set (PCH_SOURCES m_joy.cpp m_misc.cpp name.cpp - p_3dfloors.cpp - p_3dmidtex.cpp p_acs.cpp p_actionfunctions.cpp p_conversation.cpp @@ -943,7 +939,6 @@ set (PCH_SOURCES p_effect.cpp p_enemy.cpp p_interaction.cpp - p_linkedsectors.cpp p_lnspec.cpp p_map.cpp p_maputl.cpp @@ -957,13 +952,10 @@ set (PCH_SOURCES p_terrain.cpp p_things.cpp p_tick.cpp - p_trace.cpp p_usdf.cpp p_user.cpp p_xlat.cpp parsecontext.cpp - po_man.cpp - portal.cpp r_utility.cpp r_sky.cpp r_videoscale.cpp @@ -1020,6 +1012,14 @@ set (PCH_SOURCES g_shared/p_switch.cpp g_shared/p_tags.cpp g_shared/p_teleport.cpp + g_shared/actorptrselect.cpp + g_shared/dthinker.cpp + g_shared/p_3dfloors.cpp + g_shared/p_3dmidtex.cpp + g_shared/p_linkedsectors.cpp + g_shared/p_trace.cpp + g_shared/po_man.cpp + g_shared/portal.cpp g_statusbar/hudmessages.cpp g_statusbar/shared_hud.cpp g_statusbar/sbarinfo.cpp diff --git a/src/actorptrselect.cpp b/src/g_shared/actorptrselect.cpp similarity index 100% rename from src/actorptrselect.cpp rename to src/g_shared/actorptrselect.cpp diff --git a/src/actorptrselect.h b/src/g_shared/actorptrselect.h similarity index 100% rename from src/actorptrselect.h rename to src/g_shared/actorptrselect.h diff --git a/src/dthinker.cpp b/src/g_shared/dthinker.cpp similarity index 100% rename from src/dthinker.cpp rename to src/g_shared/dthinker.cpp diff --git a/src/dthinker.h b/src/g_shared/dthinker.h similarity index 100% rename from src/dthinker.h rename to src/g_shared/dthinker.h diff --git a/src/p_3dfloors.cpp b/src/g_shared/p_3dfloors.cpp similarity index 100% rename from src/p_3dfloors.cpp rename to src/g_shared/p_3dfloors.cpp diff --git a/src/p_3dfloors.h b/src/g_shared/p_3dfloors.h similarity index 100% rename from src/p_3dfloors.h rename to src/g_shared/p_3dfloors.h diff --git a/src/p_3dmidtex.cpp b/src/g_shared/p_3dmidtex.cpp similarity index 100% rename from src/p_3dmidtex.cpp rename to src/g_shared/p_3dmidtex.cpp diff --git a/src/p_3dmidtex.h b/src/g_shared/p_3dmidtex.h similarity index 100% rename from src/p_3dmidtex.h rename to src/g_shared/p_3dmidtex.h diff --git a/src/p_linkedsectors.cpp b/src/g_shared/p_linkedsectors.cpp similarity index 100% rename from src/p_linkedsectors.cpp rename to src/g_shared/p_linkedsectors.cpp diff --git a/src/p_trace.cpp b/src/g_shared/p_trace.cpp similarity index 100% rename from src/p_trace.cpp rename to src/g_shared/p_trace.cpp diff --git a/src/p_trace.h b/src/g_shared/p_trace.h similarity index 100% rename from src/p_trace.h rename to src/g_shared/p_trace.h diff --git a/src/po_man.cpp b/src/g_shared/po_man.cpp similarity index 100% rename from src/po_man.cpp rename to src/g_shared/po_man.cpp diff --git a/src/po_man.h b/src/g_shared/po_man.h similarity index 100% rename from src/po_man.h rename to src/g_shared/po_man.h diff --git a/src/portal.cpp b/src/g_shared/portal.cpp similarity index 100% rename from src/portal.cpp rename to src/g_shared/portal.cpp diff --git a/src/portal.h b/src/g_shared/portal.h similarity index 100% rename from src/portal.h rename to src/g_shared/portal.h From ba451b46c8c4324132999b9d03de4447caa6911c Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 1 Feb 2019 01:18:32 +0100 Subject: [PATCH 134/164] - moved a bunch of files to the utility folder. --- src/CMakeLists.txt | 28 ++++++++++++++-------------- src/{ => utility}/cmdlib.cpp | 0 src/{ => utility}/cmdlib.h | 0 src/{ => utility}/colormatcher.cpp | 0 src/{ => utility}/colormatcher.h | 0 src/{ => utility}/configfile.cpp | 0 src/{ => utility}/configfile.h | 0 src/{ => utility}/i_module.cpp | 0 src/{ => utility}/i_module.h | 0 src/{ => utility}/i_time.cpp | 0 src/{ => utility}/i_time.h | 0 src/{ => utility}/lists.h | 0 src/{ => utility}/m_alloc.cpp | 0 src/{ => utility}/m_alloc.h | 0 src/{ => utility}/m_argv.cpp | 0 src/{ => utility}/m_argv.h | 0 src/{ => utility}/m_bbox.cpp | 0 src/{ => utility}/m_bbox.h | 0 src/{ => utility}/m_crc32.h | 0 src/{ => utility}/m_fixed.h | 0 src/{ => utility}/name.cpp | 0 src/{ => utility}/name.h | 0 src/{ => utility}/namedef.h | 0 src/{ => utility}/s_playlist.cpp | 0 src/{ => utility}/s_playlist.h | 0 src/{ => utility}/tarray.h | 0 src/{ => utility}/v_collection.cpp | 0 src/{ => utility}/v_collection.h | 0 src/{ => utility}/vectors.h | 0 src/{ => utility}/weightedlist.h | 0 src/{ => utility}/x86.cpp | 0 src/{ => utility}/x86.h | 0 src/{ => utility}/zstrformat.cpp | 0 src/{ => utility}/zstring.cpp | 0 src/{ => utility}/zstring.h | 0 35 files changed, 14 insertions(+), 14 deletions(-) rename src/{ => utility}/cmdlib.cpp (100%) rename src/{ => utility}/cmdlib.h (100%) rename src/{ => utility}/colormatcher.cpp (100%) rename src/{ => utility}/colormatcher.h (100%) rename src/{ => utility}/configfile.cpp (100%) rename src/{ => utility}/configfile.h (100%) rename src/{ => utility}/i_module.cpp (100%) rename src/{ => utility}/i_module.h (100%) rename src/{ => utility}/i_time.cpp (100%) rename src/{ => utility}/i_time.h (100%) rename src/{ => utility}/lists.h (100%) rename src/{ => utility}/m_alloc.cpp (100%) rename src/{ => utility}/m_alloc.h (100%) rename src/{ => utility}/m_argv.cpp (100%) rename src/{ => utility}/m_argv.h (100%) rename src/{ => utility}/m_bbox.cpp (100%) rename src/{ => utility}/m_bbox.h (100%) rename src/{ => utility}/m_crc32.h (100%) rename src/{ => utility}/m_fixed.h (100%) rename src/{ => utility}/name.cpp (100%) rename src/{ => utility}/name.h (100%) rename src/{ => utility}/namedef.h (100%) rename src/{ => utility}/s_playlist.cpp (100%) rename src/{ => utility}/s_playlist.h (100%) rename src/{ => utility}/tarray.h (100%) rename src/{ => utility}/v_collection.cpp (100%) rename src/{ => utility}/v_collection.h (100%) rename src/{ => utility}/vectors.h (100%) rename src/{ => utility}/weightedlist.h (100%) rename src/{ => utility}/x86.cpp (100%) rename src/{ => utility}/x86.h (100%) rename src/{ => utility}/zstrformat.cpp (100%) rename src/{ => utility}/zstring.cpp (100%) rename src/{ => utility}/zstring.h (100%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3c59a8c37..cd4d922df 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -890,9 +890,6 @@ set (PCH_SOURCES c_dispatch.cpp c_expr.cpp c_functions.cpp - cmdlib.cpp - colormatcher.cpp - configfile.cpp ct_chat.cpp cycler.cpp d_dehacked.cpp @@ -920,18 +917,12 @@ set (PCH_SOURCES gi.cpp gitinfo.cpp hu_scores.cpp - i_module.cpp i_net.cpp - i_time.cpp info.cpp keysections.cpp - m_alloc.cpp - m_argv.cpp - m_bbox.cpp m_cheat.cpp m_joy.cpp m_misc.cpp - name.cpp p_acs.cpp p_actionfunctions.cpp p_conversation.cpp @@ -961,7 +952,6 @@ set (PCH_SOURCES r_videoscale.cpp s_advsound.cpp s_environment.cpp - s_playlist.cpp s_sndseq.cpp s_sound.cpp serializer.cpp @@ -974,7 +964,6 @@ set (PCH_SOURCES umapinfo.cpp v_2ddrawer.cpp v_blend.cpp - v_collection.cpp v_draw.cpp v_font.cpp v_framebuffer.cpp @@ -984,7 +973,6 @@ set (PCH_SOURCES v_video.cpp w_wad.cpp wi_stuff.cpp - zstrformat.cpp g_inventory/a_keys.cpp g_inventory/a_pickups.cpp g_inventory/a_weapons.cpp @@ -1262,6 +1250,18 @@ set (PCH_SOURCES utility/nodebuilder/nodebuild_gl.cpp utility/nodebuilder/nodebuild_utility.cpp utility/sc_man.cpp + utility/cmdlib.cpp + utility/colormatcher.cpp + utility/configfile.cpp + utility/i_module.cpp + utility/i_time.cpp + utility/m_alloc.cpp + utility/m_argv.cpp + utility/m_bbox.cpp + utility/name.cpp + utility/s_playlist.cpp + utility/v_collection.cpp + utility/zstrformat.cpp ) enable_precompiled_headers( g_pch.h PCH_SOURCES ) @@ -1274,9 +1274,9 @@ add_executable( zdoom WIN32 MACOSX_BUNDLE ${X86_SOURCES} ${FASTMATH_SOURCES} ${PCH_SOURCES} - x86.cpp + utility/x86.cpp utility/strnatcmp.c - zstring.cpp + utility/zstring.cpp utility/math/asin.c utility/math/atan.c utility/math/const.c diff --git a/src/cmdlib.cpp b/src/utility/cmdlib.cpp similarity index 100% rename from src/cmdlib.cpp rename to src/utility/cmdlib.cpp diff --git a/src/cmdlib.h b/src/utility/cmdlib.h similarity index 100% rename from src/cmdlib.h rename to src/utility/cmdlib.h diff --git a/src/colormatcher.cpp b/src/utility/colormatcher.cpp similarity index 100% rename from src/colormatcher.cpp rename to src/utility/colormatcher.cpp diff --git a/src/colormatcher.h b/src/utility/colormatcher.h similarity index 100% rename from src/colormatcher.h rename to src/utility/colormatcher.h diff --git a/src/configfile.cpp b/src/utility/configfile.cpp similarity index 100% rename from src/configfile.cpp rename to src/utility/configfile.cpp diff --git a/src/configfile.h b/src/utility/configfile.h similarity index 100% rename from src/configfile.h rename to src/utility/configfile.h diff --git a/src/i_module.cpp b/src/utility/i_module.cpp similarity index 100% rename from src/i_module.cpp rename to src/utility/i_module.cpp diff --git a/src/i_module.h b/src/utility/i_module.h similarity index 100% rename from src/i_module.h rename to src/utility/i_module.h diff --git a/src/i_time.cpp b/src/utility/i_time.cpp similarity index 100% rename from src/i_time.cpp rename to src/utility/i_time.cpp diff --git a/src/i_time.h b/src/utility/i_time.h similarity index 100% rename from src/i_time.h rename to src/utility/i_time.h diff --git a/src/lists.h b/src/utility/lists.h similarity index 100% rename from src/lists.h rename to src/utility/lists.h diff --git a/src/m_alloc.cpp b/src/utility/m_alloc.cpp similarity index 100% rename from src/m_alloc.cpp rename to src/utility/m_alloc.cpp diff --git a/src/m_alloc.h b/src/utility/m_alloc.h similarity index 100% rename from src/m_alloc.h rename to src/utility/m_alloc.h diff --git a/src/m_argv.cpp b/src/utility/m_argv.cpp similarity index 100% rename from src/m_argv.cpp rename to src/utility/m_argv.cpp diff --git a/src/m_argv.h b/src/utility/m_argv.h similarity index 100% rename from src/m_argv.h rename to src/utility/m_argv.h diff --git a/src/m_bbox.cpp b/src/utility/m_bbox.cpp similarity index 100% rename from src/m_bbox.cpp rename to src/utility/m_bbox.cpp diff --git a/src/m_bbox.h b/src/utility/m_bbox.h similarity index 100% rename from src/m_bbox.h rename to src/utility/m_bbox.h diff --git a/src/m_crc32.h b/src/utility/m_crc32.h similarity index 100% rename from src/m_crc32.h rename to src/utility/m_crc32.h diff --git a/src/m_fixed.h b/src/utility/m_fixed.h similarity index 100% rename from src/m_fixed.h rename to src/utility/m_fixed.h diff --git a/src/name.cpp b/src/utility/name.cpp similarity index 100% rename from src/name.cpp rename to src/utility/name.cpp diff --git a/src/name.h b/src/utility/name.h similarity index 100% rename from src/name.h rename to src/utility/name.h diff --git a/src/namedef.h b/src/utility/namedef.h similarity index 100% rename from src/namedef.h rename to src/utility/namedef.h diff --git a/src/s_playlist.cpp b/src/utility/s_playlist.cpp similarity index 100% rename from src/s_playlist.cpp rename to src/utility/s_playlist.cpp diff --git a/src/s_playlist.h b/src/utility/s_playlist.h similarity index 100% rename from src/s_playlist.h rename to src/utility/s_playlist.h diff --git a/src/tarray.h b/src/utility/tarray.h similarity index 100% rename from src/tarray.h rename to src/utility/tarray.h diff --git a/src/v_collection.cpp b/src/utility/v_collection.cpp similarity index 100% rename from src/v_collection.cpp rename to src/utility/v_collection.cpp diff --git a/src/v_collection.h b/src/utility/v_collection.h similarity index 100% rename from src/v_collection.h rename to src/utility/v_collection.h diff --git a/src/vectors.h b/src/utility/vectors.h similarity index 100% rename from src/vectors.h rename to src/utility/vectors.h diff --git a/src/weightedlist.h b/src/utility/weightedlist.h similarity index 100% rename from src/weightedlist.h rename to src/utility/weightedlist.h diff --git a/src/x86.cpp b/src/utility/x86.cpp similarity index 100% rename from src/x86.cpp rename to src/utility/x86.cpp diff --git a/src/x86.h b/src/utility/x86.h similarity index 100% rename from src/x86.h rename to src/utility/x86.h diff --git a/src/zstrformat.cpp b/src/utility/zstrformat.cpp similarity index 100% rename from src/zstrformat.cpp rename to src/utility/zstrformat.cpp diff --git a/src/zstring.cpp b/src/utility/zstring.cpp similarity index 100% rename from src/zstring.cpp rename to src/utility/zstring.cpp diff --git a/src/zstring.h b/src/utility/zstring.h similarity index 100% rename from src/zstring.h rename to src/utility/zstring.h From e400137ffe1e646c2135fc14668ba85771727264 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Fri, 1 Feb 2019 10:09:36 +0200 Subject: [PATCH 135/164] - fixed compilation of Windows Debug targets src\sound\mididevices\music_opl_mididevice.cpp(112): error C3861: 'I_DebugPrint': identifier not found src\sound\mididevices\music_opl_mididevice.cpp(206): error C3861: 'I_DebugPrint': identifier not found src\sound\mididevices\music_opl_mididevice.cpp(234): error C3861: 'I_DebugPrint': identifier not found src\sound\mididevices\music_opl_mididevice.cpp(244): error C3861: 'I_DebugPrint': identifier not found --- src/sound/mididevices/music_opl_mididevice.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/sound/mididevices/music_opl_mididevice.cpp b/src/sound/mididevices/music_opl_mididevice.cpp index f588618b1..a740548b3 100644 --- a/src/sound/mididevices/music_opl_mididevice.cpp +++ b/src/sound/mididevices/music_opl_mididevice.cpp @@ -44,6 +44,7 @@ // MACROS ------------------------------------------------------------------ #if defined(_DEBUG) && defined(_WIN32) && defined(_MSC_VER) +void I_DebugPrint(const char *cp); #define DEBUGOUT(m,c,s,t) \ { char foo[128]; mysnprintf(foo, countof(foo), m, c, s, t); I_DebugPrint(foo); } #else From 5278274acf4b6f503b339589b449099ae256c135 Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Fri, 1 Feb 2019 10:37:05 +0200 Subject: [PATCH 136/164] - fixed compilation errors with POSIX targets MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit src/posix/cocoa/i_video.mm:559:2: error: use of undeclared identifier 'atterm' src/posix/sdl/hardware.cpp:85:28: error: ‘atterm’ was not declared in this scope src/posix/sdl/i_input.cpp:261:10: error: ‘gamestate’ was not declared in this scope src/posix/sdl/i_input.cpp:261:23: error: ‘GS_LEVEL’ was not declared in this scope src/posix/sdl/i_input.cpp:263:48: error: ‘GS_INTERMISSION’ was not declared in this scope src/posix/sdl/i_input.cpp:263:80: error: ‘GS_FINALE’ was not declared in this scope src/posix/sdl/i_system.cpp:115:25: error: ‘atterm’ was not declared in this scope src/posix/sdl/i_system.cpp:372:30: error: invalid use of incomplete type ‘const struct dirent’ src/posix/sdl/i_system.cpp:375:42: error: ‘findstate_t’ has not been declared src/posix/sdl/i_system.cpp:391:12: error: request for member ‘current’ in ‘* fileinfo’, which is of non-class type ‘int’ src/posix/sdl/i_system.cpp:392:12: error: request for member ‘count’ in ‘* fileinfo’, which is of non-class type ‘int’ src/posix/sdl/i_system.cpp:392:56: error: request for member ‘namelist’ in ‘* fileinfo’, which is of non-class type ‘int’ src/posix/sdl/i_system.cpp:393:22: error: ‘alphasort’ was not declared in this scope src/posix/sdl/i_system.cpp:393:31: error: ‘scandir’ was not declared in this scope src/posix/sdl/i_system.cpp:394:16: error: request for member ‘count’ in ‘* fileinfo’, which is of non-class type ‘int’ src/posix/sdl/i_system.cpp:401:31: error: ‘findstate_t’ has not been declared src/posix/sdl/i_system.cpp:403:2: error: ‘findstate_t’ was not declared in this scope src/posix/sdl/i_system.cpp:403:15: error: ‘state’ was not declared in this scope src/posix/sdl/i_system.cpp:403:37: error: expected primary-expression before ‘)’ token src/posix/sdl/i_system.cpp:404:33: error: request for member ‘count’ in ‘* fileinfo’, which is of non-class type ‘int’ src/posix/sdl/i_system.cpp:406:39: error: request for member ‘count’ in ‘* fileinfo’, which is of non-class type ‘int’ src/posix/sdl/i_system.cpp:413:2: error: ‘findstate_t’ was not declared in this scope src/posix/sdl/i_system.cpp:413:15: error: ‘state’ was not declared in this scope src/posix/sdl/i_system.cpp:413:37: error: expected primary-expression before ‘)’ token src/posix/sdl/i_system.cpp:425:16: error: ‘findstate_t’ was not declared in this scope src/posix/sdl/i_system.cpp:425:29: error: expected primary-expression before ‘const’ src/posix/sdl/i_system.cpp:426:1: error: expected ‘,’ or ‘;’ before ‘{’ token src/posix/sdl/i_main.cpp:160:6: error: ‘gamestate’ was not declared in this scope src/posix/sdl/i_main.cpp:160:19: error: ‘GS_LEVEL’ was not declared in this scope src/posix/sdl/i_main.cpp:160:44: error: ‘GS_TITLELEVEL’ was not declared in this scope src/posix/sdl/i_main.cpp:217:18: error: ‘atterm’ was not declared in this scope src/posix/sdl/i_main.cpp:242:11: error: ‘I_Quit’ was not declared in this scope src/gameconfigfile.cpp:126:27: error: ‘SHARE_DIR’ was not declared in this scope src/scripting/decorate/thingdef_parse.cpp:929:2: error: use of undeclared identifier 'strlwr'; did you mean 'strlen'? src/scripting/decorate/thingdef_parse.cpp:937:3: error: use of undeclared identifier 'strlwr'; did you mean 'strlen'? src/scripting/decorate/thingdef_states.cpp:564:2: error: use of undeclared identifier 'strlwr'; did you mean 'strlen'? src/scripting/vm/jit_runtime.cpp:957:2: error: ‘unique_ptr’ is not a member of ‘std’ src/scripting/vm/jit_runtime.cpp:957:38: error: expected primary-expression before ‘>’ token src/scripting/vm/jit_runtime.cpp:957:40: error: ‘nativeSymbols’ was not declared in this scope src/utility/cmdlib.cpp:962:2: error: ‘DIR’ was not declared in this scope src/utility/cmdlib.cpp:962:7: error: ‘directory’ was not declared in this scope src/utility/cmdlib.cpp:962:34: error: ‘opendir’ was not declared in this scope src/utility/cmdlib.cpp:967:33: error: ‘readdir’ was not declared in this scope src/utility/cmdlib.cpp:969:10: error: invalid use of incomplete type ‘struct ScanDirectory(TArray&, const char*)::dirent’ src/utility/cmdlib.cpp:973:34: error: invalid use of incomplete type ‘struct ScanDirectory(TArray&, const char*)::dirent’ src/utility/cmdlib.cpp:985:20: error: ‘closedir’ was not declared in this scope --- src/gameconfigfile.cpp | 3 +++ src/posix/cocoa/i_video.mm | 1 + src/posix/sdl/hardware.cpp | 1 + src/posix/sdl/i_input.cpp | 1 + src/posix/sdl/i_main.cpp | 2 ++ src/posix/sdl/i_system.cpp | 2 ++ src/scripting/decorate/thingdef_parse.cpp | 3 +++ src/scripting/decorate/thingdef_states.cpp | 3 +++ src/scripting/vm/jit_runtime.cpp | 1 + src/utility/cmdlib.cpp | 1 + 10 files changed, 18 insertions(+) diff --git a/src/gameconfigfile.cpp b/src/gameconfigfile.cpp index 3bd34fd15..ee52313ce 100644 --- a/src/gameconfigfile.cpp +++ b/src/gameconfigfile.cpp @@ -47,6 +47,9 @@ #include "doomstat.h" #include "gi.h" #include "d_main.h" +#if !defined _MSC_VER && !defined __APPLE__ +#include "i_system.h" // for SHARE_DIR +#endif // !_MSC_VER && !__APPLE__ EXTERN_CVAR (Bool, con_centernotify) EXTERN_CVAR (Int, msg0color) diff --git a/src/posix/cocoa/i_video.mm b/src/posix/cocoa/i_video.mm index 7b20907f2..0c1abb883 100644 --- a/src/posix/cocoa/i_video.mm +++ b/src/posix/cocoa/i_video.mm @@ -39,6 +39,7 @@ #include "c_dispatch.h" #include "doomstat.h" #include "hardware.h" +#include "i_system.h" #include "m_argv.h" #include "m_png.h" #include "r_renderer.h" diff --git a/src/posix/sdl/hardware.cpp b/src/posix/sdl/hardware.cpp index a26536538..61d36abf0 100644 --- a/src/posix/sdl/hardware.cpp +++ b/src/posix/sdl/hardware.cpp @@ -35,6 +35,7 @@ #include #include +#include "i_system.h" #include "hardware.h" #include "c_dispatch.h" #include "v_text.h" diff --git a/src/posix/sdl/i_input.cpp b/src/posix/sdl/i_input.cpp index cc40b4fde..70a636dc6 100644 --- a/src/posix/sdl/i_input.cpp +++ b/src/posix/sdl/i_input.cpp @@ -44,6 +44,7 @@ #include "c_dispatch.h" #include "dikeys.h" #include "events.h" +#include "g_game.h" static void I_CheckGUICapture (); static void I_CheckNativeMouse (); diff --git a/src/posix/sdl/i_main.cpp b/src/posix/sdl/i_main.cpp index 05b0e6425..4ea48c401 100644 --- a/src/posix/sdl/i_main.cpp +++ b/src/posix/sdl/i_main.cpp @@ -54,6 +54,8 @@ #include "doomstat.h" #include "vm.h" #include "doomerrors.h" +#include "i_system.h" +#include "g_game.h" // MACROS ------------------------------------------------------------------ diff --git a/src/posix/sdl/i_system.cpp b/src/posix/sdl/i_system.cpp index 8b73d2f14..9303fc6eb 100644 --- a/src/posix/sdl/i_system.cpp +++ b/src/posix/sdl/i_system.cpp @@ -19,7 +19,9 @@ //----------------------------------------------------------------------------- // +#include "i_system.h" +#include #include #include #include diff --git a/src/scripting/decorate/thingdef_parse.cpp b/src/scripting/decorate/thingdef_parse.cpp index 68ab70cac..6bc8074f3 100644 --- a/src/scripting/decorate/thingdef_parse.cpp +++ b/src/scripting/decorate/thingdef_parse.cpp @@ -48,6 +48,9 @@ #include "v_text.h" #include "m_argv.h" #include "v_video.h" +#ifndef _MSC_VER +#include "i_system.h" // for strlwr() +#endif // !_MSC_VER void ParseOldDecoration(FScanner &sc, EDefinitionType def, PNamespace *ns); EXTERN_CVAR(Bool, strictdecorate); diff --git a/src/scripting/decorate/thingdef_states.cpp b/src/scripting/decorate/thingdef_states.cpp index d03069775..cede46bdd 100644 --- a/src/scripting/decorate/thingdef_states.cpp +++ b/src/scripting/decorate/thingdef_states.cpp @@ -44,6 +44,9 @@ #include "p_local.h" #include "thingdef.h" #include "backend/codegen.h" +#ifndef _MSC_VER +#include "i_system.h" // for strlwr() +#endif // !_MSC_VER //========================================================================== //*** diff --git a/src/scripting/vm/jit_runtime.cpp b/src/scripting/vm/jit_runtime.cpp index 5ef0760d6..f72402404 100644 --- a/src/scripting/vm/jit_runtime.cpp +++ b/src/scripting/vm/jit_runtime.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #endif struct JitFuncInfo diff --git a/src/utility/cmdlib.cpp b/src/utility/cmdlib.cpp index 7a7436c19..2ed0eefe9 100644 --- a/src/utility/cmdlib.cpp +++ b/src/utility/cmdlib.cpp @@ -26,6 +26,7 @@ #include #include #else +#include #include #include #include From de24fc2c888af15248180a5498a00f207e87f02a Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 1 Feb 2019 01:37:09 +0100 Subject: [PATCH 137/164] - do not call renderer code directly to reset the view interpolation The playsim really has no idea what the renderer is supposed to do here and the current system has some serious issues that eventually need addressing. So it is better to just set a flag that an actor needs to have its view interpolation reset if being used as a camera and let the render code deal with it. This will keep the playsim clean of future changes to this feature. --- src/actor.h | 1 + src/fragglescript/t_func.cpp | 2 +- src/g_shared/p_teleport.cpp | 5 +---- src/p_map.cpp | 15 ++++++--------- src/p_things.cpp | 5 +---- src/r_utility.cpp | 3 ++- 6 files changed, 12 insertions(+), 19 deletions(-) diff --git a/src/actor.h b/src/actor.h index c82b5de75..6070c7b16 100644 --- a/src/actor.h +++ b/src/actor.h @@ -452,6 +452,7 @@ enum ActorRenderFlag RF_SPRITEFLIP = 0x08000000, // sprite flipped on x-axis RF_ZDOOMTRANS = 0x10000000, // is not normally transparent in Vanilla Doom + RF_NOINTERPOLATEVIEW = 0x40000000, // don't interpolate the view next frame if this actor is a camera. }; // This translucency value produces the closest match to Heretic's TINTTAB. diff --git a/src/fragglescript/t_func.cpp b/src/fragglescript/t_func.cpp index c2843665b..082f3115e 100644 --- a/src/fragglescript/t_func.cpp +++ b/src/fragglescript/t_func.cpp @@ -1423,7 +1423,7 @@ void FParser::SF_SetCamera(void) if (t_argc < 4) newcamera->Angles.Pitch = 0.; else newcamera->Angles.Pitch = clamp(floatvalue(t_argv[3]), -50., 50.) * (20. / 32.); player->camera=newcamera; - R_ResetViewInterpolation(); + newcamera->renderflags |= RF_NOINTERPOLATEVIEW; } } diff --git a/src/g_shared/p_teleport.cpp b/src/g_shared/p_teleport.cpp index a426a4edd..cf5743177 100644 --- a/src/g_shared/p_teleport.cpp +++ b/src/g_shared/p_teleport.cpp @@ -562,10 +562,7 @@ bool FLevelLocals::EV_SilentLineTeleport (line_t *line, int side, AActor *thing, return false; } - if (thing == players[consoleplayer].camera) - { - R_ResetViewInterpolation (); - } + thing->renderflags |= RF_NOINTERPOLATEVIEW; // Rotate thing's orientation according to difference in linedef angles thing->Angles.Yaw += angle; diff --git a/src/p_map.cpp b/src/p_map.cpp index ebdd82434..edcc6161e 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -508,10 +508,7 @@ bool P_TeleportMove(AActor* thing, const DVector3 &pos, bool telefrag, bool modi thing->AdjustFloorClip(); } - if (thing == players[consoleplayer].camera) - { - R_ResetViewInterpolation(); - } + thing->renderflags |= RF_NOINTERPOLATEVIEW; // If this teleport was caused by a move, P_TryMove() will handle the // sector transition messages better than we can here. @@ -6274,7 +6271,7 @@ int P_PushUp(AActor *thing, FChangePosition *cpos) if (cpos->instant) { intersect->Prev.Z += intersect->Z() - oldz; - if (intersect->CheckLocalView()) R_ResetViewInterpolation(); + intersect->renderflags |= RF_NOINTERPOLATEVIEW; } intersect->UpdateRenderSectorList(); @@ -6371,7 +6368,7 @@ void PIT_FloorDrop(AActor *thing, FChangePosition *cpos) if (cpos->instant) { thing->Prev.Z += thing->floorz - oldz; - if (thing->CheckLocalView()) R_ResetViewInterpolation(); + thing->renderflags |= RF_NOINTERPOLATEVIEW; } thing->SetZ(thing->floorz); P_CheckFakeFloorTriggers(thing, oldz); @@ -6385,7 +6382,7 @@ void PIT_FloorDrop(AActor *thing, FChangePosition *cpos) if (cpos->instant) { thing->Prev.Z += -oldfloorz + thing->floorz; - if (thing->CheckLocalView()) R_ResetViewInterpolation(); + thing->renderflags |= RF_NOINTERPOLATEVIEW; } thing->AddZ(-oldfloorz + thing->floorz); P_CheckFakeFloorTriggers(thing, oldz); @@ -6425,7 +6422,7 @@ void PIT_FloorRaise(AActor *thing, FChangePosition *cpos) if (cpos->instant) { thing->Prev.Z += thing->floorz - thing->Z(); - if (thing->CheckLocalView()) R_ResetViewInterpolation(); + thing->renderflags |= RF_NOINTERPOLATEVIEW; } thing->SetZ(thing->floorz); @@ -6439,7 +6436,7 @@ void PIT_FloorRaise(AActor *thing, FChangePosition *cpos) if (cpos->instant) { thing->Prev.Z += -oldfloorz + thing->floorz; - if (thing->CheckLocalView()) R_ResetViewInterpolation(); + thing->renderflags |= RF_NOINTERPOLATEVIEW; } } else return; diff --git a/src/p_things.cpp b/src/p_things.cpp index 7f72ed19d..9ef689e9c 100644 --- a/src/p_things.cpp +++ b/src/p_things.cpp @@ -131,10 +131,7 @@ bool P_MoveThing(AActor *source, const DVector3 &pos, bool fog) P_SpawnTeleportFog(source, old, true, true); } source->ClearInterpolation(); - if (source == players[consoleplayer].camera) - { - R_ResetViewInterpolation(); - } + source->renderflags |= RF_NOINTERPOLATEVIEW; return true; } else diff --git a/src/r_utility.cpp b/src/r_utility.cpp index 3d314d34c..d77915617 100644 --- a/src/r_utility.cpp +++ b/src/r_utility.cpp @@ -815,8 +815,9 @@ void R_SetupFrame (FRenderViewpoint &viewpoint, FViewWindow &viewwindow, AActor player = viewpoint.camera->player; } - if (iview->otic == -1 || r_NoInterpolate) + if (iview->otic == -1 || r_NoInterpolate || (viewpoint.camera->renderflags & RF_NOINTERPOLATEVIEW)) { + viewpoint.camera->renderflags &= ~RF_NOINTERPOLATEVIEW; R_ResetViewInterpolation (); iview->otic = nowtic; } From 2903025268686a9c2d3200066d9d14a8e6fbaec9 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 1 Feb 2019 12:31:08 +0100 Subject: [PATCH 138/164] - a few minor fixes. --- src/p_acs.cpp | 4 ++-- src/p_conversation.cpp | 2 +- src/p_effect.cpp | 27 ++++++++++++++++++--------- src/p_enemy.cpp | 4 ++-- src/p_mobj.cpp | 9 ++++++--- 5 files changed, 29 insertions(+), 17 deletions(-) diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 723f89c67..e4d58b23f 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -8623,8 +8623,8 @@ scriptwait: { screen = screen->target; } - if (pcd == PCD_ENDHUDMESSAGEBOLD || screen == NULL || - players[consoleplayer].mo == screen) + if (Level->isPrimaryLevel() && (pcd == PCD_ENDHUDMESSAGEBOLD || screen == NULL || + players[consoleplayer].mo == screen)) { int type = Stack[optstart-6]; int id = Stack[optstart-5]; diff --git a/src/p_conversation.cpp b/src/p_conversation.cpp index ff5f8241e..dd84bad64 100644 --- a/src/p_conversation.cpp +++ b/src/p_conversation.cpp @@ -739,7 +739,7 @@ void P_StartConversation (AActor *npc, AActor *pc, bool facetalker, bool saveang int i; // Make sure this is actually a player. - if (pc == nullptr || pc->player == nullptr || npc == nullptr || pc->Level != currentUILevel) return; + if (pc == nullptr || pc->player == nullptr || npc == nullptr || !pc->Level->isPrimaryLevel()) return; auto Level = pc->Level; // [CW] If an NPC is talking to a PC already, then don't let diff --git a/src/p_effect.cpp b/src/p_effect.cpp index 82c4e40b1..1f3af0059 100644 --- a/src/p_effect.cpp +++ b/src/p_effect.cpp @@ -631,14 +631,23 @@ void P_DrawRailTrail(AActor *source, TArray &portalhits, int color1, seg.extend = (tempvec - (seg.dir | tempvec) * seg.dir) * 3; length += seg.length; - // Only consider sound in 2D (for now, anyway) - // [BB] You have to divide by lengthsquared here, not multiply with it. - AActor *mo = players[consoleplayer].camera; - - double r = ((seg.start.Y - mo->Y()) * (-seg.dir.Y) - (seg.start.X - mo->X()) * (seg.dir.X)) / (seg.length * seg.length); - r = clamp(r, 0., 1.); - seg.soundpos = seg.start + r * seg.dir; - seg.sounddist = (seg.soundpos - mo->Pos()).LengthSquared(); + if (source->Level->isPrimaryLevel()) + { + // Only consider sound in 2D (for now, anyway) + // [BB] You have to divide by lengthsquared here, not multiply with it. + AActor *mo = players[consoleplayer].camera; + + double r = ((seg.start.Y - mo->Y()) * (-seg.dir.Y) - (seg.start.X - mo->X()) * (seg.dir.X)) / (seg.length * seg.length); + r = clamp(r, 0., 1.); + seg.soundpos = seg.start + r * seg.dir; + seg.sounddist = (seg.soundpos - mo->Pos()).LengthSquared(); + } + else + { + // Set to invalid for secondary levels. + seg.soundpos = {0,0}; + seg.sounddist = -1; + } trail.Push(seg); } @@ -647,7 +656,7 @@ void P_DrawRailTrail(AActor *source, TArray &portalhits, int color1, if (steps) { - if (!(flags & RAF_SILENT)) + if (!(flags & RAF_SILENT) && source->Level->isPrimaryLevel()) { FSoundID sound; diff --git a/src/p_enemy.cpp b/src/p_enemy.cpp index ade5c445a..b53cd8d18 100644 --- a/src/p_enemy.cpp +++ b/src/p_enemy.cpp @@ -997,7 +997,7 @@ void P_RandomChaseDir (AActor *actor) if (actor->FriendPlayer != 0) { - player = players[i = actor->FriendPlayer - 1].mo; + player = actor->Level->Players[i = actor->FriendPlayer - 1]->mo; } else { @@ -1600,7 +1600,7 @@ int P_LookForPlayers (AActor *actor, INTBOOL allaround, FLookExParams *params) actor->IsFriend(p->mo) && (anyone || P_IsVisible(actor, p->mo, allaround))) { - actor->target = players[c].mo; + actor->target = Level->Players[c]->mo; // killough 12/98: // get out of refiring loop, to avoid hitting player accidentally diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index a8aef7705..75a70ad5a 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -1040,22 +1040,25 @@ bool AActor::IsInsideVisibleAngles() const // // Returns true if this actor should be seen by the console player. // +// Not that even for secondary maps this must check the real player! +// //============================================================================ bool AActor::IsVisibleToPlayer() const { + auto &p = players[consoleplayer]; // [BB] Safety check. This should never be NULL. Nevertheless, we return true to leave the default ZDoom behavior unaltered. - if ( players[consoleplayer].camera == NULL ) + if ( p.camera == nullptr ) return true; if (VisibleToTeam != 0 && teamplay && - (signed)(VisibleToTeam-1) != players[consoleplayer].userinfo.GetTeam() ) + (signed)(VisibleToTeam-1) != p.userinfo.GetTeam() ) return false; auto &vis = GetInfo()->VisibleToPlayerClass; if (vis.Size() == 0) return true; // early out for the most common case. - const player_t* pPlayer = players[consoleplayer].camera->player; + const player_t* pPlayer = p.camera->player; if (pPlayer) { From d358e401ee1af272e4802ee772461bbb8eda66e1 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 1 Feb 2019 17:02:10 +0100 Subject: [PATCH 139/164] - removed all access to the consoleplayer variable from the play code There is one exception in ACS for a net arbitrator check. Aside from this the bot_observer CVAR was also removed. This was never implemented properly and could stomp upon custom player settings. --- src/b_bot.cpp | 1 - src/b_bot.h | 6 ----- src/b_func.cpp | 12 ---------- src/b_game.cpp | 19 --------------- src/g_levellocals.h | 24 +++++++++++++++++-- src/p_acs.cpp | 14 +++++------ src/p_conversation.cpp | 4 ++-- src/p_effect.cpp | 54 +++++++++++++++++++++++------------------- src/p_interaction.cpp | 4 ++-- src/p_lnspec.cpp | 8 +++---- src/p_map.cpp | 5 ++-- src/p_mobj.cpp | 44 +++++++++++++++++++--------------- src/p_pspr.cpp | 4 ---- src/p_saveg.cpp | 3 ++- src/p_setup.cpp | 3 ++- src/p_user.cpp | 6 ++--- 16 files changed, 101 insertions(+), 110 deletions(-) diff --git a/src/b_bot.cpp b/src/b_bot.cpp index 54e8991c4..6924c9c93 100644 --- a/src/b_bot.cpp +++ b/src/b_bot.cpp @@ -151,7 +151,6 @@ void DBot::Tick () } CVAR (Int, bot_next_color, 11, 0) -CVAR (Bool, bot_observer, false, 0) CCMD (addbot) { diff --git a/src/b_bot.h b/src/b_bot.h index b7a30d5eb..57323aada 100644 --- a/src/b_bot.h +++ b/src/b_bot.h @@ -159,7 +159,6 @@ private: protected: bool ctf; int t_join; - bool observer; //Consoleplayer is observer. }; class DBot : public DThinker @@ -242,10 +241,5 @@ extern cycle_t BotThinkCycles, BotSupportCycles; EXTERN_CVAR (Float, bot_flag_return_time) EXTERN_CVAR (Int, bot_next_color) -EXTERN_CVAR (Bool, bot_allow_duds) -EXTERN_CVAR (Int, bot_maxcorpses) -EXTERN_CVAR (Bool, bot_observer) -EXTERN_CVAR (Bool, bot_watersplash) -EXTERN_CVAR (Bool, bot_chat) #endif // __B_BOT_H__ diff --git a/src/b_func.cpp b/src/b_func.cpp index 9d0b015dd..207d4454b 100644 --- a/src/b_func.cpp +++ b/src/b_func.cpp @@ -345,7 +345,6 @@ AActor *DBot::Choose_Mate () int count; double closest_dist, test; AActor *target; - AActor *observer; //is mate alive? if (mate) @@ -365,10 +364,6 @@ AActor *DBot::Choose_Mate () target = NULL; closest_dist = FLT_MAX; - if (bot_observer) - observer = players[consoleplayer].mo; - else - observer = NULL; //Check for player friends for (count = 0; count < MAXPLAYERS; count++) @@ -380,7 +375,6 @@ AActor *DBot::Choose_Mate () && player->mo != client->mo && (player->mo->IsTeammate (client->mo) || !deathmatch) && client->mo->health > 0 - && client->mo != observer && ((player->mo->health/2) <= client->mo->health || !deathmatch) && !Level->BotInfo.IsLeader(client)) //taken? { @@ -423,7 +417,6 @@ AActor *DBot::Find_enemy () double closest_dist, temp; //To target. AActor *target; DAngle vangle; - AActor *observer; if (!deathmatch) { // [RH] Take advantage of the Heretic/Hexen code to be a little smarter @@ -439,17 +432,12 @@ AActor *DBot::Find_enemy () target = NULL; closest_dist = FLT_MAX; - if (bot_observer) - observer = players[consoleplayer].mo; - else - observer = NULL; for (count = 0; count < MAXPLAYERS; count++) { player_t *client = &players[count]; if (playeringame[count] && !player->mo->IsTeammate (client->mo) - && client->mo != observer && client->mo->health > 0 && player->mo != client->mo) { diff --git a/src/b_game.cpp b/src/b_game.cpp index 603d7ecb8..2442eea5b 100644 --- a/src/b_game.cpp +++ b/src/b_game.cpp @@ -148,24 +148,6 @@ void FCajunMaster::Main(FLevelLocals *Level) //Check if player should go observer. Or un observe FLinkContext ctx; - if (bot_observer && !observer && !netgame) - { - Printf ("%s is now observer\n", players[consoleplayer].userinfo.GetName()); - observer = true; - players[consoleplayer].mo->UnlinkFromWorld (&ctx); - players[consoleplayer].mo->flags = MF_DROPOFF|MF_NOBLOCKMAP|MF_NOCLIP|MF_NOTDMATCH|MF_NOGRAVITY|MF_FRIENDLY; - players[consoleplayer].mo->flags2 |= MF2_FLY; - players[consoleplayer].mo->LinkToWorld (&ctx); - } - else if (!bot_observer && observer && !netgame) //Go back - { - Printf ("%s returned to the fray\n", players[consoleplayer].userinfo.GetName()); - observer = false; - players[consoleplayer].mo->UnlinkFromWorld (&ctx); - players[consoleplayer].mo->flags = MF_SOLID|MF_SHOOTABLE|MF_DROPOFF|MF_PICKUP|MF_NOTDMATCH|MF_FRIENDLY; - players[consoleplayer].mo->flags2 &= ~MF2_FLY; - players[consoleplayer].mo->LinkToWorld (&ctx); - } } void FCajunMaster::Init () @@ -173,7 +155,6 @@ void FCajunMaster::Init () botnum = 0; firstthing = nullptr; spawn_tries = 0; - observer = false; body1 = nullptr; body2 = nullptr; diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 74011f9e1..b0229af5f 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -506,8 +506,8 @@ public: int bodyqueslot; // For now this merely points to the global player array, but with this in place, access to this array can be moved over to the level. - // As things progress each level needs to be able to point to different players, - // but even then the level will not own the player - the player merely links to the level. + // As things progress each level needs to be able to point to different players, even if they are just null if the second level is merely a skybox or camera target. + // But even if it got a real player, the level will not own it - the player merely links to the level. // This should also be made a real object eventually. player_t *Players[MAXPLAYERS]; @@ -540,6 +540,26 @@ public: { return true; } + + // Gets the console player without having the calling code be aware of the level's state. + player_t *GetConsolePlayer() const + { + return isPrimaryLevel()? Players[consoleplayer] : nullptr; + } + + bool isConsolePlayer(AActor *mo) const + { + auto p = GetConsolePlayer(); + if (!p) return false; + return p->mo == mo; + } + + bool isCamera(AActor *mo) const + { + auto p = GetConsolePlayer(); + if (!p) return false; + return p->camera == mo; + } int NumMapSections; diff --git a/src/p_acs.cpp b/src/p_acs.cpp index e4d58b23f..6706de0c2 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -4966,7 +4966,8 @@ int DLevelScript::SetUserCVar(int playernum, const char *cvarname, int value, bo { return 0; } - FBaseCVar **cvar_p = Level->Players[playernum]->userinfo.CheckKey(FName(cvarname, true)); + auto player = Level->Players[playernum]; + FBaseCVar **cvar_p = player->userinfo.CheckKey(FName(cvarname, true)); FBaseCVar *cvar; // Only mod-created cvars may be set. if (cvar_p == NULL || (cvar = *cvar_p) == NULL || (cvar->GetFlags() & CVAR_IGNORE) || !(cvar->GetFlags() & CVAR_MOD)) @@ -4976,7 +4977,7 @@ int DLevelScript::SetUserCVar(int playernum, const char *cvarname, int value, bo DoSetCVar(cvar, value, is_string); // If we are this player, then also reflect this change in the local version of this cvar. - if (playernum == consoleplayer && Level->isPrimaryLevel()) + if (player && player == Level->GetConsolePlayer()) { FBaseCVar *cvar = FindCVar(cvarname, NULL); // If we can find it in the userinfo, then we should also be able to find it in the normal cvar list, @@ -8623,8 +8624,7 @@ scriptwait: { screen = screen->target; } - if (Level->isPrimaryLevel() && (pcd == PCD_ENDHUDMESSAGEBOLD || screen == NULL || - players[consoleplayer].mo == screen)) + if (Level->isPrimaryLevel() && (pcd == PCD_ENDHUDMESSAGEBOLD || screen == NULL || Level->isConsolePlayer(screen))) { int type = Stack[optstart-6]; int id = Stack[optstart-5]; @@ -9307,7 +9307,7 @@ scriptwait: break; case PCD_LOCALSETMUSIC: - if (activator == players[consoleplayer].mo) + if (Level->isConsolePlayer(activator)) { S_ChangeMusic (Level->Behaviors.LookupString (STACK(3)), STACK(2)); } @@ -9315,7 +9315,7 @@ scriptwait: break; case PCD_LOCALSETMUSICDIRECT: - if (activator == players[consoleplayer].mo) + if (Level->isConsolePlayer(activator)) { S_ChangeMusic (Level->Behaviors.LookupString (TAGSTR(uallong(pc[0]))), uallong(pc[1])); } @@ -10402,7 +10402,7 @@ int P_StartScript (FLevelLocals *Level, AActor *who, line_t *where, int script, } else { - if (!(flags & ACS_NET) || (who && who->player == &players[consoleplayer])) + if (!(flags & ACS_NET) || (who && Level->isConsolePlayer(who->player->mo))) // The indirection is necessary here. { Printf("P_StartScript: Unknown %s\n", ScriptPresentation(script).GetChars()); } diff --git a/src/p_conversation.cpp b/src/p_conversation.cpp index dd84bad64..ccf43c9d9 100644 --- a/src/p_conversation.cpp +++ b/src/p_conversation.cpp @@ -763,7 +763,7 @@ void P_StartConversation (AActor *npc, AActor *pc, bool facetalker, bool saveang FStrifeDialogueNode *CurNode = npc->Conversation; - if (pc->player == &players[consoleplayer]) + if (pc->player == Level->GetConsolePlayer()) { S_Sound (CHAN_VOICE | CHAN_UI, gameinfo.chatSound, 1, ATTN_NONE); } @@ -811,7 +811,7 @@ void P_StartConversation (AActor *npc, AActor *pc, bool facetalker, bool saveang } // The rest is only done when the conversation is actually displayed. - if (pc->player == &players[consoleplayer]) + if (pc->player == Level->GetConsolePlayer()) { if (CurNode->SpeakerVoice != 0) { diff --git a/src/p_effect.cpp b/src/p_effect.cpp index 1f3af0059..8822868bd 100644 --- a/src/p_effect.cpp +++ b/src/p_effect.cpp @@ -631,12 +631,12 @@ void P_DrawRailTrail(AActor *source, TArray &portalhits, int color1, seg.extend = (tempvec - (seg.dir | tempvec) * seg.dir) * 3; length += seg.length; - if (source->Level->isPrimaryLevel()) + auto player = source->Level->GetConsolePlayer(); + if (player) { // Only consider sound in 2D (for now, anyway) // [BB] You have to divide by lengthsquared here, not multiply with it. - AActor *mo = players[consoleplayer].camera; - + AActor *mo = player->camera; double r = ((seg.start.Y - mo->Y()) * (-seg.dir.Y) - (seg.start.X - mo->X()) * (seg.dir.X)) / (seg.length * seg.length); r = clamp(r, 0., 1.); seg.soundpos = seg.start + r * seg.dir; @@ -656,32 +656,36 @@ void P_DrawRailTrail(AActor *source, TArray &portalhits, int color1, if (steps) { - if (!(flags & RAF_SILENT) && source->Level->isPrimaryLevel()) + if (!(flags & RAF_SILENT)) { - FSoundID sound; - - // Allow other sounds than 'weapons/railgf'! - if (!source->player) sound = source->AttackSound; - else if (source->player->ReadyWeapon) sound = source->player->ReadyWeapon->AttackSound; - else sound = 0; - if (!sound) sound = "weapons/railgf"; - - // The railgun's sound is special. It gets played from the - // point on the slug's trail that is closest to the hearing player. - AActor *mo = players[consoleplayer].camera; - - if (fabs(mo->X() - trail[0].start.X) < 20 && fabs(mo->Y() - trail[0].start.Y) < 20) - { // This player (probably) fired the railgun - S_Sound (mo, CHAN_WEAPON, sound, 1, ATTN_NORM); - } - else + auto player = source->Level->GetConsolePlayer(); + if (player) { - TrailSegment *shortest = NULL; - for (auto &seg : trail) + FSoundID sound; + + // Allow other sounds than 'weapons/railgf'! + if (!source->player) sound = source->AttackSound; + else if (source->player->ReadyWeapon) sound = source->player->ReadyWeapon->AttackSound; + else sound = 0; + if (!sound) sound = "weapons/railgf"; + + // The railgun's sound is special. It gets played from the + // point on the slug's trail that is closest to the hearing player. + AActor *mo = player->camera; + + if (fabs(mo->X() - trail[0].start.X) < 20 && fabs(mo->Y() - trail[0].start.Y) < 20) + { // This player (probably) fired the railgun + S_Sound (mo, CHAN_WEAPON, sound, 1, ATTN_NORM); + } + else { - if (shortest == NULL || shortest->sounddist > seg.sounddist) shortest = &seg; + TrailSegment *shortest = NULL; + for (auto &seg : trail) + { + if (shortest == NULL || shortest->sounddist > seg.sounddist) shortest = &seg; + } + S_Sound (source->Level, DVector3(shortest->soundpos, r_viewpoint.Pos.Z), CHAN_WEAPON, sound, 1, ATTN_NORM); } - S_Sound (source->Level, DVector3(shortest->soundpos, r_viewpoint.Pos.Z), CHAN_WEAPON, sound, 1, ATTN_NORM); } } } diff --git a/src/p_interaction.cpp b/src/p_interaction.cpp index d5fb79cc3..1a6fdbe4a 100644 --- a/src/p_interaction.cpp +++ b/src/p_interaction.cpp @@ -606,7 +606,7 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOf VMCall(func, ¶m, 1, nullptr, 0); } - if (this == players[consoleplayer].camera && automapactive) + if (Level->isCamera(this) && automapactive) { // don't die in auto map, switch view prior to dying AM_Stop (); @@ -1352,7 +1352,7 @@ static int DamageMobj (AActor *target, AActor *inflictor, AActor *source, int da player->damagecount = 100; // teleport stomp does 10k points... } temp = damage < 100 ? damage : 100; - if (player == &players[consoleplayer]) + if (player == target->Level->GetConsolePlayer() ) { I_Tactile (40,10,40+temp*2); } diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index 08513304b..63bdc8f15 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -2951,7 +2951,7 @@ FUNC(LS_SetPlayerProperty) item->ColorVar(NAME_BlendColor) = MakeSpecialColormap(INVERSECOLORMAP); } } - else if (it->player - players == consoleplayer) + else if (it->player && it->player == Level->GetConsolePlayer()) { Level->flags2 |= LEVEL2_ALLMAP; } @@ -2966,7 +2966,7 @@ FUNC(LS_SetPlayerProperty) item->Destroy (); } } - else if (it->player - players == consoleplayer) + else if (it->player && it->player == Level->GetConsolePlayer()) { Level->flags2 &= ~LEVEL2_ALLMAP; } @@ -2992,7 +2992,7 @@ FUNC(LS_SetPlayerProperty) item->ColorVar(NAME_BlendColor) = MakeSpecialColormap(INVERSECOLORMAP); } } - else if (i == consoleplayer) + else if (p == Level->GetConsolePlayer()) { Level->flags2 |= LEVEL2_ALLMAP; } @@ -3007,7 +3007,7 @@ FUNC(LS_SetPlayerProperty) item->Destroy (); } } - else if (i == consoleplayer) + else if (p == Level->GetConsolePlayer()) { Level->flags2 &= ~LEVEL2_ALLMAP; } diff --git a/src/p_map.cpp b/src/p_map.cpp index edcc6161e..e9639d5aa 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -2448,7 +2448,7 @@ bool P_TryMove(AActor *thing, const DVector2 &pos, } // if this is the current camera we need to store the point where the portal was crossed and the exit // so that the renderer can properly calculate an interpolated position along the movement path. - if (thing == players[consoleplayer].camera) + if (thing->Level->isCamera(thing)) { divline_t dl1 = { besthit.Oldrefpos.X,besthit.Oldrefpos.Y, besthit.Refpos.X - besthit.Oldrefpos.X, besthit.Refpos.Y - besthit.Oldrefpos.Y }; DVector3a hit = { {dl1.x + dl1.dx * bestfrac, dl1.y + dl1.dy * bestfrac, 0.},0. }; @@ -2463,7 +2463,8 @@ bool P_TryMove(AActor *thing, const DVector2 &pos, { P_TranslatePortalXY(ld, hit.pos.X, hit.pos.Y); P_TranslatePortalZ(ld, hit.pos.Z); - players[consoleplayer].viewz += hit.pos.Z; // needs to be done here because otherwise the renderer will not catch the change. + auto p = thing->Level->GetConsolePlayer(); + if (p) p->viewz += hit.pos.Z; // needs to be done here because otherwise the renderer will not catch the change. P_TranslatePortalAngle(ld, hit.angle); } R_AddInterpolationPoint(hit); diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 75a70ad5a..d414ee8d2 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -945,7 +945,11 @@ DEFINE_ACTION_FUNCTION(AActor, GiveBody) bool AActor::CheckLocalView() const { - auto p = &players[consoleplayer]; + auto p = Level->GetConsolePlayer(); + if (p == nullptr) + { + return false; + } if (p->camera == this) { return true; @@ -982,12 +986,10 @@ bool AActor::IsInsideVisibleAngles() const // Don't bother masking if not wanted. if (!(renderflags & RF_MASKROTATION)) return true; - - if (players[consoleplayer].camera == nullptr) - return true; - // Not detectable. - if (!Level->isPrimaryLevel()) + auto p = Level->GetConsolePlayer(); + + if (p == nullptr || p->camera == nullptr) return true; DAngle anglestart = VisibleStartAngle; @@ -1010,7 +1012,7 @@ bool AActor::IsInsideVisibleAngles() const } - AActor *mo = players[consoleplayer].camera; + AActor *mo = p->camera; if (mo != nullptr) { @@ -1046,19 +1048,19 @@ bool AActor::IsInsideVisibleAngles() const bool AActor::IsVisibleToPlayer() const { - auto &p = players[consoleplayer]; + auto p = Level->GetConsolePlayer(); // [BB] Safety check. This should never be NULL. Nevertheless, we return true to leave the default ZDoom behavior unaltered. - if ( p.camera == nullptr ) + if (p == nullptr || p->camera == nullptr ) return true; if (VisibleToTeam != 0 && teamplay && - (signed)(VisibleToTeam-1) != p.userinfo.GetTeam() ) + (signed)(VisibleToTeam-1) != p->userinfo.GetTeam() ) return false; auto &vis = GetInfo()->VisibleToPlayerClass; if (vis.Size() == 0) return true; // early out for the most common case. - const player_t* pPlayer = p.camera->player; + const player_t* pPlayer = p->camera->player; if (pPlayer) { @@ -4902,7 +4904,7 @@ AActor *FLevelLocals::SpawnPlayer (FPlayerStart *mthing, int playernum, int flag return NULL; } // not playing? - if ((unsigned)playernum >= (unsigned)MAXPLAYERS || !playeringame[playernum]) + if ((unsigned)playernum >= (unsigned)MAXPLAYERS || !PlayerInGame(playernum) ) return NULL; // Old lerp data needs to go @@ -4911,7 +4913,7 @@ AActor *FLevelLocals::SpawnPlayer (FPlayerStart *mthing, int playernum, int flag P_PredictionLerpReset(); } - p = &players[playernum]; + p = Players[playernum]; if (p->cls == NULL) { @@ -5271,10 +5273,14 @@ AActor *FLevelLocals::SpawnMapThing (FMapThing *mthing, int position) // this is enabled for all games. if (!multiplayer) { // Single player - int spawnmask = players[consoleplayer].GetSpawnClass(); - if (spawnmask != 0 && (mthing->ClassFilter & spawnmask) == 0) - { // Not for current class - return NULL; + auto p = GetConsolePlayer(); + if (p) + { + int spawnmask = p->GetSpawnClass(); + if (spawnmask != 0 && (mthing->ClassFilter & spawnmask) == 0) + { // Not for current class + return nullptr; + } } } else if (!deathmatch) @@ -5282,9 +5288,9 @@ AActor *FLevelLocals::SpawnMapThing (FMapThing *mthing, int position) mask = 0; for (int i = 0; i < MAXPLAYERS; i++) { - if (playeringame[i]) + if (PlayerInGame(i)) { - int spawnmask = players[i].GetSpawnClass(); + int spawnmask = Players[i]->GetSpawnClass(); if (spawnmask != 0) mask |= spawnmask; else diff --git a/src/p_pspr.cpp b/src/p_pspr.cpp index 4a1100b2e..97be2772c 100644 --- a/src/p_pspr.cpp +++ b/src/p_pspr.cpp @@ -600,10 +600,6 @@ void P_BobWeapon (player_t *player, float *x, float *y, double ticfrac) static void P_CheckWeaponButtons (player_t *player) { - if (player->Bot == nullptr && bot_observer) - { - return; - } auto weapon = player->ReadyWeapon; if (weapon == nullptr) { diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 807287f41..45b394e22 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -625,7 +625,8 @@ void P_SerializePlayers(FLevelLocals *Level, FSerializer &arc, bool skipload) Level->SpawnExtraPlayers(); } // Redo pitch limits, since the spawned player has them at 0. - players[consoleplayer].SendPitchLimits(); + auto p = Level->GetConsolePlayer(); + if (p) p->SendPitchLimits(); } } diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 20655a223..abf4fadbd 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -401,7 +401,8 @@ void P_SetupLevel(FLevelLocals *Level, int position, bool newGame) translationtables[TRANSLATION_LevelScripted].Clear(); // Initial height of PointOfView will be set by player think. - players[consoleplayer].viewz = NO_VALUE; + auto p = Level->GetConsolePlayer(); + if (p) p->viewz = NO_VALUE; // Make sure all sounds are stopped before Z_FreeTags. S_Start(); diff --git a/src/p_user.cpp b/src/p_user.cpp index a7ad96c27..7616d954c 100644 --- a/src/p_user.cpp +++ b/src/p_user.cpp @@ -617,7 +617,7 @@ static int GetSoftPitch(bool down) void player_t::SendPitchLimits() const { - if (this - players == consoleplayer) + if (this == mo->Level->GetConsolePlayer()) { int uppitch, downpitch; @@ -1108,7 +1108,7 @@ void P_CheckMusicChange(player_t *player) { if (--player->MUSINFOtics < 0) { - if (player - players == consoleplayer) + if (player == player->mo->Level->GetConsolePlayer()) { if (player->MUSINFOactor->args[0] != 0) { @@ -1372,7 +1372,7 @@ void P_PredictPlayer (player_t *player) singletics || demoplayback || player->mo == NULL || - player != &players[consoleplayer] || + player != player->mo->Level->GetConsolePlayer() || player->playerstate != PST_LIVE || !netgame || /*player->morphTics ||*/ From 202f3d7d80bfc79f172ff015350d9c56a205e2c7 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 1 Feb 2019 17:31:11 +0100 Subject: [PATCH 140/164] - changed most places where a player index is calculated by subtracting the player array's base access. --- src/fragglescript/t_func.cpp | 8 ++++---- src/g_level.cpp | 4 ++-- src/p_acs.cpp | 4 ++-- src/p_conversation.cpp | 4 ++-- src/p_interaction.cpp | 6 +++--- src/p_mobj.cpp | 8 ++++---- src/p_saveg.cpp | 6 +++--- src/p_user.cpp | 7 ++++--- .../hwrenderer/postprocessing/hw_postprocessshader.cpp | 3 ++- src/scripting/vmthunks_actors.cpp | 2 +- 10 files changed, 27 insertions(+), 25 deletions(-) diff --git a/src/fragglescript/t_func.cpp b/src/fragglescript/t_func.cpp index 082f3115e..939693661 100644 --- a/src/fragglescript/t_func.cpp +++ b/src/fragglescript/t_func.cpp @@ -270,7 +270,7 @@ int FParser::T_GetPlayerNum(const svalue_t &arg) //script_error("mobj not a player!\n"); return -1; } - playernum = int(arg.value.mobj->player - players); + playernum = Level->PlayerNum(arg.value.mobj->player); } else playernum = intvalue(arg); @@ -734,7 +734,7 @@ void FParser::SF_PlayerName(void) { player_t *pl=NULL; if (Script->trigger) pl = Script->trigger->player; - if(pl) plnum = int(pl - players); + if(pl) plnum = Level->PlayerNum(pl); else plnum=-1; } else @@ -765,7 +765,7 @@ void FParser::SF_PlayerObj(void) { player_t *pl=NULL; if (Script->trigger) pl = Script->trigger->player; - if(pl) plnum = int(pl - players); + if(pl) plnum = Level->PlayerNum(pl); else plnum=-1; } else @@ -805,7 +805,7 @@ void FParser::SF_Player(void) if(mo && mo->player) // haleyjd: added mo->player { - t_return.value.i = (int)(mo->player - players); + t_return.value.i = Level->PlayerNum(mo->player); } else { diff --git a/src/g_level.cpp b/src/g_level.cpp index 616877c12..c2f61fbc4 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -675,9 +675,9 @@ void FLevelLocals::ChangeLevel(const char *levelname, int position, int flags, i for(int i = 0; i < MAXPLAYERS; i++) { - if (playeringame[i]) + if (PlayerInGame(i)) { - player_t *player = &players[i]; + player_t *player = Players[i]; // Un-crouch all players here. player->Uncrouch(); diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 6706de0c2..cd412d727 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -9648,7 +9648,7 @@ scriptwait: } else { - PushToStack (int(activator->player - players)); + PushToStack (Level->PlayerNum(activator->player)); } break; @@ -10351,7 +10351,7 @@ static void addDefered (level_info_t *i, acsdefered_t::EType type, int script, c } if (who != NULL && who->player != NULL) { - def.playernum = int(who->player - players); + def.playernum = who->Level->PlayerNum(who->player); } else { diff --git a/src/p_conversation.cpp b/src/p_conversation.cpp index ccf43c9d9..aaa46d256 100644 --- a/src/p_conversation.cpp +++ b/src/p_conversation.cpp @@ -746,10 +746,10 @@ void P_StartConversation (AActor *npc, AActor *pc, bool facetalker, bool saveang // anyone else talk to the NPC. for (i = 0; i < MAXPLAYERS; i++) { - if (!playeringame[i] || pc->player == &players[i]) + if (!Level->PlayerInGame(i) || pc->player == Level->Players[i]) continue; - if (npc == players[i].ConversationNPC) + if (npc == Level->Players[i]->ConversationNPC) return; } diff --git a/src/p_interaction.cpp b/src/p_interaction.cpp index 1a6fdbe4a..fab4f2992 100644 --- a/src/p_interaction.cpp +++ b/src/p_interaction.cpp @@ -401,7 +401,7 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOf // fair to count them toward a player's score. if (player && Level->maptime) { - source->player->frags[player - players]++; + source->player->frags[Level->PlayerNum(player)]++; if (player == source->player) // [RH] Cumulative frag count { char buff[256]; @@ -560,7 +560,7 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOf ClientObituary (this, inflictor, source, dmgflags, MeansOfDeath); // [ZZ] fire player death hook - E_PlayerDied(int(player - players)); + E_PlayerDied(Level->PlayerNum(player)); // Death script execution, care of Skull Tag Level->Behaviors.StartTypedScripts (SCRIPT_Death, this, true); @@ -593,7 +593,7 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOf // count environment kills against you if (!source) { - player->frags[player - players]++; + player->frags[Level->PlayerNum(player)]++; player->fragcount--; // [RH] Cumulative frag count } diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index d414ee8d2..ce0bcb7f8 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -384,7 +384,7 @@ void AActor::PostSerialize() AddToHash(); if (player) { - if (playeringame[player - players] && + if (Level->PlayerInGame(player) && player->cls != NULL && !(flags4 & MF4_NOSKIN) && state->sprite == GetDefaultByType(player->cls)->SpawnState->sprite) @@ -489,7 +489,7 @@ int AActor::GetTics(FState * newstate) bool AActor::SetState (FState *newstate, bool nofunction) { if (debugfile && player && (player->cheats & CF_PREDICTING)) - fprintf (debugfile, "for pl %td: SetState while predicting!\n", player-players); + fprintf (debugfile, "for pl %d: SetState while predicting!\n", Level->PlayerNum(player)); do { if (newstate == NULL) @@ -5155,7 +5155,7 @@ AActor *FLevelLocals::SpawnPlayer (FPlayerStart *mthing, int playernum, int flag DObject::StaticPointerSubstitution (oldactor, p->mo); - E_PlayerRespawned(int(p - players)); + E_PlayerRespawned(PlayerNum(p)); Behaviors.StartTypedScripts (SCRIPT_Respawn, p->mo, true); } } @@ -6765,7 +6765,7 @@ int AActor::GetTeam() // Check for monsters that belong to a player on the team but aren't part of the team themselves. if (myTeam == TEAM_NONE && FriendPlayer != 0) { - myTeam = players[FriendPlayer - 1].userinfo.GetTeam(); + myTeam = Level->Players[FriendPlayer - 1]->userinfo.GetTeam(); } return myTeam; diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 45b394e22..cee4e897d 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -588,13 +588,13 @@ void P_SerializePlayers(FLevelLocals *Level, FSerializer &arc, bool skipload) // Record each player's name, followed by their data. for (i = 0; i < MAXPLAYERS; ++i) { - if (playeringame[i]) + if (Level->PlayerInGame(i)) { if (arc.BeginObject(nullptr)) { - const char *n = players[i].userinfo.GetName(); + const char *n = Level->Players[i]->userinfo.GetName(); arc.StringPtr("playername", n); - players[i].Serialize(arc); + Level->Players[i]->Serialize(arc); arc.EndObject(); } } diff --git a/src/p_user.cpp b/src/p_user.cpp index 7616d954c..9062957d8 100644 --- a/src/p_user.cpp +++ b/src/p_user.cpp @@ -676,9 +676,10 @@ bool player_t::Resurrect() mo->special1 = 0; // required for the Hexen fighter's fist attack. // This gets set by AActor::Die as flag for the wimpy death and must be reset here. mo->SetState(mo->SpawnState); + int pnum = mo->Level->PlayerNum(this); if (!(mo->flags2 & MF2_DONTTRANSLATE)) { - mo->Translation = TRANSLATION(TRANSLATION_Players, uint8_t(this - players)); + mo->Translation = TRANSLATION(TRANSLATION_Players, uint8_t(pnum)); } if (ReadyWeapon != nullptr) { @@ -693,7 +694,7 @@ bool player_t::Resurrect() // player is now alive. // fire E_PlayerRespawned and start the ACS SCRIPT_Respawn. - E_PlayerRespawned(int(this - players)); + E_PlayerRespawned(pnum); // mo->Level->Behaviors.StartTypedScripts(SCRIPT_Respawn, mo, true); return true; @@ -1124,7 +1125,7 @@ void P_CheckMusicChange(player_t *player) S_ChangeMusic("*"); } } - DPrintf(DMSG_NOTIFY, "MUSINFO change for player %d to %d\n", (int)(player - players), player->MUSINFOactor->args[0]); + DPrintf(DMSG_NOTIFY, "MUSINFO change for player %d to %d\n", (int)player->mo->Level->PlayerNum(player), player->MUSINFOactor->args[0]); } } } diff --git a/src/rendering/hwrenderer/postprocessing/hw_postprocessshader.cpp b/src/rendering/hwrenderer/postprocessing/hw_postprocessshader.cpp index dc6a465b6..9131fe10e 100644 --- a/src/rendering/hwrenderer/postprocessing/hw_postprocessshader.cpp +++ b/src/rendering/hwrenderer/postprocessing/hw_postprocessshader.cpp @@ -23,6 +23,7 @@ #include "vm.h" #include "d_player.h" #include "hw_postprocessshader.h" +#include "g_levellocals.h" TArray PostProcessShaders; @@ -32,7 +33,7 @@ static bool IsConsolePlayer(player_t *player) AActor *activator = player ? player->mo : nullptr; if (activator == nullptr || activator->player == nullptr) return false; - return int(activator->player - players) == consoleplayer; + return activator->player == activator->Level->GetConsolePlayer(); } static void ShaderSetEnabled(player_t *player, const FString &shaderName, bool value) diff --git a/src/scripting/vmthunks_actors.cpp b/src/scripting/vmthunks_actors.cpp index d4b8f260a..dd674bf80 100644 --- a/src/scripting/vmthunks_actors.cpp +++ b/src/scripting/vmthunks_actors.cpp @@ -566,7 +566,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(AActor, RestoreDamage, RestoreDamage) static int PlayerNumber(AActor *self) { - return self->player ? int(self->player - players) : 0; + return self->player ? self->Level->PlayerNum(self->player) : 0; } DEFINE_ACTION_FUNCTION_NATIVE(AActor, PlayerNumber, PlayerNumber) From 3f90764faa17f40dd9f587f891810a67dd3291aa Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 1 Feb 2019 18:13:12 +0100 Subject: [PATCH 141/164] - moved the contents of g_inventory to g_shared and gamedata subfolders. a_pickups only contains a few native remains of the inventory code and the other two only the static data maintenance for their items. --- src/CMakeLists.txt | 11 ++++++----- src/{g_inventory => g_shared}/a_pickups.cpp | 0 src/{g_inventory => g_shared}/a_pickups.h | 0 src/{g_inventory => gamedata}/a_keys.cpp | 0 src/{g_inventory => gamedata}/a_keys.h | 0 src/{g_inventory => gamedata}/a_weapons.cpp | 0 src/{g_inventory => gamedata}/a_weapons.h | 0 7 files changed, 6 insertions(+), 5 deletions(-) rename src/{g_inventory => g_shared}/a_pickups.cpp (100%) rename src/{g_inventory => g_shared}/a_pickups.h (100%) rename src/{g_inventory => gamedata}/a_keys.cpp (100%) rename src/{g_inventory => gamedata}/a_keys.h (100%) rename src/{g_inventory => gamedata}/a_weapons.cpp (100%) rename src/{g_inventory => gamedata}/a_weapons.h (100%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index cd4d922df..57f059030 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -647,7 +647,7 @@ file( GLOB HEADER_FILES fragglescript/*.h g_shared/*.h g_statusbar/*.h - g_inventory/*.h + gamedata/*.h intermission/*.h maploader/*.h menu/*.h @@ -973,9 +973,9 @@ set (PCH_SOURCES v_video.cpp w_wad.cpp wi_stuff.cpp - g_inventory/a_keys.cpp - g_inventory/a_pickups.cpp - g_inventory/a_weapons.cpp + gamedata/a_keys.cpp + gamedata/a_weapons.cpp + g_shared/a_pickups.cpp g_shared/a_action.cpp g_shared/a_decals.cpp g_shared/a_doors.cpp @@ -1321,7 +1321,7 @@ target_link_libraries( zdoom ${ZDOOM_LIBS} gdtoa dumb lzma ) include_directories( . g_statusbar g_shared - g_inventory + gamedata rendering sound textures @@ -1439,6 +1439,7 @@ source_group("External\\Math" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/m source_group("External\\RapidJSON" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rapidjson/.+") source_group("External\\SFMT" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/sfmt/.+") source_group("FraggleScript" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/fragglescript/.+") +source_group("Game Data" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/gamedata/.+") source_group("Intermission" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/intermission/.+") source_group("Map Loader" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/maploader/.+") source_group("Menu" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/menu/.+") diff --git a/src/g_inventory/a_pickups.cpp b/src/g_shared/a_pickups.cpp similarity index 100% rename from src/g_inventory/a_pickups.cpp rename to src/g_shared/a_pickups.cpp diff --git a/src/g_inventory/a_pickups.h b/src/g_shared/a_pickups.h similarity index 100% rename from src/g_inventory/a_pickups.h rename to src/g_shared/a_pickups.h diff --git a/src/g_inventory/a_keys.cpp b/src/gamedata/a_keys.cpp similarity index 100% rename from src/g_inventory/a_keys.cpp rename to src/gamedata/a_keys.cpp diff --git a/src/g_inventory/a_keys.h b/src/gamedata/a_keys.h similarity index 100% rename from src/g_inventory/a_keys.h rename to src/gamedata/a_keys.h diff --git a/src/g_inventory/a_weapons.cpp b/src/gamedata/a_weapons.cpp similarity index 100% rename from src/g_inventory/a_weapons.cpp rename to src/gamedata/a_weapons.cpp diff --git a/src/g_inventory/a_weapons.h b/src/gamedata/a_weapons.h similarity index 100% rename from src/g_inventory/a_weapons.h rename to src/gamedata/a_weapons.h From c1e1284b52ef5d2934e40172057cdf8bf270a983 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 1 Feb 2019 18:15:49 +0100 Subject: [PATCH 142/164] - moved the CCMDs out of a_pickups.cpp. --- src/g_dumpinfo.cpp | 42 +++++++++++++++++++++++++++++ src/g_shared/a_pickups.cpp | 55 +------------------------------------- 2 files changed, 43 insertions(+), 54 deletions(-) diff --git a/src/g_dumpinfo.cpp b/src/g_dumpinfo.cpp index 9501b452f..e967f724b 100644 --- a/src/g_dumpinfo.cpp +++ b/src/g_dumpinfo.cpp @@ -41,6 +41,7 @@ #include "p_setup.h" #include "w_wad.h" #include "v_text.h" +#include "c_functions.h" //========================================================================== // @@ -305,5 +306,46 @@ CCMD(dumplinktable) } +//=========================================================================== +// +// CCMD printinv +// +// Prints the console player's current inventory. +// +//=========================================================================== +CCMD(printinv) +{ + int pnum = consoleplayer; + +#ifdef _DEBUG + // Only allow peeking on other players' inventory in debug builds. + if (argv.argc() > 1) + { + pnum = atoi(argv[1]); + if (pnum < 0 || pnum >= MAXPLAYERS) + { + return; + } + } +#endif + C_PrintInv(players[pnum].mo); +} + +CCMD(targetinv) +{ + FTranslatedLineTarget t; + + if (CheckCheatmode() || players[consoleplayer].mo == NULL) + return; + + C_AimLine(&t, true); + + if (t.linetarget) + { + C_PrintInv(t.linetarget); + } + else Printf("No target found. Targetinv cannot find actors that have " + "the NOBLOCKMAP flag or have height/radius of 0.\n"); +} diff --git a/src/g_shared/a_pickups.cpp b/src/g_shared/a_pickups.cpp index fdb0b22f4..98347df84 100644 --- a/src/g_shared/a_pickups.cpp +++ b/src/g_shared/a_pickups.cpp @@ -35,21 +35,11 @@ #include -#include "info.h" -#include "p_local.h" -#include "p_lnspec.h" -#include "sbar.h" -#include "statnums.h" -#include "c_dispatch.h" #include "gstrings.h" -#include "a_morph.h" -#include "a_specialspot.h" -#include "g_game.h" +#include "sbar.h" #include "doomstat.h" #include "d_player.h" -#include "serializer.h" #include "vm.h" -#include "c_functions.h" #include "g_levellocals.h" EXTERN_CVAR(Bool, sv_unlimited_pickup) @@ -115,46 +105,3 @@ bool CallTryPickup(AActor *item, AActor *toucher, AActor **toucher_return) return !!res; } -//=========================================================================== -// -// CCMD printinv -// -// Prints the console player's current inventory. -// -//=========================================================================== - -CCMD (printinv) -{ - int pnum = consoleplayer; - -#ifdef _DEBUG - // Only allow peeking on other players' inventory in debug builds. - if (argv.argc() > 1) - { - pnum = atoi (argv[1]); - if (pnum < 0 || pnum >= MAXPLAYERS) - { - return; - } - } -#endif - C_PrintInv(players[pnum].mo); -} - -CCMD (targetinv) -{ - FTranslatedLineTarget t; - - if (CheckCheatmode () || players[consoleplayer].mo == NULL) - return; - - C_AimLine(&t, true); - - if (t.linetarget) - { - C_PrintInv(t.linetarget); - } - else Printf("No target found. Targetinv cannot find actors that have " - "the NOBLOCKMAP flag or have height/radius of 0.\n"); -} - From db77ed79cd2da11875bcf092b73281ea3e352751 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 1 Feb 2019 18:31:57 +0100 Subject: [PATCH 143/164] - moved the resourcefiles and textures folders into gamedata. --- src/CMakeLists.txt | 132 +++++++++--------- .../resourcefiles/ancientzip.cpp | 0 src/{ => gamedata}/resourcefiles/ancientzip.h | 0 src/{ => gamedata}/resourcefiles/file_7z.cpp | 0 .../resourcefiles/file_directory.cpp | 0 src/{ => gamedata}/resourcefiles/file_grp.cpp | 0 .../resourcefiles/file_lump.cpp | 0 src/{ => gamedata}/resourcefiles/file_pak.cpp | 0 src/{ => gamedata}/resourcefiles/file_rff.cpp | 0 src/{ => gamedata}/resourcefiles/file_wad.cpp | 0 src/{ => gamedata}/resourcefiles/file_zip.cpp | 0 src/{ => gamedata}/resourcefiles/file_zip.h | 0 .../resourcefiles/resourcefile.cpp | 0 .../resourcefiles/resourcefile.h | 0 src/{ => gamedata}/textures/anim_switches.cpp | 0 src/{ => gamedata}/textures/animations.cpp | 0 src/{ => gamedata}/textures/bitmap.cpp | 0 src/{ => gamedata}/textures/bitmap.h | 0 .../textures/formats/automaptexture.cpp | 0 .../textures/formats/brightmaptexture.cpp | 0 .../textures/formats/buildtexture.cpp | 0 .../textures/formats/canvastexture.cpp | 0 .../textures/formats/ddstexture.cpp | 0 .../textures/formats/emptytexture.cpp | 0 .../textures/formats/flattexture.cpp | 0 .../textures/formats/fontchars.cpp | 0 .../textures/formats/fontchars.h | 0 .../textures/formats/imgztexture.cpp | 0 .../textures/formats/jpegtexture.cpp | 0 .../textures/formats/md5check.cpp | 0 .../textures/formats/multipatchtexture.cpp | 0 .../textures/formats/multipatchtexture.h | 0 .../textures/formats/patchtexture.cpp | 0 .../textures/formats/pcxtexture.cpp | 0 .../textures/formats/pngtexture.cpp | 0 .../textures/formats/rawpagetexture.cpp | 0 .../textures/formats/shadertexture.cpp | 0 .../textures/formats/tgatexture.cpp | 0 .../textures/hires/hirestex.cpp | 0 .../textures/hires/hqnx/common.h | 0 .../textures/hires/hqnx/hq2x.cpp | 0 .../textures/hires/hqnx/hq3x.cpp | 0 .../textures/hires/hqnx/hq4x.cpp | 0 src/{ => gamedata}/textures/hires/hqnx/hqx.h | 0 .../textures/hires/hqnx/init.cpp | 0 .../textures/hires/hqnx_asm/hq2x_asm.cpp | 0 .../textures/hires/hqnx_asm/hq3x_asm.cpp | 0 .../textures/hires/hqnx_asm/hq4x_asm.cpp | 0 .../textures/hires/hqnx_asm/hqnx_asm.h | 0 .../hires/hqnx_asm/hqnx_asm_Image.cpp | 0 .../textures/hires/hqnx_asm/hqnx_asm_Image.h | 0 .../textures/hires/hqresize.cpp | 0 .../textures/hires/xbr/xbrz.cpp | 0 src/{ => gamedata}/textures/hires/xbr/xbrz.h | 0 .../textures/hires/xbr/xbrz_config.h | 0 .../textures/hires/xbr/xbrz_config_old.h | 0 .../textures/hires/xbr/xbrz_old.cpp | 0 .../textures/hires/xbr/xbrz_old.h | 0 .../textures/hires/xbr/xbrz_tools.h | 0 src/{ => gamedata}/textures/image.cpp | 0 src/{ => gamedata}/textures/image.h | 0 src/{ => gamedata}/textures/imagehelpers.h | 0 src/{ => gamedata}/textures/imagetexture.cpp | 0 .../textures/multipatchtexturebuilder.cpp | 0 src/{ => gamedata}/textures/skyboxtexture.cpp | 0 src/{ => gamedata}/textures/skyboxtexture.h | 0 src/{ => gamedata}/textures/texture.cpp | 0 .../textures/texturemanager.cpp | 0 src/{ => gamedata}/textures/textures.h | 0 69 files changed, 66 insertions(+), 66 deletions(-) rename src/{ => gamedata}/resourcefiles/ancientzip.cpp (100%) rename src/{ => gamedata}/resourcefiles/ancientzip.h (100%) rename src/{ => gamedata}/resourcefiles/file_7z.cpp (100%) rename src/{ => gamedata}/resourcefiles/file_directory.cpp (100%) rename src/{ => gamedata}/resourcefiles/file_grp.cpp (100%) rename src/{ => gamedata}/resourcefiles/file_lump.cpp (100%) rename src/{ => gamedata}/resourcefiles/file_pak.cpp (100%) rename src/{ => gamedata}/resourcefiles/file_rff.cpp (100%) rename src/{ => gamedata}/resourcefiles/file_wad.cpp (100%) rename src/{ => gamedata}/resourcefiles/file_zip.cpp (100%) rename src/{ => gamedata}/resourcefiles/file_zip.h (100%) rename src/{ => gamedata}/resourcefiles/resourcefile.cpp (100%) rename src/{ => gamedata}/resourcefiles/resourcefile.h (100%) rename src/{ => gamedata}/textures/anim_switches.cpp (100%) rename src/{ => gamedata}/textures/animations.cpp (100%) rename src/{ => gamedata}/textures/bitmap.cpp (100%) rename src/{ => gamedata}/textures/bitmap.h (100%) rename src/{ => gamedata}/textures/formats/automaptexture.cpp (100%) rename src/{ => gamedata}/textures/formats/brightmaptexture.cpp (100%) rename src/{ => gamedata}/textures/formats/buildtexture.cpp (100%) rename src/{ => gamedata}/textures/formats/canvastexture.cpp (100%) rename src/{ => gamedata}/textures/formats/ddstexture.cpp (100%) rename src/{ => gamedata}/textures/formats/emptytexture.cpp (100%) rename src/{ => gamedata}/textures/formats/flattexture.cpp (100%) rename src/{ => gamedata}/textures/formats/fontchars.cpp (100%) rename src/{ => gamedata}/textures/formats/fontchars.h (100%) rename src/{ => gamedata}/textures/formats/imgztexture.cpp (100%) rename src/{ => gamedata}/textures/formats/jpegtexture.cpp (100%) rename src/{ => gamedata}/textures/formats/md5check.cpp (100%) rename src/{ => gamedata}/textures/formats/multipatchtexture.cpp (100%) rename src/{ => gamedata}/textures/formats/multipatchtexture.h (100%) rename src/{ => gamedata}/textures/formats/patchtexture.cpp (100%) rename src/{ => gamedata}/textures/formats/pcxtexture.cpp (100%) rename src/{ => gamedata}/textures/formats/pngtexture.cpp (100%) rename src/{ => gamedata}/textures/formats/rawpagetexture.cpp (100%) rename src/{ => gamedata}/textures/formats/shadertexture.cpp (100%) rename src/{ => gamedata}/textures/formats/tgatexture.cpp (100%) rename src/{ => gamedata}/textures/hires/hirestex.cpp (100%) rename src/{ => gamedata}/textures/hires/hqnx/common.h (100%) rename src/{ => gamedata}/textures/hires/hqnx/hq2x.cpp (100%) rename src/{ => gamedata}/textures/hires/hqnx/hq3x.cpp (100%) rename src/{ => gamedata}/textures/hires/hqnx/hq4x.cpp (100%) rename src/{ => gamedata}/textures/hires/hqnx/hqx.h (100%) rename src/{ => gamedata}/textures/hires/hqnx/init.cpp (100%) rename src/{ => gamedata}/textures/hires/hqnx_asm/hq2x_asm.cpp (100%) rename src/{ => gamedata}/textures/hires/hqnx_asm/hq3x_asm.cpp (100%) rename src/{ => gamedata}/textures/hires/hqnx_asm/hq4x_asm.cpp (100%) rename src/{ => gamedata}/textures/hires/hqnx_asm/hqnx_asm.h (100%) rename src/{ => gamedata}/textures/hires/hqnx_asm/hqnx_asm_Image.cpp (100%) rename src/{ => gamedata}/textures/hires/hqnx_asm/hqnx_asm_Image.h (100%) rename src/{ => gamedata}/textures/hires/hqresize.cpp (100%) rename src/{ => gamedata}/textures/hires/xbr/xbrz.cpp (100%) rename src/{ => gamedata}/textures/hires/xbr/xbrz.h (100%) rename src/{ => gamedata}/textures/hires/xbr/xbrz_config.h (100%) rename src/{ => gamedata}/textures/hires/xbr/xbrz_config_old.h (100%) rename src/{ => gamedata}/textures/hires/xbr/xbrz_old.cpp (100%) rename src/{ => gamedata}/textures/hires/xbr/xbrz_old.h (100%) rename src/{ => gamedata}/textures/hires/xbr/xbrz_tools.h (100%) rename src/{ => gamedata}/textures/image.cpp (100%) rename src/{ => gamedata}/textures/image.h (100%) rename src/{ => gamedata}/textures/imagehelpers.h (100%) rename src/{ => gamedata}/textures/imagetexture.cpp (100%) rename src/{ => gamedata}/textures/multipatchtexturebuilder.cpp (100%) rename src/{ => gamedata}/textures/skyboxtexture.cpp (100%) rename src/{ => gamedata}/textures/skyboxtexture.h (100%) rename src/{ => gamedata}/textures/texture.cpp (100%) rename src/{ => gamedata}/textures/texturemanager.cpp (100%) rename src/{ => gamedata}/textures/textures.h (100%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 57f059030..8e06ff79c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -564,17 +564,17 @@ if( HAVE_MMX ) add_definitions( -DHAVE_MMX=1 ) set( SYSTEM_SOURCES ${SYSTEM_SOURCES} - textures/hires/hqnx_asm/hq2x_asm.cpp - textures/hires/hqnx_asm/hq3x_asm.cpp - textures/hires/hqnx_asm/hq4x_asm.cpp - textures/hires/hqnx_asm/hqnx_asm_Image.cpp) + gamedata/textures/hires/hqnx_asm/hq2x_asm.cpp + gamedata/textures/hires/hqnx_asm/hq3x_asm.cpp + gamedata/textures/hires/hqnx_asm/hq4x_asm.cpp + gamedata/textures/hires/hqnx_asm/hqnx_asm_Image.cpp) if( ZD_CMAKE_COMPILER_IS_GNUCXX_COMPATIBLE ) set_source_files_properties( - textures/hires/hqnx_asm/hq2x_asm.cpp - textures/hires/hqnx_asm/hq3x_asm.cpp - textures/hires/hqnx_asm/hq4x_asm.cpp - textures/hires/gl_hqresize.cpp + gamedata/textures/hires/hqnx_asm/hq2x_asm.cpp + gamedata/textures/hires/hqnx_asm/hq3x_asm.cpp + gamedata/textures/hires/hqnx_asm/hq4x_asm.cpp + gamedata/textures/hires/gl_hqresize.cpp PROPERTIES COMPILE_FLAGS "-mmmx" ) endif( ZD_CMAKE_COMPILER_IS_GNUCXX_COMPATIBLE ) endif( HAVE_MMX ) @@ -648,6 +648,11 @@ file( GLOB HEADER_FILES g_shared/*.h g_statusbar/*.h gamedata/*.h + gamedata/resourcefiles/*.h + gamedata/textures/*.h + gamedata/textures/hires/hqnx/*.h + gamedata/textures/hires/hqnx_asm/*.h + gamedata/textures/hires/xbr/*.h intermission/*.h maploader/*.h menu/*.h @@ -662,15 +667,10 @@ file( GLOB HEADER_FILES r_data/*.h r_data/models/*.h utility/rapidjson/*.h - resourcefiles/*.h utility/sfmt/*.h utility/math./*h utility/*.h sound/*.h - textures/*.h - textures/hires/hqnx/*.h - textures/hires/hqnx_asm/*.h - textures/hires/xbr/*.h scripting/*.h scripting/backend/*.h scripting/decorate/*.h @@ -818,12 +818,12 @@ set( FASTMATH_SOURCES sound/sndfile_decoder.cpp sound/timiditypp/fft4g.cpp sound/timiditypp/reverb.cpp - textures/hires/hqnx/init.cpp - textures/hires/hqnx/hq2x.cpp - textures/hires/hqnx/hq3x.cpp - textures/hires/hqnx/hq4x.cpp - textures/hires/xbr/xbrz.cpp - textures/hires/xbr/xbrz_old.cpp + gamedata/textures/hires/hqnx/init.cpp + gamedata/textures/hires/hqnx/hq2x.cpp + gamedata/textures/hires/hqnx/hq3x.cpp + gamedata/textures/hires/hqnx/hq4x.cpp + gamedata/textures/hires/xbr/xbrz.cpp + gamedata/textures/hires/xbr/xbrz_old.cpp rendering/gl_load/gl_load.c rendering/hwrenderer/postprocessing/hw_postprocess_cvars.cpp rendering/hwrenderer/postprocessing/hw_postprocessshader.cpp @@ -1070,45 +1070,45 @@ set (PCH_SOURCES menu/optionmenu.cpp menu/playermenu.cpp menu/resolutionmenu.cpp - resourcefiles/ancientzip.cpp - resourcefiles/file_7z.cpp - resourcefiles/file_grp.cpp - resourcefiles/file_lump.cpp - resourcefiles/file_rff.cpp - resourcefiles/file_wad.cpp - resourcefiles/file_zip.cpp - resourcefiles/file_pak.cpp - resourcefiles/file_directory.cpp - resourcefiles/resourcefile.cpp - textures/animations.cpp - textures/anim_switches.cpp - textures/bitmap.cpp - textures/texture.cpp - textures/image.cpp - textures/imagetexture.cpp - textures/texturemanager.cpp - textures/multipatchtexturebuilder.cpp - textures/skyboxtexture.cpp - textures/formats/automaptexture.cpp - textures/formats/brightmaptexture.cpp - textures/formats/buildtexture.cpp - textures/formats/canvastexture.cpp - textures/formats/ddstexture.cpp - textures/formats/flattexture.cpp - textures/formats/fontchars.cpp - textures/formats/imgztexture.cpp - textures/formats/jpegtexture.cpp - textures/formats/md5check.cpp - textures/formats/multipatchtexture.cpp - textures/formats/patchtexture.cpp - textures/formats/pcxtexture.cpp - textures/formats/pngtexture.cpp - textures/formats/rawpagetexture.cpp - textures/formats/emptytexture.cpp - textures/formats/shadertexture.cpp - textures/formats/tgatexture.cpp - textures/hires/hqresize.cpp - textures/hires/hirestex.cpp + gamedata/resourcefiles/ancientzip.cpp + gamedata/resourcefiles/file_7z.cpp + gamedata/resourcefiles/file_grp.cpp + gamedata/resourcefiles/file_lump.cpp + gamedata/resourcefiles/file_rff.cpp + gamedata/resourcefiles/file_wad.cpp + gamedata/resourcefiles/file_zip.cpp + gamedata/resourcefiles/file_pak.cpp + gamedata/resourcefiles/file_directory.cpp + gamedata/resourcefiles/resourcefile.cpp + gamedata/textures/animations.cpp + gamedata/textures/anim_switches.cpp + gamedata/textures/bitmap.cpp + gamedata/textures/texture.cpp + gamedata/textures/image.cpp + gamedata/textures/imagetexture.cpp + gamedata/textures/texturemanager.cpp + gamedata/textures/multipatchtexturebuilder.cpp + gamedata/textures/skyboxtexture.cpp + gamedata/textures/formats/automaptexture.cpp + gamedata/textures/formats/brightmaptexture.cpp + gamedata/textures/formats/buildtexture.cpp + gamedata/textures/formats/canvastexture.cpp + gamedata/textures/formats/ddstexture.cpp + gamedata/textures/formats/flattexture.cpp + gamedata/textures/formats/fontchars.cpp + gamedata/textures/formats/imgztexture.cpp + gamedata/textures/formats/jpegtexture.cpp + gamedata/textures/formats/md5check.cpp + gamedata/textures/formats/multipatchtexture.cpp + gamedata/textures/formats/patchtexture.cpp + gamedata/textures/formats/pcxtexture.cpp + gamedata/textures/formats/pngtexture.cpp + gamedata/textures/formats/rawpagetexture.cpp + gamedata/textures/formats/emptytexture.cpp + gamedata/textures/formats/shadertexture.cpp + gamedata/textures/formats/tgatexture.cpp + gamedata/textures/hires/hqresize.cpp + gamedata/textures/hires/hirestex.cpp xlat/parse_xlat.cpp fragglescript/t_func.cpp fragglescript/t_load.cpp @@ -1322,9 +1322,9 @@ include_directories( . g_statusbar g_shared gamedata + gamedata/textures rendering sound - textures sound/oplsynth sound/timidity sound/wildmidi @@ -1440,6 +1440,13 @@ source_group("External\\RapidJSON" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_D source_group("External\\SFMT" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/sfmt/.+") source_group("FraggleScript" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/fragglescript/.+") source_group("Game Data" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/gamedata/.+") +source_group("Game Data\\Resource Files" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/gamedata/resourcefiles/.+") +source_group("Game Data\\Textures" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/textures/.+") +source_group("Game Data\\Textures\\Hires" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/textures/hires/.+") +source_group("Game Data\\Textures\\Hires\\HQ Resize" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/textures/hires/hqnx/.+") +source_group("Game Data\\Textures\\Hires\\HQ Resize MMX version" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/textures/hires/hqnx_asm/.+") +source_group("Game Data\\Textures\\Hires\\XBRZ" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/textures/hires/xbr/.+") +source_group("Game Data\\Textures\\Formats" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/textures/formats/.+") source_group("Intermission" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/intermission/.+") source_group("Map Loader" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/maploader/.+") source_group("Menu" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/menu/.+") @@ -1478,15 +1485,8 @@ source_group("Rendering\\Poly Renderer\\Math" REGULAR_EXPRESSION "^${CMAKE_CURRE source_group("Rendering\\Poly Renderer\\Drawers" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/polyrenderer/drawers/.+") source_group("Rendering\\Poly Renderer\\Scene" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/rendering/polyrenderer/scene/.+") source_group("Render Data" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/r_data/.+") -source_group("Render Data\\Textures" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/textures/.+") -source_group("Render Data\\Textures\\Hires" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/textures/hires/.+") -source_group("Render Data\\Textures\\Hires\\HQ Resize" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/textures/hires/hqnx/.+") -source_group("Render Data\\Textures\\Hires\\HQ Resize MMX version" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/textures/hires/hqnx_asm/.+") -source_group("Render Data\\Textures\\Hires\\XBRZ" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/textures/hires/xbr/.+") -source_group("Render Data\\Textures\\Formats" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/textures/formats/.+") source_group("Render Data\\Models" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/r_data/models/.+") source_group("Render Interface" FILES r_defs.h r_renderer.h r_sky.cpp r_sky.h r_state.h r_utility.cpp r_utility.h) -source_group("Resource Files" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/resourcefiles/.+") source_group("Platforms\\POSIX Files" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/posix/.+") source_group("Platforms\\Cocoa Files" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/posix/cocoa/.+") source_group("Platforms\\OS X Files" REGULAR_EXPRESSION "^${CMAKE_CURRENT_SOURCE_DIR}/posix/osx/.+") diff --git a/src/resourcefiles/ancientzip.cpp b/src/gamedata/resourcefiles/ancientzip.cpp similarity index 100% rename from src/resourcefiles/ancientzip.cpp rename to src/gamedata/resourcefiles/ancientzip.cpp diff --git a/src/resourcefiles/ancientzip.h b/src/gamedata/resourcefiles/ancientzip.h similarity index 100% rename from src/resourcefiles/ancientzip.h rename to src/gamedata/resourcefiles/ancientzip.h diff --git a/src/resourcefiles/file_7z.cpp b/src/gamedata/resourcefiles/file_7z.cpp similarity index 100% rename from src/resourcefiles/file_7z.cpp rename to src/gamedata/resourcefiles/file_7z.cpp diff --git a/src/resourcefiles/file_directory.cpp b/src/gamedata/resourcefiles/file_directory.cpp similarity index 100% rename from src/resourcefiles/file_directory.cpp rename to src/gamedata/resourcefiles/file_directory.cpp diff --git a/src/resourcefiles/file_grp.cpp b/src/gamedata/resourcefiles/file_grp.cpp similarity index 100% rename from src/resourcefiles/file_grp.cpp rename to src/gamedata/resourcefiles/file_grp.cpp diff --git a/src/resourcefiles/file_lump.cpp b/src/gamedata/resourcefiles/file_lump.cpp similarity index 100% rename from src/resourcefiles/file_lump.cpp rename to src/gamedata/resourcefiles/file_lump.cpp diff --git a/src/resourcefiles/file_pak.cpp b/src/gamedata/resourcefiles/file_pak.cpp similarity index 100% rename from src/resourcefiles/file_pak.cpp rename to src/gamedata/resourcefiles/file_pak.cpp diff --git a/src/resourcefiles/file_rff.cpp b/src/gamedata/resourcefiles/file_rff.cpp similarity index 100% rename from src/resourcefiles/file_rff.cpp rename to src/gamedata/resourcefiles/file_rff.cpp diff --git a/src/resourcefiles/file_wad.cpp b/src/gamedata/resourcefiles/file_wad.cpp similarity index 100% rename from src/resourcefiles/file_wad.cpp rename to src/gamedata/resourcefiles/file_wad.cpp diff --git a/src/resourcefiles/file_zip.cpp b/src/gamedata/resourcefiles/file_zip.cpp similarity index 100% rename from src/resourcefiles/file_zip.cpp rename to src/gamedata/resourcefiles/file_zip.cpp diff --git a/src/resourcefiles/file_zip.h b/src/gamedata/resourcefiles/file_zip.h similarity index 100% rename from src/resourcefiles/file_zip.h rename to src/gamedata/resourcefiles/file_zip.h diff --git a/src/resourcefiles/resourcefile.cpp b/src/gamedata/resourcefiles/resourcefile.cpp similarity index 100% rename from src/resourcefiles/resourcefile.cpp rename to src/gamedata/resourcefiles/resourcefile.cpp diff --git a/src/resourcefiles/resourcefile.h b/src/gamedata/resourcefiles/resourcefile.h similarity index 100% rename from src/resourcefiles/resourcefile.h rename to src/gamedata/resourcefiles/resourcefile.h diff --git a/src/textures/anim_switches.cpp b/src/gamedata/textures/anim_switches.cpp similarity index 100% rename from src/textures/anim_switches.cpp rename to src/gamedata/textures/anim_switches.cpp diff --git a/src/textures/animations.cpp b/src/gamedata/textures/animations.cpp similarity index 100% rename from src/textures/animations.cpp rename to src/gamedata/textures/animations.cpp diff --git a/src/textures/bitmap.cpp b/src/gamedata/textures/bitmap.cpp similarity index 100% rename from src/textures/bitmap.cpp rename to src/gamedata/textures/bitmap.cpp diff --git a/src/textures/bitmap.h b/src/gamedata/textures/bitmap.h similarity index 100% rename from src/textures/bitmap.h rename to src/gamedata/textures/bitmap.h diff --git a/src/textures/formats/automaptexture.cpp b/src/gamedata/textures/formats/automaptexture.cpp similarity index 100% rename from src/textures/formats/automaptexture.cpp rename to src/gamedata/textures/formats/automaptexture.cpp diff --git a/src/textures/formats/brightmaptexture.cpp b/src/gamedata/textures/formats/brightmaptexture.cpp similarity index 100% rename from src/textures/formats/brightmaptexture.cpp rename to src/gamedata/textures/formats/brightmaptexture.cpp diff --git a/src/textures/formats/buildtexture.cpp b/src/gamedata/textures/formats/buildtexture.cpp similarity index 100% rename from src/textures/formats/buildtexture.cpp rename to src/gamedata/textures/formats/buildtexture.cpp diff --git a/src/textures/formats/canvastexture.cpp b/src/gamedata/textures/formats/canvastexture.cpp similarity index 100% rename from src/textures/formats/canvastexture.cpp rename to src/gamedata/textures/formats/canvastexture.cpp diff --git a/src/textures/formats/ddstexture.cpp b/src/gamedata/textures/formats/ddstexture.cpp similarity index 100% rename from src/textures/formats/ddstexture.cpp rename to src/gamedata/textures/formats/ddstexture.cpp diff --git a/src/textures/formats/emptytexture.cpp b/src/gamedata/textures/formats/emptytexture.cpp similarity index 100% rename from src/textures/formats/emptytexture.cpp rename to src/gamedata/textures/formats/emptytexture.cpp diff --git a/src/textures/formats/flattexture.cpp b/src/gamedata/textures/formats/flattexture.cpp similarity index 100% rename from src/textures/formats/flattexture.cpp rename to src/gamedata/textures/formats/flattexture.cpp diff --git a/src/textures/formats/fontchars.cpp b/src/gamedata/textures/formats/fontchars.cpp similarity index 100% rename from src/textures/formats/fontchars.cpp rename to src/gamedata/textures/formats/fontchars.cpp diff --git a/src/textures/formats/fontchars.h b/src/gamedata/textures/formats/fontchars.h similarity index 100% rename from src/textures/formats/fontchars.h rename to src/gamedata/textures/formats/fontchars.h diff --git a/src/textures/formats/imgztexture.cpp b/src/gamedata/textures/formats/imgztexture.cpp similarity index 100% rename from src/textures/formats/imgztexture.cpp rename to src/gamedata/textures/formats/imgztexture.cpp diff --git a/src/textures/formats/jpegtexture.cpp b/src/gamedata/textures/formats/jpegtexture.cpp similarity index 100% rename from src/textures/formats/jpegtexture.cpp rename to src/gamedata/textures/formats/jpegtexture.cpp diff --git a/src/textures/formats/md5check.cpp b/src/gamedata/textures/formats/md5check.cpp similarity index 100% rename from src/textures/formats/md5check.cpp rename to src/gamedata/textures/formats/md5check.cpp diff --git a/src/textures/formats/multipatchtexture.cpp b/src/gamedata/textures/formats/multipatchtexture.cpp similarity index 100% rename from src/textures/formats/multipatchtexture.cpp rename to src/gamedata/textures/formats/multipatchtexture.cpp diff --git a/src/textures/formats/multipatchtexture.h b/src/gamedata/textures/formats/multipatchtexture.h similarity index 100% rename from src/textures/formats/multipatchtexture.h rename to src/gamedata/textures/formats/multipatchtexture.h diff --git a/src/textures/formats/patchtexture.cpp b/src/gamedata/textures/formats/patchtexture.cpp similarity index 100% rename from src/textures/formats/patchtexture.cpp rename to src/gamedata/textures/formats/patchtexture.cpp diff --git a/src/textures/formats/pcxtexture.cpp b/src/gamedata/textures/formats/pcxtexture.cpp similarity index 100% rename from src/textures/formats/pcxtexture.cpp rename to src/gamedata/textures/formats/pcxtexture.cpp diff --git a/src/textures/formats/pngtexture.cpp b/src/gamedata/textures/formats/pngtexture.cpp similarity index 100% rename from src/textures/formats/pngtexture.cpp rename to src/gamedata/textures/formats/pngtexture.cpp diff --git a/src/textures/formats/rawpagetexture.cpp b/src/gamedata/textures/formats/rawpagetexture.cpp similarity index 100% rename from src/textures/formats/rawpagetexture.cpp rename to src/gamedata/textures/formats/rawpagetexture.cpp diff --git a/src/textures/formats/shadertexture.cpp b/src/gamedata/textures/formats/shadertexture.cpp similarity index 100% rename from src/textures/formats/shadertexture.cpp rename to src/gamedata/textures/formats/shadertexture.cpp diff --git a/src/textures/formats/tgatexture.cpp b/src/gamedata/textures/formats/tgatexture.cpp similarity index 100% rename from src/textures/formats/tgatexture.cpp rename to src/gamedata/textures/formats/tgatexture.cpp diff --git a/src/textures/hires/hirestex.cpp b/src/gamedata/textures/hires/hirestex.cpp similarity index 100% rename from src/textures/hires/hirestex.cpp rename to src/gamedata/textures/hires/hirestex.cpp diff --git a/src/textures/hires/hqnx/common.h b/src/gamedata/textures/hires/hqnx/common.h similarity index 100% rename from src/textures/hires/hqnx/common.h rename to src/gamedata/textures/hires/hqnx/common.h diff --git a/src/textures/hires/hqnx/hq2x.cpp b/src/gamedata/textures/hires/hqnx/hq2x.cpp similarity index 100% rename from src/textures/hires/hqnx/hq2x.cpp rename to src/gamedata/textures/hires/hqnx/hq2x.cpp diff --git a/src/textures/hires/hqnx/hq3x.cpp b/src/gamedata/textures/hires/hqnx/hq3x.cpp similarity index 100% rename from src/textures/hires/hqnx/hq3x.cpp rename to src/gamedata/textures/hires/hqnx/hq3x.cpp diff --git a/src/textures/hires/hqnx/hq4x.cpp b/src/gamedata/textures/hires/hqnx/hq4x.cpp similarity index 100% rename from src/textures/hires/hqnx/hq4x.cpp rename to src/gamedata/textures/hires/hqnx/hq4x.cpp diff --git a/src/textures/hires/hqnx/hqx.h b/src/gamedata/textures/hires/hqnx/hqx.h similarity index 100% rename from src/textures/hires/hqnx/hqx.h rename to src/gamedata/textures/hires/hqnx/hqx.h diff --git a/src/textures/hires/hqnx/init.cpp b/src/gamedata/textures/hires/hqnx/init.cpp similarity index 100% rename from src/textures/hires/hqnx/init.cpp rename to src/gamedata/textures/hires/hqnx/init.cpp diff --git a/src/textures/hires/hqnx_asm/hq2x_asm.cpp b/src/gamedata/textures/hires/hqnx_asm/hq2x_asm.cpp similarity index 100% rename from src/textures/hires/hqnx_asm/hq2x_asm.cpp rename to src/gamedata/textures/hires/hqnx_asm/hq2x_asm.cpp diff --git a/src/textures/hires/hqnx_asm/hq3x_asm.cpp b/src/gamedata/textures/hires/hqnx_asm/hq3x_asm.cpp similarity index 100% rename from src/textures/hires/hqnx_asm/hq3x_asm.cpp rename to src/gamedata/textures/hires/hqnx_asm/hq3x_asm.cpp diff --git a/src/textures/hires/hqnx_asm/hq4x_asm.cpp b/src/gamedata/textures/hires/hqnx_asm/hq4x_asm.cpp similarity index 100% rename from src/textures/hires/hqnx_asm/hq4x_asm.cpp rename to src/gamedata/textures/hires/hqnx_asm/hq4x_asm.cpp diff --git a/src/textures/hires/hqnx_asm/hqnx_asm.h b/src/gamedata/textures/hires/hqnx_asm/hqnx_asm.h similarity index 100% rename from src/textures/hires/hqnx_asm/hqnx_asm.h rename to src/gamedata/textures/hires/hqnx_asm/hqnx_asm.h diff --git a/src/textures/hires/hqnx_asm/hqnx_asm_Image.cpp b/src/gamedata/textures/hires/hqnx_asm/hqnx_asm_Image.cpp similarity index 100% rename from src/textures/hires/hqnx_asm/hqnx_asm_Image.cpp rename to src/gamedata/textures/hires/hqnx_asm/hqnx_asm_Image.cpp diff --git a/src/textures/hires/hqnx_asm/hqnx_asm_Image.h b/src/gamedata/textures/hires/hqnx_asm/hqnx_asm_Image.h similarity index 100% rename from src/textures/hires/hqnx_asm/hqnx_asm_Image.h rename to src/gamedata/textures/hires/hqnx_asm/hqnx_asm_Image.h diff --git a/src/textures/hires/hqresize.cpp b/src/gamedata/textures/hires/hqresize.cpp similarity index 100% rename from src/textures/hires/hqresize.cpp rename to src/gamedata/textures/hires/hqresize.cpp diff --git a/src/textures/hires/xbr/xbrz.cpp b/src/gamedata/textures/hires/xbr/xbrz.cpp similarity index 100% rename from src/textures/hires/xbr/xbrz.cpp rename to src/gamedata/textures/hires/xbr/xbrz.cpp diff --git a/src/textures/hires/xbr/xbrz.h b/src/gamedata/textures/hires/xbr/xbrz.h similarity index 100% rename from src/textures/hires/xbr/xbrz.h rename to src/gamedata/textures/hires/xbr/xbrz.h diff --git a/src/textures/hires/xbr/xbrz_config.h b/src/gamedata/textures/hires/xbr/xbrz_config.h similarity index 100% rename from src/textures/hires/xbr/xbrz_config.h rename to src/gamedata/textures/hires/xbr/xbrz_config.h diff --git a/src/textures/hires/xbr/xbrz_config_old.h b/src/gamedata/textures/hires/xbr/xbrz_config_old.h similarity index 100% rename from src/textures/hires/xbr/xbrz_config_old.h rename to src/gamedata/textures/hires/xbr/xbrz_config_old.h diff --git a/src/textures/hires/xbr/xbrz_old.cpp b/src/gamedata/textures/hires/xbr/xbrz_old.cpp similarity index 100% rename from src/textures/hires/xbr/xbrz_old.cpp rename to src/gamedata/textures/hires/xbr/xbrz_old.cpp diff --git a/src/textures/hires/xbr/xbrz_old.h b/src/gamedata/textures/hires/xbr/xbrz_old.h similarity index 100% rename from src/textures/hires/xbr/xbrz_old.h rename to src/gamedata/textures/hires/xbr/xbrz_old.h diff --git a/src/textures/hires/xbr/xbrz_tools.h b/src/gamedata/textures/hires/xbr/xbrz_tools.h similarity index 100% rename from src/textures/hires/xbr/xbrz_tools.h rename to src/gamedata/textures/hires/xbr/xbrz_tools.h diff --git a/src/textures/image.cpp b/src/gamedata/textures/image.cpp similarity index 100% rename from src/textures/image.cpp rename to src/gamedata/textures/image.cpp diff --git a/src/textures/image.h b/src/gamedata/textures/image.h similarity index 100% rename from src/textures/image.h rename to src/gamedata/textures/image.h diff --git a/src/textures/imagehelpers.h b/src/gamedata/textures/imagehelpers.h similarity index 100% rename from src/textures/imagehelpers.h rename to src/gamedata/textures/imagehelpers.h diff --git a/src/textures/imagetexture.cpp b/src/gamedata/textures/imagetexture.cpp similarity index 100% rename from src/textures/imagetexture.cpp rename to src/gamedata/textures/imagetexture.cpp diff --git a/src/textures/multipatchtexturebuilder.cpp b/src/gamedata/textures/multipatchtexturebuilder.cpp similarity index 100% rename from src/textures/multipatchtexturebuilder.cpp rename to src/gamedata/textures/multipatchtexturebuilder.cpp diff --git a/src/textures/skyboxtexture.cpp b/src/gamedata/textures/skyboxtexture.cpp similarity index 100% rename from src/textures/skyboxtexture.cpp rename to src/gamedata/textures/skyboxtexture.cpp diff --git a/src/textures/skyboxtexture.h b/src/gamedata/textures/skyboxtexture.h similarity index 100% rename from src/textures/skyboxtexture.h rename to src/gamedata/textures/skyboxtexture.h diff --git a/src/textures/texture.cpp b/src/gamedata/textures/texture.cpp similarity index 100% rename from src/textures/texture.cpp rename to src/gamedata/textures/texture.cpp diff --git a/src/textures/texturemanager.cpp b/src/gamedata/textures/texturemanager.cpp similarity index 100% rename from src/textures/texturemanager.cpp rename to src/gamedata/textures/texturemanager.cpp diff --git a/src/textures/textures.h b/src/gamedata/textures/textures.h similarity index 100% rename from src/textures/textures.h rename to src/gamedata/textures/textures.h From a1cc548af40ad2f0e2865485ab23e9044dd005e9 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 1 Feb 2019 19:20:58 +0100 Subject: [PATCH 144/164] - moved some more code into the gamedata folder. Two files were split: g_level.h contained both the game data definitions and some prototypes belonging to the game logic. These were split up. decallib.cpp contained both the data and the animation thinkers. The thinkers are now in their own file. --- src/CMakeLists.txt | 15 +- src/g_level.h | 556 +--------------------------- src/g_shared/a_decalfx.cpp | 246 +++++++++++++ src/g_shared/a_decalfx.h | 93 +++++ src/{ => gamedata}/decallib.cpp | 297 +-------------- src/{ => gamedata}/decallib.h | 0 src/{ => gamedata}/g_mapinfo.cpp | 0 src/gamedata/g_mapinfo.h | 561 +++++++++++++++++++++++++++++ src/{ => gamedata}/g_skill.cpp | 0 src/{ => gamedata}/gi.cpp | 0 src/{ => gamedata}/gi.h | 0 src/{ => gamedata}/gstrings.h | 0 src/{ => gamedata}/stringtable.cpp | 0 src/{ => gamedata}/stringtable.h | 0 src/{ => gamedata}/umapinfo.cpp | 0 src/{ => gamedata}/w_wad.cpp | 0 src/{ => gamedata}/w_wad.h | 0 src/{ => gamedata}/w_zip.h | 0 18 files changed, 912 insertions(+), 856 deletions(-) create mode 100644 src/g_shared/a_decalfx.cpp create mode 100644 src/g_shared/a_decalfx.h rename src/{ => gamedata}/decallib.cpp (81%) rename src/{ => gamedata}/decallib.h (100%) rename src/{ => gamedata}/g_mapinfo.cpp (100%) create mode 100644 src/gamedata/g_mapinfo.h rename src/{ => gamedata}/g_skill.cpp (100%) rename src/{ => gamedata}/gi.cpp (100%) rename src/{ => gamedata}/gi.h (100%) rename src/{ => gamedata}/gstrings.h (100%) rename src/{ => gamedata}/stringtable.cpp (100%) rename src/{ => gamedata}/stringtable.h (100%) rename src/{ => gamedata}/umapinfo.cpp (100%) rename src/{ => gamedata}/w_wad.cpp (100%) rename src/{ => gamedata}/w_wad.h (100%) rename src/{ => gamedata}/w_zip.h (100%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8e06ff79c..da8e68db0 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -899,7 +899,6 @@ set (PCH_SOURCES d_net.cpp d_netinfo.cpp d_protocol.cpp - decallib.cpp dobject.cpp dobjgc.cpp dobjtype.cpp @@ -911,10 +910,7 @@ set (PCH_SOURCES g_game.cpp g_hub.cpp g_level.cpp - g_mapinfo.cpp - g_skill.cpp gameconfigfile.cpp - gi.cpp gitinfo.cpp hu_scores.cpp i_net.cpp @@ -959,9 +955,7 @@ set (PCH_SOURCES st_stuff.cpp statistics.cpp stats.cpp - stringtable.cpp teaminfo.cpp - umapinfo.cpp v_2ddrawer.cpp v_blend.cpp v_draw.cpp @@ -971,13 +965,20 @@ set (PCH_SOURCES v_pfx.cpp v_text.cpp v_video.cpp - w_wad.cpp wi_stuff.cpp gamedata/a_keys.cpp gamedata/a_weapons.cpp + gamedata/decallib.cpp + gamedata/g_mapinfo.cpp + gamedata/g_skill.cpp + gamedata/gi.cpp + gamedata/stringtable.cpp + gamedata/umapinfo.cpp + gamedata/w_wad.cpp g_shared/a_pickups.cpp g_shared/a_action.cpp g_shared/a_decals.cpp + g_shared/a_decalfx.cpp g_shared/a_doors.cpp g_shared/a_dynlight.cpp g_shared/a_flashfader.cpp diff --git a/src/g_level.h b/src/g_level.h index 8b83ed043..5a8ca237c 100644 --- a/src/g_level.h +++ b/src/g_level.h @@ -1,450 +1,14 @@ -/* -** g_level.h -** -**--------------------------------------------------------------------------- -** Copyright 1998-2006 Randy Heit -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions -** are met: -** -** 1. Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in the -** documentation and/or other materials provided with the distribution. -** 3. The name of the author may not be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -**--------------------------------------------------------------------------- -** -*/ - -#ifndef __G_LEVEL_H__ -#define __G_LEVEL_H__ +#pragma once #include "doomtype.h" #include "vectors.h" #include "sc_man.h" #include "resourcefiles/file_zip.h" +#include "g_mapinfo.h" -struct level_info_t; -struct cluster_info_t; -class FSerializer; - -#if defined(_MSC_VER) -#pragma section(".yreg$u",read) -#define MSVC_YSEG __declspec(allocate(".yreg$u")) -#define GCC_YSEG -#else -#define MSVC_YSEG -#define GCC_YSEG __attribute__((section(SECTION_YREG))) __attribute__((used)) -#endif - -// The structure used to control scripts between maps -struct acsdefered_t -{ - enum EType - { - defexecute, - defexealways, - defsuspend, - defterminate - } type; - int script; - int args[3]; - int playernum; -}; - -FSerializer &Serialize(FSerializer &arc, const char *key, acsdefered_t &defer, acsdefered_t *def); - - -struct FIntermissionDescriptor; -struct FIntermissionAction; - -struct FMapInfoParser -{ - enum EFormatType - { - FMT_Unknown, - FMT_Old, - FMT_New - }; - - FScanner sc; - int format_type; - bool HexenHack; - - FMapInfoParser(int format = FMT_Unknown) - { - format_type = format; - HexenHack = false; - } - - bool ParseLookupName(FString &dest); - void ParseMusic(FString &name, int &order); - //void ParseLumpOrTextureName(char *name); - void ParseLumpOrTextureName(FString &name); - void ParseExitText(FName formap, level_info_t *info); - void ParseExitMusic(FName formap, level_info_t *info); - void ParseExitBackdrop(FName formap, level_info_t *info, bool ispic); - - void ParseCluster(); - void ParseNextMap(FString &mapname); - level_info_t *ParseMapHeader(level_info_t &defaultinfo); - void ParseMapDefinition(level_info_t &leveldef); - void ParseGameInfo(); - void ParseEpisodeInfo (); - void ParseSkill (); - void ParseMapInfo (int lump, level_info_t &gamedefaults, level_info_t &defaultinfo); - - void ParseOpenBrace(); - bool ParseCloseBrace(); - bool CheckAssign(); - void ParseAssign(); - void MustParseAssign(); - void ParseComma(); - bool CheckNumber(); - bool CheckFloat(); - void SkipToNext(); - void CheckEndOfFile(const char *block); - - void ParseIntermissionAction(FIntermissionDescriptor *Desc); - void ParseIntermission(); - void ParseDoomEdNums(); - void ParseSpawnNums(); - void ParseConversationIDs(); - void ParseAMColors(bool); - FName CheckEndSequence(); - FName ParseEndGame(); - void ParseDamageDefinition(); -}; - -#define DEFINE_MAP_OPTION(name, old) \ - static void MapOptHandler_##name(FMapInfoParser &parse, level_info_t *info); \ - static FMapOptInfo MapOpt_##name = \ - { #name, MapOptHandler_##name, old }; \ - MSVC_YSEG FMapOptInfo *mapopt_##name GCC_YSEG = &MapOpt_##name; \ - static void MapOptHandler_##name(FMapInfoParser &parse, level_info_t *info) - - -struct FMapOptInfo -{ - const char *name; - void (*handler) (FMapInfoParser &parse, level_info_t *levelinfo); - bool old; -}; - -enum ELevelFlags : unsigned int -{ - LEVEL_NOINTERMISSION = 0x00000001, - LEVEL_NOINVENTORYBAR = 0x00000002, // This effects Doom only, since it's the only one without a standard inventory bar. - LEVEL_DOUBLESKY = 0x00000004, - LEVEL_HASFADETABLE = 0x00000008, // Level uses Hexen's fadetable mapinfo to get fog - - LEVEL_MAP07SPECIAL = 0x00000010, - LEVEL_BRUISERSPECIAL = 0x00000020, - LEVEL_CYBORGSPECIAL = 0x00000040, - LEVEL_SPIDERSPECIAL = 0x00000080, - - LEVEL_SPECLOWERFLOOR = 0x00000100, - LEVEL_SPECOPENDOOR = 0x00000200, - LEVEL_SPECLOWERFLOORTOHIGHEST=0x00000300, - LEVEL_SPECACTIONSMASK = 0x00000300, - - LEVEL_MONSTERSTELEFRAG = 0x00000400, - LEVEL_ACTOWNSPECIAL = 0x00000800, - LEVEL_SNDSEQTOTALCTRL = 0x00001000, - LEVEL_FORCETILEDSKY = 0x00002000, - - LEVEL_CROUCH_NO = 0x00004000, - LEVEL_JUMP_NO = 0x00008000, - LEVEL_FREELOOK_NO = 0x00010000, - LEVEL_FREELOOK_YES = 0x00020000, - - // The absence of both of the following bits means that this level does not - // use falling damage (though damage can be forced with dmflags,. - LEVEL_FALLDMG_ZD = 0x00040000, // Level uses ZDoom's falling damage - LEVEL_FALLDMG_HX = 0x00080000, // Level uses Hexen's falling damage - - LEVEL_HEADSPECIAL = 0x00100000, // Heretic episode 1/4 - LEVEL_MINOTAURSPECIAL = 0x00200000, // Heretic episode 2/5 - LEVEL_SORCERER2SPECIAL = 0x00400000, // Heretic episode 3 - LEVEL_SPECKILLMONSTERS = 0x00800000, - - LEVEL_STARTLIGHTNING = 0x01000000, // Automatically start lightning - LEVEL_FILTERSTARTS = 0x02000000, // Apply mapthing filtering to player starts - LEVEL_LOOKUPLEVELNAME = 0x04000000, // Level name is the name of a language string - LEVEL_USEPLAYERSTARTZ = 0x08000000, // Use the Z position of player starts - - LEVEL_SWAPSKIES = 0x10000000, // Used by lightning - LEVEL_NOALLIES = 0x20000000, // i.e. Inside Strife's front base - LEVEL_CHANGEMAPCHEAT = 0x40000000, // Don't display cluster messages - LEVEL_VISITED = 0x80000000, // Used for intermission map - - // The flags uint64_t is now split into 2 DWORDs - LEVEL2_RANDOMPLAYERSTARTS = 0x00000001, // Select single player starts randomnly (no voodoo dolls) - LEVEL2_ALLMAP = 0x00000002, // The player picked up a map on this level - - LEVEL2_LAXMONSTERACTIVATION = 0x00000004, // Monsters can open doors depending on the door speed - LEVEL2_LAXACTIVATIONMAPINFO = 0x00000008, // LEVEL_LAXMONSTERACTIVATION is not a default. - - LEVEL2_MISSILESACTIVATEIMPACT=0x00000010, // Missiles are the activators of SPAC_IMPACT events, not their shooters - LEVEL2_FROZEN = 0x00000020, // Game is frozen by a TimeFreezer - - LEVEL2_KEEPFULLINVENTORY = 0x00000040, // doesn't reduce the amount of inventory items to 1 - - LEVEL2_PRERAISEWEAPON = 0x00000080, // players should spawn with their weapons fully raised (but not when respawning it multiplayer) - LEVEL2_MONSTERFALLINGDAMAGE = 0x00000100, - LEVEL2_CLIPMIDTEX = 0x00000200, - LEVEL2_WRAPMIDTEX = 0x00000400, - - LEVEL2_CHECKSWITCHRANGE = 0x00000800, - - LEVEL2_PAUSE_MUSIC_IN_MENUS = 0x00001000, - LEVEL2_TOTALINFIGHTING = 0x00002000, - LEVEL2_NOINFIGHTING = 0x00004000, - - LEVEL2_NOMONSTERS = 0x00008000, - LEVEL2_INFINITE_FLIGHT = 0x00010000, - - LEVEL2_ALLOWRESPAWN = 0x00020000, - - LEVEL2_FORCETEAMPLAYON = 0x00040000, - LEVEL2_FORCETEAMPLAYOFF = 0x00080000, - - LEVEL2_CONV_SINGLE_UNFREEZE = 0x00100000, - LEVEL2_RAILINGHACK = 0x00200000, // but UDMF requires them to be separate to have more control - LEVEL2_DUMMYSWITCHES = 0x00400000, - LEVEL2_HEXENHACK = 0x00800000, // Level was defined in a Hexen style MAPINFO - - LEVEL2_SMOOTHLIGHTING = 0x01000000, // Level uses the smooth lighting feature. - LEVEL2_POLYGRIND = 0x02000000, // Polyobjects grind corpses to gibs. - LEVEL2_RESETINVENTORY = 0x04000000, // Resets player inventory when starting this level (unless in a hub) - LEVEL2_RESETHEALTH = 0x08000000, // Resets player health when starting this level (unless in a hub) - - LEVEL2_NOSTATISTICS = 0x10000000, // This level should not have statistics collected - LEVEL2_ENDGAME = 0x20000000, // This is an epilogue level that cannot be quit. - LEVEL2_NOAUTOSAVEHINT = 0x40000000, // tell the game that an autosave for this level does not need to be kept - LEVEL2_FORGETSTATE = 0x80000000, // forget this map's state in a hub - - // More flags! - LEVEL3_FORCEFAKECONTRAST = 0x00000001, // forces fake contrast even with fog enabled - LEVEL3_REMOVEITEMS = 0x00000002, // kills all INVBAR items on map change. - LEVEL3_ATTENUATE = 0x00000004, // attenuate lights? - LEVEL3_NOLIGHTFADE = 0x00000008, // no light fading to black. - LEVEL3_NOCOLOREDSPRITELIGHTING = 0x00000010, // draw sprites only with color-less light - LEVEL3_EXITNORMALUSED = 0x00000020, - LEVEL3_EXITSECRETUSED = 0x00000040, - LEVEL3_FORCEWORLDPANNING = 0x00000080, // Forces the world panning flag for all textures, even those without it explicitly set. -}; - - -struct FSpecialAction -{ - FName Type; // this is initialized before the actors... - int Action; - int Args[5]; -}; - -class DScroller; - -class FScanner; -struct level_info_t; - -typedef TMap FMusicMap; - -enum EMapType : int -{ - MAPTYPE_UNKNOWN = 0, - MAPTYPE_DOOM, - MAPTYPE_HEXEN, - MAPTYPE_BUILD, - MAPTYPE_UDMF // This does not distinguish between namespaces. -}; - -struct FExitText -{ - enum EDefined - { - DEF_TEXT = 1, - DEF_MUSIC = 2, - DEF_BACKDROP = 4, - DEF_LOOKUP = 8, - DEF_PIC = 16 - }; - int16_t mDefined = 0; - int16_t mOrder = -1; - FString mText; - FString mMusic; - FString mBackdrop; - - FExitText(int def = 0, int order = -1, const FString &text = "", const FString &backdrop = "", const FString &music = "") - : mDefined(int16_t(def)), mOrder(int16_t(order)), mText(text), mMusic(music), mBackdrop(backdrop) - { - } -}; - - -struct level_info_t -{ - int levelnum; - - FString MapName; - FString NextMap; - FString NextSecretMap; - FString PName; - FString SkyPic1; - FString SkyPic2; - FString FadeTable; - FString F1Pic; - FString BorderTexture; - FString MapBackground; - - TMap ExitMapTexts; - - int cluster; - int partime; - int sucktime; - int32_t flags; - uint32_t flags2; - uint32_t flags3; - - FString Music; - FString LevelName; - int8_t WallVertLight, WallHorizLight; - int musicorder; - FCompressedBuffer Snapshot; - TArray deferred; - float skyspeed1; - float skyspeed2; - uint32_t fadeto; - uint32_t outsidefog; - int cdtrack; - unsigned int cdid; - double gravity; - double aircontrol; - int WarpTrans; - int airsupply; - uint32_t compatflags, compatflags2; - uint32_t compatmask, compatmask2; - FString Translator; // for converting Doom-format linedef and sector types. - int DefaultEnvironment; // Default sound environment for the map. - FName Intermission; - FName deathsequence; - FName slideshow; - uint32_t hazardcolor; - uint32_t hazardflash; - int fogdensity; - int outsidefogdensity; - int skyfog; - float pixelstretch; - - // Redirection: If any player is carrying the specified item, then - // you go to the RedirectMap instead of this one. - FName RedirectType; - FString RedirectMapName; - - FString EnterPic; - FString ExitPic; - FString InterMusic; - int intermusicorder; - TMap > MapInterMusic; - - FString SoundInfo; - FString SndSeq; - - double teamdamage; - - FMusicMap MusicMap; - - TArray specialactions; - - TArray PrecacheSounds; - TArray PrecacheTextures; - TArray PrecacheClasses; - - TArray EventHandlers; - - ELightMode lightmode; - int8_t brightfog; - int8_t lightadditivesurfaces; - int8_t notexturefill; - FVector3 skyrotatevector; - FVector3 skyrotatevector2; - - FString EDName; - FString acsName; - bool fs_nocheckposition; - - - level_info_t() - { - Reset(); - } - ~level_info_t() - { - Snapshot.Clean(); - ClearDefered(); - } - void Reset(); - bool isValid(); - FString LookupLevelName (); - void ClearDefered() - { - deferred.Clear(); - } - level_info_t *CheckLevelRedirect (); -}; - - -struct cluster_info_t -{ - int cluster; - FString FinaleFlat; - FString ExitText; - FString EnterText; - FString MessageMusic; - int musicorder; - int flags; - int cdtrack; - FString ClusterName; - unsigned int cdid; - - void Reset(); - -}; - -// Cluster flags -#define CLUSTER_HUB 0x00000001 // Cluster uses hub behavior -#define CLUSTER_EXITTEXTINLUMP 0x00000002 // Exit text is the name of a lump -#define CLUSTER_ENTERTEXTINLUMP 0x00000004 // Enter text is the name of a lump -#define CLUSTER_FINALEPIC 0x00000008 // Finale "flat" is actually a full-sized image -#define CLUSTER_LOOKUPEXITTEXT 0x00000010 // Exit text is the name of a language string -#define CLUSTER_LOOKUPENTERTEXT 0x00000020 // Enter text is the name of a language string -#define CLUSTER_LOOKUPNAME 0x00000040 // 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. - -extern TArray wadlevelinfos; -extern TArray wadclusterinfos; extern bool savegamerestore; -// mapname will be changed if it is a valid warptrans -bool CheckWarpTransMap (FString &mapname, bool substitute); - void G_InitNew (const char *mapname, bool bTitleLevel); // Can be called by the startup code or M_Responder. @@ -467,15 +31,6 @@ enum void G_DoLoadLevel (const FString &MapName, int position, bool autosave, bool newGame); -cluster_info_t *FindClusterInfo (int cluster); -level_info_t *FindLevelInfo (const char *mapname, bool allowdefault=true); -level_info_t *FindLevelByNum (int num); -level_info_t *CheckLevelRedirect (level_info_t *info); - -FString CalcMapName (int episode, int level); - -void G_ParseMapInfo (FString basemapinfo); - void G_ClearSnapshots (void); void P_RemoveDefereds (); void G_ReadSnapshots (FResourceFile *); @@ -484,110 +39,3 @@ void G_WriteVisited(FSerializer &arc); void G_ReadVisited(FSerializer &arc); void G_ClearHubInfo(); -enum ESkillProperty -{ - SKILLP_FastMonsters, - SKILLP_Respawn, - SKILLP_RespawnLimit, - SKILLP_DisableCheats, - SKILLP_AutoUseHealth, - SKILLP_SpawnFilter, - SKILLP_EasyBossBrain, - SKILLP_ACSReturn, - SKILLP_NoPain, - SKILLP_EasyKey, - SKILLP_SlowMonsters, - SKILLP_Infight, - SKILLP_PlayerRespawn, -}; -enum EFSkillProperty // floating point properties -{ - SKILLP_AmmoFactor, - SKILLP_DropAmmoFactor, - SKILLP_ArmorFactor, - SKILLP_HealthFactor, - SKILLP_DamageFactor, - SKILLP_Aggressiveness, - SKILLP_MonsterHealth, - SKILLP_FriendlyHealth, - SKILLP_KickbackFactor, -}; - -int G_SkillProperty(ESkillProperty prop); -double G_SkillProperty(EFSkillProperty prop); -const char * G_SkillName(); - -typedef TMap SkillMenuNames; - -typedef TMap SkillActorReplacement; - -struct FSkillInfo -{ - FName Name = NAME_None; - double AmmoFactor, DoubleAmmoFactor, DropAmmoFactor; - double DamageFactor; - double ArmorFactor; - double HealthFactor; - double KickbackFactor; - - bool FastMonsters; - bool SlowMonsters; - bool DisableCheats; - bool AutoUseHealth; - - bool EasyBossBrain; - bool EasyKey; - bool NoMenu; - int RespawnCounter; - int RespawnLimit; - double Aggressiveness; - int SpawnFilter; - int ACSReturn; - FString MenuName; - FString PicName; - SkillMenuNames MenuNamesForPlayerClass; - bool MustConfirm; - FString MustConfirmText; - char Shortcut; - FString TextColor; - SkillActorReplacement Replace; - SkillActorReplacement Replaced; - double MonsterHealth; - double FriendlyHealth; - bool NoPain; - int Infighting; - bool PlayerRespawn; - - FSkillInfo() {} - FSkillInfo(const FSkillInfo &other) - { - operator=(other); - } - FSkillInfo &operator=(const FSkillInfo &other); - int GetTextColor() const; - - void SetReplacement(FName a, FName b); - FName GetReplacement(FName a); - void SetReplacedBy(FName b, FName a); - FName GetReplacedBy(FName b); -}; - -extern TArray AllSkills; -extern int DefaultSkill; - -struct FEpisode -{ - FString mEpisodeName; - FString mEpisodeMap; - FString mPicName; - char mShortcut; - bool mNoSkill; -}; - -extern TArray AllEpisodes; - -int ParseUMapInfo(int lumpnum); -void CommitUMapinfo(level_info_t *defaultinfo); - - -#endif //__G_LEVEL_H__ diff --git a/src/g_shared/a_decalfx.cpp b/src/g_shared/a_decalfx.cpp new file mode 100644 index 000000000..16ebca74b --- /dev/null +++ b/src/g_shared/a_decalfx.cpp @@ -0,0 +1,246 @@ +/* +** a_decalfx.h +** Decal animation thinkers +** +**--------------------------------------------------------------------------- +** Copyright 1998-2006 Randy Heit +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** +** 1. Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** 3. The name of the author may not be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**--------------------------------------------------------------------------- +** +*/ + +#include "decallib.h" +#include "a_decalfx.h" +#include "serializer.h" +#include "a_sharedglobal.h" +#include "g_levellocals.h" +#include "m_fixed.h" + + +IMPLEMENT_CLASS(DDecalThinker, false, true) + +IMPLEMENT_POINTERS_START(DDecalThinker) + IMPLEMENT_POINTER(TheDecal) +IMPLEMENT_POINTERS_END + +void DDecalThinker::Serialize(FSerializer &arc) +{ + Super::Serialize (arc); + arc("thedecal", TheDecal); +} + +IMPLEMENT_CLASS(DDecalFader, false, false) + +void DDecalFader::Serialize(FSerializer &arc) +{ + Super::Serialize (arc); + arc("starttime", TimeToStartDecay) + ("endtime", TimeToEndDecay) + ("starttrans", StartTrans); +} + +void DDecalFader::Tick () +{ + if (TheDecal == nullptr) + { + Destroy (); + } + else + { + if (Level->maptime < TimeToStartDecay || Level->isFrozen()) + { + return; + } + else if (Level->maptime >= TimeToEndDecay) + { + TheDecal->Destroy (); // remove the decal + Destroy (); // remove myself + return; + } + if (StartTrans == -1) + { + StartTrans = TheDecal->Alpha; + } + + int distanceToEnd = TimeToEndDecay - Level->maptime; + int fadeDistance = TimeToEndDecay - TimeToStartDecay; + TheDecal->Alpha = StartTrans * distanceToEnd / fadeDistance; + } +} + +IMPLEMENT_CLASS(DDecalStretcher, false, false) + +void DDecalStretcher::Serialize(FSerializer &arc) +{ + Super::Serialize (arc); + arc("starttime", TimeToStart) + ("endtime", TimeToStop) + ("goalx", GoalX) + ("startx", StartX) + ("stretchx", bStretchX) + ("goaly", GoalY) + ("starty", StartY) + ("stretchy", bStretchY) + ("started", bStarted); +} + +void DDecalStretcher::Tick () +{ + if (TheDecal == nullptr) + { + Destroy (); + return; + } + if (Level->maptime < TimeToStart || Level->isFrozen()) + { + return; + } + if (Level->maptime >= TimeToStop) + { + if (bStretchX) + { + TheDecal->ScaleX = GoalX; + } + if (bStretchY) + { + TheDecal->ScaleY = GoalY; + } + Destroy (); + return; + } + if (!bStarted) + { + bStarted = true; + StartX = TheDecal->ScaleX; + StartY = TheDecal->ScaleY; + } + + int distance = Level->maptime - TimeToStart; + int maxDistance = TimeToStop - TimeToStart; + if (bStretchX) + { + TheDecal->ScaleX = StartX + (GoalX - StartX) * distance / maxDistance; + } + if (bStretchY) + { + TheDecal->ScaleY = StartY + (GoalY - StartY) * distance / maxDistance; + } +} + +IMPLEMENT_CLASS(DDecalSlider, false, false) + +void DDecalSlider::Serialize(FSerializer &arc) +{ + Super::Serialize (arc); + arc("starttime", TimeToStart) + ("endtime", TimeToStop) + ("disty", DistY) + ("starty", StartY) + ("started", bStarted); +} + +void DDecalSlider::Tick () +{ + if (TheDecal == nullptr) + { + Destroy (); + return; + } + if (Level->maptime < TimeToStart || Level->isFrozen()) + { + return; + } + if (!bStarted) + { + bStarted = true; + /*StartX = TheDecal->LeftDistance;*/ + StartY = TheDecal->Z; + } + if (Level->maptime >= TimeToStop) + { + /*TheDecal->LeftDistance = StartX + DistX;*/ + TheDecal->Z = StartY + DistY; + Destroy (); + return; + } + + int distance = Level->maptime - TimeToStart; + int maxDistance = TimeToStop - TimeToStart; + /*TheDecal->LeftDistance = StartX + DistX * distance / maxDistance);*/ + TheDecal->Z = StartY + DistY * distance / maxDistance; +} + +IMPLEMENT_CLASS(DDecalColorer, false, false) + +void DDecalColorer::Serialize(FSerializer &arc) +{ + Super::Serialize (arc); + arc("starttime", TimeToStartDecay) + ("endtime", TimeToEndDecay) + ("startcolor", StartColor) + ("goalcolor", GoalColor); +} + +void DDecalColorer::Tick () +{ + if (TheDecal == nullptr || !(TheDecal->RenderStyle.Flags & STYLEF_ColorIsFixed)) + { + Destroy (); + } + else + { + if (Level->maptime < TimeToStartDecay || Level->isFrozen()) + { + return; + } + else if (Level->maptime >= TimeToEndDecay) + { + TheDecal->SetShade (GoalColor); + Destroy (); // remove myself + } + if (StartColor.a == 255) + { + StartColor = TheDecal->AlphaColor & 0xffffff; + if (StartColor == GoalColor) + { + Destroy (); + return; + } + } + if (Level->maptime & 0) + { // Changing the shade can be expensive, so don't do it too often. + return; + } + + int distance = Level->maptime - TimeToStartDecay; + int maxDistance = TimeToEndDecay - TimeToStartDecay; + int r = StartColor.r + Scale (GoalColor.r - StartColor.r, distance, maxDistance); + int g = StartColor.g + Scale (GoalColor.g - StartColor.g, distance, maxDistance); + int b = StartColor.b + Scale (GoalColor.b - StartColor.b, distance, maxDistance); + TheDecal->SetShade (r, g, b); + } +} + diff --git a/src/g_shared/a_decalfx.h b/src/g_shared/a_decalfx.h new file mode 100644 index 000000000..a25192b01 --- /dev/null +++ b/src/g_shared/a_decalfx.h @@ -0,0 +1,93 @@ +#pragma once + +#include "dthinker.h" + +struct DDecalThinker : public DThinker +{ + DECLARE_CLASS (DDecalThinker, DThinker) + HAS_OBJECT_POINTERS +public: + static const int DEFAULT_STAT = STAT_DECALTHINKER; + void Construct(DBaseDecal *decal) + { + TheDecal = decal; + } + void Serialize(FSerializer &arc); + TObjPtr TheDecal; +}; + +class DDecalFader : public DDecalThinker +{ + DECLARE_CLASS (DDecalFader, DDecalThinker) +public: + void Construct(DBaseDecal *decal) + { + Super::Construct(decal); + } + void Serialize(FSerializer &arc); + void Tick (); + + int TimeToStartDecay; + int TimeToEndDecay; + double StartTrans; +}; + +class DDecalColorer : public DDecalThinker +{ + DECLARE_CLASS (DDecalColorer, DDecalThinker) +public: + void Construct(DBaseDecal *decal) + { + Super::Construct(decal); + } + void Serialize(FSerializer &arc); + void Tick (); + + int TimeToStartDecay; + int TimeToEndDecay; + PalEntry StartColor; + PalEntry GoalColor; +}; + +class DDecalStretcher : public DDecalThinker +{ + DECLARE_CLASS (DDecalStretcher, DDecalThinker) +public: + void Construct(DBaseDecal *decal) + { + Super::Construct(decal); + } + void Serialize(FSerializer &arc); + void Tick (); + + int TimeToStart; + int TimeToStop; + double GoalX; + double StartX; + double GoalY; + double StartY; + bool bStretchX; + bool bStretchY; + bool bStarted; +}; + +class DDecalSlider : public DDecalThinker +{ + DECLARE_CLASS (DDecalSlider, DDecalThinker) +public: + void Construct(DBaseDecal *decal) + { + Super::Construct(decal); + } + void Serialize(FSerializer &arc); + void Tick (); + + int TimeToStart; + int TimeToStop; +/* double DistX; */ + double DistY; + double StartX; + double StartY; + bool bStarted; +}; + diff --git a/src/decallib.cpp b/src/gamedata/decallib.cpp similarity index 81% rename from src/decallib.cpp rename to src/gamedata/decallib.cpp index 18c1c7cfd..6b471492a 100644 --- a/src/decallib.cpp +++ b/src/gamedata/decallib.cpp @@ -46,6 +46,7 @@ #include "b_bot.h" #include "serializer.h" #include "g_levellocals.h" +#include "a_decalfx.h" FDecalLib DecalLibrary; @@ -102,34 +103,6 @@ struct FDecalAnimator FName Name; }; -TDeletingArray Animators; - -struct DDecalThinker : public DThinker -{ - DECLARE_CLASS (DDecalThinker, DThinker) - HAS_OBJECT_POINTERS -public: - static const int DEFAULT_STAT = STAT_DECALTHINKER; - void Construct(DBaseDecal *decal) - { - TheDecal = decal; - } - void Serialize(FSerializer &arc); - TObjPtr TheDecal; -}; - -IMPLEMENT_CLASS(DDecalThinker, false, true) - -IMPLEMENT_POINTERS_START(DDecalThinker) - IMPLEMENT_POINTER(TheDecal) -IMPLEMENT_POINTERS_END - -void DDecalThinker::Serialize(FSerializer &arc) -{ - Super::Serialize (arc); - arc("thedecal", TheDecal); -} - struct FDecalFaderAnim : public FDecalAnimator { FDecalFaderAnim (const char *name) : FDecalAnimator (name) {} @@ -139,22 +112,6 @@ struct FDecalFaderAnim : public FDecalAnimator int DecayTime; }; -class DDecalFader : public DDecalThinker -{ - DECLARE_CLASS (DDecalFader, DDecalThinker) -public: - void Construct(DBaseDecal *decal) - { - Super::Construct(decal); - } - void Serialize(FSerializer &arc); - void Tick (); - - int TimeToStartDecay; - int TimeToEndDecay; - double StartTrans; -}; - struct FDecalColorerAnim : public FDecalAnimator { FDecalColorerAnim (const char *name) : FDecalAnimator (name) {} @@ -165,23 +122,6 @@ struct FDecalColorerAnim : public FDecalAnimator PalEntry GoalColor; }; -class DDecalColorer : public DDecalThinker -{ - DECLARE_CLASS (DDecalColorer, DDecalThinker) -public: - void Construct(DBaseDecal *decal) - { - Super::Construct(decal); - } - void Serialize(FSerializer &arc); - void Tick (); - - int TimeToStartDecay; - int TimeToEndDecay; - PalEntry StartColor; - PalEntry GoalColor; -}; - struct FDecalStretcherAnim : public FDecalAnimator { FDecalStretcherAnim (const char *name) : FDecalAnimator (name) {} @@ -192,28 +132,6 @@ struct FDecalStretcherAnim : public FDecalAnimator double GoalX, GoalY; }; -class DDecalStretcher : public DDecalThinker -{ - DECLARE_CLASS (DDecalStretcher, DDecalThinker) -public: - void Construct(DBaseDecal *decal) - { - Super::Construct(decal); - } - void Serialize(FSerializer &arc); - void Tick (); - - int TimeToStart; - int TimeToStop; - double GoalX; - double StartX; - double GoalY; - double StartY; - bool bStretchX; - bool bStretchY; - bool bStarted; -}; - struct FDecalSliderAnim : public FDecalAnimator { FDecalSliderAnim (const char *name) : FDecalAnimator (name) {} @@ -224,26 +142,6 @@ struct FDecalSliderAnim : public FDecalAnimator double /*DistX,*/ DistY; }; -class DDecalSlider : public DDecalThinker -{ - DECLARE_CLASS (DDecalSlider, DDecalThinker) -public: - void Construct(DBaseDecal *decal) - { - Super::Construct(decal); - } - void Serialize(FSerializer &arc); - void Tick (); - - int TimeToStart; - int TimeToStop; -/* double DistX; */ - double DistY; - double StartX; - double StartY; - bool bStarted; -}; - struct FDecalCombinerAnim : public FDecalAnimator { FDecalCombinerAnim (const char *name) : FDecalAnimator (name) {} @@ -255,6 +153,7 @@ struct FDecalCombinerAnim : public FDecalAnimator static TArray AnimatorList; }; +TDeletingArray Animators; TArray FDecalCombinerAnim::AnimatorList; static const char *DecalKeywords[] = @@ -1166,45 +1065,6 @@ FDecalAnimator::~FDecalAnimator () { } -IMPLEMENT_CLASS(DDecalFader, false, false) - -void DDecalFader::Serialize(FSerializer &arc) -{ - Super::Serialize (arc); - arc("starttime", TimeToStartDecay) - ("endtime", TimeToEndDecay) - ("starttrans", StartTrans); -} - -void DDecalFader::Tick () -{ - if (TheDecal == NULL) - { - Destroy (); - } - else - { - if (Level->maptime < TimeToStartDecay || Level->isFrozen()) - { - return; - } - else if (Level->maptime >= TimeToEndDecay) - { - TheDecal->Destroy (); // remove the decal - Destroy (); // remove myself - return; - } - if (StartTrans == -1) - { - StartTrans = TheDecal->Alpha; - } - - int distanceToEnd = TimeToEndDecay - Level->maptime; - int fadeDistance = TimeToEndDecay - TimeToStartDecay; - TheDecal->Alpha = StartTrans * distanceToEnd / fadeDistance; - } -} - DThinker *FDecalFaderAnim::CreateThinker (DBaseDecal *actor, side_t *wall) const { auto Level = actor->Level; @@ -1216,22 +1076,6 @@ DThinker *FDecalFaderAnim::CreateThinker (DBaseDecal *actor, side_t *wall) const return fader; } -IMPLEMENT_CLASS(DDecalStretcher, false, false) - -void DDecalStretcher::Serialize(FSerializer &arc) -{ - Super::Serialize (arc); - arc("starttime", TimeToStart) - ("endtime", TimeToStop) - ("goalx", GoalX) - ("startx", StartX) - ("stretchx", bStretchX) - ("goaly", GoalY) - ("starty", StartY) - ("stretchy", bStretchY) - ("started", bStarted); -} - DThinker *FDecalStretcherAnim::CreateThinker (DBaseDecal *actor, side_t *wall) const { auto Level = actor->Level; @@ -1264,61 +1108,6 @@ DThinker *FDecalStretcherAnim::CreateThinker (DBaseDecal *actor, side_t *wall) c return thinker; } -void DDecalStretcher::Tick () -{ - if (TheDecal == NULL) - { - Destroy (); - return; - } - if (Level->maptime < TimeToStart || Level->isFrozen()) - { - return; - } - if (Level->maptime >= TimeToStop) - { - if (bStretchX) - { - TheDecal->ScaleX = GoalX; - } - if (bStretchY) - { - TheDecal->ScaleY = GoalY; - } - Destroy (); - return; - } - if (!bStarted) - { - bStarted = true; - StartX = TheDecal->ScaleX; - StartY = TheDecal->ScaleY; - } - - int distance = Level->maptime - TimeToStart; - int maxDistance = TimeToStop - TimeToStart; - if (bStretchX) - { - TheDecal->ScaleX = StartX + (GoalX - StartX) * distance / maxDistance; - } - if (bStretchY) - { - TheDecal->ScaleY = StartY + (GoalY - StartY) * distance / maxDistance; - } -} - -IMPLEMENT_CLASS(DDecalSlider, false, false) - -void DDecalSlider::Serialize(FSerializer &arc) -{ - Super::Serialize (arc); - arc("starttime", TimeToStart) - ("endtime", TimeToStop) - ("disty", DistY) - ("starty", StartY) - ("started", bStarted); -} - DThinker *FDecalSliderAnim::CreateThinker (DBaseDecal *actor, side_t *wall) const { auto Level = actor->Level; @@ -1332,37 +1121,6 @@ DThinker *FDecalSliderAnim::CreateThinker (DBaseDecal *actor, side_t *wall) cons return thinker; } -void DDecalSlider::Tick () -{ - if (TheDecal == NULL) - { - Destroy (); - return; - } - if (Level->maptime < TimeToStart || Level->isFrozen()) - { - return; - } - if (!bStarted) - { - bStarted = true; - /*StartX = TheDecal->LeftDistance;*/ - StartY = TheDecal->Z; - } - if (Level->maptime >= TimeToStop) - { - /*TheDecal->LeftDistance = StartX + DistX;*/ - TheDecal->Z = StartY + DistY; - Destroy (); - return; - } - - int distance = Level->maptime - TimeToStart; - int maxDistance = TimeToStop - TimeToStart; - /*TheDecal->LeftDistance = StartX + DistX * distance / maxDistance);*/ - TheDecal->Z = StartY + DistY * distance / maxDistance; -} - DThinker *FDecalCombinerAnim::CreateThinker (DBaseDecal *actor, side_t *wall) const { DThinker *thinker = NULL; @@ -1388,57 +1146,6 @@ FDecalAnimator *FDecalLib::FindAnimator (const char *name) return NULL; } -IMPLEMENT_CLASS(DDecalColorer, false, false) - -void DDecalColorer::Serialize(FSerializer &arc) -{ - Super::Serialize (arc); - arc("starttime", TimeToStartDecay) - ("endtime", TimeToEndDecay) - ("startcolor", StartColor) - ("goalcolor", GoalColor); -} - -void DDecalColorer::Tick () -{ - if (TheDecal == NULL || !(TheDecal->RenderStyle.Flags & STYLEF_ColorIsFixed)) - { - Destroy (); - } - else - { - if (Level->maptime < TimeToStartDecay || Level->isFrozen()) - { - return; - } - else if (Level->maptime >= TimeToEndDecay) - { - TheDecal->SetShade (GoalColor); - Destroy (); // remove myself - } - if (StartColor.a == 255) - { - StartColor = TheDecal->AlphaColor & 0xffffff; - if (StartColor == GoalColor) - { - Destroy (); - return; - } - } - if (Level->maptime & 0) - { // Changing the shade can be expensive, so don't do it too often. - return; - } - - int distance = Level->maptime - TimeToStartDecay; - int maxDistance = TimeToEndDecay - TimeToStartDecay; - int r = StartColor.r + Scale (GoalColor.r - StartColor.r, distance, maxDistance); - int g = StartColor.g + Scale (GoalColor.g - StartColor.g, distance, maxDistance); - int b = StartColor.b + Scale (GoalColor.b - StartColor.b, distance, maxDistance); - TheDecal->SetShade (r, g, b); - } -} - DThinker *FDecalColorerAnim::CreateThinker (DBaseDecal *actor, side_t *wall) const { auto Level = actor->Level; diff --git a/src/decallib.h b/src/gamedata/decallib.h similarity index 100% rename from src/decallib.h rename to src/gamedata/decallib.h diff --git a/src/g_mapinfo.cpp b/src/gamedata/g_mapinfo.cpp similarity index 100% rename from src/g_mapinfo.cpp rename to src/gamedata/g_mapinfo.cpp diff --git a/src/gamedata/g_mapinfo.h b/src/gamedata/g_mapinfo.h new file mode 100644 index 000000000..e7e31deb2 --- /dev/null +++ b/src/gamedata/g_mapinfo.h @@ -0,0 +1,561 @@ +/* +** g_level.h +** +**--------------------------------------------------------------------------- +** Copyright 1998-2006 Randy Heit +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** +** 1. Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** 3. The name of the author may not be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**--------------------------------------------------------------------------- +** +*/ + +#ifndef __G_LEVEL_H__ +#define __G_LEVEL_H__ + +#include "doomtype.h" +#include "vectors.h" +#include "sc_man.h" +#include "resourcefiles/file_zip.h" + +struct level_info_t; +struct cluster_info_t; +class FSerializer; + +#if defined(_MSC_VER) +#pragma section(".yreg$u",read) +#define MSVC_YSEG __declspec(allocate(".yreg$u")) +#define GCC_YSEG +#else +#define MSVC_YSEG +#define GCC_YSEG __attribute__((section(SECTION_YREG))) __attribute__((used)) +#endif + +// The structure used to control scripts between maps +struct acsdefered_t +{ + enum EType + { + defexecute, + defexealways, + defsuspend, + defterminate + } type; + int script; + int args[3]; + int playernum; +}; + +FSerializer &Serialize(FSerializer &arc, const char *key, acsdefered_t &defer, acsdefered_t *def); + + +struct FIntermissionDescriptor; +struct FIntermissionAction; + +struct FMapInfoParser +{ + enum EFormatType + { + FMT_Unknown, + FMT_Old, + FMT_New + }; + + FScanner sc; + int format_type; + bool HexenHack; + + FMapInfoParser(int format = FMT_Unknown) + { + format_type = format; + HexenHack = false; + } + + bool ParseLookupName(FString &dest); + void ParseMusic(FString &name, int &order); + //void ParseLumpOrTextureName(char *name); + void ParseLumpOrTextureName(FString &name); + void ParseExitText(FName formap, level_info_t *info); + void ParseExitMusic(FName formap, level_info_t *info); + void ParseExitBackdrop(FName formap, level_info_t *info, bool ispic); + + void ParseCluster(); + void ParseNextMap(FString &mapname); + level_info_t *ParseMapHeader(level_info_t &defaultinfo); + void ParseMapDefinition(level_info_t &leveldef); + void ParseGameInfo(); + void ParseEpisodeInfo (); + void ParseSkill (); + void ParseMapInfo (int lump, level_info_t &gamedefaults, level_info_t &defaultinfo); + + void ParseOpenBrace(); + bool ParseCloseBrace(); + bool CheckAssign(); + void ParseAssign(); + void MustParseAssign(); + void ParseComma(); + bool CheckNumber(); + bool CheckFloat(); + void SkipToNext(); + void CheckEndOfFile(const char *block); + + void ParseIntermissionAction(FIntermissionDescriptor *Desc); + void ParseIntermission(); + void ParseDoomEdNums(); + void ParseSpawnNums(); + void ParseConversationIDs(); + void ParseAMColors(bool); + FName CheckEndSequence(); + FName ParseEndGame(); + void ParseDamageDefinition(); +}; + +#define DEFINE_MAP_OPTION(name, old) \ + static void MapOptHandler_##name(FMapInfoParser &parse, level_info_t *info); \ + static FMapOptInfo MapOpt_##name = \ + { #name, MapOptHandler_##name, old }; \ + MSVC_YSEG FMapOptInfo *mapopt_##name GCC_YSEG = &MapOpt_##name; \ + static void MapOptHandler_##name(FMapInfoParser &parse, level_info_t *info) + + +struct FMapOptInfo +{ + const char *name; + void (*handler) (FMapInfoParser &parse, level_info_t *levelinfo); + bool old; +}; + +enum ELevelFlags : unsigned int +{ + LEVEL_NOINTERMISSION = 0x00000001, + LEVEL_NOINVENTORYBAR = 0x00000002, // This effects Doom only, since it's the only one without a standard inventory bar. + LEVEL_DOUBLESKY = 0x00000004, + LEVEL_HASFADETABLE = 0x00000008, // Level uses Hexen's fadetable mapinfo to get fog + + LEVEL_MAP07SPECIAL = 0x00000010, + LEVEL_BRUISERSPECIAL = 0x00000020, + LEVEL_CYBORGSPECIAL = 0x00000040, + LEVEL_SPIDERSPECIAL = 0x00000080, + + LEVEL_SPECLOWERFLOOR = 0x00000100, + LEVEL_SPECOPENDOOR = 0x00000200, + LEVEL_SPECLOWERFLOORTOHIGHEST=0x00000300, + LEVEL_SPECACTIONSMASK = 0x00000300, + + LEVEL_MONSTERSTELEFRAG = 0x00000400, + LEVEL_ACTOWNSPECIAL = 0x00000800, + LEVEL_SNDSEQTOTALCTRL = 0x00001000, + LEVEL_FORCETILEDSKY = 0x00002000, + + LEVEL_CROUCH_NO = 0x00004000, + LEVEL_JUMP_NO = 0x00008000, + LEVEL_FREELOOK_NO = 0x00010000, + LEVEL_FREELOOK_YES = 0x00020000, + + // The absence of both of the following bits means that this level does not + // use falling damage (though damage can be forced with dmflags,. + LEVEL_FALLDMG_ZD = 0x00040000, // Level uses ZDoom's falling damage + LEVEL_FALLDMG_HX = 0x00080000, // Level uses Hexen's falling damage + + LEVEL_HEADSPECIAL = 0x00100000, // Heretic episode 1/4 + LEVEL_MINOTAURSPECIAL = 0x00200000, // Heretic episode 2/5 + LEVEL_SORCERER2SPECIAL = 0x00400000, // Heretic episode 3 + LEVEL_SPECKILLMONSTERS = 0x00800000, + + LEVEL_STARTLIGHTNING = 0x01000000, // Automatically start lightning + LEVEL_FILTERSTARTS = 0x02000000, // Apply mapthing filtering to player starts + LEVEL_LOOKUPLEVELNAME = 0x04000000, // Level name is the name of a language string + LEVEL_USEPLAYERSTARTZ = 0x08000000, // Use the Z position of player starts + + LEVEL_SWAPSKIES = 0x10000000, // Used by lightning + LEVEL_NOALLIES = 0x20000000, // i.e. Inside Strife's front base + LEVEL_CHANGEMAPCHEAT = 0x40000000, // Don't display cluster messages + LEVEL_VISITED = 0x80000000, // Used for intermission map + + // The flags uint64_t is now split into 2 DWORDs + LEVEL2_RANDOMPLAYERSTARTS = 0x00000001, // Select single player starts randomnly (no voodoo dolls) + LEVEL2_ALLMAP = 0x00000002, // The player picked up a map on this level + + LEVEL2_LAXMONSTERACTIVATION = 0x00000004, // Monsters can open doors depending on the door speed + LEVEL2_LAXACTIVATIONMAPINFO = 0x00000008, // LEVEL_LAXMONSTERACTIVATION is not a default. + + LEVEL2_MISSILESACTIVATEIMPACT=0x00000010, // Missiles are the activators of SPAC_IMPACT events, not their shooters + LEVEL2_FROZEN = 0x00000020, // Game is frozen by a TimeFreezer + + LEVEL2_KEEPFULLINVENTORY = 0x00000040, // doesn't reduce the amount of inventory items to 1 + + LEVEL2_PRERAISEWEAPON = 0x00000080, // players should spawn with their weapons fully raised (but not when respawning it multiplayer) + LEVEL2_MONSTERFALLINGDAMAGE = 0x00000100, + LEVEL2_CLIPMIDTEX = 0x00000200, + LEVEL2_WRAPMIDTEX = 0x00000400, + + LEVEL2_CHECKSWITCHRANGE = 0x00000800, + + LEVEL2_PAUSE_MUSIC_IN_MENUS = 0x00001000, + LEVEL2_TOTALINFIGHTING = 0x00002000, + LEVEL2_NOINFIGHTING = 0x00004000, + + LEVEL2_NOMONSTERS = 0x00008000, + LEVEL2_INFINITE_FLIGHT = 0x00010000, + + LEVEL2_ALLOWRESPAWN = 0x00020000, + + LEVEL2_FORCETEAMPLAYON = 0x00040000, + LEVEL2_FORCETEAMPLAYOFF = 0x00080000, + + LEVEL2_CONV_SINGLE_UNFREEZE = 0x00100000, + LEVEL2_RAILINGHACK = 0x00200000, // but UDMF requires them to be separate to have more control + LEVEL2_DUMMYSWITCHES = 0x00400000, + LEVEL2_HEXENHACK = 0x00800000, // Level was defined in a Hexen style MAPINFO + + LEVEL2_SMOOTHLIGHTING = 0x01000000, // Level uses the smooth lighting feature. + LEVEL2_POLYGRIND = 0x02000000, // Polyobjects grind corpses to gibs. + LEVEL2_RESETINVENTORY = 0x04000000, // Resets player inventory when starting this level (unless in a hub) + LEVEL2_RESETHEALTH = 0x08000000, // Resets player health when starting this level (unless in a hub) + + LEVEL2_NOSTATISTICS = 0x10000000, // This level should not have statistics collected + LEVEL2_ENDGAME = 0x20000000, // This is an epilogue level that cannot be quit. + LEVEL2_NOAUTOSAVEHINT = 0x40000000, // tell the game that an autosave for this level does not need to be kept + LEVEL2_FORGETSTATE = 0x80000000, // forget this map's state in a hub + + // More flags! + LEVEL3_FORCEFAKECONTRAST = 0x00000001, // forces fake contrast even with fog enabled + LEVEL3_REMOVEITEMS = 0x00000002, // kills all INVBAR items on map change. + LEVEL3_ATTENUATE = 0x00000004, // attenuate lights? + LEVEL3_NOLIGHTFADE = 0x00000008, // no light fading to black. + LEVEL3_NOCOLOREDSPRITELIGHTING = 0x00000010, // draw sprites only with color-less light + LEVEL3_EXITNORMALUSED = 0x00000020, + LEVEL3_EXITSECRETUSED = 0x00000040, + LEVEL3_FORCEWORLDPANNING = 0x00000080, // Forces the world panning flag for all textures, even those without it explicitly set. +}; + + +struct FSpecialAction +{ + FName Type; // this is initialized before the actors... + int Action; + int Args[5]; +}; + +class DScroller; + +class FScanner; +struct level_info_t; + +typedef TMap FMusicMap; + +enum EMapType : int +{ + MAPTYPE_UNKNOWN = 0, + MAPTYPE_DOOM, + MAPTYPE_HEXEN, + MAPTYPE_BUILD, + MAPTYPE_UDMF // This does not distinguish between namespaces. +}; + +struct FExitText +{ + enum EDefined + { + DEF_TEXT = 1, + DEF_MUSIC = 2, + DEF_BACKDROP = 4, + DEF_LOOKUP = 8, + DEF_PIC = 16 + }; + int16_t mDefined = 0; + int16_t mOrder = -1; + FString mText; + FString mMusic; + FString mBackdrop; + + FExitText(int def = 0, int order = -1, const FString &text = "", const FString &backdrop = "", const FString &music = "") + : mDefined(int16_t(def)), mOrder(int16_t(order)), mText(text), mMusic(music), mBackdrop(backdrop) + { + } +}; + + +struct level_info_t +{ + int levelnum; + + FString MapName; + FString NextMap; + FString NextSecretMap; + FString PName; + FString SkyPic1; + FString SkyPic2; + FString FadeTable; + FString F1Pic; + FString BorderTexture; + FString MapBackground; + + TMap ExitMapTexts; + + int cluster; + int partime; + int sucktime; + int32_t flags; + uint32_t flags2; + uint32_t flags3; + + FString Music; + FString LevelName; + int8_t WallVertLight, WallHorizLight; + int musicorder; + FCompressedBuffer Snapshot; + TArray deferred; + float skyspeed1; + float skyspeed2; + uint32_t fadeto; + uint32_t outsidefog; + int cdtrack; + unsigned int cdid; + double gravity; + double aircontrol; + int WarpTrans; + int airsupply; + uint32_t compatflags, compatflags2; + uint32_t compatmask, compatmask2; + FString Translator; // for converting Doom-format linedef and sector types. + int DefaultEnvironment; // Default sound environment for the map. + FName Intermission; + FName deathsequence; + FName slideshow; + uint32_t hazardcolor; + uint32_t hazardflash; + int fogdensity; + int outsidefogdensity; + int skyfog; + float pixelstretch; + + // Redirection: If any player is carrying the specified item, then + // you go to the RedirectMap instead of this one. + FName RedirectType; + FString RedirectMapName; + + FString EnterPic; + FString ExitPic; + FString InterMusic; + int intermusicorder; + TMap > MapInterMusic; + + FString SoundInfo; + FString SndSeq; + + double teamdamage; + + FMusicMap MusicMap; + + TArray specialactions; + + TArray PrecacheSounds; + TArray PrecacheTextures; + TArray PrecacheClasses; + + TArray EventHandlers; + + ELightMode lightmode; + int8_t brightfog; + int8_t lightadditivesurfaces; + int8_t notexturefill; + FVector3 skyrotatevector; + FVector3 skyrotatevector2; + + FString EDName; + FString acsName; + bool fs_nocheckposition; + + + level_info_t() + { + Reset(); + } + ~level_info_t() + { + Snapshot.Clean(); + ClearDefered(); + } + void Reset(); + bool isValid(); + FString LookupLevelName (); + void ClearDefered() + { + deferred.Clear(); + } + level_info_t *CheckLevelRedirect (); +}; + + +struct cluster_info_t +{ + int cluster; + FString FinaleFlat; + FString ExitText; + FString EnterText; + FString MessageMusic; + int musicorder; + int flags; + int cdtrack; + FString ClusterName; + unsigned int cdid; + + void Reset(); + +}; + +// Cluster flags +#define CLUSTER_HUB 0x00000001 // Cluster uses hub behavior +#define CLUSTER_EXITTEXTINLUMP 0x00000002 // Exit text is the name of a lump +#define CLUSTER_ENTERTEXTINLUMP 0x00000004 // Enter text is the name of a lump +#define CLUSTER_FINALEPIC 0x00000008 // Finale "flat" is actually a full-sized image +#define CLUSTER_LOOKUPEXITTEXT 0x00000010 // Exit text is the name of a language string +#define CLUSTER_LOOKUPENTERTEXT 0x00000020 // Enter text is the name of a language string +#define CLUSTER_LOOKUPNAME 0x00000040 // 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. + +extern TArray wadlevelinfos; +extern TArray wadclusterinfos; + +// mapname will be changed if it is a valid warptrans +bool CheckWarpTransMap (FString &mapname, bool substitute); + +cluster_info_t *FindClusterInfo (int cluster); +level_info_t *FindLevelInfo (const char *mapname, bool allowdefault=true); +level_info_t *FindLevelByNum (int num); +level_info_t *CheckLevelRedirect (level_info_t *info); + +FString CalcMapName (int episode, int level); + +void G_ParseMapInfo (FString basemapinfo); + +enum ESkillProperty +{ + SKILLP_FastMonsters, + SKILLP_Respawn, + SKILLP_RespawnLimit, + SKILLP_DisableCheats, + SKILLP_AutoUseHealth, + SKILLP_SpawnFilter, + SKILLP_EasyBossBrain, + SKILLP_ACSReturn, + SKILLP_NoPain, + SKILLP_EasyKey, + SKILLP_SlowMonsters, + SKILLP_Infight, + SKILLP_PlayerRespawn, +}; +enum EFSkillProperty // floating point properties +{ + SKILLP_AmmoFactor, + SKILLP_DropAmmoFactor, + SKILLP_ArmorFactor, + SKILLP_HealthFactor, + SKILLP_DamageFactor, + SKILLP_Aggressiveness, + SKILLP_MonsterHealth, + SKILLP_FriendlyHealth, + SKILLP_KickbackFactor, +}; + +int G_SkillProperty(ESkillProperty prop); +double G_SkillProperty(EFSkillProperty prop); +const char * G_SkillName(); + +typedef TMap SkillMenuNames; + +typedef TMap SkillActorReplacement; + +struct FSkillInfo +{ + FName Name = NAME_None; + double AmmoFactor, DoubleAmmoFactor, DropAmmoFactor; + double DamageFactor; + double ArmorFactor; + double HealthFactor; + double KickbackFactor; + + bool FastMonsters; + bool SlowMonsters; + bool DisableCheats; + bool AutoUseHealth; + + bool EasyBossBrain; + bool EasyKey; + bool NoMenu; + int RespawnCounter; + int RespawnLimit; + double Aggressiveness; + int SpawnFilter; + int ACSReturn; + FString MenuName; + FString PicName; + SkillMenuNames MenuNamesForPlayerClass; + bool MustConfirm; + FString MustConfirmText; + char Shortcut; + FString TextColor; + SkillActorReplacement Replace; + SkillActorReplacement Replaced; + double MonsterHealth; + double FriendlyHealth; + bool NoPain; + int Infighting; + bool PlayerRespawn; + + FSkillInfo() {} + FSkillInfo(const FSkillInfo &other) + { + operator=(other); + } + FSkillInfo &operator=(const FSkillInfo &other); + int GetTextColor() const; + + void SetReplacement(FName a, FName b); + FName GetReplacement(FName a); + void SetReplacedBy(FName b, FName a); + FName GetReplacedBy(FName b); +}; + +extern TArray AllSkills; +extern int DefaultSkill; + +struct FEpisode +{ + FString mEpisodeName; + FString mEpisodeMap; + FString mPicName; + char mShortcut; + bool mNoSkill; +}; + +extern TArray AllEpisodes; + +int ParseUMapInfo(int lumpnum); +void CommitUMapinfo(level_info_t *defaultinfo); + + +#endif //__G_LEVEL_H__ diff --git a/src/g_skill.cpp b/src/gamedata/g_skill.cpp similarity index 100% rename from src/g_skill.cpp rename to src/gamedata/g_skill.cpp diff --git a/src/gi.cpp b/src/gamedata/gi.cpp similarity index 100% rename from src/gi.cpp rename to src/gamedata/gi.cpp diff --git a/src/gi.h b/src/gamedata/gi.h similarity index 100% rename from src/gi.h rename to src/gamedata/gi.h diff --git a/src/gstrings.h b/src/gamedata/gstrings.h similarity index 100% rename from src/gstrings.h rename to src/gamedata/gstrings.h diff --git a/src/stringtable.cpp b/src/gamedata/stringtable.cpp similarity index 100% rename from src/stringtable.cpp rename to src/gamedata/stringtable.cpp diff --git a/src/stringtable.h b/src/gamedata/stringtable.h similarity index 100% rename from src/stringtable.h rename to src/gamedata/stringtable.h diff --git a/src/umapinfo.cpp b/src/gamedata/umapinfo.cpp similarity index 100% rename from src/umapinfo.cpp rename to src/gamedata/umapinfo.cpp diff --git a/src/w_wad.cpp b/src/gamedata/w_wad.cpp similarity index 100% rename from src/w_wad.cpp rename to src/gamedata/w_wad.cpp diff --git a/src/w_wad.h b/src/gamedata/w_wad.h similarity index 100% rename from src/w_wad.h rename to src/gamedata/w_wad.h diff --git a/src/w_zip.h b/src/gamedata/w_zip.h similarity index 100% rename from src/w_zip.h rename to src/gamedata/w_zip.h From 32e5be83ea529efb186cd0d522241811b7611200 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 1 Feb 2019 19:48:17 +0100 Subject: [PATCH 145/164] - moved a few more files and copied the data related parts of p_things.cpp to g_doomedmap.cpp --- src/CMakeLists.txt | 12 +- src/errors.h | 0 src/{ => g_shared}/statnums.h | 0 src/{ => gamedata}/d_dehacked.cpp | 0 src/{ => gamedata}/d_dehacked.h | 0 src/{ => gamedata}/g_doomedmap.cpp | 176 +++++++++++++++++++++++++++++ src/{ => gamedata}/info.cpp | 0 src/{ => gamedata}/info.h | 0 src/{ => gamedata}/keysections.cpp | 0 src/{ => gamedata}/p_terrain.cpp | 0 src/{ => gamedata}/p_terrain.h | 0 src/{ => gamedata}/teaminfo.cpp | 0 src/{ => gamedata}/teaminfo.h | 0 src/p_conversation.cpp | 11 -- src/p_conversation.h | 1 - src/p_things.cpp | 170 ---------------------------- 16 files changed, 182 insertions(+), 188 deletions(-) delete mode 100644 src/errors.h rename src/{ => g_shared}/statnums.h (100%) rename src/{ => gamedata}/d_dehacked.cpp (100%) rename src/{ => gamedata}/d_dehacked.h (100%) rename src/{ => gamedata}/g_doomedmap.cpp (67%) rename src/{ => gamedata}/info.cpp (100%) rename src/{ => gamedata}/info.h (100%) rename src/{ => gamedata}/keysections.cpp (100%) rename src/{ => gamedata}/p_terrain.cpp (100%) rename src/{ => gamedata}/p_terrain.h (100%) rename src/{ => gamedata}/teaminfo.cpp (100%) rename src/{ => gamedata}/teaminfo.h (100%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index da8e68db0..602166fe5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -892,7 +892,6 @@ set (PCH_SOURCES c_functions.cpp ct_chat.cpp cycler.cpp - d_dehacked.cpp d_iwad.cpp d_main.cpp d_anonstats.cpp @@ -905,7 +904,6 @@ set (PCH_SOURCES doomstat.cpp f_wipe.cpp g_cvars.cpp - g_doomedmap.cpp g_dumpinfo.cpp g_game.cpp g_hub.cpp @@ -914,8 +912,6 @@ set (PCH_SOURCES gitinfo.cpp hu_scores.cpp i_net.cpp - info.cpp - keysections.cpp m_cheat.cpp m_joy.cpp m_misc.cpp @@ -936,7 +932,6 @@ set (PCH_SOURCES p_setup.cpp p_spec.cpp p_states.cpp - p_terrain.cpp p_things.cpp p_tick.cpp p_usdf.cpp @@ -955,7 +950,6 @@ set (PCH_SOURCES st_stuff.cpp statistics.cpp stats.cpp - teaminfo.cpp v_2ddrawer.cpp v_blend.cpp v_draw.cpp @@ -975,6 +969,12 @@ set (PCH_SOURCES gamedata/stringtable.cpp gamedata/umapinfo.cpp gamedata/w_wad.cpp + gamedata/d_dehacked.cpp + gamedata/g_doomedmap.cpp + gamedata/info.cpp + gamedata/keysections.cpp + gamedata/p_terrain.cpp + gamedata/teaminfo.cpp g_shared/a_pickups.cpp g_shared/a_action.cpp g_shared/a_decals.cpp diff --git a/src/errors.h b/src/errors.h deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/statnums.h b/src/g_shared/statnums.h similarity index 100% rename from src/statnums.h rename to src/g_shared/statnums.h diff --git a/src/d_dehacked.cpp b/src/gamedata/d_dehacked.cpp similarity index 100% rename from src/d_dehacked.cpp rename to src/gamedata/d_dehacked.cpp diff --git a/src/d_dehacked.h b/src/gamedata/d_dehacked.h similarity index 100% rename from src/d_dehacked.h rename to src/gamedata/d_dehacked.h diff --git a/src/g_doomedmap.cpp b/src/gamedata/g_doomedmap.cpp similarity index 67% rename from src/g_doomedmap.cpp rename to src/gamedata/g_doomedmap.cpp index 6f99ded13..c1e3abc58 100644 --- a/src/g_doomedmap.cpp +++ b/src/gamedata/g_doomedmap.cpp @@ -97,6 +97,9 @@ static IdMap DoomEdFromMapinfo; //========================================================================== FDoomEdMap DoomEdMap; +// Set of spawnable things for the Thing_Spawn and Thing_Projectile specials. +FClassMap SpawnableThings; +FClassMap StrifeTypes; static int sortnums (const void *a, const void *b) { @@ -290,3 +293,176 @@ void InitActorNumsFromMapinfo() } DoomEdFromMapinfo.Clear(); // we do not need this any longer } + +PClassActor *P_GetSpawnableType(int spawnnum) +{ + if (spawnnum < 0) + { // A named arg from a UDMF map + FName spawnname = FName(ENamedName(-spawnnum)); + if (spawnname.IsValidName()) + { + return PClass::FindActor(spawnname); + } + } + else + { // A numbered arg from a Hexen or UDMF map + PClassActor **type = SpawnableThings.CheckKey(spawnnum); + if (type != NULL) + { + return *type; + } + } + return NULL; +} + +struct MapinfoSpawnItem +{ + FName classname; // DECORATE is read after MAPINFO so we do not have the actual classes available here yet. + // These are for error reporting. We must store the file information because it's no longer available when these items get resolved. + FString filename; + int linenum; +}; + +typedef TMap SpawnMap; +static SpawnMap SpawnablesFromMapinfo; +static SpawnMap ConversationIDsFromMapinfo; + +static int SpawnableSort(const void *a, const void *b) +{ + return (*((FClassMap::Pair **)a))->Key - (*((FClassMap::Pair **)b))->Key; +} + +static void DumpClassMap(FClassMap &themap) +{ + FClassMap::Iterator it(themap); + FClassMap::Pair *pair; + TArray allpairs(themap.CountUsed(), true); + int i = 0; + + // Sort into numerical order, since their arrangement in the map can + // be in an unspecified order. + while (it.NextPair(pair)) + { + allpairs[i++] = pair; + } + qsort(allpairs.Data(), i, sizeof(allpairs[0]), SpawnableSort); + for (int j = 0; j < i; ++j) + { + pair = allpairs[j]; + Printf ("%d %s\n", pair->Key, pair->Value->TypeName.GetChars()); + } +} + +CCMD(dumpspawnables) +{ + DumpClassMap(SpawnableThings); +} + +CCMD (dumpconversationids) +{ + DumpClassMap(StrifeTypes); +} + +void ClearStrifeTypes() +{ + StrifeTypes.Clear(); +} + + +static void ParseSpawnMap(FScanner &sc, SpawnMap & themap, const char *descript) +{ + TMap defined; + int error = 0; + + MapinfoSpawnItem editem; + + editem.filename = sc.ScriptName; + + while (true) + { + if (sc.CheckString("}")) return; + else if (sc.CheckNumber()) + { + int ednum = sc.Number; + sc.MustGetStringName("="); + sc.MustGetString(); + + bool *def = defined.CheckKey(ednum); + if (def != NULL) + { + sc.ScriptMessage("%s %d defined more than once", descript, ednum); + error++; + } + else if (ednum < 0) + { + sc.ScriptMessage("%s must be positive, got %d", descript, ednum); + error++; + } + defined[ednum] = true; + editem.classname = sc.String; + editem.linenum = sc.Line; + + themap.Insert(ednum, editem); + } + else + { + sc.ScriptError("Number expected"); + } + } + if (error > 0) + { + sc.ScriptError("%d errors encountered in %s definition", error, descript); + } +} + +void FMapInfoParser::ParseSpawnNums() +{ + ParseOpenBrace(); + ParseSpawnMap(sc, SpawnablesFromMapinfo, "Spawn number"); +} + +void FMapInfoParser::ParseConversationIDs() +{ + ParseOpenBrace(); + ParseSpawnMap(sc, ConversationIDsFromMapinfo, "Conversation ID"); +} + + +void InitClassMap(FClassMap &themap, SpawnMap &thedata) +{ + themap.Clear(); + SpawnMap::Iterator it(thedata); + SpawnMap::Pair *pair; + int error = 0; + + while (it.NextPair(pair)) + { + PClassActor *cls = NULL; + if (pair->Value.classname != NAME_None) + { + cls = PClass::FindActor(pair->Value.classname); + if (cls == NULL) + { + Printf(TEXTCOLOR_RED "Script error, \"%s\" line %d:\nUnknown actor class %s\n", + pair->Value.filename.GetChars(), pair->Value.linenum, pair->Value.classname.GetChars()); + error++; + } + themap.Insert(pair->Key, cls); + } + else + { + themap.Remove(pair->Key); + } + } + if (error > 0) + { + I_Error("%d unknown actor classes found", error); + } + thedata.Clear(); // we do not need this any longer +} + +void InitSpawnablesFromMapinfo() +{ + InitClassMap(SpawnableThings, SpawnablesFromMapinfo); + InitClassMap(StrifeTypes, ConversationIDsFromMapinfo); +} diff --git a/src/info.cpp b/src/gamedata/info.cpp similarity index 100% rename from src/info.cpp rename to src/gamedata/info.cpp diff --git a/src/info.h b/src/gamedata/info.h similarity index 100% rename from src/info.h rename to src/gamedata/info.h diff --git a/src/keysections.cpp b/src/gamedata/keysections.cpp similarity index 100% rename from src/keysections.cpp rename to src/gamedata/keysections.cpp diff --git a/src/p_terrain.cpp b/src/gamedata/p_terrain.cpp similarity index 100% rename from src/p_terrain.cpp rename to src/gamedata/p_terrain.cpp diff --git a/src/p_terrain.h b/src/gamedata/p_terrain.h similarity index 100% rename from src/p_terrain.h rename to src/gamedata/p_terrain.h diff --git a/src/teaminfo.cpp b/src/gamedata/teaminfo.cpp similarity index 100% rename from src/teaminfo.cpp rename to src/gamedata/teaminfo.cpp diff --git a/src/teaminfo.h b/src/gamedata/teaminfo.h similarity index 100% rename from src/teaminfo.h rename to src/gamedata/teaminfo.h diff --git a/src/p_conversation.cpp b/src/p_conversation.cpp index aaa46d256..92cca6185 100644 --- a/src/p_conversation.cpp +++ b/src/p_conversation.cpp @@ -97,7 +97,6 @@ struct TeaserSpeech static FRandom pr_randomspeech("RandomSpeech"); -FClassMap StrifeTypes; static int ConversationMenuY; // These two should be moved to player_t... @@ -121,16 +120,6 @@ static void TerminalResponse (const char *str); // //============================================================================ -void SetStrifeType(int convid, PClassActor *Class) -{ - StrifeTypes[convid] = Class; -} - -void ClearStrifeTypes() -{ - StrifeTypes.Clear(); -} - void FLevelLocals::SetConversation(int convid, PClassActor *Class, int dlgindex) { if (convid != -1) diff --git a/src/p_conversation.h b/src/p_conversation.h index ace3e4788..63e7707d9 100644 --- a/src/p_conversation.h +++ b/src/p_conversation.h @@ -59,7 +59,6 @@ struct FStrifeDialogueReply struct MapData; -void SetStrifeType(int convid, PClassActor *Class); PClassActor *GetStrifeType (int typenum); bool LoadScriptFile (FLevelLocals *Level, const char *name, bool include, int type = 0); diff --git a/src/p_things.cpp b/src/p_things.cpp index 9ef689e9c..e592319a4 100644 --- a/src/p_things.cpp +++ b/src/p_things.cpp @@ -47,9 +47,6 @@ #include "actorinlines.h" #include "vm.h" -// Set of spawnable things for the Thing_Spawn and Thing_Projectile specials. -FClassMap SpawnableThings; - static FRandom pr_leadtarget ("LeadTarget"); bool FLevelLocals::EV_Thing_Spawn (int tid, AActor *source, int type, DAngle angle, bool fog, int newtid) @@ -540,173 +537,6 @@ void P_Thing_SetVelocity(AActor *actor, const DVector3 &vec, bool add, bool setb } } -PClassActor *P_GetSpawnableType(int spawnnum) -{ - if (spawnnum < 0) - { // A named arg from a UDMF map - FName spawnname = FName(ENamedName(-spawnnum)); - if (spawnname.IsValidName()) - { - return PClass::FindActor(spawnname); - } - } - else - { // A numbered arg from a Hexen or UDMF map - PClassActor **type = SpawnableThings.CheckKey(spawnnum); - if (type != NULL) - { - return *type; - } - } - return NULL; -} - -struct MapinfoSpawnItem -{ - FName classname; // DECORATE is read after MAPINFO so we do not have the actual classes available here yet. - // These are for error reporting. We must store the file information because it's no longer available when these items get resolved. - FString filename; - int linenum; -}; - -typedef TMap SpawnMap; -static SpawnMap SpawnablesFromMapinfo; -static SpawnMap ConversationIDsFromMapinfo; - -static int SpawnableSort(const void *a, const void *b) -{ - return (*((FClassMap::Pair **)a))->Key - (*((FClassMap::Pair **)b))->Key; -} - -static void DumpClassMap(FClassMap &themap) -{ - FClassMap::Iterator it(themap); - FClassMap::Pair *pair; - TArray allpairs(themap.CountUsed(), true); - int i = 0; - - // Sort into numerical order, since their arrangement in the map can - // be in an unspecified order. - while (it.NextPair(pair)) - { - allpairs[i++] = pair; - } - qsort(allpairs.Data(), i, sizeof(allpairs[0]), SpawnableSort); - for (int j = 0; j < i; ++j) - { - pair = allpairs[j]; - Printf ("%d %s\n", pair->Key, pair->Value->TypeName.GetChars()); - } -} - -CCMD(dumpspawnables) -{ - DumpClassMap(SpawnableThings); -} - -CCMD (dumpconversationids) -{ - DumpClassMap(StrifeTypes); -} - - -static void ParseSpawnMap(FScanner &sc, SpawnMap & themap, const char *descript) -{ - TMap defined; - int error = 0; - - MapinfoSpawnItem editem; - - editem.filename = sc.ScriptName; - - while (true) - { - if (sc.CheckString("}")) return; - else if (sc.CheckNumber()) - { - int ednum = sc.Number; - sc.MustGetStringName("="); - sc.MustGetString(); - - bool *def = defined.CheckKey(ednum); - if (def != NULL) - { - sc.ScriptMessage("%s %d defined more than once", descript, ednum); - error++; - } - else if (ednum < 0) - { - sc.ScriptMessage("%s must be positive, got %d", descript, ednum); - error++; - } - defined[ednum] = true; - editem.classname = sc.String; - editem.linenum = sc.Line; - - themap.Insert(ednum, editem); - } - else - { - sc.ScriptError("Number expected"); - } - } - if (error > 0) - { - sc.ScriptError("%d errors encountered in %s definition", error, descript); - } -} - -void FMapInfoParser::ParseSpawnNums() -{ - ParseOpenBrace(); - ParseSpawnMap(sc, SpawnablesFromMapinfo, "Spawn number"); -} - -void FMapInfoParser::ParseConversationIDs() -{ - ParseOpenBrace(); - ParseSpawnMap(sc, ConversationIDsFromMapinfo, "Conversation ID"); -} - - -void InitClassMap(FClassMap &themap, SpawnMap &thedata) -{ - themap.Clear(); - SpawnMap::Iterator it(thedata); - SpawnMap::Pair *pair; - int error = 0; - - while (it.NextPair(pair)) - { - PClassActor *cls = NULL; - if (pair->Value.classname != NAME_None) - { - cls = PClass::FindActor(pair->Value.classname); - if (cls == NULL) - { - Printf(TEXTCOLOR_RED "Script error, \"%s\" line %d:\nUnknown actor class %s\n", - pair->Value.filename.GetChars(), pair->Value.linenum, pair->Value.classname.GetChars()); - error++; - } - themap.Insert(pair->Key, cls); - } - else - { - themap.Remove(pair->Key); - } - } - if (error > 0) - { - I_Error("%d unknown actor classes found", error); - } - thedata.Clear(); // we do not need this any longer -} - -void InitSpawnablesFromMapinfo() -{ - InitClassMap(SpawnableThings, SpawnablesFromMapinfo); - InitClassMap(StrifeTypes, ConversationIDsFromMapinfo); -} int P_Thing_CheckInputNum(player_t *p, int inputnum) { int renum = 0; From bf665961ccee34a18ff572adf5c0fdb112295064 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 1 Feb 2019 21:19:16 +0100 Subject: [PATCH 146/164] - moved KEYCONF_only CCMDs out of play files. --- src/c_console.h | 1 - src/d_event.h | 2 -- src/g_level.cpp | 2 +- src/gamedata/g_mapinfo.h | 1 - src/gamedata/keysections.cpp | 42 ++++++++++++++++++++++++++++++++++++ src/p_local.h | 5 ----- src/p_user.cpp | 40 ---------------------------------- 7 files changed, 43 insertions(+), 50 deletions(-) diff --git a/src/c_console.h b/src/c_console.h index 39c16c9bb..17aaf5de7 100644 --- a/src/c_console.h +++ b/src/c_console.h @@ -51,7 +51,6 @@ constate_e; extern int PrintColors[PRINTLEVELS + 2]; extern constate_e ConsoleState; -extern int ConBottom; // Initialize the console void C_InitConsole (int width, int height, bool ingame); diff --git a/src/d_event.h b/src/d_event.h index 302ef1aac..4aeb4979c 100644 --- a/src/d_event.h +++ b/src/d_event.h @@ -129,8 +129,6 @@ void D_Render(std::function action, bool interpolate); #define MAXEVENTS 128 extern event_t events[MAXEVENTS]; -extern int eventhead; -extern int eventtail; extern gameaction_t gameaction; diff --git a/src/g_level.cpp b/src/g_level.cpp index c2f61fbc4..dc3a7a48e 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -571,7 +571,7 @@ EXTERN_CVAR(Bool, sv_singleplayerrespawn) void FLevelLocals::ChangeLevel(const char *levelname, int position, int flags, int nextSkill) { - if (this != currentUILevel) return; // only the primary level may exit. + if (!isPrimaryLevel()) return; // only the primary level may exit. FString nextlevel; level_info_t *nextinfo = nullptr; diff --git a/src/gamedata/g_mapinfo.h b/src/gamedata/g_mapinfo.h index e7e31deb2..775b5f6a0 100644 --- a/src/gamedata/g_mapinfo.h +++ b/src/gamedata/g_mapinfo.h @@ -438,7 +438,6 @@ struct cluster_info_t #define CLUSTER_ALLOWINTERMISSION 0x00000100 // Allow intermissions between levels in a hub. extern TArray wadlevelinfos; -extern TArray wadclusterinfos; // mapname will be changed if it is a valid warptrans bool CheckWarpTransMap (FString &mapname, bool substitute); diff --git a/src/gamedata/keysections.cpp b/src/gamedata/keysections.cpp index 29b6b53d5..7076ebbaa 100644 --- a/src/gamedata/keysections.cpp +++ b/src/gamedata/keysections.cpp @@ -223,3 +223,45 @@ void D_LoadWadSettings () ParsingKeyConf = false; } +CCMD(clearplayerclasses) +{ + if (ParsingKeyConf) + { + PlayerClasses.Clear(); + } +} + +bool ValidatePlayerClass(PClassActor *ti, const char *name); + +CCMD(addplayerclass) +{ + if (ParsingKeyConf && argv.argc() > 1) + { + PClassActor *ti = PClass::FindActor(argv[1]); + + if (ValidatePlayerClass(ti, argv[1])) + { + FPlayerClass newclass; + + newclass.Type = ti; + newclass.Flags = 0; + + int arg = 2; + while (arg < argv.argc()) + { + if (!stricmp(argv[arg], "nomenu")) + { + newclass.Flags |= PCF_NOMENU; + } + else + { + Printf("Unknown flag '%s' for player class '%s'\n", argv[arg], argv[1]); + } + + arg++; + } + PlayerClasses.Push(newclass); + } + } +} + diff --git a/src/p_local.h b/src/p_local.h index e19581467..93405dc08 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -55,11 +55,6 @@ struct FLinePortal; #define STEEPSLOPE (46342/65536.) // [RH] Minimum floorplane.c value for walking -// Inspired by Maes -extern int bmapnegx; -extern int bmapnegy; - -//#define GRAVITY FRACUNIT #define MAXMOVE (30.) #define TALKRANGE (128.) diff --git a/src/p_user.cpp b/src/p_user.cpp index 9062957d8..dea310a8a 100644 --- a/src/p_user.cpp +++ b/src/p_user.cpp @@ -239,46 +239,6 @@ void SetupPlayerClasses () } } -CCMD (clearplayerclasses) -{ - if (ParsingKeyConf) - { - PlayerClasses.Clear (); - } -} - -CCMD (addplayerclass) -{ - if (ParsingKeyConf && argv.argc () > 1) - { - PClassActor *ti = PClass::FindActor(argv[1]); - - if (ValidatePlayerClass(ti, argv[1])) - { - FPlayerClass newclass; - - newclass.Type = ti; - newclass.Flags = 0; - - int arg = 2; - while (arg < argv.argc()) - { - if (!stricmp (argv[arg], "nomenu")) - { - newclass.Flags |= PCF_NOMENU; - } - else - { - Printf ("Unknown flag '%s' for player class '%s'\n", argv[arg], argv[1]); - } - - arg++; - } - PlayerClasses.Push (newclass); - } - } -} - CCMD (playerclasses) { for (unsigned int i = 0; i < PlayerClasses.Size (); i++) From 6c006a5fbd2b826c01c66a87f1655a697aee8198 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 1 Feb 2019 22:02:16 +0100 Subject: [PATCH 147/164] - added the missing Level parameters to AActor::StaticSpawn and P_ExecuteSpecial. I think these were the last two still missing it, all remaining uses of the global level variable are in code that doesn't get run through a level tick and are supposed to access the primary level. --- src/actor.h | 26 +++---- src/b_bot.h | 2 +- src/b_func.cpp | 14 ++-- src/d_main.cpp | 7 +- src/d_net.cpp | 4 +- src/fragglescript/t_func.cpp | 10 +-- src/g_level.cpp | 1 + src/g_levellocals.h | 1 + src/{ => g_shared}/p_checkposition.h | 0 src/g_shared/p_teleport.cpp | 2 +- src/p_acs.cpp | 42 +++++------ src/p_actionfunctions.cpp | 14 ++-- src/p_conversation.cpp | 4 +- src/p_effect.cpp | 2 +- src/p_enemy.cpp | 6 +- src/p_lnspec.cpp | 10 +-- src/p_lnspec.h | 21 +++--- src/p_map.cpp | 8 +- src/p_mobj.cpp | 46 +++++------ src/p_spec.cpp | 10 +-- src/p_things.cpp | 4 +- src/s_sound.cpp | 2 +- src/scripting/backend/codegen.cpp | 6 +- src/scripting/vmiterators.cpp | 6 +- src/tflags.h | 109 --------------------------- 25 files changed, 124 insertions(+), 233 deletions(-) rename src/{ => g_shared}/p_checkposition.h (100%) delete mode 100644 src/tflags.h diff --git a/src/actor.h b/src/actor.h index 6070c7b16..b53a92a63 100644 --- a/src/actor.h +++ b/src/actor.h @@ -650,7 +650,7 @@ public: virtual void PostBeginPlay() override; // Called immediately before the actor's first tick virtual void Tick() override; - static AActor *StaticSpawn (PClassActor *type, const DVector3 &pos, replace_t allowreplacement, bool SpawningMapThing = false); + static AActor *StaticSpawn (FLevelLocals *Level, PClassActor *type, const DVector3 &pos, replace_t allowreplacement, bool SpawningMapThing = false); inline AActor *GetDefault () const { @@ -1487,34 +1487,34 @@ public: PClassActor *ClassForSpawn(FName classname); -inline AActor *Spawn(PClassActor *type) +inline AActor *Spawn(FLevelLocals *Level, PClassActor *type) { - return AActor::StaticSpawn(type, DVector3(0, 0, 0), NO_REPLACE); + return AActor::StaticSpawn(Level, type, DVector3(0, 0, 0), NO_REPLACE); } -inline AActor *Spawn(PClassActor *type, const DVector3 &pos, replace_t allowreplacement) +inline AActor *Spawn(FLevelLocals *Level, PClassActor *type, const DVector3 &pos, replace_t allowreplacement) { - return AActor::StaticSpawn(type, pos, allowreplacement); + return AActor::StaticSpawn(Level, type, pos, allowreplacement); } -inline AActor *Spawn(FName type) +inline AActor *Spawn(FLevelLocals *Level, FName type) { - return AActor::StaticSpawn(ClassForSpawn(type), DVector3(0, 0, 0), NO_REPLACE); + return AActor::StaticSpawn(Level, ClassForSpawn(type), DVector3(0, 0, 0), NO_REPLACE); } -inline AActor *Spawn(FName type, const DVector3 &pos, replace_t allowreplacement) +inline AActor *Spawn(FLevelLocals *Level, FName type, const DVector3 &pos, replace_t allowreplacement) { - return AActor::StaticSpawn(ClassForSpawn(type), pos, allowreplacement); + return AActor::StaticSpawn(Level, ClassForSpawn(type), pos, allowreplacement); } -template inline T *Spawn(const DVector3 &pos, replace_t allowreplacement) +template inline T *Spawn(FLevelLocals *Level, const DVector3 &pos, replace_t allowreplacement) { - return static_cast(AActor::StaticSpawn(RUNTIME_CLASS(T), pos, allowreplacement)); + return static_cast(AActor::StaticSpawn(Level, RUNTIME_CLASS(T), pos, allowreplacement)); } -template inline T *Spawn() // for inventory items we do not need coordinates and replacement info. +template inline T *Spawn(FLevelLocals *Level) // for inventory items we do not need coordinates and replacement info. { - return static_cast(AActor::StaticSpawn(RUNTIME_CLASS(T), DVector3(0, 0, 0), NO_REPLACE)); + return static_cast(AActor::StaticSpawn(Level, RUNTIME_CLASS(T), DVector3(0, 0, 0), NO_REPLACE)); } inline PClassActor *PClass::FindActor(FName name) diff --git a/src/b_bot.h b/src/b_bot.h index 57323aada..a4f632eae 100644 --- a/src/b_bot.h +++ b/src/b_bot.h @@ -129,7 +129,7 @@ public: void StartTravel (); void FinishTravel (); bool IsLeader (player_t *player); - void SetBodyAt (const DVector3 &pos, int hostnum); + void SetBodyAt (FLevelLocals *Level, const DVector3 &pos, int hostnum); double FakeFire (AActor *source, AActor *dest, ticcmd_t *cmd); bool SafeCheckPosition (AActor *actor, double x, double y, FCheckPosition &tm); void BotTick(AActor *mo); diff --git a/src/b_func.cpp b/src/b_func.cpp index 207d4454b..f9925f534 100644 --- a/src/b_func.cpp +++ b/src/b_func.cpp @@ -235,7 +235,7 @@ void DBot::Dofire (ticcmd_t *cmd) // prediction aiming Dist = player->mo->Distance2D(enemy); fm = Dist / GetDefaultByType (GetBotInfo(player->ReadyWeapon).projectileType)->Speed; - Level->BotInfo.SetBodyAt(enemy->Pos() + enemy->Vel.XY() * fm * 2, 1); + Level->BotInfo.SetBodyAt(Level, enemy->Pos() + enemy->Vel.XY() * fm * 2, 1); Angle = player->mo->AngleTo(Level->BotInfo.body1); if (Check_LOS (enemy, SHOOTFOV)) no_fire = false; @@ -467,7 +467,7 @@ AActor *DBot::Find_enemy () //Creates a temporary mobj (invisible) at the given location. -void FCajunMaster::SetBodyAt (const DVector3 &pos, int hostnum) +void FCajunMaster::SetBodyAt (FLevelLocals *Level, const DVector3 &pos, int hostnum) { if (hostnum == 1) { @@ -477,7 +477,7 @@ void FCajunMaster::SetBodyAt (const DVector3 &pos, int hostnum) } else { - body1 = Spawn ("CajunBodyNode", pos, NO_REPLACE); + body1 = Spawn (Level, "CajunBodyNode", pos, NO_REPLACE); } } else if (hostnum == 2) @@ -488,7 +488,7 @@ void FCajunMaster::SetBodyAt (const DVector3 &pos, int hostnum) } else { - body2 = Spawn ("CajunBodyNode", pos, NO_REPLACE); + body2 = Spawn (Level, "CajunBodyNode", pos, NO_REPLACE); } } } @@ -505,7 +505,7 @@ void FCajunMaster::SetBodyAt (const DVector3 &pos, int hostnum) //Emulates missile travel. Returns distance travelled. double FCajunMaster::FakeFire (AActor *source, AActor *dest, ticcmd_t *cmd) { - AActor *th = Spawn ("CajunTrace", source->PosPlusZ(4*8.), NO_REPLACE); + AActor *th = Spawn (source->Level, "CajunTrace", source->PosPlusZ(4*8.), NO_REPLACE); th->target = source; // where it came from @@ -531,7 +531,7 @@ DAngle DBot::FireRox (AActor *enemy, ticcmd_t *cmd) AActor *actor; double m; - Level->BotInfo.SetBodyAt(player->mo->PosPlusZ(player->mo->Height / 2) + player->mo->Vel.XY() * 5, 2); + Level->BotInfo.SetBodyAt(Level, player->mo->PosPlusZ(player->mo->Height / 2) + player->mo->Vel.XY() * 5, 2); actor = Level->BotInfo.body2; @@ -541,7 +541,7 @@ DAngle DBot::FireRox (AActor *enemy, ticcmd_t *cmd) //Predict. m = ((dist+1) / GetDefaultByName("Rocket")->Speed); - Level->BotInfo.SetBodyAt(DVector3((enemy->Pos() + enemy->Vel * (m + 2)), ONFLOORZ), 1); + Level->BotInfo.SetBodyAt(Level, DVector3((enemy->Pos() + enemy->Vel * (m + 2)), ONFLOORZ), 1); //try the predicted location if (P_CheckSight (actor, Level->BotInfo.body1, SF_IGNOREVISIBILITY)) //See the predicted location, so give a test missile diff --git a/src/d_main.cpp b/src/d_main.cpp index c28c25ab9..871323fc3 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -367,7 +367,7 @@ void D_Render(std::function action, bool interpolate) // Check for the presence of dynamic lights at the start of the frame once. if ((gl_lights && vid_rendermode == 4) || (r_dynlights && vid_rendermode != 4)) { - Level->HasDynamicLights = !!level.lights; + Level->HasDynamicLights = !!Level->lights; } else Level->HasDynamicLights = false; // lights are off so effectively we have none. if (interpolate) Level->interpolator.DoInterpolations(I_GetTimeFrac()); @@ -2726,7 +2726,10 @@ void D_DoomMain (void) // clean up game state ST_Clear(); D_ErrorCleanup (); - level.Thinkers.DestroyThinkersInList(STAT_STATIC); + for (auto Level : AllLevels()) + { + Level->Thinkers.DestroyThinkersInList(STAT_STATIC); + } E_Shutdown(false); P_FreeLevelData(); diff --git a/src/d_net.cpp b/src/d_net.cpp index ac65061c6..4b5906f46 100644 --- a/src/d_net.cpp +++ b/src/d_net.cpp @@ -2330,7 +2330,7 @@ void Net_DoCommand (int type, uint8_t **stream, int player) const AActor *def = GetDefaultByType (typeinfo); DVector3 spawnpos = source->Vec3Angle(def->radius * 2 + source->radius, source->Angles.Yaw, 8.); - AActor *spawned = Spawn (typeinfo, spawnpos, ALLOW_REPLACE); + AActor *spawned = Spawn (&level, typeinfo, spawnpos, ALLOW_REPLACE); if (spawned != NULL) { if (type == DEM_SUMMONFRIEND || type == DEM_SUMMONFRIEND2 || type == DEM_SUMMONMBF) @@ -2507,7 +2507,7 @@ void Net_DoCommand (int type, uint8_t **stream, int player) } if (!CheckCheatmode(player == consoleplayer)) { - P_ExecuteSpecial(snum, NULL, players[player].mo, false, arg[0], arg[1], arg[2], arg[3], arg[4]); + P_ExecuteSpecial(&level, snum, NULL, players[player].mo, false, arg[0], arg[1], arg[2], arg[3], arg[4]); } } break; diff --git a/src/fragglescript/t_func.cpp b/src/fragglescript/t_func.cpp index 939693661..0af15a09a 100644 --- a/src/fragglescript/t_func.cpp +++ b/src/fragglescript/t_func.cpp @@ -855,7 +855,7 @@ void FParser::SF_Spawn(void) } t_return.type = svt_mobj; - t_return.value.mobj = Spawn(pclass, pos, ALLOW_REPLACE); + t_return.value.mobj = Spawn(Level, pclass, pos, ALLOW_REPLACE); if (t_return.value.mobj) { @@ -2071,7 +2071,7 @@ void FParser::SF_LineTrigger() mld.special=intvalue(t_argv[0]); mld.tag=t_argc > 1 ? intvalue(t_argv[1]) : 0; Level->TranslateLineDef(&line, &mld); - P_ExecuteSpecial(line.special, NULL, Script->trigger, false, + P_ExecuteSpecial(Level, line.special, NULL, Script->trigger, false, line.args[0],line.args[1],line.args[2],line.args[3],line.args[4]); } } @@ -2903,7 +2903,7 @@ void FParser::SF_SpawnExplosion() else pos.Z = Level->PointInSector(pos)->floorplane.ZatPoint(pos); - spawn = Spawn (pclass, pos, ALLOW_REPLACE); + spawn = Spawn (Level, pclass, pos, ALLOW_REPLACE); t_return.type = svt_int; t_return.value.i=0; if (spawn) @@ -3734,7 +3734,7 @@ void FParser::SF_SpawnShot2(void) t_return.type = svt_mobj; - AActor *mo = Spawn(pclass, source->PosPlusZ(z), ALLOW_REPLACE); + AActor *mo = Spawn(Level, pclass, source->PosPlusZ(z), ALLOW_REPLACE); if (mo) { S_Sound(mo, CHAN_VOICE, mo->SeeSound, 1, ATTN_NORM); @@ -3821,7 +3821,7 @@ void FParser::RunLineSpecial(const FLineSpecial *spec) if (t_argc>i) args[i]=intvalue(t_argv[i]); else args[i] = 0; } - t_return.value.i = P_ExecuteSpecial(spec->number, NULL,Script->trigger,false, args[0],args[1],args[2],args[3],args[4]); + t_return.value.i = P_ExecuteSpecial(Level, spec->number, NULL,Script->trigger,false, args[0],args[1],args[2],args[3],args[4]); } } diff --git a/src/g_level.cpp b/src/g_level.cpp index dc3a7a48e..193ba957c 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -168,6 +168,7 @@ void *statcopy; // for statistics driver FLevelLocals level; // info about current level FLevelLocals *currentUILevel = &level; // level for which to display the user interface. +FLevelLocals *currentVMLevel = &level; // level which currently ticks. Used as global input to the VM and some functions called by it. //========================================================================== diff --git a/src/g_levellocals.h b/src/g_levellocals.h index b0229af5f..1d4cec550 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -673,6 +673,7 @@ public: extern FLevelLocals level; extern FLevelLocals *currentUILevel; // level for which to display the user interface. This will always be the one the current consoleplayer is in. +extern FLevelLocals *currentVMLevel; inline FSectorPortal *line_t::GetTransferredPortal() { diff --git a/src/p_checkposition.h b/src/g_shared/p_checkposition.h similarity index 100% rename from src/p_checkposition.h rename to src/g_shared/p_checkposition.h diff --git a/src/g_shared/p_teleport.cpp b/src/g_shared/p_teleport.cpp index cf5743177..e0e57e53e 100644 --- a/src/g_shared/p_teleport.cpp +++ b/src/g_shared/p_teleport.cpp @@ -60,7 +60,7 @@ void P_SpawnTeleportFog(AActor *mobj, const DVector3 &pos, bool beforeTele, bool else { double fogDelta = mobj->flags & MF_MISSILE ? 0 : TELEFOGHEIGHT; - mo = Spawn((beforeTele ? mobj->TeleFogSourceType : mobj->TeleFogDestType), DVector3(pos, pos.Z + fogDelta), ALLOW_REPLACE); + mo = Spawn(mobj->Level, (beforeTele ? mobj->TeleFogSourceType : mobj->TeleFogDestType), DVector3(pos, pos.Z + fogDelta), ALLOW_REPLACE); } if (mo != NULL && setTarget) diff --git a/src/p_acs.cpp b/src/p_acs.cpp index cd412d727..404762395 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -1909,7 +1909,7 @@ void DPlaneWatcher::Tick () if ((LastD < WatchD && newd >= WatchD) || (LastD > WatchD && newd <= WatchD)) { - P_ExecuteSpecial(Special, Line, Activator, LineSide, Args[0], Args[1], Args[2], Args[3], Args[4]); + P_ExecuteSpecial(Level, Special, Line, Activator, LineSide, Args[0], Args[1], Args[2], Args[3], Args[4]); Destroy (); } @@ -3735,7 +3735,7 @@ int DLevelScript::DoSpawn (int type, const DVector3 &pos, int tid, DAngle angle, return 0; } - actor = Spawn (info, pos, ALLOW_REPLACE); + actor = Spawn (Level, info, pos, ALLOW_REPLACE); if (actor != NULL) { ActorFlags2 oldFlags2 = actor->flags2; @@ -5731,7 +5731,7 @@ int DLevelScript::CallFunction(int argCount, int funcIndex, int32_t *args) int arg2 = argCount > 2 ? args[2] : 0; int arg3 = argCount > 3 ? args[3] : 0; int arg4 = argCount > 4 ? args[4] : 0; - return P_ExecuteSpecial(NamedACSToNormalACS[funcIndex - ACSF_ACS_NamedExecute], + return P_ExecuteSpecial(Level, NamedACSToNormalACS[funcIndex - ACSF_ACS_NamedExecute], activationline, activator, backSide, scriptnum, arg1, arg2, arg3, arg4); } @@ -6950,20 +6950,20 @@ int DLevelScript::RunScript() break; case PCD_LSPEC1: - P_ExecuteSpecial(NEXTBYTE, activationline, activator, backSide, + P_ExecuteSpecial(Level, NEXTBYTE, activationline, activator, backSide, STACK(1) & specialargmask, 0, 0, 0, 0); sp -= 1; break; case PCD_LSPEC2: - P_ExecuteSpecial(NEXTBYTE, activationline, activator, backSide, + P_ExecuteSpecial(Level, NEXTBYTE, activationline, activator, backSide, STACK(2) & specialargmask, STACK(1) & specialargmask, 0, 0, 0); sp -= 2; break; case PCD_LSPEC3: - P_ExecuteSpecial(NEXTBYTE, activationline, activator, backSide, + P_ExecuteSpecial(Level, NEXTBYTE, activationline, activator, backSide, STACK(3) & specialargmask, STACK(2) & specialargmask, STACK(1) & specialargmask, 0, 0); @@ -6971,7 +6971,7 @@ int DLevelScript::RunScript() break; case PCD_LSPEC4: - P_ExecuteSpecial(NEXTBYTE, activationline, activator, backSide, + P_ExecuteSpecial(Level, NEXTBYTE, activationline, activator, backSide, STACK(4) & specialargmask, STACK(3) & specialargmask, STACK(2) & specialargmask, @@ -6980,7 +6980,7 @@ int DLevelScript::RunScript() break; case PCD_LSPEC5: - P_ExecuteSpecial(NEXTBYTE, activationline, activator, backSide, + P_ExecuteSpecial(Level, NEXTBYTE, activationline, activator, backSide, STACK(5) & specialargmask, STACK(4) & specialargmask, STACK(3) & specialargmask, @@ -6990,7 +6990,7 @@ int DLevelScript::RunScript() break; case PCD_LSPEC5RESULT: - STACK(5) = P_ExecuteSpecial(NEXTBYTE, activationline, activator, backSide, + STACK(5) = P_ExecuteSpecial(Level, NEXTBYTE, activationline, activator, backSide, STACK(5) & specialargmask, STACK(4) & specialargmask, STACK(3) & specialargmask, @@ -7000,7 +7000,7 @@ int DLevelScript::RunScript() break; case PCD_LSPEC5EX: - P_ExecuteSpecial(NEXTWORD, activationline, activator, backSide, + P_ExecuteSpecial(Level, NEXTWORD, activationline, activator, backSide, STACK(5) & specialargmask, STACK(4) & specialargmask, STACK(3) & specialargmask, @@ -7010,7 +7010,7 @@ int DLevelScript::RunScript() break; case PCD_LSPEC5EXRESULT: - STACK(5) = P_ExecuteSpecial(NEXTWORD, activationline, activator, backSide, + STACK(5) = P_ExecuteSpecial(Level, NEXTWORD, activationline, activator, backSide, STACK(5) & specialargmask, STACK(4) & specialargmask, STACK(3) & specialargmask, @@ -7021,14 +7021,14 @@ int DLevelScript::RunScript() case PCD_LSPEC1DIRECT: temp = NEXTBYTE; - P_ExecuteSpecial(temp, activationline, activator, backSide, + P_ExecuteSpecial(Level, temp, activationline, activator, backSide, uallong(pc[0]) & specialargmask ,0, 0, 0, 0); pc += 1; break; case PCD_LSPEC2DIRECT: temp = NEXTBYTE; - P_ExecuteSpecial(temp, activationline, activator, backSide, + P_ExecuteSpecial(Level, temp, activationline, activator, backSide, uallong(pc[0]) & specialargmask, uallong(pc[1]) & specialargmask, 0, 0, 0); pc += 2; @@ -7036,7 +7036,7 @@ int DLevelScript::RunScript() case PCD_LSPEC3DIRECT: temp = NEXTBYTE; - P_ExecuteSpecial(temp, activationline, activator, backSide, + P_ExecuteSpecial(Level, temp, activationline, activator, backSide, uallong(pc[0]) & specialargmask, uallong(pc[1]) & specialargmask, uallong(pc[2]) & specialargmask, 0, 0); @@ -7045,7 +7045,7 @@ int DLevelScript::RunScript() case PCD_LSPEC4DIRECT: temp = NEXTBYTE; - P_ExecuteSpecial(temp, activationline, activator, backSide, + P_ExecuteSpecial(Level, temp, activationline, activator, backSide, uallong(pc[0]) & specialargmask, uallong(pc[1]) & specialargmask, uallong(pc[2]) & specialargmask, @@ -7055,7 +7055,7 @@ int DLevelScript::RunScript() case PCD_LSPEC5DIRECT: temp = NEXTBYTE; - P_ExecuteSpecial(temp, activationline, activator, backSide, + P_ExecuteSpecial(Level, temp, activationline, activator, backSide, uallong(pc[0]) & specialargmask, uallong(pc[1]) & specialargmask, uallong(pc[2]) & specialargmask, @@ -7066,32 +7066,32 @@ int DLevelScript::RunScript() // Parameters for PCD_LSPEC?DIRECTB are by definition bytes so never need and-ing. case PCD_LSPEC1DIRECTB: - P_ExecuteSpecial(((uint8_t *)pc)[0], activationline, activator, backSide, + P_ExecuteSpecial(Level, ((uint8_t *)pc)[0], activationline, activator, backSide, ((uint8_t *)pc)[1], 0, 0, 0, 0); pc = (int *)((uint8_t *)pc + 2); break; case PCD_LSPEC2DIRECTB: - P_ExecuteSpecial(((uint8_t *)pc)[0], activationline, activator, backSide, + P_ExecuteSpecial(Level, ((uint8_t *)pc)[0], activationline, activator, backSide, ((uint8_t *)pc)[1], ((uint8_t *)pc)[2], 0, 0, 0); pc = (int *)((uint8_t *)pc + 3); break; case PCD_LSPEC3DIRECTB: - P_ExecuteSpecial(((uint8_t *)pc)[0], activationline, activator, backSide, + P_ExecuteSpecial(Level, ((uint8_t *)pc)[0], activationline, activator, backSide, ((uint8_t *)pc)[1], ((uint8_t *)pc)[2], ((uint8_t *)pc)[3], 0, 0); pc = (int *)((uint8_t *)pc + 4); break; case PCD_LSPEC4DIRECTB: - P_ExecuteSpecial(((uint8_t *)pc)[0], activationline, activator, backSide, + P_ExecuteSpecial(Level, ((uint8_t *)pc)[0], activationline, activator, backSide, ((uint8_t *)pc)[1], ((uint8_t *)pc)[2], ((uint8_t *)pc)[3], ((uint8_t *)pc)[4], 0); pc = (int *)((uint8_t *)pc + 5); break; case PCD_LSPEC5DIRECTB: - P_ExecuteSpecial(((uint8_t *)pc)[0], activationline, activator, backSide, + P_ExecuteSpecial(Level, ((uint8_t *)pc)[0], activationline, activator, backSide, ((uint8_t *)pc)[1], ((uint8_t *)pc)[2], ((uint8_t *)pc)[3], ((uint8_t *)pc)[4], ((uint8_t *)pc)[5]); pc = (int *)((uint8_t *)pc + 6); diff --git a/src/p_actionfunctions.cpp b/src/p_actionfunctions.cpp index 54d843268..b259b0830 100644 --- a/src/p_actionfunctions.cpp +++ b/src/p_actionfunctions.cpp @@ -868,7 +868,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_RadiusDamageSelf) // the player to indicate bad things happened. AActor *flash = NULL; if(flashtype != NULL) - flash = Spawn(flashtype, self->target->PosPlusZ(self->target->Height / 4), ALLOW_REPLACE); + flash = Spawn(self->Level, flashtype, self->target->PosPlusZ(self->target->Height / 4), ALLOW_REPLACE); int dmgFlags = 0; FName dmgType = NAME_BFGSplash; @@ -1585,7 +1585,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_SpawnDebris) double xo = (pr_spawndebris() - 128) / 16.; double yo = (pr_spawndebris() - 128) / 16.; double zo = pr_spawndebris()*self->Height / 256 + self->GetBobOffset(); - mo = Spawn(debris, self->Vec3Offset(xo, yo, zo), ALLOW_REPLACE); + mo = Spawn(self->Level, debris, self->Vec3Offset(xo, yo, zo), ALLOW_REPLACE); if (mo) { if (transfer_translation) @@ -1927,7 +1927,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_Burst) double xo = (pr_burst() - 128) * self->radius / 128; double yo = (pr_burst() - 128) * self->radius / 128; double zo = (pr_burst() * self->Height / 255); - mo = Spawn(chunk, self->Vec3Offset(xo, yo, zo), ALLOW_REPLACE); + mo = Spawn(self->Level, chunk, self->Vec3Offset(xo, yo, zo), ALLOW_REPLACE); if (mo) { @@ -3118,7 +3118,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_Teleport) P_SpawnTeleportFog(ref, prev, true, true); else { - fog1 = Spawn(fog_type, prev, ALLOW_REPLACE); + fog1 = Spawn(self->Level, fog_type, prev, ALLOW_REPLACE); if (fog1 != NULL) fog1->target = ref; } @@ -3129,7 +3129,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_Teleport) P_SpawnTeleportFog(ref, ref->Pos(), false, true); else { - fog2 = Spawn(fog_type, ref->Pos(), ALLOW_REPLACE); + fog2 = Spawn(self->Level, fog_type, ref->Pos(), ALLOW_REPLACE); if (fog2 != NULL) fog2->target = ref; } @@ -3305,7 +3305,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_LineEffect) { oldjunk.tag = tag; // Sector tag for linedef self->Level->TranslateLineDef(&junk, &oldjunk); // Turn into native type - res = !!P_ExecuteSpecial(junk.special, NULL, self, false, junk.args[0], + res = !!P_ExecuteSpecial(self->Level, junk.special, NULL, self, false, junk.args[0], junk.args[1], junk.args[2], junk.args[3], junk.args[4]); if (res && !(junk.flags & ML_REPEAT_SPECIAL)) // If only once, self->flags6 |= MF6_LINEDONE; // no more for this thing @@ -3657,7 +3657,7 @@ static bool DoRadiusGive(AActor *self, AActor *thing, PClassActor *item, int amo if ((flags & RGF_NOSIGHT) || P_CheckSight(thing, self, SF_IGNOREVISIBILITY | SF_IGNOREWATERBOUNDARY)) { // OK to give; target is in direct path, or the monster doesn't care about it being in line of sight. - auto gift = Spawn(item); + auto gift = Spawn(self->Level, item); if (gift->IsKindOf(NAME_Health)) { gift->IntVar(NAME_Amount) *= amount; diff --git a/src/p_conversation.cpp b/src/p_conversation.cpp index 92cca6185..349824b82 100644 --- a/src/p_conversation.cpp +++ b/src/p_conversation.cpp @@ -934,7 +934,7 @@ static void HandleReply(player_t *player, bool isconsole, int nodenum, int reply if (takestuff) { - auto item = Spawn(reply->GiveType); + auto item = Spawn(player->mo->Level, reply->GiveType); // Items given here should not count as items! item->ClearCounters(); if (item->GetClass()->TypeName == NAME_FlameThrower) @@ -966,7 +966,7 @@ static void HandleReply(player_t *player, bool isconsole, int nodenum, int reply if (reply->ActionSpecial != 0) { - takestuff |= !!P_ExecuteSpecial(reply->ActionSpecial, NULL, player->mo, false, + takestuff |= !!P_ExecuteSpecial(player->mo->Level, reply->ActionSpecial, NULL, player->mo, false, reply->Args[0], reply->Args[1], reply->Args[2], reply->Args[3], reply->Args[4]); } diff --git a/src/p_effect.cpp b/src/p_effect.cpp index 8822868bd..54f362347 100644 --- a/src/p_effect.cpp +++ b/src/p_effect.cpp @@ -863,7 +863,7 @@ void P_DrawRailTrail(AActor *source, TArray &portalhits, int color1, if (rnd & 4) diff.Z = clamp(diff.Z + ((rnd & 32) ? 1 : -1), -maxdiff, maxdiff); } - AActor *thing = Spawn (spawnclass, pos + diff, ALLOW_REPLACE); + AActor *thing = Spawn (source->Level, spawnclass, pos + diff, ALLOW_REPLACE); if (thing) { if (source) thing->target = source; diff --git a/src/p_enemy.cpp b/src/p_enemy.cpp index b53cd8d18..f590f67c2 100644 --- a/src/p_enemy.cpp +++ b/src/p_enemy.cpp @@ -2383,7 +2383,7 @@ void A_DoChase (AActor *actor, bool fastchase, FState *meleestate, FState *missi // as the goal. while ( (spec = specit.Next()) ) { - P_ExecuteSpecial(spec->special, NULL, actor, false, spec->args[0], + P_ExecuteSpecial(actor->Level, spec->special, NULL, actor, false, spec->args[0], spec->args[1], spec->args[2], spec->args[3], spec->args[4]); } @@ -3098,11 +3098,11 @@ void A_BossDeath(AActor *self) ml.tag = sa->Args[0]; line_t line; self->Level->TranslateLineDef(&line, &ml); - P_ExecuteSpecial(line.special, NULL, self, false, line.args[0], line.args[1], line.args[2], line.args[3], line.args[4]); + P_ExecuteSpecial(self->Level, line.special, nullptr, self, false, line.args[0], line.args[1], line.args[2], line.args[3], line.args[4]); } else { - P_ExecuteSpecial(sa->Action, NULL, self, false, sa->Args[0], sa->Args[1], sa->Args[2], sa->Args[3], sa->Args[4]); + P_ExecuteSpecial(self->Level, sa->Action, nullptr, self, false, sa->Args[0], sa->Args[1], sa->Args[2], sa->Args[3], sa->Args[4]); } } } diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index 63bdc8f15..8e0a56ec0 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -3287,13 +3287,13 @@ FUNC(LS_GlassBreak) { if (type != nullptr) { - glass = Spawn(*type, DVector3(linemid, ONFLOORZ), ALLOW_REPLACE); + glass = Spawn(Level, *type, DVector3(linemid, ONFLOORZ), ALLOW_REPLACE); glass->AddZ(24.); } } else { - glass = Spawn("GlassJunk", DVector3(linemid, ONFLOORZ), ALLOW_REPLACE); + glass = Spawn(Level, "GlassJunk", DVector3(linemid, ONFLOORZ), ALLOW_REPLACE); glass->AddZ(24.); glass->SetState(glass->SpawnState + (pr_glass() % glass->health)); } @@ -3927,7 +3927,7 @@ int P_FindLineSpecial (const char *string, int *min_args, int *max_args) // //========================================================================== -int P_ExecuteSpecial(int num, +int P_ExecuteSpecial(FLevelLocals *Level, int num, struct line_t *line, class AActor *activator, bool backSide, @@ -3939,7 +3939,7 @@ int P_ExecuteSpecial(int num, { if (num >= 0 && num < (int)countof(LineSpecials)) { - return LineSpecials[num](&level, line, activator, backSide, arg1, arg2, arg3, arg4, arg5); + return LineSpecials[num](Level, line, activator, backSide, arg1, arg2, arg3, arg4, arg5); } return 0; } @@ -3962,6 +3962,6 @@ DEFINE_ACTION_FUNCTION(FLevelLocals, ExecuteSpecial) PARAM_INT(arg4); PARAM_INT(arg5); - ACTION_RETURN_INT(P_ExecuteSpecial(special, linedef, activator, lineside, arg1, arg2, arg3, arg4, arg5)); + ACTION_RETURN_INT(P_ExecuteSpecial(self, special, linedef, activator, lineside, arg1, arg2, arg3, arg4, arg5)); } diff --git a/src/p_lnspec.h b/src/p_lnspec.h index 05d5dd0c6..044605b15 100644 --- a/src/p_lnspec.h +++ b/src/p_lnspec.h @@ -212,15 +212,16 @@ FLineSpecial *P_GetLineSpecialInfo(int num); int P_GetMaxLineSpecial(); int P_FindLineSpecial (const char *string, int *min_args=NULL, int *max_args=NULL); bool P_ActivateThingSpecial(AActor * thing, AActor * trigger, bool death=false); -int P_ExecuteSpecial(int num, - //FLevelLocals *lev, must be added later. - struct line_t *line, - class AActor *activator, - bool backSide, - int arg1, - int arg2, - int arg3, - int arg4, - int arg5); +int P_ExecuteSpecial( + FLevelLocals *lev, + int num, + struct line_t *line, + class AActor *activator, + bool backSide, + int arg1, + int arg2, + int arg3, + int arg4, + int arg5); #endif //__P_LNSPEC_H__ diff --git a/src/p_map.cpp b/src/p_map.cpp index e9639d5aa..4e52503ec 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -4440,7 +4440,7 @@ AActor *P_LineAttack(AActor *t1, DAngle angle, double distance, AActor *tempuff = NULL; if (pufftype != NULL) - tempuff = Spawn(pufftype, t1->Pos(), ALLOW_REPLACE); + tempuff = Spawn(t1->Level, pufftype, t1->Pos(), ALLOW_REPLACE); if (tempuff != NULL) { TData.PuffSpecies = tempuff->GetSpecies(); @@ -5185,7 +5185,7 @@ void P_RailAttack(FRailParams *p) // used as damage inflictor AActor *thepuff = NULL; - if (puffclass != NULL) thepuff = Spawn(puffclass, source->Pos(), ALLOW_REPLACE); + if (puffclass != NULL) thepuff = Spawn(source->Level, puffclass, source->Pos(), ALLOW_REPLACE); rail_data.PuffSpecies = (thepuff != NULL) ? thepuff->GetSpecies() : NAME_None; Trace(start, source->Sector, vec, p->distance, MF_SHOOTABLE, ML_BLOCKEVERYTHING, source, trace, flags, ProcessRailHit, &rail_data); @@ -6181,7 +6181,7 @@ void P_DoCrunch(AActor *thing, FChangePosition *cpos) { AActor *mo; - mo = Spawn(bloodcls, thing->PosPlusZ(thing->Height / 2), ALLOW_REPLACE); + mo = Spawn(thing->Level, bloodcls, thing->PosPlusZ(thing->Height / 2), ALLOW_REPLACE); mo->Vel.X = pr_crunch.Random2() / 16.; mo->Vel.Y = pr_crunch.Random2() / 16.; @@ -6825,7 +6825,7 @@ bool P_ActivateThingSpecial(AActor * thing, AActor * trigger, bool death) // Run the special, if any if (thing->special) { - res = !!P_ExecuteSpecial(thing->special, NULL, + res = !!P_ExecuteSpecial(thing->Level, thing->special, NULL, // TriggerActs overrides the level flag, which only concerns thing activated by death (((death && thing->Level->flags & LEVEL_ACTOWNSPECIAL && !(thing->activationtype & THINGSPEC_TriggerActs)) || (thing->activationtype & THINGSPEC_ThingActs)) // Who triggers? diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index ce0bcb7f8..4379ae32d 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -730,7 +730,7 @@ AActor *AActor::GiveInventoryType (PClassActor *type) { if (type != nullptr) { - auto item = Spawn (type); + auto item = Spawn (Level, type); if (!CallTryPickup (item, this)) { item->Destroy (); @@ -1227,7 +1227,7 @@ bool AActor::Grind(bool items) return false; } - AActor *gib = Spawn (i, Pos(), ALLOW_REPLACE); + AActor *gib = Spawn (Level, i, Pos(), ALLOW_REPLACE); if (gib != NULL) { gib->RenderStyle = RenderStyle; @@ -2820,7 +2820,7 @@ void P_NightmareRespawn (AActor *mobj) z = ONFLOORZ; // spawn it - mo = AActor::StaticSpawn(mobj->GetClass(), DVector3(mobj->SpawnPoint.X, mobj->SpawnPoint.Y, z), NO_REPLACE, true); + mo = AActor::StaticSpawn(mobj->Level, mobj->GetClass(), DVector3(mobj->SpawnPoint.X, mobj->SpawnPoint.Y, z), NO_REPLACE, true); mo->health = mobj->SpawnHealth(); if (z == ONFLOORZ) @@ -3578,7 +3578,7 @@ void AActor::Tick () { // add some smoke behind the rocket smokecounter = 0; - AActor *th = Spawn("RocketSmokeTrail", Vec3Offset(-Vel), ALLOW_REPLACE); + AActor *th = Spawn(Level, "RocketSmokeTrail", Vec3Offset(-Vel), ALLOW_REPLACE); if (th) { th->tics -= pr_rockettrail()&3; @@ -3596,7 +3596,7 @@ void AActor::Tick () double xo = -moveangle.Cos() * radius * 2 + pr_rockettrail() / 64.; double yo = -moveangle.Sin() * radius * 2 + pr_rockettrail() / 64.; double zo = -Height * Vel.Z / 8. + Height * (2 / 3.); - AActor * th = Spawn("GrenadeSmokeTrail", Vec3Offset(xo, yo, zo), ALLOW_REPLACE); + AActor * th = Spawn(Level, "GrenadeSmokeTrail", Vec3Offset(xo, yo, zo), ALLOW_REPLACE); if (th) { th->tics -= pr_rockettrail()&3; @@ -4530,7 +4530,7 @@ void ConstructActor(AActor *actor, const DVector3 &pos, bool SpawningMapThing) } -AActor *AActor::StaticSpawn(PClassActor *type, const DVector3 &pos, replace_t allowreplacement, bool SpawningMapThing) +AActor *AActor::StaticSpawn(FLevelLocals *Level, PClassActor *type, const DVector3 &pos, replace_t allowreplacement, bool SpawningMapThing) { if (type == NULL) { @@ -4544,7 +4544,7 @@ AActor *AActor::StaticSpawn(PClassActor *type, const DVector3 &pos, replace_t al AActor *actor; - actor = static_cast(level.CreateThinker(type)); + actor = static_cast(Level->CreateThinker(type)); ConstructActor(actor, pos, SpawningMapThing); return actor; @@ -4558,7 +4558,7 @@ DEFINE_ACTION_FUNCTION(AActor, Spawn) PARAM_FLOAT(y); PARAM_FLOAT(z); PARAM_INT(flags); - ACTION_RETURN_OBJECT(AActor::StaticSpawn(type, DVector3(x, y, z), replace_t(flags))); + ACTION_RETURN_OBJECT(AActor::StaticSpawn(currentVMLevel, type, DVector3(x, y, z), replace_t(flags))); } PClassActor *ClassForSpawn(FName classname) @@ -4975,7 +4975,7 @@ AActor *FLevelLocals::SpawnPlayer (FPlayerStart *mthing, int playernum, int flag spawn.Z = ONFLOORZ; } - mobj = Spawn (p->cls, spawn, NO_REPLACE); + mobj = Spawn (this, p->cls, spawn, NO_REPLACE); if (flags & LEVEL_USEPLAYERSTARTZ) { @@ -5423,7 +5423,7 @@ AActor *FLevelLocals::SpawnMapThing (FMapThing *mthing, int position) else sz = ONFLOORZ; - mobj = AActor::StaticSpawn (i, DVector3(mthing->pos, sz), NO_REPLACE, true); + mobj = AActor::StaticSpawn (this, i, DVector3(mthing->pos, sz), NO_REPLACE, true); if (sz == ONFLOORZ) { @@ -5582,7 +5582,7 @@ AActor *P_SpawnPuff (AActor *source, PClassActor *pufftype, const DVector3 &pos1 if (pufftype == nullptr) return nullptr; if (!(flags & PF_NORANDOMZ)) pos.Z += pr_spawnpuff.Random2() / 64.; - puff = Spawn(pufftype, pos, ALLOW_REPLACE); + puff = Spawn(source->Level, pufftype, pos, ALLOW_REPLACE); if (puff == NULL) return NULL; if ((puff->flags4 & MF4_RANDOMIZE) && puff->tics > 0) @@ -5685,7 +5685,7 @@ void P_SpawnBlood (const DVector3 &pos1, DAngle dir, int damage, AActor *origina if (bloodcls != NULL) { - th = Spawn(bloodcls, pos, NO_REPLACE); // GetBloodType already performed the replacement + th = Spawn(originator->Level, bloodcls, pos, NO_REPLACE); // GetBloodType already performed the replacement th->Vel.Z = 2; th->Angles.Yaw = dir; // [NG] Applying PUFFGETSOWNER to the blood will make it target the owner @@ -5792,7 +5792,7 @@ void P_BloodSplatter (const DVector3 &pos, AActor *originator, DAngle hitangle) { AActor *mo; - mo = Spawn(bloodcls, pos, NO_REPLACE); // GetBloodType already performed the replacement + mo = Spawn(originator->Level, bloodcls, pos, NO_REPLACE); // GetBloodType already performed the replacement mo->target = originator; mo->Vel.X = pr_splatter.Random2 () / 64.; mo->Vel.Y = pr_splatter.Random2() / 64.; @@ -5836,7 +5836,7 @@ void P_BloodSplatter2 (const DVector3 &pos, AActor *originator, DAngle hitangle) AActor *mo; - mo = Spawn (bloodcls, pos + add, NO_REPLACE); // GetBloodType already performed the replacement + mo = Spawn (originator->Level, bloodcls, pos + add, NO_REPLACE); // GetBloodType already performed the replacement mo->target = originator; // colorize the blood! @@ -5890,7 +5890,7 @@ void P_RipperBlood (AActor *mo, AActor *bleeder) if (bloodcls != NULL) { AActor *th; - th = Spawn (bloodcls, pos, NO_REPLACE); // GetBloodType already performed the replacement + th = Spawn (bleeder->Level, bloodcls, pos, NO_REPLACE); // GetBloodType already performed the replacement // [NG] Applying PUFFGETSOWNER to the blood will make it target the owner if (th->flags5 & MF5_PUFFGETSOWNER) th->target = bleeder; if (gameinfo.gametype == GAME_Heretic) @@ -6033,14 +6033,14 @@ foundone: { if (smallsplash && splash->SmallSplash) { - mo = Spawn(splash->SmallSplash, pos, ALLOW_REPLACE); + mo = Spawn(sec->Level, splash->SmallSplash, pos, ALLOW_REPLACE); if (mo) mo->Floorclip += splash->SmallSplashClip; } else { if (splash->SplashChunk) { - mo = Spawn(splash->SplashChunk, pos, ALLOW_REPLACE); + mo = Spawn(sec->Level, splash->SplashChunk, pos, ALLOW_REPLACE); mo->target = thing; if (splash->ChunkXVelShift != 255) { @@ -6054,7 +6054,7 @@ foundone: } if (splash->SplashBase) { - mo = Spawn(splash->SplashBase, pos, ALLOW_REPLACE); + mo = Spawn(sec->Level, splash->SplashBase, pos, ALLOW_REPLACE); } if (thing->player && !splash->NoAlert && alert) { @@ -6334,7 +6334,7 @@ AActor *P_SpawnMissileXYZ (DVector3 pos, AActor *source, AActor *dest, PClassAct pos.Z -= source->Floorclip; } - AActor *th = Spawn (type, pos, ALLOW_REPLACE); + AActor *th = Spawn (source->Level, type, pos, ALLOW_REPLACE); P_PlaySpawnSound(th, source); @@ -6445,7 +6445,7 @@ AActor *P_OldSpawnMissile(AActor *source, AActor *owner, AActor *dest, PClassAct { return nullptr; } - AActor *th = Spawn (type, source->PosPlusZ(32.), ALLOW_REPLACE); + AActor *th = Spawn (source->Level, type, source->PosPlusZ(32.), ALLOW_REPLACE); P_PlaySpawnSound(th, source); th->target = owner; // record missile's originator @@ -6559,7 +6559,7 @@ AActor *P_SpawnMissileAngleZSpeed (AActor *source, double z, z -= source->Floorclip; } - mo = Spawn (type, source->PosAtZ(z), ALLOW_REPLACE); + mo = Spawn (source->Level, type, source->PosAtZ(z), ALLOW_REPLACE); P_PlaySpawnSound(mo, source); if (owner == NULL) owner = source; @@ -6592,7 +6592,7 @@ DEFINE_ACTION_FUNCTION(AActor, SpawnMissileAngleZSpeed) AActor *P_SpawnSubMissile(AActor *source, PClassActor *type, AActor *target) { - AActor *other = Spawn(type, source->Pos(), ALLOW_REPLACE); + AActor *other = Spawn(source->Level, type, source->Pos(), ALLOW_REPLACE); if (source == nullptr || type == nullptr) { @@ -6707,7 +6707,7 @@ AActor *P_SpawnPlayerMissile (AActor *source, double x, double y, double z, } } DVector3 pos = source->Vec2OffsetZ(x, y, z); - AActor *MissileActor = Spawn (type, pos, ALLOW_REPLACE); + AActor *MissileActor = Spawn (source->Level, type, pos, ALLOW_REPLACE); if (pMissileActor) *pMissileActor = MissileActor; P_PlaySpawnSound(MissileActor, source); MissileActor->target = source; diff --git a/src/p_spec.cpp b/src/p_spec.cpp index b2ebd2cfb..c6a3a8bf5 100644 --- a/src/p_spec.cpp +++ b/src/p_spec.cpp @@ -177,10 +177,7 @@ bool P_ActivateLine (line_t *line, AActor *mo, int side, int activationType, DVe lineActivation = line->activation; repeat = line->flags & ML_REPEAT_SPECIAL; buttonSuccess = false; - buttonSuccess = P_ExecuteSpecial(line->special, - line, mo, side == 1, line->args[0], - line->args[1], line->args[2], - line->args[3], line->args[4]); + buttonSuccess = P_ExecuteSpecial(line->GetLevel(), line->special, line, mo, side == 1, line->args[0], line->args[1], line->args[2], line->args[3], line->args[4]); // [MK] Fire up WorldLineActivated if ( buttonSuccess ) E_WorldLineActivated(line, mo, activationType); @@ -399,10 +396,7 @@ bool P_PredictLine(line_t *line, AActor *mo, int side, int activationType) if (line->locknumber > 0) return false; lineActivation = line->activation; buttonSuccess = false; - buttonSuccess = P_ExecuteSpecial(line->special, - line, mo, side == 1, line->args[0], - line->args[1], line->args[2], - line->args[3], line->args[4]); + buttonSuccess = P_ExecuteSpecial(line->GetLevel(), line->special,line, mo, side == 1, line->args[0], line->args[1], line->args[2], line->args[3], line->args[4]); special = line->special; diff --git a/src/p_things.cpp b/src/p_things.cpp index e592319a4..d2ec3ee98 100644 --- a/src/p_things.cpp +++ b/src/p_things.cpp @@ -78,7 +78,7 @@ bool FLevelLocals::EV_Thing_Spawn (int tid, AActor *source, int type, DAngle ang } while (spot != NULL) { - mobj = Spawn (kind, spot->Pos(), ALLOW_REPLACE); + mobj = Spawn (spot->Level, kind, spot->Pos(), ALLOW_REPLACE); if (mobj != NULL) { @@ -310,7 +310,7 @@ bool FLevelLocals::EV_Thing_Projectile (int tid, AActor *source, int type, const { z -= spot->Floorclip; } - mobj = Spawn (kind, spot->PosAtZ(z), ALLOW_REPLACE); + mobj = Spawn (spot->Level, kind, spot->PosAtZ(z), ALLOW_REPLACE); if (mobj) { diff --git a/src/s_sound.cpp b/src/s_sound.cpp index 766821c8d..0bf1da0ad 100644 --- a/src/s_sound.cpp +++ b/src/s_sound.cpp @@ -2866,7 +2866,7 @@ CCMD (loopsound) } else { - AActor *icon = Spawn("SpeakerIcon", players[consoleplayer].mo->PosPlusZ(32.), ALLOW_REPLACE); + AActor *icon = Spawn(&level, "SpeakerIcon", players[consoleplayer].mo->PosPlusZ(32.), ALLOW_REPLACE); if (icon != NULL) { S_Sound(icon, CHAN_BODY | CHAN_LOOP, id, 1.f, ATTN_IDLE); diff --git a/src/scripting/backend/codegen.cpp b/src/scripting/backend/codegen.cpp index 495518f18..878c7beea 100644 --- a/src/scripting/backend/codegen.cpp +++ b/src/scripting/backend/codegen.cpp @@ -5189,7 +5189,7 @@ static DObject *BuiltinNew(PClass *cls, int outerside, int backwardscompatible) } else { - object = level.CreateThinker(cls); + object = currentVMLevel->CreateThinker(cls); } return object; } @@ -8628,7 +8628,7 @@ FxExpression *FxActionSpecialCall::Resolve(FCompileContext& ctx) int BuiltinCallLineSpecial(int special, AActor *activator, int arg1, int arg2, int arg3, int arg4, int arg5) { - return P_ExecuteSpecial(special, nullptr, activator, 0, arg1, arg2, arg3, arg4, arg5); + return P_ExecuteSpecial(currentVMLevel , special, nullptr, activator, 0, arg1, arg2, arg3, arg4, arg5); } DEFINE_ACTION_FUNCTION_NATIVE(DObject, BuiltinCallLineSpecial, BuiltinCallLineSpecial) @@ -8642,7 +8642,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(DObject, BuiltinCallLineSpecial, BuiltinCallLineSp PARAM_INT(arg4); PARAM_INT(arg5); - ACTION_RETURN_INT(P_ExecuteSpecial(special, nullptr, activator, 0, arg1, arg2, arg3, arg4, arg5)); + ACTION_RETURN_INT(P_ExecuteSpecial(currentVMLevel, special, nullptr, activator, 0, arg1, arg2, arg3, arg4, arg5)); } ExpEmit FxActionSpecialCall::Emit(VMFunctionBuilder *build) diff --git a/src/scripting/vmiterators.cpp b/src/scripting/vmiterators.cpp index 7e2ad47ad..9c7844129 100644 --- a/src/scripting/vmiterators.cpp +++ b/src/scripting/vmiterators.cpp @@ -51,7 +51,7 @@ IMPLEMENT_CLASS(DThinkerIterator, true, false); static DThinkerIterator *CreateThinkerIterator(PClass *type, int statnum) { - return Create(&level, type, statnum); + return Create(currentVMLevel, type, statnum); } DEFINE_ACTION_FUNCTION_NATIVE(DThinkerIterator, Create, CreateThinkerIterator) @@ -109,7 +109,7 @@ public: } DBlockLinesIterator(double x, double y, double z, double height, double radius, sector_t *sec) - :FMultiBlockLinesIterator(check, &level, x, y, z, height, radius, sec) + :FMultiBlockLinesIterator(check, currentVMLevel, x, y, z, height, radius, sec) { cres.line = nullptr; cres.Position.Zero(); @@ -183,7 +183,7 @@ public: } DBlockThingsIterator(double checkx, double checky, double checkz, double checkh, double checkradius, bool ignorerestricted, sector_t *newsec) - : iterator(check, &level, checkx, checky, checkz, checkh, checkradius, ignorerestricted, newsec) + : iterator(check, currentVMLevel, checkx, checky, checkz, checkh, checkradius, ignorerestricted, newsec) { cres.thing = nullptr; cres.Position.Zero(); diff --git a/src/tflags.h b/src/tflags.h deleted file mode 100644 index 18c2becaf..000000000 --- a/src/tflags.h +++ /dev/null @@ -1,109 +0,0 @@ -/* -** tflags.h -** -**--------------------------------------------------------------------------- -** Copyright 2015 Teemu Piippo -** All rights reserved. -** -** Redistribution and use in source and binary forms, with or without -** modification, are permitted provided that the following conditions -** are met: -** -** 1. Redistributions of source code must retain the above copyright -** notice, this list of conditions and the following disclaimer. -** 2. Redistributions in binary form must reproduce the above copyright -** notice, this list of conditions and the following disclaimer in the -** documentation and/or other materials provided with the distribution. -** 3. The name of the author may not be used to endorse or promote products -** derived from this software without specific prior written permission. -** -** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR -** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES -** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, -** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT -** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF -** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -**--------------------------------------------------------------------------- -** -*/ - -#pragma once -#include "doomtype.h" - -/* - * TFlags - * - * A Qt-inspired type-safe flagset type. - * - * T is the enum type of individual flags, - * TT is the underlying integer type used (defaults to uint32_t) - */ -template -class TFlags -{ - struct ZeroDummy {}; - -public: - typedef TFlags Self; - typedef T EnumType; - typedef TT IntType; - - TFlags() = default; - TFlags(const Self& other) = default; - TFlags (T value) : Value (static_cast (value)) {} - - // This allows initializing the flagset with 0, as 0 implicitly converts into a null pointer. - TFlags (ZeroDummy*) : Value (0) {} - - // Relation operators - Self operator| (Self other) const { return Self::FromInt (Value | other.GetValue()); } - Self operator& (Self other) const { return Self::FromInt (Value & other.GetValue()); } - Self operator^ (Self other) const { return Self::FromInt (Value ^ other.GetValue()); } - Self operator| (T value) const { return Self::FromInt (Value | value); } - Self operator& (T value) const { return Self::FromInt (Value & value); } - Self operator^ (T value) const { return Self::FromInt (Value ^ value); } - Self operator~() const { return Self::FromInt (~Value); } - - // Assignment operators - Self& operator= (Self other) { Value = other.GetValue(); return *this; } - Self& operator|= (Self other) { Value |= other.GetValue(); return *this; } - Self& operator&= (Self other) { Value &= other.GetValue(); return *this; } - Self& operator^= (Self other) { Value ^= other.GetValue(); return *this; } - Self& operator= (T value) { Value = value; return *this; } - Self& operator|= (T value) { Value |= value; return *this; } - Self& operator&= (T value) { Value &= value; return *this; } - Self& operator^= (T value) { Value ^= value; return *this; } - - // Access the value of the flagset - TT GetValue() const { return Value; } - operator TT() const { return Value; } - - // Set the value of the flagset manually with an integer. - // Please think twice before using this. - static Self FromInt (TT value) { return Self (static_cast (value)); } - -private: - template Self operator| (X value) const { return Self::FromInt (Value | value); } - template Self operator& (X value) const { return Self::FromInt (Value & value); } - template Self operator^ (X value) const { return Self::FromInt (Value ^ value); } - -public: // to be removed. - TT Value; -}; - -/* - * Additional operators for TFlags types. - */ -#define DEFINE_TFLAGS_OPERATORS(T) \ -inline T operator| (T::EnumType a, T::EnumType b) { return T::FromInt (T::IntType (a) | T::IntType (b)); } \ -inline T operator& (T::EnumType a, T::EnumType b) { return T::FromInt (T::IntType (a) & T::IntType (b)); } \ -inline T operator^ (T::EnumType a, T::EnumType b) { return T::FromInt (T::IntType (a) ^ T::IntType (b)); } \ -inline T operator| (T::EnumType a, T b) { return T::FromInt (T::IntType (a) | T::IntType (b)); } \ -inline T operator& (T::EnumType a, T b) { return T::FromInt (T::IntType (a) & T::IntType (b)); } \ -inline T operator^ (T::EnumType a, T b) { return T::FromInt (T::IntType (a) ^ T::IntType (b)); } \ -inline T operator~ (T::EnumType a) { return T::FromInt (~T::IntType (a)); } - From 45dc9a7b47b98aa1ea2ba9172952b38fd4b16013 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 2 Feb 2019 00:24:43 +0100 Subject: [PATCH 148/164] - renamed the level variables. currentUILevel is now primaryLevel. For ZScript, currentVMLevel was added. This is also exported as 'level' and will change as needed. This also means that no breaking deprecations will be needed in the future, because in order to sandbox a level only 4 variables need to be handled: level, players, playeringame and consoleplayer. The remaining global variables are not relevant for the level state. The static 'level' has been mostly removed from the code except some places that still need work. --- src/am_map.cpp | 26 +++---- src/b_bot.cpp | 6 +- src/bbannouncer.cpp | 4 +- src/c_cmds.cpp | 28 ++++---- src/c_console.cpp | 2 +- src/d_main.cpp | 14 ++-- src/d_net.cpp | 26 +++---- src/g_dumpinfo.cpp | 4 +- src/g_game.cpp | 38 +++++------ src/g_level.cpp | 37 +++++----- src/g_levellocals.h | 4 +- src/g_statusbar/sbarinfo.cpp | 2 +- src/g_statusbar/sbarinfo_commands.cpp | 68 +++++++++---------- src/g_statusbar/shared_sbar.cpp | 4 +- src/gamedata/g_mapinfo.cpp | 4 +- src/hu_scores.cpp | 2 +- src/intermission/intermission.cpp | 2 +- src/m_cheat.cpp | 2 +- src/p_saveg.cpp | 4 +- src/p_setup.cpp | 11 ++- src/p_tick.cpp | 30 ++++---- src/p_user.cpp | 4 +- src/posix/sdl/i_main.cpp | 2 +- .../hwrenderer/dynlights/hw_shadowmap.cpp | 3 +- src/s_sound.cpp | 56 +++++++-------- src/scripting/vmthunks.cpp | 7 +- src/st_stuff.cpp | 2 +- src/statistics.cpp | 4 +- src/v_2ddrawer.cpp | 2 +- src/v_video.cpp | 4 +- src/win32/i_main.cpp | 2 +- wadsrc/static/zscript/base.txt | 17 +++-- wadsrc/static/zscript/mapdata.txt | 13 ++-- .../static/zscript/menu/conversationmenu.txt | 2 +- wadsrc/static/zscript/menu/readthis.txt | 6 +- wadsrc/static/zscript/shared/player.txt | 14 ---- .../static/zscript/statscreen/statscreen.txt | 8 +-- wadsrc/static/zscript/statusbar/alt_hud.txt | 32 ++++----- wadsrc/static/zscript/statusbar/doom_sbar.txt | 4 +- wadsrc/static/zscript/statusbar/harm_sbar.txt | 2 +- .../static/zscript/statusbar/heretic_sbar.txt | 4 +- .../static/zscript/statusbar/hexen_sbar.txt | 2 +- wadsrc/static/zscript/statusbar/statusbar.txt | 20 +++--- .../static/zscript/statusbar/strife_sbar.txt | 2 +- 44 files changed, 266 insertions(+), 264 deletions(-) diff --git a/src/am_map.cpp b/src/am_map.cpp index 795840218..d2bb52ca6 100644 --- a/src/am_map.cpp +++ b/src/am_map.cpp @@ -130,8 +130,8 @@ CVAR(Int, am_showsubsector, -1, 0); CUSTOM_CVAR(Int, am_showalllines, -1, CVAR_NOINITCALL) // This is a cheat so don't save it. { - if (currentUILevel && currentUILevel->automap) - currentUILevel->automap->UpdateShowAllLines(); + if (primaryLevel && primaryLevel->automap) + primaryLevel->automap->UpdateShowAllLines(); } EXTERN_CVAR(Bool, sv_cheats) @@ -171,9 +171,9 @@ CUSTOM_CVAR(Int, am_emptyspacemargin, 0, CVAR_ARCHIVE) self = 90; } - if (nullptr != StatusBar && currentUILevel && currentUILevel->automap) + if (nullptr != StatusBar && primaryLevel && primaryLevel->automap) { - currentUILevel->automap->NewResolution(); + primaryLevel->automap->NewResolution(); } } @@ -191,8 +191,8 @@ CVAR(Float, am_zoomdir, 0, CVAR_ARCHIVE) CCMD(am_togglefollow) { am_followplayer = !am_followplayer; - if (currentUILevel && currentUILevel->automap) - currentUILevel->automap->ResetFollowLocation(); + if (primaryLevel && primaryLevel->automap) + primaryLevel->automap->ResetFollowLocation(); Printf("%s\n", GStrings(am_followplayer ? "AMSTR_FOLLOWON" : "AMSTR_FOLLOWOFF")); } @@ -210,9 +210,9 @@ CCMD(am_toggletexture) CCMD(am_setmark) { - if (currentUILevel && currentUILevel->automap) + if (primaryLevel && primaryLevel->automap) { - int m = currentUILevel->automap->addMark(); + int m = primaryLevel->automap->addMark(); if (m >= 0) { Printf("%s %d\n", GStrings("AMSTR_MARKEDSPOT"), m); @@ -222,7 +222,7 @@ CCMD(am_setmark) CCMD(am_clearmarks) { - if (currentUILevel && currentUILevel->automap && currentUILevel->automap->clearMarks()) + if (primaryLevel && primaryLevel->automap && primaryLevel->automap->clearMarks()) { Printf("%s\n", GStrings("AMSTR_MARKSCLEARED")); } @@ -230,8 +230,8 @@ CCMD(am_clearmarks) CCMD(am_gobig) { - if (currentUILevel && currentUILevel->automap) - currentUILevel->automap->GoBig(); + if (primaryLevel && primaryLevel->automap) + primaryLevel->automap->GoBig(); } CCMD(togglemap) @@ -3300,7 +3300,7 @@ void AM_ToggleMap() return; // ... or if there is no automap. - if (!currentUILevel || !currentUILevel->automap) + if (!primaryLevel || !primaryLevel->automap) return; if (!automapactive) @@ -3313,7 +3313,7 @@ void AM_ToggleMap() Button_AM_ZoomIn.Reset(); Button_AM_ZoomOut.Reset(); - currentUILevel->automap->startDisplay(); + primaryLevel->automap->startDisplay(); automapactive = true; viewactive = (am_overlay != 0.f); } diff --git a/src/b_bot.cpp b/src/b_bot.cpp index 6924c9c93..bb15fc8bc 100644 --- a/src/b_bot.cpp +++ b/src/b_bot.cpp @@ -173,9 +173,9 @@ CCMD (addbot) } if (argv.argc() > 1) - currentUILevel->BotInfo.SpawnBot (argv[1]); + primaryLevel->BotInfo.SpawnBot (argv[1]); else - currentUILevel->BotInfo.SpawnBot (nullptr); + primaryLevel->BotInfo.SpawnBot (nullptr); } void FCajunMaster::ClearPlayer (int i, bool keepTeam) @@ -232,7 +232,7 @@ CCMD (freeze) CCMD (listbots) { - botinfo_t *thebot = currentUILevel->BotInfo.botinfo; + botinfo_t *thebot = primaryLevel->BotInfo.botinfo; int count = 0; while (thebot) diff --git a/src/bbannouncer.cpp b/src/bbannouncer.cpp index 58243ea5c..f0533cac1 100644 --- a/src/bbannouncer.cpp +++ b/src/bbannouncer.cpp @@ -182,9 +182,9 @@ static FRandom pr_bbannounce ("BBAnnounce"); void DoVoiceAnnounce (const char *sound) { // Don't play announcements too close together - if (LastAnnounceTime == 0 || LastAnnounceTime <= currentUILevel->time-5) + if (LastAnnounceTime == 0 || LastAnnounceTime <= primaryLevel->time-5) { - LastAnnounceTime = currentUILevel->time; + LastAnnounceTime = primaryLevel->time; S_Sound (CHAN_VOICE, sound, 1, ATTN_NONE); } } diff --git a/src/c_cmds.cpp b/src/c_cmds.cpp index 44ddbe3e4..b33dd91ce 100644 --- a/src/c_cmds.cpp +++ b/src/c_cmds.cpp @@ -366,7 +366,7 @@ CCMD (changemap) if (argv.argc() > 1) { const char *mapname = argv[1]; - if (!strcmp(mapname, "*")) mapname = currentUILevel->MapName.GetChars(); + if (!strcmp(mapname, "*")) mapname = primaryLevel->MapName.GetChars(); try { @@ -946,7 +946,7 @@ static void PrintFilteredActorList(const ActorTypeChecker IsActorType, const cha } } // This only works on the primary level. - auto it = currentUILevel->GetThinkerIterator(); + auto it = primaryLevel->GetThinkerIterator(); while ( (mo = it.Next()) ) { @@ -1063,14 +1063,14 @@ CCMD(changesky) FTextureID newsky = TexMan.GetTextureID(sky1name, ETextureType::Wall, FTextureManager::TEXMAN_Overridable | FTextureManager::TEXMAN_ReturnFirst); if (newsky.Exists()) { - currentUILevel->skytexture1 = newsky; + primaryLevel->skytexture1 = newsky; } else { Printf("changesky: Texture '%s' not found\n", sky1name); } } - InitSkyMap (currentUILevel); + InitSkyMap (primaryLevel); } //----------------------------------------------------------------------------- @@ -1101,9 +1101,9 @@ CCMD(nextmap) return; } - if (currentUILevel->NextMap.Len() > 0 && currentUILevel->NextMap.Compare("enDSeQ", 6)) + if (primaryLevel->NextMap.Len() > 0 && primaryLevel->NextMap.Compare("enDSeQ", 6)) { - G_DeferedInitNew(currentUILevel->NextMap); + G_DeferedInitNew(primaryLevel->NextMap); } else { @@ -1125,9 +1125,9 @@ CCMD(nextsecret) return; } - if (currentUILevel->NextSecretMap.Len() > 0 && currentUILevel->NextSecretMap.Compare("enDSeQ", 6)) + if (primaryLevel->NextSecretMap.Len() > 0 && primaryLevel->NextSecretMap.Compare("enDSeQ", 6)) { - G_DeferedInitNew(currentUILevel->NextSecretMap); + G_DeferedInitNew(primaryLevel->NextSecretMap); } else { @@ -1172,10 +1172,10 @@ static void PrintSecretString(const char *string, bool thislevel) { auto secnum = (unsigned)strtoull(string+2, (char**)&string, 10); if (*string == ';') string++; - if (thislevel && secnum < currentUILevel->sectors.Size()) + if (thislevel && secnum < primaryLevel->sectors.Size()) { - if (currentUILevel->sectors[secnum].isSecret()) colstr = TEXTCOLOR_RED; - else if (currentUILevel->sectors[secnum].wasSecret()) colstr = TEXTCOLOR_GREEN; + if (primaryLevel->sectors[secnum].isSecret()) colstr = TEXTCOLOR_RED; + else if (primaryLevel->sectors[secnum].wasSecret()) colstr = TEXTCOLOR_GREEN; else colstr = TEXTCOLOR_ORANGE; } } @@ -1183,7 +1183,7 @@ static void PrintSecretString(const char *string, bool thislevel) { long tid = (long)strtoll(string+2, (char**)&string, 10); if (*string == ';') string++; - auto it = currentUILevel->GetActorIterator(tid); + auto it = primaryLevel->GetActorIterator(tid); AActor *actor; bool foundone = false; if (thislevel) @@ -1216,8 +1216,8 @@ static void PrintSecretString(const char *string, bool thislevel) CCMD(secret) { - const char *mapname = argv.argc() < 2? currentUILevel->MapName.GetChars() : argv[1]; - bool thislevel = !stricmp(mapname, currentUILevel->MapName); + const char *mapname = argv.argc() < 2? primaryLevel->MapName.GetChars() : argv[1]; + bool thislevel = !stricmp(mapname, primaryLevel->MapName); bool foundsome = false; int lumpno=Wads.CheckNumForName("SECRETS"); diff --git a/src/c_console.cpp b/src/c_console.cpp index b05e4c5a1..b25303c26 100644 --- a/src/c_console.cpp +++ b/src/c_console.cpp @@ -1243,7 +1243,7 @@ void C_FullConsole () if (gamestate != GS_STARTUP) { gamestate = GS_FULLCONSOLE; - currentUILevel->Music = ""; + primaryLevel->Music = ""; S_Start (); P_FreeLevelData (); V_SetBlend (0,0,0,0); diff --git a/src/d_main.cpp b/src/d_main.cpp index 871323fc3..71c9da650 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -172,7 +172,7 @@ CUSTOM_CVAR (Int, fraglimit, 0, CVAR_SERVERINFO) if (playeringame[i] && self <= D_GetFragCount(&players[i])) { Printf ("%s\n", GStrings("TXT_FRAGLIMIT")); - level.ExitLevel (0, false); + primaryLevel->ExitLevel (0, false); break; } } @@ -789,7 +789,7 @@ void D_Display () screen->DrawBlend(viewsec); if (automapactive) { - currentUILevel->automap->Drawer (hud_althud? viewheight : StatusBar->GetTopOfStatusbar()); + primaryLevel->automap->Drawer (hud_althud? viewheight : StatusBar->GetTopOfStatusbar()); } // for timing the statusbar code. @@ -959,7 +959,7 @@ void D_Display () void D_ErrorCleanup () { savegamerestore = false; - level.BotInfo.RemoveAllBots (&level, true); + primaryLevel->BotInfo.RemoveAllBots (primaryLevel, true); D_QuitNetGame (); if (demorecording || demoplayback) G_CheckDemoStatus (); @@ -2555,14 +2555,14 @@ void D_DoomMain (void) PClassActor::StaticSetActorNums(); //Added by MC: - level.BotInfo.getspawned.Clear(); + primaryLevel->BotInfo.getspawned.Clear(); argcount = Args->CheckParmList("-bots", &args); for (p = 0; p < argcount; ++p) { - level.BotInfo.getspawned.Push(args[p]); + primaryLevel->BotInfo.getspawned.Push(args[p]); } - level.BotInfo.spawn_tries = 0; - level.BotInfo.wanted_botnum = level.BotInfo.getspawned.Size(); + primaryLevel->BotInfo.spawn_tries = 0; + primaryLevel->BotInfo.wanted_botnum = primaryLevel->BotInfo.getspawned.Size(); if (!batchrun) Printf ("P_Init: Init Playloop state.\n"); StartScreen->LoadingStatus ("Init game engine", 0x3f); diff --git a/src/d_net.cpp b/src/d_net.cpp index 4b5906f46..6ad9b564d 100644 --- a/src/d_net.cpp +++ b/src/d_net.cpp @@ -2222,8 +2222,8 @@ void Net_DoCommand (int type, uint8_t **stream, int player) s = ReadString (stream); // Using LEVEL_NOINTERMISSION tends to throw the game out of sync. // That was a long time ago. Maybe it works now? - level.flags |= LEVEL_CHANGEMAPCHEAT; - level.ChangeLevel(s, pos, 0); + primaryLevel->flags |= LEVEL_CHANGEMAPCHEAT; + primaryLevel->ChangeLevel(s, pos, 0); break; case DEM_SUICIDE: @@ -2231,11 +2231,11 @@ void Net_DoCommand (int type, uint8_t **stream, int player) break; case DEM_ADDBOT: - level.BotInfo.TryAddBot (&level, stream, player); + primaryLevel->BotInfo.TryAddBot (primaryLevel, stream, player); break; case DEM_KILLBOTS: - level.BotInfo.RemoveAllBots (&level, true); + primaryLevel->BotInfo.RemoveAllBots (primaryLevel, true); Printf ("Removed all bots\n"); break; @@ -2330,14 +2330,14 @@ void Net_DoCommand (int type, uint8_t **stream, int player) const AActor *def = GetDefaultByType (typeinfo); DVector3 spawnpos = source->Vec3Angle(def->radius * 2 + source->radius, source->Angles.Yaw, 8.); - AActor *spawned = Spawn (&level, typeinfo, spawnpos, ALLOW_REPLACE); + AActor *spawned = Spawn (primaryLevel, typeinfo, spawnpos, ALLOW_REPLACE); if (spawned != NULL) { if (type == DEM_SUMMONFRIEND || type == DEM_SUMMONFRIEND2 || type == DEM_SUMMONMBF) { if (spawned->CountsAsKill()) { - level.total_monsters--; + primaryLevel->total_monsters--; } spawned->FriendPlayer = player + 1; spawned->flags |= MF_FRIENDLY; @@ -2507,7 +2507,7 @@ void Net_DoCommand (int type, uint8_t **stream, int player) } if (!CheckCheatmode(player == consoleplayer)) { - P_ExecuteSpecial(&level, snum, NULL, players[player].mo, false, arg[0], arg[1], arg[2], arg[3], arg[4]); + P_ExecuteSpecial(primaryLevel, snum, NULL, players[player].mo, false, arg[0], arg[1], arg[2], arg[3], arg[4]); } } break; @@ -2560,11 +2560,11 @@ void Net_DoCommand (int type, uint8_t **stream, int player) if (cls != NULL) { - killcount = currentUILevel->Massacre(false, cls->TypeName); + killcount = primaryLevel->Massacre(false, cls->TypeName); PClassActor *cls_rep = cls->GetReplacement(); if (cls != cls_rep) { - killcount += currentUILevel->Massacre(false, cls_rep->TypeName); + killcount += primaryLevel->Massacre(false, cls_rep->TypeName); } Printf ("Killed %d monsters of type %s.\n",killcount, s); } @@ -2582,11 +2582,11 @@ void Net_DoCommand (int type, uint8_t **stream, int player) PClassActor *cls = PClass::FindActor(s); if (cls != NULL && cls->IsDescendantOf(RUNTIME_CLASS(AActor))) { - removecount = RemoveClass(&level, cls); + removecount = RemoveClass(primaryLevel, cls); const PClass *cls_rep = cls->GetReplacement(); if (cls != cls_rep) { - removecount += RemoveClass(&level, cls_rep); + removecount += RemoveClass(primaryLevel, cls_rep); } Printf("Removed %d actors of type %s.\n", removecount, s); } @@ -2660,7 +2660,7 @@ void Net_DoCommand (int type, uint8_t **stream, int player) case DEM_FINISHGAME: // Simulate an end-of-game action - level.ChangeLevel(NULL, 0, 0); + primaryLevel->ChangeLevel(NULL, 0, 0); break; case DEM_NETEVENT: @@ -2698,7 +2698,7 @@ static void RunScript(uint8_t **stream, AActor *pawn, int snum, int argn, int al arg[i] = argval; } } - P_StartScript(pawn->Level, pawn, NULL, snum, level.MapName, arg, MIN(countof(arg), argn), ACS_NET | always); + P_StartScript(pawn->Level, pawn, NULL, snum, primaryLevel->MapName, arg, MIN(countof(arg), argn), ACS_NET | always); } void Net_SkipCommand (int type, uint8_t **stream) diff --git a/src/g_dumpinfo.cpp b/src/g_dumpinfo.cpp index e967f724b..c07f36e60 100644 --- a/src/g_dumpinfo.cpp +++ b/src/g_dumpinfo.cpp @@ -259,12 +259,12 @@ CCMD(dump3df) // Print 3D floor info for a single sector. // This only checks the primary level. int sec = (int)strtoll(argv[1], NULL, 10); - if ((unsigned)sec >= currentUILevel->sectors.Size()) + if ((unsigned)sec >= primaryLevel->sectors.Size()) { Printf("Sector %d does not exist.\n", sec); return; } - sector_t *sector = ¤tUILevel->sectors[sec]; + sector_t *sector = &primaryLevel->sectors[sec]; TArray & ffloors = sector->e->XFloor.ffloors; for (unsigned int i = 0; i < ffloors.Size(); i++) diff --git a/src/g_game.cpp b/src/g_game.cpp index fe9404bff..a021fb281 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -773,7 +773,7 @@ void G_AddViewPitch (int look, bool mouse) return; } look = LookAdjust(look); - if (!currentUILevel->IsFreelookAllowed()) + if (!primaryLevel->IsFreelookAllowed()) { LocalViewPitch = 0; } @@ -959,7 +959,7 @@ bool G_Responder (event_t *ev) { if (ST_Responder (ev)) return true; // status window ate it - if (!viewactive && currentUILevel->automap->Responder (ev, false)) + if (!viewactive && primaryLevel->automap->Responder (ev, false)) return true; // automap ate it } else if (gamestate == GS_FINALE) @@ -990,7 +990,7 @@ bool G_Responder (event_t *ev) // the events *last* so that any bound keys get precedence. if (gamestate == GS_LEVEL && viewactive) - return currentUILevel->automap->Responder (ev, true); + return primaryLevel->automap->Responder (ev, true); return (ev->type == EV_KeyDown || ev->type == EV_Mouse); @@ -1018,7 +1018,7 @@ void G_Ticker () } if (players[i].playerstate == PST_REBORN || players[i].playerstate == PST_ENTER) { - level.DoReborn(i, false); + primaryLevel->DoReborn(i, false); } } } @@ -1114,7 +1114,7 @@ void G_Ticker () uint32_t rngsum = FRandom::StaticSumSeeds (); //Added by MC: For some of that bot stuff. The main bot function. - level.BotInfo.Main (&level); + primaryLevel->BotInfo.Main (primaryLevel); for (i = 0; i < MAXPLAYERS; i++) { @@ -1181,7 +1181,7 @@ void G_Ticker () { case GS_LEVEL: P_Ticker (); - currentUILevel->automap->Ticker (); + primaryLevel->automap->Ticker (); break; case GS_TITLELEVEL: @@ -1897,7 +1897,7 @@ void G_DoLoadGame () // Read intermission data for hubs G_SerializeHub(arc); - level.BotInfo.RemoveAllBots(&level, true); + primaryLevel->BotInfo.RemoveAllBots(primaryLevel, true); FString cvar; arc("importantcvars", cvar); @@ -2039,14 +2039,14 @@ void G_DoAutoSave () file = G_BuildSaveName ("auto", nextautosave); // The hint flag is only relevant on the primary level. - if (!(currentUILevel->flags2 & LEVEL2_NOAUTOSAVEHINT)) + if (!(primaryLevel->flags2 & LEVEL2_NOAUTOSAVEHINT)) { nextautosave = (nextautosave + 1) % count; } else { // This flag can only be used once per level - currentUILevel->flags2 &= ~LEVEL2_NOAUTOSAVEHINT; + primaryLevel->flags2 &= ~LEVEL2_NOAUTOSAVEHINT; } readableTime = myasctime (); @@ -2064,9 +2064,9 @@ static void PutSaveWads (FSerializer &arc) arc.AddString("Game WAD", name); // Name of wad the map resides in - if (Wads.GetLumpFile (level.lumpnum) > Wads.GetIwadNum()) + if (Wads.GetLumpFile (primaryLevel->lumpnum) > Wads.GetIwadNum()) { - name = Wads.GetWadName (Wads.GetLumpFile (level.lumpnum)); + name = Wads.GetWadName (Wads.GetLumpFile (primaryLevel->lumpnum)); arc.AddString("Map WAD", name); } } @@ -2085,12 +2085,11 @@ static void PutSaveComment (FSerializer &arc) arc.AddString("Creation Time", comment); // Get level name - //strcpy (comment, level.level_name); - comment.Format("%s - %s\n", level.MapName.GetChars(), level.LevelName.GetChars()); + comment.Format("%s - %s\n", primaryLevel->MapName.GetChars(), primaryLevel->LevelName.GetChars()); // Append elapsed time const char *const time = GStrings("SAVECOMMENT_TIME"); - levelTime = level.time / TICRATE; + levelTime = primaryLevel->time / TICRATE; comment.AppendFormat("%s: %02d:%02d:%02d", time, levelTime/3600, (levelTime%3600)/60, levelTime%60); // Write out the comment @@ -2121,7 +2120,7 @@ void G_DoSaveGame (bool okForQuicksave, FString filename, const char *descriptio // Do not even try, if we're not in a level. (Can happen after // a demo finishes playback.) - if (level.lines.Size() == 0 || level.sectors.Size() == 0 || gamestate != GS_LEVEL) + if (primaryLevel->lines.Size() == 0 || primaryLevel->sectors.Size() == 0 || gamestate != GS_LEVEL) { return; } @@ -2172,7 +2171,7 @@ void G_DoSaveGame (bool okForQuicksave, FString filename, const char *descriptio // put some basic info into the PNG so that this isn't lost when the image gets extracted. M_AppendPNGText(&savepic, "Software", buf); M_AppendPNGText(&savepic, "Title", description); - M_AppendPNGText(&savepic, "Current Map", level.MapName); + M_AppendPNGText(&savepic, "Current Map", primaryLevel->MapName); M_FinishPNG(&savepic); int ver = SAVEVER; @@ -2180,7 +2179,7 @@ void G_DoSaveGame (bool okForQuicksave, FString filename, const char *descriptio .AddString("Engine", GAMESIG) ("Save Version", ver) .AddString("Title", description) - .AddString("Current Map", level.MapName); + .AddString("Current Map", primaryLevel->MapName); PutSaveWads (savegameinfo); @@ -2390,7 +2389,7 @@ void G_BeginRecording (const char *startmap) if (startmap == NULL) { - startmap = level.MapName; + startmap = primaryLevel->MapName; } demo_p = demobuffer; @@ -2715,7 +2714,7 @@ void G_DoPlayDemo (void) { G_InitNew (mapname, false); } - else if (level.sectors.Size() == 0) + else if (primaryLevel->sectors.Size() == 0) { I_Error("Cannot play demo without its savegame\n"); } @@ -2886,6 +2885,7 @@ DEFINE_GLOBAL_NAMED(Skins, PlayerSkins) DEFINE_GLOBAL(consoleplayer) DEFINE_GLOBAL_NAMED(PClass::AllClasses, AllClasses) DEFINE_GLOBAL_NAMED(PClassActor::AllActorClasses, AllActorClasses) +DEFINE_GLOBAL_NAMED(primaryLevel, Level) DEFINE_GLOBAL(validcount) DEFINE_GLOBAL(multiplayer) DEFINE_GLOBAL(gameaction) diff --git a/src/g_level.cpp b/src/g_level.cpp index 193ba957c..9a91e1997 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -167,7 +167,7 @@ extern bool sendpause, sendsave, sendturn180, SendLand; void *statcopy; // for statistics driver FLevelLocals level; // info about current level -FLevelLocals *currentUILevel = &level; // level for which to display the user interface. +FLevelLocals *primaryLevel = &level; // level for which to display the user interface. FLevelLocals *currentVMLevel = &level; // level which currently ticks. Used as global input to the VM and some functions called by it. @@ -216,7 +216,7 @@ CCMD (map) if (argv.argc() > 1) { const char *mapname = argv[1]; - if (!strcmp(mapname, "*")) mapname = currentUILevel->MapName.GetChars(); + if (!strcmp(mapname, "*")) mapname = primaryLevel->MapName.GetChars(); try { @@ -266,7 +266,7 @@ UNSAFE_CCMD(recordmap) if (argv.argc() > 2) { const char *mapname = argv[2]; - if (!strcmp(mapname, "*")) mapname = currentUILevel->MapName.GetChars(); + if (!strcmp(mapname, "*")) mapname = primaryLevel->MapName.GetChars(); try { @@ -357,7 +357,7 @@ void G_NewInit () int i; // Destory all old player refrences that may still exist - TThinkerIterator it(&level, NAME_PlayerPawn, STAT_TRAVELLING); + TThinkerIterator it(primaryLevel, NAME_PlayerPawn, STAT_TRAVELLING); AActor *pawn, *next; next = it.Next(); @@ -453,7 +453,7 @@ void G_InitNew (const char *mapname, bool bTitleLevel) int i; // did we have any level before? - if (level.info != nullptr) + if (primaryLevel->info != nullptr) E_WorldUnloadedUnsafe(); if (!savegamerestore) @@ -470,7 +470,10 @@ void G_InitNew (const char *mapname, bool bTitleLevel) UnlatchCVars (); G_VerifySkill(); UnlatchCVars (); - level.Thinkers.DestroyThinkersInList(STAT_STATIC); + for (auto Level : AllLevels()) + { + Level->Thinkers.DestroyThinkersInList(STAT_STATIC); + } if (paused) { @@ -510,10 +513,10 @@ void G_InitNew (const char *mapname, bool bTitleLevel) } FRandom::StaticClearRandom (); P_ClearACSVars(true); - level.time = 0; - level.maptime = 0; - level.totaltime = 0; - level.spawnindex = 0; + primaryLevel->time = 0; + primaryLevel->maptime = 0; + primaryLevel->totaltime = 0; + primaryLevel->spawnindex = 0; if (!multiplayer || !deathmatch) { @@ -536,7 +539,7 @@ void G_InitNew (const char *mapname, bool bTitleLevel) //Added by MC: Initialize bots. if (!deathmatch) { - level.BotInfo.Init (); + primaryLevel->BotInfo.Init (); } if (bTitleLevel) @@ -772,7 +775,7 @@ void G_DoCompleted (void) // Close the conversation menu if open. P_FreeStrifeConversations (); - if (level.DoCompleted(nextlevel, wminfo)) + if (primaryLevel->DoCompleted(nextlevel, wminfo)) { gamestate = GS_INTERMISSION; viewactive = false; @@ -954,7 +957,7 @@ void G_DoLoadLevel(const FString &nextmapname, int position, bool autosave, bool gamestate_t oldgs = gamestate; // Here the new level needs to be allocated. - level.DoLoadLevel(nextmapname, position, autosave, newGame); + primaryLevel->DoLoadLevel(nextmapname, position, autosave, newGame); // Reset the global state for the new level. if (wipegamestate == GS_LEVEL) @@ -1274,7 +1277,7 @@ void FLevelLocals::WorldDone (void) DEFINE_ACTION_FUNCTION(FLevelLocals, WorldDone) { - currentUILevel->WorldDone(); + primaryLevel->WorldDone(); return 0; } @@ -1290,9 +1293,9 @@ void G_DoWorldDone (void) { // Don't crash if no next map is given. Just repeat the current one. Printf ("No next map specified.\n"); - nextlevel = level.MapName; + nextlevel = primaryLevel->MapName; } - level.StartTravel (); + primaryLevel->StartTravel (); G_DoLoadLevel (nextlevel, startpos, true, false); startpos = 0; gameaction = ga_nothing; @@ -2282,7 +2285,7 @@ CCMD(skyfog) if (argv.argc()>1) { // Do this only on the primary level. - currentUILevel->skyfog = MAX(0, (int)strtoull(argv[1], NULL, 0)); + primaryLevel->skyfog = MAX(0, (int)strtoull(argv[1], NULL, 0)); } } diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 1d4cec550..e43b27445 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -672,7 +672,7 @@ public: extern FLevelLocals level; -extern FLevelLocals *currentUILevel; // level for which to display the user interface. This will always be the one the current consoleplayer is in. +extern FLevelLocals *primaryLevel; // level for which to display the user interface. This will always be the one the current consoleplayer is in. extern FLevelLocals *currentVMLevel; inline FSectorPortal *line_t::GetTransferredPortal() @@ -774,5 +774,5 @@ inline bool line_t::hitSkyWall(AActor* mo) const // It is meant for code that needs to iterate over all levels to make some global changes, e.g. configuation CCMDs. inline TArrayView AllLevels() { - return TArrayView(¤tUILevel, 1); + return TArrayView(&primaryLevel, 1); } diff --git a/src/g_statusbar/sbarinfo.cpp b/src/g_statusbar/sbarinfo.cpp index 22f6d9ae4..58ad5ac11 100644 --- a/src/g_statusbar/sbarinfo.cpp +++ b/src/g_statusbar/sbarinfo.cpp @@ -1076,7 +1076,7 @@ public: lastHud = hud; // Handle inventory bar drawing - if(CPlayer->inventorytics > 0 && !(currentUILevel->flags & LEVEL_NOINVENTORYBAR) && (state == HUD_StatusBar || state == HUD_Fullscreen)) + if(CPlayer->inventorytics > 0 && !(primaryLevel->flags & LEVEL_NOINVENTORYBAR) && (state == HUD_StatusBar || state == HUD_Fullscreen)) { SBarInfoMainBlock *inventoryBar = state == HUD_StatusBar ? script->huds[STBAR_INVENTORY] : script->huds[STBAR_INVENTORYFULLSCREEN]; if(inventoryBar != lastInventoryBar) diff --git a/src/g_statusbar/sbarinfo_commands.cpp b/src/g_statusbar/sbarinfo_commands.cpp index dd21c089f..2cfea843e 100644 --- a/src/g_statusbar/sbarinfo_commands.cpp +++ b/src/g_statusbar/sbarinfo_commands.cpp @@ -850,26 +850,26 @@ class CommandDrawString : public SBarInfoCommand switch(strValue) { case LEVELNAME: - if(currentUILevel->lumpnum != cache) + if(primaryLevel->lumpnum != cache) { - cache = currentUILevel->lumpnum; - str = currentUILevel->LevelName; + cache = primaryLevel->lumpnum; + str = primaryLevel->LevelName; RealignString(); } break; case LEVELLUMP: - if(currentUILevel->lumpnum != cache) + if(primaryLevel->lumpnum != cache) { - cache = currentUILevel->lumpnum; - str = currentUILevel->MapName; + cache = primaryLevel->lumpnum; + str = primaryLevel->MapName; str.ToUpper(); RealignString(); } break; case SKILLNAME: - if(currentUILevel->lumpnum != cache) // Can only change skill between currentUILevel-> + if(primaryLevel->lumpnum != cache) // Can only change skill between primaryLevel-> { - cache = currentUILevel->lumpnum; + cache = primaryLevel->lumpnum; str = G_SkillName(); RealignString(); } @@ -904,7 +904,7 @@ class CommandDrawString : public SBarInfoCommand if(ACS_GlobalVars[valueArgument] != cache) { cache = ACS_GlobalVars[valueArgument]; - str = currentUILevel->Behaviors.LookupString(ACS_GlobalVars[valueArgument]); + str = primaryLevel->Behaviors.LookupString(ACS_GlobalVars[valueArgument]); RealignString(); } break; @@ -912,13 +912,13 @@ class CommandDrawString : public SBarInfoCommand if(ACS_GlobalArrays[valueArgument][consoleplayer] != cache) { cache = ACS_GlobalArrays[valueArgument][consoleplayer]; - str = currentUILevel->Behaviors.LookupString(ACS_GlobalArrays[valueArgument][consoleplayer]); + str = primaryLevel->Behaviors.LookupString(ACS_GlobalArrays[valueArgument][consoleplayer]); RealignString(); } break; case TIME: { - int sec = Tics2Seconds(currentUILevel->time); + int sec = Tics2Seconds(primaryLevel->time); str.Format("%02d:%02d:%02d", sec / 3600, (sec % 3600) / 60, sec % 60); break; } @@ -1389,25 +1389,25 @@ class CommandDrawNumber : public CommandDrawString num = statusBar->CPlayer->fragcount; break; case KILLS: - num = currentUILevel->killed_monsters; + num = primaryLevel->killed_monsters; break; case MONSTERS: - num = currentUILevel->total_monsters; + num = primaryLevel->total_monsters; break; case ITEMS: - num = currentUILevel->found_items; + num = primaryLevel->found_items; break; case TOTALITEMS: - num = currentUILevel->total_items; + num = primaryLevel->total_items; break; case SECRETS: - num = currentUILevel->found_secrets; + num = primaryLevel->found_secrets; break; case SCORE: num = statusBar->CPlayer->mo->Score; break; case TOTALSECRETS: - num = currentUILevel->total_secrets; + num = primaryLevel->total_secrets; break; case ARMORCLASS: case SAVEPERCENT: @@ -1459,9 +1459,9 @@ class CommandDrawNumber : public CommandDrawString case AIRTIME: { if(statusBar->CPlayer->mo->waterlevel < 3) - num = currentUILevel->airsupply/TICRATE; + num = primaryLevel->airsupply/TICRATE; else - num = clamp((statusBar->CPlayer->air_finished - currentUILevel->time + (TICRATE-1))/TICRATE, 0, INT_MAX); + num = clamp((statusBar->CPlayer->air_finished - primaryLevel->time + (TICRATE-1))/TICRATE, 0, INT_MAX); break; } case SELECTEDINVENTORY: @@ -1502,7 +1502,7 @@ class CommandDrawNumber : public CommandDrawString } default: break; } - if(interpolationSpeed != 0 && (!hudChanged || currentUILevel->time == 1)) + if(interpolationSpeed != 0 && (!hudChanged || primaryLevel->time == 1)) { if(num < drawValue) drawValue -= clamp((drawValue - num) >> 2, 1, interpolationSpeed); @@ -1691,7 +1691,7 @@ class CommandDrawSelectedInventory : public CommandDrawImage, private CommandDra if(alternateOnEmpty) SBarInfoCommandFlowControl::Draw(block, statusBar); - if(statusBar->CPlayer->mo->PointerVar(NAME_InvSel) != NULL && !(currentUILevel->flags & LEVEL_NOINVENTORYBAR)) + if(statusBar->CPlayer->mo->PointerVar(NAME_InvSel) != NULL && !(primaryLevel->flags & LEVEL_NOINVENTORYBAR)) { if(artiflash && statusBar->wrapper->artiflashTick) { @@ -1791,7 +1791,7 @@ class CommandDrawSelectedInventory : public CommandDrawImage, private CommandDra { SBarInfoCommandFlowControl::Tick(block, statusBar, hudChanged); - SetTruth(statusBar->CPlayer->mo->PointerVar(NAME_InvSel) == NULL || (currentUILevel->flags & LEVEL_NOINVENTORYBAR), block, statusBar); + SetTruth(statusBar->CPlayer->mo->PointerVar(NAME_InvSel) == NULL || (primaryLevel->flags & LEVEL_NOINVENTORYBAR), block, statusBar); CommandDrawImage::Tick(block, statusBar, hudChanged); CommandDrawNumber::Tick(block, statusBar, hudChanged); @@ -1910,7 +1910,7 @@ class CommandInventoryBarNotVisible : public SBarInfoCommandFlowControl { SBarInfoCommandFlowControl::Tick(block, statusBar, hudChanged); - SetTruth(statusBar->CPlayer->inventorytics <= 0 || (currentUILevel->flags & LEVEL_NOINVENTORYBAR), block, statusBar); + SetTruth(statusBar->CPlayer->inventorytics <= 0 || (primaryLevel->flags & LEVEL_NOINVENTORYBAR), block, statusBar); } }; @@ -2727,16 +2727,16 @@ class CommandDrawBar : public SBarInfoCommand max = fraglimit; break; case KILLS: - value = currentUILevel->killed_monsters; - max = currentUILevel->total_monsters; + value = primaryLevel->killed_monsters; + max = primaryLevel->total_monsters; break; case ITEMS: - value = currentUILevel->found_items; - max = currentUILevel->total_items; + value = primaryLevel->found_items; + max = primaryLevel->total_items; break; case SECRETS: - value = currentUILevel->found_secrets; - max = currentUILevel->total_secrets; + value = primaryLevel->found_secrets; + max = primaryLevel->total_secrets; break; case INVENTORY: { @@ -2751,8 +2751,8 @@ class CommandDrawBar : public SBarInfoCommand break; } case AIRTIME: - value = clamp(statusBar->CPlayer->air_finished - currentUILevel->time, 0, INT_MAX); - max = currentUILevel->airsupply; + value = clamp(statusBar->CPlayer->air_finished - primaryLevel->time, 0, INT_MAX); + max = primaryLevel->airsupply; break; case POWERUPTIME: { @@ -2798,7 +2798,7 @@ class CommandDrawBar : public SBarInfoCommand } else value = 0; - if(interpolationSpeed != 0 && (!hudChanged || currentUILevel->time == 1)) + if(interpolationSpeed != 0 && (!hudChanged || primaryLevel->time == 1)) { // [BL] Since we used a percentage (in order to get the most fluid animation) // we need to establish a cut off point so the last pixel won't hang as the animation slows @@ -3192,7 +3192,7 @@ class CommandDrawGem : public SBarInfoCommand goalValue = reverse ? 100 - goalValue : goalValue; - if(interpolationSpeed != 0 && (!hudChanged || currentUILevel->time == 1)) // At the start force an animation + if(interpolationSpeed != 0 && (!hudChanged || primaryLevel->time == 1)) // At the start force an animation { if(goalValue < drawValue) drawValue -= clamp((drawValue - goalValue) >> 2, 1, interpolationSpeed); @@ -3202,7 +3202,7 @@ class CommandDrawGem : public SBarInfoCommand else drawValue = goalValue; - if(wiggle && currentUILevel->time & 1) + if(wiggle && primaryLevel->time & 1) chainWiggle = pr_chainwiggle() & 1; } protected: diff --git a/src/g_statusbar/shared_sbar.cpp b/src/g_statusbar/shared_sbar.cpp index 2c012c81d..80c5f365c 100644 --- a/src/g_statusbar/shared_sbar.cpp +++ b/src/g_statusbar/shared_sbar.cpp @@ -789,7 +789,7 @@ void DBaseStatusBar::RefreshViewBorder () { return; } - auto tex = GetBorderTexture(currentUILevel); + auto tex = GetBorderTexture(primaryLevel); screen->DrawBorder (tex, 0, 0, Width, viewwindowy); screen->DrawBorder (tex, 0, viewwindowy, viewwindowx, viewheight + viewwindowy); screen->DrawBorder (tex, viewwindowx + viewwidth, viewwindowy, Width, viewheight + viewwindowy); @@ -815,7 +815,7 @@ void DBaseStatusBar::RefreshBackground () const if (x == 0 && y == SCREENHEIGHT) return; - auto tex = GetBorderTexture(currentUILevel); + auto tex = GetBorderTexture(primaryLevel); if(!CompleteBorder) { diff --git a/src/gamedata/g_mapinfo.cpp b/src/gamedata/g_mapinfo.cpp index 0826b160a..f5f45fdca 100644 --- a/src/gamedata/g_mapinfo.cpp +++ b/src/gamedata/g_mapinfo.cpp @@ -2285,8 +2285,8 @@ static void ClearMapinfo() AllSkills.Clear(); DefaultSkill = -1; DeinitIntermissions(); - level.info = NULL; - level.F1Pic = ""; + primaryLevel->info = nullptr; + primaryLevel->F1Pic = ""; } //========================================================================== diff --git a/src/hu_scores.cpp b/src/hu_scores.cpp index 290621884..26252c7bb 100644 --- a/src/hu_scores.cpp +++ b/src/hu_scores.cpp @@ -369,7 +369,7 @@ static void HU_DrawTimeRemaining (int y) if (deathmatch && timelimit && gamestate == GS_LEVEL) { char str[80]; - int timeleft = (int)(timelimit * TICRATE * 60) - currentUILevel->maptime; + int timeleft = (int)(timelimit * TICRATE * 60) - primaryLevel->maptime; int hours, minutes, seconds; if (timeleft < 0) diff --git a/src/intermission/intermission.cpp b/src/intermission/intermission.cpp index 2d395a48e..a01f5325a 100644 --- a/src/intermission/intermission.cpp +++ b/src/intermission/intermission.cpp @@ -787,7 +787,7 @@ void DIntermissionController::Ticker () switch (mGameState) { case FSTATE_InLevel: - currentUILevel->SetMusic(); + primaryLevel->SetMusic(); gamestate = GS_LEVEL; wipegamestate = GS_LEVEL; P_ResumeConversation (); diff --git a/src/m_cheat.cpp b/src/m_cheat.cpp index 31e985370..6d47dd2fc 100644 --- a/src/m_cheat.cpp +++ b/src/m_cheat.cpp @@ -324,7 +324,7 @@ void cht_DoCheat (player_t *player, int cheat) case CHT_MASSACRE: case CHT_MASSACRE2: { - int killcount = currentUILevel->Massacre (cheat == CHT_MASSACRE2); + int killcount = primaryLevel->Massacre (cheat == CHT_MASSACRE2); // killough 3/22/98: make more intelligent about plural // Ty 03/27/98 - string(s) *not* externalized mysnprintf (msgbuild, countof(msgbuild), "%d %s%s Killed", killcount, diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index cee4e897d..130c09089 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -823,7 +823,7 @@ void CopyPlayer(player_t *dst, player_t *src, const char *name) if (dst->Bot != nullptr) { - botinfo_t *thebot = level.BotInfo.botinfo; + botinfo_t *thebot = src->mo->Level->BotInfo.botinfo; while (thebot && stricmp(name, thebot->name)) { thebot = thebot->next; @@ -832,7 +832,7 @@ void CopyPlayer(player_t *dst, player_t *src, const char *name) { thebot->inuse = BOTINUSE_Yes; } - level.BotInfo.botnum++; + src->mo->Level->BotInfo.botnum++; dst->userinfo.TransferFrom(uibackup2); } else diff --git a/src/p_setup.cpp b/src/p_setup.cpp index abf4fadbd..fd3bc8537 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -353,7 +353,11 @@ void P_FreeLevelData () E_Shutdown(true); R_FreePastViewers(); - level.ClearLevelData(); + for (auto Level : AllLevels()) + { + Level->ClearLevelData(); + } + // primaryLevel->FreeSecondaryLevels(); } //=========================================================================== @@ -577,7 +581,10 @@ void P_Init () static void P_Shutdown () { - level.Thinkers.DestroyThinkersInList(STAT_STATIC); + for (auto Level : AllLevels()) + { + Level->Thinkers.DestroyThinkersInList(STAT_STATIC); + } P_FreeLevelData (); // [ZZ] delete global event handlers E_Shutdown(false); diff --git a/src/p_tick.cpp b/src/p_tick.cpp index 8d1b7481d..a2f4da510 100644 --- a/src/p_tick.cpp +++ b/src/p_tick.cpp @@ -65,7 +65,7 @@ bool P_CheckTickerPaused () && wipegamestate == gamestate) { // Only the current UI level's settings are relevant for sound. - S_PauseSound (!(currentUILevel->flags2 & LEVEL2_PAUSE_MUSIC_IN_MENUS), false); + S_PauseSound (!(primaryLevel->flags2 & LEVEL2_PAUSE_MUSIC_IN_MENUS), false); return true; } return false; @@ -99,7 +99,7 @@ void P_Ticker (void) // [RH] Frozen mode is only changed every 4 tics, to make it work with A_Tracer(). // This may not be perfect but it is not really relevant for sublevels that tracer homing behavior is preserved. - if ((currentUILevel->maptime & 3) == 0) + if ((primaryLevel->maptime & 3) == 0) { if (globalchangefreeze) { @@ -151,18 +151,22 @@ void P_Ticker (void) // [ZZ] call the WorldTick hook E_WorldTick(); StatusBar->CallTick (); // [RH] moved this here - level.Tick (); // [RH] let the level tick - level.Thinkers.RunThinkers(&level); - - //if added by MC: Freeze mode. - if (!level.isFrozen()) + for (auto Level : AllLevels()) { - P_UpdateSpecials (&level); - P_RunEffects(&level); // [RH] Run particle effects - } + // todo: set up a sandbox for secondary levels here. + Level->Tick(); // [RH] let the level tick + Level->Thinkers.RunThinkers(Level); + + //if added by MC: Freeze mode. + if (!Level->isFrozen()) + { + P_UpdateSpecials(Level); + P_RunEffects(Level); // [RH] Run particle effects + } // for par times - level.time++; - level.maptime++; - level.totaltime++; + Level->time++; + Level->maptime++; + Level->totaltime++; + } } diff --git a/src/p_user.cpp b/src/p_user.cpp index dea310a8a..1535ff993 100644 --- a/src/p_user.cpp +++ b/src/p_user.cpp @@ -956,8 +956,8 @@ void P_CheckPlayerSprite(AActor *actor, int &spritenum, DVector2 &scale) CUSTOM_CVAR (Float, sv_aircontrol, 0.00390625f, CVAR_SERVERINFO|CVAR_NOSAVE) { - currentUILevel->aircontrol = self; - currentUILevel->AirControlChanged (); + primaryLevel->aircontrol = self; + primaryLevel->AirControlChanged (); } //========================================================================== diff --git a/src/posix/sdl/i_main.cpp b/src/posix/sdl/i_main.cpp index 4ea48c401..caddfcf87 100644 --- a/src/posix/sdl/i_main.cpp +++ b/src/posix/sdl/i_main.cpp @@ -165,7 +165,7 @@ static int DoomSpecificInfo (char *buffer, char *end) } else { - p += snprintf (buffer+p, size-p, "\n\nCurrent map: %s", currentUILevel->MapName.GetChars()); + p += snprintf (buffer+p, size-p, "\n\nCurrent map: %s", primaryLevel->MapName.GetChars()); if (!viewactive) { diff --git a/src/rendering/hwrenderer/dynlights/hw_shadowmap.cpp b/src/rendering/hwrenderer/dynlights/hw_shadowmap.cpp index 74a60a452..e563814e1 100644 --- a/src/rendering/hwrenderer/dynlights/hw_shadowmap.cpp +++ b/src/rendering/hwrenderer/dynlights/hw_shadowmap.cpp @@ -112,9 +112,10 @@ void IShadowMap::CollectLights() { if (mLights.Size() != 1024 * 4) mLights.Resize(1024 * 4); int lightindex = 0; + auto Level = &level; // Todo: this should go through the blockmap in a spiral pattern around the player so that closer lights are preferred. - for (auto light = level.lights; light; light = light->next) + for (auto light = Level->lights; light; light = light->next) { LightsProcessed++; if (light->shadowmapped && light->IsActive() && lightindex < 1024 * 4) diff --git a/src/s_sound.cpp b/src/s_sound.cpp index 0bf1da0ad..ee40d6241 100644 --- a/src/s_sound.cpp +++ b/src/s_sound.cpp @@ -403,16 +403,16 @@ void S_Start () FString LocalSndSeq; // To be certain better check whether level is valid! - if (currentUILevel->info) + if (primaryLevel->info) { - LocalSndInfo = currentUILevel->info->SoundInfo; - LocalSndSeq = currentUILevel->info->SndSeq; + LocalSndInfo = primaryLevel->info->SoundInfo; + LocalSndSeq = primaryLevel->info->SndSeq; } bool parse_ss = false; // This level uses a different local SNDINFO - if (LastLocalSndInfo.CompareNoCase(LocalSndInfo) != 0 || !currentUILevel->info) + if (LastLocalSndInfo.CompareNoCase(LocalSndInfo) != 0 || !primaryLevel->info) { // First delete the old sound list for(unsigned i = 1; i < S_sfx.Size(); i++) @@ -457,9 +457,9 @@ void S_Start () // Don't start the music if loading a savegame, because the music is stored there. // Don't start the music if revisiting a level in a hub for the same reason. - if (!currentUILevel->IsReentering()) + if (!primaryLevel->IsReentering()) { - currentUILevel->SetMusic(); + primaryLevel->SetMusic(); } } @@ -475,7 +475,7 @@ void S_PrecacheLevel (FLevelLocals *Level) { unsigned int i; - if (GSnd && Level == currentUILevel) + if (GSnd && Level == primaryLevel) { for (i = 0; i < S_sfx.Size(); ++i) { @@ -499,7 +499,7 @@ void S_PrecacheLevel (FLevelLocals *Level) FSoundID(snd).MarkUsed(); } // Precache all extra sounds requested by this map. - for (auto snd : currentUILevel->info->PrecacheSounds) + for (auto snd : primaryLevel->info->PrecacheSounds) { FSoundID(snd).MarkUsed(); } @@ -705,8 +705,8 @@ static void CalcPosVel(int type, const AActor *actor, const sector_t *sector, // on static analysis. if(type == SOURCE_Unattached) { - sector_t *sec = currentUILevel->PointInSector(pt[0], pt[2]); - DVector2 disp = currentUILevel->Displacements.getOffset(pgroup, sec->PortalGroup); + sector_t *sec = primaryLevel->PointInSector(pt[0], pt[2]); + DVector2 disp = primaryLevel->Displacements.getOffset(pgroup, sec->PortalGroup); pos->X = pt[0] - (float)disp.X; pos->Y = !(chanflags & CHAN_LISTENERZ) ? pt[1] : (float)listenpos.Z; pos->Z = pt[2] - (float)disp.Y; @@ -723,7 +723,7 @@ static void CalcPosVel(int type, const AActor *actor, const sector_t *sector, //assert(actor != NULL); if (actor != NULL) { - DVector2 disp = currentUILevel->Displacements.getOffset(pgroup, actor->Sector->PortalGroup); + DVector2 disp = primaryLevel->Displacements.getOffset(pgroup, actor->Sector->PortalGroup); DVector3 posi = actor->Pos() - disp; *pos = { (float)posi.X, (float)posi.Z, (float)posi.Y }; } @@ -733,7 +733,7 @@ static void CalcPosVel(int type, const AActor *actor, const sector_t *sector, assert(sector != NULL); if (sector != NULL) { - DVector2 disp = currentUILevel->Displacements.getOffset(pgroup, sector->PortalGroup); + DVector2 disp = primaryLevel->Displacements.getOffset(pgroup, sector->PortalGroup); if (chanflags & CHAN_AREA) { // listener must be reversely offset to calculate the proper sound origin. @@ -755,7 +755,7 @@ static void CalcPosVel(int type, const AActor *actor, const sector_t *sector, assert(poly != NULL); if (poly != NULL) { - DVector2 disp = currentUILevel->Displacements.getOffset(pgroup, poly->CenterSubsector->sector->PortalGroup); + DVector2 disp = primaryLevel->Displacements.getOffset(pgroup, poly->CenterSubsector->sector->PortalGroup); CalcPolyobjSoundOrg(listenpos + disp, poly, *pos); pos->X -= (float)disp.X; pos->Z -= (float)disp.Y; @@ -852,7 +852,7 @@ static void CalcSectorSoundOrg(const DVector3 &listenpos, const sector_t *sec, i if (!(sec->Level->i_compatflags & COMPATF_SECTORSOUNDS)) { // Are we inside the sector? If yes, the closest point is the one we're on. - if (currentUILevel->PointInSector(listenpos.X, listenpos.Y) == sec) + if (primaryLevel->PointInSector(listenpos.X, listenpos.Y) == sec) { pos.X = (float)listenpos.X; pos.Z = (float)listenpos.Y; @@ -916,7 +916,7 @@ static void CalcPolyobjSoundOrg(const DVector3 &listenpos, const FPolyObj *poly, // // S_StartSound // -// 0 attenuation means full volume over whole currentUILevel-> +// 0 attenuation means full volume over whole primaryLevel-> // 0 < attenuation means to scale the distance by that amount when // calculating volume. // @@ -1337,7 +1337,7 @@ DEFINE_ACTION_FUNCTION(DObject, S_Sound) void S_Sound (AActor *ent, int channel, FSoundID sound_id, float volume, float attenuation) { - if (ent == nullptr || ent->Sector->Flags & SECF_SILENT || ent->Level != currentUILevel) + if (ent == nullptr || ent->Sector->Flags & SECF_SILENT || ent->Level != primaryLevel) return; S_StartSound (ent, nullptr, nullptr, nullptr, channel, sound_id, volume, attenuation); } @@ -1352,7 +1352,7 @@ void S_Sound (AActor *ent, int channel, FSoundID sound_id, float volume, float a void S_SoundMinMaxDist(AActor *ent, int channel, FSoundID sound_id, float volume, float mindist, float maxdist) { - if (ent == nullptr || ent->Sector->Flags & SECF_SILENT || ent->Level != currentUILevel) + if (ent == nullptr || ent->Sector->Flags & SECF_SILENT || ent->Level != primaryLevel) return; FRolloffInfo rolloff; @@ -1371,7 +1371,7 @@ void S_SoundMinMaxDist(AActor *ent, int channel, FSoundID sound_id, float volume void S_Sound (const FPolyObj *poly, int channel, FSoundID sound_id, float volume, float attenuation) { - if (poly->Level != currentUILevel) return; + if (poly->Level != primaryLevel) return; S_StartSound (nullptr, nullptr, poly, nullptr, channel, sound_id, volume, attenuation); } @@ -1383,7 +1383,7 @@ void S_Sound (const FPolyObj *poly, int channel, FSoundID sound_id, float volume void S_Sound(FLevelLocals *Level, const DVector3 &pos, int channel, FSoundID sound_id, float volume, float attenuation) { - if (Level != currentUILevel) return; + if (Level != primaryLevel) return; // The sound system switches Y and Z around. FVector3 p((float)pos.X, (float)pos.Z, (float)pos.Y); S_StartSound (nullptr, nullptr, nullptr, &p, channel, sound_id, volume, attenuation); @@ -1397,7 +1397,7 @@ void S_Sound(FLevelLocals *Level, const DVector3 &pos, int channel, FSoundID sou void S_Sound (const sector_t *sec, int channel, FSoundID sfxid, float volume, float attenuation) { - if (sec->Level != currentUILevel) return; + if (sec->Level != primaryLevel) return; S_StartSound (nullptr, sec, nullptr, nullptr, channel, sfxid, volume, attenuation); } @@ -1411,7 +1411,7 @@ void S_Sound (const sector_t *sec, int channel, FSoundID sfxid, float volume, fl void S_PlaySound(AActor *a, int chan, FSoundID sid, float vol, float atten, bool local) { - if (a == nullptr || a->Sector->Flags & SECF_SILENT || a->Level != currentUILevel) + if (a == nullptr || a->Sector->Flags & SECF_SILENT || a->Level != primaryLevel) return; if (!local) @@ -2190,7 +2190,7 @@ void S_UpdateSounds (AActor *listenactor) GSnd->UpdateListener(&listener); GSnd->UpdateSounds(); - if (currentUILevel->time >= RestartEvictionsAt) + if (primaryLevel->time >= RestartEvictionsAt) { RestartEvictionsAt = 0; S_RestoreEvictedChannels(); @@ -2216,8 +2216,8 @@ static void S_SetListener(SoundListener &listener, AActor *listenactor) listener.velocity.Zero(); listener.position = listenactor->SoundPos(); listener.underwater = listenactor->waterlevel == 3; - assert(currentUILevel->Zones.Size() > listenactor->Sector->ZoneNumber); - listener.Environment = currentUILevel->Zones[listenactor->Sector->ZoneNumber].Environment; + assert(primaryLevel->Zones.Size() > listenactor->Sector->ZoneNumber); + listener.Environment = primaryLevel->Zones[listenactor->Sector->ZoneNumber].Environment; listener.valid = true; } else @@ -2495,7 +2495,7 @@ void S_SerializeSounds(FSerializer &arc) // playing before the wipe, and depending on the synchronization // between the main thread and the mixer thread at the time, the // sounds might be heard briefly before pausing for the wipe. - RestartEvictionsAt = currentUILevel->time + 2; + RestartEvictionsAt = primaryLevel->time + 2; } GSnd->Sync(false); GSnd->UpdateSounds(); @@ -2585,8 +2585,8 @@ bool S_ChangeMusic (const char *musicname, int order, bool looping, bool force) { if (gamestate == GS_LEVEL || gamestate == GS_TITLELEVEL) { - musicname = currentUILevel->Music; - order = currentUILevel->musicorder; + musicname = primaryLevel->Music; + order = primaryLevel->musicorder; } else { @@ -2866,7 +2866,7 @@ CCMD (loopsound) } else { - AActor *icon = Spawn(&level, "SpeakerIcon", players[consoleplayer].mo->PosPlusZ(32.), ALLOW_REPLACE); + AActor *icon = Spawn(primaryLevel, "SpeakerIcon", players[consoleplayer].mo->PosPlusZ(32.), ALLOW_REPLACE); if (icon != NULL) { S_Sound(icon, CHAN_BODY | CHAN_LOOP, id, 1.f, ATTN_IDLE); diff --git a/src/scripting/vmthunks.cpp b/src/scripting/vmthunks.cpp index e78707413..96e63c037 100644 --- a/src/scripting/vmthunks.cpp +++ b/src/scripting/vmthunks.cpp @@ -2359,7 +2359,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(DBaseStatusBar, SetClipRect, SBar_SetClipRect) static void GetGlobalACSString(int index, FString *result) { - *result = currentUILevel->Behaviors.LookupString(ACS_GlobalVars[index]); + *result = primaryLevel->Behaviors.LookupString(ACS_GlobalVars[index]); } DEFINE_ACTION_FUNCTION_NATIVE(DBaseStatusBar, GetGlobalACSString, GetGlobalACSString) @@ -2373,7 +2373,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(DBaseStatusBar, GetGlobalACSString, GetGlobalACSSt static void GetGlobalACSArrayString(int arrayno, int index, FString *result) { - *result = currentUILevel->Behaviors.LookupString(ACS_GlobalVars[index]); + *result = primaryLevel->Behaviors.LookupString(ACS_GlobalVars[index]); } DEFINE_ACTION_FUNCTION_NATIVE(DBaseStatusBar, GetGlobalACSArrayString, GetGlobalACSArrayString) @@ -2846,8 +2846,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(_AltHUD, GetLatency, Net_GetLatency) // // //========================================================================== -DEFINE_GLOBAL(level); -DEFINE_GLOBAL(currentUILevel); +DEFINE_GLOBAL(currentVMLevel, level); DEFINE_FIELD(FLevelLocals, sectors) DEFINE_FIELD(FLevelLocals, lines) DEFINE_FIELD(FLevelLocals, sides) diff --git a/src/st_stuff.cpp b/src/st_stuff.cpp index 821317138..ffa79fe01 100644 --- a/src/st_stuff.cpp +++ b/src/st_stuff.cpp @@ -489,7 +489,7 @@ static bool Cht_ChangeStartSpot (cheatseq_t *cheat) { char cmd[64]; - mysnprintf (cmd, countof(cmd), "changemap %s %c", currentUILevel->MapName.GetChars(), cheat->Args[0]); + mysnprintf (cmd, countof(cmd), "changemap %s %c", primaryLevel->MapName.GetChars(), cheat->Args[0]); C_DoCommand (cmd); return true; } diff --git a/src/statistics.cpp b/src/statistics.cpp index 04c780f34..db1720130 100644 --- a/src/statistics.cpp +++ b/src/statistics.cpp @@ -577,7 +577,7 @@ FString GetStatString() CCMD(printstats) { - StoreLevelStats(currentUILevel); // Refresh the current level's results. + StoreLevelStats(primaryLevel); // Refresh the current level's results. Printf("%s", GetStatString().GetChars()); } @@ -596,6 +596,6 @@ CCMD(finishgame) ADD_STAT(statistics) { - StoreLevelStats(currentUILevel); // Refresh the current level's results. + StoreLevelStats(primaryLevel); // Refresh the current level's results. return GetStatString(); } diff --git a/src/v_2ddrawer.cpp b/src/v_2ddrawer.cpp index 21b860b9d..ca0cec6b4 100644 --- a/src/v_2ddrawer.cpp +++ b/src/v_2ddrawer.cpp @@ -428,7 +428,7 @@ void F2DDrawer::AddPoly(FTexture *texture, FVector2 *points, int npoints, // is necessary in order to best reproduce Doom's original lighting. double fadelevel; - if (vid_rendermode != 4 || currentUILevel->lightMode == ELightMode::Doom || currentUILevel->lightMode == ELightMode::ZDoomSoftware || currentUILevel->lightMode == ELightMode::DoomSoftware) + if (vid_rendermode != 4 || primaryLevel->lightMode == ELightMode::Doom || primaryLevel->lightMode == ELightMode::ZDoomSoftware || primaryLevel->lightMode == ELightMode::DoomSoftware) { double map = (NUMCOLORMAPS * 2.) - ((lightlevel + 12) * (NUMCOLORMAPS / 128.)); fadelevel = clamp((map - 12) / NUMCOLORMAPS, 0.0, 1.0); diff --git a/src/v_video.cpp b/src/v_video.cpp index 8c8dccf97..b971a9eb3 100644 --- a/src/v_video.cpp +++ b/src/v_video.cpp @@ -595,8 +595,8 @@ void V_OutputResized (int width, int height) C_NewModeAdjust(); // Reload crosshair if transitioned to a different size ST_LoadCrosshair(true); - if (currentUILevel && currentUILevel->automap) - currentUILevel->automap->NewResolution(); + if (primaryLevel && primaryLevel->automap) + primaryLevel->automap->NewResolution(); } void V_CalcCleanFacs (int designwidth, int designheight, int realwidth, int realheight, int *cleanx, int *cleany, int *_cx1, int *_cx2) diff --git a/src/win32/i_main.cpp b/src/win32/i_main.cpp index 2a35242d6..4ca5bdce4 100644 --- a/src/win32/i_main.cpp +++ b/src/win32/i_main.cpp @@ -1105,7 +1105,7 @@ void DoomSpecificInfo (char *buffer, size_t bufflen) } else { - buffer += mysnprintf (buffer, buffend - buffer, "\r\n\r\nCurrent map: %s", currentUILevel->MapName.GetChars()); + buffer += mysnprintf (buffer, buffend - buffer, "\r\n\r\nCurrent map: %s", primaryLevel->MapName.GetChars()); if (!viewactive) { diff --git a/wadsrc/static/zscript/base.txt b/wadsrc/static/zscript/base.txt index 070f3f033..2a81b410e 100644 --- a/wadsrc/static/zscript/base.txt +++ b/wadsrc/static/zscript/base.txt @@ -1,3 +1,4 @@ + struct _ native // These are the global variables, the struct is only here to avoid extending the parser for this. { native readonly Array AllClasses; @@ -7,20 +8,16 @@ struct _ native // These are the global variables, the struct is only here to av native readonly Array<@Team> Teams; native int validcount; native readonly bool multiplayer; - deprecated("3.8") native play @LevelLocals level; native @KeyBindings Bindings; native @KeyBindings AutomapBindings; native play @DehInfo deh; native readonly @GameInfoStruct gameinfo; - native play @PlayerInfo players[MAXPLAYERS]; - native readonly bool playeringame[MAXPLAYERS]; native readonly ui bool netgame; native readonly bool automapactive; native play uint gameaction; native readonly int gamestate; native readonly TextureID skyflatnum; - native readonly int consoleplayer; native readonly Font smallfont; native readonly Font smallfont2; native readonly Font bigfont; @@ -43,10 +40,16 @@ struct _ native // These are the global variables, the struct is only here to av native readonly int Net_Arbitrator; native ui BaseStatusBar StatusBar; native readonly Weapon WP_NOCHANGE; - native int LocalViewPitch; - native ui readonly LevelLocals currentUILevel; deprecated("3.8") native readonly bool globalfreeze; - + native int LocalViewPitch; + +// sandbox state in multi-level setups: + + native play @PlayerInfo players[MAXPLAYERS]; + native readonly bool playeringame[MAXPLAYERS]; + native readonly int consoleplayer; + native play LevelLocals Level; + } struct TexMan diff --git a/wadsrc/static/zscript/mapdata.txt b/wadsrc/static/zscript/mapdata.txt index 02e78fe7f..4a1154feb 100644 --- a/wadsrc/static/zscript/mapdata.txt +++ b/wadsrc/static/zscript/mapdata.txt @@ -97,15 +97,15 @@ struct Side native play int GetUDMFInt(Name nm) { - return sector.Level.GetUDMFInt(LevelLocals.UDMF_Side, Index(), nm); + return Level.GetUDMFInt(LevelLocals.UDMF_Side, Index(), nm); } double GetUDMFFloat(Name nm) { - return sector.Level.GetUDMFFloat(LevelLocals.UDMF_Side, Index(), nm); + return Level.GetUDMFFloat(LevelLocals.UDMF_Side, Index(), nm); } String GetUDMFString(Name nm) { - return sector.Level.GetUDMFString(LevelLocals.UDMF_Side, Index(), nm); + return Level.GetUDMFString(LevelLocals.UDMF_Side, Index(), nm); } }; @@ -180,15 +180,15 @@ struct Line native play int GetUDMFInt(Name nm) { - return frontsector.Level.GetUDMFInt(LevelLocals.UDMF_Line, Index(), nm); + return Level.GetUDMFInt(LevelLocals.UDMF_Line, Index(), nm); } double GetUDMFFloat(Name nm) { - return frontsector.Level.GetUDMFFloat(LevelLocals.UDMF_Line, Index(), nm); + return Level.GetUDMFFloat(LevelLocals.UDMF_Line, Index(), nm); } String GetUDMFString(Name nm) { - return frontsector.Level.GetUDMFString(LevelLocals.UDMF_Line, Index(), nm); + return Level.GetUDMFString(LevelLocals.UDMF_Line, Index(), nm); } native clearscope int GetHealth(); @@ -259,7 +259,6 @@ struct Sector native play native SectorEffect floordata; native SectorEffect ceilingdata; native SectorEffect lightingdata; - native readonly LevelLocals Level; enum EPlane { diff --git a/wadsrc/static/zscript/menu/conversationmenu.txt b/wadsrc/static/zscript/menu/conversationmenu.txt index 271381ae3..02201a0dd 100644 --- a/wadsrc/static/zscript/menu/conversationmenu.txt +++ b/wadsrc/static/zscript/menu/conversationmenu.txt @@ -509,7 +509,7 @@ class ConversationMenu : Menu override void Ticker() { // [CW] Freeze the game depending on MAPINFO options. - if (ConversationPauseTic < gametic && !multiplayer && !currentUILevel.no_dlg_freeze) + if (ConversationPauseTic < gametic && !multiplayer && !Level.no_dlg_freeze) { menuactive = Menu.On; } diff --git a/wadsrc/static/zscript/menu/readthis.txt b/wadsrc/static/zscript/menu/readthis.txt index d1581d967..58904b0f4 100644 --- a/wadsrc/static/zscript/menu/readthis.txt +++ b/wadsrc/static/zscript/menu/readthis.txt @@ -57,9 +57,9 @@ class ReadThisMenu : GenericMenu TextureID tex, prevpic; // Did the mapper choose a custom help page via MAPINFO? - if (currentUILevel.F1Pic.Length() != 0) + if (Level.F1Pic.Length() != 0) { - tex = TexMan.CheckForTexture(currentUILevel.F1Pic, TexMan.Type_MiscPatch); + tex = TexMan.CheckForTexture(Level.F1Pic, TexMan.Type_MiscPatch); mScreen = 1; } @@ -98,7 +98,7 @@ class ReadThisMenu : GenericMenu MenuSound("menu/choose"); mScreen++; mInfoTic = gametic; - if (currentUILevel.F1Pic.Length() != 0 || mScreen > gameinfo.infoPages.Size()) + if (Level.F1Pic.Length() != 0 || mScreen > gameinfo.infoPages.Size()) { Close(); } diff --git a/wadsrc/static/zscript/shared/player.txt b/wadsrc/static/zscript/shared/player.txt index 0394fbcbd..d9cddda07 100644 --- a/wadsrc/static/zscript/shared/player.txt +++ b/wadsrc/static/zscript/shared/player.txt @@ -334,13 +334,6 @@ class PlayerPawn : Actor { let player = self.player; - // [SO] 9/2/02: People were able to do an awful lot of damage - // when they were observers... - if (player.Bot == null && bot_observer) - { - return; - } - let weapn = player.ReadyWeapon; if (weapn == null || !weapn.CheckAmmo (Weapon.PrimaryFire, true)) { @@ -369,13 +362,6 @@ class PlayerPawn : Actor virtual void FireWeaponAlt (State stat) { - // [SO] 9/2/02: People were able to do an awful lot of damage - // when they were observers... - if (player.Bot == null && bot_observer) - { - return; - } - let weapn = player.ReadyWeapon; if (weapn == null || weapn.FindState('AltFire') == null || !weapn.CheckAmmo (Weapon.AltFire, true)) { diff --git a/wadsrc/static/zscript/statscreen/statscreen.txt b/wadsrc/static/zscript/statscreen/statscreen.txt index 084d9a256..dc6fd446f 100644 --- a/wadsrc/static/zscript/statscreen/statscreen.txt +++ b/wadsrc/static/zscript/statscreen/statscreen.txt @@ -461,7 +461,7 @@ class StatusScreen abstract play version("2.5") if (cnt == 0) { End(); - currentUILevel.WorldDone(); + Level.WorldDone(); } } @@ -477,7 +477,7 @@ class StatusScreen abstract play version("2.5") { // Last map in episode - there is no next location! End(); - currentUILevel.WorldDone(); + Level.WorldDone(); return; } @@ -608,7 +608,7 @@ class StatusScreen abstract play version("2.5") virtual void StartMusic() { - currentUILevel.SetInterMusic(wbs.next); + Level.SetInterMusic(wbs.next); } //==================================================================== @@ -706,7 +706,7 @@ class StatusScreen abstract play version("2.5") Par = TexMan.CheckForTexture("WIPAR", TexMan.Type_MiscPatch); // "par" // Use the local level structure which can be overridden by hubs - lnametexts[0] = currentUILevel.LevelName; + lnametexts[0] = Level.LevelName; lnametexts[1] = wbstartstruct.nextname; bg = InterBackground.Create(wbs); diff --git a/wadsrc/static/zscript/statusbar/alt_hud.txt b/wadsrc/static/zscript/statusbar/alt_hud.txt index 7fd694c98..f8befa09f 100644 --- a/wadsrc/static/zscript/statusbar/alt_hud.txt +++ b/wadsrc/static/zscript/statusbar/alt_hud.txt @@ -200,17 +200,17 @@ class AltHud ui // work in cooperative hub games if (hud_showsecrets) { - DrawStatLine(x, y, "S:", String.Format("%i/%i ", multiplayer? CPlayer.secretcount : currentUILevel.found_secrets, currentUILevel.total_secrets)); + DrawStatLine(x, y, "S:", String.Format("%i/%i ", multiplayer? CPlayer.secretcount : Level.found_secrets, Level.total_secrets)); } if (hud_showitems) { - DrawStatLine(x, y, "I:", String.Format("%i/%i ", multiplayer? CPlayer.itemcount : currentUILevel.found_items, currentUILevel.total_items)); + DrawStatLine(x, y, "I:", String.Format("%i/%i ", multiplayer? CPlayer.itemcount : Level.found_items, Level.total_items)); } if (hud_showmonsters) { - DrawStatLine(x, y, "K:", String.Format("%i/%i ", multiplayer? CPlayer.killcount : currentUILevel.killed_monsters, currentUILevel.total_monsters)); + DrawStatLine(x, y, "K:", String.Format("%i/%i ", multiplayer? CPlayer.killcount : Level.killed_monsters, Level.total_monsters)); } } } @@ -734,18 +734,18 @@ class AltHud ui } else { - pos.xy = currentUILevel.GetAutomapPosition(); - pos.z = currentUILevel.PointInSector(pos.xy).floorplane.ZatPoint(pos.xy); + pos.xy = Level.GetAutomapPosition(); + pos.z = Level.PointInSector(pos.xy).floorplane.ZatPoint(pos.xy); } int xpos = hudwidth - SmallFont.StringWidth("X: -00000")-6; int ypos = 18; - screen.DrawText(SmallFont, hudcolor_titl, hudwidth - 6 - SmallFont.StringWidth(currentUILevel.MapName), ypos, currentUILevel.MapName, + screen.DrawText(SmallFont, hudcolor_titl, hudwidth - 6 - SmallFont.StringWidth(Level.MapName), ypos, Level.MapName, DTA_KeepRatio, true, DTA_VirtualWidth, hudwidth, DTA_VirtualHeight, hudheight); - screen.DrawText(SmallFont, hudcolor_titl, hudwidth - 6 - SmallFont.StringWidth(currentUILevel.LevelName), ypos + h, currentUILevel.LevelName, + screen.DrawText(SmallFont, hudcolor_titl, hudwidth - 6 - SmallFont.StringWidth(Level.LevelName), ypos + h, Level.LevelName, DTA_KeepRatio, true, DTA_VirtualWidth, hudwidth, DTA_VirtualHeight, hudheight); @@ -788,10 +788,10 @@ class AltHud ui { int timeTicks = hud_showtime < 4 - ? currentUILevel.maptime + ? Level.maptime : (hud_showtime < 6 - ? currentUILevel.time - : currentUILevel.totaltime); + ? Level.time + : Level.totaltime); timeSeconds = Thinker.Tics2Seconds(timeTicks); } else @@ -810,7 +810,7 @@ class AltHud ui if (showMillis) { - int millis = (currentUILevel.time % Thinker.TICRATE) * (1000 / Thinker.TICRATE); + int millis = (Level.time % Thinker.TICRATE) * (1000 / Thinker.TICRATE); timeString = String.Format("%02i:%02i:%02i.%03i", hours, minutes, seconds, millis); } else if (showSeconds) @@ -941,23 +941,23 @@ class AltHud ui if (am_showtotaltime) { - DrawTimeString(SmallFont, hudcolor_ttim, currentUILevel.totaltime, hudwidth-2, bottom, 1); + DrawTimeString(SmallFont, hudcolor_ttim, Level.totaltime, hudwidth-2, bottom, 1); bottom -= fonth; } if (am_showtime) { - if (currentUILevel.clusterflags & currentUILevel.CLUSTER_HUB) + if (Level.clusterflags & Level.CLUSTER_HUB) { - DrawTimeString(SmallFont, hudcolor_time, currentUILevel.time, hudwidth-2, bottom, 1); + DrawTimeString(SmallFont, hudcolor_time, Level.time, hudwidth-2, bottom, 1); bottom -= fonth; } // Single level time for hubs - DrawTimeString(SmallFont, hudcolor_ltim, currentUILevel.maptime, hudwidth-2, bottom, 1); + DrawTimeString(SmallFont, hudcolor_ltim, Level.maptime, hudwidth-2, bottom, 1); } - screen.DrawText(SmallFont, 0, 1, hudheight - fonth - 1, currentUILevel.FormatMapName(hudcolor_titl), + screen.DrawText(SmallFont, 0, 1, hudheight - fonth - 1, Level.FormatMapName(hudcolor_titl), DTA_KeepRatio, true, DTA_VirtualWidth, hudwidth, DTA_VirtualHeight, hudheight); diff --git a/wadsrc/static/zscript/statusbar/doom_sbar.txt b/wadsrc/static/zscript/statusbar/doom_sbar.txt index eb775d7f9..bd2681a05 100644 --- a/wadsrc/static/zscript/statusbar/doom_sbar.txt +++ b/wadsrc/static/zscript/statusbar/doom_sbar.txt @@ -105,7 +105,7 @@ class DoomStatusBar : BaseStatusBar DrawImage("STFBANY", (143, 168), DI_ITEM_OFFSETS|DI_TRANSLATABLE); } - if (CPlayer.mo.InvSel != null && !currentUILevel.NoInventoryBar) + if (CPlayer.mo.InvSel != null && !Level.NoInventoryBar) { DrawInventoryIcon(CPlayer.mo.InvSel, (160, 198)); if (CPlayer.mo.InvSel.Amount > 1) @@ -153,7 +153,7 @@ class DoomStatusBar : BaseStatusBar DrawString(mHUDFont, FormatNumber(ammotype2.Amount, 3), (-30, invY), DI_TEXT_ALIGN_RIGHT); invY -= 20; } - if (!isInventoryBarVisible() && !currentUILevel.NoInventoryBar && CPlayer.mo.InvSel != null) + if (!isInventoryBarVisible() && !Level.NoInventoryBar && CPlayer.mo.InvSel != null) { DrawInventoryIcon(CPlayer.mo.InvSel, (-14, invY + 17)); DrawString(mHUDFont, FormatNumber(CPlayer.mo.InvSel.Amount, 3), (-30, invY), DI_TEXT_ALIGN_RIGHT); diff --git a/wadsrc/static/zscript/statusbar/harm_sbar.txt b/wadsrc/static/zscript/statusbar/harm_sbar.txt index bb800ccc4..f640bd993 100644 --- a/wadsrc/static/zscript/statusbar/harm_sbar.txt +++ b/wadsrc/static/zscript/statusbar/harm_sbar.txt @@ -60,7 +60,7 @@ class HarmonyStatusBar : DoomStatusBar DrawString(mHUDFont, FormatNumber(ammotype2.Amount, 3), (-30, invY), DI_TEXT_ALIGN_RIGHT); invY -= 20; } - if (!isInventoryBarVisible() && !currentUILevel.NoInventoryBar && CPlayer.mo.InvSel != null) + if (!isInventoryBarVisible() && !Level.NoInventoryBar && CPlayer.mo.InvSel != null) { DrawInventoryIcon(CPlayer.mo.InvSel, (-14, invY + 17)); DrawString(mHUDFont, FormatNumber(CPlayer.mo.InvSel.Amount, 3), (-30, invY), DI_TEXT_ALIGN_RIGHT); diff --git a/wadsrc/static/zscript/statusbar/heretic_sbar.txt b/wadsrc/static/zscript/statusbar/heretic_sbar.txt index edcfd13c7..38569ac93 100644 --- a/wadsrc/static/zscript/statusbar/heretic_sbar.txt +++ b/wadsrc/static/zscript/statusbar/heretic_sbar.txt @@ -43,7 +43,7 @@ class HereticStatusBar : BaseStatusBar mHealthInterpolator.Update(CPlayer.health); // wiggle the chain if it moves - if (currentUILevel.time & 1) + if (Level.time & 1) { wiggle = (mHealthInterpolator.GetValue() != CPlayer.health) && Random[ChainWiggle](0, 1); } @@ -200,7 +200,7 @@ class HereticStatusBar : BaseStatusBar y -= 40; } - if (!isInventoryBarVisible() && !currentUILevel.NoInventoryBar && CPlayer.mo.InvSel != null) + if (!isInventoryBarVisible() && !Level.NoInventoryBar && CPlayer.mo.InvSel != null) { // This code was changed to always fit the item into the box, regardless of alignment or sprite size. // Heretic's ARTIBOX is 30x30 pixels. diff --git a/wadsrc/static/zscript/statusbar/hexen_sbar.txt b/wadsrc/static/zscript/statusbar/hexen_sbar.txt index 033982e20..a39244a49 100644 --- a/wadsrc/static/zscript/statusbar/hexen_sbar.txt +++ b/wadsrc/static/zscript/statusbar/hexen_sbar.txt @@ -74,7 +74,7 @@ class HexenStatusBar : BaseStatusBar DrawString(mHUDFont, FormatNumber(CPlayer.FragCount, 3), (70, -16)); } - if (!isInventoryBarVisible() && !currentUILevel.NoInventoryBar && CPlayer.mo.InvSel != null) + if (!isInventoryBarVisible() && !Level.NoInventoryBar && CPlayer.mo.InvSel != null) { // This code was changed to always fit the item into the box, regardless of alignment or sprite size. // Heretic's ARTIBOX is 30x30 pixels. diff --git a/wadsrc/static/zscript/statusbar/statusbar.txt b/wadsrc/static/zscript/statusbar/statusbar.txt index cd16ed94d..170e26a8d 100644 --- a/wadsrc/static/zscript/statusbar/statusbar.txt +++ b/wadsrc/static/zscript/statusbar/statusbar.txt @@ -597,9 +597,9 @@ class BaseStatusBar native ui int GetAirTime() { if(CPlayer.mo.waterlevel < 3) - return currentUILevel.airsupply; + return Level.airsupply; else - return max(CPlayer.air_finished - currentUILevel.time, 0); + return max(CPlayer.air_finished - Level.time, 0); } int GetSelectedInventoryAmount() @@ -654,7 +654,7 @@ class BaseStatusBar native ui bool isInventoryBarVisible() { if (CPlayer == null) return false; - return (CPlayer.inventorytics > 0 && !currentUILevel.NoInventoryBar); + return (CPlayer.inventorytics > 0 && !Level.NoInventoryBar); } //============================================================================ @@ -850,13 +850,13 @@ class BaseStatusBar native ui let width = SmallFont.StringWidth("00:00:00"); if (am_showtime) { - printtext = currentUILevel.TimeFormatted(); - DrawString(mSmallFont, currentUILevel.TimeFormatted(), (-textdist-width, y), 0, crdefault); + printtext = Level.TimeFormatted(); + DrawString(mSmallFont, Level.TimeFormatted(), (-textdist-width, y), 0, crdefault); y += height; } if (am_showtotaltime) { - DrawString(mSmallFont, currentUILevel.TimeFormatted(true), (-textdist-width, y), 0, crdefault); + DrawString(mSmallFont, Level.TimeFormatted(true), (-textdist-width, y), 0, crdefault); } if (!deathmatch) @@ -866,25 +866,25 @@ class BaseStatusBar native ui // Draw monster count if (am_showmonsters) { - DrawString(mSmallFont, String.Format("%s\34%c %d/%d", Stringtable.Localize("$AM_MONSTERS"), crdefault+65, currentUILevel.killed_monsters, currentUILevel.total_monsters), (textdist, y), 0, highlight); + DrawString(mSmallFont, String.Format("%s\34%c %d/%d", Stringtable.Localize("$AM_MONSTERS"), crdefault+65, Level.killed_monsters, Level.total_monsters), (textdist, y), 0, highlight); y += height; } // Draw secret count if (am_showsecrets) { - DrawString(mSmallFont, String.Format("%s\34%c %d/%d", Stringtable.Localize("$AM_SECRETS"), crdefault+65, currentUILevel.found_secrets, currentUILevel.total_secrets), (textdist, y), 0, highlight); + DrawString(mSmallFont, String.Format("%s\34%c %d/%d", Stringtable.Localize("$AM_SECRETS"), crdefault+65, Level.found_secrets, Level.total_secrets), (textdist, y), 0, highlight); y += height; } // Draw item count if (am_showitems) { - DrawString(mSmallFont, String.Format("%s\34%c %d/%d", Stringtable.Localize("$AM_ITEMS"), crdefault+65, currentUILevel.found_items, currentUILevel.total_items), (textdist, y), 0, highlight); + DrawString(mSmallFont, String.Format("%s\34%c %d/%d", Stringtable.Localize("$AM_ITEMS"), crdefault+65, Level.found_items, Level.total_items), (textdist, y), 0, highlight); } } - String mapname = currentUILevel.FormatMapName(crdefault); + String mapname = Level.FormatMapName(crdefault); BrokenLines lines = SmallFont.BreakLines(mapname, int(SCREENWIDTH / scale.X)); int numlines = lines.Count(); int finalwidth = int(SmallFont.StringWidth(lines.StringAt(numlines-1)) * scale.X); diff --git a/wadsrc/static/zscript/statusbar/strife_sbar.txt b/wadsrc/static/zscript/statusbar/strife_sbar.txt index 1a1a12e5a..866c4a32a 100644 --- a/wadsrc/static/zscript/statusbar/strife_sbar.txt +++ b/wadsrc/static/zscript/statusbar/strife_sbar.txt @@ -427,7 +427,7 @@ class StrifeStatusBar : BaseStatusBar case POP_Log: { // Draw the latest log message. - screen.DrawText(SmallFont2, Font.CR_UNTRANSLATED, left + 210 * xscale, top + 8 * yscale, currentUILevel.TimeFormatted(), + screen.DrawText(SmallFont2, Font.CR_UNTRANSLATED, left + 210 * xscale, top + 8 * yscale, Level.TimeFormatted(), DTA_CleanNoMove, true); if (CPlayer.LogText.Length() > 0) From 8d83f03138a0ed48ad05a0b5872bc41b73e6928f Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 2 Feb 2019 01:14:51 +0100 Subject: [PATCH 149/164] - changed the linedef translator into a struct and reorganized its storage to allow having different ones at the same time. This was the last piece of data that couldn't be distinct for more than one level. --- src/CMakeLists.txt | 14 +-- src/fragglescript/t_load.cpp | 4 +- src/g_levellocals.h | 3 + src/{ => gamedata}/p_xlat.cpp | 44 ++++----- src/gamedata/umapinfo.cpp | 2 - src/{ => gamedata}/xlat/parse_xlat.cpp | 40 +++------ src/{ => gamedata/xlat}/parsecontext.cpp | 0 src/{ => gamedata/xlat}/parsecontext.h | 0 src/{ => gamedata}/xlat/xlat.h | 31 ++++--- src/{ => gamedata}/xlat/xlat_parser.y | 66 +++++++------- src/maploader/maploader.cpp | 5 +- src/maploader/udmf.cpp | 15 ++-- src/p_setup.h | 3 - src/utility/tflags.h | 109 +++++++++++++++++++++++ 14 files changed, 220 insertions(+), 116 deletions(-) rename src/{ => gamedata}/p_xlat.cpp (88%) rename src/{ => gamedata}/xlat/parse_xlat.cpp (81%) rename src/{ => gamedata/xlat}/parsecontext.cpp (100%) rename src/{ => gamedata/xlat}/parsecontext.h (100%) rename src/{ => gamedata}/xlat/xlat.h (76%) rename src/{ => gamedata}/xlat/xlat_parser.y (72%) create mode 100644 src/utility/tflags.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 602166fe5..b18165a50 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -597,8 +597,8 @@ else() endif() add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/xlat_parser.c ${CMAKE_CURRENT_BINARY_DIR}/xlat_parser.h - COMMAND lemon -C${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/xlat/xlat_parser.y - DEPENDS lemon ${CMAKE_CURRENT_SOURCE_DIR}/xlat/xlat_parser.y ) + COMMAND lemon -C${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/gamedata/xlat/xlat_parser.y + DEPENDS lemon ${CMAKE_CURRENT_SOURCE_DIR}/gamedata/xlat/xlat_parser.y ) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/zcc-parse.c ${CMAKE_CURRENT_BINARY_DIR}/zcc-parse.h COMMAND lemon -C${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/scripting/zscript/zcc-parse.lemon @@ -653,6 +653,7 @@ file( GLOB HEADER_FILES gamedata/textures/hires/hqnx/*.h gamedata/textures/hires/hqnx_asm/*.h gamedata/textures/hires/xbr/*.h + gamedata/xlat/*.h intermission/*.h maploader/*.h menu/*.h @@ -683,7 +684,6 @@ file( GLOB HEADER_FILES sound/timidity/*.h sound/timiditypp/*.h sound/wildmidi/*.h - xlat/*.h rendering/swrenderer/*.h rendering/swrenderer/textures/*.h rendering/swrenderer/drawers/*.h @@ -794,7 +794,7 @@ set( NOT_COMPILED_SOURCE_FILES sc_man_scanner.h utility/sc_man_scanner.re g_statusbar/sbarinfo_commands.cpp - xlat/xlat_parser.y + gamedata/xlat/xlat_parser.y xlat_parser.c xlat_parser.h scripting/zscript/zcc-parse.lemon @@ -936,8 +936,6 @@ set (PCH_SOURCES p_tick.cpp p_usdf.cpp p_user.cpp - p_xlat.cpp - parsecontext.cpp r_utility.cpp r_sky.cpp r_videoscale.cpp @@ -1110,7 +1108,9 @@ set (PCH_SOURCES gamedata/textures/formats/tgatexture.cpp gamedata/textures/hires/hqresize.cpp gamedata/textures/hires/hirestex.cpp - xlat/parse_xlat.cpp + gamedata/p_xlat.cpp + gamedata/xlat/parse_xlat.cpp + gamedata/xlat/parsecontext.cpp fragglescript/t_func.cpp fragglescript/t_load.cpp fragglescript/t_oper.cpp diff --git a/src/fragglescript/t_load.cpp b/src/fragglescript/t_load.cpp index bcb4dadcf..7f5d8024f 100644 --- a/src/fragglescript/t_load.cpp +++ b/src/fragglescript/t_load.cpp @@ -294,9 +294,9 @@ void T_LoadScripts(FLevelLocals *Level, MapData *map) // the default translator is being used. // Custom translators will not be patched. if ((gameinfo.gametype == GAME_Doom || gameinfo.gametype == GAME_Heretic) && Level->info->Translator.IsEmpty() && - Level->maptype == MAPTYPE_DOOM && SimpleLineTranslations.Size() > 272 && SimpleLineTranslations[272 - 2*HasScripts].special == FS_Execute) + Level->maptype == MAPTYPE_DOOM && Level->Translator->SimpleLineTranslations.Size() > 272 && Level->Translator->SimpleLineTranslations[272 - 2*HasScripts].special == FS_Execute) { - std::swap(SimpleLineTranslations[270], SimpleLineTranslations[272]); + std::swap(Level->Translator->SimpleLineTranslations[270], Level->Translator->SimpleLineTranslations[272]); } } diff --git a/src/g_levellocals.h b/src/g_levellocals.h index e43b27445..0b854a797 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -95,6 +95,7 @@ struct FStrifeDialogueNode; class DAutomapBase; struct wbstartstruct_t; class DSectorMarker; +struct FTranslator; typedef TMap FDialogueIDMap; // maps dialogue IDs to dialogue array index (for ACS) typedef TMap FDialogueMap; // maps actor class names to dialogue array index @@ -127,6 +128,7 @@ struct FLevelLocals void FormatMapName(FString &mapname, const char *mapnamecolor); void ClearAllSubsectorLinks(); void TranslateLineDef (line_t *ld, maplinedef_t *mld, int lineindexforid = -1); + int TranslateSectorSpecial(int special); bool IsTIDUsed(int tid); int FindUniqueTID(int start_tid, int limit); int GetConversation(int conv_id); @@ -494,6 +496,7 @@ public: FString NextMap; // go here when using the regular exit FString NextSecretMap; // map to go to when used secret exit FString F1Pic; + FTranslator *Translator; EMapType maptype; FTagManager tagManager; FInterpolator interpolator; diff --git a/src/p_xlat.cpp b/src/gamedata/p_xlat.cpp similarity index 88% rename from src/p_xlat.cpp rename to src/gamedata/p_xlat.cpp index 963cff272..2ab3ebf12 100644 --- a/src/p_xlat.cpp +++ b/src/gamedata/p_xlat.cpp @@ -56,8 +56,11 @@ typedef enum PushMany, } triggertype_e; + void FLevelLocals::TranslateLineDef (line_t *ld, maplinedef_t *mld, int lineindexforid) { + auto translator = Translator; + uint32_t special = mld->special; short tag = mld->tag; uint32_t flags =mld->flags; @@ -68,16 +71,16 @@ void FLevelLocals::TranslateLineDef (line_t *ld, maplinedef_t *mld, int lineinde for(int i=0;i<16;i++) { - if ((flags & (1<LineFlagTranslations[i].ismask) { - flags1 &= LineFlagTranslations[i].newvalue; + flags1 &= translator->LineFlagTranslations[i].newvalue; } } for(int i=0;i<16;i++) { - if ((flags1 & (1<LineFlagTranslations[i].ismask) { - switch (LineFlagTranslations[i].newvalue) + switch (translator->LineFlagTranslations[i].newvalue) { case -1: passthrough = true; @@ -89,7 +92,7 @@ void FLevelLocals::TranslateLineDef (line_t *ld, maplinedef_t *mld, int lineinde ld->alpha = 0.25; break; default: - newflags |= LineFlagTranslations[i].newvalue; + newflags |= translator->LineFlagTranslations[i].newvalue; break; } } @@ -116,7 +119,7 @@ void FLevelLocals::TranslateLineDef (line_t *ld, maplinedef_t *mld, int lineinde } FLineTrans *linetrans = NULL; - if (special < SimpleLineTranslations.Size()) linetrans = &SimpleLineTranslations[special]; + if (special < translator->SimpleLineTranslations.Size()) linetrans = &translator->SimpleLineTranslations[special]; if (linetrans != NULL && linetrans->special != 0) { ld->special = linetrans->special; @@ -157,7 +160,7 @@ void FLevelLocals::TranslateLineDef (line_t *ld, maplinedef_t *mld, int lineinde break; case ARGOP_Expr: { - int *xnode = &XlatExpressions[arg]; + int *xnode = &translator->XlatExpressions[arg]; state.bIsConstant = true; XlatExprEval[*xnode](&ld->args[t], xnode, &state); } @@ -176,9 +179,9 @@ void FLevelLocals::TranslateLineDef (line_t *ld, maplinedef_t *mld, int lineinde return; } - for(int i=0;iNumBoomish;i++) { - FBoomTranslator *b = &Boomish[i]; + FBoomTranslator *b = &translator->Boomish[i]; if (special >= b->FirstLinetype && special <= b->LastLinetype) { @@ -290,32 +293,33 @@ void FLevelLocals::TranslateLineDef (line_t *ld, maplinedef_t *mld, int lineinde memset (ld->args, 0, sizeof(ld->args)); } -int P_TranslateSectorSpecial (int special) +int FLevelLocals::TranslateSectorSpecial (int special) { int mask = 0; + auto translator = Translator; - for(int i = SectorMasks.Size()-1; i>=0; i--) + for(int i = translator->SectorMasks.Size()-1; i>=0; i--) { - int newmask = special & SectorMasks[i].mask; + int newmask = special & translator->SectorMasks[i].mask; if (newmask) { special &= ~newmask; - if (SectorMasks[i].op == 1) - newmask <<= SectorMasks[i].shift; - else if (SectorMasks[i].op == -1) - newmask >>= SectorMasks[i].shift; - else if (SectorMasks[i].op == 0 && SectorMasks[i].shift == 1) + if (translator->SectorMasks[i].op == 1) + newmask <<= translator->SectorMasks[i].shift; + else if (translator->SectorMasks[i].op == -1) + newmask >>= translator->SectorMasks[i].shift; + else if (translator->SectorMasks[i].op == 0 && translator->SectorMasks[i].shift == 1) newmask = 0; mask |= newmask; } } - if ((unsigned)special < SectorTranslations.Size()) + if ((unsigned)special < translator->SectorTranslations.Size()) { - if (!SectorTranslations[special].bitmask_allowed && mask) + if (!translator->SectorTranslations[special].bitmask_allowed && mask) special = 0; else - special = SectorTranslations[special].newtype; + special = translator->SectorTranslations[special].newtype; } return special | mask; } diff --git a/src/gamedata/umapinfo.cpp b/src/gamedata/umapinfo.cpp index 6da8f3316..ac82ff8e2 100644 --- a/src/gamedata/umapinfo.cpp +++ b/src/gamedata/umapinfo.cpp @@ -325,8 +325,6 @@ static int ParseMapEntry(FScanner &scanner, UMapEntry *val) int ParseUMapInfo(int lumpnum) { - P_LoadTranslator(gameinfo.translator); - FScanner scanner(lumpnum); unsigned int i; diff --git a/src/xlat/parse_xlat.cpp b/src/gamedata/xlat/parse_xlat.cpp similarity index 81% rename from src/xlat/parse_xlat.cpp rename to src/gamedata/xlat/parse_xlat.cpp index 3e7f02d01..44771b00a 100644 --- a/src/xlat/parse_xlat.cpp +++ b/src/gamedata/xlat/parse_xlat.cpp @@ -51,14 +51,7 @@ enum DEFINE_TOKEN_TRANS(XLAT_) -static FString LastTranslator; -TAutoGrowArray SimpleLineTranslations; -TArray XlatExpressions; -FBoomTranslator Boomish[MAX_BOOMISH]; -int NumBoomish; -TAutoGrowArray SectorTranslations; -TArray SectorMasks; -FLineFlagTrans LineFlagTranslations[16]; +TMap translators; struct SpecialArgs @@ -102,9 +95,10 @@ struct ParseBoomArg struct XlatParseContext : public FParseContext { - XlatParseContext(void *parser, ParseFunc parse, int *tt) + XlatParseContext(void *parser, ParseFunc parse, int *tt, FTranslator *trans) : FParseContext(parser, parse, tt) { + Translator = trans; DefiningLineType = -1; } @@ -152,6 +146,7 @@ struct XlatParseContext : public FParseContext } int DefiningLineType; + FTranslator *Translator; }; #include "xlat_parser.c" @@ -163,36 +158,23 @@ struct XlatParseContext : public FParseContext // //========================================================================== -void P_ClearTranslator() +FTranslator *P_LoadTranslator(const char *lumpname) { - SimpleLineTranslations.Clear(); - XlatExpressions.Clear(); - NumBoomish = 0; - SectorTranslations.Clear(); - SectorMasks.Clear(); - memset(LineFlagTranslations, 0, sizeof(LineFlagTranslations)); - LastTranslator = ""; -} - -void P_LoadTranslator(const char *lumpname) -{ - // Only read the lump if it differs from the previous one. - if (LastTranslator.CompareNoCase(lumpname)) + FName fname = lumpname; + auto translator = &translators[fname]; + if (!translator->loaded) { - // Clear the old data before parsing the lump. - P_ClearTranslator(); - void *pParser = XlatParseAlloc(malloc); - XlatParseContext context(pParser, XlatParse, TokenTrans); - + XlatParseContext context(pParser, XlatParse, TokenTrans, translator); context.ParseLump(lumpname); FParseToken tok; tok.val=0; XlatParse(pParser, 0, tok, &context); XlatParseFree(pParser, free); - LastTranslator = lumpname; + translator->loaded = true; } + return translator; } diff --git a/src/parsecontext.cpp b/src/gamedata/xlat/parsecontext.cpp similarity index 100% rename from src/parsecontext.cpp rename to src/gamedata/xlat/parsecontext.cpp diff --git a/src/parsecontext.h b/src/gamedata/xlat/parsecontext.h similarity index 100% rename from src/parsecontext.h rename to src/gamedata/xlat/parsecontext.h diff --git a/src/xlat/xlat.h b/src/gamedata/xlat/xlat.h similarity index 76% rename from src/xlat/xlat.h rename to src/gamedata/xlat/xlat.h index cf5fc7089..f488704ff 100644 --- a/src/xlat/xlat.h +++ b/src/gamedata/xlat/xlat.h @@ -37,6 +37,10 @@ enum XEXP_COUNT }; +struct FXlatExprState; + +extern const int* (*XlatExprEval[XEXP_COUNT])(int *dest, const int *xnode, FXlatExprState *state); + struct FLineTrans { int special; @@ -76,9 +80,9 @@ struct FBoomArg struct FBoomTranslator { - uint16_t FirstLinetype; - uint16_t LastLinetype; - uint8_t NewSpecial; + uint16_t FirstLinetype = 0; + uint16_t LastLinetype = 0; + uint8_t NewSpecial = 0; TArray Args; } ; @@ -115,13 +119,18 @@ struct FXlatExprState }; -extern TAutoGrowArray SimpleLineTranslations; -extern TArray XlatExpressions; -extern FBoomTranslator Boomish[MAX_BOOMISH]; -extern int NumBoomish; -extern TAutoGrowArray SectorTranslations; -extern TArray SectorMasks; -extern FLineFlagTrans LineFlagTranslations[16]; -extern const int* (*XlatExprEval[XEXP_COUNT])(int *dest, const int *xnode, FXlatExprState *state); +struct FTranslator +{ + bool loaded = false; + TAutoGrowArray SimpleLineTranslations; + TArray XlatExpressions; + FBoomTranslator Boomish[MAX_BOOMISH]; + int NumBoomish = 0; + TAutoGrowArray SectorTranslations; + TArray SectorMasks; + FLineFlagTrans LineFlagTranslations[16] = {}; +}; + +FTranslator *P_LoadTranslator(const char *lumpname); #endif diff --git a/src/xlat/xlat_parser.y b/src/gamedata/xlat/xlat_parser.y similarity index 72% rename from src/xlat/xlat_parser.y rename to src/gamedata/xlat/xlat_parser.y index e92107f7b..6c6575ab2 100644 --- a/src/xlat/xlat_parser.y +++ b/src/gamedata/xlat/xlat_parser.y @@ -130,7 +130,7 @@ linetype_exp(Z) ::= expr(A). linetype_declaration ::= linetype_exp(linetype) EQUALS expr(flags) COMMA expr(special) LPAREN special_args(arg) RPAREN. { - SimpleLineTranslations.SetVal(linetype, + static_cast(context)->Translator->SimpleLineTranslations.SetVal(linetype, FLineTrans(special&0xffff, flags+arg.addflags, arg.args[0], arg.args[1], arg.args[2], arg.args[3], arg.args[4])); static_cast(context)->DefiningLineType = -1; } @@ -142,17 +142,17 @@ linetype_declaration ::= linetype_exp EQUALS expr COMMA SYM(S) LPAREN special_ar } %type exp_with_tag {int} -exp_with_tag(A) ::= NUM(B). { XlatExpressions.Push(B.val); A = XlatExpressions.Push(XEXP_Const); } -exp_with_tag(A) ::= TAG. { A = XlatExpressions.Push(XEXP_Tag); } -exp_with_tag(A) ::= exp_with_tag PLUS exp_with_tag. { A = XlatExpressions.Push(XEXP_Add); } -exp_with_tag(A) ::= exp_with_tag MINUS exp_with_tag. { A = XlatExpressions.Push(XEXP_Sub); } -exp_with_tag(A) ::= exp_with_tag MULTIPLY exp_with_tag. { A = XlatExpressions.Push(XEXP_Mul); } -exp_with_tag(A) ::= exp_with_tag DIVIDE exp_with_tag. { A = XlatExpressions.Push(XEXP_Div); } -exp_with_tag(A) ::= exp_with_tag MODULUS exp_with_tag. { A = XlatExpressions.Push(XEXP_Mod); } -exp_with_tag(A) ::= exp_with_tag OR exp_with_tag. { A = XlatExpressions.Push(XEXP_Or); } -exp_with_tag(A) ::= exp_with_tag AND exp_with_tag. { A = XlatExpressions.Push(XEXP_And); } -exp_with_tag(A) ::= exp_with_tag XOR exp_with_tag. { A = XlatExpressions.Push(XEXP_Xor); } -exp_with_tag(A) ::= MINUS exp_with_tag. [NEG] { A = XlatExpressions.Push(XEXP_Neg); } +exp_with_tag(A) ::= NUM(B). { static_cast(context)->Translator->XlatExpressions.Push(B.val); A = static_cast(context)->Translator->XlatExpressions.Push(XEXP_Const); } +exp_with_tag(A) ::= TAG. { A = static_cast(context)->Translator->XlatExpressions.Push(XEXP_Tag); } +exp_with_tag(A) ::= exp_with_tag PLUS exp_with_tag. { A = static_cast(context)->Translator->XlatExpressions.Push(XEXP_Add); } +exp_with_tag(A) ::= exp_with_tag MINUS exp_with_tag. { A = static_cast(context)->Translator->XlatExpressions.Push(XEXP_Sub); } +exp_with_tag(A) ::= exp_with_tag MULTIPLY exp_with_tag. { A = static_cast(context)->Translator->XlatExpressions.Push(XEXP_Mul); } +exp_with_tag(A) ::= exp_with_tag DIVIDE exp_with_tag. { A = static_cast(context)->Translator->XlatExpressions.Push(XEXP_Div); } +exp_with_tag(A) ::= exp_with_tag MODULUS exp_with_tag. { A = static_cast(context)->Translator->XlatExpressions.Push(XEXP_Mod); } +exp_with_tag(A) ::= exp_with_tag OR exp_with_tag. { A = static_cast(context)->Translator->XlatExpressions.Push(XEXP_Or); } +exp_with_tag(A) ::= exp_with_tag AND exp_with_tag. { A = static_cast(context)->Translator->XlatExpressions.Push(XEXP_And); } +exp_with_tag(A) ::= exp_with_tag XOR exp_with_tag. { A = static_cast(context)->Translator->XlatExpressions.Push(XEXP_Xor); } +exp_with_tag(A) ::= MINUS exp_with_tag. [NEG] { A = static_cast(context)->Translator->XlatExpressions.Push(XEXP_Neg); } exp_with_tag(A) ::= LPAREN exp_with_tag(B) RPAREN. { A = B; } @@ -160,11 +160,11 @@ exp_with_tag(A) ::= LPAREN exp_with_tag(B) RPAREN. { A = B; } special_arg(Z) ::= exp_with_tag(A). { - if (XlatExpressions[A] == XEXP_Tag) + if (static_cast(context)->Translator->XlatExpressions[A] == XEXP_Tag) { // Store tags directly Z.arg = 0; Z.argop = ARGOP_Tag; - XlatExpressions.Delete(A); + static_cast(context)->Translator->XlatExpressions.Delete(A); } else { // Try and evaluate it. If it's a constant, store it and erase the @@ -178,15 +178,15 @@ special_arg(Z) ::= exp_with_tag(A). state.linetype = static_cast(context)->DefiningLineType; state.tag = 0; state.bIsConstant = true; - xnode = &XlatExpressions[A]; + xnode = &static_cast(context)->Translator->XlatExpressions[A]; endpt = XlatExprEval[*xnode](&val, xnode, &state); if (state.bIsConstant) { Z.arg = val; Z.argop = ARGOP_Const; endpt++; - assert(endpt >= &XlatExpressions[0]); - XlatExpressions.Resize((unsigned)(endpt - &XlatExpressions[0])); + assert(endpt >= &static_cast(context)->Translator->XlatExpressions[0]); + static_cast(context)->Translator->XlatExpressions.Resize((unsigned)(endpt - &static_cast(context)->Translator->XlatExpressions[0])); } else { @@ -257,7 +257,7 @@ boom_declaration ::= LBRACKET expr(special) RBRACKET LPAREN expr(firsttype) COMM int i; MoreLines *probe; - if (NumBoomish == MAX_BOOMISH) + if (static_cast(context)->Translator->NumBoomish == MAX_BOOMISH) { MoreLines *probe = stores; @@ -271,18 +271,18 @@ boom_declaration ::= LBRACKET expr(special) RBRACKET LPAREN expr(firsttype) COMM } else { - Boomish[NumBoomish].FirstLinetype = firsttype; - Boomish[NumBoomish].LastLinetype = lasttype; - Boomish[NumBoomish].NewSpecial = special; + static_cast(context)->Translator->Boomish[static_cast(context)->Translator->NumBoomish].FirstLinetype = firsttype; + static_cast(context)->Translator->Boomish[static_cast(context)->Translator->NumBoomish].LastLinetype = lasttype; + static_cast(context)->Translator->Boomish[static_cast(context)->Translator->NumBoomish].NewSpecial = special; for (i = 0, probe = stores; probe != NULL; i++) { MoreLines *next = probe->next; - Boomish[NumBoomish].Args.Push(probe->arg); + static_cast(context)->Translator->Boomish[static_cast(context)->Translator->NumBoomish].Args.Push(probe->arg); delete probe; probe = next; } - NumBoomish++; + static_cast(context)->Translator->NumBoomish++; } } @@ -379,7 +379,7 @@ maxlinespecial_def ::= MAXLINESPECIAL EQUALS expr(mx) SEMICOLON. { // Just kill all specials higher than the max. // If the translator wants to redefine some later, just let it. - SimpleLineTranslations.Resize(mx+1); + static_cast(context)->Translator->SimpleLineTranslations.Resize(mx+1); } //========================================================================== @@ -393,7 +393,7 @@ maxlinespecial_def ::= MAXLINESPECIAL EQUALS expr(mx) SEMICOLON. sector_declaration ::= SECTOR expr(from) EQUALS expr(to) SEMICOLON. { FSectorTrans tr(to, true); - SectorTranslations.SetVal(from, tr); + static_cast(context)->Translator->SectorTranslations.SetVal(from, tr); } sector_declaration ::= SECTOR expr EQUALS SYM(sy) SEMICOLON. @@ -404,25 +404,25 @@ sector_declaration ::= SECTOR expr EQUALS SYM(sy) SEMICOLON. sector_declaration ::= SECTOR expr(from) EQUALS expr(to) NOBITMASK SEMICOLON. { FSectorTrans tr(to, false); - SectorTranslations.SetVal(from, tr); + static_cast(context)->Translator->SectorTranslations.SetVal(from, tr); } sector_bitmask ::= SECTOR BITMASK expr(mask) sector_op(op) expr(shift) SEMICOLON. { FSectorMask sm = { mask, op, shift}; - SectorMasks.Push(sm); + static_cast(context)->Translator->SectorMasks.Push(sm); } sector_bitmask ::= SECTOR BITMASK expr(mask) SEMICOLON. { FSectorMask sm = { mask, 0, 0}; - SectorMasks.Push(sm); + static_cast(context)->Translator->SectorMasks.Push(sm); } sector_bitmask ::= SECTOR BITMASK expr(mask) CLEAR SEMICOLON. { FSectorMask sm = { mask, 0, 1}; - SectorMasks.Push(sm); + static_cast(context)->Translator->SectorMasks.Push(sm); } sector_op(A) ::= LSHASSIGN. { A = 1; } @@ -434,8 +434,8 @@ lineflag_declaration ::= LINEFLAG expr(from) EQUALS expr(to) SEMICOLON. { if (from >= 0 && from < 16) { - LineFlagTranslations[from].newvalue = to; - LineFlagTranslations[from].ismask = false; + static_cast(context)->Translator->LineFlagTranslations[from].newvalue = to; + static_cast(context)->Translator->LineFlagTranslations[from].ismask = false; } } @@ -443,7 +443,7 @@ lineflag_declaration ::= LINEFLAG expr(from) AND expr(mask) SEMICOLON. { if (from >= 0 && from < 16) { - LineFlagTranslations[from].newvalue = mask; - LineFlagTranslations[from].ismask = true; + static_cast(context)->Translator->LineFlagTranslations[from].newvalue = mask; + static_cast(context)->Translator->LineFlagTranslations[from].ismask = true; } } \ No newline at end of file diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index de52b0424..91ddaca49 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -78,6 +78,7 @@ #include "fragglescript/t_fs.h" #include "swrenderer/r_swrenderer.h" #include "hwrenderer/data/flatvertices.h" +#include "xlat/xlat.h" enum { @@ -1080,7 +1081,7 @@ void MapLoader::LoadSectors (MapData *map, FMissingTextureTracker &missingtex) if (map->HasBehavior) ss->special = LittleShort(ms->special); else // [RH] Translate to new sector special - ss->special = P_TranslateSectorSpecial (LittleShort(ms->special)); + ss->special = Level->TranslateSectorSpecial (LittleShort(ms->special)); Level->tagManager.AddSectorTag(i, LittleShort(ms->tag)); ss->thinglist = nullptr; ss->touching_thinglist = nullptr; // phares 3/14/98 @@ -2977,7 +2978,7 @@ void MapLoader::LoadLevel(MapData *map, const char *lumpname, int position) translator = gameinfo.translator.GetChars(); } } - P_LoadTranslator(translator); + Level->Translator = P_LoadTranslator(translator); Level->maptype = MAPTYPE_DOOM; } if (map->isText) diff --git a/src/maploader/udmf.cpp b/src/maploader/udmf.cpp index a35f555b1..3a86bfcdf 100644 --- a/src/maploader/udmf.cpp +++ b/src/maploader/udmf.cpp @@ -49,6 +49,7 @@ #include "g_levellocals.h" #include "info.h" #include "vm.h" +#include "xlat/xlat.h" #include "maploader.h" //=========================================================================== @@ -1491,7 +1492,7 @@ public: case NAME_Special: sec->special = (short)CheckInt(key); - if (isTranslated) sec->special = P_TranslateSectorSpecial(sec->special); + if (isTranslated) sec->special = Level->TranslateSectorSpecial(sec->special); else if (namespc == NAME_Hexen) { if (sec->special < 0 || sec->special > 140 || !HexenSectorSpecialOk[sec->special]) @@ -2147,19 +2148,19 @@ public: break; case NAME_Doom: namespace_bits = Dm; - P_LoadTranslator("xlat/doom_base.txt"); + Level->Translator = P_LoadTranslator("xlat/doom_base.txt"); Level->flags2 |= LEVEL2_DUMMYSWITCHES; floordrop = true; break; case NAME_Heretic: namespace_bits = Ht; - P_LoadTranslator("xlat/heretic_base.txt"); + Level->Translator = P_LoadTranslator("xlat/heretic_base.txt"); Level->flags2 |= LEVEL2_DUMMYSWITCHES; floordrop = true; break; case NAME_Strife: namespace_bits = St; - P_LoadTranslator("xlat/strife_base.txt"); + Level->Translator = P_LoadTranslator("xlat/strife_base.txt"); Level->flags2 |= LEVEL2_DUMMYSWITCHES|LEVEL2_RAILINGHACK; floordrop = true; break; @@ -2171,15 +2172,15 @@ public: case GAME_Doom: case GAME_Chex: namespace_bits = Dm; - P_LoadTranslator("xlat/doom_base.txt"); + Level->Translator = P_LoadTranslator("xlat/doom_base.txt"); break; case GAME_Heretic: namespace_bits = Ht; - P_LoadTranslator("xlat/heretic_base.txt"); + Level->Translator = P_LoadTranslator("xlat/heretic_base.txt"); break; case GAME_Strife: namespace_bits = St; - P_LoadTranslator("xlat/strife_base.txt"); + Level->Translator = P_LoadTranslator("xlat/strife_base.txt"); break; case GAME_Hexen: namespace_bits = Hx; diff --git a/src/p_setup.h b/src/p_setup.h index 12bffa6fb..0cae8124c 100644 --- a/src/p_setup.h +++ b/src/p_setup.h @@ -150,9 +150,6 @@ void P_Init (void); struct line_t; struct maplinedef_t; -void P_LoadTranslator(const char *lumpname); -int P_TranslateSectorSpecial (int); - int GetUDMFInt(FLevelLocals *Level, int type, int index, FName key); double GetUDMFFloat(FLevelLocals *Level, int type, int index, FName key); FString GetUDMFString(FLevelLocals *Level, int type, int index, FName key); diff --git a/src/utility/tflags.h b/src/utility/tflags.h new file mode 100644 index 000000000..18c2becaf --- /dev/null +++ b/src/utility/tflags.h @@ -0,0 +1,109 @@ +/* +** tflags.h +** +**--------------------------------------------------------------------------- +** Copyright 2015 Teemu Piippo +** All rights reserved. +** +** Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions +** are met: +** +** 1. Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** 2. Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in the +** documentation and/or other materials provided with the distribution. +** 3. The name of the author may not be used to endorse or promote products +** derived from this software without specific prior written permission. +** +** THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR +** IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES +** OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +** IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, +** INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +** NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +** THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +**--------------------------------------------------------------------------- +** +*/ + +#pragma once +#include "doomtype.h" + +/* + * TFlags + * + * A Qt-inspired type-safe flagset type. + * + * T is the enum type of individual flags, + * TT is the underlying integer type used (defaults to uint32_t) + */ +template +class TFlags +{ + struct ZeroDummy {}; + +public: + typedef TFlags Self; + typedef T EnumType; + typedef TT IntType; + + TFlags() = default; + TFlags(const Self& other) = default; + TFlags (T value) : Value (static_cast (value)) {} + + // This allows initializing the flagset with 0, as 0 implicitly converts into a null pointer. + TFlags (ZeroDummy*) : Value (0) {} + + // Relation operators + Self operator| (Self other) const { return Self::FromInt (Value | other.GetValue()); } + Self operator& (Self other) const { return Self::FromInt (Value & other.GetValue()); } + Self operator^ (Self other) const { return Self::FromInt (Value ^ other.GetValue()); } + Self operator| (T value) const { return Self::FromInt (Value | value); } + Self operator& (T value) const { return Self::FromInt (Value & value); } + Self operator^ (T value) const { return Self::FromInt (Value ^ value); } + Self operator~() const { return Self::FromInt (~Value); } + + // Assignment operators + Self& operator= (Self other) { Value = other.GetValue(); return *this; } + Self& operator|= (Self other) { Value |= other.GetValue(); return *this; } + Self& operator&= (Self other) { Value &= other.GetValue(); return *this; } + Self& operator^= (Self other) { Value ^= other.GetValue(); return *this; } + Self& operator= (T value) { Value = value; return *this; } + Self& operator|= (T value) { Value |= value; return *this; } + Self& operator&= (T value) { Value &= value; return *this; } + Self& operator^= (T value) { Value ^= value; return *this; } + + // Access the value of the flagset + TT GetValue() const { return Value; } + operator TT() const { return Value; } + + // Set the value of the flagset manually with an integer. + // Please think twice before using this. + static Self FromInt (TT value) { return Self (static_cast (value)); } + +private: + template Self operator| (X value) const { return Self::FromInt (Value | value); } + template Self operator& (X value) const { return Self::FromInt (Value & value); } + template Self operator^ (X value) const { return Self::FromInt (Value ^ value); } + +public: // to be removed. + TT Value; +}; + +/* + * Additional operators for TFlags types. + */ +#define DEFINE_TFLAGS_OPERATORS(T) \ +inline T operator| (T::EnumType a, T::EnumType b) { return T::FromInt (T::IntType (a) | T::IntType (b)); } \ +inline T operator& (T::EnumType a, T::EnumType b) { return T::FromInt (T::IntType (a) & T::IntType (b)); } \ +inline T operator^ (T::EnumType a, T::EnumType b) { return T::FromInt (T::IntType (a) ^ T::IntType (b)); } \ +inline T operator| (T::EnumType a, T b) { return T::FromInt (T::IntType (a) | T::IntType (b)); } \ +inline T operator& (T::EnumType a, T b) { return T::FromInt (T::IntType (a) & T::IntType (b)); } \ +inline T operator^ (T::EnumType a, T b) { return T::FromInt (T::IntType (a) ^ T::IntType (b)); } \ +inline T operator~ (T::EnumType a) { return T::FromInt (~T::IntType (a)); } + From 484485f3cfba3a638c895e813f4606a1271d52fd Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 2 Feb 2019 10:46:34 +0100 Subject: [PATCH 150/164] - made the event manager an object so it can be instantiated multiple times. --- src/b_game.cpp | 2 +- src/d_main.cpp | 6 +- src/d_net.cpp | 2 +- src/dobjgc.cpp | 4 +- src/events.cpp | 236 ++++++++++++++++---------------- src/events.h | 181 ++++++++++++------------ src/g_game.cpp | 6 +- src/g_level.cpp | 14 +- src/g_shared/a_lightning.cpp | 2 +- src/g_statusbar/shared_sbar.cpp | 2 +- src/gamedata/info.cpp | 6 +- src/p_destructible.cpp | 4 +- src/p_interaction.cpp | 8 +- src/p_mobj.cpp | 8 +- src/p_saveg.cpp | 2 +- src/p_setup.cpp | 8 +- src/p_spec.cpp | 4 +- src/p_tick.cpp | 2 +- src/p_user.cpp | 2 +- src/win32/i_input.cpp | 2 +- src/win32/i_mouse.cpp | 2 +- 21 files changed, 257 insertions(+), 246 deletions(-) diff --git a/src/b_game.cpp b/src/b_game.cpp index 2442eea5b..db7c70436 100644 --- a/src/b_game.cpp +++ b/src/b_game.cpp @@ -423,7 +423,7 @@ void FCajunMaster::RemoveAllBots (FLevelLocals *Level, bool fromlist) } } // [ZZ] run event hook - E_PlayerDisconnected(i); + eventManager.PlayerDisconnected(i); Level->Behaviors.StartTypedScripts (SCRIPT_Disconnect, players[i].mo, true, i, true); ClearPlayer (i, !fromlist); } diff --git a/src/d_main.cpp b/src/d_main.cpp index 71c9da650..13ebccc3f 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -273,7 +273,7 @@ void D_ProcessEvents (void) if (M_Responder (ev)) continue; // menu ate the event // check events - if (ev->type != EV_Mouse && E_Responder(ev)) // [ZZ] ZScript ate the event // update 07.03.17: mouse events are handled directly + if (ev->type != EV_Mouse && eventManager.Responder(ev)) // [ZZ] ZScript ate the event // update 07.03.17: mouse events are handled directly continue; G_Responder (ev); } @@ -295,7 +295,7 @@ void D_PostEvent (const event_t *ev) return; } events[eventhead] = *ev; - if (ev->type == EV_Mouse && menuactive == MENU_Off && ConsoleState != c_down && ConsoleState != c_falling && !E_Responder(ev) && !paused) + if (ev->type == EV_Mouse && menuactive == MENU_Off && ConsoleState != c_down && ConsoleState != c_falling && !eventManager.Responder(ev) && !paused) { if (Button_Mlook.bDown || freelook) { @@ -2730,7 +2730,7 @@ void D_DoomMain (void) { Level->Thinkers.DestroyThinkersInList(STAT_STATIC); } - E_Shutdown(false); + eventManager.Shutdown(false); P_FreeLevelData(); M_SaveDefaults(NULL); // save config before the restart diff --git a/src/d_net.cpp b/src/d_net.cpp index 6ad9b564d..d7e173ca9 100644 --- a/src/d_net.cpp +++ b/src/d_net.cpp @@ -2671,7 +2671,7 @@ void Net_DoCommand (int type, uint8_t **stream, int player) for (int i = 0; i < 3; i++) arg[i] = ReadLong(stream); bool manual = !!ReadByte(stream); - E_Console(player, s, arg[0], arg[1], arg[2], manual); + eventManager.Console(player, s, arg[0], arg[1], arg[2], manual); } break; diff --git a/src/dobjgc.cpp b/src/dobjgc.cpp index e0531be7d..43bccb79c 100644 --- a/src/dobjgc.cpp +++ b/src/dobjgc.cpp @@ -282,8 +282,8 @@ static void MarkRoot() Mark(StatusBar); M_MarkMenus(); Mark(DIntermissionController::CurrentIntermission); - Mark(E_FirstEventHandler); - Mark(E_LastEventHandler); + Mark(eventManager.FirstEventHandler); + Mark(eventManager.LastEventHandler); for (auto Level : AllLevels()) Level->Mark(); diff --git a/src/events.cpp b/src/events.cpp index b82d660fd..7f934e18e 100755 --- a/src/events.cpp +++ b/src/events.cpp @@ -42,14 +42,14 @@ #include "g_game.h" #include "info.h" -DStaticEventHandler* E_FirstEventHandler = nullptr; -DStaticEventHandler* E_LastEventHandler = nullptr; +EventManager eventManager; -bool E_RegisterHandler(DStaticEventHandler* handler) + +bool EventManager::RegisterHandler(DStaticEventHandler* handler) { if (handler == nullptr || handler->ObjectFlags & OF_EuthanizeMe) return false; - if (E_CheckHandler(handler)) + if (CheckHandler(handler)) return false; handler->OnRegister(); @@ -57,7 +57,7 @@ bool E_RegisterHandler(DStaticEventHandler* handler) // link into normal list // update: link at specific position based on order. DStaticEventHandler* before = nullptr; - for (DStaticEventHandler* existinghandler = E_FirstEventHandler; existinghandler; existinghandler = existinghandler->next) + for (DStaticEventHandler* existinghandler = FirstEventHandler; existinghandler; existinghandler = existinghandler->next) { if (existinghandler->Order > handler->Order) { @@ -67,9 +67,9 @@ bool E_RegisterHandler(DStaticEventHandler* handler) } // 1. MyHandler2->1: - // E_FirstEventHandler = MyHandler2, E_LastEventHandler = MyHandler2 + // eventManager.FirstEventHandler = MyHandler2, eventManager.LastEventHandler = MyHandler2 // 2. MyHandler3->2: - // E_FirstEventHandler = MyHandler2, E_LastEventHandler = MyHandler3 + // eventManager.FirstEventHandler = MyHandler2, eventManager.LastEventHandler = MyHandler3 // (Yes, all those write barriers here are really needed!) if (before != nullptr) @@ -87,9 +87,9 @@ bool E_RegisterHandler(DStaticEventHandler* handler) GC::WriteBarrier(handler, before->prev); before->prev = handler; GC::WriteBarrier(before, handler); - if (before == E_FirstEventHandler) + if (before == FirstEventHandler) { - E_FirstEventHandler = handler; + FirstEventHandler = handler; GC::WriteBarrier(handler); } } @@ -97,11 +97,11 @@ bool E_RegisterHandler(DStaticEventHandler* handler) { // so if before is null, it means add last. // it can also mean that we have no handlers at all yet. - handler->prev = E_LastEventHandler; - GC::WriteBarrier(handler, E_LastEventHandler); + handler->prev = LastEventHandler; + GC::WriteBarrier(handler, LastEventHandler); handler->next = nullptr; - if (E_FirstEventHandler == nullptr) E_FirstEventHandler = handler; - E_LastEventHandler = handler; + if (FirstEventHandler == nullptr) FirstEventHandler = handler; + LastEventHandler = handler; GC::WriteBarrier(handler); if (handler->prev != nullptr) { @@ -118,11 +118,11 @@ bool E_RegisterHandler(DStaticEventHandler* handler) return true; } -bool E_UnregisterHandler(DStaticEventHandler* handler) +bool EventManager::UnregisterHandler(DStaticEventHandler* handler) { if (handler == nullptr || handler->ObjectFlags & OF_EuthanizeMe) return false; - if (!E_CheckHandler(handler)) + if (!CheckHandler(handler)) return false; handler->OnUnregister(); @@ -138,14 +138,14 @@ bool E_UnregisterHandler(DStaticEventHandler* handler) handler->next->prev = handler->prev; GC::WriteBarrier(handler->next, handler->prev); } - if (handler == E_FirstEventHandler) + if (handler == FirstEventHandler) { - E_FirstEventHandler = handler->next; + FirstEventHandler = handler->next; GC::WriteBarrier(handler->next); } - if (handler == E_LastEventHandler) + if (handler == LastEventHandler) { - E_LastEventHandler = handler->prev; + LastEventHandler = handler->prev; GC::WriteBarrier(handler->prev); } if (handler->IsStatic()) @@ -156,7 +156,7 @@ bool E_UnregisterHandler(DStaticEventHandler* handler) return true; } -bool E_SendNetworkEvent(FString name, int arg1, int arg2, int arg3, bool manual) +bool EventManager::SendNetworkEvent(FString name, int arg1, int arg2, int arg3, bool manual) { if (gamestate != GS_LEVEL) return false; @@ -172,21 +172,21 @@ bool E_SendNetworkEvent(FString name, int arg1, int arg2, int arg3, bool manual) return true; } -bool E_CheckHandler(DStaticEventHandler* handler) +bool EventManager::CheckHandler(DStaticEventHandler* handler) { - for (DStaticEventHandler* lhandler = E_FirstEventHandler; lhandler; lhandler = lhandler->next) + for (DStaticEventHandler* lhandler = FirstEventHandler; lhandler; lhandler = lhandler->next) if (handler == lhandler) return true; return false; } -bool E_IsStaticType(PClass* type) +bool EventManager::IsStaticType(PClass* type) { assert(type != nullptr); assert(type->IsDescendantOf(RUNTIME_CLASS(DStaticEventHandler))); return !type->IsDescendantOf(RUNTIME_CLASS(DEventHandler)); } -void E_SerializeEvents(FSerializer& arc) +void EventManager::SerializeEvents(FSerializer& arc) { // todo : stuff if (arc.BeginArray("eventhandlers")) @@ -197,12 +197,12 @@ void E_SerializeEvents(FSerializer& arc) { numlocalhandlers = arc.ArraySize(); // delete all current local handlers, if any - for (DStaticEventHandler* lhandler = E_FirstEventHandler; lhandler; lhandler = lhandler->next) + for (DStaticEventHandler* lhandler = FirstEventHandler; lhandler; lhandler = lhandler->next) if (!lhandler->IsStatic()) lhandler->Destroy(); } else { - for (DStaticEventHandler* lhandler = E_FirstEventHandler; lhandler; lhandler = lhandler->next) + for (DStaticEventHandler* lhandler = FirstEventHandler; lhandler; lhandler = lhandler->next) { if (lhandler->IsStatic()) continue; numlocalhandlers++; @@ -231,14 +231,14 @@ void E_SerializeEvents(FSerializer& arc) { // add all newly deserialized handlers into the list for (int i = 0; i < numlocalhandlers; i++) - E_RegisterHandler(handlers[i]); + RegisterHandler(handlers[i]); } arc.EndArray(); } } -static PClass* E_GetHandlerClass(const FString& typeName) +static PClass* GetHandlerClass(const FString& typeName) { PClass* type = PClass::FindClass(typeName); @@ -254,11 +254,11 @@ static PClass* E_GetHandlerClass(const FString& typeName) return type; } -static void E_InitHandler(PClass* type) +void EventManager::InitHandler(PClass* type) { // check if type already exists, don't add twice. bool typeExists = false; - for (DStaticEventHandler* handler = E_FirstEventHandler; handler; handler = handler->next) + for (DStaticEventHandler* handler = FirstEventHandler; handler; handler = handler->next) { if (handler->IsA(type)) { @@ -269,27 +269,27 @@ static void E_InitHandler(PClass* type) if (typeExists) return; DStaticEventHandler* handler = (DStaticEventHandler*)type->CreateNew(); - E_RegisterHandler(handler); + RegisterHandler(handler); } -void E_InitStaticHandlers(bool map) +void EventManager::InitStaticHandlers(bool map) { // don't initialize map handlers if restoring from savegame. if (savegamerestore) return; // just make sure - E_Shutdown(map); + Shutdown(map); // initialize event handlers from gameinfo for (const FString& typeName : gameinfo.EventHandlers) { - PClass* type = E_GetHandlerClass(typeName); + PClass* type = GetHandlerClass(typeName); // don't init the really global stuff here on startup initialization. // don't init map-local global stuff here on level setup. - if (map == E_IsStaticType(type)) + if (map == IsStaticType(type)) continue; - E_InitHandler(type); + InitHandler(type); } if (!map) @@ -298,26 +298,26 @@ void E_InitStaticHandlers(bool map) // initialize event handlers from mapinfo for (const FString& typeName : level.info->EventHandlers) { - PClass* type = E_GetHandlerClass(typeName); - if (E_IsStaticType(type)) + PClass* type = GetHandlerClass(typeName); + if (IsStaticType(type)) I_Error("Fatal: invalid event handler class %s in MAPINFO!\nMap-specific event handlers cannot be static.\n", typeName.GetChars()); - E_InitHandler(type); + InitHandler(type); } } -void E_Shutdown(bool map) +void EventManager::Shutdown(bool map) { // delete handlers. - for (DStaticEventHandler* handler = E_LastEventHandler; handler; handler = handler->prev) + for (DStaticEventHandler* handler = LastEventHandler; handler; handler = handler->prev) { if (handler->IsStatic() == !map) handler->Destroy(); } } -#define DEFINE_EVENT_LOOPER(name) void E_##name() \ +#define DEFINE_EVENT_LOOPER(name) void EventManager::##name() \ { \ - for (DStaticEventHandler* handler = E_FirstEventHandler; handler; handler = handler->next) \ + for (DStaticEventHandler* handler = FirstEventHandler; handler; handler = handler->next) \ handler->name(); \ } @@ -325,9 +325,9 @@ void E_Shutdown(bool map) // *Unsafe is executed on EVERY map load/close, including savegame loading, etc. // There is no point in allowing non-static handlers to receive unsafe event separately, as there is no point in having static handlers receive safe event. // Because the main point of safe WorldLoaded/Unloading is that it will be preserved in savegames. -void E_WorldLoaded() +void EventManager::WorldLoaded() { - for (DStaticEventHandler* handler = E_FirstEventHandler; handler; handler = handler->next) + for (DStaticEventHandler* handler = FirstEventHandler; handler; handler = handler->next) { if (handler->IsStatic()) continue; if (savegamerestore) continue; // don't execute WorldLoaded for handlers loaded from the savegame. @@ -335,70 +335,70 @@ void E_WorldLoaded() } } -void E_WorldUnloaded() +void EventManager::WorldUnloaded() { - for (DStaticEventHandler* handler = E_LastEventHandler; handler; handler = handler->prev) + for (DStaticEventHandler* handler = eventManager.LastEventHandler; handler; handler = handler->prev) { if (handler->IsStatic()) continue; handler->WorldUnloaded(); } } -void E_WorldLoadedUnsafe() +void EventManager::WorldLoadedUnsafe() { - for (DStaticEventHandler* handler = E_FirstEventHandler; handler; handler = handler->next) + for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) { if (!handler->IsStatic()) continue; handler->WorldLoaded(); } } -void E_WorldUnloadedUnsafe() +void EventManager::WorldUnloadedUnsafe() { - for (DStaticEventHandler* handler = E_LastEventHandler; handler; handler = handler->prev) + for (DStaticEventHandler* handler = eventManager.LastEventHandler; handler; handler = handler->prev) { if (!handler->IsStatic()) continue; handler->WorldUnloaded(); } } -void E_WorldThingSpawned(AActor* actor) +void EventManager::WorldThingSpawned(AActor* actor) { // don't call anything if actor was destroyed on PostBeginPlay/BeginPlay/whatever. if (actor->ObjectFlags & OF_EuthanizeMe) return; - for (DStaticEventHandler* handler = E_FirstEventHandler; handler; handler = handler->next) + for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) handler->WorldThingSpawned(actor); } -void E_WorldThingDied(AActor* actor, AActor* inflictor) +void EventManager::WorldThingDied(AActor* actor, AActor* inflictor) { // don't call anything if actor was destroyed on PostBeginPlay/BeginPlay/whatever. if (actor->ObjectFlags & OF_EuthanizeMe) return; - for (DStaticEventHandler* handler = E_FirstEventHandler; handler; handler = handler->next) + for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) handler->WorldThingDied(actor, inflictor); } -void E_WorldThingRevived(AActor* actor) +void EventManager::WorldThingRevived(AActor* actor) { // don't call anything if actor was destroyed on PostBeginPlay/BeginPlay/whatever. if (actor->ObjectFlags & OF_EuthanizeMe) return; - for (DStaticEventHandler* handler = E_FirstEventHandler; handler; handler = handler->next) + for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) handler->WorldThingRevived(actor); } -void E_WorldThingDamaged(AActor* actor, AActor* inflictor, AActor* source, int damage, FName mod, int flags, DAngle angle) +void EventManager::WorldThingDamaged(AActor* actor, AActor* inflictor, AActor* source, int damage, FName mod, int flags, DAngle angle) { // don't call anything if actor was destroyed on PostBeginPlay/BeginPlay/whatever. if (actor->ObjectFlags & OF_EuthanizeMe) return; - for (DStaticEventHandler* handler = E_FirstEventHandler; handler; handler = handler->next) + for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) handler->WorldThingDamaged(actor, inflictor, source, damage, mod, flags, angle); } -void E_WorldThingDestroyed(AActor* actor) +void EventManager::WorldThingDestroyed(AActor* actor) { // don't call anything if actor was destroyed on PostBeginPlay/BeginPlay/whatever. if (actor->ObjectFlags & OF_EuthanizeMe) @@ -407,73 +407,73 @@ void E_WorldThingDestroyed(AActor* actor) // this is because Destroyed should be reverse of Spawned. we don't want to catch random inventory give failures. if (!(actor->ObjectFlags & OF_Spawned)) return; - for (DStaticEventHandler* handler = E_LastEventHandler; handler; handler = handler->prev) + for (DStaticEventHandler* handler = eventManager.LastEventHandler; handler; handler = handler->prev) handler->WorldThingDestroyed(actor); } -void E_WorldLinePreActivated(line_t* line, AActor* actor, int activationType, bool* shouldactivate) +void EventManager::WorldLinePreActivated(line_t* line, AActor* actor, int activationType, bool* shouldactivate) { - for (DStaticEventHandler* handler = E_FirstEventHandler; handler; handler = handler->next) + for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) handler->WorldLinePreActivated(line, actor, activationType, shouldactivate); } -void E_WorldLineActivated(line_t* line, AActor* actor, int activationType) +void EventManager::WorldLineActivated(line_t* line, AActor* actor, int activationType) { - for (DStaticEventHandler* handler = E_FirstEventHandler; handler; handler = handler->next) + for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) handler->WorldLineActivated(line, actor, activationType); } -int E_WorldSectorDamaged(sector_t* sector, AActor* source, int damage, FName damagetype, int part, DVector3 position, bool isradius) +int EventManager::WorldSectorDamaged(sector_t* sector, AActor* source, int damage, FName damagetype, int part, DVector3 position, bool isradius) { - for (DStaticEventHandler* handler = E_FirstEventHandler; handler; handler = handler->next) + for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) damage = handler->WorldSectorDamaged(sector, source, damage, damagetype, part, position, isradius); return damage; } -int E_WorldLineDamaged(line_t* line, AActor* source, int damage, FName damagetype, int side, DVector3 position, bool isradius) +int EventManager::WorldLineDamaged(line_t* line, AActor* source, int damage, FName damagetype, int side, DVector3 position, bool isradius) { - for (DStaticEventHandler* handler = E_FirstEventHandler; handler; handler = handler->next) + for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) damage = handler->WorldLineDamaged(line, source, damage, damagetype, side, position, isradius); return damage; } -void E_PlayerEntered(int num, bool fromhub) +void EventManager::PlayerEntered(int num, bool fromhub) { // this event can happen during savegamerestore. make sure that local handlers don't receive it. // actually, global handlers don't want it too. if (savegamerestore && !fromhub) return; - for (DStaticEventHandler* handler = E_FirstEventHandler; handler; handler = handler->next) + for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) handler->PlayerEntered(num, fromhub); } -void E_PlayerRespawned(int num) +void EventManager::PlayerRespawned(int num) { - for (DStaticEventHandler* handler = E_FirstEventHandler; handler; handler = handler->next) + for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) handler->PlayerRespawned(num); } -void E_PlayerDied(int num) +void EventManager::PlayerDied(int num) { - for (DStaticEventHandler* handler = E_FirstEventHandler; handler; handler = handler->next) + for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) handler->PlayerDied(num); } -void E_PlayerDisconnected(int num) +void EventManager::PlayerDisconnected(int num) { - for (DStaticEventHandler* handler = E_LastEventHandler; handler; handler = handler->prev) + for (DStaticEventHandler* handler = eventManager.LastEventHandler; handler; handler = handler->prev) handler->PlayerDisconnected(num); } -bool E_Responder(const event_t* ev) +bool EventManager::Responder(const event_t* ev) { bool uiProcessorsFound = false; if (ev->type == EV_GUI_Event) { // iterate handlers back to front by order, and give them this event. - for (DStaticEventHandler* handler = E_LastEventHandler; handler; handler = handler->prev) + for (DStaticEventHandler* handler = eventManager.LastEventHandler; handler; handler = handler->prev) { if (handler->IsUiProcessor) { @@ -486,7 +486,7 @@ bool E_Responder(const event_t* ev) else { // not sure if we want to handle device changes, but whatevs. - for (DStaticEventHandler* handler = E_LastEventHandler; handler; handler = handler->prev) + for (DStaticEventHandler* handler = eventManager.LastEventHandler; handler; handler = handler->prev) { if (handler->IsUiProcessor) uiProcessorsFound = true; @@ -498,61 +498,61 @@ bool E_Responder(const event_t* ev) return (uiProcessorsFound && (ev->type == EV_Mouse)); // mouse events are eaten by the event system if there are any uiprocessors. } -void E_Console(int player, FString name, int arg1, int arg2, int arg3, bool manual) +void EventManager::Console(int player, FString name, int arg1, int arg2, int arg3, bool manual) { - for (DStaticEventHandler* handler = E_FirstEventHandler; handler; handler = handler->next) + for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) handler->ConsoleProcess(player, name, arg1, arg2, arg3, manual); } -void E_RenderOverlay(EHudState state) +void EventManager::RenderOverlay(EHudState state) { - for (DStaticEventHandler* handler = E_FirstEventHandler; handler; handler = handler->next) + for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) handler->RenderOverlay(state); } -bool E_CheckUiProcessors() +bool EventManager::CheckUiProcessors() { - for (DStaticEventHandler* handler = E_FirstEventHandler; handler; handler = handler->next) + for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) if (handler->IsUiProcessor) return true; return false; } -bool E_CheckRequireMouse() +bool EventManager::CheckRequireMouse() { - for (DStaticEventHandler* handler = E_FirstEventHandler; handler; handler = handler->next) + for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) if (handler->IsUiProcessor && handler->RequireMouse) return true; return false; } -bool E_CheckReplacement( PClassActor *replacee, PClassActor **replacement ) +bool EventManager::CheckReplacement( PClassActor *replacee, PClassActor **replacement ) { bool final = false; - for (DStaticEventHandler *handler = E_FirstEventHandler; handler; handler = handler->next) + for (DStaticEventHandler *handler = eventManager.FirstEventHandler; handler; handler = handler->next) handler->CheckReplacement(replacee,replacement,&final); return final; } -bool E_CheckReplacee(PClassActor **replacee, PClassActor *replacement) +bool EventManager::CheckReplacee(PClassActor **replacee, PClassActor *replacement) { bool final = false; - for (DStaticEventHandler *handler = E_FirstEventHandler; handler; handler = handler->next) + for (DStaticEventHandler *handler = eventManager.FirstEventHandler; handler; handler = handler->next) handler->CheckReplacee(replacee, replacement, &final); return final; } -void E_NewGame(EventHandlerType handlerType) +void EventManager::NewGame(EventHandlerType handlerType) { bool isStatic = handlerType == EventHandlerType::Global; // Shut down all per-map event handlers before static NewGame events. if (isStatic) - E_Shutdown(true); + EventManager::Shutdown(true); - for (DStaticEventHandler* handler = E_FirstEventHandler; handler; handler = handler->next) + for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) { if (handler->IsStatic() == isStatic) handler->NewGame(); @@ -644,7 +644,7 @@ DEFINE_ACTION_FUNCTION(DStaticEventHandler, SetOrder) PARAM_SELF_PROLOGUE(DStaticEventHandler); PARAM_INT(order); - if (E_CheckHandler(self)) + if (eventManager.CheckHandler(self)) return 0; self->Order = order; @@ -660,14 +660,14 @@ DEFINE_ACTION_FUNCTION(DEventHandler, SendNetworkEvent) PARAM_INT(arg3); // - ACTION_RETURN_BOOL(E_SendNetworkEvent(name, arg1, arg2, arg3, false)); + ACTION_RETURN_BOOL(eventManager.SendNetworkEvent(name, arg1, arg2, arg3, false)); } DEFINE_ACTION_FUNCTION(DEventHandler, Find) { PARAM_PROLOGUE; PARAM_CLASS(t, DStaticEventHandler); - for (DStaticEventHandler* handler = E_FirstEventHandler; handler; handler = handler->next) + for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) if (handler->GetClass() == t) // check precise class ACTION_RETURN_OBJECT(handler); ACTION_RETURN_OBJECT(nullptr); @@ -678,7 +678,7 @@ DEFINE_ACTION_FUNCTION(DStaticEventHandler, Find) { PARAM_PROLOGUE; PARAM_CLASS(t, DStaticEventHandler); - for (DStaticEventHandler* handler = E_FirstEventHandler; handler; handler = handler->next) + for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) if (handler->GetClass() == t) // check precise class ACTION_RETURN_OBJECT(handler); ACTION_RETURN_OBJECT(nullptr); @@ -726,7 +726,7 @@ void DStaticEventHandler::OnUnregister() } } -static FWorldEvent E_SetupWorldEvent() +FWorldEvent EventManager::SetupWorldEvent() { FWorldEvent e; e.IsSaveGame = savegamerestore; @@ -741,7 +741,7 @@ void DStaticEventHandler::WorldLoaded() { // don't create excessive DObjects if not going to be processed anyway if (isEmpty(func)) return; - FWorldEvent e = E_SetupWorldEvent(); + FWorldEvent e = eventManager.SetupWorldEvent(); VMValue params[2] = { (DStaticEventHandler*)this, &e }; VMCall(func, params, 2, nullptr, 0); } @@ -753,7 +753,7 @@ void DStaticEventHandler::WorldUnloaded() { // don't create excessive DObjects if not going to be processed anyway if (isEmpty(func)) return; - FWorldEvent e = E_SetupWorldEvent(); + FWorldEvent e = eventManager.SetupWorldEvent(); VMValue params[2] = { (DStaticEventHandler*)this, &e }; VMCall(func, params, 2, nullptr, 0); } @@ -765,7 +765,7 @@ void DStaticEventHandler::WorldThingSpawned(AActor* actor) { // don't create excessive DObjects if not going to be processed anyway if (isEmpty(func)) return; - FWorldEvent e = E_SetupWorldEvent(); + FWorldEvent e = eventManager.SetupWorldEvent(); e.Thing = actor; VMValue params[2] = { (DStaticEventHandler*)this, &e }; VMCall(func, params, 2, nullptr, 0); @@ -778,7 +778,7 @@ void DStaticEventHandler::WorldThingDied(AActor* actor, AActor* inflictor) { // don't create excessive DObjects if not going to be processed anyway if (isEmpty(func)) return; - FWorldEvent e = E_SetupWorldEvent(); + FWorldEvent e = eventManager.SetupWorldEvent(); e.Thing = actor; e.Inflictor = inflictor; VMValue params[2] = { (DStaticEventHandler*)this, &e }; @@ -792,7 +792,7 @@ void DStaticEventHandler::WorldThingRevived(AActor* actor) { // don't create excessive DObjects if not going to be processed anyway if (isEmpty(func)) return; - FWorldEvent e = E_SetupWorldEvent(); + FWorldEvent e = eventManager.SetupWorldEvent(); e.Thing = actor; VMValue params[2] = { (DStaticEventHandler*)this, &e }; VMCall(func, params, 2, nullptr, 0); @@ -805,7 +805,7 @@ void DStaticEventHandler::WorldThingDamaged(AActor* actor, AActor* inflictor, AA { // don't create excessive DObjects if not going to be processed anyway if (isEmpty(func)) return; - FWorldEvent e = E_SetupWorldEvent(); + FWorldEvent e = eventManager.SetupWorldEvent(); e.Thing = actor; e.Inflictor = inflictor; e.Damage = damage; @@ -824,7 +824,7 @@ void DStaticEventHandler::WorldThingDestroyed(AActor* actor) { // don't create excessive DObjects if not going to be processed anyway if (isEmpty(func)) return; - FWorldEvent e = E_SetupWorldEvent(); + FWorldEvent e = eventManager.SetupWorldEvent(); e.Thing = actor; VMValue params[2] = { (DStaticEventHandler*)this, &e }; VMCall(func, params, 2, nullptr, 0); @@ -837,7 +837,7 @@ void DStaticEventHandler::WorldLinePreActivated(line_t* line, AActor* actor, int { // don't create excessive DObjects if not going to be processed anyway if (isEmpty(func)) return; - FWorldEvent e = E_SetupWorldEvent(); + FWorldEvent e = eventManager.SetupWorldEvent(); e.Thing = actor; e.ActivatedLine = line; e.ActivationType = activationType; @@ -854,7 +854,7 @@ void DStaticEventHandler::WorldLineActivated(line_t* line, AActor* actor, int ac { // don't create excessive DObjects if not going to be processed anyway if (isEmpty(func)) return; - FWorldEvent e = E_SetupWorldEvent(); + FWorldEvent e = eventManager.SetupWorldEvent(); e.Thing = actor; e.ActivatedLine = line; e.ActivationType = activationType; @@ -869,7 +869,7 @@ int DStaticEventHandler::WorldSectorDamaged(sector_t* sector, AActor* source, in { // don't create excessive DObjects if not going to be processed anyway if (isEmpty(func)) return damage; - FWorldEvent e = E_SetupWorldEvent(); + FWorldEvent e = eventManager.SetupWorldEvent(); e.DamageSource = source; e.DamageSector = sector; e.NewDamage = e.Damage = damage; @@ -892,7 +892,7 @@ int DStaticEventHandler::WorldLineDamaged(line_t* line, AActor* source, int dama { // don't create excessive DObjects if not going to be processed anyway if (isEmpty(func)) return damage; - FWorldEvent e = E_SetupWorldEvent(); + FWorldEvent e = eventManager.SetupWorldEvent(); e.DamageSource = source; e.DamageLine = line; e.NewDamage = e.Damage = damage; @@ -915,7 +915,7 @@ void DStaticEventHandler::WorldLightning() { // don't create excessive DObjects if not going to be processed anyway if (isEmpty(func)) return; - FWorldEvent e = E_SetupWorldEvent(); + FWorldEvent e = eventManager.SetupWorldEvent(); VMValue params[2] = { (DStaticEventHandler*)this, &e }; VMCall(func, params, 2, nullptr, 0); } @@ -932,7 +932,7 @@ void DStaticEventHandler::WorldTick() } } -static FRenderEvent E_SetupRenderEvent() +FRenderEvent EventManager::SetupRenderEvent() { FRenderEvent e; auto &vp = r_viewpoint; @@ -952,7 +952,7 @@ void DStaticEventHandler::RenderFrame() { // don't create excessive DObjects if not going to be processed anyway if (isEmpty(func)) return; - FRenderEvent e = E_SetupRenderEvent(); + FRenderEvent e = eventManager.SetupRenderEvent(); VMValue params[2] = { (DStaticEventHandler*)this, &e }; VMCall(func, params, 2, nullptr, 0); } @@ -965,7 +965,7 @@ void DStaticEventHandler::RenderOverlay(EHudState state) { // don't create excessive DObjects if not going to be processed anyway if (isEmpty(func)) return; - FRenderEvent e = E_SetupRenderEvent(); + FRenderEvent e = eventManager.SetupRenderEvent(); e.HudState = int(state); VMValue params[2] = { (DStaticEventHandler*)this, &e }; VMCall(func, params, 2, nullptr, 0); @@ -1234,7 +1234,7 @@ void DStaticEventHandler::NewGame() // void DStaticEventHandler::OnDestroy() { - E_UnregisterHandler(this); + eventManager.UnregisterHandler(this); Super::OnDestroy(); } @@ -1255,7 +1255,7 @@ CCMD(event) for (int i = 0; i < argn; i++) arg[i] = atoi(argv[2 + i]); // call locally - E_Console(-1, argv[1], arg[0], arg[1], arg[2], true); + eventManager.Console(-1, argv[1], arg[0], arg[1], arg[2], true); } } @@ -1280,6 +1280,6 @@ CCMD(netevent) for (int i = 0; i < argn; i++) arg[i] = atoi(argv[2 + i]); // call networked - E_SendNetworkEvent(argv[1], arg[0], arg[1], arg[2], true); + eventManager.SendNetworkEvent(argv[1], arg[0], arg[1], arg[2], true); } } diff --git a/src/events.h b/src/events.h index dbd408a42..7a15e7f44 100755 --- a/src/events.h +++ b/src/events.h @@ -15,89 +15,6 @@ enum class EventHandlerType PerMap }; -// register -bool E_RegisterHandler(DStaticEventHandler* handler); -// unregister -bool E_UnregisterHandler(DStaticEventHandler* handler); -// find -bool E_CheckHandler(DStaticEventHandler* handler); -// check type -bool E_IsStaticType(PClass* type); -// init static handlers -void E_InitStaticHandlers(bool map); -// shutdown handlers -void E_Shutdown(bool map); - -// called right after the map has loaded (approximately same time as OPEN ACS scripts) -void E_WorldLoaded(); -// called when the map is about to unload (approximately same time as UNLOADING ACS scripts) -void E_WorldUnloaded(); -// called right after the map has loaded (every time, UNSAFE VERSION) -void E_WorldLoadedUnsafe(); -// called right before the map is unloaded (every time, UNSAFE VERSION) -void E_WorldUnloadedUnsafe(); -// called around PostBeginPlay of each actor. -void E_WorldThingSpawned(AActor* actor); -// called after AActor::Die of each actor. -void E_WorldThingDied(AActor* actor, AActor* inflictor); -// called after AActor::Revive. -void E_WorldThingRevived(AActor* actor); -// called before P_DamageMobj and before AActor::DamageMobj virtuals. -void E_WorldThingDamaged(AActor* actor, AActor* inflictor, AActor* source, int damage, FName mod, int flags, DAngle angle); -// called before AActor::Destroy of each actor. -void E_WorldThingDestroyed(AActor* actor); -// called in P_ActivateLine before executing special, set shouldactivate to false to prevent activation. -void E_WorldLinePreActivated(line_t* line, AActor* actor, int activationType, bool* shouldactivate); -// called in P_ActivateLine after successful special execution. -void E_WorldLineActivated(line_t* line, AActor* actor, int activationType); -// called in P_DamageSector and P_DamageLinedef before receiving damage to the sector. returns actual damage -int E_WorldSectorDamaged(sector_t* sector, AActor* source, int damage, FName damagetype, int part, DVector3 position, bool isradius); -// called in P_DamageLinedef before receiving damage to the linedef. returns actual damage -int E_WorldLineDamaged(line_t* line, AActor* source, int damage, FName damagetype, int side, DVector3 position, bool isradius); -// same as ACS SCRIPT_Lightning -void E_WorldLightning(); -// this executes on every tick, before everything, only when in valid level and not paused -void E_WorldTick(); -// this executes on every tick on UI side, always -void E_UiTick(); -// this executes on every tick on UI side, always AND immediately after everything else -void E_PostUiTick(); -// called on each render frame once. -void E_RenderFrame(); -// called after everything's been rendered, but before console/menus -void E_RenderOverlay(EHudState state); -// this executes when a player enters the level (once). PlayerEnter+inhub = RETURN -void E_PlayerEntered(int num, bool fromhub); -// this executes when a player respawns. includes resurrect cheat. -void E_PlayerRespawned(int num); -// this executes when a player dies (partially duplicating worldthingdied, but whatever) -void E_PlayerDied(int num); -// this executes when a player leaves the game -void E_PlayerDisconnected(int num); -// this executes on events. -bool E_Responder(const event_t* ev); // splits events into InputProcess and UiProcess -// this executes on console/net events. -void E_Console(int player, FString name, int arg1, int arg2, int arg3, bool manual); - -// called when looking up the replacement for an actor class -bool E_CheckReplacement(PClassActor* replacee, PClassActor** replacement); -// called when looking up the replaced for an actor class -bool E_CheckReplacee(PClassActor** replacee, PClassActor* replacement); - -// called on new game -void E_NewGame(EventHandlerType handlerType); - -// send networked event. unified function. -bool E_SendNetworkEvent(FString name, int arg1, int arg2, int arg3, bool manual); - -// check if there is anything that should receive GUI events -bool E_CheckUiProcessors(); -// check if we need native mouse due to UiProcessors -bool E_CheckRequireMouse(); - -// serialization stuff -void E_SerializeEvents(FSerializer& arc); - // ============================================== // // EventHandler - base class @@ -200,8 +117,6 @@ class DEventHandler : public DStaticEventHandler public: bool IsStatic() override { return false; } }; -extern DStaticEventHandler* E_FirstEventHandler; -extern DStaticEventHandler* E_LastEventHandler; struct FRenderEvent { @@ -311,4 +226,100 @@ struct FReplacedEvent bool IsFinal; }; +struct EventManager +{ + DStaticEventHandler* FirstEventHandler = nullptr; + DStaticEventHandler* LastEventHandler = nullptr; + + // register + bool RegisterHandler(DStaticEventHandler* handler); + // unregister + bool UnregisterHandler(DStaticEventHandler* handler); + // find + bool CheckHandler(DStaticEventHandler* handler); + // check type + bool IsStaticType(PClass* type); + // init static handlers + void InitStaticHandlers(bool map); + // shutdown handlers + void Shutdown(bool map); + + // called right after the map has loaded (approximately same time as OPEN ACS scripts) + void WorldLoaded(); + // called when the map is about to unload (approximately same time as UNLOADING ACS scripts) + void WorldUnloaded(); + // called right after the map has loaded (every time, UNSAFE VERSION) + void WorldLoadedUnsafe(); + // called right before the map is unloaded (every time, UNSAFE VERSION) + void WorldUnloadedUnsafe(); + // called around PostBeginPlay of each actor. + void WorldThingSpawned(AActor* actor); + // called after AActor::Die of each actor. + void WorldThingDied(AActor* actor, AActor* inflictor); + // called after AActor::Revive. + void WorldThingRevived(AActor* actor); + // called before P_DamageMobj and before AActor::DamageMobj virtuals. + void WorldThingDamaged(AActor* actor, AActor* inflictor, AActor* source, int damage, FName mod, int flags, DAngle angle); + // called before AActor::Destroy of each actor. + void WorldThingDestroyed(AActor* actor); + // called in P_ActivateLine before executing special, set shouldactivate to false to prevent activation. + void WorldLinePreActivated(line_t* line, AActor* actor, int activationType, bool* shouldactivate); + // called in P_ActivateLine after successful special execution. + void WorldLineActivated(line_t* line, AActor* actor, int activationType); + // called in P_DamageSector and P_DamageLinedef before receiving damage to the sector. returns actual damage + int WorldSectorDamaged(sector_t* sector, AActor* source, int damage, FName damagetype, int part, DVector3 position, bool isradius); + // called in P_DamageLinedef before receiving damage to the linedef. returns actual damage + int WorldLineDamaged(line_t* line, AActor* source, int damage, FName damagetype, int side, DVector3 position, bool isradius); + // same as ACS SCRIPT_Lightning + void WorldLightning(); + // this executes on every tick, before everything, only when in valid level and not paused + void WorldTick(); + // this executes on every tick on UI side, always + void UiTick(); + // this executes on every tick on UI side, always AND immediately after everything else + void PostUiTick(); + // called on each render frame once. + void RenderFrame(); + // called after everything's been rendered, but before console/menus + void RenderOverlay(EHudState state); + // this executes when a player enters the level (once). PlayerEnter+inhub = RETURN + void PlayerEntered(int num, bool fromhub); + // this executes when a player respawns. includes resurrect cheat. + void PlayerRespawned(int num); + // this executes when a player dies (partially duplicating worldthingdied, but whatever) + void PlayerDied(int num); + // this executes when a player leaves the game + void PlayerDisconnected(int num); + // this executes on events. + bool Responder(const event_t* ev); // splits events into InputProcess and UiProcess + // this executes on console/net events. + void Console(int player, FString name, int arg1, int arg2, int arg3, bool manual); + + // called when looking up the replacement for an actor class + bool CheckReplacement(PClassActor* replacee, PClassActor** replacement); + // called when looking up the replaced for an actor class + bool CheckReplacee(PClassActor** replacee, PClassActor* replacement); + + // called on new game + void NewGame(EventHandlerType handlerType); + + // send networked event. unified function. + bool SendNetworkEvent(FString name, int arg1, int arg2, int arg3, bool manual); + + // check if there is anything that should receive GUI events + bool CheckUiProcessors(); + // check if we need native mouse due to UiProcessors + bool CheckRequireMouse(); + + // serialization stuff + void SerializeEvents(FSerializer& arc); + + void InitHandler(PClass* type); + FWorldEvent SetupWorldEvent(); + FRenderEvent SetupRenderEvent(); + +}; + +extern EventManager eventManager; + #endif diff --git a/src/g_game.cpp b/src/g_game.cpp index a021fb281..b1cb497b1 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -1173,7 +1173,7 @@ void G_Ticker () } // [ZZ] also tick the UI part of the events - E_UiTick(); + eventManager.UiTick(); C_RunDelayedCommands(); // do main actions @@ -1213,7 +1213,7 @@ void G_Ticker () } // [MK] Additional ticker for UI events right after all others - E_PostUiTick(); + eventManager.PostUiTick(); } @@ -1697,7 +1697,7 @@ void G_DoPlayerPop(int playernum) auto mo = players[playernum].mo; mo->Level->Behaviors.StopMyScripts(mo); // [ZZ] fire player disconnect hook - E_PlayerDisconnected(playernum); + eventManager.PlayerDisconnected(playernum); // [RH] Let the scripts know the player left mo->Level->Behaviors.StartTypedScripts(SCRIPT_Disconnect, mo, true, playernum, true); if (mo != NULL) diff --git a/src/g_level.cpp b/src/g_level.cpp index 9a91e1997..f83dcd02e 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -454,7 +454,7 @@ void G_InitNew (const char *mapname, bool bTitleLevel) // did we have any level before? if (primaryLevel->info != nullptr) - E_WorldUnloadedUnsafe(); + eventManager.WorldUnloadedUnsafe(); if (!savegamerestore) { @@ -663,9 +663,9 @@ void FLevelLocals::ChangeLevel(const char *levelname, int position, int flags, i unloading = true; Behaviors.StartTypedScripts (SCRIPT_Unloading, NULL, false, 0, true); // [ZZ] safe world unload - E_WorldUnloaded(); + eventManager.WorldUnloaded(); // [ZZ] unsafe world unload (changemap != map) - E_WorldUnloadedUnsafe(); + eventManager.WorldUnloadedUnsafe(); unloading = false; STAT_ChangeLevel(nextlevel, this); @@ -1063,7 +1063,7 @@ void FLevelLocals::DoLoadLevel(const FString &nextmapname, int position, bool au if (newGame) { - E_NewGame(EventHandlerType::Global); + eventManager.NewGame(EventHandlerType::Global); } P_SetupLevel (this, position, newGame); @@ -1118,7 +1118,7 @@ void FLevelLocals::DoLoadLevel(const FString &nextmapname, int position, bool au } const bool fromSnapshot = FromSnapshot; - E_PlayerEntered(ii, fromSnapshot && finishstate == FINISH_SameHub); + eventManager.PlayerEntered(ii, fromSnapshot && finishstate == FINISH_SameHub); if (fromSnapshot) { @@ -1136,9 +1136,9 @@ void FLevelLocals::DoLoadLevel(const FString &nextmapname, int position, bool au StatusBar->AttachToPlayer (&players[consoleplayer]); // unsafe world load - E_WorldLoadedUnsafe(); + eventManager.WorldLoadedUnsafe(); // regular world load (savegames are handled internally) - E_WorldLoaded(); + eventManager.WorldLoaded(); DoDeferedScripts (); // [RH] Do script actions that were triggered on another map. diff --git a/src/g_shared/a_lightning.cpp b/src/g_shared/a_lightning.cpp index 62fae6e44..8ef204632 100644 --- a/src/g_shared/a_lightning.cpp +++ b/src/g_shared/a_lightning.cpp @@ -178,7 +178,7 @@ void DLightningThinker::LightningFlash () Level->flags |= LEVEL_SWAPSKIES; // set alternate sky S_Sound (CHAN_AUTO, "world/thunder", 1.0, ATTN_NONE); // [ZZ] just in case - E_WorldLightning(); + eventManager.WorldLightning(); // start LIGHTNING scripts Level->Behaviors.StartTypedScripts (SCRIPT_Lightning, NULL, false); // [RH] Run lightning scripts diff --git a/src/g_statusbar/shared_sbar.cpp b/src/g_statusbar/shared_sbar.cpp index 80c5f365c..093ae19fa 100644 --- a/src/g_statusbar/shared_sbar.cpp +++ b/src/g_statusbar/shared_sbar.cpp @@ -1147,7 +1147,7 @@ void DBaseStatusBar::DrawTopStuff (EHudState state) DrawMessages (HUDMSGLayer_OverMap, (state == HUD_StatusBar) ? GetTopOfStatusbar() : SCREENHEIGHT); } DrawMessages (HUDMSGLayer_OverHUD, (state == HUD_StatusBar) ? GetTopOfStatusbar() : SCREENHEIGHT); - E_RenderOverlay(state); + eventManager.RenderOverlay(state); DrawConsistancy (); DrawWaiting (); diff --git a/src/gamedata/info.cpp b/src/gamedata/info.cpp index 257f6ecce..fe3f259d2 100644 --- a/src/gamedata/info.cpp +++ b/src/gamedata/info.cpp @@ -395,7 +395,7 @@ void PClassActor::StaticInit() InitBotStuff(); // reinit GLOBAL static stuff from gameinfo, once classes are loaded. - E_InitStaticHandlers(false); + eventManager.InitStaticHandlers(false); } //========================================================================== @@ -538,7 +538,7 @@ PClassActor *PClassActor::GetReplacement(bool lookskill) } // [MK] ZScript replacement through Event Handlers, has priority over others PClassActor *Replacement = ActorInfo()->Replacement; - if ( E_CheckReplacement(this,&Replacement) ) + if (eventManager.CheckReplacement(this,&Replacement) ) { // [MK] the replacement is final, so don't continue with the chain return Replacement ? Replacement : this; @@ -598,7 +598,7 @@ PClassActor *PClassActor::GetReplacee(bool lookskill) // showing up, one can assign an Arachnotron as the one being replaced // so functions like CheckReplacee and A_BossDeath can actually work, given // modders set it up that way. - if (E_CheckReplacee(&savedrep, this)) + if (eventManager.CheckReplacee(&savedrep, this)) { // [MK] the replacement is final, so don't continue with the chain return savedrep ? savedrep : this; diff --git a/src/p_destructible.cpp b/src/p_destructible.cpp index 4794b7ed4..c15618912 100755 --- a/src/p_destructible.cpp +++ b/src/p_destructible.cpp @@ -124,7 +124,7 @@ void P_DamageLinedef(line_t* line, AActor* source, int damage, FName damagetype, if (dogroups) { - damage = E_WorldLineDamaged(line, source, damage, damagetype, side, position, isradius); + damage = eventManager.WorldLineDamaged(line, source, damage, damagetype, side, position, isradius); if (damage < 0) damage = 0; } @@ -160,7 +160,7 @@ void P_DamageSector(sector_t* sector, AActor* source, int damage, FName damagety if (dogroups) { - damage = E_WorldSectorDamaged(sector, source, damage, damagetype, part, position, isradius); + damage = eventManager.WorldSectorDamaged(sector, source, damage, damagetype, part, position, isradius); if (damage < 0) damage = 0; } diff --git a/src/p_interaction.cpp b/src/p_interaction.cpp index fab4f2992..4f58a1ad3 100644 --- a/src/p_interaction.cpp +++ b/src/p_interaction.cpp @@ -347,7 +347,7 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOf } // [ZZ] Fire WorldThingDied script hook. - E_WorldThingDied(this, inflictor); + eventManager.WorldThingDied(this, inflictor); // [JM] Fire KILL type scripts for actor. Not needed for players, since they have the "DEATH" script type. if (!player && !(flags7 & MF7_NOKILLSCRIPTS) && ((flags7 & MF7_USEKILLSCRIPTS) || gameinfo.forcekillscripts)) @@ -560,7 +560,7 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOf ClientObituary (this, inflictor, source, dmgflags, MeansOfDeath); // [ZZ] fire player death hook - E_PlayerDied(Level->PlayerNum(player)); + eventManager.PlayerDied(Level->PlayerNum(player)); // Death script execution, care of Skull Tag Level->Behaviors.StartTypedScripts (SCRIPT_Death, this, true); @@ -1460,7 +1460,7 @@ static int DamageMobj (AActor *target, AActor *inflictor, AActor *source, int da } const int realdamage = MAX(0, damage); - E_WorldThingDamaged(target, inflictor, source, realdamage, mod, flags, angle); + eventManager.WorldThingDamaged(target, inflictor, source, realdamage, mod, flags, angle); needevent = false; target->CallDie (source, inflictor, flags, MeansOfDeath); @@ -1481,7 +1481,7 @@ static int DoDamageMobj(AActor *target, AActor *inflictor, AActor *source, int d if (realdamage > 0 && needevent) { // [ZZ] event handlers only need the resultant damage (they can't do anything about it anyway) - E_WorldThingDamaged(target, inflictor, source, realdamage, mod, flags, angle); + eventManager.WorldThingDamaged(target, inflictor, source, realdamage, mod, flags, angle); } return MAX(0, realdamage); diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 4379ae32d..057eae6e6 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -4682,7 +4682,7 @@ void AActor::PostBeginPlay () void AActor::CallPostBeginPlay() { Super::CallPostBeginPlay(); - E_WorldThingSpawned(this); + eventManager.WorldThingSpawned(this); } bool AActor::isFast() @@ -4800,7 +4800,7 @@ void AActor::OnDestroy () // note that this differs from ThingSpawned in that you can actually override OnDestroy to avoid calling the hook. // but you can't really do that without utterly breaking the game, so it's ok. // note: if OnDestroy is ever made optional, E_WorldThingDestroyed should still be called for ANY thing. - E_WorldThingDestroyed(this); + eventManager.WorldThingDestroyed(this); DeleteAttachedLights(); ClearRenderSectorList(); @@ -5155,7 +5155,7 @@ AActor *FLevelLocals::SpawnPlayer (FPlayerStart *mthing, int playernum, int flag DObject::StaticPointerSubstitution (oldactor, p->mo); - E_PlayerRespawned(PlayerNum(p)); + eventManager.PlayerRespawned(PlayerNum(p)); Behaviors.StartTypedScripts (SCRIPT_Respawn, p->mo, true); } } @@ -7137,7 +7137,7 @@ void AActor::Revive() } // [ZZ] resurrect hook - E_WorldThingRevived(this); + eventManager.WorldThingRevived(this); } int AActor::GetGibHealth() const diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 130c09089..43e2b2beb 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -1000,7 +1000,7 @@ void FLevelLocals::Serialize(FSerializer &arc, bool hubload) // [ZZ] serialize health groups P_SerializeHealthGroups(this, arc); // [ZZ] serialize events - E_SerializeEvents(arc); + eventManager.SerializeEvents(arc); Thinkers.SerializeThinkers(arc, hubload); arc("polyobjs", Polyobjects); SerializeSubsectors(arc, "subsectors"); diff --git a/src/p_setup.cpp b/src/p_setup.cpp index fd3bc8537..d51547e2c 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -350,7 +350,7 @@ void P_FreeLevelData () { // [ZZ] delete per-map event handlers - E_Shutdown(true); + eventManager.Shutdown(true); R_FreePastViewers(); for (auto Level : AllLevels()) @@ -425,7 +425,7 @@ void P_SetupLevel(FLevelLocals *Level, int position, bool newGame) // [ZZ] init per-map static handlers. we need to call this before everything is set up because otherwise scripts don't receive PlayerEntered event // (which happens at god-knows-what stage in this function, but definitely not the last part, because otherwise it'd work to put E_InitStaticHandlers before the player spawning) - E_InitStaticHandlers(true); + eventManager.InitStaticHandlers(true); // generate a checksum for the level, to be included and checked with savegames. map->GetChecksum(Level->md5); @@ -434,7 +434,7 @@ void P_SetupLevel(FLevelLocals *Level, int position, bool newGame) if (newGame) { - E_NewGame(EventHandlerType::PerMap); + eventManager.NewGame(EventHandlerType::PerMap); } MapLoader loader(Level); @@ -587,7 +587,7 @@ static void P_Shutdown () } P_FreeLevelData (); // [ZZ] delete global event handlers - E_Shutdown(false); + eventManager.Shutdown(false); ST_Clear(); for (auto &p : players) { diff --git a/src/p_spec.cpp b/src/p_spec.cpp index c6a3a8bf5..4ef7dd1d9 100644 --- a/src/p_spec.cpp +++ b/src/p_spec.cpp @@ -168,7 +168,7 @@ bool P_ActivateLine (line_t *line, AActor *mo, int side, int activationType, DVe // [MK] Use WorldLinePreActivated to decide if activation should continue bool shouldactivate = true; - E_WorldLinePreActivated(line, mo, activationType, &shouldactivate); + eventManager.WorldLinePreActivated(line, mo, activationType, &shouldactivate); if ( !shouldactivate ) return false; bool remote = (line->special != 7 && line->special != 8 && (line->special < 11 || line->special > 14)); @@ -180,7 +180,7 @@ bool P_ActivateLine (line_t *line, AActor *mo, int side, int activationType, DVe buttonSuccess = P_ExecuteSpecial(line->GetLevel(), line->special, line, mo, side == 1, line->args[0], line->args[1], line->args[2], line->args[3], line->args[4]); // [MK] Fire up WorldLineActivated - if ( buttonSuccess ) E_WorldLineActivated(line, mo, activationType); + if ( buttonSuccess ) eventManager.WorldLineActivated(line, mo, activationType); special = line->special; if (!repeat && buttonSuccess) diff --git a/src/p_tick.cpp b/src/p_tick.cpp index a2f4da510..a66751762 100644 --- a/src/p_tick.cpp +++ b/src/p_tick.cpp @@ -149,7 +149,7 @@ void P_Ticker (void) P_PlayerThink (&players[i]); // [ZZ] call the WorldTick hook - E_WorldTick(); + eventManager.WorldTick(); StatusBar->CallTick (); // [RH] moved this here for (auto Level : AllLevels()) { diff --git a/src/p_user.cpp b/src/p_user.cpp index 1535ff993..a3cbbc57e 100644 --- a/src/p_user.cpp +++ b/src/p_user.cpp @@ -654,7 +654,7 @@ bool player_t::Resurrect() // player is now alive. // fire E_PlayerRespawned and start the ACS SCRIPT_Respawn. - E_PlayerRespawned(pnum); + eventManager.PlayerRespawned(pnum); // mo->Level->Behaviors.StartTypedScripts(SCRIPT_Respawn, mo, true); return true; diff --git a/src/win32/i_input.cpp b/src/win32/i_input.cpp index e43c9c8bb..a2c96ec47 100644 --- a/src/win32/i_input.cpp +++ b/src/win32/i_input.cpp @@ -174,7 +174,7 @@ static void I_CheckGUICapture () } // [ZZ] check active event handlers that want the UI processing - if (!wantCapt && E_CheckUiProcessors()) + if (!wantCapt && eventManager.CheckUiProcessors()) wantCapt = true; if (wantCapt != GUICapture) diff --git a/src/win32/i_mouse.cpp b/src/win32/i_mouse.cpp index 749940824..baa3106b6 100644 --- a/src/win32/i_mouse.cpp +++ b/src/win32/i_mouse.cpp @@ -311,7 +311,7 @@ void I_CheckNativeMouse(bool preferNative) } } - if (!want_native && E_CheckRequireMouse()) + if (!want_native && eventManager.CheckRequireMouse()) want_native = true; //Printf ("%d %d %d\n", wantNative, preferNative, NativeMouse); From d005e0b4838d86722cd911ba77609b75bace52bb Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 2 Feb 2019 11:00:26 +0100 Subject: [PATCH 151/164] - changed the place where the CheckRequireMouse event gets called. The original place in I_CheckNativeMouse is unsafe because that function can get called from the system message queue which can result in a bad global state of the VM for such a call because it can be recursively invoked from code that may temporarily alter some settings. --- src/win32/i_input.cpp | 10 +++++++--- src/win32/i_input.h | 2 +- src/win32/i_mouse.cpp | 4 ++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/win32/i_input.cpp b/src/win32/i_input.cpp index a2c96ec47..901e61483 100644 --- a/src/win32/i_input.cpp +++ b/src/win32/i_input.cpp @@ -150,6 +150,9 @@ extern bool AppActive; int SessionState = 0; int BlockMouseMove; +static bool EventHandlerResultForNativeMouse; + + CVAR (Bool, i_soundinbackground, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR (Bool, k_allowfullscreentoggle, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) @@ -457,11 +460,11 @@ LRESULT CALLBACK WndProc (HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) return 0; case WM_KILLFOCUS: - I_CheckNativeMouse (true); // Make sure mouse gets released right away + I_CheckNativeMouse (true, false); // Make sure mouse gets released right away break; case WM_SETFOCUS: - I_CheckNativeMouse (false); + I_CheckNativeMouse (false, EventHandlerResultForNativeMouse); // This cannot call the event handler. Doing it from here is unsafe. break; case WM_SETCURSOR: @@ -778,7 +781,8 @@ void I_StartTic () BlockMouseMove--; ResetButtonTriggers (); I_CheckGUICapture (); - I_CheckNativeMouse (false); + EventHandlerResultForNativeMouse = eventManager.CheckRequireMouse(); + I_CheckNativeMouse (false, EventHandlerResultForNativeMouse); I_GetEvent (); } diff --git a/src/win32/i_input.h b/src/win32/i_input.h index 529ea83f5..00f853e9b 100644 --- a/src/win32/i_input.h +++ b/src/win32/i_input.h @@ -129,7 +129,7 @@ public: extern FJoystickCollection *JoyDevices[NUM_JOYDEVICES]; void I_StartupMouse(); -void I_CheckNativeMouse(bool prefer_native); +void I_CheckNativeMouse(bool prefer_native, bool eh); void I_StartupKeyboard(); void I_StartupXInput(); void I_StartupDirectInputJoystick(); diff --git a/src/win32/i_mouse.cpp b/src/win32/i_mouse.cpp index baa3106b6..9915479b7 100644 --- a/src/win32/i_mouse.cpp +++ b/src/win32/i_mouse.cpp @@ -284,7 +284,7 @@ static bool CaptureMode_InGame() // //========================================================================== -void I_CheckNativeMouse(bool preferNative) +void I_CheckNativeMouse(bool preferNative, bool eventhandlerresult) { bool windowed = (screen == NULL) || !screen->IsFullscreen(); bool want_native; @@ -311,7 +311,7 @@ void I_CheckNativeMouse(bool preferNative) } } - if (!want_native && eventManager.CheckRequireMouse()) + if (!want_native && eventhandlerresult) want_native = true; //Printf ("%d %d %d\n", wantNative, preferNative, NativeMouse); From 66eb4e5048ca3f673671930194346a2bb7375cdd Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 2 Feb 2019 16:43:11 +0100 Subject: [PATCH 152/164] - separation of static and map-local event handlers into separate lists. Having everything lumped together made this a maintenance hassle because it affected how the level has to be stored. This hasn't been tested yet, so it may not work as intended! --- src/b_game.cpp | 16 +- src/d_main.cpp | 6 +- src/d_net.cpp | 6 +- src/dobjgc.cpp | 4 +- src/events.cpp | 253 ++++++++++++++---------------- src/events.h | 35 +++-- src/fragglescript/t_func.cpp | 4 +- src/g_game.cpp | 6 +- src/g_level.cpp | 30 ++-- src/g_levellocals.h | 2 + src/g_shared/a_lightning.cpp | 2 +- src/g_statusbar/shared_sbar.cpp | 2 +- src/gamedata/info.cpp | 10 +- src/gamedata/info.h | 4 +- src/p_acs.cpp | 4 +- src/p_actionfunctions.cpp | 2 +- src/p_destructible.cpp | 4 +- src/p_enemy.cpp | 2 +- src/p_interaction.cpp | 8 +- src/p_map.cpp | 4 +- src/p_mobj.cpp | 14 +- src/p_saveg.cpp | 4 +- src/p_setup.cpp | 11 +- src/p_spec.cpp | 4 +- src/p_things.cpp | 4 +- src/p_tick.cpp | 25 ++- src/p_user.cpp | 3 +- src/scripting/vmthunks_actors.cpp | 8 +- src/win32/i_input.cpp | 5 +- 29 files changed, 240 insertions(+), 242 deletions(-) diff --git a/src/b_game.cpp b/src/b_game.cpp index db7c70436..cc362b764 100644 --- a/src/b_game.cpp +++ b/src/b_game.cpp @@ -404,27 +404,27 @@ void FCajunMaster::RemoveAllBots (FLevelLocals *Level, bool fromlist) for (i = 0; i < MAXPLAYERS; ++i) { - if (players[i].Bot != NULL) + if (Level->Players[i]->Bot != nullptr) { // If a player is looking through this bot's eyes, make him // look through his own eyes instead. for (j = 0; j < MAXPLAYERS; ++j) { - if (i != j && playeringame[j] && players[j].Bot == NULL) + if (i != j && Level->PlayerInGame(j) && Level->Players[j]->Bot == nullptr) { - if (players[j].camera == players[i].mo) + if (Level->Players[j]->camera == Level->Players[i]->mo) { - players[j].camera = players[j].mo; - if (j == consoleplayer) + Level->Players[j]->camera = Level->Players[j]->mo; + if (Level->isConsolePlayer(Level->Players[j]->mo)) { - StatusBar->AttachToPlayer (players + j); + StatusBar->AttachToPlayer (Level->Players[j]); } } } } // [ZZ] run event hook - eventManager.PlayerDisconnected(i); - Level->Behaviors.StartTypedScripts (SCRIPT_Disconnect, players[i].mo, true, i, true); + Level->localEventManager->PlayerDisconnected(i); + Level->Behaviors.StartTypedScripts (SCRIPT_Disconnect, Level->Players[i]->mo, true, i, true); ClearPlayer (i, !fromlist); } } diff --git a/src/d_main.cpp b/src/d_main.cpp index 13ebccc3f..a2c758e0b 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -273,7 +273,7 @@ void D_ProcessEvents (void) if (M_Responder (ev)) continue; // menu ate the event // check events - if (ev->type != EV_Mouse && eventManager.Responder(ev)) // [ZZ] ZScript ate the event // update 07.03.17: mouse events are handled directly + if (ev->type != EV_Mouse && primaryLevel->localEventManager->Responder(ev)) // [ZZ] ZScript ate the event // update 07.03.17: mouse events are handled directly continue; G_Responder (ev); } @@ -295,7 +295,7 @@ void D_PostEvent (const event_t *ev) return; } events[eventhead] = *ev; - if (ev->type == EV_Mouse && menuactive == MENU_Off && ConsoleState != c_down && ConsoleState != c_falling && !eventManager.Responder(ev) && !paused) + if (ev->type == EV_Mouse && menuactive == MENU_Off && ConsoleState != c_down && ConsoleState != c_falling && !primaryLevel->localEventManager->Responder(ev) && !paused) { if (Button_Mlook.bDown || freelook) { @@ -2730,7 +2730,7 @@ void D_DoomMain (void) { Level->Thinkers.DestroyThinkersInList(STAT_STATIC); } - eventManager.Shutdown(false); + staticEventManager.Shutdown(); P_FreeLevelData(); M_SaveDefaults(NULL); // save config before the restart diff --git a/src/d_net.cpp b/src/d_net.cpp index d7e173ca9..0d497bcbd 100644 --- a/src/d_net.cpp +++ b/src/d_net.cpp @@ -2561,7 +2561,7 @@ void Net_DoCommand (int type, uint8_t **stream, int player) if (cls != NULL) { killcount = primaryLevel->Massacre(false, cls->TypeName); - PClassActor *cls_rep = cls->GetReplacement(); + PClassActor *cls_rep = cls->GetReplacement(primaryLevel); if (cls != cls_rep) { killcount += primaryLevel->Massacre(false, cls_rep->TypeName); @@ -2583,7 +2583,7 @@ void Net_DoCommand (int type, uint8_t **stream, int player) if (cls != NULL && cls->IsDescendantOf(RUNTIME_CLASS(AActor))) { removecount = RemoveClass(primaryLevel, cls); - const PClass *cls_rep = cls->GetReplacement(); + const PClass *cls_rep = cls->GetReplacement(primaryLevel); if (cls != cls_rep) { removecount += RemoveClass(primaryLevel, cls_rep); @@ -2671,7 +2671,7 @@ void Net_DoCommand (int type, uint8_t **stream, int player) for (int i = 0; i < 3; i++) arg[i] = ReadLong(stream); bool manual = !!ReadByte(stream); - eventManager.Console(player, s, arg[0], arg[1], arg[2], manual); + primaryLevel->localEventManager->Console(player, s, arg[0], arg[1], arg[2], manual); } break; diff --git a/src/dobjgc.cpp b/src/dobjgc.cpp index 43bccb79c..bed2caa08 100644 --- a/src/dobjgc.cpp +++ b/src/dobjgc.cpp @@ -282,8 +282,8 @@ static void MarkRoot() Mark(StatusBar); M_MarkMenus(); Mark(DIntermissionController::CurrentIntermission); - Mark(eventManager.FirstEventHandler); - Mark(eventManager.LastEventHandler); + Mark(staticEventManager.FirstEventHandler); + Mark(staticEventManager.LastEventHandler); for (auto Level : AllLevels()) Level->Mark(); diff --git a/src/events.cpp b/src/events.cpp index 7f934e18e..80e8fc6c1 100755 --- a/src/events.cpp +++ b/src/events.cpp @@ -42,6 +42,7 @@ #include "g_game.h" #include "info.h" +EventManager staticEventManager; EventManager eventManager; @@ -53,6 +54,7 @@ bool EventManager::RegisterHandler(DStaticEventHandler* handler) return false; handler->OnRegister(); + handler->owner = this; // link into normal list // update: link at specific position based on order. @@ -66,11 +68,6 @@ bool EventManager::RegisterHandler(DStaticEventHandler* handler) } } - // 1. MyHandler2->1: - // eventManager.FirstEventHandler = MyHandler2, eventManager.LastEventHandler = MyHandler2 - // 2. MyHandler3->2: - // eventManager.FirstEventHandler = MyHandler2, eventManager.LastEventHandler = MyHandler3 - // (Yes, all those write barriers here are really needed!) if (before != nullptr) { @@ -186,58 +183,6 @@ bool EventManager::IsStaticType(PClass* type) return !type->IsDescendantOf(RUNTIME_CLASS(DEventHandler)); } -void EventManager::SerializeEvents(FSerializer& arc) -{ - // todo : stuff - if (arc.BeginArray("eventhandlers")) - { - int numlocalhandlers = 0; - TArray handlers; - if (arc.isReading()) - { - numlocalhandlers = arc.ArraySize(); - // delete all current local handlers, if any - for (DStaticEventHandler* lhandler = FirstEventHandler; lhandler; lhandler = lhandler->next) - if (!lhandler->IsStatic()) lhandler->Destroy(); - } - else - { - for (DStaticEventHandler* lhandler = FirstEventHandler; lhandler; lhandler = lhandler->next) - { - if (lhandler->IsStatic()) continue; - numlocalhandlers++; - handlers.Push(lhandler); - } - } - - for (int i = 0; i < numlocalhandlers; i++) - { - // serialize the object properly. - if (arc.isReading()) - { - // get object and put it into the array - DStaticEventHandler* lhandler; - arc(nullptr, lhandler); - if (lhandler != nullptr) - handlers.Push(lhandler); - } - else - { - ::Serialize(arc, nullptr, handlers[i], nullptr); - } - } - - if (arc.isReading()) - { - // add all newly deserialized handlers into the list - for (int i = 0; i < numlocalhandlers; i++) - RegisterHandler(handlers[i]); - } - - arc.EndArray(); - } -} - static PClass* GetHandlerClass(const FString& typeName) { PClass* type = PClass::FindClass(typeName); @@ -279,7 +224,7 @@ void EventManager::InitStaticHandlers(bool map) return; // just make sure - Shutdown(map); + Shutdown(); // initialize event handlers from gameinfo for (const FString& typeName : gameinfo.EventHandlers) @@ -305,22 +250,23 @@ void EventManager::InitStaticHandlers(bool map) } } -void EventManager::Shutdown(bool map) +void EventManager::Shutdown() { // delete handlers. for (DStaticEventHandler* handler = LastEventHandler; handler; handler = handler->prev) { - if (handler->IsStatic() == !map) - handler->Destroy(); + handler->Destroy(); } } -#define DEFINE_EVENT_LOOPER(name) void EventManager::##name() \ +#define DEFINE_EVENT_LOOPER(name, play) void EventManager::##name() \ { \ + if (ShouldCallStatic(play)) staticEventManager.name(); \ for (DStaticEventHandler* handler = FirstEventHandler; handler; handler = handler->next) \ handler->name(); \ } + // note for the functions below. // *Unsafe is executed on EVERY map load/close, including savegame loading, etc. // There is no point in allowing non-static handlers to receive unsafe event separately, as there is no point in having static handlers receive safe event. @@ -329,7 +275,6 @@ void EventManager::WorldLoaded() { for (DStaticEventHandler* handler = FirstEventHandler; handler; handler = handler->next) { - if (handler->IsStatic()) continue; if (savegamerestore) continue; // don't execute WorldLoaded for handlers loaded from the savegame. handler->WorldLoaded(); } @@ -337,29 +282,15 @@ void EventManager::WorldLoaded() void EventManager::WorldUnloaded() { - for (DStaticEventHandler* handler = eventManager.LastEventHandler; handler; handler = handler->prev) + for (DStaticEventHandler* handler = LastEventHandler; handler; handler = handler->prev) { - if (handler->IsStatic()) continue; handler->WorldUnloaded(); } } -void EventManager::WorldLoadedUnsafe() +bool EventManager::ShouldCallStatic(bool forplay) { - for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) - { - if (!handler->IsStatic()) continue; - handler->WorldLoaded(); - } -} - -void EventManager::WorldUnloadedUnsafe() -{ - for (DStaticEventHandler* handler = eventManager.LastEventHandler; handler; handler = handler->prev) - { - if (!handler->IsStatic()) continue; - handler->WorldUnloaded(); - } + return this != &staticEventManager && Level == primaryLevel; } void EventManager::WorldThingSpawned(AActor* actor) @@ -367,7 +298,10 @@ void EventManager::WorldThingSpawned(AActor* actor) // don't call anything if actor was destroyed on PostBeginPlay/BeginPlay/whatever. if (actor->ObjectFlags & OF_EuthanizeMe) return; - for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) + + if (ShouldCallStatic(true)) staticEventManager.WorldThingSpawned(actor); + + for (DStaticEventHandler* handler = FirstEventHandler; handler; handler = handler->next) handler->WorldThingSpawned(actor); } @@ -376,7 +310,10 @@ void EventManager::WorldThingDied(AActor* actor, AActor* inflictor) // don't call anything if actor was destroyed on PostBeginPlay/BeginPlay/whatever. if (actor->ObjectFlags & OF_EuthanizeMe) return; - for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) + + if (ShouldCallStatic(true)) staticEventManager.WorldThingDied(actor, inflictor); + + for (DStaticEventHandler* handler = FirstEventHandler; handler; handler = handler->next) handler->WorldThingDied(actor, inflictor); } @@ -385,7 +322,10 @@ void EventManager::WorldThingRevived(AActor* actor) // don't call anything if actor was destroyed on PostBeginPlay/BeginPlay/whatever. if (actor->ObjectFlags & OF_EuthanizeMe) return; - for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) + + if (ShouldCallStatic(true)) staticEventManager.WorldThingRevived(actor); + + for (DStaticEventHandler* handler = FirstEventHandler; handler; handler = handler->next) handler->WorldThingRevived(actor); } @@ -394,7 +334,10 @@ void EventManager::WorldThingDamaged(AActor* actor, AActor* inflictor, AActor* s // don't call anything if actor was destroyed on PostBeginPlay/BeginPlay/whatever. if (actor->ObjectFlags & OF_EuthanizeMe) return; - for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) + + if (ShouldCallStatic(true)) staticEventManager.WorldThingDamaged(actor, inflictor, source, damage, mod, flags, angle); + + for (DStaticEventHandler* handler = FirstEventHandler; handler; handler = handler->next) handler->WorldThingDamaged(actor, inflictor, source, damage, mod, flags, angle); } @@ -407,32 +350,43 @@ void EventManager::WorldThingDestroyed(AActor* actor) // this is because Destroyed should be reverse of Spawned. we don't want to catch random inventory give failures. if (!(actor->ObjectFlags & OF_Spawned)) return; - for (DStaticEventHandler* handler = eventManager.LastEventHandler; handler; handler = handler->prev) + + for (DStaticEventHandler* handler = LastEventHandler; handler; handler = handler->prev) handler->WorldThingDestroyed(actor); + + if (ShouldCallStatic(true)) staticEventManager.WorldThingDestroyed(actor); } void EventManager::WorldLinePreActivated(line_t* line, AActor* actor, int activationType, bool* shouldactivate) { - for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) + if (ShouldCallStatic(true)) staticEventManager.WorldLinePreActivated(line, actor, activationType, shouldactivate); + + for (DStaticEventHandler* handler = FirstEventHandler; handler; handler = handler->next) handler->WorldLinePreActivated(line, actor, activationType, shouldactivate); } void EventManager::WorldLineActivated(line_t* line, AActor* actor, int activationType) { - for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) + if (ShouldCallStatic(true)) staticEventManager.WorldLineActivated(line, actor, activationType); + + for (DStaticEventHandler* handler = FirstEventHandler; handler; handler = handler->next) handler->WorldLineActivated(line, actor, activationType); } int EventManager::WorldSectorDamaged(sector_t* sector, AActor* source, int damage, FName damagetype, int part, DVector3 position, bool isradius) { - for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) + if (ShouldCallStatic(true)) staticEventManager.WorldSectorDamaged(sector, source, damage, damagetype, part, position, isradius); + + for (DStaticEventHandler* handler = FirstEventHandler; handler; handler = handler->next) damage = handler->WorldSectorDamaged(sector, source, damage, damagetype, part, position, isradius); return damage; } int EventManager::WorldLineDamaged(line_t* line, AActor* source, int damage, FName damagetype, int side, DVector3 position, bool isradius) { - for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) + if (ShouldCallStatic(true)) staticEventManager.WorldLineDamaged(line, source, damage, damagetype, side, position, isradius); + + for (DStaticEventHandler* handler = FirstEventHandler; handler; handler = handler->next) damage = handler->WorldLineDamaged(line, source, damage, damagetype, side, position, isradius); return damage; } @@ -444,26 +398,34 @@ void EventManager::PlayerEntered(int num, bool fromhub) if (savegamerestore && !fromhub) return; - for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) + if (ShouldCallStatic(true)) staticEventManager.PlayerEntered(num, fromhub); + + for (DStaticEventHandler* handler = FirstEventHandler; handler; handler = handler->next) handler->PlayerEntered(num, fromhub); } void EventManager::PlayerRespawned(int num) { - for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) + if (ShouldCallStatic(true)) staticEventManager.PlayerRespawned(num); + + for (DStaticEventHandler* handler = FirstEventHandler; handler; handler = handler->next) handler->PlayerRespawned(num); } void EventManager::PlayerDied(int num) { - for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) + if (ShouldCallStatic(true)) staticEventManager.PlayerDied(num); + + for (DStaticEventHandler* handler = FirstEventHandler; handler; handler = handler->next) handler->PlayerDied(num); } void EventManager::PlayerDisconnected(int num) { - for (DStaticEventHandler* handler = eventManager.LastEventHandler; handler; handler = handler->prev) + for (DStaticEventHandler* handler = LastEventHandler; handler; handler = handler->prev) handler->PlayerDisconnected(num); + + if (ShouldCallStatic(true)) staticEventManager.PlayerDisconnected(num); } bool EventManager::Responder(const event_t* ev) @@ -473,7 +435,7 @@ bool EventManager::Responder(const event_t* ev) if (ev->type == EV_GUI_Event) { // iterate handlers back to front by order, and give them this event. - for (DStaticEventHandler* handler = eventManager.LastEventHandler; handler; handler = handler->prev) + for (DStaticEventHandler* handler = LastEventHandler; handler; handler = handler->prev) { if (handler->IsUiProcessor) { @@ -486,7 +448,7 @@ bool EventManager::Responder(const event_t* ev) else { // not sure if we want to handle device changes, but whatevs. - for (DStaticEventHandler* handler = eventManager.LastEventHandler; handler; handler = handler->prev) + for (DStaticEventHandler* handler = LastEventHandler; handler; handler = handler->prev) { if (handler->IsUiProcessor) uiProcessorsFound = true; @@ -494,25 +456,35 @@ bool EventManager::Responder(const event_t* ev) return true; // event was processed } } + if (ShouldCallStatic(false)) uiProcessorsFound = staticEventManager.Responder(ev); return (uiProcessorsFound && (ev->type == EV_Mouse)); // mouse events are eaten by the event system if there are any uiprocessors. } void EventManager::Console(int player, FString name, int arg1, int arg2, int arg3, bool manual) { - for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) + if (ShouldCallStatic(false)) staticEventManager.Console(player, name, arg1, arg2, arg3, manual); + + for (DStaticEventHandler* handler = FirstEventHandler; handler; handler = handler->next) handler->ConsoleProcess(player, name, arg1, arg2, arg3, manual); } void EventManager::RenderOverlay(EHudState state) { - for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) + if (ShouldCallStatic(false)) staticEventManager.RenderOverlay(state); + + for (DStaticEventHandler* handler = FirstEventHandler; handler; handler = handler->next) handler->RenderOverlay(state); } bool EventManager::CheckUiProcessors() { - for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) + if (ShouldCallStatic(false)) + { + if (staticEventManager.CheckUiProcessors()) return true; + } + + for (DStaticEventHandler* handler = FirstEventHandler; handler; handler = handler->next) if (handler->IsUiProcessor) return true; @@ -521,7 +493,12 @@ bool EventManager::CheckUiProcessors() bool EventManager::CheckRequireMouse() { - for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) + if (ShouldCallStatic(false)) + { + if (staticEventManager.CheckRequireMouse()) return true; + } + + for (DStaticEventHandler* handler = FirstEventHandler; handler; handler = handler->next) if (handler->IsUiProcessor && handler->RequireMouse) return true; @@ -531,7 +508,11 @@ bool EventManager::CheckRequireMouse() bool EventManager::CheckReplacement( PClassActor *replacee, PClassActor **replacement ) { bool final = false; - for (DStaticEventHandler *handler = eventManager.FirstEventHandler; handler; handler = handler->next) + + // This is play scope but unlike in-game events needs to be handled like UI by static handlers. + if (ShouldCallStatic(false)) final = staticEventManager.CheckReplacement(replacee, replacement); + + for (DStaticEventHandler *handler = FirstEventHandler; handler; handler = handler->next) handler->CheckReplacement(replacee,replacement,&final); return final; } @@ -539,32 +520,28 @@ bool EventManager::CheckReplacement( PClassActor *replacee, PClassActor **replac bool EventManager::CheckReplacee(PClassActor **replacee, PClassActor *replacement) { bool final = false; - for (DStaticEventHandler *handler = eventManager.FirstEventHandler; handler; handler = handler->next) + if (ShouldCallStatic(false)) final = staticEventManager.CheckReplacee(replacee, replacement); + + for (DStaticEventHandler *handler = FirstEventHandler; handler; handler = handler->next) handler->CheckReplacee(replacee, replacement, &final); return final; } -void EventManager::NewGame(EventHandlerType handlerType) +void EventManager::NewGame() { - bool isStatic = handlerType == EventHandlerType::Global; - - // Shut down all per-map event handlers before static NewGame events. - if (isStatic) - EventManager::Shutdown(true); - - for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) + //This is called separately for static and local handlers, so no forwarding here. + for (DStaticEventHandler* handler = FirstEventHandler; handler; handler = handler->next) { - if (handler->IsStatic() == isStatic) - handler->NewGame(); + handler->NewGame(); } } // normal event loopers (non-special, argument-less) -DEFINE_EVENT_LOOPER(RenderFrame) -DEFINE_EVENT_LOOPER(WorldLightning) -DEFINE_EVENT_LOOPER(WorldTick) -DEFINE_EVENT_LOOPER(UiTick) -DEFINE_EVENT_LOOPER(PostUiTick) +DEFINE_EVENT_LOOPER(RenderFrame, false) +DEFINE_EVENT_LOOPER(WorldLightning, true) +DEFINE_EVENT_LOOPER(WorldTick, true) +DEFINE_EVENT_LOOPER(UiTick, false) +DEFINE_EVENT_LOOPER(PostUiTick, false) // declarations IMPLEMENT_CLASS(DStaticEventHandler, false, true); @@ -644,8 +621,10 @@ DEFINE_ACTION_FUNCTION(DStaticEventHandler, SetOrder) PARAM_SELF_PROLOGUE(DStaticEventHandler); PARAM_INT(order); + /* not really needed - this is never checked again. To re-add, the handlers need a pointer to their manager but that's not worth it just for this check. if (eventManager.CheckHandler(self)) return 0; + */ self->Order = order; return 0; @@ -660,14 +639,14 @@ DEFINE_ACTION_FUNCTION(DEventHandler, SendNetworkEvent) PARAM_INT(arg3); // - ACTION_RETURN_BOOL(eventManager.SendNetworkEvent(name, arg1, arg2, arg3, false)); + ACTION_RETURN_BOOL(currentVMLevel->localEventManager->SendNetworkEvent(name, arg1, arg2, arg3, false)); } DEFINE_ACTION_FUNCTION(DEventHandler, Find) { PARAM_PROLOGUE; PARAM_CLASS(t, DStaticEventHandler); - for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) + for (DStaticEventHandler* handler = currentVMLevel->localEventManager->FirstEventHandler; handler; handler = handler->next) if (handler->GetClass() == t) // check precise class ACTION_RETURN_OBJECT(handler); ACTION_RETURN_OBJECT(nullptr); @@ -678,7 +657,7 @@ DEFINE_ACTION_FUNCTION(DStaticEventHandler, Find) { PARAM_PROLOGUE; PARAM_CLASS(t, DStaticEventHandler); - for (DStaticEventHandler* handler = eventManager.FirstEventHandler; handler; handler = handler->next) + for (DStaticEventHandler* handler = staticEventManager.FirstEventHandler; handler; handler = handler->next) if (handler->GetClass() == t) // check precise class ACTION_RETURN_OBJECT(handler); ACTION_RETURN_OBJECT(nullptr); @@ -730,7 +709,7 @@ FWorldEvent EventManager::SetupWorldEvent() { FWorldEvent e; e.IsSaveGame = savegamerestore; - e.IsReopen = level.FromSnapshot && !savegamerestore; // each one by itself isnt helpful, but with hub load we have savegamerestore==0 and level.FromSnapshot==1. + e.IsReopen = Level->FromSnapshot && !savegamerestore; // each one by itself isnt helpful, but with hub load we have savegamerestore==0 and level.FromSnapshot==1. e.DamageAngle = 0.0; return e; } @@ -741,7 +720,7 @@ void DStaticEventHandler::WorldLoaded() { // don't create excessive DObjects if not going to be processed anyway if (isEmpty(func)) return; - FWorldEvent e = eventManager.SetupWorldEvent(); + FWorldEvent e = owner->SetupWorldEvent(); VMValue params[2] = { (DStaticEventHandler*)this, &e }; VMCall(func, params, 2, nullptr, 0); } @@ -753,7 +732,7 @@ void DStaticEventHandler::WorldUnloaded() { // don't create excessive DObjects if not going to be processed anyway if (isEmpty(func)) return; - FWorldEvent e = eventManager.SetupWorldEvent(); + FWorldEvent e = owner->SetupWorldEvent(); VMValue params[2] = { (DStaticEventHandler*)this, &e }; VMCall(func, params, 2, nullptr, 0); } @@ -765,7 +744,7 @@ void DStaticEventHandler::WorldThingSpawned(AActor* actor) { // don't create excessive DObjects if not going to be processed anyway if (isEmpty(func)) return; - FWorldEvent e = eventManager.SetupWorldEvent(); + FWorldEvent e = owner->SetupWorldEvent(); e.Thing = actor; VMValue params[2] = { (DStaticEventHandler*)this, &e }; VMCall(func, params, 2, nullptr, 0); @@ -778,7 +757,7 @@ void DStaticEventHandler::WorldThingDied(AActor* actor, AActor* inflictor) { // don't create excessive DObjects if not going to be processed anyway if (isEmpty(func)) return; - FWorldEvent e = eventManager.SetupWorldEvent(); + FWorldEvent e = owner->SetupWorldEvent(); e.Thing = actor; e.Inflictor = inflictor; VMValue params[2] = { (DStaticEventHandler*)this, &e }; @@ -792,7 +771,7 @@ void DStaticEventHandler::WorldThingRevived(AActor* actor) { // don't create excessive DObjects if not going to be processed anyway if (isEmpty(func)) return; - FWorldEvent e = eventManager.SetupWorldEvent(); + FWorldEvent e = owner->SetupWorldEvent(); e.Thing = actor; VMValue params[2] = { (DStaticEventHandler*)this, &e }; VMCall(func, params, 2, nullptr, 0); @@ -805,7 +784,7 @@ void DStaticEventHandler::WorldThingDamaged(AActor* actor, AActor* inflictor, AA { // don't create excessive DObjects if not going to be processed anyway if (isEmpty(func)) return; - FWorldEvent e = eventManager.SetupWorldEvent(); + FWorldEvent e = owner->SetupWorldEvent(); e.Thing = actor; e.Inflictor = inflictor; e.Damage = damage; @@ -824,7 +803,7 @@ void DStaticEventHandler::WorldThingDestroyed(AActor* actor) { // don't create excessive DObjects if not going to be processed anyway if (isEmpty(func)) return; - FWorldEvent e = eventManager.SetupWorldEvent(); + FWorldEvent e = owner->SetupWorldEvent(); e.Thing = actor; VMValue params[2] = { (DStaticEventHandler*)this, &e }; VMCall(func, params, 2, nullptr, 0); @@ -837,7 +816,7 @@ void DStaticEventHandler::WorldLinePreActivated(line_t* line, AActor* actor, int { // don't create excessive DObjects if not going to be processed anyway if (isEmpty(func)) return; - FWorldEvent e = eventManager.SetupWorldEvent(); + FWorldEvent e = owner->SetupWorldEvent(); e.Thing = actor; e.ActivatedLine = line; e.ActivationType = activationType; @@ -854,7 +833,7 @@ void DStaticEventHandler::WorldLineActivated(line_t* line, AActor* actor, int ac { // don't create excessive DObjects if not going to be processed anyway if (isEmpty(func)) return; - FWorldEvent e = eventManager.SetupWorldEvent(); + FWorldEvent e = owner->SetupWorldEvent(); e.Thing = actor; e.ActivatedLine = line; e.ActivationType = activationType; @@ -869,7 +848,7 @@ int DStaticEventHandler::WorldSectorDamaged(sector_t* sector, AActor* source, in { // don't create excessive DObjects if not going to be processed anyway if (isEmpty(func)) return damage; - FWorldEvent e = eventManager.SetupWorldEvent(); + FWorldEvent e = owner->SetupWorldEvent(); e.DamageSource = source; e.DamageSector = sector; e.NewDamage = e.Damage = damage; @@ -892,7 +871,7 @@ int DStaticEventHandler::WorldLineDamaged(line_t* line, AActor* source, int dama { // don't create excessive DObjects if not going to be processed anyway if (isEmpty(func)) return damage; - FWorldEvent e = eventManager.SetupWorldEvent(); + FWorldEvent e = owner->SetupWorldEvent(); e.DamageSource = source; e.DamageLine = line; e.NewDamage = e.Damage = damage; @@ -915,7 +894,7 @@ void DStaticEventHandler::WorldLightning() { // don't create excessive DObjects if not going to be processed anyway if (isEmpty(func)) return; - FWorldEvent e = eventManager.SetupWorldEvent(); + FWorldEvent e = owner->SetupWorldEvent(); VMValue params[2] = { (DStaticEventHandler*)this, &e }; VMCall(func, params, 2, nullptr, 0); } @@ -952,7 +931,7 @@ void DStaticEventHandler::RenderFrame() { // don't create excessive DObjects if not going to be processed anyway if (isEmpty(func)) return; - FRenderEvent e = eventManager.SetupRenderEvent(); + FRenderEvent e = owner->SetupRenderEvent; VMValue params[2] = { (DStaticEventHandler*)this, &e }; VMCall(func, params, 2, nullptr, 0); } @@ -965,7 +944,7 @@ void DStaticEventHandler::RenderOverlay(EHudState state) { // don't create excessive DObjects if not going to be processed anyway if (isEmpty(func)) return; - FRenderEvent e = eventManager.SetupRenderEvent(); + FRenderEvent e = owner->SetupRenderEvent(); e.HudState = int(state); VMValue params[2] = { (DStaticEventHandler*)this, &e }; VMCall(func, params, 2, nullptr, 0); @@ -1190,7 +1169,7 @@ void DStaticEventHandler::ConsoleProcess(int player, FString name, int arg1, int } } -void DStaticEventHandler::CheckReplacement( PClassActor *replacee, PClassActor **replacement, bool *final ) +void DStaticEventHandler::CheckReplacement(PClassActor *replacee, PClassActor **replacement, bool *final ) { IFVIRTUAL(DStaticEventHandler, CheckReplacement) { @@ -1255,7 +1234,7 @@ CCMD(event) for (int i = 0; i < argn; i++) arg[i] = atoi(argv[2 + i]); // call locally - eventManager.Console(-1, argv[1], arg[0], arg[1], arg[2], true); + primaryLevel->localEventManager->Console(-1, argv[1], arg[0], arg[1], arg[2], true); } } @@ -1280,6 +1259,6 @@ CCMD(netevent) for (int i = 0; i < argn; i++) arg[i] = atoi(argv[2 + i]); // call networked - eventManager.SendNetworkEvent(argv[1], arg[0], arg[1], arg[2], true); + primaryLevel->localEventManager->SendNetworkEvent(argv[1], arg[0], arg[1], arg[2], true); } } diff --git a/src/events.h b/src/events.h index 7a15e7f44..b207f924b 100755 --- a/src/events.h +++ b/src/events.h @@ -1,5 +1,4 @@ -#ifndef EVENTS_H -#define EVENTS_H +#pragma once #include "dobject.h" #include "serializer.h" @@ -8,6 +7,7 @@ #include "sbar.h" class DStaticEventHandler; +struct EventManager; enum class EventHandlerType { @@ -34,6 +34,7 @@ public: IsUiProcessor = false; } + EventManager *owner; DStaticEventHandler* prev; DStaticEventHandler* next; virtual bool IsStatic() { return true; } @@ -58,6 +59,8 @@ public: } */ + arc("next", next); + arc("prev", prev); arc("Order", Order); arc("IsUiProcessor", IsUiProcessor); arc("RequireMouse", RequireMouse); @@ -228,9 +231,15 @@ struct FReplacedEvent struct EventManager { + FLevelLocals *Level = nullptr; DStaticEventHandler* FirstEventHandler = nullptr; DStaticEventHandler* LastEventHandler = nullptr; + EventManager() = default; + EventManager(FLevelLocals *l) { Level = l; } + ~EventManager() { Shutdown(); } + bool ShouldCallStatic(bool forplay); + // register bool RegisterHandler(DStaticEventHandler* handler); // unregister @@ -242,16 +251,12 @@ struct EventManager // init static handlers void InitStaticHandlers(bool map); // shutdown handlers - void Shutdown(bool map); + void Shutdown(); // called right after the map has loaded (approximately same time as OPEN ACS scripts) void WorldLoaded(); // called when the map is about to unload (approximately same time as UNLOADING ACS scripts) void WorldUnloaded(); - // called right after the map has loaded (every time, UNSAFE VERSION) - void WorldLoadedUnsafe(); - // called right before the map is unloaded (every time, UNSAFE VERSION) - void WorldUnloadedUnsafe(); // called around PostBeginPlay of each actor. void WorldThingSpawned(AActor* actor); // called after AActor::Die of each actor. @@ -301,7 +306,7 @@ struct EventManager bool CheckReplacee(PClassActor** replacee, PClassActor* replacement); // called on new game - void NewGame(EventHandlerType handlerType); + void NewGame(); // send networked event. unified function. bool SendNetworkEvent(FString name, int arg1, int arg2, int arg3, bool manual); @@ -311,15 +316,19 @@ struct EventManager // check if we need native mouse due to UiProcessors bool CheckRequireMouse(); - // serialization stuff - void SerializeEvents(FSerializer& arc); - void InitHandler(PClass* type); FWorldEvent SetupWorldEvent(); FRenderEvent SetupRenderEvent(); + void SetOwnerForHandlers() + { + for (DStaticEventHandler* existinghandler = FirstEventHandler; existinghandler; existinghandler = existinghandler->next) + { + existinghandler->owner = this; + } + } + }; extern EventManager eventManager; - -#endif +extern EventManager staticEventManager; diff --git a/src/fragglescript/t_func.cpp b/src/fragglescript/t_func.cpp index 0af15a09a..9efabd6b1 100644 --- a/src/fragglescript/t_func.cpp +++ b/src/fragglescript/t_func.cpp @@ -3615,7 +3615,7 @@ void FParser::SF_ThingCount(void) pClass=T_GetMobjType(t_argv[0]); if (!pClass) return; // If we want to count map items we must consider actor replacement - pClass = pClass->GetReplacement(); + pClass = pClass->GetReplacement(Level); again: auto it = Level->GetThinkerIterator(); @@ -3644,7 +3644,7 @@ void FParser::SF_ThingCount(void) { // Again, with decorate replacements replacemented = true; - PClassActor *newkind = pClass->GetReplacement(); + PClassActor *newkind = pClass->GetReplacement(Level); if (newkind != pClass) { pClass = newkind; diff --git a/src/g_game.cpp b/src/g_game.cpp index b1cb497b1..d389dc530 100644 --- a/src/g_game.cpp +++ b/src/g_game.cpp @@ -1173,7 +1173,7 @@ void G_Ticker () } // [ZZ] also tick the UI part of the events - eventManager.UiTick(); + primaryLevel->localEventManager->UiTick(); C_RunDelayedCommands(); // do main actions @@ -1213,7 +1213,7 @@ void G_Ticker () } // [MK] Additional ticker for UI events right after all others - eventManager.PostUiTick(); + primaryLevel->localEventManager->PostUiTick(); } @@ -1697,7 +1697,7 @@ void G_DoPlayerPop(int playernum) auto mo = players[playernum].mo; mo->Level->Behaviors.StopMyScripts(mo); // [ZZ] fire player disconnect hook - eventManager.PlayerDisconnected(playernum); + mo->Level->localEventManager->PlayerDisconnected(playernum); // [RH] Let the scripts know the player left mo->Level->Behaviors.StartTypedScripts(SCRIPT_Disconnect, mo, true, playernum, true); if (mo != NULL) diff --git a/src/g_level.cpp b/src/g_level.cpp index f83dcd02e..9f15c55d8 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -454,7 +454,7 @@ void G_InitNew (const char *mapname, bool bTitleLevel) // did we have any level before? if (primaryLevel->info != nullptr) - eventManager.WorldUnloadedUnsafe(); + staticEventManager.WorldUnloaded(); if (!savegamerestore) { @@ -663,9 +663,13 @@ void FLevelLocals::ChangeLevel(const char *levelname, int position, int flags, i unloading = true; Behaviors.StartTypedScripts (SCRIPT_Unloading, NULL, false, 0, true); // [ZZ] safe world unload - eventManager.WorldUnloaded(); + for (auto Level : AllLevels()) + { + // Todo: This must be exolicitly sandboxed! + Level->localEventManager->WorldUnloaded(); + } // [ZZ] unsafe world unload (changemap != map) - eventManager.WorldUnloadedUnsafe(); + staticEventManager.WorldUnloaded(); unloading = false; STAT_ChangeLevel(nextlevel, this); @@ -1019,13 +1023,16 @@ void FLevelLocals::DoLoadLevel(const FString &nextmapname, int position, bool au if (flags2 & LEVEL2_FORCETEAMPLAYOFF) teamplay = false; - FString mapname = nextmapname; - mapname.ToLower(); - Printf ( + if (isPrimaryLevel()) + { + FString mapname = nextmapname; + mapname.ToLower(); + Printf( "\n\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36" "\36\36\36\36\36\36\36\36\36\36\36\36\37\n\n" TEXTCOLOR_BOLD "%s - %s\n\n", mapname.GetChars(), LevelName.GetChars()); + } // Set the sky map. // First thing, we have a dummy sky texture name, @@ -1063,7 +1070,7 @@ void FLevelLocals::DoLoadLevel(const FString &nextmapname, int position, bool au if (newGame) { - eventManager.NewGame(EventHandlerType::Global); + staticEventManager.NewGame(); } P_SetupLevel (this, position, newGame); @@ -1118,7 +1125,7 @@ void FLevelLocals::DoLoadLevel(const FString &nextmapname, int position, bool au } const bool fromSnapshot = FromSnapshot; - eventManager.PlayerEntered(ii, fromSnapshot && finishstate == FINISH_SameHub); + localEventManager->PlayerEntered(ii, fromSnapshot && finishstate == FINISH_SameHub); if (fromSnapshot) { @@ -1136,9 +1143,9 @@ void FLevelLocals::DoLoadLevel(const FString &nextmapname, int position, bool au StatusBar->AttachToPlayer (&players[consoleplayer]); // unsafe world load - eventManager.WorldLoadedUnsafe(); + staticEventManager.WorldLoaded(); // regular world load (savegames are handled internally) - eventManager.WorldLoaded(); + localEventManager->WorldLoaded(); DoDeferedScripts (); // [RH] Do script actions that were triggered on another map. @@ -1484,6 +1491,7 @@ void FLevelLocals::Init() P_InitParticles(this); P_ClearParticles(this); BaseBlendA = 0.0f; // Remove underwater blend effect, if any + localEventManager = new EventManager; gravity = sv_gravity * 35/TICRATE; aircontrol = sv_aircontrol; @@ -2121,6 +2129,8 @@ void FLevelLocals::Mark() GC::Mark(BotInfo.firstthing); GC::Mark(BotInfo.body1); GC::Mark(BotInfo.body2); + GC::Mark(localEventManager->FirstEventHandler); + GC::Mark(localEventManager->LastEventHandler); Thinkers.MarkRoots(); canvasTextureInfo.Mark(); for (auto &c : CorpseQueue) diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 0b854a797..7594fb19a 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -96,6 +96,7 @@ class DAutomapBase; struct wbstartstruct_t; class DSectorMarker; struct FTranslator; +struct EventManager; typedef TMap FDialogueIDMap; // maps dialogue IDs to dialogue array index (for ACS) typedef TMap FDialogueMap; // maps actor class names to dialogue array index @@ -442,6 +443,7 @@ public: TArray linePortalSpans; FSectionContainer sections; FCanvasTextureInfo canvasTextureInfo; + EventManager *localEventManager = nullptr; // [ZZ] Destructible geometry information TMap healthGroups; diff --git a/src/g_shared/a_lightning.cpp b/src/g_shared/a_lightning.cpp index 8ef204632..7c27218ec 100644 --- a/src/g_shared/a_lightning.cpp +++ b/src/g_shared/a_lightning.cpp @@ -178,7 +178,7 @@ void DLightningThinker::LightningFlash () Level->flags |= LEVEL_SWAPSKIES; // set alternate sky S_Sound (CHAN_AUTO, "world/thunder", 1.0, ATTN_NONE); // [ZZ] just in case - eventManager.WorldLightning(); + Level->localEventManager->WorldLightning(); // start LIGHTNING scripts Level->Behaviors.StartTypedScripts (SCRIPT_Lightning, NULL, false); // [RH] Run lightning scripts diff --git a/src/g_statusbar/shared_sbar.cpp b/src/g_statusbar/shared_sbar.cpp index 093ae19fa..384a970d6 100644 --- a/src/g_statusbar/shared_sbar.cpp +++ b/src/g_statusbar/shared_sbar.cpp @@ -1147,7 +1147,7 @@ void DBaseStatusBar::DrawTopStuff (EHudState state) DrawMessages (HUDMSGLayer_OverMap, (state == HUD_StatusBar) ? GetTopOfStatusbar() : SCREENHEIGHT); } DrawMessages (HUDMSGLayer_OverHUD, (state == HUD_StatusBar) ? GetTopOfStatusbar() : SCREENHEIGHT); - eventManager.RenderOverlay(state); + primaryLevel->localEventManager->RenderOverlay(state); DrawConsistancy (); DrawWaiting (); diff --git a/src/gamedata/info.cpp b/src/gamedata/info.cpp index fe3f259d2..1086200b2 100644 --- a/src/gamedata/info.cpp +++ b/src/gamedata/info.cpp @@ -395,7 +395,7 @@ void PClassActor::StaticInit() InitBotStuff(); // reinit GLOBAL static stuff from gameinfo, once classes are loaded. - eventManager.InitStaticHandlers(false); + staticEventManager.InitStaticHandlers(false); } //========================================================================== @@ -517,7 +517,7 @@ void PClassActor::RegisterIDs() // //========================================================================== -PClassActor *PClassActor::GetReplacement(bool lookskill) +PClassActor *PClassActor::GetReplacement(FLevelLocals *Level, bool lookskill) { FName skillrepname = NAME_None; @@ -538,7 +538,7 @@ PClassActor *PClassActor::GetReplacement(bool lookskill) } // [MK] ZScript replacement through Event Handlers, has priority over others PClassActor *Replacement = ActorInfo()->Replacement; - if (eventManager.CheckReplacement(this,&Replacement) ) + if (Level->localEventManager->CheckReplacement(this,&Replacement) ) { // [MK] the replacement is final, so don't continue with the chain return Replacement ? Replacement : this; @@ -573,7 +573,7 @@ PClassActor *PClassActor::GetReplacement(bool lookskill) // //========================================================================== -PClassActor *PClassActor::GetReplacee(bool lookskill) +PClassActor *PClassActor::GetReplacee(FLevelLocals *Level, bool lookskill) { FName skillrepname = NAME_None; @@ -598,7 +598,7 @@ PClassActor *PClassActor::GetReplacee(bool lookskill) // showing up, one can assign an Arachnotron as the one being replaced // so functions like CheckReplacee and A_BossDeath can actually work, given // modders set it up that way. - if (eventManager.CheckReplacee(&savedrep, this)) + if (Level->localEventManager->CheckReplacee(&savedrep, this)) { // [MK] the replacement is final, so don't continue with the chain return savedrep ? savedrep : this; diff --git a/src/gamedata/info.h b/src/gamedata/info.h index 184313a0e..df294ec78 100644 --- a/src/gamedata/info.h +++ b/src/gamedata/info.h @@ -350,8 +350,8 @@ public: return i != nullptr && state >= i->OwnedStates && state < i->OwnedStates + i->NumOwnedStates; } - PClassActor *GetReplacement(bool lookskill=true); - PClassActor *GetReplacee(bool lookskill=true); + PClassActor *GetReplacement(FLevelLocals *Level, bool lookskill=true); + PClassActor *GetReplacee(FLevelLocals *Level, bool lookskill=true); // For those times when being able to scan every kind of actor is convenient static TArray AllActorClasses; diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 404762395..94f14353a 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -3639,7 +3639,7 @@ do_count: { // Again, with decorate replacements replacemented = true; - PClassActor *newkind = kind->GetReplacement(); + PClassActor *newkind = kind->GetReplacement(Level); if (newkind != kind) { kind = newkind; @@ -3727,7 +3727,7 @@ int DLevelScript::DoSpawn (int type, const DVector3 &pos, int tid, DAngle angle, if (info != NULL) { - info = info->GetReplacement (); + info = info->GetReplacement (Level); if ((GetDefaultByType (info)->flags3 & MF3_ISMONSTER) && ((dmflags & DF_NO_MONSTERS) || (Level->flags2 & LEVEL2_NOMONSTERS))) diff --git a/src/p_actionfunctions.cpp b/src/p_actionfunctions.cpp index b259b0830..fbb97c7d0 100644 --- a/src/p_actionfunctions.cpp +++ b/src/p_actionfunctions.cpp @@ -3393,7 +3393,7 @@ DEFINE_ACTION_FUNCTION(AActor, A_WolfAttack) || (self->target->flags2 & (MF2_INVULNERABLE|MF2_DORMANT))); if (flags & WAF_USEPUFF && pufftype) { - AActor *dpuff = GetDefaultByType(pufftype->GetReplacement()); + AActor *dpuff = GetDefaultByType(pufftype->GetReplacement(self->Level)); mod = dpuff->DamageType; if (dpuff->flags2 & MF2_THRUGHOST && self->target->flags3 & MF3_GHOST) diff --git a/src/p_destructible.cpp b/src/p_destructible.cpp index c15618912..126ddbd42 100755 --- a/src/p_destructible.cpp +++ b/src/p_destructible.cpp @@ -124,7 +124,7 @@ void P_DamageLinedef(line_t* line, AActor* source, int damage, FName damagetype, if (dogroups) { - damage = eventManager.WorldLineDamaged(line, source, damage, damagetype, side, position, isradius); + damage = line->GetLevel()->localEventManager->WorldLineDamaged(line, source, damage, damagetype, side, position, isradius); if (damage < 0) damage = 0; } @@ -160,7 +160,7 @@ void P_DamageSector(sector_t* sector, AActor* source, int damage, FName damagety if (dogroups) { - damage = eventManager.WorldSectorDamaged(sector, source, damage, damagetype, part, position, isradius); + damage = sector->Level->localEventManager->WorldSectorDamaged(sector, source, damage, damagetype, part, position, isradius); if (damage < 0) damage = 0; } diff --git a/src/p_enemy.cpp b/src/p_enemy.cpp index f590f67c2..161238c4e 100644 --- a/src/p_enemy.cpp +++ b/src/p_enemy.cpp @@ -3073,7 +3073,7 @@ void A_BossDeath(AActor *self) FName mytype = self->GetClass()->TypeName; // Ugh... - FName type = self->GetClass()->GetReplacee()->TypeName; + FName type = self->GetClass()->GetReplacee(self->Level)->TypeName; // Do generic special death actions first bool checked = false; diff --git a/src/p_interaction.cpp b/src/p_interaction.cpp index 4f58a1ad3..6f7791c4d 100644 --- a/src/p_interaction.cpp +++ b/src/p_interaction.cpp @@ -347,7 +347,7 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOf } // [ZZ] Fire WorldThingDied script hook. - eventManager.WorldThingDied(this, inflictor); + Level->localEventManager->WorldThingDied(this, inflictor); // [JM] Fire KILL type scripts for actor. Not needed for players, since they have the "DEATH" script type. if (!player && !(flags7 & MF7_NOKILLSCRIPTS) && ((flags7 & MF7_USEKILLSCRIPTS) || gameinfo.forcekillscripts)) @@ -560,7 +560,7 @@ void AActor::Die (AActor *source, AActor *inflictor, int dmgflags, FName MeansOf ClientObituary (this, inflictor, source, dmgflags, MeansOfDeath); // [ZZ] fire player death hook - eventManager.PlayerDied(Level->PlayerNum(player)); + Level->localEventManager->PlayerDied(Level->PlayerNum(player)); // Death script execution, care of Skull Tag Level->Behaviors.StartTypedScripts (SCRIPT_Death, this, true); @@ -1460,7 +1460,7 @@ static int DamageMobj (AActor *target, AActor *inflictor, AActor *source, int da } const int realdamage = MAX(0, damage); - eventManager.WorldThingDamaged(target, inflictor, source, realdamage, mod, flags, angle); + target->Level->localEventManager->WorldThingDamaged(target, inflictor, source, realdamage, mod, flags, angle); needevent = false; target->CallDie (source, inflictor, flags, MeansOfDeath); @@ -1481,7 +1481,7 @@ static int DoDamageMobj(AActor *target, AActor *inflictor, AActor *source, int d if (realdamage > 0 && needevent) { // [ZZ] event handlers only need the resultant damage (they can't do anything about it anyway) - eventManager.WorldThingDamaged(target, inflictor, source, realdamage, mod, flags, angle); + target->Level->localEventManager->WorldThingDamaged(target, inflictor, source, realdamage, mod, flags, angle); } return MAX(0, realdamage); diff --git a/src/p_map.cpp b/src/p_map.cpp index 4e52503ec..b33e8b133 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -4415,7 +4415,7 @@ AActor *P_LineAttack(AActor *t1, DAngle angle, double distance, shootz += sz; // We need to check the defaults of the replacement here - AActor *puffDefaults = GetDefaultByType(pufftype->GetReplacement()); + AActor *puffDefaults = GetDefaultByType(pufftype->GetReplacement(t1->Level)); TData.hitGhosts = (t1->player != NULL && t1->player->ReadyWeapon != NULL && @@ -5161,7 +5161,7 @@ void P_RailAttack(FRailParams *p) int flags; assert(puffclass != NULL); // Because we set it to a default above - AActor *puffDefaults = GetDefaultByType(puffclass->GetReplacement()); //Contains all the flags such as FOILINVUL, etc. + AActor *puffDefaults = GetDefaultByType(puffclass->GetReplacement(source->Level)); //Contains all the flags such as FOILINVUL, etc. // disabled because not complete yet. flags = (puffDefaults->flags6 & MF6_NOTRIGGER) ? TRACE_ReportPortals : TRACE_PCross | TRACE_Impact | TRACE_ReportPortals; diff --git a/src/p_mobj.cpp b/src/p_mobj.cpp index 057eae6e6..2335088fc 100644 --- a/src/p_mobj.cpp +++ b/src/p_mobj.cpp @@ -1208,7 +1208,7 @@ bool AActor::Grind(bool items) if (i != NULL) { - i = i->GetReplacement(); + i = i->GetReplacement(Level); const AActor *defaults = GetDefaultByType (i); if (defaults->SpawnState == NULL || @@ -4539,7 +4539,7 @@ AActor *AActor::StaticSpawn(FLevelLocals *Level, PClassActor *type, const DVecto if (allowreplacement) { - type = type->GetReplacement(); + type = type->GetReplacement(Level); } AActor *actor; @@ -4682,7 +4682,7 @@ void AActor::PostBeginPlay () void AActor::CallPostBeginPlay() { Super::CallPostBeginPlay(); - eventManager.WorldThingSpawned(this); + Level->localEventManager->WorldThingSpawned(this); } bool AActor::isFast() @@ -4800,7 +4800,7 @@ void AActor::OnDestroy () // note that this differs from ThingSpawned in that you can actually override OnDestroy to avoid calling the hook. // but you can't really do that without utterly breaking the game, so it's ok. // note: if OnDestroy is ever made optional, E_WorldThingDestroyed should still be called for ANY thing. - eventManager.WorldThingDestroyed(this); + Level->localEventManager->WorldThingDestroyed(this); DeleteAttachedLights(); ClearRenderSectorList(); @@ -5155,7 +5155,7 @@ AActor *FLevelLocals::SpawnPlayer (FPlayerStart *mthing, int playernum, int flag DObject::StaticPointerSubstitution (oldactor, p->mo); - eventManager.PlayerRespawned(PlayerNum(p)); + localEventManager->PlayerRespawned(PlayerNum(p)); Behaviors.StartTypedScripts (SCRIPT_Respawn, p->mo, true); } } @@ -5363,7 +5363,7 @@ AActor *FLevelLocals::SpawnMapThing (FMapThing *mthing, int position) // it to the unknown thing. // Handle decorate replacements explicitly here // to check for missing frames in the replacement object. - i = mentry->Type->GetReplacement(); + i = mentry->Type->GetReplacement(this); const AActor *defaults = GetDefaultByType (i); if (defaults->SpawnState == NULL || @@ -7137,7 +7137,7 @@ void AActor::Revive() } // [ZZ] resurrect hook - eventManager.WorldThingRevived(this); + Level->localEventManager->WorldThingRevived(this); } int AActor::GetGibHealth() const diff --git a/src/p_saveg.cpp b/src/p_saveg.cpp index 43e2b2beb..9406bff66 100644 --- a/src/p_saveg.cpp +++ b/src/p_saveg.cpp @@ -1000,7 +1000,8 @@ void FLevelLocals::Serialize(FSerializer &arc, bool hubload) // [ZZ] serialize health groups P_SerializeHealthGroups(this, arc); // [ZZ] serialize events - eventManager.SerializeEvents(arc); + arc("firstevent", localEventManager->FirstEventHandler) + ("lastevent", localEventManager->LastEventHandler); Thinkers.SerializeThinkers(arc, hubload); arc("polyobjs", Polyobjects); SerializeSubsectors(arc, "subsectors"); @@ -1024,6 +1025,7 @@ void FLevelLocals::Serialize(FSerializer &arc, bool hubload) FWeaponSlots::SetupWeaponSlots(Players[i]->mo); } } + localEventManager->SetOwnerForHandlers(); // This cannot be automated. RecreateAllAttachedLights(); InitPortalGroups(this); diff --git a/src/p_setup.cpp b/src/p_setup.cpp index d51547e2c..1cebab78d 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -338,6 +338,8 @@ void FLevelLocals::ClearLevelData() Scrolls.Clear(); if (automap) automap->Destroy(); Behaviors.UnloadModules(); + delete localEventManager; + localEventManager = nullptr; } //========================================================================== @@ -348,9 +350,6 @@ void FLevelLocals::ClearLevelData() void P_FreeLevelData () { - - // [ZZ] delete per-map event handlers - eventManager.Shutdown(true); R_FreePastViewers(); for (auto Level : AllLevels()) @@ -425,7 +424,7 @@ void P_SetupLevel(FLevelLocals *Level, int position, bool newGame) // [ZZ] init per-map static handlers. we need to call this before everything is set up because otherwise scripts don't receive PlayerEntered event // (which happens at god-knows-what stage in this function, but definitely not the last part, because otherwise it'd work to put E_InitStaticHandlers before the player spawning) - eventManager.InitStaticHandlers(true); + Level->localEventManager->InitStaticHandlers(true); // generate a checksum for the level, to be included and checked with savegames. map->GetChecksum(Level->md5); @@ -434,7 +433,7 @@ void P_SetupLevel(FLevelLocals *Level, int position, bool newGame) if (newGame) { - eventManager.NewGame(EventHandlerType::PerMap); + Level->localEventManager->NewGame(); } MapLoader loader(Level); @@ -587,7 +586,7 @@ static void P_Shutdown () } P_FreeLevelData (); // [ZZ] delete global event handlers - eventManager.Shutdown(false); + staticEventManager.Shutdown(); // clear out the handlers before starting the engine shutdown ST_Clear(); for (auto &p : players) { diff --git a/src/p_spec.cpp b/src/p_spec.cpp index 4ef7dd1d9..bd4319f41 100644 --- a/src/p_spec.cpp +++ b/src/p_spec.cpp @@ -168,7 +168,7 @@ bool P_ActivateLine (line_t *line, AActor *mo, int side, int activationType, DVe // [MK] Use WorldLinePreActivated to decide if activation should continue bool shouldactivate = true; - eventManager.WorldLinePreActivated(line, mo, activationType, &shouldactivate); + Level->localEventManager->WorldLinePreActivated(line, mo, activationType, &shouldactivate); if ( !shouldactivate ) return false; bool remote = (line->special != 7 && line->special != 8 && (line->special < 11 || line->special > 14)); @@ -180,7 +180,7 @@ bool P_ActivateLine (line_t *line, AActor *mo, int side, int activationType, DVe buttonSuccess = P_ExecuteSpecial(line->GetLevel(), line->special, line, mo, side == 1, line->args[0], line->args[1], line->args[2], line->args[3], line->args[4]); // [MK] Fire up WorldLineActivated - if ( buttonSuccess ) eventManager.WorldLineActivated(line, mo, activationType); + if ( buttonSuccess ) Level->localEventManager->WorldLineActivated(line, mo, activationType); special = line->special; if (!repeat && buttonSuccess) diff --git a/src/p_things.cpp b/src/p_things.cpp index d2ec3ee98..e63138976 100644 --- a/src/p_things.cpp +++ b/src/p_things.cpp @@ -62,7 +62,7 @@ bool FLevelLocals::EV_Thing_Spawn (int tid, AActor *source, int type, DAngle ang return false; // Handle decorate replacements. - kind = kind->GetReplacement(); + kind = kind->GetReplacement(this); if ((GetDefaultByType(kind)->flags3 & MF3_ISMONSTER) && ((dmflags & DF_NO_MONSTERS) || (flags2 & LEVEL2_NOMONSTERS))) @@ -274,7 +274,7 @@ bool FLevelLocals::EV_Thing_Projectile (int tid, AActor *source, int type, const } // Handle decorate replacements. - kind = kind->GetReplacement(); + kind = kind->GetReplacement(this); defflags3 = GetDefaultByType(kind)->flags3; if ((defflags3 & MF3_ISMONSTER) && diff --git a/src/p_tick.cpp b/src/p_tick.cpp index a66751762..0407ba81b 100644 --- a/src/p_tick.cpp +++ b/src/p_tick.cpp @@ -127,9 +127,14 @@ void P_Ticker (void) P_ResetSightCounters (false); R_ClearInterpolationPath(); + // Since things will be moving, it's okay to interpolate them in the renderer. + r_NoInterpolate = false; + // Reset all actor interpolations on all levels before the current thinking turn so that indirect actor movement gets properly interpolated. for (auto Level : AllLevels()) { + // todo: set up a sandbox for secondary levels here. + auto it = Level->GetThinkerIterator(); AActor *ac; @@ -138,22 +143,13 @@ void P_Ticker (void) ac->ClearInterpolation(); } P_ThinkParticles(Level); // [RH] make the particles think - } - // Since things will be moving, it's okay to interpolate them in the renderer. - r_NoInterpolate = false; + for (i = 0; i < MAXPLAYERS; i++) + if (Level->PlayerInGame(i)) + P_PlayerThink(Level->Players[i]); - - for (i = 0; iCallTick (); // [RH] moved this here - for (auto Level : AllLevels()) - { - // todo: set up a sandbox for secondary levels here. + // [ZZ] call the WorldTick hook + Level->localEventManager->WorldTick(); Level->Tick(); // [RH] let the level tick Level->Thinkers.RunThinkers(Level); @@ -169,4 +165,5 @@ void P_Ticker (void) Level->maptime++; Level->totaltime++; } + StatusBar->CallTick(); // Status bar should tick AFTER the thinkers to properly reflect the level's state at this time. } diff --git a/src/p_user.cpp b/src/p_user.cpp index a3cbbc57e..68849eaf5 100644 --- a/src/p_user.cpp +++ b/src/p_user.cpp @@ -654,8 +654,7 @@ bool player_t::Resurrect() // player is now alive. // fire E_PlayerRespawned and start the ACS SCRIPT_Respawn. - eventManager.PlayerRespawned(pnum); - // + mo->Level->localEventManager->PlayerRespawned(pnum); mo->Level->Behaviors.StartTypedScripts(SCRIPT_Respawn, mo, true); return true; } diff --git a/src/scripting/vmthunks_actors.cpp b/src/scripting/vmthunks_actors.cpp index dd674bf80..e55a25200 100644 --- a/src/scripting/vmthunks_actors.cpp +++ b/src/scripting/vmthunks_actors.cpp @@ -1232,26 +1232,26 @@ DEFINE_ACTION_FUNCTION_NATIVE(AActor, GetSpriteIndex, ZS_GetSpriteIndex) static PClassActor *ZS_GetReplacement(PClassActor *c) { - return c->GetReplacement(); + return c->GetReplacement(currentVMLevel); } DEFINE_ACTION_FUNCTION_NATIVE(AActor, GetReplacement, ZS_GetReplacement) { PARAM_PROLOGUE; PARAM_POINTER(c, PClassActor); - ACTION_RETURN_POINTER(c->GetReplacement()); + ACTION_RETURN_POINTER(ZS_GetReplacement(c)); } static PClassActor *ZS_GetReplacee(PClassActor *c) { - return c->GetReplacee(); + return c->GetReplacee(currentVMLevel); } DEFINE_ACTION_FUNCTION_NATIVE(AActor, GetReplacee, ZS_GetReplacee) { PARAM_PROLOGUE; PARAM_POINTER(c, PClassActor); - ACTION_RETURN_POINTER(c->GetReplacee()); + ACTION_RETURN_POINTER(ZS_GetReplacee(c)); } static void DrawSplash(AActor *self, int count, double angle, int kind) diff --git a/src/win32/i_input.cpp b/src/win32/i_input.cpp index 901e61483..990ab416e 100644 --- a/src/win32/i_input.cpp +++ b/src/win32/i_input.cpp @@ -91,6 +91,7 @@ #include "events.h" #include "doomerrors.h" #include "i_system.h" +#include "g_levellocals.h" // Prototypes and declarations. #include "rawinput.h" @@ -177,7 +178,7 @@ static void I_CheckGUICapture () } // [ZZ] check active event handlers that want the UI processing - if (!wantCapt && eventManager.CheckUiProcessors()) + if (!wantCapt && primaryLevel->localEventManager->CheckUiProcessors()) wantCapt = true; if (wantCapt != GUICapture) @@ -781,7 +782,7 @@ void I_StartTic () BlockMouseMove--; ResetButtonTriggers (); I_CheckGUICapture (); - EventHandlerResultForNativeMouse = eventManager.CheckRequireMouse(); + EventHandlerResultForNativeMouse = primaryLevel->localEventManager->CheckRequireMouse(); I_CheckNativeMouse (false, EventHandlerResultForNativeMouse); I_GetEvent (); } From 9f7fe203fcfc608b7b560924260f68e1ff2a154f Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 2 Feb 2019 17:29:13 +0100 Subject: [PATCH 153/164] - had to fix a few things. --- src/g_level.cpp | 29 ++++++++++++++++++++++++++--- src/g_levellocals.h | 11 ++--------- src/gamedata/info.cpp | 10 ++++++---- src/p_setup.cpp | 3 +-- src/r_data/a_dynlightdata.cpp | 2 +- src/scripting/vmthunks.cpp | 2 +- src/version.h | 4 ++-- 7 files changed, 39 insertions(+), 22 deletions(-) diff --git a/src/g_level.cpp b/src/g_level.cpp index 3fb8089d7..9d1bd9270 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1486,12 +1486,32 @@ int FLevelLocals::FinishTravel () // //========================================================================== +FLevelLocals::FLevelLocals() : Behaviors(this), tagManager(this) +{ + // Make sure that these point to the right data all the time. + // This will be needed for as long as it takes to completely separate global UI state from per-level play state. + for (int i = 0; i < MAXPLAYERS; i++) + { + Players[i] = &players[i]; + } + localEventManager = new EventManager; +} + +FLevelLocals::~FLevelLocals() +{ + if (localEventManager) delete localEventManager; +} + +//========================================================================== +// +// +//========================================================================== + void FLevelLocals::Init() { P_InitParticles(this); P_ClearParticles(this); BaseBlendA = 0.0f; // Remove underwater blend effect, if any - localEventManager = new EventManager; gravity = sv_gravity * 35/TICRATE; aircontrol = sv_aircontrol; @@ -2129,8 +2149,11 @@ void FLevelLocals::Mark() GC::Mark(BotInfo.firstthing); GC::Mark(BotInfo.body1); GC::Mark(BotInfo.body2); - GC::Mark(localEventManager->FirstEventHandler); - GC::Mark(localEventManager->LastEventHandler); + if (localEventManager) + { + GC::Mark(localEventManager->FirstEventHandler); + GC::Mark(localEventManager->LastEventHandler); + } Thinkers.MarkRoots(); canvasTextureInfo.Mark(); for (auto &c : CorpseQueue) diff --git a/src/g_levellocals.h b/src/g_levellocals.h index 7594fb19a..cf09617d0 100644 --- a/src/g_levellocals.h +++ b/src/g_levellocals.h @@ -106,15 +106,8 @@ struct FLevelLocals { void *level; void *Level; // bug catchers. - FLevelLocals() : Behaviors(this), tagManager(this) - { - // Make sure that these point to the right data all the time. - // This will be needed for as long as it takes to completely separate global UI state from per-level play state. - for (int i = 0; i < MAXPLAYERS; i++) - { - Players[i] = &players[i]; - } - } + FLevelLocals(); + ~FLevelLocals(); friend class MapLoader; diff --git a/src/gamedata/info.cpp b/src/gamedata/info.cpp index 1086200b2..f06e56b46 100644 --- a/src/gamedata/info.cpp +++ b/src/gamedata/info.cpp @@ -536,9 +536,11 @@ PClassActor *PClassActor::GetReplacement(FLevelLocals *Level, bool lookskill) lookskill = false; skillrepname = NAME_None; } } - // [MK] ZScript replacement through Event Handlers, has priority over others + // [MK] ZScript replacement through Event Handlers, has priority over others. PClassActor *Replacement = ActorInfo()->Replacement; - if (Level->localEventManager->CheckReplacement(this,&Replacement) ) + // Level can be null when initializing dynamic lights. + // Since they only want to check for DehackedPickups this code should be skipped for them. + if (Level && Level->localEventManager->CheckReplacement(this,&Replacement) ) { // [MK] the replacement is final, so don't continue with the chain return Replacement ? Replacement : this; @@ -561,7 +563,7 @@ PClassActor *PClassActor::GetReplacement(FLevelLocals *Level, bool lookskill) } // Now handle DECORATE replacement chain // Skill replacements are not recursive, contrarily to DECORATE replacements - rep = rep->GetReplacement(false); + rep = rep->GetReplacement(Level, false); // Reset the temporarily NULLed field ActorInfo()->Replacement = oldrep; return rep; @@ -615,7 +617,7 @@ PClassActor *PClassActor::GetReplacee(FLevelLocals *Level, bool lookskill) { rep = PClass::FindActor(skillrepname); } - rep = rep->GetReplacee(false); + rep = rep->GetReplacee(Level, false); ActorInfo()->Replacee = savedrep; return rep; } diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 1cebab78d..8aeca7b8b 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -338,8 +338,7 @@ void FLevelLocals::ClearLevelData() Scrolls.Clear(); if (automap) automap->Destroy(); Behaviors.UnloadModules(); - delete localEventManager; - localEventManager = nullptr; + localEventManager->Shutdown(); } //========================================================================== diff --git a/src/r_data/a_dynlightdata.cpp b/src/r_data/a_dynlightdata.cpp index e6ed0c10b..1d8564a45 100644 --- a/src/r_data/a_dynlightdata.cpp +++ b/src/r_data/a_dynlightdata.cpp @@ -46,7 +46,7 @@ inline PClassActor * GetRealType(PClassActor * ti) { - PClassActor *rep = ti->GetReplacement(false); + PClassActor *rep = ti->GetReplacement(nullptr, false); if (rep != ti && rep != NULL && rep->IsDescendantOf(NAME_DehackedPickup)) { return rep; diff --git a/src/scripting/vmthunks.cpp b/src/scripting/vmthunks.cpp index 96e63c037..653bc2d98 100644 --- a/src/scripting/vmthunks.cpp +++ b/src/scripting/vmthunks.cpp @@ -2846,7 +2846,7 @@ DEFINE_ACTION_FUNCTION_NATIVE(_AltHUD, GetLatency, Net_GetLatency) // // //========================================================================== -DEFINE_GLOBAL(currentVMLevel, level); +DEFINE_GLOBAL_NAMED(currentVMLevel, level) DEFINE_FIELD(FLevelLocals, sectors) DEFINE_FIELD(FLevelLocals, lines) DEFINE_FIELD(FLevelLocals, sides) diff --git a/src/version.h b/src/version.h index 3387ae54a..1336b47c6 100644 --- a/src/version.h +++ b/src/version.h @@ -87,11 +87,11 @@ const char *GetVersionString(); #define SAVEGAME_EXT "zds" // MINSAVEVER is the minimum level snapshot version that can be loaded. -#define MINSAVEVER 4555 +#define MINSAVEVER 4556 // Use 4500 as the base git save version, since it's higher than the // SVN revision ever got. -#define SAVEVER 4555 +#define SAVEVER 4556 // This is so that derivates can use the same savegame versions without worrying about engine compatibility #define GAMESIG "GZDOOM" From 8137162ca05e38c09774ceef46d4adee744e2d3e Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Sun, 3 Feb 2019 11:04:49 +0200 Subject: [PATCH 154/164] - fixes compilation of POSIX targets src/posix/cocoa/i_input.mm:95:22: error: use of undeclared identifier 'E_CheckUiProcessors' src/posix/cocoa/i_input.mm:200:21: error: use of undeclared identifier 'E_CheckRequireMouse' src/posix/sdl/i_input.cpp:183:19: error: use of undeclared identifier 'E_CheckUiProcessors' src/events.cpp:540:1: error: pasting formed '::RenderFrame', an invalid preprocessing token src/events.cpp:541:1: error: pasting formed '::WorldLightning', an invalid preprocessing token src/events.cpp:542:1: error: pasting formed '::WorldTick', an invalid preprocessing token src/events.cpp:543:1: error: pasting formed '::UiTick', an invalid preprocessing token src/events.cpp:544:1: error: pasting formed '::PostUiTick', an invalid preprocessing token --- src/events.cpp | 2 +- src/posix/cocoa/i_input.mm | 5 +++-- src/posix/sdl/i_input.cpp | 4 +++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/events.cpp b/src/events.cpp index 80e8fc6c1..033d647b1 100755 --- a/src/events.cpp +++ b/src/events.cpp @@ -259,7 +259,7 @@ void EventManager::Shutdown() } } -#define DEFINE_EVENT_LOOPER(name, play) void EventManager::##name() \ +#define DEFINE_EVENT_LOOPER(name, play) void EventManager::name() \ { \ if (ShouldCallStatic(play)) staticEventManager.name(); \ for (DStaticEventHandler* handler = FirstEventHandler; handler; handler = handler->next) \ diff --git a/src/posix/cocoa/i_input.mm b/src/posix/cocoa/i_input.mm index 79315e1ce..7ae2050b4 100644 --- a/src/posix/cocoa/i_input.mm +++ b/src/posix/cocoa/i_input.mm @@ -46,6 +46,7 @@ #include "v_video.h" #include "events.h" #include "g_game.h" +#include "g_levellocals.h" EXTERN_CVAR(Int, m_use_mouse) @@ -92,7 +93,7 @@ void CheckGUICapture() : (MENU_On == menuactive || MENU_OnNoPause == menuactive); // [ZZ] check active event handlers that want the UI processing - if (!wantCapture && E_CheckUiProcessors()) + if (!wantCapture && primaryLevel->localEventManager->CheckUiProcessors()) { wantCapture = true; } @@ -197,7 +198,7 @@ void CheckNativeMouse() && (MENU_On == menuactive || MENU_OnNoPause == menuactive); } - if (!wantNative && E_CheckRequireMouse()) + if (!wantNative && primaryLevel->localEventManager->CheckRequireMouse()) wantNative = true; I_SetNativeMouse(wantNative); diff --git a/src/posix/sdl/i_input.cpp b/src/posix/sdl/i_input.cpp index 70a636dc6..61a1fe0be 100644 --- a/src/posix/sdl/i_input.cpp +++ b/src/posix/sdl/i_input.cpp @@ -45,6 +45,8 @@ #include "dikeys.h" #include "events.h" #include "g_game.h" +#include "g_levellocals.h" + static void I_CheckGUICapture (); static void I_CheckNativeMouse (); @@ -180,7 +182,7 @@ static void I_CheckGUICapture () } // [ZZ] check active event handlers that want the UI processing - if (!wantCapt && E_CheckUiProcessors()) + if (!wantCapt && primaryLevel->localEventManager->CheckUiProcessors()) wantCapt = true; if (wantCapt != GUICapture) From 496eba3acb9e65be820409de2cc81acfcf15e9bf Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 4 Feb 2019 13:05:27 +0100 Subject: [PATCH 155/164] - fix polyobject init --- src/maploader/polyobjects.cpp | 1 + src/p_maputl.h | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/maploader/polyobjects.cpp b/src/maploader/polyobjects.cpp index 1ff264712..3c0a567ad 100644 --- a/src/maploader/polyobjects.cpp +++ b/src/maploader/polyobjects.cpp @@ -352,6 +352,7 @@ void MapLoader::PO_Init (void) InitSideLists (); Level->Polyobjects.Resize(NumPolyobjs); + for (auto &po : Level->Polyobjects) po.Level = Level; // must be done before the init loop below. polyIndex = 0; // index polyobj number // Find the startSpot points, and spawn each polyobj diff --git a/src/p_maputl.h b/src/p_maputl.h index 99a8a8a04..5a65c27d3 100644 --- a/src/p_maputl.h +++ b/src/p_maputl.h @@ -312,8 +312,9 @@ class FBlockThingsIterator public: FBlockThingsIterator(FLevelLocals *Level, int minx, int miny, int maxx, int maxy); - FBlockThingsIterator(FLevelLocals *Level, const FBoundingBox &box) + FBlockThingsIterator(FLevelLocals *l, const FBoundingBox &box) { + Level = l; init(box); } void init(const FBoundingBox &box); From a0042fd6539cc02fc026ec2c67ad187a50c7cb62 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 4 Feb 2019 14:08:34 +0100 Subject: [PATCH 156/164] - removed bad character from A_CustomPunch definition. --- wadsrc/static/zscript/inventory/stateprovider.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wadsrc/static/zscript/inventory/stateprovider.txt b/wadsrc/static/zscript/inventory/stateprovider.txt index bed30ffd5..5cfbadc76 100644 --- a/wadsrc/static/zscript/inventory/stateprovider.txt +++ b/wadsrc/static/zscript/inventory/stateprovider.txt @@ -248,7 +248,7 @@ class StateProvider : Inventory // //========================================================================== - action void A_CustomPunch(int damage, bool norandom = false, int flags = CPF_USEAMMO, class pufftype = "BulletPuff", double range = 0, double lifesteal = 0, int lifestealmax = 0, class armorbonustype = "ArmorBonus", sound MeleeSound = 0, sound MissSound = "") + action void A_CustomPunch(int damage, bool norandom = false, int flags = CPF_USEAMMO, class pufftype = "BulletPuff", double range = 0, double lifesteal = 0, int lifestealmax = 0, class armorbonustype = "ArmorBonus", sound MeleeSound = 0, sound MissSound = "") { let player = self.player; if (!player) return; From 26acd564fbb3579a99092588f38db1ac210dd5e5 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Mon, 4 Feb 2019 16:27:57 +0100 Subject: [PATCH 157/164] - restored order of destruction of interpolations and thinkers, which got accidentally reversed. --- src/p_setup.cpp | 4 ++-- src/r_data/r_interpolate.cpp | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 8aeca7b8b..7ea4d9f15 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -255,6 +255,7 @@ void FLevelLocals::ClearPortals() void FLevelLocals::ClearLevelData() { + interpolator.ClearInterpolations(); // [RH] Nothing to interpolate on a fresh level. Thinkers.DestroyAllThinkers(); ClearAllSubsectorLinks(); // can't be done as part of the polyobj deletion process. @@ -290,10 +291,9 @@ void FLevelLocals::ClearLevelData() } ClearPortals(); - interpolator.ClearInterpolations(); // [RH] Nothing to interpolate on a fresh level. tagManager.Clear(); ClearTIDHashes(); - Behaviors.UnloadModules(); + if (SpotState) SpotState->Destroy(); SpotState = nullptr; ACSThinker = nullptr; FraggleScriptThinker = nullptr; diff --git a/src/r_data/r_interpolate.cpp b/src/r_data/r_interpolate.cpp index 874159c02..a5763627e 100644 --- a/src/r_data/r_interpolate.cpp +++ b/src/r_data/r_interpolate.cpp @@ -429,6 +429,7 @@ void DSectorPlaneInterpolation::OnDestroy() { attached[i]->DelRef(); } + attached.Reset(); Super::OnDestroy(); } From 546d3d1bf59addcada3e6bb611247057bcf53359 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 5 Feb 2019 11:51:19 +0100 Subject: [PATCH 158/164] - allow localization of Hexen's original ACS strings. This way of looking up strings is intentionally limited to content from Hexen.wad and Hexdd.wad. --- src/maploader/maploader.cpp | 2 +- src/p_acs.cpp | 48 +++++++++++--- src/p_acs.h | 26 ++++---- wadsrc/static/language.enu | 128 ++++++++++++++++++++++++++++++++++++ 4 files changed, 183 insertions(+), 21 deletions(-) diff --git a/src/maploader/maploader.cpp b/src/maploader/maploader.cpp index 91ddaca49..5e3dc9669 100644 --- a/src/maploader/maploader.cpp +++ b/src/maploader/maploader.cpp @@ -2863,7 +2863,7 @@ void MapLoader::LoadBehavior(MapData * map) { if (map->Size(ML_BEHAVIOR) > 0) { - Level->Behaviors.LoadModule(-1, &map->Reader(ML_BEHAVIOR), map->Size(ML_BEHAVIOR)); + Level->Behaviors.LoadModule(-1, &map->Reader(ML_BEHAVIOR), map->Size(ML_BEHAVIOR), map->lumpnum); } if (!Level->Behaviors.CheckAllGood()) { diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 94f14353a..40e38c690 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -1942,7 +1942,7 @@ void FBehaviorContainer::LoadDefaultModules () } } -FBehavior *FBehaviorContainer::LoadModule (int lumpnum, FileReader *fr, int len) +FBehavior *FBehaviorContainer::LoadModule (int lumpnum, FileReader *fr, int len, int reallumpnum) { if (lumpnum == -1 && fr == NULL) return NULL; @@ -1955,7 +1955,7 @@ FBehavior *FBehaviorContainer::LoadModule (int lumpnum, FileReader *fr, int len) } FBehavior * behavior = new FBehavior (); - if (behavior->Init(Level, lumpnum, fr, len)) + if (behavior->Init(Level, lumpnum, fr, len, reallumpnum)) { return behavior; } @@ -2209,7 +2209,7 @@ FBehavior::FBehavior() } -bool FBehavior::Init(FLevelLocals *Level, int lumpnum, FileReader * fr, int len) +bool FBehavior::Init(FLevelLocals *Level, int lumpnum, FileReader * fr, int len, int reallumpnum) { uint8_t *object; int i; @@ -2303,6 +2303,8 @@ bool FBehavior::Init(FLevelLocals *Level, int lumpnum, FileReader * fr, int len) // Forget about the compatibility cruft at the end of the lump DataSize = LittleLong(((uint32_t *)object)[1]) - 8; } + + ShouldLocalize = false; } else { @@ -2316,6 +2318,17 @@ bool FBehavior::Init(FLevelLocals *Level, int lumpnum, FileReader * fr, int len) StringTable = LittleLong(((uint32_t *)Data)[1]); StringTable += LittleLong(((uint32_t *)(Data + StringTable))[0]) * 12 + 4; UnescapeStringTable(Data + StringTable, Data, false); + // If this is an original Hexen BEHAVIOR, set up some localization info for it. Original Hexen BEHAVIORs are always in the old format. + if ((Level->flags2 & LEVEL2_HEXENHACK) && gameinfo.gametype == GAME_Hexen && lumpnum == -1 && reallumpnum > 0) + { + int fileno = Wads.GetLumpFile(reallumpnum); + const char * filename = Wads.GetWadName(fileno); + if (!stricmp(filename, "HEXEN.WAD") || !stricmp(filename, "HEXDD.WAD")) + { + ShouldLocalize = true; + } + } + } else { @@ -3193,7 +3206,7 @@ uint8_t *FBehavior::NextChunk (uint8_t *chunk) const return NULL; } -const char *FBehaviorContainer::LookupString (uint32_t index) +const char *FBehaviorContainer::LookupString (uint32_t index, bool forprint) { uint32_t lib = index >> LIBRARYID_SHIFT; @@ -3205,10 +3218,10 @@ const char *FBehaviorContainer::LookupString (uint32_t index) { return NULL; } - return StaticModules[lib]->LookupString (index & 0xffff); + return StaticModules[lib]->LookupString (index & 0xffff, forprint); } -const char *FBehavior::LookupString (uint32_t index) const +const char *FBehavior::LookupString (uint32_t index, bool forprint) const { if (StringTable == 0) { @@ -3220,7 +3233,26 @@ const char *FBehavior::LookupString (uint32_t index) const if (index >= list[0]) return NULL; // Out of range for this list; - return (const char *)(Data + list[1+index]); + + const char *s = (const char *)(Data + list[1 + index]); + // Allow translations for Hexen's original strings. + // This synthesizes a string label and looks it up. + // It will only do this for original Hexen maps and PCD_PRINTSTRING operations. + // For localizing user content better solutions exist so this hack won't be available as an editing feature. + if (ShouldLocalize && forprint) + { + FString token = s; + token.ToUpper(); + token.ReplaceChars(".,-+!?", ' '); + token.Substitute(" ", ""); + token.Truncate(5); + + FStringf label("TXT_ACS_%s_%d_%.5s", Level->MapName.GetChars(), index, token); + auto p = GStrings[label]; + if (p) return p; + } + + return s; } else { @@ -8362,7 +8394,7 @@ scriptwait: case PCD_PRINTSTRING: case PCD_PRINTLOCALIZED: - lookup = Level->Behaviors.LookupString (STACK(1)); + lookup = Level->Behaviors.LookupString (STACK(1), true); if (pcd == PCD_PRINTLOCALIZED) { lookup = GStrings(lookup); diff --git a/src/p_acs.h b/src/p_acs.h index bbd1001bf..7c31068a0 100644 --- a/src/p_acs.h +++ b/src/p_acs.h @@ -350,7 +350,7 @@ class FBehavior public: FBehavior (); ~FBehavior (); - bool Init(FLevelLocals *l, int lumpnum, FileReader * fr = NULL, int len = 0); + bool Init(FLevelLocals *l, int lumpnum, FileReader * fr = NULL, int len = 0, int reallumpnum = -1); bool IsGood (); uint8_t *FindChunk (uint32_t id) const; @@ -378,7 +378,7 @@ public: const char *GetModuleName() const { return ModuleName; } ACSProfileInfo *GetFunctionProfileData(int index) { return index >= 0 && index < NumFunctions ? &FunctionProfileData[index] : NULL; } ACSProfileInfo *GetFunctionProfileData(ScriptFunction *func) { return GetFunctionProfileData((int)(func - (ScriptFunction *)Functions)); } - const char *LookupString (uint32_t index) const; + const char *LookupString (uint32_t index, bool forprint = false) const; BoundsCheckingArray MapVars; @@ -386,26 +386,28 @@ public: private: struct ArrayInfo; - ACSFormat Format; - FLevelLocals *Level; - int LumpNum; uint8_t *Data; - int DataSize; uint8_t *Chunks; ScriptPtr *Scripts; - int NumScripts; ScriptFunction *Functions; ACSProfileInfo *FunctionProfileData; - int NumFunctions; ArrayInfo *ArrayStore; - int NumArrays; ArrayInfo **Arrays; + + ACSFormat Format; + int LumpNum; + int DataSize; + int NumScripts; + int NumFunctions; + int NumArrays; int NumTotalArrays; uint32_t StringTable; + uint32_t LibraryID; + bool ShouldLocalize; + int32_t MapVarStore[NUM_MAPVARS]; TArray Imports; - uint32_t LibraryID; char ModuleName[9]; TArray JumpPoints; @@ -432,7 +434,7 @@ struct FBehaviorContainer FBehaviorContainer(FLevelLocals *l) : Level(l) {} - FBehavior *LoadModule(int lumpnum, FileReader *fr = nullptr, int len = 0); + FBehavior *LoadModule(int lumpnum, FileReader *fr = nullptr, int len = 0, int reallumpnum = -1); void LoadDefaultModules(); void UnloadModules(); bool CheckAllGood(); @@ -443,7 +445,7 @@ struct FBehaviorContainer void UnlockLevelVarStrings(int levelnum); const ScriptPtr *FindScript(int script, FBehavior *&module); - const char *LookupString(uint32_t index); + const char *LookupString(uint32_t index, bool forprint = false); void StartTypedScripts(uint16_t type, AActor *activator, bool always, int arg1 = 0, bool runNow = false); void StopMyScripts(AActor *actor); void ArrangeScriptProfiles(TArray &profiles); diff --git a/wadsrc/static/language.enu b/wadsrc/static/language.enu index 54cb51ef1..be78def26 100644 --- a/wadsrc/static/language.enu +++ b/wadsrc/static/language.enu @@ -2943,3 +2943,131 @@ MSG_TALISMANRED = "You have a feeling that it wasn't to be touched..."; MSG_TALISMANGREEN = "Whatever it is, it doesn't belong in this world..."; MSG_TALISMANBLUE = "It must do something..."; MSG_TALISMANPOWER = "You have super strength!"; + +// Strings from Hexen's IWAD scripts. Technically they are not needed here for English, they are mainly meant to be documentation for translating. + +TXT_ACS_map01_5_THEDO = "THE DOOR IS LOCKED"; +TXT_ACS_map02_9_GREET = "GREETINGS, MORTAL"; +TXT_ACS_map02_11_AREYO = "ARE YOU READY TO DIE?"; +TXT_ACS_map02_20_ADOOR = "A DOOR OPENED ON THE GUARDIAN OF ICE"; +TXT_ACS_map03_12_THISP = "THIS PATH IS BARRED"; +TXT_ACS_map04_9_ONEHA = "ONE HALF OF THE PUZZLE HAS BEEN SOLVED"; +TXT_ACS_map04_10_ONTHE = "ON THE SEVEN PORTALS"; +TXT_ACS_map04_11_ONETH = "ONE THIRD OF THE PUZZLE HAS BEEN SOLVED"; +TXT_ACS_map04_12_STAIR = "STAIRS HAVE RISEN ON THE SEVEN PORTALS"; +TXT_ACS_map05_6_ONETH = "ONE THIRD OF THE PUZZLE HAS BEEN SOLVED"; +TXT_ACS_map05_7_ONTHE = "ON THE SEVEN PORTALS"; +TXT_ACS_map05_8_STAIR = "STAIRS HAVE RISEN ON THE SEVEN PORTALS"; +TXT_ACS_map05_9_YOUHA = "YOU HAVE TO FIND ANOTHER SWITCH..."; +TXT_ACS_map05_10_STONE = "STONES GRIND ON THE SEVEN PORTALS"; +TXT_ACS_map08_6_ONESI = "ONE SIXTH OF THE PUZZLE HAS BEEN SOLVED"; +TXT_ACS_map08_7_ONTHE = "ON THE SHADOW WOOD"; +TXT_ACS_map08_10_THEDO = "THE DOOR IS BARRED FROM THE INSIDE"; +TXT_ACS_map08_11_YOUHE = "YOU HEAR A DOOR OPEN IN THE DISTANCE"; +TXT_ACS_map09_6_ONESI = "ONE SIXTH OF THE PUZZLE HAS BEEN SOLVED"; +TXT_ACS_map09_7_ONTHE = "ON THE SHADOW WOOD"; +TXT_ACS_map10_6_ONESI = "ONE SIXTH OF THE PUZZLE HAS BEEN SOLVED"; +TXT_ACS_map10_7_ONTHE = "ON THE SHADOW WOOD"; +TXT_ACS_map11_0_ETTIN = " ETTINS LEFT"; +TXT_ACS_map11_1_YOUWA = "YOU WAITED TOO LONG, NOW YOU DIE!"; +TXT_ACS_map11_7_ADOOR = "A DOOR OPENED ON THE FORSAKEN OUTPOST"; +TXT_ACS_map12_9_THISD = "THIS DOOR WON'T OPEN YET"; +TXT_ACS_map13_11_MYSER = "MY SERVANTS CAN SMELL YOUR BLOOD, HUMAN"; +TXT_ACS_map21_0_ADOOR = "A DOOR OPENED IN THE GIBBET"; +TXT_ACS_map21_2_THEDO = "THE DOOR IS BARRED FROM THE INSIDE"; +TXT_ACS_map22_3_APLAT = "A PLATFORM HAS LOWERED IN THE TOWER"; +TXT_ACS_map22_27_YOUHA = "YOU HAVE PLAYED THIS GAME TOO LONG, MORTAL..."; +TXT_ACS_map22_29_ITHIN = "I THINK I SHALL REMOVE YOU FROM THE BOARD"; +TXT_ACS_map23_10_YOUHE = "YOU HEAR A DOOR OPEN UPSTAIRS"; +TXT_ACS_map27_8_WORSH = "WORSHIP ME, AND I MAY YET BE MERCIFUL"; +TXT_ACS_map27_10_THENA = "THEN AGAIN, MAYBE NOT"; +TXT_ACS_map28_6_ONENI = "ONE NINTH OF THE PUZZLE HAS BEEN SOLVED"; +TXT_ACS_map28_7_ONTHE = "ON THE MONASTERY"; +TXT_ACS_map30_6_ONENI = "ONE NINTH OF THE PUZZLE HAS BEEN SOLVED"; +TXT_ACS_map30_7_ONTHE = "ON THE MONASTERY"; +TXT_ACS_map34_1_ONENI = "ONE NINTH OF THE PUZZLE HAS BEEN SOLVED"; +TXT_ACS_map34_2_ONTHE = "ON THE MONASTERY"; +TXT_ACS_map35_0_THEPO = "THE PORTAL HAS BEEN SEALED"; +TXT_ACS_map35_1_CHOOS = "CHOOSE YOUR FATE"; +TXT_ACS_map35_3_THEDO = "THE DOOR IS BARRED FROM THE INSIDE"; +TXT_ACS_map35_12_AREYO = "ARE YOU STRONG ENOUGH"; +TXT_ACS_map35_14_TOFAC = "TO FACE YOUR OWN MASTERS?"; + +// Deathkings texts + +TXT_ACS_map33_6_YOUDA = "YOU DARE BATTLE IN THE READY ROOM?"; +TXT_ACS_map33_7_FORTH = "FOR THAT, YOU SHALL DIE!"; +TXT_ACS_map41_6_THEWA = "THE WATERFALL IS OPEN"; +TXT_ACS_map41_7_THEWA = "THE WATERFALL IS BLOCKED"; +TXT_ACS_map41_8_ADOOR = "A DOOR HAS OPENED IN THE CHAPEL"; +TXT_ACS_map42_4_NOWTH = "NOW THAT'S ODD..."; +TXT_ACS_map44_1_THREE = "THREE MORE PARTS OF THE PUZZLE REMAIN"; +TXT_ACS_map44_2_TWOMO = "TWO MORE PARTS OF THE PUZZLE REMAIN"; +TXT_ACS_map44_3_ONEMO = "ONE MORE PART OF THE PUZZLE REMAINS"; +TXT_ACS_map44_4_THEPU = "THE PUZZLE IS COMPLETE"; +TXT_ACS_map44_6_YOUHA = "YOU HAVE NOT COMPLETED THE PUZZLE"; +TXT_ACS_map44_8_THEFL = "THE FLOOR IS NOT SAFE!"; +TXT_ACS_map44_10_ONETH = "ONE THIRD OF THE PUZZLE IS SOLVED"; +TXT_ACS_map44_11_TWOTH = "TWO THIRDS OF THE PUZZLE IS SOLVED"; +TXT_ACS_map45_1_YOUHE = "YOU HEAR A PLATFORM MOVING IN THE DISTANCE"; +TXT_ACS_map46_0_ITISD = "IT IS DONE..."; +TXT_ACS_map46_1_YOUHA = "YOU HAVE NOT COMPLETED THE PUZZLE"; +TXT_ACS_map46_2_I'MWA = "I'M WARNING YOU..."; +TXT_ACS_map46_3_STUBB = "STUBBORN, AREN'T YOU?"; +TXT_ACS_map46_4_ANDST = "AND STUPID, TOO"; +TXT_ACS_map46_8_ONEFO = "ONE FOURTH OF THIS PUZZLE IS COMPLETE"; +TXT_ACS_map46_9_BADCH = "BAD CHOICE..."; +TXT_ACS_map47_2_THESY = "THE SYMBOLS ARE NOT ALIGNED"; +TXT_ACS_map48_2_THEDO = "THE DOOR WON'T OPEN FROM THIS SIDE"; +TXT_ACS_map50_1_THEDO = "THE DOOR IS BARRED FROM THE OUTSIDE"; +TXT_ACS_map51_5_SACRI = "SACRILEGE !"; +TXT_ACS_map51_6_YOUHA = "YOU HAVE DEFILED ERIC'S TOMB !!"; +TXT_ACS_map51_7_ANDNO = "AND NOW YOU DIE !!!"; +TXT_ACS_map51_8_ONETH = "ONE THIRD OF THE PUZZLE IS SOLVED"; +TXT_ACS_map51_9_TWOTH = "TWO THIRDS OF THE PUZZLE IS SOLVED"; +TXT_ACS_map51_10_THECR = "THE CRYPT IS OPEN"; +TXT_ACS_map51_11_BEWAR = "BEWARE THE SPIDER'S TOMB"; +TXT_ACS_map51_13_YOUHE = "YOU HEAR A PLATFORM RISE OUTSIDE"; +TXT_ACS_map51_14_DOYOU = "DO YOU FEEL LUCKY?"; +TXT_ACS_map51_15_YOUGU = "YOU GUESSED WRONG!"; +TXT_ACS_map51_16_GOODG = "GOOD GUESS"; +TXT_ACS_map51_17_CANYO = "CAN YOU DO ALL THE SCRIPTING FOR MY LEVEL?"; +TXT_ACS_map51_18_DON'T = "DON'T TOUCH MY GLOPPY"; +TXT_ACS_map51_19_VORPA = "VORPAL ?!?!?!"; +TXT_ACS_map51_20_GIMME = "GIMME SOME SUGAR, BABY"; +TXT_ACS_map51_21_DUHUH = "DUH-UHHH..."; +TXT_ACS_map51_22_FILMI = "FILM IN AN HOUR?"; +TXT_ACS_map51_23_IDON' = "I DON'T EVEN GET MY OWN TOMBSTONE - CF"; +TXT_ACS_map51_24_LETNO = "LET NO BLOOD BE SPILT"; +TXT_ACS_map51_25_LETNO = "LET NO HAND BE RAISED IN ANGER"; +TXT_ACS_map52_9_WHODA = "WHO DARES DISTURB OUR SLUMBER?"; +TXT_ACS_map52_10_THEWA = "THE WAY IS OPEN"; +TXT_ACS_map53_2_YOUHA = "YOU HAVE "; +TXT_ACS_map53_3_SWITC = " SWITCHES LEFT"; +TXT_ACS_map53_4_YOUHA = "YOU HAVE ONLY "; +TXT_ACS_map53_5_SWITC = " SWITCH LEFT"; +TXT_ACS_map53_6_THEEX = "THE EXIT IS OPEN"; +TXT_ACS_map54_1_THEDO = "THE DOORS WON'T OPEN FROM THIS SIDE"; +TXT_ACS_map54_4_THEDO = "THE DOORS ARE OPEN..."; +TXT_ACS_map54_5_IFYOU = "...IF YOU ARE READY"; +TXT_ACS_map54_9_ADOOR = "A DOOR HAS OPENED"; +TXT_ACS_map54_10_ONTHE = "ON THE CHANTRY"; +TXT_ACS_map54_11_ABRID = "A BRIDGE HAS BEEN BUILT"; +TXT_ACS_map54_12_ONTHE = "ON THE ABATTOIR"; +TXT_ACS_map54_13_ASTAI = "A STAIR HAS BEEN BUILT"; +TXT_ACS_map54_14_ONTHE = "ON THE DARK WATCH"; +TXT_ACS_map54_15_ONEGE = "ONE GEAR HAS BEEN PLACED"; +TXT_ACS_map54_16_GEARS = " GEARS HAVE BEEN PLACED"; +TXT_ACS_map54_17_ABARR = "A BARRICADE HAS OPENED"; +TXT_ACS_map54_18_ONTHE = "ON THE CLOACA"; +TXT_ACS_map54_20_THEWA = "THE WAY BACK IS OPEN"; +TXT_ACS_map55_9_THEDO = "THE DOOR IS BARRED FROM THE INSIDE"; +TXT_ACS_map56_0_YOUDA = "YOU DARE PLUNDER THE TOMB"; +TXT_ACS_map56_1_OFTHE = "OF THE EXECUTIONER?"; +TXT_ACS_map56_2_PREPA = "PREPARE TO DIE"; +TXT_ACS_map59_1_YOUHA = "YOU HAVE "; +TXT_ACS_map59_2_MORES = " MORE SWITCHES TO FIND"; +TXT_ACS_map59_3_YOUHA = "YOU HAVE ONLY "; +TXT_ACS_map59_4_SWITC = " SWITCH LEFT"; +TXT_ACS_map59_5_THEWA = "THE WAY TO THE TOWER IS OPEN"; +TXT_ACS_map60_3_THEWA = "THE WAY IS OPEN"; From ce22f1db51574d9d6ce0ac7ac39725f0853edc69 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 5 Feb 2019 11:54:29 +0100 Subject: [PATCH 159/164] - fixed: SendPitchLimits is not playsim code so it cannot use the PlayerPawn for anything. This really needs to operate solely on the static players array. --- src/p_user.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/p_user.cpp b/src/p_user.cpp index 5f71235b0..4201514c6 100644 --- a/src/p_user.cpp +++ b/src/p_user.cpp @@ -578,7 +578,7 @@ static int GetSoftPitch(bool down) void player_t::SendPitchLimits() const { - if (this == mo->Level->GetConsolePlayer()) + if (this - players == consoleplayer) { int uppitch, downpitch; From c0e4ef159b83f8e265c1a61710546913abb5e15b Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 5 Feb 2019 13:34:49 +0100 Subject: [PATCH 160/164] - fixed display of "Find help" text in Strife. Also moved this piece of code to a place where a real player exists. This was set at a point where the map wasn't loaded yet which caused a few problems. --- src/g_level.cpp | 20 ++++++++++---------- src/p_user.cpp | 4 ++-- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/g_level.cpp b/src/g_level.cpp index 9d1bd9270..f3609de78 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -484,16 +484,6 @@ void G_InitNew (const char *mapname, bool bTitleLevel) ST_CreateStatusBar(bTitleLevel); setsizeneeded = true; - if (gameinfo.gametype == GAME_Strife || (SBarInfoScript[SCRIPT_CUSTOM] != NULL && SBarInfoScript[SCRIPT_CUSTOM]->GetGameType() == GAME_Strife)) - { - // Set the initial quest log text for Strife. - for (i = 0; i < MAXPLAYERS; ++i) - { - if (playeringame[i]) - players[i].SetLogText ("$TXT_FINDHELP"); - } - } - // [RH] If this map doesn't exist, bomb out if (!P_CheckMapData(mapname)) { @@ -552,6 +542,16 @@ void G_InitNew (const char *mapname, bool bTitleLevel) } G_DoLoadLevel (mapname, 0, false, !savegamerestore); + + if (gameinfo.gametype == GAME_Strife || (SBarInfoScript[SCRIPT_CUSTOM] != nullptr && SBarInfoScript[SCRIPT_CUSTOM]->GetGameType() == GAME_Strife)) + { + // Set the initial quest log text for Strife. + for (i = 0; i < MAXPLAYERS; ++i) + { + if (playeringame[i]) + players[i].SetLogText("$TXT_FINDHELP"); + } + } } // diff --git a/src/p_user.cpp b/src/p_user.cpp index 4201514c6..0f79e5edc 100644 --- a/src/p_user.cpp +++ b/src/p_user.cpp @@ -400,11 +400,11 @@ void player_t::SetLogText (const char *text) { LogText = text; - if (mo->CheckLocalView()) + if (mo && mo->CheckLocalView()) { // Print log text to console AddToConsole(-1, TEXTCOLOR_GOLD); - AddToConsole(-1, GStrings(LogText)); + AddToConsole(-1, LogText[0] == '$'? GStrings(LogText.GetChars()+1) : LogText.GetChars() ); AddToConsole(-1, "\n"); } } From 0936a2fa19af683b5b514c9b82ef084abc083816 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 5 Feb 2019 13:39:38 +0100 Subject: [PATCH 161/164] - exported all texts from Strife's dialogues to the string table. Now all this content can be localized. However, since this is actual game content it was placed in a secondary file in zd_extra.pk3, so that it won't affect the GPL-compatible status of the main one. --- src/p_conversation.cpp | 102 ++- wadsrc/static/language.enu | 128 ---- wadsrc_extra/static/language.enu | 1127 ++++++++++++++++++++++++++++++ 3 files changed, 1209 insertions(+), 148 deletions(-) create mode 100644 wadsrc_extra/static/language.enu diff --git a/src/p_conversation.cpp b/src/p_conversation.cpp index 349824b82..6ae26d308 100644 --- a/src/p_conversation.cpp +++ b/src/p_conversation.cpp @@ -103,10 +103,10 @@ static int ConversationMenuY; static FStrifeDialogueNode *PrevNode; static int StaticLastReply; -static bool LoadScriptFile(FLevelLocals *Level, int lumpnum, FileReader &lump, int numnodes, bool include, int type); -static FStrifeDialogueNode *ReadRetailNode (FLevelLocals *Level, FileReader &lump, uint32_t &prevSpeakerType); -static FStrifeDialogueNode *ReadTeaserNode (FLevelLocals *Level, FileReader &lump, uint32_t &prevSpeakerType); -static void ParseReplies (FStrifeDialogueReply **replyptr, Response *responses); +static bool LoadScriptFile(FLevelLocals *Level, const char *name, int lumpnum, FileReader &lump, int numnodes, bool include, int type); +static FStrifeDialogueNode *ReadRetailNode (FLevelLocals *Level, const char *name, FileReader &lump, uint32_t &prevSpeakerType); +static FStrifeDialogueNode *ReadTeaserNode (FLevelLocals *Level, const char *name, FileReader &lump, uint32_t &prevSpeakerType); +static void ParseReplies (const char *name, int pos, FStrifeDialogueReply **replyptr, Response *responses); static bool DrawConversationMenu (); static void PickConversationReply (int replyindex); static void TerminalResponse (const char *str); @@ -165,7 +165,7 @@ void P_LoadStrifeConversations (FLevelLocals *Level, MapData *map, const char *m { if (map->Size(ML_CONVERSATION) > 0) { - LoadScriptFile (Level, map->lumpnum, map->Reader(ML_CONVERSATION), map->Size(ML_CONVERSATION), false, 0); + LoadScriptFile (Level, nullptr, map->lumpnum, map->Reader(ML_CONVERSATION), map->Size(ML_CONVERSATION), false, 0); } else { @@ -218,11 +218,16 @@ bool LoadScriptFile (FLevelLocals *Level, const char *name, bool include, int ty } FileReader lump = Wads.ReopenLumpReader (lumpnum); - bool res = LoadScriptFile(Level, lumpnum, lump, Wads.LumpLength(lumpnum), include, type); + auto fn = Wads.GetLumpFile(lumpnum); + auto wadname = Wads.GetWadName(fn); + if (stricmp(wadname, "STRIFE0.WAD") && stricmp(wadname, "STRIFE1.WAD") && stricmp(wadname, "SVE.WAD")) name = nullptr; // Only localize IWAD content. + if (name && !stricmp(name, "SCRIPT00")) name = nullptr; // This only contains random string references which already use the string table. + + bool res = LoadScriptFile(Level, name, lumpnum, lump, Wads.LumpLength(lumpnum), include, type); return res; } -static bool LoadScriptFile(FLevelLocals *Level, int lumpnum, FileReader &lump, int numnodes, bool include, int type) +static bool LoadScriptFile(FLevelLocals *Level, const char *name, int lumpnum, FileReader &lump, int numnodes, bool include, int type) { int i; uint32_t prevSpeakerType; @@ -279,11 +284,11 @@ static bool LoadScriptFile(FLevelLocals *Level, int lumpnum, FileReader &lump, i { if (!(gameinfo.flags & GI_SHAREWARE)) { - node = ReadRetailNode (Level, lump, prevSpeakerType); + node = ReadRetailNode (Level, name, lump, prevSpeakerType); } else { - node = ReadTeaserNode (Level, lump, prevSpeakerType); + node = ReadTeaserNode (Level, name, lump, prevSpeakerType); } node->ThisNodeNum = Level->StrifeDialogues.Push(node); } @@ -299,7 +304,17 @@ static bool LoadScriptFile(FLevelLocals *Level, int lumpnum, FileReader &lump, i // //============================================================================ -static FStrifeDialogueNode *ReadRetailNode (FLevelLocals *Level, FileReader &lump, uint32_t &prevSpeakerType) +static FString TokenFromString(const char *speech) +{ + FString token = speech; + token.ToUpper(); + token.ReplaceChars(".,-+!?'", ' '); + token.Substitute(" ", ""); + token.Truncate(5); + return token; +} + +static FStrifeDialogueNode *ReadRetailNode (FLevelLocals *Level, const char *name, FileReader &lump, uint32_t &prevSpeakerType) { FStrifeDialogueNode *node; Speech speech; @@ -309,6 +324,7 @@ static FStrifeDialogueNode *ReadRetailNode (FLevelLocals *Level, FileReader &lum node = new FStrifeDialogueNode; + auto pos = lump.Tell(); lump.Read (&speech, sizeof(speech)); // Byte swap all the ints in the original data @@ -332,7 +348,16 @@ static FStrifeDialogueNode *ReadRetailNode (FLevelLocals *Level, FileReader &lum } // Convert the rest of the data to our own internal format. - node->Dialogue = speech.Dialogue; + + if (name) + { + FStringf label("$TXT_DLG_%s_d%d_%s", name, int(pos), TokenFromString(speech.Dialogue)); + node->Dialogue = label; + } + else + { + node->Dialogue = speech.Dialogue; + } // The speaker's portrait, if any. speech.Dialogue[0] = 0; //speech.Backdrop[8] = 0; @@ -362,7 +387,7 @@ static FStrifeDialogueNode *ReadRetailNode (FLevelLocals *Level, FileReader &lum node->ItemCheckNode = speech.Link; node->Children = NULL; - ParseReplies (&node->Children, &speech.Responses[0]); + ParseReplies (name, int(pos), &node->Children, &speech.Responses[0]); return node; } @@ -375,7 +400,7 @@ static FStrifeDialogueNode *ReadRetailNode (FLevelLocals *Level, FileReader &lum // //============================================================================ -static FStrifeDialogueNode *ReadTeaserNode (FLevelLocals *Level, FileReader &lump, uint32_t &prevSpeakerType) +static FStrifeDialogueNode *ReadTeaserNode (FLevelLocals *Level, const char *name, FileReader &lump, uint32_t &prevSpeakerType) { FStrifeDialogueNode *node; TeaserSpeech speech; @@ -385,6 +410,7 @@ static FStrifeDialogueNode *ReadTeaserNode (FLevelLocals *Level, FileReader &lum node = new FStrifeDialogueNode; + auto pos = lump.Tell() * 1516 / 1488; lump.Read (&speech, sizeof(speech)); // Byte swap all the ints in the original data @@ -407,7 +433,15 @@ static FStrifeDialogueNode *ReadTeaserNode (FLevelLocals *Level, FileReader &lum } // Convert the rest of the data to our own internal format. - node->Dialogue = speech.Dialogue; + if (name) + { + FStringf label("$TXT_DLG_%s_d%d_%s", name, pos, TokenFromString(speech.Dialogue)); + node->Dialogue = label; + } + else + { + node->Dialogue = speech.Dialogue; + } // The Teaser version doesn't have portraits. node->Backdrop = ""; @@ -440,7 +474,7 @@ static FStrifeDialogueNode *ReadTeaserNode (FLevelLocals *Level, FileReader &lum node->ItemCheckNode = 0; node->Children = NULL; - ParseReplies (&node->Children, &speech.Responses[0]); + ParseReplies (name, int(pos), &node->Children, &speech.Responses[0]); return node; } @@ -455,7 +489,7 @@ static FStrifeDialogueNode *ReadTeaserNode (FLevelLocals *Level, FileReader &lum // //============================================================================ -static void ParseReplies (FStrifeDialogueReply **replyptr, Response *responses) +static void ParseReplies (const char *name, int pos, FStrifeDialogueReply **replyptr, Response *responses) { FStrifeDialogueReply *reply; int j, k; @@ -509,24 +543,52 @@ static void ParseReplies (FStrifeDialogueReply **replyptr, Response *responses) reply->ItemCheckRequire.Clear(); reply->ItemCheckExclude.Clear(); + if (name) + { + FStringf label("$TXT_RPLY%d_%s_d%d_%s", j, name, pos, TokenFromString(rsp->Reply)); + reply->Reply = label; + } + else + { + reply->Reply = rsp->Reply; + } + + // If the first item check has a positive amount required, then // add that to the reply string. Otherwise, use the reply as-is. - reply->Reply = rsp->Reply; reply->NeedsGold = (rsp->Count[0] > 0); // QuickYes messages are shown when you meet the item checks. // QuickNo messages are shown when you don't. - if (rsp->Yes[0] == '_' && rsp->Yes[1] == 0) + // Note that empty nodes contain a '_' in retail Strife, a '.' in the teasers and an empty string in SVE. + if (((rsp->Yes[0] == '_' || rsp->Yes[0] == '.') && rsp->Yes[1] == 0) || rsp->Yes[0] == 0) { reply->QuickYes = ""; } else { - reply->QuickYes = rsp->Yes; + if (name) + { + FStringf label("$TXT_RYES%d_%s_d%d_%s", j, name, pos, TokenFromString(rsp->Yes)); + reply->QuickYes = label; + } + else + { + reply->QuickYes = rsp->Yes; + } } if (reply->ItemCheck[0].Item != 0) { - reply->QuickNo = rsp->No; + if (name && strncmp(rsp->No, "NO. ", 4)) // All 'no' nodes starting with 'NO.' won't ever be shown and they all contain broken text. + { + FStringf label("$TXT_RNO%d_%s_d%d_%s", j, name, pos, TokenFromString(rsp->No)); + reply->QuickNo = label; + } + else + { + reply->QuickNo = rsp->No; + } + } else { diff --git a/wadsrc/static/language.enu b/wadsrc/static/language.enu index be78def26..54cb51ef1 100644 --- a/wadsrc/static/language.enu +++ b/wadsrc/static/language.enu @@ -2943,131 +2943,3 @@ MSG_TALISMANRED = "You have a feeling that it wasn't to be touched..."; MSG_TALISMANGREEN = "Whatever it is, it doesn't belong in this world..."; MSG_TALISMANBLUE = "It must do something..."; MSG_TALISMANPOWER = "You have super strength!"; - -// Strings from Hexen's IWAD scripts. Technically they are not needed here for English, they are mainly meant to be documentation for translating. - -TXT_ACS_map01_5_THEDO = "THE DOOR IS LOCKED"; -TXT_ACS_map02_9_GREET = "GREETINGS, MORTAL"; -TXT_ACS_map02_11_AREYO = "ARE YOU READY TO DIE?"; -TXT_ACS_map02_20_ADOOR = "A DOOR OPENED ON THE GUARDIAN OF ICE"; -TXT_ACS_map03_12_THISP = "THIS PATH IS BARRED"; -TXT_ACS_map04_9_ONEHA = "ONE HALF OF THE PUZZLE HAS BEEN SOLVED"; -TXT_ACS_map04_10_ONTHE = "ON THE SEVEN PORTALS"; -TXT_ACS_map04_11_ONETH = "ONE THIRD OF THE PUZZLE HAS BEEN SOLVED"; -TXT_ACS_map04_12_STAIR = "STAIRS HAVE RISEN ON THE SEVEN PORTALS"; -TXT_ACS_map05_6_ONETH = "ONE THIRD OF THE PUZZLE HAS BEEN SOLVED"; -TXT_ACS_map05_7_ONTHE = "ON THE SEVEN PORTALS"; -TXT_ACS_map05_8_STAIR = "STAIRS HAVE RISEN ON THE SEVEN PORTALS"; -TXT_ACS_map05_9_YOUHA = "YOU HAVE TO FIND ANOTHER SWITCH..."; -TXT_ACS_map05_10_STONE = "STONES GRIND ON THE SEVEN PORTALS"; -TXT_ACS_map08_6_ONESI = "ONE SIXTH OF THE PUZZLE HAS BEEN SOLVED"; -TXT_ACS_map08_7_ONTHE = "ON THE SHADOW WOOD"; -TXT_ACS_map08_10_THEDO = "THE DOOR IS BARRED FROM THE INSIDE"; -TXT_ACS_map08_11_YOUHE = "YOU HEAR A DOOR OPEN IN THE DISTANCE"; -TXT_ACS_map09_6_ONESI = "ONE SIXTH OF THE PUZZLE HAS BEEN SOLVED"; -TXT_ACS_map09_7_ONTHE = "ON THE SHADOW WOOD"; -TXT_ACS_map10_6_ONESI = "ONE SIXTH OF THE PUZZLE HAS BEEN SOLVED"; -TXT_ACS_map10_7_ONTHE = "ON THE SHADOW WOOD"; -TXT_ACS_map11_0_ETTIN = " ETTINS LEFT"; -TXT_ACS_map11_1_YOUWA = "YOU WAITED TOO LONG, NOW YOU DIE!"; -TXT_ACS_map11_7_ADOOR = "A DOOR OPENED ON THE FORSAKEN OUTPOST"; -TXT_ACS_map12_9_THISD = "THIS DOOR WON'T OPEN YET"; -TXT_ACS_map13_11_MYSER = "MY SERVANTS CAN SMELL YOUR BLOOD, HUMAN"; -TXT_ACS_map21_0_ADOOR = "A DOOR OPENED IN THE GIBBET"; -TXT_ACS_map21_2_THEDO = "THE DOOR IS BARRED FROM THE INSIDE"; -TXT_ACS_map22_3_APLAT = "A PLATFORM HAS LOWERED IN THE TOWER"; -TXT_ACS_map22_27_YOUHA = "YOU HAVE PLAYED THIS GAME TOO LONG, MORTAL..."; -TXT_ACS_map22_29_ITHIN = "I THINK I SHALL REMOVE YOU FROM THE BOARD"; -TXT_ACS_map23_10_YOUHE = "YOU HEAR A DOOR OPEN UPSTAIRS"; -TXT_ACS_map27_8_WORSH = "WORSHIP ME, AND I MAY YET BE MERCIFUL"; -TXT_ACS_map27_10_THENA = "THEN AGAIN, MAYBE NOT"; -TXT_ACS_map28_6_ONENI = "ONE NINTH OF THE PUZZLE HAS BEEN SOLVED"; -TXT_ACS_map28_7_ONTHE = "ON THE MONASTERY"; -TXT_ACS_map30_6_ONENI = "ONE NINTH OF THE PUZZLE HAS BEEN SOLVED"; -TXT_ACS_map30_7_ONTHE = "ON THE MONASTERY"; -TXT_ACS_map34_1_ONENI = "ONE NINTH OF THE PUZZLE HAS BEEN SOLVED"; -TXT_ACS_map34_2_ONTHE = "ON THE MONASTERY"; -TXT_ACS_map35_0_THEPO = "THE PORTAL HAS BEEN SEALED"; -TXT_ACS_map35_1_CHOOS = "CHOOSE YOUR FATE"; -TXT_ACS_map35_3_THEDO = "THE DOOR IS BARRED FROM THE INSIDE"; -TXT_ACS_map35_12_AREYO = "ARE YOU STRONG ENOUGH"; -TXT_ACS_map35_14_TOFAC = "TO FACE YOUR OWN MASTERS?"; - -// Deathkings texts - -TXT_ACS_map33_6_YOUDA = "YOU DARE BATTLE IN THE READY ROOM?"; -TXT_ACS_map33_7_FORTH = "FOR THAT, YOU SHALL DIE!"; -TXT_ACS_map41_6_THEWA = "THE WATERFALL IS OPEN"; -TXT_ACS_map41_7_THEWA = "THE WATERFALL IS BLOCKED"; -TXT_ACS_map41_8_ADOOR = "A DOOR HAS OPENED IN THE CHAPEL"; -TXT_ACS_map42_4_NOWTH = "NOW THAT'S ODD..."; -TXT_ACS_map44_1_THREE = "THREE MORE PARTS OF THE PUZZLE REMAIN"; -TXT_ACS_map44_2_TWOMO = "TWO MORE PARTS OF THE PUZZLE REMAIN"; -TXT_ACS_map44_3_ONEMO = "ONE MORE PART OF THE PUZZLE REMAINS"; -TXT_ACS_map44_4_THEPU = "THE PUZZLE IS COMPLETE"; -TXT_ACS_map44_6_YOUHA = "YOU HAVE NOT COMPLETED THE PUZZLE"; -TXT_ACS_map44_8_THEFL = "THE FLOOR IS NOT SAFE!"; -TXT_ACS_map44_10_ONETH = "ONE THIRD OF THE PUZZLE IS SOLVED"; -TXT_ACS_map44_11_TWOTH = "TWO THIRDS OF THE PUZZLE IS SOLVED"; -TXT_ACS_map45_1_YOUHE = "YOU HEAR A PLATFORM MOVING IN THE DISTANCE"; -TXT_ACS_map46_0_ITISD = "IT IS DONE..."; -TXT_ACS_map46_1_YOUHA = "YOU HAVE NOT COMPLETED THE PUZZLE"; -TXT_ACS_map46_2_I'MWA = "I'M WARNING YOU..."; -TXT_ACS_map46_3_STUBB = "STUBBORN, AREN'T YOU?"; -TXT_ACS_map46_4_ANDST = "AND STUPID, TOO"; -TXT_ACS_map46_8_ONEFO = "ONE FOURTH OF THIS PUZZLE IS COMPLETE"; -TXT_ACS_map46_9_BADCH = "BAD CHOICE..."; -TXT_ACS_map47_2_THESY = "THE SYMBOLS ARE NOT ALIGNED"; -TXT_ACS_map48_2_THEDO = "THE DOOR WON'T OPEN FROM THIS SIDE"; -TXT_ACS_map50_1_THEDO = "THE DOOR IS BARRED FROM THE OUTSIDE"; -TXT_ACS_map51_5_SACRI = "SACRILEGE !"; -TXT_ACS_map51_6_YOUHA = "YOU HAVE DEFILED ERIC'S TOMB !!"; -TXT_ACS_map51_7_ANDNO = "AND NOW YOU DIE !!!"; -TXT_ACS_map51_8_ONETH = "ONE THIRD OF THE PUZZLE IS SOLVED"; -TXT_ACS_map51_9_TWOTH = "TWO THIRDS OF THE PUZZLE IS SOLVED"; -TXT_ACS_map51_10_THECR = "THE CRYPT IS OPEN"; -TXT_ACS_map51_11_BEWAR = "BEWARE THE SPIDER'S TOMB"; -TXT_ACS_map51_13_YOUHE = "YOU HEAR A PLATFORM RISE OUTSIDE"; -TXT_ACS_map51_14_DOYOU = "DO YOU FEEL LUCKY?"; -TXT_ACS_map51_15_YOUGU = "YOU GUESSED WRONG!"; -TXT_ACS_map51_16_GOODG = "GOOD GUESS"; -TXT_ACS_map51_17_CANYO = "CAN YOU DO ALL THE SCRIPTING FOR MY LEVEL?"; -TXT_ACS_map51_18_DON'T = "DON'T TOUCH MY GLOPPY"; -TXT_ACS_map51_19_VORPA = "VORPAL ?!?!?!"; -TXT_ACS_map51_20_GIMME = "GIMME SOME SUGAR, BABY"; -TXT_ACS_map51_21_DUHUH = "DUH-UHHH..."; -TXT_ACS_map51_22_FILMI = "FILM IN AN HOUR?"; -TXT_ACS_map51_23_IDON' = "I DON'T EVEN GET MY OWN TOMBSTONE - CF"; -TXT_ACS_map51_24_LETNO = "LET NO BLOOD BE SPILT"; -TXT_ACS_map51_25_LETNO = "LET NO HAND BE RAISED IN ANGER"; -TXT_ACS_map52_9_WHODA = "WHO DARES DISTURB OUR SLUMBER?"; -TXT_ACS_map52_10_THEWA = "THE WAY IS OPEN"; -TXT_ACS_map53_2_YOUHA = "YOU HAVE "; -TXT_ACS_map53_3_SWITC = " SWITCHES LEFT"; -TXT_ACS_map53_4_YOUHA = "YOU HAVE ONLY "; -TXT_ACS_map53_5_SWITC = " SWITCH LEFT"; -TXT_ACS_map53_6_THEEX = "THE EXIT IS OPEN"; -TXT_ACS_map54_1_THEDO = "THE DOORS WON'T OPEN FROM THIS SIDE"; -TXT_ACS_map54_4_THEDO = "THE DOORS ARE OPEN..."; -TXT_ACS_map54_5_IFYOU = "...IF YOU ARE READY"; -TXT_ACS_map54_9_ADOOR = "A DOOR HAS OPENED"; -TXT_ACS_map54_10_ONTHE = "ON THE CHANTRY"; -TXT_ACS_map54_11_ABRID = "A BRIDGE HAS BEEN BUILT"; -TXT_ACS_map54_12_ONTHE = "ON THE ABATTOIR"; -TXT_ACS_map54_13_ASTAI = "A STAIR HAS BEEN BUILT"; -TXT_ACS_map54_14_ONTHE = "ON THE DARK WATCH"; -TXT_ACS_map54_15_ONEGE = "ONE GEAR HAS BEEN PLACED"; -TXT_ACS_map54_16_GEARS = " GEARS HAVE BEEN PLACED"; -TXT_ACS_map54_17_ABARR = "A BARRICADE HAS OPENED"; -TXT_ACS_map54_18_ONTHE = "ON THE CLOACA"; -TXT_ACS_map54_20_THEWA = "THE WAY BACK IS OPEN"; -TXT_ACS_map55_9_THEDO = "THE DOOR IS BARRED FROM THE INSIDE"; -TXT_ACS_map56_0_YOUDA = "YOU DARE PLUNDER THE TOMB"; -TXT_ACS_map56_1_OFTHE = "OF THE EXECUTIONER?"; -TXT_ACS_map56_2_PREPA = "PREPARE TO DIE"; -TXT_ACS_map59_1_YOUHA = "YOU HAVE "; -TXT_ACS_map59_2_MORES = " MORE SWITCHES TO FIND"; -TXT_ACS_map59_3_YOUHA = "YOU HAVE ONLY "; -TXT_ACS_map59_4_SWITC = " SWITCH LEFT"; -TXT_ACS_map59_5_THEWA = "THE WAY TO THE TOWER IS OPEN"; -TXT_ACS_map60_3_THEWA = "THE WAY IS OPEN"; diff --git a/wadsrc_extra/static/language.enu b/wadsrc_extra/static/language.enu new file mode 100644 index 000000000..a5780be75 --- /dev/null +++ b/wadsrc_extra/static/language.enu @@ -0,0 +1,1127 @@ +[enu default] + +// Strings from Hexen's IWAD scripts. Technically they are not needed here for English, they are mainly meant to be documentation for translating. + +TXT_ACS_map01_5_THEDO = "THE DOOR IS LOCKED"; +TXT_ACS_map02_9_GREET = "GREETINGS, MORTAL"; +TXT_ACS_map02_11_AREYO = "ARE YOU READY TO DIE?"; +TXT_ACS_map02_20_ADOOR = "A DOOR OPENED ON THE GUARDIAN OF ICE"; +TXT_ACS_map03_12_THISP = "THIS PATH IS BARRED"; +TXT_ACS_map04_9_ONEHA = "ONE HALF OF THE PUZZLE HAS BEEN SOLVED"; +TXT_ACS_map04_10_ONTHE = "ON THE SEVEN PORTALS"; +TXT_ACS_map04_11_ONETH = "ONE THIRD OF THE PUZZLE HAS BEEN SOLVED"; +TXT_ACS_map04_12_STAIR = "STAIRS HAVE RISEN ON THE SEVEN PORTALS"; +TXT_ACS_map05_6_ONETH = "ONE THIRD OF THE PUZZLE HAS BEEN SOLVED"; +TXT_ACS_map05_7_ONTHE = "ON THE SEVEN PORTALS"; +TXT_ACS_map05_8_STAIR = "STAIRS HAVE RISEN ON THE SEVEN PORTALS"; +TXT_ACS_map05_9_YOUHA = "YOU HAVE TO FIND ANOTHER SWITCH..."; +TXT_ACS_map05_10_STONE = "STONES GRIND ON THE SEVEN PORTALS"; +TXT_ACS_map08_6_ONESI = "ONE SIXTH OF THE PUZZLE HAS BEEN SOLVED"; +TXT_ACS_map08_7_ONTHE = "ON THE SHADOW WOOD"; +TXT_ACS_map08_10_THEDO = "THE DOOR IS BARRED FROM THE INSIDE"; +TXT_ACS_map08_11_YOUHE = "YOU HEAR A DOOR OPEN IN THE DISTANCE"; +TXT_ACS_map09_6_ONESI = "ONE SIXTH OF THE PUZZLE HAS BEEN SOLVED"; +TXT_ACS_map09_7_ONTHE = "ON THE SHADOW WOOD"; +TXT_ACS_map10_6_ONESI = "ONE SIXTH OF THE PUZZLE HAS BEEN SOLVED"; +TXT_ACS_map10_7_ONTHE = "ON THE SHADOW WOOD"; +TXT_ACS_map11_0_ETTIN = " ETTINS LEFT"; +TXT_ACS_map11_1_YOUWA = "YOU WAITED TOO LONG, NOW YOU DIE!"; +TXT_ACS_map11_7_ADOOR = "A DOOR OPENED ON THE FORSAKEN OUTPOST"; +TXT_ACS_map12_9_THISD = "THIS DOOR WON'T OPEN YET"; +TXT_ACS_map13_11_MYSER = "MY SERVANTS CAN SMELL YOUR BLOOD, HUMAN"; +TXT_ACS_map21_0_ADOOR = "A DOOR OPENED IN THE GIBBET"; +TXT_ACS_map21_2_THEDO = "THE DOOR IS BARRED FROM THE INSIDE"; +TXT_ACS_map22_3_APLAT = "A PLATFORM HAS LOWERED IN THE TOWER"; +TXT_ACS_map22_27_YOUHA = "YOU HAVE PLAYED THIS GAME TOO LONG, MORTAL..."; +TXT_ACS_map22_29_ITHIN = "I THINK I SHALL REMOVE YOU FROM THE BOARD"; +TXT_ACS_map23_10_YOUHE = "YOU HEAR A DOOR OPEN UPSTAIRS"; +TXT_ACS_map27_8_WORSH = "WORSHIP ME, AND I MAY YET BE MERCIFUL"; +TXT_ACS_map27_10_THENA = "THEN AGAIN, MAYBE NOT"; +TXT_ACS_map28_6_ONENI = "ONE NINTH OF THE PUZZLE HAS BEEN SOLVED"; +TXT_ACS_map28_7_ONTHE = "ON THE MONASTERY"; +TXT_ACS_map30_6_ONENI = "ONE NINTH OF THE PUZZLE HAS BEEN SOLVED"; +TXT_ACS_map30_7_ONTHE = "ON THE MONASTERY"; +TXT_ACS_map34_1_ONENI = "ONE NINTH OF THE PUZZLE HAS BEEN SOLVED"; +TXT_ACS_map34_2_ONTHE = "ON THE MONASTERY"; +TXT_ACS_map35_0_THEPO = "THE PORTAL HAS BEEN SEALED"; +TXT_ACS_map35_1_CHOOS = "CHOOSE YOUR FATE"; +TXT_ACS_map35_3_THEDO = "THE DOOR IS BARRED FROM THE INSIDE"; +TXT_ACS_map35_12_AREYO = "ARE YOU STRONG ENOUGH"; +TXT_ACS_map35_14_TOFAC = "TO FACE YOUR OWN MASTERS?"; + +// Deathkings texts + +TXT_ACS_map33_6_YOUDA = "YOU DARE BATTLE IN THE READY ROOM?"; +TXT_ACS_map33_7_FORTH = "FOR THAT, YOU SHALL DIE!"; +TXT_ACS_map41_6_THEWA = "THE WATERFALL IS OPEN"; +TXT_ACS_map41_7_THEWA = "THE WATERFALL IS BLOCKED"; +TXT_ACS_map41_8_ADOOR = "A DOOR HAS OPENED IN THE CHAPEL"; +TXT_ACS_map42_4_NOWTH = "NOW THAT'S ODD..."; +TXT_ACS_map44_1_THREE = "THREE MORE PARTS OF THE PUZZLE REMAIN"; +TXT_ACS_map44_2_TWOMO = "TWO MORE PARTS OF THE PUZZLE REMAIN"; +TXT_ACS_map44_3_ONEMO = "ONE MORE PART OF THE PUZZLE REMAINS"; +TXT_ACS_map44_4_THEPU = "THE PUZZLE IS COMPLETE"; +TXT_ACS_map44_6_YOUHA = "YOU HAVE NOT COMPLETED THE PUZZLE"; +TXT_ACS_map44_8_THEFL = "THE FLOOR IS NOT SAFE!"; +TXT_ACS_map44_10_ONETH = "ONE THIRD OF THE PUZZLE IS SOLVED"; +TXT_ACS_map44_11_TWOTH = "TWO THIRDS OF THE PUZZLE IS SOLVED"; +TXT_ACS_map45_1_YOUHE = "YOU HEAR A PLATFORM MOVING IN THE DISTANCE"; +TXT_ACS_map46_0_ITISD = "IT IS DONE..."; +TXT_ACS_map46_1_YOUHA = "YOU HAVE NOT COMPLETED THE PUZZLE"; +TXT_ACS_map46_2_I'MWA = "I'M WARNING YOU..."; +TXT_ACS_map46_3_STUBB = "STUBBORN, AREN'T YOU?"; +TXT_ACS_map46_4_ANDST = "AND STUPID, TOO"; +TXT_ACS_map46_8_ONEFO = "ONE FOURTH OF THIS PUZZLE IS COMPLETE"; +TXT_ACS_map46_9_BADCH = "BAD CHOICE..."; +TXT_ACS_map47_2_THESY = "THE SYMBOLS ARE NOT ALIGNED"; +TXT_ACS_map48_2_THEDO = "THE DOOR WON'T OPEN FROM THIS SIDE"; +TXT_ACS_map50_1_THEDO = "THE DOOR IS BARRED FROM THE OUTSIDE"; +TXT_ACS_map51_5_SACRI = "SACRILEGE !"; +TXT_ACS_map51_6_YOUHA = "YOU HAVE DEFILED ERIC'S TOMB !!"; +TXT_ACS_map51_7_ANDNO = "AND NOW YOU DIE !!!"; +TXT_ACS_map51_8_ONETH = "ONE THIRD OF THE PUZZLE IS SOLVED"; +TXT_ACS_map51_9_TWOTH = "TWO THIRDS OF THE PUZZLE IS SOLVED"; +TXT_ACS_map51_10_THECR = "THE CRYPT IS OPEN"; +TXT_ACS_map51_11_BEWAR = "BEWARE THE SPIDER'S TOMB"; +TXT_ACS_map51_13_YOUHE = "YOU HEAR A PLATFORM RISE OUTSIDE"; +TXT_ACS_map51_14_DOYOU = "DO YOU FEEL LUCKY?"; +TXT_ACS_map51_15_YOUGU = "YOU GUESSED WRONG!"; +TXT_ACS_map51_16_GOODG = "GOOD GUESS"; +TXT_ACS_map51_17_CANYO = "CAN YOU DO ALL THE SCRIPTING FOR MY LEVEL?"; +TXT_ACS_map51_18_DON'T = "DON'T TOUCH MY GLOPPY"; +TXT_ACS_map51_19_VORPA = "VORPAL ?!?!?!"; +TXT_ACS_map51_20_GIMME = "GIMME SOME SUGAR, BABY"; +TXT_ACS_map51_21_DUHUH = "DUH-UHHH..."; +TXT_ACS_map51_22_FILMI = "FILM IN AN HOUR?"; +TXT_ACS_map51_23_IDON' = "I DON'T EVEN GET MY OWN TOMBSTONE - CF"; +TXT_ACS_map51_24_LETNO = "LET NO BLOOD BE SPILT"; +TXT_ACS_map51_25_LETNO = "LET NO HAND BE RAISED IN ANGER"; +TXT_ACS_map52_9_WHODA = "WHO DARES DISTURB OUR SLUMBER?"; +TXT_ACS_map52_10_THEWA = "THE WAY IS OPEN"; +TXT_ACS_map53_2_YOUHA = "YOU HAVE "; +TXT_ACS_map53_3_SWITC = " SWITCHES LEFT"; +TXT_ACS_map53_4_YOUHA = "YOU HAVE ONLY "; +TXT_ACS_map53_5_SWITC = " SWITCH LEFT"; +TXT_ACS_map53_6_THEEX = "THE EXIT IS OPEN"; +TXT_ACS_map54_1_THEDO = "THE DOORS WON'T OPEN FROM THIS SIDE"; +TXT_ACS_map54_4_THEDO = "THE DOORS ARE OPEN..."; +TXT_ACS_map54_5_IFYOU = "...IF YOU ARE READY"; +TXT_ACS_map54_9_ADOOR = "A DOOR HAS OPENED"; +TXT_ACS_map54_10_ONTHE = "ON THE CHANTRY"; +TXT_ACS_map54_11_ABRID = "A BRIDGE HAS BEEN BUILT"; +TXT_ACS_map54_12_ONTHE = "ON THE ABATTOIR"; +TXT_ACS_map54_13_ASTAI = "A STAIR HAS BEEN BUILT"; +TXT_ACS_map54_14_ONTHE = "ON THE DARK WATCH"; +TXT_ACS_map54_15_ONEGE = "ONE GEAR HAS BEEN PLACED"; +TXT_ACS_map54_16_GEARS = " GEARS HAVE BEEN PLACED"; +TXT_ACS_map54_17_ABARR = "A BARRICADE HAS OPENED"; +TXT_ACS_map54_18_ONTHE = "ON THE CLOACA"; +TXT_ACS_map54_20_THEWA = "THE WAY BACK IS OPEN"; +TXT_ACS_map55_9_THEDO = "THE DOOR IS BARRED FROM THE INSIDE"; +TXT_ACS_map56_0_YOUDA = "YOU DARE PLUNDER THE TOMB"; +TXT_ACS_map56_1_OFTHE = "OF THE EXECUTIONER?"; +TXT_ACS_map56_2_PREPA = "PREPARE TO DIE"; +TXT_ACS_map59_1_YOUHA = "YOU HAVE "; +TXT_ACS_map59_2_MORES = " MORE SWITCHES TO FIND"; +TXT_ACS_map59_3_YOUHA = "YOU HAVE ONLY "; +TXT_ACS_map59_4_SWITC = " SWITCH LEFT"; +TXT_ACS_map59_5_THEWA = "THE WAY TO THE TOWER IS OPEN"; +TXT_ACS_map60_3_THEWA = "THE WAY IS OPEN"; + +// All content from Strife's IWAD dialogues + +TXT_DLG_SCRIPT01_d0_IDONT = "I DON'T WANT ANY TROUBLE, STAY AWAY FROM ME. I'VE HAD ENOUGH TROUBLE WITH WHAT THAT BASTARD HARRIS DID TO ME. HE PROMISED ME MONEY, INSTEAD I GET TO LOOK FORWARD TO BEING "QUESTIONED" BY THE PROGRAMMER."; + +TXT_DLG_SCRIPT02_d0_ILLHE = "I'LL HELP YOU IF YOU HELP ME. FIVE PIECES OF GOLD AND I'LL TELL ALL I KNOW."; +TXT_RPLY0_SCRIPT02_d0_HERES = "HERE'S THE GOLD."; +TXT_RYES0_SCRIPT02_d0_BESTE = "BE STEALTHY WHEN YOU KILL, YOU WON'T SET OFF ALARMS."; +TXT_RNO0_SCRIPT02_d0_WELLI = "WELL, I WON'T BE TELLING YOU ANYTHING FOR FREE!"; +TXT_DLG_SCRIPT02_d1516_HAVEY = "HAVE YOU BY ANY CHANCE GOT ANOTHER 5 GOLD ON YOU?"; +TXT_RPLY0_SCRIPT02_d1516_5GOLD = "5 GOLD."; +TXT_RYES0_SCRIPT02_d1516_WELLP = "WELL, POISON BOLTS CAN KILL THE GUARDS INSTANTLY AND WON'T SET OFF THE ALARMS."; +TXT_RNO0_SCRIPT02_d1516_NOSIR = "NO SIR, I WON'T BE TELLING YOU ANYTHING FOR FREE!"; +TXT_DLG_SCRIPT02_d3032_YOUVE = "YOU'VE WRUNG THE LAST BIT OF GOSSIP OUT OF ME ALREADY!"; +TXT_DLG_SCRIPT02_d4548_WHATC = "WHAT CAN I GET FOR YOU?"; +TXT_RPLY0_SCRIPT02_d4548_ASSAU = "ASSAULT GUN"; +TXT_RYES0_SCRIPT02_d4548_HEREY = "HERE YOU GO."; +TXT_RNO0_SCRIPT02_d4548_YOUCA = "YOU CAN'T AFFORD THAT RIGHT NOW."; +TXT_RPLY1_SCRIPT02_d4548_CLIPO = "CLIP OF BULLETS"; +TXT_RYES1_SCRIPT02_d4548_THANK = "THANKS."; +TXT_RNO1_SCRIPT02_d4548_COMEO = "COME ON, 10 GOLD."; +TXT_RPLY2_SCRIPT02_d4548_AMMOB = "AMMO BOX"; +TXT_RYES2_SCRIPT02_d4548_HERES = "HERE'S YOUR AMMO."; +TXT_RNO2_SCRIPT02_d4548_MAYBE = "MAYBE SOME OTHER TIME."; +TXT_DLG_SCRIPT02_d6064_GOODN = "GOOD NEWS FROM THE FRONT FOR A CHANGE. MACIL SENT YOU FOR A REWARD AND TRAINING. HE'S INSTRUCTED ME TO GIVE THEM TO YOU."; +TXT_RPLY0_SCRIPT02_d6064_THANK = "THANKS."; +TXT_RYES0_SCRIPT02_d6064_GLADT = "GLAD TO BE OF SERVICE."; +TXT_DLG_SCRIPT02_d7580_ALLRI = "ALL RIGHT, HERE'S A FEW POINTERS ON WHAT TO DO: DON'T GET IN THE WAY OF CRUSADERS: FIRING SHORT BURSTS FROM YOUR ASSAULT GUN KEEPS IT ON TARGET."; +TXT_RPLY0_SCRIPT02_d7580_ISTHA = "IS THAT IT?"; +TXT_RYES0_SCRIPT02_d7580_LOOKY = "LOOK, YOU'LL LEARN MORE LATER."; +TXT_DLG_SCRIPT02_d9096_ITHIN = "I THINK I CAN CONVERT A FLAMETHROWER FROM ONE OF THE CRUSADERS FOR USE BY A HUMAN. OH, ANYTHING ELSE I CAN GET YOU?"; +TXT_RPLY0_SCRIPT02_d9096_FLAME = "FLAMETHROWER."; +TXT_RYES0_SCRIPT02_d9096_IKNEW = "I KNEW THAT'D WORK! HERE YOU GO, TAKE HER FOR A SPIN!"; +TXT_RNO0_SCRIPT02_d9096_LISTE = "LISTEN, I CAN'T MAKE ANYTHING WITHOUT THE RIGHT PARTS!"; +TXT_RPLY1_SCRIPT02_d9096_ASSAU = "ASSAULT GUN"; +TXT_RYES1_SCRIPT02_d9096_WELLH = "WELL, HERE YOU GO SIR!"; +TXT_RNO1_SCRIPT02_d9096_OBVIO = "OBVIOUSLY, YOU CAN'T AFFORD THAT RIGHT NOW."; +TXT_RPLY2_SCRIPT02_d9096_CLIPO = "CLIP OF BULLETS"; +TXT_RYES2_SCRIPT02_d9096_THANK = "THANKS."; +TXT_RNO2_SCRIPT02_d9096_COMEO = "COME ON, 10 GOLD."; +TXT_RPLY3_SCRIPT02_d9096_AMMOB = "AMMO BOX"; +TXT_RYES3_SCRIPT02_d9096_HERES = "HERE'S YOUR AMMO."; +TXT_RNO3_SCRIPT02_d9096_MAYBE = "MAYBE SOME OTHER TIME. GOODBYE!"; +TXT_DLG_SCRIPT02_d10612_NOWTH = "NOW THAT YOU HAVE THE FLAMETHROWER, IS THERE ANYTHING ELSE I CAN GET YOU?"; +TXT_RPLY0_SCRIPT02_d10612_ASSAU = "ASSAULT GUN"; +TXT_RYES0_SCRIPT02_d10612_HEREY = "HERE YOU GO."; +TXT_RNO0_SCRIPT02_d10612_YOUCA = "YOU CAN'T AFFORD THAT RIGHT NOW."; +TXT_RPLY1_SCRIPT02_d10612_CLIPO = "CLIP OF BULLETS"; +TXT_RYES1_SCRIPT02_d10612_THANK = "THANKS."; +TXT_RNO1_SCRIPT02_d10612_COMEO = "COME ON, 10 GOLD."; +TXT_RPLY2_SCRIPT02_d10612_AMMOB = "AMMO BOX"; +TXT_RYES2_SCRIPT02_d10612_HERES = "HERE'S YOUR AMMO."; +TXT_RNO2_SCRIPT02_d10612_MAYBE = "MAYBE SOME OTHER TIME."; +TXT_DLG_SCRIPT02_d12128_NOWTH = "NOW THAT YOU HAVE THE FLAMETHROWER, IS THERE ANYTHING ELSE I CAN GET YOU?"; +TXT_RPLY0_SCRIPT02_d12128_CLIPO = "CLIP OF BULLETS"; +TXT_RYES0_SCRIPT02_d12128_THANK = "THANKS."; +TXT_RNO0_SCRIPT02_d12128_COMEO = "COME ON, 10 GOLD."; +TXT_RPLY1_SCRIPT02_d12128_AMMOB = "AMMO BOX"; +TXT_RYES1_SCRIPT02_d12128_HERES = "HERE'S YOUR AMMO."; +TXT_RNO1_SCRIPT02_d12128_MAYBE = "MAYBE SOME OTHER TIME."; +TXT_RPLY2_SCRIPT02_d12128_PHOSP = "PHOSPHOR GRENADES"; +TXT_RYES2_SCRIPT02_d12128_THANK = "THANKS."; +TXT_RNO2_SCRIPT02_d12128_YOUDO = "YOU DON'T HAVE ENOUGH"; +TXT_RPLY3_SCRIPT02_d12128_POISO = "POISON BOLTS"; +TXT_RYES3_SCRIPT02_d12128_WORTH = "WORTH EVERY GOLD!"; +TXT_RNO3_SCRIPT02_d12128_COMEO = "COME ON, 200 GOLD!"; +TXT_DLG_SCRIPT02_d13644_ICANT = "I CAN'T BELIEVE THAT I GOT STUCK WITH THIS DUTY. THEY SAY THAT SOMETHING EVIL CAME UP OUT OF THIS SEWER GATE... NOW I GET TO STAND HERE UNTIL IT COMES UP AGAIN!"; +TXT_RPLY0_SCRIPT02_d13644_WHATG = "WHAT GATE?"; +TXT_RYES0_SCRIPT02_d13644_THESE = "THE SEWER OVERFLOW GATE."; +TXT_DLG_SCRIPT02_d15160_HELLO = "HELLO FRIEND. WHAT CAN I GET FOR YOU?"; +TXT_RPLY0_SCRIPT02_d15160_ELECT = "ELECTRIC BOLTS"; +TXT_RYES0_SCRIPT02_d15160_YOUGO = "you got the ELECTRIC BOLTS."; +TXT_RPLY1_SCRIPT02_d15160_AMMOS = "AMMO SATCHEL"; +TXT_RYES1_SCRIPT02_d15160_THANK = "THANK YOU. ANYTHING ELSE?"; +TXT_RNO1_SCRIPT02_d15160_YOUCA = "YOU CAN'T AFFORD THAT, GOOD DAY."; +TXT_DLG_SCRIPT02_d16676_WHATC = "WHAT CAN I GET FOR YOU?"; +TXT_RPLY0_SCRIPT02_d16676_ELECT = "ELECTRIC BOLTS"; +TXT_RYES0_SCRIPT02_d16676_YOUGO = "you got the ELECTRIC BOLTS."; +TXT_RPLY1_SCRIPT02_d16676_AMMOS = "AMMO SATCHEL"; +TXT_RYES1_SCRIPT02_d16676_THANK = "THANK YOU, ANYTHING ELSE?"; +TXT_RNO1_SCRIPT02_d16676_YOUCA = "YOU CAN'T AFFORD THAT, GOOD DAY TO YOU!"; +TXT_DLG_SCRIPT02_d18192_WELCO = "WELCOME. WHAT MAY I SHOW YOU?"; +TXT_RPLY0_SCRIPT02_d18192_ENVIR = "ENVIRONMENTAL SUIT"; +TXT_RYES0_SCRIPT02_d18192_WELLH = "WELL, HERE YOU ARE."; +TXT_RNO0_SCRIPT02_d18192_IMSOR = "I'M SORRY BUT YOU DON'T HAVE ENOUGH MONEY FOR THAT."; +TXT_RPLY1_SCRIPT02_d18192_LEATH = "LEATHER ARMOR"; +TXT_RYES1_SCRIPT02_d18192_HEREY = "HERE YOU ARE."; +TXT_RNO1_SCRIPT02_d18192_PERHA = "PERHAPS SOME OTHER TIME?"; +TXT_RPLY2_SCRIPT02_d18192_METAL = "METAL ARMOR"; +TXT_RYES2_SCRIPT02_d18192_WEARI = "WEAR IT IN GOOD HEALTH."; +TXT_RNO2_SCRIPT02_d18192_COMEB = "COME BACK WHEN YOU CAN AFFORD TO BUY SOMETHING YOU LOUT!"; +TXT_DLG_SCRIPT02_d19708_WELCO = "WELCOME. WHAT MAY I SHOW YOU?"; +TXT_RPLY0_SCRIPT02_d19708_ENVIR = "ENVIRONMENTAL SUIT"; +TXT_RYES0_SCRIPT02_d19708_WELLH = "WELL, HERE YOU ARE."; +TXT_RNO0_SCRIPT02_d19708_IMSOR = "I'M SORRY BUT YOU DON'T HAVE ENOUGH MONEY FOR THAT."; +TXT_RPLY1_SCRIPT02_d19708_LEATH = "LEATHER ARMOR"; +TXT_RYES1_SCRIPT02_d19708_HEREY = "HERE YOU ARE."; +TXT_RNO1_SCRIPT02_d19708_PERHA = "PERHAPS SOME OTHER TIME?"; +TXT_RPLY2_SCRIPT02_d19708_METAL = "METAL ARMOR"; +TXT_RYES2_SCRIPT02_d19708_WEARI = "WEAR IT IN GOOD HEALTH."; +TXT_RNO2_SCRIPT02_d19708_COMEB = "COME BACK WHEN YOU CAN AFFORD TO BUY SOMETHING YOU LOUT!"; +TXT_DLG_SCRIPT02_d21224_HOWMA = "HOW MAY I ASSIST YOU?"; +TXT_RPLY0_SCRIPT02_d21224_MEDPA = "MED PATCH"; +TXT_RYES0_SCRIPT02_d21224_HERES = "HERE'S YOUR PATCH."; +TXT_RNO0_SCRIPT02_d21224_YOUNE = "YOU NEED 10 GOLD FOR THAT."; +TXT_RPLY1_SCRIPT02_d21224_MEDIC = "MEDICAL KIT"; +TXT_RYES1_SCRIPT02_d21224_THANK = "THANK YOU."; +TXT_RNO1_SCRIPT02_d21224_IWISH = "I WISH I COULD GIVE THEM AWAY, BUT THEY COST 25 GOLD."; +TXT_RPLY2_SCRIPT02_d21224_FIELD = "FIELD SURGERY KIT"; +TXT_RYES2_SCRIPT02_d21224_THERE = "THERE YOU GO. TAKE CARE NOW."; +TXT_RNO2_SCRIPT02_d21224_WELLM = "WELL, MAYBE YOU CAN AFFORD SOME MED PATCHES?"; +TXT_DLG_SCRIPT02_d22740_IHOPE = "I HOPE MACIL KNOWS WHAT HE'S DOING. IF THE ORDER FINDS OUT I'M HELPING THE FRONT I'M AS GOOD AS DEAD... NOT THAT THIS MATTERS TO YOU ANY. THE FRONT'S MEDIC GAVE ME AN UPGRADE CHIP FOR YOU, ARE YOU READY? "; +TXT_RPLY0_SCRIPT02_d22740_YESIM = "YES, I'M READY."; +TXT_RYES0_SCRIPT02_d22740_WELLT = "WELL THEN, THIS WON'T TAKE BUT A SECOND. THERE, DONE ALREADY."; +TXT_DLG_SCRIPT02_d24256_HOWMA = "HOW MAY I ASSIST YOU?"; +TXT_RPLY0_SCRIPT02_d24256_MEDPA = "MED PATCH"; +TXT_RYES0_SCRIPT02_d24256_HERES = "HERE'S YOUR PATCH."; +TXT_RNO0_SCRIPT02_d24256_YOUNE = "YOU NEED 10 GOLD FOR THAT."; +TXT_RPLY1_SCRIPT02_d24256_MEDIC = "MEDICAL KIT"; +TXT_RYES1_SCRIPT02_d24256_THANK = "THANK YOU."; +TXT_RNO1_SCRIPT02_d24256_IWISH = "I WISH I COULD GIVE THEM AWAY, BUT THEY COST 25 GOLD."; +TXT_RPLY2_SCRIPT02_d24256_FIELD = "FIELD SURGERY KIT"; +TXT_RYES2_SCRIPT02_d24256_THERE = "THERE YOU GO. TAKE CARE NOW."; +TXT_RNO2_SCRIPT02_d24256_WELLM = "WELL, MAYBE YOU CAN AFFORD SOME MED PATCHES?"; +TXT_DLG_SCRIPT02_d25772_HELLO = "HELLO STRANGER, I HAVEN'T SEEN YOU AROUND HERE BEFORE. LET ME GIVE YOU A PIECE OF FREE ADVICE. I'D BE CAREFUL IF I WERE YOU. THE ORDER DOES NOT TOLERATE FREE WILL, AND THEIR JUSTICE IS SWIFT."; +TXT_RPLY0_SCRIPT02_d25772_WHATS = "WHAT'S THE WORD?"; +TXT_RYES0_SCRIPT02_d25772_THEWO = "THE WORD IS... THE SEWERS HOLD MORE THAN JUST RATS AND ROBOTS."; +TXT_DLG_SCRIPT02_d27288_WHATC = "WHAT CAN I DO FOR YOU NOW?"; +TXT_RPLY0_SCRIPT02_d27288_MOREI = "MORE INFO."; +TXT_RYES0_SCRIPT02_d27288_THEGO = "THE GOVERNOR IS A SIMPLE REMINDER TO US THAT WE AREN'T FREE PEOPLE ANYMORE."; +TXT_RNO0_SCRIPT02_d27288_COMEB = "COME BACK WHEN YOU GET SOME GOLD."; +TXT_DLG_SCRIPT02_d28804_WELLY = "WELL, YOU'RE ASKING A LOT OF QUESTIONS FOR SOMEONE WHO'S NOT TRYING TO DIE. MAKE SURE YOU DON'T GO AND GET YOURSELF KILLED, OR WORSE."; +TXT_RPLY0_SCRIPT02_d28804_MOREI = "MORE INFO."; +TXT_RYES0_SCRIPT02_d28804_THERE = "THERE'S MORE TO THE ORDER THAN MEETS THE EYE."; +TXT_RNO0_SCRIPT02_d28804_WELLT = "WE'LL TALK WHEN YOU GET GOLD!"; +TXT_DLG_SCRIPT02_d30320_THATS = "THAT'S IT FRIEND, THE WELL OF KNOWLEDGE HAS RUN DRY. I'VE TOLD YOU MORE THAN I SHOULD HAVE ANYWAY. GOOD LUCK... AND DON'T COME BACK."; +TXT_DLG_SCRIPT02_d31836_HEYIM = "HEY, I'M ONLY HERE IN CASE OF AN EMERGENCY. IF THE CORE BREACHES, THEN I MAKE SURE NO ONE GETS IN... OR OUT."; +TXT_DLG_SCRIPT02_d33352_WATCH = "WATCH YOUR STEP, PEASANT!"; +TXT_DLG_SCRIPT02_d34868_WEREG = "WE'RE GOING TO KILL YOU! "; +TXT_DLG_SCRIPT02_d36384_WHOIN = "WHO IN THE BLAZES ARE YOU? NO ONE'S SUPPOSED TO BE LOITERING ABOUT IN THIS AREA!"; +TXT_DLG_SCRIPT02_d37900_YOUTH = "YOU THERE, NOBODY'S ALLOWED IN HERE. MOVE ALONG!"; +TXT_DLG_SCRIPT02_d39416_IRALE = "IRALE WILL SET YOU RIGHT UP!"; +TXT_DLG_SCRIPT02_d40932_IMKIN = "I'M KINDA A TALENT BROKER FOR THE REBELS. A GUY WHO'S AS GOOD AS YOU COULD MAKE A LOT OF GOLD... IF YOU HOOKED UP WITH THE RIGHT PEOPLE."; +TXT_RPLY0_SCRIPT02_d40932_IMINT = "I'M INTERESTED."; +TXT_RPLY1_SCRIPT02_d40932_SCREW = "SCREW THE REBELS!"; +TXT_DLG_SCRIPT02_d42448_NONOS = "NO, NO SECOND CHANCE. OH GUARDS, KILL HIM."; +TXT_DLG_SCRIPT02_d43964_GOODC = "GOOD CHOICE. THE ORDER'S SANCTUARY BY THE RIVER IS THEIR UNOFFICIAL TORTURE CHAMBER. HIDDEN INSIDE THERE'S A GOLDEN CHALICE. YOU SWIPE IT AND REAP YOUR REWARD."; +TXT_RPLY0_SCRIPT02_d43964_HOWAM = "HOW AM I SUPPOSED TO DO THAT?"; +TXT_DLG_SCRIPT02_d45480_HERES = "HERE'S A CROSSBOW, JUST AIM STRAIGHT AND --SPLAT--. REMEMBER, GRAB THE FANCY CUP AND GET TO THE TAVERN."; +TXT_RPLY0_SCRIPT02_d45480_COOLI = "COOL. I'll get it."; +TXT_DLG_SCRIPT02_d46996_WHATA = "WHAT ARE YOU WAITING FOR? BRING ME THAT CHALICE."; +TXT_DLG_SCRIPT02_d48512_HEYIK = "HEY, I KNOW, KINDA LOOKS LIKE A SET-UP. I WOULD NEVER DO THAT TO SUCH A GREAT KILLING MACHINE. GOT THE ITEM? GREAT! NOW GET READY, GOLD AND GLORY JUST LIKE I PROMISED. TAKE THIS KEY AND THE GOVERNOR WILL REWARD YOU."; +TXT_RPLY0_SCRIPT02_d48512_HEDBE = "HE'D BETTER. FOR YOUR SAKE!"; +TXT_RPLY1_SCRIPT02_d48512_WHATW = "WHAT! WHERE'S MY MONEY?"; +TXT_DLG_SCRIPT02_d50028_GETLO = "GET LOST KID, YOU BOTHER ME."; +TXT_DLG_SCRIPT02_d51544_NOSEC = "NO SECOND CHANCE. OH GUARDS, KILL HIM."; +TXT_DLG_SCRIPT02_d53060_FIRST = "FIRST THEY SLAUGHTER THOUSANDS, NOW THEY WANT ALL ABLE-BODIED PEASANTS FOR UNSPECIFIED "TESTS". HOW DOES THE ORDER EXPECT ME TO KEEP THE PEACE? WHAT THE HELL DO YOU WANT?"; +TXT_RPLY0_SCRIPT02_d53060_APRIS = "A PRISON PASS, LET'S DEAL."; +TXT_DLG_SCRIPT02_d54576_ILIKE = "I LIKE YOU ALREADY. I HAVE TWO CHORES THAT I DON'T WANT TO DO MYSELF. ONE IS MESSY, THE OTHER BLOODY."; +TXT_RPLY0_SCRIPT02_d54576_CALLM = "CALL ME THE CLEANER"; +TXT_RPLY1_SCRIPT02_d54576_IMNOT = "I'M NOT SQUEAMISH"; +TXT_DLG_SCRIPT02_d56092_ONEOF = "ONE OF MY MINIONS IS STEALING POWER WITH A TAP ON THE MAINS SOMEWHERE. FIND IT AND TRUNCATE HIS SUPPLY AND I'LL PROVIDE YOU WITH WHAT YOU WANT. BRING ME SOMETHING AS A TOKEN."; +TXT_RPLY0_SCRIPT02_d56092_WHERE = "WHERE DO I FIND THIS TAP?"; +TXT_DLG_SCRIPT02_d57608_IFIKN = "IF I KNEW, IT WOULDN'T BE A CHORE NOW WOULD IT? USE YOUR CHARM, BUT SHUT OFF HIS SUPPLY."; +TXT_DLG_SCRIPT02_d59124_TELLY = "TELL YOU WHAT, THERE'S A LYING SACK NAMED DERWIN WHO HAS BEEN SELLING CHILDREN TO THE ORDER. I WON'T TOLERATE THAT KIND OF DEPRAVITY. NOT WITHOUT MY CUT. DERWIN WORKS IN THE WAREHOUSE. KILL HIM AND BRING ME HIS, EAR, AND I'LL SEE WHAT I CAN DO."; +TXT_RPLY0_SCRIPT02_d59124_HOWDO = "HOW DO I GET IN?"; +TXT_DLG_SCRIPT02_d60640_THISK = "THIS KEY WILL GET YOU INTO THE POWER STATION. ON SECOND THOUGHT, CUT OFF THE EAR AND THEN KILL HIM. MUCH BETTER."; +TXT_DLG_SCRIPT02_d62156_OHIJU = "OH, I JUST LOVE SOUVENIRS. HERE, THIS WILL GET YOU INTO THE PRISON. TALK TO WARDEN MONTAG. WHATEVER YOU DO AFTER THAT, I DON'T WANT TO KNOW."; +TXT_RPLY0_SCRIPT02_d62156_THANK = "THANKS."; +TXT_DLG_SCRIPT02_d63672_GIVEY = "GIVE YOU A HINT. WHEN I STOP TALKING TO YOU, YOU LEAVE."; +TXT_DLG_SCRIPT02_d65188_DOYOU = "DO YOU HAVE GOOD NEWS FOR ME? I'M ALL EARS."; +TXT_RPLY0_SCRIPT02_d65188_THEDE = "THE DEED IS DONE!"; +TXT_DLG_SCRIPT02_d66704_OHIJU = "OH, I JUST LOVE SOUVENIRS. HERE, THIS WILL GET YOU INTO THE PRISON. TALK TO WARDEN MONTAG. WHATEVER YOU DO AFTER THAT, I DON'T WANT TO KNOW."; +TXT_RPLY0_SCRIPT02_d66704_FINEB = "FINE BY ME."; +TXT_DLG_SCRIPT02_d68220_SOYOU = "SO YOU'RE THE FOOL WHO STOLE THE CHALICE? I'M GOING TO HAVE YOU ARRESTED AS A REBEL THIEF... THEREBY ENHANCING MY POSITION WITH THE ORDER. HOW DOES IT FEEL TO BE AN UNWITTING PAWN? I'LL GIVE YOU A HINT, IT'S GONNA' HURT. "; +TXT_RPLY0_SCRIPT02_d68220_ITSUC = "IT SUCKS!"; +TXT_RYES0_SCRIPT02_d68220_FORYO = "FOR YOU IT DOES."; +TXT_RPLY1_SCRIPT02_d68220_HARRI = "HARRIS PROMISED ME MONEY!"; +TXT_RYES1_SCRIPT02_d68220_TOOBA = "TOO BAD. THE ONLY THING YOU'RE GETTING IS DEAD!"; +TXT_DLG_SCRIPT02_d69736_INASM = "IN A SMALL WORLD, WORD TRAVELS FAST. I HEAR YOU JUST REMOVED SOME OBSTACLES FROM YOUR PATH. NICE WORK. ARE YOU INTERESTED IN SOME MORE LUCRATIVE PROJECTS?"; +TXT_RPLY0_SCRIPT02_d69736_SUREW = "SURE, WHY NOT."; +TXT_RPLY1_SCRIPT02_d69736_NOTHA = "NO THANKS."; +TXT_RYES1_SCRIPT02_d69736_THENG = "THEN GET LOST!"; +TXT_DLG_SCRIPT02_d71252_FOOLG = "FOOL! GUARDS, RID ME OF THIS MEDDLESOME PEON."; +TXT_DLG_SCRIPT02_d72768_GOODS = "GOOD. SOME UH, FRIENDS OF MINE NEED SOMEONE SILENCED. BELDIN IS BEING HELD BY THE ORDER IN THEIR SANCTUARY. THERE'S A RARELY USED ENTRANCE BY A SMALL PIER OFF THE RIVER WHICH IS UNGUARDED. GET IN, SHUT HIM UP, AND BRING HIS RING BACK TO ME AS PROOF."; +TXT_RPLY0_SCRIPT02_d72768_WILLI = "WILL IT BE WORTH THE EFFORT?"; +TXT_DLG_SCRIPT02_d74284_ILLGU = "I'LL GUARANTEE 50 GOLD AND IF YOU RETURN WITHOUT SETTING OFF EVERY ALARM IN TOWN, THERE'S THE CHANCE TO EARN MUCH, MUCH MORE, AND HERE'S A LITTLE HELPER THAT SHOULD GIVE YOU AN EDGE."; +TXT_RPLY0_SCRIPT02_d74284_THANK = "THANKS, I'll Need it."; +TXT_DLG_SCRIPT02_d75800_GOODR = "GOOD. REMEMBER, HIS SILENCE IS GOLDEN."; +TXT_RPLY0_SCRIPT02_d75800_ILLGE = "I'LL GET HIM."; +TXT_DLG_SCRIPT02_d77316_MISSI = "MISSION ACCOMPLISHED? YOU HAVE THE RING OF THE TRAITOR?"; +TXT_RPLY0_SCRIPT02_d77316_HESDE = "HE'S DEAD, WHERE'S MY MONEY?"; +TXT_RNO0_SCRIPT02_d77316_LIARG = "LIAR! Go get the ring!"; +TXT_DLG_SCRIPT02_d78832_HEREY = "HERE, YOU EARNED IT. THE TRAITOR YOU KILLED WAS ABOUT TO REVEAL THE LOCATION OF THE FRONT. YOU SAVED LIVES. HOW WOULD YOU LIKE TO EARN MORE GOLD, AND A FUTURE FREE FROM TYRANNY?"; +TXT_RPLY0_SCRIPT02_d78832_TELLM = "TELL ME MORE."; +TXT_RPLY1_SCRIPT02_d78832_NOTMY = "NOT MY STYLE."; +TXT_DLG_SCRIPT02_d80348_IHAVE = "I HAVE A BUSINESS RELATIONSHIP WITH THE FRONT'S LEADER, MACIL. I KNOW HE NEEDS AN INCISIVE FELLOW LIKE YOURSELF, AND HE PAYS WELL. TAKE THIS RECOVERED COM UNIT AND YOU'LL BE LED TO, SHALL WE SAY, OPPORTUNITIES."; +TXT_RPLY0_SCRIPT02_d80348_THANK = "THANKS."; +TXT_DLG_SCRIPT02_d81864_GETGO = "GET GOING. IF YOU HANG AROUND HERE, WE'RE BOTH DEAD."; +TXT_DLG_SCRIPT02_d83380_APITY = "A PITY, BUT NOW THAT YOU KNOW ABOUT MY FRIENDS, I MUST KILL YOU. GUARDS, TAKE OUT THIS TRASH!"; +TXT_DLG_SCRIPT02_d84896_FOOLG = "FOOL. GUARDS! RID ME OF MEDDLESOME PEON."; +TXT_DLG_SCRIPT02_d86412_WALKA = "WALK AWAY, BOY, JUST WALK AWAY."; +TXT_DLG_SCRIPT02_d87928_WHATA = "WHAT ARE YOU DOING HERE?"; +TXT_RPLY0_SCRIPT02_d87928_HEYIN = "HEY, I NEED GOLD!"; +TXT_DLG_SCRIPT02_d89444_BLACK = "BLACKBIRD TOLD YOU THE CODE, HUH? LET ME SHUT OFF THE ALARM. MACIL IS ONE FLIGHT DOWN."; +TXT_RPLY0_SCRIPT02_d89444_THANK = "THANKS."; +TXT_DLG_SCRIPT02_d90960_WALKA = "WALK AWAY, BOY, JUST WALK AWAY."; +TXT_DLG_SCRIPT02_d92476_DOYOU = "DO YOU HAVE AN APPOINTMENT WITH THE GOVERNOR? "; +TXT_RPLY0_SCRIPT02_d92476_OFCOU = "OF COURSE!"; +TXT_RPLY1_SCRIPT02_d92476_NOAND = "NO, AND I DON'T NEED ONE!"; +TXT_DLG_SCRIPT02_d93992_SORRY = "SORRY! I DIDN'T MEAN... PLEASE GO RIGHT UP."; +TXT_RPLY0_SCRIPT02_d93992_IKNEW = "I KNEW YOU'D SAY THAT."; +TXT_DLG_SCRIPT02_d95508_IFYOU = "IF YOU'RE IN SUCH A HURRY, DON'T WASTE YOUR TIME WITH ME."; +TXT_DLG_SCRIPT02_d97024_RELEA = "RELEASE ME, LEAVE AN OLD MAN ALONE."; +TXT_DLG_SCRIPT02_d98540_YOUSE = "YOU SEEK WISDOM, MY SON? THE ORDER HAS SEEN TO IT THAT WE ONLY ASK ONE QUESTION, "WHY?""; +TXT_RPLY0_SCRIPT02_d98540_WHERE = "WHERE'S THE POWER COUPLING?"; +TXT_RPLY1_SCRIPT02_d98540_WHERE = "WHERE'S THE ORDER'S MAIN?"; +TXT_RPLY2_SCRIPT02_d98540_WHERE = "WHERE'S THE ILLEGAL TAP?"; +TXT_DLG_SCRIPT02_d100056_ILLTE = "I'LL TELL YOU WHERE IT IS, BUT I DON'T KNOW WHOSE COUPLING YOU'LL BE TAMPERING WITH. IT'S RIGHT HERE IN THE SEWAGE PLANT."; +TXT_RPLY0_SCRIPT02_d100056_THANK = "THANKS"; +TXT_DLG_SCRIPT02_d101572_THATS = "THAT'S RIGHT HERE IN THE SEWAGE PLANT. BUT IT'S THE FRONT'S COUPLING. WHOEVER TOLD YOU THAT IT WAS THE ORDER'S WAS WRONG."; +TXT_RPLY0_SCRIPT02_d101572_THANK = "THANKS"; +TXT_DLG_SCRIPT02_d103088_IFYOU = "IF YOU SAY IT'S ILLEGAL I WANT NOTHING TO DO WITH YOU. I HAVE ENOUGH TROUBLE AS IT IS."; +TXT_RPLY0_SCRIPT02_d103088_THANK = "THANKS"; +TXT_DLG_SCRIPT02_d104604_RELEA = "RELEASE ME, LEAVE AN OLD MAN ALONE."; + +TXT_DLG_SCRIPT03_d0_WELCO = "WELCOME TO THE LAST FLICKER OF HOPE. ONLY WE HAVE THE FREE WILL TO OPPOSE THE ORDER. WE HAVE THE SHARPEST SCIENTIFIC MINDS, AND MANY ABLE BODIES, BUT WE LACK THAT ONE REAL, UH... "PROBLEM SOLVER", WHO WILL GIVE US THE EDGE WE NEED. HELP US."; +TXT_RPLY0_SCRIPT03_d0_ALLRI = "ALL RIGHT, I ACCEPT."; +TXT_RPLY1_SCRIPT03_d0_NOTHA = "NO THANKS!"; +TXT_DLG_SCRIPT03_d1516_YOUMI = "YOU MIGHT WANT TO RECONSIDER, SEEING THAT YOU'RE SURROUNDED BY HEAVILY ARMED ANGRY REBELS."; +TXT_RPLY0_SCRIPT03_d1516_ALLRI = "ALL RIGHT, I'M IN!"; +TXT_RPLY1_SCRIPT03_d1516_NOTHA = "NO THANKS."; +TXT_DLG_SCRIPT03_d3032_THEND = "THEN DIE IN SHAME AND DISHONOR."; +TXT_DLG_SCRIPT03_d4548_GOODB = "GOOD, BLACKBIRD WILL CONTINUE TO BE YOUR GUIDE. SHE'S TAKEN QUITE A SHINE TO YOU. TOGETHER YOU'VE GOT TO UNLOCK THE SECRETS OF THE ORDER AND THEIR INHUMAN SERVANTS. GET INSIDE AND TAKE THEM DOWN."; +TXT_RPLY0_SCRIPT03_d4548_WHERE = "WHERE DO I START?"; +TXT_DLG_SCRIPT03_d6064_FRANK = "FRANKLY THE SITUATION IS A MESS. YOU MUST ACCOMPLISH SEVERAL MISSIONS TO PREPARE THE WAY FOR MORE ATTACKS ON THE ORDER. OUR LAST RAID WAS A DISASTER AND MOST OF OUR TROOPS WERE CAPTURED. I NEED YOU TO FREE THESE PRISONERS."; +TXT_RPLY0_SCRIPT03_d6064_ITHIN = "I THINK I CAN HANDLE IT."; +TXT_DLG_SCRIPT03_d7580_TAKET = "TAKE THIS MONEY AND VISIT IRALE WHO SUPPLIES OUR WEAPONS. THEN, THIS KEY WILL GET YOU IN TO SEE THE GOVERNOR. HE'S A CORRUPT PUPPET OF THE ORDER, BUT HE LOVES TO MAKE DEALS. DO WHATEVER YOU NEED TO FREE OUR BROTHERS IN ARMS."; +TXT_RPLY0_SCRIPT03_d7580_ILLSE = "I'LL SEE TO IT."; +TXT_DLG_SCRIPT03_d9096_FIGHT = "FIGHT FOR THE FRONT AND FREEDOM. MOVE OUT."; +TXT_DLG_SCRIPT03_d10612_THEPR = "THE PRISONERS HAVE BEEN WELCOMED BACK, THANKS TO YOU. HERE'S SOME GOLD, GO VISIT THE MEDIC AND THE WEAPONS TRAINER AND THEN, I HAVE HIGHER GOALS FOR YOU."; +TXT_RPLY0_SCRIPT03_d10612_IWILL = "I WILL. WHAT'S NEXT?"; +TXT_DLG_SCRIPT03_d12128_ASING = "A SINGLE CRYSTAL RUNS THE POWER GRID WHICH DRIVES THE ORDER'S SHIELDS. DESTROY THAT CRYSTAL AND YOU WILL PUNCH HUGE HOLES IN THE ORDER'S DEFENSES. BLACKBIRD WILL LEAD YOU TO A SPY WHO HAS A WAY IN, GOOD LUCK."; +TXT_RPLY0_SCRIPT03_d12128_WELLG = "WE'LL GET IT."; +TXT_DLG_SCRIPT03_d13644_FIGHT = "FIGHT FOR THE FRONT AND FREEDOM. MOVE OUT."; +TXT_DLG_SCRIPT03_d15160_YOUVE = "YOU'VE EXCEEDED ALL OF OUR EXPECTATIONS. BECAUSE OF YOUR DARING OUR TROOPS ARE ON THE MOVE. I WANT YOU TWO TO JOIN THE ASSAULT, WITH A SPECIFIC TARGET. TAKE OUT THE PROGRAMMER. IT'S TIME TO REVEAL WHAT WE'VE FOUND OUT ABOUT THIS LAYER OF THE ORDER."; +TXT_RPLY0_SCRIPT03_d15160_TELLM = "TELL ME WHAT WE KNOW."; +TXT_DLG_SCRIPT03_d16676_THEPR = "THE PROGRAMMER'S LAIR IS IN THE CASTLE. NOW, SEE THE MEDIC, GRAB SOME AMMO AND GO GET HIM."; +TXT_RPLY0_SCRIPT03_d16676_LETME = "LET ME AT 'EM!"; +TXT_DLG_SCRIPT03_d18192_FIGHT = "FIGHT FOR THE FRONT AND FREEDOM. MOVE OUT."; +TXT_DLG_SCRIPT03_d19708_REMEM = "REMEMBER WHAT THE TOWN HALL LOOKED LIKE? THAT'S A GENTLE REMINDER OF WHAT THEY'RE WILLING TO DO TO GET AT US. BE CAREFUL."; +TXT_DLG_SCRIPT03_d21224_TALKT = "TALK TO MACIL. HE'LL BE ABLE TO HELP YOU."; +TXT_DLG_SCRIPT03_d22740_IVEHE = "I'VE HEARD THAT MACIL'S GOT A PLAN TO SUBVERT THE ORDER. IT HAD BETTER BE GOOD. ONE MORE FAILURE AND WE'RE ALL JUST DEAD MEAT."; +TXT_DLG_SCRIPT03_d24256_AFEWO = "A FEW OF THESE BARRELS DUMPED INTO THEIR WATER SUPPLY SHOULD EVEN THE ODDS A LITTLE."; +TXT_DLG_SCRIPT03_d25772_SOYOU = "SO YOU'RE THE NEW OPERATIVE? THANKS, WITHOUT YOU, WE'D ALL BE DEAD RIGHT NOW."; +TXT_DLG_SCRIPT03_d27288_IMWOR = "I'M WORKING ON SOMETHING THAT WILL GIVE US AN EDGE. IT WILL INCREASE YOUR STAMINA AND COMPLETELY JACK YOU UP. I'VE ALMOST GOT ALL THE BUGS WORKED OUT. CAN I DO SOMETHING FOR YOU?"; +TXT_RPLY0_SCRIPT03_d27288_PATCH = "PATCH ME UP."; +TXT_RYES0_SCRIPT03_d27288_BOYYO = "BOY, YOU'RE A REAL MESS. I'LL SEE WHAT I CAN DO."; +TXT_RPLY1_SCRIPT03_d27288_STAMI = "STAMINA IMPLANT?"; +TXT_RYES1_SCRIPT03_d27288_ALLRI = "ALL RIGHT, THIS WON'T TAKE BUT A MOMENT."; +TXT_RNO1_SCRIPT03_d27288_ITSNO = "IT'S NOT DONE YET."; +TXT_DLG_SCRIPT03_d28804_HEYIM = "HEY, I'M WORKING ON AN UPDATED VERSION OF YOUR IMPLANT. IS THERE ANYTHING ELSE I CAN DO?"; +TXT_RPLY0_SCRIPT03_d28804_PATCH = "PATCH ME UP."; +TXT_RYES0_SCRIPT03_d28804_WELLA = "WELL AT LEAST YOUR SEEING ACTION."; +TXT_RPLY1_SCRIPT03_d28804_IMPLA = "IMPLANT UPGRADE?"; +TXT_RYES1_SCRIPT03_d28804_GOODT = "GOOD THING, NEVER CAN BE TOO SAFE."; +TXT_RNO1_SCRIPT03_d28804_IMALM = "I'M ALMOST FINISHED, BUT NOT QUITE."; +TXT_DLG_SCRIPT03_d30320_ALLRI = "ALL RIGHT, I'VE ALMOST GOT EVERYTHING WORKING PERFECTLY. THERE WERE A FEW PROBLEMS LEFT TO GET RID OF. DO YOU NEED ANYTHING ELSE? "; +TXT_RPLY0_SCRIPT03_d30320_PATCH = "PATCH ME UP."; +TXT_RYES0_SCRIPT03_d30320_WHATH = "WHAT HAVE YOU BEEN TRYING TO DO? GO HEAD TO HEAD WITH A CRUSADER?"; +TXT_RPLY1_SCRIPT03_d30320_IMPLA = "IMPLANT UPGRADE?."; +TXT_RYES1_SCRIPT03_d30320_THATS = "THAT SHOULD DO IT FOR YOU."; +TXT_RNO1_SCRIPT03_d30320_LETME = "LET ME RUN SOME MORE TESTS FIRST."; +TXT_DLG_SCRIPT03_d31836_THATS = "THAT'S ALL I CAN DO ON THE IMPLANT RIGHT NOW. MAYBE SOME HEALING?"; +TXT_RPLY0_SCRIPT03_d31836_YEAH = "YEAH."; +TXT_RYES0_SCRIPT03_d31836_BOYYO = "BOY, YOU'RE A REAL MESS. I'LL SEE WHAT I CAN DO."; +TXT_DLG_SCRIPT03_d33352_WHATC = "WHAT CAN I DO FOR YOU?"; +TXT_RPLY0_SCRIPT03_d33352_IMOUT = "I'M OUT OF BULLETS."; +TXT_RYES0_SCRIPT03_d33352_HERES = "HERE'S SOME AMMO FOR YOU. DON'T WASTE IT."; +TXT_RPLY1_SCRIPT03_d33352_TEACH = "TEACH ME."; +TXT_RYES1_SCRIPT03_d33352_ALLRI = "ALL RIGHT, I'LL JUST SHOW YOU A FEW LITTLE POINTERS."; +TXT_RNO1_SCRIPT03_d33352_YOURE = "YOU'RE NOT READY YET."; +TXT_DLG_SCRIPT03_d34868_BACKA = "BACK AGAIN? WHAT DO YOU NEED?"; +TXT_RPLY0_SCRIPT03_d34868_IMOUT = "I'M OUT OF BULLETS."; +TXT_RYES0_SCRIPT03_d34868_HERES = "HERE'S SOME AMMO FOR YOU. DON'T WASTE IT."; +TXT_RNO0_SCRIPT03_d34868_YOUVE = "YOU'VE GOT ENOUGH AMMO."; +TXT_RPLY1_SCRIPT03_d34868_TEACH = "TEACH ME."; +TXT_RYES1_SCRIPT03_d34868_ALLRI = "ALL RIGHT, THIS SHOULD KEEP YOU GOING FOR A WHILE."; +TXT_RNO1_SCRIPT03_d34868_SORRY = "SORRY, CAN'T. I'M JUST FOLLOWING MACIL'S ORDERS."; +TXT_DLG_SCRIPT03_d36384_WELLW = "WELL WHICH IS IT, BULLETS OR TRAINING? I CAN'T WAIT TO GET MY HANDS ON THOSE NEW WEAPONS WE CAPTURED. A LITTLE BIT OF TRAINING AND THEN A LOT OF REVENGE."; +TXT_RPLY0_SCRIPT03_d36384_IMOUT = "I'M OUT OF AMMO."; +TXT_RYES0_SCRIPT03_d36384_HERES = "HERE'S SOME AMMO FOR YOU. DON'T WASTE IT."; +TXT_RNO0_SCRIPT03_d36384_YOUVE = "YOU'VE GOT ENOUGH AMMO."; +TXT_RPLY1_SCRIPT03_d36384_TEACH = "TEACH ME."; +TXT_RYES1_SCRIPT03_d36384_OKTAK = "O.K. TAKE WHAT YOU'VE LEARNED HERE AND SHOW THOSE ORDER CLODS THE WAY TO HELL."; +TXT_RNO1_SCRIPT03_d36384_COMEB = "COME BACK LATER, WHEN MACIL SAYS IT'S TIME."; +TXT_DLG_SCRIPT03_d37900_IVETA = "I'VE TAUGHT YOU EVERYTHING I CAN RIGHT NOW. GIVE ME SOME TIME TO PUT THE NEW WEAPONS THROUGH THEIR PACES. THAT IS UNLESS YOU'RE OUT OF BULLETS."; +TXT_RPLY0_SCRIPT03_d37900_YESIA = "YES I AM."; +TXT_RYES0_SCRIPT03_d37900_HEREY = "HERE YOU GO."; +TXT_DLG_SCRIPT03_d39416_DONTG = "DON'T GET TRIGGER HAPPY IN THE TOWN. YOU'LL SET OFF THE ALARM AND THEY'LL START SENDING IN GUARDS FROM THE CASTLE. "; +TXT_DLG_SCRIPT03_d40932_WELCO = "WELCOME, WE CAN ALWAYS USE MORE HELP."; +TXT_DLG_SCRIPT03_d42448_WHENI = "WHEN I WAS STILL IN ACTION WE HAD THE CHANCE TO EXAMINE AN ACOLYTE BEFORE THE REINFORCEMENTS ARRIVED. LISTEN, THEY'RE NOT HUMAN."; +TXT_DLG_SCRIPT03_d43964_WERET = "WE'RE TRYING TO FIND WHERE THE CASTLE GATE MECHANISMS ARE, BUT SO FAR WE'VE HAD NO LUCK."; +TXT_DLG_SCRIPT03_d45480_DONTG = "DON'T GET CAUGHT. I'VE HEARD HORROR STORIES ABOUT WHAT THEY DO TO OUR PEOPLE AFTER THEY'RE IMPRISONED. THEY JUST DISAPPEAR... WITHOUT A TRACE."; +TXT_DLG_SCRIPT03_d46996_HERES = "HERE'S SOME ADVICE, IF YOU EVER SEE ANY OF THE ORDER'S "TIN SOLDIERS" GO IN THE OTHER DIRECTION. THEY'RE FAST AND BRUTAL."; +TXT_DLG_SCRIPT03_d48512_LEAVE = "LEAVE ME BE. I'M DOING SOMETHING FOR MACIL."; + +TXT_DLG_SCRIPT04_d0_SORRY = "SORRY, NO. YOU DO NOT HAVE CLEARANCE."; +TXT_DLG_SCRIPT04_d1516_STOPS = "STOP! SHOW ME YOUR ID BADGE."; +TXT_RPLY0_SCRIPT04_d1516_HERES = "HERE'S MY I.D."; +TXT_DLG_SCRIPT04_d3032_OHOKS = "OH, OK. SURE GO AHEAD. HAVE A NICE DAY."; +TXT_DLG_SCRIPT04_d4548_DERWI = "DERWIN? YEAH, HE'S DOWN IN THE WAREHOUSE, BUT YOU'RE NOT GETTING IN UNLESS YOU'RE CLEARED."; +TXT_RPLY0_SCRIPT04_d4548_IVEGO = "I'VE GOT CLEARANCE."; +TXT_DLG_SCRIPT04_d6064_GOON = "GO ON."; +TXT_RPLY0_SCRIPT04_d6064_DOYOU = "DO YOU KNOW WHERE HE IS?"; +TXT_DLG_SCRIPT04_d7580_IDONT = "I DON'T KNOW WHERE ANYBODY IS. I JUST KEEP THE LID ON THE RAT TRAP."; +TXT_DLG_SCRIPT04_d9096_YOUAR = "YOU ARE AN UNPLEASANT DISTRACTION."; +TXT_DLG_SCRIPT04_d10612_MOVEA = "MOVE ALONG OR TASTE METAL."; +TXT_DLG_SCRIPT04_d12128_PASSY = "PASS YOUR ID THROUGH HERE FOR ACCESS."; +TXT_DLG_SCRIPT04_d13644_GETBA = "GET BACK TO WORK, NOW!"; +TXT_DLG_SCRIPT04_d15160_GETBA = "GET BACK TO WORK, NOW!"; +TXT_DLG_SCRIPT04_d16676_WEVEB = "WE'VE BEEN RUNNING AROUND THE CLOCK FOR WEEKS WITH NO DOWN TIME. I'D SAY THAT THE ORDER IS PLANNING A SUPPRESSION RAID ON THE FRONT."; +TXT_DLG_SCRIPT04_d18192_OHDAM = "OH, DAMN. THE GOVERNOR SENT YOU. I WAS GOING TO GIVE HIM HIS CUT, REALLY I WAS. OK, LISTEN. I'VE GOT A BUNDLE STASHED. IT'S YOURS IF YOU LOOK THE OTHER WAY."; +TXT_RPLY0_SCRIPT04_d18192_ALLRI = "ALL RIGHT, I'LL LET YOU GO."; +TXT_RPLY1_SCRIPT04_d18192_SORRY = "SORRY, NOTHING PERSONAL."; +TXT_DLG_SCRIPT04_d19708_NUTSI = "NUTS, IF I'M GOING DOWN, THEN SO ARE YOU. GUARDS!!"; +TXT_DLG_SCRIPT04_d21224_BUSIN = "BUSINESS MY ASS. HELP, GUARDS, I'VE GOT A LIVE ONE."; +TXT_DLG_SCRIPT04_d22740_AHIGO = "AH, I GOT WORD FROM MACIL THAT YOU'D BE COMING. I HAVE A WAY TO GET YOU INSIDE THE POWER STATION, BUT IT'S ON THE RISKY SIDE."; +TXT_RPLY0_SCRIPT04_d22740_ILLTA = "I'LL TAKE MY CHANCES."; +TXT_DLG_SCRIPT04_d24256_ALLRI = "ALL RIGHT, I STOLE AN I.D. FROM THE CORPSE OF SOME FOOL WHO FELL INTO THE REACTOR'S COOLANT PIT. --BLAT-- INSTANT DEEP FRY."; +TXT_RPLY0_SCRIPT04_d24256_WHATS = "WHAT SHOULD I DO ONCE I'M IN?"; +TXT_DLG_SCRIPT04_d25772_TELLW = "TELL WHOEVER ASKS THAT YOU'RE THE REPLACEMENT WORKER FOR MR. CRISPY. IT'S JUST DUMB ENOUGH TO WORK. OH, AND YOU MIGHT WANT TO CHECK OUT THE STOREROOM THAT'S RIGHT ABOVE US."; +TXT_RPLY0_SCRIPT04_d25772_BOYIH = "BOY I HOPE THIS I.D. WORKS."; +TXT_DLG_SCRIPT04_d27288_GETOU = "GET OUT OF HERE, UNLESS YOU WANT TO END UP MR. DEAD."; +TXT_DLG_SCRIPT04_d28804_HEYLE = "HEY, LEAVE ME ALONE. IF THEY CATCH US WASTING TIME WE GET DEAD, OR EXTRA WORK."; +TXT_DLG_SCRIPT04_d30320_SUCHP = "SUCH PRESSURE, AT THIS RATE WE'LL BE BACK TO NORMAL SHIFTS SOON. WE'RE PUMPING TONS OF POWER TO THE CASTLE AND I'M ALMOST FINISHED LOGGING THOSE NEW WEAPONS."; +TXT_RPLY0_SCRIPT04_d30320_WEAPO = "WEAPONS?"; +TXT_DLG_SCRIPT04_d31836_WHATD = "WHAT DO YOU THINK, WE'RE BACKED UP ON SOCKS?"; +TXT_RPLY0_SCRIPT04_d31836_WHATK = "WHAT KIND OF WEAPONS?"; +TXT_DLG_SCRIPT04_d33352_AREYO = "ARE YOU DEAF? I JUST TOLD YOU HOW BUSY I AM. GET BACK TO WORK."; +TXT_DLG_SCRIPT04_d34868_WHOAR = "WHO ARE YOU? ONLY CLEARANCE LEVEL TWO PERSONNEL ARE PERMITTED IN THIS AREA."; +TXT_RPLY0_SCRIPT04_d34868_IMTHE = "I'M THE REPLACEMENT WORKER."; +TXT_DLG_SCRIPT04_d36384_ABOUT = "ABOUT TIME YOU SHOWED UP. GO TALK WITH KETRICK IN THE CORE. OH, AND TAKE THIS KEY CARD. DON'T WANT YOU GETTING SHOT ON YOUR FIRST DAY, HUH?"; +TXT_RPLY0_SCRIPT04_d36384_WHERE = "WHERE'S THE POWER CRYSTAL?"; +TXT_DLG_SCRIPT04_d37900_IFYOU = "IF YOU DON'T GET TO WORK, YOU'LL GET SHOT ANYWAY. MOVE YOUR TUNIC."; +TXT_DLG_SCRIPT04_d39416_IDONT = "I DON'T MEAN TO SOUND ALARMIST, BUT IF THEY KEEP PUSHING THE POWER CRYSTAL THIS HARD IT'S GONNA FLAW, AND THEN SHATTER, AND THEN *BOOM*! ...JUST A THOUGHT."; +TXT_DLG_SCRIPT04_d40932_LETME = "LET ME BE QUITE CLEAR. IF THIS TERMINAL LOCKS UP AGAIN, THE COOLANT LEVEL WILL DROP AND WE'LL ALL HAVE TO ANSWER TO THE PROGRAMMER. IF WE SURVIVE."; +TXT_DLG_SCRIPT04_d42448_YOUYE = "YOU! YEAH, YOU. YOU AREN'T CLEARED FOR THIS AREA. LET ME HAVE YOUR KEY CARD, FAST. I'M IN SUCH A BAD MOOD!"; +TXT_RPLY0_SCRIPT04_d42448_HEREH = "HERE, HERE'S MY CARD."; +TXT_DLG_SCRIPT04_d43964_THISI = "THIS IS GARBAGE! WAIT HERE. OH SCREW IT. GUARDS KILL THIS INTRUDER!"; +TXT_DLG_SCRIPT04_d45480_WORKS = "WORK, SLEEP, GET TORTURED, WHAT A LIFE. SAY, YOU THE REPLACEMENT FOR THE CARELESS PIT DIVER?"; +TXT_RPLY0_SCRIPT04_d45480_YEAHC = "YEAH, CAN'T WAIT TO START."; +TXT_DLG_SCRIPT04_d46996_YEAHR = "YEAH, RIGHT. OK, GET YOUR ASS TO WORK."; +TXT_RPLY0_SCRIPT04_d46996_WHERE = "WHERE'S THE CRYSTAL?"; +TXT_DLG_SCRIPT04_d48512_GOTAL = "GO TALK TO KETRICK. BRING THE WALKWAY UP USING THE SWITCHES, THEN USE THIS I.D. FOR THE ELEVATOR."; +TXT_RPLY0_SCRIPT04_d48512_WHERE = "WHERE'S THE CRYSTAL AGAIN?"; +TXT_DLG_SCRIPT04_d50028_NONEO = "NONE OF YOUR BUSINESS, GO TALK TO KETRICK."; +TXT_RPLY0_SCRIPT04_d50028_OK = "OK."; +TXT_DLG_SCRIPT04_d51544_IFITS = "IF IT'S BUSY WORK YOU WANT, GO STARE AT THAT SCREEN FOR A WHILE, IT'LL BORE YOU TO TEARS."; +TXT_DLG_SCRIPT04_d53060_THEAL = "THE ALMIGHTY PROGRAMMER IS SO PARANOID OF INFILTRATION THAT HE'S LOCKED UP THE COMPUTER CORE. HOW AM I SUPPOSED TO GET MY WORK DONE? THE ONLY WAY IN IS THE SUICIDE RUN."; +TXT_RPLY0_SCRIPT04_d53060_SUICI = "SUICIDE RUN? WHAT'S THAT?"; +TXT_DLG_SCRIPT04_d54576_ITSAS = "IT'S A SURE-FIRE WAY TO GET KILLED, BUT THAT'S NOT IMPORTANT RIGHT NOW. GO DOWN THE LIFT IF YOU'RE SO INCLINED."; + +TXT_DLG_SCRIPT05_d0_HALTN = "HALT. NO ONE GETS THROUGH HERE WITHOUT AUTHORIZATION FROM THE WARDEN OR THE GOVERNOR."; +TXT_RPLY0_SCRIPT05_d0_HERES = "HERE'S MY PASS, LET ME IN."; +TXT_DLG_SCRIPT05_d1516_OKBUT = "OK, BUT TALK ONLY TO THE WARDEN."; +TXT_DLG_SCRIPT05_d3032_DOILO = "DO I LOOK LIKE THE WARDEN TO YOU? KEEP MOVING, THIS AREA'S OFF LIMITS."; +TXT_DLG_SCRIPT05_d4548_THEOR = "THE ORDER'S WRATH WILL RAIN DOWN ON THESE SERVANTS UNTIL THEY BEG FOR DEATH."; +TXT_DLG_SCRIPT05_d6064_IDONT = "I DON'T CARE IF MOUREL GAVE YOU A PASS. THIS IS MY PRISON. MY KEY IS THE ONLY WAY IN OR OUT, AND I'M NOT TAKING ANY CHANCES. THE ORDER DOES NOT TOLERATE MISTAKES."; +TXT_RPLY0_SCRIPT05_d6064_GIVEM = "GIVE ME THE DAMN KEY!"; +TXT_DLG_SCRIPT05_d7580_OVERM = "OVER MY DEAD BODY!"; +TXT_RPLY0_SCRIPT05_d7580_GREAT = "GREAT IDEA!"; +TXT_DLG_SCRIPT05_d9096_SHACK = "SHACKLES OR CHAINS, I WANT YOU TO HANG AROUND."; +TXT_DLG_SCRIPT05_d10612_IDONT = "I DON'T KNOW HOW YOU MANAGED TO GET PAST THE GUARDS AND THE WARDEN, BUT I HOPE YOU LIKE THE DECOR, BECAUSE YOU JUST MOVED IN."; +TXT_RPLY0_SCRIPT05_d10612_FREEM = "FREE MY COMRADES OR DIE!"; +TXT_DLG_SCRIPT05_d12128_KILLM = "KILL ME AND YOU'LL NEVER SET ANYONE FREE. I POSSESS THE ONLY PATTERN KEY THAT WILL UNLOCK THE CELLS."; +TXT_RPLY0_SCRIPT05_d12128_CANYO = "CAN YOU LEND ME A HAND THEN?"; +TXT_DLG_SCRIPT05_d13644_MOVEA = "MOVE ALONG OR JOIN YOUR FRIENDS."; +TXT_DLG_SCRIPT05_d15160_DONTJ = "DON'T JUST STAND THERE, GET US OUT OF HERE!"; +TXT_DLG_SCRIPT05_d16676_THESK = "THE SKY, I WANT TO SEE THE SKY."; +TXT_DLG_SCRIPT05_d18192_FIVEF = "FIVE FEET BY FOUR FEET, FIVE FEET BY FOUR FEET, FIVE FEET BY FOUR FEET."; +TXT_DLG_SCRIPT05_d19708_DONTR = "DON'T RELEASE ME IF THE ORDER'S STILL IN CHARGE. I CAN'T STAND THE TERROR."; +TXT_DLG_SCRIPT05_d21224_IDONT = "I DON'T WANT TO BITCH, BUT IT'S ABOUT TIME MACIL SENT SOMEONE TO GET US OUT."; +TXT_DLG_SCRIPT05_d22740_IDGIV = "I'D GIVE ANYTHING FOR JUST A CRUST OF BREAD. I'M SO HUNGRY."; + +TXT_DLG_SCRIPT06_d0_AHASU = "AH, A SURFACER IN NEED OF A FAVOR. DOWN HERE YOU DO A FAVOR TO GET A FAVOR AND I NEED THE TOWN ENTRANCE THAT IS OUR PATH TO FOOD OPENED. THE ORDER HAS IT SEALED AND GUARDED."; +TXT_RPLY0_SCRIPT06_d0_WHERE = "WHERE IS THE GATE MECHANISM?"; +TXT_DLG_SCRIPT06_d1516_DOMYF = "DO MY FAVOR FIRST, OR YOU'LL GET SQUAT FROM ME."; +TXT_RPLY0_SCRIPT06_d1516_HOWWI = "HOW WILL YOU KNOW IT'S OPEN?"; +TXT_DLG_SCRIPT06_d3032_BRING = "BRING ME BACK THE GUARD'S UNIFORM. THAT WAY ONE OF MY RATFELLOWS CAN WEAR IT AND NO ONE WILL TRY TO SHUT THE DOOR AGAIN."; +TXT_RPLY0_SCRIPT06_d3032_YOUWA = "YOU WANT HIS UNIFORM?"; +TXT_DLG_SCRIPT06_d4548_OPENT = "OPEN THE DOOR, BRING ME THE UNIFORM AND WE TRADE. OTHERWISE, PISS OFF."; +TXT_DLG_SCRIPT06_d6064_HAVEY = "HAVE YOU BROUGHT ME WHAT I WANT?"; +TXT_RPLY0_SCRIPT06_d6064_HOWAB = "HOW ABOUT THIS UNIFORM?"; +TXT_RNO0_SCRIPT06_d6064_BRING = "BRING ME THE UNIFORM."; +TXT_DLG_SCRIPT06_d7580_GOODH = "GOOD. HERE'S SOMETHING EXTRA. MY FELLOWS TORE THIS OFF OF A FALLEN CRUSADER, IT'S THE PARTS THAT MAKE UP A FLAMETHROWER. NOW IRALE CAN MAKE ONE FOR YOU. YOU CAN HAVE SUCH FUN."; +TXT_RPLY0_SCRIPT06_d7580_WHERE = "WHERE'S THE GATE MECHANISM?"; +TXT_DLG_SCRIPT06_d9096_YOUHA = "YOU HAVE TO ENTER ANOTHER PART OF THE SEWERS. TO GET THERE YOU MUST ENTER THE CASTLE FROM A SEWER MAINTENANCE DOOR AND DRAIN THE FLUID RECLAMATION TANK. AT THE BOTTOM IS THE HIDDEN ENTRANCE TO SEWERS, AND RIGHT BEYOND THAT IS THE MANUAL GATE CONTROL."; +TXT_RPLY0_SCRIPT06_d9096_ANYTH = "ANYTHING ELSE YOU CAN DO?"; +TXT_DLG_SCRIPT06_d10612_GOODL = "GOOD LUCK. I'VE OPENED SEVERAL OF OUR TUNNELS FOR YOU. IT SHOULD MAKE YOUR TASK EASIER. OH, SIZE TEN, PERFECT! ...BUT DREADFUL COLORS."; +TXT_RPLY0_SCRIPT06_d10612_THANK = "THANKS FOR YOUR HELP."; +TXT_DLG_SCRIPT06_d12128_YOUGI = "YOU GIVE ME NOTHING, YOU GET NOTHING."; +TXT_DLG_SCRIPT06_d13644_WERAN = "WERAN WILL SAVE US. HE'S NEVER FAILED US YET."; +TXT_DLG_SCRIPT06_d15160_IFYOU = "IF YOU SEEK AN ANSWER TO YOUR PROBLEM, FIND WERAN. "; +TXT_DLG_SCRIPT06_d16676_LONGL = "LONG LIVE THE FRONT? THAT'S ALL CRAP. WE'RE ALL JUST WAITING TO DIE. "; +TXT_DLG_SCRIPT06_d18192_WITHO = "WITH OUR PASSAGE TO THE SURFACE SEALED, WE CAN'T EVEN FEED OURSELVES."; +TXT_DLG_SCRIPT06_d19708_FOODD = "FOOD, DO YOU HAVE ANY FOOD? PLEASE HELP US."; +TXT_DLG_SCRIPT06_d21224_THISI = "THIS IS MY REWARD FOR LETTING PRISONERS ESCAPE, GUARDING THE SEWERS. IF I EVER FIND THE GUY WHO BROKE THEM OUT, I'LL SLAUGHTER HIM."; +TXT_DLG_SCRIPT06_d22740_WEVEG = "WE'VE GOT THOSE LITTLE BEGGARS JUST WHERE WE WANT THEM. FEW MORE DAYS OF THIS, AND THEY'LL HAVE STARVED THEMSELVES INTO OBLIVION."; +TXT_DLG_SCRIPT06_d24256_WHATS = "WHAT'S YOUR CLEARANCE? THERE'S NO UNAUTHORIZED PERSONNEL ALLOWED UP HERE."; + +TXT_DLG_SCRIPT07_d0_WHATT = "WHAT THE HELL? WHO OPENED THE GATES? SOUND THE ALARM!!!"; +TXT_DLG_SCRIPT07_d1516_THERE = "THERE'S ANOTHER WAY INTO THE SEWERS, THROW THAT SWITCH AND THEN GO UP AND PURGE THE RECLAMATION TANK."; +TXT_DLG_SCRIPT07_d3032_WHATT = "WHAT THE HELL'S YOUR PROBLEM. IF THE PROGRAMMER COMES UP FROM HIS AUDIENCE CHAMBER, YOU'RE DEAD."; +TXT_DLG_SCRIPT07_d4548_HEYYO = "HEY, YOU'RE NOT CLEARED TO GO DOWN THERE."; +TXT_DLG_SCRIPT07_d6064_PROGR = "PROGRAMMER? WHO TOLD YOU THAT? THERE IS NO PROGRAMMER. THAT STORY WAS SPREAD AGES AGO. DON'T TELL ME THE FRONT ACTUALLY BELIEVED THAT CRAP. IDIOTS."; +TXT_RPLY0_SCRIPT07_d6064_WELLW = "WELL, WHAT'S THE TRUTH THEN?"; +TXT_DLG_SCRIPT07_d7580_ITOLD = "I TOLD YOU ALL I KNOW. YOU ARE WASTING YOUR TIME."; +TXT_DLG_SCRIPT07_d9096_FIGHT = "FIGHT ON, WE WILL TRIUMPH. THIS DAY WILL BELONG TO US!"; +TXT_DLG_SCRIPT07_d10612_FIGHT = "FIGHT ON, WE WILL TRIUMPH. THIS DAY WILL BELONG TO US!"; +TXT_DLG_SCRIPT07_d12128_FIGHT = "FIGHT ON, WE WILL TRIUMPH. THIS DAY WILL BELONG TO US!"; +TXT_DLG_SCRIPT07_d13644_FIGHT = "FIGHT ON, WE WILL TRIUMPH. THIS DAY WILL BELONG TO US!"; +TXT_DLG_SCRIPT07_d15160_FIGHT = "FIGHT ON, WE WILL TRIUMPH. THIS DAY WILL BELONG TO US!"; +TXT_DLG_SCRIPT07_d16676_FIGHT = "FIGHT ON, WE WILL TRIUMPH. THIS DAY WILL BELONG TO US!"; + +TXT_DLG_SCRIPT08_d0_YOUKI = "YOU KILLED ALL THE GUARDS. DON'T HURT ME. I TOLD HIM THIS WAS A DUMB IDEA. THE REAL PROGRAMMER'S IN THE KEEP. HERE, TAKE THIS KEY."; +TXT_RPLY0_SCRIPT08_d0_YOURE = "YOU'RE THE PROGRAMMER!"; +TXT_DLG_SCRIPT08_d1516_DOILO = "DO I LOOK LIKE I WIELD ULTIMATE POWER? THE ORDER USES US ALL. NOW GO, I'M DEAD ALREADY."; +TXT_DLG_SCRIPT08_d3032_POWER = "POWER IS THE KEY!"; + +TXT_DLG_SCRIPT10_d0_GOODY = "GOOD, YOU'RE CONSCIOUS AGAIN. WHEN YOU GRABBED THAT ITEM THE PROGRAMMER DROPPED YOU LET LOOSE SOME TERRIBLE SECRETS."; +TXT_RPLY0_SCRIPT10_d0_WHATK = "WHAT KIND OF SECRETS. "; +TXT_DLG_SCRIPT10_d1516_WEHAV = "WE HAVE NO IDEA WHERE THIS WEAPON CAME FROM, BUT WE MUST FIND OUT. YOU HAVE WRESTED ONE FROM THE ORDER, BUT WE MUST HAVE ALL FIVE. WE HAVE REACHED THE LIMITS OF MY KNOWLEDGE. SEEK OUT THE ORACLE AND ASK IT FOR HELP."; +TXT_RPLY0_SCRIPT10_d1516_IMGON = "I'M GONNA NEED MORE SUPPLIES."; +TXT_DLG_SCRIPT10_d3032_HERES = "HERE'S SOME GOLD. GO VISIT THE MEDIC AND THE WEAPONS TRAINER AND THEN, MOVE OUT!"; +TXT_RPLY0_SCRIPT10_d3032_RIGHT = "RIGHT!"; +TXT_DLG_SCRIPT10_d4548_FIGHT = "FIGHT FOR THE FRONT AND FREEDOM. MOVE OUT."; +TXT_DLG_SCRIPT10_d6064_WHATP = "What prompts your return? Are you hurt? There's no time to lose, continue with your mission. Complete the SIGIL."; +TXT_RPLY0_SCRIPT10_d6064_THEOR = "The Oracle says YOU must die!"; +TXT_DLG_SCRIPT10_d7580_IHAVE = "I have sworn myself to freedom. It is the Oracle who holds the third piece. There's your traitor."; +TXT_RPLY0_SCRIPT10_d7580_THEOR = "THE ORACLE WILL DIE THEN!"; +TXT_RPLY1_SCRIPT10_d7580_ITHIN = "I THINK YOU'RE THE TRAITOR!"; +TXT_DLG_SCRIPT10_d9096_SPIRI = "Spirit of the one god avenge me and turn this world into dust."; +TXT_DLG_SCRIPT10_d10612_YOUHA = "You have made the right decision. Its clear that the ORACLE is controlled by whatever evil is driving The ORDER. Return to it and claim the third piece of the SIGIL."; +TXT_DLG_SCRIPT10_d12128_THERE = "There seems no end to the horror we face. We have found out that The Order is NOT killing our people. it is transforming them, into bio-mechanical soldiers. Find the facility where this is being done and CLOSE IT, permanently."; +TXT_RPLY0_SCRIPT10_d12128_WHERE = "WHERE IS THIS LOCATED?"; +TXT_DLG_SCRIPT10_d13644_ONEOF = "One of our captains, RICHTER, is waiting for you by the waterfall in the commons. He has seen the facility and can guide you inside. Stop this atrocity, now."; +TXT_RPLY0_SCRIPT10_d13644_THEYL = "THEY'LL PAY FOR THIS!"; +TXT_DLG_SCRIPT10_d15160_FIGHT = "FIGHT FOR THE FRONT AND FREEDOM. MOVE OUT."; +TXT_DLG_SCRIPT10_d16676_IAMTH = "I am the one God... I need his spirit to be free so that I can leave my body, and join him in flight. You have no idea what you possess... and what terror you face... the one God must be free... and he will reward me... I will be ONE..."; +TXT_RPLY0_SCRIPT10_d16676_IWILL = "I WILL DESTROY YOU!"; +TXT_DLG_SCRIPT10_d18192_GLADT = "GLAD TO SEE YOU MADE IT. WHAT DO YOU NEED? "; +TXT_RPLY0_SCRIPT10_d18192_HEALM = "HEAL ME."; +TXT_RYES0_SCRIPT10_d18192_WELLL = "WELL, LETS GET YOU FIXED UP."; +TXT_RNO0_SCRIPT10_d18192_YOURE = "YOU'RE FINE."; +TXT_RPLY1_SCRIPT10_d18192_ANYTH = "ANYTHING NEW?"; +TXT_RYES1_SCRIPT10_d18192_YESIV = "YES, I'VE GOT SOME NEW HARDWARE FOR YOU."; +TXT_RNO1_SCRIPT10_d18192_NOPEI = "NOPE, I'M WORKING ON IT THOUGH."; +TXT_DLG_SCRIPT10_d19708_WHATC = "WHAT CAN I DO FOR YOU NOW? FERIS IS DECRYPTING SOME REALLY COMPLEX FILES, BUT IT'S ALL WORTH IT. THERE'S ALREADY SOME INFORMATION THAT I'LL BE ABLE TO APPLY TO THE NEXT VERSION OF THE STAMINA IMPLANT."; +TXT_RPLY0_SCRIPT10_d19708_HEALM = "HEAL ME."; +TXT_RYES0_SCRIPT10_d19708_YOUSH = "YOU SHOULD LEARN TO BE A LITTLE MORE CAREFUL."; +TXT_RPLY1_SCRIPT10_d19708_WHENW = "WHEN WILL THAT BE READY?"; +TXT_RYES1_SCRIPT10_d19708_ITSRE = "IT'S READY NOW. THIS WON'T TAKE BUT A MOMENT."; +TXT_RNO1_SCRIPT10_d19708_SOON = "SOON."; +TXT_DLG_SCRIPT10_d21224_ITHIN = "I THINK I FOUND A GLITCH IN YOUR IMPLANT HARDWARE. FERIS IS HELPING ME DESIGN A RETROFIT THAT WILL TAKE CARE OF IT AND BOOST THE SPEED OF YOUR HARDWARE A LITTLE. IS THERE SOMETHING I CAN DO FOR YOU?"; +TXT_RPLY0_SCRIPT10_d21224_PATCH = "PATCH ME UP."; +TXT_RYES0_SCRIPT10_d21224_THERE = "THERE, AS GOOD AS NEW I GUESS."; +TXT_RPLY1_SCRIPT10_d21224_RETRO = "RETROFIT?"; +TXT_RYES1_SCRIPT10_d21224_AHNOW = "AH, NOW WE'RE COOKING."; +TXT_RNO1_SCRIPT10_d21224_ILLHA = "I'LL HAVE IT AS SOON AS FERIS FINISHES IT."; +TXT_DLG_SCRIPT10_d22740_HOWSI = "HOW'S IT GOING? MAN, SOME OF THIS NEW TECHNOLOGY IS SIMPLY AMAZING. THIS SHOULD ALSO HELP WITH YOUR IMPLANT. I'VE GOT A COUPLE IDEAS THAT I'M SKETCHING OUT AND I'LL HAVE THEM READY SOON. WHAT CAN I DO FOR YOU, MAYBE SOME HEALING?"; +TXT_RPLY0_SCRIPT10_d22740_YESHE = "YES, HEAL ME."; +TXT_RYES0_SCRIPT10_d22740_ALLRI = "ALL RIGHT, HERE YOU GO."; +TXT_RPLY1_SCRIPT10_d22740_HOWAB = "HOW ABOUT THAT NEW TECH?"; +TXT_RYES1_SCRIPT10_d22740_LETME = "LET ME KNOW HOW THIS WORKS."; +TXT_RNO1_SCRIPT10_d22740_IMNOT = "I'M NOT DONE DESIGNING IT YET."; +TXT_DLG_SCRIPT10_d24256_BACKA = "BACK AGAIN, DON'T YOU EVER TIRE OF THIS? I'VE GOT SOME GOOD NEWS, FERIS FOUND A WAY TO INCREASE THE OUTPUT OF YOUR IMPLANT. HE GAVE THE SPECS TO ME AND I'M TRYING TO GET IT TO BLEND WITH YOUR PHYSIOLOGY. I'M FORCE GROWING SOME TISSUE, TOTALLY NEW STUFF HERE, I HOPE IT TAKES. DO YOU NEED HEALING?"; +TXT_RPLY0_SCRIPT10_d24256_YESHE = "YES, HEAL ME."; +TXT_RYES0_SCRIPT10_d24256_DONEN = "DONE, NOW TAKE CARE OF YOURSELF."; +TXT_RPLY1_SCRIPT10_d24256_WHENW = "WHEN WILL YOU BE DONE?"; +TXT_RYES1_SCRIPT10_d24256_NOWHE = "NOW. HEY GREAT, IT WORKED!"; +TXT_RNO1_SCRIPT10_d24256_IMWAI = "I'M WAITING ON THE TISSUE TO FINISH ITS GROWTH CYCLE."; +TXT_DLG_SCRIPT10_d25772_WELLI = "WELL, I'M BACK UP TO MY OLD TRICKS AGAIN, I'M STILL WORKING ON YOUR IMPLANTS. DID YOU KNOW THAT MACIL HAS NOW AUTHORIZED THEM FOR EVERYONE? NO, HUH? IT'S BECAUSE YOU TURNED OUT SO WELL. ANYTHING I CAN DO FOR YOU?"; +TXT_RPLY0_SCRIPT10_d25772_HELPM = "HELP ME OUT HERE."; +TXT_RYES0_SCRIPT10_d25772_THATS = "THAT'S ALL I CAN DO."; +TXT_RPLY1_SCRIPT10_d25772_NEWIM = "NEW IMPLANT?"; +TXT_RYES1_SCRIPT10_d25772_YEPMY = "YEP, MY BEST ONE YET."; +TXT_RNO1_SCRIPT10_d25772_SORRY = "SORRY, BUT YOU JUST HAVE TO WAIT."; +TXT_DLG_SCRIPT10_d27288_THISI = "THIS IS IT, FERIS HAS MANAGED TO DRAIN EVERYTHING HE COULD OUT OF ALL THE DATA WE HAVE, THIS WILL THE BEST, AND LAST IMPLANT UPGRADE. IT WILL BE SORT OF DEPRESSING, SEEING MY BEST CREATION REACH ITS PEAK. WELL, AT LEAST THE REST OF THIS CREW WILL KEEP ME OCCUPIED."; +TXT_RPLY0_SCRIPT10_d27288_COULD = "COULD YOU HEAL ME?"; +TXT_RYES0_SCRIPT10_d27288_THERE = "THERE, YOU'RE ALL SET NOW."; +TXT_DLG_SCRIPT10_d28804_ITSTH = "IT'S THE HERO. GREAT JOB! WHAT CAN I GET FOR YOU? WE'VE GOT A LITTLE LARGER SELECTION NOW THAT WE HAVE ALL THE ORDINANCE FROM THE CASTLE. IF YOU NEED TO BUY SOME AMMO TALK TO JUSTIN. HE'LL TAKE CARE OF YOU. "; +TXT_RPLY0_SCRIPT10_d28804_IMOUT = "I'M OUT OF BULLETS."; +TXT_RYES0_SCRIPT10_d28804_HERES = "HERE'S SOME AMMO FOR YOU. DON'T WASTE IT."; +TXT_RPLY1_SCRIPT10_d28804_TEACH = "TEACH ME."; +TXT_RYES1_SCRIPT10_d28804_NOWAF = "NOW, A FEW TIPS ON THE BIG GUNS."; +TXT_RNO1_SCRIPT10_d28804_YOURE = "YOU'RE NOT READY YET."; +TXT_DLG_SCRIPT10_d30320_HOWST = "HOW'S THE WAR EFFORT? NEVERMIND, IF WE'RE STILL HERE, IT MUST BE GOING FINE. WHAT CAN I DO FOR YOU?"; +TXT_RPLY0_SCRIPT10_d30320_IRANO = "I RAN OUT OF BULLETS."; +TXT_RYES0_SCRIPT10_d30320_THATS = "THAT SHOULD HELP."; +TXT_RNO0_SCRIPT10_d30320_YOUVE = "YOU'VE GOT ENOUGH AMMO."; +TXT_RPLY1_SCRIPT10_d30320_TEACH = "TEACH ME."; +TXT_RYES1_SCRIPT10_d30320_HEREI = "HERE, I'LL SHOW YOU A FEW TRICKS OF THE TRADE."; +TXT_RNO1_SCRIPT10_d30320_YOURE = "YOU'RE NOT READY YET."; +TXT_DLG_SCRIPT10_d31836_WELLH = "WELL HAVE YOU COME FOR TUTELAGE OR IS IT SOME AMMO YOU'RE LOOKING FOR? DON'T THINK THAT I'M DONE WITH YOU YET. I'VE STILL GOT A FEW TRICKS UP MY SLEEVE."; +TXT_RPLY0_SCRIPT10_d31836_ITSAM = "IT'S AMMO FOR NOW."; +TXT_RYES0_SCRIPT10_d31836_HERES = "HERE'S SOME AMMO FOR YOU. DON'T WASTE IT."; +TXT_RNO0_SCRIPT10_d31836_YOUVE = "YOU'VE GOT ENOUGH AMMO."; +TXT_RPLY1_SCRIPT10_d31836_TEACH = "TEACH ME."; +TXT_RYES1_SCRIPT10_d31836_TIMEF = "TIME FOR THE ADVANCED LESSONS."; +TXT_RNO1_SCRIPT10_d31836_YOURE = "YOU'RE NOT READY YET."; +TXT_DLG_SCRIPT10_d33352_WELLW = "WELL, WHAT IS IT NOW? DON'T YOU EVER TAKE A BREAK? I'M GLAD THAT YOU'RE STILL BREATHING. I'D HATE FOR MY FAVORITE STUDENT TO COME BACK LOOKING OUT FROM THE INSIDE OF A BODY BAG."; +TXT_RPLY0_SCRIPT10_d33352_INEED = "I NEED SOME MORE BULLETS."; +TXT_RYES0_SCRIPT10_d33352_THERE = "THERE, DON'T WASTE IT."; +TXT_RNO0_SCRIPT10_d33352_YOUHA = "YOU HAVE ENOUGH."; +TXT_RPLY1_SCRIPT10_d33352_WHATC = "WHAT CAN YOU TEACH ME?"; +TXT_RYES1_SCRIPT10_d33352_DONTG = "DON'T GET SNIPPY, YOU'VE STILL SOME ROOM TO GROW."; +TXT_RNO1_SCRIPT10_d33352_NOTHI = "NOTHING UNTIL YOU'RE READY."; +TXT_DLG_SCRIPT10_d34868_LOOKW = "LOOK WHO'S BACK, WHAT'S ON YOUR MIND? I KNOW IT'S BEEN HARD, BUT ALL OF US APPRECIATE YOUR EFFORTS, BELIEVE ME."; +TXT_RPLY0_SCRIPT10_d34868_IVERU = "I'VE RUN OUT OF BULLETS."; +TXT_RYES0_SCRIPT10_d34868_WHATE = "WHAT ELSE IS NEW, HERE YOU GO."; +TXT_RNO0_SCRIPT10_d34868_YOUHA = "YOU HAVE MORE THAN I CAN GIVE YOU."; +TXT_RPLY1_SCRIPT10_d34868_TEACH = "TEACH ME WHAT YOU CAN."; +TXT_RYES1_SCRIPT10_d34868_ALLRI = "ALL RIGHT, HERE'S SOME POINTERS."; +TXT_RNO1_SCRIPT10_d34868_NOTRI = "NOT RIGHT NOW."; +TXT_DLG_SCRIPT10_d36384_WHATI = "WHAT IS IT YOU NEED? I HOPE THAT YOU'RE GIVING THE ORDER A TASTE OF THE KIND OF PAIN THAT WE HAVE BEEN FEELING FOR YEARS."; +TXT_RPLY0_SCRIPT10_d36384_SOMEA = "SOME AMMO."; +TXT_RYES0_SCRIPT10_d36384_THERE = "THERE YOU GO, DON'T WASTE IT."; +TXT_RNO0_SCRIPT10_d36384_YOUVE = "YOU'VE GOT ENOUGH AMMO."; +TXT_RPLY1_SCRIPT10_d36384_TEACH = "TEACH ME."; +TXT_RYES1_SCRIPT10_d36384_AFEWM = "A FEW MORE LESSONS AND YOU'LL KNOW ALL THAT I CAN TEACH."; +TXT_RNO1_SCRIPT10_d36384_YOURE = "YOU'RE NOT READY YET."; +TXT_DLG_SCRIPT10_d37900_ICANT = "I CAN'T BELIEVE THAT WE'RE STILL AROUND, YOU AND I. THERE'S JUST TOO MANY OF US THAT HAVE PASSED SINCE THE BEGINNING. WHAT CAN I DO FOR YOU FRIEND?"; +TXT_RPLY0_SCRIPT10_d37900_IMOUT = "I'M OUT OF BULLETS."; +TXT_RYES0_SCRIPT10_d37900_HEREU = "HERE, USE THEM TO KEEP YOU IN GOOD HEALTH."; +TXT_RNO0_SCRIPT10_d37900_YOUHA = "YOU HAVE ENOUGH."; +TXT_RPLY1_SCRIPT10_d37900_TEACH = "TEACH ME."; +TXT_RYES1_SCRIPT10_d37900_WELLT = "WELL, THAT'S IT, YOU'RE DONE. I CAN TEACH NO MORE."; +TXT_RNO1_SCRIPT10_d37900_RETUR = "RETURN AFTER MACIL TELLS YOU IT'S TIME."; +TXT_DLG_SCRIPT10_d39416_IVETA = "I'VE TAUGHT YOU EVERYTHING I CAN RIGHT NOW. I'VE GIVEN YOU ALL THAT YOU SHOULD EVER NEED, UNLESS YOU'RE OUT OF BULLETS. THOSE I CAN STILL HELP YOU WITH."; +TXT_RPLY0_SCRIPT10_d39416_YESIA = "YES I AM."; +TXT_RYES0_SCRIPT10_d39416_HEREY = "HERE YOU GO. "; +TXT_DLG_SCRIPT10_d40932_CHECK = "CHECK OUT WHAT'S NEW, THE TELEPORTER BEACON. WHEN YOU USE THE BEACON, WE'LL TRACK THE SIGNAL AND SEND HELP. IS THERE SOMETHING I CAN GET YOU?"; +TXT_RPLY0_SCRIPT10_d40932_BOXOF = "BOX OF ROCKETS"; +TXT_RYES0_SCRIPT10_d40932_THERE = "THERE YOU GO."; +TXT_RNO0_SCRIPT10_d40932_YOUCA = "YOU CAN'T AFFORD THAT!"; +TXT_RPLY1_SCRIPT10_d40932_HEGRE = "H-E GRENADES."; +TXT_RYES1_SCRIPT10_d40932_HEREY = "HERE YOU GO."; +TXT_RNO1_SCRIPT10_d40932_COMEB = "COME BACK WHEN YOU HAVE ENOUGH MONEY."; +TXT_RPLY2_SCRIPT10_d40932_ENERG = "ENERGY POD"; +TXT_RYES2_SCRIPT10_d40932_HERES = "HERE'S YOUR ENERGY POD"; +TXT_RNO2_SCRIPT10_d40932_YOUDO = "YOU DON'T HAVE ENOUGH FOR THAT."; +TXT_RPLY3_SCRIPT10_d40932_TELEP = "TELEPORTER BEACON"; +TXT_RYES3_SCRIPT10_d40932_HELPW = "HELP, WHEN AND WHERE YOU NEED IT."; +TXT_RNO3_SCRIPT10_d40932_SORRY = "SORRY, NO CHARITY."; +TXT_DLG_SCRIPT10_d42448_NOWTH = "NOW THAT WE ACTUALLY HAVE THE CASTLE UNDER CONTROL, WE HAVE TO BE EXTRA VIGILANT TO KEEP IT. THE ORDER'S PROBABLY GETTING READY TO STRIKE BACK RIGHT NOW."; +TXT_DLG_SCRIPT10_d43964_BECAR = "BE CAREFUL OUT THERE."; +TXT_DLG_SCRIPT10_d45480_KEEPU = "KEEP UP THE GREAT WORK, WE COULDN'T HAVE DONE IT WITHOUT YOU."; +TXT_DLG_SCRIPT10_d46996_WHATI = "WHAT IS THE WISDOM YOU SEEK?"; +TXT_RPLY0_SCRIPT10_d46996_THESI = "THE SIGIL OF THE ONE GOD."; +TXT_RYES0_SCRIPT10_d46996_THERE = "THE REMAINING PIECES LIE WRAPPED IN THE ARMS IN DARKNESS."; +TXT_DLG_SCRIPT10_d48512_THESE = "THE SECOND PIECE OF THE SIGIL LIES AT THE HEART OF THE CRIMSON AND OBSIDIAN TOWER. BE WARNED, THERE THE DRAGON AWAITS YOU. THE TIME OF YOUR COMING HAS BEEN FORETOLD. SEEK THE TOWER, YOUR PRIZE LIES WITHIN."; +TXT_RPLY0_SCRIPT10_d48512_WHATA = "WHAT ABOUT THE OTHER PIECES?"; +TXT_RYES0_SCRIPT10_d48512_RETUR = "RETURN AFTER YOU HAVE BESTED THE DRAGON."; +TXT_DLG_SCRIPT10_d50028_HEY = "HEY."; +TXT_RPLY0_SCRIPT10_d50028_STUFF = "STUFF"; +TXT_RYES0_SCRIPT10_d50028_HEREY = "HERE YOU GO."; +TXT_DLG_SCRIPT10_d51544_HEY = "HEY."; + +TXT_DLG_SCRIPT11_d0_IMTHE = "I'm the keymaster."; +TXT_DLG_SCRIPT11_d1516_ALOTO = "A LOT OF PEOPLE WOULD SAY THIS IS A THANKLESS AND INSIGNIFICANT JOB. BUT IT'S NOT, IN FACT..."; +TXT_RPLY0_SCRIPT11_d1516_GIVEM = "GIVE ME THE KEY!"; +TXT_DLG_SCRIPT11_d3032_OKBUT = "OK, BUT REMEMBER, I'M THE KEYMASTER."; +TXT_RPLY0_SCRIPT11_d3032_OKPAL = "OK PAL, WHATEVER."; +TXT_DLG_SCRIPT11_d4548_IMTHE = "I'm the keymaster."; +TXT_DLG_SCRIPT11_d6064_DIETR = "DIE TRAITOR!"; +TXT_DLG_SCRIPT11_d7580_DIETR = "DIE TRAITOR!"; +TXT_DLG_SCRIPT11_d9096_HAVEY = "HAVE YOU COME TO GLOAT? EVEN THOUGH WE'RE BEHIND THESE BARS, AS LONG AS WE HOLD ON, YOU STILL LOSE."; +TXT_DLG_SCRIPT11_d10612_LETUS = "LET US OUT OF HERE!"; +TXT_DLG_SCRIPT11_d12128_LEAVE = "LEAVE ME ALONE!"; + +TXT_DLG_SCRIPT12_d0_WHATI = "WHAT IS THE WISDOM YOU SEEK, SIMPLE ONE?"; +TXT_RPLY0_SCRIPT12_d0_THESI = "THE SIGIL OF THE ONE GOD."; +TXT_DLG_SCRIPT12_d1516_IFEEL = "I FEEL ONE FRAGMENT RESONATE WITHIN YOU. THE SECOND LIES AT THE HEART OF THE CRIMSON AND OBSIDIAN TOWER. THERE YOU MUST COMBAT THE BISHOP, WHO IS AWARE, AND AWAITS YOU. YOU WILL FIND HIM BY FOLLOWING HIS SYMBOL OF POWER. TAKE THIS TOKEN TO THE KEYMASTER. RETURN TO ME AFTER YOU HAVE SLAIN THE BEAST."; +TXT_RPLY0_SCRIPT12_d1516_ILLBE = "I'LL BE BACK."; +TXT_DLG_SCRIPT12_d3032_ALTHO = "ALTHOUGH THE BISHOP IS FORMIDABLE, THIS QUEST IS SLIGHT. RETURN TO ME WHEN YOU POSSESS THE NEXT FRAGMENT."; +TXT_DLG_SCRIPT12_d4548_YOURN = "Your next challenge will test your spirit. The third piece is held by your own leader. He is the same as that which he sends you to kill."; +TXT_RPLY0_SCRIPT12_d4548_MACIL = "MACIL? A TRAITOR?"; +TXT_DLG_SCRIPT12_d6064_YOURB = "Your blind faith has allowed him to advance to his goals with each piece you gain. Confront him and resolve your fate."; +TXT_RPLY0_SCRIPT12_d6064_ALLRI = "ALL RIGHT, IT IS MACIL."; +TXT_RPLY1_SCRIPT12_d6064_ITSYO = "IT'S YOU I DON'T TRUST."; +TXT_DLG_SCRIPT12_d7580_WHATE = "Whatever choice you make your kind shall perish under the will of the one god."; +TXT_RPLY0_SCRIPT12_d7580_ILLBE = "I'LL BE BACK WHEN MACIL'S DEAD."; +TXT_RPLY1_SCRIPT12_d7580_ICANT = "I CAN'T LET THAT HAPPEN."; +TXT_DLG_SCRIPT12_d9096_THERI = "THE RIVER OF TIME MOVES FOREVER ONWARD, WHILE YOU STAND STILL."; +TXT_DLG_SCRIPT12_d10612_YOUHA = "You have cut the cancer from your body, but your heart still beats. Next you must find the surgeon who butchers and controls your people, The LoreMaster. Stop him, and the next piece will be yours."; +TXT_RPLY0_SCRIPT12_d10612_WHERE = "WHERE DO I FIND HIM?"; +TXT_DLG_SCRIPT12_d12128_USETH = "Use the Teleporter behind the door I just opened to reach The LoreMaster. When he is dead, use the same device to return to me."; +TXT_RPLY0_SCRIPT12_d12128_ILLBE = "I'LL BE BACK, WITH HIS PIECE!"; +TXT_DLG_SCRIPT12_d13644_THERI = "THE RIVER OF TIME MOVES FOREVER ONWARD, WHILE YOU STAND STILL."; +TXT_DLG_SCRIPT12_d15160_PITIF = "Pitiful man, you have done what thousands have failed to do... you bring me the power of the SIGIL, the voice of the one God."; +TXT_RPLY0_SCRIPT12_d15160_IDONT = "I DON'T UNDERSTAND."; +TXT_DLG_SCRIPT12_d16676_THESI = "The SIGIL will open the door and free the spirit which will cleanse this planet and let me live forever. I will strip this world of its energies and find new worlds to conquer."; +TXT_RPLY0_SCRIPT12_d16676_ICANT = "I CAN'T LET YOU DO THAT."; +TXT_DLG_SCRIPT12_d18192_YOUCA = "YOU CAN IF YOU'RE DEAD."; +TXT_DLG_SCRIPT12_d19708_THESE = "THE SECOND PIECE OF THE SIGIL LIES AT THE HEART OF THE CRIMSON AND OBSIDIAN TOWER. BE WARNED, THERE THE DRAGON AWAITS YOU. THE TIME OF YOUR COMING HAS BEEN FORETOLD. SEEK THE TOWER, YOUR PRIZE LIES WITHIN."; +TXT_RPLY0_SCRIPT12_d19708_WHATA = "WHAT ABOUT THE OTHER PIECES?"; +TXT_RYES0_SCRIPT12_d19708_RETUR = "RETURN AFTER YOU HAVE BESTED THE DRAGON."; +TXT_DLG_SCRIPT12_d21224_HAVEY = "HAVE YOU BRAVED THE FURY OF THE DRAGON?"; +TXT_RPLY0_SCRIPT12_d21224_YES = "YES."; +TXT_RYES0_SCRIPT12_d21224_THENE = "THE NEXT CHALLENGE MAY PROVE YOUR GREATEST."; +TXT_RNO0_SCRIPT12_d21224_DONOT = "DO NOT RETURN UNTIL YOUR TASK IS FINISHED."; +TXT_RPLY1_SCRIPT12_d21224_NOIHA = "NO, I HAVEN'T"; +TXT_RYES1_SCRIPT12_d21224_SEEKT = "SEEK THE CRIMSON AND OBSIDIAN TOWER."; +TXT_DLG_SCRIPT12_d22740_THETH = "THE THIRD PIECE LIES AT THE HEART OF YOUR OWN. THE UNKNOWING BETRAYAL OF YOUR PEOPLE SHOULD CEASE BEFORE YOUR ACTIONS DESTROY THEM."; +TXT_RPLY0_SCRIPT12_d22740_WHATA = "WHAT ARE YOU TALKING ABOUT?"; +TXT_RYES0_SCRIPT12_d22740_YOUAR = "YOU ARE A SIMPLE PAWN IN THIS GAME."; +TXT_DLG_SCRIPT12_d24256_THETH = "THE THIRD PIECE IS HELD BY YOUR OWN LEADER, MACIL. HE IS THE SAME AS THAT WHICH HE SENDS YOU TO KILL. YOUR UNWAVERING FAITH HAS ALLOWED HIM TO STEP CLOSER TO COMPLETING HIS GOALS WITH EACH PIECE YOU WIN. HE MUST BE DESTROYED BEFORE HE IS ABLE TO OBTAIN ALL THE PIECES."; +TXT_RPLY0_SCRIPT12_d24256_WHATI = "WHAT IF HE GETS THEM ALL?"; +TXT_RYES0_SCRIPT12_d24256_THENH = "THEN HE WILL SHED HIS CLOAK OF LIES AND REVEAL HIS TRUE FACE."; +TXT_DLG_SCRIPT12_d25772_HEAND = "HE AND I, LIKE THE OTHERS, ARE THE LAST OF A RACE THAT USED TO RULE THIS WORLD. THEY CHOOSE TO USE THEIR POWER AGAINST HUMANS, I USE MINE TO HELP THEM. WITHOUT YOUR PEOPLE WE COULD NOT SURVIVE."; +TXT_RPLY0_SCRIPT12_d25772_WHYSH = "WHY SHOULD I TRUST YOU?"; +TXT_RYES0_SCRIPT12_d25772_BECAU = "BECAUSE I AM SPEAKING THE TRUTH."; +TXT_DLG_SCRIPT12_d27288_WREST = "WREST FROM MACIL, HIS SIGIL PIECE. RETURN WITH IT HERE AND I WILL GRANT YOU THE SAME REWARD AS HE. YOU MAY KEEP BOTH THE SIGIL PIECES AND THE KNOWLEDGE THAT YOU ARE HELPING YOUR PEOPLE INSTEAD OF WORKING TO DESTROY THEM. YOU MUST CHOOSE, I CANNOT LET YOU DEPART IF YOU STILL BELONG TO HIM."; +TXT_RPLY0_SCRIPT12_d27288_ALLRI = "ALL RIGHT, I'M IN."; +TXT_RYES0_SCRIPT12_d27288_RETUR = "RETURN HERE WHEN HE'S DEAD."; +TXT_RPLY1_SCRIPT12_d27288_IDONT = "I DON'T BELIEVE YOU."; +TXT_RYES1_SCRIPT12_d27288_THENY = "THEN YOU MUST DIE!"; +TXT_DLG_SCRIPT12_d28804_HAVEY = "HAVE YOU DESTROYED THE BETRAYER?"; +TXT_RPLY0_SCRIPT12_d28804_YESMA = "YES, MACIL IS GONE."; +TXT_RYES0_SCRIPT12_d28804_HERES = "HERE'S YOUR REWARD."; +TXT_RNO0_SCRIPT12_d28804_YOUMU = "YOU MUST FIRST ELIMINATE MACIL."; +TXT_DLG_SCRIPT12_d30320_NOWTH = "NOW THAT YOU HAVE CLEANSED THE POISON FROM YOUR PEOPLE, YOUR JOURNEY ON THE PATH TO FREEDOM CAN CONTINUE UNBURDENED. HERE ARE YOUR REWARDS, AS PROMISED TO YOU. RETURN TO YOUR FRIENDS TO REDEEM THEM. THE FUTURE HOLDS GREATER DANGER, BUT ALSO GREATER REWARDS."; +TXT_RPLY0_SCRIPT12_d30320_WHATS = "WHAT SORT OF REWARDS."; +TXT_RYES0_SCRIPT12_d30320_FREED = "FREEDOM AND PEACE."; +TXT_DLG_SCRIPT12_d31836_REWAR = "REWARDS THAT DWARF ALL THOSE THAT HAVE COME BEFORE. WITH NO LEADER, YOUR MOVEMENT MAY FLOUNDER. THE FAITH OF YOUR PEOPLE, WHICH YOU ONCE STRODE UPON TO VICTORY, HAS BEEN AS BADLY BATTERED AS THEIR PHYSICAL FORMS. THEY NEED YOUR REASSURANCE AND SUPPORT."; +TXT_RPLY0_SCRIPT12_d31836_HOWDO = "HOW DO YOU FIGURE THAT?"; +TXT_RYES0_SCRIPT12_d31836_YOUAR = "YOU ARE THE ONE WHO EXPOSED THE FRAUD AND WHO HOLDS THE SIGIL PIECES."; +TXT_DLG_SCRIPT12_d33352_THERE = "THE RESTORATION OF FAITH SHOULD BEGIN WITH THE RETRIEVAL OF THE THIRD PIECE. THE DARKEST HEART OF MY PEOPLE CLINGS TO THIS PIECE, ONE WHO REVELS IN SUBVERTING YOUR RACE AND REJOICES IN THE DEGRADATION OF THOSE WHO REFUSE TO JOIN HIM."; +TXT_RPLY0_SCRIPT12_d33352_WHERE = "WHERE CAN I FIND HIM?"; +TXT_RYES0_SCRIPT12_d33352_HENEV = "HE NEVER LEAVES HIS LABORATORIES ON THE OTHER SIDE OF THE FACTORY."; +TXT_DLG_SCRIPT12_d34868_THEUN = "THE UNFORTUNATE TRUTH IS WHAT LIES BETWEEN HE AND YOU. THE ORDER'S GREATEST CONCENTRATION OF FORCES INCLUDING, WHERE THEY ARE BUILT, BRED, AND WORSHIP. YOU MUST FIND YOUR WAY THROUGH THIS MAZE, FIND AND DESTROY THE LORE MASTER. BRING HIS PIECE BACK TO ME AND I WILL REWARD YOU."; +TXT_RPLY0_SCRIPT12_d34868_HOWAB = "HOW ABOUT SOME HELP?"; +TXT_RYES0_SCRIPT12_d34868_IWILL = "I WILL BE WITH YOU."; +TXT_DLG_SCRIPT12_d36384_THERE = "THERE ARE WAYS FOR ME TO COMMUNICATE WITH YOU, THERE ARE THOSE WITH MINDS WEAKER THAN MOST, I WILL SPEAK TO YOU THROUGH THEM. LOOK FOR THE FIRST OF THESE IN THE ORDER'S TOWN. THAT IS ALL I MAY DO RIGHT NOW."; +TXT_RPLY0_SCRIPT12_d36384_HOWWI = "HOW WILL I KNOW WHERE TO LOOK?"; +TXT_RYES0_SCRIPT12_d36384_NEART = "NEAR THE WATER FALL."; +TXT_DLG_SCRIPT12_d37900_HAVEY = "HAVE YOU DESTROYED THE LORE MASTER?"; +TXT_RPLY0_SCRIPT12_d37900_YESHE = "YES, HE'S GONE."; +TXT_RYES0_SCRIPT12_d37900_YOURR = "YOUR REWARDS CANNOT DO JUSTICE FOR THIS ACCOMPLISHMENT."; +TXT_RNO0_SCRIPT12_d37900_YOUMU = "YOU MUST FINISH HIM FIRST."; +TXT_RPLY1_SCRIPT12_d37900_NOIHA = "NO I HAVEN'T KILLED HIM, YET."; +TXT_RYES1_SCRIPT12_d37900_THEND = "THEN DO NOT RETURN UNTIL THAT IS DONE."; +TXT_DLG_SCRIPT12_d39416_ICANN = "I CANNOT THANK YOU ENOUGH, NOW I SHALL WIELD ALL THE POWER OF THE ONE GOD AND USE IT TO CRUSH YOU AND YOUR ENTIRE RACE."; +TXT_RPLY0_SCRIPT12_d39416_WHATA = "WHAT ABOUT PEACE AND goodwill?"; +TXT_RYES0_SCRIPT12_d39416_IDIOT = "IDIOT, THERE CAN BE NO PEACE AS LONG AS THE ONE GOD EXISTS!"; +TXT_DLG_SCRIPT12_d40932_ITCRE = "IT CREATED US TO HELP REAP THIS PLANETS ENERGIES AND FREE IT AND OURSELVES FROM THIS MISERABLE PIT. IT EXISTS, AND NOW I SHALL TAKE ITS PLACE AND RULE THIS WORLD! THE SIGIL WILL OPEN THE DOOR, AND WHEN I FINISH, I WILL HAVE EARNED MY OWN FREEDOM!"; +TXT_RPLY0_SCRIPT12_d40932_ICANT = "I CAN'T LET YOU DO THIS."; +TXT_RYES0_SCRIPT12_d40932_TRYAN = "TRY AND STOP ME PITIFUL MEAT BEING!"; + +TXT_DLG_SCRIPT14_d0_AREYO = "ARE YOU HERE TO FREE US? BECAUSE I'VE BEEN GOOD, THEY TOOK MY IMPLANT OUT. I STILL HAVE TO STAY DOWN HERE AND WIPE UP THE DROOL THOUGH."; +TXT_RPLY0_SCRIPT14_d0_YESIM = "YES, I'M HERE TO FREE YOU."; +TXT_RYES0_SCRIPT14_d0_YOUME = "YOU MEAN IT?"; +TXT_DLG_SCRIPT14_d1516_ICANT = "I CAN'T HELP NOBODY ELSE. NOT UNTIL YOU BLOW UP THE TRANSMITTER. THAT'S WHAT'S BEHIND THE FORCEFIELD UPSTAIRS. MY JOB IS TO CHECK ON THE CONVEYORS TO MAKE SURE THEY AREN'T JAMMED. NOT ANYMORE!"; +TXT_RPLY0_SCRIPT14_d1516_THATS = "THAT'S RIGHT, YOU'RE SAVED!"; +TXT_RYES0_SCRIPT14_d1516_OHTHA = "OH, THANK YOU!"; +TXT_DLG_SCRIPT14_d3032_WEREF = "WE'RE FREE!! WE'RE FREE!! WE'RE FREE!!"; +TXT_DLG_SCRIPT14_d4548_MUSTM = "MUST MINE MORE ORE!"; +TXT_DLG_SCRIPT14_d6064_WEREF = "WE'RE FREE!! WE'RE FREE!! WE'RE FREE!!"; +TXT_DLG_SCRIPT14_d7580_MUSTM = "MUST MINE MORE ORE!"; +TXT_DLG_SCRIPT14_d9096_WEREF = "WE'RE FREE!! WE'RE FREE!! WE'RE FREE!!"; +TXT_DLG_SCRIPT14_d10612_MUSTM = "MUST MINE MORE ORE!"; +TXT_DLG_SCRIPT14_d12128_WEREF = "WE'RE FREE!! WE'RE FREE!! WE'RE FREE!!"; + +TXT_DLG_SCRIPT15_d0_WHATA = "WHAT ARE YOU DOING HERE?"; +TXT_RPLY0_SCRIPT15_d0_ROUTI = "ROUTINE INSPECTION."; +TXT_RYES0_SCRIPT15_d0_ALLRI = "ALL RIGHT, CARRY ON."; +TXT_DLG_SCRIPT15_d1516_NOTHI = "NOTHING TO REPORT HERE. EVERYTHING IS WORKING FINE. IF ANYTHING GOES WRONG, I'LL BE SURE TO REPORT IT."; +TXT_DLG_SCRIPT15_d3032_SIRTH = "SIR, THERE WAS A PROBLEM EARLIER, BUT IT WAS TAKEN CARE OF."; + +TXT_DLG_SCRIPT17_d0_MOVEA = "Move along or taste metal."; +TXT_DLG_SCRIPT17_d1516_IDCHE = "I.D. check."; +TXT_RPLY0_SCRIPT17_d1516_HEREI = "HERE, I'M IN A HURRY."; +TXT_DLG_SCRIPT17_d3032_STOPW = "Stop waving your ID in my face and go in."; +TXT_DLG_SCRIPT17_d4548_NOTHI = "NOTHING TO SEE HERE. MOVE ALONG."; +TXT_DLG_SCRIPT17_d6064_WHATA = "What a healthy specimen. You don't need my help, do you?"; +TXT_RPLY0_SCRIPT17_d6064_WELLY = "WELL, YES. MACIL SENT ME."; +TXT_DLG_SCRIPT17_d7580_SHHHH = "Shhhh... keep it quiet, unless you want us both killed. Now, what can I do for you?"; +TXT_RPLY0_SCRIPT17_d7580_TELLM = "Tell me how to find The Bishop."; +TXT_DLG_SCRIPT17_d9096_OHHHI = "Ohhh, I knew you would ask me for that. Look behind you. That's the entrance to The Bishop's Citadel. It's guarded by a force field that is only shut off for official visitors, Not you."; +TXT_RPLY0_SCRIPT17_d9096_IMUST = "I must kill The Bishop."; +TXT_DLG_SCRIPT17_d10612_OHSUR = "OH, Sure YOU DO. First, fight your way into the Security Complex and use the Teleporter. And this might be more to your liking, destroy the computer in Central Administration. No computer, no force field."; +TXT_RPLY0_SCRIPT17_d10612_GREAT = "GREAT, THAT SOUNDS EASY."; +TXT_DLG_SCRIPT17_d12128_THERE = "There's an advantage to destroying the Computer, that's where the plans to the Tower are kept. Can you say, Five Finger Discount? HEH HEH!"; +TXT_RPLY0_SCRIPT17_d12128_ANYTH = "ANYTHING ELSE?"; +TXT_DLG_SCRIPT17_d13644_OHWEL = "OH WELL, Word has it that the Bailey's warehouse received a shipment of Maulers, that's the weapon that VAPORIZES."; +TXT_RPLY0_SCRIPT17_d13644_ISTHA = "IS THAT IT, NOW?"; +TXT_DLG_SCRIPT17_d15160_DONTY = "Don't you know the meaning of the words "get lost"?"; +TXT_DLG_SCRIPT17_d16676_TALKT = "TALK TO QUINCY FIRST. I'M NOT ALLOWED TO HELP ANYONE UNLESS HE SAYS IT'S OK."; +TXT_DLG_SCRIPT17_d18192_HOWHO = "HOW HOW CAN I HELP YOU TODAY?"; +TXT_RPLY0_SCRIPT17_d18192_MEDPA = "MED PATCH"; +TXT_RYES0_SCRIPT17_d18192_HERES = "HERE'S YOUR PATCH."; +TXT_RNO0_SCRIPT17_d18192_THATI = "THAT IS 15 GOLD MY FRIEND."; +TXT_RPLY1_SCRIPT17_d18192_MEDIC = "MEDICAL KIT"; +TXT_RYES1_SCRIPT17_d18192_HERES = "HERE'S YOUR MEDICAL KIT."; +TXT_RNO1_SCRIPT17_d18192_YOURE = "YOU'RE A BIT LOW ON FUNDS FOR THAT."; +TXT_RPLY2_SCRIPT17_d18192_FIELD = "FIELD SURGERY KIT"; +TXT_RYES2_SCRIPT17_d18192_ONEFI = "ONE FIELD SURGERY KIT, DONE."; +TXT_RNO2_SCRIPT17_d18192_COMEB = "COME BACK WHEN YOU HAVE MONEY!"; + +TXT_DLG_SCRIPT18_d0_WHATI = "WHAT IS IT?"; +TXT_RPLY0_SCRIPT18_d0_JUSTL = "JUST LOOKING AROUND."; +TXT_RYES0_SCRIPT18_d0_JUSTK = "JUST KEEP OUT OF THE WAY."; +TXT_DLG_SCRIPT18_d1516_THETE = "THE TEMPLARS WILL BE HERE SOON TO PICK UP THEIR NEW MAULERS. IF YOU GET IN THEIR WAY YOU'RE A DEAD MAN."; +TXT_RPLY0_SCRIPT18_d1516_MAULE = "MAULERS?"; +TXT_RYES0_SCRIPT18_d1516_THETE = "THE TEMPLAR'S FAVORITE WEAPON."; +TXT_DLG_SCRIPT18_d3032_THEYC = "THEY CAME IN EARLIER. THAT'S WHAT ALL THE SECURITY'S ABOUT. I GOT A CHANCE TO LOOK AT THEM WHEN I LOCKED UP. NOBODY'S SUPPOSED TO GO IN OR OUT OF THERE UNTIL THE REST OF THE PLATOON COMES TO CLAIM THEIR WEAPONS."; + +TXT_DLG_SCRIPT19_d0_THISI = "THIS IS WHERE YOU GET THE PLANS FOR THE CENTRAL ADMINISTRATION."; + +// MAP22 only has scripts in SVE +TXT_DLG_SCRIPT22_d0_IRUNT = "I RUN THIS PLACE. MY JOB IS TO BUILD THE RAW PARTS NEEDED FOR THE LOREMASTER'S ROBOT DESIGNS. IF YOU'RE NOT HERE ON OFFICIAL BUSINESS, THEN I'M AFRAID I DON'T HAVE TIME TO TALK."; +TXT_RPLY0_SCRIPT22_d0_IAMON = "I AM ON OFFICIAL BUSINESS."; +TXT_DLG_SCRIPT22_d1516_SOYOU = "SO YOU'VE SPOKEN WITH TIMOTHY, I SEE. HE AND I HAVE WORKED TOGETHER TO TRY TO UNRAVEL THE MYSTERIES OF THE ORDER, BEFORE IT'S TOO LATE FOR US ALL. MAYBE YOU CAN HELP US. I'VE OPENED THE DOOR TO THE PRODUCTION SECTOR."; +TXT_RPLY0_SCRIPT22_d1516_DOYOU = "DO YOU KNOW WHAT'S INSIDE?"; +TXT_DLG_SCRIPT22_d3032_ITSAT = "IT'S A TOP SECRET AREA. NOT ONLY IS THE ORDER BREEDING SOME KIND OF... CREATURE IN THERE, I'VE SEEN WITH MY OWN EYES A STRANGE ARTIFACT CALLED A "TALISMAN." NOBODY'S ALLOWED NEAR IT. RUMOR IS THAT IT HOLDS GREAT POWER IF UNITED WITH TWO OTHERS OF ITS KIND."; +TXT_RPLY0_SCRIPT22_d3032_ISUPP = "I SUPPOSE YOU WANT THIS THING?"; +TXT_DLG_SCRIPT22_d4548_NOIFY = "NO! IF YOU CAN FIND IT, IT'S YOURS TO KEEP. MAYBE YOU CAN USE IT TO HELP FREE US FROM OUR OPPRESSION. I'D WISH YOU LUCK, BUT YOU'RE GOING TO NEED A LOT MORE THAN THAT IF YOU GO IN THERE..."; +TXT_RPLY0_SCRIPT22_d4548_WHATS = "WHAT'S ALL THIS ABOUT THE PAST?"; +TXT_DLG_SCRIPT22_d6064_YOUVE = "YOU'VE SURELY SEEN THE OTHER RUINS NEARBY. IT SEEMS THAT THE "COMET" WHICH CRASHED ON OUR PLANET IS ACTUALLY A SPACE SHIP, AND BELIEVE IT OR NOT, IT ORIGINATED ON THIS VERY WORLD A LONG TIME AGO."; +TXT_RPLY0_SCRIPT22_d6064_SOTHE = "SO THE SPECTRES, THE ONE GOD..."; +TXT_DLG_SCRIPT22_d7580_THEYA = "THEY ARE CREATURES WHO ONCE RULED THIS WORLD AND ARE BENT ON CONSUMING ITS LIFE. THE ANCIENTS MANAGED TO SEAL THEM AWAY, BUT GAVE THEIR LIVES IN THE PROCESS. I'M AFRAID THAT'S ALL I KNOW."; +TXT_RPLY0_SCRIPT22_d7580_THANK = "THANKS... I'LL DO WHAT I CAN."; +TXT_DLG_SCRIPT22_d9096_GODSP = "GODSPEED, FRIEND."; +TXT_DLG_SCRIPT22_d10612_TALKT = "TALK TO THE MASTER SMITHY IF YOU HAVE QUESTIONS. ALL I DO IS PUT LABELS ON THE CRATES."; + +TXT_DLG_SCRIPT23_d0_WHATC = "WHAT CAN I GET YOU, CITIZEN?"; +TXT_RPLY0_SCRIPT23_d0_AMMOB = "AMMO BOX"; +TXT_RYES0_SCRIPT23_d0_HERES = "HERE'S YOUR AMMO."; +TXT_RNO0_SCRIPT23_d0_YOUDO = "YOU DON'T HAVE ENOUGH FOR THAT!"; +TXT_RPLY1_SCRIPT23_d0_CRATE = "CRATE OF MISSILES"; +TXT_RYES1_SCRIPT23_d0_HEREC = "HERE, CITIZEN."; +TXT_RNO1_SCRIPT23_d0_ITS85 = "IT'S 85 GOLD, CITIZEN!"; +TXT_RPLY2_SCRIPT23_d0_HEGRE = "H-E GRENADES"; +TXT_RYES2_SCRIPT23_d0_HEREA = "HERE ARE YOUR GRENADES."; +TXT_RNO2_SCRIPT23_d0_THEYA = "THEY ARE 100 GOLD, FRIEND."; +TXT_RPLY3_SCRIPT23_d0_ENERG = "ENERGY POD"; +TXT_RYES3_SCRIPT23_d0_HEREY = "HERE YOU ARE."; +TXT_RNO3_SCRIPT23_d0_THATS = "THAT'S 135 GOLD, SORRY."; +TXT_DLG_SCRIPT23_d1516_WHATC = "WHAT CAN I ASSIST YOU WITH?"; +TXT_RPLY0_SCRIPT23_d1516_LEATH = "LEATHER ARMOR"; +TXT_RYES0_SCRIPT23_d1516_HEREI = "HERE IT IS CITIZEN."; +TXT_RNO0_SCRIPT23_d1516_THERE = "THERE'S NO CHARITY GIVEN HERE!"; +TXT_RPLY1_SCRIPT23_d1516_METAL = "METAL ARMOR"; +TXT_RYES1_SCRIPT23_d1516_ANEXC = "AN EXCELLENT CHOICE CITIZEN."; +TXT_RNO1_SCRIPT23_d1516_YOUDO = "YOU DON'T HAVE ENOUGH FOR THIS!"; +TXT_RPLY2_SCRIPT23_d1516_ENVIR = "ENVIRONMENTAL SUIT"; +TXT_RYES2_SCRIPT23_d1516_HEREY = "HERE YOU ARE."; +TXT_RNO2_SCRIPT23_d1516_NOMON = "NO MONEY, NO SUIT."; +TXT_RPLY3_SCRIPT23_d1516_SOMET = "SOMETHING DIFFERENT?"; +TXT_RYES3_SCRIPT23_d1516_GOTHR = "GO THROUGH THE DOOR DOWN THE HALL."; +TXT_RNO3_SCRIPT23_d1516_YOUMU = "YOU MUST PAY IF YOU WANT TO PLAY."; +TXT_DLG_SCRIPT23_d3032_WHATC = "WHAT CAN I GET YOU?"; +TXT_RPLY0_SCRIPT23_d3032_LEATH = "LEATHER ARMOR"; +TXT_RYES0_SCRIPT23_d3032_HEREI = "HERE IT IS CITIZEN."; +TXT_RNO0_SCRIPT23_d3032_THERE = "THERE'S NO CHARITY GIVEN HERE!"; +TXT_RPLY1_SCRIPT23_d3032_METAL = "METAL ARMOR"; +TXT_RYES1_SCRIPT23_d3032_ANEXC = "AN EXCELLENT CHOICE CITIZEN."; +TXT_RNO1_SCRIPT23_d3032_YOUDO = "YOU DON'T HAVE ENOUGH FOR THIS!"; +TXT_RPLY2_SCRIPT23_d3032_ENVIR = "ENVIRONMENTAL SUIT"; +TXT_RYES2_SCRIPT23_d3032_HEREY = "HERE YOU ARE."; +TXT_RNO2_SCRIPT23_d3032_NOMON = "NO MONEY, NO SUIT."; +TXT_DLG_SCRIPT23_d4548_HOWCA = "HOW CAN I HELP YOU TODAY?"; +TXT_RPLY0_SCRIPT23_d4548_MEDPA = "MED PATCH"; +TXT_RYES0_SCRIPT23_d4548_HERES = "HERE'S YOUR PATCH."; +TXT_RNO0_SCRIPT23_d4548_THATI = "THAT IS 15 GOLD MY FRIEND."; +TXT_RPLY1_SCRIPT23_d4548_MEDIC = "MEDICAL KIT"; +TXT_RYES1_SCRIPT23_d4548_HERES = "HERE'S YOUR MEDICAL KIT."; +TXT_RNO1_SCRIPT23_d4548_YOURA = "YOUR A BIT LOW ON FUNDS FOR THAT."; +TXT_RPLY2_SCRIPT23_d4548_FIELD = "FIELD SURGERY KIT"; +TXT_RYES2_SCRIPT23_d4548_ONEFI = "ONE FIELD SURGERY KIT."; +TXT_RNO2_SCRIPT23_d4548_COMEB = "COME BACK WHEN YOU HAVE MONEY!"; +TXT_DLG_SCRIPT23_d6064_HELLO = "HELLO FRIEND, WHAT CAN I GET YOU?"; +TXT_RPLY0_SCRIPT23_d6064_INFOR = "INFORMATION"; +TXT_RYES0_SCRIPT23_d6064_IVENE = "I'VE NEVER SEEN ANYONE GO IN OR OUT OF THE FACTORY, THE FORCEFIELD'S ALWAYS UP."; +TXT_RNO0_SCRIPT23_d6064_NOMON = "NO MONEY, NO INFO."; +TXT_DLG_SCRIPT23_d7580_YESWH = "YES, WHAT WOULD YOU LIKE?"; +TXT_RPLY0_SCRIPT23_d7580_MOREI = "MORE INFO."; +TXT_RYES0_SCRIPT23_d7580_THEFA = "THE FACTORY'S BUILT ON THE COMET'S IMPACT SITE. I DON'T THINK IT'S BY CHANCE."; +TXT_RNO0_SCRIPT23_d7580_COMEO = "COME ON, IT'S A MEASLY 5 GOLD."; +TXT_DLG_SCRIPT23_d9096_HELLO = "HELLO AGAIN, WHAT'LL IT BE?"; +TXT_RPLY0_SCRIPT23_d9096_MOREI = "MORE INFO."; +TXT_RYES0_SCRIPT23_d9096_THEFA = "THE FACTORY CLOSED WHEN THE ORDER UNVEILED IT'S NEW HORROR: THE INQUISITOR."; +TXT_RNO0_SCRIPT23_d9096_5GOLD = "5 GOLD PLEASE."; +TXT_DLG_SCRIPT23_d10612_THATS = "THAT'S ALL I KNOW. EVEN BARTENDERS RUN OUT OF STUFF TO SAY, SORRY."; +TXT_DLG_SCRIPT23_d12128_HELLO = "HELLO."; +TXT_RPLY0_SCRIPT23_d12128_WHATA = "WHAT ARE YOU DOING?"; +TXT_RYES0_SCRIPT23_d12128_IMDOI = "I'M DOING STUFF, GO AWAY!"; +TXT_DLG_SCRIPT23_d13644_NOWWH = "NOW, WHAT CAN I HELP YOU WITH?"; +TXT_RPLY0_SCRIPT23_d13644_SHADO = "SHADOW ARMOR?"; +TXT_RYES0_SCRIPT23_d13644_AHHTO = "AHH, TO BE HEARD, BUT NOT SEEN!"; +TXT_RNO0_SCRIPT23_d13644_GETOU = "GET OUT OF HERE, COME BACK WHEN YOU HAVE SOME CASH."; +TXT_DLG_SCRIPT23_d15160_THANK = "Thank deus you got here. To enter the Factory you need a Key. We stole it but our agent is missing in the web of catacombs under the Order's stronghold. I have sent ten good men into those tunnels to find him, and none have returned. SOMETHING is down there!"; +TXT_RPLY0_SCRIPT23_d15160_WHATI = "What is it? Human or... ?"; +TXT_DLG_SCRIPT23_d16676_NOTDE = "NOT. Definitely NOT. Whatever it is, YOU must fight it to retrieve the key. I'll open the catacombs' entrance. When you've got it, the Factory is next to the mines. Hurry, each second counts."; +TXT_RPLY0_SCRIPT23_d16676_SOMET = "SOMETHING INHUMAN, EH?, GREAT."; +TXT_DLG_SCRIPT23_d18192_YOURE = "You're wasting time AND lives! Move!"; + +// New/moved content from SVE: +TXT_DLG_SCRIPT23_d10612_CANIB = "CAN I BE OF MORE HELP?"; +TXT_RPLY0_SCRIPT23_d10612_MOREI = "MORE INFO."; +TXT_RYES0_SCRIPT23_d10612_LOOKF = "LOOK FOR TIMOTHY. I'VE HEARD HE KNOWS SOME OF THE ORDER'S SECRETS."; +TXT_RNO0_SCRIPT23_d10612_JUSTA = "JUST ANOTHER 5 GOLD."; +TXT_DLG_SCRIPT23_d12128_THATS = "THAT'S ALL I KNOW. EVEN BARTENDERS RUN OUT OF STUFF TO SAY, SORRY."; +TXT_DLG_SCRIPT23_d13644_HELLO = "HELLO."; +TXT_RPLY0_SCRIPT23_d13644_WHATA = "WHAT ARE YOU DOING?"; +TXT_RYES0_SCRIPT23_d13644_IMDOI = "I'M DOING STUFF, GO AWAY!"; +TXT_DLG_SCRIPT23_d15160_IFYOU = "IF YOU HAVE THIS MUCH TIME TO WASTE, SEE IF YOU CAN FIND THE BLUE CHALICE. MY STUDIES ON THE ORDER SUGGEST THEY HAVE HIDDEN IT SOMEWHERE IN THE MANUFACTURING SECTOR OF THE FACTORY. THIS ARTIFACT WOULD BE OF GREAT VALUE TO ME, SO, BRING IT TO ME, AND I'LL HELP YOU OUT."; +TXT_DLG_SCRIPT23_d16676_YOUFO = "YOU FOUND THE BLUE CHALICE! OK, GIVE IT TO ME FIRST, AND WE'LL TRADE."; +TXT_RPLY0_SCRIPT23_d16676_TAKEI = "TAKE IT, IT'S BAD LUCK ANYWAY."; +TXT_RPLY1_SCRIPT23_d16676_SCREW = "SCREW YOU, I'M KEEPING IT."; +TXT_RYES1_SCRIPT23_d16676_THENI = "THEN I'M NOT GIVING YOU ANYTHING. GET LOST!"; +TXT_DLG_SCRIPT23_d18192_LOCAT = "LOCATE THE FORGE. THE INFORMATION I JUST GAVE YOU SHOULD HELP YOU ENTER A SECRETIVE SECTOR OF THE FACTORY. ONE OF THE FORGE WORKERS CAN OPEN THE DOOR."; +TXT_RPLY0_SCRIPT23_d18192_WHATC = "WHAT CAN I FIND THERE?"; +TXT_DLG_SCRIPT23_d19708_MYRES = "MY RESEARCH SUGGESTS THAT SOME DARK POWER FROM THE ANCIENT PAST IS HIDDEN THERE. BE CAREFUL!"; +TXT_DLG_SCRIPT23_d21224_THATB = "THAT BLUE CHALICE, HOW'D YOU COME BY IT? I'VE BEEN RESEARCHING THE ORDER AND THEIR LINKS TO THE DISTANT PAST, AND THAT ARTIFACT WOULD HELP ME. LET'S MAKE A DEAL. GIVE ME THE CHALICE, AND I'LL GIVE YOU SOME INFO."; +TXT_RPLY0_SCRIPT23_d21224_TAKEI = "TAKE IT, IT'S BAD LUCK ANYWAY."; +TXT_RPLY1_SCRIPT23_d21224_SCREW = "SCREW YOU, I'M KEEPING IT."; +TXT_RYES1_SCRIPT23_d21224_THENI = "THEN I'M NOT GIVING YOU ANYTHING. GET LOST!"; +TXT_DLG_SCRIPT23_d22740_NOWWH = "NOW, WHAT CAN I HELP YOU WITH?"; +TXT_RPLY0_SCRIPT23_d22740_SHADO = "SHADOW ARMOR?"; +TXT_RYES0_SCRIPT23_d22740_AHHTO = "AHH, TO BE HEARD, BUT NOT SEEN!"; +TXT_RNO0_SCRIPT23_d22740_GETOU = "GET OUT OF HERE, COME BACK WHEN YOU HAVE SOME CASH."; +TXT_DLG_SCRIPT23_d24256_THANK = "Thank deus you got here. To enter the Factory you need a Key. We stole it but our agent is missing in the web of catacombs under the Order's stronghold. I have sent ten good men into those tunnels to find him, and none have returned. SOMETHING is down there!"; +TXT_RPLY0_SCRIPT23_d24256_WHATI = "What is it? Human or... ?"; +TXT_DLG_SCRIPT23_d25772_NOTDE = "NOT. Definitely NOT. Whatever it is, YOU must fight it to retrieve the key. I'll open the catacombs' entrance. When you've got it, the Factory is next to the mines. Hurry, each second counts."; +TXT_RPLY0_SCRIPT23_d25772_SOMET = "SOMETHING INHUMAN, EH?, GREAT."; +TXT_DLG_SCRIPT23_d27288_YOURE = "You're wasting time AND lives! Move!"; + +TXT_DLG_SCRIPT27_d0_THEMA = "THE MASTER DOESN'T LIKE VISITORS. HE LIKES ALL OF HIS WORK TO REMAIN UNDISTURBED. I'VE GOT TO GO GET FRESH PARTS FROM THE STORAGE ROOM. I THINK HE SAID A LEG AND AN ARM. OH, WELL NO TIME TO TALK ANYMORE. I'D LEAVE BEFORE HE FINDS YOU."; +TXT_RPLY0_SCRIPT27_d0_WHYST = "WHY'S THAT."; +TXT_RYES0_SCRIPT27_d0_BECAU = "BECAUSE, I TOLD YOU HE DOESN'T LIKE VISITORS!"; +TXT_DLG_SCRIPT27_d1516_YOUKN = "YOU KNOW, YOU'RE ABOUT THE RIGHT SIZE FOR ONE OF THE ACOLYTE'S UNIFORMS."; + +TXT_DLG_SCRIPT31_d0_OHNOI = "OH NO, I'M NOT THE REAL PROGRAMMER, HE'S HIDING. CONTINUE PAST THE GUARD TRAINING AREA, VERY TOUGH. IF YOU SURVIVE, YOU MIGHT BE ABLE TO TALK TO HIM. OR KILL HIM."; +TXT_RPLY0_SCRIPT31_d0_WHOAR = "WHO ARE YOU?"; +TXT_DLG_SCRIPT31_d1516_YOULL = "YOU'LL NEVER FIND ANYTHING IF YOU HANG AROUND HERE."; + +TXT_DLG_SCRIPT32_d0_PISSO = "PISS OFF PEASANT!"; +TXT_DLG_SCRIPT32_d1516_DIELI = "DIE LITTLE MAN!"; +TXT_DLG_SCRIPT32_d3032_FINAL = "FINALLY I CAN GET OUT OF THIS CELL."; +TXT_RPLY0_SCRIPT32_d3032_WHYAR = "WHY ARE YOU IN HERE?"; +TXT_RYES0_SCRIPT32_d3032_IWASF = "I WAS FRAMED."; +TXT_DLG_SCRIPT32_d4548_HARRI = "HARRIS SAID THAT I WAS PLOTTING TO KILL THE GOVERNOR. I WOULD NEVER HARM A SOUL."; + +TXT_DLG_SCRIPT33_d0_BECAR = "BE CAREFUL OUT THERE."; +TXT_DLG_SCRIPT33_d1516_SAYFR = "SAY FRIEND, I'LL HELP YOU, IF YOU HELP ME. GIVE ME 5 GOLD AND I'LL TELL YOU WHAT I KNOW."; +TXT_RPLY0_SCRIPT33_d1516_HERES = "HERE'S THE GOLD."; +TXT_RYES0_SCRIPT33_d1516_IFYOU = "IF YOU PUNCH SOMEONE, YOU WON'T SET OFF THE ALARMS."; +TXT_RNO0_SCRIPT33_d1516_IWONT = "I WON'T TELL YOU ANYTHING FOR FREE!"; +TXT_DLG_SCRIPT33_d3032_IVEAL = "I'VE ALREADY TOLD YOU WHAT I KNOW."; +TXT_DLG_SCRIPT33_d4548_HELLO = "HELLO FRIEND. WHAT CAN I GET FOR YOU?"; +TXT_RPLY0_SCRIPT33_d4548_ELECT = "ELECTRIC BOLTS"; +TXT_RYES0_SCRIPT33_d4548_ONEQU = "ONE QUARREL IT IS."; +TXT_RNO0_SCRIPT33_d4548_YOURE = "YOU'RE BROKE!"; +TXT_RPLY1_SCRIPT33_d4548_10ROU = "10 ROUND CLIP"; +TXT_RYES1_SCRIPT33_d4548_HERES = "HERE'S YOUR AMMO"; +TXT_RNO1_SCRIPT33_d4548_SORRY = "SORRY, NO MONEY, NO BULLETS."; +TXT_RPLY2_SCRIPT33_d4548_50ROU = "50 ROUND BOX"; +TXT_RYES2_SCRIPT33_d4548_HEREY = "HERE YOU GO"; +TXT_RNO2_SCRIPT33_d4548_YOUDO = "YOU DON'T HAVE ENOUGH GOLD!"; +TXT_RPLY3_SCRIPT33_d4548_AMMOS = "AMMO SATCHEL"; +TXT_RYES3_SCRIPT33_d4548_THANK = "THANK YOU, ANYTHING ELSE?"; +TXT_RNO3_SCRIPT33_d4548_YOUCA = "YOU CAN'T AFFORD THAT, GOOD DAY."; +TXT_DLG_SCRIPT33_d6064_WELCO = "WELCOME. WHAT MAY I SHOW YOU?"; +TXT_RPLY0_SCRIPT33_d6064_ENVIR = "ENVIRONMENTAL SUIT"; +TXT_RYES0_SCRIPT33_d6064_HEREY = "HERE YOU ARE."; +TXT_RNO0_SCRIPT33_d6064_YOUDO = "YOU DON'T HAVE ENOUGH MONEY FOR THAT."; +TXT_RPLY1_SCRIPT33_d6064_LEATH = "LEATHER ARMOR."; +TXT_RYES1_SCRIPT33_d6064_HEREY = "HERE YOU ARE."; +TXT_RNO1_SCRIPT33_d6064_PERHA = "PERHAPS SOME OTHER TIME?"; +TXT_RPLY2_SCRIPT33_d6064_METAL = "METAL ARMOR"; +TXT_RYES2_SCRIPT33_d6064_WEARI = "WEAR IT IN GOOD HEALTH."; +TXT_RNO2_SCRIPT33_d6064_COMEB = "COME BACK WHEN YOU CAN AFFORD IT."; +TXT_DLG_SCRIPT33_d7580_HOWMA = "HOW MAY I ASSIST YOU?"; +TXT_RPLY0_SCRIPT33_d7580_MEDPA = "MED PATCH"; +TXT_RYES0_SCRIPT33_d7580_HERES = "HERE'S YOUR PATCH KIT."; +TXT_RNO0_SCRIPT33_d7580_YOUNE = "YOU NEED 10 GOLD FOR THAT."; +TXT_RPLY1_SCRIPT33_d7580_FIELD = "FIELD SURGERY KIT"; +TXT_RYES1_SCRIPT33_d7580_THANK = "THANK YOU."; +TXT_RNO1_SCRIPT33_d7580_IWISH = "I WISH I COULD GIVE THEM AWAY, BUT THEY COST 25 GOLD."; +TXT_RPLY2_SCRIPT33_d7580_HEALI = "HEALING"; +TXT_RYES2_SCRIPT33_d7580_THERE = "THERE YOU GO. TAKE CARE NOW."; +TXT_RNO2_SCRIPT33_d7580_WELLM = "WELL, MAYBE YOU CAN AFFORD SOME MED PATCHES?"; +TXT_DLG_SCRIPT33_d9096_HELLO = "HELLO FRIEND, I HAVEN'T SEEN YOU AROUND HERE BEFORE. ALL I CAN SAY IS THAT I'D BE CAREFUL IF I WERE YOU, THERE'S A LOT GOING ON AND IT'S BETTER IF YOU DON'T GET IN THE WAY."; +TXT_RPLY0_SCRIPT33_d9096_INFOR = "INFORMATION"; +TXT_RYES0_SCRIPT33_d9096_THESE = "THE SEWERS HOLD MORE THAN JUST RATS AND ROBOTS."; +TXT_RNO0_SCRIPT33_d9096_HEYAG = "HEY A GUY'S GOT TO MAKE SOME MONEY. YOU THINK THESE JOKERS TIP WELL?"; +TXT_DLG_SCRIPT33_d10612_BACKA = "BACK AGAIN HUH? WELL, AT LEAST YOU KNOW ENOUGH TO KEEP YOUR OWN SKIN INTACT. WHAT CAN I DO FOR YOU NOW?"; +TXT_RPLY0_SCRIPT33_d10612_MOREI = "MORE INFO"; +TXT_RYES0_SCRIPT33_d10612_THEGO = "THE GOVERNOR IS A SIMPLE REMINDER OF THE ORDER'S INFLUENCE."; +TXT_RNO0_SCRIPT33_d10612_COMEB = "COME BACK IF YOU CHANGE YOUR MIND."; +TXT_DLG_SCRIPT33_d12128_WELLY = "WELL, YOU'RE SURE ASKING A LOT OF QUESTIONS FOR SOMEONE WHO'S LIVED THIS LONG. THAT'S OK THOUGH, I'D RATHER TALK TO SOMEONE LIKE YOU THAN MOST OF THIS LOT."; +TXT_RPLY0_SCRIPT33_d12128_MOREI = "MORE INFO."; +TXT_RYES0_SCRIPT33_d12128_THERE = "THERE'S MORE TO THE ORDER THAN WHAT GOES ON AROUND HERE."; +TXT_RNO0_SCRIPT33_d12128_COMEB = "COME BACK IF YOU CHANGE YOUR MIND."; +TXT_DLG_SCRIPT33_d13644_THATS = "THAT'S IT FRIEND, THE WELL OF KNOWLEDGE HAS BEEN TAPPED. I'VE TOLD YOU MORE THAN I SHOULD HAVE ANYWAY."; +TXT_DLG_SCRIPT33_d15160_HARDT = "HARD TO SHOP FOR NEW TOYS... WHEN YOU'RE BROKE. RUN A LITTLE ERRAND FOR ME AND YOU'LL GET MORE THAN YOU COULD EVER SPEND. I'LL MAKE YOU A RICH MAN."; +TXT_RPLY0_SCRIPT33_d15160_IGOTN = "I GOT NOTHING BETTER TO DO."; +TXT_RPLY1_SCRIPT33_d15160_NOTHA = "NO THANKS."; +TXT_RYES1_SCRIPT33_d15160_NOBOD = "NOBODY WALKS AWAY FROM ME!"; +TXT_DLG_SCRIPT33_d16676_GOODC = "GOOD CHOICE. THE ORDER'S SANCTUARY BY THE RIVER IS THEIR UNOFFICIAL TORTURE CHAMBER. HIDDEN INSIDE THERE'S A GOLDEN CHALICE. YOU SWIPE IT, YOU MEET ME AT THE TAVERN, AND REAP YOUR REWARD."; +TXT_RPLY0_SCRIPT33_d16676_HOWAM = "HOW AM I SUPPOSED TO DO THAT?"; +TXT_RPLY1_SCRIPT33_d16676_LETME = "LET ME THINK ABOUT IT."; +TXT_RYES1_SCRIPT33_d16676_SORRY = "SORRY, NO SECOND CHANCES. OH, GUARDS, KILL HIM!"; +TXT_DLG_SCRIPT33_d18192_HERES = "HERE'S A CROSSBOW, JUST AIM STRAIGHT AND -- SPLAT!--. REMEMBER, GRAB THE FANCY CUP AND MEET ME AT THE TAVERN."; +TXT_RPLY0_SCRIPT33_d18192_ILLSE = "I'LL SEE YOU THERE."; +TXT_DLG_SCRIPT33_d19708_WHATA = "WHAT ARE YOU WAITING FOR? DON'T WORRY, I'LL CLEAN UP THE BODIES, JUST BRING ME THAT CHALICE!"; +TXT_DLG_SCRIPT33_d21224_GUARD = "GUARDS! KILL THE TRAITOR!"; +TXT_DLG_SCRIPT33_d22740_HEYIK = "HEY, I KNOW WHAT YOU'RE THINKING, KINDA LOOKS LIKE A SETUP, I WOULD NEVER DO THAT TO SUCH A KILLING MACHINE, I MEAN IT. WHEW, ALL THIS FUSS OVER A CUP, WEIRD. NOW GET READY, GOLD AND GLORY, LIKE I PROMISED. TAKE THIS KEY AND THE GOVERNOR HIMSELF WILL REWARD YOU."; +TXT_RPLY0_SCRIPT33_d22740_GREAT = "GREAT, I CAN'T WAIT!"; +TXT_RNO0_SCRIPT33_d22740_NOCHA = "NO CHALICE, NO MONEY!"; +TXT_RPLY1_SCRIPT33_d22740_ILLKE = "I'LL KEEP THE CHALICE, THANKS."; +TXT_RYES1_SCRIPT33_d22740_KEEPI = "KEEP IT? I THINK NOT!"; +TXT_DLG_SCRIPT33_d24256_WHATA = "WHAT ARE YOU WAITING FOR? THE GOVERNOR HIMSELF WILL REWARD YOU."; +TXT_DLG_SCRIPT33_d25772_DIETR = "DIE TRAITOR! "; +TXT_DLG_SCRIPT33_d27288_SOYOU = "SO YOU'RE THE FOOL WHO STOLE THE CHALICE? I'M GOING TO HAVE YOU ARRESTED AS A REBEL THIEF... THEREBY ENHANCING MY POSITION WITH THE ORDER. HOW DOES IT FEEL TO BE AN UNWITTING PAWN? "; +TXT_RPLY0_SCRIPT33_d27288_ITSUC = "IT SUCKS!"; +TXT_RYES0_SCRIPT33_d27288_FORYO = "FOR YOU IT DOES."; +TXT_RPLY1_SCRIPT33_d27288_HARRI = "HARRIS PROMISED ME MONEY!"; +TXT_RYES1_SCRIPT33_d27288_TOOBA = "TOO BAD. THE ONLY THING YOU'RE GETTING IS DEATH!"; +TXT_DLG_SCRIPT33_d28804_WEREG = "WE'RE GOING TO KILL YOU!"; +TXT_DLG_SCRIPT33_d30320_GETOU = "GET OUT OF HERE!"; +TXT_DLG_SCRIPT33_d31836_WEREG = "WE'RE GOING TO KILL YOU!"; +TXT_DLG_SCRIPT33_d33352_GETOU = "GET OUT OF HERE!"; + +TXT_DLG_SCRIPT34_d0_WHATA = "WHAT A PERFECT PLACE FOR US, UNDER THE OLD TOWN HALL. THE ORDER THINKS THEY'VE WIPED US OUT, BUT ALL IT WAS IS A REMINDER TO US OF WHAT CAN HAPPEN WHEN YOU BECOME CARELESS. "; +TXT_DLG_SCRIPT34_d1516_TALKT = "TALK TO MACIL, HE'LL BE ABLE TO HELP YOU."; +TXT_DLG_SCRIPT34_d3032_IVEHE = "I'VE HEARD THAT MACIL'S GOING TO START SOMETHING AGAIN SOON. WE NEED A BIG HIT AFTER THE LAST FIASCO. ONE MORE LIKE THAT AND WE'LL BE TOO WEAK TO CONTINUE."; +TXT_DLG_SCRIPT34_d4548_AFEWO = "A FEW OF THESE BARRELS DUMPED INTO THEIR WATER SUPPLY SHOULD EVEN THE ODDS A LITTLE. "; +TXT_DLG_SCRIPT34_d6064_IMWOR = "I'M WORKING ON SOMETHING THAT WILL GIVE US AN EDGE. IT WILL INCREASE YOUR STAMINA AND COMPLETELY JACK YOU UP. I'VE ALMOST GOT ALL THE BUGS WORKED OUT. CAN I DO SOMETHING FOR YOU? "; +TXT_RPLY0_SCRIPT34_d6064_PATCH = "PATCH ME UP."; +TXT_RYES0_SCRIPT34_d6064_BOYYO = "BOY, YOU'RE A REAL MESS. I'LL SEE WHAT I CAN DO."; +TXT_RPLY1_SCRIPT34_d6064_STAMI = "STAMINA IMPLANT?"; +TXT_RYES1_SCRIPT34_d6064_ALLRI = "ALL RIGHT THIS WON'T TAKE BUT A MOMENT."; +TXT_RNO1_SCRIPT34_d6064_ITSNO = "IT'S NOT DONE YET."; +TXT_DLG_SCRIPT34_d7580_HEYIM = "HEY, I'M WORKING ON AN UPDATED VERSION OF YOUR IMPLANT. IS THERE ANYTHING ELSE I CAN DO?"; +TXT_RPLY0_SCRIPT34_d7580_PATCH = "PATCH ME UP."; +TXT_RYES0_SCRIPT34_d7580_WELLA = "WELL AT LEAST YOU'RE SEEING ACTION."; +TXT_RPLY1_SCRIPT34_d7580_IMPLA = "IMPLANT UPGRADE?"; +TXT_RYES1_SCRIPT34_d7580_GOODT = "GOOD THING, NEVER CAN BE TOO SAFE."; +TXT_RNO1_SCRIPT34_d7580_IMALM = "I'M ALMOST FINISHED, BUT NOT QUITE."; +TXT_DLG_SCRIPT34_d9096_ALLRI = "ALL RIGHT, THIS IS IT. I'VE ALMOST GOT EVERYTHING WORKING PERFECTLY. THERE WERE A FEW PROBLEMS LEFT TO FIX, DO YOU NEED ANYTHING ELSE? "; +TXT_RPLY0_SCRIPT34_d9096_PATCH = "PATCH ME UP."; +TXT_RYES0_SCRIPT34_d9096_WHATH = "WHAT HAVE YOU BEEN TRYING TO DO? GO HEAD TO HEAD WITH A CRUSADER?"; +TXT_RPLY1_SCRIPT34_d9096_IMPLA = "IMPLANT UPGRADE?."; +TXT_RYES1_SCRIPT34_d9096_THATS = "THAT SHOULD DO IT FOR YOU."; +TXT_RNO1_SCRIPT34_d9096_LETME = "LET ME RUN SOME MORE TESTS FIRST."; +TXT_DLG_SCRIPT34_d10612_THATS = "THAT'S ALL I CAN DO ON THE IMPLANT RIGHT NOW. MAYBE SOME HEALING?"; +TXT_RPLY0_SCRIPT34_d10612_YEAH = "YEAH."; +TXT_RYES0_SCRIPT34_d10612_BOYYO = "BOY, YOU'RE A REAL MESS. I'LL SEE WHAT I CAN DO."; +TXT_DLG_SCRIPT34_d12128_WHATC = "WHAT CAN I DO FOR YOU?"; +TXT_RPLY0_SCRIPT34_d12128_IMOUT = "I'M OUT OF BULLETS."; +TXT_RYES0_SCRIPT34_d12128_HERES = "HERE'S SOME AMMO FOR YOU. DON'T WASTE IT."; +TXT_RPLY1_SCRIPT34_d12128_TEACH = "TEACH ME."; +TXT_RYES1_SCRIPT34_d12128_ALLRI = "ALL RIGHT, I'LL JUST SHOW YOU A FEW LITTLE POINTERS."; +TXT_RNO1_SCRIPT34_d12128_YOURE = "YOU'RE NOT READY YET."; +TXT_DLG_SCRIPT34_d13644_BACKA = "BACK AGAIN? WHAT DO YOU NEED?"; +TXT_RPLY0_SCRIPT34_d13644_IMOUT = "I'M OUT OF BULLETS."; +TXT_RYES0_SCRIPT34_d13644_HERES = "HERE'S SOME AMMO FOR YOU. DON'T WASTE IT."; +TXT_RNO0_SCRIPT34_d13644_YOUVE = "YOU'VE GOT ENOUGH AMMO."; +TXT_RPLY1_SCRIPT34_d13644_TEACH = "TEACH ME."; +TXT_RYES1_SCRIPT34_d13644_ALLRI = "ALL RIGHT, THIS SHOULD KEEP YOU GOING FOR A WHILE."; +TXT_RNO1_SCRIPT34_d13644_SORRY = "SORRY, CAN'T. I'M JUST FOLLOWING MACIL'S ORDERS."; +TXT_DLG_SCRIPT34_d15160_WELLW = "WELL WHICH IS IT, BULLETS OR TRAINING? I CAN'T WAIT TO GET MY HANDS ON THOSE NEW WEAPONS WE CAPTURED. ONCE I GET DONE WITH THEM, I'LL BE ABLE TO BEGIN TRAINING EVERYONE ELSE."; +TXT_RPLY0_SCRIPT34_d15160_IMOUT = "I'M OUT OF AMMO."; +TXT_RYES0_SCRIPT34_d15160_HERES = "HERE'S SOME AMMO FOR YOU. DON'T WASTE IT."; +TXT_RNO0_SCRIPT34_d15160_YOUVE = "YOU'VE GOT ENOUGH AMMO."; +TXT_RPLY1_SCRIPT34_d15160_TEACH = "TEACH ME."; +TXT_RYES1_SCRIPT34_d15160_OKTAK = "O.K. TAKE WHAT YOU'VE LEARNED AND SHOW THOSE ORDER BASTARDS THE WAY TO HELL."; +TXT_RNO1_SCRIPT34_d15160_COMEB = "COME BACK LATER, WHEN MACIL SAYS IT'S TIME."; +TXT_DLG_SCRIPT34_d16676_IVETA = "I'VE TAUGHT YOU EVERYTHING I CAN RIGHT NOW. GIVE ME SOME TIME TO PUT THE NEW WEAPONS THROUGH THEIR PACES. THAT IS UNLESS YOU'RE OUT OF BULLETS."; +TXT_RPLY0_SCRIPT34_d16676_YESIA = "YES I AM."; +TXT_RYES0_SCRIPT34_d16676_HEREY = "HERE YOU GO."; +TXT_DLG_SCRIPT34_d18192_DONTG = "DON'T GET TRIGGER HAPPY IN THE TOWN, YOU'LL SET OFF THE ALARM AND THEY WILL START SENDING IN GUARDS FROM THE CASTLE."; +TXT_DLG_SCRIPT34_d19708_WELCO = "WELCOME, WE CAN ALWAYS USE MORE HELP."; +TXT_DLG_SCRIPT34_d21224_WHENI = "WHEN I WAS STILL IN ACTION WE HAD THE CHANCE TO EXAMINE AN ACOLYTE BEFORE THE REINFORCEMENTS ARRIVED, THEY'RE NOT HUMAN I TELL YOU."; +TXT_DLG_SCRIPT34_d22740_WERET = "WE'RE TRYING TO FIND WHERE THE CASTLE GATE MECHANISMS ARE, BUT SO FAR WE'VE HAD NO LUCK."; +TXT_DLG_SCRIPT34_d24256_DONTG = "DON'T GET CAUGHT. I'VE HEARD HORROR STORIES ABOUT WHAT THEY DO TO OUR PEOPLE AFTER THEY'RE IMPRISONED. THEY JUST DISAPPEAR, NO TRACES, NOTHING. "; +TXT_DLG_SCRIPT34_d25772_HERES = "HERE'S SOME ADVICE, IF YOU EVER SEE ANY OF THE ORDER'S TIN SOLDIERS, RUN THE OTHER WAY. I ESPECIALLY DON'T LIKE THE REAVERS, THOSE THINGS ARE JUST DAMNED FAST!"; +TXT_DLG_SCRIPT34_d27288_WELCO = "WELCOME TO THE LAST FLICKER OF HOPE. ONLY WE HAVE THE FREE WILL TO OPPOSE THE ORDER. WE HAVE THE SHARPEST SCIENTIFIC MINDS, AND MANY ABLE BODIES. BUT WE LACK THAT ONE REAL PROBLEM SOLVER, WHO WILL GIVE US THE EDGE WE NEED."; +TXT_RPLY0_SCRIPT34_d27288_WHATW = "WHAT WILL I NEED TO DO? "; +TXT_DLG_SCRIPT34_d28804_HELPU = "HELP US. HELP US STEAL THEIR TECHNOLOGY. FREE OUR COMRADES. FIGHT THESE TWISTED PSYCHOPATHS TO THE DEATH. I'M ASKING YOU TO RISK YOUR LIFE FOR THE TRUTH."; +TXT_RPLY0_SCRIPT34_d28804_IMWIT = "I'M WITH YOU!"; +TXT_DLG_SCRIPT34_d30320_GOODB = "GOOD. BLACKBIRD WILL CONTINUE TO BE YOUR GUIDE. SHE'S TAKEN QUITE A SHINE TO YOU. TOGETHER, YOU'VE GOT TO UNLOCK THE SECRETS OF THE ORDER AND THEIR INHUMAN SERVANTS. THERE'S A PRESENCE THAT LURKS JUST OUTSIDE OUR UNDERSTANDING WHICH GUIDES THEIR TERROR. GET INSIDE AND TAKE THEM DOWN. "; +TXT_RPLY0_SCRIPT34_d30320_LETME = "LET ME AT 'EM!"; +TXT_RYES0_SCRIPT34_d30320_THATS = "THAT'S THE SPIRIT."; +TXT_DLG_SCRIPT34_d31836_WELCO = "WELCOME FRIEND!"; From 5a2d6de2961ae3633fc8105069328b5806212745 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Tue, 5 Feb 2019 18:34:02 +0100 Subject: [PATCH 162/164] - split up the OnDestroy method of interpolations. It seems there can be rare conditions where an interpolation is 'lost' and later garbage collected. If that happens after the owning map is gone, all pointers in the interpolation object will be invalid and Destroy would crash while trying to unlink it. So anything that explicitly deletes an interpolation now has to manually unlink it from the map first so that OnDestroy can be kept clean of map references. --- src/r_data/r_interpolate.cpp | 38 ++++++++++++++++++++---------------- src/r_data/r_interpolate.h | 2 +- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/src/r_data/r_interpolate.cpp b/src/r_data/r_interpolate.cpp index a5763627e..75169646f 100644 --- a/src/r_data/r_interpolate.cpp +++ b/src/r_data/r_interpolate.cpp @@ -62,7 +62,7 @@ public: DSectorPlaneInterpolation() {} DSectorPlaneInterpolation(sector_t *sector, bool plane, bool attach); - void OnDestroy() override; + void UnlinkFromMap() override; void UpdateInterpolation(); void Restore(); void Interpolate(double smoothratio); @@ -90,7 +90,7 @@ public: DSectorScrollInterpolation() {} DSectorScrollInterpolation(sector_t *sector, bool plane); - void OnDestroy() override; + void UnlinkFromMap() override; void UpdateInterpolation(); void Restore(); void Interpolate(double smoothratio); @@ -118,7 +118,7 @@ public: DWallScrollInterpolation() {} DWallScrollInterpolation(side_t *side, int part); - void OnDestroy() override; + void UnlinkFromMap() override; void UpdateInterpolation(); void Restore(); void Interpolate(double smoothratio); @@ -145,7 +145,7 @@ public: DPolyobjInterpolation() {} DPolyobjInterpolation(FPolyObj *poly); - void OnDestroy() override; + void UnlinkFromMap() override; void UpdateInterpolation(); void Restore(); void Interpolate(double smoothratio); @@ -302,10 +302,12 @@ void FInterpolator::ClearInterpolations() { DInterpolation *probe = Head; Head = nullptr; + while (probe != nullptr) { DInterpolation *next = probe->Next; probe->Next = probe->Prev = nullptr; + probe->UnlinkFromMap(); probe->Destroy(); probe = next; } @@ -348,7 +350,11 @@ int DInterpolation::AddRef() int DInterpolation::DelRef(bool force) { if (refcount > 0) --refcount; - if (force && refcount == 0) Destroy(); + if (force && refcount == 0) + { + UnlinkFromMap(); + Destroy(); + } return refcount; } @@ -358,11 +364,10 @@ int DInterpolation::DelRef(bool force) // //========================================================================== -void DInterpolation::OnDestroy() +void DInterpolation::UnlinkFromMap() { Level->interpolator.RemoveInterpolation(this); refcount = 0; - Super::OnDestroy(); } //========================================================================== @@ -411,7 +416,7 @@ DSectorPlaneInterpolation::DSectorPlaneInterpolation(sector_t *_sector, bool _pl // //========================================================================== -void DSectorPlaneInterpolation::OnDestroy() +void DSectorPlaneInterpolation::UnlinkFromMap() { if (sector != nullptr) { @@ -425,12 +430,11 @@ void DSectorPlaneInterpolation::OnDestroy() } sector = nullptr; } - for(unsigned i=0; iDelRef(); } attached.Reset(); - Super::OnDestroy(); } //========================================================================== @@ -508,7 +512,7 @@ void DSectorPlaneInterpolation::Interpolate(double smoothratio) { pplane->setD(oldheight + (bakheight - oldheight) * smoothratio); sector->SetPlaneTexZ(pos, oldtexz + (baktexz - oldtexz) * smoothratio, true); - P_RecalculateAttached3DFloors(sector); + P_RecalculateAttached3DFloors(sector); sector->CheckPortalPlane(pos); } } @@ -572,7 +576,7 @@ DSectorScrollInterpolation::DSectorScrollInterpolation(sector_t *_sector, bool _ // //========================================================================== -void DSectorScrollInterpolation::OnDestroy() +void DSectorScrollInterpolation::UnlinkFromMap() { if (sector != nullptr) { @@ -586,7 +590,6 @@ void DSectorScrollInterpolation::OnDestroy() } sector = nullptr; } - Super::OnDestroy(); } //========================================================================== @@ -626,6 +629,7 @@ void DSectorScrollInterpolation::Interpolate(double smoothratio) if (refcount == 0 && oldx == bakx && oldy == baky) { + UnlinkFromMap(); Destroy(); } else @@ -678,14 +682,13 @@ DWallScrollInterpolation::DWallScrollInterpolation(side_t *_side, int _part) // //========================================================================== -void DWallScrollInterpolation::OnDestroy() +void DWallScrollInterpolation::UnlinkFromMap() { if (side != nullptr) { side->textures[part].interpolation = nullptr; side = nullptr; } - Super::OnDestroy(); } //========================================================================== @@ -725,6 +728,7 @@ void DWallScrollInterpolation::Interpolate(double smoothratio) if (refcount == 0 && oldx == bakx && oldy == baky) { + UnlinkFromMap(); Destroy(); } else @@ -777,13 +781,12 @@ DPolyobjInterpolation::DPolyobjInterpolation(FPolyObj *po) // //========================================================================== -void DPolyobjInterpolation::OnDestroy() +void DPolyobjInterpolation::UnlinkFromMap() { if (poly != nullptr) { poly->interpolation = nullptr; } - Super::OnDestroy(); } //========================================================================== @@ -844,6 +847,7 @@ void DPolyobjInterpolation::Interpolate(double smoothratio) } if (refcount == 0 && !changed) { + UnlinkFromMap(); Destroy(); } else diff --git a/src/r_data/r_interpolate.h b/src/r_data/r_interpolate.h index 701d8c318..888f387c5 100644 --- a/src/r_data/r_interpolate.h +++ b/src/r_data/r_interpolate.h @@ -30,7 +30,7 @@ public: int AddRef(); int DelRef(bool force = false); - void OnDestroy() override; + virtual void UnlinkFromMap(); virtual void UpdateInterpolation() = 0; virtual void Restore() = 0; virtual void Interpolate(double smoothratio) = 0; From c25e7897a78365462890a31cb65870663c64a5c9 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 6 Feb 2019 09:25:45 +0100 Subject: [PATCH 163/164] - fixed bad default initialization of BoundingRect's coordinates. --- src/r_data/r_sections.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/r_data/r_sections.h b/src/r_data/r_sections.h index c971cb09b..fcd7cd3b2 100644 --- a/src/r_data/r_sections.h +++ b/src/r_data/r_sections.h @@ -34,7 +34,7 @@ struct BoundingRect void setEmpty() { left = top = FLT_MAX; - bottom = right = FLT_MIN; + bottom = right = -FLT_MAX; } bool contains(const BoundingRect & other) const From 6ae9df6a23aea4ec928e485d263820390e09f3d1 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 6 Feb 2019 09:38:17 +0100 Subject: [PATCH 164/164] - removed an old comment that no longer applied to the code in question. The interpolator had been changed long ago to use proper GC tracking, so interpolations only can get collected if they had been fully orphaned. This comment was the main reason why the design flaw in this code never got fixed until recently. --- src/r_data/r_interpolate.cpp | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/r_data/r_interpolate.cpp b/src/r_data/r_interpolate.cpp index 75169646f..aec62630c 100644 --- a/src/r_data/r_interpolate.cpp +++ b/src/r_data/r_interpolate.cpp @@ -172,20 +172,6 @@ IMPLEMENT_CLASS(DSectorScrollInterpolation, false, false) IMPLEMENT_CLASS(DWallScrollInterpolation, false, false) IMPLEMENT_CLASS(DPolyobjInterpolation, false, false) -//========================================================================== -// -// Important note: -// The linked list of interpolations and the pointers in the interpolated -// objects are not processed by the garbage collector. This is intentional! -// -// If an interpolation is no longer owned by any thinker it should -// be destroyed even if the interpolator still has a link to it. -// -// When such an interpolation is destroyed by the garbage collector it -// will automatically be unlinked from the list. -// -//========================================================================== - //========================================================================== // //