Changeset 258
- Timestamp:
- Jan 21, 2011, 2:52:05 PM (10 years ago)
- Location:
- trunk/monsterz
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/monsterz/board.cpp
r255 r258 143 143 - data->grabbed->GetPos()).sqlen() > 100 * 100) 144 144 { 145 data->grabbed->Ungrab(); 145 146 if (data->dst_cell != Int2(-1)) 146 { 147 Piece *src = data->pieces[data->src_cell.i][data->src_cell.j]; 148 Piece *dst = data->pieces[data->dst_cell.i][data->dst_cell.j]; 149 data->pieces[data->src_cell.i][data->src_cell.j] = dst; 150 data->pieces[data->dst_cell.i][data->dst_cell.j] = src; 151 src->SetCell(data->dst_cell); 152 src->Goto(data->dst_cell * 48); 153 dst->SetCell(data->src_cell); 154 dst->Goto(data->src_cell * 48); 155 } 156 data->grabbed->Ungrab(); 147 Switch(data->src_cell, data->dst_cell); 157 148 data->state = BoardData::IDLE; 158 149 } … … 181 172 data->game->GetScene()->AddTile((data->tiles << 16) | 7, x, y, 10, 0); 182 173 } 174 } 175 176 void Board::Switch(Int2 cell_a, Int2 cell_b) 177 { 178 Piece *a = data->pieces[cell_a.i][cell_a.j]; 179 Piece *b = data->pieces[cell_b.i][cell_b.j]; 180 data->pieces[cell_a.i][cell_a.j] = b; 181 data->pieces[cell_b.i][cell_b.j] = a; 182 183 /* Check whether this is a valid move by testing all patterns. 184 * If the move is invalid, cancel the swap and bail out */ 185 int list[8][8]; 186 187 if (!ListMashes(list)) 188 { 189 data->pieces[cell_a.i][cell_a.j] = a; 190 data->pieces[cell_b.i][cell_b.j] = b; 191 a->Goto(cell_a * 48); 192 b->Goto(cell_b * 48); 193 return; 194 } 195 196 /* Perform the swap */ 197 a->SetCell(cell_b); 198 a->Goto(cell_b * 48); 199 b->SetCell(cell_a); 200 b->Goto(cell_a * 48); 201 202 /* Remove matching tiles */ 203 do for (int j = 8; j--;) for (int i = 0; i < 8; i++) 204 { 205 if (list[i][j]) 206 { 207 Ticker::Unref(data->pieces[i][j]); 208 for (int j2 = j + 1; j2 < 8; j2++) 209 { 210 data->pieces[i][j2 - 1] = data->pieces[i][j2]; 211 data->pieces[i][j2 - 1]->SetCell(Int2(i, j2 - 1)); 212 data->pieces[i][j2 - 1]->Goto(Int2(i, j2 - 1) * 48); 213 list[i][j2 - 1] = list[i][j2]; 214 } 215 data->pieces[i][7] = new Piece(data->game, Int2(i, 7), 25 + 5 * (rand() % 8)); 216 Ticker::Ref(data->pieces[i][7]); 217 list[i][7] = 0; 218 } 219 } 220 while(ListMashes(list)); 221 } 222 223 int Board::ListMashes(int list[8][8]) 224 { 225 int ret = 0; 226 227 for (int j = 0; j < 8; j++) 228 for (int i = 0; i < 8; i++) 229 list[i][j] = 0; 230 231 for (int j = 0; j < 8; j++) 232 for (int i = 0; i < 8; i++) 233 { 234 int id = data->pieces[i][j]->GetId(); 235 236 if (i + 2 < 8 && data->pieces[i + 1][j]->GetId() == id 237 && data->pieces[i + 2][j]->GetId() == id) 238 { 239 list[i][j] = list[i + 1][j] = list[i + 2][j] = 1; 240 ret = 1; 241 } 242 243 if (j + 2 < 8 && data->pieces[i][j + 1]->GetId() == id 244 && data->pieces[i][j + 2]->GetId() == id) 245 { 246 list[i][j] = list[i][j + 1] = list[i][j + 2] = 1; 247 ret = 1; 248 } 249 } 250 251 return ret; 183 252 } 184 253 -
trunk/monsterz/board.h
r223 r258 27 27 virtual void TickDraw(float deltams); 28 28 29 void Switch(Int2 cell_a, Int2 cell_b); 30 int ListMashes(int list[8][8]); 31 29 32 private: 30 33 BoardData *data; -
trunk/monsterz/piece.cpp
r250 r258 72 72 } 73 73 74 int Piece::GetId() const 75 { 76 return data->id; 77 } 78 74 79 int Piece::Blink() 75 80 { … … 83 88 return 0; 84 89 } 90 } 91 92 int Piece::Pop() 93 { 94 return 0; 85 95 } 86 96 -
trunk/monsterz/piece.h
r248 r258 25 25 void SetCell(Int2 cell); 26 26 Int2 GetPos() const; 27 int GetId() const; 27 28 28 29 int Blink(); 30 int Pop(); 29 31 int Grab(Int2 dir); 30 32 int Ungrab();
Note: See TracChangeset
for help on using the changeset viewer.