summaryrefslogtreecommitdiffstats
path: root/kolf/game.h
diff options
context:
space:
mode:
Diffstat (limited to 'kolf/game.h')
-rw-r--r--kolf/game.h1026
1 files changed, 1026 insertions, 0 deletions
diff --git a/kolf/game.h b/kolf/game.h
new file mode 100644
index 00000000..afb13b3c
--- /dev/null
+++ b/kolf/game.h
@@ -0,0 +1,1026 @@
+#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