raze/source/games/duke/src/inlines.h
Mitchell Richters b23e77d9c7 - Replace player's ang with DAngle object.
* This commit does not build. Committed items are everything that's been done by find and replace.
* Next commit has hand-performed changes that are better separated out for clarity.
2022-10-05 00:36:27 +02:00

250 lines
5.7 KiB
C++

#pragma once
#include "mathutil.h"
#include "gamehud.h"
#include "global.h"
// all inline functions.
BEGIN_DUKE_NS
inline int rnd(int X)
{
return ((krand() >> 8) >= (255 - (X)));
}
inline bool AFLAMABLE(int X)
{
return (X == TILE_BOX || X == TILE_TREE1 || X == TILE_TREE2 || X == TILE_TIRE || X == TILE_CONE);
}
inline int badguypic(int const tileNum)
{
return ((gs.actorinfo[tileNum].flags & (SFLAG_INTERNAL_BADGUY | SFLAG_BADGUY)) != 0);
}
inline int bossguypic(int const tileNum)
{
return ((gs.actorinfo[tileNum].flags & (SFLAG_BOSS)) != 0);
}
inline int actorflag(DDukeActor * actor, EDukeFlags1 mask)
{
return (((gs.actorinfo[actor->spr.picnum].flags) & mask) != 0);
}
inline int actorflag(DDukeActor* actor, EDukeFlags2 mask)
{
return (((gs.actorinfo[actor->spr.picnum].flags2) & mask) != 0);
}
inline int attackerflag(DDukeActor* actor, EDukeFlags1 mask)
{
return (((gs.actorinfo[actor->attackertype].flags) & mask) != 0);
}
inline int attackerflag(DDukeActor* actor, EDukeFlags2 mask)
{
return (((gs.actorinfo[actor->attackertype].flags2) & mask) != 0);
}
inline int actorfella(DDukeActor* actor)
{
return actorflag(actor, SFLAG_KILLCOUNT);
}
inline void setflag(EDukeFlags1 flag, const std::initializer_list<short>& types)
{
for (auto val : types)
{
gs.actorinfo[val].flags |= flag;
}
}
inline void setflag(EDukeFlags2 flag, const std::initializer_list<short>& types)
{
for (auto val : types)
{
gs.actorinfo[val].flags2 |= flag;
}
}
inline bool inventory(DDukeActor* S)
{
return actorflag(S, SFLAG_INVENTORY);
}
inline void settileflag(int flag, const std::initializer_list<short>& types)
{
for (auto val : types)
{
gs.tileinfo[val].flags |= flag;
}
}
inline bool wallswitchcheck(DDukeActor* s)
{
return !!(gs.tileinfo[s->spr.picnum].flags & TFLAG_WALLSWITCH);
}
inline int checkcursectnums(sectortype* se)
{
int i;
for(i=connecthead;i>=0;i=connectpoint2[i])
if(ps[i].GetActor() && ps[i].GetActor()->sector() == se ) return i;
return -1;
}
inline int ldist(DDukeActor* s1, DDukeActor* s2)
{
int vx, vy;
vx = s1->int_pos().X - s2->int_pos().X;
vy = s1->int_pos().Y - s2->int_pos().Y;
return(FindDistance2D(vx, vy) + 1);
}
inline int ldist(const DDukeActor* s1, const tspritetype* s2)
{
int vx, vy;
vx = s1->int_pos().X - s2->int_pos().X;
vy = s1->int_pos().Y - s2->int_pos().Y;
return(FindDistance2D(vx, vy) + 1);
}
inline int dist(DDukeActor* s1, DDukeActor* s2)
{
int vx, vy, vz;
vx = s1->int_pos().X - s2->int_pos().X;
vy = s1->int_pos().Y - s2->int_pos().Y;
vz = s1->int_pos().Z - s2->int_pos().Z;
return(FindDistance3D(vx, vy, vz));
}
inline bool isIn(int value, int first)
{
return value == first;
}
template<typename... Args>
bool isIn(int value, int first, Args... args)
{
return value == first || isIn(value, args...);
}
inline bool isIn(int value, const std::initializer_list<int>& list)
{
for (auto v : list) if (v == value) return true;
return false;
}
// these are mainly here to avoid directly accessing the input data so that it can be more easily refactored later.
inline bool PlayerInput(int pl, ESyncBits bit)
{
return (!!((ps[pl].sync.actions) & bit));
}
inline ESyncBits PlayerInputBits(int pl, ESyncBits bits)
{
return (ps[pl].sync.actions & bits);
}
inline void PlayerSetInput(int pl, ESyncBits bit)
{
ps[pl].sync.actions |= bit;
}
inline int PlayerNewWeapon(int pl)
{
return ps[pl].sync.getNewWeapon();
}
inline void PlayerSetItemUsed(int pl, int num)
{
ps[pl].sync.setItemUsed(num - 1);
}
inline bool PlayerUseItem(int pl, int num)
{
return ps[pl].sync.isItemUsed(num - 1);
}
inline int PlayerInputSideVel(int pl)
{
return ps[pl].sync.svel;
}
inline int PlayerInputForwardVel(int pl)
{
return ps[pl].sync.fvel;
}
inline float PlayerInputAngVel(int pl)
{
return ps[pl].sync.avel;
}
inline float GetPlayerHorizon(int pl)
{
return ps[pl].sync.horz;
}
inline void clearfriction()
{
for (int i = 0; i != -1; i = connectpoint2[i])
{
ps[i].fric.X = ps[i].fric.Y = 0;
}
}
inline void SetPlayerPal(player_struct* p, PalEntry pe)
{
p->pals = pe;
}
inline bool playrunning()
{
return (paused == 0 || (paused == 1 && (ud.recstat == 2 || ud.multimode > 1)));
}
inline void doslopetilting(player_struct* p, double const scaleAdjust = 1)
{
bool const canslopetilt = p->on_ground && p->insector() && p->cursector->lotag != ST_2_UNDERWATER && (p->cursector->floorstat & CSTAT_SECTOR_SLOPE);
p->horizon.calcviewpitch(p->pos.XY(), p->angle.ang, p->aim_mode == 0, canslopetilt, p->cursector, scaleAdjust);
}
//---------------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------------
inline void hud_draw(double x, double y, int tilenum, int shade, int orientation)
{
int p = ps[screenpeek].cursector->floorpal;
hud_drawsprite(x, y, 65536, 0, tilenum, shade, p, 2 | orientation);
}
inline void animateshrunken(player_struct* p, double weapon_xoffset, double looking_arc, double look_anghalf, int tilenum, int8_t shade, int o, double smoothratio)
{
const double fistsign = bsinf(interpolatedvalue(p->ofistsign, p->fistsign, smoothratio), -10);
if (p->jetpack_on == 0) looking_arc += 32 - (p->GetActor()->spr.xvel >> 1);
hud_draw(weapon_xoffset + fistsign + 250 - look_anghalf, looking_arc + 258 - fabs(fistsign * 4), tilenum, shade, o);
hud_draw(weapon_xoffset - fistsign + 40 - look_anghalf, looking_arc + 200 + fabs(fistsign * 4), tilenum, shade, o | 4);
}
inline ESpriteFlags randomFlip()
{
int r = krand() & 12;
if (r == 0) return 0;
if (r == 4) return CSTAT_SPRITE_XFLIP;
if (r == 8) return CSTAT_SPRITE_YFLIP;
return CSTAT_SPRITE_XFLIP | CSTAT_SPRITE_YFLIP;
}
inline ESpriteFlags randomXFlip()
{
int r = krand() & 4;
if (r == 0) return 0;
return CSTAT_SPRITE_XFLIP;
}
END_DUKE_NS