#include "pch.h"
class CZonePlayerImpl;
class CZonePlayerImpl:
public IZonePlayer
{
public:
CZonePlayerImpl(const char *szName, int nID) :
m_nID(nID),
m_rank(IMemberBase::RANK_UNKNOWN)
{
strncpy(m_szName, szName, sizeof(m_szName)-1);
}
void Randomize() {
#ifdef DEBUG
static int i = 0;
m_rank = (Rank) (i % 3 + 1);
switch (i % 3)
{
case 0:
strcpy (m_szName, "John Doe");
break;
case 1:
strcpy (m_szName, "Susan Wilson");
break;
case 2:
strcpy (m_szName, "Bill Smith");
break;
}
++i;
#endif
}
char * GetName()
{
return m_szName;
}
void SetName(PCC szName) { strcpy(m_szName, szName); }
int GetID() { return m_nID; }
void SetID(int nID) { m_nID = nID; }
char * GetLastPlayedDate(IZoneSquad & squad);
void SetLastPlayedDate(IZoneSquad & squad, PCC szLastPlayedDate);
Rank GetRank()
{
return m_rank;
}
void SetRank(Rank rank)
{
m_rank = rank;
}
float GetHours(IZoneSquad & squad);
void SetHours(IZoneSquad & squad, float fHours);
Position GetPosition(IZoneSquad & squad);
void SetPosition(IZoneSquad & squad, Position pos); DetailedStatus GetStatus(IZoneSquad & squad);
bool IsMemberOf(IZoneSquad & squad) {
DetailedStatus status = GetStatus(squad);
if (status == DSTAT_MEMBER || status == DSTAT_ASL || status == DSTAT_LEADER)
return true;
return false;
}
bool IsPendingFor(IZoneSquad & squad)
{
return GetStatus(squad) == DSTAT_PENDING;
}
private:
char m_szName[40];
int m_nID;
Rank m_rank;
};
class CMembership:
public IObject
{
TRef<IZonePlayer> m_pPlayer;
IZonePlayer::DetailedStatus m_dstatus;
char m_szLastPlayedDate[9];
public:
CMembership() :
m_pPlayer(NULL),
m_dstatus(IZonePlayer::DSTAT_NO_ASSOCIATION)
{
strcpy(m_szLastPlayedDate, " ");
}
IZonePlayer::Position GetPosition()
{
return IZonePlayer::Position(m_dstatus - ((int)IZonePlayer::DSTAT_MEMBER - (int)IZonePlayer::POS_MEMBER));
}
void SetPosition(IZonePlayer::Position pos)
{
m_dstatus = IZonePlayer::DetailedStatus(pos + (IZonePlayer::DSTAT_MEMBER - IZonePlayer::POS_MEMBER));
}
IMemberBase::DetailedStatus GetStatus()
{
return m_dstatus;
}
char * GetLastPlayedDate()
{
return m_szLastPlayedDate;
}
void SetLastPlayedDate(PCC szLastPlayedDate)
{
strncpy (m_szLastPlayedDate, szLastPlayedDate, sizeof(m_szLastPlayedDate));
}
void SetStatus(IMemberBase::DetailedStatus detailedstatus)
{
m_dstatus = detailedstatus;
}
TRef<IZonePlayer> GetPlayer() { return m_pPlayer; }
void SetPlayer(TRef<IZonePlayer> pPlayer) { m_pPlayer = pPlayer; }
};
class CZoneSquadImpl:
public IZoneSquad
{
public:
char *GetName() { return m_szName; }
void SetName(PCC szName) { strcpy(m_szName, szName); }
char *GetDescription() { return m_szDescription; }
void SetDescription(PCC szDescription) { strcpy(m_szDescription, szDescription); }
int GetID() { return m_nID; }
void SetID(int nID) { m_nID = nID; }
int GetCreationID() { return m_nCreationID; }
void SetCreationID(int nCreationID) { m_nCreationID = nCreationID; }
char *GetURL() { return m_szURL; }
void SetURL(PCC szURL) { strcpy(m_szURL, szURL); }
char *GetInceptionDate() { return m_szInceptionDate; }
void SetInceptionDate(char *szInceptionDate) { strcpy(m_szInceptionDate, szInceptionDate); }
TRef<IZonePlayer> GetOwner()
{
return m_pOwner;
}
void SetOwner(TRef<IZonePlayer> pOwner);
const char * GetRank()
{
Rank rank = Rank(m_nScore / 100);
if (rank < RANK_START || rank >= RANK_MAX)
return Rank2String(RANK_UNKNOWN);
return Rank2String(rank);
}
int GetRanking(SQUAD_SORT_COLUMN column)
{
return m_nRanking[column];
}
void SetRanking(SQUAD_SORT_COLUMN column, int nRanking)
{
m_nRanking[column] = nRanking;
}
int GetWins()
{
return m_nWins;
}
void SetWins(int nWins)
{
m_nWins = nWins;
}
int GetLosses()
{
return m_nLosses;
}
void SetLosses(int nLosses)
{
m_nLosses = nLosses;
}
CivID GetCivID()
{
return m_idCiv;
}
void SetCivID(int id)
{
m_idCiv = id;
}
short GetScore()
{
return m_nScore;
}
void SetScore(short nScore)
{
m_nScore = nScore;
}
void SetDetailsReceived()
{
m_bDetailsReceived = true;
}
bool WereDetailsReceived()
{
return m_bDetailsReceived;
}
void AddPlayer(IZonePlayer & pPlayer); void QuitPlayer(IZonePlayer & pPlayer); void RejectPlayer(IZonePlayer & pPlayer);
void BootPlayer(IZonePlayer & pPlayer);
void AddJoinRequest(IZonePlayer & pPlayer);
void CancelJoinRequest(IZonePlayer & pPlayer);
void SetEmpty();
void AddPlayersToList(XZonePlayers & list);
void SetOwnershipLog(char * szLog)
{
m_listStrOwnershipLog.SetEmpty();
if(!szLog)
return;
const char * szDelimit = ";";
int nLen = strlen(szLog);
int c = 0;
for (int i = 0; i < nLen; ++i)
if (szLog[i] == ';') c++;
bool bLastOneTruncated = c % 2 != 0;
char * szToken;
szToken = strtok(szLog, szDelimit);
while (szToken)
{
ZString strLine(szToken);
szToken = strtok(NULL, szDelimit);
if (!szToken)
break;
strLine += " ";
strLine += szToken;
szToken = strtok(NULL, szDelimit);
m_listStrOwnershipLog.PushFront(strLine);
}
if(bLastOneTruncated)
m_listStrOwnershipLog.PopFront();
}
void SetStatus(IZonePlayer & player, IMemberBase::DetailedStatus detailedstatus);
void AddPlayer(IZonePlayer & player, IMemberBase::DetailedStatus detailedstatus)
{
SetStatus(player, detailedstatus);
}
TRef<CMembership> FindMembership(IZonePlayer & player);
IMemberBase::DetailedStatus FindStatus(IZonePlayer & player);
TList<ZString> * GetOwnershipLog() { return &m_listStrOwnershipLog; }
CZoneSquadImpl() :
m_rank(RANK_UNKNOWN),
m_nWins(0),
m_nLosses(0),
m_idCiv(NA),
m_nScore(0),
m_bDetailsReceived(false), m_listMemberships(),
m_bWasJustMade(false), m_pOwner(NULL)
{
for (int i = 0; i < SSC_MAX; ++i)
m_nRanking[i] = -1;
m_szName[0] = 0;
m_szDescription[0] = 0;
m_szURL[0] = 0;
m_szInceptionDate[0] = 0;
}
private:
char m_szName[32];
char m_szDescription[512];
char m_szURL[256];
char m_szInceptionDate[32];
Rank m_rank;
int m_nRanking[SSC_MAX];
int m_nWins;
int m_nLosses;
CivID m_idCiv;
short m_nScore;
bool m_bDetailsReceived; TRef<IZonePlayer> m_pOwner;
XMemberships m_listMemberships; TList<ZString> m_listStrOwnershipLog; int m_nID; int m_nCreationID; bool m_bWasJustMade; };
TRef<IZoneSquad> CreateZoneSquad()
{
return new CZoneSquadImpl;
}
IMemberBase::DetailedStatus CZonePlayerImpl::GetStatus(IZoneSquad & squad)
{
TRef<CMembership> pMembership = ((CZoneSquadImpl*)(&squad))->FindMembership(*this);
if (pMembership)
return pMembership->GetStatus();
return DSTAT_NO_ASSOCIATION;
}
void CZonePlayerImpl::SetPosition(IZoneSquad & squad, Position pos)
{
TRef<CMembership> pMembership = ((CZoneSquadImpl*)(&squad))->FindMembership(*this);
assert(pMembership); if (pMembership)
{
pMembership->SetPosition(pos);
}
}
void CZonePlayerImpl::SetHours(IZoneSquad & squad, float fHours)
{
assert(0); }
IZonePlayer::Position CZonePlayerImpl::GetPosition(IZoneSquad & squad)
{
TRef<CMembership> pMembership = ((CZoneSquadImpl*)(&squad))->FindMembership(*this);
if (pMembership)
{
return pMembership->GetPosition();
}
else return POS_UNKNOWN;
}
char * CZonePlayerImpl::GetLastPlayedDate(IZoneSquad & squad)
{
TRef<CMembership> pMembership = ((CZoneSquadImpl*)(&squad))->FindMembership(*this);
if (pMembership)
{
return pMembership->GetLastPlayedDate();
}
else return " ";
}
void CZonePlayerImpl::SetLastPlayedDate(IZoneSquad & squad, PCC szLastPlayedDate)
{
TRef<CMembership> pMembership = ((CZoneSquadImpl*)(&squad))->FindMembership(*this);
assert(pMembership); if (pMembership)
{
pMembership->SetLastPlayedDate(szLastPlayedDate);
}
}
float CZonePlayerImpl::GetHours(IZoneSquad & squad)
{
assert(0); return 0;
}
void CZoneSquadImpl::AddPlayersToList(XZonePlayers & list)
{
XMembershipsIt it(m_listMemberships);
while(!it.End())
{
if (!list.Find(it.Value()->GetPlayer())) list.PushEnd(it.Value()->GetPlayer());
it.Next();
}
}
TRef<CMembership> CZoneSquadImpl::FindMembership(IZonePlayer & player)
{
XMembershipsIt it(m_listMemberships);
while(!it.End())
{
if (it.Value()->GetPlayer() == &player)
{
return it.Value();
}
it.Next();
}
return NULL;
}
IMemberBase::DetailedStatus CZoneSquadImpl::FindStatus(IZonePlayer & player)
{
XMembershipsIt it(m_listMemberships);
while(!it.End())
{
if (it.Value()->GetPlayer() == &player)
{
return it.Value()->GetStatus();
}
it.Next();
}
return IMemberBase::DSTAT_NO_ASSOCIATION;
}
void CZoneSquadImpl::SetStatus(IZonePlayer & player, IMemberBase::DetailedStatus detailedstatus)
{
TRef<CMembership> pMembership = FindMembership(player);
if(!pMembership)
{
pMembership = new CMembership;
m_listMemberships.PushEnd(pMembership);
pMembership->SetPlayer(&player);
}
if (detailedstatus == IMemberBase::DSTAT_LEADER)
SetOwner(&player);
else
pMembership->SetStatus(detailedstatus);
}
void CZoneSquadImpl::QuitPlayer(IZonePlayer & player)
{
TRef<CMembership> pMembership = FindMembership(player);
if(pMembership)
{
if (m_pOwner == &player)
{
m_pOwner = NULL; }
m_listMemberships.Remove(pMembership);
}
}
void CZoneSquadImpl::AddJoinRequest(IZonePlayer & player)
{
SetStatus(player, IZonePlayer::DSTAT_PENDING);
}
void CZoneSquadImpl::SetEmpty()
{
m_listMemberships.SetEmpty();
}
void CZoneSquadImpl::RejectPlayer(IZonePlayer & player)
{
QuitPlayer(player);
}
void CZoneSquadImpl::BootPlayer(IZonePlayer & player)
{
QuitPlayer(player);
}
void CZoneSquadImpl::CancelJoinRequest(IZonePlayer & player)
{
QuitPlayer(player);
}
void CZoneSquadImpl::SetOwner(TRef<IZonePlayer> pOwner)
{
if (m_pOwner && m_pOwner->IsMemberOf(*this))
m_pOwner->SetPosition(*this, IZonePlayer::POS_MEMBER);
m_pOwner = pOwner;
m_pOwner->SetPosition(*this, IZonePlayer::POS_LEADER);
}
TRef<IZonePlayer> CreateZonePlayer(const char *szName, int nID)
{
return new CZonePlayerImpl(szName, nID);
}