Classic 15 puzzle

Dependencies:   PokittoLib

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?

UserRevisionLine numberNew 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