summaryrefslogtreecommitdiff
path: root/application/main.cpp
blob: d96b1880eea4cffad4c7c5ee376e424c4385cf2b (plain)
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
#include "ui/mainApplication.h"
#include "ui/mainWindow.h"
#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/gameMainWindow.h>
#include <ui/window.h>

constexpr ScreenAbsCoord DEFAULT_WINDOW_SIZE {1280, 1024};

class DummyMainApplication : public GameState, public MainApplication {
public:
	int
	run()
	{
		windows.create<MainWindow>(DEFAULT_WINDOW_SIZE, "I Like Trains")->setContent<GameMainWindow>();

		terrain = world.create<Terrain>(GeoData::loadFromAsciiGrid("test/fixtures/height/SD19.asc"));
		world.create<Water>(terrain);
		assets = AssetFactory::loadAll("res");

		{
			auto railLinks = 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},
														{314955393, 490999023},
												}
					| std::views::transform([this](const auto n) {
						  return terrain->positionAt(n);
					  }));

			Link::Ptr l3;
			for (std::optional<Angle> previousDir; const auto [fromPos, toPos] : std::views::pairwise(nodes)) {
				const auto links = railLinks->create({
						.fromEnd = {.position = fromPos, .direction = previousDir},
						.toEnd = {.position = toPos, .direction = std::nullopt},
				});
				for (const auto & link : links) {
					railLinks->add(terrain.get(), link);
				}
				l3 = links.back();
				previousDir = links.back()->endAt(toPos)->dir;
			}

			const std::shared_ptr<Train> train = world.create<Train>(l3, 0);
			auto b47 = assets.at("brush-47").dynamicCast<RailVehicleClass>();
			for (int N = 0; N < 6; N++) {
				train->create<RailVehicle>(b47);
			}
			train->orders.clear();
			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>(assets.at(std::format("Tree-{:#02}-{}", treeDistribution(randomdev),
														  treeVariantDistribution(randomdev)))
												.dynamicCast<Foliage>(),
							Location {terrain->positionAt({{x + positionOffsetDistribution(randomdev),
											  y + positionOffsetDistribution(randomdev)}}),
									{0, rotationDistribution(randomdev), 0}});
				}
			}
		}

		mainLoop();

		world.clear();
		return 0;
	}
};

int
main(int, char **)
{
	return std::make_shared<DummyMainApplication>()->run();
}