Changeset - r3754:7e934e84e584
[Not reviewed]
master
0 2 0
peter1138 - 18 years ago 2006-05-04 20:00:50
peter1138@openttd.org
(svn r4742) - Newstations: Add callbacks for building and drawing custom stations.
2 files changed with 40 insertions and 1 deletions:
0 comments (0 inline, 0 general)
newgrf_callbacks.h
Show inline comments
 
@@ -19,6 +19,14 @@ enum CallbackID {
 
	// only for train vehicles
 
	CBID_TRAIN_VEHICLE_LENGTH       = 0x11,
 

	
 
	/* Called (if appropriate bit in callback mask is set) to determine if a
 
	 * newstation should be made available to build */
 
	CBID_STATION_AVAILABILITY       = 0x13,
 

	
 
	/* Called (if appropriate bit in callback mask is set) when drawing a tile
 
	 * to choose a sprite layout to draw, instead of the standard 0-7 range */
 
	CBID_STATION_SPRITE_LAYOUT      = 0x14,
 

	
 
	// Refit capacity, the passed vehicle needs to have its ->cargo_type set to
 
	// the cargo we are refitting to, returns the new cargo capacity
 
	CBID_VEHICLE_REFIT_CAPACITY     = 0x15,
 
@@ -30,6 +38,9 @@ enum CallbackID {
 
	/* This callback is called from vehicle purchase lists. It returns a value to be
 
	 * used as a custom string ID in the 0xD000 range. */
 
	CBID_VEHICLE_ADDITIONAL_TEXT    = 0x23,
 

	
 
	/* Called when building a station to customize the tile layout */
 
	CBID_STATION_TILE_LAYOUT        = 0x24,
 
};
 

	
 
/**
station_cmd.c
Show inline comments
 
@@ -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 @@ int32 CmdBuildRailroadStation(TileIndex 
 
	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 @@ int32 CmdBuildRailroadStation(TileIndex 
 
				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 @@ static void DrawTile_Station(TileInfo *t
 

	
 
			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)];
 
			}
 
		}
 
	}
 

	
0 comments (0 inline, 0 general)