#include "Campaign.h" #include #include #include #include #include #include #include #include #include #include #include #include "Battle.h" #include "Session.h" namespace kurator { class Reporter { public: Reporter(std::vector& _ships) : ships {_ships} {} void operator()(const stats::ShipLeft& event); private: std::vector& ships; }; Campaign::Campaign(std::shared_ptr _session) : session {std::move(_session)}, ships {}, team {0}, level {0}, id {0} { auto scenario = campaign::scenarios::example(); for (auto& ship : scenario.ships) { if (ship.team == team) { ship.identifier.id = id++; ships.push_back(std::move(ship)); } } } void Campaign::update() { if (ships.empty()) return session->pop(); if (ImGui::Begin("Campaign")) { ImGui::Text("Level %d, ships left:", level); for (const auto& ship : ships) { if (ship.team == team) ImGui::Text("%s", ship.loadout.type.name.c_str()); } if (ImGui::Button("Start")) { campaign::Scenario scenario {"encounter", 12000, {}}; scenario.ships.insert(scenario.ships.cend(), ships.begin(), ships.end()); auto generator = campaign::scenarios::example(); for (auto& ship : generator.ships) { if (ship.team != team) { ship.identifier.id = id++; scenario.ships.push_back(std::move(ship)); } } auto destroy = [&](const stats::EventLog& log) { log.for_each(Reporter{ships}); }; session->push(std::make_shared(session, std::move(scenario), destroy)); level++; } if (ImGui::Button("Back")) session->pop(); } ImGui::End(); } void Campaign::draw() const { ClearBackground(BLACK); } void Reporter::operator()(const stats::ShipLeft& event) { using campaign::ShipConfig; auto was_destroyed = [&event](const ShipConfig& ship){ return ship.identifier.id == event.ship.id; }; ships.erase(std::remove_if(ships.begin(), ships.end(), was_destroyed), ships.end()); } } // namespace kurator