src/rail_cmd.cpp
changeset 5919 2b58160d667d
parent 5849 58039c9dc565
child 5982 54218ea5af1e
equal deleted inserted replaced
5918:602e158900a2 5919:2b58160d667d
  1051 		sprite = SignalBase[side][GetSignalVariant(tile)][GetSignalType(tile)] + image + condition;
  1051 		sprite = SignalBase[side][GetSignalVariant(tile)][GetSignalType(tile)] + image + condition;
  1052 	} else {
  1052 	} else {
  1053 		sprite = _signal_base + (GetSignalType(tile) - 1) * 16 + GetSignalVariant(tile) * 64 + image + condition;
  1053 		sprite = _signal_base + (GetSignalType(tile) - 1) * 16 + GetSignalVariant(tile) * 64 + image + condition;
  1054 	}
  1054 	}
  1055 
  1055 
  1056 	AddSortableSpriteToDraw(sprite, x, y, 1, 1, 10, GetSlopeZ(x,y));
  1056 	AddSortableSpriteToDraw(sprite, PAL_NONE, x, y, 1, 1, 10, GetSlopeZ(x,y));
  1057 }
  1057 }
  1058 
  1058 
  1059 static uint32 _drawtile_track_palette;
  1059 static uint32 _drawtile_track_palette;
  1060 
  1060 
  1061 
  1061 
  1062 static void DrawTrackFence_NW(const TileInfo *ti)
  1062 static void DrawTrackFence_NW(const TileInfo *ti)
  1063 {
  1063 {
  1064 	uint32 image = 0x515;
  1064 	SpriteID image = 0x515;
  1065 	if (ti->tileh != SLOPE_FLAT) image = (ti->tileh & SLOPE_S) ? 0x519 : 0x51B;
  1065 	if (ti->tileh != SLOPE_FLAT) image = (ti->tileh & SLOPE_S) ? 0x519 : 0x51B;
  1066 	AddSortableSpriteToDraw(image | _drawtile_track_palette,
  1066 	AddSortableSpriteToDraw(image, _drawtile_track_palette,
  1067 		ti->x, ti->y + 1, 16, 1, 4, ti->z);
  1067 		ti->x, ti->y + 1, 16, 1, 4, ti->z);
  1068 }
  1068 }
  1069 
  1069 
  1070 static void DrawTrackFence_SE(const TileInfo *ti)
  1070 static void DrawTrackFence_SE(const TileInfo *ti)
  1071 {
  1071 {
  1072 	uint32 image = 0x515;
  1072 	SpriteID image = 0x515;
  1073 	if (ti->tileh != SLOPE_FLAT) image = (ti->tileh & SLOPE_S) ? 0x519 : 0x51B;
  1073 	if (ti->tileh != SLOPE_FLAT) image = (ti->tileh & SLOPE_S) ? 0x519 : 0x51B;
  1074 	AddSortableSpriteToDraw(image | _drawtile_track_palette,
  1074 	AddSortableSpriteToDraw(image, _drawtile_track_palette,
  1075 		ti->x, ti->y + TILE_SIZE - 1, 16, 1, 4, ti->z);
  1075 		ti->x, ti->y + TILE_SIZE - 1, 16, 1, 4, ti->z);
  1076 }
  1076 }
  1077 
  1077 
  1078 static void DrawTrackFence_NW_SE(const TileInfo *ti)
  1078 static void DrawTrackFence_NW_SE(const TileInfo *ti)
  1079 {
  1079 {
  1081 	DrawTrackFence_SE(ti);
  1081 	DrawTrackFence_SE(ti);
  1082 }
  1082 }
  1083 
  1083 
  1084 static void DrawTrackFence_NE(const TileInfo *ti)
  1084 static void DrawTrackFence_NE(const TileInfo *ti)
  1085 {
  1085 {
  1086 	uint32 image = 0x516;
  1086 	SpriteID image = 0x516;
  1087 	if (ti->tileh != SLOPE_FLAT) image = (ti->tileh & SLOPE_S) ? 0x51A : 0x51C;
  1087 	if (ti->tileh != SLOPE_FLAT) image = (ti->tileh & SLOPE_S) ? 0x51A : 0x51C;
  1088 	AddSortableSpriteToDraw(image | _drawtile_track_palette,
  1088 	AddSortableSpriteToDraw(image, _drawtile_track_palette,
  1089 		ti->x + 1, ti->y, 1, 16, 4, ti->z);
  1089 		ti->x + 1, ti->y, 1, 16, 4, ti->z);
  1090 }
  1090 }
  1091 
  1091 
  1092 static void DrawTrackFence_SW(const TileInfo *ti)
  1092 static void DrawTrackFence_SW(const TileInfo *ti)
  1093 {
  1093 {
  1094 	uint32 image = 0x516;
  1094 	SpriteID image = 0x516;
  1095 	if (ti->tileh != SLOPE_FLAT) image = (ti->tileh & SLOPE_S) ? 0x51A : 0x51C;
  1095 	if (ti->tileh != SLOPE_FLAT) image = (ti->tileh & SLOPE_S) ? 0x51A : 0x51C;
  1096 	AddSortableSpriteToDraw(image | _drawtile_track_palette,
  1096 	AddSortableSpriteToDraw(image, _drawtile_track_palette,
  1097 		ti->x + TILE_SIZE - 1, ti->y, 1, 16, 4, ti->z);
  1097 		ti->x + TILE_SIZE - 1, ti->y, 1, 16, 4, ti->z);
  1098 }
  1098 }
  1099 
  1099 
  1100 static void DrawTrackFence_NE_SW(const TileInfo *ti)
  1100 static void DrawTrackFence_NE_SW(const TileInfo *ti)
  1101 {
  1101 {
  1105 
  1105 
  1106 static void DrawTrackFence_NS_1(const TileInfo *ti)
  1106 static void DrawTrackFence_NS_1(const TileInfo *ti)
  1107 {
  1107 {
  1108 	int z = ti->z;
  1108 	int z = ti->z;
  1109 	if (ti->tileh & SLOPE_W) z += TILE_HEIGHT;
  1109 	if (ti->tileh & SLOPE_W) z += TILE_HEIGHT;
  1110 	AddSortableSpriteToDraw(0x517 | _drawtile_track_palette,
  1110 	AddSortableSpriteToDraw(0x517, _drawtile_track_palette,
  1111 		ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2, 1, 1, 4, z);
  1111 		ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2, 1, 1, 4, z);
  1112 }
  1112 }
  1113 
  1113 
  1114 static void DrawTrackFence_NS_2(const TileInfo *ti)
  1114 static void DrawTrackFence_NS_2(const TileInfo *ti)
  1115 {
  1115 {
  1116 	int z = ti->z;
  1116 	int z = ti->z;
  1117 	if (ti->tileh & SLOPE_E) z += TILE_HEIGHT;
  1117 	if (ti->tileh & SLOPE_E) z += TILE_HEIGHT;
  1118 	AddSortableSpriteToDraw(0x517 | _drawtile_track_palette,
  1118 	AddSortableSpriteToDraw(0x517, _drawtile_track_palette,
  1119 		ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2, 1, 1, 4, z);
  1119 		ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2, 1, 1, 4, z);
  1120 }
  1120 }
  1121 
  1121 
  1122 static void DrawTrackFence_WE_1(const TileInfo *ti)
  1122 static void DrawTrackFence_WE_1(const TileInfo *ti)
  1123 {
  1123 {
  1124 	int z = ti->z;
  1124 	int z = ti->z;
  1125 	if (ti->tileh & SLOPE_N) z += TILE_HEIGHT;
  1125 	if (ti->tileh & SLOPE_N) z += TILE_HEIGHT;
  1126 	AddSortableSpriteToDraw(0x518 | _drawtile_track_palette,
  1126 	AddSortableSpriteToDraw(0x518, _drawtile_track_palette,
  1127 		ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2, 1, 1, 4, z);
  1127 		ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2, 1, 1, 4, z);
  1128 }
  1128 }
  1129 
  1129 
  1130 static void DrawTrackFence_WE_2(const TileInfo *ti)
  1130 static void DrawTrackFence_WE_2(const TileInfo *ti)
  1131 {
  1131 {
  1132 	int z = ti->z;
  1132 	int z = ti->z;
  1133 	if (ti->tileh & SLOPE_S) z += TILE_HEIGHT;
  1133 	if (ti->tileh & SLOPE_S) z += TILE_HEIGHT;
  1134 	AddSortableSpriteToDraw(0x518 | _drawtile_track_palette,
  1134 	AddSortableSpriteToDraw(0x518, _drawtile_track_palette,
  1135 		ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2, 1, 1, 4, z);
  1135 		ti->x + TILE_SIZE / 2, ti->y + TILE_SIZE / 2, 1, 1, 4, z);
  1136 }
  1136 }
  1137 
  1137 
  1138 
  1138 
  1139 static void DrawTrackDetails(const TileInfo* ti)
  1139 static void DrawTrackDetails(const TileInfo* ti)
  1163  * @param flat Always draw foundation
  1163  * @param flat Always draw foundation
  1164  */
  1164  */
  1165 static void DrawTrackBits(TileInfo* ti, TrackBits track)
  1165 static void DrawTrackBits(TileInfo* ti, TrackBits track)
  1166 {
  1166 {
  1167 	const RailtypeInfo *rti = GetRailTypeInfo(GetRailType(ti->tile));
  1167 	const RailtypeInfo *rti = GetRailTypeInfo(GetRailType(ti->tile));
  1168 	PalSpriteID image;
  1168 	SpriteID image;
       
  1169 	SpriteID pal = PAL_NONE;
  1169 	bool junction = false;
  1170 	bool junction = false;
  1170 
  1171 
  1171 	// Select the sprite to use.
  1172 	// Select the sprite to use.
  1172 	(image = rti->base_sprites.track_y, track == TRACK_BIT_Y) ||
  1173 	(image = rti->base_sprites.track_y, track == TRACK_BIT_Y) ||
  1173 	(image++,                           track == TRACK_BIT_X) ||
  1174 	(image++,                           track == TRACK_BIT_X) ||
  1197 		if (ti->tileh != SLOPE_FLAT)
  1198 		if (ti->tileh != SLOPE_FLAT)
  1198 			image = _track_sloped_sprites[ti->tileh - 1] + rti->base_sprites.track_y;
  1199 			image = _track_sloped_sprites[ti->tileh - 1] + rti->base_sprites.track_y;
  1199 	}
  1200 	}
  1200 
  1201 
  1201 	switch (GetRailGroundType(ti->tile)) {
  1202 	switch (GetRailGroundType(ti->tile)) {
  1202 		case RAIL_GROUND_BARREN:     image |= PALETTE_TO_BARE_LAND; break;
  1203 		case RAIL_GROUND_BARREN:     pal = PALETTE_TO_BARE_LAND; break;
  1203 		case RAIL_GROUND_ICE_DESERT: image += rti->snow_offset; break;
  1204 		case RAIL_GROUND_ICE_DESERT: image += rti->snow_offset; break;
  1204 		default: break;
  1205 		default: break;
  1205 	}
  1206 	}
  1206 
  1207 
  1207 	DrawGroundSprite(image);
  1208 	DrawGroundSprite(image, pal);
  1208 
  1209 
  1209 	// Draw track pieces individually for junction tiles
  1210 	// Draw track pieces individually for junction tiles
  1210 	if (junction) {
  1211 	if (junction) {
  1211 		if (track & TRACK_BIT_X)     DrawGroundSprite(rti->base_sprites.single_y);
  1212 		if (track & TRACK_BIT_X)     DrawGroundSprite(rti->base_sprites.single_y, PAL_NONE);
  1212 		if (track & TRACK_BIT_Y)     DrawGroundSprite(rti->base_sprites.single_x);
  1213 		if (track & TRACK_BIT_Y)     DrawGroundSprite(rti->base_sprites.single_x, PAL_NONE);
  1213 		if (track & TRACK_BIT_UPPER) DrawGroundSprite(rti->base_sprites.single_n);
  1214 		if (track & TRACK_BIT_UPPER) DrawGroundSprite(rti->base_sprites.single_n, PAL_NONE);
  1214 		if (track & TRACK_BIT_LOWER) DrawGroundSprite(rti->base_sprites.single_s);
  1215 		if (track & TRACK_BIT_LOWER) DrawGroundSprite(rti->base_sprites.single_s, PAL_NONE);
  1215 		if (track & TRACK_BIT_LEFT)  DrawGroundSprite(rti->base_sprites.single_w);
  1216 		if (track & TRACK_BIT_LEFT)  DrawGroundSprite(rti->base_sprites.single_w, PAL_NONE);
  1216 		if (track & TRACK_BIT_RIGHT) DrawGroundSprite(rti->base_sprites.single_e);
  1217 		if (track & TRACK_BIT_RIGHT) DrawGroundSprite(rti->base_sprites.single_e, PAL_NONE);
  1217 	}
  1218 	}
  1218 
  1219 
  1219 	if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) DrawCatenary(ti);
  1220 	if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) DrawCatenary(ti);
  1220 
  1221 
  1221 }
  1222 }
  1253 }
  1254 }
  1254 
  1255 
  1255 static void DrawTile_Track(TileInfo *ti)
  1256 static void DrawTile_Track(TileInfo *ti)
  1256 {
  1257 {
  1257 	const RailtypeInfo *rti = GetRailTypeInfo(GetRailType(ti->tile));
  1258 	const RailtypeInfo *rti = GetRailTypeInfo(GetRailType(ti->tile));
  1258 	PalSpriteID image;
  1259 	SpriteID image;
  1259 
  1260 
  1260 	_drawtile_track_palette = SPRITE_PALETTE(PLAYER_SPRITE_COLOR(GetTileOwner(ti->tile)));
  1261 	_drawtile_track_palette = PLAYER_SPRITE_COLOR(GetTileOwner(ti->tile));
  1261 
  1262 
  1262 	if (IsPlainRailTile(ti->tile)) {
  1263 	if (IsPlainRailTile(ti->tile)) {
  1263 		TrackBits rails = GetTrackBits(ti->tile);
  1264 		TrackBits rails = GetTrackBits(ti->tile);
  1264 
  1265 
  1265 		DrawTrackBits(ti, rails);
  1266 		DrawTrackBits(ti, rails);
  1335 				image = dts->ground_sprite + rti->total_offset;
  1336 				image = dts->ground_sprite + rti->total_offset;
  1336 				if (IsSnowRailGround(ti->tile)) image += rti->snow_offset;
  1337 				if (IsSnowRailGround(ti->tile)) image += rti->snow_offset;
  1337 			}
  1338 			}
  1338 		}
  1339 		}
  1339 
  1340 
  1340 		DrawGroundSprite(image);
  1341 		DrawGroundSprite(image, PAL_NONE);
  1341 
  1342 
  1342 		if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) DrawCatenary(ti);
  1343 		if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) DrawCatenary(ti);
  1343 
  1344 
  1344 		foreach_draw_tile_seq(dtss, dts->seq) {
  1345 		foreach_draw_tile_seq(dtss, dts->seq) {
  1345 			uint32 image = dtss->image + relocation;
  1346 			SpriteID image = dtss->image + relocation;
       
  1347 			SpriteID pal;
  1346 
  1348 
  1347 			if (_display_opt & DO_TRANS_BUILDINGS) {
  1349 			if (_display_opt & DO_TRANS_BUILDINGS) {
  1348 				MAKE_TRANSPARENT(image);
  1350 				SETBIT(image, PALETTE_MODIFIER_TRANSPARENT);
  1349 			} else if (image & PALETTE_MODIFIER_COLOR) {
  1351 				pal = PALETTE_TO_TRANSPARENT;
  1350 				image |= _drawtile_track_palette;
  1352 			} else if (HASBIT(image, PALETTE_MODIFIER_COLOR)) {
  1351 			}
  1353 				pal = _drawtile_track_palette;
       
  1354 			} else {
       
  1355 				pal = dtss->pal;
       
  1356 			}
       
  1357 
  1352 			AddSortableSpriteToDraw(
  1358 			AddSortableSpriteToDraw(
  1353 				image,
  1359 				image, pal,
  1354 				ti->x + dtss->delta_x, ti->y + dtss->delta_y,
  1360 				ti->x + dtss->delta_x, ti->y + dtss->delta_y,
  1355 				dtss->size_x, dtss->size_y,
  1361 				dtss->size_x, dtss->size_y,
  1356 				dtss->size_z, ti->z + dtss->delta_z
  1362 				dtss->size_z, ti->z + dtss->delta_z
  1357 			);
  1363 			);
  1358 		}
  1364 		}
  1359 	}
  1365 	}
  1360 	DrawBridgeMiddle(ti);
  1366 	DrawBridgeMiddle(ti);
  1361 }
  1367 }
  1362 
  1368 
  1363 
  1369 
  1364 static void DrawTileSequence(int x, int y, uint32 ground, const DrawTileSeqStruct* dtss, uint32 offset)
  1370 static void DrawTileSequence(int x, int y, SpriteID ground, const DrawTileSeqStruct* dtss, uint32 offset)
  1365 {
  1371 {
  1366 	uint32 palette = PLAYER_SPRITE_COLOR(_local_player);
  1372 	SpriteID palette = PLAYER_SPRITE_COLOR(_local_player);
  1367 
  1373 
  1368 	DrawSprite(ground, x, y);
  1374 	DrawSprite(ground, PAL_NONE, x, y);
  1369 	for (; dtss->image != 0; dtss++) {
  1375 	for (; dtss->image != 0; dtss++) {
  1370 		Point pt = RemapCoords(dtss->delta_x, dtss->delta_y, dtss->delta_z);
  1376 		Point pt = RemapCoords(dtss->delta_x, dtss->delta_y, dtss->delta_z);
  1371 		uint32 image = dtss->image + offset;
  1377 		SpriteID image = dtss->image + offset;
  1372 
  1378 
  1373 		if (image & PALETTE_MODIFIER_COLOR) image |= palette;
  1379 		DrawSprite(image, HASBIT(image, PALETTE_MODIFIER_COLOR) ? palette : PAL_NONE, x + pt.x, y + pt.y);
  1374 		DrawSprite(image, x + pt.x, y + pt.y);
       
  1375 	}
  1380 	}
  1376 }
  1381 }
  1377 
  1382 
  1378 void DrawTrainDepotSprite(int x, int y, int dir, RailType railtype)
  1383 void DrawTrainDepotSprite(int x, int y, int dir, RailType railtype)
  1379 {
  1384 {
  1380 	const DrawTileSprites* dts = &_depot_gfx_table[dir];
  1385 	const DrawTileSprites* dts = &_depot_gfx_table[dir];
  1381 	uint32 image = dts->ground_sprite;
  1386 	SpriteID image = dts->ground_sprite;
  1382 	uint32 offset = GetRailTypeInfo(railtype)->total_offset;
  1387 	uint32 offset = GetRailTypeInfo(railtype)->total_offset;
  1383 
  1388 
  1384 	if (image != SPR_FLAT_GRASS_TILE) image += offset;
  1389 	if (image != SPR_FLAT_GRASS_TILE) image += offset;
  1385 	DrawTileSequence(x + 33, y + 17, image, dts->seq, offset);
  1390 	DrawTileSequence(x + 33, y + 17, image, dts->seq, offset);
  1386 }
  1391 }