~ubuntu-branches/debian/squeeze/openttd/squeeze

« back to all changes in this revision

Viewing changes to src/road_map.h

  • Committer: Bazaar Package Importer
  • Author(s): Jordi Mallach, Matthijs Kooijman, Jordi Mallach
  • Date: 2009-04-15 18:22:10 UTC
  • mfrom: (1.1.6 upstream) (2.1.3 squeeze)
  • Revision ID: james.westby@ubuntu.com-20090415182210-22ktb8kdbp2tf3bm
[ Matthijs Kooijman ]
* New upstream release.
* Remove Debian specific desktop file, upstream provides one now. 
* Add debian/watch file.

[ Jordi Mallach ]
* Bump Standards-Version to 3.8.1, with no changes required.
* Move to debhelper compat 7. Bump Build-Depends accordingly.
* Use dh_prep.
* Add "set -e" to config script.
* Remove a few extra doc files that get installed by upstream Makefile.
* Add more complete copyright information.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* $Id: road_map.h 12390 2008-03-22 10:56:08Z rubidium $ */
 
1
/* $Id: road_map.h 15711 2009-03-14 18:16:29Z rubidium $ */
2
2
 
3
 
/** @file road_map.h */
 
3
/** @file road_map.h Map accessors for roads. */
4
4
 
5
5
#ifndef ROAD_MAP_H
6
6
#define ROAD_MAP_H
59
59
        assert(IsNormalRoad(t));
60
60
        switch (rt) {
61
61
                default: NOT_REACHED();
62
 
                case ROADTYPE_ROAD: return (RoadBits)GB(_m[t].m4, 0, 4);
63
 
                case ROADTYPE_TRAM: return (RoadBits)GB(_m[t].m4, 4, 4);
64
 
                case ROADTYPE_HWAY: return (RoadBits)GB(_m[t].m6, 2, 4);
 
62
                case ROADTYPE_ROAD: return (RoadBits)GB(_m[t].m5, 0, 4);
 
63
                case ROADTYPE_TRAM: return (RoadBits)GB(_m[t].m3, 0, 4);
65
64
        }
66
65
}
67
66
 
 
67
/**
 
68
 * Get all RoadBits set on a tile except from the given RoadType
 
69
 *
 
70
 * @param t The tile from which we want to get the RoadBits
 
71
 * @param rt The RoadType which we exclude from the querry
 
72
 * @return all set RoadBits of the tile which are not from the given RoadType
 
73
 */
 
74
static inline RoadBits GetOtherRoadBits(TileIndex t, RoadType rt)
 
75
{
 
76
        return GetRoadBits(t, rt == ROADTYPE_ROAD ? ROADTYPE_TRAM : ROADTYPE_ROAD);
 
77
}
 
78
 
 
79
/**
 
80
 * Get all set RoadBits on the given tile
 
81
 *
 
82
 * @param tile The tile from which we want to get the RoadBits
 
83
 * @return all set RoadBits of the tile
 
84
 */
68
85
static inline RoadBits GetAllRoadBits(TileIndex tile)
69
86
{
70
 
        return GetRoadBits(tile, ROADTYPE_ROAD) | GetRoadBits(tile, ROADTYPE_TRAM) | GetRoadBits(tile, ROADTYPE_HWAY);
 
87
        return GetRoadBits(tile, ROADTYPE_ROAD) | GetRoadBits(tile, ROADTYPE_TRAM);
71
88
}
72
89
 
73
90
static inline void SetRoadBits(TileIndex t, RoadBits r, RoadType rt)
75
92
        assert(IsNormalRoad(t)); // XXX incomplete
76
93
        switch (rt) {
77
94
                default: NOT_REACHED();
78
 
                case ROADTYPE_ROAD: SB(_m[t].m4, 0, 4, r); break;
79
 
                case ROADTYPE_TRAM: SB(_m[t].m4, 4, 4, r); break;
80
 
                case ROADTYPE_HWAY: SB(_m[t].m6, 2, 4, r); break;
 
95
                case ROADTYPE_ROAD: SB(_m[t].m5, 0, 4, r); break;
 
96
                case ROADTYPE_TRAM: SB(_m[t].m3, 0, 4, r); break;
81
97
        }
