C4SoundEffect* C4SoundSystem::GetEffect(const char *szSndName) { // Remember wildcards before adding .* extension - if there are 2 versions with different file extensions, play the last added bool bRandomSound = SCharCount('?',szSndName) || SCharCount('*',szSndName); // Evaluate sound name char szName[C4MaxSoundName+2+1]; SCopy(szSndName,szName,C4MaxSoundName); // Any extension accepted DefaultExtension(szName,"*"); // Play nth Sound. Standard: 1 int32_t iNumber = 1; // Sound with a wildcard: determine number of available matches if (bRandomSound) { iNumber = 0; // Count matching sounds for (C4SoundEffect *pSfx=FirstSound; pSfx; pSfx=pSfx->Next) if (WildcardMatch(szName,pSfx->Name)) ++iNumber; // Nothing found? Abort if(iNumber == 0) return NULL; iNumber=UnsyncedRandom(iNumber)+1; } // Find requested sound effect in bank C4SoundEffect *pSfx; for (pSfx=FirstSound; pSfx; pSfx=pSfx->Next) if (WildcardMatch(szName,pSfx->Name)) if(!--iNumber) break; return pSfx; // Is still NULL if nothing is found }
StdStrBuf C4TeamList::GetScriptPlayerName() const { // get a name to assign to a new script player. Try to avoid name conflicts if (!sScriptPlayerNames.getLength()) return StdStrBuf(LoadResStr("IDS_TEXT_COMPUTER")); // default name // test available script names int32_t iNameIdx = 0; StdStrBuf sOut; while (sScriptPlayerNames.GetSection(iNameIdx++, &sOut, '|')) if (!Game.PlayerInfos.GetActivePlayerInfoByName(sOut.getData())) return sOut; // none are available: Return a random name sScriptPlayerNames.GetSection(UnsyncedRandom(iNameIdx-1), &sOut, '|'); return sOut; }
C4Team *C4TeamList::GetRandomSmallestTeam() const { C4Team *pLowestTeam = nullptr; int iLowestTeamCount = 0; C4Team **ppCheck=ppList; int32_t iCnt=iTeamCount; for (; iCnt--; ++ppCheck) { if ((*ppCheck)->IsFull()) continue; // do not join into full teams if (!pLowestTeam || pLowestTeam->GetPlayerCount() > (*ppCheck)->GetPlayerCount()) { pLowestTeam = *ppCheck; iLowestTeamCount = 1; } else if (pLowestTeam->GetPlayerCount() == (*ppCheck)->GetPlayerCount()) if (!UnsyncedRandom(++iLowestTeamCount)) pLowestTeam = *ppCheck; } return pLowestTeam; }
int C4LoaderScreen::SeekLoaderScreens(C4Group &rFromGrp, const char *szWildcard, int iLoaderCount, char *szDstName, C4Group **ppDestGrp) { bool fFound; int iLocalLoaders=0; char Filename[_MAX_PATH+1]; for (fFound=rFromGrp.FindEntry(szWildcard, Filename); fFound; fFound=rFromGrp.FindNextEntry(szWildcard, Filename)) { // loader found; choose it, if Daniel wants it that way ++iLocalLoaders; if (!UnsyncedRandom(++iLoaderCount)) { // copy group and path *ppDestGrp=&rFromGrp; SCopy(Filename, szDstName, _MAX_PATH); } } return iLocalLoaders; }
DWORD GenerateRandomPlayerColor(int32_t iTry) // generate a random player color for the iTry'th try { // generate a random one biased towards max channel luminance // (for greater color difference and less gray-ish colors) return C4RGB(std::min<int>(UnsyncedRandom(302), 256), std::min<int>(UnsyncedRandom(302), 256), std::min<int>(UnsyncedRandom(302), 256)); }