(svn r40) Final slope graphics fix
authordominik
Fri, 13 Aug 2004 18:27:33 +0000
changeset 39 d177340ed556
parent 38 d20549a6ea13
child 40 19566889fd0e
(svn r40) Final slope graphics fix
clear_cmd.c
dummy_land.c
industry_cmd.c
landscape.c
rail_cmd.c
road_cmd.c
station_cmd.c
town_cmd.c
tree_cmd.c
ttd.h
tunnelbridge_cmd.c
unmovable_cmd.c
water_cmd.c
--- a/clear_cmd.c	Fri Aug 13 17:41:44 2004 +0000
+++ b/clear_cmd.c	Fri Aug 13 18:27:33 2004 +0000
@@ -514,6 +514,11 @@
 
 uint GetSlopeZ_Clear(TileInfo *ti) { return GetPartialZ(ti->x&0xF, ti->y&0xF, ti->tileh) + ti->z; }
 
+uint GetSlopeTileh_Clear(TileInfo *ti)
+{
+	return ti->tileh;
+}
+
 static void GetAcceptedCargo_Clear(uint tile, AcceptedCargo *ac)
 {
 	/* unused */	
@@ -803,4 +808,5 @@
 	NULL,											/* get_produced_cargo_proc */
 	NULL,											/* vehicle_enter_tile_proc */
 	NULL,											/* vehicle_leave_tile_proc */
+	GetSlopeTileh_Clear,			/* get_slope_tileh_proc */
 };
--- a/dummy_land.c	Fri Aug 13 17:41:44 2004 +0000
+++ b/dummy_land.c	Fri Aug 13 18:27:33 2004 +0000
@@ -13,6 +13,10 @@
 	return GetPartialZ(ti->x&0xF, ti->y&0xF, ti->tileh) + ti->z;
 }
 
+static uint GetSlopeZ_Dummy(TileInfo *ti) {
+	return ti->tileh;
+}
+
 static int32 ClearTile_Dummy(uint tile, byte flags) {
 	return_cmd_error(STR_0001_OFF_EDGE_OF_MAP);
 }
@@ -68,5 +72,6 @@
 	NULL,											/* get_produced_cargo_proc */
 	NULL,											/* vehicle_enter_tile_proc */
 	NULL,											/* vehicle_leave_tile_proc */
+	GetSlopeTileh_Dummy,			/* get_slope_tileh_proc */
 };
 
--- a/industry_cmd.c	Fri Aug 13 17:41:44 2004 +0000
+++ b/industry_cmd.c	Fri Aug 13 18:27:33 2004 +0000
@@ -334,6 +334,10 @@
 	return GetPartialZ(ti->x&0xF, ti->y&0xF, ti->tileh) + ti->z;
 }
 
+static uint GetSlopeTileh_Industry(TileInfo *ti) {
+	return 0;
+}
+
 static void GetAcceptedCargo_Industry(uint tile, AcceptedCargo *ac)
 {
 	int m5 = _map5[tile];
@@ -1819,6 +1823,7 @@
 	GetProducedCargo_Industry,  /* get_produced_cargo_proc */
 	NULL,												/* vehicle_enter_tile_proc */
 	NULL,												/* vehicle_leave_tile_proc */
+	GetSlopeTileh_Industry,			/* get_slope_tileh_proc */
 };
 
 static const byte _industry_desc[] = {
--- a/landscape.c	Fri Aug 13 17:41:44 2004 +0000
+++ b/landscape.c	Fri Aug 13 18:27:33 2004 +0000
@@ -237,22 +237,34 @@
 
 	assert(z < 256);
 */
-
 	return _tile_type_procs[ti.type]->get_slope_z_proc(&ti);
 }
 
