added latest retrochess to master

This commit is contained in:
defnax 2019-10-16 22:27:18 +02:00
parent 488b382522
commit 033405c761
46 changed files with 6700 additions and 0 deletions

View File

@ -0,0 +1,18 @@
RS .6 Chess Plugin
==================
Both players must currently select each other and press "play game" - ensure your friend has their chess window open before making a move!
this is a combination of an existing chess game, and the exampleplugin (rename script makes it easy to use as base for new plugin)
https://github.com/RetroShare/ExampleRSPlugin
--disclaimer--
may not support playing more than one game of chess
may crash RS
may kill your cat, dog, or other loved one.
--extra info--
based on: https://github.com/chozabu/CHESS-in-Qt

View File

@ -0,0 +1,70 @@
!include("../Common/retroshare_plugin.pri"): error("Could not include file ../Common/retroshare_plugin.pri")
greaterThan(QT_MAJOR_VERSION, 4) {
# Qt 5
QT += widgets
}
exists($$[QMAKE_MKSPECS]/features/mobility.prf) {
CONFIG += mobility
} else {
QT += multimedia
}
CONFIG += qt uic qrc resources
MOBILITY = multimedia
DEPENDPATH += ../../retroshare-gui/src/temp/ui ../../libretroshare/src
INCLUDEPATH += ../../retroshare-gui/src/temp/ui ../../libretroshare/src
INCLUDEPATH += ../../retroshare-gui/src/retroshare-gui
INCLUDEPATH += ../../rapidjson-1.1.0
#################################### Windows #####################################
linux-* {
#INCLUDEPATH += /usr/include
#LIBS += $$system(pkg-config --libs opencv)
}
win32 {
LIBS_DIR = $$PWD/../../../libs
#LIBS += -L"$$LIBS_DIR/lib/opencv"
#OPENCV_VERSION = 249
#LIBS += -lopencv_core$$OPENCV_VERSION -lopencv_highgui$$OPENCV_VERSION -lopencv_imgproc$$OPENCV_VERSION -llibjpeg -llibtiff -llibpng -llibjasper -lIlmImf -lole32 -loleaut32 -luuid -lavicap32 -lavifil32 -lvfw32 -lz
}
QMAKE_CXXFLAGS *= -Wall
SOURCES = RetroChessPlugin.cpp \
services/p3RetroChess.cc \
services/rsRetroChessItems.cc \
gui/NEMainpage.cpp \
gui/RetroChessNotify.cpp \
gui/chess.cpp \
gui/tile.cpp \
gui/validation.cpp \
gui/RetroChessChatWidgetHolder.cpp
HEADERS = RetroChessPlugin.h \
services/p3RetroChess.h \
services/rsRetroChessItems.h \
interface/rsRetroChess.h \
gui/NEMainpage.h \
gui/RetroChessNotify.h \
gui/tile.h \
gui/validation.h \
gui/chess.h \
gui/RetroChessChatWidgetHolder.h
#FORMS = gui/AudioInputConfig.ui
TARGET = RetroChess
RESOURCES = gui/RetroChess_images.qrc
#LIBS += -lspeex -lspeexdsp
FORMS += \
gui/NEMainpage.ui

View File

@ -0,0 +1,200 @@
/****************************************************************
* RetroShare is distributed under the following license:
*
* Copyright (C) 2015
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
****************************************************************/
#include <retroshare/rsplugin.h>
#include <retroshare/rsversion.h>
#include <retroshare-gui/RsAutoUpdatePage.h>
#include <QTranslator>
#include <QApplication>
#include <QString>
#include <QIcon>
#include <QMessageBox>
#include "gui/chat/ChatWidget.h"
#include "RetroChessPlugin.h"
#include "interface/rsRetroChess.h"
#include "gui/NEMainpage.h"
#include "gui/RetroChessNotify.h"
#include "gui/RetroChessChatWidgetHolder.h"
#define IMAGE_RetroChess ":/images/chess.png"
static void *inited = new RetroChessPlugin() ;
extern "C" {
// This is *the* functions required by RS plugin system to give RS access to the plugin.
// Be careful to:
// - always respect the C linkage convention
// - always return an object of type RsPlugin*
//
void *RETROSHARE_PLUGIN_provide()
{
static RetroChessPlugin *p = new RetroChessPlugin() ;
return (void*)p ;
}
// This symbol contains the svn revision number grabbed from the executable.
// It will be tested by RS to load the plugin automatically, since it is safe to load plugins
// with same revision numbers, assuming that the revision numbers are up-to-date.
//
uint32_t RETROSHARE_PLUGIN_revision = abs(atoi(RS_EXTRA_VERSION)) ;
// This symbol contains the svn revision number grabbed from the executable.
// It will be tested by RS to load the plugin automatically, since it is safe to load plugins
// with same revision numbers, assuming that the revision numbers are up-to-date.
//
uint32_t RETROSHARE_PLUGIN_api = RS_PLUGIN_API_VERSION ;
}
void RetroChessPlugin::getPluginVersion(int& major, int& minor, int& build, int& svn_rev) const
{
major = RS_MAJOR_VERSION ;
minor = RS_MINOR_VERSION ;
build = RS_MINI_VERSION ;
svn_rev = abs(atoi(RS_EXTRA_VERSION)) ;
}
RetroChessPlugin::RetroChessPlugin()
{
qRegisterMetaType<RsPeerId>("RsPeerId");
mainpage = NULL ;
mRetroChess = NULL ;
mPlugInHandler = NULL;
mPeers = NULL;
config_page = NULL ;
mIcon = NULL ;
mRetroChessNotify = new RetroChessNotify;
}
void RetroChessPlugin::setInterfaces(RsPlugInInterfaces &interfaces)
{
mPeers = interfaces.mPeers;
}
/*ConfigPage *RetroChessPlugin::qt_config_page() const
{
// The config pages are deleted when config is closed, so it's important not to static the
// created object.
//
return new AudioInputConfig() ;
}*/
QDialog *RetroChessPlugin::qt_about_page() const
{
static QMessageBox *about_dialog = NULL ;
if(about_dialog == NULL)
{
about_dialog = new QMessageBox() ;
QString text ;
text += QObject::tr("<h3>RetroShare RetroChess plugin</h3><br/> * Contributors: Cyril Soler, Josselin Jacquard<br/>") ;
text += QObject::tr("<br/>The RetroChess plugin adds RetroChess to the private chat window of RetroShare. to use it, proceed as follows:<UL>") ;
text += QObject::tr("<li> setup microphone levels using the configuration panel</li>") ;
text += QObject::tr("<li> check your microphone by looking at the VU-metters</li>") ;
text += QObject::tr("<li> in the private chat, enable sound input/output by clicking on the two RetroChess icons</li></ul>") ;
text += QObject::tr("Your friend needs to run the plugin to talk/listen to you, or course.") ;
text += QObject::tr("<br/><br/>This is an experimental feature. Don't hesitate to send comments and suggestion to the RS dev team.") ;
about_dialog->setText(text) ;
about_dialog->setStandardButtons(QMessageBox::Ok) ;
}
return about_dialog ;
}
ChatWidgetHolder *RetroChessPlugin::qt_get_chat_widget_holder(ChatWidget *chatWidget) const
{
switch (chatWidget->chatType()) {
case ChatWidget::CHATTYPE_PRIVATE:
return new RetroChessChatWidgetHolder(chatWidget, mRetroChessNotify);
case ChatWidget::CHATTYPE_UNKNOWN:
case ChatWidget::CHATTYPE_LOBBY:
case ChatWidget::CHATTYPE_DISTANT:
break;
}
return NULL;
}
p3Service *RetroChessPlugin::p3_service() const
{
if(mRetroChess == NULL)
rsRetroChess = mRetroChess = new p3RetroChess(mPlugInHandler,mRetroChessNotify) ; // , 3600 * 24 * 30 * 6); // 6 Months
return mRetroChess ;
}
void RetroChessPlugin::setPlugInHandler(RsPluginHandler *pgHandler)
{
mPlugInHandler = pgHandler;
}
QIcon *RetroChessPlugin::qt_icon() const
{
if (mIcon == NULL) {
Q_INIT_RESOURCE(RetroChess_images);
mIcon = new QIcon(IMAGE_RetroChess);
}
return mIcon;
}
MainPage *RetroChessPlugin::qt_page() const
{
if(mainpage == NULL){
mainpage = new NEMainpage(0, mRetroChessNotify);//mPeers, mFiles) ;
//tpage = new NEMainpage( );
//mainpage = tpage;
}
return mainpage ;
}
std::string RetroChessPlugin::getShortPluginDescription() const
{
return "RetroChess";
}
std::string RetroChessPlugin::getPluginName() const
{
return "RetroChess";
}
QTranslator* RetroChessPlugin::qt_translator(QApplication */*app*/, const QString& languageCode, const QString& externalDir) const
{
return NULL;
}
void RetroChessPlugin::qt_sound_events(SoundEvents &/*events*/) const
{
// events.addEvent(QApplication::translate("RetroChess", "RetroChess"), QApplication::translate("RetroChess", "Incoming call"), RetroChess_SOUND_INCOMING_CALL);
}
/*ToasterNotify *RetroChessPlugin::qt_toasterNotify(){
if (!mRetroChessToasterNotify) {
mRetroChessToasterNotify = new RetroChessToasterNotify(mRetroChess, mRetroChessNotify);
}
return mRetroChessToasterNotify;
}*/

View File

@ -0,0 +1,76 @@
/* this is the central part of the plugin */
/****************************************************************
* RetroShare is distributed under the following license:
*
* Copyright (C) 2015
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
****************************************************************/
#pragma once
/*RetroChess*/
#include "services/p3RetroChess.h"
/*libretroshare"*/
#include <retroshare/rsplugin.h>
#include "gui/NEMainpage.h"
class RetroChessGUIHandler ;
class RetroChessNotify ;
class RetroChessPlugin: public RsPlugin
{
public:
RetroChessPlugin() ;
virtual ~RetroChessPlugin() {}
virtual p3Service *p3_service() const ;
virtual uint16_t rs_service_id() const { return RS_SERVICE_TYPE_RetroChess_PLUGIN ; }
//virtual ConfigPage *qt_config_page() const ;
virtual QDialog *qt_about_page() const ;
virtual ChatWidgetHolder *qt_get_chat_widget_holder(ChatWidget *chatWidget) const ;
virtual QIcon *qt_icon() const;
virtual QTranslator *qt_translator(QApplication *app, const QString& languageCode, const QString& externalDir) const;
virtual void qt_sound_events(SoundEvents &events) const;
virtual void getPluginVersion(int& major, int& minor, int &build, int& svn_rev) const ;
virtual void setPlugInHandler(RsPluginHandler *pgHandler);
virtual std::string configurationFileName() const { return "RetroChess.cfg" ; }
virtual std::string getShortPluginDescription() const ;
virtual std::string getPluginName() const;
virtual void setInterfaces(RsPlugInInterfaces& interfaces);
//================================== RsPlugin Notify ==================================//
//virtual ToasterNotify *qt_toasterNotify();
virtual MainPage *qt_page() const ;
private:
mutable p3RetroChess *mRetroChess ;
mutable RsPluginHandler *mPlugInHandler;
mutable RsPeers* mPeers;
mutable ConfigPage *config_page ;
mutable QIcon *mIcon;
mutable MainPage* mainpage ;
RetroChessNotify *mRetroChessNotify ;
RetroChessGUIHandler *mRetroChessGUIHandler ;
};

View File

@ -0,0 +1,3 @@
kdesudo -u retrotester cp lib*.so* /home/retrotester/.retroshare/extensions6/
kdesudo -u retrotester /home/chozabu/git/RetroShare/retroshare-gui/src/RetroShare

View File

