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