summaryrefslogtreecommitdiff
path: root/src/newgrf_railtype.cpp
diff options
context:
space:
mode:
authorpeter1138 <peter1138@openttd.org>2010-02-07 22:22:54 +0000
committerpeter1138 <peter1138@openttd.org>2010-02-07 22:22:54 +0000
commit898e879bd90e34505cd7083acecf341fd798d02c (patch)
treef9c016c9dcb7d2e78726296e15aceb6adf4a0e2c /src/newgrf_railtype.cpp
parent01474412fc95b69ea6595a94eeb8baa0db575e16 (diff)
downloadopenttd-898e879bd90e34505cd7083acecf341fd798d02c.tar.xz
(svn r19056) -Add: [NewGRF] Action 3/2/1 (i.e. new graphics) support for rail types. (To be documented...)
Diffstat (limited to 'src/newgrf_railtype.cpp')
-rw-r--r--src/newgrf_railtype.cpp112
1 files changed, 112 insertions, 0 deletions
diff --git a/src/newgrf_railtype.cpp b/src/newgrf_railtype.cpp
new file mode 100644
index 000000000..b76eb2aef
--- /dev/null
+++ b/src/newgrf_railtype.cpp
@@ -0,0 +1,112 @@
+/* $Id$ */
+
+/** @file newgrf_railtype.cpp NewGRF handling of rail types. */
+
+#include "stdafx.h"
+#include "openttd.h"
+#include "variables.h"
+#include "debug.h"
+#include "strings_type.h"
+#include "rail.h"
+#include "road_map.h"
+#include "newgrf.h"
+#include "newgrf_callbacks.h"
+#include "newgrf_commons.h"
+#include "newgrf_railtype.h"
+#include "newgrf_spritegroup.h"
+
+static uint32 RailTypeGetRandomBits(const ResolverObject *object)
+{
+ return 0;
+}
+
+static uint32 RailTypeGetTriggers(const ResolverObject *object)
+{
+ return 0;
+}
+
+static void RailTypeSetTriggers(const ResolverObject *object, int triggers)
+{
+}
+
+static uint32 RailTypeGetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available)
+{
+ TileIndex tile = object->u.routes.tile;
+
+ if (tile == INVALID_TILE) {
+ switch (variable) {
+ case 0x40: return 0;
+ case 0x41: return 0;
+ case 0x42: return 0;
+ }
+ }
+
+ switch (variable) {
+ case 0x40: return GetTerrainType(tile);
+ case 0x41: return 0;
+ case 0x42: return IsLevelCrossingTile(tile) && IsCrossingBarred(tile);
+ }
+
+ DEBUG(grf, 1, "Unhandled rail type tile property 0x%X", variable);
+
+ *available = false;
+ return UINT_MAX;
+}
+
+static const SpriteGroup *RailTypeResolveReal(const ResolverObject *object, const RealSpriteGroup *group)
+{
+ if (group->num_loading > 0) return group->loading[0];
+ if (group->num_loaded > 0) return group->loaded[0];
+ return NULL;
+}
+
+static inline void NewRailTypeResolver(ResolverObject *res, TileIndex tile)
+{
+ res->GetRandomBits = &RailTypeGetRandomBits;
+ res->GetTriggers = &RailTypeGetTriggers;
+ res->SetTriggers = &RailTypeSetTriggers;
+ res->GetVariable = &RailTypeGetVariable;
+ res->ResolveReal = &RailTypeResolveReal;
+
+ res->u.routes.tile = tile;
+
+ res->callback = CBID_NO_CALLBACK;
+ res->callback_param1 = 0;
+ res->callback_param2 = 0;
+ res->last_value = 0;
+ res->trigger = 0;
+ res->reseed = 0;
+ res->count = 0;
+}
+
+SpriteID GetCustomRailSprite(const RailtypeInfo *rti, TileIndex tile, RailTypeSpriteGroup rtsg)
+{
+ assert(rtsg < RTSG_END);
+
+ if (rti->group[rtsg] == NULL) return 0;
+
+ const SpriteGroup *group;
+ ResolverObject object;
+
+ NewRailTypeResolver(&object, tile);
+
+ group = SpriteGroup::Resolve(rti->group[rtsg], &object);
+ if (group == NULL || group->GetNumResults() == 0) return 0;
+
+ return group->GetResult();
+}
+
+uint8 GetReverseRailTypeTranslation(RailType railtype, const GRFFile *grffile)
+{
+ /* No rail type table present, return rail type as-is */
+ if (grffile->railtype_max == 0) return railtype;
+
+ /* Look for a matching rail type label in the table */
+ RailTypeLabel label = GetRailTypeInfo(railtype)->label;
+ for (uint i = 0; i < grffile->railtype_max; i++) {
+ if (label == grffile->railtype_list[i]) return i;
+ }
+
+ /* If not found, return as invalid */
+ return 0xFF;
+}