src/tile.cpp
author skidd13
Tue, 20 Nov 2007 14:11:19 +0000
changeset 8428 f8300c908bd9
parent 7820 f642e46e7f6b
permissions -rw-r--r--
(svn r11485) -Codechange: Remove the doubled function ToggleBitT and rename the remaining to fit with the naming style
2186
461a2aff3486 (svn r2701) Insert Id tags into all source files
tron
parents: 2049
diff changeset
     1
/* $Id$ */
461a2aff3486 (svn r2701) Insert Id tags into all source files
tron
parents: 2049
diff changeset
     2
6918
5589c415e28f (svn r9558) -Documentation: doxygen and comment changes: 'T' now. Almost done
belugas
parents: 5838
diff changeset
     3
/** @file tile.cpp */
5589c415e28f (svn r9558) -Documentation: doxygen and comment changes: 'T' now. Almost done
belugas
parents: 5838
diff changeset
     4
1213
bb9906f67932 (svn r1717) -Fix: some compilation problems for braindead VS6 and added missing files to project (thx bociusz)
darkvater
parents: 1211
diff changeset
     5
#include "stdafx.h"
1211
6f2f723e5c36 (svn r1715) Move [GS]etMapExtraBits to tile.[ch]
tron
parents:
diff changeset
     6
#include "tile.h"
6f2f723e5c36 (svn r1715) Move [GS]etMapExtraBits to tile.[ch]
tron
parents:
diff changeset
     7
3636
d87b21df2944 (svn r4541) Add a type for slopes and replace many magic numbers by the appropriate enums
tron
parents: 3422
diff changeset
     8
