diff options
Diffstat (limited to 'kmahjongg/boardwidget.h')
-rw-r--r-- | kmahjongg/boardwidget.h | 244 |
1 files changed, 244 insertions, 0 deletions
diff --git a/kmahjongg/boardwidget.h b/kmahjongg/boardwidget.h new file mode 100644 index 00000000..4c042c38 --- /dev/null +++ b/kmahjongg/boardwidget.h @@ -0,0 +1,244 @@ +#ifndef BOARDWIDGET_H +#define BOARDWIDGET_H + +#include <qwidget.h> +#include <qevent.h> +#include <krandomsequence.h> + + +#include "KmTypes.h" +#include "Tileset.h" +#include "Background.h" +#include "BoardLayout.h" + +typedef struct gamedata { + int allow_undo; + int allow_redo; + UCHAR Board[BoardLayout::depth][BoardLayout::height][BoardLayout::width]; + USHORT TileNum; + USHORT MaxTileNum; + UCHAR Mask[BoardLayout::depth][BoardLayout::height][BoardLayout::width]; + UCHAR hilighted[BoardLayout::depth][BoardLayout::height][BoardLayout::width]; + POSITION MoveList[BoardLayout::maxTiles]; + void putTile( short e, short y, short x, UCHAR f ) + { + + + Board[e][y][x] = Board[e][y+1][x] = + Board[e][y+1][x+1] = Board[e][y][x+1] = f; + } + void putTile( POSITION& pos ) + { + putTile( pos.e, pos.y, pos.x, pos.f ); + } + + + bool tilePresent(int z, int y, int x) { + return(Board[z][y][x]!=0 && Mask[z][y][x] == '1'); + } + + bool partTile(int z, int y, int x) { + return (Board[z][y][x] != 0); + } + + int shadowHeight(int z, int y, int x) { + + + if ((z>=BoardLayout::depth||y>=BoardLayout::height||x>=BoardLayout::width)) + return 0; + + + if ((y < 0) || (x < 0)) + return 0; + + int h=0; + for (int e=z; e<BoardLayout::depth; e++) { + if (Board[e][y][x] && Mask[e][y][x]) { + + + h++; + } else { + return h; + } + + } + return h; + } + + +} GAMEDATA; + +#define ANIMSPEED 200 + +// tiles symbol names: +#define TILE_OFFSET 2 + +#define TILE_CHARACTER ( 0 + TILE_OFFSET) +#define TILE_BAMBOO ( 9 + TILE_OFFSET) +#define TILE_ROD (18 + TILE_OFFSET) +#define TILE_SEASON (27 + TILE_OFFSET) +#define TILE_WIND (31 + TILE_OFFSET) +#define TILE_DRAGON (36 + TILE_OFFSET) +#define TILE_FLOWER (39 + TILE_OFFSET) + +#define ID_GAME_TIMER 999 + +/** + * @author Mathias Mueller + */ +class BoardWidget : public QWidget +{ + Q_OBJECT + + public: + BoardWidget( QWidget* parent = 0, const char *name = 0 ); + ~BoardWidget(); + + void calculateNewGame(int num = -1 ); + int undoMove(); + void redoMove(); + void startDemoMode(); + void stopDemoMode(); + + void pause(); + void gameLoaded(); + + void animateMoveList(); + void setShowMatch( bool ); + void tileSizeChanged(); + long getGameNum() {return gameGenerationNum;} + QString &getBoardName(){return theBoardLayout.getFilename();} + QString &getLayoutName() {return theBoardLayout.getFilename();} + + + public slots: + void loadSettings(); + void saveSettings(); + + void shuffle(); + void helpMove(); + void helpMoveTimeout(); + void helpMoveStop(); + void demoMoveTimeout(); + void matchAnimationTimeout(); + void setDisplayedWidth(); + bool loadTileset ( const QString & ); + bool loadBoardLayout( const QString& ); + bool loadBoard ( ); + void updateScaleMode (); + void drawBoard(bool deferUpdate = true); + bool loadBackground ( const QString&, bool bShowError = true ); + signals: + void statusTextChanged ( const QString&, long ); + void tileNumberChanged ( int iMaximum, int iCurrent, int iLeft ); + void demoModeChanged ( bool bActive ); + + void gameCalculated(); + + void gameOver(unsigned short removed, unsigned short cheats); + protected: + void getFileOrDefault(QString filename, QString type, QString &res); + void shadowArea(int z, int y, int x, int sx, int sy, int rx, int ry, QPixmap *src); + void shadowTopLeft(int depth, int sx, int sy, int rx, int ry,QPixmap *src, bool flag); + void shadowBotRight(int depth, int sx, int sy, int rx, int ry,QPixmap *src, bool flag); + void paintEvent ( QPaintEvent* ); + void mousePressEvent ( QMouseEvent* ); + + void setStatusText ( const QString& ); + void cancelUserSelectedTiles(); + void drawTileNumber(); + + void hilightTile ( POSITION&, bool on=true, bool refresh=true ); + void putTile ( POSITION& , bool refresh = true); + void removeTile ( POSITION& , bool refresh = true); + void setRemovedTilePair(POSITION &a, POSITION &b); + void clearRemovedTilePair(POSITION &a, POSITION &b); + void transformPointToPosition( const QPoint&, POSITION& ); + + bool isMatchingTile( POSITION&, POSITION& ); + bool generateStartPosition2(); + bool findMove( POSITION&, POSITION& ); + int moveCount( ); + short findAllMatchingTiles( POSITION& ); + void stopMatchAnimation(); + void stackTiles(unsigned char t, unsigned short h, unsigned short x,unsigned short y); + void initialiseRemovedTiles(); + + int requiredWidth(); + int requiredHeight(); + + void calcShadow(int e, int y, int x, int &left, int &right, int &corn); + + + // new bits for game generation + void randomiseFaces(); + int tilesAllocated; + int tilesUsed; + void getFaces(POSITION &a, POSITION &b); + UCHAR tilePair[144]; + + KRandomSequence random; + + Tileset theTiles; + Background theBackground; + + BoardLayout theBoardLayout; + + + int iPosCount; // count of valid positions in PosTable + POSITION PosTable[BoardLayout::maxTiles]; // Table of all possible positions + POSITION MouseClickPos1, MouseClickPos2; + POSITION TimerPos1, TimerPos2; + + enum STATES { Stop, Demo, Help, Animation, Match } TimerState; + int iTimerStep; + + short matchCount; + bool showMatch; + bool showHelp; + + QTimer *timer; + + // offscreen draw area. + QPixmap backBuffer; // pixmap to render to + + + + bool updateBackBuffer; // does board need redrawing. Not if it is just a repaint + + bool gamePaused; + + // storage for hiscore claculation + unsigned short cheatsUsed; + + // seed for the random number generator used for this game + long gameGenerationNum; + + // storage to keep track of removed tiles + unsigned char removedCharacter[9]; + unsigned char removedBamboo[9]; + unsigned char removedRod[9]; + unsigned char removedDragon[3]; + unsigned char removedWind[9]; + unsigned char removedFlower[4]; + unsigned char removedSeason[4]; + + // new bits for new game generation, with solvability + int numTiles; + POSITION tilePositions[BoardLayout::maxTiles]; + DEPENDENCY positionDepends[BoardLayout::maxTiles]; + void generateTilePositions(); + void generatePositionDepends(); + int tileAt(int x, int y, int z); + bool generateSolvableGame(); + bool onlyFreeInLine(int position); + int selectPosition(int lastPosition); + void placeTile(int position, int tile); + void updateDepend(int position); + +public: + GAMEDATA Game; +}; + +#endif // BOARDWIDGET_H + |