RetroShare/plugins/qcheckers_plugin/board.cc
defnax 87344de7d4 added for plugins own dir
git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@1850 b45a01b8-16f6-495d-af2f-9b41ad6348cc
2009-11-28 14:21:11 +00:00

365 lines
7.9 KiB
C++

/***************************************************************************
* Copyright (C) 2004-2005 Artur Wiebe *
* wibix@gmx.de *
* *
* 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., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#include <QLayout>
#include <QDebug>
#include "board.h"
#include "common.h"
#include "pdn.h"
#include "echeckers.h"
#include "rcheckers.h"
/*
#include "newgamedlg.h"
#include "player.h"
#include "humanplayer.h"
#include "computerplayer.h"
*/
myBoard::myBoard(QWidget* parent)
: QFrame(parent)
{
/*
* board & info
*/
setFrameStyle(QFrame::Box|QFrame::Plain);
for(int i=0; i<64; i++)
m_fields[i] = new Field(this, i);
QGridLayout* grid = new QGridLayout(this);
grid->setSpacing(0);
grid->setMargin(0);
for(int i=0; i<4; i++) {
for(int k=0; k<4; k++) {
grid->addWidget(m_fields[i*8+k+32], i*2, k*2 );
grid->addWidget(m_fields[i*8+k ], i*2, k*2+1);
grid->addWidget(m_fields[i*8+k+4 ], i*2+1,k*2 );
grid->addWidget(m_fields[i*8+k+36], i*2+1,k*2+1);
}
}
for(int i=0; i<32; i++)
connect(m_fields[i], SIGNAL(click(int)),
this, SIGNAL(fieldClicked(int)));
/*
* game init
*/
m_game = 0;
xpmPat1 = 0;
xpmPat2 = 0;
xpmFrame= 0;
xpmManBlack = 0;
xpmManWhite = 0;
xpmKingBlack= 0;
xpmKingWhite= 0;
}
myBoard::~myBoard()
{
if(m_game)
delete m_game;
}
void myBoard::setTheme(const QString& path, bool set_white)
{
// delete them later.
QPixmap* p1 = xpmManWhite;
QPixmap* p2 = xpmManBlack;
QPixmap* p3 = xpmKingWhite;
QPixmap* p4 = xpmKingBlack;
QPixmap* p5 = xpmPat1;
QPixmap* p6 = xpmPat2;
QPixmap* p7 = xpmFrame;
if(path == DEFAULT_THEME) {
// just in case no themes installed.
xpmPat1 = new QPixmap(":/icons/theme/tile1.png");
xpmPat2 = new QPixmap(":/icons/theme/tile2.png");
xpmFrame= new QPixmap(":/icons/theme/frame.png");
xpmManBlack = new QPixmap(":/icons/theme/manblack.png");
xpmManWhite = new QPixmap(":/icons/theme/manwhite.png");
xpmKingBlack= new QPixmap(":/icons/theme/kingblack.png");
xpmKingWhite= new QPixmap(":/icons/theme/kingwhite.png");
} else {
xpmPat1 = new QPixmap(path+"/"THEME_TILE1);
xpmPat2 = new QPixmap(path+"/"THEME_TILE2);
xpmFrame= new QPixmap(path+"/"THEME_FRAME);
xpmManBlack
= new QPixmap(path+"/"THEME_MANBLACK);
xpmManWhite
= new QPixmap(path+"/"THEME_MANWHITE);
xpmKingBlack
= new QPixmap(path+"/"THEME_KINGBLACK);
xpmKingWhite
= new QPixmap(path+"/"THEME_KINGWHITE);
}
setColorWhite(set_white);
for(int i=0; i<32; i++)
m_fields[i]->setPattern(xpmPat2);
for(int i=32; i<64; i++)
m_fields[i]->setPattern(xpmPat1);
for(int i=0; i<32; i++)
m_fields[i]->setFrame(xpmFrame);
setFixedSize(xpmMan1->width()*8 + 2*frameWidth(),
xpmMan1->height()*8 + 2*frameWidth());
if(m_game)
do_draw();
// now delete.
if(p1) delete p1;
if(p2) delete p2;
if(p3) delete p3;
if(p4) delete p4;
if(p5) delete p5;
if(p6) delete p6;
if(p7) delete p7;
}
void myBoard::reset()
{
int new_board[32];
for(int i=0; i<12; i++)
new_board[i]=MAN2;
for(int i=12; i<20; i++)
new_board[i]=FREE;
for(int i=20; i<32; i++)
new_board[i]=MAN1;
// reset frames.
for(int i=0; i<32; i++)
m_fields[i]->showFrame(false);
if(m_game)
m_game->setup(new_board);
do_draw();
}
void myBoard::adjustNotation(bool bottom_is_white)
{
if(!m_game)
return;
QString notation = (m_game->type()==ENGLISH
? ENOTATION : QString(RNOTATION).toUpper());
if(bottom_is_white) {
for(int i=0; i<32; i++)
m_fields[i]->setLabel(notation.mid(i*2,2).trimmed());
} else {
for(int i=0; i<32; i++)
m_fields[i]->setLabel(notation.mid(62-i*2,2).trimmed());
}
}
void myBoard::do_draw()
{
for(int i=0; i<32; i++) {
switch(m_game->item(i)) {
case MAN1:
m_fields[i]->setPicture(xpmMan1);
break;
case MAN2:
m_fields[i]->setPicture(xpmMan2);
break;
case KING1:
m_fields[i]->setPicture(xpmKing1);
break;
case KING2:
m_fields[i]->setPicture(xpmKing2);
break;
default:
m_fields[i]->setPicture(NULL);
}
}
}
void myBoard::setColorWhite(bool b)
{
if(b) {
xpmMan1 = xpmManWhite;
xpmMan2 = xpmManBlack;
xpmKing1= xpmKingWhite;
xpmKing2= xpmKingBlack;
} else {
xpmMan1 = xpmManBlack;
xpmMan2 = xpmManWhite;
xpmKing1= xpmKingBlack;
xpmKing2= xpmKingWhite;
}
}
void myBoard::setNotation(bool s, bool above)
{
for(int i=0; i<32; i++)
m_fields[i]->showLabel(s, above);
}
/*
void myBoard::do_move(const QString& move)
{
qDebug() << __PRETTY_FUNCTION__;
if(!m_current->isHuman()) {
add_log(myBoard::Warning, tr("It's not your turn."));
return;
}
int from_num, to_num;
if(extract_move(move, &from_num, &to_num)) {
slot_click(from_num);
slot_click(to_num);
} else
add_log(myBoard::Warning, tr("Syntax error. Usage: /from-to"));
}
*/
bool myBoard::convert_move(const QString& move_orig, int* from_num, int* to_num)
{
QString move = move_orig.toUpper().replace('X', '-');
QString from;
QString to;
int sect = move.count('-');
*from_num = *to_num = -1;
from = move.section('-', 0, 0);
to = move.section('-', sect, sect);
if(from!=QString::null && to!=QString::null) {
for(int i=0; i<32; i++) {
if(m_fields[i]->label()==from)
*from_num = m_fields[i]->number();
if(m_fields[i]->label()==to)
*to_num = m_fields[i]->number();
}
if(*from_num>=0 && *to_num>=0)
return true;
}
return false;
}
void myBoard::setNotationFont(const QFont& f)
{
setFont(f);
for(int i=0; i<32; i++)
m_fields[i]->fontUpdate();
}
void myBoard::setGame(int rules)
{
if(m_game)
delete m_game;
if(rules==ENGLISH) {
m_game = new ECheckers();
} else {
m_game = new RCheckers();
}
reset();
}
void myBoard::selectField(int field_num, bool is_on)
{
for(int i=0; i<32; i++) {
if(i==field_num)
m_fields[i]->showFrame(is_on);
else
m_fields[i]->showFrame(false);
}
}
QString myBoard::doMove(int from_num, int to_num, bool white_player)
{
bool bottom_player = (white_player && (xpmMan1==xpmManWhite))
|| (!white_player && (xpmMan1==xpmManBlack));
int from_pos = from_num;
int to_pos = to_num;
if(!bottom_player) {
from_pos = 31-from_pos;
to_pos = 31-to_pos;
m_game->fromString(m_game->toString(true));
}
if(!m_game->go1(from_pos, to_pos)) {
return QString::null;
/*
qDebug() << __PRETTY_FUNCTION__
<< from_pos << "," << to_pos
<< " could not move.";
*/
}
if(!bottom_player) {
m_game->fromString(m_game->toString(true));
}
do_draw();
return QString("%1?%3")
.arg(m_fields[from_num]->label())
.arg(m_fields[to_num]->label());
}
bool myBoard::doMove(const QString& move, bool white_player)
{
int from_pos, to_pos;
if(convert_move(move, &from_pos, &to_pos)) {
doMove(from_pos, to_pos, white_player);
return true;
}
return false;
}
void myBoard::doFreeMove(int from, int to)
{
int old_to = m_game->item(to);
int old_from = m_game->item(from);
m_game->setItem(to, old_from);
m_game->setItem(from, old_to);
do_draw();
}