@ -0,0 +1,225 @@
#include "NEMainpage.h"
#include "ui_NEMainpage.h"
//#include "services/p3RetroChess.h"
#include "interface/rsRetroChess.h"
#include "services/rsRetroChessItems.h"
#include "retroshare/rsservicecontrol.h"
#include "gui/notifyqt.h"
#include <qjsondocument.h>
#include <qtreewidget.h>
#include <iostream>
#include <string>
#include <QTime>
#include <QMenu>
#include "gui/chat/ChatDialog.h"
NEMainpage::NEMainpage(QWidget *parent, RetroChessNotify *notify) :
MainPage(parent),
mNotify(notify),
ui(new Ui::NEMainpage)
{
ui->setupUi(this);
setupMenuActions();
connect(mNotify, SIGNAL(NeMsgArrived(RsPeerId,QString)), this , SLOT(NeMsgArrived(RsPeerId,QString)));
connect(mNotify, SIGNAL(chessStart(RsPeerId)), this , SLOT(chessStart(RsPeerId)));
connect(ui->friendSelectionWidget, SIGNAL(itemSelectionChanged()), this, SLOT(friendSelectionChanged()));
ui->friendSelectionWidget->start();
ui->friendSelectionWidget->setModus(FriendSelectionWidget::MODUS_SINGLE);
ui->friendSelectionWidget->setShowType(FriendSelectionWidget::SHOW_SSL);
connect(ui->friendSelectionWidget, SIGNAL(contentChanged()), this, SLOT(on_filterPeersButton_clicked()));
connect(NotifyQt::getInstance(), SIGNAL(peerStatusChanged(const QString&,int)), this, SLOT(on_filterPeersButton_clicked()));
QString welcomemessage = QTime::currentTime().toString() +" ";
welcomemessage+= tr("Welcome to RetroChess lobby");
ui->listWidget->addItem(welcomemessage);
}
NEMainpage::~NEMainpage()
{
delete ui;
}
void NEMainpage::on_pingAllButton_clicked()
{
}
void NEMainpage::chessStart(const RsPeerId &peer_id){
create_chess_window(peer_id.toStdString(), 0);
}
void NEMainpage::NeMsgArrived(const RsPeerId &peer_id, QString str)
{
QJsonDocument jdoc = QJsonDocument::fromJson(str.toUtf8());
QVariantMap vmap = jdoc.toVariant().toMap();
std::cout << "GUI got Packet from: " << peer_id;
std::cout << " saying " << str.toStdString();
std::cout << std::endl;
QString type = vmap.value("type").toString();
if (type == "chat"){
QString output = QTime::currentTime().toString() +" ";
output+= QString::fromStdString(rsPeers->getPeerName(peer_id));
output+=": ";
output+=vmap.value("message").toString();
ui->listWidget->addItem(output);
}else if (type == "chessclick"){
int row = vmap.value("row").toInt();
int col = vmap.value("col").toInt();
int count = vmap.value("count").toInt();
RetroChessWindow* rcw = activeGames.value(peer_id.toStdString());
rcw->validate_tile(row,col,count);
}else if (type == "chess_init"){
create_chess_window(peer_id.toStdString(), 1);
}else if (type == "chess_invite"){
ChatDialog::chatFriend(ChatId(peer_id));
rsRetroChess->gotInvite(peer_id);
mNotify->notifyChessInvite(peer_id);
}else if (type == "chess_accept"){
if (rsRetroChess->hasInviteTo(peer_id)){
create_chess_window(peer_id.toStdString(), 1);
rsRetroChess->acceptedInvite(peer_id);
}
}else{
QString output = QTime::currentTime().toString() +" ";
output+= QString::fromStdString(rsPeers->getPeerName(peer_id));
output+=": ";
output+=str;
ui->listWidget->addItem(output);
}
{
QString output = QTime::currentTime().toString() +" ";
output+= QString::fromStdString(rsPeers->getPeerName(peer_id));
output+=": ";
output+=str;
ui->netLogWidget->addItem(output);
}
}
void NEMainpage::on_broadcastButton_clicked()
{
rsRetroChess->msg_all(ui->msgInput->text().toStdString());
NeMsgArrived(rsPeers->getOwnId(),ui->msgInput->text());
ui->msgInput->clear();
}
void NEMainpage::create_chess_window(std::string peer_id, int player_id){
RetroChessWindow *rcw = new RetroChessWindow(peer_id, player_id);
rcw->show();
activeGames.insert(peer_id, rcw);
ui->active_games->addItem(QString::fromStdString(peer_id));
}
void NEMainpage::on_playButton_clicked()
{
//get peer
FriendSelectionWidget::IdType idType;
std::string fid = ui->friendSelectionWidget->selectedId(idType);
//make_board();
create_chess_window(fid, 0);
QVariantMap map;
map.insert("type", "chess_init");
rsRetroChess->qvm_msg_peer(RsPeerId(fid),map);
std::cout << fid;
}
void NEMainpage::on_filterPeersButton_clicked()
{
std::cout << "\n\n filter peers \n";
std::list<RsPeerId> ssllist ;
rsPeers->getFriendList(ssllist);
RsPeerServiceInfo ownServices;
rsServiceControl->getOwnServices(ownServices);
std::vector<RsPeerId> peer_ids ;
std::vector<uint32_t> service_ids ;
for(std::list<RsPeerId>::const_iterator it(ssllist.begin());it!=ssllist.end();++it)
peer_ids.push_back(*it) ;
service_ids.clear() ;
uint32_t service_id;
for(std::map<uint32_t, RsServiceInfo>::const_iterator sit(ownServices.mServiceList.begin());sit!=ownServices.mServiceList.end();++sit)
{
RsServiceInfo rsi = sit->second;
service_ids.push_back(sit->first) ;
std::cout << rsi.mServiceName << rsi.mServiceType << "\n";
if (strcmp(rsi.mServiceName.c_str(), "RetroChess") == 0){
service_id = rsi.mServiceType;
std::cout << "setting service ID\n";
}
}
for(std::list<RsPeerId>::const_iterator it(ssllist.begin());it!=ssllist.end();++it)
{
RsPeerServiceInfo local_service_perms ;
RsPeerServiceInfo remote_service_perms ;
RsPeerId id = *it;
rsServiceControl->getServicesAllowed (*it, local_service_perms) ;
rsServiceControl->getServicesProvided(*it,remote_service_perms) ;
bool local_allowed = local_service_perms.mServiceList.find(service_id) != local_service_perms.mServiceList.end() ;
bool remote_allowed = remote_service_perms.mServiceList.find(service_id) != remote_service_perms.mServiceList.end() ;
bool allowed = (local_allowed && remote_allowed);
//QString la =
QString serviceinfos = QString("peerlocal: ") + QString(local_allowed?"yes":"no") + QString(" remote: ") + QString(remote_allowed?"yes":"no");
ui->netLogWidget->addItem(serviceinfos);
std::cout << serviceinfos.toStdString() << "\n";
//if (allowed){
QList<QTreeWidgetItem*> items;
ui->friendSelectionWidget->itemsFromId(FriendSelectionWidget::IDTYPE_SSL,id.toStdString(),items);
std::cout << items.size() << "\n";
if (items.size()){
QTreeWidgetItem* item = items.first();
item->setHidden(!allowed);
}
}
//
}
void NEMainpage::setupMenuActions()
{
mActionPlayChess = new QAction(QIcon(), tr("Play Chess"), this);
connect(mActionPlayChess, SIGNAL(triggered(bool)), this, SLOT(on_playButton_clicked()));
ui->friendSelectionWidget->addContextMenuAction(mActionPlayChess);
}
void NEMainpage::friendSelectionChanged()
{
std::set<RsPeerId> peerIds;
ui->friendSelectionWidget->selectedIds<RsPeerId,FriendSelectionWidget::IDTYPE_SSL>(peerIds, false);
std::set<RsGxsId> gxsIds;
ui->friendSelectionWidget->selectedIds<RsGxsId,FriendSelectionWidget::IDTYPE_GXS>(gxsIds, false);
int selectedCount = peerIds.size() + gxsIds.size();
mActionPlayChess->setEnabled(selectedCount);
FriendSelectionWidget::IdType idType;
ui->friendSelectionWidget->selectedId(idType);
}

View File

@ -0,0 +1,52 @@
/* This is the main page displayed by the plugin */
#ifndef NEMAINPAGE_H
#define NEMAINPAGE_H
#include <retroshare-gui/mainpage.h>
#include <retroshare/rsfiles.h>
#include <retroshare/rspeers.h>
#include "gui/RetroChessNotify.h"
#include "gui/chess.h"
#include <QWidget>
class QAction;
namespace Ui {
class NEMainpage;
}
class NEMainpage : public MainPage
{
Q_OBJECT
public:
explicit NEMainpage(QWidget *parent, RetroChessNotify *notify);
~NEMainpage();
private slots:
void setupMenuActions();
void friendSelectionChanged();
void on_pingAllButton_clicked();
void NeMsgArrived(const RsPeerId &peer_id, QString str);
void chessStart(const RsPeerId &peer_id);
void on_broadcastButton_clicked();
void on_playButton_clicked();
void on_filterPeersButton_clicked();
private:
Ui::NEMainpage *ui;
RetroChessNotify *mNotify;
QAction *mActionPlayChess;
//RetroChessWindow *tempwindow;
QMap<std::string, RetroChessWindow*> activeGames;
void create_chess_window(std::string peer_id, int player_id);
};
#endif // NEMAINPAGE_H

View File

@ -0,0 +1,268 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>NEMainpage</class>
<widget class="QWidget" name="NEMainpage">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>684</width>
<height>578</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QGridLayout" name="gridLayout_6">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item row="0" column="0">
<widget class="QFrame" name="titleBarFrame">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<property name="leftMargin">
<number>2</number>
</property>
<property name="topMargin">
<number>2</number>
</property>
<property name="rightMargin">
<number>2</number>
</property>
<property name="bottomMargin">
<number>2</number>
</property>
<item>
<widget class="QLabel" name="titleBarPixmap">
<property name="maximumSize">
<size>
<width>24</width>
<height>24</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="pixmap">
<pixmap resource="RetroChess_images.qrc">:/images/retrochess.png</pixmap>
</property>
<property name="scaledContents">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="StyledLabel" name="titleBarLabel">
<property name="text">
<string>RetroChess</string>
</property>
</widget>
</item>
<item>
<spacer>
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>123</width>
<height>13</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QToolButton" name="helpButton">
<property name="focusPolicy">
<enum>Qt::NoFocus</enum>
</property>
<property name="icon">
<iconset>
<normaloff>:/icons/help_64.png</normaloff>:/icons/help_64.png</iconset>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<property name="autoRaise">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item row="1" column="0">
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>0</number>
</property>
<widget class="QWidget" name="tab">
<attribute name="title">
<string>Chess Lobby</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_3">
<item row="0" column="0">
<widget class="QSplitter" name="splitter">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Invite Friends</string>
</property>
<layout class="QGridLayout" name="gridLayout_5">
<item row="0" column="0" colspan="2">
<widget class="FriendSelectionWidget" name="friendSelectionWidget" native="true">
<property name="contextMenuPolicy">
<enum>Qt::CustomContextMenu</enum>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QPushButton" name="filterPeersButton">
<property name="text">
<string>CheckPeers</string>
</property>
</widget>
</item>
<item row="1" column="1">
<spacer name="horizontalSpacer_2">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>41</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
<widget class="QWidget" name="layoutWidget">
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0" colspan="3">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QPushButton" name="playButton">
<property name="text">
<string>Play Chess</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>475</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="1" column="0" colspan="3">
<widget class="QListWidget" name="listWidget"/>
</item>
<item row="2" column="0">
<widget class="QLineEdit" name="msgInput">
<property name="placeholderText">
<string>Type a message here</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QPushButton" name="broadcastButton">
<property name="text">
<string>Send</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="tab_2">
<attribute name="title">
<string>Net log</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QListWidget" name="netLogWidget"/>
</item>
</layout>
</widget>
</widget>
</item>
<item row="2" column="0">
<widget class="QGroupBox" name="groupBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>150</height>
</size>
</property>
<property name="title">
<string>Active Games</string>
</property>
<layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0">
<widget class="QListWidget" name="active_games"/>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>StyledLabel</class>
<extends>QLabel</extends>
<header>gui/common/StyledLabel.h</header>
</customwidget>
<customwidget>
<class>FriendSelectionWidget</class>
<extends>QWidget</extends>
<header>gui/common/FriendSelectionWidget.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources>
<include location="RetroChess_images.qrc"/>
</resources>
<connections/>
</ui>

View File

