You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
170 lines
3.9 KiB
170 lines
3.9 KiB
/** |
|
* @file automap.h |
|
* |
|
* Interface of the in-game map overlay. |
|
*/ |
|
#pragma once |
|
|
|
#include <cstdint> |
|
|
|
#include "engine.h" |
|
#include "engine/displacement.hpp" |
|
#include "engine/point.hpp" |
|
#include "levels/gendung.h" |
|
#include "utils/attributes.h" |
|
|
|
namespace devilution { |
|
|
|
enum MapExplorationType : uint8_t { |
|
/** unexplored map tile */ |
|
MAP_EXP_NONE, |
|
/** map tile explored in vanilla - compatibility reasons */ |
|
MAP_EXP_OLD, |
|
/** map explored by a shrine */ |
|
MAP_EXP_SHRINE, |
|
/** map tile explored by someone else in multiplayer */ |
|
MAP_EXP_OTHERS, |
|
/** map tile explored by current player */ |
|
MAP_EXP_SELF, |
|
}; |
|
|
|
/** Specifies whether the automap is enabled. */ |
|
extern DVL_API_FOR_TEST bool AutomapActive; |
|
/** Tracks the explored areas of the map. */ |
|
extern uint8_t AutomapView[DMAXX][DMAXY]; |
|
/** Specifies the scale of the automap. */ |
|
extern DVL_API_FOR_TEST int AutoMapScale; |
|
extern DVL_API_FOR_TEST Displacement AutomapOffset; |
|
|
|
/** Defines the offsets used for Automap lines */ |
|
enum class AmWidthOffset : int8_t { |
|
None, |
|
EighthTileRight = TILE_WIDTH >> 4, |
|
QuarterTileRight = TILE_WIDTH >> 3, |
|
HalfTileRight = TILE_WIDTH >> 2, |
|
ThreeQuartersTileRight = (TILE_WIDTH >> 1) - (TILE_WIDTH >> 3), |
|
FullTileRight = TILE_WIDTH >> 1, |
|
DoubleTileRight = TILE_WIDTH, |
|
EighthTileLeft = -EighthTileRight, |
|
QuarterTileLeft = -QuarterTileRight, |
|
HalfTileLeft = -HalfTileRight, |
|
ThreeQuartersTileLeft = -ThreeQuartersTileRight, |
|
FullTileLeft = -FullTileRight, |
|
DoubleTileLeft = -DoubleTileRight, |
|
}; |
|
|
|
enum class AmHeightOffset : int8_t { |
|
None, |
|
EighthTileDown = TILE_HEIGHT >> 4, |
|
QuarterTileDown = TILE_HEIGHT >> 3, |
|
HalfTileDown = TILE_HEIGHT >> 2, |
|
ThreeQuartersTileDown = (TILE_HEIGHT >> 1) - (TILE_HEIGHT >> 3), |
|
FullTileDown = TILE_HEIGHT >> 1, |
|
DoubleTileDown = TILE_HEIGHT, |
|
EighthTileUp = -EighthTileDown, |
|
QuarterTileUp = -QuarterTileDown, |
|
HalfTileUp = -HalfTileDown, |
|
ThreeQuartersTileUp = -ThreeQuartersTileDown, |
|
FullTileUp = -FullTileDown, |
|
DoubleTileUp = -DoubleTileDown, |
|
}; |
|
|
|
enum class AmLineLength : uint8_t { |
|
QuarterTile = 2, |
|
HalfTile = 4, |
|
FullTile = 8, |
|
FullAndHalfTile = 12, |
|
DoubleTile = 16, |
|
OctupleTile = 64, |
|
}; |
|
|
|
inline Displacement AmOffset(AmWidthOffset x, AmHeightOffset y) |
|
{ |
|
return { AutoMapScale * static_cast<int>(x) / 100, AutoMapScale * static_cast<int>(y) / 100 }; |
|
} |
|
|
|
inline int AmLine(AmLineLength l) |
|
{ |
|
return AutoMapScale * static_cast<int>(l) / 100; |
|
} |
|
|
|
enum class AutomapType : uint8_t { |
|
Opaque, |
|
Transparent, |
|
Minimap, |
|
LAST = Minimap |
|
}; |
|
|
|
/** |
|
* @brief Sets the map type. Does not change `AutomapActive`. |
|
*/ |
|
void SetAutomapType(AutomapType type); |
|
|
|
AutomapType GetAutomapType(); |
|
|
|
/** |
|
* @brief Initializes the automap. |
|
*/ |
|
void InitAutomapOnce(); |
|
|
|
/** |
|
* @brief Loads the mapping between tile IDs and automap shapes. |
|
*/ |
|
void InitAutomap(); |
|
|
|
/** |
|
* @brief Displays the automap. |
|
*/ |
|
void StartAutomap(); |
|
|
|
/** |
|
* @brief Scrolls the automap upwards. |
|
*/ |
|
void AutomapUp(); |
|
|
|
/** |
|
* @brief Scrolls the automap downwards. |
|
*/ |
|
void AutomapDown(); |
|
|
|
/** |
|
* @brief Scrolls the automap leftwards. |
|
*/ |
|
void AutomapLeft(); |
|
|
|
/** |
|
* @brief Scrolls the automap rightwards. |
|
*/ |
|
void AutomapRight(); |
|
|
|
/** |
|
* @brief Increases the zoom level of the automap. |
|
*/ |
|
void AutomapZoomIn(); |
|
|
|
/** |
|
* @brief Decreases the zoom level of the automap. |
|
*/ |
|
void AutomapZoomOut(); |
|
|
|
/** |
|
* @brief Renders the automap to the given buffer. |
|
*/ |
|
void DrawAutomap(const Surface &out); |
|
|
|
/** |
|
* @brief Updates automap explorer at point if value is higher than existing. |
|
*/ |
|
void UpdateAutomapExplorer(Point map, MapExplorationType explorer); |
|
|
|
/** |
|
* @brief Marks the given coordinate as within view on the automap. |
|
*/ |
|
void SetAutomapView(Point tile, MapExplorationType explorer); |
|
|
|
/** |
|
* @brief Resets the zoom level of the automap. |
|
*/ |
|
void AutomapZoomReset(); |
|
|
|
} // namespace devilution
|
|
|