Bazaar developer reference

CvRandom::get(unsigned short, const char *)

Defined in
CvRandom.cpp, line 123
Class
CvRandom
Hook name
CivHooks::CvRandom_get

Hooks

static bool BeforeCvRandom_get(CvRandom* self, unsigned short usNum, const char* pszLog, unsigned short& result);static void AfterCvRandom_get(CvRandom* self, unsigned short usNum, const char* pszLog, unsigned short& result);static unsigned short ReplaceCvRandom_get(unsigned short (*original)(CvRandom*, unsigned short, const char*), CvRandom* self, unsigned short usNum, const char* pszLog);CivRegisterBefore<CivHooks::CvRandom_get>(host, &BeforeCvRandom_get);CivRegisterAfter<CivHooks::CvRandom_get>(host, &AfterCvRandom_get);CivRegisterReplace<CivHooks::CvRandom_get>(host, &ReplaceCvRandom_get);

Code

123unsigned short CvRandom::get(unsigned short usNum, const char* pszLog)124{125	recordCallStack();126	m_ulCallCount++;127128	unsigned long ulNewSeed = ((RANDOM_A * m_ulRandomSeed) + RANDOM_C);129	unsigned short us = ((unsigned short)((((ulNewSeed >> RANDOM_SHIFT) & MAX_UNSIGNED_SHORT) * ((unsigned long)usNum)) / (MAX_UNSIGNED_SHORT + 1)));130131	if(GC.getLogging())132	{133		int iRandLogging = GC.getRandLogging();134		if(iRandLogging > 0 && (m_bSynchronous || (iRandLogging & RAND_LOGGING_ASYNCHRONOUS_FLAG) != 0))135		{136#if !defined(FINAL_RELEASE)137			if(!gDLL->IsGameCoreThread() && gDLL->IsGameCoreExecuting() && m_bSynchronous)138			{139				CvAssertMsg(0, "App side is accessing the synchronous random number generator while the game core is running.");140			}141#endif142			CvGame& kGame = GC.getGame();143			if(kGame.getTurnSlice() > 0 || ((iRandLogging & RAND_LOGGING_PREGAME_FLAG) != 0))144			{145				FILogFile* pLog = LOGFILEMGR.GetLog("RandCalls.csv", FILogFile::kDontTimeStamp, "Game Turn, Turn Slice, Range, Value, Seed, Instance, Type, Location\n");146				if(pLog)147				{148					char szOut[1024] = {0};149					sprintf_s(szOut, "%d, %d, %u, %u, %u, %8x, %s, %s\n", kGame.getGameTurn(), kGame.getTurnSlice(), (uint)usNum, (uint)us, getSeed(), (uint)this, m_bSynchronous?"sync":"async", (pszLog != NULL)?pszLog:"Unknown");150					pLog->Msg(szOut);151152#if !defined(FINAL_RELEASE)153					if((iRandLogging & RAND_LOGGING_CALLSTACK_FLAG) != 0)154					{155#ifdef _DEBUG156						if(m_bExtendedCallStackDebugging)157						{158							// Use the callstack from the extended callstack debugging system159							const FCallStack& callStack = m_kCallStacks.back();160							std::string stackTrace = callStack.toString(true, 6);161							pLog->Msg(stackTrace.c_str());162						}163						else164#endif165						{166#ifdef WIN32167							// Get callstack directly168							FCallStack callStack;169							FDebugHelper::GetInstance().GetCallStack(&callStack, 0, 8);170							std::string stackTrace = callStack.toString(true, 6);171							pLog->Msg(stackTrace.c_str());172#endif173						}174					}175#endif176				}177			}178		}179	}180181	m_ulRandomSeed = ulNewSeed;182	return us;183}

Calls

Called by