rubidium@9620: /* $Id$ */ rubidium@9620: rubidium@10455: /** @file newgrf_canal.cpp Implementation of NewGRF canals. */ rubidium@10455: 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@9723: #include "tile_map.h" rubidium@9724: #include "water_map.h" rubidium@9620: rubidium@9620: rubidium@9620: /** Table of canal 'feature' sprite groups */ rubidium@9724: WaterFeature _water_feature[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@9724: /* Return random bits only for water tiles, not station tiles */ rubidium@9724: return IsTileType(object->u.canal.tile, MP_WATER) ? GetWaterTileRandomBits(object->u.canal.tile) : 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@9703: return GetTileZ(tile) / TILE_HEIGHT; rubidium@9620: rubidium@9620: case 0x81: truelight@9641: return GetTerrainType(tile); rubidium@9724: rubidium@9724: case 0x83: rubidium@9724: return GetWaterTileRandomBits(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@9826: res->count = 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@9724: group = Resolve(_water_feature[feature].group, &object); rubidium@9620: if (group == NULL || group->type != SGT_RESULT) return 0; rubidium@9620: rubidium@9620: return group->g.result.sprite; rubidium@9620: }