improved counters

This commit is contained in:
Max-Wilhelm Bruker 2009-04-13 17:54:18 +02:00
parent 939ab62273
commit 3388804e8f
18 changed files with 158 additions and 80 deletions

View file

@ -12,5 +12,5 @@ QT += network
#QTPLUGIN += qjpeg
# Input
HEADERS += src/counter.h src/dlg_games.h src/dlg_creategame.h src/dlg_connect.h src/gamesmodel.h src/client.h src/window_main.h src/servergame.h src/servereventdata.h src/serverresponse.h src/pendingcommand.h src/zonelist.h src/counterlist.h src/cardzone.h src/player.h src/cardlist.h src/carditem.h src/tablezone.h src/handzone.h src/playerlist.h src/game.h src/carddatabase.h src/gameview.h src/decklistmodel.h src/dlg_startgame.h src/cardinfowidget.h src/messagelogwidget.h src/serverzonecard.h src/zoneviewzone.h src/zoneviewwidget.h src/libraryzone.h src/gravezone.h src/rfgzone.h src/sideboardzone.h src/carddragitem.h src/zoneviewlayout.h src/playerarea.h src/carddatabasemodel.h src/window_deckeditor.h
SOURCES += src/counter.cpp src/dlg_games.cpp src/dlg_creategame.cpp src/dlg_connect.cpp src/client.cpp src/main.cpp src/window_main.cpp src/servereventdata.cpp src/gamesmodel.cpp src/player.cpp src/cardzone.cpp src/zonelist.cpp src/counterlist.cpp src/cardlist.cpp src/carditem.cpp src/tablezone.cpp src/handzone.cpp src/playerlist.cpp src/game.cpp src/carddatabase.cpp src/gameview.cpp src/decklistmodel.cpp src/dlg_startgame.cpp src/cardinfowidget.cpp src/messagelogwidget.cpp src/zoneviewzone.cpp src/zoneviewwidget.cpp src/libraryzone.cpp src/gravezone.cpp src/rfgzone.cpp src/sideboardzone.cpp src/carddragitem.cpp src/zoneviewlayout.cpp src/playerarea.cpp src/carddatabasemodel.cpp src/window_deckeditor.cpp
HEADERS += src/counter.h src/dlg_games.h src/dlg_creategame.h src/dlg_connect.h src/gamesmodel.h src/client.h src/window_main.h src/servergame.h src/servereventdata.h src/serverresponse.h src/pendingcommand.h src/zonelist.h src/cardzone.h src/player.h src/cardlist.h src/carditem.h src/tablezone.h src/handzone.h src/playerlist.h src/game.h src/carddatabase.h src/gameview.h src/decklistmodel.h src/dlg_startgame.h src/cardinfowidget.h src/messagelogwidget.h src/serverzonecard.h src/zoneviewzone.h src/zoneviewwidget.h src/libraryzone.h src/gravezone.h src/rfgzone.h src/sideboardzone.h src/carddragitem.h src/zoneviewlayout.h src/playerarea.h src/carddatabasemodel.h src/window_deckeditor.h
SOURCES += src/counter.cpp src/dlg_games.cpp src/dlg_creategame.cpp src/dlg_connect.cpp src/client.cpp src/main.cpp src/window_main.cpp src/servereventdata.cpp src/gamesmodel.cpp src/player.cpp src/cardzone.cpp src/zonelist.cpp src/cardlist.cpp src/carditem.cpp src/tablezone.cpp src/handzone.cpp src/playerlist.cpp src/game.cpp src/carddatabase.cpp src/gameview.cpp src/decklistmodel.cpp src/dlg_startgame.cpp src/cardinfowidget.cpp src/messagelogwidget.cpp src/zoneviewzone.cpp src/zoneviewwidget.cpp src/libraryzone.cpp src/gravezone.cpp src/rfgzone.cpp src/sideboardzone.cpp src/carddragitem.cpp src/zoneviewlayout.cpp src/playerarea.cpp src/carddatabasemodel.cpp src/window_deckeditor.cpp

