changeset 18198:6af38106a773 draft

(svn r23027) -Fix: in some cases NewGRF string arguments were popped twice from the newgrf textstack
author yexo <yexo@openttd.org>
date Wed, 12 Oct 2011 19:25:52 +0000
parents 643ea2d498ee
children 728c09f456b3
files src/newgrf_text.cpp src/newgrf_text.h src/strings.cpp
diffstat 3 files changed, 6 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/newgrf_text.cpp
+++ b/src/newgrf_text.cpp
@@ -1020,11 +1020,12 @@
  * @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;
--- a/src/newgrf_text.h
+++ b/src/newgrf_text.h
@@ -40,7 +40,7 @@
 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);
 
--- a/src/strings.cpp
+++ b/src/strings.cpp
@@ -668,7 +668,7 @@
 	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 @@
 		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;
 		}