Skip to content

Commit

Permalink
[MRG] Syncables
Browse files Browse the repository at this point in the history
* Add Syncable networking primitive, which can automatically synchronize it's fields between few instances.
* Inherite Object from Syncable and make name autosynchronizable.
* Serialize archives to archive.
* Minor Serializable changes.

PR #63
  • Loading branch information
Insineer authored Oct 8, 2019
2 parents ce14549 + b570353 commit 6122b80
Show file tree
Hide file tree
Showing 39 changed files with 522 additions and 185 deletions.
16 changes: 14 additions & 2 deletions GameLogic/Engine/Server.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ def __init__(self, impl):
def world() -> Engine.World.World:
return Engine.World.World(eGGame.world)

class Player(ePlayer, Engine.World.VerbsHolder):
class Player(ePlayer):
"""
Player class is persistent until restart. When player re-logins, existed Player instance is used.
Expand All @@ -47,10 +47,18 @@ class Player(ePlayer, Engine.World.VerbsHolder):
IsConnected() -> bool
returns True when player is online
AddVerb(name: str, action: Callable[[Player], None])
add new verb
Parametres
----------
name: str
verb's key. Use name to call verb from console
"""

def __init__(self, impl):
Engine.World.VerbsHolder.__init__(self, impl)
self._impl = impl

@property
def ckey(self) -> str:
Expand All @@ -66,6 +74,10 @@ def control(self, value: Engine.World.Control):
def IsConnected(self) -> bool:
return self._impl.IsConnected()

def AddVerb(self, name: str, action: Callable[[Engine.Server.Player], None]):
wrapper = lambda player: action(Engine.Server.Player(player))
self._impl.AddVerb(name, wrapper)


class ResourceManager(eResourceManager):
"""
Expand Down
45 changes: 13 additions & 32 deletions GameLogic/Engine/World.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,37 +125,7 @@ def GetDenseObject(self, directions: DirectionSet) -> Object:
return self._impl.GetDenseObject(directions._impl)


class VerbsHolder(eVerbsHolder):
"""
Inheritance from this class allow to define special actions without
arguments which can be called with command from console
VerbsHolder is registrated with unique name, so player can call it's verbs.
For example, class Player registrated with name "Player".
So player's verb "Drop" can be called with next command: "Player.Drop"
Methods
-------
AddVerb(name: str, action: Callable[[Player], None])
add new verb
Parametres
----------
name: str
verb's key. Use name to call verb from console
"""

def __init__(self, impl):
self._impl = impl

def AddVerb(self, name: str, action: Callable[[Engine.Server.Player], None]):
wrapper = lambda player: action(Engine.Server.Player(player))
eVerbsHolder.AddVerb(self._impl, name, wrapper)


class Object(eObject, VerbsHolder):
class Object(eObject):
"""
Any game object
Expand Down Expand Up @@ -313,6 +283,14 @@ class Object(eObject, VerbsHolder):
Note: "animation" is animated sprite. Thus "id" is sprite id.
AddVerb(name: str, action: Callable[[Player], None])
add new verb
Parametres
----------
name: str
verb's key. Use name to call verb from console
Delete(self):
delete object
Expand Down Expand Up @@ -343,7 +321,6 @@ class Object(eObject, VerbsHolder):

def __init__(self):
eObject.__init__(self)
VerbsHolder.__init__(self, self)
self.name = str(self.defName)
self.sprite = str(self.defSprite)
self.description = str(self.defDescription)
Expand Down Expand Up @@ -490,6 +467,10 @@ def SetSpriteState(self, state: ItemSpriteState):
def PlayAnimation(self, id: str, callback: Callable[[], None] = None) -> bool:
return super().PlayAnimation(id, callback)

def AddVerb(self, name: str, action: Callable[[Engine.Server.Player], None]):
wrapper = lambda player: action(Engine.Server.Player(player))
super().AddVerb(name, wrapper)

def Delete(self):
super().Delete()

