/***************************************************************************
*   KBlocks, a falling blocks game for KDE                                *
*   Copyright (C) 2010 Zhongjie Cai <squall.leonhart.cai@gmail.com>       *
*                                                                         *
*   This program is free software; you can redistribute it and/or modify  *
*   it under the terms of the GNU General Public License as published by  *
*   the Free Software Foundation; either version 2 of the License, or     *
*   (at your option) any later version.                                   *
***************************************************************************/
#ifndef KBLOCKSPIECE_H
#define KBLOCKSPIECE_H

#include "PieceInterface.h"

#define KBlocksPiece_CellCount    4

enum KBlocks_PieceType
{
    PieceType_Shape_Z = 0,
    PieceType_Shape_S,
    PieceType_Shape_I,
    PieceType_Shape_T,
    PieceType_Shape_O,
    PieceType_Shape_L,
    PieceType_Shape_J,
    PieceType_Max_Count
};

enum KBlocks_PieceRotation
{
    PieceRotation_Up = 0,
    PieceRotation_Left,
    PieceRotation_Down,
    PieceRotation_Right,
    PieceRotation_Max_Count
};

enum KBlocks_PieceType_Detail
{
    PieceType_Shape_Z_1 = 0,
    PieceType_Shape_Z_2,
    PieceType_Shape_Z_3,
    PieceType_Shape_Z_4,
    PieceType_Shape_S_1,
    PieceType_Shape_S_2,
    PieceType_Shape_S_3,
    PieceType_Shape_S_4,
    PieceType_Shape_I_1,
    PieceType_Shape_I_2,
    PieceType_Shape_I_3,
    PieceType_Shape_I_4,
    PieceType_Shape_T_1,
    PieceType_Shape_T_2,
    PieceType_Shape_T_3,
    PieceType_Shape_T_4,
    PieceType_Shape_O_1,
    PieceType_Shape_O_2,
    PieceType_Shape_O_3,
    PieceType_Shape_O_4,
    PieceType_Shape_L_1,
    PieceType_Shape_L_2,
    PieceType_Shape_L_3,
    PieceType_Shape_L_4,
    PieceType_Shape_J_1,
    PieceType_Shape_J_2,
    PieceType_Shape_J_3,
    PieceType_Shape_J_4,
    PieceType_Detail_Max_Count
};

class PiecePoint
{
    public:
        PiecePoint(int x, int y);
        ~PiecePoint();
        
    public:
        int x();
        int y();
        
    private:
        int mPosX;
        int mPosY;
};

class KBlocksPiece : public PieceInterface
{
    public:
        KBlocksPiece();
        KBlocksPiece(PieceInterface * p);
        ~KBlocksPiece();
    
    public:
        void copy(PieceInterface * p);
        
        int  toValue();
        void fromValue(int val);
        
        int  getType();
        void setType(int newType);
        
        int  getRotation();
        void setRotation(int newRotation);
        
        int  getPosX();
        void setPosX(int newPosX);
        
        int  getPosY();
        void setPosY(int newPosY);
        
        int  getCellCount();
        int  getCellPosX(int index);
        int  getCellPosY(int index);
        
        int  getWidth();
        int  getHeight();
        int  getRotationCount();
        
        int  getSignature(int * signature);
        
        void encodeData(unsigned char * data);
        void decodeData(unsigned char * data);
        
    protected:
        int mType;
        int mPosX;
        int mPosY;
        int mRotation;
};

#endif

