town_map.h

Go to the documentation of this file.
00001 /* $Id: town_map.h 14611 2008-11-23 14:17:41Z frosch $ */
00002 
00005 #ifndef TOWN_MAP_H
00006 #define TOWN_MAP_H
00007 
00008 #include "town.h"
00009 #include "tile_map.h"
00010 
00017 static inline TownID GetTownIndex(TileIndex t)
00018 {
00019   assert(IsTileType(t, MP_HOUSE) || IsTileType(t, MP_ROAD)); // XXX incomplete
00020   return _m[t].m2;
00021 }
00022 
00030 static inline void SetTownIndex(TileIndex t, TownID index)
00031 {
00032   assert(IsTileType(t, MP_HOUSE) || IsTileType(t, MP_ROAD));
00033   _m[t].m2 = index;
00034 }
00035 
00041 static inline Town *GetTownByTile(TileIndex t)
00042 {
00043   return GetTown(GetTownIndex(t));
00044 }
00045 
00054 static inline HouseID GetHouseType(TileIndex t)
00055 {
00056   assert(IsTileType(t, MP_HOUSE));
00057   return _m[t].m4 | (GB(_m[t].m3, 6, 1) << 8);
00058 }
00059 
00066 static inline void SetHouseType(TileIndex t, HouseID house_id)
00067 {
00068   assert(IsTileType(t, MP_HOUSE));
00069   _m[t].m4 = GB(house_id, 0, 8);
00070   SB(_m[t].m3, 6, 1, GB(house_id, 8, 1));
00071 }
00072 
00078 static inline bool LiftHasDestination(TileIndex t)
00079 {
00080   return HasBit(_me[t].m7, 0);
00081 }
00082 
00089 static inline void SetLiftDestination(TileIndex t, byte dest)
00090 {
00091   SetBit(_me[t].m7, 0);
00092   SB(_me[t].m7, 1, 3, dest);
00093 }
00094 
00100 static inline byte GetLiftDestination(TileIndex t)
00101 {
00102   return GB(_me[t].m7, 1, 3);
00103 }
00104 
00111 static inline void HaltLift(TileIndex t)
00112 {
00113   SB(_me[t].m7, 0, 4, 0);
00114 }
00115 
00121 static inline byte GetLiftPosition(TileIndex t)
00122 {
00123   return GB(_m[t].m6, 2, 6);
00124 }
00125 
00131 static inline void SetLiftPosition(TileIndex t, byte pos)
00132 {
00133   SB(_m[t].m6, 2, 6, pos);
00134 }
00135 
00142 static inline byte GetHouseAnimationFrame(TileIndex t)
00143 {
00144   assert(IsTileType(t, MP_HOUSE));
00145   return GB(_m[t].m6, 2, 6) | (GB(_m[t].m3, 5, 1) << 6);
00146 }
00147 
00154 static inline void SetHouseAnimationFrame(TileIndex t, byte frame)
00155 {
00156   assert(IsTileType(t, MP_HOUSE));
00157   SB(_m[t].m6, 2, 6, GB(frame, 0, 6));
00158   SB(_m[t].m3, 5, 1, GB(frame, 6, 1));
00159 }
00160 
00166 static inline bool IsHouseCompleted(TileIndex t)
00167 {
00168   assert(IsTileType(t, MP_HOUSE));
00169   return HasBit(_m[t].m3, 7);
00170 }
00171 
00177 static inline void SetHouseCompleted(TileIndex t, bool status)
00178 {
00179   assert(IsTileType(t, MP_HOUSE));
00180   SB(_m[t].m3, 7, 1, !!status);
00181 }
00182 
00193 static inline void MakeHouseTile(TileIndex t, TownID tid, byte counter, byte stage, HouseID type, byte random_bits)
00194 {
00195   assert(IsTileType(t, MP_CLEAR));
00196 
00197   SetTileType(t, MP_HOUSE);
00198   _m[t].m1 = random_bits;
00199   _m[t].m2 = tid;
00200   _m[t].m3 = 0;
00201   SetHouseType(t, type);
00202   SetHouseCompleted(t, stage == TOWN_HOUSE_COMPLETED);
00203   _m[t].m5 = IsHouseCompleted(t) ? 0 : (stage << 3 | counter);
00204   SetHouseAnimationFrame(t, 0);
00205   _me[t].m7 = GetHouseSpecs(type)->processing_time;
00206 }
00207 
00229 static inline byte GetHouseBuildingStage(TileIndex t)
00230 {
00231   assert(IsTileType(t, MP_HOUSE));
00232   return IsHouseCompleted(t) ? (byte)TOWN_HOUSE_COMPLETED : GB(_m[t].m5, 3, 2);
00233 }
00234 
00241 static inline byte GetHouseConstructionTick(TileIndex t)
00242 {
00243   assert(IsTileType(t, MP_HOUSE));
00244   return IsHouseCompleted(t) ? 0 : GB(_m[t].m5, 0, 3);
00245 }
00246 
00254 static inline void IncHouseConstructionTick(TileIndex t)
00255 {
00256   assert(IsTileType(t, MP_HOUSE));
00257   AB(_m[t].m5, 0, 5, 1);
00258 
00259   if (GB(_m[t].m5, 3, 2) == TOWN_HOUSE_COMPLETED) {
00260     /* House is now completed.
00261      * Store the year of construction as well, for newgrf house purpose */
00262     SetHouseCompleted(t, true);
00263   }
00264 }
00265 
00272 static inline void ResetHouseAge(TileIndex t)
00273 {
00274   assert(IsTileType(t, MP_HOUSE) && IsHouseCompleted(t));
00275   _m[t].m5 = 0;
00276 }
00277 
00283 static inline void IncrementHouseAge(TileIndex t)
00284 {
00285   assert(IsTileType(t, MP_HOUSE));
00286   if (IsHouseCompleted(t) && _m[t].m5 < 0xFF) _m[t].m5++;
00287 }
00288 
00295 static inline Year GetHouseAge(TileIndex t)
00296 {
00297   assert(IsTileType(t, MP_HOUSE));
00298   return IsHouseCompleted(t) ? _m[t].m5 : 0;
00299 }
00300 
00308 static inline void SetHouseRandomBits(TileIndex t, byte random)
00309 {
00310   assert(IsTileType(t, MP_HOUSE));
00311   _m[t].m1 = random;
00312 }
00313 
00321 static inline byte GetHouseRandomBits(TileIndex t)
00322 {
00323   assert(IsTileType(t, MP_HOUSE));
00324   return _m[t].m1;
00325 }
00326 
00334 static inline void SetHouseTriggers(TileIndex t, byte triggers)
00335 {
00336   assert(IsTileType(t, MP_HOUSE));
00337   SB(_m[t].m3, 0, 5, triggers);
00338 }
00339 
00347 static inline byte GetHouseTriggers(TileIndex t)
00348 {
00349   assert(IsTileType(t, MP_HOUSE));
00350   return GB(_m[t].m3, 0, 5);
00351 }
00352 
00359 static inline byte GetHouseProcessingTime(TileIndex t)
00360 {
00361   assert(IsTileType(t, MP_HOUSE));
00362   return _me[t].m7;
00363 }
00364 
00371 static inline void SetHouseProcessingTime(TileIndex t, byte time)
00372 {
00373   assert(IsTileType(t, MP_HOUSE));
00374   _me[t].m7 = time;
00375 }
00376 
00382 static inline void DecHouseProcessingTime(TileIndex t)
00383 {
00384   assert(IsTileType(t, MP_HOUSE));
00385   _me[t].m7--;
00386 }
00387 
00388 #endif /* TOWN_MAP_H */

Generated on Wed Dec 23 20:12:53 2009 for OpenTTD by  doxygen 1.5.6