From 4ae861880bda8a0882db1a6bd1e82cff003248a6 Mon Sep 17 00:00:00 2001 From: maedhros Date: Fri, 12 Jan 2007 11:20:34 +0000 Subject: (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138) --- src/newgrf.cpp | 7 ++++++- src/newgrf_spritegroup.cpp | 12 +++++++++++- src/newgrf_spritegroup.h | 1 + 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 6d4f1a333..4d0982d93 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -1648,7 +1648,12 @@ static void NewSpriteGroup(byte *buf, int len) /* 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); diff --git a/src/newgrf_spritegroup.cpp b/src/newgrf_spritegroup.cpp index e187ddd9f..97e0114e2 100644 --- 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 @@ static inline const SpriteGroup *ResolveVariable(const SpriteGroup *group, Resol /* 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 diff --git a/src/newgrf_spritegroup.h b/src/newgrf_spritegroup.h index f77b6009d..836032882 100644 --- a/src/newgrf_spritegroup.h +++ b/src/newgrf_spritegroup.h @@ -69,6 +69,7 @@ typedef struct DeterministicSpriteGroupAdjust { uint32 and_mask; uint32 add_val; uint32 divmod_val; + const SpriteGroup *subroutine; } DeterministicSpriteGroupAdjust; -- cgit v1.2.3-70-g09d2