diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6e43c0d46..dd80d305f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -895,6 +895,7 @@ add_executable( zdoom WIN32 MACOSX_BUNDLE p_spec.cpp p_states.cpp p_switch.cpp + p_tags.cpp p_teleport.cpp p_terrain.cpp p_things.cpp diff --git a/src/p_spec.cpp b/src/p_spec.cpp index 8dbb73f37..934d93c4d 100644 --- a/src/p_spec.cpp +++ b/src/p_spec.cpp @@ -186,57 +186,6 @@ bool CheckIfExitIsGood (AActor *self, level_info_t *info) // UTILITIES // - - -// -// RETURN NEXT SECTOR # THAT LINE TAG REFERS TO -// - -// Find the next sector with a specified tag. -// Rewritten by Lee Killough to use chained hashing to improve speed - -int FSectorTagIterator::Next() -{ - int ret; - if (searchtag == INT_MIN) - { - ret = start; - start = -1; - } - else - { - while (start != -1 && sectors[start].tag != searchtag) start = sectors[start].nexttag; - if (start == -1) return -1; - ret = start; - start = sectors[start].nexttag; - } - return ret; -} - -int FSectorTagIterator::NextCompat(bool compat, int start) -{ - if (!compat) return Next(); - - for (int i = start + 1; i < numsectors; i++) - { - if (sectors[i].HasTag(searchtag)) return i; - } - return -1; -} - - -// killough 4/16/98: Same thing, only for linedefs - -int FLineIdIterator::Next() -{ - while (start != -1 && lines[start].id != searchtag) start = lines[start].nextid; - if (start == -1) return -1; - int ret = start; - start = lines[start].nextid; - return ret; -} - - //============================================================================ // // P_ActivateLine diff --git a/src/p_spec.h b/src/p_spec.h index 45eaf7e41..0c3ee8745 100644 --- a/src/p_spec.h +++ b/src/p_spec.h @@ -242,66 +242,8 @@ inline sector_t *getNextSector (line_t *line, const sector_t *sec) line->frontsector; } -class FSectorTagIterator -{ -protected: - int searchtag; - int start; -public: - FSectorTagIterator(int tag) - { - searchtag = tag; - start = sectors[(unsigned)tag % (unsigned)numsectors].firsttag; - } - - // Special constructor for actions that treat tag 0 as 'back of activation line' - FSectorTagIterator(int tag, line_t *line) - { - if (tag == 0) - { - searchtag = INT_MIN; - start = (line == NULL || line->backsector == NULL)? -1 : (int)(line->backsector - sectors); - } - else - { - searchtag = tag; - start = sectors[(unsigned)tag % (unsigned)numsectors].firsttag; - } - } - - int Next(); - int NextCompat(bool compat, int secnum); -}; - -class FLineIdIterator -{ -protected: - int searchtag; - int start; - -public: - FLineIdIterator(int id) - { - searchtag = id; - start = lines[(unsigned) id % (unsigned) numlines].firstid; - } - - 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(); -} +#include "p_tags.h" // // P_LIGHTS diff --git a/src/p_tags.cpp b/src/p_tags.cpp new file mode 100644 index 000000000..febedb85b --- /dev/null +++ b/src/p_tags.cpp @@ -0,0 +1,87 @@ +/* +** p_tags.cpp +** everything to do with tags and their management +** +**--------------------------------------------------------------------------- +** 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 "p_tags.h" + +// +// RETURN NEXT SECTOR # THAT LINE TAG REFERS TO +// + +// Find the next sector with a specified tag. +// Rewritten by Lee Killough to use chained hashing to improve speed + +int FSectorTagIterator::Next() +{ + int ret; + if (searchtag == INT_MIN) + { + ret = start; + start = -1; + } + else + { + while (start != -1 && sectors[start].tag != searchtag) start = sectors[start].nexttag; + if (start == -1) return -1; + ret = start; + start = sectors[start].nexttag; + } + return ret; +} + +int FSectorTagIterator::NextCompat(bool compat, int start) +{ + if (!compat) return Next(); + + for (int i = start + 1; i < numsectors; i++) + { + if (sectors[i].HasTag(searchtag)) return i; + } + return -1; +} + + +// killough 4/16/98: Same thing, only for linedefs + +int FLineIdIterator::Next() +{ + while (start != -1 && lines[start].id != searchtag) start = lines[start].nextid; + if (start == -1) return -1; + int ret = start; + start = lines[start].nextid; + return ret; +} + + diff --git a/src/p_tags.h b/src/p_tags.h new file mode 100644 index 000000000..e719c380e --- /dev/null +++ b/src/p_tags.h @@ -0,0 +1,68 @@ +#ifndef P_TAGS_H +#define P_TAGS_H 1 + +#include "r_defs.h" +#include "r_state.h" + +class FSectorTagIterator +{ +protected: + int searchtag; + int start; + +public: + FSectorTagIterator(int tag) + { + searchtag = tag; + start = sectors[(unsigned)tag % (unsigned)numsectors].firsttag; + } + + // Special constructor for actions that treat tag 0 as 'back of activation line' + FSectorTagIterator(int tag, line_t *line) + { + if (tag == 0) + { + searchtag = INT_MIN; + start = (line == NULL || line->backsector == NULL)? -1 : (int)(line->backsector - sectors); + } + else + { + searchtag = tag; + start = sectors[(unsigned)tag % (unsigned)numsectors].firsttag; + } + } + + int Next(); + int NextCompat(bool compat, int secnum); +}; + +class FLineIdIterator +{ +protected: + int searchtag; + int start; + +public: + FLineIdIterator(int id) + { + searchtag = id; + start = lines[(unsigned) id % (unsigned) numlines].firstid; + } + + 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