src/newgrf_spritegroup.cpp
author bjarni
Thu, 19 Jun 2008 17:54:23 +0000
changeset 9561 f236daaaf93a
parent 9540 3a80ccaff780
child 9750 7114408dd1fa
permissions -rw-r--r--
(svn r13584) -Fix: [OSX] Fixed issue where 10.5 failed to switch to fullscreen
This is done by selecting the 32bpp-anim blitter by default as it seems Apple removed some 8bpp support
Since this is done at runtime the same binary will still select 8bpp on 10.3 and 10.4
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
9111
48ce04029fe4 (svn r12971) -Documentation: add @file in files that missed them and add something more than whitespace as description of files that don't have a description.
rubidium
parents: 9088
diff changeset
     3
/** @file newgrf_spritegroup.cpp Handling of primarily NewGRF action 2. */
6348
6dd01da7a02b (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6343
diff changeset
     4
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
     5
#include "stdafx.h"
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
     6
#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
     7
#include "variables.h"
6343
76d17f784c13 (svn r9371) -Feature: Add support for variable snow lines in the arctic climate, supplied
maedhros
parents: 6332
diff changeset
     8
#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
     9
#include "oldpool.h"
8546
fb64231b2976 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 8474
diff changeset
    10
#include "newgrf.h"
5617
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
    11
#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
    12
#include "newgrf_spritegroup.h"
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6247
diff changeset
    13
#include "sprite.h"
8140
0d0d8c94f84b (svn r11702) -Codechange: move all date related stuff to date*.
rubidium
parents: 8113
diff changeset
    14
#include "date_func.h"
8270
e7c342f6b14c (svn r11834) -Codechange: only include settings_type.h if needed.
rubidium
parents: 8140
diff changeset
    15
#include "settings_type.h"
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    16
4971
2a9325fca331 (svn r6974) use the pool macros for the SpriteGroup pool
tron
parents: 4894
diff changeset
    17
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
    18
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    19
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
    20
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
    21
5022
313d3630a122 (svn r7063) static
tron
parents: 4971
diff changeset
    22
static void DestroySpriteGroup(SpriteGroup *group)
4402
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    23
{
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    24
	/* 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
    25
	/* 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
    26
	switch (group->type) {
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    27
		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
    28
			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
    29
			free((SpriteGroup**)group->g.real.loading);
4402
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_DETERMINISTIC:
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    33
			free(group->g.determ.adjusts);
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    34
			free(group->g.determ.ranges);
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    35
			break;
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    36
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    37
		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
    38
			free((SpriteGroup**)group->g.random.groups);
4402
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    39
			break;
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    40
6332
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6247
diff changeset
    41
		case SGT_TILELAYOUT:
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6247
diff changeset
    42
			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
    43
			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
    44
			break;
f3f436dcd7d0 (svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents: 6247
diff changeset
    45
4402
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    46
		default:
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    47
			break;
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    48
	}
356627e69fc5 (svn r6155) -Codechange: split Destroy routine from SpriteGroupPoolCleanBlock
truelight
parents: 4331
diff changeset
    49
}
3595
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
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
    52
{
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    53
	uint i;
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
	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
    56
		DestroySpriteGroup(GetSpriteGroup(i));
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
}
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    59
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
/* Allocate a new SpriteGroup */
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 5622
diff changeset
    62
SpriteGroup *AllocateSpriteGroup()
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    63
{
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    64
	/* 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
    65
	if (_spritegroup_count == GetSpriteGroupPoolSize()) {
7401
7a72cc2a1196 (svn r10773) -Codechange: use pool.CleanPool instead of CleanPool(&pool) and similarly for AddBlock*.
rubidium
parents: 7168
diff changeset
    66
		if (!_SpriteGroup_pool.AddBlockToPool()) return NULL;
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
4971
2a9325fca331 (svn r6974) use the pool macros for the SpriteGroup pool
tron
parents: 4894
diff changeset
    69
	return GetSpriteGroup(_spritegroup_count++);
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    70
}
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    71
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    72
6247
7d81e3a5d803 (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 5622
diff changeset
    73
void InitializeSpriteGroupPool()
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    74
{
7401
7a72cc2a1196 (svn r10773) -Codechange: use pool.CleanPool instead of CleanPool(&pool) and similarly for AddBlock*.
rubidium
parents: 7168
diff changeset
    75
	_SpriteGroup_pool.CleanPool();
3595
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    76
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    77
	_spritegroup_count = 0;
a0acdb23e662 (svn r4486) - NewGRF: Create and use a memory pool to manage sprite groups. This
peter1138
parents:
diff changeset
    78
}
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    79
7616
ebf15b08ac38 (svn r11145) -Codechange: add support for "decoding" TTDPs string codes wrt to registers 0x100 to 0x10F.
rubidium
parents: 7612
diff changeset
    80
TemporaryStorageArray<uint32, 0x110> _temp_store;
6521
d4d0e886f4bd (svn r9707) -Codechange: Add some support for NewGRF var 7D, temporary storage array.
peter1138
parents: 6357
diff changeset
    81
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    82
3893
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
    83
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
    84
{
8546
fb64231b2976 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 8474
diff changeset
    85
	/* First handle variables common with Action7/9/D */
fb64231b2976 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 8474
diff changeset
    86
	uint32 value;
8561
da83b7781786 (svn r12139) -Fix (r12124): The global variable value should be returned, not the variable.
peter1138
parents: 8546
diff changeset
    87
	if (GetGlobalVariable(variable, &value)) return value;
8546
fb64231b2976 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 8474
diff changeset
    88
fb64231b2976 (svn r12124) -Codechange: Move newgrf-variables that are common to VarAction2 and Action7/9/D to their own function.
frosch
parents: 8474
diff changeset
    89
	/* Non-common variable */
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    90
	switch (variable) {
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    91
		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
    92
		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
    93
		case 0x18: return object->callback_param2;
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;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
    95
9540
3a80ccaff780 (svn r13544) -Codechange: Add support for NewGRF varaction2 variable 5F.
peter1138
parents: 9111
diff changeset
    96
		case 0x5F: return (object->GetRandomBits(object) << 8) | object->GetTriggers(object);
3a80ccaff780 (svn r13544) -Codechange: Add support for NewGRF varaction2 variable 5F.
peter1138
parents: 9111
diff changeset
    97
7609
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents: 7600
diff changeset
    98
		case 0x7D: return _temp_store.Get(parameter);
6521
d4d0e886f4bd (svn r9707) -Codechange: Add some support for NewGRF var 7D, temporary storage array.
peter1138
parents: 6357
diff changeset
    99
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   100
		/* 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
   101
		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
   102
	}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   103
}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   104
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   105
7612
798324cb4f0d (svn r11141) -Codechange: add support for NewGRF's varaction2 operators 11, 12 and 13.
rubidium
parents: 7610
diff changeset
   106
/**
798324cb4f0d (svn r11141) -Codechange: add support for NewGRF's varaction2 operators 11, 12 and 13.
rubidium
parents: 7610
diff changeset
   107
 * Rotate val rot times to the right
798324cb4f0d (svn r11141) -Codechange: add support for NewGRF's varaction2 operators 11, 12 and 13.
rubidium
parents: 7610
diff changeset
   108
 * @param val the value to rotate
798324cb4f0d (svn r11141) -Codechange: add support for NewGRF's varaction2 operators 11, 12 and 13.
rubidium
parents: 7610
diff changeset
   109
 * @param rot the amount of times to rotate
798324cb4f0d (svn r11141) -Codechange: add support for NewGRF's varaction2 operators 11, 12 and 13.
rubidium
parents: 7610
diff changeset
   110
 * @return the rotated value
798324cb4f0d (svn r11141) -Codechange: add support for NewGRF's varaction2 operators 11, 12 and 13.
rubidium
parents: 7610
diff changeset
   111
 */
798324cb4f0d (svn r11141) -Codechange: add support for NewGRF's varaction2 operators 11, 12 and 13.
rubidium
parents: 7610
diff changeset
   112
static uint32 RotateRight(uint32 val, uint32 rot)
798324cb4f0d (svn r11141) -Codechange: add support for NewGRF's varaction2 operators 11, 12 and 13.
rubidium
parents: 7610
diff changeset
   113
{
798324cb4f0d (svn r11141) -Codechange: add support for NewGRF's varaction2 operators 11, 12 and 13.
rubidium
parents: 7610
diff changeset
   114
	/* Do not rotate more than necessary */
798324cb4f0d (svn r11141) -Codechange: add support for NewGRF's varaction2 operators 11, 12 and 13.
rubidium
parents: 7610
diff changeset
   115
	rot %= 32;
798324cb4f0d (svn r11141) -Codechange: add support for NewGRF's varaction2 operators 11, 12 and 13.
rubidium
parents: 7610
diff changeset
   116
798324cb4f0d (svn r11141) -Codechange: add support for NewGRF's varaction2 operators 11, 12 and 13.
rubidium
parents: 7610
diff changeset
   117
	return (val >> rot) | (val << (32 - rot));
798324cb4f0d (svn r11141) -Codechange: add support for NewGRF's varaction2 operators 11, 12 and 13.
rubidium
parents: 7610
diff changeset
   118
}
798324cb4f0d (svn r11141) -Codechange: add support for NewGRF's varaction2 operators 11, 12 and 13.
rubidium
parents: 7610
diff changeset
   119
798324cb4f0d (svn r11141) -Codechange: add support for NewGRF's varaction2 operators 11, 12 and 13.
rubidium
parents: 7610
diff changeset
   120
5600
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   121
/* 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
   122
* 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
   123
template <typename U, typename S>
7610
13b7d9e247d2 (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 7609
diff changeset
   124
static U EvalAdjustT(const DeterministicSpriteGroupAdjust *adjust, ResolverObject *object, 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
   125
{
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   126
	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
   127
	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
   128
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   129
	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
   130
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   131
	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
   132
		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
   133
		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
   134
		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
   135
	}
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   136
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   137
	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
   138
		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
   139
		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
   140
		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
   141
		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
   142
		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
   143
		case DSGA_OP_UMAX: return max((U)last_value, (U)value);
6617
b0a8ec04c0ff (svn r9837) -Fix: [NewGRF] Catch occurance of division-by-zero in varaction handling.
peter1138
parents: 6521
diff changeset
   144
		case DSGA_OP_SDIV: return value == 0 ? (S)last_value : (S)last_value / (S)value;
b0a8ec04c0ff (svn r9837) -Fix: [NewGRF] Catch occurance of division-by-zero in varaction handling.
peter1138
parents: 6521
diff changeset
   145
		case DSGA_OP_SMOD: return value == 0 ? (S)last_value : (S)last_value % (S)value;
b0a8ec04c0ff (svn r9837) -Fix: [NewGRF] Catch occurance of division-by-zero in varaction handling.
peter1138
parents: 6521
diff changeset
   146
		case DSGA_OP_UDIV: return value == 0 ? (U)last_value : (U)last_value / (U)value;
b0a8ec04c0ff (svn r9837) -Fix: [NewGRF] Catch occurance of division-by-zero in varaction handling.
peter1138
parents: 6521
diff changeset
   147
		case DSGA_OP_UMOD: return value == 0 ? (U)last_value : (U)last_value % (U)value;
5600
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   148
		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
   149
		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
   150
		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
   151
		case DSGA_OP_XOR:  return last_value ^ value;
7609
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents: 7600
diff changeset
   152
		case DSGA_OP_STO:  _temp_store.Store(value, last_value); return last_value;
6521
d4d0e886f4bd (svn r9707) -Codechange: Add some support for NewGRF var 7D, temporary storage array.
peter1138
parents: 6357
diff changeset
   153
		case DSGA_OP_RST:  return value;
7610
13b7d9e247d2 (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 7609
diff changeset
   154
		case DSGA_OP_STOP: if (object->psa != NULL) object->psa->Store(value, last_value); return last_value;
7612
798324cb4f0d (svn r11141) -Codechange: add support for NewGRF's varaction2 operators 11, 12 and 13.
rubidium
parents: 7610
diff changeset
   155
		case DSGA_OP_ROR:  return RotateRight(last_value, value);
798324cb4f0d (svn r11141) -Codechange: add support for NewGRF's varaction2 operators 11, 12 and 13.
rubidium
parents: 7610
diff changeset
   156
		case DSGA_OP_SCMP: return ((S)last_value == (S)value) ? 1 : ((S)last_value < (S)value ? 0 : 2);
798324cb4f0d (svn r11141) -Codechange: add support for NewGRF's varaction2 operators 11, 12 and 13.
rubidium
parents: 7610
diff changeset
   157
		case DSGA_OP_UCMP: return ((U)last_value == (U)value) ? 1 : ((U)last_value < (U)value ? 0 : 2);
5600
19cb92f7ccf2 (svn r8054) -Codechange: Use a template function instead of a macro for evaluating NewGRF var adjusts
peter1138
parents: 5587
diff changeset
   158
		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
   159
	}
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   160
}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   161
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   162
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
   163
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
   164
{
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   165
	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
   166
	uint32 last_value = 0;
5606
0b3fb15cbf8f (svn r8062) -Codechange: change newgrf varaction2 value from signed to unsigned
peter1138
parents: 5604
diff changeset
   167
	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
   168
	uint i;
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
	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
   171
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   172
	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
   173
		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
   174
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   175
		/* 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
   176
		bool available = true;
5617
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
   177
		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
   178
			ResolverObject subobject = *object;
8685
fdc27d8e35b3 (svn r12352) -Fix: Some callback-results were treated as 8 bit, when they were 15 bit, and vice versa.
frosch
parents: 8561
diff changeset
   179
			subobject.procedure_call = true;
7609
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents: 7600
diff changeset
   180
			const SpriteGroup *subgroup = Resolve(adjust->subroutine, &subobject);
5617
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
   181
			if (subgroup == NULL || subgroup->type != SGT_CALLBACK) {
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
   182
				value = CALLBACK_FAILED;
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
   183
			} else {
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
   184
				value = subgroup->g.callback.result;
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
   185
			}
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
   186
		} else {
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
   187
			value = GetVariable(object, adjust->variable, adjust->parameter, &available);
07de31c05f46 (svn r8075) -Feature: Add support for variable 7E - subroutines. (peter1138)
maedhros
parents: 5607
diff changeset
   188
		}
3893
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   189
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   190
		if (!available) {
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   191
			/* 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
   192
			 * the group from the first range or the default group. */
7609
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents: 7600
diff changeset
   193
			return Resolve(group->g.determ.num_ranges > 0 ? group->g.determ.ranges[0].group : group->g.determ.default_group, object);
3893
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   194
		}
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   195
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   196
		switch (group->g.determ.size) {
7610
13b7d9e247d2 (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 7609
diff changeset
   197
			case DSG_SIZE_BYTE:  value = EvalAdjustT<uint8,  int8> (adjust, object, last_value, value); break;
13b7d9e247d2 (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 7609
diff changeset
   198
			case DSG_SIZE_WORD:  value = EvalAdjustT<uint16, int16>(adjust, object, last_value, value); break;
13b7d9e247d2 (svn r11139) -Codechange: add support for persistent storage for NewGRFs.
rubidium
parents: 7609
diff changeset
   199
			case DSG_SIZE_DWORD: value = EvalAdjustT<uint32, int32>(adjust, object, 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
   200
			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
   201
		}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   202
		last_value = value;
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
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
   205
	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
   206
3893
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   207
	if (group->g.determ.num_ranges == 0) {
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   208
		/* nvar == 0 is a special case -- we turn our value into a callback result */
9088
f0a60d7af636 (svn r12947) -Fix: keep only first 15 bits for non failed callback results
glx
parents: 9020
diff changeset
   209
		if (value != CALLBACK_FAILED) value = GB(value, 0, 15);
3893
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   210
		nvarzero.type = SGT_CALLBACK;
9020
8174bbda9abe (svn r12819) -Codechange: handle more NewGRFs in the same way as TTDP does it, i.e. testing the low bits for 0xFF or 0 instead of all bits.
rubidium
parents: 8968
diff changeset
   211
		nvarzero.g.callback.result = value;
3893
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   212
		return &nvarzero;
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   213
	}
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   214
3893
ced26054ee00 (svn r4960) - NewGRF: explicitly handle unsupported variables, instead of returning -1.
peter1138
parents: 3861
diff changeset
   215
	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
   216
		if (group->g.determ.ranges[i].low <= value && value <= group->g.determ.ranges[i].high) {
7609
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents: 7600
diff changeset
   217
			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
   218
		}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   219
	}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   220
7609
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents: 7600
diff changeset
   221
	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
   222
}
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
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
   225
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
   226
{
3753
2509d0dc21a7 (svn r4741) - NewGRF: use the correct variable type for the random bit mask
peter1138
parents: 3734
diff changeset
   227
	uint32 mask;
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   228
	byte index;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   229
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   230
	object->scope = group->g.random.var_scope;
8756
b6f8dc6a246f (svn r12452) -Feature: [NewGRF] Add random action 2 type 84. For vehicles only.
glx
parents: 8714
diff changeset
   231
	object->count = group->g.random.count;
3677
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
	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
   234
		/* Handle triggers */
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   235
		/* 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
   236
		byte waiting_triggers = object->GetTriggers(object);
7862
1d710dd7e197 (svn r11412) -Fix (r11403): animation was not turned on properly.
rubidium
parents: 7860
diff changeset
   237
		byte match = group->g.random.triggers & (waiting_triggers | object->trigger);
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   238
		bool res;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   239
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   240
		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
   241
			(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
   242
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   243
		if (res) {
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   244
			waiting_triggers &= ~match;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   245
			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
   246
		} else {
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   247
			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
   248
		}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   249
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   250
		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
   251
	}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   252
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   253
	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
   254
	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
   255
7609
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents: 7600
diff changeset
   256
	return Resolve(group->g.random.groups[index], object);
3677
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   257
}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   258
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   259
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   260
/* ResolverObject (re)entry point */
7609
b70ffc13652a (svn r11138) -Codechange: prepare some subsystems for persistent storage for NewGRFs.
rubidium
parents: 7600
diff changeset
   261
const SpriteGroup *Resolve(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
   262
{
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   263
	/* 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
   264
	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
   265
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   266
	switch (group->type) {
3734
5b331306e6fe (svn r4714) - NewGRF: simplify evaluation of 'real' sprite groups.
peter1138
parents: 3690
diff changeset
   267
		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
   268
		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
   269
		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
   270
		default:                return group;
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   271
	}
526d6243241a (svn r4594) - NewGRF: introduce the basic sprite group resolver. This code isn't used yet.
peter1138
parents: 3668
diff changeset
   272
}