Several bug fixes

This commit is contained in:
Mind Rapist
2026-02-13 01:48:07 +02:00
parent aa30091ced
commit 7a942e4fc0
6 changed files with 424 additions and 241 deletions

View File

@@ -80,6 +80,57 @@ static TCachedTimestamp g_cachedTimestamp;
#define DBG_OUT_W_UTF8(psz) do { (void)(psz); } while (0)
#endif
// MR-11: Colored console output for syserr and packet dumps
#ifdef _DEBUG
static WORD g_consoleDefaultAttrs = 0;
static bool g_consoleAttrsInit = false;
static void InitConsoleDefaultAttrs()
{
if (g_consoleAttrsInit)
return;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
if (!hConsole || hConsole == INVALID_HANDLE_VALUE)
return;
CONSOLE_SCREEN_BUFFER_INFO info;
if (GetConsoleScreenBufferInfo(hConsole, &info))
{
g_consoleDefaultAttrs = info.wAttributes;
g_consoleAttrsInit = true;
}
}
static void WriteConsoleColored(const char* text, WORD attrs)
{
if (!text)
return;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
if (!hConsole || hConsole == INVALID_HANDLE_VALUE)
{
fputs(text, stdout);
return;
}
InitConsoleDefaultAttrs();
if (g_consoleAttrsInit)
SetConsoleTextAttribute(hConsole, attrs);
fputs(text, stdout);
if (g_consoleAttrsInit)
SetConsoleTextAttribute(hConsole, g_consoleDefaultAttrs);
}
static const WORD kConsoleSyserrRed = FOREGROUND_RED | FOREGROUND_INTENSITY;
static const WORD kConsolePacketDumpDim = FOREGROUND_INTENSITY;
static const WORD kConsoleTempTraceBg = BACKGROUND_BLUE | BACKGROUND_INTENSITY |
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE;
#endif
// MR-11: -- END OF -- Colored console output for syserr and packet dumps
// Buffered log file writer
// OPTIMIZATION: Buffered writes with periodic flush instead of per-write fflush()
// - Collects writes in memory buffer
@@ -171,6 +222,112 @@ class CLogFile : public CSingleton<CLogFile>
static CLogFile gs_logfile;
// MR-11: Separate packet dump log from the main log file
class CExtraLogFile
{
public:
CExtraLogFile() : m_fp(NULL), m_bufferPos(0), m_lastFlushMs(0) {}
~CExtraLogFile()
{
Flush();
if (m_fp)
fclose(m_fp);
m_fp = NULL;
}
bool Initialize(const char* path)
{
m_fp = fopen(path, "w");
m_bufferPos = 0;
m_lastFlushMs = ELTimer_GetMSec();
return m_fp != NULL;
}
bool IsOpen() const
{
return m_fp != NULL;
}
void Write(const char* c_pszMsg)
{
if (!m_fp)
return;
g_cachedTimestamp.Update();
char timestamp[32];
g_cachedTimestamp.Format(timestamp, sizeof(timestamp));
size_t timestampLen = strlen(timestamp);
size_t msgLen = c_pszMsg ? strlen(c_pszMsg) : 0;
size_t totalLen = timestampLen + msgLen;
if (m_bufferPos + totalLen >= BUFFER_SIZE - 1)
Flush();
if (totalLen >= BUFFER_SIZE - 1)
{
fputs(timestamp, m_fp);
if (c_pszMsg)
fputs(c_pszMsg, m_fp);
fflush(m_fp);
return;
}
memcpy(m_buffer + m_bufferPos, timestamp, timestampLen);
m_bufferPos += timestampLen;
if (msgLen > 0)
{
memcpy(m_buffer + m_bufferPos, c_pszMsg, msgLen);
m_bufferPos += msgLen;
}
DWORD now = ELTimer_GetMSec();
if (now - m_lastFlushMs > 500 || m_bufferPos > BUFFER_SIZE * 3 / 4)
Flush();
}
void Flush()
{
if (!m_fp || m_bufferPos == 0)
return;
m_buffer[m_bufferPos] = '\0';
fputs(m_buffer, m_fp);
fflush(m_fp);
m_bufferPos = 0;
m_lastFlushMs = ELTimer_GetMSec();
}
private:
static const size_t BUFFER_SIZE = 8192;
FILE* m_fp;
char m_buffer[BUFFER_SIZE];
size_t m_bufferPos;
DWORD m_lastFlushMs;
};
#ifdef _PACKETDUMP
static CExtraLogFile g_packetDumpFile;
static CExtraLogFile g_pdlogFile;
static bool g_packetDumpEnabled = false;
static bool g_pdlogEnabled = false;
static bool g_pdlogRequested = false;
static void EnsurePacketDumpFiles(bool enablePdlog)
{
if (!std::filesystem::exists("log"))
std::filesystem::create_directory("log");
if (!g_packetDumpEnabled)
g_packetDumpEnabled = g_packetDumpFile.Initialize("log/packetdump.txt");
if (enablePdlog && !g_pdlogEnabled)
g_pdlogEnabled = g_pdlogFile.Initialize("log/pdlog.txt");
}
#endif
// MR-11: -- END OF -- Separate packet dump log from the main log file
static UINT gs_uLevel = 0;
void SetLogLevel(UINT uLevel)
@@ -360,6 +517,21 @@ static struct TSyserrBuffer
}
} g_syserrBuffer;
// MR-11: Seperate packet dump log from the main log file
static void WriteSyserrPlain(const char* msg)
{
if (!msg)
return;
g_cachedTimestamp.Update();
char timestamp[32];
g_cachedTimestamp.Format(timestamp, sizeof(timestamp));
g_syserrBuffer.Write(timestamp, strlen(timestamp));
g_syserrBuffer.Write(msg, strlen(msg));
}
// MR-11: -- END OF -- Seperate packet dump log from the main log file
void TraceError(const char* c_szFormat, ...)
{
//#ifndef _DISTRIBUTE
@@ -394,7 +566,7 @@ void TraceError(const char* c_szFormat, ...)
#ifdef _DEBUG
DBG_OUT_W_UTF8(szBuf);
fputs(szBuf, stdout);
WriteConsoleColored(szBuf, kConsoleSyserrRed);
#endif
if (isLogFile)
@@ -423,7 +595,7 @@ void TraceErrorWithoutEnter(const char* c_szFormat, ...)
#ifdef _DEBUG
DBG_OUT_W_UTF8(szBuf);
fputs(szBuf, stdout);
WriteConsoleColored(szBuf, kConsoleSyserrRed);
#endif
if (isLogFile)
@@ -431,6 +603,162 @@ void TraceErrorWithoutEnter(const char* c_szFormat, ...)
//#endif
}
// MR-11: Temporary trace functions for debugging (not for regular logging)
void TempTrace(const char* c_szMsg, bool errType)
{
if (!c_szMsg)
return;
#ifdef _DEBUG
DBG_OUT_W_UTF8(c_szMsg);
WriteConsoleColored(c_szMsg, kConsoleTempTraceBg);
#endif
if (errType)
{
WriteSyserrPlain(c_szMsg);
return;
}
if (isLogFile)
LogFile(c_szMsg);
}
void TempTracef(const char* c_szFormat, bool errType, ...)
{
char szBuf[DEBUG_STRING_MAX_LEN + 1];
va_list args;
va_start(args, errType);
_vsnprintf_s(szBuf, sizeof(szBuf), _TRUNCATE, c_szFormat, args);
va_end(args);
#ifdef _DEBUG
DBG_OUT_W_UTF8(szBuf);
WriteConsoleColored(szBuf, kConsoleTempTraceBg);
#endif
if (errType)
{
WriteSyserrPlain(szBuf);
return;
}
if (isLogFile)
LogFile(szBuf);
}
void TempTracen(const char* c_szMsg, bool errType)
{
if (!c_szMsg)
return;
char szBuf[DEBUG_STRING_MAX_LEN + 2];
_snprintf_s(szBuf, sizeof(szBuf), _TRUNCATE, "%s\n", c_szMsg);
#ifdef _DEBUG
DBG_OUT_W_UTF8(szBuf);
WriteConsoleColored(szBuf, kConsoleTempTraceBg);
#endif
if (errType)
{
WriteSyserrPlain(szBuf);
return;
}
if (isLogFile)
LogFile(szBuf);
}
void TempTracenf(const char* c_szFormat, bool errType, ...)
{
char szBuf[DEBUG_STRING_MAX_LEN + 2];
va_list args;
va_start(args, errType);
_vsnprintf_s(szBuf, sizeof(szBuf), _TRUNCATE, c_szFormat, args);
va_end(args);
size_t cur = strnlen(szBuf, sizeof(szBuf));
if (cur + 1 < sizeof(szBuf)) {
szBuf[cur] = '\n';
szBuf[cur + 1] = '\0';
}
else {
szBuf[sizeof(szBuf) - 2] = '\n';
szBuf[sizeof(szBuf) - 1] = '\0';
}
#ifdef _DEBUG
DBG_OUT_W_UTF8(szBuf);
WriteConsoleColored(szBuf, kConsoleTempTraceBg);
#endif
if (errType)
{
WriteSyserrPlain(szBuf);
return;
}
if (isLogFile)
LogFile(szBuf);
}
// MR-11: -- END OF -- Temporary trace functions for debugging (not for regular logging)
// MR-11: Seperate packet dump from the rest of the logs
void PacketDump(const char* c_szMsg)
{
#ifdef _PACKETDUMP
if (!c_szMsg)
return;
PacketDumpf("%s", c_szMsg);
#else
(void)c_szMsg;
#endif
}
void PacketDumpf(const char* c_szFormat, ...)
{
#ifdef _PACKETDUMP
char szBuf[DEBUG_STRING_MAX_LEN + 2];
strncpy_s(szBuf, sizeof(szBuf), "PACKET_DUMP: ", _TRUNCATE);
int prefixLen = (int)strlen(szBuf);
va_list args;
va_start(args, c_szFormat);
_vsnprintf_s(szBuf + prefixLen, sizeof(szBuf) - prefixLen, _TRUNCATE, c_szFormat, args);
va_end(args);
size_t cur = strnlen(szBuf, sizeof(szBuf));
if (cur + 1 < sizeof(szBuf)) {
szBuf[cur] = '\n';
szBuf[cur + 1] = '\0';
}
else {
szBuf[sizeof(szBuf) - 2] = '\n';
szBuf[sizeof(szBuf) - 1] = '\0';
}
#ifdef _DEBUG
DBG_OUT_W_UTF8(szBuf);
WriteConsoleColored(szBuf, kConsolePacketDumpDim);
#endif
EnsurePacketDumpFiles(g_pdlogRequested);
if (g_packetDumpEnabled)
g_packetDumpFile.Write(szBuf);
if (g_pdlogEnabled)
g_pdlogFile.Write(szBuf);
#else
(void)c_szFormat;
#endif
}
// MR-11: -- END OF -- Seperate packet dump from the rest of the logs
void LogBoxf(const char* c_szFormat, ...)
{
va_list args;
@@ -461,6 +789,13 @@ void LogBox(const char* c_szMsg, const char* c_szCaption, HWND hWnd)
void LogFile(const char* c_szMsg)
{
CLogFile::Instance().Write(c_szMsg);
// MR-11: Separate packet dump log from the main log file
#ifdef _PACKETDUMP
if (g_pdlogEnabled)
g_pdlogFile.Write(c_szMsg);
#endif
// MR-11: -- END OF -- Separate packet dump log from the main log file
}
void LogFilef(const char* c_szMessage, ...)
@@ -474,6 +809,13 @@ void LogFilef(const char* c_szMessage, ...)
va_end(args);
CLogFile::Instance().Write(szBuf);
// MR-11: Separate packet dump log from the main log file
#ifdef _PACKETDUMP
if (g_pdlogEnabled)
g_pdlogFile.Write(szBuf);
#endif
// MR-11: -- END OF -- Separate packet dump log from the main log file
}
void OpenLogFile(bool bUseLogFIle)
@@ -490,7 +832,13 @@ void OpenLogFile(bool bUseLogFIle)
isLogFile = true;
CLogFile::Instance().Initialize();
}
//#endif
// MR-11: Separate packet dump log from the main log file
#ifdef _PACKETDUMP
g_pdlogRequested = bUseLogFIle;
EnsurePacketDumpFiles(g_pdlogRequested);
#endif
// MR-11: -- END OF -- Separate packet dump log from the main log file
}
void CloseLogFile()
@@ -498,6 +846,15 @@ void CloseLogFile()
// Flush all buffered output before shutdown
g_syserrBuffer.Flush();
CLogFile::Instance().Flush();
// MR-11: Separate packet dump log from the main log file
#ifdef _PACKETDUMP
if (g_packetDumpEnabled)
g_packetDumpFile.Flush();
if (g_pdlogEnabled)
g_pdlogFile.Flush();
#endif
// MR-11: -- END OF -- Separate packet dump log from the main log file
}
void OpenConsoleWindow()