@ -0,0 +1,147 @@
#include <QToolButton>
#include <QPropertyAnimation>
#include <QIcon>
#include <QLayout>
#include "interface/rsRetroChess.h"
#include "gui/chat/ChatWidget.h"
#include "RetroChessChatWidgetHolder.h"
#include <retroshare/rsstatus.h>
#include <retroshare/rspeers.h>
#define IMAGE_RetroChess ":/images/chess.png"
RetroChessChatWidgetHolder::RetroChessChatWidgetHolder(ChatWidget *chatWidget, RetroChessNotify *notify)
: QObject(), ChatWidgetHolder(chatWidget), mRetroChessNotify(notify)
{
QIcon icon ;
icon.addPixmap(QPixmap(IMAGE_RetroChess)) ;
playChessButton = new QToolButton ;
playChessButton->setIcon(icon) ;
playChessButton->setToolTip(tr("Invite Friend to Chess"));
playChessButton->setIconSize(QSize(35,35)) ;
playChessButton->setAutoRaise(true) ;
mChatWidget->addChatBarWidget(playChessButton);
connect(playChessButton, SIGNAL(clicked()), this , SLOT(chessPressed()));
connect(notify, SIGNAL(chessInvited(RsPeerId)), this , SLOT(chessnotify(RsPeerId)));
}
RetroChessChatWidgetHolder::~RetroChessChatWidgetHolder()
{
button_map::iterator it = buttonMapTakeChess.begin();
while (it != buttonMapTakeChess.end()) {
it = buttonMapTakeChess.erase(it);
}
}
void RetroChessChatWidgetHolder::chessnotify(RsPeerId from_peer_id)
{
RsPeerId peer_id = mChatWidget->getChatId().toPeerId();//TODO support GXSID
//if (peer_id!=from_peer_id)return;//invite from another chat
if (rsRetroChess->hasInviteFrom(peer_id)){
if (mChatWidget) {
QString buttonName = QString::fromUtf8(rsPeers->getPeerName(peer_id).c_str());
if (buttonName.isEmpty()) buttonName = "Chess";//TODO maybe change all with GxsId
//disable old buttons
button_map::iterator it = buttonMapTakeChess.begin();
while (it != buttonMapTakeChess.end()) {
it = buttonMapTakeChess.erase(it);
}
//button_map::iterator it = buttonMapTakeChess.find(buttonName);
//if (it == buttonMapTakeChess.end()){
mChatWidget->addChatMsg(true, tr("Chess Status"), QDateTime::currentDateTime(), QDateTime::currentDateTime()
, tr("%1 inviting you to start Chess. Do you want to accept or decline the invitation?").arg(buttonName), ChatWidget::MSGTYPE_SYSTEM);
RSButtonOnText *button = mChatWidget->getNewButtonOnTextBrowser(tr("Accept"));
button->setToolTip(tr("Accept"));
button->setStyleSheet(QString("border: 1px solid #199909;")
.append("font-size: 12pt; color: white;")
.append("min-width: 128px; min-height: 24px;")
.append("border-radius: 6px;")
.append("background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 0.67, "
"stop: 0 #22c70d, stop: 1 #116a06);")
);
button->updateImage();
connect(button,SIGNAL(clicked()),this,SLOT(chessStart()));
connect(button,SIGNAL(mouseEnter()),this,SLOT(botMouseEnter()));
connect(button,SIGNAL(mouseLeave()),this,SLOT(botMouseLeave()));
buttonMapTakeChess.insert(buttonName, button);
//}
}
}
}
void RetroChessChatWidgetHolder::chessPressed()
{
RsPeerId peer_id = mChatWidget->getChatId().toPeerId();//TODO support GXSID
if (rsRetroChess->hasInviteFrom(peer_id)){
rsRetroChess->acceptedInvite(peer_id);
mRetroChessNotify->notifyChessStart(peer_id);
return;
}
rsRetroChess->sendInvite(peer_id);
QString peerName = QString::fromUtf8(rsPeers->getPeerName(peer_id).c_str());
mChatWidget->addChatMsg(true, tr("Chess Status"), QDateTime::currentDateTime(), QDateTime::currentDateTime()
, tr("You're now inviting %1 to play Chess").arg(peerName), ChatWidget::MSGTYPE_SYSTEM);
}
void RetroChessChatWidgetHolder::chessStart()
{
RsPeerId peer_id = mChatWidget->getChatId().toPeerId();//TODO support GXSID
rsRetroChess->acceptedInvite(peer_id);
mRetroChessNotify->notifyChessStart(peer_id);
return;
}
void RetroChessChatWidgetHolder::botMouseEnter()
{
RSButtonOnText *source = qobject_cast<RSButtonOnText *>(QObject::sender());
if (source){
source->setStyleSheet(QString("border: 1px solid #333333;")
.append("font-size: 12pt; color: white;")
.append("min-width: 128px; min-height: 24px;")
.append("border-radius: 6px;")
.append("background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 0.67, "
"stop: 0 #444444, stop: 1 #222222);")
);
//source->setDown(true);
}
}
void RetroChessChatWidgetHolder::botMouseLeave()
{
RSButtonOnText *source = qobject_cast<RSButtonOnText *>(QObject::sender());
if (source){
source->setStyleSheet(QString("border: 1px solid #199909;")
.append("font-size: 12pt; color: white;")
.append("min-width: 128px; min-height: 24px;")
.append("border-radius: 6px;")
.append("background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 0.67, "
"stop: 0 #22c70d, stop: 1 #116a06);")
);
//source->setDown(false);
}
}

View File

@ -0,0 +1,35 @@
#ifndef RETROCHESSCHATWIDGETHOLDER_H
#define RETROCHESSCHATWIDGETHOLDER_H
#include "RetroChessChatWidgetHolder.h"
#include <gui/chat/ChatWidget.h>
#include <gui/common/RsButtonOnText.h>
#include <gui/RetroChessNotify.h>
class RetroChessChatWidgetHolder : public QObject, public ChatWidgetHolder
{
Q_OBJECT
public:
RetroChessChatWidgetHolder(ChatWidget *chatWidget, RetroChessNotify *notify);
virtual ~RetroChessChatWidgetHolder();
public slots:
void chessPressed();
void chessStart();
void chessnotify(RsPeerId from_peer_id);
private slots:
void botMouseEnter();
void botMouseLeave();
protected:
QToolButton *playChessButton ;
RetroChessNotify *mRetroChessNotify;
typedef QMap<QString, RSButtonOnText*> button_map;
button_map buttonMapTakeChess;
};
#endif // RETROCHESSCHATWIDGETHOLDER_H

View File

@ -0,0 +1,33 @@
#include "RetroChessNotify.h"
RetroChessNotify::RetroChessNotify(QObject *parent) : QObject(parent)
{
}
void RetroChessNotify::notifyReceivedPaint(const RsPeerId &peer_id, int x, int y)
{
std::cout << "pNotify Recvd paint from: " << peer_id;
std::cout << " at " << x << " , " << y;
std::cout << std::endl;
}
void RetroChessNotify::notifyReceivedMsg(const RsPeerId& peer_id, QString str)
{
std::cout << "pNotify Recvd Packet from: " << peer_id;
std::cout << " saying " << str.toStdString();
std::cout << std::endl;
emit NeMsgArrived(peer_id, str) ;
}
void RetroChessNotify::notifyChessStart(const RsPeerId &peer_id)
{
emit chessStart(peer_id) ;
}
void RetroChessNotify::notifyChessInvite(const RsPeerId &peer_id)
{
emit chessInvited(peer_id) ;
}

View File

@ -0,0 +1,54 @@
/****************************************************************
* RetroShare is distributed under the following license:
*
* Copyright (C) 2015
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
****************************************************************/
// This class is a Qt object to get notification from the plugin's service threads,
// and responsible to pass the info the the GUI part.
//
// Because the GUI part is async-ed with the service, it is crucial to use the
// QObject connect system to communicate between the p3Service and the gui part (handled by Qt)
//
#ifndef NETEXAMPLENOTIFY_H
#define NETEXAMPLENOTIFY_H
#include <retroshare/rstypes.h>
#include <QObject>
class RetroChessNotify : public QObject
{
Q_OBJECT
public:
explicit RetroChessNotify(QObject *parent = 0);
void notifyReceivedPaint(const RsPeerId &peer_id, int x, int y) ;
void notifyReceivedMsg(const RsPeerId &peer_id, QString str) ;
void notifyChessStart(const RsPeerId &peer_id) ;
void notifyChessInvite(const RsPeerId &peer_id) ;
signals:
void NeMsgArrived(const RsPeerId &peer_id, QString str) ; // emitted when the peer gets a msg
void chessStart(const RsPeerId &peer_id) ;
void chessInvited(const RsPeerId &peer_id) ;
public slots:
};
#endif // NETEXAMPLENOTIFY_H

View File

@ -0,0 +1,21 @@
<RCC>
<qresource prefix="/">
<file>images/bishop_black.svg</file>
<file>images/bishop_white.svg</file>
<file>images/king_black.svg</file>
<file>images/king_white.svg</file>
<file>images/knight_black.svg</file>
<file>images/knight_white.svg</file>
<file>images/pawn_black.svg</file>
<file>images/pawn_white.svg</file>
<file>images/queen_black.svg</file>
<file>images/queen_white.svg</file>
<file>images/rook_black.svg</file>
<file>images/rook_white.svg</file>
<file>images/chess-icon.png</file>
<file>images/chess-icon-32.png</file>
<file>images/chess.png</file>
<file>images/profile.png</file>
<file>images/retrochess.png</file>
</qresource>
</RCC>

View File

