You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1027 lines
25 KiB
1027 lines
25 KiB
15 years ago
|
#ifndef GAME_H
|
||
|
#define GAME_H
|
||
|
|
||
|
#include <kdebug.h>
|
||
|
#include <klocale.h>
|
||
|
#include <kpixmap.h>
|
||
|
#include <arts/kplayobject.h>
|
||
|
#include <arts/kartsserver.h>
|
||
|
#include <arts/kartsdispatcher.h>
|
||
|
|
||
|
#include <math.h>
|
||
|
|
||
|
#include <qcanvas.h>
|
||
|
#include <qpainter.h>
|
||
|
#include <qcolor.h>
|
||
|
#include <qframe.h>
|
||
|
#include <qlayout.h>
|
||
|
#include <qmap.h>
|
||
|
#include <qpen.h>
|
||
|
#include <qpoint.h>
|
||
|
#include <qpointarray.h>
|
||
|
#include <qrect.h>
|
||
|
#include <qstringlist.h>
|
||
|
#include <qvaluelist.h>
|
||
|
|
||
|
#include "object.h"
|
||
|
#include "config.h"
|
||
|
#include "canvasitem.h"
|
||
|
#include "ball.h"
|
||
|
#include "statedb.h"
|
||
|
#include "rtti.h"
|
||
|
#include <kdemacros.h>
|
||
|
|
||
|
class QLabel;
|
||
|
class QSlider;
|
||
|
class QCheckBox;
|
||
|
class QTimer;
|
||
|
class QKeyEvent;
|
||
|
class QMouseEvent;
|
||
|
class QPainter;
|
||
|
class KConfig;
|
||
|
class KPrinter;
|
||
|
class KolfGame;
|
||
|
|
||
|
enum Direction { D_Left, D_Right, Forwards, Backwards };
|
||
|
enum Amount { Amount_Less, Amount_Normal, Amount_More };
|
||
|
enum HoleResult { Result_Holed, Result_Miss, Result_LipOut };
|
||
|
|
||
|
class Player;
|
||
|
|
||
|
class BallStateInfo
|
||
|
{
|
||
|
public:
|
||
|
void saveState(KConfig *cfg);
|
||
|
void loadState(KConfig *cfg);
|
||
|
|
||
|
int id;
|
||
|
QPoint spot;
|
||
|
BallState state;
|
||
|
bool beginningOfHole;
|
||
|
int score;
|
||
|
};
|
||
|
class BallStateList : public QValueList<BallStateInfo>
|
||
|
{
|
||
|
public:
|
||
|
int hole;
|
||
|
int player;
|
||
|
bool canUndo;
|
||
|
Vector vector;
|
||
|
};
|
||
|
|
||
|
class Player
|
||
|
{
|
||
|
public:
|
||
|
Player() : m_ball(new Ball(0)) {};
|
||
|
Ball *ball() const { return m_ball; }
|
||
|
void setBall(Ball *ball) { m_ball = ball; }
|
||
|
BallStateInfo stateInfo(int hole) const { BallStateInfo ret; ret.spot = QPoint(m_ball->x(), m_ball->y()); ret.state = m_ball->curState(); ret.score = score(hole); ret.beginningOfHole = m_ball->beginningOfHole(); ret.id = m_id; return ret; }
|
||
|
|
||
|
QValueList<int> scores() const { return m_scores; }
|
||
|
void setScores(const QValueList<int> &newScores) { m_scores = newScores; }
|
||
|
int score(int hole) const { return (*m_scores.at(hole - 1)); }
|
||
|
int lastScore() const { return m_scores.last(); }
|
||
|
int firstScore() const { return m_scores.first(); }
|
||
|
|
||
|
void addStrokeToHole(int hole) { (*m_scores.at(hole - 1))++; }
|
||
|
void setScoreForHole(int score, int hole) { (*m_scores.at(hole - 1)) = score; }
|
||
|
void subtractStrokeFromHole(int hole) { (*m_scores.at(hole - 1))--; }
|
||
|
void resetScore(int hole) { (*m_scores.at(hole - 1)) = 0; }
|
||
|
void addHole() { m_scores.append(0); }
|
||
|
unsigned int numHoles() const { return m_scores.count(); }
|
||
|
|
||
|
QString name() const { return m_name; }
|
||
|
void setName(const QString &name) { m_name = name; m_ball->setName(name); }
|
||
|
|
||
|
void setId(int id) { m_id = id; }
|
||
|
int id() const { return m_id; }
|
||
|
|
||
|
private:
|
||
|
Ball *m_ball;
|
||
|
QValueList<int> m_scores;
|
||
|
QString m_name;
|
||
|
int m_id;
|
||
|
};
|
||
|
typedef QValueList<Player> PlayerList;
|
||
|
|
||
|
class Arrow : public QCanvasLine
|
||
|
{
|
||
|
public:
|
||
|
Arrow(QCanvas *canvas);
|
||
|
void setAngle(double newAngle) { m_angle = newAngle; }
|
||
|
double angle() const { return m_angle; }
|
||
|
void setLength(double newLength) { m_length = newLength; }
|
||
|
double length() const { return m_length; }
|
||
|
void setReversed(bool yes) { m_reversed = yes; }
|
||
|
bool reversed() const { return m_reversed; }
|
||
|
virtual void setVisible(bool);
|
||
|
virtual void setPen(QPen p);
|
||
|
void aboutToDie();
|
||
|
virtual void moveBy(double, double);
|
||
|
void updateSelf();
|
||
|
virtual void setZ(double newz);
|
||
|
|
||
|
private:
|
||
|
double m_angle;
|
||
|
double m_length;
|
||
|
bool m_reversed;
|
||
|
QCanvasLine *line1;
|
||
|
QCanvasLine *line2;
|
||
|
};
|
||
|
|
||
|
class RectPoint;
|
||
|
class RectItem
|
||
|
{
|
||
|
public:
|
||
|
virtual void newSize(int /*width*/, int /*height*/) {};
|
||
|
};
|
||
|
|
||
|
class RectPoint : public QCanvasEllipse, public CanvasItem
|
||
|
{
|
||
|
public:
|
||
|
RectPoint(QColor color, RectItem *, QCanvas *canvas);
|
||
|
void dontMove() { dontmove = true; }
|
||
|
virtual void moveBy(double dx, double dy);
|
||
|
virtual Config *config(QWidget *parent);
|
||
|
virtual bool deleteable() const { return false; }
|
||
|
virtual bool cornerResize() const { return true; }
|
||
|
virtual CanvasItem *itemToDelete() { return dynamic_cast<CanvasItem *>(rect); }
|
||
|
void setSizeFactor(double newFactor) { m_sizeFactor = newFactor; }
|
||
|
|
||
|
protected:
|
||
|
RectItem *rect;
|
||
|
double m_sizeFactor;
|
||
|
|
||
|
private:
|
||
|
bool dontmove;
|
||
|
};
|
||
|
|
||
|
class Ellipse : public QCanvasEllipse, public CanvasItem, public RectItem
|
||
|
{
|
||
|
public:
|
||
|
Ellipse(QCanvas *canvas);
|
||
|
virtual void advance(int phase);
|
||
|
|
||
|
int changeEvery() const { return m_changeEvery; }
|
||
|
void setChangeEvery(int news) { m_changeEvery = news; }
|
||
|
bool changeEnabled() const { return m_changeEnabled; }
|
||
|
void setChangeEnabled(bool news);
|
||
|
|
||
|
virtual void aboutToDie();
|
||
|
virtual void aboutToSave();
|
||
|
virtual void savingDone();
|
||
|
|
||
|
virtual QPtrList<QCanvasItem> moveableItems() const;
|
||
|
|
||
|
virtual void newSize(int width, int height);
|
||
|
virtual void moveBy(double dx, double dy);
|
||
|
|
||
|
virtual void editModeChanged(bool changed);
|
||
|
|
||
|
virtual void save(KConfig *cfg);
|
||
|
virtual void load(KConfig *cfg);
|
||
|
|
||
|
virtual Config *config(QWidget *parent);
|
||
|
|
||
|
protected:
|
||
|
RectPoint *point;
|
||
|
int m_changeEvery;
|
||
|
bool m_changeEnabled;
|
||
|
|
||
|
private:
|
||
|
int count;
|
||
|
bool dontHide;
|
||
|
};
|
||
|
class EllipseConfig : public Config
|
||
|
{
|
||
|
Q_OBJECT
|
||
|
|
||
|
public:
|
||
|
EllipseConfig(Ellipse *ellipse, QWidget *);
|
||
|
|
||
|
private slots:
|
||
|
void value1Changed(int news);
|
||
|
void value2Changed(int news);
|
||
|
void check1Changed(bool on);
|
||
|
void check2Changed(bool on);
|
||
|
|
||
|
protected:
|
||
|
QVBoxLayout *m_vlayout;
|
||
|
|
||
|
private:
|
||
|
QLabel *slow1;
|
||
|
QLabel *fast1;
|
||
|
QLabel *slow2;
|
||
|
QLabel *fast2;
|
||
|
QSlider *slider1;
|
||
|
QSlider *slider2;
|
||
|
Ellipse *ellipse;
|
||
|
};
|
||
|
|
||
|
class Puddle : public Ellipse
|
||
|
{
|
||
|
public:
|
||
|
Puddle(QCanvas *canvas);
|
||
|
virtual bool collision(Ball *ball, long int id);
|
||
|
virtual int rtti() const { return Rtti_DontPlaceOn; }
|
||
|
};
|
||
|
class PuddleObj : public Object
|
||
|
{
|
||
|
public:
|
||
|
PuddleObj() { m_name = i18n("Puddle"); m__name = "puddle"; }
|
||
|
virtual QCanvasItem *newObject(QCanvas *canvas) { return new Puddle(canvas); }
|
||
|
};
|
||
|
|
||
|
class Sand : public Ellipse
|
||
|
{
|
||
|
public:
|
||
|
Sand(QCanvas *canvas);
|
||
|
virtual bool collision(Ball *ball, long int id);
|
||
|
};
|
||
|
class SandObj : public Object
|
||
|
{
|
||
|
public:
|
||
|
SandObj() { m_name = i18n("Sand"); m__name = "sand"; }
|
||
|
virtual QCanvasItem *newObject(QCanvas *canvas) { return new Sand(canvas); }
|
||
|
};
|
||
|
|
||
|
class Inside : public QCanvasEllipse, public CanvasItem
|
||
|
{
|
||
|
public:
|
||
|
Inside(CanvasItem *item, QCanvas *canvas) : QCanvasEllipse(canvas) { this->item = item; }
|
||
|
virtual bool collision(Ball *ball, long int id) { return item->collision(ball, id); }
|
||
|
|
||
|
protected:
|
||
|
CanvasItem *item;
|
||
|
};
|
||
|
|
||
|
class Bumper : public QCanvasEllipse, public CanvasItem
|
||
|
{
|
||
|
public:
|
||
|
Bumper(QCanvas *canvas);
|
||
|
|
||
|
virtual void advance(int phase);
|
||
|
virtual void aboutToDie();
|
||
|
virtual void moveBy(double dx, double dy);
|
||
|
virtual void editModeChanged(bool changed);
|
||
|
|
||
|
virtual bool collision(Ball *ball, long int id);
|
||
|
|
||
|
protected:
|
||
|
QColor firstColor;
|
||
|
QColor secondColor;
|
||
|
Inside *inside;
|
||
|
|
||
|
private:
|
||
|
int count;
|
||
|
};
|
||
|
class BumperObj : public Object
|
||
|
{
|
||
|
public:
|
||
|
BumperObj() { m_name = i18n("Bumper"); m__name = "bumper"; }
|
||
|
virtual QCanvasItem *newObject(QCanvas *canvas) { return new Bumper(canvas); }
|
||
|
};
|
||
|
|
||
|
class Hole : public QCanvasEllipse, public CanvasItem
|
||
|
{
|
||
|
public:
|
||
|
Hole(QColor color, QCanvas *canvas);
|
||
|
virtual bool place(Ball * /*ball*/, bool /*wasCenter*/) { return true; };
|
||
|
|
||
|
virtual bool collision(Ball *ball, long int id);
|
||
|
|
||
|
protected:
|
||
|
virtual HoleResult result(const QPoint, double, bool *wasCenter);
|
||
|
};
|
||
|
|
||
|
class Cup : public Hole
|
||
|
{
|
||
|
public:
|
||
|
Cup(QCanvas *canvas);
|
||
|
virtual bool place(Ball *ball, bool wasCenter);
|
||
|
virtual void save(KConfig *cfg);
|
||
|
virtual bool canBeMovedByOthers() const { return true; }
|
||
|
virtual void draw(QPainter &painter);
|
||
|
|
||
|
protected:
|
||
|
QPixmap pixmap;
|
||
|
};
|
||
|
class CupObj : public Object
|
||
|
{
|
||
|
public:
|
||
|
CupObj() { m_name = i18n("Cup"); m__name = "cup"; m_addOnNewHole = true; }
|
||
|
virtual QCanvasItem *newObject(QCanvas *canvas) { return new Cup(canvas); }
|
||
|
};
|
||
|
|
||
|
class BlackHole;
|
||
|
class BlackHoleConfig : public Config
|
||
|
{
|
||
|
Q_OBJECT
|
||
|
|
||
|
public:
|
||
|
BlackHoleConfig(BlackHole *blackHole, QWidget *parent);
|
||
|
|
||
|
private slots:
|
||
|
void degChanged(int);
|
||
|
void minChanged(double);
|
||
|
void maxChanged(double);
|
||
|
|
||
|
private:
|
||
|
BlackHole *blackHole;
|
||
|
};
|
||
|
class BlackHoleExit : public QCanvasLine, public CanvasItem
|
||
|
{
|
||
|
public:
|
||
|
BlackHoleExit(BlackHole *blackHole, QCanvas *canvas);
|
||
|
virtual int rtti() const { return Rtti_NoCollision; }
|
||
|
virtual void aboutToDie();
|
||
|
virtual void moveBy(double dx, double dy);
|
||
|
virtual bool deleteable() const { return false; }
|
||
|
virtual bool canBeMovedByOthers() const { return true; }
|
||
|
virtual void editModeChanged(bool editing);
|
||
|
virtual void setPen(QPen p);
|
||
|
virtual void showInfo();
|
||
|
virtual void hideInfo();
|
||
|
void updateArrowAngle();
|
||
|
void updateArrowLength();
|
||
|
virtual Config *config(QWidget *parent);
|
||
|
BlackHole *blackHole;
|
||
|
|
||
|
protected:
|
||
|
Arrow *arrow;
|
||
|
};
|
||
|
class BlackHoleTimer : public QObject
|
||
|
{
|
||
|
Q_OBJECT
|
||
|
|
||
|
public:
|
||
|
BlackHoleTimer(Ball *ball, double speed, int msec);
|
||
|
|
||
|
signals:
|
||
|
void eject(Ball *ball, double speed);
|
||
|
void halfway();
|
||
|
|
||
|
protected slots:
|
||
|
void mySlot();
|
||
|
void myMidSlot();
|
||
|
|
||
|
protected:
|
||
|
double m_speed;
|
||
|
Ball *m_ball;
|
||
|
};
|
||
|
class BlackHole : public QObject, public Hole
|
||
|
{
|
||
|
Q_OBJECT
|
||
|
|
||
|
public:
|
||
|
BlackHole(QCanvas *canvas);
|
||
|
virtual bool canBeMovedByOthers() const { return true; }
|
||
|
virtual void aboutToDie();
|
||
|
virtual void showInfo();
|
||
|
virtual void hideInfo();
|
||
|
virtual bool place(Ball *ball, bool wasCenter);
|
||
|
virtual void save(KConfig *cfg);
|
||
|
virtual void load(KConfig *cfg);
|
||
|
virtual Config *config(QWidget *parent) { return new BlackHoleConfig(this, parent); }
|
||
|
virtual QPtrList<QCanvasItem> moveableItems() const;
|
||
|
double minSpeed() const { return m_minSpeed; }
|
||
|
double maxSpeed() const { return m_maxSpeed; }
|
||
|
void setMinSpeed(double news) { m_minSpeed = news; exitItem->updateArrowLength(); }
|
||
|
void setMaxSpeed(double news) { m_maxSpeed = news; exitItem->updateArrowLength(); }
|
||
|
|
||
|
int curExitDeg() const { return exitDeg; }
|
||
|
void setExitDeg(int newdeg);
|
||
|
|
||
|
virtual void editModeChanged(bool editing) { exitItem->editModeChanged(editing); }
|
||
|
void updateInfo();
|
||
|
|
||
|
virtual void shotStarted() { runs = 0; };
|
||
|
|
||
|
virtual void moveBy(double dx, double dy);
|
||
|
|
||
|
public slots:
|
||
|
void eject(Ball *ball, double speed);
|
||
|
void halfway();
|
||
|
|
||
|
protected:
|
||
|
int exitDeg;
|
||
|
BlackHoleExit *exitItem;
|
||
|
double m_minSpeed;
|
||
|
double m_maxSpeed;
|
||
|
|
||
|
private:
|
||
|
int runs;
|
||
|
QCanvasLine *infoLine;
|
||
|
QCanvasEllipse *outside;
|
||
|
void finishMe();
|
||
|
};
|
||
|
class BlackHoleObj : public Object
|
||
|
{
|
||
|
public:
|
||
|
BlackHoleObj() { m_name = i18n("Black Hole"); m__name = "blackhole"; }
|
||
|
virtual QCanvasItem *newObject(QCanvas *canvas) { return new BlackHole(canvas); }
|
||
|
};
|
||
|
|
||
|
class WallPoint;
|
||
|
class Wall : public QCanvasLine, public CanvasItem
|
||
|
{
|
||
|
public:
|
||
|
Wall(QCanvas *canvas);
|
||
|
virtual void aboutToDie();
|
||
|
double dampening;
|
||
|
|
||
|
void setAlwaysShow(bool yes);
|
||
|
virtual void setZ(double newz);
|
||
|
virtual void setPen(QPen p);
|
||
|
virtual bool collision(Ball *ball, long int id);
|
||
|
virtual void save(KConfig *cfg);
|
||
|
virtual void load(KConfig *cfg);
|
||
|
virtual void selectedItem(QCanvasItem *item);
|
||
|
virtual void editModeChanged(bool changed);
|
||
|
virtual void moveBy(double dx, double dy);
|
||
|
virtual void setVelocity(double vx, double vy);
|
||
|
virtual void clean();
|
||
|
|
||
|
// must reimp because we gotta move the end items,
|
||
|
// and we do that in moveBy()
|
||
|
virtual void setPoints(int xa, int ya, int xb, int yb) { QCanvasLine::setPoints(xa, ya, xb, yb); moveBy(0, 0); }
|
||
|
|
||
|
virtual int rtti() const { return Rtti_Wall; }
|
||
|
virtual QPtrList<QCanvasItem> moveableItems() const;
|
||
|
virtual void setGame(KolfGame *game);
|
||
|
virtual void setVisible(bool);
|
||
|
|
||
|
virtual QPointArray areaPoints() const;
|
||
|
|
||
|
protected:
|
||
|
WallPoint *startItem;
|
||
|
WallPoint *endItem;
|
||
|
bool editing;
|
||
|
|
||
|
private:
|
||
|
long int lastId;
|
||
|
|
||
|
friend class WallPoint;
|
||
|
};
|
||
|
class WallPoint : public QCanvasEllipse, public CanvasItem
|
||
|
{
|
||
|
public:
|
||
|
WallPoint(bool start, Wall *wall, QCanvas *canvas);
|
||
|
void setAlwaysShow(bool yes) { alwaysShow = yes; updateVisible(); }
|
||
|
virtual void editModeChanged(bool changed);
|
||
|
virtual void moveBy(double dx, double dy);
|
||
|
virtual int rtti() const { return Rtti_WallPoint; }
|
||
|
virtual bool deleteable() const { return false; }
|
||
|
virtual bool collision(Ball *ball, long int id);
|
||
|
virtual CanvasItem *itemToDelete() { return wall; }
|
||
|
virtual void clean();
|
||
|
virtual Config *config(QWidget *parent) { return wall->config(parent); }
|
||
|
void dontMove() { dontmove = true; };
|
||
|
void updateVisible();
|
||
|
|
||
|
Wall *parentWall() { return wall; }
|
||
|
|
||
|
protected:
|
||
|
Wall *wall;
|
||
|
bool editing;
|
||
|
bool visible;
|
||
|
|
||
|
private:
|
||
|
bool alwaysShow;
|
||
|
bool start;
|
||
|
bool dontmove;
|
||
|
long int lastId;
|
||
|
|
||
|
friend class Wall;
|
||
|
};
|
||
|
class WallObj : public Object
|
||
|
{
|
||
|
public:
|
||
|
WallObj() { m_name = i18n("Wall"); m__name = "wall"; }
|
||
|
virtual QCanvasItem *newObject(QCanvas *canvas) { return new Wall(canvas); }
|
||
|
};
|
||
|
|
||
|
class Putter : public QCanvasLine, public CanvasItem
|
||
|
{
|
||
|
public:
|
||
|
Putter(QCanvas *canvas);
|
||
|
void go(Direction, Amount amount = Amount_Normal);
|
||
|
void setOrigin(int x, int y);
|
||
|
int curLen() const { return len; }
|
||
|
double curAngle() const { return angle; }
|
||
|
int curDeg() const { return rad2deg(angle); }
|
||
|
virtual void showInfo();
|
||
|
virtual void hideInfo();
|
||
|
void setAngle(double news) { angle = news; finishMe(); }
|
||
|
void setDeg(int news) { angle = deg2rad(news); finishMe(); }
|
||
|
double curMaxAngle() const { return maxAngle; }
|
||
|
virtual int rtti() const { return Rtti_Putter; }
|
||
|
virtual void setVisible(bool yes);
|
||
|
void saveAngle(Ball *ball) { angleMap[ball] = angle; }
|
||
|
void setAngle(Ball *ball);
|
||
|
void resetAngles() { angleMap.clear(); setZ(999999); }
|
||
|
virtual bool canBeMovedByOthers() const { return true; }
|
||
|
virtual void moveBy(double dx, double dy);
|
||
|
void setShowGuideLine(bool yes);
|
||
|
|
||
|
private:
|
||
|
QPoint midPoint;
|
||
|
double maxAngle;
|
||
|
double angle;
|
||
|
double oneDegree;
|
||
|
QMap<Ball *, double> angleMap;
|
||
|
int len;
|
||
|
void finishMe();
|
||
|
int putterWidth;
|
||
|
QCanvasLine *guideLine;
|
||
|
bool m_showGuideLine;
|
||
|
};
|
||
|
|
||
|
class Bridge;
|
||
|
class BridgeConfig : public Config
|
||
|
{
|
||
|
Q_OBJECT
|
||
|
|
||
|
public:
|
||
|
BridgeConfig(Bridge *bridge, QWidget *);
|
||
|
|
||
|
protected slots:
|
||
|
void topWallChanged(bool);
|
||
|
void botWallChanged(bool);
|
||
|
void leftWallChanged(bool);
|
||
|
void rightWallChanged(bool);
|
||
|
|
||
|
protected:
|
||
|
QVBoxLayout *m_vlayout;
|
||
|
QCheckBox *top;
|
||
|
QCheckBox *bot;
|
||
|
QCheckBox *left;
|
||
|
QCheckBox *right;
|
||
|
|
||
|
private:
|
||
|
Bridge *bridge;
|
||
|
};
|
||
|
class Bridge : public QCanvasRectangle, public CanvasItem, public RectItem
|
||
|
{
|
||
|
public:
|
||
|
Bridge(QRect rect, QCanvas *canvas);
|
||
|
virtual bool collision(Ball *ball, long int id);
|
||
|
virtual void aboutToDie();
|
||
|
virtual void editModeChanged(bool changed);
|
||
|
virtual void moveBy(double dx, double dy);
|
||
|
virtual void load(KConfig *cfg);
|
||
|
virtual void save(KConfig *cfg);
|
||
|
virtual bool vStrut() const { return true; }
|
||
|
void doLoad(KConfig *cfg);
|
||
|
void doSave(KConfig *cfg);
|
||
|
virtual void newSize(int width, int height);
|
||
|
virtual void setGame(KolfGame *game);
|
||
|
virtual Config *config(QWidget *parent) { return new BridgeConfig(this, parent); }
|
||
|
void setSize(int width, int height);
|
||
|
virtual QPtrList<QCanvasItem> moveableItems() const;
|
||
|
|
||
|
void setWallColor(QColor color);
|
||
|
QPen wallPen() const { return topWall->pen(); }
|
||
|
|
||
|
double wallZ() const { return topWall->z(); }
|
||
|
void setWallZ(double);
|
||
|
|
||
|
void setTopWallVisible(bool yes) { topWall->setVisible(yes); }
|
||
|
void setBotWallVisible(bool yes) { botWall->setVisible(yes); }
|
||
|
void setLeftWallVisible(bool yes) { leftWall->setVisible(yes); }
|
||
|
void setRightWallVisible(bool yes) { rightWall->setVisible(yes); }
|
||
|
bool topWallVisible() const { return topWall->isVisible(); }
|
||
|
bool botWallVisible() const { return botWall->isVisible(); }
|
||
|
bool leftWallVisible() const { return leftWall->isVisible(); }
|
||
|
bool rightWallVisible() const { return rightWall->isVisible(); }
|
||
|
|
||
|
protected:
|
||
|
Wall *topWall;
|
||
|
Wall *botWall;
|
||
|
Wall *leftWall;
|
||
|
Wall *rightWall;
|
||
|
RectPoint *point;
|
||
|
};
|
||
|
class BridgeObj : public Object
|
||
|
{
|
||
|
public:
|
||
|
BridgeObj() { m_name = i18n("Bridge"); m__name = "bridge"; }
|
||
|
virtual QCanvasItem *newObject(QCanvas *canvas) { return new Bridge(QRect(0, 0, 80, 40), canvas); }
|
||
|
};
|
||
|
|
||
|
class Sign;
|
||
|
class SignConfig : public BridgeConfig
|
||
|
{
|
||
|
Q_OBJECT
|
||
|
|
||
|
public:
|
||
|
SignConfig(Sign *sign, QWidget *parent);
|
||
|
|
||
|
private slots:
|
||
|
void textChanged(const QString &);
|
||
|
|
||
|
private:
|
||
|
Sign *sign;
|
||
|
};
|
||
|
class Sign : public Bridge
|
||
|
{
|
||
|
public:
|
||
|
Sign(QCanvas *canvas);
|
||
|
void setText(const QString &text);
|
||
|
QString text() const { return m_text; }
|
||
|
virtual void draw(QPainter &painter);
|
||
|
virtual bool vStrut() const { return false; }
|
||
|
virtual Config *config(QWidget *parent) { return new SignConfig(this, parent); }
|
||
|
virtual void save(KConfig *cfg);
|
||
|
virtual void load(KConfig *cfg);
|
||
|
|
||
|
protected:
|
||
|
QString m_text;
|
||
|
QString m_untranslatedText;
|
||
|
};
|
||
|
class SignObj : public Object
|
||
|
{
|
||
|
public:
|
||
|
SignObj() { m_name = i18n("Sign"); m__name = "sign"; }
|
||
|
virtual QCanvasItem *newObject(QCanvas *canvas) { return new Sign(canvas); }
|
||
|
};
|
||
|
|
||
|
class Windmill;
|
||
|
class WindmillGuard : public Wall
|
||
|
{
|
||
|
public:
|
||
|
WindmillGuard(QCanvas *canvas) : Wall(canvas) {};
|
||
|
void setBetween(int newmin, int newmax) { max = newmax; min = newmin; }
|
||
|
virtual void advance(int phase);
|
||
|
|
||
|
protected:
|
||
|
int max;
|
||
|
int min;
|
||
|
};
|
||
|
class WindmillConfig : public BridgeConfig
|
||
|
{
|
||
|
Q_OBJECT
|
||
|
|
||
|
public:
|
||
|
WindmillConfig(Windmill *windmill, QWidget *parent);
|
||
|
|
||
|
private slots:
|
||
|
void speedChanged(int news);
|
||
|
void endChanged(bool yes);
|
||
|
|
||
|
private:
|
||
|
Windmill *windmill;
|
||
|
};
|
||
|
class Windmill : public Bridge
|
||
|
{
|
||
|
public:
|
||
|
Windmill(QRect rect, QCanvas *canvas);
|
||
|
virtual void aboutToDie();
|
||
|
virtual void newSize(int width, int height);
|
||
|
virtual void save(KConfig *cfg);
|
||
|
virtual void load(KConfig *cfg);
|
||
|
virtual void setGame(KolfGame *game);
|
||
|
virtual Config *config(QWidget *parent) { return new WindmillConfig(this, parent); }
|
||
|
void setSize(int width, int height);
|
||
|
virtual void moveBy(double dx, double dy);
|
||
|
void setSpeed(int news);
|
||
|
int curSpeed() const { return speed; }
|
||
|
void setBottom(bool yes);
|
||
|
bool bottom() const { return m_bottom; }
|
||
|
|
||
|
protected:
|
||
|
WindmillGuard *guard;
|
||
|
Wall *left;
|
||
|
Wall *right;
|
||
|
int speedfactor;
|
||
|
int speed;
|
||
|
bool m_bottom;
|
||
|
};
|
||
|
class WindmillObj : public Object
|
||
|
{
|
||
|
public:
|
||
|
WindmillObj() { m_name = i18n("Windmill"); m__name = "windmill"; }
|
||
|
virtual QCanvasItem *newObject(QCanvas *canvas) { return new Windmill(QRect(0, 0, 80, 40), canvas); }
|
||
|
};
|
||
|
|
||
|
class HoleInfo;
|
||
|
class HoleConfig : public Config
|
||
|
{
|
||
|
Q_OBJECT
|
||
|
|
||
|
public:
|
||
|
HoleConfig(HoleInfo *holeInfo, QWidget *);
|
||
|
|
||
|
private slots:
|
||
|
void authorChanged(const QString &);
|
||
|
void parChanged(int);
|
||
|
void maxStrokesChanged(int);
|
||
|
void nameChanged(const QString &);
|
||
|
void borderWallsChanged(bool);
|
||
|
|
||
|
private:
|
||
|
HoleInfo *holeInfo;
|
||
|
};
|
||
|
class HoleInfo : public CanvasItem
|
||
|
{
|
||
|
public:
|
||
|
HoleInfo() { m_lowestMaxStrokes = 4; }
|
||
|
virtual ~HoleInfo() {}
|
||
|
void setPar(int newpar) { m_par = newpar; }
|
||
|
int par() const { return m_par; }
|
||
|
void setMaxStrokes(int newMaxStrokes) { m_maxStrokes = newMaxStrokes; }
|
||
|
int lowestMaxStrokes() const { return m_lowestMaxStrokes; }
|
||
|
int maxStrokes() const { return m_maxStrokes; }
|
||
|
bool hasMaxStrokes() const { return m_maxStrokes != m_lowestMaxStrokes; }
|
||
|
void setAuthor(QString newauthor) { m_author = newauthor; }
|
||
|
QString author() const { return m_author; }
|
||
|
|
||
|
void setName(QString newname) { m_name = newname; }
|
||
|
void setUntranslatedName(QString newname) { m_untranslatedName = newname; }
|
||
|
QString name() const { return m_name; }
|
||
|
QString untranslatedName() const { return m_untranslatedName; }
|
||
|
|
||
|
virtual Config *config(QWidget *parent) { return new HoleConfig(this, parent); }
|
||
|
void borderWallsChanged(bool yes);
|
||
|
bool borderWalls() const { return m_borderWalls; }
|
||
|
|
||
|
private:
|
||
|
QString m_author;
|
||
|
QString m_name;
|
||
|
QString m_untranslatedName;
|
||
|
bool m_borderWalls;
|
||
|
int m_par;
|
||
|
int m_maxStrokes;
|
||
|
int m_lowestMaxStrokes;
|
||
|
};
|
||
|
|
||
|
class StrokeCircle : public QCanvasItem
|
||
|
{
|
||
|
public:
|
||
|
StrokeCircle(QCanvas *canvas);
|
||
|
|
||
|
void setValue(double v);
|
||
|
double value();
|
||
|
void setMaxValue(double m);
|
||
|
void setSize(int w, int h);
|
||
|
void setThickness(int t);
|
||
|
int thickness() const;
|
||
|
int width() const;
|
||
|
int height() const;
|
||
|
virtual void draw(QPainter &p);
|
||
|
virtual QRect boundingRect() const;
|
||
|
virtual bool collidesWith(const QCanvasItem*) const;
|
||
|
virtual bool collidesWith(const QCanvasSprite*, const QCanvasPolygonalItem*, const QCanvasRectangle*, const QCanvasEllipse*, const QCanvasText*) const;
|
||
|
|
||
|
private:
|
||
|
double dvalue, dmax;
|
||
|
int ithickness, iwidth, iheight;
|
||
|
};
|
||
|
|
||
|
struct KDE_EXPORT CourseInfo
|
||
|
{
|
||
|
CourseInfo(const QString &_name, const QString &_untranslatedName, const QString &_author, unsigned int _holes, unsigned int _par) { name = _name; untranslatedName = _untranslatedName, author = _author; holes = _holes; par = _par; }
|
||
|
CourseInfo();
|
||
|
|
||
|
QString name;
|
||
|
QString untranslatedName;
|
||
|
QString author;
|
||
|
unsigned int holes;
|
||
|
unsigned int par;
|
||
|
};
|
||
|
|
||
|
class KDE_EXPORT KolfGame : public QCanvasView
|
||
|
{
|
||
|
Q_OBJECT
|
||
|
|
||
|
public:
|
||
|
KolfGame(ObjectList *obj, PlayerList *players, QString filename, QWidget *parent=0, const char *name=0 );
|
||
|
~KolfGame();
|
||
|
void setObjects(ObjectList *obj) { this->obj = obj; }
|
||
|
void setFilename(const QString &filename);
|
||
|
QString curFilename() const { return filename; }
|
||
|
void emitLargestHole() { emit largestHole(highestHole); }
|
||
|
QCanvas *canvas() const { return course; }
|
||
|
void removeItem(QCanvasItem *item) { items.setAutoDelete(false); items.removeRef(item); }
|
||
|
// returns whether it was a cancel
|
||
|
bool askSave(bool);
|
||
|
bool isEditing() const { return editing; }
|
||
|
int currentHole() { return curHole; }
|
||
|
void setStrict(bool yes) { strict = yes; }
|
||
|
// returns true when you shouldn't do anything
|
||
|
bool isPaused() const { return paused; }
|
||
|
Ball *curBall() const { return (*curPlayer).ball(); }
|
||
|
void updateMouse();
|
||
|
void ballMoved();
|
||
|
void updateHighlighter();
|
||
|
void updateCourse() { course->update(); }
|
||
|
QCanvasItem *curSelectedItem() const { return selectedItem; }
|
||
|
void setBorderWalls(bool);
|
||
|
void setInPlay(bool yes) { inPlay = yes; }
|
||
|
bool isInPlay() { return inPlay; }
|
||
|
bool isInfoShowing() { return m_showInfo; }
|
||
|
void stoppedBall();
|
||
|
QString courseName() const { return holeInfo.name(); }
|
||
|
void hidePutter() { putter->setVisible(false); }
|
||
|
void ignoreEvents(bool ignore) { m_ignoreEvents = ignore; }
|
||
|
|
||
|
static void scoresFromSaved(KConfig *, PlayerList &players);
|
||
|
static void courseInfo(CourseInfo &info, const QString &filename);
|
||
|
|
||
|
public slots:
|
||
|
void pause();
|
||
|
void unPause();
|
||
|
void save();
|
||
|
void toggleEditMode();
|
||
|
void setModified(bool mod = true);
|
||
|
void addNewObject(Object *newObj);
|
||
|
void addNewHole();
|
||
|
void switchHole(int);
|
||
|
void switchHole(const QString &);
|
||
|
void nextHole();
|
||
|
void prevHole();
|
||
|
void firstHole();
|
||
|
void lastHole();
|
||
|
void randHole();
|
||
|
void playSound(QString file, double vol = 1);
|
||
|
void showInfoDlg(bool = false);
|
||
|
void resetHole();
|
||
|
void clearHole();
|
||
|
void print(KPrinter &);
|
||
|
void setShowInfo(bool yes);
|
||
|
void toggleShowInfo();
|
||
|
void updateShowInfo();
|
||
|
void setUseMouse(bool yes) { m_useMouse = yes; }
|
||
|
void setUseAdvancedPutting(bool yes);
|
||
|
void setShowGuideLine(bool yes);
|
||
|
void setSound(bool yes);
|
||
|
void undoShot();
|
||
|
void timeout();
|
||
|
void saveScores(KConfig *);
|
||
|
void startFirstHole(int hole);
|
||
|
void sayWhosGoing();
|
||
|
|
||
|
signals:
|
||
|
void holesDone();
|
||
|
void newHole(int);
|
||
|
void parChanged(int, int);
|
||
|
void titleChanged(const QString &);
|
||
|
void largestHole(int);
|
||
|
void scoreChanged(int, int, int);
|
||
|
void newPlayersTurn(Player *);
|
||
|
void playerHoled(Player *);
|
||
|
void newSelectedItem(CanvasItem *);
|
||
|
void checkEditing();
|
||
|
void editingStarted();
|
||
|
void editingEnded();
|
||
|
void inPlayStart();
|
||
|
void inPlayEnd();
|
||
|
void maxStrokesReached(const QString &);
|
||
|
void currentHole(int);
|
||
|
void modifiedChanged(bool);
|
||
|
void newStatusText(const QString &);
|
||
|
|
||
|
private slots:
|
||
|
void shotDone();
|
||
|
void holeDone();
|
||
|
void startNextHole();
|
||
|
void fastTimeout();
|
||
|
void putterTimeout();
|
||
|
void autoSaveTimeout();
|
||
|
void addItemsToMoveableList(QPtrList<QCanvasItem>);
|
||
|
void addItemToFastAdvancersList(CanvasItem *);
|
||
|
void hideInfo();
|
||
|
|
||
|
void emitMax();
|
||
|
|
||
|
protected:
|
||
|
void mouseMoveEvent(QMouseEvent *e);
|
||
|
void mousePressEvent(QMouseEvent *e);
|
||
|
void mouseReleaseEvent(QMouseEvent *e);
|
||
|
void mouseDoubleClickEvent(QMouseEvent *e);
|
||
|
|
||
|
void handleMousePressEvent(QMouseEvent *e);
|
||
|
void handleMouseDoubleClickEvent(QMouseEvent *e);
|
||
|
void handleMouseMoveEvent(QMouseEvent *e);
|
||
|
void handleMouseReleaseEvent(QMouseEvent *e);
|
||
|
void keyPressEvent(QKeyEvent *e);
|
||
|
void keyReleaseEvent(QKeyEvent *e);
|
||
|
|
||
|
QPoint viewportToViewport(const QPoint &p);
|
||
|
|
||
|
private:
|
||
|
QCanvas *course;
|
||
|
Putter *putter;
|
||
|
PlayerList *players;
|
||
|
PlayerList::Iterator curPlayer;
|
||
|
Ball *whiteBall;
|
||
|
StrokeCircle *strokeCircle;
|
||
|
|
||
|
QTimer *timer;
|
||
|
QTimer *autoSaveTimer;
|
||
|
QTimer *fastTimer;
|
||
|
QTimer *putterTimer;
|
||
|
bool regAdv;
|
||
|
|
||
|
ObjectList *obj;
|
||
|
QPtrList<QCanvasItem> items;
|
||
|
QPtrList<QCanvasItem> extraMoveable;
|
||
|
QPtrList<Wall> borderWalls;
|
||
|
|
||
|
int timerMsec;
|
||
|
int autoSaveMsec;
|
||
|
int fastTimerMsec;
|
||
|
int putterTimerMsec;
|
||
|
|
||
|
void puttPress();
|
||
|
void puttRelease();
|
||
|
bool inPlay;
|
||
|
bool putting;
|
||
|
bool stroking;
|
||
|
bool finishStroking;
|
||
|
double strength;
|
||
|
double maxStrength;
|
||
|
int puttCount;
|
||
|
bool puttReverse;
|
||
|
|
||
|
int curHole;
|
||
|
int highestHole;
|
||
|
int curPar;
|
||
|
|
||
|
int wallWidth;
|
||
|
int height;
|
||
|
int width;
|
||
|
int margin;
|
||
|
QColor grass;
|
||
|
|
||
|
int advancePeriod;
|
||
|
|
||
|
int lastDelId;
|
||
|
|
||
|
bool paused;
|
||
|
|
||
|
QString filename;
|
||
|
bool recalcHighestHole;
|
||
|
void openFile();
|
||
|
|
||
|
bool strict;
|
||
|
|
||
|
bool editing;
|
||
|
QPoint storedMousePos;
|
||
|
bool moving;
|
||
|
bool dragging;
|
||
|
QCanvasItem *movingItem;
|
||
|
QCanvasItem *selectedItem;
|
||
|
QCanvasRectangle *highlighter;
|
||
|
|
||
|
// sound
|
||
|
KArtsDispatcher artsDispatcher;
|
||
|
KArtsServer artsServer;
|
||
|
QPtrList<KPlayObject> oldPlayObjects;
|
||
|
bool m_sound;
|
||
|
bool soundedOnce;
|
||
|
QString soundDir;
|
||
|
|
||
|
bool m_ignoreEvents;
|
||
|
|
||
|
HoleInfo holeInfo;
|
||
|
QCanvasText *infoText;
|
||
|
void showInfo();
|
||
|
StateDB stateDB;
|
||
|
|
||
|
BallStateList ballStateList;
|
||
|
void loadStateList();
|
||
|
void recreateStateList();
|
||
|
void addHoleInfo(BallStateList &list);
|
||
|
|
||
|
bool dontAddStroke;
|
||
|
|
||
|
bool addingNewHole;
|
||
|
int scoreboardHoles;
|
||
|
inline void resetHoleScores();
|
||
|
|
||
|
bool m_showInfo;
|
||
|
|
||
|
bool infoShown;
|
||
|
|
||
|
KConfig *cfg;
|
||
|
|
||
|
inline void addBorderWall(QPoint start, QPoint end);
|
||
|
void shotStart();
|
||
|
void startBall(const Vector &vector);
|
||
|
|
||
|
bool modified;
|
||
|
|
||
|
inline bool allPlayersDone();
|
||
|
|
||
|
bool m_useMouse;
|
||
|
bool m_useAdvancedPutting;
|
||
|
|
||
|
QPtrList<CanvasItem> fastAdvancers;
|
||
|
bool fastAdvancedExist;
|
||
|
|
||
|
QString playerWhoMaxed;
|
||
|
};
|
||
|
|
||
|
#endif
|