diff options
Diffstat (limited to 'src/map_func.h')
-rw-r--r-- | src/map_func.h | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/src/map_func.h b/src/map_func.h index 038942cd9..265b88741 100644 --- a/src/map_func.h +++ b/src/map_func.h @@ -111,14 +111,34 @@ static inline uint MapMaxY() } /** - * Scales relative to the number of tiles. + * Scales the given value by the map size, where the given value is + * for a 256 by 256 map. + * @param n the value to scale + * @return the scaled size */ -uint ScaleByMapSize(uint); +static inline uint ScaleByMapSize(uint n) +{ + /* Subtract 12 from shift in order to prevent integer overflow + * for large values of n. It's safe since the min mapsize is 64x64. + * Add (1<<4)-1 to round upwards. */ + return ((n << (MapLogX() + MapLogY() - 12)) + (1 << 4) - 1) >> 4; +} + /** - * Scale relative to the circumference of the map. + * Scales the given value by the maps circumference, where the given + * value is for a 256 by 256 map + * @param n the value to scale + * @return the scaled size */ -uint ScaleByMapSize1D(uint); +static inline uint ScaleByMapSize1D(uint n) +{ + /* Normal circumference for the X+Y is 256+256 = 1<<9 + * Note, not actually taking the full circumference into account, + * just half of it. + * (1<<9) - 1 is there to scale upwards. */ + return ((n << MapLogX()) + (n << MapLogY()) + (1 << 9) - 1) >> 9; +} /** * An offset value between to tiles. |