载入中...
搜索中...
未找到
DtlHelpers.h
浏览该文件的文档.
1#pragma once
2
3#include "procgen/Grid2D.h"
4#include "procgen/Params.h"
5#include "procgen/Semantic.h"
6
7// Prefer specific DTL headers over the umbrella <DTL.hpp>. The umbrella pulls in
8// RandomVoronoi / SimpleVoronoiIsland, which call missing drawOperator* members and
9// fail under Apple Clang. Compat shims for DrawJagged* are on the include path.
10#include <DTL/Base/RogueLike.hpp>
11#include <DTL/Random/RandomEngine.hpp>
12#include <DTL/Shape/MazeDig.hpp>
13#include <DTL/Shape/PerlinIsland.hpp>
14#include <DTL/Shape/SimpleRogueLike.hpp>
15
16#include <cstdint>
17#include <functional>
18#include <utility>
19#include <vector>
20
22
24inline std::vector<std::vector<std::uint_fast8_t>> makeMatrix(int width, int height,
25 std::uint_fast8_t fill = 0) {
26 return std::vector<std::vector<std::uint_fast8_t>>(
28 size_t(height), std::vector<std::uint_fast8_t>(size_t(width), fill));
29}
30
32inline void copyMatrixToGrid(const std::vector<std::vector<std::uint_fast8_t>> &matrix,
33 Grid2D &grid,
35 const std::function<uint32_t(std::uint_fast8_t)> &mapValue) {
36 const int h = int(matrix.size());
37 const int w = h > 0 ? int(matrix[0].size()) : 0;
38 grid.resize(w, h);
39 for (int y = 0; y < h; ++y) {
40 for (int x = 0; x < w; ++x) {
41 grid.setCell(x, y, mapValue(matrix[size_t(y)][size_t(x)]));
42 }
43 }
44}
45
47inline void placeSpawnAndStairs(Grid2D &grid, uint32_t seed) {
48 std::vector<std::pair<int, int>> walkable;
49 walkable.reserve(size_t(grid.getWidth() * grid.getHeight() / 4));
50 for (int y = 0; y < grid.getHeight(); ++y) {
51 for (int x = 0; x < grid.getWidth(); ++x) {
52 const uint32_t c = uint32_t(grid.getCell(x, y));
55 walkable.emplace_back(x, y);
56 }
57 }
58 }
59 if (walkable.empty()) return;
60
61 auto pick = [&](uint32_t salt) -> std::pair<int, int> {
62 const uint32_t idx = (seed * 1664525u + salt * 1013904223u) % uint32_t(walkable.size());
63 return walkable[idx];
64 };
65 auto a = pick(1);
66 auto b = pick(7);
67 if (a == b && walkable.size() > 1) b = walkable[(size_t(seed) + 1) % walkable.size()];
68
69 grid.clearObjects();
70 grid.addObjectAt("spawn", "spawn", float(a.first), float(a.second));
71 grid.addObjectAt("stairs", "stairs", float(b.first), float(b.second));
72}
73
74} // namespace eve::procgen::dtlutil
float w
Definition AnimClip.cpp:738
float y
Definition AnimClip.cpp:738
float x
Definition AnimClip.cpp:738
std::int32_t c
int h
std::uint32_t height
std::uint32_t width
MeleePoint3 b
Definition MeleeHit.cpp:41
MeleePoint3 a
Definition MeleeHit.cpp:40
int idx
std::uint32_t seed
Definition PointSet.cpp:807
float size
Definition TreeMesh.cpp:156
Intermediate 2D generation result. cells store semantic ids (see Semantic.h), not tile GIDs — convert...
Definition Grid2D.h:36
constexpr uint32_t Floor
Definition Semantic.h:14
constexpr uint32_t Grass
Definition Semantic.h:18
constexpr uint32_t Sand
Definition Semantic.h:17
constexpr uint32_t Dirt
Definition Semantic.h:19
constexpr uint32_t Corridor
Definition Semantic.h:15
void copyMatrixToGrid(const std::vector< std::vector< std::uint_fast8_t > > &matrix, Grid2D &grid, const std::function< uint32_t(std::uint_fast8_t)> &mapValue)
Copies matrix to grid.
Definition DtlHelpers.h:32
void placeSpawnAndStairs(Grid2D &grid, uint32_t seed)
Place spawn + stairs on walkable cells (floor/corridor/grass/dirt/sand).
Definition DtlHelpers.h:47
std::vector< std::vector< std::uint_fast8_t > > makeMatrix(int width, int height, std::uint_fast8_t fill=0)
Make matrix.
Definition DtlHelpers.h:24