View File

@@ -3,6 +3,10 @@
#include <windows.h>
#if defined(_DEBUG) && !defined(_PACKETDUMP)
#define _PACKETDUMP
#endif
extern void SetLogLevel(UINT uLevel);
extern void Log(UINT uLevel, const char* c_szMsg);
extern void Logn(UINT uLevel, const char* c_szMsg);
@@ -15,6 +19,15 @@ extern void Tracenf(const char* c_szFormat, ...);
extern void Tracef(const char* c_szFormat, ...);
extern void TraceError(const char* c_szFormat, ...);
extern void TraceErrorWithoutEnter(const char* c_szFormat, ...);
// MR-11: Separate packet dump log from the main log file
extern void TempTrace(const char* c_szMsg, bool errType = false);
extern void TempTracef(const char* c_szFormat, bool errType = false, ...);
extern void TempTracen(const char* c_szMsg, bool errType = false);
extern void TempTracenf(const char* c_szFormat, bool errType = false, ...);
extern void PacketDump(const char* c_szMsg);
extern void PacketDumpf(const char* c_szFormat, ...);
// MR-11: -- END OF -- Separate packet dump log from the main log file
extern void LogBox(const char* c_szMsg, const char * c_szCaption = NULL, HWND hWnd = NULL);
extern void LogBoxf(const char* c_szMsg, ...);

