src/newgrf_spritegroup.cpp
author tron
Thu, 22 Feb 2007 06:57:21 +0000
changeset 6105 760134e9dab6
parent 5622 1361c4bd1774
child 6247 7d81e3a5d803
permissions -rw-r--r--
(svn r8840) -Fix

Remove FIFO and Stack. They have never been used and could not be used anyway because the declarations of some functions are spelled different than the definitions they should correspond to.
Also remove some other unused helpers and related struct attributes.
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"
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
     7
#include "oldpool.h"
5617
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
     8
#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
     9
#include "newgrf_spritegroup.h"
4261
28670f743746 (svn r5887) -Cleanup: move date related functions, defines and variables to date.[ch]
rubidium
parents: 3971
diff changeset
    10
#include "date.h"
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    11
4971
2a9325fca331 (svn r6974) use the pool macros for the SpriteGroup pool
tron
parents: 4894
diff changeset
    12
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
    13
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    14
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
    15
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
    16
5022
313d3630a122 (svn r7063) static
tron
parents: 4971
diff changeset
    17
static void DestroySpriteGroup(SpriteGroup *group)
4402
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    18
{
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    19
	/* 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
    20
	/* 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
    21
	switch (group->type) {
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    22
		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
    23
			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
    24
			free((SpriteGroup**)group->g.real.loading);
4402
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    25
			break;
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    26
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    27
		case SGT_DETERMINISTIC:
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    28
			free(group->g.determ.adjusts);
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    29
			free(group->g.determ.ranges);
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    30
			break;
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    31
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    32
		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
    33
			free((SpriteGroup**)group->g.random.groups);
4402
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    34
			break;
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    35
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    36
		default:
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    37
			break;
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    38
	}
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    39
}
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    40
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    41
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
    42
{
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    43
	uint i;
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    44
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    45
	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
    46
		DestroySpriteGroup(GetSpriteGroup(i));
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
}
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
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    51
/* Allocate a new SpriteGroup */
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    52
SpriteGroup *AllocateSpriteGroup(void)
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    53
{
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    54
	/* 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
    55
	if (_spritegroup_count == GetSpriteGroupPoolSize()) {
2a9325fca331 (svn r6974) use the pool macros for the SpriteGroup pool
tron
parents: 4894
diff changeset
    56
		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
    57
	}
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    58
4971
2a9325fca331 (svn r6974) use the pool macros for the SpriteGroup pool
tron
parents: 4894
diff changeset
    59
	return GetSpriteGroup(_spritegroup_count++);
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
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    62
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    63
void InitializeSpriteGroupPool(void)
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    64
{
4971
2a9325fca331 (svn r6974) use the pool macros for the SpriteGroup pool
tron
parents: 4894
diff changeset
    65
	CleanPool(&_SpriteGroup_pool);
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    66
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    67
	_spritegroup_count = 0;
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    68
}
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    69
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    70
3893
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
    71
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
    72
{
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    73
	/* Return common variables */
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    74
	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
    75
		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
    76
		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
    77
		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
    78
		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
    79
		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
    80
		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
    81
		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
    82
		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
    83
		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
    84
		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
    85
		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
    86
		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
    87
		case 0x1C: return object->last_value;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    88
		case 0x20: return _opt.landscape == LT_HILLY ? _opt.snow_line : 0xFF;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    89
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    90
		/* 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
    91
		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
    92
	}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    93
}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    94
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    95
5600
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
    96
/* 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
    97
* 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
    98
template <typename U, typename S>
5606
0b3fb15cbf8f (svn r8062) -Codechange: change newgrf varaction2 value from signed to unsigned
peter1138
parents: 5604
diff changeset
    99
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
   100
{
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   101
	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
   102
	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
   103
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   104
	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
   105
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   106
	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
   107
		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
   108
		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
   109
		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
   110
	}
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   111
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   112
	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
   113
		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
   114
		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
   115
		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
   116
		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
   117
		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
   118
		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
   119
		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
   120
		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
   121
		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
   122
		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
   123
		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
   124
		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
   125
		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
   126
		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
   127
		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
   128
	}
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   129
}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   130
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   131
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
   132
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
   133
{
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   134
	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
   135
	uint32 last_value = 0;
5606
0b3fb15cbf8f (svn r8062) -Codechange: change newgrf varaction2 value from signed to unsigned
peter1138
parents: 5604
diff changeset
   136
	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
   137
	uint i;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   138
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   139
	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
   140
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   141
	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
   142
		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
   143
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   144
		/* 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
   145
		bool available = true;
5617
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
   146
		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
   147
			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
   148
			const SpriteGroup *subgroup = Resolve(adjust->subroutine, &subobject);
5617
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
   149
			if (subgroup == NULL || subgroup->type != SGT_CALLBACK) {
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
   150
				value = CALLBACK_FAILED;
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
   151
			} else {
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
   152
				value = subgroup->g.callback.result;
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
   153
			}
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
   154
		} else {
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
   155
			value = GetVariable(object, adjust->variable, adjust->parameter, &available);
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
   156
		}
3893
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   157
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   158
		if (!available) {
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   159
			/* 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
   160
			 * 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
   161
			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
   162
		}
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   163
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   164
		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
   165
			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
   166
			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
   167
			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
   168
			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
   169
		}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   170
		last_value = value;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   171
	}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   172
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
   173
	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
   174
3893
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   175
	if (group->g.determ.num_ranges == 0) {
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   176
		/* 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
   177
		nvarzero.type = SGT_CALLBACK;
3942
718fa406d7eb (svn r5087) - NewGRF: Fix thinko in returning a calculated callback result
peter1138
parents: 3893
diff changeset
   178
		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
   179
		return &nvarzero;
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   180
	}
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   181
3893
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   182
	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
   183
		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
   184
			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
   185
		}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   186
	}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   187
3893
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   188
	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
   189
}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   190
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   191
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
   192
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
   193
{
3753
2509d0dc21a7 (svn r4741) - NewGRF: use the correct variable type for the random bit mask
peter1138
parents: 3734
diff changeset
   194
	uint32 mask;
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   195
	byte index;
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
	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
   198
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   199
	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
   200
		/* Handle triggers */
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   201
		/* 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
   202
		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
   203
		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
   204
		bool res;
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
		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
   207
			(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
   208
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   209
		if (res) {
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   210
			waiting_triggers &= ~match;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   211
			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
   212
		} else {
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   213
			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
   214
		}
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
		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
   217
	}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   218
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   219
	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
   220
	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
   221
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   222
	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
   223
}
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
/* 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
   227
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
   228
{
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   229
	/* 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
   230
	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
   231
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   232
	switch (group->type) {
3734
5b331306e6fe (svn r4714) - NewGRF: simplify evaluation of 'real' sprite groups.
peter1138
parents: 3690
diff changeset
   233
		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
   234
		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
   235
		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
   236
		default:                return group;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   237
	}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   238
}