#ifndef BASE_PIECE_H #define BASE_PIECE_H #include #include #include class KRandomSequence; //----------------------------------------------------------------------------- class GPieceInfo { public: GPieceInfo(); virtual ~GPieceInfo() {} virtual uint nbBlocks() const = 0; // nb of blocks in a piece virtual uint nbTypes() const = 0; // nb of combin. of types in piece virtual uint nbForms() const = 0; // nb of geometrical form of piece virtual const int *i(uint form, uint rotation) const = 0; virtual const int *j(uint form, uint rotation) const = 0; virtual uint value(uint type, uint n) const = 0; virtual uint form(uint type) const = 0; virtual uint nbConfigurations(uint type) const = 0; uint generateType(KRandomSequence *) const; KGrid2D::Coord maxSize() const; TQPixmap *pixmap(uint blockSize, uint blockType, uint blockMode, bool lighted) const; virtual uint nbNormalBlockTypes() const = 0; virtual uint nbGarbageBlockTypes() const = 0; virtual uint nbBlockModes() const = 0; // nb of modes per block bool isGarbage(uint type) const { return type>=nbNormalBlockTypes(); } uint generateGarbageBlockType(KRandomSequence *) const; virtual uint nbColors() const = 0; virtual TQString colorLabel(uint i) const = 0; TQCString colorKey(uint i) const; virtual TQColor defaultColor(uint i) const = 0; void loadColors(); protected: TQColor color(uint i) const { return _colors[i]; } virtual void draw(TQPixmap *, uint blockType, uint blockMode, bool lighted) const = 0; virtual void setMask(TQPixmap *, uint /*blockMode*/) const {} private: TQValueVector _colors; }; class SequenceArray : public TQMemArray { public: SequenceArray(); ~SequenceArray(); void setBlockSize(uint size); uint blockSize() const { return _size; } private: uint _size; }; //----------------------------------------------------------------------------- class BlockInfo : public TQCanvas { public: BlockInfo(const SequenceArray &); const SequenceArray &sequences() const { return _sequences; } TQPoint toPoint(const KGrid2D::Coord &) const; private: const SequenceArray &_sequences; }; //----------------------------------------------------------------------------- class Block { public: Block(uint value = 0); ~Block(); void setValue(uint, BlockInfo *); uint value() const { return _value; } bool isGarbage() const; void toggleLight(); TQCanvasSprite *sprite() const { return _sprite; } private: uint _value; TQCanvasSprite *_sprite; Block(const Block &); // disabled Block &operator =(const Block &); // disabled }; //----------------------------------------------------------------------------- class Piece { public: Piece(); void copy(const Piece *); void setBlockInfo(BlockInfo *bi) { _binfo = bi; } static void setPieceInfo(GPieceInfo *pi) { _info = pi; } static GPieceInfo &info() { return *_info; } uint type() const { return _type; } uint nbBlocks() const { return _blocks.size(); } uint nbConfigurations() const { return _info->nbConfigurations(_type); } int value(uint k) const { return _blocks[k]->value(); } KGrid2D::Coord pos(uint k, const KGrid2D::Coord &) const; KGrid2D::Coord min() const; KGrid2D::Coord max() const; KGrid2D::Coord size() const { return max() - min() + KGrid2D::Coord(1, 1); } void generateNext(int type = -1); void rotate(bool left, const TQPoint &); void move(const TQPoint &); void moveCenter(); void show(bool show); void setRandomSequence(KRandomSequence *random) { _random = random; } Block *garbageBlock() const; Block *takeBlock(uint k); private: TQPtrVector _blocks; uint _type; KRandomSequence *_random; static GPieceInfo *_info; BlockInfo *_binfo; uint _rotation; int const *_i; int const *_j; Piece(const Piece &); // disabled Piece &operator =(const Piece &); // disabled KGrid2D::Coord coord(uint k) const { return KGrid2D::Coord(_i[k], _j[k]); } void moveBlock(uint k, const TQPoint &); }; #endif