#ifndef GAMESTATE_H #define GAMESTATE_H #include #include #include "playingcard.h" #include "columnslot.h" class GameState : public QObject { Q_OBJECT QML_ELEMENT QML_SINGLETON Q_PROPERTY(QList drawPile READ drawPile NOTIFY drawPileChanged) Q_PROPERTY(QList throwawayPile READ throwawayPile NOTIFY throwawayPileChanged) Q_PROPERTY(QList> columns READ columns NOTIFY columnsChanged) Q_PROPERTY(QList> foundation READ foundation NOTIFY foundationChanged) Q_PROPERTY(bool gameWon READ gameWon NOTIFY gameWonChanged) public: explicit GameState(QObject *parent = nullptr); // Getters QList drawPile() const; QList throwawayPile() const; QList> columns() const; QList> foundation() const; bool gameWon() const; // General functions Q_INVOKABLE void dealCards(); Q_INVOKABLE void setupWinningDeck(); Q_INVOKABLE void drawNextCard(); // Manual moves (from X to Y) Q_INVOKABLE bool moveThrownCardToColumn(int columnId); Q_INVOKABLE bool moveThrownCardToFoundation(int foundationId); Q_INVOKABLE bool moveColumnCardToColumn(int fromColumnId, int toColumnId, int fromCardIndex); Q_INVOKABLE bool moveColumnCardToFoundation(int columnId, int foundationId); // Automatic moves (from X to auto) Q_INVOKABLE bool autoMoveThrownCard(); Q_INVOKABLE bool autoMoveColumnCard(int columnId, int cardIndex); signals: void drawPileChanged(); void throwawayPileChanged(); void columnsChanged(); void foundationChanged(); void gameWonChanged(); private slots: void onFoundationChanged(); private: QList m_drawPile; QList m_throwawayPile; QList> m_columns; QList> m_foundation; bool m_gameWon; void cleanupBoard(bool emitChanges); bool tryAutoMoveSingleCard(PlayingCard& cardToMove, int skipColumnId = -1); bool tryAutoMoveMultipleCards(const QList& cards, int skipColumnId); bool isFoundationMoveValid(const PlayingCard& cardToMove, int foundationId); bool isColumnMoveValid(const PlayingCard& cardToMove, int columnId); void ensureColumnRevealed(int columnId); }; #endif // GAMESTATE_H