1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
#include "ui/mainApplication.h"
#include "ui/mainWindow.h"
#include <array>
#include <assetFactory/assetFactory.h>
#include <collection.h>
#include <game/activities/go.h>
#include <game/activities/idle.h>
#include <game/activity.h>
#include <game/gamestate.h>
#include <game/geoData.h>
#include <game/network/link.h>
#include <game/network/rail.h>
#include <game/objective.h>
#include <game/objectives/freeroam.h>
#include <game/objectives/goto.h>
#include <game/orders.h>
#include <game/scenary/foliage.h>
#include <game/scenary/plant.h>
#include <game/terrain.h>
#include <game/vehicles/railVehicle.h>
#include <game/vehicles/railVehicleClass.h>
#include <game/vehicles/train.h>
#include <game/water.h>
#include <game/worldobject.h>
#include <glm/glm.hpp>
#include <glm/gtx/transform.hpp> // IWYU pragma: keep
#include <memory>
#include <random>
#include <ranges>
#include <special_members.h>
#include <stream_support.h>
#include <ui/applicationBase.h>
#include <ui/builders/freeExtend.h>
#include <ui/builders/join.h>
#include <ui/builders/straight.h>
#include <ui/gameMainWindow.h>
#include <ui/window.h>
static const int DISPLAY_WIDTH = 1280;
static const int DISPLAY_HEIGHT = 1024;
class DummyMainApplication : public GameState, public MainApplication {
public:
int
run()
{
windows.create<MainWindow>(DISPLAY_WIDTH, DISPLAY_HEIGHT)->setContent<GameMainWindow>();
terrain = world.create<Terrain>(GeoData::loadFromAsciiGrid("test/fixtures/height/SD19.asc"));
world.create<Water>(terrain);
assets = AssetFactory::loadAll("res");
{
auto rl = world.create<RailLinks>();
const auto nodes = materializeRange(std::vector<GlobalPosition2D> {
{315103000, 491067000},
{315977000, 490777000},
{316312000, 490557000},
{316885000, 491330000},
{316510934, 491255979},
{316129566, 490893054},
{315825622, 490833929},
{315106182, 491073714},
}
| std::views::transform([this](const auto n) {
return terrain->positionAt(n);
}));
auto l3 = BuilderStraight {}.create(rl.get(), terrain.get(), *nodes.begin(), *++nodes.begin()).front();
for (const auto & [from, to] : nodes | std::views::drop(1) | std::views::pairwise) {
const auto links = BuilderFreeExtend {}.createExtend(rl.get(), terrain.get(), from, to);
}
for (const auto & [from, to] : std::initializer_list<std::pair<GlobalPosition2D, GlobalPosition2D>> {
{{315103000, 491067000}, {315003434, 491076253}},
{{315103000, 491067000}, {315016495, 491019224}},
{{315016495, 491019224}, {314955393, 490999023}},
}) {
const auto links = BuilderFreeExtend {}.createExtend(
rl.get(), terrain.get(), terrain->positionAt(from), terrain->positionAt(to));
}
for (const auto & [from, to] : std::initializer_list<std::pair<GlobalPosition2D, GlobalPosition2D>> {
{{315106182, 491073714}, {314955393, 490999023}},
}) {
auto p1 = rl->intersectRayNodes({from || 0, up})->pos;
auto p2 = rl->intersectRayNodes({to || 0, up})->pos;
const auto links = BuilderFreeExtend {}.createJoin(rl.get(), terrain.get(), p1, p2);
}
const std::shared_ptr<Train> train = world.create<Train>(l3, 800000);
auto b47 = std::dynamic_pointer_cast<RailVehicleClass>(assets.at("brush-47"));
for (int N = 0; N < 6; N++) {
train->create<RailVehicle>(b47);
}
train->orders.removeAll();
train->orders.create<FreeRoam>(&train->orders);
train->currentActivity = train->orders.current()->createActivity();
std::random_device randomdev {};
std::uniform_real_distribution<Angle> rotationDistribution {0, two_pi};
std::uniform_int_distribution<GlobalDistance> positionOffsetDistribution {-1500, +1500};
std::uniform_int_distribution<int> treeDistribution {1, 3};
std::uniform_int_distribution<int> treeVariantDistribution {1, 4};
for (auto x = 311000000; x < 311830000; x += 5000) {
for (auto y = 491100000; y < 491130000; y += 5000) {
world.create<Plant>(std::dynamic_pointer_cast<Foliage>(assets.at(std::format("Tree-{:#02}-{}",
treeDistribution(randomdev), treeVariantDistribution(randomdev)))),
Location {terrain->positionAt({{x + positionOffsetDistribution(randomdev),
y + positionOffsetDistribution(randomdev)}}),
{0, rotationDistribution(randomdev), 0}});
}
}
}
mainLoop();
world.objects.clear();
return 0;
}
};
int
main(int, char **)
{
return std::make_shared<DummyMainApplication>()->run();
}
|