src/newgrf_spritegroup.cpp
author maedhros
Tue, 20 Mar 2007 13:47:00 +0000
changeset 6343 76d17f784c13
parent 6332 f3f436dcd7d0
child 6348 6dd01da7a02b
permissions -rw-r--r--
(svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
by newgrf files. When this is enabled forests cannot be built below the highest
snow line, and farms can't be built above it. Houses still use the
_opt.snow_line so they are all consistent, so to make them respect the snowline
you may want to use some newhouses features as well.
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
     1
/* $Id$ */
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
     2
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
     3
#include "stdafx.h"
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
     4
#include "openttd.h"
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
     5
#include "variables.h"
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
     6
#include "macros.h"
6343
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6332
diff changeset
     7
#include "landscape.h"
5216
8bd14ee39af2 (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
     8
#include "oldpool.h"
5617
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
     9
#include "newgrf_callbacks.h"
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    10
#include "newgrf_spritegroup.h"
4261
28670f743746 (svn r5887) -Cleanup: move date related functions, defines and variables to date.[ch]
rubidium
parents: 3971
diff changeset
    11
#include "date.h"
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6247
diff changeset
    12
#include "sprite.h"
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    13
4971
2a9325fca331 (svn r6974) use the pool macros for the SpriteGroup pool
tron
parents: 4894
diff changeset
    14
static void SpriteGroupPoolCleanBlock(uint start_item, uint end_item);
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    15
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    16
static uint _spritegroup_count = 0;
5474
ac55aefc54f3 (svn r7758) -Codechange: Change SpriteGroup pool allocation from 16 items to 512 items at a time, as with a few sets loaded there can easily be 10,000+ items in the pool.
peter1138
parents: 5216
diff changeset
    17
STATIC_OLD_POOL(SpriteGroup, SpriteGroup, 9, 250, NULL, SpriteGroupPoolCleanBlock)
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    18
5022
313d3630a122 (svn r7063) static
tron
parents: 4971
diff changeset
    19
static void DestroySpriteGroup(SpriteGroup *group)
4402
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    20
{
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    21
	/* Free dynamically allocated memory */
4894
b9322e55f0e1 (svn r6838) - Fix (r6836): MS VC complains beecause it doesn't understand consts... (or I don't...)
peter1138
parents: 4402
diff changeset
    22
	/* XXX Cast away the consts due to MSVC being buggy... */
4402
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    23
	switch (group->type) {
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    24
		case SGT_REAL:
4894
b9322e55f0e1 (svn r6838) - Fix (r6836): MS VC complains beecause it doesn't understand consts... (or I don't...)
peter1138
parents: 4402
diff changeset
    25
			free((SpriteGroup**)group->g.real.loaded);
b9322e55f0e1 (svn r6838) - Fix (r6836): MS VC complains beecause it doesn't understand consts... (or I don't...)
peter1138
parents: 4402
diff changeset
    26
			free((SpriteGroup**)group->g.real.loading);
4402
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    27
			break;
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    28
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    29
		case SGT_DETERMINISTIC:
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    30
			free(group->g.determ.adjusts);
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    31
			free(group->g.determ.ranges);
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    32
			break;
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    33
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    34
		case SGT_RANDOMIZED:
4894
b9322e55f0e1 (svn r6838) - Fix (r6836): MS VC complains beecause it doesn't understand consts... (or I don't...)
peter1138
parents: 4402
diff changeset
    35
			free((SpriteGroup**)group->g.random.groups);
4402
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    36
			break;
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    37
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6247
diff changeset
    38
		case SGT_TILELAYOUT:
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6247
diff changeset
    39
			free((void*)group->g.layout.dts->seq);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6247
diff changeset
    40
			free(group->g.layout.dts);
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6247
diff changeset
    41
			break;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6247
diff changeset
    42
4402
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    43
		default:
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    44
			break;
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    45
	}
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    46
}
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    47
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    48
static void SpriteGroupPoolCleanBlock(uint start_item, uint end_item)
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    49
{
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    50
	uint i;
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    51
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    52
	for (i = start_item; i <= end_item; i++) {
4971
2a9325fca331 (svn r6974) use the pool macros for the SpriteGroup pool
tron
parents: 4894
diff changeset
    53
		DestroySpriteGroup(GetSpriteGroup(i));
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    54
	}
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    55
}
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    56
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    57
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    58
/* Allocate a new SpriteGroup */
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 5622
diff changeset
    59