-/* TODO: add check if this tile has a foundation or not. Since this can't be done easily with the
-	current landscape arrays, we might have to add a new TileTypeProc. */ 
-bool hasFoundation(uint tile)
+// direction=true:  check for foundation in east and south corner
+// direction=false: check for foundation in west and south corner
+bool hasFoundation(TileInfo *ti, bool direction)
 {
-	return true;
+	bool south, other; // southern corner and east/west corner
+	uint slope = _tile_type_procs[ti->type]->get_slope_tileh_proc(ti);
+	south = ((ti->tileh) & 2) != (slope & 2);
+
+	if(direction)
+		other = ((ti->tileh) & 4) != (slope & 4);
+	else
+		other = ((ti->tileh) & 1) != (slope & 1);
+
+	return south || other;
 }
 
 void DrawFoundation(TileInfo *ti, uint f)
 {
 	uint32 sprite_base = SPR_SLOPES_BASE-14;
-	if(hasFoundation( TILE_FROM_XY(ti->x, ti->y-1) )) sprite_base += 22;		// foundation in NW direction
-	if(hasFoundation( TILE_FROM_XY(ti->x-1, ti->y) )) sprite_base += 22*2;	// foundation in NE direction
+
+	TileInfo ti2;
+	FindLandscapeHeight(&ti2, ti->x, ti->y-1);
+	if(hasFoundation( &ti2, true )) sprite_base += 22;		// foundation in NW direction
+	FindLandscapeHeight(&ti2, ti->x-1, ti->y);
+	if(hasFoundation( &ti2, false )) sprite_base += 22*2;	// foundation in NE direction
 
 	if (f < 15) {
 		// leveled foundation	
--- a/rail_cmd.c	Fri Aug 13 17:41:44 2004 +0000
+++ b/rail_cmd.c	Fri Aug 13 18:27:33 2004 +0000
@@ -1694,6 +1694,28 @@
 	return z;
 }
 
+uint GetSlopeTileh_Track(TileInfo *ti) 
+{
+	// check if it's a foundation
+	if (ti->tileh != 0) {
+		if ((ti->map5 & 0x80) == 0) {
+			uint f = GetRailFoundation(ti->tileh, ti->map5 & 0x3F);
+			if (f != 0) {
+				if (f < 15) {
+					// leveled foundation
+					return 0;
+				}
+				// inclined foundation
+				return _inclined_tileh[f - 15];
+			}
+		} else if ((ti->map5 & 0xC0) == 0xC0) {
+			// depot or checkpoint
+			return 0;
+		}
+	}
+	return ti->tileh;
+}
+
 static void GetAcceptedCargo_Track(uint tile, AcceptedCargo *ac)
 {
 	/* not used */
@@ -1949,4 +1971,5 @@
 	NULL,											/* get_produced_cargo_proc */
 	VehicleEnter_Track,				/* vehicle_enter_tile_proc */
 	NULL,											/* vehicle_leave_tile_proc */
+	GetSlopeTileh_Track,			/* get_slope_tileh_proc */
 };
--- a/road_cmd.c	Fri Aug 13 17:41:44 2004 +0000
+++ b/road_cmd.c	Fri Aug 13 18:27:33 2004 +0000
@@ -875,7 +875,29 @@
 		}
 		return GetPartialZ(ti->x&0xF, ti->y&0xF, th) + z;
 	}
-	return z;
+	return z; // normal Z if no slope
+}
+
+uint GetSlopeTileh_Road(TileInfo *ti)
+{
+	// check if it's a foundation
+	if (ti->tileh != 0) {
+		if ((ti->map5 & 0xE0) == 0) { /* road or crossing */
+			uint f = GetRoadFoundation(ti->tileh, ti->map5 & 0x3F);
+			if (f != 0) {
+				if (f < 15) {
+					// leveled foundation
+					return 0;
+				}
+				// inclined foundation
+				return _inclined_tileh[f - 15];
+			}
+		} else if ((ti->map5 & 0xF0) == 0x20) {
+			// depot
+			return 0;
+		}
+	}
+	return ti->tileh;
 }
 
 static void GetAcceptedCargo_Road(uint tile, AcceptedCargo *ac)
@@ -1129,4 +1151,5 @@
 	NULL,											/* get_produced_cargo_proc */
 	VehicleEnter_Road,				/* vehicle_enter_tile_proc */
 	VehicleLeave_Road,				/* vehicle_leave_tile_proc */
+	GetSlopeTileh_Road,				/* get_slope_tileh_proc */
 };
--- a/station_cmd.c	Fri Aug 13 17:41:44 2004 +0000
+++ b/station_cmd.c	Fri Aug 13 18:27:33 2004 +0000
@@ -1778,6 +1778,11 @@
 	return z;
 }
 
+static uint GetSlopeTileh_Station(TileInfo *ti)
+{
+	return 0;
+}
+
 static void GetAcceptedCargo_Station(uint tile, AcceptedCargo *ac)
 {
 	/* not used */
@@ -2451,6 +2456,7 @@
 	NULL,												/* get_produced_cargo_proc */
 	VehicleEnter_Station,				/* vehicle_enter_tile_proc */
 	NULL,												/* vehicle_leave_tile_proc */
+	GetSlopeTileh_Station,			/* get_slope_tileh_proc */
 };
 
 
--- a/town_cmd.c	Fri Aug 13 17:41:44 2004 +0000
+++ b/town_cmd.c	Fri Aug 13 18:27:33 2004 +0000
@@ -103,6 +103,11 @@
 	return (uint16) z;	
 }
 
+static uint GetSlopeTileh_Town(TileInfo *ti)
+{
+	return ti->tileh;
+}
+
 static void AnimateTile_Town(uint tile)
 {
 	int old;
@@ -1772,6 +1777,7 @@
 	NULL,											/* get_produced_cargo_proc */
 	NULL,											/* vehicle_enter_tile_proc */
 	NULL,											/* vehicle_leave_tile_proc */
+	GetSlopeTileh_Town,				/* get_slope_tileh_proc */
 };
 
 