View file

@ -291,6 +291,11 @@ int Client::incCounter(const QString &counter, int delta)
return cmd(QString("inc_counter|%1|%2").arg(counter).arg(delta));
}
int Client::addCounter(const QString &counter, QColor color, int value)
{
return cmd(QString("add_counter|%1|%2|%3").arg(counter).arg(color.red() * 65536 + color.green() * 256 + color.blue()).arg(value));
}
int Client::setCounter(const QString &counter, int value)
{
return cmd(QString("set_counter|%1|%2").arg(counter).arg(value));

View file

@ -9,6 +9,7 @@
#include "serverzonecard.h"
#include "pendingcommand.h"
#include <QTcpSocket>
#include <QColor>
class QTimer;
@ -76,6 +77,7 @@ public:
int setCardAttr(const QString &zone, int cardid, const QString &aname, const QString &avalue);
int readyStart();
int incCounter(const QString &counter, int delta);
int addCounter(const QString &counter, QColor color, int value);
int setCounter(const QString &counter, int value);
int delCounter(const QString &counter);
int setActivePlayer(int player);

View file

@ -1,16 +1,16 @@
#include "counter.h"
#include "player.h"
#include "client.h"
#include <QtGui>
Counter::Counter(Player *_player, const QString &_name, QGraphicsItem *parent)
: QGraphicsItem(parent), name(_name), value(0), player(_player)
Counter::Counter(Player *_player, const QString &_name, QColor _color, int _value, QGraphicsItem *parent)
: QGraphicsItem(parent), name(_name), color(_color), value(_value), player(_player)
{
player->addCounter(this);
}
QRectF Counter::boundingRect() const
{
return QRectF(0, 0, 50, 30);
return QRectF(0, 0, 40, 40);
}
void Counter::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
@ -18,8 +18,12 @@ void Counter::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, Q
Q_UNUSED(option);
Q_UNUSED(widget);
painter->save();
painter->fillRect(boundingRect(), QBrush(QColor("gray")));
painter->drawText(boundingRect(), Qt::AlignCenter, QString("%1").arg(value));
painter->setBrush(QBrush(color));
painter->drawEllipse(boundingRect());
if (value) {
painter->setFont(QFont("Times", 16, QFont::Bold));
painter->drawText(boundingRect(), Qt::AlignCenter, QString("%1").arg(value));
}
painter->restore();
}
@ -28,3 +32,11 @@ void Counter::setValue(int _value)
value = _value;
update(boundingRect());
}
void Counter::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
if (event->button() == Qt::LeftButton)
player->client->incCounter(name, 1);
else if (event->button() == Qt::RightButton)
player->client->incCounter(name, -1);
}

View file

@ -8,11 +8,13 @@ class Player;
class Counter : public QGraphicsItem {
private:
QString name;
QColor color;
int value;
protected:
Player *player;
void mousePressEvent(QGraphicsSceneMouseEvent *event);
public:
Counter(Player *_player, const QString &_name, QGraphicsItem *parent = 0);
Counter(Player *_player, const QString &_name, QColor _color, int _value, QGraphicsItem *parent = 0);
QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);

View file

@ -1,11 +0,0 @@
#include "counterlist.h"
Counter *CounterList::findCounter(const QString &name) const
{
for (int i = 0; i < size(); i++) {
Counter *temp = at(i);
if (!temp->getName().compare(name))
return temp;
}
return 0;
}

View file

@ -1,12 +0,0 @@
#ifndef COUNTERLIST_H
#define COUNTERLIST_H
#include "counter.h"
#include <QList>
class CounterList : public QList<Counter *> {
public:
Counter *findCounter(const QString &name) const;
};
#endif

View file

