Skip to content

Commit

Permalink
- consolidate the iterators in the backend.
Browse files Browse the repository at this point in the history
Using a template class that can adapt to the game specific types.
  • Loading branch information
coelckers committed Dec 4, 2021
1 parent 480070b commit 9c92e37
Show file tree
Hide file tree
Showing 5 changed files with 18 additions and 348 deletions.
4 changes: 2 additions & 2 deletions source/core/coreactor.h
Expand Up @@ -281,8 +281,8 @@ class TLinearSpriteIterator
{
while (index < MAXSPRITES)
{
auto p = static_cast<TActor*>(actorArray[index++]);
if (p->s().statnum != MAXSTATUS) return p;
auto p = actorArray[index++];
if (p->s().statnum != MAXSTATUS) return static_cast<TActor*>(p);
}
return nullptr;
}
Expand Down
92 changes: 4 additions & 88 deletions source/games/blood/src/bloodactor.h
Expand Up @@ -168,95 +168,11 @@ extern HitInfo gHitInfo;


// Iterator wrappers that return an actor pointer, not an index.
class BloodStatIterator : public StatIterator
{
public:
BloodStatIterator(int stat) : StatIterator(stat)
{
}

DBloodActor* Next()
{
int n = NextIndex();
return n >= 0 ? &bloodActors[n] : nullptr;
}

DBloodActor* Peek()
{
int n = PeekIndex();
return n >= 0 ? &bloodActors[n] : nullptr;
}
};

class BloodSectIterator : public SectIterator
{
public:
BloodSectIterator(int stat) : SectIterator(stat)
{
}

BloodSectIterator(sectortype* stat) : SectIterator(stat)
{
}

DBloodActor* Next()
{
int n = NextIndex();
return n >= 0 ? &bloodActors[n] : nullptr;
}

DBloodActor* Peek()
{
int n = PeekIndex();
return n >= 0 ? &bloodActors[n] : nullptr;
}
};

// An iterator to iterate over all sprites.
class BloodSpriteIterator
{
BloodStatIterator it;
int stat = kStatDecoration;

public:
BloodSpriteIterator() : it(kStatDecoration) {}

DBloodActor* Next()
{
while (stat < kStatFree)
{
auto ac = it.Next();
if (ac) return ac;
stat++;
if (stat < kStatFree) it.Reset(stat);
}
return nullptr;
}
};

// For iterating linearly over map spawned sprites.
class BloodLinearSpriteIterator
{
int index = 0;
public:

void Reset()
{
index = 0;
}

DBloodActor* Next()
{
while (index < MAXSPRITES)
{
auto p = &bloodActors[index++];
if (p->s().statnum != kStatFree) return p;
}
return nullptr;
}
};


using BloodStatIterator = TStatIterator<DBloodActor>;
using BloodSectIterator = TSectIterator<DBloodActor>;
using BloodSpriteIterator = TSpriteIterator<DBloodActor>;
using BloodLinearSpriteIterator = TLinearSpriteIterator<DBloodActor>;

