port to contact4
This commit is contained in:
parent
bdf375a91c
commit
05ccfe918d
@ -32,14 +32,14 @@ SOLANA_PLUGIN_EXPORT uint32_t solana_plugin_start(struct SolanaAPI* solana_api)
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
auto* cr = PLUG_RESOLVE_INSTANCE_VERSIONED(Contact3Registry, "1");
|
auto* cs = PLUG_RESOLVE_INSTANCE(ContactStore4I);
|
||||||
auto* t = PLUG_RESOLVE_INSTANCE(ToxI);
|
auto* t = PLUG_RESOLVE_INSTANCE(ToxI);
|
||||||
auto* tep = PLUG_RESOLVE_INSTANCE(ToxEventProviderI);
|
auto* tep = PLUG_RESOLVE_INSTANCE(ToxEventProviderI);
|
||||||
auto* tcm = PLUG_RESOLVE_INSTANCE(ToxContactModel2);
|
auto* tcm = PLUG_RESOLVE_INSTANCE(ToxContactModel2);
|
||||||
|
|
||||||
// static store, could be anywhere tho
|
// static store, could be anywhere tho
|
||||||
// construct with fetched dependencies
|
// construct with fetched dependencies
|
||||||
g_tg = std::make_unique<ToxicGames>(*cr, *t, *tep, *tcm);
|
g_tg = std::make_unique<ToxicGames>(*cs, *t, *tep, *tcm);
|
||||||
|
|
||||||
// register types
|
// register types
|
||||||
PLUG_PROVIDE_INSTANCE(ToxicGames, plugin_name, g_tg.get());
|
PLUG_PROVIDE_INSTANCE(ToxicGames, plugin_name, g_tg.get());
|
||||||
|
@ -18,42 +18,40 @@ bool Chess::ChessInstance::allInvitesAccepted(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Chess::ChessInstance::onPacket(uint32_t from, const uint8_t* data, const uint32_t data_size) {
|
void Chess::ChessInstance::onPacket(uint32_t from, const uint8_t* data, const uint32_t data_size) {
|
||||||
// test, auto resign
|
|
||||||
sendResign();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Chess::ChessInstance::sendResign(void) {
|
//bool Chess::ChessInstance::sendResign(void) {
|
||||||
std::vector<uint8_t> pkg;
|
//std::vector<uint8_t> pkg;
|
||||||
|
|
||||||
// resign (chess specific)
|
//// resign (chess specific)
|
||||||
pkg.push_back(0xff);
|
//pkg.push_back(0xff);
|
||||||
return _game_type_static._tg.sendPacket(
|
//return _game_type_static._tg.sendPacket(
|
||||||
static_cast<Contact3>(_opponent),
|
//static_cast<Contact3>(_opponent),
|
||||||
_game_type_static.getGameType(),
|
//_game_type_static.getGameType(),
|
||||||
_id,
|
//_id,
|
||||||
pkg.data(), pkg.size()
|
//pkg.data(), pkg.size()
|
||||||
);
|
//);
|
||||||
}
|
//}
|
||||||
|
|
||||||
bool Chess::ChessInstance::sendMove(ChessCoords p0, ChessCoords p1) {
|
//bool Chess::ChessInstance::sendMove(ChessCoords p0, ChessCoords p1) {
|
||||||
std::vector<uint8_t> pkg;
|
//std::vector<uint8_t> pkg;
|
||||||
|
|
||||||
// move piece (chess specific)
|
//// move piece (chess specific)
|
||||||
pkg.push_back(0xfe);
|
//pkg.push_back(0xfe);
|
||||||
|
|
||||||
pkg.push_back(p0.L);
|
//pkg.push_back(p0.L);
|
||||||
pkg.push_back(p0.N);
|
//pkg.push_back(p0.N);
|
||||||
|
|
||||||
pkg.push_back(p1.L);
|
//pkg.push_back(p1.L);
|
||||||
pkg.push_back(p1.N);
|
//pkg.push_back(p1.N);
|
||||||
|
|
||||||
return _game_type_static._tg.sendPacket(
|
//return _game_type_static._tg.sendPacket(
|
||||||
static_cast<Contact3>(_opponent),
|
//static_cast<Contact3>(_opponent),
|
||||||
_game_type_static.getGameType(),
|
//_game_type_static.getGameType(),
|
||||||
_id,
|
//_id,
|
||||||
pkg.data(), pkg.size()
|
//pkg.data(), pkg.size()
|
||||||
);
|
//);
|
||||||
}
|
//}
|
||||||
|
|
||||||
Chess::Chess(ToxicGames& tg) : ToxicGameI(tg) {
|
Chess::Chess(ToxicGames& tg) : ToxicGameI(tg) {
|
||||||
}
|
}
|
||||||
@ -66,18 +64,18 @@ std::unique_ptr<Chess::InstanceI> Chess::createGame(std::vector<uint32_t> with)
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<Chess::InstanceI> Chess::acceptInvite(uint32_t from, uint32_t game_id) {
|
std::unique_ptr<Chess::InstanceI> Chess::acceptInvite(uint32_t from, uint32_t game_id) {
|
||||||
sendAcceptInvite(from, game_id);
|
//sendAcceptInvite(from, game_id);
|
||||||
|
|
||||||
auto new_instance = std::make_unique<ChessInstance>(*this, from, game_id);
|
auto new_instance = std::make_unique<ChessInstance>(*this, from, game_id);
|
||||||
|
|
||||||
return new_instance;
|
return new_instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Chess::sendAcceptInvite(uint32_t to, uint32_t game_id) {
|
//bool Chess::sendAcceptInvite(uint32_t to, uint32_t game_id) {
|
||||||
std::vector<uint8_t> pkg;
|
//std::vector<uint8_t> pkg;
|
||||||
|
|
||||||
// init accept invite (chess specific)
|
//// init accept invite (chess specific)
|
||||||
pkg.push_back(0x02);
|
//pkg.push_back(0x02);
|
||||||
return _tg.sendPacket(static_cast<Contact3>(to), getGameType(), game_id, pkg.data(), pkg.size());
|
//return _tg.sendPacket(static_cast<Contact3>(to), getGameType(), game_id, pkg.data(), pkg.size());
|
||||||
}
|
//}
|
||||||
|
|
||||||
|
@ -6,9 +6,14 @@ struct Chess final : public ToxicGameI {
|
|||||||
Chess(ToxicGames& tg);
|
Chess(ToxicGames& tg);
|
||||||
~Chess(void);
|
~Chess(void);
|
||||||
|
|
||||||
|
// TODO: extract?
|
||||||
|
struct Coords {
|
||||||
|
int32_t x {};
|
||||||
|
int32_t y {};
|
||||||
|
};
|
||||||
struct ChessCoords {
|
struct ChessCoords {
|
||||||
char L;
|
char L {};
|
||||||
uint8_t N;
|
uint8_t N {};
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ChessInstance final : public ToxicGameI::InstanceI {
|
struct ChessInstance final : public ToxicGameI::InstanceI {
|
||||||
@ -30,9 +35,16 @@ struct Chess final : public ToxicGameI {
|
|||||||
// ??
|
// ??
|
||||||
//virtual void tick();
|
//virtual void tick();
|
||||||
|
|
||||||
private:
|
//private:
|
||||||
bool sendResign(void);
|
//bool sendResign(void);
|
||||||
bool sendMove(ChessCoords p0, ChessCoords p1);
|
//bool sendMove(ChessCoords p0, ChessCoords p1);
|
||||||
|
|
||||||
|
// the toxic game stuff
|
||||||
|
int game_x_left_bound(void);
|
||||||
|
int game_x_right_bound(void);
|
||||||
|
int game_y_top_bound(void);
|
||||||
|
int game_y_bottom_bound(void);
|
||||||
|
int game_set_window_shape(/*shape*/);
|
||||||
};
|
};
|
||||||
|
|
||||||
uint8_t getGameType(void) const override { return 1; };
|
uint8_t getGameType(void) const override { return 1; };
|
||||||
@ -40,7 +52,7 @@ struct Chess final : public ToxicGameI {
|
|||||||
std::unique_ptr<InstanceI> createGame(std::vector<uint32_t> with) override;
|
std::unique_ptr<InstanceI> createGame(std::vector<uint32_t> with) override;
|
||||||
std::unique_ptr<InstanceI> acceptInvite(uint32_t from, uint32_t game_id) override;
|
std::unique_ptr<InstanceI> acceptInvite(uint32_t from, uint32_t game_id) override;
|
||||||
|
|
||||||
private:
|
//private:
|
||||||
bool sendAcceptInvite(uint32_t to, uint32_t game_id);
|
//bool sendAcceptInvite(uint32_t to, uint32_t game_id);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -4,8 +4,8 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
//#include <solanaceae/contact/contact_model3.hpp>
|
//#include <solanaceae/contact/fwd.hpp>
|
||||||
//enum class Contact3 : uint32_t {};
|
//enum class Contact4 : uint32_t {};
|
||||||
|
|
||||||
// fwd
|
// fwd
|
||||||
class ToxicGames;
|
class ToxicGames;
|
||||||
@ -35,6 +35,7 @@ struct ToxicGameI {
|
|||||||
// - invalid
|
// - invalid
|
||||||
virtual bool allInvitesAccepted(void) = 0;
|
virtual bool allInvitesAccepted(void) = 0;
|
||||||
|
|
||||||
|
// TODO: contact
|
||||||
virtual void onPacket(uint32_t from, const uint8_t* data, const uint32_t data_size) = 0;
|
virtual void onPacket(uint32_t from, const uint8_t* data, const uint32_t data_size) = 0;
|
||||||
|
|
||||||
// ??
|
// ??
|
||||||
|
@ -1,8 +1,12 @@
|
|||||||
#include "./toxic_games.hpp"
|
#include "./toxic_games.hpp"
|
||||||
|
|
||||||
#include <solanaceae/toxcore/tox_interface.hpp>
|
#include <solanaceae/toxcore/tox_interface.hpp>
|
||||||
|
#include <solanaceae/contact/contact_store_i.hpp>
|
||||||
#include <solanaceae/tox_contacts/components.hpp>
|
#include <solanaceae/tox_contacts/components.hpp>
|
||||||
|
|
||||||
|
#include <entt/entity/registry.hpp>
|
||||||
|
#include <entt/entity/handle.hpp>
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
@ -11,12 +15,12 @@
|
|||||||
// https://youtu.be/9tLCQQ5_ado
|
// https://youtu.be/9tLCQQ5_ado
|
||||||
|
|
||||||
ToxicGames::ToxicGames(
|
ToxicGames::ToxicGames(
|
||||||
Contact3Registry& cr,
|
ContactStore4I& cs,
|
||||||
ToxI& t,
|
ToxI& t,
|
||||||
ToxEventProviderI& tep,
|
ToxEventProviderI& tep,
|
||||||
ToxContactModel2& tcm
|
ToxContactModel2& tcm
|
||||||
) :
|
) :
|
||||||
_cr(cr),
|
_cs(cs),
|
||||||
_t(t),
|
_t(t),
|
||||||
_tep_sr(tep.newSubRef(this)),
|
_tep_sr(tep.newSubRef(this)),
|
||||||
_tcm(tcm)
|
_tcm(tcm)
|
||||||
@ -41,16 +45,18 @@ ToxicGames::ToxicGames(
|
|||||||
//_game_instances[game_type][game_id] = std::move(instance);
|
//_game_instances[game_type][game_id] = std::move(instance);
|
||||||
//}
|
//}
|
||||||
|
|
||||||
void ToxicGames::createGame(uint8_t game_type, std::vector<Contact3> with) {
|
void ToxicGames::createGame(uint8_t game_type, std::vector<Contact4> with) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ToxicGames::acceptInvite(Contact3 from, uint8_t game_type, uint32_t game_id) {
|
void ToxicGames::acceptInvite(Contact4 from, uint8_t game_type, uint32_t game_id) {
|
||||||
if (!_cr.valid(from)) {
|
const auto& cr = _cs.registry();
|
||||||
|
|
||||||
|
if (!cr.valid(from)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// online gaming
|
// online gaming
|
||||||
if (!_cr.all_of<Contact::Components::ToxFriendEphemeral>(from) && !_cr.all_of<Contact::Components::ToxGroupPeerEphemeral>(from)) {
|
if (!cr.all_of<Contact::Components::ToxFriendEphemeral>(from) && !cr.all_of<Contact::Components::ToxGroupPeerEphemeral>(from)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -71,18 +77,20 @@ 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) {
|
bool ToxicGames::sendPacket(Contact4 to, uint8_t game_type, uint32_t game_id, const uint8_t* data, const size_t data_size) {
|
||||||
if (!_cr.valid(to)) {
|
const auto& cr = _cs.registry();
|
||||||
|
|
||||||
|
if (!cr.valid(to)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// online gaming
|
// online gaming
|
||||||
if (!_cr.all_of<Contact::Components::ToxFriendEphemeral>(to) && !_cr.all_of<Contact::Components::ToxGroupPeerEphemeral>(to)) {
|
if (!cr.all_of<Contact::Components::ToxFriendEphemeral>(to) && !cr.all_of<Contact::Components::ToxGroupPeerEphemeral>(to)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// friend
|
// friend
|
||||||
if (_cr.all_of<Contact::Components::ToxFriendEphemeral>(to)) {
|
if (cr.all_of<Contact::Components::ToxFriendEphemeral>(to)) {
|
||||||
std::vector<uint8_t> pkg;
|
std::vector<uint8_t> pkg;
|
||||||
pkg.push_back(161); // game data
|
pkg.push_back(161); // game data
|
||||||
pkg.push_back(0x01); // netver
|
pkg.push_back(0x01); // netver
|
||||||
@ -94,7 +102,7 @@ bool ToxicGames::sendPacket(Contact3 to, uint8_t game_type, uint32_t game_id, co
|
|||||||
pkg.insert(pkg.cend(), data, data+data_size);
|
pkg.insert(pkg.cend(), data, data+data_size);
|
||||||
|
|
||||||
const auto send_err = _t.toxFriendSendLosslessPacket(
|
const auto send_err = _t.toxFriendSendLosslessPacket(
|
||||||
_cr.get<Contact::Components::ToxFriendEphemeral>(to).friend_number,
|
cr.get<Contact::Components::ToxFriendEphemeral>(to).friend_number,
|
||||||
pkg
|
pkg
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -102,7 +110,7 @@ bool ToxicGames::sendPacket(Contact3 to, uint8_t game_type, uint32_t game_id, co
|
|||||||
}
|
}
|
||||||
|
|
||||||
// group peer
|
// group peer
|
||||||
if (_cr.all_of<Contact::Components::ToxGroupPeerEphemeral>(to)) {
|
if (cr.all_of<Contact::Components::ToxGroupPeerEphemeral>(to)) {
|
||||||
return false; // TODO
|
return false; // TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -145,7 +153,7 @@ bool ToxicGames::onToxEvent(const Tox_Event_Friend_Lossless_Packet* e) {
|
|||||||
|
|
||||||
if (_game_types.count(game_type)) {
|
if (_game_types.count(game_type)) {
|
||||||
if (!_game_instances[game_type].count(game_id)) {
|
if (!_game_instances[game_type].count(game_id)) {
|
||||||
const Contact3 from = _tcm.getContactFriend(friend_number);
|
const auto from = _tcm.getContactFriend(friend_number);
|
||||||
|
|
||||||
// HACK: auto accept
|
// HACK: auto accept
|
||||||
std::cout << "TG: autoaccepting game ...\n";
|
std::cout << "TG: autoaccepting game ...\n";
|
||||||
@ -163,8 +171,8 @@ bool ToxicGames::onToxEvent(const Tox_Event_Friend_Lossless_Packet* e) {
|
|||||||
|
|
||||||
if (_game_types.count(game_type)) {
|
if (_game_types.count(game_type)) {
|
||||||
if (_game_instances[game_type].count(game_id)) {
|
if (_game_instances[game_type].count(game_id)) {
|
||||||
const Contact3 from = _tcm.getContactFriend(friend_number);
|
const auto from = _tcm.getContactFriend(friend_number);
|
||||||
_game_instances.at(game_type).at(game_id)->onPacket(static_cast<uint32_t>(from), nullptr, 0);
|
_game_instances.at(game_type).at(game_id)->onPacket(static_cast<uint32_t>(entt::to_integral(from.entity())), nullptr, 0);
|
||||||
} else {
|
} else {
|
||||||
// error, unk game
|
// error, unk game
|
||||||
std::cerr << "TG error: packet for unknown game id gt:" << (uint32_t)game_type << " id:" << game_id << "\n";
|
std::cerr << "TG error: packet for unknown game id gt:" << (uint32_t)game_type << " id:" << game_id << "\n";
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
#include <map>
|
#include <map>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <solanaceae/contact/contact_model3.hpp>
|
#include <solanaceae/contact/fwd.hpp>
|
||||||
#include <solanaceae/tox_contacts/tox_contact_model2.hpp>
|
#include <solanaceae/tox_contacts/tox_contact_model2.hpp>
|
||||||
|
|
||||||
#include "./toxic_game_i.hpp"
|
#include "./toxic_game_i.hpp"
|
||||||
@ -14,7 +14,7 @@
|
|||||||
// got invite
|
// got invite
|
||||||
|
|
||||||
class ToxicGames : public ToxEventI {
|
class ToxicGames : public ToxEventI {
|
||||||
Contact3Registry& _cr;
|
ContactStore4I& _cs;
|
||||||
ToxI& _t;
|
ToxI& _t;
|
||||||
ToxEventProviderI::SubscriptionReference _tep_sr;
|
ToxEventProviderI::SubscriptionReference _tep_sr;
|
||||||
ToxContactModel2& _tcm;
|
ToxContactModel2& _tcm;
|
||||||
@ -24,7 +24,7 @@ class ToxicGames : public ToxEventI {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
ToxicGames(
|
ToxicGames(
|
||||||
Contact3Registry& cr,
|
ContactStore4I& cs,
|
||||||
ToxI& t,
|
ToxI& t,
|
||||||
ToxEventProviderI& tep,
|
ToxEventProviderI& tep,
|
||||||
ToxContactModel2& tcm
|
ToxContactModel2& tcm
|
||||||
@ -34,12 +34,12 @@ class ToxicGames : public ToxEventI {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
// TODO: a setup game, for configurability?
|
// TODO: a setup game, for configurability?
|
||||||
void createGame(uint8_t game_type, std::vector<Contact3> with);
|
void createGame(uint8_t game_type, std::vector<Contact4> with);
|
||||||
// with (contact list) ?
|
// with (contact list) ?
|
||||||
void acceptInvite(Contact3 from, uint8_t game_type, uint32_t game_id);
|
void acceptInvite(Contact4 from, uint8_t game_type, uint32_t game_id);
|
||||||
|
|
||||||
public: // internal, for games (TODO: extract?)
|
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);
|
bool sendPacket(Contact4 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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user