View File

@@ -3,7 +3,7 @@
#include <iomanip>
#include <sstream>
#ifdef _DEBUG
#if defined(_DEBUG) && !defined(_PACKETDUMP)
#define _PACKETDUMP
#endif
@@ -513,11 +513,13 @@ bool CNetworkStream::Recv(int size, char * pDestBuf)
#ifdef _PACKETDUMP
if (size >= 2)
{
// MR-11: Separate packet dump log from the main log file
const uint16_t kHeader = *reinterpret_cast<const uint16_t*>(pDestBuf);
TraceError("RECV< %s 0x%04X (%d bytes)", GetHeaderName(kHeader), kHeader, size);
PacketDumpf("RECV< %s 0x%04X (%d bytes)", GetHeaderName(kHeader), kHeader, size);
const auto contents = dump_hex(reinterpret_cast<const uint8_t*>(pDestBuf), size);
TraceError("%s", contents.c_str());
PacketDumpf("%s", contents.c_str());
// MR-11: -- END OF -- Separate packet dump log from the main log file
}
#endif
@@ -564,11 +566,13 @@ bool CNetworkStream::Send(int size, const char * pSrcBuf)
#ifdef _PACKETDUMP
if (size >= 2)
{
// MR-11: Separate packet dump log from the main log file
const uint16_t kHeader = *reinterpret_cast<const uint16_t*>(pSrcBuf);
TraceError("SEND> %s 0x%04X (%d bytes)", GetHeaderName(kHeader), kHeader, size);
PacketDumpf("SEND> %s 0x%04X (%d bytes)", GetHeaderName(kHeader), kHeader, size);
const auto contents = dump_hex(reinterpret_cast<const uint8_t*>(pSrcBuf), size);
TraceError("%s", contents.c_str());
PacketDumpf("%s", contents.c_str());
// MR-11: -- END OF -- Separate packet dump log from the main log file
}
#endif

