#pragma once #include "Packet.h" #include #include using boost::asio::ip::tcp; class BaseClient { public: BaseClient(boost::asio::io_context &io_context, const std::string &host, const std::string &port); virtual ~BaseClient() = default; void SendPacket(PacketID id, const void *payload = nullptr, size_t payloadSize = 0); bool ReceiveHeader(PacketHeader &header); template bool ReceivePayload(T &payload) { try { boost::asio::read(socket_, boost::asio::buffer(&payload, sizeof(T))); return true; } catch (...) { return false; } } void Login(const std::string &nickname); virtual void Run() = 0; protected: tcp::socket socket_; uint32_t currentLevel_ = 0; uint64_t currentGold_ = 0; std::string nickname_; void HandleUpgradeResult(); void HandleSellResult(); }; class InteractiveClient : public BaseClient { public: using BaseClient::BaseClient; void Run() override; }; class ScenarioClient : public BaseClient { public: ScenarioClient(boost::asio::io_context &io_context, const std::string &host, const std::string &port, const std::string &scenarioFile) : BaseClient(io_context, host, port), scenarioFile_(scenarioFile) {} void Run() override; private: std::string scenarioFile_; };