author | rubidium |
Sun, 25 May 2008 19:17:03 +0000 | |
changeset 9354 | 845e07db4549 |
parent 9111 | 48ce04029fe4 |
child 9449 | 240fedf4ed2c |
permissions | -rw-r--r-- |
2186 | 1 |
/* $Id$ */ |
2 |
||
9111
48ce04029fe4
(svn r12971) -Documentation: add @file in files that missed them and add something more than whitespace as description of files that don't have a description.
rubidium
parents:
8391
diff
changeset
|
3 |
/** @file map.cpp Base functions related to the map and distances on them. */ |
6201
bee01dc45e39
(svn r8987) -Cleanup: doxygen changes. Again. Mostly (still) @files missing tags and (more than just) a few comments style.
belugas
parents:
5609
diff
changeset
|
4 |
|
679
04ca2cd69420
(svn r1117) Move map arrays and some related macros into their own files map.c and map.h
tron
parents:
diff
changeset
|
5 |
#include "stdafx.h" |
1299
39c06aba09aa
(svn r1803) Move debugging stuff into files of it's own
tron
parents:
1247
diff
changeset
|
6 |
#include "debug.h" |
8100
6bc08f98ec16
(svn r11661) -Codechange: some header reworks in order to try to reduce the compile time of OpenTTD by reduce the amount of circular-ish dependencies.
rubidium
parents:
8040
diff
changeset
|
7 |
#include "direction_func.h" |
8113
31b7784db761
(svn r11674) -Codechange: refactor some functions out of macros.h into more logical locations.
rubidium
parents:
8100
diff
changeset
|
8 |
#include "core/bitmath_func.hpp" |
8130
d2eb7d04f6e1
(svn r11691) -Codechange: move+rename helpers.hpp and only include it when it is really needed.
rubidium
parents:
8113
diff
changeset
|
9 |
#include "core/alloc_func.hpp" |
8131
160939e24ed3
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
rubidium
parents:
8130
diff
changeset
|
10 |
#include "core/math_func.hpp" |
8139
4e91c448c409
(svn r11701) -Codechange: removal unnecessary inclusions of map.h (and split map.h).
rubidium
parents:
8131
diff
changeset
|
11 |
#include "map_func.h" |
679
04ca2cd69420
(svn r1117) Move map arrays and some related macros into their own files map.c and map.h
tron
parents:
diff
changeset
|
12 |
|
2482
374f6395847d
(svn r3008) [ 1247535 ] Native Support for Win64 (compile&run only) (michi_cc)
Darkvater
parents:
2403
diff
changeset
|
13 |
#if defined(_MSC_VER) && _MSC_VER >= 1400 /* VStudio 2005 is stupid! */ |
374f6395847d
(svn r3008) [ 1247535 ] Native Support for Win64 (compile&run only) (michi_cc)
Darkvater
parents:
2403
diff
changeset
|
14 |
/* Why the hell is that not in all MSVC headers?? */ |
5587
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
15 |
extern "C" _CRTIMP void __cdecl _assert(void *, void *, unsigned); |
2482
374f6395847d
(svn r3008) [ 1247535 ] Native Support for Win64 (compile&run only) (michi_cc)
Darkvater
parents:
2403
diff
changeset
|
16 |
#endif |
374f6395847d
(svn r3008) [ 1247535 ] Native Support for Win64 (compile&run only) (michi_cc)
Darkvater
parents:
2403
diff
changeset
|
17 |
|
6540
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
18 |
uint _map_log_x; ///< 2^_map_log_x == _map_size_x |
8391
193b256c681c
(svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents:
8331
diff
changeset
|
19 |
uint _map_log_y; ///< 2^_map_log_y == _map_size_y |
6540
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
20 |
uint _map_size_x; ///< Size of the map along the X |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
21 |
uint _map_size_y; ///< Size of the map along the Y |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
22 |
uint _map_size; ///< The number of tiles on the map |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
23 |
uint _map_tile_mask; ///< _map_size - 1 (to mask the mapsize) |
689 | 24 |
|
6540
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
25 |
Tile *_m = NULL; ///< Tiles of the map |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
26 |
TileExtended *_me = NULL; ///< Extended Tiles of the map |
863
6a1444534f62
(svn r1344) Use MapSize[XY]() (or MapSize()/MapMax[XY]() where appropriate) instead of TILES_[XY]
tron
parents:
817
diff
changeset
|
27 |
|
1218 | 28 |
|
7546
c4f9132d9f1e
(svn r11066) -Documentation [FS#1091]: of map.*. Patch by Progman.
rubidium
parents:
7405
diff
changeset
|
29 |
/*! |
6540
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
30 |
* (Re)allocates a map with the given dimension |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
31 |
* @param size_x the width of the map along the NE/SW edge |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
32 |
* @param size_y the 'height' of the map along the SE/NW edge |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
33 |
*/ |
2051 | 34 |
void AllocateMap(uint size_x, uint size_y) |
1218 | 35 |
{ |
6201
bee01dc45e39
(svn r8987) -Cleanup: doxygen changes. Again. Mostly (still) @files missing tags and (more than just) a few comments style.
belugas
parents:
5609
diff
changeset
|
36 |
/* Make sure that the map size is within the limits and that |
bee01dc45e39
(svn r8987) -Cleanup: doxygen changes. Again. Mostly (still) @files missing tags and (more than just) a few comments style.
belugas
parents:
5609
diff
changeset
|
37 |
* the x axis size is a power of 2. */ |
2051 | 38 |
if (size_x < 64 || size_x > 2048 || |
39 |
size_y < 64 || size_y > 2048 || |
|
6540
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
40 |
(size_x & (size_x - 1)) != 0 || |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
41 |
(size_y & (size_y - 1)) != 0) |
1244 | 42 |
error("Invalid map size"); |
1218 | 43 |
|
5380
8ea58542b6e0
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5170
diff
changeset
|
44 |
DEBUG(map, 1, "Allocating map of size %dx%d", size_x, size_y); |
1218 | 45 |
|
2051 | 46 |
_map_log_x = FindFirstBit(size_x); |
8391
193b256c681c
(svn r11961) -Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size.
belugas
parents:
8331
diff
changeset
|
47 |
_map_log_y = FindFirstBit(size_y); |
2051 | 48 |
_map_size_x = size_x; |
49 |
_map_size_y = size_y; |
|
50 |
_map_size = size_x * size_y; |
|
51 |
_map_tile_mask = _map_size - 1; |
|
1218 | 52 |
|
2049
538e73c53f54
(svn r2558) Change the internal map format from 7 arrays to one array of structs, this doesn't change the saved format for now. It's a stepping stone for further changes.
tron
parents:
2043
diff
changeset
|
53 |
free(_m); |
6332
f3f436dcd7d0
(svn r9315) -Merge: The newhouses branch. With this merge comes almost complete support for
maedhros
parents:
6201
diff
changeset
|
54 |
free(_me); |
1218 | 55 |
|
6492
286a52449b54
(svn r9673) -Cleanup: remove spaces before tabs and replace non-indenting tabs with spaces.
rubidium
parents:
6491
diff
changeset
|
56 |
/* XXX @todo handle memory shortage more gracefully |
8040
92c69fcd0d61
(svn r11600) -Cleanup: remove extra out-of-memory checks, since it's now done in *allocT functions.
glx
parents:
7970
diff
changeset
|
57 |
* CallocT does the out-of-memory check |
6492
286a52449b54
(svn r9673) -Cleanup: remove spaces before tabs and replace non-indenting tabs with spaces.
rubidium
parents:
6491
diff
changeset
|
58 |
* Maybe some attemps could be made to try with smaller maps down to 64x64 |
286a52449b54
(svn r9673) -Cleanup: remove spaces before tabs and replace non-indenting tabs with spaces.
rubidium
parents:
6491
diff
changeset
|
59 |
* Maybe check for available memory before doing the calls, after all, we know how big |
286a52449b54
(svn r9673) -Cleanup: remove spaces before tabs and replace non-indenting tabs with spaces.
rubidium
parents:
6491
diff
changeset
|
60 |
* the map is */ |
8040
92c69fcd0d61
(svn r11600) -Cleanup: remove extra out-of-memory checks, since it's now done in *allocT functions.
glx
parents:
7970
diff
changeset
|
61 |
_m = CallocT<Tile>(_map_size); |
92c69fcd0d61
(svn r11600) -Cleanup: remove extra out-of-memory checks, since it's now done in *allocT functions.
glx
parents:
7970
diff
changeset
|
62 |
_me = CallocT<TileExtended>(_map_size); |
1218 | 63 |
} |
900 | 64 |
|
955
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
65 |
|
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
66 |
#ifdef _DEBUG |
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
67 |
TileIndex TileAdd(TileIndex tile, TileIndexDiff add, |
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
68 |
const char *exp, const char *file, int line) |
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
69 |
{ |
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
70 |
int dx; |
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
71 |
int dy; |
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
72 |
uint x; |
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
73 |
uint y; |
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
74 |
|
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
75 |
dx = add & MapMaxX(); |
957
a1cb5aac6a6f
(svn r1449) -Fix: signed/unsigned error on windows
darkvater
parents:
955
diff
changeset
|
76 |
if (dx >= (int)MapSizeX() / 2) dx -= MapSizeX(); |
955
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
77 |
dy = (add - dx) / (int)MapSizeX(); |
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
78 |
|
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
79 |
x = TileX(tile) + dx; |
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
80 |
y = TileY(tile) + dy; |
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
81 |
|
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
82 |
if (x >= MapSizeX() || y >= MapSizeY()) { |
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
83 |
char buf[512]; |
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
84 |
|
5170
817550aa5a5f
(svn r7280) -Codechange: Replace some sprintf() functions with the safer snprintf() functions
Darkvater
parents:
5118
diff
changeset
|
85 |
snprintf(buf, lengthof(buf), "TILE_ADD(%s) when adding 0x%.4X and 0x%.4X failed", |
955
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
86 |
exp, tile, add); |
7405
2fd57f130eca
(svn r10778) -Fix: one-liners to allow MSVC and WINCE to work together (or anyway, a step towards that goal)
truelight
parents:
7372
diff
changeset
|
87 |
#if !defined(_MSC_VER) || defined(WINCE) |
955
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
88 |
fprintf(stderr, "%s:%d %s\n", file, line, buf); |
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
89 |
#else |
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
90 |
_assert(buf, (char*)file, line); |
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
91 |
#endif |
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
92 |
} |
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
93 |
|
6491
00dc414c909d
(svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents:
6332
diff
changeset
|
94 |
assert(TileXY(x, y) == TILE_MASK(tile + add)); |
955
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
95 |
|
6491
00dc414c909d
(svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents:
6332
diff
changeset
|
96 |
return TileXY(x, y); |
955
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
97 |
} |
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
98 |
#endif |
62b8588f50c8
(svn r1447) Move TILE_ADD(), TILE_ADDXY() and SafeTileAdd() to map.[ch] and make the latter map size agnostic
tron
parents:
927
diff
changeset
|
99 |
|
7546
c4f9132d9f1e
(svn r11066) -Documentation [FS#1091]: of map.*. Patch by Progman.
rubidium
parents:
7405
diff
changeset
|
100 |
/*! |
6540
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
101 |
* Scales the given value by the map size, where the given value is |
7546
c4f9132d9f1e
(svn r11066) -Documentation [FS#1091]: of map.*. Patch by Progman.
rubidium
parents:
7405
diff
changeset
|
102 |
* for a 256 by 256 map. |
6540
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
103 |
* @param n the value to scale |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
104 |
* @return the scaled size |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
105 |
*/ |
1202
4d2a20c50760
(svn r1706) Implement ScaleByMapSize() and ScaleByMapSize1D()
tron
parents:
957
diff
changeset
|
106 |
uint ScaleByMapSize(uint n) |
4d2a20c50760
(svn r1706) Implement ScaleByMapSize() and ScaleByMapSize1D()
tron
parents:
957
diff
changeset
|
107 |
{ |
6201
bee01dc45e39
(svn r8987) -Cleanup: doxygen changes. Again. Mostly (still) @files missing tags and (more than just) a few comments style.
belugas
parents:
5609
diff
changeset
|
108 |
/* First shift by 12 to prevent integer overflow for large values of n. |
bee01dc45e39
(svn r8987) -Cleanup: doxygen changes. Again. Mostly (still) @files missing tags and (more than just) a few comments style.
belugas
parents:
5609
diff
changeset
|
109 |
* >>12 is safe since the min mapsize is 64x64 |
bee01dc45e39
(svn r8987) -Cleanup: doxygen changes. Again. Mostly (still) @files missing tags and (more than just) a few comments style.
belugas
parents:
5609
diff
changeset
|
110 |
* Add (1<<4)-1 to round upwards. */ |
6491
00dc414c909d
(svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents:
6332
diff
changeset
|
111 |
return (n * (MapSize() >> 12) + (1 << 4) - 1) >> 4; |
1202
4d2a20c50760
(svn r1706) Implement ScaleByMapSize() and ScaleByMapSize1D()
tron
parents:
957
diff
changeset
|
112 |
} |
4d2a20c50760
(svn r1706) Implement ScaleByMapSize() and ScaleByMapSize1D()
tron
parents:
957
diff
changeset
|
113 |
|
4d2a20c50760
(svn r1706) Implement ScaleByMapSize() and ScaleByMapSize1D()
tron
parents:
957
diff
changeset
|
114 |
|
7546
c4f9132d9f1e
(svn r11066) -Documentation [FS#1091]: of map.*. Patch by Progman.
rubidium
parents:
7405
diff
changeset
|
115 |
/*! |
6540
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
116 |
* Scales the given value by the maps circumference, where the given |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
117 |
* value is for a 256 by 256 map |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
118 |
* @param n the value to scale |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
119 |
* @return the scaled size |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
120 |
*/ |
1202
4d2a20c50760
(svn r1706) Implement ScaleByMapSize() and ScaleByMapSize1D()
tron
parents:
957
diff
changeset
|
121 |
uint ScaleByMapSize1D(uint n) |
4d2a20c50760
(svn r1706) Implement ScaleByMapSize() and ScaleByMapSize1D()
tron
parents:
957
diff
changeset
|
122 |
{ |
6201
bee01dc45e39
(svn r8987) -Cleanup: doxygen changes. Again. Mostly (still) @files missing tags and (more than just) a few comments style.
belugas
parents:
5609
diff
changeset
|
123 |
/* Normal circumference for the X+Y is 256+256 = 1<<9 |
bee01dc45e39
(svn r8987) -Cleanup: doxygen changes. Again. Mostly (still) @files missing tags and (more than just) a few comments style.
belugas
parents:
5609
diff
changeset
|
124 |
* Note, not actually taking the full circumference into account, |
bee01dc45e39
(svn r8987) -Cleanup: doxygen changes. Again. Mostly (still) @files missing tags and (more than just) a few comments style.
belugas
parents:
5609
diff
changeset
|
125 |
* just half of it. |
bee01dc45e39
(svn r8987) -Cleanup: doxygen changes. Again. Mostly (still) @files missing tags and (more than just) a few comments style.
belugas
parents:
5609
diff
changeset
|
126 |
* (1<<9) - 1 is there to scale upwards. */ |
6491
00dc414c909d
(svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents:
6332
diff
changeset
|
127 |
return (n * (MapSizeX() + MapSizeY()) + (1 << 9) - 1) >> 9; |
1202
4d2a20c50760
(svn r1706) Implement ScaleByMapSize() and ScaleByMapSize1D()
tron
parents:
957
diff
changeset
|
128 |
} |
4d2a20c50760
(svn r1706) Implement ScaleByMapSize() and ScaleByMapSize1D()
tron
parents:
957
diff
changeset
|
129 |
|
4d2a20c50760
(svn r1706) Implement ScaleByMapSize() and ScaleByMapSize1D()
tron
parents:
957
diff
changeset
|
130 |
|
7546
c4f9132d9f1e
(svn r11066) -Documentation [FS#1091]: of map.*. Patch by Progman.
rubidium
parents:
7405
diff
changeset
|
131 |
/*! |
6540
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
132 |
* This function checks if we add addx/addy to tile, if we |
7546
c4f9132d9f1e
(svn r11066) -Documentation [FS#1091]: of map.*. Patch by Progman.
rubidium
parents:
7405
diff
changeset
|
133 |
* do wrap around the edges. For example, tile = (10,2) and |
c4f9132d9f1e
(svn r11066) -Documentation [FS#1091]: of map.*. Patch by Progman.
rubidium
parents:
7405
diff
changeset
|
134 |
* addx = +3 and addy = -4. This function will now return |
c4f9132d9f1e
(svn r11066) -Documentation [FS#1091]: of map.*. Patch by Progman.
rubidium
parents:
7405
diff
changeset
|
135 |
* INVALID_TILE, because the y is wrapped. This is needed in |
c4f9132d9f1e
(svn r11066) -Documentation [FS#1091]: of map.*. Patch by Progman.
rubidium
parents:
7405
diff
changeset
|
136 |
* for example, farmland. When the tile is not wrapped, |
c4f9132d9f1e
(svn r11066) -Documentation [FS#1091]: of map.*. Patch by Progman.
rubidium
parents:
7405
diff
changeset
|
137 |
* the result will be tile + TileDiffXY(addx, addy) |
c4f9132d9f1e
(svn r11066) -Documentation [FS#1091]: of map.*. Patch by Progman.
rubidium
parents:
7405
diff
changeset
|
138 |
* |
6540
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
139 |
* @param tile the 'starting' point of the adding |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
140 |
* @param addx the amount of tiles in the X direction to add |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
141 |
* @param addy the amount of tiles in the Y direction to add |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
142 |
* @return translated tile, or INVALID_TILE when it would've wrapped. |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
143 |
*/ |
8331
5514b3a1d52c
(svn r11897) -Fix: Replace an uint with TileIndex and a small coding style fix.
frosch
parents:
8139
diff
changeset
|
144 |
TileIndex TileAddWrap(TileIndex tile, int addx, int addy) |
1247 | 145 |
{ |
2548
49c8a096033f
(svn r3077) static, const, bracing, indentation, 0 -> '\0'/NULL, typos in comments, excess empty lines, minor other changes
tron
parents:
2482
diff
changeset
|
146 |
uint x = TileX(tile) + addx; |
49c8a096033f
(svn r3077) static, const, bracing, indentation, 0 -> '\0'/NULL, typos in comments, excess empty lines, minor other changes
tron
parents:
2482
diff
changeset
|
147 |
uint y = TileY(tile) + addy; |
1247 | 148 |
|
6201
bee01dc45e39
(svn r8987) -Cleanup: doxygen changes. Again. Mostly (still) @files missing tags and (more than just) a few comments style.
belugas
parents:
5609
diff
changeset
|
149 |
/* Are we about to wrap? */ |
1981 | 150 |
if (x < MapMaxX() && y < MapMaxY()) |
151 |
return tile + TileDiffXY(addx, addy); |
|
1247 | 152 |
|
153 |
return INVALID_TILE; |
|
154 |
} |
|
155 |
||
6540
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
156 |
/** 'Lookup table' for tile offsets given a DiagDirection */ |
5587
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
157 |
extern const TileIndexDiffC _tileoffs_by_diagdir[] = { |
6201
bee01dc45e39
(svn r8987) -Cleanup: doxygen changes. Again. Mostly (still) @files missing tags and (more than just) a few comments style.
belugas
parents:
5609
diff
changeset
|
158 |
{-1, 0}, ///< DIAGDIR_NE |
bee01dc45e39
(svn r8987) -Cleanup: doxygen changes. Again. Mostly (still) @files missing tags and (more than just) a few comments style.
belugas
parents:
5609
diff
changeset
|
159 |
{ 0, 1}, ///< DIAGDIR_SE |
bee01dc45e39
(svn r8987) -Cleanup: doxygen changes. Again. Mostly (still) @files missing tags and (more than just) a few comments style.
belugas
parents:
5609
diff
changeset
|
160 |
{ 1, 0}, ///< DIAGDIR_SW |
bee01dc45e39
(svn r8987) -Cleanup: doxygen changes. Again. Mostly (still) @files missing tags and (more than just) a few comments style.
belugas
parents:
5609
diff
changeset
|
161 |
{ 0, -1} ///< DIAGDIR_NW |
4559
aa0c13e39840
(svn r6406) -Codechange: Rename TileOffsByDir to TileOffsByDiagDir because it accepts
Darkvater
parents:
3717
diff
changeset
|
162 |
}; |
aa0c13e39840
(svn r6406) -Codechange: Rename TileOffsByDir to TileOffsByDiagDir because it accepts
Darkvater
parents:
3717
diff
changeset
|
163 |
|
6540
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
164 |
/** 'Lookup table' for tile offsets given a Direction */ |
5587
167d9a91ef02
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5584
diff
changeset
|
165 |
extern const TileIndexDiffC _tileoffs_by_dir[] = { |
6201
bee01dc45e39
(svn r8987) -Cleanup: doxygen changes. Again. Mostly (still) @files missing tags and (more than just) a few comments style.
belugas
parents:
5609
diff
changeset
|
166 |
{-1, -1}, ///< DIR_N |
bee01dc45e39
(svn r8987) -Cleanup: doxygen changes. Again. Mostly (still) @files missing tags and (more than just) a few comments style.
belugas
parents:
5609
diff
changeset
|
167 |
{-1, 0}, ///< DIR_NE |
bee01dc45e39
(svn r8987) -Cleanup: doxygen changes. Again. Mostly (still) @files missing tags and (more than just) a few comments style.
belugas
parents:
5609
diff
changeset
|
168 |
{-1, 1}, ///< DIR_E |
bee01dc45e39
(svn r8987) -Cleanup: doxygen changes. Again. Mostly (still) @files missing tags and (more than just) a few comments style.
belugas
parents:
5609
diff
changeset
|
169 |
{ 0, 1}, ///< DIR_SE |
bee01dc45e39
(svn r8987) -Cleanup: doxygen changes. Again. Mostly (still) @files missing tags and (more than just) a few comments style.
belugas
parents:
5609
diff
changeset
|
170 |
{ 1, 1}, ///< DIR_S |
bee01dc45e39
(svn r8987) -Cleanup: doxygen changes. Again. Mostly (still) @files missing tags and (more than just) a few comments style.
belugas
parents:
5609
diff
changeset
|
171 |
{ 1, 0}, ///< DIR_SW |
bee01dc45e39
(svn r8987) -Cleanup: doxygen changes. Again. Mostly (still) @files missing tags and (more than just) a few comments style.
belugas
parents:
5609
diff
changeset
|
172 |
{ 1, -1}, ///< DIR_W |
bee01dc45e39
(svn r8987) -Cleanup: doxygen changes. Again. Mostly (still) @files missing tags and (more than just) a few comments style.
belugas
parents:
5609
diff
changeset
|
173 |
{ 0, -1} ///< DIR_NW |
1247 | 174 |
}; |
175 |
||
7546
c4f9132d9f1e
(svn r11066) -Documentation [FS#1091]: of map.*. Patch by Progman.
rubidium
parents:
7405
diff
changeset
|
176 |
/*! |
6540
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
177 |
* Gets the Manhattan distance between the two given tiles. |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
178 |
* The Manhattan distance is the sum of the delta of both the |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
179 |
* X and Y component. |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
180 |
* Also known as L1-Norm |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
181 |
* @param t0 the start tile |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
182 |
* @param t1 the end tile |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
183 |
* @return the distance |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
184 |
*/ |
1245
3822f77cbc53
(svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents:
1244
diff
changeset
|
185 |
uint DistanceManhattan(TileIndex t0, TileIndex t1) |
3822f77cbc53
(svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents:
1244
diff
changeset
|
186 |
{ |
7970
7d6b9ab57081
(svn r11526) -Codechange: Rename the function delta fitting to the naming style
skidd13
parents:
7930
diff
changeset
|
187 |
const uint dx = Delta(TileX(t0), TileX(t1)); |
7d6b9ab57081
(svn r11526) -Codechange: Rename the function delta fitting to the naming style
skidd13
parents:
7930
diff
changeset
|
188 |
const uint dy = Delta(TileY(t0), TileY(t1)); |
1677
d534f0c8c845
(svn r2181) - Add: DistanceTrack() to calculate the distance over optimally laid out tracks.
matthijs
parents:
1410
diff
changeset
|
189 |
return dx + dy; |
1245
3822f77cbc53
(svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents:
1244
diff
changeset
|
190 |
} |
3822f77cbc53
(svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents:
1244
diff
changeset
|
191 |
|
3822f77cbc53
(svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents:
1244
diff
changeset
|
192 |
|
7546
c4f9132d9f1e
(svn r11066) -Documentation [FS#1091]: of map.*. Patch by Progman.
rubidium
parents:
7405
diff
changeset
|
193 |
/*! |
6540
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
194 |
* Gets the 'Square' distance between the two given tiles. |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
195 |
* The 'Square' distance is the square of the shortest (straight line) |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
196 |
* distance between the two tiles. |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
197 |
* Also known as euclidian- or L2-Norm squared. |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
198 |
* @param t0 the start tile |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
199 |
* @param t1 the end tile |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
200 |
* @return the distance |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
201 |
*/ |
1245
3822f77cbc53
(svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents:
1244
diff
changeset
|
202 |
uint DistanceSquare(TileIndex t0, TileIndex t1) |
3822f77cbc53
(svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents:
1244
diff
changeset
|
203 |
{ |
1677
d534f0c8c845
(svn r2181) - Add: DistanceTrack() to calculate the distance over optimally laid out tracks.
matthijs
parents:
1410
diff
changeset
|
204 |
const int dx = TileX(t0) - TileX(t1); |
d534f0c8c845
(svn r2181) - Add: DistanceTrack() to calculate the distance over optimally laid out tracks.
matthijs
parents:
1410
diff
changeset
|
205 |
const int dy = TileY(t0) - TileY(t1); |
d534f0c8c845
(svn r2181) - Add: DistanceTrack() to calculate the distance over optimally laid out tracks.
matthijs
parents:
1410
diff
changeset
|
206 |
return dx * dx + dy * dy; |
1245
3822f77cbc53
(svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents:
1244
diff
changeset
|
207 |
} |
3822f77cbc53
(svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents:
1244
diff
changeset
|
208 |
|
3822f77cbc53
(svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents:
1244
diff
changeset
|
209 |
|
7546
c4f9132d9f1e
(svn r11066) -Documentation [FS#1091]: of map.*. Patch by Progman.
rubidium
parents:
7405
diff
changeset
|
210 |
/*! |
6540
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
211 |
* Gets the biggest distance component (x or y) between the two given tiles. |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
212 |
* Also known as L-Infinity-Norm. |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
213 |
* @param t0 the start tile |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
214 |
* @param t1 the end tile |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
215 |
* @return the distance |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
216 |
*/ |
1245
3822f77cbc53
(svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents:
1244
diff
changeset
|
217 |
uint DistanceMax(TileIndex t0, TileIndex t1) |
3822f77cbc53
(svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents:
1244
diff
changeset
|
218 |
{ |
7970
7d6b9ab57081
(svn r11526) -Codechange: Rename the function delta fitting to the naming style
skidd13
parents:
7930
diff
changeset
|
219 |
const uint dx = Delta(TileX(t0), TileX(t1)); |
7d6b9ab57081
(svn r11526) -Codechange: Rename the function delta fitting to the naming style
skidd13
parents:
7930
diff
changeset
|
220 |
const uint dy = Delta(TileY(t0), TileY(t1)); |
7930
f12c2437a050
(svn r11483) -Codechange: Replace codeparts with functions that do the same to increase readability
skidd13
parents:
7546
diff
changeset
|
221 |
return max(dx, dy); |
1245
3822f77cbc53
(svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents:
1244
diff
changeset
|
222 |
} |
3822f77cbc53
(svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents:
1244
diff
changeset
|
223 |
|
3822f77cbc53
(svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents:
1244
diff
changeset
|
224 |
|
7546
c4f9132d9f1e
(svn r11066) -Documentation [FS#1091]: of map.*. Patch by Progman.
rubidium
parents:
7405
diff
changeset
|
225 |
/*! |
6540
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
226 |
* Gets the biggest distance component (x or y) between the two given tiles |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
227 |
* plus the Manhattan distance, i.e. two times the biggest distance component |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
228 |
* and once the smallest component. |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
229 |
* @param t0 the start tile |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
230 |
* @param t1 the end tile |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
231 |
* @return the distance |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
232 |
*/ |
1245
3822f77cbc53
(svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents:
1244
diff
changeset
|
233 |
uint DistanceMaxPlusManhattan(TileIndex t0, TileIndex t1) |
3822f77cbc53
(svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents:
1244
diff
changeset
|
234 |
{ |
7970
7d6b9ab57081
(svn r11526) -Codechange: Rename the function delta fitting to the naming style
skidd13
parents:
7930
diff
changeset
|
235 |
const uint dx = Delta(TileX(t0), TileX(t1)); |
7d6b9ab57081
(svn r11526) -Codechange: Rename the function delta fitting to the naming style
skidd13
parents:
7930
diff
changeset
|
236 |
const uint dy = Delta(TileY(t0), TileY(t1)); |
1677
d534f0c8c845
(svn r2181) - Add: DistanceTrack() to calculate the distance over optimally laid out tracks.
matthijs
parents:
1410
diff
changeset
|
237 |
return dx > dy ? 2 * dx + dy : 2 * dy + dx; |
1245
3822f77cbc53
(svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents:
1244
diff
changeset
|
238 |
} |
3822f77cbc53
(svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents:
1244
diff
changeset
|
239 |
|
7546
c4f9132d9f1e
(svn r11066) -Documentation [FS#1091]: of map.*. Patch by Progman.
rubidium
parents:
7405
diff
changeset
|
240 |
/*! |
6540
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
241 |
* Param the minimum distance to an edge |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
242 |
* @param tile the tile to get the distance from |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
243 |
* @return the distance from the edge in tiles |
d30795308feb
(svn r9729) -Documentation: add some documentation in various places
rubidium
parents:
6492
diff
changeset
|
244 |
*/ |
1245
3822f77cbc53
(svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents:
1244
diff
changeset
|
245 |
uint DistanceFromEdge(TileIndex tile) |
3822f77cbc53
(svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents:
1244
diff
changeset
|
246 |
{ |
3822f77cbc53
(svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents:
1244
diff
changeset
|
247 |
const uint xl = TileX(tile); |
3822f77cbc53
(svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents:
1244
diff
changeset
|
248 |
const uint yl = TileY(tile); |
3822f77cbc53
(svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents:
1244
diff
changeset
|
249 |
const uint xh = MapSizeX() - 1 - xl; |
3822f77cbc53
(svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents:
1244
diff
changeset
|
250 |
const uint yh = MapSizeY() - 1 - yl; |
7930
f12c2437a050
(svn r11483) -Codechange: Replace codeparts with functions that do the same to increase readability
skidd13
parents:
7546
diff
changeset
|
251 |
const uint minl = min(xl, yl); |
f12c2437a050
(svn r11483) -Codechange: Replace codeparts with functions that do the same to increase readability
skidd13
parents:
7546
diff
changeset
|
252 |
const uint minh = min(xh, yh); |
f12c2437a050
(svn r11483) -Codechange: Replace codeparts with functions that do the same to increase readability
skidd13
parents:
7546
diff
changeset
|
253 |
return min(minl, minh); |
1245
3822f77cbc53
(svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents:
1244
diff
changeset
|
254 |
} |
5118
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
255 |
|
7546
c4f9132d9f1e
(svn r11066) -Documentation [FS#1091]: of map.*. Patch by Progman.
rubidium
parents:
7405
diff
changeset
|
256 |
/*! |
5118
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
257 |
* Function performing a search around a center tile and going outward, thus in circle. |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
258 |
* Although it really is a square search... |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
259 |
* Every tile will be tested by means of the callback function proc, |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
260 |
* which will determine if yes or no the given tile meets criteria of search. |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
261 |
* @param tile to start the search from |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
262 |
* @param size: number of tiles per side of the desired search area |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
263 |
* @param proc: callback testing function pointer. |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
264 |
* @param data to be passed to the callback function. Depends on the implementation |
6201
bee01dc45e39
(svn r8987) -Cleanup: doxygen changes. Again. Mostly (still) @files missing tags and (more than just) a few comments style.
belugas
parents:
5609
diff
changeset
|
265 |
* @return result of the search |
5118
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
266 |
* @pre proc != NULL |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
267 |
* @pre size > 0 |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
268 |
*/ |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
269 |
bool CircularTileSearch(TileIndex tile, uint size, TestTileOnSearchProc proc, uint32 data) |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
270 |
{ |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
271 |
uint n, x, y; |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
272 |
DiagDirection dir; |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
273 |
|
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
274 |
assert(proc != NULL); |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
275 |
assert(size > 0); |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
276 |
|
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
277 |
x = TileX(tile); |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
278 |
y = TileY(tile); |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
279 |
|
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
280 |
if (size % 2 == 1) { |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
281 |
/* If the length of the side is uneven, the center has to be checked |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
282 |
* separately, as the pattern of uneven sides requires to go around the center */ |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
283 |
n = 2; |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
284 |
if (proc(TileXY(x, y), data)) return true; |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
285 |
|
7372
6fac48ff7c4d
(svn r10736) -Fix: Correct all mispellings of 'successful'.
peter1138
parents:
6540
diff
changeset
|
286 |
/* If tile test is not successful, get one tile down and left, |
5118
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
287 |
* ready for a test in first circle around center tile */ |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
288 |
x += _tileoffs_by_dir[DIR_W].x; |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
289 |
y += _tileoffs_by_dir[DIR_W].y; |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
290 |
} else { |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
291 |
n = 1; |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
292 |
/* To use _tileoffs_by_diagdir's order, we must relocate to |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
293 |
* another tile, as we now first go 'up', 'right', 'down', 'left' |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
294 |
* instead of 'right', 'down', 'left', 'up', which the calling |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
295 |
* function assume. */ |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
296 |
x++; |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
297 |
} |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
298 |
|
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
299 |
for (; n < size; n += 2) { |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
300 |
for (dir = DIAGDIR_NE; dir < DIAGDIR_END; dir++) { |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
301 |
uint j; |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
302 |
for (j = n; j != 0; j--) { |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
303 |
if (x <= MapMaxX() && y <= MapMaxY() && ///< Is the tile within the map? |
7372
6fac48ff7c4d
(svn r10736) -Fix: Correct all mispellings of 'successful'.
peter1138
parents:
6540
diff
changeset
|
304 |
proc(TileXY(x, y), data)) { ///< Is the callback successful? |
5118
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
305 |
return true; ///< then stop the search |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
306 |
} |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
307 |
|
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
308 |
/* Step to the next 'neighbour' in the circular line */ |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
309 |
x += _tileoffs_by_diagdir[dir].x; |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
310 |
y += _tileoffs_by_diagdir[dir].y; |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
311 |
} |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
312 |
} |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
313 |
/* Jump to next circle to test */ |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
314 |
x += _tileoffs_by_dir[DIR_W].x; |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
315 |
y += _tileoffs_by_dir[DIR_W].y; |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
316 |
} |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
317 |
return false; |
9640617e1abb
(svn r7198) -Codechange: Implement a circular tile search function.
belugas
parents:
4559
diff
changeset
|
318 |
} |