Skip to content

Commit

Permalink
basic objects via cista
Browse files Browse the repository at this point in the history
  • Loading branch information
Alex0vSky committed May 5, 2024
1 parent 4422731 commit ba0403e
Show file tree
Hide file tree
Showing 13 changed files with 256 additions and 57 deletions.
1 change: 1 addition & 0 deletions _msvcStuff/BattleCityEos.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -529,6 +529,7 @@ C:\Prj\_L\Qt\lib\Qt5QuickWidgets.lib %(AdditionalOptions)
<ItemGroup>
<ClCompile Include="..\src\app_state\game.cpp" />
<ClCompile Include="..\src\main.cpp" />
<ClCompile Include="..\src\net\net.cpp" />
<ClCompile Include="..\src\schema\cista\objects\bonus.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug_vanilla|Win32'">true</ExcludedFromBuild>
</ClCompile>
Expand Down
9 changes: 6 additions & 3 deletions _msvcStuff/BattleCityEos.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,9 @@
<Filter Include="Header Files\net">
<UniqueIdentifier>{b601e981-0163-4955-9482-e3c5042f3a45}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\net">
<UniqueIdentifier>{76ab27c3-b468-44cf-ae2a-ad42bc7f0ad8}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="stdafx.cpp">
Expand Down Expand Up @@ -198,6 +201,9 @@
<ClCompile Include="..\src\schema\cista\objects\tank.cpp">
<Filter>Source Files\objects\cista</Filter>
</ClCompile>
<ClCompile Include="..\src\net\net.cpp">
<Filter>Source Files\net</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="stdafx.h">
Expand Down Expand Up @@ -377,9 +383,6 @@
<CopyFileToFolders Include="..\..\..\_L\SDL\SDL2_ttf\lib\x86\SDL2_ttf.dll">
<Filter>Resource Files\SDL</Filter>
</CopyFileToFolders>
<CopyFileToFolders Include="..\..\..\_NuGetPackages\zeroc.ice.v142\3.7.10\build\native\bin\x64\Debug\ice37++11d.dll">
<Filter>Resource Files\zeroc.ice</Filter>
</CopyFileToFolders>
</ItemGroup>
<ItemGroup>
<CustomBuild Include="..\resource\proto\acme.proto" />
Expand Down
4 changes: 3 additions & 1 deletion src/app_state/game.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -483,7 +483,8 @@ void Game::clearLevel()
for(auto enemy : m_enemies) delete enemy;
m_enemies.clear();

for(auto player : m_players) delete player;
// tmp comment
//for(auto player : m_players) delete player;
m_players.clear();

