peter1138@6583: /* $Id$ */ peter1138@6583: rubidium@9111: /** @file newgrf_canal.cpp Implementation of NewGRF canals. */ rubidium@9111: peter1138@6583: #include "stdafx.h" peter1138@6583: #include "openttd.h" peter1138@6583: #include "variables.h" peter1138@6583: #include "landscape.h" peter1138@6583: #include "debug.h" peter1138@6583: #include "newgrf.h" peter1138@6583: #include "newgrf_callbacks.h" rubidium@7206: #include "newgrf_commons.h" peter1138@6583: #include "newgrf_spritegroup.h" peter1138@6583: #include "newgrf_canal.h" rubidium@8108: #include "tile_map.h" peter1138@8368: #include "water_map.h" peter1138@6583: peter1138@6583: peter1138@6583: /** Table of canal 'feature' sprite groups */ peter1138@8372: WaterFeature _water_feature[CF_END]; peter1138@6583: peter1138@6583: peter1138@6583: /* Random bits and triggers are not supported for canals, so the following peter1138@6583: * three functions are stubs. */ peter1138@6583: static uint32 CanalGetRandomBits(const ResolverObject *object) peter1138@6583: { peter1138@8471: /* Return random bits only for water tiles, not station tiles */ peter1138@8471: return IsTileType(object->u.canal.tile, MP_WATER) ? GetWaterTileRandomBits(object->u.canal.tile) : 0; peter1138@6583: } peter1138@6583: peter1138@6583: peter1138@6583: static uint32 CanalGetTriggers(const ResolverObject *object) peter1138@6583: { peter1138@6583: return 0; peter1138@6583: } peter1138@6583: peter1138@6583: peter1138@6583: static void CanalSetTriggers(const ResolverObject *object, int triggers) peter1138@6583: { peter1138@6583: return; peter1138@6583: } peter1138@6583: peter1138@6583: peter1138@6583: static uint32 CanalGetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available) peter1138@6583: { peter1138@6583: TileIndex tile = object->u.canal.tile; peter1138@6583: peter1138@6583: switch (variable) { peter1138@6583: case 0x80: rubidium@7523: return GetTileZ(tile) / TILE_HEIGHT; peter1138@6583: peter1138@6583: case 0x81: rubidium@7206: return GetTerrainType(tile); peter1138@8368: peter1138@8368: case 0x83: peter1138@8368: return GetWaterTileRandomBits(tile); peter1138@6583: } peter1138@6583: peter1138@6583: DEBUG(grf, 1, "Unhandled canal property 0x%02X", variable); peter1138@6583: peter1138@6583: *available = false; peter1138@6583: return 0; peter1138@6583: } peter1138@6583: peter1138@6583: peter1138@6583: static const SpriteGroup *CanalResolveReal(const ResolverObject *object, const SpriteGroup *group) peter1138@6583: { peter1138@6583: if (group->g.real.num_loaded == 0) return NULL; peter1138@6583: peter1138@6583: return group->g.real.loaded[0]; peter1138@6583: } peter1138@6583: peter1138@6583: peter1138@6583: static void NewCanalResolver(ResolverObject *res, TileIndex tile) peter1138@6583: { peter1138@6583: res->GetRandomBits = &CanalGetRandomBits; peter1138@6583: res->GetTriggers = &CanalGetTriggers; peter1138@6583: res->SetTriggers = &CanalSetTriggers; peter1138@6583: res->GetVariable = &CanalGetVariable; peter1138@6583: res->ResolveReal = &CanalResolveReal; peter1138@6583: peter1138@6583: res->u.canal.tile = tile; peter1138@6583: rubidium@7327: res->callback = CBID_NO_CALLBACK; peter1138@6583: res->callback_param1 = 0; peter1138@6583: res->callback_param2 = 0; peter1138@6583: res->last_value = 0; peter1138@6583: res->trigger = 0; peter1138@6583: res->reseed = 0; glx@8756: res->count = 0; peter1138@6583: } peter1138@6583: peter1138@6583: peter1138@6583: SpriteID GetCanalSprite(CanalFeature feature, TileIndex tile) peter1138@6583: { peter1138@6583: ResolverObject object; peter1138@6583: const SpriteGroup *group; peter1138@6583: peter1138@6583: NewCanalResolver(&object, tile); peter1138@6583: peter1138@8372: group = Resolve(_water_feature[feature].group, &object); peter1138@6583: if (group == NULL || group->type != SGT_RESULT) return 0; peter1138@6583: peter1138@6583: return group->g.result.sprite; peter1138@6583: }