82
98
}
83
99
 
84
100
static inline RoadTypes GetRoadTypes(TileIndex t)
85
101
{
86
 
        if (IsTileType(t, MP_ROAD)) {
87
 
                return (RoadTypes)GB(_me[t].m7, 5, 3);
88
 
        } else {
89
 
                return (RoadTypes)GB(_m[t].m3, 0, 3);
90
 
        }
 
102
        return (RoadTypes)GB(_me[t].m7, 6, 2);
91
103
}
92
104
 
93
105
static inline void SetRoadTypes(TileIndex t, RoadTypes rt)
94
106
{
95
 
        if (IsTileType(t, MP_ROAD)) {
96
 
                SB(_me[t].m7, 5, 3, rt);
97
 
        } else {
98
 
                assert(IsTileType(t, MP_STATION) || IsTileType(t, MP_TUNNELBRIDGE));
99
 
                SB(_m[t].m3, 0, 2, rt);
100
 
        }
 
107
        assert(IsTileType(t, MP_ROAD) || IsTileType(t, MP_STATION) || IsTileType(t, MP_TUNNELBRIDGE));
 
108
        SB(_me[t].m7, 6, 2, rt);
101
109
}
102
110
 
103
111
static inline bool HasTileRoadType(TileIndex t, RoadType rt)
107
115
 