Expand Down
8 changes: 4 additions & 4 deletions OSS13 Client/OSS13 Client.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@
<ClCompile />
<Link>
<AdditionalOptions>/ignore:4099 %(AdditionalOptions)</AdditionalOptions>
<AdditionalDependencies>opengl32.lib;winmm.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>opengl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<EntryPointSymbol>mainCRTStartup</EntryPointSymbol>
<SubSystem>Windows</SubSystem>
</Link>
Expand All @@ -88,7 +88,7 @@
</ClCompile>
<Link>
<AdditionalOptions>/ignore:4099 %(AdditionalOptions)</AdditionalOptions>
<AdditionalDependencies>opengl32.lib;winmm.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>opengl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<EntryPointSymbol>mainCRTStartup</EntryPointSymbol>
<SubSystem>Windows</SubSystem>
</Link>
Expand All @@ -102,7 +102,7 @@
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>opengl32.lib;winmm.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>opengl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<EntryPointSymbol>mainCRTStartup</EntryPointSymbol>
<SubSystem>Windows</SubSystem>
</Link>
Expand All @@ -116,7 +116,7 @@
<Link>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>opengl32.lib;winmm.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>opengl32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<EntryPointSymbol>mainCRTStartup</EntryPointSymbol>
<SubSystem>Windows</SubSystem>
</Link>
Expand Down
5 changes: 3 additions & 2 deletions OSS13 Client/Sources/Graphics/TileGrid/Object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,14 @@
#include <Graphics/Sprite.hpp>
#include <Graphics/TileGrid/TileGrid.hpp>

