mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-06 14:27:16 +00:00
(svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
This commit is contained in:
parent
5afd50017d
commit
4ae861880b
@ -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. */
|
/* 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->operation = group->g.determ.num_adjusts == 1 ? DSGA_OP_ADD : (DeterministicSpriteGroupAdjustOperation)grf_load_byte(&buf);
|
||||||
adjust->variable = 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);
|
varadjust = grf_load_byte(&buf);
|
||||||
adjust->shift_num = GB(varadjust, 0, 5);
|
adjust->shift_num = GB(varadjust, 0, 5);
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include "variables.h"
|
#include "variables.h"
|
||||||
#include "macros.h"
|
#include "macros.h"
|
||||||
#include "oldpool.h"
|
#include "oldpool.h"
|
||||||
|
#include "newgrf_callbacks.h"
|
||||||
#include "newgrf_spritegroup.h"
|
#include "newgrf_spritegroup.h"
|
||||||
#include "date.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. */
|
/* Try to get the variable. We shall assume it is available, unless told otherwise. */
|
||||||
bool available = true;
|
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) {
|
if (!available) {
|
||||||
/* Unsupported property: skip further processing and return either
|
/* Unsupported property: skip further processing and return either
|
||||||
|
@ -69,6 +69,7 @@ typedef struct DeterministicSpriteGroupAdjust {
|
|||||||
uint32 and_mask;
|
uint32 and_mask;
|
||||||
uint32 add_val;
|
uint32 add_val;
|
||||||
uint32 divmod_val;
|
uint32 divmod_val;
|
||||||
|
const SpriteGroup *subroutine;
|
||||||
} DeterministicSpriteGroupAdjust;
|
} DeterministicSpriteGroupAdjust;
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user