changeset 5617:ef79a2605252 draft

(svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
author maedhros <maedhros@openttd.org>
date Fri, 12 Jan 2007 11:20:34 +0000
parents 78c85a8c5488
children ea1998aeffe2
files src/newgrf.cpp src/newgrf_spritegroup.cpp src/newgrf_spritegroup.h
diffstat 3 files changed, 18 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/newgrf.cpp
+++ b/src/newgrf.cpp
@@ -1648,7 +1648,12 @@
 				/* The first var adjust doesn't have an operation specified, so we set it to add. */
 				adjust->operation = group->g.determ.num_adjusts == 1 ? DSGA_OP_ADD : (DeterministicSpriteGroupAdjustOperation)grf_load_byte(&buf);
 				adjust->variable  = grf_load_byte(&buf);
-				adjust->parameter = IS_BYTE_INSIDE(adjust->variable, 0x60, 0x80) ? grf_load_byte(&buf) : 0;
+				if (adjust->variable == 0x7E) {
+					/* Link subroutine group */
+					adjust->subroutine = GetGroupFromGroupID(setid, type, grf_load_byte(&buf));
+				} else {
+					adjust->parameter = IS_BYTE_INSIDE(adjust->variable, 0x60, 0x80) ? grf_load_byte(&buf) : 0;
+				}
 
 				varadjust = grf_load_byte(&buf);
 				adjust->shift_num = GB(varadjust, 0, 5);
--- a/src/newgrf_spritegroup.cpp
+++ b/src/newgrf_spritegroup.cpp
@@ -5,6 +5,7 @@
 #include "variables.h"
 #include "macros.h"
 #include "oldpool.h"
+#include "newgrf_callbacks.h"
 #include "newgrf_spritegroup.h"
 #include "date.h"
 
@@ -142,7 +143,16 @@
 
 		/* Try to get the variable. We shall assume it is available, unless told otherwise. */
 		bool available = true;
-		value = GetVariable(object, adjust->variable, adjust->parameter, &available);
+		if (adjust->variable == 0x7E) {
+			const SpriteGroup *subgroup = Resolve(adjust->subroutine, object);
+			if (subgroup == NULL || subgroup->type != SGT_CALLBACK) {
+				value = CALLBACK_FAILED;
+			} else {
+				value = subgroup->g.callback.result;
+			}
+		} else {
+			value = GetVariable(object, adjust->variable, adjust->parameter, &available);
+		}
 
 		if (!available) {
 			/* Unsupported property: skip further processing and return either
--- a/src/newgrf_spritegroup.h
+++ b/src/newgrf_spritegroup.h
@@ -69,6 +69,7 @@
 	uint32 and_mask;
 	uint32 add_val;
 	uint32 divmod_val;
+	const SpriteGroup *subroutine;
 } DeterministicSpriteGroupAdjust;