|
|
|
#include "inter.h"
|
|
|
|
#include "inter.moc"
|
|
|
|
|
|
|
|
#include <klocale.h>
|
|
|
|
#include <kaction.h>
|
|
|
|
#include <kapplication.h>
|
|
|
|
|
|
|
|
#include "factory.h"
|
|
|
|
#include "field.h"
|
|
|
|
#include "commonprefs.h"
|
|
|
|
#include "main.h"
|
|
|
|
|
|
|
|
|
|
|
|
const ActionData Interface::ACTION_DATA[Nb_Actions] = {
|
|
|
|
{ I18N_NOOP("Move Left"), "move left", TQT_SLOT(moveLeft()), 0 },
|
|
|
|
{ I18N_NOOP("Move Right"), "move right", TQT_SLOT(moveRight()), 0 },
|
|
|
|
{ I18N_NOOP("Drop Down"), "drop down", TQT_SLOT(dropDownStart()),
|
|
|
|
TQT_SLOT(dropDownStop()) },
|
|
|
|
{ I18N_NOOP("One Line Down"), "one line down", TQT_SLOT(oneLineDown()), 0 },
|
|
|
|
{ I18N_NOOP("Rotate Left"), "rotate left", TQT_SLOT(rotateLeft()), 0 },
|
|
|
|
{ I18N_NOOP("Rotate Right"), "rotate right", TQT_SLOT(rotateRight()), 0 },
|
|
|
|
{ I18N_NOOP("Move to Left Column"), "move left total",
|
|
|
|
TQT_SLOT(moveLeftTotal()), 0 },
|
|
|
|
{ I18N_NOOP("Move to Right Column"), "move right total",
|
|
|
|
TQT_SLOT(moveRightTotal()), 0 }
|
|
|
|
};
|
|
|
|
|
|
|
|
const int Interface::KEYCODE_ONE[Nb_Actions] = {
|
|
|
|
Key_Left, Key_Right, Key_Down, Key_Shift, Key_Up, Key_Return,
|
|
|
|
CTRL+Key_Left, CTRL+Key_Right
|
|
|
|
};
|
|
|
|
const int Interface::KEYCODE_TWO[Nb_Actions] = {
|
|
|
|
Key_F, Key_G, Key_D, Key_Space, Key_E, Key_C, SHIFT+Key_F, SHIFT+Key_G
|
|
|
|
};
|
|
|
|
|
|
|
|
Interface::Interface(const MPGameInfo &gi, TQWidget *tqparent)
|
|
|
|
: MPSimpleInterface(gi, Nb_Actions, ACTION_DATA, tqparent)
|
|
|
|
{
|
|
|
|
setDefaultKeycodes(1, 0, KEYCODE_ONE);
|
|
|
|
setDefaultKeycodes(2, 0, KEYCODE_TWO);
|
|
|
|
setDefaultKeycodes(2, 1, KEYCODE_ONE);
|
|
|
|
}
|
|
|
|
|
|
|
|
MPBoard *Interface::newBoard(uint i)
|
|
|
|
{
|
|
|
|
Field *f = static_cast<Field *>(cfactory->createField(this));
|
|
|
|
f->settingsChanged();
|
|
|
|
connect(this, TQT_SIGNAL(settingsChanged()), f, TQT_SLOT(settingsChanged()));
|
|
|
|
if ( i==0 ) _firstField = f;
|
|
|
|
return f;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Interface::normalGame()
|
|
|
|
{
|
|
|
|
singleHuman();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Interface::arcadeGame()
|
|
|
|
{
|
|
|
|
singleHuman();
|
|
|
|
_firstField->setArcade();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Interface::_init()
|
|
|
|
{
|
|
|
|
if ( !server() ) return;
|
|
|
|
_data.resize(nbPlayers());
|
|
|
|
_scores.setPlayerCount( nbPlayers() );
|
|
|
|
for (uint i=0; i<nbPlayers(); i++)
|
|
|
|
_scores.setName(i, playerName(i));
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Interface::_readPlayData()
|
|
|
|
{
|
|
|
|
bool end = false;
|
|
|
|
for (uint i=0; i<nbPlayers(); i++) {
|
|
|
|
readingStream(i) >> _data[i];
|
|
|
|
if (_data[i].end) end = true;
|
|
|
|
}
|
|
|
|
return end;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Interface::_sendPlayData()
|
|
|
|
{
|
|
|
|
ServerPlayData sd;
|
|
|
|
for(uint i=0; i<nbPlayers(); i++) {
|
|
|
|
sd.prevHeight = _data[prev(i)].height;
|
|
|
|
sd.nextHeight = _data[next(i)].height;
|
|
|
|
sd.gift = _data[prev(i)].gift;
|
|
|
|
writingStream(i) << sd;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Interface::_showHighscores(TQWidget *tqparent)
|
|
|
|
{
|
|
|
|
if ( !server() || nbPlayers()!=1 ) _scores.show(tqparent);
|
|
|
|
else BaseInterface::_showHighscores(tqparent);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Interface::_showGameOverData()
|
|
|
|
{
|
|
|
|
if ( !server() || nbPlayers()!=1 ) _scores.show(this);
|
|
|
|
else if ( !_firstField->isArcade() ) {
|
|
|
|
_score.setType(KExtHighscore::Won);
|
|
|
|
BaseField::gameOver(_score, this);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
uint Interface::prev(uint i) const
|
|
|
|
{
|
|
|
|
if ( i==0 ) return nbPlayers()-1;
|
|
|
|
else return i-1;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint Interface::next(uint i) const
|
|
|
|
{
|
|
|
|
if ( i==(nbPlayers()-1) ) return 0;
|
|
|
|
else return i+1;
|
|
|
|
}
|
|
|
|
|
|
|
|
// server only
|
|
|
|
void Interface::_treatInit()
|
|
|
|
{
|
|
|
|
ServerInitData sid;
|
|
|
|
sid.seed = kapp->random();
|
|
|
|
sid.initLevel = CommonPrefs::initialGameLevel();
|
|
|
|
for (uint i=0; i<nbPlayers(); i++) {
|
|
|
|
sid.prevName = playerName(prev(i));
|
|
|
|
sid.nextName = playerName(next(i));
|
|
|
|
sid.name = playerName(i);
|
|
|
|
writingStream(i) << sid;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Interface::_sendGameOverData(TQDataStream &s)
|
|
|
|
{
|
|
|
|
bool multiplayers = ( nbPlayers()>1 );
|
|
|
|
for (uint i=0; i<nbPlayers(); i++) {
|
|
|
|
readingStream(i) >> _score;
|
|
|
|
if (multiplayers) _scores.addScore(i, _score);
|
|
|
|
}
|
|
|
|
if (multiplayers) s << _scores;
|
|
|
|
// else no need to send anything
|
|
|
|
}
|
|
|
|
|
|
|
|
// client only
|
|
|
|
void Interface::_readGameOverData(TQDataStream &s)
|
|
|
|
{
|
|
|
|
s >> _scores;
|
|
|
|
}
|