newgrf_spritegroup.c
author rubidium
Fri, 29 Dec 2006 10:16:36 +0000
changeset 5662 2dd848654f54
parent 5216 d581e4db95b6
child 5497 b9c8c76d31b7
child 5642 bfa6074e2833
permissions -rw-r--r--
(svn r7609) -Codechange: remove some direct map accesses to m5 and some unneeded signal removal code in ClearTileTrack as it is done in CmdRemoveSingleRail too, which is called for every removed trackbit.
3595
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
     1
/* $Id$ */
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
     2
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
     3
#include "stdafx.h"
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
     4
#include "openttd.h"
3677
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
     5
#include "variables.h"
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
     6
#include "macros.h"
5216
d581e4db95b6 (svn r7331) - Codechange: Rename all memory pool macro's and types to "old pool", so the new pool implementation can be committed alongside it.
matthijs
parents: 5081
diff changeset
     7
#include "oldpool.h"
3677
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
     8
#include "newgrf_spritegroup.h"
4261
2ec8f5a9747b (svn r5887) -Cleanup: move date related functions, defines and variables to date.[ch]
rubidium
parents: 3971
diff changeset
     9
#include "date.h"
3595
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    10
4971
0a3653c45b5a (svn r6974) use the pool macros for the SpriteGroup pool
tron
parents: 4894
diff changeset
    11
static void SpriteGroupPoolCleanBlock(uint start_item, uint end_item);
3595
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    12
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    13
static uint _spritegroup_count = 0;
5216
d581e4db95b6 (svn r7331) - Codechange: Rename all memory pool macro's and types to "old pool", so the new pool implementation can be committed alongside it.
matthijs
parents: 5081
diff changeset
    14
STATIC_OLD_POOL(SpriteGroup, SpriteGroup, 4, 8000, NULL, SpriteGroupPoolCleanBlock)
3595
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    15
5022
323517a5df08 (svn r7063) static
tron
parents: 4971
diff changeset
    16
static void DestroySpriteGroup(SpriteGroup *group)
4402
05a9ad2ec919 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    17
{
05a9ad2ec919 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    18
	/* Free dynamically allocated memory */
4894
079148a9eadc (svn r6838) - Fix (r6836): MS VC complains beecause it doesn't understand consts... (or I don't...)
peter1138
parents: 4402
diff changeset
    19
	/* XXX Cast away the consts due to MSVC being buggy... */
4402
05a9ad2ec919 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    20
	switch (group->type) {
05a9ad2ec919 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    21
		case SGT_REAL:
4894
079148a9eadc (svn r6838) - Fix (r6836): MS VC complains beecause it doesn't understand consts... (or I don't...)
peter1138
parents: 4402
diff changeset
    22
			free((SpriteGroup**)group->g.real.loaded);
079148a9eadc (svn r6838) - Fix (r6836): MS VC complains beecause it doesn't understand consts... (or I don't...)
peter1138
parents: 4402
diff changeset
    23
			free((SpriteGroup**)group->g.real.loading);
4402
05a9ad2ec919 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    24
			break;
05a9ad2ec919 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    25
05a9ad2ec919 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    26
		case SGT_DETERMINISTIC:
05a9ad2ec919 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    27
			free(group->g.determ.adjusts);
05a9ad2ec919 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    28
			free(group->g.determ.ranges);
05a9ad2ec919 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    29
			break;
05a9ad2ec919 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    30
05a9ad2ec919 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    31
		case SGT_RANDOMIZED:
4894
079148a9eadc (svn r6838) - Fix (r6836): MS VC complains beecause it doesn't understand consts... (or I don't...)
peter1138
parents: 4402
diff changeset
    32
			free((SpriteGroup**)group->g.random.groups);
4402
05a9ad2ec919 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    33
			break;
05a9ad2ec919 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    34
05a9ad2ec919 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    35
		default:
05a9ad2ec919 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    36
			break;
05a9ad2ec919 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    37
	}
