From bac8ce6b41c5c0886a83ce3e94801d28c2269851 Mon Sep 17 00:00:00 2001 From: yexo Date: Wed, 12 Oct 2011 19:25:52 +0000 Subject: [PATCH] (svn r23027) -Fix: in some cases NewGRF string arguments were popped twice from the newgrf textstack --- src/newgrf_text.cpp | 5 +++-- src/newgrf_text.h | 2 +- src/strings.cpp | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/newgrf_text.cpp b/src/newgrf_text.cpp index 711d68d158..a5f5983601 100644 --- a/src/newgrf_text.cpp +++ b/src/newgrf_text.cpp @@ -1020,11 +1020,12 @@ void RewindTextRefStack() * @param buff the buffer we're writing to * @param str the string that we need to write * @param argv the OpenTTD stack of values + * @param modify_argv When true, modify the OpenTTD stack. * @return the string control code to "execute" now */ -uint RemapNewGRFStringControlCode(uint scc, char *buf_start, char **buff, const char **str, int64 *argv) +uint RemapNewGRFStringControlCode(uint scc, char *buf_start, char **buff, const char **str, int64 *argv, bool modify_argv) { - if (_newgrf_textrefstack.used) { + if (_newgrf_textrefstack.used && modify_argv) { switch (scc) { default: NOT_REACHED(); case SCC_NEWGRF_PRINT_BYTE_SIGNED: *argv = _newgrf_textrefstack.PopSignedByte(); break; diff --git a/src/newgrf_text.h b/src/newgrf_text.h index 4a9d96af16..338c61c7b3 100644 --- a/src/newgrf_text.h +++ b/src/newgrf_text.h @@ -40,7 +40,7 @@ void RewindTextRefStack(); bool UsingNewGRFTextStack(); struct TextRefStack *CreateTextRefStackBackup(); void RestoreTextRefStackBackup(struct TextRefStack *backup); -uint RemapNewGRFStringControlCode(uint scc, char *buf_start, char **buff, const char **str, int64 *argv); +uint RemapNewGRFStringControlCode(uint scc, char *buf_start, char **buff, const char **str, int64 *argv, bool modify_argv); StringID TTDPStringIDToOTTDStringIDMapping(StringID string); diff --git a/src/strings.cpp b/src/strings.cpp index ae72e2a25a..36fe46dc87 100644 --- a/src/strings.cpp +++ b/src/strings.cpp @@ -668,7 +668,7 @@ static char *FormatString(char *buff, const char *str_arg, StringParameters *arg uint orig_offset = args->offset; /* When there is no array with types there is no need to do a dry run. */ - if (!args->HasTypeInformation()) dry_run = true; + if (!args->HasTypeInformation() && !UsingNewGRFTextStack()) dry_run = true; if (!dry_run) { if (UsingNewGRFTextStack()) { /* Values from the NewGRF text stack are only copied to the normal @@ -702,7 +702,7 @@ static char *FormatString(char *buff, const char *str_arg, StringParameters *arg if (SCC_NEWGRF_FIRST <= b && b <= SCC_NEWGRF_LAST) { /* We need to pass some stuff as it might be modified; oh boy. */ //todo: should argve be passed here too? - b = RemapNewGRFStringControlCode(b, buf_start, &buff, &str, (int64 *)args->GetDataPointer()); + b = RemapNewGRFStringControlCode(b, buf_start, &buff, &str, (int64 *)args->GetDataPointer(), dry_run); if (b == 0) continue; }