Skip to content

Commit

Permalink
Refactor|Client|libdoomsday: Use player instances owned by DoomsdayApp
Browse files Browse the repository at this point in the history
Removed the global ddPlayers array. DoomsdayApp now owns either
ClientPlayer or ServerPlayer instances, which get used instead.
  • Loading branch information
skyjake committed Jul 25, 2015
1 parent 4a50c63 commit 0aea58a
Show file tree
Hide file tree
Showing 33 changed files with 242 additions and 216 deletions.
21 changes: 12 additions & 9 deletions doomsday/apps/client/include/world/p_players.h
Expand Up @@ -23,6 +23,14 @@
#include "api_player.h"
#include <de/String>

#ifdef __CLIENT__
# include "clientplayer.h"
typedef ClientPlayer AppPlayer;
#else
# include "serverplayer.h"
typedef ServerPlayer AppPlayer;
#endif

/**
* Describes a player interaction impulse.
*
Expand All @@ -36,19 +44,14 @@ struct PlayerImpulse
de::String bindContextName; ///< Symbolic name of the associated binding context.
};

struct player_t
{
byte extraLightCounter; // Num tics to go till extraLight is disabled.
int extraLight;
int targetExtraLight;
ddplayer_t shared; // The public player data.
};
typedef Player player_t; // to aid legacy code

extern player_t *viewPlayer;
extern player_t ddPlayers[DDMAXPLAYERS];
extern Player *viewPlayer;
extern int consolePlayer;
extern int displayPlayer;

AppPlayer *DD_Player(int number);

/**
* Determine which console is used by the given local player. Local players
* are numbered starting from zero.
Expand Down
2 changes: 1 addition & 1 deletion doomsday/apps/client/src/audio/s_main.cpp
Expand Up @@ -196,7 +196,7 @@ void S_EndFrame()

mobj_t *S_GetListenerMobj()
{
return ddPlayers[displayPlayer].shared.mo;
return DD_Player(displayPlayer)->publicData().mo;
}

sfxinfo_t *S_GetSoundInfo(int soundID, float *freq, float *volume)
Expand Down
32 changes: 16 additions & 16 deletions doomsday/apps/client/src/client/cl_main.cpp
Expand Up @@ -164,18 +164,18 @@ void Cl_AnswerHandshake()
for(int i = 0; i < DDMAXPLAYERS; ++i)
{
/// @todo With multiple local players, must clear only the appropriate flags.
ddPlayers[i].shared.flags &= ~DDPF_LOCAL;
DD_Player(i)->publicData().flags &= ~DDPF_LOCAL;

ddPlayers[i].shared.inGame = (playersInGame & (1 << i)) != 0;
DD_Player(i)->publicData().inGame = (playersInGame & (1 << i)) != 0;
}
consolePlayer = displayPlayer = myConsole;
clients[consolePlayer].viewConsole = consolePlayer;

// Mark us as the only local player.
ddPlayers[consolePlayer].shared.flags |= DDPF_LOCAL;
DD_Player(consolePlayer)->publicData().flags |= DDPF_LOCAL;

Smoother_Clear(clients[consolePlayer].smoother);
ddPlayers[consolePlayer].shared.flags &= ~DDPF_USE_VIEW_FILTER;
DD_Player(consolePlayer)->publicData().flags &= ~DDPF_USE_VIEW_FILTER;

isClient = true;
isServer = false;
Expand Down Expand Up @@ -227,9 +227,9 @@ void Cl_HandlePlayerInfo()
if(console >= DDMAXPLAYERS)
return;

player_t *plr = &ddPlayers[console];
bool present = plr->shared.inGame;
plr->shared.inGame = true;
player_t *plr = DD_Player(console);
bool present = plr->publicData().inGame;
plr->publicData().inGame = true;

strcpy(clients[console].name, name);

Expand All @@ -245,7 +245,7 @@ void Cl_HandlePlayerInfo()
void Cl_PlayerLeaves(int plrNum)
{
LOG_NET_NOTE("Player %i has left the game") << plrNum;
ddPlayers[plrNum].shared.inGame = false;
DD_Player(plrNum)->publicData().inGame = false;
gx.NetPlayerEvent(plrNum, DDPE_EXIT, 0);
}

Expand Down Expand Up @@ -397,11 +397,11 @@ static void assertPlayerIsValid(int plrNum)
if(!isClient || !Cl_GameReady() || clientPaused) return;
if(plrNum < 0 || plrNum >= DDMAXPLAYERS) return;

player_t *plr = &ddPlayers[plrNum];
player_t *plr = DD_Player(plrNum);
clplayerstate_t *s = ClPlayer_State(plrNum);

// Must have a mobj!
if(!s->clMobjId || !plr->shared.mo)
if(!s->clMobjId || !plr->publicData().mo)
return;

mobj_t *clmo = ClMobj_Find(s->clMobjId);
Expand All @@ -410,7 +410,7 @@ static void assertPlayerIsValid(int plrNum)
LOGDEV_NET_NOTE("Player %i does not have a clmobj yet [%i]") << plrNum << s->clMobjId;
return;
}
mobj_t *mo = plr->shared.mo;
mobj_t *mo = plr->publicData().mo;

/*
("Assert: client %i, clmo %i (flags 0x%x)", plrNum, clmo->thinker.id, clmo->ddFlags);
Expand Down Expand Up @@ -442,16 +442,16 @@ void Cl_Ticker(timespan_t ticLength)
// player's clmobj to its updated state.
for(int i = 0; i < DDMAXPLAYERS; ++i)
{
if(!ddPlayers[i].shared.inGame) continue;
if(!DD_Player(i)->publicData().inGame) continue;

if(i != consolePlayer)
{
if(ddPlayers[i].shared.mo)
if(DD_Player(i)->publicData().mo)
{
Smoother_AddPos(clients[i].smoother, Cl_FrameGameTime(),
ddPlayers[i].shared.mo->origin[VX],
ddPlayers[i].shared.mo->origin[VY],
ddPlayers[i].shared.mo->origin[VZ],
DD_Player(i)->publicData().mo->origin[VX],
DD_Player(i)->publicData().mo->origin[VY],
DD_Player(i)->publicData().mo->origin[VZ],
false);
}

Expand Down
8 changes: 4 additions & 4 deletions doomsday/apps/client/src/client/cl_mobj.cpp
Expand Up @@ -260,7 +260,7 @@ dd_bool ClMobj_Reveal(mobj_t *mob)
CL_ASSERT_CLMOBJ(mob);

// Check that we know enough about the clmobj.
if(mob->dPlayer != &::ddPlayers[consolePlayer].shared &&
if(mob->dPlayer != &DD_Player(consolePlayer)->publicData() &&
(!(info->flags & CLMF_KNOWN_X) ||
!(info->flags & CLMF_KNOWN_Y) ||
//!(info->flags & CLMF_KNOWN_Z) ||
Expand Down Expand Up @@ -304,10 +304,10 @@ static dd_bool ClMobj_IsStuckInsideLocalPlayer(mobj_t *mo)

for(int i = 0; i < DDMAXPLAYERS; ++i)
{
if(!ddPlayers[i].shared.inGame) continue;
if(!DD_Player(i)->publicData().inGame) continue;
if(P_ConsoleToLocal(i) < 0) continue; // Not a local player.

mobj_t *plmo = ddPlayers[i].shared.mo;
mobj_t *plmo = DD_Player(i)->publicData().mo;
if(!plmo) continue;

float blockRadius = Mobj_Radius(*mo) + Mobj_Radius(*plmo);
Expand Down Expand Up @@ -380,7 +380,7 @@ void ClMobj_ReadDelta()

mobj_t *d = mo;

/*if(d->dPlayer && d->dPlayer == &ddPlayers[consolePlayer])
/*if(d->dPlayer && d->dPlayer == DD_Player(consolePlayer))
{
// Mark the local player known.
cmo->flags |= CLMF_KNOWN;
Expand Down
22 changes: 11 additions & 11 deletions doomsday/apps/client/src/client/cl_player.cpp
Expand Up @@ -75,14 +75,14 @@ void ClPlayer_UpdateOrigin(int plrNum)
{
DENG2_ASSERT(plrNum >= 0 && plrNum < DDMAXPLAYERS);

player_t *plr = &ddPlayers[plrNum];
player_t *plr = DD_Player(plrNum);
clplayerstate_t *s = ClPlayer_State(plrNum);

if(!s->clMobjId || !plr->shared.mo)
if(!s->clMobjId || !plr->publicData().mo)
return; // Must have a mobj!

mobj_t *remoteClientMobj = ClMobj_Find(s->clMobjId);
mobj_t *localMobj = plr->shared.mo;
mobj_t *localMobj = plr->publicData().mo;

// The client mobj is never solid.
remoteClientMobj->ddFlags &= ~DDMF_SOLID;
Expand All @@ -105,9 +105,9 @@ void ClPlayer_ApplyPendingFixes(int plrNum)
LOG_AS("ClPlayer_ApplyPendingFixes");

clplayerstate_t *state = ClPlayer_State(plrNum);
player_t *plr = &ddPlayers[plrNum];
player_t *plr = DD_Player(plrNum);
mobj_t *clmo = ClPlayer_ClMobj(plrNum);
ddplayer_t *ddpl = &plr->shared;
ddplayer_t *ddpl = &plr->publicData();
mobj_t *mo = ddpl->mo;
bool sendAck = false;

Expand Down Expand Up @@ -186,8 +186,8 @@ void ClPlayer_HandleFix()

// Target player.
int plrNum = Reader_ReadByte(msgReader);
player_t *plr = &ddPlayers[plrNum];
ddplayer_t *ddpl = &plr->shared;
player_t *plr = DD_Player(plrNum);
ddplayer_t *ddpl = &plr->publicData();
clplayerstate_t *state = ClPlayer_State(plrNum);

// What to fix?
Expand Down Expand Up @@ -237,8 +237,8 @@ void ClPlayer_HandleFix()

void ClPlayer_MoveLocal(coord_t dx, coord_t dy, coord_t z, bool onground)
{
player_t *plr = &ddPlayers[consolePlayer];
ddplayer_t *ddpl = &plr->shared;
player_t *plr = DD_Player(consolePlayer);
ddplayer_t *ddpl = &plr->publicData();
mobj_t *mo = ddpl->mo;
if(!mo) return;

Expand Down Expand Up @@ -298,7 +298,7 @@ void ClPlayer_ReadDelta()
num &= 0xf; // Clear the upper bits of the number.

clplayerstate_t *s = &clPlayerStates[num];
ddplayer_t *ddpl = &ddPlayers[num].shared;
ddplayer_t *ddpl = &DD_Player(num)->publicData();

if(df & PDF_MOBJ)
{
Expand Down Expand Up @@ -472,7 +472,7 @@ void ClPlayer_ReadDelta()

mobj_t *ClPlayer_LocalGameMobj(int plrNum)
{
return ddPlayers[plrNum].shared.mo;
return DD_Player(plrNum)->publicData().mo;
}

bool ClPlayer_IsFreeToMove(int plrNum)
Expand Down
4 changes: 2 additions & 2 deletions doomsday/apps/client/src/client/cl_sound.cpp
Expand Up @@ -195,7 +195,7 @@ void Cl_ReadSoundDelta(deltatype_t type)
// from the real player mobj.
if(cmo && cmo->thinker.id == ClPlayer_State(consolePlayer)->clMobjId)
{
emitter = ddPlayers[consolePlayer].shared.mo;
emitter = DD_Player(consolePlayer)->publicData().mo;
}

// First stop any sounds originating from the same emitter.
Expand Down Expand Up @@ -290,7 +290,7 @@ void Cl_Sound()
{
dint const player = (flags & 0xf0) >> 4;
DENG2_ASSERT(player >= 0 && player < DDMAXPLAYERS);
S_LocalSoundAtVolume(sound, ::ddPlayers[player].shared.mo, volume / 127.0f);
S_LocalSoundAtVolume(sound, DD_Player(player)->publicData().mo, volume / 127.0f);
}
else
{
Expand Down
6 changes: 3 additions & 3 deletions doomsday/apps/client/src/dd_loop.cpp
Expand Up @@ -212,20 +212,20 @@ static void baseTicker(timespan_t time)
#endif

#ifdef LIBDENG_PLAYER0_MOVEMENT_ANALYSIS
if(::ddPlayers[0].shared.inGame && ::ddPlayers[0].shared.mo)
if(DD_Player(0)->publicData().inGame && DD_Player(0)->publicData().mo)
{
static coord_t prevPos[3] = { 0, 0, 0 };
static coord_t prevSpeed = 0;

mobj_t *mob = ::ddPlayers[0].shared.mo;
mobj_t *mob = DD_Player(0)->publicData().mo;

coord_t speed = V2d_Length(mob->mom);
coord_t actualMom[2] = { mob->origin[0] - prevPos[0], mob->origin[1] - prevPos[1] };
coord_t actualSpeed = V2d_Length(actualMom);

LOG_NOTE("%i,%f,%f,%f,%f")
<< SECONDS_TO_TICKS(sysTime + time)
<< ::ddPlayers[0].shared.forwardMove
<< DD_Player(0)->publicData().forwardMove
<< speed
<< actualSpeed
<< speed - prevSpeed;
Expand Down
2 changes: 1 addition & 1 deletion doomsday/apps/client/src/dd_main.cpp
Expand Up @@ -1177,7 +1177,7 @@ static dint DD_ActivateGameWorker(void *context)
// Invalidate old cmds and init player values.
for(dint i = 0; i < DDMAXPLAYERS; ++i)
{
player_t *plr = &ddPlayers[i];
player_t *plr = DD_Player(i);

plr->extraLight = plr->targetExtraLight = 0;
plr->extraLightCounter = 0;
Expand Down
2 changes: 1 addition & 1 deletion doomsday/apps/client/src/edit_bias.cpp
Expand Up @@ -108,7 +108,7 @@ void SBE_SetHueCircle(bool activate = true)

if(activate)
{
viewdata_t const &viewer = *R_ViewData(viewPlayer - ddPlayers);
viewdata_t const &viewer = *R_ViewData(DoomsdayApp::players().indexOf(viewPlayer));
hueCircle->setOrientation(viewer.frontVec, viewer.sideVec, viewer.upVec);
}
}
Expand Down
16 changes: 8 additions & 8 deletions doomsday/apps/client/src/network/net_demo.cpp
Expand Up @@ -99,7 +99,7 @@ dd_bool Demo_BeginRecording(char const * /*fileName*/, dint /*plrNum*/)

