Changeset 258


Ignore:
Timestamp:
Jan 21, 2011, 2:52:05 PM (9 years ago)
Author:
sam
Message:

Implement valid move checks and early piece disappearance.

Location:
trunk/monsterz
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/monsterz/board.cpp

    r255 r258  
    143143                  - data->grabbed->GetPos()).sqlen() > 100 * 100)
    144144        {
     145            data->grabbed->Ungrab();
    145146            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);
    157148            data->state = BoardData::IDLE;
    158149        }
     
    181172        data->game->GetScene()->AddTile((data->tiles << 16) | 7, x, y, 10, 0);
    182173    }
     174}
     175
     176void 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
     223int 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;
    183252}
    184253
  • trunk/monsterz/board.h

    r223 r258  
    2727    virtual void TickDraw(float deltams);
    2828
     29    void Switch(Int2 cell_a, Int2 cell_b);
     30    int ListMashes(int list[8][8]);
     31
    2932private:
    3033    BoardData *data;
  • trunk/monsterz/piece.cpp

    r250 r258  
    7272}
    7373
     74int Piece::GetId() const
     75{
     76    return data->id;
     77}
     78
    7479int Piece::Blink()
    7580{
     
    8388        return 0;
    8489    }
     90}
     91
     92int Piece::Pop()
     93{
     94    return 0;
    8595}
    8696
  • trunk/monsterz/piece.h

    r248 r258  
    2525    void SetCell(Int2 cell);
    2626    Int2 GetPos() const;
     27    int GetId() const;
    2728
    2829    int Blink();
     30    int Pop();
    2931    int Grab(Int2 dir);
    3032    int Ungrab();
Note: See TracChangeset for help on using the changeset viewer.