From 6ce4fe40f7b17dcd7a76f0b2a88038726934cd71 Mon Sep 17 00:00:00 2001 From: rubidium Date: Sun, 14 Sep 2008 14:31:37 +0000 Subject: (svn r14321) -Add: support for newgrfs printing bytes/words/dwords as hexadecimals. --- src/newgrf_text.cpp | 19 +++++++++++++++++++ src/strings.cpp | 8 ++++++++ src/table/control_codes.h | 6 +++++- 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/newgrf_text.cpp b/src/newgrf_text.cpp index ce3bda10c..4178eda0a 100644 --- a/src/newgrf_text.cpp +++ b/src/newgrf_text.cpp @@ -284,6 +284,16 @@ char *TranslateTTDPatchCodes(uint32 grfid, const char *str) d += Utf8Encode(d, SCC_NEWGRF_UNPRINT); d += Utf8Encode(d, *str++); break; + case 6: + d += Utf8Encode(d, SCC_NEWGRF_PRINT_HEX_BYTE); + break; + case 7: + d += Utf8Encode(d, SCC_NEWGRF_PRINT_HEX_WORD); + break; + case 8: + d += Utf8Encode(d, SCC_NEWGRF_PRINT_HEX_DWORD); + break; + default: grfmsg(1, "missing handler for extended format code"); break; @@ -625,6 +635,10 @@ uint RemapNewGRFStringControlCode(uint scc, char **buff, const char **str, int64 case SCC_NEWGRF_PRINT_DWORD_CURRENCY: case SCC_NEWGRF_PRINT_DWORD: *argv = _newgrf_textrefstack->PopSignedDWord(); break; + 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_WORD: case SCC_NEWGRF_PRINT_WORD_SPEED: case SCC_NEWGRF_PRINT_WORD_LITRES: case SCC_NEWGRF_PRINT_UNSIGNED_WORD: *argv = _newgrf_textrefstack->PopUnsignedWord(); break; @@ -653,6 +667,11 @@ uint RemapNewGRFStringControlCode(uint scc, char **buff, const char **str, int64 case SCC_NEWGRF_PRINT_UNSIGNED_WORD: return SCC_COMMA; + case SCC_NEWGRF_PRINT_HEX_BYTE: + case SCC_NEWGRF_PRINT_HEX_WORD: + case SCC_NEWGRF_PRINT_HEX_DWORD: + return SCC_HEX; + case SCC_NEWGRF_PRINT_DWORD_CURRENCY: case SCC_NEWGRF_PRINT_QWORD_CURRENCY: return SCC_CURRENCY; diff --git a/src/strings.cpp b/src/strings.cpp index d8522be25..6e9665ad9 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -267,6 +267,10 @@ static char *FormatNoCommaNumber(char *buff, int64 number, const char *last) return buff; } +static char *FormatHexNumber(char *buff, int64 number, const char *last) +{ + return buff + snprintf(buff, last - buff, "0x%x", (uint32)number); +} static char *FormatYmdString(char *buff, Date date, const char* last) { @@ -815,6 +819,10 @@ static char* FormatString(char* buff, const char* str, const int64* argv, uint c buff = FormatNoCommaNumber(buff, GetInt64(&argv), last); break; + case SCC_HEX: // {HEX} + buff = FormatHexNumber(buff, GetInt64(&argv), last); + break; + case SCC_CURRENCY: // {CURRENCY} buff = FormatGenericCurrency(buff, _currency, GetInt64(&argv), false, last); break; diff --git a/src/table/control_codes.h b/src/table/control_codes.h index 69cabda67..03a383556 100644 --- a/src/table/control_codes.h +++ b/src/table/control_codes.h @@ -64,6 +64,7 @@ enum StringControlCode { SCC_STRING, SCC_COMMA, SCC_NUM, + SCC_HEX, SCC_STRING_ID, SCC_RAW_STRING_POINTER, @@ -101,7 +102,7 @@ enum StringControlCode { SCC_NEWGRF_FIRST, SCC_NEWGRF_PRINT_DWORD = SCC_NEWGRF_FIRST, ///< Read 4 bytes from the stack SCC_NEWGRF_PRINT_SIGNED_WORD, ///< Read 2 bytes from the stack as signed value - SCC_NEWGRF_PRINT_SIGNED_BYTE, ///< Read 1 bytes from the stack as signed value + SCC_NEWGRF_PRINT_SIGNED_BYTE, ///< Read 1 byte from the stack as signed value SCC_NEWGRF_PRINT_UNSIGNED_WORD, ///< Read 2 bytes from the stack as unsigned value SCC_NEWGRF_PRINT_DWORD_CURRENCY, ///< Read 4 bytes from the stack as currency SCC_NEWGRF_PRINT_STRING_ID, ///< Read 2 bytes from the stack as String ID @@ -110,6 +111,9 @@ enum StringControlCode { SCC_NEWGRF_PRINT_WORD_SPEED, ///< Read 2 bytes from the stack as signed speed SCC_NEWGRF_PRINT_WORD_LITRES, ///< Read 2 bytes from the stack as signed litres SCC_NEWGRF_PRINT_QWORD_CURRENCY, ///< Read 8 bytes from the stack as currency + 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_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 -- cgit v1.2.3-54-g00ecf