✅ All 10 engines now build successfully: - Designer, Economy, Event, Factory, Intelligence - Logistic, MacroEntity, Map, Operation, War 🚀 Features implemented: - FAST_BUILD vs FULL_BUILD presets for efficient development - Comprehensive defensive programming (sanitizers, contracts) - 16 C++ libraries integrated via FetchContent - GCC-compatible configuration with stack protection - Unified CMake system across all engines 🛠️ Build commands: - Fast: cmake -DFAST_BUILD=ON .. && make claude-workflow-fast - Full: cmake .. && make (all sanitizers + validation) - Single engine: make economy-engine 🔧 Development workflow optimized for daily iteration. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
144 lines
3.8 KiB
C++
144 lines
3.8 KiB
C++
#include "event-engine/EventEngine.h"
|
|
#include <iostream>
|
|
#include <chrono>
|
|
|
|
namespace Warfactory {
|
|
namespace Event {
|
|
|
|
class GameEvent {
|
|
public:
|
|
GameEvent() = default;
|
|
virtual ~GameEvent() = default;
|
|
virtual void execute() {}
|
|
};
|
|
|
|
class BreakthroughSystem {
|
|
public:
|
|
BreakthroughSystem() = default;
|
|
void analyzeScrap(const std::string& scrapData) {
|
|
std::cout << "Analyzing scrap: " << scrapData << std::endl;
|
|
}
|
|
void triggerBreakthrough(const std::string& domain) {
|
|
std::cout << "Breakthrough triggered in: " << domain << std::endl;
|
|
}
|
|
};
|
|
|
|
class EventQueue {
|
|
public:
|
|
EventQueue() = default;
|
|
void scheduleEvent(std::unique_ptr<GameEvent> event, double delay) {
|
|
events_.push(std::move(event));
|
|
}
|
|
void addImmediate(std::unique_ptr<GameEvent> event) {
|
|
events_.push(std::move(event));
|
|
}
|
|
bool hasEvents() const { return !events_.empty(); }
|
|
std::unique_ptr<GameEvent> popEvent() {
|
|
if (events_.empty()) return nullptr;
|
|
auto event = std::move(const_cast<std::unique_ptr<GameEvent>&>(events_.front()));
|
|
events_.pop();
|
|
return event;
|
|
}
|
|
private:
|
|
std::queue<std::unique_ptr<GameEvent>> events_;
|
|
};
|
|
|
|
EventEngine::EventEngine() : running_(false) {
|
|
std::cout << "EventEngine constructor" << std::endl;
|
|
eventQueue_ = std::make_unique<EventQueue>();
|
|
breakthroughSystem_ = std::make_unique<BreakthroughSystem>();
|
|
}
|
|
|
|
EventEngine::~EventEngine() {
|
|
if (running_) {
|
|
shutdown();
|
|
}
|
|
}
|
|
|
|
bool EventEngine::initialize() {
|
|
std::cout << "EventEngine::initialize()" << std::endl;
|
|
running_ = true;
|
|
return true;
|
|
}
|
|
|
|
void EventEngine::run() {
|
|
std::cout << "EventEngine::run() starting engine loop" << std::endl;
|
|
engineThread_ = std::thread(&EventEngine::engineLoop, this);
|
|
|
|
if (engineThread_.joinable()) {
|
|
engineThread_.join();
|
|
}
|
|
}
|
|
|
|
void EventEngine::shutdown() {
|
|
std::cout << "EventEngine::shutdown()" << std::endl;
|
|
running_ = false;
|
|
|
|
if (engineThread_.joinable()) {
|
|
engineThread_.join();
|
|
}
|
|
}
|
|
|
|
void EventEngine::scheduleEvent(std::unique_ptr<GameEvent> event, double /*delaySeconds*/) {
|
|
eventQueue_->scheduleEvent(std::move(event), 0.0);
|
|
}
|
|
|
|
void EventEngine::triggerImmediateEvent(std::unique_ptr<GameEvent> event) {
|
|
eventQueue_->addImmediate(std::move(event));
|
|
}
|
|
|
|
void EventEngine::analyzeScrapForBreakthrough(const std::string& scrapData) {
|
|
breakthroughSystem_->analyzeScrap(scrapData);
|
|
}
|
|
|
|
void EventEngine::triggerBreakthrough(const std::string& technologyDomain) {
|
|
breakthroughSystem_->triggerBreakthrough(technologyDomain);
|
|
}
|
|
|
|
void EventEngine::generateRandomEvent() {
|
|
std::cout << "Generating random global event" << std::endl;
|
|
}
|
|
|
|
void EventEngine::processScheduledEvents() {
|
|
while (eventQueue_->hasEvents()) {
|
|
auto event = eventQueue_->popEvent();
|
|
if (event) {
|
|
event->execute();
|
|
}
|
|
}
|
|
}
|
|
|
|
void EventEngine::engineLoop() {
|
|
auto lastUpdate = std::chrono::steady_clock::now();
|
|
|
|
while (running_) {
|
|
auto now = std::chrono::steady_clock::now();
|
|
auto deltaTime = std::chrono::duration<double>(now - lastUpdate).count();
|
|
|
|
if (deltaTime >= 1.0/60.0) {
|
|
updateEventQueue();
|
|
dispatchEvents();
|
|
processScheduledEvents();
|
|
sendEvents();
|
|
receiveEventTriggers();
|
|
lastUpdate = now;
|
|
}
|
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
|
}
|
|
}
|
|
|
|
void EventEngine::updateEventQueue() {
|
|
}
|
|
|
|
void EventEngine::dispatchEvents() {
|
|
}
|
|
|
|
void EventEngine::sendEvents() {
|
|
}
|
|
|
|
void EventEngine::receiveEventTriggers() {
|
|
}
|
|
|
|
} // namespace Event
|
|
} // namespace Warfactory
|