31 : piPlayers(new int32_t[rCopy.GetPlayerCount()]),
32 iPlayerCount(rCopy.GetPlayerCount()),
33 iPlayerCapacity(rCopy.GetPlayerCount()),
34 iID(rCopy.GetID()), iPlrStartIndex(rCopy.iPlrStartIndex), dwClr(rCopy.dwClr),
35 sIconSpec(rCopy.GetIconSpec()), iMaxPlayer(rCopy.iMaxPlayer)
40 for (int32_t i = 0; i < iPlayerCount; i++)
46 delete [] piPlayers; piPlayers =
nullptr;
47 iPlayerCount = iPlayerCapacity =
iMaxPlayer = 0;
55 assert(rInfo.
GetID());
56 if (!rInfo.
GetID())
return;
58 if (iPlayerCount >= iPlayerCapacity)
60 int32_t *piNewPlayers =
new int32_t[iPlayerCapacity = (iPlayerCount+4)&~3];
61 if (iPlayerCount) memcpy(piNewPlayers, piPlayers, iPlayerCount*
sizeof(int32_t));
62 delete [] piPlayers; piPlayers = piNewPlayers;
65 piPlayers[iPlayerCount++] = rInfo.
GetID();
66 if (!fAdjustPlayer)
return;
86 assert(Inside<int32_t>(iIndex, 0, iPlayerCount-1));
87 if (!Inside<int32_t>(iIndex, 0, iPlayerCount-1))
return;
89 for (int32_t i = iIndex+1; i < iPlayerCount; ++i)
90 piPlayers[i-1] = piPlayers[i];
98 for (i=0; i < iPlayerCount; ++i)
99 if (piPlayers[i] ==
iID)
break;
100 if (i == iPlayerCount) { assert(
false);
return; }
107 int32_t i=iPlayerCount, *piPlr = piPlayers;
108 while (i--)
if (*piPlr++ ==
iID)
return true;
115 int32_t i=iPlayerCount, idPlr, *piPlr = piPlayers;
132 if (pComp->
isDeserializer()) {
delete [] piPlayers; piPlayers =
new int32_t [iPlayerCapacity = iPlayerCount];
ZeroMem(piPlayers,
sizeof(*piPlayers) * iPlayerCount); }
143 for (int32_t i=0; i<iPlayerCount; ++i)
146 if ((
id = piPlayers[i]))
172 const int32_t C4MaxTeamColorChangeTries = 100;
175 const int defTeamColorCount = 10;
176 DWORD defTeamColorRGB[defTeamColorCount] = { 0xF40000, 0x00C800, 0xFCF41C, 0x2020FF,
177 0xC48444, 0xFFFFFF, 0x848484, 0xFF00EF,
181 if (
iID >=1 &&
iID <=defTeamColorCount)
184 dwClr = defTeamColorRGB[
iID-1] | 0xff000000;
189 for (int32_t iTry=1; iTry<C4MaxTeamColorChangeTries; ++iTry)
192 int32_t iIdx=0;
C4Team *pTeam;
bool fOK=
true;
218 int32_t iTeamPlrCount=0;
225 if (iTeamPlrCount++) sTeamName.
Append(
", ");
237 bool fHasWon =
false;
238 for (int32_t i=0; i<iPlayerCount; ++i)
241 if ((
id = piPlayers[i]))
260 delete [] ppList; ppList =
nullptr;
262 fAllowHostilityChange =
true;
263 fAllowTeamSwitch =
false;
268 fAutoGenerateTeams =
false;
269 iMaxScriptPlayers = 0;
270 sScriptPlayerNames.
Clear();
276 if ((iTeamCount = iTeamCapacity = rCopy.iTeamCount))
277 ppList =
new C4Team *[iTeamCapacity];
278 for (
int i = 0; i < iTeamCount; i++)
279 ppList[i] =
new C4Team(*rCopy.ppList[i]);
280 iLastTeamID = rCopy.iLastTeamID;
281 fAllowHostilityChange = rCopy.fAllowHostilityChange;
282 fAllowTeamSwitch = rCopy.fAllowTeamSwitch;
283 fCustom = rCopy.fCustom;
284 fActive = rCopy.fActive;
285 eTeamDist = rCopy.eTeamDist;
286 fTeamColors = rCopy.fTeamColors;
287 fAutoGenerateTeams = rCopy.fAutoGenerateTeams;
288 sScriptPlayerNames = rCopy.sScriptPlayerNames;
295 if (!fActive)
return false;
305 default: assert(
false);
return false;
317 C4Team *pCurrentTeam =
nullptr, *pCheck;
319 int32_t iCheckTeam=0;
321 if (pCheck != pCurrentTeam)
322 if (!pCheck->IsFull())
329 if (!fActive)
return false;
335 void C4TeamList::AddTeam(
C4Team *pNewTeam)
338 if (iTeamCount >= iTeamCapacity)
342 C4Team **ppNewTeams =
new C4Team*[(iTeamCapacity = ((iTeamCount+4)&~3))];
343 if (iTeamCount) memcpy(ppNewTeams, ppList, iTeamCount*
sizeof(
C4Team *));
344 delete [] ppList; ppList = ppNewTeams;
347 ppList[iTeamCount++] = pNewTeam;
349 iLastTeamID = std::max(pNewTeam->
iID, iLastTeamID);
352 void C4TeamList::ClearTeams()
356 if (iTeamCount) {
while (iTeamCount--)
delete *(ppTeam++); iTeamCount = 0; }
364 pNewTeam->
iID = iLastTeamID + 1;
371 bool C4TeamList::GenerateDefaultTeams(int32_t iUpToID)
374 while (iLastTeamID < iUpToID)
385 C4Team **ppCheck=ppList; int32_t
iCnt=iTeamCount;
386 for (;
iCnt--; ++ppCheck)
if ((*ppCheck)->GetID() == iID)
return *ppCheck;
398 if (pTeam)
return pTeam;
400 GenerateDefaultTeams(iID);
407 if (!Inside<int32_t>(iIndex, 0, iTeamCount-1))
return nullptr;
409 return ppList[iIndex];
415 C4Team **ppCheck=ppList; int32_t
iCnt=iTeamCount;
416 for (;
iCnt--; ++ppCheck)
if (
SEqual((*ppCheck)->GetName(), szName))
return *ppCheck;
422 C4Team **ppCheck=ppList; int32_t
iCnt=iTeamCount;
423 for (;
iCnt--; ++ppCheck)
if ((*ppCheck)->IsPlayerIDInTeam(iID))
return *ppCheck;
429 int32_t iLargest = 0;
430 C4Team **ppCheck=ppList; int32_t
iCnt=iTeamCount;
431 for (;
iCnt--; ++ppCheck) iLargest = std::max((*ppCheck)->GetID(), iLargest);
437 C4Team *pLowestTeam =
nullptr;
int iLowestTeamCount = 0;
438 C4Team **ppCheck=ppList; int32_t
iCnt=iTeamCount;
439 for (;
iCnt--; ++ppCheck)
441 if ((*ppCheck)->IsFull())
continue;
442 if (!pLowestTeam || pLowestTeam->
GetPlayerCount() > (*ppCheck)->GetPlayerCount())
444 pLowestTeam = *ppCheck;
445 iLowestTeamCount = 1;
447 else if (pLowestTeam->
GetPlayerCount() == (*ppCheck)->GetPlayerCount())
449 pLowestTeam = *ppCheck;
470 int32_t idCurrentTeam = pCurrentTeam ? pCurrentTeam->
GetID() : 0;
475 if (idCurrentTeam == rNewJoin.
GetTeam())
return true;
484 rNewJoin.
SetTeam(idCurrentTeam);
486 if (idCurrentTeam)
return true;
496 if (!fHasOrWillHaveLobby && (!fIsTeamNeeded || fCanPickTeamAtRuntime))
return false;
498 C4Team *pAssignTeam=
nullptr;
505 pAssignTeam = pLowestTeam;
509 GenerateDefaultTeams(iLastTeamID+1);
520 GenerateDefaultTeams(2);
526 pAssignTeam = pLowestTeam;
529 if (!pAssignTeam)
return false;
540 if (!pTeam)
return false;
569 int32_t iOldTeamCount = iTeamCount;
574 while (iOldTeamCount--)
delete ppList[iOldTeamCount];
576 if ((iTeamCapacity = iTeamCount))
578 ppList =
new C4Team *[iTeamCapacity];
579 memset(ppList, 0,
sizeof(
C4Team *)*iTeamCapacity);
600 if (!iTeamCount) fAutoGenerateTeams =
true;
613 if (!pInitDefault)
return false;
618 fAllowHostilityChange =
true;
620 fAutoGenerateTeams =
true;
627 fAllowHostilityChange =
true;
640 int32_t iTeam=0;
C4Team *pTeam;
665 C4Team **ppCheck=ppList; int32_t
iCnt=iTeamCount;
666 for (;
iCnt--; ++ppCheck) (*ppCheck)->RecheckPlayers();
691 if (!pLowestTeam)
break;
693 C4Team *pLargestTeam =
nullptr;
694 C4Team **ppCheck=ppList; int32_t
iCnt=iTeamCount;
695 for (;
iCnt--; ++ppCheck)
if (!pLargestTeam || pLargestTeam->
GetPlayerCount() > (*ppCheck)->GetPlayerCount())
696 if ((*ppCheck)->GetFirstUnjoinedPlayerID())
697 pLargestTeam = *ppCheck;
699 if (!pLargestTeam)
break;
727 GenerateDefaultTeams(2);
740 idStart = pNfo->
GetID();
758 idStart = pNfo->
GetID();
765 StdStrBuf C4TeamList::GetTeamDistName(TeamDist eTeamDist)
const
774 default:
return(
FormatString(
"TEAMDIST_undefined(%d)", (
int) eTeamDist));
781 if (!fActive)
return;
800 return GetTeamDistName(eTeamDist);
842 if (fEnabled == fTeamColors)
return;
844 fTeamColors = fEnabled;
860 fAllowTeamSwitch =
false;
866 C4Team *pOKTeam =
nullptr, *pCheck;
868 int32_t iCheckTeam=0;
870 if (!pCheck->IsFull())
873 if (pOKTeam && pOKTeam != pCheck)
887 return pOKTeam->
GetID();
905 while (sScriptPlayerNames.
GetSection(iNameIdx++, &sOut,
'|'))
916 int32_t i_team = 0;
C4Team *team;
917 int32_t team_count = 0;
930 team_count = std::min<int32_t>(startup_player_count,
GetTeamCount());
935 team_count = std::min<int32_t>(startup_player_count, 2);
940 team_count = startup_player_count;
const char * LoadResStr(const char *id)
uint32_t UnsyncedRandom()
bool IsColorConflict(DWORD dwClr1, DWORD dwClr2)
DWORD GenerateRandomPlayerColor(int32_t iTry)
void SCopy(const char *szSource, char *sTarget, size_t iMaxL)
std::enable_if< std::is_pod< T >::value >::type ZeroMem(T *lpMem, size_t dwSize)
bool SEqual(const char *szStr1, const char *szStr2)
bool Inside(T ival, U lbound, V rbound)
StdArrayAdapt< T > mkArrayAdapt(T *pArray, int iSize)
StdPtrAdapt< T > mkPtrAdaptNoNull(T *&rpObj)
StdArrayAdapt< T, M > mkArrayAdaptMap(T *pArray, int iSize, M &&map)
StdParameterAdapt< T, P > mkParAdapt(T &&rObj, P &&rPar)
StdStringAdapt mkStringAdaptMA(char(&szString)[size])
StdNamingCountAdapt< int_t > mkNamingCountAdapt(int_t &iCount, const char *szName)
StdNamingAdapt< T > mkNamingAdapt(T &&rValue, const char *szName)
StdStrBuf FormatString(const char *szFmt,...)
void AddEntry(const char *szText, int32_t id)
void DoInput(C4PacketType eCtrlType, C4ControlPacket *pPkt, C4ControlDeliveryType eDelivery)
C4PlayerInfoList & PlayerInfos
bool DeleteEntry(const char *filename, bool do_recycle=false)
bool Add(const char *filename, const char *entry_name)
bool LoadEntryString(const char *entry_name, StdStrBuf *buffer)
void ReplaceStrings(StdStrBuf &rBuf)
C4Network2Players Players
bool isLobbyActive() const
void SendUpdatedPlayers()
void SetPlayerColor(uint32_t dwNewClr)
bool HasJoinIssued() const
void SetColor(DWORD dwUseClr)
void SetTeam(int32_t idToTeam)
const char * GetName() const
C4PlayerType GetType() const
void UpdatePlayerAttributes(C4ClientPlayerInfos *pForInfo, bool fResolveConflicts)
C4PlayerInfo * GetNextPlayerInfoByID(int32_t id) const
C4PlayerInfo * GetActivePlayerInfoByName(const char *szName)
C4ClientPlayerInfos * GetClientInfoByPlayerID(int32_t id) const
C4PlayerInfo * GetPlayerInfoByID(int32_t id) const
C4Player * GetByInfoID(int iInfoID) const
void AddPlayer(class C4PlayerInfo &rInfo, bool fAdjustPlayer)
void RecheckColor(C4TeamList &rForList)
StdStrBuf GetNameWithParticipants() const
void CompileFunc(StdCompiler *pComp)
uint32_t GetColor() const
int32_t GetIndexedPlayer(int32_t iIndex) const
bool IsPlayerIDInTeam(int32_t iID)
int32_t GetFirstUnjoinedPlayerID() const
void RemoveIndexedPlayer(int32_t iIndex)
int32_t GetPlayerCount() const
void RemovePlayerByID(int32_t iID)
const char * GetName() const
bool IsRuntimeJoinTeamChoice() const
int32_t GetLargestTeamID() const
int32_t GetStartupTeamCount(int32_t startup_player_count)
C4Team * GetTeamByIndex(int32_t iIndex) const
C4Team * GetTeamByPlayerID(int32_t iID) const
bool IsMultiTeams() const
C4Team * GetTeamByID(int32_t iID) const
C4Team * CreateTeam(const char *szName)
bool IsTeamVisible() const
void EnforceLeagueRules()
void CompileFunc(StdCompiler *pComp)
void SetTeamDistribution(TeamDist eToVal)
C4Team * GetRandomSmallestTeam() const
bool Save(C4Group &hGroup)
bool Load(C4Group &hGroup, class C4Scenario *pInitDefault, class C4LangStringTable *pLang)
bool CanLocalChooseTeam() const
bool IsAutoGenerateTeams() const
bool IsTeamColors() const
StdStrBuf GetScriptPlayerName() const
void FillTeamDistOptions(C4GUI::ComboBox_FillCB *pFiller) const
void SetTeamColors(bool fEnabled)
StdStrBuf GetTeamDistString() const
bool IsJoin2TeamAllowed(int32_t idTeam, C4PlayerType plrType)
bool RecheckPlayerInfoTeams(C4PlayerInfo &rNewJoin, bool fByHost)
int32_t GetTeamCount() const
C4Team * GetGenerateTeamByID(int32_t iID)
C4TeamList & operator=(const C4TeamList &rCopy)
void SendSetTeamDist(TeamDist eNewDist)
bool IsRandomTeam() const
void SendSetTeamColors(bool fEnabled)
bool HasTeamDistOptions() const
bool CanLocalSeeTeam() const
int32_t GetForcedTeamSelection(int32_t idForPlayer) const
C4Team * GetTeamByName(const char *szName) const
void Value(const T &rStruct)
virtual bool isDeserializer()
const char * getData() const
void AppendChar(char cChar)
void Append(const char *pnData, size_t iChars)
bool GetSection(size_t idx, StdStrBuf *psOutSection, char cSeparator=';') const