@ -0,0 +1,873 @@
#include <QApplication>
#include "chess.h"
#include "gui/common/AvatarDefs.h"
RetroChessWindow::RetroChessWindow(std::string peerid, int player, QWidget *parent) :
QWidget(parent),
mPeerId(peerid)
//ui(new Ui::RetroChessWindow)
{
//tile = { { NULL } };
count=0;
turn=1;
max=0;
texp = new int[60];
setGeometry(0,0,1370,700);
QString player_str;
if (player ){
p1id = rsPeers->getOwnId();
p2id = RsPeerId(peerid);
player_str = " (1)";
}else{
p1id = RsPeerId(peerid);
p2id = rsPeers->getOwnId();
player_str = " (2)";
}
p1name = rsPeers->getPeerName(p1id);
p2name = rsPeers->getPeerName(p2id);
QString title = QString::fromStdString(p2name);
title += " Playing Chess against ";
title += QString::fromStdString(p1name);
title+=player_str;
this->setWindowTitle(title);
accessories();
chessBoard();
}
RetroChessWindow::~RetroChessWindow()
{
}
class Border
{
public:
Border();
void outline(QWidget *baseWidget, int xPos, int yPos, int Pos)
{
QLabel *outLabel = new QLabel(baseWidget);
if(!Pos)
outLabel->setGeometry(xPos,yPos,552,20); //Horizontal Borders
else
outLabel->setGeometry(xPos,yPos,20,512); //Vertical Borders
outLabel->setStyleSheet("QLabel { background-color :rgb(170, 170, 127); color : black; }");
}
};
void RetroChessWindow::accessories()
{
QWidget *baseWidget = this;
QLabel *player2 = new QLabel(baseWidget);
QLabel *name2 = new QLabel(p2name.c_str(), baseWidget);
QLabel *time2 = new QLabel("00:00:00", baseWidget);
QLabel *player1 = new QLabel(baseWidget);
QLabel *name1 = new QLabel(p1name.c_str(), baseWidget);
QLabel *time1 = new QLabel("00:00:00", baseWidget);
QLabel *moves = new QLabel(baseWidget);
name1->setGeometry(125,610,80,20);
time1->setGeometry(120,635,80,20);
player1->setGeometry(100,500,100,100);
QPixmap p1avatar;
AvatarDefs::getAvatarFromSslId(p1id, p1avatar);
player1->setPixmap(p1avatar);//QPixmap(":/images/profile.png"));
name2->setGeometry(125,210,80,20);
time2->setGeometry(120,235,80,20);
player2->setGeometry(100,100,100,100);
QPixmap p2avatar;
AvatarDefs::getAvatarFromSslId(p2id, p2avatar);
player2->setPixmap(p2avatar);//QPixmap(":/images/profile.png"));
moves->setGeometry(1000,105,250,550);
moves->setStyleSheet("QLabel {background-color: white;}");
}
void RetroChessWindow::disOrange()
{
int i;
for(i=0;i<max;i++)
tile[texp[i]/8][texp[i]%8]->tileDisplay();
}
void RetroChessWindow::validate_tile(int row, int col, int c){
Tile *clickedtile = tile[col][row];
//if (!click1)click1=clickedtile;
clickedtile->validate(++count);
}
void RetroChessWindow::chessBoard()
{
//QWidget *baseWidget, Tile *tile[8][8]
QWidget *baseWidget = this;
int i,j,k=0,hor,ver;
Border *border[4]={ NULL };
//borderDisplay
{
border[0]->outline(baseWidget,330,105,0);
border[1]->outline(baseWidget,330,637,0);
border[2]->outline(baseWidget,330,125,1);
border[2]->outline(baseWidget,862,125,1);
}
//Create 64 tiles (allocating memories to the objects of Tile class)
ver=125;
for(i=0;i<8;i++)
{
hor=350;
for(j=0;j<8;j++)
{
tile[i][j] = new Tile(baseWidget);
tile[i][j]->tileColor=(i+j)%2;
tile[i][j]->piece=0;
tile[i][j]->row=i;
tile[i][j]->col=j;
tile[i][j]->tileNum=k++;
tile[i][j]->tileDisplay();
tile[i][j]->setGeometry(hor,ver,64,64);
hor+=64;
}
ver+=64;
}
//white pawns
for(j=0;j<8;j++)
{
tile[1][j]->piece=1;
tile[1][j]->pieceColor=0;
tile[1][j]->display('P');
}
//black pawns
for(j=0;j<8;j++)
{
tile[6][j]->piece=1;
tile[6][j]->pieceColor=1;
tile[6][j]->display('P');
}
//white and black remaining elements
for(j=0;j<8;j++)
{
tile[0][j]->piece=1;
tile[0][j]->pieceColor=0;
tile[7][j]->piece=1;
tile[7][j]->pieceColor=1;
}
{
tile[0][0]->display('R');
tile[0][1]->display('H');
tile[0][2]->display('B');
tile[0][3]->display('Q');
tile[0][4]->display('K');
tile[0][5]->display('B');
tile[0][6]->display('H');
tile[0][7]->display('R');
}
{
tile[7][0]->display('R');
tile[7][1]->display('H');
tile[7][2]->display('B');
tile[7][3]->display('Q');
tile[7][4]->display('K');
tile[7][5]->display('B');
tile[7][6]->display('H');
tile[7][7]->display('R');
}
wR=7;
wC=4;
bR=0;
bC=4;
}
int RetroChessWindow::chooser(Tile *temp)
{
switch(temp->pieceName)
{
case 'P': flag=validatePawn(temp);
break;
case 'R': flag=validateRook(temp);
break;
case 'H': flag=validateHorse(temp);
break;
case 'K': flag=validateKing(temp);
break;
case 'Q': flag=validateQueen(temp);
break;
case 'B': flag=validateBishop(temp);
break;
}
orange();
return flag;
}
//PAWN
int RetroChessWindow::validatePawn(Tile *temp)
{
int row,col;
row=temp->row;
col=temp->col;
retVal=0;
//White Pawn
if(temp->pieceColor)
{
if(row-1>=0 && !tile[row-1][col]->piece)
{
/*int tnum = tile[row-1][col]->tileNum;
std::cout << "tile: " << texp[max] << std::endl;
int a = texp[max];
texp[max] = tnum;
max++;*/
texp[max++]=tile[row-1][col]->tileNum;
retVal=1;
}
if(row==6 && !tile[5][col]->piece && !tile[4][col]->piece)
{
texp[max++]=tile[row-2][col]->tileNum;
retVal=1;
}
if(row-1>=0 && col-1>=0)
{
if(tile[row-1][col-1]->pieceColor!=temp->pieceColor && tile[row-1][col-1]->piece)
{
texp[max++]=tile[row-1][col-1]->tileNum;
retVal=1;
}
}
if(row-1>=0 && col+1<=7)
{
if(tile[row-1][col+1]->pieceColor!=temp->pieceColor && tile[row-1][col+1]->piece)
{
texp[max++]=tile[row-1][col+1]->tileNum;
retVal=1;
}
}
}
else
{
if(row+1<=7 && !tile[row+1][col]->piece)
{
texp[max++]=tile[row+1][col]->tileNum;
retVal=1;
}
if(row==1 && !tile[2][col]->piece && !tile[3][col]->piece)
{
texp[max++]=tile[row+2][col]->tileNum;
retVal=1;
}
if(row+1<=7 && col-1>=0)
{
if(tile[row+1][col-1]->pieceColor!=temp->pieceColor && tile[row+1][col-1]->piece)
{
texp[max++]=tile[row+1][col-1]->tileNum;
retVal=1;
}
}
if(row+1<=7 && col+1<=7)
{
if(tile[row+1][col+1]->pieceColor!=temp->pieceColor && tile[row+1][col+1]->piece)
{
texp[max++]=tile[row+1][col+1]->tileNum;
retVal=1;
}
}
}
return retVal;
}
//ROOK
int RetroChessWindow::validateRook(Tile *temp)
{
int r,c;
retVal=0;
r=temp->row;
c=temp->col;
while(r-->0)
{
if(!tile[r][c]->piece)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
}
else if(tile[r][c]->pieceColor==temp->pieceColor)
break;
else if(tile[r][c]->pieceColor!=temp->pieceColor)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
break;
}
}
r=temp->row;
c=temp->col;
while(r++<7)
{
if(!tile[r][c]->piece)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
}
else if(tile[r][c]->pieceColor==temp->pieceColor)
break;
else if(tile[r][c]->pieceColor!=temp->pieceColor)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
break;
}
}
r=temp->row;
c=temp->col;
while(c++<7)
{
if(!tile[r][c]->piece)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
}
else if(tile[r][c]->pieceColor==temp->pieceColor)
break;
else if(tile[r][c]->pieceColor!=temp->pieceColor)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
break;
}
}
r=temp->row;
c=temp->col;
while(c-->0)
{
if(!tile[r][c]->piece)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
}
else if(tile[r][c]->pieceColor==temp->pieceColor)
break;
else if(tile[r][c]->pieceColor!=temp->pieceColor)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
break;
}
}
return retVal;
}
//HORSE
int RetroChessWindow::validateHorse(Tile *temp)
{
int r,c;
retVal=0;
r=temp->row;
c=temp->col;
if(r-2>=0 && c-1>=0)
{
if(tile[r-2][c-1]->pieceColor!=temp->pieceColor || !tile[r-2][c-1]->piece)
{
texp[max++]=tile[r-2][c-1]->tileNum;
retVal=1;
}
}
if(r-2>=0 && c+1<=7)
{
if(tile[r-2][c+1]->pieceColor!=temp->pieceColor || !tile[r-2][c+1]->piece)
{
texp[max++]=tile[r-2][c+1]->tileNum;
retVal=1;
}
}
if(r-1>=0 && c-2>=0)
{
if(tile[r-1][c-2]->pieceColor!=temp->pieceColor || !tile[r-1][c-2]->piece)
{
texp[max++]=tile[r-1][c-2]->tileNum;
retVal=1;
}
}
if(r-1>=0 && c+2<=7)
{
if(tile[r-1][c+2]->pieceColor!=temp->pieceColor || !tile[r-1][c+2]->piece)
{
texp[max++]=tile[r-1][c+2]->tileNum;
retVal=1;
}
}
if(r+2<=7 && c+1<=7)
{
if(tile[r+2][c+1]->pieceColor!=temp->pieceColor || !tile[r+2][c+1]->piece)
{
texp[max++]=tile[r+2][c+1]->tileNum;
retVal=1;
}
}
if(r+2<=7 && c-1>=0)
{
if(tile[r+2][c-1]->pieceColor!=temp->pieceColor || !tile[r+2][c-1]->piece)
{
texp[max++]=tile[r+2][c-1]->tileNum;
retVal=1;
}
}
if(r+1<=7 && c-2>=0)
{
if(tile[r+1][c-2]->pieceColor!=temp->pieceColor || !tile[r+1][c-2]->piece)
{
texp[max++]=tile[r+1][c-2]->tileNum;
retVal=1;
}
}
if(r+1<=7 && c+2<=7)
{
if(tile[r+1][c+2]->pieceColor!=temp->pieceColor || !tile[r+1][c+2]->piece)
{
texp[max++]=tile[r+1][c+2]->tileNum;
retVal=1;
}
}
return retVal;
}
//KING
int RetroChessWindow::validateKing(Tile *temp)
{
int r,c;
retVal=0;
r=temp->row;
c=temp->col;
if(r-1>=0)
{
if(!tile[r-1][c]->piece || tile[r-1][c]->pieceColor!=temp->pieceColor)
{
texp[max++]=tile[r-1][c]->tileNum;
retVal=1;
}
}
if(r+1<=7)
{
if(!tile[r+1][c]->piece || tile[r+1][c]->pieceColor!=temp->pieceColor)
{
texp[max++]=tile[r+1][c]->tileNum;
retVal=1;
}
}
if(c-1>=0)
{
if(!tile[r][c-1]->piece || tile[r][c-1]->pieceColor!=temp->pieceColor)
{
texp[max++]=tile[r][c-1]->tileNum;
retVal=1;
}
}
if(c+1<=7)
{
if(!tile[r][c+1]->piece || tile[r][c+1]->pieceColor!=temp->pieceColor)
{
texp[max++]=tile[r][c+1]->tileNum;
retVal=1;
}
}
if(r-1>=0 && c-1>=0)
{
if(!tile[r-1][c-1]->piece || tile[r-1][c-1]->pieceColor!=temp->pieceColor)
{
texp[max++]=tile[r-1][c-1]->tileNum;
retVal=1;
}
}
if(r-1>=0 && c+1<=7)
{
if(!tile[r-1][c+1]->piece || tile[r-1][c+1]->pieceColor!=temp->pieceColor)
{
texp[max++]=tile[r-1][c+1]->tileNum;
retVal=1;
}
}
if(r+1<=7 && c-1>=0)
{
if(!tile[r+1][c-1]->piece || tile[r+1][c-1]->pieceColor!=temp->pieceColor)
{
texp[max++]=tile[r+1][c-1]->tileNum;
retVal=1;
}
}
if(r+1<=7 && c+1<=7)
{
if(!tile[r+1][c+1]->piece || tile[r+1][c+1]->pieceColor!=temp->pieceColor)
{
texp[max++]=tile[r+1][c+1]->tileNum;
retVal=1;
}
}
return retVal;
}
//QUEEN
int RetroChessWindow::validateQueen(Tile *temp)
{
int r,c;
retVal=0;
r=temp->row;
c=temp->col;
while(r-->0)
{
if(!tile[r][c]->piece)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
}
else if(tile[r][c]->pieceColor==temp->pieceColor)
break;
else if(tile[r][c]->pieceColor!=temp->pieceColor)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
break;
}
}
r=temp->row;
c=temp->col;
while(r++<7)
{
if(!tile[r][c]->piece)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
}
else if(tile[r][c]->pieceColor==temp->pieceColor)
break;
else if(tile[r][c]->pieceColor!=temp->pieceColor)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
break;
}
}
r=temp->row;
c=temp->col;
while(c++<7)
{
if(!tile[r][c]->piece)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
}
else if(tile[r][c]->pieceColor==temp->pieceColor)
break;
else if(tile[r][c]->pieceColor!=temp->pieceColor)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
break;
}
}
r=temp->row;
c=temp->col;
while(c-->0)
{
if(!tile[r][c]->piece)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
}
else if(tile[r][c]->pieceColor==temp->pieceColor)
break;
else if(tile[r][c]->pieceColor!=temp->pieceColor)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
break;
}
}
r=temp->row;
c=temp->col;
while(r-->0 && c++<7)
{
if(!tile[r][c]->piece)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
}
else if(tile[r][c]->pieceColor==temp->pieceColor)
break;
else if(tile[r][c]->pieceColor!=temp->pieceColor)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
break;
}
}
r=temp->row;
c=temp->col;
while(r-->0 && c-->0)
{
if(!tile[r][c]->piece)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
}
else if(tile[r][c]->pieceColor==temp->pieceColor)
break;
else if(tile[r][c]->pieceColor!=temp->pieceColor)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
break;
}
}
r=temp->row;
c=temp->col;
while(r++<7 && c++<7)
{
if(!tile[r][c]->piece)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
}
else if(tile[r][c]->pieceColor==temp->pieceColor)
break;
else if(tile[r][c]->pieceColor!=temp->pieceColor)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
break;
}
}
r=temp->row;
c=temp->col;
while(r++<7 && c-->0)
{
if(!tile[r][c]->piece)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
}
else if(tile[r][c]->pieceColor==temp->pieceColor)
break;
else if(tile[r][c]->pieceColor!=temp->pieceColor)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
break;
}
}
return retVal;
}
//BISHOP
int RetroChessWindow::validateBishop(Tile *temp)
{
int r,c;
retVal=0;
r=temp->row;
c=temp->col;
while(r-->0 && c++<7)
{
if(!tile[r][c]->piece)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
}
else if(tile[r][c]->pieceColor==temp->pieceColor)
break;
else if(tile[r][c]->pieceColor!=temp->pieceColor)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
break;
}
}
r=temp->row;
c=temp->col;
while(r-->0 && c-->0)
{
if(!tile[r][c]->piece)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
}
else if(tile[r][c]->pieceColor==temp->pieceColor)
break;
else if(tile[r][c]->pieceColor!=temp->pieceColor)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
break;
}
}
r=temp->row;
c=temp->col;
while(r++<7 && c++<7)
{
if(!tile[r][c]->piece)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
}
else if(tile[r][c]->pieceColor==temp->pieceColor)
break;
else if(tile[r][c]->pieceColor!=temp->pieceColor)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
break;
}
}
r=temp->row;
c=temp->col;
while(r++<7 && c-->0)
{
if(!tile[r][c]->piece)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
}
else if(tile[r][c]->pieceColor==temp->pieceColor)
break;
else if(tile[r][c]->pieceColor!=temp->pieceColor)
{
texp[max++]=tile[r][c]->tileNum;
retVal=1;
break;
}
}
return retVal;
}
int RetroChessWindow::check(Tile *temp)
{
int r,c,flag;
retVal=0;
return retVal;
}
void RetroChessWindow::orange()
{
int i,n;
for(i=0;i<max;i++)
tile[texp[i]/8][texp[i]%8]->setStyleSheet("QLabel {background-color: orange;}");
}

View File