@ -9,6 +9,8 @@
#include "handzone.h"
#include "carddatabase.h"
#include "dlg_startgame.h"
#include "playerarea.h"
#include "counter.h"
Game::Game(CardDatabase *_db, Client *_client, QGraphicsScene *_scene, QMenu *_actionsMenu, QMenu *_cardMenu, int playerId, const QString &playerName)
: QObject(), actionsMenu(_actionsMenu), cardMenu(_cardMenu), db(_db), client(_client), scene(_scene), started(false)
@ -209,6 +211,7 @@ void Game::gameEvent(ServerEventData *msg)
case eventCreateToken:
case eventSetupZones:
case eventSetCardAttr:
case eventAddCounter:
case eventSetCounter:
case eventDelCounter:
case eventPlayerId: {
@ -257,7 +260,7 @@ void Game::actDecLife()
void Game::actSetLife()
{
bool ok;
int life = QInputDialog::getInteger(0, tr("Set life"), tr("New life total:"), localPlayer->getCounters()->findCounter("life")->getValue(), 0, 2000000000, 1, &ok);
int life = QInputDialog::getInteger(0, tr("Set life"), tr("New life total:"), localPlayer->area->getCounter("life")->getValue(), 0, 2000000000, 1, &ok);
if (ok)
client->setCounter("life", life);
}

View file

@ -2,6 +2,7 @@
#include "client.h"
#include "cardzone.h"
#include "playerarea.h"
#include "counter.h"
#include <QGraphicsScene>
#include <QMenu>
@ -12,9 +13,6 @@ Player::Player(const QString &_name, int _id, QPointF _base, bool _local, CardDa
area->setPos(_base);
_scene->addItem(area);
Counter *life = new Counter(this, "life");
life->setPos(_base + QPointF(-50, 500));
aMoveHandToTopLibrary = new QAction(tr("Move to &top of library"), this);
connect(aMoveHandToTopLibrary, SIGNAL(triggered()), this, SLOT(actMoveHandToTopLibrary()));
aMoveHandToBottomLibrary = new QAction(tr("Move to &bottom of library"), this);
@ -70,9 +68,6 @@ Player::~Player()
for (int i = 0; i < zones.size(); i++)
delete zones.at(i);
for (int i = 0; i < counters.size(); i++)
delete counters.at(i);
delete area;
}
@ -123,11 +118,6 @@ void Player::addZone(CardZone *z)
zones << z;
}
void Player::addCounter(Counter *c)
{
counters << c;
}
void Player::setCardAttrHelper(CardItem *card, const QString &aname, const QString &avalue, bool allCards)
{
if (aname == "tapped") {
@ -159,17 +149,15 @@ void Player::gameEvent(ServerEventData *event)
switch (event->getEventType()) {
case eventSetupZones: {
// XXX Life counter
int life = data[0].toInt();
int deck_cards = data[1].toInt();
int sb_cards = data[2].toInt();
int deck_cards = data[0].toInt();
int sb_cards = data[1].toInt();
// XXX Fehlerbehandlung
// Clean up existing zones first
for (int i = 0; i < zones.size(); i++)
zones.at(i)->clearContents();
Counter *lifeCounter = counters.findCounter("life");
lifeCounter->setValue(life);
area->clearCounters();
CardZone *deck = zones.findZone("deck");
for (; deck_cards; deck_cards--)
@ -181,6 +169,17 @@ void Player::gameEvent(ServerEventData *event)
sb->addCard(new CardItem(db, QString(), -1));
sb->reorganizeCards();
if (local) {
client->addCounter("life", QColor("white"), 20);
client->addCounter("w", QColor(200, 200, 200), 0);
client->addCounter("u", QColor(0, 0, 200), 0);
client->addCounter("b", QColor(100, 100, 100), 0);
client->addCounter("r", QColor(200, 0, 0), 0);
client->addCounter("g", QColor(0, 200, 0), 0);
client->addCounter("x", QColor(255, 255, 255), 0);
client->addCounter("storm", QColor(255, 255, 255), 0);
}
break;
}
case eventDraw: {
@ -269,12 +268,25 @@ void Player::gameEvent(ServerEventData *event)
}
break;
}
case eventAddCounter: {
if (data.size() != 3) {
// XXX
}
QString counterName = data[0];
int colorValue = data[1].toInt();
int value = data[2].toInt();
QColor color(colorValue / 65536, (colorValue % 65536) / 256, colorValue % 256);
qDebug(QString("%1 / %2 / %3").arg(color.red()).arg(color.green()).arg(color.blue()).toLatin1());
area->addCounter(counterName, color, value);
break;
}
case eventSetCounter: {
if (data.size() != 2) {
// XXX
}
int value = data[1].toInt();
Counter *c = counters.findCounter(data[0]);
QString counterName = data[0];
Counter *c = area->getCounter(counterName);
int oldValue = c->getValue();
c->setValue(value);
emit logSetCounter(name, c->getName(), value, oldValue);

View file

@ -4,7 +4,6 @@
#include <QInputDialog>
#include <QPoint>
#include "zonelist.h"
#include "counterlist.h"
#include "servereventdata.h"
class Client;
@ -44,21 +43,18 @@ private:
QAction *aMoveHandToTopLibrary, *aMoveHandToBottomLibrary,
*aViewLibrary, *aViewTopCards, *aViewGraveyard, *aViewRfg, *aViewSideboard;
PlayerArea *area;
int defaultNumberTopCards;
QString name;
int id;
QPointF base;
bool local;
ZoneList zones;
CounterList counters;
CardDatabase *db;
void setCardAttrHelper(CardItem *card, const QString &aname, const QString &avalue, bool allCards);
public:
PlayerArea *area;
Client *client;
void addZone(CardZone *z);
void addCounter(Counter *c);
Player(const QString &_name, int _id, QPointF _base, bool _local, CardDatabase *_db, Client *_client, QGraphicsScene *_scene);
~Player();
QMenu *getPlayerMenu() const { return playerMenu; }
@ -66,7 +62,6 @@ public:
QString getName() const { return name; }
bool getLocal() const { return local; }
const ZoneList *const getZones() const { return &zones; }
const CounterList *const getCounters() const { return &counters; }
void gameEvent(ServerEventData *event);
void hoverCardEvent(CardItem *card);
CardDatabase *getDb() const { return db; }

View file

@ -6,12 +6,13 @@
#include "gravezone.h"
#include "rfgzone.h"
#include "sideboardzone.h"
#include "counter.h"
#include <QPainter>
PlayerArea::PlayerArea(Player *_player, QGraphicsItem *parent)
: QGraphicsItem(parent), player(_player)
{
QPointF base = QPointF(20, 50);
QPointF base = QPointF(55, 50);
LibraryZone *deck = new LibraryZone(_player, this);
deck->setPos(base);
@ -27,7 +28,7 @@ PlayerArea::PlayerArea(Player *_player, QGraphicsItem *parent)
SideboardZone *sb = new SideboardZone(_player, this);
sb->setVisible(false);
base = QPointF(deck->boundingRect().width() + 40, 0);
base = QPointF(deck->boundingRect().width() + 60, 0);
CardZone *hand = new HandZone(_player, this);
hand->setPos(base);
@ -42,7 +43,7 @@ PlayerArea::PlayerArea(Player *_player, QGraphicsItem *parent)
PlayerArea::~PlayerArea()
{
clearCounters();
}
QRectF PlayerArea::boundingRect() const
@ -58,7 +59,51 @@ void PlayerArea::paint(QPainter *painter, const QStyleOptionGraphicsItem *option
painter->setFont(QFont("Times", 16, QFont::Bold));
painter->setPen(QPen(QColor("black")));
painter->drawText(QRectF(0, 0, CARD_WIDTH + 40, 40), Qt::AlignCenter, player->getName());
painter->drawText(QRectF(0, 0, CARD_WIDTH + 60, 40), Qt::AlignCenter, player->getName());
painter->restore();
}
Counter *PlayerArea::getCounter(const QString &name, bool remove)
{
for (int i = 0; i < counterList.size(); i++) {
Counter *temp = counterList.at(i);
if (temp->getName() == name) {
if (remove)
counterList.removeAt(i);
return temp;
}
}
return 0;
}
void PlayerArea::addCounter(const QString &name, QColor color, int value)
{
counterList.append(new Counter(player, name, color, value, this));
rearrangeCounters();
}
void PlayerArea::delCounter(const QString &name)
{
delete getCounter(name, true);
rearrangeCounters();
}
void PlayerArea::clearCounters()
{
for (int i = 0; i < counterList.size(); i++)
delete counterList.at(i);
counterList.clear();
}
void PlayerArea::rearrangeCounters()
{
const int counterAreaWidth = 55;
int y = 50;
for (int i = 0; i < counterList.size(); i++) {
Counter *temp = counterList.at(i);
QRectF br = temp->boundingRect();
temp->setPos((counterAreaWidth - br.width()) / 2, y);
y += br.height() + 10;
}
}

View file

@ -1,14 +1,19 @@
#ifndef PLAYERAREA_H
#define PLAYERAREA_H
#include <QList>
#include "carditem.h"
class Player;
class Counter;
class PlayerArea : public QGraphicsItem {
private:
QRectF bRect;
Player *player;
QList<Counter *> counterList;
void rearrangeCounters();
public:
enum { Type = typeOther };
int type() const { return Type; }
@ -16,6 +21,11 @@ public:
~PlayerArea();
QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
Counter *getCounter(const QString &name, bool remove = false);
void addCounter(const QString &name, QColor color, int value);
void delCounter(const QString &name);
void clearCounters();
};
#endif

View file

@ -3,7 +3,7 @@
// Message structure for server events:
// {"private","public"}|PlayerId|PlayerName|EventType|EventData
const int event_count = 19;
const int event_count = 20;
const event_string event_strings[event_count] = {
{eventPlayerId, "player_id"},
{eventSay, "say"},
@ -19,6 +19,7 @@ const event_string event_strings[event_count] = {
{eventMoveCard, "move_card"},
{eventCreateToken, "create_token"},
{eventSetCardAttr, "set_card_attr"},
{eventAddCounter, "add_counter"},
{eventSetCounter, "set_counter"},
{eventDelCounter, "del_counter"},
{eventSetActivePlayer, "set_active_player"},

View file

@ -20,6 +20,7 @@ enum ServerEventType {
eventMoveCard,
eventCreateToken,
eventSetCardAttr,
eventAddCounter,
eventSetCounter,
eventDelCounter,
eventSetActivePlayer,

View file

@ -121,8 +121,8 @@ void MainWindow::updateSceneSize()
{
QRectF sr = scene->sceneRect();
QSizeF zoneSize = zoneLayout->size();
qDebug(QString("updateSceneSize: width=%1").arg(932 + zoneSize.width()).toLatin1());
scene->setSceneRect(sr.x(), sr.y(), 932 + zoneSize.width(), sr.height());
qDebug(QString("updateSceneSize: width=%1").arg(952 + zoneSize.width()).toLatin1());
scene->setSceneRect(sr.x(), sr.y(), 952 + zoneSize.width(), sr.height());
view->scaleToScene();
}
@ -218,13 +218,13 @@ MainWindow::MainWindow(QWidget *parent)
int cardCount = db->loadFromFile("../cards.dat");
qDebug(QString("%1 cards loaded").arg(cardCount).toLatin1());
scene = new QGraphicsScene(0, 0, 932, 1020, this);
scene = new QGraphicsScene(0, 0, 952, 1020, this);
view = new GameView(scene);
// view->setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));
zoneLayout = new ZoneViewLayout(db);
zoneLayout->setPos(932, 0);
zoneLayout->setPos(952, 0);
scene->addItem(zoneLayout);
connect(zoneLayout, SIGNAL(sizeChanged()), this, SLOT(updateSceneSize()));

View file

@ -25,9 +25,10 @@
class Counter {
protected:
QString name;
int color;
int count;
public:
Counter(QString _name, int _count = 0) : name(_name), count(_count) { }
Counter(QString _name, int _color, int _count = 0) : name(_name), color(_color), count(_count) { }
~Counter() { }
int getCount() { return count; }
void setCount(int _count) { count = _count; }

View file

@ -98,10 +98,6 @@ void ServerSocket::setupZones()
zones << new PlayerZone("grave", false, true, false, true);
zones << new PlayerZone("rfg", false, true, false, true);
// Create life counter
Counter *life = new Counter("life", 20);
counters << life;
// ------------------------------------------------------------------
// Assign card ids and create deck from decklist
@ -118,9 +114,8 @@ void ServerSocket::setupZones()
nextCardId = i;
PlayerStatus = StatusPlaying;
broadcastEvent(QString("setup_zones|%1|%2|%3").arg(getCounter("life")->getCount())
.arg(deck->cards.size())
.arg(getZone("sb")->cards.size()), this);
broadcastEvent(QString("setup_zones|%1|%2").arg(deck->cards.size())
.arg(sb->cards.size()), this);
}
void ServerSocket::clearZones()
@ -220,6 +215,9 @@ const ServerSocket::CommandProperties ServerSocket::commandList[ServerSocket::nu
<< QVariant::String, &ServerSocket::cmdSetCardAttr},
{"inc_counter", true, true, true, QList<QVariant::Type>() << QVariant::String
<< QVariant::Int, &ServerSocket::cmdIncCounter},
{"add_counter", true, true, true, QList<QVariant::Type>() << QVariant::String
<< QVariant::Int
<< QVariant::Int, &ServerSocket::cmdAddCounter},
{"set_counter", true, true, true, QList<QVariant::Type>() << QVariant::String
<< QVariant::Int, &ServerSocket::cmdSetCounter},
{"del_counter", true, true, true, QList<QVariant::Type>() << QVariant::String, &ServerSocket::cmdDelCounter},
@ -474,16 +472,29 @@ ReturnMessage::ReturnCode ServerSocket::cmdIncCounter(const QList<QVariant> &par
return ReturnMessage::ReturnOk;
}
ReturnMessage::ReturnCode ServerSocket::cmdAddCounter(const QList<QVariant> &params)
{
QString name = params[0].toString();
if (getCounter(name))
return ReturnMessage::ReturnContextError;
int color = params[1].toInt();
int count = params[2].toInt();
Counter *c = new Counter(name, color, count);
counters << c;
emit broadcastEvent(QString("add_counter|%1|%2|%3").arg(c->getName()).arg(color).arg(count), this);
return ReturnMessage::ReturnOk;
}
ReturnMessage::ReturnCode ServerSocket::cmdSetCounter(const QList<QVariant> &params)
{
Counter *c = getCounter(params[0].toString());
if (!c)
return ReturnMessage::ReturnContextError;
int count = params[1].toInt();
if (!c) {
c = new Counter(params[0].toString(), count);
counters << c;
} else
c->setCount(count);
c->setCount(count);
emit broadcastEvent(QString("set_counter|%1|%2").arg(c->getName()).arg(count), this);
return ReturnMessage::ReturnOk;
}

View file

@ -55,7 +55,7 @@ private:
QList<QVariant::Type> paramTypes;
CommandHandler handler;
};
static const int numberCommands = 23;
static const int numberCommands = 24;
static const CommandProperties commandList[numberCommands];
ReturnMessage::ReturnCode cmdLogin(const QList<QVariant> &params);
@ -73,6 +73,7 @@ private:
ReturnMessage::ReturnCode cmdCreateToken(const QList<QVariant> &params);
ReturnMessage::ReturnCode cmdSetCardAttr(const QList<QVariant> &params);
ReturnMessage::ReturnCode cmdIncCounter(const QList<QVariant> &params);
ReturnMessage::ReturnCode cmdAddCounter(const QList<QVariant> &params);
ReturnMessage::ReturnCode cmdSetCounter(const QList<QVariant> &params);
ReturnMessage::ReturnCode cmdDelCounter(const QList<QVariant> &params);
ReturnMessage::ReturnCode cmdListCounters(const QList<QVariant> &params);