#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // IWYU pragma: keep #include #include #include #include #include static const int DISPLAY_WIDTH = 1280; static const int DISPLAY_HEIGHT = 1024; class MainApplication : public GameState, public ApplicationBase { public: using Windows = Collection; int run() { geoData = std::make_shared(GeoData::loadFromAsciiGrid("test/fixtures/height/SD19.asc")); Windows windows; windows.create(DISPLAY_WIDTH, DISPLAY_HEIGHT); world.create(geoData); world.create(geoData); assets = AssetFactory::loadAll("res"); { auto rl = world.create(); const GlobalPosition3D j {-1120000, -1100000, 3000}, k {-1100000, -1000000, 15000}, l {-1000000, -800000, 20000}, m {-900000, -600000, 30000}, n {-600000, -500000, 32000}, o {-500000, -800000, 30000}, p {-600000, -900000, 25000}, q {-1025000, -1175000, 10000}, r {-925000, -1075000, 10000}, s {-1100000, -500000, 15000}, t {-1100000, -450000, 15000}, u {-1000000, -400000, 15000}; auto l3 = rl->addLinksBetween(j, k); rl->addLinksBetween(k, l); rl->addLinksBetween(l, m); rl->addLinksBetween(m, n); rl->addLinksBetween(n, o); rl->addLinksBetween(o, p); // branch 1 rl->addLinksBetween(p, q); rl->addLinksBetween(q, j); // branch 2 rl->addLinksBetween(p, r); rl->addLinksBetween(r, j); // early loop rl->addLinksBetween(s, t); rl->addLinksBetween(l, s); rl->addLinksBetween(t, u); rl->addLinksBetween(u, m); const std::shared_ptr train = world.create(l3); auto b47 = std::dynamic_pointer_cast(assets.at("brush-47")); for (int N = 0; N < 6; N++) { train->create(b47); } train->orders.removeAll(); train->orders.create( &train->orders, l3->ends[1], l3->length, rl->findNodeAt({-1100000, -450000, 15000})); train->currentActivity = train->orders.current()->createActivity(); auto foliage = std::dynamic_pointer_cast(assets.at("Tree-01-1")); for (auto x = 311000000; x < 311830000; x += 5000) { for (auto y = 491100000; y < 491130000; y += 5000) { world.create(foliage, Location {geoData->positionAt({{x, y}})}); } } } auto t_start = std::chrono::high_resolution_clock::now(); while (isRunning) { processInputs(windows); const auto t_end = std::chrono::high_resolution_clock::now(); const auto t_passed = std::chrono::duration_cast(t_end - t_start); world.apply(&WorldObject::tick, t_passed); windows.apply(&Window::tick, t_passed); windows.apply(&Window::refresh); t_start = t_end; } world.objects.clear(); return 0; } private: void processInputs(const Windows & windows) { for (SDL_Event e; SDL_PollEvent(&e);) { if (e.type == SDL_QUIT) { isRunning = false; return; } windows.applyOne(&Window::handleInput, e); } } bool isRunning {true}; }; int main(int, char **) { return std::make_shared()->run(); }