station_cmd.c
changeset 3754 4c8cbaaa0bbe
parent 3751 ce6408fdb788
child 3763 7098c393c172
--- a/station_cmd.c	Thu May 04 19:42:50 2006 +0000
+++ b/station_cmd.c	Thu May 04 20:00:50 2006 +0000
@@ -29,6 +29,8 @@
 #include "train.h"
 #include "water_map.h"
 #include "industry_map.h"
+#include "newgrf_callbacks.h"
+#include "newgrf_station.h"
 
 enum {
 	/* Max stations: 64000 (64 * 1000) */
@@ -1049,6 +1051,20 @@
 	specindex = AllocateSpecToStation(statspec, st, flags & DC_EXEC);
 	if (specindex == -1) return CMD_ERROR;
 
+	if (statspec != NULL) {
+		/* Perform NewStation checks */
+
+		/* Check if the station size is permitted */
+		if (HASBIT(statspec->disallowed_platforms, numtracks - 1) || HASBIT(statspec->disallowed_lengths, plat_len - 1)) {
+			return CMD_ERROR;
+		}
+
+		/* Check if the station is buildable */
+		if (HASBIT(statspec->callbackmask, CBM_STATION_AVAIL) && GetStationCallback(CBID_STATION_AVAILABILITY, 0, 0, statspec, NULL, INVALID_TILE) == 0) {
+			return CMD_ERROR;
+		}
+	}
+
 	if (flags & DC_EXEC) {
 		TileIndexDiff tile_delta;
 		byte *layout_ptr;
@@ -1085,6 +1101,11 @@
 				SetCustomStationSpecIndex(tile, specindex);
 				SetStationTileRandomBits(tile, GB(Random(), 0, 4));
 
+				if (statspec != NULL) {
+					uint16 callback = GetStationCallback(CBID_STATION_TILE_LAYOUT, 0, 0, statspec, st, tile);
+					if (callback != CALLBACK_FAILED && callback < 8) SetStationGfx(tile, callback);
+				}
+
 				tile += tile_delta;
 			} while (--w);
 			SetSignalsOnBothDir(tile_org, track);
@@ -1992,8 +2013,15 @@
 
 			relocation = GetCustomStationRelocation(statspec, st, ti->tile);
 
+			if (HASBIT(statspec->callbackmask, CBM_CUSTOM_LAYOUT)) {
+				uint16 callback = GetStationCallback(CBID_STATION_SPRITE_LAYOUT, 0, 0, statspec, st, ti->tile);
+				if (callback != CALLBACK_FAILED) tile = callback + GetRailStationAxis(ti->tile);
+			}
+
 			/* Ensure the chosen tile layout is valid for this custom station */
-			t = &statspec->renderdata[tile < statspec->tiles ? tile : GetRailStationAxis(ti->tile)];
+			if (statspec->renderdata != NULL) {
+				t = &statspec->renderdata[tile < statspec->tiles ? tile : GetRailStationAxis(ti->tile)];
+			}
 		}
 	}