peter1138@6583: /* $Id$ */ peter1138@6583: 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" peter1138@6583: #include "newgrf_spritegroup.h" peter1138@6583: #include "newgrf_canal.h" peter1138@6583: peter1138@6583: peter1138@6583: /** Table of canal 'feature' sprite groups */ peter1138@6583: const SpriteGroup *_canal_sg[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@6583: return 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: peter1138@6583: return TileHeight(tile); peter1138@6583: peter1138@6583: case 0x81: peter1138@6583: return ((_opt.landscape == LT_ARCTIC && GetTileZ(tile) > GetSnowLine()) ? 4 : 0) | peter1138@6583: (_opt.landscape == LT_TROPIC ? GetTropicZone(tile) : 0); 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: peter1138@6583: res->callback = 0; 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; 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@6583: group = Resolve(_canal_sg[feature], &object); peter1138@6583: if (group == NULL || group->type != SGT_RESULT) return 0; peter1138@6583: peter1138@6583: return group->g.result.sprite; peter1138@6583: }