diff --git a/client/client_application.cpp b/client/client_application.cpp index b9a31bd..d3ce86c 100644 --- a/client/client_application.cpp +++ b/client/client_application.cpp @@ -124,7 +124,7 @@ void ClientApplication::LoadScene(SceneList sceneIndex) { activeScene = new OptionsMenu(&config); break; case SceneList::LOBBYMENU: - activeScene = new LobbyMenu(&config, &network, &clientIndex, &accountIndex, &characterIndex); + activeScene = new LobbyMenu(&config, &network, &clientIndex, &accountIndex); break; case SceneList::INWORLD: activeScene = new InWorld(&config, &network, &clientIndex, &accountIndex, &characterIndex, &combatMap, &characterMap); diff --git a/client/in_world.hpp b/client/in_world.hpp index 038d22c..f993fc6 100644 --- a/client/in_world.hpp +++ b/client/in_world.hpp @@ -23,8 +23,6 @@ #define INWORLD_HPP_ //maps -#include "map_allocator.hpp" -#include "map_file_format.hpp" #include "region_pager.hpp" //networking @@ -112,7 +110,7 @@ protected: TileSheet tileSheet; //map - RegionPager regionPager; + RegionPager regionPager; //UI Button disconnectButton; diff --git a/client/lobby_menu.cpp b/client/lobby_menu.cpp index ddc6998..3056db3 100644 --- a/client/lobby_menu.cpp +++ b/client/lobby_menu.cpp @@ -34,14 +34,12 @@ LobbyMenu::LobbyMenu( ConfigUtility* const argConfig, UDPNetworkUtility* const argNetwork, int* const argClientIndex, - int* const argAccountIndex, - int* const argCharacterIndex + int* const argAccountIndex ): config(*argConfig), network(*argNetwork), clientIndex(*argClientIndex), - accountIndex(*argAccountIndex), - characterIndex(*argCharacterIndex) + accountIndex(*argAccountIndex) { //setup the utility objects image.LoadSurface(config["dir.interface"] + "button_menu.bmp"); @@ -87,9 +85,9 @@ void LobbyMenu::FrameStart() { void LobbyMenu::Update(double delta) { //suck in and process all waiting packets - SerialPacket packet; - while(network.Receive(&packet)) { - HandlePacket(packet); + char packetBuffer[MAX_PACKET_SIZE]; + while(network.Receive(reinterpret_cast(packetBuffer))) { + HandlePacket(reinterpret_cast(packetBuffer)); } } @@ -149,7 +147,7 @@ void LobbyMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) { if (search.MouseButtonUp(button) == Button::State::HOVER) { //broadcast to the network, or a specific server SerialPacket packet; - packet.meta.type = SerialPacket::Type::BROADCAST_REQUEST; + packet.type = SerialPacketType::BROADCAST_REQUEST; network.SendTo(config["server.host"].c_str(), config.Int("server.port"), &packet); //reset the server list @@ -159,11 +157,9 @@ void LobbyMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) { else if (join.MouseButtonUp(button) == Button::State::HOVER && selection != nullptr && selection->compatible) { //pack the packet - SerialPacket packet; - packet.meta.type = SerialPacket::Type::JOIN_REQUEST; - strncpy(packet.clientInfo.username, config["client.username"].c_str(), PACKET_STRING_SIZE); - strncpy(packet.clientInfo.handle, config["client.handle"].c_str(), PACKET_STRING_SIZE); - strncpy(packet.clientInfo.avatar, config["client.avatar"].c_str(), PACKET_STRING_SIZE); + ClientPacket packet; + packet.type = SerialPacketType::JOIN_REQUEST; + strncpy(packet.username, config["client.username"].c_str(), PACKET_STRING_SIZE); //join the selected server network.SendTo(&selection->address, &packet); @@ -176,6 +172,7 @@ void LobbyMenu::MouseButtonUp(SDL_MouseButtonEvent const& button) { else if ( //has the user selected a server on the list? + //TODO: replace with regular collision checker button.x > listBox.x && button.x < listBox.x + listBox.w && button.y > listBox.y && @@ -204,34 +201,41 @@ void LobbyMenu::KeyUp(SDL_KeyboardEvent const& key) { //Network handlers //------------------------- -void LobbyMenu::HandlePacket(SerialPacket packet) { - switch(packet.meta.type) { - case SerialPacket::Type::BROADCAST_RESPONSE: { - //extract the data - ServerInformation server; - server.address = packet.meta.srcAddress; - server.networkVersion = packet.serverInfo.networkVersion; - server.name = packet.serverInfo.name; - server.playerCount = packet.serverInfo.playerCount; - - //NOTE: Check compatibility here - server.compatible = server.networkVersion == NETWORK_VERSION; - - //push - serverInfo.push_back(server); - } +void LobbyMenu::HandlePacket(SerialPacket* const argPacket) { + switch(argPacket->type) { + case SerialPacketType::BROADCAST_RESPONSE: + HandleBroadcastResponse(dynamic_cast(argPacket)); break; - case SerialPacket::Type::JOIN_RESPONSE: - clientIndex = packet.clientInfo.clientIndex; - accountIndex = packet.clientInfo.accountIndex; - characterIndex = packet.clientInfo.characterIndex; - network.Bind(&packet.meta.srcAddress, Channels::SERVER); - SetNextScene(SceneList::INWORLD); + case SerialPacketType::JOIN_RESPONSE: + HandleJoinResponse(dynamic_cast(argPacket)); break; - //handle errors default: - throw(std::runtime_error(std::string() + "Unknown SerialPacketType encountered in LobbyMenu: " + to_string_custom(int(packet.meta.type)))); + throw(std::runtime_error(std::string() + "Unknown SerialPacketType encountered in LobbyMenu: " + to_string_custom(static_cast(argPacket->type)) )); break; } +} + +void LobbyMenu::HandleBroadcastResponse(ServerPacket* const argPacket) { + //extract the data + ServerInformation server; + server.address = argPacket->srcAddress; + server.name = argPacket->name; + server.playerCount = argPacket->playerCount; + server.version = argPacket->version; + + //NOTE: Check compatibility here + server.compatible = server.version == NETWORK_VERSION; + + //push + serverInfo.push_back(server); +} + +void LobbyMenu::HandleJoinResponse(ClientPacket* const argPacket) { + clientIndex = argPacket->clientIndex; + accountIndex = argPacket->accountIndex; + network.Bind(&argPacket->srcAddress, Channels::SERVER); + SetNextScene(SceneList::INWORLD); + + //TODO: send this player's character info } \ No newline at end of file diff --git a/client/lobby_menu.hpp b/client/lobby_menu.hpp index 2360705..a27c1a9 100644 --- a/client/lobby_menu.hpp +++ b/client/lobby_menu.hpp @@ -22,13 +22,13 @@ #ifndef LOBBYMENU_HPP_ #define LOBBYMENU_HPP_ -//graphics & utilities +//graphics & ui #include "image.hpp" #include "raster_font.hpp" #include "button.hpp" -#include "config_utility.hpp" -//network +//utilities +#include "config_utility.hpp" #include "udp_network_utility.hpp" //client @@ -44,8 +44,7 @@ public: ConfigUtility* const argConfig, UDPNetworkUtility* const argNetwork, int* const argClientIndex, - int* const argAccountIndex, - int* const argCharacterIndex + int* const argAccountIndex ); ~LobbyMenu(); @@ -64,14 +63,15 @@ protected: void KeyUp(SDL_KeyboardEvent const&); //Network handlers - void HandlePacket(SerialPacket); + void HandlePacket(SerialPacket* const); + void HandleBroadcastResponse(ServerPacket* const); + void HandleJoinResponse(ClientPacket* const); //shared parameters ConfigUtility& config; UDPNetworkUtility& network; int& clientIndex; int& accountIndex; - int& characterIndex; //members Image image; @@ -83,9 +83,9 @@ protected: //server list struct ServerInformation { IPaddress address; - int networkVersion; std::string name; int playerCount; + int version; bool compatible; }; diff --git a/common/map/region_pager.cpp b/common/map/region_pager.cpp index 098a720..9a4e780 100644 --- a/common/map/region_pager.cpp +++ b/common/map/region_pager.cpp @@ -64,6 +64,11 @@ Region* RegionPager::FindRegion(int x, int y) { } Region* RegionPager::LoadRegion(int x, int y) { + //only work if using lua + if (!luaState) { + throw(std::runtime_error("RegionPager::luaState is null")); + } + //load the region if possible //snap the coords @@ -97,6 +102,11 @@ Region* RegionPager::LoadRegion(int x, int y) { } Region* RegionPager::SaveRegion(int x, int y) { + //only work if using lua + if (!luaState) { + throw(std::runtime_error("RegionPager::luaState is null")); + } + //snap the coords x = snapToBase(REGION_WIDTH, x); y = snapToBase(REGION_HEIGHT, y); @@ -118,6 +128,11 @@ Region* RegionPager::SaveRegion(int x, int y) { } Region* RegionPager::CreateRegion(int x, int y) { + //only work if using lua + if (!luaState) { + throw(std::runtime_error("RegionPager::luaState is null")); + } + //snap the coords x = snapToBase(REGION_WIDTH, x); y = snapToBase(REGION_HEIGHT, y); @@ -143,6 +158,11 @@ Region* RegionPager::CreateRegion(int x, int y) { } void RegionPager::UnloadRegion(int x, int y) { + //only work if using lua + if (!luaState) { + throw(std::runtime_error("RegionPager::luaState is null")); + } + //snap the coords x = snapToBase(REGION_WIDTH, x); y = snapToBase(REGION_HEIGHT, y); diff --git a/common/map/region_pager.hpp b/common/map/region_pager.hpp index ab119dc..a4d26ab 100644 --- a/common/map/region_pager.hpp +++ b/common/map/region_pager.hpp @@ -29,6 +29,7 @@ #include #include +//TODO: split this into two: "RegionPagerBase" and "RegionPagerLua" class RegionPager { public: RegionPager() = default; diff --git a/common/network/packet/serial_packet_base.hpp b/common/network/packet/serial_packet_base.hpp index 760e54a..b84816e 100644 --- a/common/network/packet/serial_packet_base.hpp +++ b/common/network/packet/serial_packet_base.hpp @@ -38,8 +38,6 @@ struct SerialPacketBase { SerialPacketType type; IPaddress srcAddress; - typedef SerialPacketType Type; - virtual ~SerialPacketBase() {}; };