Object::Object(const network::protocol::ObjectInfo &objectInfo) {
Object::Object(network::protocol::ObjectInfo &&objectInfo) {
for (auto &sprite : objectInfo.spriteIds) {
AddSprite(uint(sprite));
}

static_cast<network::sync::ObjectSyncFields &>(*this) = std::move(objectInfo.fields);

id = objectInfo.id;
name = objectInfo.name;
layer = objectInfo.layer;
direction = objectInfo.direction;
density = objectInfo.density;
Expand Down
6 changes: 3 additions & 3 deletions OSS13 Client/Sources/Graphics/TileGrid/Object.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include <Shared/Geometry/DirectionSet.h>
#include <Shared/Global.hpp>
#include <Shared/Network/Protocol/ServerToClient/WorldInfo.h>
#include <Shared/Network/Syncable/ObjectSyncFields.h>

class Sprite;
class Tile;
Expand All @@ -22,9 +23,9 @@ namespace sf {

#include "iostream"

class Object {
class Object : public network::sync::ObjectSyncFields {
public:
explicit Object(const network::protocol::ObjectInfo &objectInfo);
explicit Object(network::protocol::ObjectInfo &&objectInfo);

Object &operator=(Object &) = default;
~Object();
Expand Down Expand Up @@ -62,7 +63,6 @@ class Object {

private:
uint id{};
std::string name;
std::vector<::Sprite> sprites;
::Sprite animation;
bool animationProcess{};
Expand Down
10 changes: 6 additions & 4 deletions OSS13 Client/Sources/Graphics/TileGrid/Tile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,20 +15,22 @@ Tile::Tile(TileGrid *tileGrid) :
overlay.setCharacterSize(10);
}

Tile::Tile(TileGrid *tileGrid, const network::protocol::TileInfo &tileInfo) :
Tile::Tile(TileGrid *tileGrid, network::protocol::TileInfo &&tileInfo) :
Tile(tileGrid)
{
sprite = CC::Get()->RM.CreateSprite(uint(tileInfo.sprite));

for (auto &objInfo : tileInfo.content) {
auto &objects = GetTileGrid()->GetObjects();

auto iter = objects.find(objInfo.id);
auto id = objInfo.id;

auto iter = objects.find(id);
if (iter == objects.end()) {
objects[objInfo.id] = std::make_unique<Object>(objInfo);
objects[id] = std::make_unique<Object>(std::forward<network::protocol::ObjectInfo>(objInfo));
}

AddObject(objects[objInfo.id].get());
AddObject(objects[id].get());
}
Resize(GetTileGrid()->GetTileSize());
}
Expand Down
2 changes: 1 addition & 1 deletion OSS13 Client/Sources/Graphics/TileGrid/Tile.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ namespace sf {
class Tile : public INonCopyable {
public:
explicit Tile(TileGrid *tileGrid);
Tile(TileGrid *tileGrid, const network::protocol::TileInfo &tileInfo);
Tile(TileGrid *tileGrid, network::protocol::TileInfo &&tileInfo);
Tile(Tile &&) = default;
Tile &operator=(Tile &&) = default;
~Tile();
Expand Down
7 changes: 7 additions & 0 deletions OSS13 Client/Sources/Graphics/TileGrid/TileGrid.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -356,6 +356,13 @@ void TileGrid::RemoveObject(uint id) {
LOGE << "Error: object with id " << id << " doesn't exist (TileGrid::RemoveObject)";
}

void TileGrid::AmendObjectChanges(network::protocol::FieldsDiff &&diff) {
auto iter = objects.find(diff.objId);
EXPECT(iter != objects.end());
auto &obj = iter->second;
obj->AmendChanges(std::forward<uf::SyncableChanges>(diff.fieldsChanges));
}

void TileGrid::RelocateObject(uint id, apos toVec, int toObjectNum) {
Tile *tile = GetTileAbs(toVec);
if (!tile) {
Expand Down
2 changes: 2 additions & 0 deletions OSS13 Client/Sources/Graphics/TileGrid/TileGrid.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

#include <Shared/Types.hpp>
#include <Shared/Network/Protocol/ServerToClient/OverlayInfo.h>
#include <Shared/Network/Protocol/ServerToClient/Diff.h>

#include <Shared/Grid.hpp>

Expand Down Expand Up @@ -40,6 +41,7 @@ class TileGrid : public Container {
// Differences commiting
void AddObject(Object *object);
void RemoveObject(uint id);
void AmendObjectChanges(network::protocol::FieldsDiff &&diff);
void RelocateObject(uint id, apos toVec, int toObjectNum);
void SetMoveIntentObject(uint id, uf::Direction direction);
void MoveObject(uint id, uf::Direction direction, float speed);
Expand Down
17 changes: 8 additions & 9 deletions OSS13 Client/Sources/Network/Connection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -90,10 +90,10 @@ void Connection::session() {
sendCommands();
working = true;
}
sf::Packet packet;
if (socket.receive(packet) == sf::Socket::Done) {
auto packet = std::make_unique<sf::Packet>();
if (socket.receive(*packet) == sf::Socket::Done) {
try {
parsePacket(packet);
parsePacket(std::move(packet));
} catch (const std::exception &e) {
MANAGE_EXCEPTION(e);
}
Expand All @@ -107,22 +107,21 @@ void Connection::session() {

void Connection::sendCommands() {
while (!commandQueue.Empty()) {
sf::Packet packet;
uf::InputArchive ar(packet);
uf::Archive ar;
Command *temp = commandQueue.Pop();
ar << *temp;
if (temp) delete temp;
while (socket.send(packet) == sf::Socket::Partial);
while (socket.send(ar.GetPacket()) == sf::Socket::Partial);
}
}

bool Connection::parsePacket(sf::Packet &packet) {
uf::OutputArchive ar(packet);
bool Connection::parsePacket(std::unique_ptr<sf::Packet> packet) {
uf::Archive ar(std::move(packet));
auto serializable = ar.UnpackSerializable();
auto generalCommand = uptr<network::protocol::Command>(dynamic_cast<network::protocol::Command *>(serializable.release()));

if (!generalCommand) {
LOGE << "Unknown serializable (id is 0x" << std::hex << serializable->Id() << ") is received!";
LOGE << "Unknown serializable (id is 0x" << std::hex << serializable->SerID() << ") is received!";
return false;
}

Expand Down
2 changes: 1 addition & 1 deletion OSS13 Client/Sources/Network/Connection.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class Connection {
private:
static void session();
static void sendCommands();
static bool parsePacket(sf::Packet &);
static bool parsePacket(std::unique_ptr<sf::Packet> packet);

private:
static Status status;
Expand Down
8 changes: 5 additions & 3 deletions OSS13 Client/Sources/Network/SyncCommandsProcessor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ void SyncCommandsProcessor::ProcessCommand(network::protocol::Command &generalCo
_REGISTRATE_COMMAND_PROCESSOR(UpdateWindowCommand);
_REGISTRATE_COMMAND_PROCESSOR(AddChatMessageCommand);

LOGE << __FUNCTION__ << ": unknown command (ser id is 0x" << std::hex << generalCommand.Id() << ") was not processed!";
LOGE << __FUNCTION__ << ": unknown command (ser id is 0x" << std::hex << generalCommand.SerID() << ") was not processed!";
}

void SyncCommandsProcessor::commandProcessor_AuthorizationSuccessCommand(network::protocol::server::AuthorizationSuccessCommand &) {
Expand Down Expand Up @@ -65,7 +65,7 @@ void SyncCommandsProcessor::commandProcessor_GraphicsUpdateCommand(network::prot
tileGrid->ShiftBlocks(command.firstTile);

for (auto &tileInfo : command.tilesInfo) {
tileGrid->SetBlock(tileInfo.coords, std::make_shared<Tile>(tileGrid, tileInfo));
tileGrid->SetBlock(tileInfo.coords, std::make_shared<Tile>(tileGrid, std::move(tileInfo)));
}
}
if (command.options & server::GraphicsUpdateCommand::Option::CAMERA_MOVE) {
Expand All @@ -74,11 +74,13 @@ void SyncCommandsProcessor::commandProcessor_GraphicsUpdateCommand(network::prot
if (command.options & server::GraphicsUpdateCommand::Option::DIFFERENCES) {
for (auto &generalDiff : command.diffs) {
if (auto *diff = dynamic_cast<network::protocol::AddDiff *>(generalDiff.get())) {
auto obj = std::make_unique<Object>(diff->objectInfo);
auto obj = std::make_unique<Object>(std::move(diff->objectInfo));
tileGrid->AddObject(obj.release());
tileGrid->RelocateObject(diff->objId, diff->coords, diff->layer);
} else if (auto *diff = dynamic_cast<network::protocol::RemoveDiff *>(generalDiff.get())) {
tileGrid->RemoveObject(diff->objId);
} else if (auto *diff = dynamic_cast<network::protocol::FieldsDiff *>(generalDiff.get())) {
tileGrid->AmendObjectChanges(std::forward<network::protocol::FieldsDiff>(*diff));
} else if (auto *diff = dynamic_cast<network::protocol::RelocateDiff *>(generalDiff.get())) {
tileGrid->RelocateObject(diff->objId, diff->newCoords, diff->layer);
} else if (auto *diff = dynamic_cast<network::protocol::MoveIntentDiff *>(generalDiff.get())) {
Expand Down
4 changes: 0 additions & 4 deletions OSS13 Server/OSS13 Server.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,6 @@
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalOptions>/ignore:4099 %(AdditionalOptions)</AdditionalOptions>
<AdditionalDependencies>winmm.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>Console</SubSystem>
</Link>
<ClCompile>
Expand All @@ -93,7 +92,6 @@
<Link>
<GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalOptions>/ignore:4099 %(AdditionalOptions)</AdditionalOptions>
<AdditionalDependencies>winmm.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>Console</SubSystem>
</Link>
<ClCompile>
Expand All @@ -107,7 +105,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>winmm.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>Console</SubSystem>
</Link>
<ClCompile>
Expand All @@ -121,7 +118,6 @@
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<AdditionalDependencies>winmm.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
<SubSystem>Console</SubSystem>
</Link>
<ClCompile>
Expand Down
Loading

0 comments on commit 6122b80

Please sign in to comment.