diff options
author | Antoine Cellerier <dionoea@videolan.org> | 2007-06-17 10:02:39 +0000 |
---|---|---|
committer | Antoine Cellerier <dionoea@videolan.org> | 2007-06-17 10:02:39 +0000 |
commit | 0b4b8f0a3749991ef2f65c6eab4eea94890799bb (patch) | |
tree | 79cd2135ddc0369db63629158d83a0a5798ce21b | |
parent | 70fc62c1a106a8402a5e2a8bed6232f012e38e3b (diff) | |
download | rockbox-0b4b8f0a3749991ef2f65c6eab4eea94890799bb.tar.gz rockbox-0b4b8f0a3749991ef2f65c6eab4eea94890799bb.zip |
Fix 2 puzzle levels. Don't lose if no moves are left in puzzle mode, restart the current level. Score handling in puzzle mode is still kind of broken.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13649 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | apps/plugins/jewels.c | 64 |
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); |