summaryrefslogtreecommitdiff
path: root/src/layer_func.h
blob: 05022163a2d2a1df2aaa11b4c01def4a4768486e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/* $Id: layer_func.h 2012-09-07 18:11:11 constructor $ */

/*
*	Подробое описание см. в layer.cpp
*/

/** @file layer_func.h Functions related to layer in maps. */

#ifndef LAYER_FUNC_H
#define LAYER_FUNC_H

#include "map_func.h"
#include "viewport_type.h"

/*
*
*	Инициализация "подземелий"
*	Количество слоев "1" равносильно игре без "подземелий"
*
*/
void InstallLayerSystem(uint size_x, uint size_y, uint layer_count);

/*	Корректировка "подземных" слоев
*	(в будущем слои могут менять высоты -- в пределах соседей) */
void FixUndergroundHeights();

#define UNDERGROUND_COST_MULTIPLIER(tile)  (1 + 100 * (TileHeight(TopTile(tile))-TileHeight(tile)-LayerIndex(tile)))

#define FOR_ALL_LAYERS(var) for (uint var = 0; var < LayerCount(); var++)

/**
 * Get the X component of a tile
 * @param tile the tile to get the X component of
 * @return the X component
 */
static inline uint LayerX(TileIndex tile)
{
	return tile & LayerMaxX();
}

/**
 * Get the Y component of a tile
 * @param tile the tile to get the Y component of
 * @return the Y component
 */
static inline uint LayerY(TileIndex tile)
{
	return (tile >> MapLogX()) & LayerMaxY();
}

static inline uint LayerIndex(TileIndex tile)
{
	return (tile >> MapLogX()) / LayerSizeY();
}

static inline bool IsUnderground(TileIndex tile)
{
	return LayerIndex(tile) != 0;
}

/**
*	Размер слоя.
*	Можно прибавить к клетке, чтобы получить клетку ниже
*/
static inline uint LayerSize()
{
	extern uint _layer_size;
	return _layer_size;
}

/**
 * Ищем клетку поверхности для данной (самую верхнюю клетку)
 * @param tile the tile to get the Y component of
 * @return the Y component
 */
static inline uint TopTile(TileIndex tile)
{
	uint layer = LayerIndex(tile);
	return (tile - layer * LayerSize());
}

/*	Определить верхняя ли клеточка очень просто	*/
static inline bool IsTopTile(TileIndex tile)
{
	return (tile < LayerSize());
}

/*	Ищет клетку над данной. (Для самой верхней вернет нижнюю??)
*/
static inline uint UpTile(TileIndex tile)
{
	return TILE_MASK(tile - LayerSize());
}

/*	Ищет клетку под данной. (Для самой нижней вернет верхнюю??)
*/
static inline uint DownTile(TileIndex tile)
{
	return TILE_MASK(tile + LayerSize());
}

#endif /* LAYER_FUNC_H */