@ -0,0 +1,57 @@
#ifndef CHESS_H
#define CHESS_H
//#include "tile.h"
#include "validation.h"
#include "qwidget.h"
#include "retroshare/rspeers.h"
class RetroChessWindow : public QWidget
{
Q_OBJECT
void accessories();
void chessBoard();
RsPeerId p1id;
RsPeerId p2id;
std::string p1name;
std::string p2name;
public:
std::string mPeerId;
explicit RetroChessWindow(std::string peerid, int player = 0, QWidget *parent = 0);
~RetroChessWindow();
int currentplayer;
int myid;
//from global
int wR,wC,bR,bC;
Tile *click1;
Tile *tile[8][8];
int count,turn,max;
int *texp;
void disOrange();
void validate_tile(int row, int col, int c);
int flag,retVal;
int chooser(Tile *temp);
int validateBishop(Tile *temp);
int validateQueen(Tile *temp);
int validateKing(Tile *temp);
int validateHorse(Tile *temp);
int validateRook(Tile *temp);
int validatePawn(Tile *temp);
void orange();
int check(Tile *temp);
};
QWidget* make_board();
#endif // CHESS_H

View File

@ -0,0 +1,116 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="64"
height="64"
id="svg2">
<metadata
id="metadata8">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs6" />
<image
xlink:href="data:image/png;base64,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
RK5CYII=
"
x="0"
y="0"
width="64"
height="64"
id="image10" />
</svg>

After

Width:  |  Height:  |  Size: 6.8 KiB

View File

@ -0,0 +1,124 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="64"
height="64"
id="svg2">
<metadata
id="metadata8">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs6" />
<image
xlink:href="data:image/png;base64,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
"
x="0"
y="0"
width="64"
height="64"
id="image10" />
</svg>

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg4155"
version="1.1"
inkscape:version="0.91 r13725"
xml:space="preserve"
width="80"
height="80"
viewBox="0 0 80 80"
sodipodi:docname="chess-notify.svg"><metadata
id="metadata4161"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs4159" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="706"
id="namedview4157"
showgrid="true"
inkscape:zoom="5.11875"
inkscape:cx="10.06105"
inkscape:cy="38.547254"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="g4163"><inkscape:grid
type="xygrid"
id="grid4140" /></sodipodi:namedview><g
id="g4163"
inkscape:groupmode="layer"
inkscape:label="ink_ext_XXXXXX"
transform="matrix(1.25,0,0,-1.25,0,80)"><path
inkscape:connector-curvature="0"
id="path4167"
style="fill:#f3dd1d;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="M 64,32 C 64,14.327 49.673,0 32,0 14.327,0 0,14.327 0,32 0,49.673 14.327,64 32,64 49.673,64 64,49.673 64,32" /><path
inkscape:connector-curvature="0"
style="fill:#ffffff"
d="m 48.338741,15.4906 c 0,-0.7338 -0.5949,-1.3287 -1.3287,-1.3287 l -29.93997,0 c -0.73379,0 -1.3287,0.5949 -1.3287,1.3287 l 0,2.83455 c 0,0.7338 0.59491,1.3287 1.3287,1.3287 l 29.93997,0 c 0.7338,0 1.3287,-0.5949 1.3287,-1.3287 l 0,-2.83455 z m 5.45935,22.90053 -5.75769,-14.70425 c -0.1993,-0.50915 -0.69021,-0.84434 -1.2371,-0.84434 l -29.23134,0 c -0.54193,0 -1.02947,0.32881 -1.23214,0.83141 l -5.93485,14.70425 c -0.23615,0.58498 -0.0283,1.25535 0.49746,1.60436 0.52546,0.34847 1.22382,0.28009 1.67151,-0.16476 l 7.2072,-7.16363 2.29068,6.73738 c 0.13287,0.39082 0.43971,0.69766 0.83052,0.83053 0.39135,0.13251 0.82131,0.0765 1.16447,-0.15254 l 4.46159,-2.97451 1.86655,6.50477 c -1.56361,0.66524 -2.66271,2.2168 -2.66271,4.02046 0,2.40796 1.95903,4.36681 4.36681,4.36681 2.40778,0 4.36699,-1.95903 4.36699,-4.36681 0,-1.80366 -1.09928,-3.35522 -2.66289,-4.02046 l 1.85238,-6.45516 4.38718,2.9249 c 0.34316,0.22889 0.77295,0.28523 1.16447,0.15254 0.39064,-0.13287 0.69766,-0.43954 0.83052,-0.83053 l 2.31318,-6.80328 7.27346,7.22935 c 0.44591,0.4429 1.14073,0.51306 1.66566,0.16848 0.52528,-0.3444 0.73716,-1.00999 0.50809,-1.59497 z m -17.37316,-3.92709 2.17765,-7.58881 3.65055,3.6284 -2.17463,6.39617 -3.65357,-2.43576 z m -14.54622,-3.89468 3.71681,-3.69431 2.16347,7.53938 -3.72796,2.48537 -2.15232,-6.33044 z"
id="path3" /></g></svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

@ -0,0 +1,56 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg4155"
version="1.1"
inkscape:version="0.91 r13725"
xml:space="preserve"
width="80"
height="80"
viewBox="0 0 80 80"
sodipodi:docname="chess.svg"><metadata
id="metadata4161"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs4159" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="706"
id="namedview4157"
showgrid="true"
inkscape:zoom="5.11875"
inkscape:cx="27.773218"
inkscape:cy="38.742614"
inkscape:window-x="-8"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:current-layer="g4163"><inkscape:grid
type="xygrid"
id="grid4140" /></sodipodi:namedview><g
id="g4163"
inkscape:groupmode="layer"
inkscape:label="ink_ext_XXXXXX"
transform="matrix(1.25,0,0,-1.25,0,80)"><path
inkscape:connector-curvature="0"
id="path4167"
style="fill:#039bd5;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="M 64,32 C 64,14.327 49.673,0 32,0 14.327,0 0,14.327 0,32 0,49.673 14.327,64 32,64 49.673,64 64,49.673 64,32" /><path
inkscape:connector-curvature="0"
style="fill:#ffffff"
d="m 48.338741,15.4906 c 0,-0.7338 -0.5949,-1.3287 -1.3287,-1.3287 l -29.93997,0 c -0.73379,0 -1.3287,0.5949 -1.3287,1.3287 l 0,2.83455 c 0,0.7338 0.59491,1.3287 1.3287,1.3287 l 29.93997,0 c 0.7338,0 1.3287,-0.5949 1.3287,-1.3287 l 0,-2.83455 z m 5.45935,22.90053 -5.75769,-14.70425 c -0.1993,-0.50915 -0.69021,-0.84434 -1.2371,-0.84434 l -29.23134,0 c -0.54193,0 -1.02947,0.32881 -1.23214,0.83141 l -5.93485,14.70425 c -0.23615,0.58498 -0.0283,1.25535 0.49746,1.60436 0.52546,0.34847 1.22382,0.28009 1.67151,-0.16476 l 7.2072,-7.16363 2.29068,6.73738 c 0.13287,0.39082 0.43971,0.69766 0.83052,0.83053 0.39135,0.13251 0.82131,0.0765 1.16447,-0.15254 l 4.46159,-2.97451 1.86655,6.50477 c -1.56361,0.66524 -2.66271,2.2168 -2.66271,4.02046 0,2.40796 1.95903,4.36681 4.36681,4.36681 2.40778,0 4.36699,-1.95903 4.36699,-4.36681 0,-1.80366 -1.09928,-3.35522 -2.66289,-4.02046 l 1.85238,-6.45516 4.38718,2.9249 c 0.34316,0.22889 0.77295,0.28523 1.16447,0.15254 0.39064,-0.13287 0.69766,-0.43954 0.83052,-0.83053 l 2.31318,-6.80328 7.27346,7.22935 c 0.44591,0.4429 1.14073,0.51306 1.66566,0.16848 0.52528,-0.3444 0.73716,-1.00999 0.50809,-1.59497 z m -17.37316,-3.92709 2.17765,-7.58881 3.65055,3.6284 -2.17463,6.39617 -3.65357,-2.43576 z m -14.54622,-3.89468 3.71681,-3.69431 2.16347,7.53938 -3.72796,2.48537 -2.15232,-6.33044 z"
id="path3" /></g></svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -0,0 +1,135 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="64"
height="64"
id="svg2">
<metadata
id="metadata8">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs6" />
<image
xlink:href="data:image/png;base64,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
"
x="0"
y="0"
width="64"
height="64"
id="image10" />
</svg>

After

Width:  |  Height:  |  Size: 8.3 KiB

View File

@ -0,0 +1,143 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="64"
height="64"
id="svg2">
<metadata
id="metadata8">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs6" />
<image
xlink:href="data:image/png;base64,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
+h/8D/5x+E+jXTheSW2AZwAAAABJRU5ErkJggg==
"
x="0"
y="0"
width="64"
height="64"
id="image10" />
</svg>

After

Width:  |  Height:  |  Size: 8.9 KiB

View File

@ -0,0 +1,101 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="64"
height="64"
id="svg2">
<metadata
id="metadata8">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs6" />
<image
xlink:href="data:image/png;base64,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
"
x="0"
y="0"
width="64"
height="64"
id="image10" />
</svg>

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@ -0,0 +1,123 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="64"
height="64"
id="svg2">
<metadata
id="metadata8">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs6" />
<image
xlink:href="data:image/png;base64,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
TkSuQmCC
"
x="0"
y="0"
width="64"
height="64"
id="image10" />
</svg>

After

Width:  |  Height:  |  Size: 7.4 KiB

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 67 KiB

View File

