Skip to content

Commit

Permalink
destructible brick
Browse files Browse the repository at this point in the history
  • Loading branch information
Alex0vSky committed Jun 5, 2024
1 parent d198f4c commit 8e6f8d6
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 61 deletions.
1 change: 1 addition & 0 deletions _msvcStuff/stdafx.h
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@
# if BOOST_VERSION != 107700
# error "my msvc support only boost BOOST_LIB_VERSION 1_77"
# endif //BOOST_VERSION != 107700
# include <variant>
#endif // A0S_SCHEMA_CISTA

// resources binToHex
Expand Down
1 change: 0 additions & 1 deletion src/app_state/game.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -680,7 +680,6 @@ void Game::checkCollisionBulletWithLevel(Bullet* bullet)
for(int i = row_start; i <= row_end; i++)
for(int j = column_start; j <= column_end; j++)
{
// TODO(alex): exception 'std::out_of_range' on j
o = m_level.at(i).at(j);
if(o == nullptr) continue;
if(o->type == sprite_t::ST_ICE || o->type == sprite_t::ST_WATER) continue;
Expand Down
93 changes: 43 additions & 50 deletions src/net/net.cpp
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
// 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) {
Tank::update( dt );
// Cut keyboard and audio processing
Expand Down Expand Up @@ -69,56 +68,50 @@ void assignment(T1& lhs, T2 const& rhs) {
void NetGame::update(Uint32 dt) {
if ( m_playerPtr ) {
//NetPlayer *player;
//cista::byte_buf buffer = cista::serialize< c_MODE >( *m_playerPtr );
//player = cista::deserialize< NetPlayer, c_MODE >( buffer );
//cista::byte_buf buffer = serialize( *m_playerPtr );
//player = deserialize< c_MODE >( buffer );
//*m_playerPtr = *player;

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 );
level_t level = *deserialize< level_t >( buffer );
std::copy( level.begin( ), level.end( ), NetGame::m_level.begin( ) );

std::vector< std::vector< Object > > level_;
assignment( level_, NetGame::m_level );
__nop( );
forEachLevel( [this](int i, int j, Object *&object) {
auto &ref = NetGame::m_level[ i ][ j ];
if ( auto* pval = std::get_if< Object >( &ref ) ) {
*object = *pval;
}
if ( auto* pval = std::get_if< Brick >( &ref ) ) {
*object = *pval;
}
} );

//std::vector< std::vector< element_t > > level_;
//assignment( level_, NetGame::m_level ); // tmp check
//__nop( );
}
if ( co_await tx ->clientSide( Tx::Command::Something, &buffer ) )
*m_playerPtr = *cista::deserialize< NetPlayer, c_MODE >( buffer );
*m_playerPtr = *deserialize< NetPlayer >( buffer );
}
, [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;
// }
// );
forEachLevel( [this](int i, int j, Object *&object) {
auto &ref = NetGame::m_level[ i ][ j ];
if ( Brick* brick = dynamic_cast< Brick* >( object ) )
ref = *brick;
else
ref = *object;
} );

std::vector< std::vector< Object > > level_;
assignment( level_, NetGame::m_level );
//std::vector< std::vector< element_t > > level_;
//assignment( level_, NetGame::m_level ); // tmp check

co_await tx ->serverSide( )
//->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 ) )
->on( Tx::Command::GetFullMap, serialize( NetGame::m_level ) )
->on( Tx::Command::Something, serialize( *m_playerPtr ) )
->finish( )
;
}
Expand All @@ -144,19 +137,11 @@ void NetGame::update(Uint32 dt) {
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( );
//std::vector< std::vector< element_t > > level_;
//assignment( level_, NetGame::m_level ); // tmp check
//__nop( );
}

Game::update( dt );
Expand All @@ -175,9 +160,9 @@ void NetGame::draw() {
else
{
renderer->drawRect(&AppConfig::map_rect, {0, 0, 0, 0}, true);
//for(auto row : m_level)
// for(auto item : row)
// if(item != nullptr) item->draw();
for(auto row : Game::m_level)
for(auto item : row)
if(item != nullptr) item->draw();

for(auto player : m_players) player->draw();
//for(auto enemy : m_enemies) enemy->draw();
Expand Down Expand Up @@ -230,8 +215,16 @@ void NetGame::draw() {
} // namespace net

using hash_t = cista::hash_t;
hash_t type_hash(SpriteDataWrapper const& el, hash_t h,
std::map<hash_t, unsigned>& done) noexcept {

hash_t type_hash(net::NetGame::element_t const& el, hash_t h, std::map< hash_t, unsigned >& done) noexcept {
return cista::hash_combine( h, cista::hash( "net::NetGame::element_t" ) );
}

// Empty
template <typename Ctx>
void serialize(Ctx & context, net::NetGame::element_t const* el, cista::offset_t const offset) {}

hash_t type_hash(SpriteDataWrapper const& el, hash_t h, std::map< hash_t, unsigned >& done) noexcept {
return cista::hash_combine( h, cista::hash("SpriteDataWrapper") );
}

Expand Down
55 changes: 45 additions & 10 deletions src/net/net.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,15 @@ class NetGame : public ::Game {
| cista::mode::WITH_INTEGRITY
| cista::mode::DEEP_CHECK
;

tx::Exchanger m_tx;

void update(Uint32 dt) override;

// TODO(alex): uglyAndFast, omitt `static`, delete in App::run
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;
template <class C>
struct TypeIdentifier {
constexpr static int _id{ };
constexpr static auto id() {
return &_id;
}
};
static constexpr auto c_idBrick = TypeIdentifier< Brick >::id( );
static constexpr auto c_idObject = TypeIdentifier< Object >::id( );

public:
/**
Expand All @@ -37,5 +36,41 @@ class NetGame : public ::Game {
NetGame(int players_count);

void draw() override;

// default-constructed variant holds a value of its first alternative: nullptr_t
using element_t = std::variant< nullptr_t, Object, Brick >;

private:
template<typename T> using container_t = cista::offset::vector< T >;
using level_t = container_t< container_t< element_t > >;

// TODO(alex): uglyAndFast, omitt `static`, delete in App::run
inline static std::shared_ptr< NetPlayer > m_playerPtr;
tx::Exchanger m_tx;
level_t m_level;

template <typename... Args>
static constexpr auto serialize(Args&&... args) {
return cista::serialize< c_MODE >( std::forward< Args >( args )... );
}
template <typename T>
static constexpr auto deserialize(cista::byte_buf const& buffer) {
return cista::deserialize< T, c_MODE >( buffer);
}

using func_t = std::function< void(int i, int j, Object *&object) >;
void forEachLevel(func_t cb) {
std::for_each( Game::m_level.begin( ), Game::m_level.end( ), [this, cb](std::vector<Object *> &element) {
int i = &element - &Game::m_level[ 0 ];
int j = -1;
for ( Object *&object : element ) {
++j;
if ( !object )
continue;
cb( i, j, object );
}
} );
}
void update(Uint32 dt) override;
};
} // namespace net

0 comments on commit 8e6f8d6

Please sign in to comment.