Skip to content

Commit

Permalink
before 'dynamic_cast' Brick trouble
Browse files Browse the repository at this point in the history
  • Loading branch information
Alex0vSky committed Jun 3, 2024
1 parent f7e3e8c commit d198f4c
Show file tree
Hide file tree
Showing 4 changed files with 96 additions and 47 deletions.
4 changes: 3 additions & 1 deletion src/engine/spritedata.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,9 @@ struct SpriteData {

#ifdef A0S_SCHEMA_CISTA
class SpriteDataWrapper {
template <typename Ctx> friend inline void serialize(Ctx & context, SpriteDataWrapper const* el,cista::offset_t const offset);
template <typename Ctx> friend void serialize(Ctx & context, SpriteDataWrapper const* el,cista::offset_t const offset);
template <typename Ctx> friend void deserialize(Ctx const& c, SpriteDataWrapper* el);

const SpriteData* m_sprite = nullptr;
sprite_t m_spriteType = sprite_t::ST_NONE;

Expand Down
133 changes: 88 additions & 45 deletions src/net/net.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
// Copyright 2024 Alex0vSky (https://github.com/Alex0vSky), Copyright 2015-2021 (https://github.com/KrystianKaluzny/Tanks)
#include "net.h"

namespace net {

void NetPlayer::update(Uint32 dt) {
Expand Down Expand Up @@ -53,76 +52,111 @@ NetGame::NetGame(int players_count) :
Game( 1 )
{}

//template<typename T> using store_t = std::vector< T >;
template<typename T> using store_t = cista::offset::vector< T >;
struct FullMap {
store_t< store_t< Object > > level;
};
template<typename T1, typename T2>
void assignment(T1& lhs, T2 const& rhs) {
lhs.reserve( rhs.size( ) );
std::transform(
rhs.begin( ), rhs.end( ), std::back_inserter( lhs )
, [](T2::value_type const& element) {
T1::value_type row;
row.reserve( element.size( ) );
std::copy( element.begin( ), element.end( ), std::back_inserter( row ) );
return row;
}
);
}

void NetGame::update(Uint32 dt) {
if ( m_player ) {
if ( m_playerPtr ) {
//NetPlayer *player;
//cista::byte_buf buffer = cista::serialize< c_MODE >( *m_player );
//cista::byte_buf buffer = cista::serialize< c_MODE >( *m_playerPtr );
//player = cista::deserialize< NetPlayer, c_MODE >( buffer );
//*m_player = *player;
//*m_playerPtr = *player;

FullMap fullMap;
using Tx = tx::Exchanger;
m_tx.update(
[this](Tx *tx) mutable ->Tx::awaitable {
cista::byte_buf buffer;
if ( co_await tx ->clientSide( Tx::Command::GetFullMap, &buffer ) ) {
level_t level = *cista::deserialize< level_t, c_MODE >( buffer );
//std::vector< std::vector< Object > > level_;
//assignment( level_, level );

//const auto size = NetGame::m_level.size( );
//NetGame::m_level.clear( );
//NetGame::m_level.reserve( size );
std::copy( level.begin( ), level.end( ), NetGame::m_level.begin( ) );

std::vector< std::vector< Object > > level_;
assignment( level_, NetGame::m_level );
__nop( );

}
if ( co_await tx ->clientSide( Tx::Command::Something, &buffer ) )
*m_player = *cista::deserialize< NetPlayer, c_MODE >( buffer );
//FullMap fullMap0 = *cista::deserialize< FullMap, c_MODE >( buffer );
*m_playerPtr = *cista::deserialize< NetPlayer, c_MODE >( buffer );
}
, [this, &fullMap](Tx *tx) mutable ->Tx::awaitable {
// +-TODO(alex): makeme Command::GetFullMap
for ( auto &levelRow : m_level ) {
store_t< Object > sendRow;
unsigned countActive = 0;
for ( auto &item : levelRow ) {
if ( item )
{
sendRow.push_back( *item );
//++countActive;
//cista::byte_buf buffer2 = cista::serialize< c_MODE >( *item );
//__nop( );
}
else
sendRow.push_back( { } );
}
//if ( countActive ) {
// cista::byte_buf buffer0 = cista::serialize< c_MODE >( sendRow );
// __nop( );
//}
fullMap.level.push_back( sendRow );
}
//cista::byte_buf buffer1 = cista::serialize< c_MODE >( fullMap );
cista::byte_buf buffer2 = cista::serialize< c_MODE >( *m_player );
, [this](Tx *tx) mutable ->Tx::awaitable {
//level_t level;
//std::transform( Game::m_level.begin( ), Game::m_level.end( ), std::back_inserter( level )
// , [](std::vector< Object* > const& element) {
// store_t< Object > row;
// std::transform( element.begin( ), element.end( ), std::back_inserter( row )
// , [](Object *element) {
// if ( element )
// return *element;
// else
// return Object( );
// }
// );
// return row;
// }
// );

std::vector< std::vector< Object > > level_;
assignment( level_, NetGame::m_level );

co_await tx ->serverSide( )
//->on( Tx::Command::GetFullMap, buffer1 )
->on( Tx::Command::Something, buffer2 )
//->on( Tx::Command::GetFullMap, cista::serialize< c_MODE >( level ) )
->on( Tx::Command::GetFullMap, cista::serialize< c_MODE >( NetGame::m_level ) )
->on( Tx::Command::Something, cista::serialize< c_MODE >( *m_playerPtr ) )
->finish( )
;
}
);
__nop( );
}
// Initial rewrite
if ( !m_player ) {
if ( !m_playerPtr ) {
for ( auto player : Game::m_players )
delete player;
Game::m_players.clear( );

unsigned playerIndex = 0;
m_player = std::make_shared< NetPlayer > (
m_playerPtr = std::make_shared< NetPlayer > (
AppConfig::player_starting_point.at( playerIndex ).x
, AppConfig::player_starting_point.at( playerIndex ).y
, sprite_t::ST_PLAYER_1
);
m_player ->player_keys = AppConfig::player_keys.at( playerIndex );
m_playerPtr ->player_keys = AppConfig::player_keys.at( playerIndex );
++playerIndex;
Game::m_players.push_back( m_player.get( ) );
Game::m_players.push_back( m_playerPtr.get( ) );

NetGame::m_level.resize( Game::m_level.size( ) );
std::for_each( Game::m_level.begin( ), Game::m_level.end( ), [this](std::vector<Object *> &element) {
int i = &element - &Game::m_level[ 0 ];
NetGame::m_level[ i ].resize( element.size( ) );
int j = -1;
for ( auto &object : element ) {
++j;
if ( !object ) continue;
NetGame::m_level[ i ][ j ] = *object;
delete object;
object = &NetGame::m_level[ i ][ j ];
}
} );

std::vector< std::vector< Object > > level_;
assignment( level_, NetGame::m_level );
__nop( );
}

Game::update( dt );
Expand Down Expand Up @@ -193,7 +227,6 @@ void NetGame::draw() {

renderer->flush();
}

} // namespace net

using hash_t = cista::hash_t;
Expand All @@ -203,13 +236,23 @@ hash_t type_hash(SpriteDataWrapper const& el, hash_t h,
}

template <typename Ctx>
inline void serialize(Ctx & context, SpriteDataWrapper const* el, cista::offset_t const offset) {
void serialize(Ctx & context, SpriteDataWrapper const* el, cista::offset_t const offset) {
using cista::serialize;
//serialize( context, &el ->m_sprite, offset + offsetof( SpriteDataWrapper, m_sprite ) );
context.write( offset + offsetof( SpriteDataWrapper, m_sprite ), nullptr );
serialize( context, &el ->m_spriteType, offset + offsetof( SpriteDataWrapper, m_spriteType ) );
}

template <typename Ctx>
void deserialize(Ctx const& c, SpriteDataWrapper* el) {
const auto &sc = Engine::getEngine( ).getSpriteConfig( );
const SpriteData* spriteData = nullptr;
const sprite_t spriteType = el ->getType( );
if ( sprite_t::ST_NONE != spriteType )
spriteData = sc ->getSpriteData( spriteType );
*el = spriteData;
}

template <typename Ctx>
void deserialize(Ctx const& c, net::NetPlayer* el) {
const auto &sc = Engine::getEngine().getSpriteConfig();
Expand Down
5 changes: 4 additions & 1 deletion src/net/net.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,10 @@ class NetGame : public ::Game {
void update(Uint32 dt) override;

// TODO(alex): uglyAndFast, omitt `static`, delete in App::run
inline static std::shared_ptr< NetPlayer > m_player;
inline static std::shared_ptr< NetPlayer > m_playerPtr;
template<typename T> using store_t = cista::offset::vector< T >;
using level_t = store_t< store_t< Object > >;
level_t m_level;

public:
/**
Expand Down
1 change: 1 addition & 0 deletions src/net/tx/exchanger.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include "net/tx/exchanger.h"
namespace net::tx {
boost::asio::awaitable<bool> Exchanger::clientSide(Commander::Command command, unit_t *buffer) {
buffer ->clear( );
tcp::socket socket( co_await boost::asio::this_coro::executor );
auto [error1] = co_await socket.async_connect( c_endpointClient, c_tuple );
if ( error1 )
Expand Down

0 comments on commit d198f4c

Please sign in to comment.