for(auto bonus : m_bonuses) delete bonus;
Expand Down Expand Up @@ -678,6 +679,7 @@ 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
2 changes: 2 additions & 0 deletions src/app_state/game.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,10 +118,12 @@ class Game : public IAppState {
* Collection of enemies.
*/
std::vector<Enemy*> m_enemies;
protected: // tmp
/**
* Collection of remaining players.
*/
std::vector<Player*> m_players;
private: // tmp
/**
* Collection of killed players.
*/
Expand Down
64 changes: 32 additions & 32 deletions src/engine/spriteconfig.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,38 +10,38 @@ class SpriteConfig {
* Container storing all types of animations.
*/
std::map<sprite_t, SpriteData> m_configs {
{ sprite_t::ST_TANK_A, { 128, 0, 32, 32, 2, 100, true } }
, { sprite_t::ST_TANK_B, { 128, 64, 32, 32, 2, 100, true } }
, { sprite_t::ST_TANK_C, { 128, 128, 32, 32, 2, 100, true } }
, { sprite_t::ST_TANK_D, { 128, 192, 32, 32, 2, 100, true } }
, { sprite_t::ST_PLAYER_1, { 640, 0, 32, 32, 2, 50, true } }
, { sprite_t::ST_PLAYER_2, { 768, 0, 32, 32, 2, 50, true } }
, { sprite_t::ST_BRICK_WALL, { 928, 0, 16, 16, 1, 200, false } }
, { sprite_t::ST_STONE_WALL, { 928, 144, 16, 16, 1, 200, false } }
, { sprite_t::ST_WATER, { 928, 160, 16, 16, 2, 350, true } }
, { sprite_t::ST_BUSH, { 928, 192, 16, 16, 1, 200, false } }
, { sprite_t::ST_ICE, { 928, 208, 16, 16, 1, 200, false } }
, { sprite_t::ST_BONUS_GRENADE, { 896, 0, 32, 32, 1, 200, false } }
, { sprite_t::ST_BONUS_HELMET, { 896, 32, 32, 32, 1, 200, false } }
, { sprite_t::ST_BONUS_CLOCK, { 896, 64, 32, 32, 1, 200, false } }
, { sprite_t::ST_BONUS_SHOVEL, { 896, 96, 32, 32, 1, 200, false } }
, { sprite_t::ST_BONUS_TANK, { 896, 128, 32, 32, 1, 200, false } }
, { sprite_t::ST_BONUS_STAR, { 896, 160, 32, 32, 1, 200, false } }
, { sprite_t::ST_BONUS_GUN, { 896, 192, 32, 32, 1, 200, false } }
, { sprite_t::ST_BONUS_BOAT, { 896, 224, 32, 32, 1, 200, false } }
, { sprite_t::ST_SHIELD, { 976, 0, 32, 32, 2, 45, true } }
, { sprite_t::ST_CREATE, { 1008, 0, 32, 32, 10, 100, false } }
, { sprite_t::ST_DESTROY_TANK, { 1040, 0, 64, 64, 7, 70, false } }
, { sprite_t::ST_DESTROY_BULLET, { 1108, 0, 32, 32, 5, 40, false } }
, { sprite_t::ST_BOAT_P1, { 944, 96, 32, 32, 1, 200, false } }
, { sprite_t::ST_BOAT_P2, { 976, 96, 32, 32, 1, 200, false } }
, { sprite_t::ST_EAGLE, { 944, 0, 32, 32, 1, 200, false } }
, { sprite_t::ST_DESTROY_EAGLE, { 1040, 0, 64, 64, 7, 100, false } }
, { sprite_t::ST_FLAG, { 944, 32, 32, 32, 1, 200, false } }
, { sprite_t::ST_BULLET, { 944, 128, 8, 8, 1, 200, false } }
, { sprite_t::ST_LEFT_ENEMY, { 944, 144, 16, 16, 1, 200, false } }
, { sprite_t::ST_STAGE_STATUS, { 976, 64, 32, 32, 1, 200, false } }
, { sprite_t::ST_TANKS_LOGO, { 0, 260, 406, 72, 1, 200, false } }
{ sprite_t::ST_TANK_A, { 128, 0, 32, 32, 2, 100, true, sprite_t::ST_TANK_A } }
, { sprite_t::ST_TANK_B, { 128, 64, 32, 32, 2, 100, true, sprite_t::ST_TANK_B } }
, { sprite_t::ST_TANK_C, { 128, 128, 32, 32, 2, 100, true, sprite_t::ST_TANK_C } }
, { sprite_t::ST_TANK_D, { 128, 192, 32, 32, 2, 100, true, sprite_t::ST_TANK_D } }
, { sprite_t::ST_PLAYER_1, { 640, 0, 32, 32, 2, 50, true, sprite_t::ST_PLAYER_1 } }
, { sprite_t::ST_PLAYER_2, { 768, 0, 32, 32, 2, 50, true, sprite_t::ST_PLAYER_2 } }
, { sprite_t::ST_BRICK_WALL, { 928, 0, 16, 16, 1, 200, false, sprite_t::ST_BRICK_WALL } }
, { sprite_t::ST_STONE_WALL, { 928, 144, 16, 16, 1, 200, false, sprite_t::ST_STONE_WALL } }
, { sprite_t::ST_WATER, { 928, 160, 16, 16, 2, 350, true, sprite_t::ST_WATER } }
, { sprite_t::ST_BUSH, { 928, 192, 16, 16, 1, 200, false, sprite_t::ST_BUSH } }
, { sprite_t::ST_ICE, { 928, 208, 16, 16, 1, 200, false, sprite_t::ST_ICE } }
, { sprite_t::ST_BONUS_GRENADE, { 896, 0, 32, 32, 1, 200, false, sprite_t::ST_BONUS_GRENADE } }
, { sprite_t::ST_BONUS_HELMET, { 896, 32, 32, 32, 1, 200, false, sprite_t::ST_BONUS_HELMET } }
, { sprite_t::ST_BONUS_CLOCK, { 896, 64, 32, 32, 1, 200, false, sprite_t::ST_BONUS_CLOCK } }
, { sprite_t::ST_BONUS_SHOVEL, { 896, 96, 32, 32, 1, 200, false, sprite_t::ST_BONUS_SHOVEL } }
, { sprite_t::ST_BONUS_TANK, { 896, 128, 32, 32, 1, 200, false, sprite_t::ST_BONUS_TANK } }
, { sprite_t::ST_BONUS_STAR, { 896, 160, 32, 32, 1, 200, false, sprite_t::ST_BONUS_STAR } }
, { sprite_t::ST_BONUS_GUN, { 896, 192, 32, 32, 1, 200, false, sprite_t::ST_BONUS_GUN } }
, { sprite_t::ST_BONUS_BOAT, { 896, 224, 32, 32, 1, 200, false, sprite_t::ST_BONUS_BOAT } }
, { sprite_t::ST_SHIELD, { 976, 0, 32, 32, 2, 45, true, sprite_t::ST_SHIELD } }
, { sprite_t::ST_CREATE, { 1008, 0, 32, 32, 10, 100, false, sprite_t::ST_CREATE } }
, { sprite_t::ST_DESTROY_TANK, { 1040, 0, 64, 64, 7, 70, false, sprite_t::ST_DESTROY_TANK } }
, { sprite_t::ST_DESTROY_BULLET, { 1108, 0, 32, 32, 5, 40, false, sprite_t::ST_DESTROY_BULLET } }
, { sprite_t::ST_BOAT_P1, { 944, 96, 32, 32, 1, 200, false, sprite_t::ST_BOAT_P1 } }
, { sprite_t::ST_BOAT_P2, { 976, 96, 32, 32, 1, 200, false, sprite_t::ST_BOAT_P2 } }
, { sprite_t::ST_EAGLE, { 944, 0, 32, 32, 1, 200, false, sprite_t::ST_EAGLE } }
, { sprite_t::ST_DESTROY_EAGLE, { 1040, 0, 64, 64, 7, 100, false, sprite_t::ST_DESTROY_EAGLE } }
, { sprite_t::ST_FLAG, { 944, 32, 32, 32, 1, 200, false, sprite_t::ST_FLAG } }
, { sprite_t::ST_BULLET, { 944, 128, 8, 8, 1, 200, false, sprite_t::ST_BULLET } }
, { sprite_t::ST_LEFT_ENEMY, { 944, 144, 16, 16, 1, 200, false, sprite_t::ST_LEFT_ENEMY } }
, { sprite_t::ST_STAGE_STATUS, { 976, 64, 32, 32, 1, 200, false, sprite_t::ST_STAGE_STATUS } }
, { sprite_t::ST_TANKS_LOGO, { 0, 260, 406, 72, 1, 200, false, sprite_t::ST_TANKS_LOGO } }
};

public:
Expand Down
45 changes: 45 additions & 0 deletions src/engine/spritedata.h
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,49 @@ struct SpriteData {
* Variable specifying whether the animation is looped.
*/
bool loop = false;
/**
* Usefull in serialization.
*/
sprite_t type = sprite_t::ST_NONE;
};

#ifdef A0S_SCHEMA_CISTA
class SpriteDataWrapper {
template <typename Ctx> friend inline void serialize(Ctx & context, SpriteDataWrapper const* el,cista::offset_t const offset);
const SpriteData* m_sprite = nullptr;
sprite_t m_spriteType = sprite_t::ST_NONE;

public:
const SpriteData* operator ->() {
return m_sprite;
}
operator bool() const {
return nullptr != m_sprite;
}
SpriteDataWrapper& operator=(const SpriteData* sprite) {
if ( sprite ) {
m_spriteType = sprite ->type;
m_sprite = sprite;
} else {
m_spriteType = sprite_t::ST_NONE;
m_sprite = nullptr;
}
return *this;
}
SpriteDataWrapper& operator=(std::nullptr_t) {
return m_spriteType = sprite_t::ST_NONE, m_sprite = nullptr, *this;
}
bool operator==(std::nullptr_t) const {
return nullptr == m_sprite;
}
bool operator==(const SpriteData* sprite) const {
return sprite == m_sprite;
}
bool operator!=(const SpriteData* sprite) const {
return !( sprite == m_sprite );
}
sprite_t getType() const {
return m_spriteType;
}
};
#endif // A0S_SCHEMA_CISTA
67 changes: 67 additions & 0 deletions src/net/net.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
// Copyright 2024 Alex0vSky (https://github.com/Alex0vSky), Copyright 2015-2021 (https://github.com/KrystianKaluzny/Tanks)
#include "net.h"

namespace net {
void NetGame::update(Uint32 dt) {
// TODO(alex): get from network
constexpr auto MODE = cista::mode::NONE
| cista::mode::WITH_VERSION
| cista::mode::WITH_INTEGRITY
| cista::mode::DEEP_CHECK
;
if ( m_player ) {
std::vector< unsigned char > buffer;
NetPlayer *player;
buffer = cista::serialize< MODE >( *m_player );
player = cista::deserialize< NetPlayer, MODE >( buffer );
*m_player = *player;
__nop( );
}
// Initial rewrite
if ( !m_player ) {
for ( auto player : Game::m_players )
delete player;
Game::m_players.clear( );

unsigned playerIndex = 0;
m_player = 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 );
++playerIndex;
Game::m_players.push_back( m_player.get( ) );
}

Game::update( dt );
}
} // 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 {
return cista::hash_combine( h, cista::hash("SpriteDataWrapper") );
}

