diff --git a/src/newgrf_text.cpp b/src/newgrf_text.cpp --- a/src/newgrf_text.cpp +++ b/src/newgrf_text.cpp @@ -291,6 +291,9 @@ char *TranslateTTDPatchCodes(uint32 grfi case 8: d += Utf8Encode(d, SCC_NEWGRF_PRINT_HEX_DWORD); break; + case 0x0B: + d += Utf8Encode(d, SCC_NEWGRF_PRINT_HEX_QWORD); + break; default: grfmsg(1, "missing handler for extended format code"); @@ -650,6 +653,7 @@ uint RemapNewGRFStringControlCode(uint s case SCC_NEWGRF_PRINT_HEX_BYTE: *argv = _newgrf_textrefstack->PopUnsignedByte(); break; case SCC_NEWGRF_PRINT_HEX_DWORD: *argv = _newgrf_textrefstack->PopUnsignedDWord(); break; + case SCC_NEWGRF_PRINT_HEX_QWORD: *argv = _newgrf_textrefstack->PopSignedQWord(); break; case SCC_NEWGRF_PRINT_HEX_WORD: case SCC_NEWGRF_PRINT_WORD_SPEED: @@ -682,6 +686,7 @@ uint RemapNewGRFStringControlCode(uint s case SCC_NEWGRF_PRINT_HEX_BYTE: case SCC_NEWGRF_PRINT_HEX_WORD: case SCC_NEWGRF_PRINT_HEX_DWORD: + case SCC_NEWGRF_PRINT_HEX_QWORD: return SCC_HEX; case SCC_NEWGRF_PRINT_DWORD_CURRENCY: diff --git a/src/stdafx.h b/src/stdafx.h --- a/src/stdafx.h +++ b/src/stdafx.h @@ -276,9 +276,11 @@ /* MSVCRT of course has to have a different syntax for long long *sigh* */ #if defined(_MSC_VER) || defined(__MINGW32__) #define OTTD_PRINTF64 "%I64d" + #define OTTD_PRINTFHEX64 "%I64x" #define PRINTF_SIZE "%Iu" #else #define OTTD_PRINTF64 "%lld" + #define OTTD_PRINTFHEX64 "%llx" #define PRINTF_SIZE "%zu" #endif diff --git a/src/strings.cpp b/src/strings.cpp --- a/src/strings.cpp +++ b/src/strings.cpp @@ -233,9 +233,9 @@ static char *FormatZerofillNumber(char * return FormatNumber(buff, number, last, "", 20 - count); } -static char *FormatHexNumber(char *buff, int64 number, const char *last) +static char *FormatHexNumber(char *buff, uint64 number, const char *last) { - return buff + seprintf(buff, last, "0x%x", (uint32)number); + return buff + seprintf(buff, last, "0x" OTTD_PRINTFHEX64, number); } /** @@ -859,7 +859,7 @@ static char *FormatString(char *buff, co } break; case SCC_HEX: // {HEX} - buff = FormatHexNumber(buff, GetInt64(&argv), last); + buff = FormatHexNumber(buff, (uint64)GetInt64(&argv), last); break; case SCC_BYTES: // {BYTES} diff --git a/src/table/control_codes.h b/src/table/control_codes.h --- a/src/table/control_codes.h +++ b/src/table/control_codes.h @@ -123,6 +123,7 @@ enum StringControlCode { SCC_NEWGRF_PRINT_HEX_BYTE, ///< Read 1 byte from the stack and print it as hex SCC_NEWGRF_PRINT_HEX_WORD, ///< Read 2 bytes from the stack and print it as hex SCC_NEWGRF_PRINT_HEX_DWORD, ///< Read 4 bytes from the stack and print it as hex + SCC_NEWGRF_PRINT_HEX_QWORD, ///< Read 8 bytes from the stack and print it as hex SCC_NEWGRF_PUSH_WORD, ///< Pushes 2 bytes onto the stack SCC_NEWGRF_UNPRINT, ///< "Unprints" the given number of bytes from the string SCC_NEWGRF_DISCARD_WORD, ///< Discard the next two bytes