diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 26871cf1e..6e43c0d46 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -834,6 +834,7 @@ add_executable( zdoom WIN32 MACOSX_BUNDLE f_wipe.cpp farchive.cpp files.cpp + g_doomedmap.cpp g_game.cpp g_hub.cpp g_level.cpp diff --git a/src/g_doomedmap.cpp b/src/g_doomedmap.cpp new file mode 100644 index 000000000..9ee2ce0c5 --- /dev/null +++ b/src/g_doomedmap.cpp @@ -0,0 +1,182 @@ +/* +** g_doomedmap.cpp +** +**--------------------------------------------------------------------------- +** Copyright 1998-2015 Randy Heit +** Copyright 2015 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 "info.h" +#include "m_fixed.h" +#include "c_dispatch.h" +#include "d_net.h" +#include "v_text.h" + +#include "gi.h" + +#include "actor.h" +#include "r_state.h" +#include "i_system.h" +#include "p_local.h" +#include "templates.h" +#include "cmdlib.h" +#include "g_level.h" + +//========================================================================== +// +// +//========================================================================== + +FDoomEdMap DoomEdMap; + +FDoomEdMap::FDoomEdEntry *FDoomEdMap::DoomEdHash[DOOMED_HASHSIZE]; + +FDoomEdMap::~FDoomEdMap() +{ + Empty(); +} + +void FDoomEdMap::AddType (int doomednum, const PClass *type, bool temporary) +{ + unsigned int hash = (unsigned int)doomednum % DOOMED_HASHSIZE; + FDoomEdEntry *entry = DoomEdHash[hash]; + while (entry && entry->DoomEdNum != doomednum) + { + entry = entry->HashNext; + } + if (entry == NULL) + { + entry = new FDoomEdEntry; + entry->HashNext = DoomEdHash[hash]; + entry->DoomEdNum = doomednum; + DoomEdHash[hash] = entry; + } + else if (!entry->temp) + { + Printf (PRINT_BOLD, "Warning: %s and %s both have doomednum %d.\n", + type->TypeName.GetChars(), entry->Type->TypeName.GetChars(), doomednum); + } + entry->temp = temporary; + entry->Type = type; +} + +void FDoomEdMap::DelType (int doomednum) +{ + unsigned int hash = (unsigned int)doomednum % DOOMED_HASHSIZE; + FDoomEdEntry **prev = &DoomEdHash[hash]; + FDoomEdEntry *entry = *prev; + while (entry && entry->DoomEdNum != doomednum) + { + prev = &entry->HashNext; + entry = entry->HashNext; + } + if (entry != NULL) + { + *prev = entry->HashNext; + delete entry; + } +} + +void FDoomEdMap::Empty () +{ + int bucket; + + for (bucket = 0; bucket < DOOMED_HASHSIZE; ++bucket) + { + FDoomEdEntry *probe = DoomEdHash[bucket]; + + while (probe != NULL) + { + FDoomEdEntry *next = probe->HashNext; + delete probe; + probe = next; + } + DoomEdHash[bucket] = NULL; + } +} + +const PClass *FDoomEdMap::FindType (int doomednum) const +{ + unsigned int hash = (unsigned int)doomednum % DOOMED_HASHSIZE; + FDoomEdEntry *entry = DoomEdHash[hash]; + while (entry && entry->DoomEdNum != doomednum) + entry = entry->HashNext; + return entry ? entry->Type : NULL; +} + +struct EdSorting +{ + const PClass *Type; + int DoomEdNum; +}; + +static int STACK_ARGS sortnums (const void *a, const void *b) +{ + return ((const EdSorting *)a)->DoomEdNum - + ((const EdSorting *)b)->DoomEdNum; +} + +void FDoomEdMap::DumpMapThings () +{ + TArray infos (PClass::m_Types.Size()); + int i; + + for (i = 0; i < DOOMED_HASHSIZE; ++i) + { + FDoomEdEntry *probe = DoomEdHash[i]; + + while (probe != NULL) + { + EdSorting sorting = { probe->Type, probe->DoomEdNum }; + infos.Push (sorting); + probe = probe->HashNext; + } + } + + if (infos.Size () == 0) + { + Printf ("No map things registered\n"); + } + else + { + qsort (&infos[0], infos.Size (), sizeof(EdSorting), sortnums); + + for (i = 0; i < (int)infos.Size (); ++i) + { + Printf ("%6d %s\n", + infos[i].DoomEdNum, infos[i].Type->TypeName.GetChars()); + } + } +} + +CCMD (dumpmapthings) +{ + FDoomEdMap::DumpMapThings (); +} diff --git a/src/info.cpp b/src/info.cpp index e26ac3b8e..f4852a1d1 100644 --- a/src/info.cpp +++ b/src/info.cpp @@ -389,139 +389,6 @@ fixed_t *DmgFactors::CheckFactor(FName type) return pdf; } -//========================================================================== -// -// -//========================================================================== - -FDoomEdMap DoomEdMap; - -FDoomEdMap::FDoomEdEntry *FDoomEdMap::DoomEdHash[DOOMED_HASHSIZE]; - -FDoomEdMap::~FDoomEdMap() -{ - Empty(); -} - -void FDoomEdMap::AddType (int doomednum, const PClass *type, bool temporary) -{ - unsigned int hash = (unsigned int)doomednum % DOOMED_HASHSIZE; - FDoomEdEntry *entry = DoomEdHash[hash]; - while (entry && entry->DoomEdNum != doomednum) - { - entry = entry->HashNext; - } - if (entry == NULL) - { - entry = new FDoomEdEntry; - entry->HashNext = DoomEdHash[hash]; - entry->DoomEdNum = doomednum; - DoomEdHash[hash] = entry; - } - else if (!entry->temp) - { - Printf (PRINT_BOLD, "Warning: %s and %s both have doomednum %d.\n", - type->TypeName.GetChars(), entry->Type->TypeName.GetChars(), doomednum); - } - entry->temp = temporary; - entry->Type = type; -} - -void FDoomEdMap::DelType (int doomednum) -{ - unsigned int hash = (unsigned int)doomednum % DOOMED_HASHSIZE; - FDoomEdEntry **prev = &DoomEdHash[hash]; - FDoomEdEntry *entry = *prev; - while (entry && entry->DoomEdNum != doomednum) - { - prev = &entry->HashNext; - entry = entry->HashNext; - } - if (entry != NULL) - { - *prev = entry->HashNext; - delete entry; - } -} - -void FDoomEdMap::Empty () -{ - int bucket; - - for (bucket = 0; bucket < DOOMED_HASHSIZE; ++bucket) - { - FDoomEdEntry *probe = DoomEdHash[bucket]; - - while (probe != NULL) - { - FDoomEdEntry *next = probe->HashNext; - delete probe; - probe = next; - } - DoomEdHash[bucket] = NULL; - } -} - -const PClass *FDoomEdMap::FindType (int doomednum) const -{ - unsigned int hash = (unsigned int)doomednum % DOOMED_HASHSIZE; - FDoomEdEntry *entry = DoomEdHash[hash]; - while (entry && entry->DoomEdNum != doomednum) - entry = entry->HashNext; - return entry ? entry->Type : NULL; -} - -struct EdSorting -{ - const PClass *Type; - int DoomEdNum; -}; - -static int STACK_ARGS sortnums (const void *a, const void *b) -{ - return ((const EdSorting *)a)->DoomEdNum - - ((const EdSorting *)b)->DoomEdNum; -} - -void FDoomEdMap::DumpMapThings () -{ - TArray infos (PClass::m_Types.Size()); - int i; - - for (i = 0; i < DOOMED_HASHSIZE; ++i) - { - FDoomEdEntry *probe = DoomEdHash[i]; - - while (probe != NULL) - { - EdSorting sorting = { probe->Type, probe->DoomEdNum }; - infos.Push (sorting); - probe = probe->HashNext; - } - } - - if (infos.Size () == 0) - { - Printf ("No map things registered\n"); - } - else - { - qsort (&infos[0], infos.Size (), sizeof(EdSorting), sortnums); - - for (i = 0; i < (int)infos.Size (); ++i) - { - Printf ("%6d %s\n", - infos[i].DoomEdNum, infos[i].Type->TypeName.GetChars()); - } - } -} - -CCMD (dumpmapthings) -{ - FDoomEdMap::DumpMapThings (); -} - - static void SummonActor (int command, int command2, FCommandLine argv) { if (CheckCheatmode ())