#if 0
client_t *cl = &::clients[plrNum];
player_t *plr = &::ddPlayers[plrNum];
player_t *plr = &DD_Player(plrNum);

// Is a demo already being recorded for this client?
if(cl->recording || ::playback || (::isDedicated && !plrNum) || !plr->shared.inGame)
Expand Down Expand Up @@ -403,8 +403,8 @@ dd_bool Demo_ReadPacket()
void Demo_WriteLocalCamera(dint plrNum)
{
DENG2_ASSERT(plrNum >= 0 && plrNum <= DDMAXPLAYERS);
player_t *plr = &::ddPlayers[plrNum];
ddplayer_t *ddpl = &plr->shared;
player_t *plr = DD_Player(plrNum);
ddplayer_t *ddpl = &plr->publicData();
mobj_t *mob = ddpl->mo;

if(!mob) return;
Expand Down Expand Up @@ -452,7 +452,7 @@ void Demo_WriteLocalCamera(dint plrNum)
void Demo_ReadLocalCamera()
{
DENG2_ASSERT(::consolePlayer >= 0 && consolePlayer < DDMAXPLAYERS);
ddplayer_t *pl = &::ddPlayers[::consolePlayer].shared;
ddplayer_t *pl = &DD_Player(::consolePlayer)->publicData();
mobj_t *mob = pl->mo;

if(!mob) return;
Expand Down Expand Up @@ -543,8 +543,8 @@ void Demo_Ticker(timespan_t /*time*/)
if(::playback)
{
DENG2_ASSERT(::consolePlayer >= 0 && ::consolePlayer < DDMAXPLAYERS);
player_t *plr = &::ddPlayers[::consolePlayer];
ddplayer_t *ddpl = &plr->shared;
player_t *plr = DD_Player(::consolePlayer);
ddplayer_t *ddpl = &plr->publicData();

ddpl->mo->angle += ::viewangleDelta;
ddpl->lookDir += ::lookdirDelta;
Expand All @@ -558,8 +558,8 @@ void Demo_Ticker(timespan_t /*time*/)
{
for(dint i = 0; i < DDMAXPLAYERS; ++i)
{
player_t &plr = ::ddPlayers[i];
ddplayer_t &ddpl = plr.shared;
player_t &plr = *DD_Player(i);
ddplayer_t &ddpl = plr.publicData();
client_t &cl = ::clients[i];

if(ddpl.inGame && cl.recording && !cl.recordPaused &&
Expand Down

0 comments on commit 0aea58a

Please sign in to comment.