--- a/tree_cmd.c	Fri Aug 13 17:41:44 2004 +0000
+++ b/tree_cmd.c	Fri Aug 13 18:27:33 2004 +0000
@@ -332,6 +332,10 @@
 	return GetPartialZ(ti->x&0xF, ti->y&0xF, ti->tileh) + ti->z;
 }
 
+static uint GetSlopeTileh_Trees(TileInfo *ti) {
+	return ti->tileh;
+}
+
 static int32 ClearTile_Trees(uint tile, byte flags) {
 	int num;
 
@@ -644,4 +648,5 @@
 	NULL,											/* get_produced_cargo_proc */
 	NULL,											/* vehicle_enter_tile_proc */
 	NULL,											/* vehicle_leave_tile_proc */
+	GetSlopeTileh_Trees,			/* get_slope_tileh_proc */
 };
--- a/ttd.h	Fri Aug 13 17:41:44 2004 +0000
+++ b/ttd.h	Fri Aug 13 18:27:33 2004 +0000
@@ -242,6 +242,7 @@
  * other bits that can be set? */
 typedef uint32 VehicleEnterTileProc(Vehicle *v, uint tile, int x, int y);
 typedef void VehicleLeaveTileProc(Vehicle *v, uint tile, int x, int y);
+typedef uint GetSlopeTilehProc(TileInfo *ti);
 
 typedef struct {
 	DrawTileProc *draw_tile_proc;
@@ -257,6 +258,7 @@
 	GetProducedCargoProc *get_produced_cargo_proc;
 	VehicleEnterTileProc *vehicle_enter_tile_proc;
 	VehicleLeaveTileProc *vehicle_leave_tile_proc;
+	GetSlopeTilehProc *get_slope_tileh_proc;
 } TileTypeProcs;
 
 
--- a/tunnelbridge_cmd.c	Fri Aug 13 17:41:44 2004 +0000
+++ b/tunnelbridge_cmd.c	Fri Aug 13 18:27:33 2004 +0000
@@ -1198,6 +1198,12 @@
 	return GetPartialZ(ti->x&0xF, ti->y&0xF, ti->tileh) + z;
 }
 
+static uint GetSlopeTileh_TunnelBridge(TileInfo *ti) {
+	// not accurate, but good enough for slope graphics drawing
+	return 0;
+}
+
+
 static void GetAcceptedCargo_TunnelBridge(uint tile, AcceptedCargo *ac)
 {
 	/* not used */
@@ -1478,4 +1484,5 @@
 	NULL,														/* get_produced_cargo_proc */
 	VehicleEnter_TunnelBridge,			/* vehicle_enter_tile_proc */
 	NULL,														/* vehicle_leave_tile_proc */
+	GetSlopeTileh_TunnelBridge,			/* get_slope_tileh_proc */
 };
--- a/unmovable_cmd.c	Fri Aug 13 17:41:44 2004 +0000
+++ b/unmovable_cmd.c	Fri Aug 13 18:27:33 2004 +0000
@@ -106,6 +106,11 @@
 	return GetPartialZ(ti->x&0xF, ti->y&0xF, ti->tileh) + ti->z;
 }
 
+static uint GetSlopeTileh_Unmovable(TileInfo *ti) 
+{
+	return 0;
+}
+
 static int32 ClearTile_Unmovable(uint tile, byte flags)
 {
 	byte m5 = _map5[tile];
@@ -386,4 +391,5 @@
 	NULL,													/* get_produced_cargo_proc */
 	NULL,													/* vehicle_enter_tile_proc */
 	NULL,													/* vehicle_leave_tile_proc */
+	GetSlopeTileh_Unmovable,			/* get_slope_tileh_proc */
 };
--- a/water_cmd.c	Fri Aug 13 17:41:44 2004 +0000
+++ b/water_cmd.c	Fri Aug 13 18:27:33 2004 +0000
@@ -441,6 +441,11 @@
 	return GetPartialZ(ti->x&0xF, ti->y&0xF, ti->tileh) + ti->z;
 }
 
+uint GetSlopeTileh_Water(TileInfo *ti)
+{ 
+	return ti->tileh;
+}
+
 static void GetAcceptedCargo_Water(uint tile, AcceptedCargo *ac)
 {
 	/* not used */
@@ -608,5 +613,6 @@
 	NULL,											/* get_produced_cargo_proc */
 	VehicleEnter_Water,				/* vehicle_enter_tile_proc */
 	NULL,											/* vehicle_leave_tile_proc */
+	GetSlopeTileh_Water,			/* get_slope_tileh_proc */
 };