@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="64"
height="64"
id="svg2">
<metadata
id="metadata8">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs6" />
<image
xlink:href="data:image/png;base64,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
taHXy6cAAAAASUVORK5CYII=
"
x="0"
y="0"
width="64"
height="64"
id="image10" />
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -0,0 +1,92 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="64"
height="64"
id="svg2">
<metadata
id="metadata8">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs6" />
<image
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABHNCSVQICAgIfAhkiAAADBFJREFU
eJztmntMVHcWx8/v3juvOw8YFWaUR8AOMIKrRLABFZGKgt2uSIIaE02Mr2x3TR9mE5u4DTFusmtt
1/SfbmtrqtnWWFxrW41aUFSUohW2IhSYwdGJDIg6jCIzzHDvnXv2DxkWRh4zA4PJLp/klyHc3+/M
Od/5Pc/vAkwxxRRTTDHFFP+vkPEaQEQaAGhCCDdavTNnzmjv3LkTV19fP+/HH39Uud1uWLRokZif
n9+m0+n+vWHDBjshxDvILgsAwlh2xwszXgOEEC8ijvi8tLSUysvLW37mzJkdVVVV6Xfv3tV1d3fT
oijC1atXoa2tzZWUlFTz9OnTfzU1NZ1NTU3t6m/KEUKE8fo3FuMWAOC5CCM9Y1k27+DBg/tu3LiR
IQgCEx8fD9OnTweKoqCnpwdsNhtbWVn524cPHy7q7e3NM5lMf0lJSbk7GcEDTJAAI/Hll19GHjt2
bH1tbe3CmJgYauPGjbB8+XKYPn06EELA5XLBrVu34Ouvv6avXLkyQy6Xr585c6YZEf8e7q7vI2wC
lJaWUi0tLYubmpoytVot9fbbb0NJSQmo1eoh9ZKSkiAuLg44joNffvmFTU1NLcjKyjoGAPfD5dtg
qHAZ1mg0MqfTuVkQhN8sWLAAVqxYASqVakgdQggwDAOZmZmwevVqEEURamtrFfX19cpw+eVP2ASw
2WzgcDiiBUFgoqOjQaPRACEEKIoCmqaBpmkg5PkiJJVKwWAwAMuyQAiZ9+zZsxxElITLt8GETQAA
AJqmnYQQ5HkeRFEctg4iAiKC2+0Gr9cL0udQADDy0jKBhE0Ao9EoREZGXqdp2mOxWKC9vX3YeoQQ
6O7uhpqaGnC5XBAVFXU3Li6uZbJWgbAJsGPHDkGv159Tq9VXamtruc8//xxMJhMIggCiKA6Urq4u
OHHiBJw6dQrUavWz6OjoLwwGw81w+RV2ysrKaAAARCS1tbWS3Nzc7QqF4rFarcbi4mI8ffo0ut1u
5DgOGxoacOfOnRgTE4MMw+DKlSvt5eXl2xobG6X+dhGRIGJYh+yEgIiSBw8eJB45cmT1qlWrfh8b
G3tSIpH0MQyDLMvi5s2bsaOjA10uFx46dAj1ej1KJBJkGAZTUlKErVu33v7www/3VFRUxA9je8IF
GPdZYDCISNvtdsPp06f/fPz48fzr16/LpVIpazAYpK+88gokJCRATk4OLF26FBiGAbPZDOfPnweT
yQRWqxVaWlrg2bNnMHv27O5XX331RHFx8f7CwsI7E+lj2CgtLaU6OjrmHDhw4A85OTltGo0Gs7Ky
cP/+/fjzzz9jZ2cnulwu5HkeeZ5HjuOQ53n0eDzocDjQZDLh0aNHsbi4GKdNm4ZJSUn89u3b/3Hu
3Lm0lx1bQDx8+FB17ty5g6tWrbJGRERwRUVFeP78eXzy5Al6vd6ASm9vL9bX1+OuXbtQr9fj/Pnz
PQcOHPin2WyOetnxjQoiUh0dHZl79+6tnzVrFmZnZ2N5eTnyPI+iKA4p/vg/93q9aDKZcPv27ahW
q3HNmjWPzp49u7X/2D3hTNSkorh58+bc6urqGJ7n4Y033oDMzMyB3d7g4s9wzxITE2HdunVgMBjA
ZDLNsFqtRTdu3AjL9nhCBGhtbRUuXrwob25uVsfHx0NOTs4Lh55A8IlAURTMmTMH5s2bBw6HgzQ3
N890Op3BGwyAcQuAiJTX65V2dHQoe3t7iW+2J4QMbHODsDXwt1KphISEBBBFEWw2G8NxnHy8vg7H
hByHPR6PJiIiYjYhhIqMjPQdaoK242vjOyUqFAoghIjd3d0d7e3tzonw1Z+gesBwExEhRHz69Gk3
x3EORESXywV9fX0hO+QTwev1gtvtBkEQOJ7nLTabrSdko6MQsACISACA7v8coKysjJ4/f/60tLS0
CIVCAVarFTo6OoLq+n7fA4gITqcTrFYrUBQlSU9PNxYVFcWEZHAMAhaAEIKEEI4QMiSytWvXUlqt
lklPT7cnJSX1tLa2QlVVFbhcrqCd8QUviiKYTCZoaGiAiIgIbubMmXdZln0StMEAmKhlsCs1NfV8
VlaWlaIo+OGHH6Curg4EQRgIaKwe4QseEeH+/ftw8uRJsFgsQlRU1PXo6OgvjEajvb9eFCKGNZc5
mpPEfwggIo2Ico/Hk1xVVXW+qKgI1Wo1rlu3Di9fvoxOp3PETZD/hqivrw9bW1vx/fffx5iYGEGn
053btGlTvi9gRGQRMQ0RVcN7GDxBKenf/fv/50VEkMlkjtTU1EOFhYV9Dodj5cWLF+V2ux1KSkog
Pz8fEhISgGEYXxsA+O+yh4jQ1dUF1dXVcOrUKaioqACVSuXNzs6+np+fX+NLjhBCehHRNFnJkpCw
2WyrP/74Y6vBYECapjEuLg7fffddtNlsKAjCkJ4giiIKgoBOpxOPHDmCc+fORblcjpGRkfjWW2/1
NjQ0/MGXXwgXEzmWyPHjx9M+/fTT7IaGBpXdbgeJRAIymQykUunAxmjYhoSAVCoFhUIBMpkM3G43
3Lx5UyqXy4uSkpKsAHDWv03/UCSEkOGTjYE6HUqj/sQE+obEpUuX5Gazee233367rqWlZenjx4/V
ycnJZPny5bBs2TJIT08HvV4PNP38xxw8BHyiOJ1OaGxshOrqaqioqIC6ujqgaVqIj4+vmTNnzr6+
vr7KEydOePv3IlJCiHuQEMMOz7DRP/ERAIAHDx4o33zzzTX5+flWpVIpxsfH486dO7GqqgqfPHmC
HMeh1+sddRL0nQIFQUCXy4XNzc34wQcf4MKFC5FlWW9sbGxtQUHBHysqKpL7J2IVIkZMWsAjcevW
rcR9+/b9LS0trV6pVAqLFy/Go0eP4qNHj5DneRQEYczg/QXwtenp6cHKykrcuHEjarVaMTY21rFl
y5bj33//fRoiUv0iTG6OcPAS2N7ezn700Ud/zcvL86rVaiwqKsILFy6gx+MZ9fw/mgj+RRAEbG5u
xl27dqFOp8PY2Fh+/fr1h6uqqpInNXB/GhsbpZ988smW3Nxci0qlwtWrV+O1a9fQ4/G8MNOHik8A
nufx3r17+N5776FOp8OUlJSePXv2HDSbzZqXFT/56aefCrdu3dqs1WoxNzcXy8vLB8Z6IF0+GBF8
paWlBbdt24YqlQpzc3MffvbZZ5vQb1MWCkGvsXa7PebkyZN/+u6775YpFAryzjvvwMqVK0Emk42a
+QmFwatFZGQk6HQ6sFgsUFdXpyCETNNoNE1fffXV8FdOARL0JHLt2rXsS5cuLWtvbyevv/46FBYW
AsuyLzg9UfgEpWkaMjIyYNOmTaDVaimTybSspaVlPY7zEjVYAUhlZWV2Y2Ojzmg0QklJCcyYMWPC
f/lhv5gQkEgkkJOTA9nZ2XDnzh1oamr63a+//po0HrtBCVBWViavrq6Odblc9GuvvQZz586dtOAB
ng8FvV4PBQUFoFaroaamRvPNN99ox2M7qISI0+lc4nQ60yMiImDJkiWgUqmCzvuFik9khmFg6dKl
kJGRAa2trbaGhgYPjOOGK2ABOjs7WbPZnG+32xMSExPBaDQCRb2cu0qdTgcLFy4EqVSqs1gsBfv3
7w/5eBxwBPX19TKLxZLS3d3NGAwGiImJAYqiwt79B+N7w0QqlYLRaASWZWd5vd4NarV6Vqg2Axbg
8OHDtNls1jIMA7GxsSCXhyVLPSY+EaKjo4FlWcrhcMjtdnvIp9qAG169ehXcbjeRSCQwY8aMF052
kwkhBJRKJchkMnA4HOBwOEK2FbAAnZ2dQFEUqNVqkMlkA45MxgToDyICTdNAURQiokcQhBFf1ByL
YFNiAw4M/nyJiIIgODiO6w3VQMAC6PV64DhO4Hke3G438DwPiPiCKIMZ3EOG6y2jtR0LjuMAESml
UjktPj5+GoT4YmXAAuTk5HC3b99uu3fvHlRWVg4Jfiz8hRrvvIGIYLVaoauri8jlcpZl2ZDX44AF
2L17d+/u3btb29ra8MKFC3jlypUhmyD/wEb6VYMVYKQrdUQEQRAgKysLkpOTQz4PBCxARkaGuGLF
isuPHz/ee//+fUoURfB6vQOvuwnC0Ez1SC9GBsvgzRZFUcAwzEDRaDSQnZ3dt2DBgrDcG04xxRRT
TDHF/zj/ARMroxZdZMvlAAAAAElFTkSuQmCC
"
x="0"
y="0"
width="64"
height="64"
id="image10" />
</svg>

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

View File

@ -0,0 +1,141 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="64"
height="64"
id="svg2">
<metadata
id="metadata8">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs6" />
<image
xlink:href="data:image/png;base64,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
9JT+v6Z/B5f+l+cJ+szpAAAAAElFTkSuQmCC
"
x="0"
y="0"
width="64"
height="64"
id="image10" />
</svg>

After

Width:  |  Height:  |  Size: 8.7 KiB

View File

@ -0,0 +1,139 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="64"
height="64"
id="svg2">
<metadata
id="metadata8">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs6" />
<image
xlink:href="data:image/png;base64,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
"
x="0"
y="0"
width="64"
height="64"
id="image10" />
</svg>

After

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -0,0 +1,73 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="64"
height="64"
id="svg2">
<metadata
id="metadata8">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs6" />
<image
xlink:href="data:image/png;base64,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
"
x="0"
y="0"
width="64"
height="64"
id="image10" />
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="64"
height="64"
id="svg2">
<metadata
id="metadata8">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs6" />
<image
xlink:href="data:image/png;base64,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
"
x="0"
y="0"
width="64"
height="64"
id="image10" />
</svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@ -0,0 +1,157 @@
#include "tile.h"
#include "validation.h"
#include "chess.h"
#include "../interface/rsRetroChess.h"
validation *valid = new validation();
/*extern int count,turn;
extern QWidget *myWidget;
extern Tile *click1;
extern Tile *tile[8][8];
*/
void validate(Tile *temp,int c);
void disOrange();
void Tile::mousePressEvent(QMouseEvent *event)
{
validate(++((RetroChessWindow*)parentWidget())->count);
std::string peer_id = ((RetroChessWindow*)parentWidget())->mPeerId;
rsRetroChess->chess_click(peer_id, this->row,this->col,((RetroChessWindow*)parentWidget())->count);
}
void Tile::display(char elem)
{
this->pieceName=elem;
if(this->pieceColor && this->piece)
{
switch(elem)
{
case 'P': this->setPixmap(QPixmap(":/images/pawn_white.svg"));
break;
case 'R': this->setPixmap(QPixmap(":/images/rook_white.svg"));
break;
case 'H': this->setPixmap(QPixmap(":/images/knight_white.svg"));
break;
case 'K': this->setPixmap(QPixmap(":/images/king_white.svg"));
break;
case 'Q': this->setPixmap(QPixmap(":/images/queen_white.svg"));
break;
case 'B': this->setPixmap(QPixmap(":/images/bishop_white.svg"));
break;
}
}
else if(this->piece)
{
switch(elem)
{
case 'P': this->setPixmap(QPixmap(":/images/pawn_black.svg"));
break;
case 'R': this->setPixmap(QPixmap(":/images/rook_black.svg"));
break;
case 'H': this->setPixmap(QPixmap(":/images/knight_black.svg"));
break;
case 'K': this->setPixmap(QPixmap(":/images/king_black.svg"));
break;
case 'Q': this->setPixmap(QPixmap(":/images/queen_black.svg"));
break;
case 'B': this->setPixmap(QPixmap(":/images/bishop_black.svg"));
break;
}
}
else
this->clear();
}
void Tile::validate(int c)
{
Tile *temp = this;
int retValue,i;
if(c==1)
{
if(temp->piece && (temp->pieceColor==((RetroChessWindow*)parentWidget())->turn))
{
//texp[max++]=temp->tileNum;
retValue=((RetroChessWindow*)parentWidget())->chooser(temp);
if(retValue)
{
((RetroChessWindow*)parentWidget())->click1= new Tile();
temp->setStyleSheet("QLabel {background-color: green;}");
((RetroChessWindow*)parentWidget())->click1=temp;
}
else
{
//temp->setStyleSheet("QLabel {background-color: red;}");
((RetroChessWindow*)parentWidget())->count=0;
}
}
else
{
//qDebug()<<"Rascel, clicking anywhere";
((RetroChessWindow*)parentWidget())->count=0;
}
}
else
{
if(temp->tileNum==((RetroChessWindow*)parentWidget())->click1->tileNum)
{
((RetroChessWindow*)parentWidget())->click1->tileDisplay();
((RetroChessWindow*)parentWidget())->disOrange();
((RetroChessWindow*)parentWidget())->max=0;
((RetroChessWindow*)parentWidget())->count=0;
}
for(i=0;i<((RetroChessWindow*)parentWidget())->max;i++)
{
if(temp->tileNum==((RetroChessWindow*)parentWidget())->texp[i])
{
((RetroChessWindow*)parentWidget())->click1->piece=0;
temp->piece=1;
temp->pieceColor=((RetroChessWindow*)parentWidget())->click1->pieceColor;
temp->pieceName=((RetroChessWindow*)parentWidget())->click1->pieceName;
((RetroChessWindow*)parentWidget())->click1->display(((RetroChessWindow*)parentWidget())->click1->pieceName);
temp->display(((RetroChessWindow*)parentWidget())->click1->pieceName);
((RetroChessWindow*)parentWidget())->click1->tileDisplay();
temp->tileDisplay();
retValue=((RetroChessWindow*)parentWidget())->check(((RetroChessWindow*)parentWidget())->click1);
/*
if(retValue)
{
tile[wR][wC]->setStyleSheet("QLabel {background-color: red;}");
}
*/
((RetroChessWindow*)parentWidget())->disOrange();
((RetroChessWindow*)parentWidget())->max=0;
((RetroChessWindow*)parentWidget())->turn=(((RetroChessWindow*)parentWidget())->turn+1)%2;
((RetroChessWindow*)parentWidget())->count=0;
}
else
((RetroChessWindow*)parentWidget())->count=1;
}
}
}
void Tile::tileDisplay()
{
if(this->tileColor)
this->setStyleSheet("QLabel {background-color: rgb(120, 120, 90);}:hover{background-color: rgb(170,85,127);}");
else
this->setStyleSheet("QLabel {background-color: rgb(211, 211, 158);}:hover{background-color: rgb(170,95,127);}");
}

View File

@ -0,0 +1,27 @@
#ifndef TILE_H
#define TILE_H
#include <QLabel>
#include <QDebug>
class Tile: public QLabel
{
public:
//Fields
int tileColor,piece,pieceColor,row,col,tileNum;
char pieceName;
//Constructors
Tile(QWidget* pParent=0, Qt::WindowFlags f=0) : QLabel(pParent, f) {};
Tile(const QString& text, QWidget* pParent = 0, Qt::WindowFlags f = 0) : QLabel(text, pParent, f){};
//Methods
void mousePressEvent(QMouseEvent *event);
void display(char elem);
void tileDisplay();
void validate(int c);
};
void validate_tile(int row, int col, int c);
#endif // TILE_H

