Changeset 759


Ignore:
Timestamp:
Apr 28, 2011, 10:16:04 PM (10 years ago)
Author:
sam
Message:

monsterz: get rid of the Fusion mode, it sucked.

Location:
trunk/monsterz
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/monsterz/board.cpp

    r758 r759  
    7878        HUNT_BADCLICK,
    7979        HUNT_GRAB,
    80         FUSION_IDLE,
    8180    }
    8281    state;
     
    9695    case GAME_HUNT:
    9796        data->size = 48;
    98         break;
    99     case GAME_FUSION:
    100         data->size = 40;
    10197        break;
    10298    }
     
    125121        data->thumbs->SetMax(data->npieces);
    126122        data->state = BoardData::HUNT_IDLE;
    127         break;
    128 
    129     case GAME_FUSION:
    130         for (int j = 0; j < data->dim.j; j++)
    131             for (int i = 0; i < data->dim.i; i++)
    132                 data->pairs[i][j].id = 0;
    133 
    134         data->current[0].id = GetRandomId();
    135         data->current[1].id = GetRandomId();
    136         data->current[0].piece = new Piece(Piece::PIECE_FUSION,
    137                                            data->emitter, vec2i(3, 8),
    138                                            data->current[0].id);
    139         data->current[1].piece = new Piece(Piece::PIECE_FUSION,
    140                                            data->emitter, vec2i(4, 8),
    141                                            data->current[1].id);
    142         Ticker::Ref(data->current[0].piece);
    143         Ticker::Ref(data->current[1].piece);
    144         data->current[0].piece->SetPos(vec2i(3, 7) * data->size);
    145         data->current[1].piece->SetPos(vec2i(4, 7) * data->size);
    146 
    147         data->next[0] = GetRandomId();
    148         data->next[1] = GetRandomId();
    149         data->rotation = 0;
    150 
    151         data->thumbs->SetMax(data->npieces + 1);
    152         data->state = BoardData::FUSION_IDLE;
    153123        break;
    154124    }
     
    274244            data->state = BoardData::HUNT_IDLE;
    275245        break;
    276 
    277     case BoardData::FUSION_IDLE:
    278     {
    279         int column = -1;
    280 
    281         if (clicked[2])
    282         {
    283             column = data->current[0].piece->GetCell().x;
    284             data->rotation = (data->rotation + 1) % 2;
    285             if (column - data->rotation > data->dim.i - 1)
    286                 column = data->dim.i - 1 - data->rotation;
    287             if (!data->rotation)
    288             {
    289                 BoardData::Pair tmp = data->current[0];
    290                 data->current[0] = data->current[1];
    291                 data->current[1] = tmp;
    292                 if (column == data->dim.i - 1)
    293                     column = 6;
    294             }
    295         }
    296 
    297         if (mousepos.x != -1 &&
    298             mousepos.x / data->size.x != data->current[0].piece->GetCell().x)
    299         {
    300             column = mousepos.x / data->size.x;
    301             column = column < 0 ? 0 : column > data->dim.i - 2 + data->rotation ? data->dim.i - 2 + data->rotation : column;
    302         }
    303 
    304         if (column != -1)
    305         {
    306             if (data->rotation)
    307             {
    308                 data->current[0].piece->SetCell(vec2i(column, 6));
    309                 data->current[1].piece->SetCell(vec2i(column, 7));
    310             }
    311             else
    312             {
    313                 data->current[0].piece->SetCell(vec2i(column, 7));
    314                 data->current[1].piece->SetCell(vec2i(column + 1, 7));
    315             }
    316 
    317             data->current[0].piece->Move(data->current[0].piece->GetCell() * data->size);
    318             data->current[1].piece->Move(data->current[1].piece->GetCell() * data->size);
    319         }
    320 
    321         if (clicked[0])
    322         {
    323             for (int t = 0; t < 2; t++)
    324             {
    325                 int i = data->current[t].piece->GetCell().i;
    326                 for (int j = 0; j < 7; j++)
    327                     if (data->pairs[i][j].id == 0)
    328                     {
    329                         data->current[t].piece->SetCell(vec2i(i, j));
    330                         data->current[t].piece->Move(vec2i(i, j) * data->size);
    331                         data->pairs[i][j] = data->current[t];
    332                         data->thumbs->AddCount(data->current[t].id, 1);
    333                         break;
    334                     }
    335             }
    336 
    337             data->current[0].id = data->next[0];
    338             data->current[1].id = data->next[1];
    339             data->current[0].piece = new Piece(Piece::PIECE_FUSION,
    340                                                data->emitter, vec2i(3, 7),
    341                                                data->current[0].id);
    342             data->current[1].piece = new Piece(Piece::PIECE_FUSION,
    343                                                data->emitter, vec2i(4, 7),
    344                                                data->current[1].id);
    345             Ticker::Ref(data->current[0].piece);
    346             Ticker::Ref(data->current[1].piece);
    347             data->current[0].piece->SetPos(vec2i(3, 8) * data->size);
    348             data->current[1].piece->SetPos(vec2i(4, 8) * data->size);
    349             data->current[0].piece->Move(data->current[0].piece->GetCell() * data->size);
    350             data->current[1].piece->Move(data->current[1].piece->GetCell() * data->size);
    351             data->next[0] = GetRandomId();
    352             data->next[1] = GetRandomId();
    353             data->rotation = 0;
    354 
    355             Resolve();
    356         }
    357         break;
    358     }
    359246    }
    360247
     
    374261    {
    375262    case GAME_HUNT:
    376         break;
    377     case GAME_FUSION:
    378         Scene::GetDefault()->AddTile((data->icons << 16) | (data->next[0] - 1),
    379                                      350, 400, 11, 0);
    380         Scene::GetDefault()->AddTile((data->icons << 16) | (data->next[1] - 1),
    381                                      380, 400, 11, 0);
    382263        break;
    383264    }
     
    677558}
    678559
    679 int Board::GetRandomId() const
    680 {
    681     int max = data->npieces;
    682 
    683     if (max > data->minnpieces)
    684         max--;
    685 
    686     return 1 + rand() % max;
    687 }
    688 
    689 void Board::Resolve()
    690 {
    691     int list[MAX_PIECES][MAX_PIECES];
    692     int count[MAX_PIECES * MAX_PIECES];
    693 
    694     for (int j = 0; j < data->dim.j; j++)
    695         for (int i = 0; i < data->dim.i; i++)
    696             list[i][j] = -1;
    697     memset(count, 0, sizeof(count));
    698 
    699     int seq = 0, effect = 0;
    700 
    701     /* Count connected tiles */
    702     for (int j = 0; j < data->dim.j; j++) for (int i = 0; i < data->dim.i; i++)
    703     {
    704         if (!data->pairs[i][j].id)
    705             continue;
    706 
    707         if (data->pairs[i][j].id >= data->maxnpieces)
    708             continue;
    709 
    710         if (list[i][j] != -1)
    711             continue;
    712 
    713         list[i][j] = seq;
    714         count[seq] = TagNeighbours(list, i, j);
    715         if (count[seq] >= 3)
    716             effect = 1;
    717         seq++;
    718     }
    719 
    720     /* Only continue if there is an effect */
    721     if (!effect)
    722         return;
    723 
    724     /* Add tiles to a mash; add mash to our list */
    725     Mash *mash = new Mash(data->emitter);
    726     Ticker::Ref(mash);
    727 
    728     for (int j = 0; j < data->dim.j; j++) for (int i = 0; i < data->dim.i; i++)
    729     {
    730         if (list[i][j] == -1)
    731             continue;
    732         if (count[list[i][j]] < 3)
    733             continue;
    734 
    735         mash->AddPiece(data->pairs[i][j].piece);
    736         data->pairs[i][j].piece = NULL;
    737     }
    738 
    739     mash->nextmash = data->mashes;
    740     data->mashes = mash;
    741 
    742     /* Create new pieces where necessary */
    743     for (int j = 0; j < data->dim.j; j++) for (int i = 0; i < data->dim.i; i++)
    744     {
    745         if (list[i][j] == -1)
    746             continue;
    747         if (count[list[i][j]] < 3)
    748         {
    749             if (!data->pairs[i][j].piece)
    750                 data->pairs[i][j].id = 0;
    751             continue;
    752         }
    753 
    754         data->pairs[i][j].id++;
    755         if (data->pairs[i][j].id > data->npieces
    756                 && data->pairs[i][j].id <= data->maxnpieces)
    757         {
    758             data->npieces++;
    759             data->thumbs->SetMax(data->npieces);
    760         }
    761         data->pairs[i][j].piece = new Piece(Piece::PIECE_FUSION,
    762                                             data->emitter, vec2i(i, j),
    763                                             data->pairs[i][j].id);
    764         Ticker::Ref(data->pairs[i][j].piece);
    765         data->pairs[i][j].piece->SetPos(vec2i(i, j) * data->size);
    766         data->thumbs->AddCount(data->pairs[i][j].id, 1);
    767         count[list[i][j]] = 0;
    768         list[i][j] = -1;
    769     }
    770 
    771     /* Move everything down */
    772     for (int j = data->dim.j; j--;) for (int i = 0; i < data->dim.i; i++)
    773     {
    774         if (list[i][j] == -1 || data->pairs[i][j].piece)
    775             continue;
    776 
    777         for (int j2 = j + 1; j2 < data->dim.j; j2++)
    778         {
    779             data->pairs[i][j2 - 1] = data->pairs[i][j2];
    780             if (data->pairs[i][j2 - 1].id)
    781             {
    782                 data->pairs[i][j2 - 1].piece->SetCell(vec2i(i, j2 - 1));
    783                 data->pairs[i][j2 - 1].piece->Move(vec2i(i, j2 - 1) * data->size);
    784             }
    785             list[i][j2 - 1] = list[i][j2];
    786         }
    787 
    788         data->pairs[i][data->dim.j - 1].id = 0;
    789         list[i][data->dim.j - 1] = -1;
    790     }
    791 
    792     /* Start again (FIXME: make this a while() loop) */
    793     Resolve();
    794 }
    795 
    796 int Board::TagNeighbours(int list[MAX_PIECES][MAX_PIECES], int i, int j)
    797 {
    798     vec2i const off[] = { vec2i(-1, 0), vec2i(1, 0), vec2i(0, -1), vec2i(0, 1) };
    799 
    800     int count = 1;
    801 
    802     for (int n = 0; n < 4; n++)
    803     {
    804         int i2 = i + off[n].i;
    805         int j2 = j + off[n].j;
    806 
    807         if (i2 >= 0 && i2 < data->dim.i && j2 >= 0 && j2 < data->dim.j
    808              && data->pairs[i2][j2].id == data->pairs[i][j].id
    809              && list[i2][j2] == -1)
    810         {
    811             list[i2][j2] = list[i][j];
    812             count += TagNeighbours(list, i2, j2);
    813         }
    814     }
    815     return count;
    816 }
    817 
    818560Board::~Board()
    819561{
     
    829571                Ticker::Unref(data->pairs[i][j].piece);
    830572            }
    831         break;
    832     case GAME_FUSION:
    833         for (int j = 0; j < data->dim.j; j++)
    834             for (int i = 0; i < data->dim.i; i++)
    835                 if (data->pairs[i][j].id)
    836                     Ticker::Unref(data->pairs[i][j].piece);
    837         Ticker::Unref(data->current[0].piece);
    838         Ticker::Unref(data->current[1].piece);
    839573        break;
    840574    }
  • trunk/monsterz/board.h

    r746 r759  
    2727    {
    2828        GAME_HUNT,
    29         GAME_FUSION,
    3029    }
    3130    game_t;
     
    4645    int ListMoves(int list[MAX_WIDTH][MAX_HEIGHT]);
    4746
    48     /* Fusion mode */
    49     int GetRandomId() const;
    50     void Resolve();
    51     int TagNeighbours(int list[MAX_PIECES][MAX_PIECES], int i, int j);
    52 
    5347private:
    5448    BoardData *data;
  • trunk/monsterz/interface.cpp

    r752 r759  
    8181            Ticker::Unref(data->title);
    8282            data->title = NULL;
    83             if (0)//rand() & 1)
    84                 data->board = new Board(Board::GAME_FUSION, vec2i(6, 8), 3, 12);
    85             else
    86                 data->board = new Board(Board::GAME_HUNT, vec2i(8, 8), 8, 8);
     83            data->board = new Board(Board::GAME_HUNT, vec2i(8, 8), 8, 8);
    8784            Ticker::Ref(data->board);
    8885            data->state = InterfaceData::GAME;
  • trunk/monsterz/piece.cpp

    r758 r759  
    9696        data->tiler = Tiler::Register(PNG_TILES, data->size, 0, 1.0f);
    9797        data->id = 80 + 20 * id;
    98         break;
    99     case PIECE_FUSION:
    100         data->size = 40;
    101         data->tiler = Tiler::Register(PNG_ELEMENTS, data->size, 0, 1.0f);
    102         data->id = id - 1;
    10398        break;
    10499    }
     
    385380        id += off;
    386381        break;
    387     case PIECE_FUSION:
    388         break;
    389382    }
    390383
  • trunk/monsterz/piece.h

    r737 r759  
    2727    {
    2828        PIECE_HUNT,
    29         PIECE_FUSION,
    3029    }
    3130    piece_t;
Note: See TracChangeset for help on using the changeset viewer.