100 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* $Id$ */
 | 
						|
 | 
						|
#include "stdafx.h"
 | 
						|
#include "openttd.h"
 | 
						|
#include "sprite.h"
 | 
						|
#include "variables.h"
 | 
						|
#include "debug.h"
 | 
						|
 | 
						|
 | 
						|
SpriteGroup *EvalDeterministicSpriteGroup(const DeterministicSpriteGroup *dsg, int value)
 | 
						|
{
 | 
						|
	int i;
 | 
						|
 | 
						|
	value >>= dsg->adjusts[0].shift_num; // This should bring us to the byte range.
 | 
						|
	value &= dsg->adjusts[0].and_mask;
 | 
						|
 | 
						|
	if (dsg->adjusts[0].operation != DSGA_TYPE_NONE)
 | 
						|
		value += (signed char) dsg->adjusts[0].add_val;
 | 
						|
 | 
						|
	switch (dsg->adjusts[0].type) {
 | 
						|
		case DSGA_TYPE_DIV:
 | 
						|
			value /= (signed char) dsg->adjusts[0].divmod_val;
 | 
						|
			break;
 | 
						|
		case DSGA_TYPE_MOD:
 | 
						|
			value %= (signed char) dsg->adjusts[0].divmod_val;
 | 
						|
			break;
 | 
						|
		case DSGA_TYPE_NONE:
 | 
						|
			break;
 | 
						|
	}
 | 
						|
 | 
						|
	for (i = 0; i < dsg->num_ranges; i++) {
 | 
						|
		DeterministicSpriteGroupRange *range = &dsg->ranges[i];
 | 
						|
 | 
						|
		if (range->low <= (uint32)value && (uint32)value <= range->high)
 | 
						|
			return range->group;
 | 
						|
	}
 | 
						|
 | 
						|
	return dsg->default_group;
 | 
						|
}
 | 
						|
 | 
						|
int GetDeterministicSpriteValue(byte var)
 | 
						|
{
 | 
						|
	switch (var) {
 | 
						|
		case 0x00:
 | 
						|
			return _date;
 | 
						|
		case 0x01:
 | 
						|
			return _cur_year;
 | 
						|
		case 0x02:
 | 
						|
			return _cur_month;
 | 
						|
		case 0x03:
 | 
						|
			return _opt.landscape;
 | 
						|
		case 0x09:
 | 
						|
			return _date_fract;
 | 
						|
		case 0x0A:
 | 
						|
			return _tick_counter;
 | 
						|
		case 0x0C:
 | 
						|
			/* If we got here, it means there was no callback or
 | 
						|
			 * callbacks aren't supported on our callpath. */
 | 
						|
			return 0;
 | 
						|
		default:
 | 
						|
			return -1;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
SpriteGroup *EvalRandomizedSpriteGroup(const RandomizedSpriteGroup *rsg, byte random_bits)
 | 
						|
{
 | 
						|
	byte mask;
 | 
						|
	byte index;
 | 
						|
 | 
						|
	/* Noone likes mangling with bits, but you don't get around it here.
 | 
						|
	 * Sorry. --pasky */
 | 
						|
	// rsg->num_groups is always power of 2
 | 
						|
	mask = (rsg->num_groups - 1) << rsg->lowest_randbit;
 | 
						|
	index = (random_bits & mask) >> rsg->lowest_randbit;
 | 
						|
	assert(index < rsg->num_groups);
 | 
						|
	return rsg->groups[index];
 | 
						|
}
 | 
						|
 | 
						|
byte RandomizedSpriteGroupTriggeredBits(const RandomizedSpriteGroup *rsg,
 | 
						|
	byte triggers, byte *waiting_triggers)
 | 
						|
{
 | 
						|
	byte match = rsg->triggers & (*waiting_triggers | triggers);
 | 
						|
	bool res;
 | 
						|
 | 
						|
	if (rsg->cmp_mode == RSG_CMP_ANY) {
 | 
						|
		res = (match != 0);
 | 
						|
	} else { /* RSG_CMP_ALL */
 | 
						|
		res = (match == rsg->triggers);
 | 
						|
	}
 | 
						|
 | 
						|
	if (!res) {
 | 
						|
		*waiting_triggers |= triggers;
 | 
						|
		return 0;
 | 
						|
	}
 | 
						|
 | 
						|
	*waiting_triggers &= ~match;
 | 
						|
 | 
						|
	return (rsg->num_groups - 1) << rsg->lowest_randbit;
 | 
						|
}
 |