#include "SurfaceData.h"

#include "Surface.h"
#include "tile_element/Slope.h"

// 0x00981A1E
// Table of pre-calculated surface slopes (32) when raising the land tile for a given selection (5)
// 0x1F = new slope
// 0x20 = base height increases
constexpr uint8_t TileElementRaiseStyles[9][32] = {
    // MAP_SELECT_TYPE_CORNER_0
    { kTileSlopeNCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp,
      kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeECornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp
          | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp },
    // MAP_SELECT_TYPE_CORNER_1
    { kTileSlopeECornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeECornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeECornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeECornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeECornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp
          | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp },
    // MAP_SELECT_TYPE_CORNER_2
    { kTileSlopeSCornerUp,
      kTileSlopeNCornerUp | kTileSlopeSCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeSCornerUp,
      kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeDiagonalFlag | kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeECornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeDiagonalFlag | kTileSlopeECornerUp | kTileSlopeSCornerUp
          | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp },
    // MAP_SELECT_TYPE_CORNER_3
    { kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeECornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeECornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeSCornerUp
          | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp },
    // MAP_SELECT_TYPE_FULL
    { kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeECornerUp,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight },
    // MAP_SELECT_TYPE_EDGE_0
    { kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeECornerUp,
      kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeSCornerUp | kTileSlopeWCornerUp },
    // MAP_SELECT_TYPE_EDGE_1
    { kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeECornerUp,
      kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeWCornerUp },
    // MAP_SELECT_TYPE_EDGE_2
    { kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeECornerUp },
    // MAP_SELECT_TYPE_EDGE_3
    { kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight,
      kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeECornerUp | kTileSlopeSCornerUp },

};

// 0x00981ABE
// Basically the inverse of the table above.
// 0x1F = new slope
// 0x20 = base height increases
constexpr uint8_t TileElementLowerStyles[9][32] = {
    // MAP_SELECT_TYPE_CORNER_0
    { kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      0,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeECornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeDiagonalFlag | kTileSlopeECornerUp | kTileSlopeSCornerUp
          | kTileSlopeWCornerUp,
      kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeDiagonalFlag | kTileSlopeECornerUp | kTileSlopeSCornerUp
          | kTileSlopeWCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeDiagonalFlag | kTileSlopeECornerUp | kTileSlopeSCornerUp
          | kTileSlopeWCornerUp,
      kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeDiagonalFlag | kTileSlopeECornerUp | kTileSlopeSCornerUp
          | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeECornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeDiagonalFlag | kTileSlopeECornerUp | kTileSlopeSCornerUp
          | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp },
    // MAP_SELECT_TYPE_CORNER_1
    { kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      0,
      kTileSlopeNCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeSCornerUp,
      kTileSlopeNCornerUp | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeSCornerUp
          | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeSCornerUp
          | kTileSlopeWCornerUp,
      kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeSCornerUp
          | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeSCornerUp
          | kTileSlopeWCornerUp,
      kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeECornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeSCornerUp
          | kTileSlopeWCornerUp,
      kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp },
    // MAP_SELECT_TYPE_CORNER_2
    { kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp
          | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp
          | kTileSlopeWCornerUp,
      0,
      kTileSlopeNCornerUp,
      kTileSlopeECornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp
          | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp
          | kTileSlopeWCornerUp,
      kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeECornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp
          | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp },
    // MAP_SELECT_TYPE_CORNER_3
    { kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp
          | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp
          | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp
          | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp
          | kTileSlopeSCornerUp,
      0,
      kTileSlopeNCornerUp,
      kTileSlopeECornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeSCornerUp,
      kTileSlopeNCornerUp | kTileSlopeSCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeECornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp
          | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeDiagonalFlag | kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp },
    // MAP_SELECT_TYPE_FULL
    { kTileSlopeRaiseOrLowerBaseHeight,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      0,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      0,
      0,
      0,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      0,
      kTileSlopeNCornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      0 },
    // MAP_SELECT_TYPE_EDGE_0
    { kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeECornerUp,
      0,
      kTileSlopeNCornerUp,
      kTileSlopeECornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp,
      0,
      kTileSlopeNCornerUp,
      kTileSlopeECornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp,
      0,
      kTileSlopeNCornerUp,
      kTileSlopeECornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeECornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeECornerUp,
      0,
      kTileSlopeNCornerUp,
      kTileSlopeECornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp,
      0,
      kTileSlopeNCornerUp,
      kTileSlopeECornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp,
      0,
      kTileSlopeNCornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp },
    // MAP_SELECT_TYPE_EDGE_1
    { kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      0,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeECornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp,
      0,
      0,
      kTileSlopeECornerUp,
      kTileSlopeECornerUp,
      kTileSlopeSCornerUp,
      kTileSlopeSCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      0,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeECornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp,
      0,
      0,
      kTileSlopeECornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeSCornerUp,
      kTileSlopeNCornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp },
    // MAP_SELECT_TYPE_EDGE_2
    { kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      0,
      0,
      0,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeSCornerUp,
      kTileSlopeSCornerUp,
      kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeWCornerUp,
      kTileSlopeWCornerUp,
      kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      0,
      0,
      0,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeSCornerUp,
      kTileSlopeSCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeWCornerUp,
      kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeSCornerUp | kTileSlopeWCornerUp },
    // MAP_SELECT_TYPE_EDGE_3
    { kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      0,
      kTileSlopeNCornerUp,
      0,
      kTileSlopeNCornerUp,
      0,
      kTileSlopeNCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      0,
      kTileSlopeNCornerUp,
      0,
      kTileSlopeNCornerUp,
      0,
      kTileSlopeNCornerUp | kTileSlopeECornerUp | kTileSlopeSCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeRaiseOrLowerBaseHeight | kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeWCornerUp,
      kTileSlopeECornerUp | kTileSlopeSCornerUp | kTileSlopeWCornerUp,
      kTileSlopeNCornerUp | kTileSlopeWCornerUp },
};

uint8_t LowerSurfaceCornerFlags(size_t SelectedCorner, size_t CurrentSlope)
{
    return TileElementLowerStyles[SelectedCorner][CurrentSlope];
}

uint8_t RaiseSurfaceCornerFlags(size_t SelectedCorner, size_t CurrentSlope)
{
    return TileElementRaiseStyles[SelectedCorner][CurrentSlope];
}
