载入中...
搜索中...
未找到
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/CellularAutomatonIsland.hpp>
13#include <DTL/Shape/MazeDig.hpp>
14#include <DTL/Shape/PerlinIsland.hpp>
15#include <DTL/Shape/SimpleRogueLike.hpp>
16
17#include <cstdint>
18#include <functional>
19#include <utility>
20#include <vector>
21
23
24inline void seedEngine(uint32_t seed) {
25 DTL_RANDOM_ENGINE.seed(seed);
26 DTL_RANDOM_ENGINE.clear();
27}
28
29inline std::vector<std::vector<std::uint_fast8_t>> makeMatrix(int width, int height,
30 std::uint_fast8_t fill = 0) {
31 return std::vector<std::vector<std::uint_fast8_t>>(
32 size_t(height), std::vector<std::uint_fast8_t>(size_t(width), fill));
33}
34
35inline void copyMatrixToGrid(const std::vector<std::vector<std::uint_fast8_t>> &matrix,
36 Grid2D &grid,
37 const std::function<uint32_t(std::uint_fast8_t)> &mapValue) {
38 const int h = int(matrix.size());
39 const int w = h > 0 ? int(matrix[0].size()) : 0;
40 grid.resize(w, h);
41 for (int y = 0; y < h; ++y) {
42 for (int x = 0; x < w; ++x) {
43 grid.setCell(x, y, mapValue(matrix[size_t(y)][size_t(x)]));
44 }
45 }
46}
47
49inline void placeSpawnAndStairs(Grid2D &grid, uint32_t seed) {
50 std::vector<std::pair<int, int>> walkable;
51 walkable.reserve(size_t(grid.getWidth() * grid.getHeight() / 4));
52 for (int y = 0; y < grid.getHeight(); ++y) {
53 for (int x = 0; x < grid.getWidth(); ++x) {
54 const uint32_t c = uint32_t(grid.getCell(x, y));
57 walkable.emplace_back(x, y);
58 }
59 }
60 }
61 if (walkable.empty()) return;
62
63 auto pick = [&](uint32_t salt) -> std::pair<int, int> {
64 const uint32_t idx = (seed * 1664525u + salt * 1013904223u) % uint32_t(walkable.size());
65 return walkable[idx];
66 };
67 auto a = pick(1);
68 auto b = pick(7);
69 if (a == b && walkable.size() > 1) b = walkable[(size_t(seed) + 1) % walkable.size()];
70
71 grid.clearObjects();
72 grid.addObjectAt("spawn", "spawn", float(a.first), float(a.second));
73 grid.addObjectAt("stairs", "stairs", float(b.first), float(b.second));
74}
75
76} // namespace eve::procgen::dtlutil
uint32_t seed
int y
Definition Grass.cpp:135
float height
Definition Grass.cpp:235
int x
Definition Grass.cpp:135
int h
int w
uint32_t a
uint32_t b
uint32_t c
int width
int idx
Intermediate 2D generation result. cells store semantic ids (see Semantic.h), not tile GIDs — convert...
Definition Grid2D.h:16
int getWidth() const
Definition Grid2D.cpp:20
void resize(int width, int height)
Definition Grid2D.cpp:13
void setCell(int x, int y, int semantic)
Definition Grid2D.cpp:23
int getCell(int x, int y) const
Definition Grid2D.cpp:28
void addObjectAt(const std::string &name, const std::string &type, float x, float y)
Script-friendly: name/type + tile coords.
Definition Grid2D.cpp:56
int getHeight() const
Definition Grid2D.cpp:21
constexpr uint32_t Floor
Definition Semantic.h:12
constexpr uint32_t Grass
Definition Semantic.h:16
constexpr uint32_t Sand
Definition Semantic.h:15
constexpr uint32_t Dirt
Definition Semantic.h:17
constexpr uint32_t Corridor
Definition Semantic.h:13
void copyMatrixToGrid(const std::vector< std::vector< std::uint_fast8_t > > &matrix, Grid2D &grid, const std::function< uint32_t(std::uint_fast8_t)> &mapValue)
Definition DtlHelpers.h:35
void placeSpawnAndStairs(Grid2D &grid, uint32_t seed)
Place spawn + stairs on walkable cells (floor/corridor/grass/dirt/sand).
Definition DtlHelpers.h:49
void seedEngine(uint32_t seed)
Definition DtlHelpers.h:24
std::vector< std::vector< std::uint_fast8_t > > makeMatrix(int width, int height, std::uint_fast8_t fill=0)
Definition DtlHelpers.h:29