summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/plugins/jewels.c64
1 files changed, 49 insertions, 15 deletions
diff --git a/apps/plugins/jewels.c b/apps/plugins/jewels.c
index f91ea384c4..55093b4273 100644
--- a/apps/plugins/jewels.c
+++ b/apps/plugins/jewels.c
@@ -347,20 +347,20 @@ struct puzzle_level puzzle_levels[NUM_PUZZLE_LEVELS] = {
347 {4, 2, PUZZLE_TILE_LEFT} } }, 347 {4, 2, PUZZLE_TILE_LEFT} } },
348 { 6, 2, { {3, 2, PUZZLE_TILE_DOWN}, 348 { 6, 2, { {3, 2, PUZZLE_TILE_DOWN},
349 {4, 4, PUZZLE_TILE_UP} } }, 349 {4, 4, PUZZLE_TILE_UP} } },
350 { 7, 4, { {3, 2, PUZZLE_TILE_LEFT|PUZZLE_TILE_DOWN}, 350 { 7, 4, { {3, 2, PUZZLE_TILE_RIGHT|PUZZLE_TILE_DOWN},
351 {4, 3, PUZZLE_TILE_LEFT|PUZZLE_TILE_UP}, 351 {4, 3, PUZZLE_TILE_LEFT|PUZZLE_TILE_DOWN},
352 {3, 4, PUZZLE_TILE_RIGHT|PUZZLE_TILE_DOWN}, 352 {3, 4, PUZZLE_TILE_RIGHT|PUZZLE_TILE_UP},
353 {4, 4, PUZZLE_TILE_RIGHT|PUZZLE_TILE_UP} } }, 353 {4, 4, PUZZLE_TILE_LEFT|PUZZLE_TILE_UP} } },
354 { 6, 3, { {3, 2, PUZZLE_TILE_DOWN}, 354 { 6, 3, { {3, 2, PUZZLE_TILE_DOWN},
355 {4, 4, PUZZLE_TILE_UP|PUZZLE_TILE_DOWN}, 355 {4, 4, PUZZLE_TILE_UP|PUZZLE_TILE_DOWN},
356 {3, 6, PUZZLE_TILE_UP} } }, 356 {3, 6, PUZZLE_TILE_UP} } },
357 { 7, 3, { {2, 2, PUZZLE_TILE_RIGHT}, 357 { 7, 3, { {2, 2, PUZZLE_TILE_RIGHT},
358 {4, 1, PUZZLE_TILE_LEFT|PUZZLE_TILE_RIGHT}, 358 {4, 1, PUZZLE_TILE_LEFT|PUZZLE_TILE_RIGHT},
359 {5, 4, PUZZLE_TILE_LEFT} } }, 359 {5, 4, PUZZLE_TILE_LEFT} } },
360 { 7, 4, { {3, 0, PUZZLE_TILE_LEFT|PUZZLE_TILE_DOWN}, 360 { 7, 4, { {3, 0, PUZZLE_TILE_RIGHT|PUZZLE_TILE_DOWN},
361 {5, 0, PUZZLE_TILE_LEFT|PUZZLE_TILE_UP}, 361 {5, 0, PUZZLE_TILE_LEFT|PUZZLE_TILE_DOWN},
362 {2, 7, PUZZLE_TILE_RIGHT|PUZZLE_TILE_DOWN}, 362 {2, 7, PUZZLE_TILE_RIGHT|PUZZLE_TILE_UP},
363 {4, 7, PUZZLE_TILE_RIGHT|PUZZLE_TILE_UP} } }, 363 {4, 7, PUZZLE_TILE_LEFT|PUZZLE_TILE_UP} } },
364}; 364};
365 365
366/***************************************************************************** 366/*****************************************************************************
@@ -1152,8 +1152,8 @@ static unsigned int jewels_initlevel(struct game_context* bj) {
1152 jewels_runboard(bj); 1152 jewels_runboard(bj);
1153 tile = puzzle_levels[bj->level-1].tiles; 1153 tile = puzzle_levels[bj->level-1].tiles;
1154 for(i=0; i<puzzle_levels[bj->level-1].num_tiles; i++, tile++) { 1154 for(i=0; i<puzzle_levels[bj->level-1].num_tiles; i++, tile++) {
1155 bj->playboard[tile->y][tile->x].type = MAX_NUM_JEWELS 1155 bj->playboard[tile->y+1][tile->x].type = MAX_NUM_JEWELS
1156 +tile->tile_type; 1156 +tile->tile_type;
1157 } 1157 }
1158 } 1158 }
1159 break; 1159 break;
@@ -1199,6 +1199,12 @@ static unsigned int jewels_nextlevel(struct game_context* bj) {
1199 1199
1200 case GAME_TYPE_PUZZLE: 1200 case GAME_TYPE_PUZZLE:
1201 bj->level++; 1201 bj->level++;
1202 if(bj->level>NUM_PUZZLE_LEVELS) {
1203 rb->splash(HZ*2, "You win!");
1204 bj->level = 1;
1205 } else {
1206 rb->splash(HZ*2, "Level %d", bj->level);
1207 }
1202 break; 1208 break;
1203 } 1209 }
1204 1210
@@ -1560,12 +1566,26 @@ static int jewels_main(struct game_context* bj) {
1560 * setup the board * 1566 * setup the board *
1561 ********************/ 1567 ********************/
1562 bj->score += jewels_initlevel(bj); 1568 bj->score += jewels_initlevel(bj);
1563 if (!jewels_movesavail(bj)) return BJ_LOSE; 1569 if (!jewels_movesavail(bj)) {
1570 switch(bj->type) {
1571 case GAME_TYPE_NORMAL:
1572 return BJ_LOSE;
1573
1574 case GAME_TYPE_PUZZLE:
1575 do {
1576 rb->splash(2*HZ, "No more moves!");
1577 bj->score += jewels_initlevel(bj);
1578 } while(!jewels_movesavail(bj));
1579 break;
1580 }
1581 }
1564 1582
1565 /********************** 1583 /**********************
1566 * play * 1584 * play *
1567 **********************/ 1585 **********************/
1568 while(true) { 1586 while(true) {
1587 int no_movesavail = false;
1588
1569 if(!inmenu) { 1589 if(!inmenu) {
1570 /* refresh the board */ 1590 /* refresh the board */
1571 jewels_drawboard(bj); 1591 jewels_drawboard(bj);
@@ -1623,7 +1643,7 @@ static int jewels_main(struct game_context* bj) {
1623 if(selected) { 1643 if(selected) {
1624 bj->score += jewels_swapjewels(bj, x, y, SWAP_LEFT); 1644 bj->score += jewels_swapjewels(bj, x, y, SWAP_LEFT);
1625 selected = false; 1645 selected = false;
1626 if (!jewels_movesavail(bj)) return BJ_LOSE; 1646 if (!jewels_movesavail(bj)) no_movesavail = true;
1627 } else { 1647 } else {
1628 x = (x+BJ_WIDTH-1)%BJ_WIDTH; 1648 x = (x+BJ_WIDTH-1)%BJ_WIDTH;
1629 } 1649 }
@@ -1636,7 +1656,7 @@ static int jewels_main(struct game_context* bj) {
1636 if(selected) { 1656 if(selected) {
1637 bj->score += jewels_swapjewels(bj, x, y, SWAP_RIGHT); 1657 bj->score += jewels_swapjewels(bj, x, y, SWAP_RIGHT);
1638 selected = false; 1658 selected = false;
1639 if (!jewels_movesavail(bj)) return BJ_LOSE; 1659 if (!jewels_movesavail(bj)) no_movesavail = true;
1640 } else { 1660 } else {
1641 x = (x+1)%BJ_WIDTH; 1661 x = (x+1)%BJ_WIDTH;
1642 } 1662 }
@@ -1651,7 +1671,7 @@ static int jewels_main(struct game_context* bj) {
1651 if(selected) { 1671 if(selected) {
1652 bj->score += jewels_swapjewels(bj, x, y, SWAP_DOWN); 1672 bj->score += jewels_swapjewels(bj, x, y, SWAP_DOWN);
1653 selected = false; 1673 selected = false;
1654 if (!jewels_movesavail(bj)) return BJ_LOSE; 1674 if (!jewels_movesavail(bj)) no_movesavail = true;
1655 } else { 1675 } else {
1656 y = (y+1)%(BJ_HEIGHT-1); 1676 y = (y+1)%(BJ_HEIGHT-1);
1657 } 1677 }
@@ -1666,7 +1686,7 @@ static int jewels_main(struct game_context* bj) {
1666 if(selected) { 1686 if(selected) {
1667 bj->score += jewels_swapjewels(bj, x, y, SWAP_UP); 1687 bj->score += jewels_swapjewels(bj, x, y, SWAP_UP);
1668 selected = false; 1688 selected = false;
1669 if (!jewels_movesavail(bj)) return BJ_LOSE; 1689 if (!jewels_movesavail(bj)) no_movesavail = true;
1670 } else { 1690 } else {
1671 y = (y+(BJ_HEIGHT-1)-1)%(BJ_HEIGHT-1); 1691 y = (y+(BJ_HEIGHT-1)-1)%(BJ_HEIGHT-1);
1672 } 1692 }
@@ -1733,6 +1753,20 @@ static int jewels_main(struct game_context* bj) {
1733 break; 1753 break;
1734 } 1754 }
1735 1755
1756 if (no_movesavail) {
1757 switch(bj->type) {
1758 case GAME_TYPE_NORMAL:
1759 return BJ_LOSE;
1760
1761 case GAME_TYPE_PUZZLE:
1762 do {
1763 rb->splash(2*HZ, "No more moves!");
1764 bj->score += jewels_initlevel(bj);
1765 } while(!jewels_movesavail(bj));
1766 break;
1767 }
1768 }
1769
1736 switch(bj->type) { 1770 switch(bj->type) {
1737 case GAME_TYPE_NORMAL: 1771 case GAME_TYPE_NORMAL:
1738 if(bj->score >= LEVEL_PTS) bj->score = jewels_nextlevel(bj); 1772 if(bj->score >= LEVEL_PTS) bj->score = jewels_nextlevel(bj);