inline int DeleteSprite(DBloodActor* nSprite)
{
Expand Down
86 changes: 4 additions & 82 deletions source/games/duke/src/dukeactor.h
Expand Up @@ -5,88 +5,10 @@
BEGIN_DUKE_NS


// Iterator wrappers that return an actor pointer, not an index.
class DukeStatIterator : public StatIterator
{
public:
DukeStatIterator(int stat) : StatIterator(stat)
{
}

DDukeActor *Next()
{
int n = NextIndex();
return n >= 0? &hittype[n] : nullptr;
}

DDukeActor *Peek()
{
int n = PeekIndex();
return n >= 0? &hittype[n] : nullptr;
}
};

class DukeSectIterator : public SectIterator
{
public:
DukeSectIterator(int stat) : SectIterator(stat)
{
}

DukeSectIterator(sectortype* stat) : SectIterator(stat)
{
}

DDukeActor *Next()
{
int n = NextIndex();
return n >= 0? &hittype[n] : nullptr;
}

DDukeActor *Peek()
{
int n = PeekIndex();
return n >= 0? &hittype[n] : nullptr;
}
};

// An interator to iterate over all sprites.
class DukeSpriteIterator
{
DukeStatIterator it;
int stat = STAT_DEFAULT;

public:
DukeSpriteIterator() : it(STAT_DEFAULT) {}

DDukeActor* Next()
{
while (stat < MAXSTATUS)
{
auto ac = it.Next();
if (ac) return ac;
stat++;
if (stat < MAXSTATUS) it.Reset(stat);
}
return nullptr;
}
};

class DukeLinearSpriteIterator
{
int index = 0;
public:

DDukeActor* Next()
{
while (index < MAXSPRITES)
{
auto p = &hittype[index++];
if (p->s->statnum != MAXSTATUS) return p;
}
return nullptr;
}
};
using DukeStatIterator = TStatIterator<DDukeActor>;
using DukeSectIterator = TSectIterator<DDukeActor>;
using DukeSpriteIterator = TSpriteIterator<DDukeActor>;
using DukeLinearSpriteIterator = TLinearSpriteIterator<DDukeActor>;

inline DDukeActor* player_struct::GetActor()
{
Expand Down
93 changes: 4 additions & 89 deletions source/games/exhumed/src/exhumedactor.h
Expand Up @@ -58,95 +58,10 @@ inline DExhumedActor* DExhumedActor::base() { return exhumedActors; }
using HitInfo = THitInfo<DExhumedActor>;
using Collision = TCollision<DExhumedActor>;

// Iterator wrappers that return an actor pointer, not an index.
class ExhumedStatIterator : public StatIterator
{
public:
ExhumedStatIterator(int stat) : StatIterator(stat)
{
}

DExhumedActor* Next()
{
int n = NextIndex();
return n >= 0 ? &exhumedActors[n] : nullptr;
}

DExhumedActor* Peek()
{
int n = PeekIndex();
return n >= 0 ? &exhumedActors[n] : nullptr;
}
};

class ExhumedSectIterator : public SectIterator
{
public:
ExhumedSectIterator(int stat) : SectIterator(stat)
{
}

ExhumedSectIterator(sectortype* stat) : SectIterator(stat)
{
}

DExhumedActor* Next()
{
int n = NextIndex();
return n >= 0 ? &exhumedActors[n] : nullptr;
}

DExhumedActor* Peek()
{
int n = PeekIndex();
return n >= 0 ? &exhumedActors[n] : nullptr;
}
};

// An iterator to iterate over all sprites.
class ExhumedSpriteIterator
{
ExhumedStatIterator it;
int stat = 0;

public:
ExhumedSpriteIterator() : it(0) {}

DExhumedActor* Next()
{
while (stat < MAXSTATUS)
{
auto ac = it.Next();
if (ac) return ac;
stat++;
if (stat < MAXSTATUS) it.Reset(stat);
}
return nullptr;
}
};

// For iterating linearly over map spawned sprites.
class ExhumedLinearSpriteIterator
{
int index = 0;
public:

void Reset()
{
index = 0;
}

DExhumedActor* Next()
{
while (index < MAXSPRITES)
{
auto p = &exhumedActors[index++];
if (p->s().statnum != MAXSTATUS) return p;
}
return nullptr;
}
};

using ExhumedStatIterator = TStatIterator<DExhumedActor>;
using ExhumedSectIterator = TSectIterator<DExhumedActor>;
using ExhumedSpriteIterator = TSpriteIterator<DExhumedActor>;
using ExhumedLinearSpriteIterator = TLinearSpriteIterator<DExhumedActor>;


inline FSerializer& Serialize(FSerializer& arc, const char* keyname, DExhumedActor*& w, DExhumedActor** def)
Expand Down

0 comments on commit 9c92e37

Please sign in to comment.