summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryexo <yexo@openttd.org>2011-10-12 19:25:52 +0000
committeryexo <yexo@openttd.org>2011-10-12 19:25:52 +0000
commitbac8ce6b41c5c0886a83ce3e94801d28c2269851 (patch)
treed2a7e94f8583d8dacca2f110e76419c65553eb69
parent560b527f6f32d5dcfe17217d442e07397ed35808 (diff)
downloadopenttd-bac8ce6b41c5c0886a83ce3e94801d28c2269851.tar.xz
(svn r23027) -Fix: in some cases NewGRF string arguments were popped twice from the newgrf textstack
-rw-r--r--src/newgrf_text.cpp5
-rw-r--r--src/newgrf_text.h2
-rw-r--r--src/strings.cpp4
3 files changed, 6 insertions, 5 deletions
diff --git a/src/newgrf_text.cpp b/src/newgrf_text.cpp
index 711d68d15..a5f598360 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 4a9d96af1..338c61c7b 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 ae72e2a25..36fe46dc8 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;
}