Slope GetTileSlope(TileIndex tile, uint *h)
1335
a635854c23b6 (svn r1839) Move GetTileSlope() and GetTileZ() into tile.[ch] and use more explicit types as parameters
tron
parents: 1213
diff changeset
     9
{
a635854c23b6 (svn r1839) Move GetTileSlope() and GetTileZ() into tile.[ch] and use more explicit types as parameters
tron
parents: 1213
diff changeset
    10
	uint a;
a635854c23b6 (svn r1839) Move GetTileSlope() and GetTileZ() into tile.[ch] and use more explicit types as parameters
tron
parents: 1213
diff changeset
    11
	uint b;
a635854c23b6 (svn r1839) Move GetTileSlope() and GetTileZ() into tile.[ch] and use more explicit types as parameters
tron
parents: 1213
diff changeset
    12
	uint c;
a635854c23b6 (svn r1839) Move GetTileSlope() and GetTileZ() into tile.[ch] and use more explicit types as parameters
tron
parents: 1213
diff changeset
    13
	uint d;
4067
ab047dec0733 (svn r5363) Revert 5312, 5288, 5248, 3992, 3249, 3228
tron
parents: 3773
diff changeset
    14
	uint min;
ab047dec0733 (svn r5363) Revert 5312, 5288, 5248, 3992, 3249, 3228
tron
parents: 3773
diff changeset
    15
	uint r;
1335
a635854c23b6 (svn r1839) Move GetTileSlope() and GetTileZ() into tile.[ch] and use more explicit types as parameters
tron
parents: 1213
diff changeset
    16
a635854c23b6 (svn r1839) Move GetTileSlope() and GetTileZ() into tile.[ch] and use more explicit types as parameters
tron
parents: 1213
diff changeset
    17
	assert(tile < MapSize());
a635854c23b6 (svn r1839) Move GetTileSlope() and GetTileZ() into tile.[ch] and use more explicit types as parameters
tron
parents: 1213
diff changeset
    18
a635854c23b6 (svn r1839) Move GetTileSlope() and GetTileZ() into tile.[ch] and use more explicit types as parameters
tron
parents: 1213
diff changeset
    19
	if (TileX(tile) == MapMaxX() || TileY(tile) == MapMaxY()) {
a635854c23b6 (svn r1839) Move GetTileSlope() and GetTileZ() into tile.[ch] and use more explicit types as parameters
tron
parents: 1213
diff changeset
    20
		if (h != NULL) *h = 0;
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
    21
		return SLOPE_FLAT;
1335
a635854c23b6 (svn r1839) Move GetTileSlope() and GetTileZ() into tile.[ch] and use more explicit types as parameters
tron
parents: 1213
diff changeset
    22
	}
a635854c23b6 (svn r1839) Move GetTileSlope() and GetTileZ() into tile.[ch] and use more explicit types as parameters
tron
parents: 1213
diff changeset
    23
4067
ab047dec0733 (svn r5363) Revert 5312, 5288, 5248, 3992, 3249, 3228
tron
parents: 3773
diff changeset
    24
	min = a = TileHeight(tile);
1981
de031d2aed47 (svn r2487) Replace TILE_XY by TileXY/TileDiffXY
tron
parents: 1854
diff changeset
    25
	b = TileHeight(tile + TileDiffXY(1, 0));
7819
694a7dacd30a (svn r10686) -Fix [FS#1058]: determining whether there is a tunnel going under the lowered area is only needed in two directions instead of all four, so take the directions (one for each axis) to the nearest border (along the given axis). Furthermore GetTileZ did much more than absolutely necessary.
rubidium
parents: 6918
diff changeset
    26
	if (min > b) min = b;
1981
de031d2aed47 (svn r2487) Replace TILE_XY by TileXY/TileDiffXY
tron
parents: 1854
diff changeset
    27
	c = TileHeight(tile + TileDiffXY(0, 1));
7819
694a7dacd30a (svn r10686) -Fix [FS#1058]: determining whether there is a tunnel going under the lowered area is only needed in two directions instead of all four, so take the directions (one for each axis) to the nearest border (along the given axis). Furthermore GetTileZ did much more than absolutely necessary.
rubidium
parents: 6918
diff changeset
    28
	if (min > c) min = c;
1981
de031d2aed47 (svn r2487) Replace TILE_XY by TileXY/TileDiffXY
tron
parents: 1854
diff changeset
    29
	d = TileHeight(tile + TileDiffXY(1, 1));
7819
694a7dacd30a (svn r10686) -Fix [FS#1058]: determining whether there is a tunnel going under the lowered area is only needed in two directions instead of all four, so take the directions (one for each axis) to the nearest border (along the given axis). Furthermore GetTileZ did much more than absolutely necessary.
rubidium
parents: 6918
diff changeset
    30
	if (min > d) min = d;
1335
a635854c23b6 (svn r1839) Move GetTileSlope() and GetTileZ() into tile.[ch] and use more explicit types as parameters
tron
parents: 1213
diff changeset
    31
4067
ab047dec0733 (svn r5363) Revert 5312, 5288, 5248, 3992, 3249, 3228
tron
parents: 3773
diff changeset
    32
	r = SLOPE_FLAT;
ab047dec0733 (svn r5363) Revert 5312, 5288, 5248, 3992, 3249, 3228
tron
parents: 3773
diff changeset
    33
	if ((a -= min) != 0) r += (--a << 4) + SLOPE_N;
ab047dec0733 (svn r5363) Revert 5312, 5288, 5248, 3992, 3249, 3228
tron
parents: 3773
diff changeset
    34
	if ((c -= min) != 0) r += (--c << 4) + SLOPE_E;
ab047dec0733 (svn r5363) Revert 5312, 5288, 5248, 3992, 3249, 3228
tron
parents: 3773
diff changeset
    35
	if ((d -= min) != 0) r += (--d << 4) + SLOPE_S;
ab047dec0733 (svn r5363) Revert 5312, 5288, 5248, 3992, 3249, 3228
tron
parents: 3773
diff changeset
    36
	if ((b -= min) != 0) r += (--b << 4) + SLOPE_W;
ab047dec0733 (svn r5363) Revert 5312, 5288, 5248, 3992, 3249, 3228
tron
parents: 3773
diff changeset
    37
ab047dec0733 (svn r5363) Revert 5312, 5288, 5248, 3992, 3249, 3228
tron
parents: 3773
diff changeset
    38
	if (h != NULL) *h = min * TILE_HEIGHT;
ab047dec0733 (svn r5363) Revert 5312, 5288, 5248, 3992, 3249, 3228
tron
parents: 3773
diff changeset
    39
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
    40
	return (Slope)r;
1335
a635854c23b6 (svn r1839) Move GetTileSlope() and GetTileZ() into tile.[ch] and use more explicit types as parameters
tron
parents: 1213
diff changeset
    41
}
a635854c23b6 (svn r1839) Move GetTileSlope() and GetTileZ() into tile.[ch] and use more explicit types as parameters
tron
parents: 1213
diff changeset
    42
a635854c23b6 (svn r1839) Move GetTileSlope() and GetTileZ() into tile.[ch] and use more explicit types as parameters
tron
parents: 1213
diff changeset
    43
uint GetTileZ(TileIndex tile)
a635854c23b6 (svn r1839) Move GetTileSlope() and GetTileZ() into tile.[ch] and use more explicit types as parameters
tron
parents: 1213
diff changeset
    44
{
7819
694a7dacd30a (svn r10686) -Fix [FS#1058]: determining whether there is a tunnel going under the lowered area is only needed in two directions instead of all four, so take the directions (one for each axis) to the nearest border (along the given axis). Furthermore GetTileZ did much more than absolutely necessary.
rubidium
parents: 6918
diff changeset
    45
	if (TileX(tile) == MapMaxX() || TileY(tile) == MapMaxY()) return 0;
694a7dacd30a (svn r10686) -Fix [FS#1058]: determining whether there is a tunnel going under the lowered area is only needed in two directions instead of all four, so take the directions (one for each axis) to the nearest border (along the given axis). Furthermore GetTileZ did much more than absolutely necessary.
rubidium
parents: 6918
diff changeset
    46
694a7dacd30a (svn r10686) -Fix [FS#1058]: determining whether there is a tunnel going under the lowered area is only needed in two directions instead of all four, so take the directions (one for each axis) to the nearest border (along the given axis). Furthermore GetTileZ did much more than absolutely necessary.
rubidium
parents: 6918
diff changeset
    47
	uint h = TileHeight(tile);
694a7dacd30a (svn r10686) -Fix [FS#1058]: determining whether there is a tunnel going under the lowered area is only needed in two directions instead of all four, so take the directions (one for each axis) to the nearest border (along the given axis). Furthermore GetTileZ did much more than absolutely necessary.
rubidium
parents: 6918
diff changeset
    48
	h = min(h, TileHeight(tile + TileDiffXY(1, 0)));
694a7dacd30a (svn r10686) -Fix [FS#1058]: determining whether there is a tunnel going under the lowered area is only needed in two directions instead of all four, so take the directions (one for each axis) to the nearest border (along the given axis). Furthermore GetTileZ did much more than absolutely necessary.
rubidium
parents: 6918
diff changeset
    49
	h = min(h, TileHeight(tile + TileDiffXY(0, 1)));
694a7dacd30a (svn r10686) -Fix [FS#1058]: determining whether there is a tunnel going under the lowered area is only needed in two directions instead of all four, so take the directions (one for each axis) to the nearest border (along the given axis). Furthermore GetTileZ did much more than absolutely necessary.
rubidium
parents: 6918
diff changeset
    50
	h = min(h, TileHeight(tile + TileDiffXY(1, 1)));
694a7dacd30a (svn r10686) -Fix [FS#1058]: determining whether there is a tunnel going under the lowered area is only needed in two directions instead of all four, so take the directions (one for each axis) to the nearest border (along the given axis). Furthermore GetTileZ did much more than absolutely necessary.
rubidium
parents: 6918
diff changeset
    51
694a7dacd30a (svn r10686) -Fix [FS#1058]: determining whether there is a tunnel going under the lowered area is only needed in two directions instead of all four, so take the directions (one for each axis) to the nearest border (along the given axis). Furthermore GetTileZ did much more than absolutely necessary.
rubidium
parents: 6918
diff changeset
    52
	return h * TILE_HEIGHT;
1335
a635854c23b6 (svn r1839) Move GetTileSlope() and GetTileZ() into tile.[ch] and use more explicit types as parameters
tron
parents: 1213
diff changeset
    53
}
3773
996897ffc8ea (svn r4765) Add GetTileMaxZ(), which returns the height of the highest corner of a tile, and use it to simplify the code in a few places
tron
parents: 3636
diff changeset
    54
996897ffc8ea (svn r4765) Add GetTileMaxZ(), which returns the height of the highest corner of a tile, and use it to simplify the code in a few places
tron
parents: 3636
diff changeset
    55
996897ffc8ea (svn r4765) Add GetTileMaxZ(), which returns the height of the highest corner of a tile, and use it to simplify the code in a few places
tron
parents: 3636
diff changeset
    56
uint GetTileMaxZ(TileIndex t)
996897ffc8ea (svn r4765) Add GetTileMaxZ(), which returns the height of the highest corner of a tile, and use it to simplify the code in a few places
tron
parents: 3636
diff changeset
    57
{
7820
f642e46e7f6b (svn r10687) -Fix (r10686): subversion does not like it when you change code when you are typing the commit message.
rubidium
parents: 7819
diff changeset
    58
	if (TileX(t) == MapMaxX() || TileY(t) == MapMaxY()) return 0;
3773
996897ffc8ea (svn r4765) Add GetTileMaxZ(), which returns the height of the highest corner of a tile, and use it to simplify the code in a few places
tron
parents: 3636
diff changeset
    59
7819
694a7dacd30a (svn r10686) -Fix [FS#1058]: determining whether there is a tunnel going under the lowered area is only needed in two directions instead of all four, so take the directions (one for each axis) to the nearest border (along the given axis). Furthermore GetTileZ did much more than absolutely necessary.
rubidium
parents: 6918
diff changeset
    60
	uint h = TileHeight(t);
694a7dacd30a (svn r10686) -Fix [FS#1058]: determining whether there is a tunnel going under the lowered area is only needed in two directions instead of all four, so take the directions (one for each axis) to the nearest border (along the given axis). Furthermore GetTileZ did much more than absolutely necessary.
rubidium
parents: 6918
diff changeset
    61
	h = max(h, TileHeight(t + TileDiffXY(1, 0)));
694a7dacd30a (svn r10686) -Fix [FS#1058]: determining whether there is a tunnel going under the lowered area is only needed in two directions instead of all four, so take the directions (one for each axis) to the nearest border (along the given axis). Furthermore GetTileZ did much more than absolutely necessary.
rubidium
parents: 6918
diff changeset
    62
	h = max(h, TileHeight(t + TileDiffXY(0, 1)));
694a7dacd30a (svn r10686) -Fix [FS#1058]: determining whether there is a tunnel going under the lowered area is only needed in two directions instead of all four, so take the directions (one for each axis) to the nearest border (along the given axis). Furthermore GetTileZ did much more than absolutely necessary.
rubidium
parents: 6918
diff changeset
    63
	h = max(h, TileHeight(t + TileDiffXY(1, 1)));
694a7dacd30a (svn r10686) -Fix [FS#1058]: determining whether there is a tunnel going under the lowered area is only needed in two directions instead of all four, so take the directions (one for each axis) to the nearest border (along the given axis). Furthermore GetTileZ did much more than absolutely necessary.
rubidium
parents: 6918
diff changeset
    64
694a7dacd30a (svn r10686) -Fix [FS#1058]: determining whether there is a tunnel going under the lowered area is only needed in two directions instead of all four, so take the directions (one for each axis) to the nearest border (along the given axis). Furthermore GetTileZ did much more than absolutely necessary.
rubidium
parents: 6918
diff changeset
    65
	return h * TILE_HEIGHT;
3773
996897ffc8ea (svn r4765) Add GetTileMaxZ(), which returns the height of the highest corner of a tile, and use it to simplify the code in a few places
tron
parents: 3636
diff changeset
    66
}