Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
221 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,220 @@ | ||
#pragma once | ||
|
||
BEGIN_PS_NS | ||
|
||
void mydeletesprite(int nSprite); | ||
|
||
class DExhumedActor; | ||
|
||
// Wrapper around the insane collision info mess from Build. | ||
struct Collision | ||
{ | ||
int type; | ||
int index; | ||
int legacyVal; // should be removed later, but needed for converting back for unadjusted code. | ||
DExhumedActor* actor; | ||
|
||
Collision() = default; | ||
Collision(int legacyval) { setFromEngine(legacyval); } | ||
|
||
// need forward declarations of these. | ||
int actorIndex(DExhumedActor*); | ||
DExhumedActor* Actor(int); | ||
|
||
int setNone() | ||
{ | ||
type = kHitNone; | ||
index = -1; | ||
legacyVal = 0; | ||
actor = nullptr; | ||
return kHitNone; | ||
} | ||
|
||
int setSector(int num) | ||
{ | ||
type = kHitSector; | ||
index = num; | ||
legacyVal = type | index; | ||
actor = nullptr; | ||
return kHitSector; | ||
} | ||
int setWall(int num) | ||
{ | ||
type = kHitWall; | ||
index = num; | ||
legacyVal = type | index; | ||
actor = nullptr; | ||
return kHitWall; | ||
} | ||
int setSprite(DExhumedActor* num) | ||
{ | ||
type = kHitSprite; | ||
index = -1; | ||
legacyVal = type | actorIndex(num); | ||
actor = num; | ||
return kHitSprite; | ||
} | ||
|
||
int setFromEngine(int value) | ||
{ | ||
legacyVal = value; | ||
type = value & kHitTypeMask; | ||
if (type == 0) { index = -1; actor = nullptr; } | ||
else if (type != kHitSprite) { index = value & kHitIndexMask; actor = nullptr; } | ||
else { index = -1; actor = Actor(value & kHitIndexMask); } | ||
return type; | ||
} | ||
}; | ||
|
||
class DExhumedActor | ||
{ | ||
int index; | ||
DExhumedActor* base(); | ||
|
||
public: | ||
|
||
DExhumedActor() :index(int(this - base())) {} | ||
DExhumedActor& operator=(const DExhumedActor& other) = default; | ||
|
||
void Clear() | ||
{ | ||
} | ||
|
||
spritetype& s() { return sprite[index]; } | ||
int GetIndex() { return index; } // should only be for error reporting or for masking to a slot index | ||
int GetSpriteIndex() { return index; } // this is only here to mark places that need changing later! | ||
|
||
/* | ||
void SetOwner(DExhumedActor* own) | ||
{ | ||
s().owner = own ? own->GetSpriteIndex() : -1; | ||
} | ||
DExhumedActor* GetOwner() | ||
{ | ||
if (s().owner == -1 || s().owner == MAXSPRITES - 1) return nullptr; | ||
return base() + s().owner; | ||
} | ||
*/ | ||
}; | ||
|
||
extern DExhumedActor exhumedActors[MAXSPRITES]; | ||
|
||
inline DExhumedActor* DExhumedActor::base() { return exhumedActors; } | ||
|
||
// 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) | ||
{ | ||
} | ||
|
||
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; | ||
} | ||
}; | ||
|
||
|
||
|
||
inline void DeleteSprite(DExhumedActor* nSprite) | ||
{ | ||
if (nSprite) mydeletesprite(nSprite->GetSpriteIndex()); | ||
} | ||
|
||
inline FSerializer& Serialize(FSerializer& arc, const char* keyname, DExhumedActor*& w, DExhumedActor** def) | ||
{ | ||
int index = w? int(w - exhumedActors) : -1; | ||
Serialize(arc, keyname, index, nullptr); | ||
if (arc.isReading()) w = index == -1? nullptr : &exhumedActors[index]; | ||
return arc; | ||
} | ||
|
||
inline void ChangeActorStat(DExhumedActor* actor, int stat) | ||
{ | ||
changespritestat(actor->GetSpriteIndex(), stat); | ||
} | ||
|
||
inline void ChangeActorSect(DExhumedActor* actor, int stat) | ||
{ | ||
changespritesect(actor->GetSpriteIndex(), stat); | ||
} | ||
|
||
inline void setActorPos(DExhumedActor* actor, vec3_t* pos) | ||
{ | ||
setsprite(actor->GetSpriteIndex(), pos); | ||
} | ||
|
||
END_BLD_NS |