View File

@@ -73,9 +73,11 @@ namespace UI
CImageBox * pSignImage;
CAniImageBox * pFinishCoolTimeEffect;
} TSlot;
typedef std::list<TSlot> TSlotList;
typedef TSlotList::iterator TSlotListIterator;
typedef struct SStoreCoolDown { float fCoolTime; float fElapsedTime; bool bActive; };
struct SStoreCoolDown { float fCoolTime; float fElapsedTime; bool bActive; };
public:
@@ -121,13 +123,13 @@ namespace UI
void LockSlot(DWORD dwIndex);
void UnlockSlot(DWORD dwIndex);
BOOL IsLockSlot(DWORD dwIndex);
// BOOL IsLockSlot(DWORD dwIndex);
void SetCantUseSlot(DWORD dwIndex);
void SetUseSlot(DWORD dwIndex);
BOOL IsCantUseSlot(DWORD dwIndex);
// BOOL IsCantUseSlot(DWORD dwIndex);
void EnableSlot(DWORD dwIndex);
void DisableSlot(DWORD dwIndex);
BOOL IsEnableSlot(DWORD dwIndex);
// BOOL IsEnableSlot(DWORD dwIndex);
// Select
void ClearSelected();

View File

@@ -49,6 +49,18 @@ PyObject* dbgTraceError(PyObject* poSelf, PyObject* poArgs)
return Py_BuildNone();
}
// MR-11: Temporary trace functions for debugging (not for regular logging)
PyObject* dbgTraceTemp(PyObject* poSelf, PyObject* poArgs)
{
char* szMsg;
if (!PyTuple_GetString(poArgs, 0, &szMsg))
return Py_BuildException();
TempTrace(szMsg, false);
return Py_BuildNone();
}
// MR-11: -- END OF -- Temporary trace functions for debugging (not for regular logging)
PyObject* dbgRegisterExceptionString(PyObject* poSelf, PyObject* poArgs)
{
char* szMsg;
@@ -69,8 +81,11 @@ void initdbg()
{ "Trace", dbgTrace, METH_VARARGS },
{ "Tracen", dbgTracen, METH_VARARGS },
{ "TraceError", dbgTraceError, METH_VARARGS },
// MR-11: Temporary trace functions for debugging (not for regular logging)
{ "TraceTemp", dbgTraceTemp, METH_VARARGS },
// MR-11: -- END OF -- Temporary trace functions for debugging (not for regular logging)
{ "RegisterExceptionString", dbgRegisterExceptionString, METH_VARARGS },
{ NULL, NULL},
{ NULL, NULL },
};
Py_InitModule("dbg", s_methods);