108
116
static inline Owner GetRoadOwner(TileIndex t, RoadType rt)
109
117
{
110
 
        if (!IsTileType(t, MP_ROAD)) return GetTileOwner(t);
111
 
 
112
 
        switch (GetRoadTileType(t)) {
 
118
        switch (rt) {
113
119
                default: NOT_REACHED();
114
 
                case ROAD_TILE_NORMAL:
115
 
                        switch (rt) {
116
 
                                default: NOT_REACHED();
117
 
                                case ROADTYPE_ROAD: return (Owner)GB( _m[t].m1, 0, 5);
118
 
                                case ROADTYPE_TRAM: {
119
 
                                        /* Trams don't need OWNER_TOWN, and remapping OWNER_NONE
120
 
                                         * to OWNER_TOWN makes it use one bit less */
121
 
                                        Owner o = (Owner)GB( _m[t].m5, 0, 4);
122
 
                                        return o == OWNER_TOWN ? OWNER_NONE : o;
123
 
                                }
124
 
                                case ROADTYPE_HWAY: return (Owner)GB(_me[t].m7, 0, 5);
125
 
                        }
126
 
                case ROAD_TILE_CROSSING:
127
 
                        switch (rt) {
128
 
                                default: NOT_REACHED();
129
 
                                case ROADTYPE_ROAD: return (Owner)GB( _m[t].m4, 0, 5);
130
 
                                case ROADTYPE_TRAM: {
131
 
                                        /* Trams don't need OWNER_TOWN, and remapping OWNER_NONE
132
 
                                         * to OWNER_TOWN makes it use one bit less */
133
 
                                        Owner o = (Owner)GB( _m[t].m5, 0, 4);
134
 
                                        return o == OWNER_TOWN ? OWNER_NONE : o;
135
 
                                }
136
 
                                case ROADTYPE_HWAY: return (Owner)GB(_me[t].m7, 0, 5);
137
 
                        }
138
 
                case ROAD_TILE_DEPOT: return GetTileOwner(t);
 
120
                case ROADTYPE_ROAD: return (Owner)GB(IsNormalRoadTile(t) ? _m[t].m1 : _me[t].m7, 0, 5);
 
121
                case ROADTYPE_TRAM: {
 
122
                        /* Trams don't need OWNER_TOWN, and remapping OWNER_NONE
 
123
                         * to OWNER_TOWN makes it use one bit less */
 
124
                        Owner o = (Owner)GB(_m[t].m3, 4, 4);
 
125
                        return o == OWNER_TOWN ? OWNER_NONE : o;
 
126
                }
139
127
        }
140
128
}
141
129
 
142
130
static inline void SetRoadOwner(TileIndex t, RoadType rt, Owner o)
143
131
{
144
 
        if (!IsTileType(t, MP_ROAD)) return SetTileOwner(t, o);
145
 
 
146
 
        switch (GetRoadTileType(t)) {
 
132
        switch (rt) {
147
133
                default: NOT_REACHED();
148
 
                case ROAD_TILE_NORMAL:
149
 
                        switch (rt) {
150
 
                                default: NOT_REACHED();
151
 
                                case ROADTYPE_ROAD: SB( _m[t].m1, 0, 5, o); break;
152
 
                                case ROADTYPE_TRAM: SB( _m[t].m5, 0, 4, o == OWNER_NONE ? OWNER_TOWN : o); break;
153
 
                                case ROADTYPE_HWAY: SB(_me[t].m7, 0, 5, o); break;
154
 
                        }
155
 
                        break;
156
 
                case ROAD_TILE_CROSSING:
157
 
                        switch (rt) {
158
 
                                default: NOT_REACHED();
159
 
                                case ROADTYPE_ROAD: SB( _m[t].m4, 0, 5, o); break;
160
 
                                /* Trams don't need OWNER_TOWN, and remapping OWNER_NONE
161
 
                                 * to OWNER_TOWN makes it use one bit less */
162
 
                                case ROADTYPE_TRAM: SB( _m[t].m5, 0, 4, o == OWNER_NONE ? OWNER_TOWN : o); break;
163
 
                                case ROADTYPE_HWAY: SB(_me[t].m7, 0, 5, o); break;
164
 
                        }
165
 
                        break;
166
 
                case ROAD_TILE_DEPOT: return SetTileOwner(t, o);
 
134
                case ROADTYPE_ROAD: SB(IsNormalRoadTile(t) ? _m[t].m1 : _me[t].m7, 0, 5, o); break;
 
135
                case ROADTYPE_TRAM: SB(_m[t].m3, 4, 4, o == OWNER_NONE ? OWNER_TOWN : o); break;
167
136
        }
168
137
}
169
138
 
 
139
static inline bool IsRoadOwner(TileIndex t, RoadType rt, Owner o)
 
140
{
 
141
        assert(HasTileRoadType(t, rt));
 
142
        return (GetRoadOwner(t, rt) == o);
 
143
}
 
144
 
 
145
/** Checks if given tile has town owned road
 
146
 * @param t tile to check
 
147
 * @return true iff tile has road and the road is owned by a town
 
148
 * @pre IsTileType(t, MP_ROAD)
 
149
 */
 
150
static inline bool HasTownOwnedRoad(TileIndex t)
 
151
{
 
152
        return HasTileRoadType(t, ROADTYPE_ROAD) && IsRoadOwner(t, ROADTYPE_ROAD, OWNER_TOWN);
 
153
}
 
154
 
170
155
/** Which directions are disallowed ? */
171
156
enum DisallowedRoadDirections {
172
157
        DRD_NONE,       ///< None of the directions are disallowed
203
188
static inline Axis GetCrossingRoadAxis(TileIndex t)
204
189
{
205
190
        assert(IsLevelCrossing(t));
206
 
        return (Axis)GB(_m[t].m4, 6, 1);
 
191
        return (Axis)GB(_m[t].m5, 0, 1);
207
192
}
208
193
 
209
194
static inline Axis GetCrossingRailAxis(TileIndex t)
227
212
        return AxisToTrackBits(GetCrossingRailAxis(tile));
228
213
}
229
214
 
 
215
 
 
216
/**
 
217
 * Get the reservation state of the rail crossing
 
218
 * @pre IsLevelCrossingTile(t)
 
219
 * @param t the crossing tile
 
220
 * @return reservation state
 
221
 */
 
222
static inline bool GetCrossingReservation(TileIndex t)
 
223
{
 
224
        assert(IsLevelCrossingTile(t));
 
225
        return HasBit(_m[t].m5, 4);
 
226
}
 
227
 
 
228
/**
 
229
 * Set the reservation state of the rail crossing
 
230
 * @note Works for both waypoints and rail depots
 
231
 * @pre IsLevelCrossingTile(t)
 
232
 * @param t the crossing tile
 
233
 * @param b the reservation state
 
234
 */
 
235
static inline void SetCrossingReservation(TileIndex t, bool b)
 
236
{
 
237
        assert(IsLevelCrossingTile(t));
 
238
        SB(_m[t].m5, 4, 1, b ? 1 : 0);
 
239
}
 
240
 
 
241
/**
 
242
 * Get the reserved track bits for a rail crossing
 
243
 * @pre IsLevelCrossingTile(t)
 
244
 * @param t the tile
 
245
 * @return reserved track bits
 
246
 */
 
247
static inline TrackBits GetRailCrossingReservation(TileIndex t)
 
248
{
 
249
        return GetCrossingReservation(t) ? GetCrossingRailBits(t) : TRACK_BIT_NONE;
 
250
}
 
251
 
230
252
static inline bool IsCrossingBarred(TileIndex t)
231
253
{
232
254
        assert(IsLevelCrossing(t));
233
 
        return HasBit(_m[t].m4, 5);
 
255
        return HasBit(_m[t].m5, 5);
234
256
}
235
257
 
236
258
static inline void SetCrossingBarred(TileIndex t, bool barred)
237
259
{
238
260
        assert(IsLevelCrossing(t));
239
 
        SB(_m[t].m4, 5, 1, barred);
 
261
        SB(_m[t].m5, 5, 1, barred ? 1 : 0);
240
262
}
241
263
 
242
264
static inline void UnbarCrossing(TileIndex t)
252
274
#define IsOnDesert IsOnSnow
253
275
static inline bool IsOnSnow(TileIndex t)
254
276
{
255
 
        return HasBit(_m[t].m3, 7);
 
277
        return HasBit(_me[t].m7, 5);
256
278
}
257
279
 
258
280
#define ToggleDesert ToggleSnow
259
281
static inline void ToggleSnow(TileIndex t)
260
282
{
261
 
        ToggleBit(_m[t].m3, 7);
 
283
        ToggleBit(_me[t].m7, 5);
262
284
}
263
285
 
264
286
 
274
296
 
275
297
static inline Roadside GetRoadside(TileIndex tile)
276
298
{
277
 
        return (Roadside)GB(_m[tile].m3, 4, 3);
 
299
        return (Roadside)GB(_m[tile].m6, 3, 3);
278
300
}
279
301
 
280
302
static inline void SetRoadside(TileIndex tile, Roadside s)
281
303
{
282
 
        SB(_m[tile].m3, 4, 3, s);
 
304
        SB(_m[tile].m6, 3, 3, s);
283
305
}
284
306
 
285
307
static inline bool HasRoadWorks(TileIndex t)
289
311
 
290
312
static inline bool IncreaseRoadWorksCounter(TileIndex t)
291
313
{
292
 
        AB(_m[t].m3, 0, 4, 1);
 
314
        AB(_me[t].m7, 0, 4, 1);
293
315
 
294
 
        return GB(_m[t].m3, 0, 4) == 15;
 
316
        return GB(_me[t].m7, 0, 4) == 15;
295
317
}
296
318
 
297
319
static inline void StartRoadWorks(TileIndex t)
310
332
        assert(HasRoadWorks(t));
311
333
        SetRoadside(t, (Roadside)(GetRoadside(t) - ROADSIDE_GRASS_ROAD_WORKS + ROADSIDE_GRASS));
312
334
        /* Stop the counter */
313
 
        SB(_m[t].m3, 0, 4, 0);
 
335
        SB(_me[t].m7, 0, 4, 0);
314
336
}
315
337
 
316
338
 
360
382
bool IsPossibleCrossing(const TileIndex tile, Axis ax);
361
383
 
362
384
 
363
 
static inline void MakeRoadNormal(TileIndex t, RoadBits bits, RoadTypes rot, TownID town, Owner road, Owner tram, Owner hway)
 
385
static inline void MakeRoadNormal(TileIndex t, RoadBits bits, RoadTypes rot, TownID town, Owner road, Owner tram)
364
386
{
365
387
        SetTileType(t, MP_ROAD);
366
388
        SetTileOwner(t, road);
367
389
        _m[t].m2 = town;
368
 
        _m[t].m3 = 0;
369
 
        _m[t].m4 = (HasBit(rot, ROADTYPE_TRAM) ? bits : 0) << 4 | (HasBit(rot, ROADTYPE_ROAD) ? bits : 0);
370
 
        _m[t].m5 = ROAD_TILE_NORMAL << 6;
 
390
        _m[t].m3 = (HasBit(rot, ROADTYPE_TRAM) ? bits : 0);
 
391
        _m[t].m4 = 0;
 
392
        _m[t].m5 = (HasBit(rot, ROADTYPE_ROAD) ? bits : 0) | ROAD_TILE_NORMAL << 6;
 
393
        SB(_m[t].m6, 2, 4, 0);
 
394
        _me[t].m7 = rot << 6;
371
395
        SetRoadOwner(t, ROADTYPE_TRAM, tram);
372
 
        SB(_m[t].m6, 2, 4, HasBit(rot, ROADTYPE_HWAY) ? bits : 0);
373
 
        _me[t].m7 = rot << 5 | hway;
374
396
}
375
397
 
376
398
 
377
 
static inline void MakeRoadCrossing(TileIndex t, Owner road, Owner tram, Owner hway, Owner rail, Axis roaddir, RailType rat, RoadTypes rot, uint town)
 
399
static inline void MakeRoadCrossing(TileIndex t, Owner road, Owner tram, Owner rail, Axis roaddir, RailType rat, RoadTypes rot, uint town)
378
400
{
379
401
        SetTileType(t, MP_ROAD);
380
402
        SetTileOwner(t, rail);
381
403
        _m[t].m2 = town;
382
404
        _m[t].m3 = rat;
383
 
        _m[t].m4 = roaddir << 6 | road;
384
 
        _m[t].m5 = ROAD_TILE_CROSSING << 6;
 
405
        _m[t].m4 = 0;
 
406
        _m[t].m5 = ROAD_TILE_CROSSING << 6 | roaddir;
 
407
        SB(_m[t].m6, 2, 4, 0);
 
408
        _me[t].m7 = rot << 6 | road;
385
409
        SetRoadOwner(t, ROADTYPE_TRAM, tram);
386
 
        SB(_m[t].m6, 2, 4, 0);
387
 
        _me[t].m7 = rot << 5 | hway;
388
410
}
389
411
 
390
412
 
391
 
static inline void MakeRoadDepot(TileIndex t, Owner owner, DiagDirection dir, RoadType rt)
 
413
static inline void MakeRoadDepot(TileIndex t, Owner owner, DiagDirection dir, RoadType rt, TownID town)
392
414
{
393
415
        SetTileType(t, MP_ROAD);
394
416
        SetTileOwner(t, owner);
395
 
        _m[t].m2 = 0;
 
417
        _m[t].m2 = town;
396
418
        _m[t].m3 = 0;
397
419
        _m[t].m4 = 0;
398
420
        _m[t].m5 = ROAD_TILE_DEPOT << 6 | dir;
399
421
        SB(_m[t].m6, 2, 4, 0);
400
 
        _me[t].m7 = RoadTypeToRoadTypes(rt) << 5;
 
422
        _me[t].m7 = RoadTypeToRoadTypes(rt) << 6 | owner;
 
423
        SetRoadOwner(t, ROADTYPE_TRAM, owner);
401
424
}
402
425
 
403
426
#endif /* ROAD_MAP_H */