View File

@ -0,0 +1,14 @@
#include "validation.h"
#include <iostream>
#include "string"
#include "chess.h"
validation::validation()
{
//Nothing here
// tile = ((RetroChessWindow*)parentWidget())->tile;
}

View File

@ -0,0 +1,15 @@
#ifndef VALIDATION_H
#define VALIDATION_H
#include "tile.h"
class validation
{
int *tile;
public:
validation();
};
#endif // VALIDATION_H

View File

@ -0,0 +1,57 @@
/* this is a simple class to make it easy for any part of the plugin to call its services */
/****************************************************************
* RetroShare is distributed under the following license:
*
* Copyright (C) 2015
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
****************************************************************/
// interface class for p3RetroChess service
//
#pragma once
#include <stdint.h>
#include <string>
#include <list>
#include <vector>
#include <retroshare/rstypes.h>
class RsRetroChess ;
extern RsRetroChess *rsRetroChess;
static const uint32_t CONFIG_TYPE_RetroChess_PLUGIN = 0xe001 ;
class RsRetroChess
{
public:
virtual void ping_all() = 0;
virtual void broadcast_paint(int x, int y) = 0;
virtual void msg_all(std::string msg) = 0;
virtual void chess_click(std::string peer_id, int col, int row, int count) = 0;
virtual void qvm_msg_peer(RsPeerId peerID, QVariantMap data) = 0;
virtual void str_msg_peer(RsPeerId peerID, QString strdata) = 0;
virtual void raw_msg_peer(RsPeerId peerID, std::string msg) = 0;
virtual bool hasInviteFrom(RsPeerId peerID) = 0;
virtual bool hasInviteTo(RsPeerId peerID) = 0;
virtual void acceptedInvite(RsPeerId peerID) = 0;
virtual void gotInvite(RsPeerId peerID) = 0;
virtual void sendInvite(RsPeerId peerID) = 0;
};

View File

@ -0,0 +1,10 @@
#!/bin/bash
newname=$1
oldname="RetroChess"
echo "$newname"
echo "$oldname"
find . -not -path '*/\.*' -type f -print0 | xargs -0 sed -i "s/$oldname/$newname/g"
#find . -type f -exec rename "s/$oldname/$newname/' '{}" \;
find . | sed -e "p;s/$oldname/$newname/" | xargs -n2 git mv
echo "now change 0xb00b5 in services/*items.h to a unique value of your choice to identify your plugin!"

View File

@ -0,0 +1,411 @@
/****************************************************************
* RetroShare is distributed under the following license:
*
* Copyright (C) 2015
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
****************************************************************/
#include "util/rsdir.h"
#include "retroshare/rsiface.h"
#include "pqi/pqibin.h"
#include "pqi/pqistore.h"
#include "pqi/p3linkmgr.h"
#include <serialiser/rsserial.h>
#include <rsitems/rsconfigitems.h>
#include <sstream> // for std::istringstream
#include "services/p3RetroChess.h"
#include "services/rsRetroChessItems.h"
#include <sys/time.h>
#include "gui/RetroChessNotify.h"
//#define DEBUG_RetroChess 1
/* DEFINE INTERFACE POINTER! */
RsRetroChess *rsRetroChess = NULL;
#ifdef WINDOWS_SYS
#include <time.h>
#include <sys/timeb.h>
#endif
static double getCurrentTS()
{
#ifndef WINDOWS_SYS
struct timeval cts_tmp;
gettimeofday(&cts_tmp, NULL);
double cts = (cts_tmp.tv_sec) + ((double) cts_tmp.tv_usec) / 1000000.0;
#else
struct _timeb timebuf;
_ftime( &timebuf);
double cts = (timebuf.time) + ((double) timebuf.millitm) / 1000.0;
#endif
return cts;
}
static uint64_t convertTsTo64bits(double ts)
{
uint32_t secs = (uint32_t) ts;
uint32_t usecs = (uint32_t) ((ts - (double) secs) * 1000000);
uint64_t bits = (((uint64_t) secs) << 32) + usecs;
return bits;
}
static double convert64bitsToTs(uint64_t bits)
{
uint32_t usecs = (uint32_t) (bits & 0xffffffff);
uint32_t secs = (uint32_t) ((bits >> 32) & 0xffffffff);
double ts = (secs) + ((double) usecs) / 1000000.0;
return ts;
}
p3RetroChess::p3RetroChess(RsPluginHandler *handler,RetroChessNotify *notifier)
: RsPQIService(RS_SERVICE_TYPE_RetroChess_PLUGIN,0,handler), mRetroChessMtx("p3RetroChess"), mServiceControl(handler->getServiceControl()) , mNotify(notifier)
{
addSerialType(new RsRetroChessSerialiser());
//plugin default configuration
}
RsServiceInfo p3RetroChess::getServiceInfo()
{
const std::string TURTLE_APP_NAME = "RetroChess";
const uint16_t TURTLE_APP_MAJOR_VERSION = 1;
const uint16_t TURTLE_APP_MINOR_VERSION = 0;
const uint16_t TURTLE_MIN_MAJOR_VERSION = 1;
const uint16_t TURTLE_MIN_MINOR_VERSION = 0;
return RsServiceInfo(RS_SERVICE_TYPE_RetroChess_PLUGIN,
TURTLE_APP_NAME,
TURTLE_APP_MAJOR_VERSION,
TURTLE_APP_MINOR_VERSION,
TURTLE_MIN_MAJOR_VERSION,
TURTLE_MIN_MINOR_VERSION);
}
int p3RetroChess::tick()
{
#ifdef DEBUG_RetroChess
std::cerr << "ticking p3RetroChess" << std::endl;
#endif
//processIncoming();
//sendPackets();
return 0;
}
int p3RetroChess::status()
{
return 1;
}
#include<qjsondocument.h>
void p3RetroChess::str_msg_peer(RsPeerId peerID, QString strdata){
QVariantMap map;
map.insert("type", "chat");
map.insert("message", strdata);
qvm_msg_peer(peerID,map);
}
void p3RetroChess::qvm_msg_peer(RsPeerId peerID, QVariantMap data){
QJsonDocument jsondoc = QJsonDocument::fromVariant(data);
std::string msg = jsondoc.toJson().toStdString();
raw_msg_peer(peerID, msg);
}
void p3RetroChess::chess_click(std::string peer_id, int col, int row, int count)
{
QVariantMap map;
map.insert("type", "chessclick");
map.insert("col", col);
map.insert("row", row);
map.insert("count", count);
RsPeerId peerID = RsPeerId(peer_id);
qvm_msg_peer(peerID,map);
}
bool p3RetroChess::hasInviteFrom(RsPeerId peerID)
{
return invitesFrom.find(peerID)!=invitesFrom.end();
}
bool p3RetroChess::hasInviteTo(RsPeerId peerID)
{
return invitesTo.find(peerID)!=invitesTo.end();
}
void p3RetroChess::acceptedInvite(RsPeerId peerID)
{
std::set<RsPeerId>::iterator it =invitesTo.find(peerID);
if (it != invitesTo.end()){
invitesTo.erase(it);
}
it =invitesFrom.find(peerID);
if (it != invitesFrom.end()){
invitesFrom.erase(it);
}
raw_msg_peer(peerID, "{\"type\":\"chess_accept\"}");
}
void p3RetroChess::gotInvite(RsPeerId peerID)
{
std::set<RsPeerId>::iterator it =invitesFrom.find(peerID);
if (it == invitesFrom.end()){
invitesFrom.insert(peerID);
}
}
void p3RetroChess::sendInvite(RsPeerId peerID)
{
std::set<RsPeerId>::iterator it =invitesTo.find(peerID);
if (it == invitesTo.end()){
invitesTo.insert(peerID);
}
raw_msg_peer(peerID, "{\"type\":\"chess_invite\"}");
}
/*void p3RetroChess::set_peer(RsPeerId peer)
{
mPeerID = peer;
}*/
void p3RetroChess::raw_msg_peer(RsPeerId peerID, std::string msg){
std::cout << "MSging: " << peerID.toStdString() << "\n";
std::cout << "MSging: " << msg << "\n";
/* create the packet */
RsRetroChessDataItem *pingPkt = new RsRetroChessDataItem();
pingPkt->PeerId(peerID);
pingPkt->m_msg = msg;
pingPkt->data_size = msg.size();
//pingPkt->mSeqNo = mCounter;
//pingPkt->mPingTS = convertTsTo64bits(ts);
//storePingAttempt(*it, ts, mCounter);
#ifdef DEBUG_RetroChess
std::cerr << "p3RetroChess::msg_all() With Packet:";
std::cerr << std::endl;
pingPkt->print(std::cerr, 10);
#endif
sendItem(pingPkt);
}
void p3RetroChess::msg_all(std::string msg){
/* we ping our peers */
//if(!mServiceControl)
// return ;
//std::set<RsPeerId> onlineIds;
std::list< RsPeerId > onlineIds;
// mServiceControl->getPeersConnected(getServiceInfo().mServiceType, onlineIds);
rsPeers->getOnlineList(onlineIds);
double ts = getCurrentTS();
#ifdef DEBUG_RetroChess
std::cerr << "p3RetroChess::msg_all() @ts: " << ts;
std::cerr << std::endl;
#endif
std::cout << "READY TO BCast: " << onlineIds.size() << "\n";
/* prepare packets */
std::list<RsPeerId>::iterator it;
for(it = onlineIds.begin(); it != onlineIds.end(); it++)
{
str_msg_peer(RsPeerId(*it),QString::fromStdString(msg));
}
}
void p3RetroChess::ping_all(){
//TODO ping all!
}
void p3RetroChess::broadcast_paint(int x, int y)
{
std::list< RsPeerId > onlineIds;
// mServiceControl->getPeersConnected(getServiceInfo().mServiceType, onlineIds);
rsPeers->getOnlineList(onlineIds);
double ts = getCurrentTS();
std::cout << "READY TO PAINT: " << onlineIds.size() << "\n";
/* prepare packets */
std::list<RsPeerId>::iterator it;
for(it = onlineIds.begin(); it != onlineIds.end(); it++)
{
std::cout << "painting to: " << (*it).toStdString() << "\n";
QVariantMap map;
map.insert("type", "paint");
map.insert("x", x);
map.insert("y", y);
qvm_msg_peer(RsPeerId(*it),map);
/* create the packet */
//TODO send paint packets
}
}
//TODO mNotify->notifyReceivedPaint(item->PeerId(), item->x,item->y);
void p3RetroChess::handleData(RsRetroChessDataItem *item)
{
RsStackMutex stack(mRetroChessMtx); /****** LOCKED MUTEX *******/
// store the data in a queue.
mNotify->notifyReceivedMsg(item->PeerId(), QString::fromStdString(item->m_msg));
}
bool p3RetroChess::recvItem(RsItem *item)
{
std::cout << "recvItem type: " << item->PacketSubType() << "\n";
/* pass to specific handler */
bool keep = false ;
switch(item->PacketSubType())
{
case RS_PKT_SUBTYPE_RetroChess_DATA:
handleData(dynamic_cast<RsRetroChessDataItem*>(item));
keep = true ;
break;
/*case RS_PKT_SUBTYPE_RetroChess_INVITE:
if (invites.find(item->PeerId()!=invites.end())){
invites.insert(item->PeerId());
}
mNotify->
//keep = true ;
break;*/
default:
break;
}
/* clean up */
if(!keep)
delete item;
return true ;
}
RsTlvKeyValue p3RetroChess::push_int_value(const std::string& key,int value)
{
RsTlvKeyValue kv ;
kv.key = key ;
rs_sprintf(kv.value, "%d", value);
return kv ;
}
int p3RetroChess::pop_int_value(const std::string& s)
{
std::istringstream is(s) ;
int val ;
is >> val ;
return val ;
}
bool p3RetroChess::saveList(bool& cleanup, std::list<RsItem*>& lst)
{
cleanup = true ;
RsConfigKeyValueSet *vitem = new RsConfigKeyValueSet ;
/*vitem->tlvkvs.pairs.push_back(push_int_value("P3RetroChess_CONFIG_ATRANSMIT",_atransmit)) ;
vitem->tlvkvs.pairs.push_back(push_int_value("P3RetroChess_CONFIG_VOICEHOLD",_voice_hold)) ;
vitem->tlvkvs.pairs.push_back(push_int_value("P3RetroChess_CONFIG_VADMIN" ,_vadmin)) ;
vitem->tlvkvs.pairs.push_back(push_int_value("P3RetroChess_CONFIG_VADMAX" ,_vadmax)) ;
vitem->tlvkvs.pairs.push_back(push_int_value("P3RetroChess_CONFIG_NOISE_SUP",_noise_suppress)) ;
vitem->tlvkvs.pairs.push_back(push_int_value("P3RetroChess_CONFIG_MIN_LOUDN",_min_loudness)) ;
vitem->tlvkvs.pairs.push_back(push_int_value("P3RetroChess_CONFIG_ECHO_CNCL",_echo_cancel)) ;*/
lst.push_back(vitem) ;
return true ;
}
bool p3RetroChess::loadList(std::list<RsItem*>& load)
{
for(std::list<RsItem*>::const_iterator it(load.begin());it!=load.end();++it)
{
#ifdef P3TURTLE_DEBUG
assert(item!=NULL) ;
#endif
RsConfigKeyValueSet *vitem = dynamic_cast<RsConfigKeyValueSet*>(*it) ;
/*
if(vitem != NULL)
for(std::list<RsTlvKeyValue>::const_iterator kit = vitem->tlvkvs.pairs.begin(); kit != vitem->tlvkvs.pairs.end(); ++kit)
if(kit->key == "P3RetroChess_CONFIG_ATRANSMIT")
_atransmit = pop_int_value(kit->value) ;
else if(kit->key == "P3RetroChess_CONFIG_VOICEHOLD")
_voice_hold = pop_int_value(kit->value) ;
else if(kit->key == "P3RetroChess_CONFIG_VADMIN")
_vadmin = pop_int_value(kit->value) ;
else if(kit->key == "P3RetroChess_CONFIG_VADMAX")
_vadmax = pop_int_value(kit->value) ;
else if(kit->key == "P3RetroChess_CONFIG_NOISE_SUP")
_noise_suppress = pop_int_value(kit->value) ;
else if(kit->key == "P3RetroChess_CONFIG_MIN_LOUDN")
_min_loudness = pop_int_value(kit->value) ;
else if(kit->key == "P3RetroChess_CONFIG_ECHO_CNCL")
_echo_cancel = pop_int_value(kit->value) ;
delete vitem ;
*/
}
return true ;
}
RsSerialiser *p3RetroChess::setupSerialiser()
{
RsSerialiser *rsSerialiser = new RsSerialiser();
rsSerialiser->addSerialType(new RsRetroChessSerialiser());
rsSerialiser->addSerialType(new RsGeneralConfigSerialiser());
return rsSerialiser ;
}

