51 const std::function<absl::StatusOr<gfx::Tile16>(
int)>& tile_provider,
54 return absl::InvalidArgumentError(
"Usage index pointer is null");
57 return absl::InvalidArgumentError(
"Tile provider callback is not set");
59 if (total_tiles < 0) {
60 return absl::InvalidArgumentError(
"Total tiles cannot be negative");
64 for (
int tile_id = 0; tile_id < total_tiles; ++tile_id) {
65 auto tile_result = tile_provider(tile_id);
66 if (!tile_result.ok()) {
71 return absl::OkStatus();
75 const std::vector<std::vector<uint16_t>>& world_tiles,
int local_map,
76 std::vector<int>* counts) {
77 constexpr int kMapsPerRow = 8;
78 constexpr int kTilesPerMapSide = 32;
79 if (!counts || local_map < 0) {
82 const int x0 = (local_map % kMapsPerRow) * kTilesPerMapSide;
83 const int y0 = (local_map / kMapsPerRow) * kTilesPerMapSide;
85 std::min(x0 + kTilesPerMapSide,
static_cast<int>(world_tiles.size()));
86 for (
int x = x0; x < x_end; ++x) {
87 const auto& column = world_tiles[x];
89 std::min(y0 + kTilesPerMapSide,
static_cast<int>(column.size()));
90 for (
int y = y0; y < y_end; ++y) {
91 const uint16_t tile_id = column[y];
92 if (tile_id < counts->size()) {
102 std::vector<int> order;
103 order.reserve(counts.size());
104 for (
int tile_id = 0; tile_id < static_cast<int>(counts.size()); ++tile_id) {
105 if (!hide_unused || counts[tile_id] > 0) {
106 order.push_back(tile_id);
110 std::stable_sort(order.begin(), order.end(),
111 [&counts](
int a,
int b) { return counts[a] > counts[b]; });