2020-10-17 07:14:31 +00:00
|
|
|
#pragma once
|
|
|
|
#include "dobject.h"
|
|
|
|
#include "build.h"
|
|
|
|
|
|
|
|
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)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
DDukeActor *Next()
|
|
|
|
{
|
|
|
|
int n = NextIndex();
|
|
|
|
return n >= 0? &hittype[n] : nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
DDukeActor *Peek()
|
|
|
|
{
|
|
|
|
int n = PeekIndex();
|
|
|
|
return n >= 0? &hittype[n] : nullptr;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2020-10-17 07:26:52 +00:00
|
|
|
// 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;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2020-10-27 06:15:03 +00:00
|
|
|
class DukeLinearSpriteIterator
|
|
|
|
{
|
|
|
|
int index = 0;
|
|
|
|
public:
|
|
|
|
|
|
|
|
DDukeActor* Next()
|
|
|
|
{
|
|
|
|
while (index < MAXSPRITES)
|
|
|
|
{
|
|
|
|
auto p = &hittype[index++];
|
2021-04-15 17:21:43 +00:00
|
|
|
if (p->s->statnum != MAXSTATUS) return p;
|
2020-10-27 06:15:03 +00:00
|
|
|
}
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2020-10-17 07:26:52 +00:00
|
|
|
inline DDukeActor* player_struct::GetActor()
|
|
|
|
{
|
|
|
|
return &hittype[i];
|
|
|
|
}
|
|
|
|
|
|
|
|
inline int player_struct::GetPlayerNum()
|
|
|
|
{
|
2021-04-15 17:21:43 +00:00
|
|
|
return GetActor()->s->yvel;
|
2020-10-17 07:26:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Refactoring helpers/intermediates
|
2021-08-27 14:25:58 +00:00
|
|
|
inline void changeactorstat(DDukeActor* a, int newstat)
|
2020-10-17 07:26:52 +00:00
|
|
|
{
|
|
|
|
::changespritestat(a->GetIndex(), newstat);
|
|
|
|
}
|
|
|
|
|
2021-08-27 14:38:53 +00:00
|
|
|
inline void changeactorsect(DDukeActor* a, int newsect)
|
2020-10-17 07:26:52 +00:00
|
|
|
{
|
|
|
|
::changespritesect(a->GetIndex(), newsect);
|
|
|
|
}
|
|
|
|
|
|
|
|
inline int setsprite(DDukeActor* a, int x, int y, int z)
|
|
|
|
{
|
|
|
|
return ::setsprite(a->GetIndex(), x, y, z);
|
|
|
|
}
|
|
|
|
|
|
|
|
inline int setsprite(DDukeActor* a, const vec3_t& pos)
|
|
|
|
{
|
|
|
|
return ::setsprite(a->GetIndex(), pos.x, pos.y, pos.z);
|
|
|
|
}
|
|
|
|
|
|
|
|
// see comment for changespritestat.
|
|
|
|
inline int setsprite(int i, int x, int y, int z)
|
|
|
|
{
|
|
|
|
return ::setsprite(i, x, y, z);
|
|
|
|
}
|
|
|
|
|
|
|
|
inline int ActorToScriptIndex(DDukeActor* a)
|
|
|
|
{
|
|
|
|
if (!a) return -1;
|
|
|
|
return a->GetIndex();
|
|
|
|
}
|
|
|
|
|
|
|
|
inline DDukeActor* ScriptIndexToActor(int index)
|
|
|
|
{
|
2020-10-17 08:30:11 +00:00
|
|
|
// only allow valid actors to get through here. Everything else gets null'ed.
|
2021-04-15 17:21:43 +00:00
|
|
|
if (index < 0 || index >= MAXSPRITES || hittype[index].s->statnum == MAXSTATUS) return nullptr;
|
2020-10-17 07:26:52 +00:00
|
|
|
return &hittype[index];
|
|
|
|
}
|
|
|
|
|
2020-11-02 20:21:52 +00:00
|
|
|
int spawn_d(int j, int pn);
|
|
|
|
int spawn_r(int j, int pn);
|
|
|
|
|
2020-10-17 07:26:52 +00:00
|
|
|
inline DDukeActor* spawn(DDukeActor* spawner, int type)
|
|
|
|
{
|
2020-11-02 20:21:52 +00:00
|
|
|
int i = (isRR()? spawn_r : spawn_d)(spawner ? spawner->GetIndex() : -1, type);
|
2020-10-17 07:26:52 +00:00
|
|
|
return i == -1 ? nullptr : &hittype[i];
|
|
|
|
}
|
|
|
|
|
|
|
|
inline int ldist(DDukeActor* s1, DDukeActor* s2)
|
|
|
|
{
|
2021-04-15 17:21:43 +00:00
|
|
|
return ldist(s1->s, s2->s);
|
2020-10-17 07:26:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
inline int dist(DDukeActor* s1, DDukeActor* s2)
|
|
|
|
{
|
2021-04-15 17:21:43 +00:00
|
|
|
return dist(s1->s, s2->s);
|
2020-10-17 07:26:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
inline int badguy(DDukeActor* pSprite)
|
|
|
|
{
|
2021-04-15 17:21:43 +00:00
|
|
|
return badguypic(pSprite->s->picnum);
|
2020-10-17 07:26:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
inline int bossguy(DDukeActor* pSprite)
|
|
|
|
{
|
2021-04-15 17:21:43 +00:00
|
|
|
return bossguypic(pSprite->s->picnum);
|
2020-10-17 07:26:52 +00:00
|
|
|
}
|
|
|
|
|
2020-10-21 17:14:41 +00:00
|
|
|
// old interface versions of already changed functions
|
|
|
|
|
|
|
|
inline void deletesprite(int num)
|
|
|
|
{
|
|
|
|
deletesprite(&hittype[num]);
|
|
|
|
}
|
|
|
|
|
2020-10-24 07:31:15 +00:00
|
|
|
int movesprite_ex_d(DDukeActor* actor, int xchange, int ychange, int zchange, unsigned int cliptype, Collision& result);
|
|
|
|
int movesprite_ex_r(DDukeActor* actor, int xchange, int ychange, int zchange, unsigned int cliptype, Collision& result);
|
|
|
|
|
|
|
|
inline int movesprite_ex(DDukeActor* actor, int xchange, int ychange, int zchange, unsigned int cliptype, Collision& result)
|
|
|
|
{
|
|
|
|
auto f = isRR() ? movesprite_ex_r : movesprite_ex_d;
|
|
|
|
return f(actor, xchange, ychange, zchange, cliptype, result);
|
|
|
|
}
|
|
|
|
|
2020-10-21 20:43:23 +00:00
|
|
|
inline int clipmove_ex(int* x, int* y, int* z, short* sect, int xv, int yv, int wal, int ceil, int flor, int ct, Collision& result)
|
|
|
|
{
|
|
|
|
int res = clipmove(x, y, z, sect, xv, yv, wal, ceil, flor, ct);
|
|
|
|
return result.setFromEngine(res);
|
|
|
|
}
|
|
|
|
|
2020-10-21 23:10:56 +00:00
|
|
|
inline void getzrange_ex(int x, int y, int z, int16_t sectnum, int32_t* ceilz, Collision& ceilhit, int32_t* florz, Collision& florhit, int32_t walldist, uint32_t cliptype)
|
|
|
|
{
|
|
|
|
int ch, fh;
|
|
|
|
getzrange(x, y, z, sectnum, ceilz, &ch, florz, &fh, walldist, cliptype);
|
|
|
|
ceilhit.setFromEngine(ch);
|
|
|
|
florhit.setFromEngine(fh);
|
|
|
|
}
|
|
|
|
|
2020-10-23 21:18:05 +00:00
|
|
|
inline int hitscan(int x, int y, int z, int16_t sectnum, int32_t vx, int32_t vy, int32_t vz,
|
|
|
|
short* hitsect, short* hitwall, DDukeActor** hitspr, int* hitx, int* hity, int* hitz, uint32_t cliptype)
|
|
|
|
{
|
|
|
|
short hitsprt;
|
|
|
|
int res = ::hitscan(x, y, z, sectnum, vx, vy, vz, hitsect, hitwall, &hitsprt, hitx, hity, hitz, cliptype);
|
|
|
|
if (hitspr) *hitspr = hitsprt == -1 ? nullptr : &hittype[hitsprt];
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
2020-10-27 05:35:11 +00:00
|
|
|
inline void neartag(int32_t xs, int32_t ys, int32_t zs, int16_t sectnum, int16_t ange,
|
|
|
|
int16_t* neartagsector, int16_t* neartagwall, DDukeActor** neartagsprite,
|
|
|
|
int32_t* neartaghitdist, int32_t neartagrange, uint8_t tagsearch)
|
|
|
|
{
|
|
|
|
int16_t nts;
|
|
|
|
::neartag(xs, ys, zs, sectnum, ange, neartagsector, neartagwall, &nts, neartaghitdist, neartagrange, tagsearch);
|
|
|
|
*neartagsprite = nts == -1 ? nullptr : &hittype[nts];
|
|
|
|
}
|
|
|
|
|
2021-08-27 14:38:53 +00:00
|
|
|
|
2020-10-17 07:14:31 +00:00
|
|
|
END_DUKE_NS
|