View File

@ -0,0 +1,120 @@
/* this handles the networking service of this plugin */
/****************************************************************
* RetroShare is distributed under the following license:
*
* Copyright (C) 2015
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
****************************************************************/
#pragma once
#include <list>
#include <string>
#include <QVariantMap>
#include "services/rsRetroChessItems.h"
#include "services/p3service.h"
#include "serialiser/rstlvbase.h"
#include "rsitems/rsconfigitems.h"
#include "plugins/rspqiservice.h"
#include <interface/rsRetroChess.h>
class p3LinkMgr;
class RetroChessNotify ;
//!The RS VoIP Test service.
/**
*
* This is only used to test Latency for the moment.
*/
class p3RetroChess: public RsPQIService, public RsRetroChess
// Maybe we inherit from these later - but not needed for now.
//, public p3Config, public pqiMonitor
{
public:
p3RetroChess(RsPluginHandler *cm,RetroChessNotify *);
/***** overloaded from rsRetroChess *****/
/***** overloaded from p3Service *****/
/*!
* This retrieves all chat msg items and also (important!)
* processes chat-status items that are in service item queue. chat msg item requests are also processed and not returned
* (important! also) notifications sent to notify base on receipt avatar, immediate status and custom status
* : notifyCustomState, notifyChatStatus, notifyPeerHasNewAvatar
* @see NotifyBase
*/
virtual int tick();
virtual int status();
virtual bool recvItem(RsItem *item);
/*************** pqiMonitor callback ***********************/
//virtual void statusChange(const std::list<pqipeer> &plist);
/************* from p3Config *******************/
virtual RsSerialiser *setupSerialiser() ;
/*!
* chat msg items and custom status are saved
*/
virtual bool saveList(bool& cleanup, std::list<RsItem*>&) ;
virtual bool loadList(std::list<RsItem*>& load) ;
virtual std::string configurationFileName() const { return "RetroChess.cfg" ; }
virtual RsServiceInfo getServiceInfo() ;
void ping_all();
void broadcast_paint(int x, int y);
void msg_all(std::string msg);
void str_msg_peer(RsPeerId peerID, QString strdata);
void raw_msg_peer(RsPeerId peerID, std::string msg);
void qvm_msg_peer(RsPeerId peerID, QVariantMap data);
void chess_click(std::string peer_id, int col, int row, int count);
//void set_peer(RsPeerId peer);
bool hasInviteFrom(RsPeerId peerID);
bool hasInviteTo(RsPeerId peerID);
void gotInvite(RsPeerId peerID);
void acceptedInvite(RsPeerId peerID);
void sendInvite(RsPeerId peerID);
private:
std::set<RsPeerId> invitesTo;
std::set<RsPeerId> invitesFrom;
void handleData(RsRetroChessDataItem*) ;
RsMutex mRetroChessMtx;
//RsPeerId mPeerID;
static RsTlvKeyValue push_int_value(const std::string& key,int value) ;
static int pop_int_value(const std::string& s) ;
RsServiceControl *mServiceControl;
RetroChessNotify *mNotify ;
};

View File

@ -0,0 +1,175 @@
/****************************************************************
* RetroShare is distributed under the following license:
*
* Copyright (C) 2015
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
****************************************************************/
#include <stdexcept>
#include "serialiser/rsbaseserial.h"
#include "serialiser/rstlvbase.h"
#include "services/rsRetroChessItems.h"
/***
#define RSSERIAL_DEBUG 1
***/
#include <iostream>
#define HOLLERITH_LEN_SPEC 4
/*************************************************************************/
std::ostream& RsRetroChessDataItem::print(std::ostream &out, uint16_t indent)
{
printRsItemBase(out, "RsRetroChessDataItem", indent);
uint16_t int_Indent = indent + 2;
printIndent(out, int_Indent);
out << "flags: " << flags << std::endl;
printIndent(out, int_Indent);
out << "data size: " << std::hex << data_size << std::dec << std::endl;
printRsItemEnd(out, "RsRetroChessDataItem", indent);
return out;
}
/*************************************************************************/
uint32_t RsRetroChessDataItem::serial_size() const
{
uint32_t s = 8; /* header */
s += 4; /* flags */
s += 4; /* data_size */
//s += m_msg.length()+HOLLERITH_LEN_SPEC; /* data */
s += getRawStringSize(m_msg);
return s;
}
/* serialise the data to the buffer */
bool RsRetroChessDataItem::serialise(void *data, uint32_t& pktsize)
{
uint32_t tlvsize = serial_size() ;
uint32_t offset = 0;
if (pktsize < tlvsize)
return false; /* not enough space */
pktsize = tlvsize;
bool ok = true;
ok &= setRsItemHeader(data, tlvsize, PacketId(), tlvsize);
#ifdef RSSERIAL_DEBUG
std::cerr << "RsRetroChessSerialiser::serialiseRetroChessDataItem() Header: " << ok << std::endl;
std::cerr << "RsRetroChessSerialiser::serialiseRetroChessDataItem() Size: " << tlvsize << std::endl;
#endif
/* skip the header */
offset += 8;
/* add mandatory parts first */
ok &= setRawUInt32(data, tlvsize, &offset, flags);
ok &= setRawUInt32(data, tlvsize, &offset, data_size);
ok &= setRawString(data, tlvsize, &offset, m_msg );
std::cout << "string sizes: " << getRawStringSize(m_msg) << " OR " << m_msg.size() << "\n";
if (offset != tlvsize)
{
ok = false;
std::cerr << "RsRetroChessSerialiser::serialiseRetroChessPingItem() Size Error! " << std::endl;
std::cerr << "expected " << tlvsize << " got " << offset << std::endl;
std::cerr << "m_msg looks like " << m_msg << std::endl;
}
return ok;
}
/* serialise the data to the buffer */
/*************************************************************************/
/*************************************************************************/
RsRetroChessDataItem::RsRetroChessDataItem(void *data, uint32_t pktsize)
: RsRetroChessItem(RS_PKT_SUBTYPE_RetroChess_DATA)
{
/* get the type and size */
uint32_t rstype = getRsItemId(data);
uint32_t rssize = getRsItemSize(data);
uint32_t offset = 0;
if ((RS_PKT_VERSION_SERVICE != getRsItemVersion(rstype)) || (RS_SERVICE_TYPE_RetroChess_PLUGIN != getRsItemService(rstype)) || (RS_PKT_SUBTYPE_RetroChess_DATA != getRsItemSubType(rstype)))
throw std::runtime_error("Wrong packet subtype") ;
if (pktsize < rssize) /* check size */
throw std::runtime_error("Not enough space") ;
bool ok = true;
/* skip the header */
offset += 8;
/* get mandatory parts first */
ok &= getRawUInt32(data, rssize, &offset, &flags);
ok &= getRawUInt32(data, rssize, &offset, &data_size);
ok &= getRawString(data, rssize, &offset, m_msg );
if (offset != rssize)
throw std::runtime_error("Serialization error.") ;
if (!ok)
throw std::runtime_error("Serialization error.") ;
}
/*************************************************************************/
RsItem* RsRetroChessSerialiser::deserialise(void *data, uint32_t *pktsize)
{
#ifdef RSSERIAL_DEBUG
std::cerr << "RsRetroChessSerialiser::deserialise()" << std::endl;
#endif
/* get the type and size */
uint32_t rstype = getRsItemId(data);
if ((RS_PKT_VERSION_SERVICE != getRsItemVersion(rstype)) || (RS_SERVICE_TYPE_RetroChess_PLUGIN != getRsItemService(rstype)))
return NULL ;
try
{
switch(getRsItemSubType(rstype))
{
case RS_PKT_SUBTYPE_RetroChess_DATA: return new RsRetroChessDataItem(data, *pktsize);
default:
return NULL;
}
}
catch(std::exception& e)
{
std::cerr << "RsRetroChessSerialiser: deserialization error: " << e.what() << std::endl;
return NULL;
}
}
/*************************************************************************/

View File

@ -0,0 +1,125 @@
/* this describes the datatypes sent over the network, and how to (de)serialise them */
/****************************************************************
* RetroShare is distributed under the following license:
*
* Copyright (C) 2015
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
****************************************************************/
#pragma once
/*
* libretroshare/src/serialiser: rsRetroChessItems.h
*
* RetroShare Serialiser.
*
* Copyright 2011 by Robert Fernie.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License Version 2 as published by the Free Software Foundation.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA.
*
* Please report all bugs and problems to "retroshare@lunamutt.com".
*
*/
#include <map>
#include "rsitems/rsserviceids.h"
#include "serialiser/rsserial.h"
#include "rsitems/rsitem.h"
/**************************************************************************/
const uint16_t RS_SERVICE_TYPE_RetroChess_PLUGIN = 0xc4e55;
const uint8_t RS_PKT_SUBTYPE_RetroChess_DATA = 0x01;
const uint8_t QOS_PRIORITY_RS_RetroChess = 9 ;
class RsRetroChessItem: public RsItem
{
public:
RsRetroChessItem(uint8_t RetroChess_subtype)
: RsItem(RS_PKT_VERSION_SERVICE,RS_SERVICE_TYPE_RetroChess_PLUGIN,RetroChess_subtype)
{
setPriorityLevel(QOS_PRIORITY_RS_RetroChess) ;
}
virtual ~RsRetroChessItem() {};
virtual void clear() {};
virtual std::ostream& print(std::ostream &out, uint16_t indent = 0) = 0 ;
virtual bool serialise(void *data,uint32_t& size) = 0 ; // Isn't it better that items can serialise themselves ?
virtual uint32_t serial_size() const = 0 ; // deserialise is handled using a constructor
};
class RsRetroChessDataItem: public RsRetroChessItem
{
public:
RsRetroChessDataItem() :RsRetroChessItem(RS_PKT_SUBTYPE_RetroChess_DATA) {}
RsRetroChessDataItem(void *data,uint32_t size) ; // de-serialization
virtual bool serialise(void *data,uint32_t& size) ;
virtual uint32_t serial_size() const ;
virtual ~RsRetroChessDataItem()
{
}
virtual std::ostream& print(std::ostream &out, uint16_t indent = 0);
uint32_t flags ;
uint32_t data_size ;
std::string m_msg;
};
class RsRetroChessSerialiser: public RsSerialType
{
public:
RsRetroChessSerialiser()
:RsSerialType(RS_PKT_VERSION_SERVICE, RS_SERVICE_TYPE_RetroChess_PLUGIN)
{
}
virtual ~RsRetroChessSerialiser() {}
virtual uint32_t size (RsItem *item)
{
return dynamic_cast<RsRetroChessItem *>(item)->serial_size() ;
}
virtual bool serialise (RsItem *item, void *data, uint32_t *size)
{
return dynamic_cast<RsRetroChessItem *>(item)->serialise(data,*size) ;
}
virtual RsItem *deserialise(void *data, uint32_t *size);
};
/**************************************************************************/