05a9ad2ec919 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    38
}
3595
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    39
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    40
static void SpriteGroupPoolCleanBlock(uint start_item, uint end_item)
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    41
{
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    42
	uint i;
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    43
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    44
	for (i = start_item; i <= end_item; i++) {
4971
0a3653c45b5a (svn r6974) use the pool macros for the SpriteGroup pool
tron
parents: 4894
diff changeset
    45
		DestroySpriteGroup(GetSpriteGroup(i));
3595
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    46
	}
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    47
}
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    48
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    49
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    50
/* Allocate a new SpriteGroup */
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    51
SpriteGroup *AllocateSpriteGroup(void)
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    52
{
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    53
	/* This is totally different to the other pool allocators, as we never remove an item from the pool. */
4971
0a3653c45b5a (svn r6974) use the pool macros for the SpriteGroup pool
tron
parents: 4894
diff changeset
    54
	if (_spritegroup_count == GetSpriteGroupPoolSize()) {
0a3653c45b5a (svn r6974) use the pool macros for the SpriteGroup pool
tron
parents: 4894
diff changeset
    55
		if (!AddBlockToPool(&_SpriteGroup_pool)) return NULL;
3595
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    56
	}
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    57
4971
0a3653c45b5a (svn r6974) use the pool macros for the SpriteGroup pool
tron
parents: 4894
diff changeset
    58
	return GetSpriteGroup(_spritegroup_count++);
3595
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    59
}
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    60
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    61
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    62
void InitializeSpriteGroupPool(void)
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    63
{
4971
0a3653c45b5a (svn r6974) use the pool macros for the SpriteGroup pool
tron
parents: 4894
diff changeset
    64
	CleanPool(&_SpriteGroup_pool);
3595
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    65
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    66
	_spritegroup_count = 0;
20621831cd46 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    67
}
3677
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    68
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    69
3893
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
    70
