rubidium@9620: /* $Id$ */ rubidium@9620: rubidium@9620: #include "stdafx.h" rubidium@9620: #include "openttd.h" rubidium@9620: #include "variables.h" rubidium@9620: #include "landscape.h" rubidium@9620: #include "debug.h" rubidium@9620: #include "newgrf.h" rubidium@9620: #include "newgrf_callbacks.h" truelight@9641: #include "newgrf_commons.h" rubidium@9620: #include "newgrf_spritegroup.h" rubidium@9620: #include "newgrf_canal.h" rubidium@9620: rubidium@9620: rubidium@9620: /** Table of canal 'feature' sprite groups */ rubidium@9620: const SpriteGroup *_canal_sg[CF_END]; rubidium@9620: rubidium@9620: rubidium@9620: /* Random bits and triggers are not supported for canals, so the following rubidium@9620: * three functions are stubs. */ rubidium@9620: static uint32 CanalGetRandomBits(const ResolverObject *object) rubidium@9620: { rubidium@9620: return 0; rubidium@9620: } rubidium@9620: rubidium@9620: rubidium@9620: static uint32 CanalGetTriggers(const ResolverObject *object) rubidium@9620: { rubidium@9620: return 0; rubidium@9620: } rubidium@9620: rubidium@9620: rubidium@9620: static void CanalSetTriggers(const ResolverObject *object, int triggers) rubidium@9620: { rubidium@9620: return; rubidium@9620: } rubidium@9620: rubidium@9620: rubidium@9620: static uint32 CanalGetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available) rubidium@9620: { rubidium@9620: TileIndex tile = object->u.canal.tile; rubidium@9620: rubidium@9620: switch (variable) { rubidium@9620: case 0x80: rubidium@9620: return TileHeight(tile); rubidium@9620: rubidium@9620: case 0x81: truelight@9641: return GetTerrainType(tile); rubidium@9620: } rubidium@9620: rubidium@9620: DEBUG(grf, 1, "Unhandled canal property 0x%02X", variable); rubidium@9620: rubidium@9620: *available = false; rubidium@9620: return 0; rubidium@9620: } rubidium@9620: rubidium@9620: rubidium@9620: static const SpriteGroup *CanalResolveReal(const ResolverObject *object, const SpriteGroup *group) rubidium@9620: { rubidium@9620: if (group->g.real.num_loaded == 0) return NULL; rubidium@9620: rubidium@9620: return group->g.real.loaded[0]; rubidium@9620: } rubidium@9620: rubidium@9620: rubidium@9620: static void NewCanalResolver(ResolverObject *res, TileIndex tile) rubidium@9620: { rubidium@9620: res->GetRandomBits = &CanalGetRandomBits; rubidium@9620: res->GetTriggers = &CanalGetTriggers; rubidium@9620: res->SetTriggers = &CanalSetTriggers; rubidium@9620: res->GetVariable = &CanalGetVariable; rubidium@9620: res->ResolveReal = &CanalResolveReal; rubidium@9620: rubidium@9620: res->u.canal.tile = tile; rubidium@9620: rubidium@9694: res->callback = CBID_NO_CALLBACK; rubidium@9620: res->callback_param1 = 0; rubidium@9620: res->callback_param2 = 0; rubidium@9620: res->last_value = 0; rubidium@9620: res->trigger = 0; rubidium@9620: res->reseed = 0; rubidium@9620: } rubidium@9620: rubidium@9620: rubidium@9620: SpriteID GetCanalSprite(CanalFeature feature, TileIndex tile) rubidium@9620: { rubidium@9620: ResolverObject object; rubidium@9620: const SpriteGroup *group; rubidium@9620: rubidium@9620: NewCanalResolver(&object, tile); rubidium@9620: rubidium@9620: group = Resolve(_canal_sg[feature], &object); rubidium@9620: if (group == NULL || group->type != SGT_RESULT) return 0; rubidium@9620: rubidium@9620: return group->g.result.sprite; rubidium@9620: }