SpriteGroup *AllocateSpriteGroup()
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    60
{
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    61
	/* This is totally different to the other pool allocators, as we never remove an item from the pool. */
4971
2a9325fca331 (svn r6974) use the pool macros for the SpriteGroup pool
tron
parents: 4894
diff changeset
    62
	if (_spritegroup_count == GetSpriteGroupPoolSize()) {
2a9325fca331 (svn r6974) use the pool macros for the SpriteGroup pool
tron
parents: 4894
diff changeset
    63
		if (!AddBlockToPool(&_SpriteGroup_pool)) return NULL;
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    64
	}
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    65
4971
2a9325fca331 (svn r6974) use the pool macros for the SpriteGroup pool
tron
parents: 4894
diff changeset
    66
	return GetSpriteGroup(_spritegroup_count++);
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    67
}
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    68
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    69
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 5622
diff changeset
    70
void InitializeSpriteGroupPool()
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    71
{
4971
2a9325fca331 (svn r6974) use the pool macros for the SpriteGroup pool
tron
parents: 4894
diff changeset
    72
	CleanPool(&_SpriteGroup_pool);
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    73
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    74
	_spritegroup_count = 0;
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    75
}
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    76
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    77
3893
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
    78
static inline uint32 GetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available)
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    79
{
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    80
	/* Return common variables */
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    81
	switch (variable) {
4331
ec584824ffb8 (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
    82
		case 0x00: return max(_date - DAYS_TILL_ORIGINAL_BASE_YEAR, 0);
4322
f40bbdf476b3 (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
    83
		case 0x01: return clamp(_cur_year, ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR;
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    84
		case 0x02: return _cur_month;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    85
		case 0x03: return _opt.landscape;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    86
		case 0x09: return _date_fract;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    87
		case 0x0A: return _tick_counter;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    88
		case 0x0C: return object->callback;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    89
		case 0x10: return object->callback_param1;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    90
		case 0x11: return 0;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    91
		case 0x18: return object->callback_param2;
5604
4629f14fe543 (svn r8058) -Codechange: Replaced an occurence of (uint32)-1 by UINT_MAX
celestar
parents: 5601
diff changeset
    92
		case 0x1A: return UINT_MAX;
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    93
		case 0x1B: return GB(_display_opt, 0, 6);
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    94
		case 0x1C: return object->last_value;
6343
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6332
diff changeset
    95
		case 0x20: return _opt.landscape == LT_HILLY ? GetSnowLine() : 0xFF;
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    96
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    97
		/* Not a common variable, so evalute the feature specific variables */
3893
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
    98
		default: return object->GetVariable(object, variable, parameter, available);
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    99
	}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   100
}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   101
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   102
5600
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   103
/* Evaluate an adjustment for a variable of the given size.
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   104
* U is the unsigned type and S is the signed type to use. */
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   105
template <typename U, typename S>
5606
0b3fb15cbf8f (svn r8062) -Codechange: change newgrf varaction2 value from signed to unsigned
peter1138
parents: 5604
diff changeset
   106
static U EvalAdjustT(const DeterministicSpriteGroupAdjust *adjust, U last_value, uint32 value)
5600
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   107
{
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   108
	value >>= adjust->shift_num;
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   109
	value  &= adjust->and_mask;
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   110
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   111
	if (adjust->type != DSGA_TYPE_NONE) value += (S)adjust->add_val;
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   112
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   113
	switch (adjust->type) {
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   114
		case DSGA_TYPE_DIV:  value /= (S)adjust->divmod_val; break;
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   115
		case DSGA_TYPE_MOD:  value %= (U)adjust->divmod_val; break;
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   116
		case DSGA_TYPE_NONE: break;
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   117
	}
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   118
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   119
	switch (adjust->operation) {
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   120
		case DSGA_OP_ADD:  return last_value + value;
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   121
		case DSGA_OP_SUB:  return last_value - value;
5601
d58f82901b2f (svn r8055) -Codechange: Replace the different max, dmax, maxu whatever macros by a simple template function max(), that requires two arguments of the same type. While I'm at it change a variable called "max" to "maxval" in a function that calls max().
celestar
parents: 5600
diff changeset
   122
		case DSGA_OP_SMIN: return min((S)last_value, (S)value);
d58f82901b2f (svn r8055) -Codechange: Replace the different max, dmax, maxu whatever macros by a simple template function max(), that requires two arguments of the same type. While I'm at it change a variable called "max" to "maxval" in a function that calls max().
celestar
parents: 5600
diff changeset
   123
		case DSGA_OP_SMAX: return max((S)last_value, (S)value);
5600
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   124
		case DSGA_OP_UMIN: return min((U)last_value, (U)value);
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   125
		case DSGA_OP_UMAX: return max((U)last_value, (U)value);
5606
0b3fb15cbf8f (svn r8062) -Codechange: change newgrf varaction2 value from signed to unsigned
peter1138
parents: 5604
diff changeset
   126
		case DSGA_OP_SDIV: return (S)last_value / (S)value;
0b3fb15cbf8f (svn r8062) -Codechange: change newgrf varaction2 value from signed to unsigned
peter1138
parents: 5604
diff changeset
   127
		case DSGA_OP_SMOD: return (S)last_value % (S)value;
5600
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   128
		case DSGA_OP_UDIV: return (U)last_value / (U)value;
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   129
		case DSGA_OP_UMOD: return (U)last_value % (U)value;
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   130
		case DSGA_OP_MUL:  return last_value * value;
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   131
		case DSGA_OP_AND:  return last_value & value;
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   132
		case DSGA_OP_OR:   return last_value | value;
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   133
		case DSGA_OP_XOR:  return last_value ^ value;
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   134
		default:           return value;
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   135
	}
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   136
}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   137
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   138
3686
16627c28741d (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
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   140
{
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   141
	static SpriteGroup nvarzero;
5607
f9ffb623aad9 (svn r8063) -Codechange: When evaluating newgrf varaction2s the 'last value' should start off at 0, and the result of the operation is remembered.
peter1138
parents: 5606
diff changeset
   142
	uint32 last_value = 0;
5606
0b3fb15cbf8f (svn r8062) -Codechange: change newgrf varaction2 value from signed to unsigned
peter1138
parents: 5604
diff changeset
   143
	uint32 value = 0;
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   144
	uint i;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   145
526d6243241a (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;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   147
526d6243241a (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++) {
526d6243241a (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
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   150
ced26054ee00 (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. */
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   152
		bool available = true;
5617
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
   153
		if (adjust->variable == 0x7E) {
5622
1361c4bd1774 (svn r8081) -Fix (r8075): Use a copy of the resolver object instead of the using the existing one. This fixes problems with the object scope setting.
peter1138
parents: 5617
diff changeset
   154
			ResolverObject subobject = *object;
1361c4bd1774 (svn r8081) -Fix (r8075): Use a copy of the resolver object instead of the using the existing one. This fixes problems with the object scope setting.
peter1138
parents: 5617
diff changeset
   155
			const SpriteGroup *subgroup = Resolve(adjust->subroutine, &subobject);
5617
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
   156
			if (subgroup == NULL || subgroup->type != SGT_CALLBACK) {
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
   157
				value = CALLBACK_FAILED;
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
   158
			} else {
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
   159
				value = subgroup->g.callback.result;
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
   160
			}
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
   161
		} else {
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
   162
			value = GetVariable(object, adjust->variable, adjust->parameter, &available);
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
   163
		}
3893
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   164
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   165
		if (!available) {
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   166
			/* Unsupported property: skip further processing and return either
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   167
			 * the group from the first range or the default group. */
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   168
			return Resolve(group->g.determ.num_ranges > 0 ? group->g.determ.ranges[0].group : group->g.determ.default_group, object);
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   169
		}
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   170
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   171
		switch (group->g.determ.size) {
5600
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   172
			case DSG_SIZE_BYTE:  value = EvalAdjustT<uint8, int8>(adjust, last_value, value); break;
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   173
			case DSG_SIZE_WORD:  value = EvalAdjustT<uint16, int16>(adjust, last_value, value); break;
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   174
			case DSG_SIZE_DWORD: value = EvalAdjustT<uint32, int32>(adjust, last_value, value); break;
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   175
			default: NOT_REACHED(); break;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   176
		}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   177
		last_value = value;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   178
	}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   179
5607
f9ffb623aad9 (svn r8063) -Codechange: When evaluating newgrf varaction2s the 'last value' should start off at 0, and the result of the operation is remembered.
peter1138
parents: 5606
diff changeset
   180
	object->last_value = last_value;
f9ffb623aad9 (svn r8063) -Codechange: When evaluating newgrf varaction2s the 'last value' should start off at 0, and the result of the operation is remembered.
peter1138
parents: 5606
diff changeset
   181
3893
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   182
	if (group->g.determ.num_ranges == 0) {
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   183
		/* nvar == 0 is a special case -- we turn our value into a callback result */
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   184
		nvarzero.type = SGT_CALLBACK;
3942
718fa406d7eb (svn r5087) - NewGRF: Fix thinko in returning a calculated callback result
peter1138
parents: 3893
diff changeset
   185
		nvarzero.g.callback.result = GB(value, 0, 15);
3893
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   186
		return &nvarzero;
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   187
	}
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   188
3893
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   189
	for (i = 0; i < group->g.determ.num_ranges; i++) {
5606
0b3fb15cbf8f (svn r8062) -Codechange: change newgrf varaction2 value from signed to unsigned
peter1138
parents: 5604
diff changeset
   190
		if (group->g.determ.ranges[i].low <= value && value <= group->g.determ.ranges[i].high) {
3893
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   191
			return Resolve(group->g.determ.ranges[i].group, object);
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   192
		}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   193
	}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   194
3893
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   195
	return Resolve(group->g.determ.default_group, object);
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   196
}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   197
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   198
3686
16627c28741d (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
   199
static inline const SpriteGroup *ResolveRandom(const SpriteGroup *group, ResolverObject *object)
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   200
{
3753
2509d0dc21a7 (svn r4741) - NewGRF: use the correct variable type for the random bit mask
peter1138
parents: 3734
diff changeset
   201
	uint32 mask;
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   202
	byte index;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   203
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   204
	object->scope = group->g.random.var_scope;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   205
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   206
	if (object->trigger != 0) {
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   207
		/* Handle triggers */
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   208
		/* Magic code that may or may not do the right things... */
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   209
		byte waiting_triggers = object->GetTriggers(object);
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   210
		byte match = group->g.random.triggers & (waiting_triggers | object->trigger);
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   211
		bool res;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   212
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   213
		res = (group->g.random.cmp_mode == RSG_CMP_ANY) ?
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   214
			(match != 0) : (match == group->g.random.triggers);
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   215
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   216
		if (res) {
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   217
			waiting_triggers &= ~match;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   218
			object->reseed |= (group->g.random.num_groups - 1) << group->g.random.lowest_randbit;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   219
		} else {
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   220
			waiting_triggers |= object->trigger;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   221
		}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   222
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   223
		object->SetTriggers(object, waiting_triggers);
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   224
	}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   225
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   226
	mask  = (group->g.random.num_groups - 1) << group->g.random.lowest_randbit;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   227
	index = (object->GetRandomBits(object) & mask) >> group->g.random.lowest_randbit;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   228
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   229
	return Resolve(group->g.random.groups[index], object);
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   230
}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   231
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   232
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   233
/* ResolverObject (re)entry point */
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   234
const SpriteGroup *Resolve(const SpriteGroup *group, ResolverObject *object)
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   235
{
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   236
	/* We're called even if there is no group, so quietly return nothing */
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   237
	if (group == NULL) return NULL;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   238
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   239
	switch (group->type) {
3734
5b331306e6fe (svn r4714) - NewGRF: simplify evaluation of 'real' sprite groups.
peter1138
parents: 3690
diff changeset
   240
		case SGT_REAL:          return object->ResolveReal(object, group);
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   241
		case SGT_DETERMINISTIC: return ResolveVariable(group, object);
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   242
		case SGT_RANDOMIZED:    return ResolveRandom(group, object);
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   243
		default:                return group;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   244
	}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   245
}