author | truebrain |
Fri, 18 Jul 2008 10:15:16 +0000 | |
branch | noai |
changeset 11168 | 3842648184cd |
parent 10955 | 56b381e5253f |
permissions | -rw-r--r-- |
9723 | 1 |
/* $Id$ */ |
2 |
||
3 |
/** @file slope_func.h Functions related to slopes. */ |
|
4 |
||
5 |
#ifndef SLOPE_FUNC_H |
|
6 |
#define SLOPE_FUNC_H |
|
7 |
||
8 |
#include "core/math_func.hpp" |
|
9 |
#include "slope_type.h" |
|
10 |
#include "direction_type.h" |
|
11 |
#include "tile_type.h" |
|
12 |
||
13 |
/** |
|
14 |
* Rangecheck for Corner enumeration. |
|
15 |
* |
|
16 |
* @param corner A #Corner. |
|
17 |
* @return true iff corner is in a valid range. |
|
18 |
*/ |
|
19 |
static inline bool IsValidCorner(Corner corner) |
|
20 |
{ |
|
21 |
return IsInsideMM(corner, 0, CORNER_END); |
|
22 |
} |
|
23 |
||
24 |
||
25 |
/** |
|
26 |
* Checks if a slope is steep. |
|
27 |
* |
|
28 |
* @param s The given #Slope. |
|
29 |
* @return True if the slope is steep, else false. |
|
30 |
*/ |
|
31 |
static inline bool IsSteepSlope(Slope s) |
|
32 |
{ |
|
33 |
return (s & SLOPE_STEEP) != 0; |
|
34 |
} |
|
35 |
||
36 |
/** |
|
37 |
* Checks for non-continuous slope on halftile foundations. |
|
38 |
* |
|
39 |
* @param s The given #Slope. |
|
40 |
* @return True if the slope is non-continuous, else false. |
|
41 |
*/ |
|
42 |
static inline bool IsHalftileSlope(Slope s) |
|
43 |
{ |
|
44 |
return (s & SLOPE_HALFTILE) != 0; |
|
45 |
} |
|
46 |
||
47 |
/** |
|
9724
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
48 |
* Removes a halftile slope from a slope |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
49 |
* |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
50 |
* Non-halftile slopes remain unmodified. |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
51 |
* |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
52 |
* @param s A #Slope. |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
53 |
* @return The slope s without it's halftile slope. |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
54 |
*/ |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
55 |
static inline Slope RemoveHalftileSlope(Slope s) |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
56 |
{ |
9869
6404afe43575
(svn r12597) [NoAI] -Sync: with trunk r12501:12596.
rubidium
parents:
9724
diff
changeset
|
57 |
return s & ~SLOPE_HALFTILE_MASK; |
9724
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
58 |
} |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
59 |
|
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
60 |
/** |
9723 | 61 |
* Return the complement of a slope. |
62 |
* |
|
63 |
* This method returns the complement of a slope. The complement of a |
|
64 |
* slope is a slope with raised corner which aren't raised in the given |
|
65 |
* slope. |
|
66 |
* |
|
67 |
* @pre The slope must neither be steep nor a halftile slope. |
|
68 |
* @param s The #Slope to get the complement. |
|
69 |
* @return a complement Slope of the given slope. |
|
70 |
*/ |
|
71 |
static inline Slope ComplementSlope(Slope s) |
|
72 |
{ |
|
73 |
assert(!IsSteepSlope(s) && !IsHalftileSlope(s)); |
|
9869
6404afe43575
(svn r12597) [NoAI] -Sync: with trunk r12501:12596.
rubidium
parents:
9724
diff
changeset
|
74 |
return s ^ SLOPE_ELEVATED; |
9723 | 75 |
} |
76 |
||
77 |
/** |
|
9724
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
78 |
* Tests if a specific slope has exactly one corner raised. |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
79 |
* |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
80 |
* @param s The #Slope |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
81 |
* @return true iff exactly one corner is raised |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
82 |
*/ |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
83 |
static inline bool IsSlopeWithOneCornerRaised(Slope s) |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
84 |
{ |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
85 |
return (s == SLOPE_W) || (s == SLOPE_S) || (s == SLOPE_E) || (s == SLOPE_N); |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
86 |
} |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
87 |
|
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
88 |
/** |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
89 |
* Returns the slope with a specific corner raised. |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
90 |
* |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
91 |
* @param corner The #Corner. |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
92 |
* @return The #Slope with corner "corner" raised. |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
93 |
*/ |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
94 |
static inline Slope SlopeWithOneCornerRaised(Corner corner) |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
95 |
{ |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
96 |
assert(IsValidCorner(corner)); |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
97 |
return (Slope)(1 << corner); |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
98 |
} |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
99 |
|
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
100 |
/** |
9723 | 101 |
* Tests if a slope has a highest corner (i.e. one corner raised or a steep slope). |
102 |
* |
|
103 |
* Note: A halftile slope is ignored. |
|
104 |
* |
|
105 |
* @param s The #Slope. |
|
106 |
* @return true iff the slope has a highest corner. |
|
107 |
*/ |
|
108 |
static inline bool HasSlopeHighestCorner(Slope s) |
|
109 |
{ |
|
9724
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
110 |
s = RemoveHalftileSlope(s); |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
111 |
return IsSteepSlope(s) || IsSlopeWithOneCornerRaised(s); |
9723 | 112 |
} |
113 |
||
114 |
/** |
|
115 |
* Returns the highest corner of a slope (one corner raised or a steep slope). |
|
116 |
* |
|
117 |
* @pre The slope must be a slope with one corner raised or a steep slope. A halftile slope is ignored. |
|
118 |
* @param s The #Slope. |
|
119 |
* @return Highest corner. |
|
120 |
*/ |
|
121 |
static inline Corner GetHighestSlopeCorner(Slope s) |
|
122 |
{ |
|
9724
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
123 |
switch (RemoveHalftileSlope(s)) { |
9723 | 124 |
case SLOPE_W: |
125 |
case SLOPE_STEEP_W: return CORNER_W; |
|
126 |
case SLOPE_S: |
|
127 |
case SLOPE_STEEP_S: return CORNER_S; |
|
128 |
case SLOPE_E: |
|
129 |
case SLOPE_STEEP_E: return CORNER_E; |
|
130 |
case SLOPE_N: |
|
131 |
case SLOPE_STEEP_N: return CORNER_N; |
|
132 |
default: NOT_REACHED(); |
|
133 |
} |
|
134 |
} |
|
135 |
||
136 |
/** |
|
137 |
* Returns the leveled halftile of a halftile slope. |
|
138 |
* |
|
139 |
* @pre The slope must be a halftile slope. |
|
140 |
* @param s The #Slope. |
|
141 |
* @return The corner of the leveled halftile. |
|
142 |
*/ |
|
143 |
static inline Corner GetHalftileSlopeCorner(Slope s) |
|
144 |
{ |
|
145 |
assert(IsHalftileSlope(s)); |
|
146 |
return (Corner)((s >> 6) & 3); |
|
147 |
} |
|
148 |
||
149 |
/** |
|
150 |
* Returns the height of the highest corner of a slope relative to TileZ (= minimal height) |
|
151 |
* |
|
152 |
* @param s The #Slope. |
|
153 |
* @return Relative height of highest corner. |
|
154 |
*/ |
|
155 |
static inline uint GetSlopeMaxZ(Slope s) |
|
156 |
{ |
|
157 |
if (s == SLOPE_FLAT) return 0; |
|
158 |
if (IsSteepSlope(s)) return 2 * TILE_HEIGHT; |
|
159 |
return TILE_HEIGHT; |
|
160 |
} |
|
161 |
||
162 |
/** |
|
163 |
* Returns the opposite corner. |
|
164 |
* |
|
165 |
* @param corner A #Corner. |
|
166 |
* @return The opposite corner to "corner". |
|
167 |
*/ |
|
168 |
static inline Corner OppositeCorner(Corner corner) |
|
169 |
{ |
|
170 |
return (Corner)(corner ^ 2); |
|
171 |
} |
|
172 |
||
173 |
/** |
|
9724
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
174 |
* Tests if a specific slope has exactly three corners raised. |
9723 | 175 |
* |
9724
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
176 |
* @param s The #Slope |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
177 |
* @return true iff exactly three corners are raised |
9723 | 178 |
*/ |
9724
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
179 |
static inline bool IsSlopeWithThreeCornersRaised(Slope s) |
9723 | 180 |
{ |
9724
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
181 |
return !IsHalftileSlope(s) && !IsSteepSlope(s) && IsSlopeWithOneCornerRaised(ComplementSlope(s)); |
9723 | 182 |
} |
183 |
||
184 |
/** |
|
185 |
* Returns the slope with all except one corner raised. |
|
186 |
* |
|
187 |
* @param corner The #Corner. |
|
188 |
* @return The #Slope with all corners but "corner" raised. |
|
189 |
*/ |
|
190 |
static inline Slope SlopeWithThreeCornersRaised(Corner corner) |
|
191 |
{ |
|
192 |
return ComplementSlope(SlopeWithOneCornerRaised(corner)); |
|
193 |
} |
|
194 |
||
195 |
/** |
|
9724
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
196 |
* Returns a specific steep slope |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
197 |
* |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
198 |
* @param corner A #Corner. |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
199 |
* @return The steep #Slope with "corner" as highest corner. |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
200 |
*/ |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
201 |
static inline Slope SteepSlope(Corner corner) |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
202 |
{ |
9869
6404afe43575
(svn r12597) [NoAI] -Sync: with trunk r12501:12596.
rubidium
parents:
9724
diff
changeset
|
203 |
return SLOPE_STEEP | SlopeWithThreeCornersRaised(OppositeCorner(corner)); |
9724
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
204 |
} |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
205 |
|
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
206 |
/** |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
207 |
* Tests if a specific slope is an inclined slope. |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
208 |
* |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
209 |
* @param s The #Slope |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
210 |
* @return true iff the slope is inclined. |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
211 |
*/ |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
212 |
static inline bool IsInclinedSlope(Slope s) |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
213 |
{ |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
214 |
return (s == SLOPE_NW) || (s == SLOPE_SW) || (s == SLOPE_SE) || (s == SLOPE_NE); |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
215 |
} |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
216 |
|
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
217 |
/** |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
218 |
* Returns the direction of an inclined slope. |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
219 |
* |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
220 |
* @param s A #Slope |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
221 |
* @return The direction the slope goes up in. Or INVALID_DIAGDIR if the slope is not an inclined slope. |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
222 |
*/ |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
223 |
static inline DiagDirection GetInclinedSlopeDirection(Slope s) |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
224 |
{ |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
225 |
switch (s) { |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
226 |
case SLOPE_NE: return DIAGDIR_NE; |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
227 |
case SLOPE_SE: return DIAGDIR_SE; |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
228 |
case SLOPE_SW: return DIAGDIR_SW; |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
229 |
case SLOPE_NW: return DIAGDIR_NW; |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
230 |
default: return INVALID_DIAGDIR; |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
231 |
} |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
232 |
} |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
233 |
|
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
234 |
/** |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
235 |
* Returns the slope, that is inclined in a specific direction. |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
236 |
* |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
237 |
* @param dir A #DiagDirection |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
238 |
* @return The #Slope that goes up in direction dir. |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
239 |
*/ |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
240 |
static inline Slope InclinedSlope(DiagDirection dir) |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
241 |
{ |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
242 |
switch (dir) { |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
243 |
case DIAGDIR_NE: return SLOPE_NE; |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
244 |
case DIAGDIR_SE: return SLOPE_SE; |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
245 |
case DIAGDIR_SW: return SLOPE_SW; |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
246 |
case DIAGDIR_NW: return SLOPE_NW; |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
247 |
default: NOT_REACHED(); |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
248 |
} |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
249 |
} |
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
250 |
|
b39bc69bb2f2
(svn r12051) [NoAI] -Sync: with trunk (r11795:12050).
rubidium
parents:
9723
diff
changeset
|
251 |
/** |
9723 | 252 |
* Adds a halftile slope to a slope. |
253 |
* |
|
254 |
* @param s #Slope without a halftile slope. |
|
255 |
* @param corner The #Corner of the halftile. |
|
256 |
* @return The #Slope s with the halftile slope added. |
|
257 |
*/ |
|
258 |
static inline Slope HalftileSlope(Slope s, Corner corner) |
|
259 |
{ |
|
260 |
assert(IsValidCorner(corner)); |
|
261 |
return (Slope)(s | SLOPE_HALFTILE | (corner << 6)); |
|
262 |
} |
|
263 |
||
264 |
||
265 |
/** |
|
266 |
* Tests for FOUNDATION_NONE. |
|
267 |
* |
|
268 |
* @param f Maybe a #Foundation. |
|
269 |
* @return true iff f is a foundation. |
|
270 |
*/ |
|
271 |
static inline bool IsFoundation(Foundation f) |
|
272 |
{ |
|
273 |
return f != FOUNDATION_NONE; |
|
274 |
} |
|
275 |
||
276 |
/** |
|
277 |
* Tests if the foundation is a leveled foundation. |
|
278 |
* |
|
279 |
* @param f The #Foundation. |
|
280 |
* @return true iff f is a leveled foundation. |
|
281 |
*/ |
|
282 |
static inline bool IsLeveledFoundation(Foundation f) |
|
283 |
{ |
|
284 |
return f == FOUNDATION_LEVELED; |
|
285 |
} |
|
286 |
||
287 |
/** |
|
288 |
* Tests if the foundation is an inclined foundation. |
|
289 |
* |
|
290 |
* @param f The #Foundation. |
|
291 |
* @return true iff f is an inclined foundation. |
|
292 |
*/ |
|
293 |
static inline bool IsInclinedFoundation(Foundation f) |
|
294 |
{ |
|
295 |
return (f == FOUNDATION_INCLINED_X) || (f == FOUNDATION_INCLINED_Y); |
|
296 |
} |
|
297 |
||
298 |
/** |
|
299 |
* Tests if a foundation is a non-continuous foundation, i.e. halftile-foundation or FOUNDATION_STEEP_BOTH. |
|
300 |
* |
|
301 |
* @param f The #Foundation. |
|
302 |
* @return true iff f is a non-continuous foundation |
|
303 |
*/ |
|
304 |
static inline bool IsNonContinuousFoundation(Foundation f) |
|
305 |
{ |
|
306 |
return IsInsideMM(f, FOUNDATION_STEEP_BOTH, FOUNDATION_HALFTILE_N + 1); |
|
307 |
} |
|
308 |
||
309 |
/** |
|
310 |
* Returns the halftile corner of a halftile-foundation |
|
311 |
* |
|
312 |
* @pre f != FOUNDATION_STEEP_BOTH |
|
313 |
* |
|
314 |
* @param f The #Foundation. |
|
315 |
* @return The #Corner with track. |
|
316 |
*/ |
|
317 |
static inline Corner GetHalftileFoundationCorner(Foundation f) |
|
318 |
{ |
|
319 |
assert(IsInsideMM(f, FOUNDATION_HALFTILE_W, FOUNDATION_HALFTILE_N + 1)); |
|
320 |
return (Corner)(f - FOUNDATION_HALFTILE_W); |
|
321 |
} |
|
322 |
||
323 |
/** |
|
324 |
* Tests if a foundation is a special rail foundation for single horizontal/vertical track. |
|
325 |
* |
|
326 |
* @param f The #Foundation. |
|
327 |
* @return true iff f is a special rail foundation for single horizontal/vertical track. |
|
328 |
*/ |
|
329 |
static inline bool IsSpecialRailFoundation(Foundation f) |
|
330 |
{ |
|
331 |
return IsInsideMM(f, FOUNDATION_RAIL_W, FOUNDATION_RAIL_N + 1); |
|
332 |
} |
|
333 |
||
334 |
/** |
|
335 |
* Returns the track corner of a special rail foundation |
|
336 |
* |
|
337 |
* @param f The #Foundation. |
|
338 |
* @return The #Corner with track. |
|
339 |
*/ |
|
340 |
static inline Corner GetRailFoundationCorner(Foundation f) |
|
341 |
{ |
|
342 |
assert(IsSpecialRailFoundation(f)); |
|
343 |
return (Corner)(f - FOUNDATION_RAIL_W); |
|
344 |
} |
|
345 |
||
346 |
/** |
|
347 |
* Returns the foundation needed to flatten a slope. |
|
348 |
* The returned foundation is either FOUNDATION_NONE if the tile was already flat, or FOUNDATION_LEVELED. |
|
349 |
* |
|
350 |
* @param s The current #Slope. |
|
351 |
* @return The needed #Foundation. |
|
352 |
*/ |
|
353 |
static inline Foundation FlatteningFoundation(Slope s) |
|
354 |
{ |
|
355 |
return (s == SLOPE_FLAT ? FOUNDATION_NONE : FOUNDATION_LEVELED); |
|
356 |
} |
|
357 |
||
358 |
/** |
|
359 |
* Returns the along a specific axis inclined foundation. |
|
360 |
* |
|
361 |
* @param axis The #Axis. |
|
362 |
* @return The needed #Foundation. |
|
363 |
*/ |
|
364 |
static inline Foundation InclinedFoundation(Axis axis) |
|
365 |
{ |
|
366 |
return (axis == AXIS_X ? FOUNDATION_INCLINED_X : FOUNDATION_INCLINED_Y); |
|
367 |
} |
|
368 |
||
369 |
/** |
|
370 |
* Returns the halftile foundation for single horizontal/vertical track. |
|
371 |
* |
|
372 |
* @param corner The #Corner with the track. |
|
373 |
* @return The wanted #Foundation. |
|
374 |
*/ |
|
375 |
static inline Foundation HalftileFoundation(Corner corner) |
|
376 |
{ |
|
377 |
assert(IsValidCorner(corner)); |
|
378 |
return (Foundation)(FOUNDATION_HALFTILE_W + corner); |
|
379 |
} |
|
380 |
||
381 |
/** |
|
382 |
* Returns the special rail foundation for single horizontal/vertical track. |
|
383 |
* |
|
384 |
* @param corner The #Corner with the track. |
|
385 |
* @return The wanted #Foundation. |
|
386 |
*/ |
|
387 |
static inline Foundation SpecialRailFoundation(Corner corner) |
|
388 |
{ |
|
389 |
assert(IsValidCorner(corner)); |
|
390 |
return (Foundation)(FOUNDATION_RAIL_W + corner); |
|
391 |
} |
|
392 |
||
393 |
#endif /* SLOPE_FUNC_H */ |