static inline uint32 GetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available)
3677
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    71
{
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    72
	/* Return common variables */
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    73
	switch (variable) {
4331
11de01553605 (svn r6013) -Fix: some newgrf properties returned the date in the new format where the newgrf's expect the original format. Thanks to michi_cc for finding these and providing the initial patch.
rubidium
parents: 4322
diff changeset
    74
		case 0x00: return max(_date - DAYS_TILL_ORIGINAL_BASE_YEAR, 0);
4322
0bee6d9bc452 (svn r5975) -Cleanup: use ORIGINAL_BASE_YEAR & ORIGINAL_MAX_YEAR where the functions really depend on the original date format.
rubidium
parents: 4293
diff changeset
    75
		case 0x01: return clamp(_cur_year, ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR;
3677
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    76
		case 0x02: return _cur_month;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    77
		case 0x03: return _opt.landscape;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    78
		case 0x09: return _date_fract;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    79
		case 0x0A: return _tick_counter;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    80
		case 0x0C: return object->callback;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    81
		case 0x10: return object->callback_param1;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    82
		case 0x11: return 0;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    83
		case 0x18: return object->callback_param2;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    84
		case 0x1A: return -1;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    85
		case 0x1B: return GB(_display_opt, 0, 6);
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    86
		case 0x1C: return object->last_value;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    87
		case 0x20: return _opt.landscape == LT_HILLY ? _opt.snow_line : 0xFF;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    88
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    89
		/* Not a common variable, so evalute the feature specific variables */
3893
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
    90
		default: return object->GetVariable(object, variable, parameter, available);
3677
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    91
	}
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    92
}
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    93
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    94
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    95
/* Evaluate an adjustment for a variable of the given size. This is a bit of
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    96
 * an unwieldy macro, but it saves triplicating the code. */
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    97
#define BUILD_EVAL_ADJUST(size, usize) \
3788
069d945ed860 (svn r4784) - NewGRF: shuffle the mix of signed / unsigned types when dealing with var adjusts. Fixes issues with some station layouts.
peter1138
parents: 3753
diff changeset
    98
static inline usize EvalAdjust_ ## size(const DeterministicSpriteGroupAdjust *adjust, usize last_value, int32 value) \
3677
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    99
{ \
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   100
	value >>= adjust->shift_num; \
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   101
	value  &= adjust->and_mask; \
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   102
\
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   103
	if (adjust->type != DSGA_TYPE_NONE) value += (size)adjust->add_val; \
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   104
\
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   105
	switch (adjust->type) { \
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   106
		case DSGA_TYPE_DIV:  value /= (size)adjust->divmod_val; break; \
3788
069d945ed860 (svn r4784) - NewGRF: shuffle the mix of signed / unsigned types when dealing with var adjusts. Fixes issues with some station layouts.
peter1138
parents: 3753
diff changeset
   107
		case DSGA_TYPE_MOD:  value %= (usize)adjust->divmod_val; break; \
3677
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   108
		case DSGA_TYPE_NONE: break; \
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   109
	} \
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   110
\
3690
610c920b283a (svn r4616) - NewGRF: when evaluating a variable adjustment, give our value the correct type after rather than before it has been adjusted.
peter1138
parents: 3686
diff changeset
   111
	/* Get our value to the correct range */ \
3788
069d945ed860 (svn r4784) - NewGRF: shuffle the mix of signed / unsigned types when dealing with var adjusts. Fixes issues with some station layouts.
peter1138
parents: 3753
diff changeset
   112
	value = (usize)value; \
3690
610c920b283a (svn r4616) - NewGRF: when evaluating a variable adjustment, give our value the correct type after rather than before it has been adjusted.
peter1138
parents: 3686
diff changeset
   113
\
3677
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   114
	switch (adjust->operation) { \
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   115
		case DSGA_OP_ADD:  return last_value + value; \
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   116
		case DSGA_OP_SUB:  return last_value - value; \
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   117
		case DSGA_OP_SMIN: return min(last_value, value); \
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   118
		case DSGA_OP_SMAX: return max(last_value, value); \
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   119
		case DSGA_OP_UMIN: return min((usize)last_value, (usize)value); \
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   120
		case DSGA_OP_UMAX: return max((usize)last_value, (usize)value); \
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   121
		case DSGA_OP_SDIV: return last_value / value; \
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   122
		case DSGA_OP_SMOD: return last_value % value; \
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   123
		case DSGA_OP_UDIV: return (usize)last_value / (usize)value; \
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   124
		case DSGA_OP_UMOD: return (usize)last_value % (usize)value; \
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   125
		case DSGA_OP_MUL:  return last_value * value; \
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   126
		case DSGA_OP_AND:  return last_value & value; \
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   127
		case DSGA_OP_OR:   return last_value | value; \
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   128
		case DSGA_OP_XOR:  return last_value ^ value; \
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   129
		default:           return value; \
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   130
	} \
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   131
}
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   132
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   133
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   134
BUILD_EVAL_ADJUST(int8, uint8)
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   135
BUILD_EVAL_ADJUST(int16, uint16)
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   136
BUILD_EVAL_ADJUST(int32, uint32)
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   137
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   138
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3681
diff changeset
   139
static inline const SpriteGroup *ResolveVariable(const SpriteGroup *group, ResolverObject *object)
3677
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   140
{
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   141
	static SpriteGroup nvarzero;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   142
	int32 last_value = object->last_value;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   143
	int32 value = -1;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   144
	uint i;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   145
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   146
	object->scope = group->g.determ.var_scope;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   147
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   148
	for (i = 0; i < group->g.determ.num_adjusts; i++) {
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   149
		DeterministicSpriteGroupAdjust *adjust = &group->g.determ.adjusts[i];
3893
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   150
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   151
		/* Try to get the variable. We shall assume it is available, unless told otherwise. */
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   152
		bool available = true;
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   153
		value = GetVariable(object, adjust->variable, adjust->parameter, &available);
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   154
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   155
		if (!available) {
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   156
			/* Unsupported property: skip further processing and return either
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   157
			 * the group from the first range or the default group. */
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   158
			return Resolve(group->g.determ.num_ranges > 0 ? group->g.determ.ranges[0].group : group->g.determ.default_group, object);
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   159
		}
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   160
3677
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   161
		switch (group->g.determ.size) {
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   162
			case DSG_SIZE_BYTE:  value = EvalAdjust_int8(adjust, last_value, value); break;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   163
			case DSG_SIZE_WORD:  value = EvalAdjust_int16(adjust, last_value, value); break;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   164
			case DSG_SIZE_DWORD: value = EvalAdjust_int32(adjust, last_value, value); break;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   165
			default: NOT_REACHED(); break;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   166
		}
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   167
		last_value = value;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   168
	}
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   169
3893
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   170
	if (group->g.determ.num_ranges == 0) {
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   171
		/* nvar == 0 is a special case -- we turn our value into a callback result */
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   172
		nvarzero.type = SGT_CALLBACK;
3942
18f75e002a09 (svn r5087) - NewGRF: Fix thinko in returning a calculated callback result
peter1138
parents: 3893
diff changeset
   173
		nvarzero.g.callback.result = GB(value, 0, 15);
3893
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   174
		return &nvarzero;
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   175
	}
3677
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   176
3893
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   177
	for (i = 0; i < group->g.determ.num_ranges; i++) {
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   178
		if (group->g.determ.ranges[i].low <= (uint32)value && (uint32)value <= group->g.determ.ranges[i].high) {
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   179
			return Resolve(group->g.determ.ranges[i].group, object);
3677
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   180
		}
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   181
	}
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   182
3893
46169364701b (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   183
	return Resolve(group->g.determ.default_group, object);
3677
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   184
}
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   185
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   186
3686
55efe6da4dfb (svn r4611) - NewGRF: introduce new vehicle sprite group resolver code. This also fixes some known bugs (e.g. the 'Standard Five' in UKRS is now the correct colour)
peter1138
parents: 3681
diff changeset
   187
static inline const SpriteGroup *ResolveRandom(const SpriteGroup *group, ResolverObject *object)
3677
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   188
{
3753
aa15896bc569 (svn r4741) - NewGRF: use the correct variable type for the random bit mask
peter1138
parents: 3734
diff changeset
   189
	uint32 mask;
3677
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   190
	byte index;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   191
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   192
	object->scope = group->g.random.var_scope;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   193
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   194
	if (object->trigger != 0) {
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   195
		/* Handle triggers */
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   196
		/* Magic code that may or may not do the right things... */
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   197
		byte waiting_triggers = object->GetTriggers(object);
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   198
		byte match = group->g.random.triggers & (waiting_triggers | object->trigger);
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   199
		bool res;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   200
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   201
		res = (group->g.random.cmp_mode == RSG_CMP_ANY) ?
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   202
			(match != 0) : (match == group->g.random.triggers);
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   203
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   204
		if (res) {
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   205
			waiting_triggers &= ~match;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   206
			object->reseed |= (group->g.random.num_groups - 1) << group->g.random.lowest_randbit;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   207
		} else {
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   208
			waiting_triggers |= object->trigger;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   209
		}
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   210
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   211
		object->SetTriggers(object, waiting_triggers);
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   212
	}
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   213
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   214
	mask  = (group->g.random.num_groups - 1) << group->g.random.lowest_randbit;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   215
	index = (object->GetRandomBits(object) & mask) >> group->g.random.lowest_randbit;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   216
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   217
	return Resolve(group->g.random.groups[index], object);
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   218
}
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   219
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   220
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   221
/* ResolverObject (re)entry point */
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   222
const SpriteGroup *Resolve(const SpriteGroup *group, ResolverObject *object)
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   223
{
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   224
	/* We're called even if there is no group, so quietly return nothing */
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   225
	if (group == NULL) return NULL;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   226
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   227
	switch (group->type) {
3734
f929883c5ae0 (svn r4714) - NewGRF: simplify evaluation of 'real' sprite groups.
peter1138
parents: 3690
diff changeset
   228
		case SGT_REAL:          return object->ResolveReal(object, group);
3677
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   229
		case SGT_DETERMINISTIC: return ResolveVariable(group, object);
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   230
		case SGT_RANDOMIZED:    return ResolveRandom(group, object);
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   231
		default:                return group;
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   232
	}
cb6659a684b5 (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   233
}