more sketching
This commit is contained in:
parent
0219d24647
commit
57c1f7d22d
@ -31,6 +31,11 @@ endif()
|
|||||||
add_library(solanaceae_toxic_games
|
add_library(solanaceae_toxic_games
|
||||||
./solanaceae/toxic_games/toxic_games.hpp
|
./solanaceae/toxic_games/toxic_games.hpp
|
||||||
./solanaceae/toxic_games/toxic_games.cpp
|
./solanaceae/toxic_games/toxic_games.cpp
|
||||||
|
|
||||||
|
./solanaceae/toxic_games/toxic_game_i.hpp
|
||||||
|
|
||||||
|
./solanaceae/toxic_games/games/chess.hpp
|
||||||
|
./solanaceae/toxic_games/games/chess.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_libraries(solanaceae_toxic_games PUBLIC
|
target_link_libraries(solanaceae_toxic_games PUBLIC
|
||||||
|
16
src/solanaceae/toxic_games/games/chess.cpp
Normal file
16
src/solanaceae/toxic_games/games/chess.cpp
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
#include "./chess.hpp"
|
||||||
|
|
||||||
|
Chess::Chess(ToxicGames& tg) : ToxicGameI(tg) {
|
||||||
|
}
|
||||||
|
|
||||||
|
Chess::~Chess(void) {
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<Chess::InstanceI> Chess::createGame(std::vector<uint32_t> with) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<Chess::InstanceI> Chess::acceptInvite(uint32_t from, uint32_t id) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
29
src/solanaceae/toxic_games/games/chess.hpp
Normal file
29
src/solanaceae/toxic_games/games/chess.hpp
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "../toxic_game_i.hpp"
|
||||||
|
|
||||||
|
struct Chess final : public ToxicGameI {
|
||||||
|
Chess(ToxicGames& tg);
|
||||||
|
~Chess(void);
|
||||||
|
|
||||||
|
struct ChessInstance final : public ToxicGameI::InstanceI {
|
||||||
|
~ChessInstance(void) {}
|
||||||
|
|
||||||
|
// TODO: just destructor?
|
||||||
|
// needs to send quit to peers?
|
||||||
|
void quit(void) override;
|
||||||
|
|
||||||
|
bool allInvitesAccepted(void) override;
|
||||||
|
|
||||||
|
void onPacket(uint32_t from, const uint8_t* data, const uint32_t data_size) override;
|
||||||
|
|
||||||
|
// ??
|
||||||
|
//virtual void tick();
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t getGameType(void) const override { return 1; };
|
||||||
|
|
||||||
|
std::unique_ptr<InstanceI> createGame(std::vector<uint32_t> with) override;
|
||||||
|
std::unique_ptr<InstanceI> acceptInvite(uint32_t from, uint32_t id) override;
|
||||||
|
};
|
||||||
|
|
55
src/solanaceae/toxic_games/toxic_game_i.hpp
Normal file
55
src/solanaceae/toxic_games/toxic_game_i.hpp
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <memory>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
//#include <solanaceae/contact/contact_model3.hpp>
|
||||||
|
//enum class Contact3 : uint32_t {};
|
||||||
|
|
||||||
|
// fwd
|
||||||
|
class ToxicGames;
|
||||||
|
|
||||||
|
// static state/info + dynamic factory
|
||||||
|
struct ToxicGameI {
|
||||||
|
ToxicGames& _tg;
|
||||||
|
|
||||||
|
ToxicGameI(ToxicGames& tg) : _tg(tg) {}
|
||||||
|
virtual ~ToxicGameI(void) {}
|
||||||
|
|
||||||
|
struct InstanceI {
|
||||||
|
uint32_t _id;
|
||||||
|
|
||||||
|
virtual ~InstanceI(void) {}
|
||||||
|
|
||||||
|
// TODO: just destructor?
|
||||||
|
// needs to send quit to peers?
|
||||||
|
virtual void quit(void) = 0;
|
||||||
|
|
||||||
|
// use state instead?
|
||||||
|
// toxic game states:
|
||||||
|
// - none
|
||||||
|
// - paused
|
||||||
|
// - running
|
||||||
|
// - finished
|
||||||
|
// - invalid
|
||||||
|
virtual bool allInvitesAccepted(void) = 0;
|
||||||
|
|
||||||
|
virtual void onPacket(uint32_t from, const uint8_t* data, const uint32_t data_size) = 0;
|
||||||
|
|
||||||
|
// ??
|
||||||
|
//virtual void tick();
|
||||||
|
};
|
||||||
|
|
||||||
|
virtual uint8_t getGameType(void) const = 0;
|
||||||
|
|
||||||
|
// with (contact list, (in turn order?))
|
||||||
|
// sends out invites
|
||||||
|
virtual std::unique_ptr<InstanceI> createGame(std::vector<uint32_t> with) = 0;
|
||||||
|
|
||||||
|
// from
|
||||||
|
// game id
|
||||||
|
// with (contact list)
|
||||||
|
virtual std::unique_ptr<InstanceI> acceptInvite(uint32_t from, uint32_t id) = 0;
|
||||||
|
};
|
||||||
|
|
@ -1,8 +1,15 @@
|
|||||||
#include "./toxic_games.hpp"
|
#include "./toxic_games.hpp"
|
||||||
|
|
||||||
|
#include <solanaceae/toxcore/tox_interface.hpp>
|
||||||
|
#include <solanaceae/tox_contacts/components.hpp>
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
|
#include "./games/chess.hpp"
|
||||||
|
|
||||||
|
// https://youtu.be/9tLCQQ5_ado
|
||||||
|
|
||||||
ToxicGames::ToxicGames(
|
ToxicGames::ToxicGames(
|
||||||
Contact3Registry& cr,
|
Contact3Registry& cr,
|
||||||
ToxI& t,
|
ToxI& t,
|
||||||
@ -15,12 +22,67 @@ ToxicGames::ToxicGames(
|
|||||||
_tcm(tcm)
|
_tcm(tcm)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
{ // chess
|
||||||
|
auto tmp_game = std::make_unique<Chess>(*this);
|
||||||
|
const auto game_type = tmp_game->getGameType();
|
||||||
|
_game_types[game_type] = std::move(tmp_game);
|
||||||
|
}
|
||||||
|
|
||||||
// register custom packet handlers
|
// register custom packet handlers
|
||||||
_tep.subscribe(this, Tox_Event::TOX_EVENT_FRIEND_LOSSLESS_PACKET);
|
_tep.subscribe(this, Tox_Event::TOX_EVENT_FRIEND_LOSSLESS_PACKET);
|
||||||
_tep.subscribe(this, Tox_Event::TOX_EVENT_GROUP_CUSTOM_PACKET);
|
_tep.subscribe(this, Tox_Event::TOX_EVENT_GROUP_CUSTOM_PACKET);
|
||||||
_tep.subscribe(this, Tox_Event::TOX_EVENT_GROUP_CUSTOM_PRIVATE_PACKET);
|
_tep.subscribe(this, Tox_Event::TOX_EVENT_GROUP_CUSTOM_PRIVATE_PACKET);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//void ToxicGames::addGameInstance(uint8_t game_type, uint32_t game_id, std::unique_ptr<ToxicGameI::InstanceI> instance) {
|
||||||
|
//// TODO: error checking
|
||||||
|
//_game_instances[game_type][game_id] = std::move(instance);
|
||||||
|
//}
|
||||||
|
|
||||||
|
void ToxicGames::createGame(uint8_t game_type, std::vector<Contact3> with) {
|
||||||
|
}
|
||||||
|
|
||||||
|
void ToxicGames::acceptInvite(Contact3 from, uint8_t game_type, uint32_t game_id) {
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ToxicGames::sendPacket(Contact3 to, uint8_t game_type, uint32_t game_id, const uint8_t* data, const size_t data_size) {
|
||||||
|
if (!_cr.valid(to)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// online gaming
|
||||||
|
if (!_cr.all_of<Contact::Components::ToxFriendEphemeral>(to) && !_cr.all_of<Contact::Components::ToxGroupPeerEphemeral>(to)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// friend
|
||||||
|
if (_cr.all_of<Contact::Components::ToxFriendEphemeral>(to)) {
|
||||||
|
std::vector<uint8_t> pkg;
|
||||||
|
pkg.push_back(161); // game data
|
||||||
|
pkg.push_back(0x01); // netver
|
||||||
|
pkg.push_back(game_type);
|
||||||
|
pkg.push_back((game_id >> 24) & 0xff);
|
||||||
|
pkg.push_back((game_id >> 16) & 0xff);
|
||||||
|
pkg.push_back((game_id >> 8) & 0xff);
|
||||||
|
pkg.push_back((game_id >> 0) & 0xff);
|
||||||
|
pkg.insert(pkg.cend(), data, data+data_size);
|
||||||
|
|
||||||
|
const auto send_err = _t.toxFriendSendLosslessPacket(
|
||||||
|
_cr.get<Contact::Components::ToxFriendEphemeral>(to).friend_number,
|
||||||
|
pkg
|
||||||
|
);
|
||||||
|
|
||||||
|
return send_err == TOX_ERR_FRIEND_CUSTOM_PACKET_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
// group peer
|
||||||
|
if (_cr.all_of<Contact::Components::ToxGroupPeerEphemeral>(to)) {
|
||||||
|
return false; // TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
bool ToxicGames::onToxEvent(const Tox_Event_Friend_Lossless_Packet* e) {
|
bool ToxicGames::onToxEvent(const Tox_Event_Friend_Lossless_Packet* e) {
|
||||||
//CUSTOM_PACKET_GAME_INVITE = 160,
|
//CUSTOM_PACKET_GAME_INVITE = 160,
|
||||||
//CUSTOM_PACKET_GAME_DATA = 161,
|
//CUSTOM_PACKET_GAME_DATA = 161,
|
||||||
|
@ -1,14 +1,27 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <memory>
|
||||||
|
#include <map>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include <solanaceae/contact/contact_model3.hpp>
|
#include <solanaceae/contact/contact_model3.hpp>
|
||||||
#include <solanaceae/tox_contacts/tox_contact_model2.hpp>
|
#include <solanaceae/tox_contacts/tox_contact_model2.hpp>
|
||||||
|
|
||||||
|
#include "./toxic_game_i.hpp"
|
||||||
|
|
||||||
|
// TODO events:
|
||||||
|
// got invite
|
||||||
|
|
||||||
class ToxicGames : public ToxEventI {
|
class ToxicGames : public ToxEventI {
|
||||||
Contact3Registry& _cr;
|
Contact3Registry& _cr;
|
||||||
ToxI& _t;
|
ToxI& _t;
|
||||||
ToxEventProviderI& _tep;
|
ToxEventProviderI& _tep;
|
||||||
ToxContactModel2& _tcm;
|
ToxContactModel2& _tcm;
|
||||||
|
|
||||||
|
std::map<uint8_t, std::unique_ptr<ToxicGameI>> _game_types;
|
||||||
|
std::map<uint8_t, std::map<uint32_t, std::unique_ptr<ToxicGameI::InstanceI>>> _game_instances;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ToxicGames(
|
ToxicGames(
|
||||||
Contact3Registry& cr,
|
Contact3Registry& cr,
|
||||||
@ -17,6 +30,17 @@ class ToxicGames : public ToxEventI {
|
|||||||
ToxContactModel2& tcm
|
ToxContactModel2& tcm
|
||||||
);
|
);
|
||||||
|
|
||||||
|
~ToxicGames(void) {}
|
||||||
|
|
||||||
|
public:
|
||||||
|
// TODO: a setup game, for configurability?
|
||||||
|
void createGame(uint8_t game_type, std::vector<Contact3> with);
|
||||||
|
// with (contact list) ?
|
||||||
|
void acceptInvite(Contact3 from, uint8_t game_type, uint32_t game_id);
|
||||||
|
|
||||||
|
public: // internal, for games (TODO: extract?)
|
||||||
|
bool sendPacket(Contact3 to, uint8_t game_type, uint32_t game_id, const uint8_t* data, const size_t data_size);
|
||||||
|
|
||||||
private: // tox events
|
private: // tox events
|
||||||
bool onToxEvent(const Tox_Event_Friend_Lossless_Packet* e) override;
|
bool onToxEvent(const Tox_Event_Friend_Lossless_Packet* e) override;
|
||||||
bool onToxEvent(const Tox_Event_Group_Custom_Packet* e) override;
|
bool onToxEvent(const Tox_Event_Group_Custom_Packet* e) override;
|
||||||
|
Loading…
Reference in New Issue
Block a user