mirror of
https://github.com/RetroShare/RetroShare.git
synced 2024-12-24 06:59:27 -05:00
365 lines
7.9 KiB
C++
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();
|
||
|
}
|
||
|
|