File indexing completed on 2024-04-28 04:02:00

0001 /***************************************************************************
0002 *   KBlocks, a falling blocks game by KDE                                *
0003 *   SPDX-FileCopyrightText: 2010 Zhongjie Cai <squall.leonhart.cai@gmail.com>       *
0004 *                                                                         *
0005 *   SPDX-License-Identifier: GPL-2.0-or-later
0006 ***************************************************************************/
0007 #include "KBlocksPiece.h"
0008 
0009 const int C_PieceRotationCount[PieceType_Max_Count] = {
0010     2, 2, 2, 4, 1, 4, 4,
0011 };
0012 
0013 const PiecePoint C_PieceSize[PieceType_Detail_Max_Count] = {
0014     //Four blocks, also stair-like (Z)
0015     PiecePoint(2, 3), PiecePoint(3, 2), PiecePoint(2, 3), PiecePoint(3, 2),
0016 
0017     //Four blocks, stair-like (S)
0018     PiecePoint(2, 3), PiecePoint(3, 2), PiecePoint(2, 3), PiecePoint(3, 2),
0019 
0020     //Four blocks, straight line (I)
0021     PiecePoint(1, 4), PiecePoint(4, 1), PiecePoint(1, 4), PiecePoint(4, 1),
0022 
0023     //Four blocks, resembling an airplane (T)
0024     PiecePoint(2, 3), PiecePoint(3, 2), PiecePoint(2, 3), PiecePoint(3, 2),
0025 
0026     //Four blocks, square (O)
0027     PiecePoint(2, 2), PiecePoint(2, 2), PiecePoint(2, 2), PiecePoint(2, 2),
0028 
0029     //Four blocks, L shape (L)
0030     PiecePoint(2, 3), PiecePoint(3, 2), PiecePoint(2, 3), PiecePoint(3, 2),
0031 
0032     //Four blocks, also (J)
0033     PiecePoint(2, 3), PiecePoint(3, 2), PiecePoint(2, 3), PiecePoint(3, 2),
0034 };
0035 
0036 const PiecePoint C_PieceOffset[PieceType_Detail_Max_Count] = {
0037     //Four blocks, also stair-like (Z)
0038     PiecePoint(-1, -1), PiecePoint(-1, 0), PiecePoint(-1, -1), PiecePoint(-1, 0),
0039 
0040     //Four blocks, stair-like (S)
0041     PiecePoint(-1, -1), PiecePoint(-1, 0), PiecePoint(-1, -1), PiecePoint(-1, 0),
0042 
0043     //Four blocks, straight line (I)
0044     PiecePoint(0, -1), PiecePoint(-1, 0), PiecePoint(0, -1), PiecePoint(-1, 0),
0045 
0046     //Four blocks, resembling an airplane (T)
0047     PiecePoint(0, -1), PiecePoint(-1, -1), PiecePoint(-1, -1), PiecePoint(-1, 0),
0048 
0049     //Four blocks, square (O)
0050     PiecePoint(-1, -1), PiecePoint(-1, -1), PiecePoint(-1, -1), PiecePoint(-1, -1),
0051 
0052     //Four blocks, L shape (L)
0053     PiecePoint(0, -1), PiecePoint(-1, -1), PiecePoint(-1, -1), PiecePoint(-1, 0),
0054 
0055     //Four blocks, also (J)
0056     PiecePoint(-1, -1), PiecePoint(-1, 0), PiecePoint(0, -1), PiecePoint(-1, -1),
0057 };
0058 
0059 const PiecePoint C_PieceCell[PieceType_Detail_Max_Count][KBlocksPiece_CellCount] = {
0060     //Four blocks, also stair-like (Z)
0061     { PiecePoint(0, 1), PiecePoint(1, 0), PiecePoint(1, 1), PiecePoint(0, 2) },
0062     { PiecePoint(0, 0), PiecePoint(1, 0), PiecePoint(1, 1), PiecePoint(2, 1) },
0063     { PiecePoint(0, 1), PiecePoint(1, 0), PiecePoint(1, 1), PiecePoint(0, 2) },
0064     { PiecePoint(0, 0), PiecePoint(1, 0), PiecePoint(1, 1), PiecePoint(2, 1) },
0065 
0066     //Four blocks, stair-like (S)
0067     { PiecePoint(0, 0), PiecePoint(0, 1), PiecePoint(1, 1), PiecePoint(1, 2) },
0068     { PiecePoint(0, 1), PiecePoint(1, 1), PiecePoint(1, 0), PiecePoint(2, 0) },
0069     { PiecePoint(0, 0), PiecePoint(0, 1), PiecePoint(1, 1), PiecePoint(1, 2) },
0070     { PiecePoint(0, 1), PiecePoint(1, 1), PiecePoint(1, 0), PiecePoint(2, 0) },
0071 
0072     //Four blocks, straight line (I)
0073     { PiecePoint(0, 0), PiecePoint(0, 1), PiecePoint(0, 2), PiecePoint(0, 3) },
0074     { PiecePoint(0, 0), PiecePoint(1, 0), PiecePoint(2, 0), PiecePoint(3, 0) },
0075     { PiecePoint(0, 0), PiecePoint(0, 1), PiecePoint(0, 2), PiecePoint(0, 3) },
0076     { PiecePoint(0, 0), PiecePoint(1, 0), PiecePoint(2, 0), PiecePoint(3, 0) },
0077 
0078     //Four blocks, resembling an airplane (T)
0079     { PiecePoint(0, 0), PiecePoint(0, 1), PiecePoint(0, 2), PiecePoint(1, 1) },
0080     { PiecePoint(0, 1), PiecePoint(1, 1), PiecePoint(2, 1), PiecePoint(1, 0) },
0081     { PiecePoint(1, 2), PiecePoint(0, 1), PiecePoint(1, 1), PiecePoint(1, 0) },
0082     { PiecePoint(0, 0), PiecePoint(1, 0), PiecePoint(1, 1), PiecePoint(2, 0) },
0083 
0084     //Four blocks, square (O)
0085     { PiecePoint(0, 0), PiecePoint(1, 0), PiecePoint(0, 1), PiecePoint(1, 1) },
0086     { PiecePoint(0, 0), PiecePoint(1, 0), PiecePoint(0, 1), PiecePoint(1, 1) },
0087     { PiecePoint(0, 0), PiecePoint(1, 0), PiecePoint(0, 1), PiecePoint(1, 1) },
0088     { PiecePoint(0, 0), PiecePoint(1, 0), PiecePoint(0, 1), PiecePoint(1, 1) },
0089 
0090     //Four blocks, L shape (L)
0091     { PiecePoint(0, 2), PiecePoint(1, 2), PiecePoint(1, 1), PiecePoint(1, 0) },
0092     { PiecePoint(0, 0), PiecePoint(1, 0), PiecePoint(2, 0), PiecePoint(2, 1) },
0093     { PiecePoint(0, 0), PiecePoint(0, 1), PiecePoint(0, 2), PiecePoint(1, 0) },
0094     { PiecePoint(0, 0), PiecePoint(0, 1), PiecePoint(1, 1), PiecePoint(2, 1) },
0095 
0096     //Four blocks, also (J)
0097     { PiecePoint(0, 0), PiecePoint(0, 1), PiecePoint(0, 2), PiecePoint(1, 2) },
0098     { PiecePoint(0, 1), PiecePoint(1, 1), PiecePoint(2, 1), PiecePoint(2, 0) },
0099     { PiecePoint(0, 0), PiecePoint(1, 0), PiecePoint(1, 1), PiecePoint(1, 2) },
0100     { PiecePoint(0, 0), PiecePoint(1, 0), PiecePoint(2, 0), PiecePoint(0, 1) },
0101 };
0102 
0103 //-----------------------------------------------------------------------------
0104 PiecePoint::PiecePoint(int x, int y)
0105 {
0106     mPosX = x;
0107     mPosY = y;
0108 }
0109 
0110 PiecePoint::~PiecePoint()
0111 {
0112 }
0113 
0114 int PiecePoint::x()
0115 {
0116     return mPosX;
0117 }
0118 
0119 int PiecePoint::y()
0120 {
0121     return mPosY;
0122 }
0123 //-----------------------------------------------------------------------------
0124 
0125 KBlocksPiece::KBlocksPiece()
0126 {
0127 }
0128 
0129 KBlocksPiece::KBlocksPiece(PieceInterface *p)
0130 {
0131     copy(p);
0132 }
0133 
0134 KBlocksPiece::~KBlocksPiece()
0135 {
0136 }
0137 
0138 void KBlocksPiece::copy(PieceInterface *p)
0139 {
0140     mType = p->getType();
0141     mPosX = p->getPosX();
0142     mPosY = p->getPosY();
0143     mRotation = p->getRotation();
0144 }
0145 
0146 int KBlocksPiece::toValue()
0147 {
0148     return (mType * PieceRotation_Max_Count + mRotation);
0149 }
0150 
0151 void KBlocksPiece::fromValue(int val)
0152 {
0153     mType = val / PieceRotation_Max_Count;
0154     mRotation = val % PieceRotation_Max_Count;
0155 }
0156 
0157 int KBlocksPiece::getType()
0158 {
0159     return mType;
0160 }
0161 
0162 void KBlocksPiece::setType(int newType)
0163 {
0164     mType = (newType + PieceType_Max_Count) % PieceType_Max_Count;
0165 }
0166 
0167 int KBlocksPiece::getRotation()
0168 {
0169     return mRotation;
0170 }
0171 
0172 void KBlocksPiece::setRotation(int newRotation)
0173 {
0174     mRotation = (newRotation + PieceRotation_Max_Count) % PieceRotation_Max_Count;
0175 }
0176 
0177 int KBlocksPiece::getPosX()
0178 {
0179     return mPosX;
0180 }
0181 
0182 void KBlocksPiece::setPosX(int newPosX)
0183 {
0184     mPosX = newPosX;
0185 }
0186 
0187 int KBlocksPiece::getPosY()
0188 {
0189     return mPosY;
0190 }
0191 
0192 void KBlocksPiece::setPosY(int newPosY)
0193 {
0194     mPosY = newPosY;
0195 }
0196 
0197 int KBlocksPiece::getCellCount()
0198 {
0199     return KBlocksPiece_CellCount;
0200 }
0201 
0202 int KBlocksPiece::getCellPosX(int index)
0203 {
0204     if ((index < 0) || (index >= KBlocksPiece_CellCount)) {
0205         return -1;
0206     }
0207 
0208     PiecePoint tmpCell = C_PieceCell[mType * PieceRotation_Max_Count + mRotation][index];
0209     PiecePoint tmpOffset = C_PieceOffset[mType * PieceRotation_Max_Count + mRotation];
0210 
0211     return (mPosX + tmpCell.x() + tmpOffset.x());
0212 }
0213 
0214 int KBlocksPiece::getCellPosY(int index)
0215 {
0216     if ((index < 0) || (index >= KBlocksPiece_CellCount)) {
0217         return -1;
0218     }
0219 
0220     PiecePoint tmpCell = C_PieceCell[mType * PieceRotation_Max_Count + mRotation][index];
0221     PiecePoint tmpOffset = C_PieceOffset[mType * PieceRotation_Max_Count + mRotation];
0222 
0223     return (mPosY + tmpCell.y() + tmpOffset.y());
0224 }
0225 
0226 int KBlocksPiece::getWidth()
0227 {
0228     PiecePoint tmpPoint = C_PieceSize[mType * PieceRotation_Max_Count + mRotation];
0229     return tmpPoint.x();
0230 }
0231 
0232 int KBlocksPiece::getHeight()
0233 {
0234     PiecePoint tmpPoint = C_PieceSize[mType * PieceRotation_Max_Count + mRotation];
0235     return tmpPoint.y();
0236 }
0237 
0238 int KBlocksPiece::getRotationCount()
0239 {
0240     return C_PieceRotationCount[mType];
0241 }
0242 
0243 int KBlocksPiece::getSignature(int *signature)
0244 {
0245     for (int i = 0; i < KBlocksPiece_CellCount; i++) {
0246         signature[i] = -1;
0247     }
0248 
0249     for (int i = 0; i < KBlocksPiece_CellCount; i++) {
0250         PiecePoint tmpPoint = C_PieceCell[mType * PieceRotation_Max_Count + mRotation][i];
0251         if (tmpPoint.y() > signature[tmpPoint.x()]) {
0252             signature[tmpPoint.x()] = tmpPoint.y();
0253         }
0254     }
0255 
0256     return getWidth();
0257 }
0258 
0259 void KBlocksPiece::encodeData(unsigned char *data)
0260 {
0261     data[0] = mType;
0262     data[1] = mPosX;
0263     data[2] = mPosY;
0264     data[3] = mRotation;
0265 }
0266 
0267 void KBlocksPiece::decodeData(unsigned char *data)
0268 {
0269     mType = data[0];
0270     mPosX = data[1];
0271     mPosY = data[2];
0272     mRotation = data[3];
0273 }