(svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
--- a/src/newgrf.cpp Fri Jan 12 08:37:14 2007 +0000
+++ b/src/newgrf.cpp Fri Jan 12 11:20:34 2007 +0000
@@ -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 Fri Jan 12 08:37:14 2007 +0000
+++ b/src/newgrf_spritegroup.cpp Fri Jan 12 11:20:34 2007 +0000
@@ -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 Fri Jan 12 08:37:14 2007 +0000
+++ b/src/newgrf_spritegroup.h Fri Jan 12 11:20:34 2007 +0000
@@ -69,6 +69,7 @@
uint32 and_mask;
uint32 add_val;
uint32 divmod_val;
+ const SpriteGroup *subroutine;
} DeterministicSpriteGroupAdjust;