template <typename Ctx>
inline 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 ) );
serialize( context, &el ->m_spriteType, offset + offsetof( SpriteDataWrapper, m_spriteType ) );
}

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

for ( auto &bullet : el ->bullets )
bullet.m_sprite = sc ->getSpriteData( bullet.m_sprite.getType( ) );
}
74 changes: 74 additions & 0 deletions src/net/net.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
#pragma once // Copyright 2024 Alex0vSky (https://github.com/Alex0vSky), Copyright 2015-2021 (https://github.com/KrystianKaluzny/Tanks)
#include "iappstate.h"
#include "appconfig.h"
#include "game.h"

namespace net {

class NetPlayer : public Player {
using Player::Player;

public:
void update(Uint32 dt) override {
Tank::update( dt );
// Cut keyboard and audio processing
std::vector< Uint8 > keys;
{
int numkeys = 0;
const Uint8 *key_state = ::SDL_GetKeyboardState( &numkeys );
keys.resize( numkeys );
if ( key_state != nullptr )
memcpy( &keys[ 0 ], key_state, numkeys * sizeof( Uint8 ) );
//SDL_ResetKeyboard( );
}
if ( keys.size( ) ) {
m_movement = false;
Direction direction_ = Direction::D_INITIAL;
if ( keys[ player_keys.up ] )
direction_ = Direction::D_UP;
else if ( keys[ player_keys.down ] )
direction_ = Direction::D_DOWN;
else if ( keys[ player_keys.left ] )
direction_ = Direction::D_LEFT;
else if ( keys[ player_keys.right ] )
direction_ = Direction::D_RIGHT;
else if ( !testFlag( TankStateFlag::TSF_ON_ICE ) || m_slip_time == 0 )
speed = 0.0;
if ( Direction::D_INITIAL != direction_ )
setDirection( direction_ ), speed = default_speed, m_movement = true;
// TODO(alex): `Engine::getEngine( ).getAudio( ) ->playSound( ) ...`

if ( keys[ player_keys.fire ] && m_fire_time > AppConfig::player_reload_time )
fire( ), m_fire_time = 0;
}
m_fire_time += dt;
if(testFlag(TankStateFlag::TSF_LIFE))
src_rect = moveRect( m_sprite->rect
, (
testFlag(TankStateFlag::TSF_ON_ICE)
? static_cast< int >( new_direction )
: static_cast< int >( direction )
)
, m_current_frame + 2 * star_count);
else
src_rect = moveRect(m_sprite->rect, 0, m_current_frame + 2 * star_count);
stop = false;
}
};

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;

public:
/**
* Allows multi-player
*/
NetGame(int players_count) :
// tmp
Game( 1 )
{}
};
} // namespace net
5 changes: 4 additions & 1 deletion src/schema/cista/objects/object.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,12 @@ class Object {
*/
rect_t moveRect(const rect_t &rect, int x, int y);

public: // tmp
/**
* Animation corresponding to a given object type.
*/
const SpriteData* m_sprite;
SpriteDataWrapper m_sprite;
protected: // tmp
/**
* Display time of the current animation frame.
*/
Expand Down Expand Up @@ -93,6 +95,7 @@ class Object {
public:
auto cista_members() { return std::tie(
m_frame_display_time
, m_sprite
, m_current_frame
, to_erase
, collision_rect
Expand Down
4 changes: 2 additions & 2 deletions src/schema/cista/objects/player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Player::Player()
lives_count = 11;
m_bullet_max_size = AppConfig::player_bullet_max_size;
score = 0;
m_shield = new Object(0, 0, sprite_t::ST_SHIELD);
m_shield = Object(0, 0, sprite_t::ST_SHIELD);
m_shield_time = 0;
respawn();
}
Expand All @@ -23,7 +23,7 @@ Player::Player(double x, double y, SpriteType type, TankStateFlag tsf)
lives_count = 11;
m_bullet_max_size = AppConfig::player_bullet_max_size;
score = 0;
m_shield = new Object(x, y, sprite_t::ST_SHIELD);
m_shield = Object(x, y, sprite_t::ST_SHIELD);
m_shield_time = 0;
respawn();
}
Expand Down
2 changes: 2 additions & 0 deletions src/schema/cista/objects/player.h
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
* @brief Class corresponding to player tanks.
*/
class Player : public Tank {
protected: // tmp
/**
* Current number of stars; may be in the range [0, 3].
*/
Expand All @@ -22,6 +23,7 @@ class Player : public Tank {
*/
bool m_menu = false;

private: // tmp
public:
/**
* @brief A structure that holds the keys corresponding to the player's tank controls.
Expand Down
Loading

0 comments on commit ba0403e

Please sign in to comment.