rail_cmd.c
changeset 2472 2711a54b0498
parent 2436 7d5df545bd5d
child 2493 f6b4300cc2b0
equal deleted inserted replaced
2471:5935596f14a8 2472:2711a54b0498
  1364 	if (_display_opt & DO_TRANS_BUILDINGS) // show transparent depots
  1364 	if (_display_opt & DO_TRANS_BUILDINGS) // show transparent depots
  1365 		MAKE_TRANSPARENT(image);
  1365 		MAKE_TRANSPARENT(image);
  1366 	AddSortableSpriteToDraw(image, ti->x + x, ti->y + y, xsize, ysize, zsize, ti->z + z);
  1366 	AddSortableSpriteToDraw(image, ti->x + x, ti->y + y, xsize, ysize, zsize, ti->z + z);
  1367 }
  1367 }
  1368 
  1368 
       
  1369 /**
       
  1370  * Draw ground sprite and track bits
       
  1371  * @param ti TileInfo
       
  1372  * @param track TrackBits to draw
       
  1373  * @param earth Draw as earth
       
  1374  * @param snow Draw as snow
       
  1375  * @param flat Always draw foundation
       
  1376  */
       
  1377 void DrawTrackBits(TileInfo *ti, TrackBits track, bool earth, bool snow, bool flat)
       
  1378 {
       
  1379 	const RailtypeInfo *rti = GetRailTypeInfo(GetRailType(ti->tile));
       
  1380 	PalSpriteID image;
       
  1381 	bool junction = false;
       
  1382 
       
  1383 	// Select the sprite to use.
       
  1384 	(image = rti->base_sprites.track_y, track == TRACK_BIT_DIAG2) ||
       
  1385 	(image++,                           track == TRACK_BIT_DIAG1) ||
       
  1386 	(image++,                           track == TRACK_BIT_UPPER) ||
       
  1387 	(image++,                           track == TRACK_BIT_LOWER) ||
       
  1388 	(image++,                           track == TRACK_BIT_RIGHT) ||
       
  1389 	(image++,                           track == TRACK_BIT_LEFT) ||
       
  1390 	(image++,                           track == (TRACK_BIT_DIAG1 | TRACK_BIT_DIAG2)) ||
       
  1391 
       
  1392 	(image = rti->base_sprites.track_ns, track == (TRACK_BIT_UPPER | TRACK_BIT_LOWER)) ||
       
  1393 	(image++,                            track == (TRACK_BIT_LEFT | TRACK_BIT_RIGHT)) ||
       
  1394 
       
  1395 	(junction = true, false) ||
       
  1396 	(image = rti->base_sprites.ground, !(track & (TRACK_BIT_RIGHT | TRACK_BIT_UPPER | TRACK_BIT_DIAG1))) ||
       
  1397 	(image++,                          !(track & (TRACK_BIT_LEFT | TRACK_BIT_LOWER | TRACK_BIT_DIAG1))) ||
       
  1398 	(image++,                          !(track & (TRACK_BIT_LEFT | TRACK_BIT_UPPER | TRACK_BIT_DIAG2))) ||
       
  1399 	(image++,                          !(track & (TRACK_BIT_RIGHT | TRACK_BIT_LOWER | TRACK_BIT_DIAG2))) ||
       
  1400 	(image++, true);
       
  1401 
       
  1402 	if (ti->tileh != 0) {
       
  1403 		int foundation;
       
  1404 
       
  1405 		if (flat) {
       
  1406 			foundation = ti->tileh;
       
  1407 		} else {
       
  1408 			foundation = GetRailFoundation(ti->tileh, track);
       
  1409 		}
       
  1410 
       
  1411 		if (foundation != 0)
       
  1412 			DrawFoundation(ti, foundation);
       
  1413 
       
  1414 		// DrawFoundation() modifies ti.
       
  1415 		// Default sloped sprites..
       
  1416 		if (ti->tileh != 0)
       
  1417 			image = _track_sloped_sprites[ti->tileh - 1] + rti->base_sprites.track_y;
       
  1418 	}
       
  1419 
       
  1420 	if (earth) {
       
  1421 		image = (image & SPRITE_MASK) | PALETTE_TO_BARE_LAND; // Use brown palette
       
  1422 	} else if (snow) {
       
  1423 		image += rti->snow_offset;
       
  1424 	}
       
  1425 
       
  1426 	DrawGroundSprite(image);
       
  1427 
       
  1428 	// Draw track pieces individually for junction tiles
       
  1429 	if (junction) {
       
  1430 		if (track & TRACK_BIT_DIAG1) DrawGroundSprite(rti->base_sprites.single_y);
       
  1431 		if (track & TRACK_BIT_DIAG2) DrawGroundSprite(rti->base_sprites.single_x);
       
  1432 		if (track & TRACK_BIT_UPPER) DrawGroundSprite(rti->base_sprites.single_n);
       
  1433 		if (track & TRACK_BIT_LOWER) DrawGroundSprite(rti->base_sprites.single_s);
       
  1434 		if (track & TRACK_BIT_LEFT)  DrawGroundSprite(rti->base_sprites.single_w);
       
  1435 		if (track & TRACK_BIT_RIGHT) DrawGroundSprite(rti->base_sprites.single_e);
       
  1436 	}
       
  1437 
       
  1438 	if (_debug_pbs_level >= 1) {
       
  1439 		byte pbs = PBSTileReserved(ti->tile) & track;
       
  1440 		if (pbs & TRACK_BIT_DIAG1) DrawGroundSprite(rti->base_sprites.single_y | PALETTE_CRASH);
       
  1441 		if (pbs & TRACK_BIT_DIAG2) DrawGroundSprite(rti->base_sprites.single_x | PALETTE_CRASH);
       
  1442 		if (pbs & TRACK_BIT_UPPER) DrawGroundSprite(rti->base_sprites.single_n | PALETTE_CRASH);
       
  1443 		if (pbs & TRACK_BIT_LOWER) DrawGroundSprite(rti->base_sprites.single_s | PALETTE_CRASH);
       
  1444 		if (pbs & TRACK_BIT_LEFT)  DrawGroundSprite(rti->base_sprites.single_w | PALETTE_CRASH);
       
  1445 		if (pbs & TRACK_BIT_RIGHT) DrawGroundSprite(rti->base_sprites.single_e | PALETTE_CRASH);
       
  1446 	}
       
  1447 }
       
  1448 
  1369 static void DrawTile_Track(TileInfo *ti)
  1449 static void DrawTile_Track(TileInfo *ti)
  1370 {
  1450 {
  1371 	byte m5;
  1451 	byte m5;
  1372 	const RailtypeInfo *rti = GetRailTypeInfo(GetRailType(ti->tile));
  1452 	const RailtypeInfo *rti = GetRailTypeInfo(GetRailType(ti->tile));
  1373 	uint32 image;	//XXX ok why the hell is SpriteID 16 bit when all the drawing routines need 32?
  1453 	PalSpriteID image;
  1374 
  1454 
  1375 	_drawtile_track_palette = SPRITE_PALETTE(PLAYER_SPRITE_COLOR(GetTileOwner(ti->tile)));
  1455 	_drawtile_track_palette = SPRITE_PALETTE(PLAYER_SPRITE_COLOR(GetTileOwner(ti->tile)));
  1376 
  1456 
  1377 	m5 = (byte)ti->map5;
  1457 	m5 = (byte)ti->map5;
  1378 	if (!(m5 & RAIL_TYPE_SPECIAL)) {
  1458 	if (!(m5 & RAIL_TYPE_SPECIAL)) {
  1379 		bool special;
  1459 		bool earth = (_m[ti->tile].m2 & RAIL_MAP2LO_GROUND_MASK) == RAIL_GROUND_BROWN;
  1380 
  1460 		bool snow = (_m[ti->tile].m2 & RAIL_MAP2LO_GROUND_MASK) == RAIL_GROUND_ICE_DESERT;
  1381 		m5 &= TRACK_BIT_MASK;
  1461 
  1382 
  1462 		DrawTrackBits(ti, m5 & TRACK_BIT_MASK, earth, snow, false);
  1383 		special = false;
       
  1384 
       
  1385 		// select the sprite to use based on the map5 byte.
       
  1386 		(image = rti->base_sprites.track_y, m5 == TRACK_BIT_DIAG2) ||
       
  1387 		(image++,				m5 == TRACK_BIT_DIAG1) ||
       
  1388 		(image++,				m5 == TRACK_BIT_UPPER) ||
       
  1389 		(image++,				m5 == TRACK_BIT_LOWER) ||
       
  1390 		(image++,				m5 == TRACK_BIT_RIGHT) ||
       
  1391 		(image++,				m5 == TRACK_BIT_LEFT) ||
       
  1392 		(image++,				m5 == (TRACK_BIT_DIAG1|TRACK_BIT_DIAG2)) ||
       
  1393 
       
  1394 		(image = rti->base_sprites.track_ns, m5 == (TRACK_BIT_UPPER|TRACK_BIT_LOWER)) ||
       
  1395 		(image++,				m5 == (TRACK_BIT_LEFT|TRACK_BIT_RIGHT)) ||
       
  1396 
       
  1397 		(special=true, false) ||
       
  1398 
       
  1399 		(image = rti->base_sprites.ground, !(m5 & (TRACK_BIT_RIGHT|TRACK_BIT_UPPER|TRACK_BIT_DIAG1))) ||
       
  1400 		(image++,				!(m5 & (TRACK_BIT_LEFT|TRACK_BIT_LOWER|TRACK_BIT_DIAG1))) ||
       
  1401 		(image++,				!(m5 & (TRACK_BIT_LEFT|TRACK_BIT_UPPER|TRACK_BIT_DIAG2))) ||
       
  1402 		(image++,				!(m5 & (TRACK_BIT_RIGHT|TRACK_BIT_LOWER|TRACK_BIT_DIAG2))) ||
       
  1403 		(image++, true);
       
  1404 
       
  1405 		if (ti->tileh != 0) {
       
  1406 			int f = GetRailFoundation(ti->tileh, ti->map5 & 0x3F);
       
  1407 			if (f) DrawFoundation(ti, f);
       
  1408 
       
  1409 			// default sloped sprites..
       
  1410 			if (ti->tileh != 0) image = _track_sloped_sprites[ti->tileh - 1] + rti->base_sprites.track_y;
       
  1411 		}
       
  1412 
       
  1413 		if ((_m[ti->tile].m2 & RAIL_MAP2LO_GROUND_MASK) == RAIL_GROUND_BROWN) {
       
  1414 			image = (image & SPRITE_MASK) | PALETTE_TO_BARE_LAND; // use a brown palette
       
  1415 		 } else if ((_m[ti->tile].m2 & RAIL_MAP2LO_GROUND_MASK) == RAIL_GROUND_ICE_DESERT) {
       
  1416 			image += rti->snow_offset;
       
  1417 		}
       
  1418 
       
  1419 		DrawGroundSprite(image);
       
  1420 
       
  1421 		if (special) {
       
  1422 			if (m5 & TRACK_BIT_DIAG1) DrawGroundSprite(rti->base_sprites.single_y);
       
  1423 			if (m5 & TRACK_BIT_DIAG2) DrawGroundSprite(rti->base_sprites.single_x);
       
  1424 			if (m5 & TRACK_BIT_UPPER) DrawGroundSprite(rti->base_sprites.single_n);
       
  1425 			if (m5 & TRACK_BIT_LOWER) DrawGroundSprite(rti->base_sprites.single_s);
       
  1426 			if (m5 & TRACK_BIT_LEFT)  DrawGroundSprite(rti->base_sprites.single_w);
       
  1427 			if (m5 & TRACK_BIT_RIGHT) DrawGroundSprite(rti->base_sprites.single_e);
       
  1428 		}
       
  1429 
       
  1430 		if (_debug_pbs_level >= 1) {
       
  1431 			byte pbs = PBSTileReserved(ti->tile);
       
  1432 			if (pbs & TRACK_BIT_DIAG1) DrawGroundSprite(rti->base_sprites.single_y | PALETTE_CRASH);
       
  1433 			if (pbs & TRACK_BIT_DIAG2) DrawGroundSprite(rti->base_sprites.single_x | PALETTE_CRASH);
       
  1434 			if (pbs & TRACK_BIT_UPPER) DrawGroundSprite(rti->base_sprites.single_n | PALETTE_CRASH);
       
  1435 			if (pbs & TRACK_BIT_LOWER) DrawGroundSprite(rti->base_sprites.single_s | PALETTE_CRASH);
       
  1436 			if (pbs & TRACK_BIT_LEFT)  DrawGroundSprite(rti->base_sprites.single_w | PALETTE_CRASH);
       
  1437 			if (pbs & TRACK_BIT_RIGHT) DrawGroundSprite(rti->base_sprites.single_e | PALETTE_CRASH);
       
  1438 		}
       
  1439 
  1463 
  1440 		if (_display_opt & DO_FULL_DETAIL) {
  1464 		if (_display_opt & DO_FULL_DETAIL) {
  1441 			_detailed_track_proc[_m[ti->tile].m2 & RAIL_MAP2LO_GROUND_MASK](ti);
  1465 			_detailed_track_proc[_m[ti->tile].m2 & RAIL_MAP2LO_GROUND_MASK](ti);
  1442 		}
  1466 		}
  1443 
  1467