Classic 15 puzzle
main.c@2:6d5ef2d31e52, 2018-05-15 (annotated)
- Committer:
- HomineLudens
- Date:
- Tue May 15 19:25:51 2018 +0000
- Revision:
- 2:6d5ef2d31e52
- Parent:
- 0:b0c9d3b227f6
Using free graphics with credits in game
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
HomineLudens | 0:b0c9d3b227f6 | 1 | |
HomineLudens | 2:6d5ef2d31e52 | 2 | #include "Pokitto.h" |
HomineLudens | 0:b0c9d3b227f6 | 3 | #include <cstddef> |
HomineLudens | 0:b0c9d3b227f6 | 4 | #include "gfx.h" |
HomineLudens | 0:b0c9d3b227f6 | 5 | #include "math.h" |
HomineLudens | 0:b0c9d3b227f6 | 6 | |
HomineLudens | 0:b0c9d3b227f6 | 7 | #define GRID_COLUMNS 4 |
HomineLudens | 0:b0c9d3b227f6 | 8 | #define GRID_ROWS 4 |
HomineLudens | 0:b0c9d3b227f6 | 9 | #define TILE_SIZE 40 |
HomineLudens | 0:b0c9d3b227f6 | 10 | #define SHUFFLE_MOVES 20 |
HomineLudens | 2:6d5ef2d31e52 | 11 | #define MAX_LEVEL 7 |
HomineLudens | 0:b0c9d3b227f6 | 12 | |
HomineLudens | 0:b0c9d3b227f6 | 13 | Pokitto::Core g; |
HomineLudens | 0:b0c9d3b227f6 | 14 | |
HomineLudens | 0:b0c9d3b227f6 | 15 | uint8_t ShuffleCount=0; |
HomineLudens | 0:b0c9d3b227f6 | 16 | uint16_t PlayerMoves=0; |
HomineLudens | 0:b0c9d3b227f6 | 17 | int8_t LevelActive=0; |
HomineLudens | 0:b0c9d3b227f6 | 18 | int8_t TextColor=7; |
HomineLudens | 0:b0c9d3b227f6 | 19 | bool HighlightNumbers=false; |
HomineLudens | 0:b0c9d3b227f6 | 20 | uint16_t FrameCount=0; |
HomineLudens | 0:b0c9d3b227f6 | 21 | |
HomineLudens | 2:6d5ef2d31e52 | 22 | char *AuthorActive; |
HomineLudens | 2:6d5ef2d31e52 | 23 | |
HomineLudens | 0:b0c9d3b227f6 | 24 | uint16_t Score=0; |
HomineLudens | 0:b0c9d3b227f6 | 25 | |
HomineLudens | 0:b0c9d3b227f6 | 26 | typedef enum |
HomineLudens | 0:b0c9d3b227f6 | 27 | { |
HomineLudens | 0:b0c9d3b227f6 | 28 | Intro, |
HomineLudens | 0:b0c9d3b227f6 | 29 | LoadAndShuffle, |
HomineLudens | 0:b0c9d3b227f6 | 30 | Game, |
HomineLudens | 0:b0c9d3b227f6 | 31 | Menu, |
HomineLudens | 0:b0c9d3b227f6 | 32 | Victory, |
HomineLudens | 0:b0c9d3b227f6 | 33 | Outro, |
HomineLudens | 0:b0c9d3b227f6 | 34 | GameOver |
HomineLudens | 0:b0c9d3b227f6 | 35 | } SSM; |
HomineLudens | 0:b0c9d3b227f6 | 36 | SSM ssm=SSM::Intro; |
HomineLudens | 0:b0c9d3b227f6 | 37 | |
HomineLudens | 0:b0c9d3b227f6 | 38 | struct Tile |
HomineLudens | 0:b0c9d3b227f6 | 39 | { |
HomineLudens | 0:b0c9d3b227f6 | 40 | int8_t val=0; |
HomineLudens | 0:b0c9d3b227f6 | 41 | int8_t c=0; |
HomineLudens | 0:b0c9d3b227f6 | 42 | float xa=0; |
HomineLudens | 0:b0c9d3b227f6 | 43 | float ya=0; |
HomineLudens | 0:b0c9d3b227f6 | 44 | float speed=0; |
HomineLudens | 0:b0c9d3b227f6 | 45 | float dir=0; |
HomineLudens | 0:b0c9d3b227f6 | 46 | }; |
HomineLudens | 0:b0c9d3b227f6 | 47 | Tile tiles[GRID_ROWS][GRID_COLUMNS]; |
HomineLudens | 0:b0c9d3b227f6 | 48 | |
HomineLudens | 0:b0c9d3b227f6 | 49 | const char * Menus[]= {"Back","Title screen","Select level","Shuffle"}; |
HomineLudens | 0:b0c9d3b227f6 | 50 | const uint8_t MenusSize = sizeof(Menus) / sizeof(Menus[0]); |
HomineLudens | 0:b0c9d3b227f6 | 51 | typedef enum |
HomineLudens | 0:b0c9d3b227f6 | 52 | { |
HomineLudens | 0:b0c9d3b227f6 | 53 | Back, |
HomineLudens | 0:b0c9d3b227f6 | 54 | TitleScreen, |
HomineLudens | 0:b0c9d3b227f6 | 55 | SelectLevel, |
HomineLudens | 0:b0c9d3b227f6 | 56 | Shuffle |
HomineLudens | 0:b0c9d3b227f6 | 57 | } MenuItems; |
HomineLudens | 0:b0c9d3b227f6 | 58 | MenuItems menuItem=MenuItems::Back; |
HomineLudens | 0:b0c9d3b227f6 | 59 | |
HomineLudens | 0:b0c9d3b227f6 | 60 | const char * Info = |
HomineLudens | 0:b0c9d3b227f6 | 61 | { |
HomineLudens | 2:6d5ef2d31e52 | 62 | "Pok15 is the remake of the classic 15-puzzle.\r\n" |
HomineLudens | 2:6d5ef2d31e52 | 63 | "Purpose of the game:slide all tiles in order.\r\n" |
HomineLudens | 2:6d5ef2d31e52 | 64 | "Press B to highlight.\r\n" |
HomineLudens | 0:b0c9d3b227f6 | 65 | "\r\n" |
HomineLudens | 0:b0c9d3b227f6 | 66 | "Have fun." |
HomineLudens | 0:b0c9d3b227f6 | 67 | }; |
HomineLudens | 0:b0c9d3b227f6 | 68 | |
HomineLudens | 0:b0c9d3b227f6 | 69 | |
HomineLudens | 0:b0c9d3b227f6 | 70 | void InitTiles() |
HomineLudens | 0:b0c9d3b227f6 | 71 | { |
HomineLudens | 0:b0c9d3b227f6 | 72 | int8_t i=0; |
HomineLudens | 0:b0c9d3b227f6 | 73 | for (int8_t r=0; r<GRID_ROWS; r++) |
HomineLudens | 0:b0c9d3b227f6 | 74 | { |
HomineLudens | 0:b0c9d3b227f6 | 75 | for (int8_t c=0; c<GRID_COLUMNS; c++) |
HomineLudens | 0:b0c9d3b227f6 | 76 | { |
HomineLudens | 0:b0c9d3b227f6 | 77 | tiles[r][c].val=i; |
HomineLudens | 0:b0c9d3b227f6 | 78 | tiles[r][c].c=i; |
HomineLudens | 0:b0c9d3b227f6 | 79 | tiles[r][c].xa=0; |
HomineLudens | 0:b0c9d3b227f6 | 80 | tiles[r][c].ya=0; |
HomineLudens | 0:b0c9d3b227f6 | 81 | tiles[r][c].speed=random(10,20); |
HomineLudens | 0:b0c9d3b227f6 | 82 | tiles[r][c].dir=random(0,2*PI); |
HomineLudens | 0:b0c9d3b227f6 | 83 | i++; |
HomineLudens | 0:b0c9d3b227f6 | 84 | } |
HomineLudens | 0:b0c9d3b227f6 | 85 | } |
HomineLudens | 0:b0c9d3b227f6 | 86 | } |
HomineLudens | 0:b0c9d3b227f6 | 87 | |
HomineLudens | 0:b0c9d3b227f6 | 88 | |
HomineLudens | 0:b0c9d3b227f6 | 89 | //This kind of magic thanks to @Pherap the C++ Guru |
HomineLudens | 0:b0c9d3b227f6 | 90 | template<std::size_t numberOfFrames, std::size_t frameSize> |
HomineLudens | 0:b0c9d3b227f6 | 91 | void DrawTiles(const uint16_t * palette, const uint8_t (&images)[numberOfFrames][frameSize],bool drawBorder,bool drawNumbers,bool highlightNumbers, bool drawFull ) |
HomineLudens | 0:b0c9d3b227f6 | 92 | { |
HomineLudens | 0:b0c9d3b227f6 | 93 | int x=0; |
HomineLudens | 0:b0c9d3b227f6 | 94 | int y=0; |
HomineLudens | 0:b0c9d3b227f6 | 95 | |
HomineLudens | 0:b0c9d3b227f6 | 96 | //Load/reload palette |
HomineLudens | 0:b0c9d3b227f6 | 97 | g.display.load565Palette(palette); |
HomineLudens | 0:b0c9d3b227f6 | 98 | |
HomineLudens | 0:b0c9d3b227f6 | 99 | //Center on screen |
HomineLudens | 0:b0c9d3b227f6 | 100 | int xo = (g.display.width - (TILE_SIZE*GRID_COLUMNS))/2; |
HomineLudens | 0:b0c9d3b227f6 | 101 | int yo = (g.display.height - (TILE_SIZE*GRID_ROWS))-4; |
HomineLudens | 0:b0c9d3b227f6 | 102 | |
HomineLudens | 0:b0c9d3b227f6 | 103 | for (int8_t r=0; r<GRID_ROWS; r++) |
HomineLudens | 0:b0c9d3b227f6 | 104 | { |
HomineLudens | 0:b0c9d3b227f6 | 105 | for (int8_t c=0; c<GRID_COLUMNS; c++) |
HomineLudens | 0:b0c9d3b227f6 | 106 | { |
HomineLudens | 0:b0c9d3b227f6 | 107 | if(drawFull || tiles[r][c].val!=15 ) |
HomineLudens | 0:b0c9d3b227f6 | 108 | { |
HomineLudens | 0:b0c9d3b227f6 | 109 | x=c*TILE_SIZE+tiles[r][c].xa; |
HomineLudens | 0:b0c9d3b227f6 | 110 | y=r*TILE_SIZE+tiles[r][c].ya; |
HomineLudens | 0:b0c9d3b227f6 | 111 | |
HomineLudens | 0:b0c9d3b227f6 | 112 | //Draw flat tile |
HomineLudens | 0:b0c9d3b227f6 | 113 | g.display.setColor(tiles[r][c].c); |
HomineLudens | 0:b0c9d3b227f6 | 114 | //g.display.fillRect(xo+x,yo+y,TILE_SIZE,TILE_SIZE); |
HomineLudens | 0:b0c9d3b227f6 | 115 | |
HomineLudens | 0:b0c9d3b227f6 | 116 | //Draw image |
HomineLudens | 0:b0c9d3b227f6 | 117 | g.display.drawBitmap(xo+x,yo+y,images[tiles[r][c].val]); |
HomineLudens | 0:b0c9d3b227f6 | 118 | |
HomineLudens | 0:b0c9d3b227f6 | 119 | if(drawBorder) |
HomineLudens | 0:b0c9d3b227f6 | 120 | { |
HomineLudens | 0:b0c9d3b227f6 | 121 | //Draw border |
HomineLudens | 0:b0c9d3b227f6 | 122 | g.display.setColor(7); |
HomineLudens | 0:b0c9d3b227f6 | 123 | g.display.drawRect(xo+x,yo+y,TILE_SIZE,TILE_SIZE); |
HomineLudens | 0:b0c9d3b227f6 | 124 | } |
HomineLudens | 0:b0c9d3b227f6 | 125 | |
HomineLudens | 0:b0c9d3b227f6 | 126 | if(drawNumbers) |
HomineLudens | 0:b0c9d3b227f6 | 127 | { |
HomineLudens | 0:b0c9d3b227f6 | 128 | //Draw number of the tile1 |
HomineLudens | 0:b0c9d3b227f6 | 129 | if(highlightNumbers) |
HomineLudens | 0:b0c9d3b227f6 | 130 | g.display.setInvisibleColor(255); |
HomineLudens | 0:b0c9d3b227f6 | 131 | |
HomineLudens | 0:b0c9d3b227f6 | 132 | |
HomineLudens | 0:b0c9d3b227f6 | 133 | g.display.setColor(TextColor,0); |
HomineLudens | 0:b0c9d3b227f6 | 134 | |
HomineLudens | 0:b0c9d3b227f6 | 135 | g.display.print(xo+x+1/2+ (g.display.fontWidth/2), |
HomineLudens | 0:b0c9d3b227f6 | 136 | yo+y+1/2+(g.display.fontHeight/2), |
HomineLudens | 0:b0c9d3b227f6 | 137 | tiles[r][c].val+1);//val + 1 |
HomineLudens | 0:b0c9d3b227f6 | 138 | g.display.setColor(0,0); |
HomineLudens | 0:b0c9d3b227f6 | 139 | g.display.setInvisibleColor(0); |
HomineLudens | 0:b0c9d3b227f6 | 140 | } |
HomineLudens | 0:b0c9d3b227f6 | 141 | } |
HomineLudens | 0:b0c9d3b227f6 | 142 | } |
HomineLudens | 0:b0c9d3b227f6 | 143 | } |
HomineLudens | 0:b0c9d3b227f6 | 144 | } |
HomineLudens | 0:b0c9d3b227f6 | 145 | |
HomineLudens | 0:b0c9d3b227f6 | 146 | template <typename T> T |
HomineLudens | 0:b0c9d3b227f6 | 147 | ClampVal(const T& value, const T& low, const T& high) |
HomineLudens | 0:b0c9d3b227f6 | 148 | { |
HomineLudens | 0:b0c9d3b227f6 | 149 | return value < low ? low : (value > high ? high : value); |
HomineLudens | 0:b0c9d3b227f6 | 150 | } |
HomineLudens | 0:b0c9d3b227f6 | 151 | |
HomineLudens | 0:b0c9d3b227f6 | 152 | bool SwapTiles(int8_t fx,int8_t fy,int8_t tx,int8_t ty) |
HomineLudens | 0:b0c9d3b227f6 | 153 | { |
HomineLudens | 0:b0c9d3b227f6 | 154 | //Verify if allowed |
HomineLudens | 0:b0c9d3b227f6 | 155 | if(tx>=0 && ty>=0 && tx<GRID_COLUMNS && ty<GRID_ROWS) |
HomineLudens | 0:b0c9d3b227f6 | 156 | { |
HomineLudens | 0:b0c9d3b227f6 | 157 | Tile f=tiles[fx][fy]; |
HomineLudens | 0:b0c9d3b227f6 | 158 | Tile t=tiles[tx][ty]; |
HomineLudens | 0:b0c9d3b227f6 | 159 | |
HomineLudens | 0:b0c9d3b227f6 | 160 | tiles[tx][ty]=f; |
HomineLudens | 0:b0c9d3b227f6 | 161 | tiles[fx][fy]=t; |
HomineLudens | 0:b0c9d3b227f6 | 162 | return true; |
HomineLudens | 0:b0c9d3b227f6 | 163 | } |
HomineLudens | 0:b0c9d3b227f6 | 164 | return false; |
HomineLudens | 0:b0c9d3b227f6 | 165 | } |
HomineLudens | 0:b0c9d3b227f6 | 166 | |
HomineLudens | 0:b0c9d3b227f6 | 167 | bool MoveTiles(int8_t dx,int8_t dy) |
HomineLudens | 0:b0c9d3b227f6 | 168 | { |
HomineLudens | 0:b0c9d3b227f6 | 169 | //Find movable tile |
HomineLudens | 0:b0c9d3b227f6 | 170 | int8_t re=0; |
HomineLudens | 0:b0c9d3b227f6 | 171 | int8_t ce=0; |
HomineLudens | 0:b0c9d3b227f6 | 172 | for (int8_t r=0; r<GRID_ROWS; r++) |
HomineLudens | 0:b0c9d3b227f6 | 173 | { |
HomineLudens | 0:b0c9d3b227f6 | 174 | for (int8_t c=0; c<GRID_COLUMNS; c++) |
HomineLudens | 0:b0c9d3b227f6 | 175 | { |
HomineLudens | 0:b0c9d3b227f6 | 176 | //found |
HomineLudens | 0:b0c9d3b227f6 | 177 | if(tiles[r][c].val==15) |
HomineLudens | 0:b0c9d3b227f6 | 178 | { |
HomineLudens | 0:b0c9d3b227f6 | 179 | re=r; |
HomineLudens | 0:b0c9d3b227f6 | 180 | ce=c; |
HomineLudens | 0:b0c9d3b227f6 | 181 | break; |
HomineLudens | 0:b0c9d3b227f6 | 182 | } |
HomineLudens | 0:b0c9d3b227f6 | 183 | } |
HomineLudens | 0:b0c9d3b227f6 | 184 | } |
HomineLudens | 0:b0c9d3b227f6 | 185 | return SwapTiles(re,ce,re+dx,ce+dy); |
HomineLudens | 0:b0c9d3b227f6 | 186 | } |
HomineLudens | 0:b0c9d3b227f6 | 187 | |
HomineLudens | 0:b0c9d3b227f6 | 188 | void ShuffleTiles() |
HomineLudens | 0:b0c9d3b227f6 | 189 | { |
HomineLudens | 0:b0c9d3b227f6 | 190 | bool moved=false; |
HomineLudens | 0:b0c9d3b227f6 | 191 | do |
HomineLudens | 0:b0c9d3b227f6 | 192 | { |
HomineLudens | 0:b0c9d3b227f6 | 193 | switch (random(0,4)) |
HomineLudens | 0:b0c9d3b227f6 | 194 | { |
HomineLudens | 0:b0c9d3b227f6 | 195 | case 0: |
HomineLudens | 0:b0c9d3b227f6 | 196 | moved=MoveTiles(1,0); |
HomineLudens | 0:b0c9d3b227f6 | 197 | break; |
HomineLudens | 0:b0c9d3b227f6 | 198 | case 1: |
HomineLudens | 0:b0c9d3b227f6 | 199 | moved=MoveTiles(-1,0); |
HomineLudens | 0:b0c9d3b227f6 | 200 | break; |
HomineLudens | 0:b0c9d3b227f6 | 201 | case 2: |
HomineLudens | 0:b0c9d3b227f6 | 202 | moved=MoveTiles(0,1); |
HomineLudens | 0:b0c9d3b227f6 | 203 | break; |
HomineLudens | 0:b0c9d3b227f6 | 204 | case 3: |
HomineLudens | 0:b0c9d3b227f6 | 205 | moved=MoveTiles(0,-1); |
HomineLudens | 0:b0c9d3b227f6 | 206 | break; |
HomineLudens | 0:b0c9d3b227f6 | 207 | default: |
HomineLudens | 0:b0c9d3b227f6 | 208 | moved=false; |
HomineLudens | 0:b0c9d3b227f6 | 209 | break; |
HomineLudens | 0:b0c9d3b227f6 | 210 | } |
HomineLudens | 0:b0c9d3b227f6 | 211 | } |
HomineLudens | 0:b0c9d3b227f6 | 212 | while(!moved); |
HomineLudens | 0:b0c9d3b227f6 | 213 | ShuffleCount--; |
HomineLudens | 0:b0c9d3b227f6 | 214 | } |
HomineLudens | 0:b0c9d3b227f6 | 215 | |
HomineLudens | 0:b0c9d3b227f6 | 216 | |
HomineLudens | 0:b0c9d3b227f6 | 217 | bool IsWinning() |
HomineLudens | 0:b0c9d3b227f6 | 218 | { |
HomineLudens | 0:b0c9d3b227f6 | 219 | //During shuffle win is not valid |
HomineLudens | 0:b0c9d3b227f6 | 220 | if(ShuffleCount>0) return false; |
HomineLudens | 0:b0c9d3b227f6 | 221 | |
HomineLudens | 0:b0c9d3b227f6 | 222 | int8_t index=0; |
HomineLudens | 0:b0c9d3b227f6 | 223 | for (int8_t r=0; r<GRID_ROWS; r++) |
HomineLudens | 0:b0c9d3b227f6 | 224 | { |
HomineLudens | 0:b0c9d3b227f6 | 225 | for (int8_t c=0; c<GRID_COLUMNS; c++) |
HomineLudens | 0:b0c9d3b227f6 | 226 | { |
HomineLudens | 0:b0c9d3b227f6 | 227 | //if reach last tile --> Wins! |
HomineLudens | 0:b0c9d3b227f6 | 228 | if (index==15) |
HomineLudens | 0:b0c9d3b227f6 | 229 | { |
HomineLudens | 0:b0c9d3b227f6 | 230 | return true; |
HomineLudens | 0:b0c9d3b227f6 | 231 | } |
HomineLudens | 0:b0c9d3b227f6 | 232 | //If wrong index --> Not Win. |
HomineLudens | 0:b0c9d3b227f6 | 233 | if(tiles[r][c].val!=index) |
HomineLudens | 0:b0c9d3b227f6 | 234 | { |
HomineLudens | 0:b0c9d3b227f6 | 235 | return false; |
HomineLudens | 0:b0c9d3b227f6 | 236 | } |
HomineLudens | 0:b0c9d3b227f6 | 237 | index++; |
HomineLudens | 0:b0c9d3b227f6 | 238 | } |
HomineLudens | 0:b0c9d3b227f6 | 239 | } |
HomineLudens | 0:b0c9d3b227f6 | 240 | } |
HomineLudens | 0:b0c9d3b227f6 | 241 | |
HomineLudens | 0:b0c9d3b227f6 | 242 | bool A_B_Pressed() |
HomineLudens | 0:b0c9d3b227f6 | 243 | { |
HomineLudens | 0:b0c9d3b227f6 | 244 | return g.buttons.pressed(BTN_A) || g.buttons.pressed(BTN_B); |
HomineLudens | 0:b0c9d3b227f6 | 245 | } |
HomineLudens | 0:b0c9d3b227f6 | 246 | |
HomineLudens | 0:b0c9d3b227f6 | 247 | void PlayerInput() |
HomineLudens | 0:b0c9d3b227f6 | 248 | { |
HomineLudens | 0:b0c9d3b227f6 | 249 | //Move on key pressed |
HomineLudens | 0:b0c9d3b227f6 | 250 | bool moved=false; |
HomineLudens | 0:b0c9d3b227f6 | 251 | if(g.buttons.pressed(BTN_UP)) |
HomineLudens | 0:b0c9d3b227f6 | 252 | { |
HomineLudens | 0:b0c9d3b227f6 | 253 | moved=MoveTiles(1,0); |
HomineLudens | 0:b0c9d3b227f6 | 254 | } |
HomineLudens | 0:b0c9d3b227f6 | 255 | if(g.buttons.pressed(BTN_DOWN)) |
HomineLudens | 0:b0c9d3b227f6 | 256 | { |
HomineLudens | 0:b0c9d3b227f6 | 257 | moved=MoveTiles(-1,0); |
HomineLudens | 0:b0c9d3b227f6 | 258 | } |
HomineLudens | 0:b0c9d3b227f6 | 259 | if(g.buttons.pressed(BTN_LEFT)) |
HomineLudens | 0:b0c9d3b227f6 | 260 | { |
HomineLudens | 0:b0c9d3b227f6 | 261 | moved=MoveTiles(0,1); |
HomineLudens | 0:b0c9d3b227f6 | 262 | } |
HomineLudens | 0:b0c9d3b227f6 | 263 | if(g.buttons.pressed(BTN_RIGHT)) |
HomineLudens | 0:b0c9d3b227f6 | 264 | { |
HomineLudens | 0:b0c9d3b227f6 | 265 | moved=MoveTiles(0,-1); |
HomineLudens | 0:b0c9d3b227f6 | 266 | } |
HomineLudens | 0:b0c9d3b227f6 | 267 | //Count valid moves |
HomineLudens | 0:b0c9d3b227f6 | 268 | if(moved) |
HomineLudens | 0:b0c9d3b227f6 | 269 | { |
HomineLudens | 0:b0c9d3b227f6 | 270 | PlayerMoves++; |
HomineLudens | 0:b0c9d3b227f6 | 271 | } |
HomineLudens | 0:b0c9d3b227f6 | 272 | |
HomineLudens | 0:b0c9d3b227f6 | 273 | //Cheat to win |
HomineLudens | 0:b0c9d3b227f6 | 274 | if(g.buttons.upBtn() && g.buttons.aBtn() ) |
HomineLudens | 0:b0c9d3b227f6 | 275 | { |
HomineLudens | 0:b0c9d3b227f6 | 276 | ssm=SSM::Victory; |
HomineLudens | 0:b0c9d3b227f6 | 277 | } |
HomineLudens | 0:b0c9d3b227f6 | 278 | |
HomineLudens | 0:b0c9d3b227f6 | 279 | if(g.buttons.pressed(BTN_B)) |
HomineLudens | 0:b0c9d3b227f6 | 280 | { |
HomineLudens | 0:b0c9d3b227f6 | 281 | HighlightNumbers=!HighlightNumbers; |
HomineLudens | 0:b0c9d3b227f6 | 282 | } |
HomineLudens | 0:b0c9d3b227f6 | 283 | |
HomineLudens | 0:b0c9d3b227f6 | 284 | //Enter Menu |
HomineLudens | 0:b0c9d3b227f6 | 285 | if(g.buttons.cBtn()) |
HomineLudens | 0:b0c9d3b227f6 | 286 | { |
HomineLudens | 0:b0c9d3b227f6 | 287 | menuItem=MenuItems::Back; |
HomineLudens | 0:b0c9d3b227f6 | 288 | ssm=SSM::Menu; |
HomineLudens | 0:b0c9d3b227f6 | 289 | } |
HomineLudens | 0:b0c9d3b227f6 | 290 | } |
HomineLudens | 0:b0c9d3b227f6 | 291 | |
HomineLudens | 0:b0c9d3b227f6 | 292 | void DrawLevel(int level,bool drawBorder,bool drawNumbers,bool highlightNumbers,bool drawFull) |
HomineLudens | 0:b0c9d3b227f6 | 293 | { |
HomineLudens | 0:b0c9d3b227f6 | 294 | switch(level) |
HomineLudens | 0:b0c9d3b227f6 | 295 | { |
HomineLudens | 0:b0c9d3b227f6 | 296 | case 0: |
HomineLudens | 2:6d5ef2d31e52 | 297 | DrawTiles(jonne_pal,jonne,drawBorder,drawNumbers,highlightNumbers,drawFull); |
HomineLudens | 0:b0c9d3b227f6 | 298 | TextColor=7; |
HomineLudens | 2:6d5ef2d31e52 | 299 | AuthorActive="Art by @jonne"; |
HomineLudens | 0:b0c9d3b227f6 | 300 | break; |
HomineLudens | 0:b0c9d3b227f6 | 301 | case 1: |
HomineLudens | 2:6d5ef2d31e52 | 302 | DrawTiles(Vampirics_pal,Vampirics,drawBorder,drawNumbers,highlightNumbers,drawFull); |
HomineLudens | 0:b0c9d3b227f6 | 303 | TextColor=7; |
HomineLudens | 2:6d5ef2d31e52 | 304 | AuthorActive="by Vampirics"; |
HomineLudens | 0:b0c9d3b227f6 | 305 | break; |
HomineLudens | 0:b0c9d3b227f6 | 306 | case 2: |
HomineLudens | 2:6d5ef2d31e52 | 307 | DrawTiles(adekto_pal,adekto,drawBorder,drawNumbers,highlightNumbers,drawFull); |
HomineLudens | 0:b0c9d3b227f6 | 308 | TextColor=7; |
HomineLudens | 2:6d5ef2d31e52 | 309 | AuthorActive="by @adekto"; |
HomineLudens | 0:b0c9d3b227f6 | 310 | break; |
HomineLudens | 0:b0c9d3b227f6 | 311 | case 3: |
HomineLudens | 2:6d5ef2d31e52 | 312 | DrawTiles(JAP_pal,JAP,drawBorder,drawNumbers,highlightNumbers,drawFull); |
HomineLudens | 0:b0c9d3b227f6 | 313 | TextColor=7; |
HomineLudens | 2:6d5ef2d31e52 | 314 | AuthorActive="by JAP"; |
HomineLudens | 0:b0c9d3b227f6 | 315 | break; |
HomineLudens | 0:b0c9d3b227f6 | 316 | case 4: |
HomineLudens | 2:6d5ef2d31e52 | 317 | DrawTiles(lancelot_gao_pal,lancelot_gao,drawBorder,drawNumbers,highlightNumbers,drawFull); |
HomineLudens | 0:b0c9d3b227f6 | 318 | TextColor=7; |
HomineLudens | 2:6d5ef2d31e52 | 319 | AuthorActive="by lancelot_gao"; |
HomineLudens | 0:b0c9d3b227f6 | 320 | break; |
HomineLudens | 0:b0c9d3b227f6 | 321 | case 5: |
HomineLudens | 2:6d5ef2d31e52 | 322 | DrawTiles(jonne2_pal,jonne2,drawBorder,drawNumbers,highlightNumbers,drawFull); |
HomineLudens | 0:b0c9d3b227f6 | 323 | TextColor=7; |
HomineLudens | 2:6d5ef2d31e52 | 324 | AuthorActive="by @jonne"; |
HomineLudens | 0:b0c9d3b227f6 | 325 | break; |
HomineLudens | 0:b0c9d3b227f6 | 326 | case 6: |
HomineLudens | 2:6d5ef2d31e52 | 327 | DrawTiles(buch_pal,buch,drawBorder,drawNumbers,highlightNumbers,drawFull); |
HomineLudens | 0:b0c9d3b227f6 | 328 | TextColor=7; |
HomineLudens | 2:6d5ef2d31e52 | 329 | AuthorActive="by Buch"; |
HomineLudens | 2:6d5ef2d31e52 | 330 | break; |
HomineLudens | 2:6d5ef2d31e52 | 331 | case 7: |
HomineLudens | 2:6d5ef2d31e52 | 332 | DrawTiles(jonne3_pal,jonne3,drawBorder,drawNumbers,highlightNumbers,drawFull); |
HomineLudens | 2:6d5ef2d31e52 | 333 | TextColor=7; |
HomineLudens | 2:6d5ef2d31e52 | 334 | AuthorActive="by @jonne"; |
HomineLudens | 0:b0c9d3b227f6 | 335 | break; |
HomineLudens | 0:b0c9d3b227f6 | 336 | default: |
HomineLudens | 0:b0c9d3b227f6 | 337 | break; |
HomineLudens | 0:b0c9d3b227f6 | 338 | } |
HomineLudens | 0:b0c9d3b227f6 | 339 | } |
HomineLudens | 0:b0c9d3b227f6 | 340 | |
HomineLudens | 0:b0c9d3b227f6 | 341 | void DrawGameGUI() |
HomineLudens | 0:b0c9d3b227f6 | 342 | { |
HomineLudens | 0:b0c9d3b227f6 | 343 | //Draw moves |
HomineLudens | 0:b0c9d3b227f6 | 344 | g.display.color=TextColor; |
HomineLudens | 0:b0c9d3b227f6 | 345 | g.display.setCursor(0,2); |
HomineLudens | 0:b0c9d3b227f6 | 346 | g.display.print("Mov:"); |
HomineLudens | 0:b0c9d3b227f6 | 347 | g.display.print(PlayerMoves); |
HomineLudens | 0:b0c9d3b227f6 | 348 | |
HomineLudens | 0:b0c9d3b227f6 | 349 | //Draw score |
HomineLudens | 0:b0c9d3b227f6 | 350 | g.display.color=TextColor; |
HomineLudens | 0:b0c9d3b227f6 | 351 | g.display.setCursor((g.display.width-(9*g.display.fontWidth))/2,2); |
HomineLudens | 0:b0c9d3b227f6 | 352 | g.display.print("Score:"); |
HomineLudens | 0:b0c9d3b227f6 | 353 | g.display.print(Score); |
HomineLudens | 0:b0c9d3b227f6 | 354 | |
HomineLudens | 0:b0c9d3b227f6 | 355 | //Draw Level |
HomineLudens | 0:b0c9d3b227f6 | 356 | g.display.color=TextColor; |
HomineLudens | 0:b0c9d3b227f6 | 357 | g.display.setCursor(g.display.width-(5*g.display.fontWidth),2); |
HomineLudens | 0:b0c9d3b227f6 | 358 | g.display.print("Lvl:"); |
HomineLudens | 0:b0c9d3b227f6 | 359 | g.display.print(LevelActive+1); |
HomineLudens | 0:b0c9d3b227f6 | 360 | } |
HomineLudens | 0:b0c9d3b227f6 | 361 | |
HomineLudens | 2:6d5ef2d31e52 | 362 | |
HomineLudens | 0:b0c9d3b227f6 | 363 | void PrintCenter(uint8_t x,uint8_t y,char text[],int lenght) |
HomineLudens | 0:b0c9d3b227f6 | 364 | { |
HomineLudens | 0:b0c9d3b227f6 | 365 | g.display.print(x-((lenght*g.display.fontWidth)/2), |
HomineLudens | 0:b0c9d3b227f6 | 366 | y-(g.display.fontHeight/2), |
HomineLudens | 0:b0c9d3b227f6 | 367 | text); |
HomineLudens | 0:b0c9d3b227f6 | 368 | } |
HomineLudens | 0:b0c9d3b227f6 | 369 | |
HomineLudens | 0:b0c9d3b227f6 | 370 | void StateIntro() |
HomineLudens | 0:b0c9d3b227f6 | 371 | { |
HomineLudens | 0:b0c9d3b227f6 | 372 | g.display.load565Palette(Title_pal); |
HomineLudens | 0:b0c9d3b227f6 | 373 | g.display.drawBitmap(0,20,Title); |
HomineLudens | 0:b0c9d3b227f6 | 374 | g.display.color=(FrameCount/3)%15; |
HomineLudens | 0:b0c9d3b227f6 | 375 | PrintCenter(g.display.width/2,10,"POK15",sizeof("POK15")); |
HomineLudens | 0:b0c9d3b227f6 | 376 | |
HomineLudens | 0:b0c9d3b227f6 | 377 | g.display.color=(FrameCount/3)%15; |
HomineLudens | 0:b0c9d3b227f6 | 378 | PrintCenter(g.display.width/2,g.display.height-10,"@HomineLudens",sizeof("@HomineLudens")); |
HomineLudens | 0:b0c9d3b227f6 | 379 | |
HomineLudens | 0:b0c9d3b227f6 | 380 | LevelActive=0; |
HomineLudens | 0:b0c9d3b227f6 | 381 | Score=0; |
HomineLudens | 0:b0c9d3b227f6 | 382 | |
HomineLudens | 0:b0c9d3b227f6 | 383 | if(A_B_Pressed()) |
HomineLudens | 0:b0c9d3b227f6 | 384 | ssm=SSM::LoadAndShuffle; |
HomineLudens | 0:b0c9d3b227f6 | 385 | } |
HomineLudens | 0:b0c9d3b227f6 | 386 | |
HomineLudens | 0:b0c9d3b227f6 | 387 | void StateLoadAndShuffle() |
HomineLudens | 0:b0c9d3b227f6 | 388 | { |
HomineLudens | 0:b0c9d3b227f6 | 389 | InitTiles(); |
HomineLudens | 0:b0c9d3b227f6 | 390 | ShuffleCount=SHUFFLE_MOVES*(LevelActive+1); |
HomineLudens | 0:b0c9d3b227f6 | 391 | PlayerMoves=0; |
HomineLudens | 0:b0c9d3b227f6 | 392 | ssm=SSM::Game; |
HomineLudens | 0:b0c9d3b227f6 | 393 | } |
HomineLudens | 0:b0c9d3b227f6 | 394 | |
HomineLudens | 0:b0c9d3b227f6 | 395 | void StateGame() |
HomineLudens | 0:b0c9d3b227f6 | 396 | { |
HomineLudens | 0:b0c9d3b227f6 | 397 | if(ShuffleCount>0) |
HomineLudens | 0:b0c9d3b227f6 | 398 | { |
HomineLudens | 0:b0c9d3b227f6 | 399 | ShuffleTiles(); |
HomineLudens | 0:b0c9d3b227f6 | 400 | } |
HomineLudens | 0:b0c9d3b227f6 | 401 | else |
HomineLudens | 0:b0c9d3b227f6 | 402 | { |
HomineLudens | 0:b0c9d3b227f6 | 403 | PlayerInput(); |
HomineLudens | 0:b0c9d3b227f6 | 404 | } |
HomineLudens | 0:b0c9d3b227f6 | 405 | DrawLevel(LevelActive,true,true,HighlightNumbers,false); |
HomineLudens | 0:b0c9d3b227f6 | 406 | DrawGameGUI(); |
HomineLudens | 0:b0c9d3b227f6 | 407 | |
HomineLudens | 0:b0c9d3b227f6 | 408 | if(IsWinning()) |
HomineLudens | 0:b0c9d3b227f6 | 409 | { |
HomineLudens | 0:b0c9d3b227f6 | 410 | FrameCount=0; |
HomineLudens | 0:b0c9d3b227f6 | 411 | ssm=SSM::Victory; |
HomineLudens | 0:b0c9d3b227f6 | 412 | } |
HomineLudens | 0:b0c9d3b227f6 | 413 | } |
HomineLudens | 0:b0c9d3b227f6 | 414 | |
HomineLudens | 0:b0c9d3b227f6 | 415 | void StateMenu() |
HomineLudens | 0:b0c9d3b227f6 | 416 | { |
HomineLudens | 0:b0c9d3b227f6 | 417 | //Load palette for menu |
HomineLudens | 0:b0c9d3b227f6 | 418 | g.display.loadRGBPalette(palettePico); |
HomineLudens | 0:b0c9d3b227f6 | 419 | |
HomineLudens | 0:b0c9d3b227f6 | 420 | //User input |
HomineLudens | 0:b0c9d3b227f6 | 421 | if(g.buttons.pressed(BTN_UP)) |
HomineLudens | 0:b0c9d3b227f6 | 422 | { |
HomineLudens | 0:b0c9d3b227f6 | 423 | menuItem=(MenuItems)((int)(menuItem)-1); |
HomineLudens | 0:b0c9d3b227f6 | 424 | } |
HomineLudens | 0:b0c9d3b227f6 | 425 | if(g.buttons.pressed(BTN_DOWN)) |
HomineLudens | 0:b0c9d3b227f6 | 426 | { |
HomineLudens | 0:b0c9d3b227f6 | 427 | menuItem=(MenuItems)((int)(menuItem)+1); |
HomineLudens | 0:b0c9d3b227f6 | 428 | } |
HomineLudens | 0:b0c9d3b227f6 | 429 | menuItem =(MenuItems) ClampVal((int)menuItem,0,MenusSize-1); |
HomineLudens | 0:b0c9d3b227f6 | 430 | |
HomineLudens | 0:b0c9d3b227f6 | 431 | if(menuItem==MenuItems::SelectLevel) |
HomineLudens | 0:b0c9d3b227f6 | 432 | { |
HomineLudens | 0:b0c9d3b227f6 | 433 | if(g.buttons.pressed(BTN_LEFT)) |
HomineLudens | 0:b0c9d3b227f6 | 434 | { |
HomineLudens | 0:b0c9d3b227f6 | 435 | LevelActive--; |
HomineLudens | 0:b0c9d3b227f6 | 436 | } |
HomineLudens | 0:b0c9d3b227f6 | 437 | if(g.buttons.pressed(BTN_RIGHT)) |
HomineLudens | 0:b0c9d3b227f6 | 438 | { |
HomineLudens | 0:b0c9d3b227f6 | 439 | LevelActive++; |
HomineLudens | 0:b0c9d3b227f6 | 440 | } |
HomineLudens | 0:b0c9d3b227f6 | 441 | } |
HomineLudens | 0:b0c9d3b227f6 | 442 | LevelActive = ClampVal((int)LevelActive,0,MAX_LEVEL); |
HomineLudens | 0:b0c9d3b227f6 | 443 | |
HomineLudens | 0:b0c9d3b227f6 | 444 | |
HomineLudens | 0:b0c9d3b227f6 | 445 | g.display.color=8; |
HomineLudens | 0:b0c9d3b227f6 | 446 | g.display.fillRect(10,8+(menuItem)*20,150,10); |
HomineLudens | 0:b0c9d3b227f6 | 447 | |
HomineLudens | 0:b0c9d3b227f6 | 448 | //Draw menu |
HomineLudens | 0:b0c9d3b227f6 | 449 | for(int8_t i=0; i<MenusSize; i++) |
HomineLudens | 0:b0c9d3b227f6 | 450 | { |
HomineLudens | 0:b0c9d3b227f6 | 451 | g.display.color=12; |
HomineLudens | 0:b0c9d3b227f6 | 452 | g.display.print(10,10+(i)*20,Menus[i]); |
HomineLudens | 0:b0c9d3b227f6 | 453 | if(i==MenuItems::SelectLevel) |
HomineLudens | 0:b0c9d3b227f6 | 454 | { |
HomineLudens | 0:b0c9d3b227f6 | 455 | g.display.print(120,10+(i)*20, LevelActive+1); |
HomineLudens | 0:b0c9d3b227f6 | 456 | } |
HomineLudens | 0:b0c9d3b227f6 | 457 | } |
HomineLudens | 0:b0c9d3b227f6 | 458 | |
HomineLudens | 0:b0c9d3b227f6 | 459 | //Info |
HomineLudens | 0:b0c9d3b227f6 | 460 | g.display.print(0,100,Info); |
HomineLudens | 0:b0c9d3b227f6 | 461 | |
HomineLudens | 0:b0c9d3b227f6 | 462 | //Buttons |
HomineLudens | 0:b0c9d3b227f6 | 463 | if(g.buttons.pressed(BTN_A)) |
HomineLudens | 0:b0c9d3b227f6 | 464 | { |
HomineLudens | 0:b0c9d3b227f6 | 465 | switch(menuItem) |
HomineLudens | 0:b0c9d3b227f6 | 466 | { |
HomineLudens | 0:b0c9d3b227f6 | 467 | case MenuItems::Back: |
HomineLudens | 0:b0c9d3b227f6 | 468 | ssm=SSM::Game; |
HomineLudens | 0:b0c9d3b227f6 | 469 | break; |
HomineLudens | 0:b0c9d3b227f6 | 470 | case MenuItems::TitleScreen: |
HomineLudens | 0:b0c9d3b227f6 | 471 | ssm=SSM::Intro; |
HomineLudens | 0:b0c9d3b227f6 | 472 | break; |
HomineLudens | 0:b0c9d3b227f6 | 473 | case MenuItems::SelectLevel: |
HomineLudens | 0:b0c9d3b227f6 | 474 | ssm=SSM::LoadAndShuffle; |
HomineLudens | 0:b0c9d3b227f6 | 475 | break; |
HomineLudens | 0:b0c9d3b227f6 | 476 | case MenuItems::Shuffle: |
HomineLudens | 0:b0c9d3b227f6 | 477 | ssm=SSM::LoadAndShuffle; |
HomineLudens | 0:b0c9d3b227f6 | 478 | break; |
HomineLudens | 0:b0c9d3b227f6 | 479 | } |
HomineLudens | 0:b0c9d3b227f6 | 480 | } |
HomineLudens | 2:6d5ef2d31e52 | 481 | } |
HomineLudens | 0:b0c9d3b227f6 | 482 | |
HomineLudens | 2:6d5ef2d31e52 | 483 | uint16_t StringLenght(char *s) |
HomineLudens | 2:6d5ef2d31e52 | 484 | { |
HomineLudens | 2:6d5ef2d31e52 | 485 | uint16_t l=0; |
HomineLudens | 2:6d5ef2d31e52 | 486 | while(true) |
HomineLudens | 2:6d5ef2d31e52 | 487 | { |
HomineLudens | 2:6d5ef2d31e52 | 488 | if(s[l]==NULL) |
HomineLudens | 2:6d5ef2d31e52 | 489 | return l; |
HomineLudens | 2:6d5ef2d31e52 | 490 | l++; |
HomineLudens | 2:6d5ef2d31e52 | 491 | } |
HomineLudens | 0:b0c9d3b227f6 | 492 | } |
HomineLudens | 0:b0c9d3b227f6 | 493 | |
HomineLudens | 0:b0c9d3b227f6 | 494 | void StateVictory() |
HomineLudens | 0:b0c9d3b227f6 | 495 | { |
HomineLudens | 0:b0c9d3b227f6 | 496 | g.display.clear(); |
HomineLudens | 0:b0c9d3b227f6 | 497 | DrawLevel(LevelActive,false,false,false,true); |
HomineLudens | 2:6d5ef2d31e52 | 498 | |
HomineLudens | 2:6d5ef2d31e52 | 499 | //Draw author |
HomineLudens | 0:b0c9d3b227f6 | 500 | g.display.color=random(15); |
HomineLudens | 2:6d5ef2d31e52 | 501 | g.display.print((g.display.width - strlen(AuthorActive)*g.display.fontWidth)/2 ,0,AuthorActive); |
HomineLudens | 0:b0c9d3b227f6 | 502 | |
HomineLudens | 2:6d5ef2d31e52 | 503 | g.display.color=random(15); |
HomineLudens | 2:6d5ef2d31e52 | 504 | g.display.drawRect(g.display.width/2-80,10,160,160); |
HomineLudens | 2:6d5ef2d31e52 | 505 | |
HomineLudens | 2:6d5ef2d31e52 | 506 | if(A_B_Pressed() || FrameCount>600) |
HomineLudens | 0:b0c9d3b227f6 | 507 | { |
HomineLudens | 0:b0c9d3b227f6 | 508 | Score+=(LevelActive+1)*1000/(PlayerMoves+1); |
HomineLudens | 0:b0c9d3b227f6 | 509 | ssm=SSM::Outro; |
HomineLudens | 0:b0c9d3b227f6 | 510 | } |
HomineLudens | 0:b0c9d3b227f6 | 511 | } |
HomineLudens | 0:b0c9d3b227f6 | 512 | |
HomineLudens | 0:b0c9d3b227f6 | 513 | void StateOutro() |
HomineLudens | 0:b0c9d3b227f6 | 514 | { |
HomineLudens | 0:b0c9d3b227f6 | 515 | g.display.persistence=true; |
HomineLudens | 0:b0c9d3b227f6 | 516 | g.display.setInvisibleColor(255); |
HomineLudens | 0:b0c9d3b227f6 | 517 | |
HomineLudens | 0:b0c9d3b227f6 | 518 | int xo = (g.display.width - (TILE_SIZE*GRID_COLUMNS))/2; |
HomineLudens | 0:b0c9d3b227f6 | 519 | int yo = (g.display.height - (TILE_SIZE*GRID_ROWS))/2; |
HomineLudens | 0:b0c9d3b227f6 | 520 | int x,y; |
HomineLudens | 0:b0c9d3b227f6 | 521 | float dx,dy; |
HomineLudens | 0:b0c9d3b227f6 | 522 | for (int8_t r=0; r<GRID_ROWS; r++) |
HomineLudens | 0:b0c9d3b227f6 | 523 | { |
HomineLudens | 0:b0c9d3b227f6 | 524 | for (int8_t c=0; c<GRID_COLUMNS; c++) |
HomineLudens | 0:b0c9d3b227f6 | 525 | { |
HomineLudens | 0:b0c9d3b227f6 | 526 | //Detect walls to bump |
HomineLudens | 0:b0c9d3b227f6 | 527 | x=xo+c*TILE_SIZE+tiles[r][c].xa; |
HomineLudens | 0:b0c9d3b227f6 | 528 | y=yo+r*TILE_SIZE+tiles[r][c].ya; |
HomineLudens | 0:b0c9d3b227f6 | 529 | if(x<0 || x>g.display.width-TILE_SIZE) |
HomineLudens | 0:b0c9d3b227f6 | 530 | { |
HomineLudens | 0:b0c9d3b227f6 | 531 | tiles[r][c].dir=-tiles[r][c].dir; |
HomineLudens | 0:b0c9d3b227f6 | 532 | } |
HomineLudens | 0:b0c9d3b227f6 | 533 | else if(y<0 || y>g.display.height-TILE_SIZE) |
HomineLudens | 0:b0c9d3b227f6 | 534 | { |
HomineLudens | 0:b0c9d3b227f6 | 535 | tiles[r][c].dir=PI-tiles[r][c].dir; |
HomineLudens | 0:b0c9d3b227f6 | 536 | } |
HomineLudens | 0:b0c9d3b227f6 | 537 | |
HomineLudens | 0:b0c9d3b227f6 | 538 | //Friction |
HomineLudens | 0:b0c9d3b227f6 | 539 | tiles[r][c].speed*=0.99f; |
HomineLudens | 0:b0c9d3b227f6 | 540 | |
HomineLudens | 0:b0c9d3b227f6 | 541 | //Apply forces |
HomineLudens | 0:b0c9d3b227f6 | 542 | dx=tiles[r][c].speed * sin(tiles[r][c].dir); |
HomineLudens | 0:b0c9d3b227f6 | 543 | dy=(tiles[r][c].speed * cos(tiles[r][c].dir))+0.9f; |
HomineLudens | 0:b0c9d3b227f6 | 544 | |
HomineLudens | 0:b0c9d3b227f6 | 545 | //Clamp on walls |
HomineLudens | 0:b0c9d3b227f6 | 546 | if(x<0 && dx<0) dx=0; |
HomineLudens | 0:b0c9d3b227f6 | 547 | if(x>g.display.width-TILE_SIZE && dx>0) dx=0; |
HomineLudens | 0:b0c9d3b227f6 | 548 | if(y<0 && dy<0) dy=0; |
HomineLudens | 0:b0c9d3b227f6 | 549 | if(y>g.display.height-TILE_SIZE && dy>0) dy=0; |
HomineLudens | 0:b0c9d3b227f6 | 550 | |
HomineLudens | 0:b0c9d3b227f6 | 551 | //Apply movement |
HomineLudens | 0:b0c9d3b227f6 | 552 | tiles[r][c].xa+=dx; |
HomineLudens | 0:b0c9d3b227f6 | 553 | tiles[r][c].ya+=dy; |
HomineLudens | 0:b0c9d3b227f6 | 554 | } |
HomineLudens | 0:b0c9d3b227f6 | 555 | } |
HomineLudens | 0:b0c9d3b227f6 | 556 | DrawLevel(LevelActive,true,false,false,true); |
HomineLudens | 0:b0c9d3b227f6 | 557 | |
HomineLudens | 0:b0c9d3b227f6 | 558 | //Draw win sign |
HomineLudens | 0:b0c9d3b227f6 | 559 | g.display.color=random(0); |
HomineLudens | 0:b0c9d3b227f6 | 560 | g.display.fillRect((g.display.width-(g.display.fontWidth*10))/2, |
HomineLudens | 0:b0c9d3b227f6 | 561 | (g.display.height-g.display.fontHeight*3)/2, |
HomineLudens | 0:b0c9d3b227f6 | 562 | g.display.fontWidth*12, |
HomineLudens | 0:b0c9d3b227f6 | 563 | g.display.fontHeight*4); |
HomineLudens | 0:b0c9d3b227f6 | 564 | g.display.color=random(0,15); |
HomineLudens | 0:b0c9d3b227f6 | 565 | g.display.drawRect((g.display.width-(g.display.fontWidth*10))/2, |
HomineLudens | 0:b0c9d3b227f6 | 566 | (g.display.height-g.display.fontHeight*3)/2, |
HomineLudens | 0:b0c9d3b227f6 | 567 | g.display.fontWidth*12, |
HomineLudens | 0:b0c9d3b227f6 | 568 | g.display.fontHeight*4); |
HomineLudens | 0:b0c9d3b227f6 | 569 | g.display.color=random(0,15); |
HomineLudens | 0:b0c9d3b227f6 | 570 | g.display.print((g.display.width-(g.display.fontWidth*7))/2, |
HomineLudens | 0:b0c9d3b227f6 | 571 | (g.display.height-g.display.fontHeight)/2, |
HomineLudens | 2:6d5ef2d31e52 | 572 | "WELL DONE"); |
HomineLudens | 0:b0c9d3b227f6 | 573 | //g.display.color=random(0,15); |
HomineLudens | 0:b0c9d3b227f6 | 574 | g.display.setCursor((g.display.width-(g.display.fontWidth*8))/2, |
HomineLudens | 0:b0c9d3b227f6 | 575 | (g.display.height-g.display.fontHeight)/2+10); |
HomineLudens | 0:b0c9d3b227f6 | 576 | g.display.print("Score:"); |
HomineLudens | 0:b0c9d3b227f6 | 577 | g.display.print(Score); |
HomineLudens | 0:b0c9d3b227f6 | 578 | |
HomineLudens | 0:b0c9d3b227f6 | 579 | if(A_B_Pressed()) |
HomineLudens | 0:b0c9d3b227f6 | 580 | { |
HomineLudens | 0:b0c9d3b227f6 | 581 | g.display.persistence=false; |
HomineLudens | 0:b0c9d3b227f6 | 582 | g.display.setInvisibleColor(0); |
HomineLudens | 0:b0c9d3b227f6 | 583 | LevelActive++; |
HomineLudens | 0:b0c9d3b227f6 | 584 | if(LevelActive<=MAX_LEVEL) |
HomineLudens | 0:b0c9d3b227f6 | 585 | ssm=SSM::LoadAndShuffle; |
HomineLudens | 0:b0c9d3b227f6 | 586 | else |
HomineLudens | 0:b0c9d3b227f6 | 587 | ssm=SSM::GameOver; |
HomineLudens | 0:b0c9d3b227f6 | 588 | } |
HomineLudens | 0:b0c9d3b227f6 | 589 | } |
HomineLudens | 0:b0c9d3b227f6 | 590 | |
HomineLudens | 0:b0c9d3b227f6 | 591 | void StateGameOver() |
HomineLudens | 0:b0c9d3b227f6 | 592 | { |
HomineLudens | 0:b0c9d3b227f6 | 593 | PrintCenter(g.display.width/2,g.display.height/2,"GAME OVER",sizeof("GAME OVER")); |
HomineLudens | 0:b0c9d3b227f6 | 594 | |
HomineLudens | 0:b0c9d3b227f6 | 595 | DrawGameGUI(); |
HomineLudens | 0:b0c9d3b227f6 | 596 | |
HomineLudens | 0:b0c9d3b227f6 | 597 | if(A_B_Pressed()) |
HomineLudens | 0:b0c9d3b227f6 | 598 | { |
HomineLudens | 0:b0c9d3b227f6 | 599 | ssm=SSM::Intro; |
HomineLudens | 0:b0c9d3b227f6 | 600 | } |
HomineLudens | 0:b0c9d3b227f6 | 601 | |
HomineLudens | 0:b0c9d3b227f6 | 602 | if(g.buttons.cBtn()) |
HomineLudens | 0:b0c9d3b227f6 | 603 | { |
HomineLudens | 0:b0c9d3b227f6 | 604 | menuItem=MenuItems::Back; |
HomineLudens | 0:b0c9d3b227f6 | 605 | ssm=SSM::Menu; |
HomineLudens | 0:b0c9d3b227f6 | 606 | } |
HomineLudens | 0:b0c9d3b227f6 | 607 | } |
HomineLudens | 0:b0c9d3b227f6 | 608 | |
HomineLudens | 0:b0c9d3b227f6 | 609 | int main () |
HomineLudens | 0:b0c9d3b227f6 | 610 | { |
HomineLudens | 0:b0c9d3b227f6 | 611 | g.begin(); // start the application |
HomineLudens | 0:b0c9d3b227f6 | 612 | g.setFrameRate(20); |
HomineLudens | 0:b0c9d3b227f6 | 613 | g.display.font = fontC64; |
HomineLudens | 0:b0c9d3b227f6 | 614 | g.display.setInvisibleColor(0); |
HomineLudens | 0:b0c9d3b227f6 | 615 | |
HomineLudens | 0:b0c9d3b227f6 | 616 | while (g.isRunning()) |
HomineLudens | 0:b0c9d3b227f6 | 617 | { |
HomineLudens | 0:b0c9d3b227f6 | 618 | if (g.update()) |
HomineLudens | 0:b0c9d3b227f6 | 619 | { |
HomineLudens | 0:b0c9d3b227f6 | 620 | switch(ssm) |
HomineLudens | 0:b0c9d3b227f6 | 621 | { |
HomineLudens | 0:b0c9d3b227f6 | 622 | case SSM::Intro: |
HomineLudens | 0:b0c9d3b227f6 | 623 | StateIntro(); |
HomineLudens | 0:b0c9d3b227f6 | 624 | break; |
HomineLudens | 0:b0c9d3b227f6 | 625 | case SSM::Menu: |
HomineLudens | 0:b0c9d3b227f6 | 626 | StateMenu(); |
HomineLudens | 0:b0c9d3b227f6 | 627 | break; |
HomineLudens | 0:b0c9d3b227f6 | 628 | case SSM::LoadAndShuffle: |
HomineLudens | 0:b0c9d3b227f6 | 629 | StateLoadAndShuffle(); |
HomineLudens | 0:b0c9d3b227f6 | 630 | break; |
HomineLudens | 0:b0c9d3b227f6 | 631 | case SSM::Game: |
HomineLudens | 0:b0c9d3b227f6 | 632 | StateGame(); |
HomineLudens | 0:b0c9d3b227f6 | 633 | break; |
HomineLudens | 0:b0c9d3b227f6 | 634 | case SSM::Victory: |
HomineLudens | 0:b0c9d3b227f6 | 635 | StateVictory(); |
HomineLudens | 0:b0c9d3b227f6 | 636 | break; |
HomineLudens | 0:b0c9d3b227f6 | 637 | case SSM::Outro: |
HomineLudens | 0:b0c9d3b227f6 | 638 | StateOutro(); |
HomineLudens | 0:b0c9d3b227f6 | 639 | break; |
HomineLudens | 0:b0c9d3b227f6 | 640 | case SSM::GameOver: |
HomineLudens | 0:b0c9d3b227f6 | 641 | StateGameOver(); |
HomineLudens | 0:b0c9d3b227f6 | 642 | break; |
HomineLudens | 0:b0c9d3b227f6 | 643 | default: |
HomineLudens | 0:b0c9d3b227f6 | 644 | break; |
HomineLudens | 0:b0c9d3b227f6 | 645 | } |
HomineLudens | 0:b0c9d3b227f6 | 646 | |
HomineLudens | 0:b0c9d3b227f6 | 647 | FrameCount++; |
HomineLudens | 0:b0c9d3b227f6 | 648 | } |
HomineLudens | 0:b0c9d3b227f6 | 649 | } |
HomineLudens | 0:b0c9d3b227f6 | 650 | return 0; // this is "good programming manners". Program informs it ended without errors |
HomineLudens | 0:b0c9d3b227f6 | 651 | } |
HomineLudens | 0:b0c9d3b227f6 | 652 |