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 }