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}