diff --git a/client/entities/base_character.cpp b/client/entities/base_character.cpp index 8acdc72..cfa20b4 100644 --- a/client/entities/base_character.cpp +++ b/client/entities/base_character.cpp @@ -21,6 +21,8 @@ */ #include "base_character.hpp" +#include "config_utility.hpp" + //------------------------- //graphics //------------------------- @@ -71,7 +73,9 @@ std::string BaseCharacter::GetHandle() const { } std::string BaseCharacter::SetAvatar(std::string s) { - return avatar = s; + avatar = s; + sprite.LoadSurface(ConfigUtility::GetSingleton()["dir.sprites"] + avatar, CHARACTER_CELLS_X, CHARACTER_CELLS_Y); + return avatar; } std::string BaseCharacter::GetAvatar() const { diff --git a/client/entities/entity.cpp b/client/entities/entity.cpp index 04ba38a..98b9483 100644 --- a/client/entities/entity.cpp +++ b/client/entities/entity.cpp @@ -42,10 +42,6 @@ int Entity::SetEntityIndex(int i) { return entityIndex = i; } -int Entity::SetRoomIndex(int i) { - return roomIndex = i; -} - Vector2 Entity::SetOrigin(Vector2 v) { return origin = v; } @@ -62,10 +58,6 @@ int Entity::GetEntityIndex() { return entityIndex; } -int Entity::GetRoomIndex() { - return roomIndex; -} - Vector2 Entity::GetOrigin() { return origin; } diff --git a/client/entities/entity.hpp b/client/entities/entity.hpp index 694490d..c12fb71 100644 --- a/client/entities/entity.hpp +++ b/client/entities/entity.hpp @@ -36,13 +36,11 @@ public: //accessors & mutators int SetEntityIndex(int i); - int SetRoomIndex(int i); Vector2 SetOrigin(Vector2 v); Vector2 SetMotion(Vector2 v); BoundingBox SetBounds(BoundingBox b); int GetEntityIndex(); - int GetRoomIndex(); Vector2 GetOrigin(); Vector2 GetMotion(); BoundingBox GetBounds(); @@ -53,7 +51,6 @@ protected: SpriteSheet sprite; int entityIndex = -1; - int roomIndex = -1; Vector2 origin; Vector2 motion; BoundingBox bounds; diff --git a/client/scenes/in_world.cpp b/client/scenes/in_world.cpp index 1293ade..3cf019f 100644 --- a/client/scenes/in_world.cpp +++ b/client/scenes/in_world.cpp @@ -96,7 +96,9 @@ InWorld::InWorld(int* const argClientIndex, int* const argAccountIndex): } InWorld::~InWorld() { - // + //unload the local data + characterMap.clear(); + monsterMap.clear(); } //------------------------- @@ -168,6 +170,16 @@ void InWorld::Render(SDL_Surface* const screen) { tileSheet.DrawRegionTo(screen, &(*it), camera.x, camera.y); } + //draw the entities + for (auto& it : characterMap) { + //TODO: depth ordering + it.second.DrawTo(screen, camera.x, camera.y); + } + for (auto& it : monsterMap) { + //TODO: depth ordering + it.second.DrawTo(screen, camera.x, camera.y); + } + //draw UI disconnectButton.DrawTo(screen); shutDownButton.DrawTo(screen); @@ -328,8 +340,7 @@ void InWorld::SendShutdownRequest() { void InWorld::HandleLogoutResponse(ClientPacket* const argPacket) { accountIndex = -1; - - //TODO: unload the character + characterIndex = -1; SendDisconnectRequest(); } @@ -340,7 +351,10 @@ void InWorld::HandleDisconnectResponse(ClientPacket* const argPacket) { } void InWorld::HandleDisconnectForced(ClientPacket* const argPacket) { - //TODO: More needed in the disconnection + //clear the local data + accountIndex = -1; + characterIndex = -1; + SetNextScene(SceneList::DISCONNECTEDSCREEN); ConfigUtility::GetSingleton()["client.disconnectMessage"] = "You have been forcibly disconnected by the server"; } @@ -394,9 +408,36 @@ void InWorld::UpdateMap() { } } +//------------------------- +//entity management +//------------------------- + +//NOTE: preexisting characters will result in query responses +//NOTE: new characters will result in create messages +//NOTE: this client's character will exist in both + void InWorld::HandleCharacterCreate(CharacterPacket* const argPacket) { - //TODO: HandleCharacterCreate() - std::cout << "HandleCharacterCreate" << std::endl; + //prevent double message + if (characterMap.find(argPacket->characterIndex) != characterMap.end()) { + std::ostringstream msg; + msg << "Double character creation event; "; + msg << "Index: " << argPacket->characterIndex << "; "; + msg << "Handle: " << argPacket->handle; + throw(std::runtime_error(msg.str())); + } + + //implicity create and retrieve the entity + BaseCharacter& character = characterMap[argPacket->characterIndex]; + + //fill the character's info + character.SetOrigin({0, 0}); + character.SetMotion({0, 0}); + character.SetBounds({CHARACTER_BOUNDS_X, CHARACTER_BOUNDS_Y, CHARACTER_BOUNDS_WIDTH, CHARACTER_BOUNDS_HEIGHT}); + character.SetHandle(argPacket->handle); + character.SetAvatar(argPacket->avatar); + + //debug + std::cout << "Create, total: " << characterMap.size() << std::endl; } void InWorld::HandleCharacterDelete(CharacterPacket* const argPacket) { @@ -407,7 +448,4 @@ void InWorld::HandleCharacterDelete(CharacterPacket* const argPacket) { void InWorld::HandleCharacterQueryExists(CharacterPacket* const argPacket) { //TODO: HandleCharacterQueryExists() std::cout << "HandleCharacterQueryExists" << std::endl; - //NOTE: preexisting characters will result in query responses - //NOTE: new characters will result in create messages - //NOTE: this client's character will exist in both } \ No newline at end of file diff --git a/client/scenes/in_world.hpp b/client/scenes/in_world.hpp index ccf1c42..65e3ae6 100644 --- a/client/scenes/in_world.hpp +++ b/client/scenes/in_world.hpp @@ -44,6 +44,8 @@ //client #include "base_scene.hpp" +#include "base_character.hpp" +#include "base_monster.hpp" //STL #include @@ -99,6 +101,7 @@ protected: //indexes int& clientIndex; int& accountIndex; + int characterIndex = -1; //graphics Image buttonImage; @@ -120,6 +123,9 @@ protected: int marginX = 0, marginY = 0; } camera; + //entities + std::map characterMap; + std::map monsterMap; //heartbeat //TODO: Heartbeat needs it's own utility diff --git a/common/gameplay/character_defines.hpp b/common/gameplay/character_defines.hpp index d5ca3b6..7b759d1 100644 --- a/common/gameplay/character_defines.hpp +++ b/common/gameplay/character_defines.hpp @@ -35,4 +35,8 @@ constexpr int CHARACTER_BOUNDS_Y = 16; constexpr int CHARACTER_BOUNDS_WIDTH = 32; constexpr int CHARACTER_BOUNDS_HEIGHT = 32; +//the character's sprite format +constexpr int CHARACTER_CELLS_X = 4; +constexpr int CHARACTER_CELLS_Y = 4; + #endif