Stick_Runner

Dependencies:   FXOS8700CQ Gamepad N5110 SDFileSystem mbed

Fork of Stick_Runner by Samrudh Sharma

Committer:
el15ss
Date:
Tue May 02 18:42:45 2017 +0000
Revision:
2:98a41609c827
Parent:
1:db9ff66f67c8
Child:
3:0c690f1c04d8
Added SD card functionality

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el15ss 1:db9ff66f67c8 1 /*****************************************************
el15ss 1:db9ff66f67c8 2 Libraries and modules used *
el15ss 1:db9ff66f67c8 3 ******************************************************/
el15ss 0:12cfe63faa6a 4 #include "mbed.h"
el15ss 0:12cfe63faa6a 5 #include "Gamepad.h"
el15ss 0:12cfe63faa6a 6 #include "N5110.h"
el15ss 0:12cfe63faa6a 7 #include "Character.h"
el15ss 0:12cfe63faa6a 8 #include "Obstacles.h"
el15ss 0:12cfe63faa6a 9 #include "Gems.h"
el15ss 2:98a41609c827 10 #include "SDFileSystem.h"
el15ss 2:98a41609c827 11
el15ss 0:12cfe63faa6a 12
el15ss 1:db9ff66f67c8 13 #define No_OBS 8
el15ss 1:db9ff66f67c8 14 #define No_GEMS 4
el15ss 0:12cfe63faa6a 15
el15ss 2:98a41609c827 16 int i,j,counter,highScore;
el15ss 2:98a41609c827 17 char score[50];
el15ss 0:12cfe63faa6a 18
el15ss 1:db9ff66f67c8 19 //Structs
el15ss 0:12cfe63faa6a 20 struct UserInput {
el15ss 0:12cfe63faa6a 21 Direction d;
el15ss 0:12cfe63faa6a 22 float mag;
el15ss 0:12cfe63faa6a 23 };
el15ss 1:db9ff66f67c8 24 /* Class Objects */
el15ss 0:12cfe63faa6a 25 N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11);
el15ss 0:12cfe63faa6a 26 Gamepad pad;
el15ss 0:12cfe63faa6a 27 Character c;
el15ss 1:db9ff66f67c8 28 Obstacles obstacle[No_OBS];
el15ss 1:db9ff66f67c8 29 Gems gems[No_GEMS],g;
el15ss 0:12cfe63faa6a 30
el15ss 2:98a41609c827 31 SDFileSystem sd(PTE3,PTE1,PTE2,PTE4,"sd");
el15ss 2:98a41609c827 32 FILE *file;
el15ss 2:98a41609c827 33
el15ss 0:12cfe63faa6a 34
el15ss 1:db9ff66f67c8 35 /* Function Prototypes */
el15ss 0:12cfe63faa6a 36 void init();
el15ss 0:12cfe63faa6a 37 void update_game(UserInput input);
el15ss 0:12cfe63faa6a 38 void render();
el15ss 0:12cfe63faa6a 39 void welcome();
el15ss 0:12cfe63faa6a 40 void menu();
el15ss 0:12cfe63faa6a 41 void over();
el15ss 0:12cfe63faa6a 42 void Instructions();
el15ss 1:db9ff66f67c8 43
el15ss 1:db9ff66f67c8 44
el15ss 1:db9ff66f67c8 45 /* Functions */
el15ss 1:db9ff66f67c8 46
el15ss 0:12cfe63faa6a 47 int main()
el15ss 0:12cfe63faa6a 48 {
el15ss 1:db9ff66f67c8 49 int fps = 8;
el15ss 0:12cfe63faa6a 50
el15ss 1:db9ff66f67c8 51 /* Intialization */
el15ss 0:12cfe63faa6a 52 init();
el15ss 1:db9ff66f67c8 53
el15ss 1:db9ff66f67c8 54 /* Drawing the intial frame */
el15ss 0:12cfe63faa6a 55 welcome();
el15ss 0:12cfe63faa6a 56 wait(1.0f/fps);
el15ss 0:12cfe63faa6a 57
el15ss 0:12cfe63faa6a 58
el15ss 1:db9ff66f67c8 59
el15ss 1:db9ff66f67c8 60 render();
el15ss 0:12cfe63faa6a 61 wait(1.0f/fps);
el15ss 0:12cfe63faa6a 62
el15ss 1:db9ff66f67c8 63 /* Main game loop to read input, render the display and update the game state */
el15ss 0:12cfe63faa6a 64 // game loop - read input, update the game state and render the display
el15ss 0:12cfe63faa6a 65 while (1) {
el15ss 0:12cfe63faa6a 66
el15ss 2:98a41609c827 67 counter++;
el15ss 0:12cfe63faa6a 68
el15ss 1:db9ff66f67c8 69 c.updateCharacter(pad.get_direction(),pad.get_mag());
el15ss 0:12cfe63faa6a 70 if(pad.check_event(Gamepad::BACK_PRESSED))
el15ss 0:12cfe63faa6a 71 {
el15ss 0:12cfe63faa6a 72 lcd.clear();
el15ss 0:12cfe63faa6a 73 lcd.refresh();
el15ss 1:db9ff66f67c8 74 menu();
el15ss 0:12cfe63faa6a 75 }
el15ss 0:12cfe63faa6a 76
el15ss 1:db9ff66f67c8 77 for(i=0;i<No_OBS;i++)
el15ss 0:12cfe63faa6a 78 {
el15ss 1:db9ff66f67c8 79 obstacle[i].obstacleStatus(obstacle[i].getObstaclePos());
el15ss 0:12cfe63faa6a 80
el15ss 1:db9ff66f67c8 81 if(obstacle[i].getObstacleStatus() == false)
el15ss 0:12cfe63faa6a 82 {
el15ss 0:12cfe63faa6a 83 obstacle[i].init();
el15ss 0:12cfe63faa6a 84 }
el15ss 1:db9ff66f67c8 85 c.characterStatus(obstacle[i].getObstaclePos());
el15ss 2:98a41609c827 86 // obstacle[i].obstacleStatus(c.getCharacterPos());
el15ss 1:db9ff66f67c8 87
el15ss 0:12cfe63faa6a 88 }
el15ss 0:12cfe63faa6a 89
el15ss 0:12cfe63faa6a 90
el15ss 1:db9ff66f67c8 91 for(j=0;j<No_GEMS;j++)
el15ss 0:12cfe63faa6a 92 {
el15ss 1:db9ff66f67c8 93 gems[j].gemStatus(c.getCharacterPos());
el15ss 0:12cfe63faa6a 94
el15ss 1:db9ff66f67c8 95 if(gems[j].getGemStatus() == false)
el15ss 0:12cfe63faa6a 96 {
el15ss 0:12cfe63faa6a 97 gems[j].init();
el15ss 2:98a41609c827 98
el15ss 0:12cfe63faa6a 99 }
el15ss 1:db9ff66f67c8 100
el15ss 1:db9ff66f67c8 101
el15ss 0:12cfe63faa6a 102 }
el15ss 2:98a41609c827 103
el15ss 2:98a41609c827 104 //To make the obstacles and gems move along the screen
el15ss 0:12cfe63faa6a 105 i =0;
el15ss 0:12cfe63faa6a 106
el15ss 1:db9ff66f67c8 107 for(i=0;i<No_OBS;i++)
el15ss 1:db9ff66f67c8 108 {
el15ss 1:db9ff66f67c8 109 obstacle[i].updateObstacle();
el15ss 1:db9ff66f67c8 110 }
el15ss 0:12cfe63faa6a 111
el15ss 0:12cfe63faa6a 112
el15ss 0:12cfe63faa6a 113 j =0;
el15ss 0:12cfe63faa6a 114
el15ss 1:db9ff66f67c8 115 for(j=0;j<No_GEMS;j++)
el15ss 1:db9ff66f67c8 116 {
el15ss 1:db9ff66f67c8 117 gems[j].updateGems();
el15ss 2:98a41609c827 118
el15ss 1:db9ff66f67c8 119 }
el15ss 0:12cfe63faa6a 120
el15ss 0:12cfe63faa6a 121 render();
el15ss 0:12cfe63faa6a 122
el15ss 0:12cfe63faa6a 123 wait(1.0f/fps);
el15ss 0:12cfe63faa6a 124 }
el15ss 0:12cfe63faa6a 125 }
el15ss 0:12cfe63faa6a 126
el15ss 0:12cfe63faa6a 127 void init()
el15ss 0:12cfe63faa6a 128 {
el15ss 2:98a41609c827 129
el15ss 0:12cfe63faa6a 130 lcd.init();
el15ss 0:12cfe63faa6a 131 pad.init();
el15ss 0:12cfe63faa6a 132 c.init();
el15ss 0:12cfe63faa6a 133
el15ss 1:db9ff66f67c8 134 for(i=0;i<No_OBS;i++)
el15ss 1:db9ff66f67c8 135 {
el15ss 1:db9ff66f67c8 136 obstacle[i].init();
el15ss 1:db9ff66f67c8 137 }
el15ss 1:db9ff66f67c8 138
el15ss 1:db9ff66f67c8 139 for(j=0;j<No_GEMS;j++)
el15ss 1:db9ff66f67c8 140 {
el15ss 1:db9ff66f67c8 141 gems[j].init();
el15ss 1:db9ff66f67c8 142 }
el15ss 0:12cfe63faa6a 143
el15ss 0:12cfe63faa6a 144
el15ss 0:12cfe63faa6a 145
el15ss 0:12cfe63faa6a 146 }
el15ss 0:12cfe63faa6a 147
el15ss 0:12cfe63faa6a 148 void render()
el15ss 0:12cfe63faa6a 149 {
el15ss 2:98a41609c827 150
el15ss 0:12cfe63faa6a 151 lcd.clear();
el15ss 1:db9ff66f67c8 152
el15ss 1:db9ff66f67c8 153 if(c.getCharacterStatus())
el15ss 1:db9ff66f67c8 154 {
el15ss 1:db9ff66f67c8 155 c.draw(lcd);
el15ss 1:db9ff66f67c8 156 }
el15ss 2:98a41609c827 157
el15ss 2:98a41609c827 158 if(c.getCharacterStatus() == false)
el15ss 2:98a41609c827 159 {
el15ss 2:98a41609c827 160 over();
el15ss 2:98a41609c827 161 }
el15ss 2:98a41609c827 162
el15ss 2:98a41609c827 163
el15ss 0:12cfe63faa6a 164 //obstacle[i].draw(lcd);
el15ss 0:12cfe63faa6a 165
el15ss 1:db9ff66f67c8 166 for(i=0;i<No_OBS;i++)
el15ss 1:db9ff66f67c8 167 {
el15ss 1:db9ff66f67c8 168 if(obstacle[i].getObstacleStatus())
el15ss 1:db9ff66f67c8 169 {
el15ss 1:db9ff66f67c8 170 obstacle[i].draw(lcd);
el15ss 1:db9ff66f67c8 171 }
el15ss 1:db9ff66f67c8 172 }
el15ss 0:12cfe63faa6a 173
el15ss 1:db9ff66f67c8 174
el15ss 1:db9ff66f67c8 175 for(j=0;j<No_GEMS;j++)
el15ss 1:db9ff66f67c8 176 {
el15ss 1:db9ff66f67c8 177 if(gems[j].getGemStatus())
el15ss 1:db9ff66f67c8 178 {
el15ss 1:db9ff66f67c8 179 gems[j].draw(lcd);
el15ss 1:db9ff66f67c8 180
el15ss 1:db9ff66f67c8 181 }
el15ss 1:db9ff66f67c8 182
el15ss 2:98a41609c827 183 /*else{
el15ss 1:db9ff66f67c8 184 counter++;
el15ss 2:98a41609c827 185 }*/
el15ss 0:12cfe63faa6a 186
el15ss 1:db9ff66f67c8 187 }
el15ss 2:98a41609c827 188
el15ss 1:db9ff66f67c8 189
el15ss 2:98a41609c827 190
el15ss 1:db9ff66f67c8 191
el15ss 1:db9ff66f67c8 192
el15ss 0:12cfe63faa6a 193 lcd.refresh();
el15ss 1:db9ff66f67c8 194
el15ss 0:12cfe63faa6a 195 }
el15ss 0:12cfe63faa6a 196
el15ss 1:db9ff66f67c8 197
el15ss 0:12cfe63faa6a 198 void welcome() {
el15ss 0:12cfe63faa6a 199
el15ss 1:db9ff66f67c8 200
el15ss 1:db9ff66f67c8 201
el15ss 0:12cfe63faa6a 202 lcd.printString("Stick Runner! ",0,1);
el15ss 0:12cfe63faa6a 203 lcd.printString(" Press Start ",0,4);
el15ss 0:12cfe63faa6a 204 lcd.refresh();
el15ss 1:db9ff66f67c8 205 // pad.tone(1500.0,0.5);
el15ss 1:db9ff66f67c8 206 //pad.tone(1500.0,0.5);
el15ss 0:12cfe63faa6a 207
el15ss 0:12cfe63faa6a 208
el15ss 2:98a41609c827 209
el15ss 1:db9ff66f67c8 210 while ( pad.check_event(Gamepad::START_PRESSED) == false)
el15ss 1:db9ff66f67c8 211 {
el15ss 0:12cfe63faa6a 212 pad.leds_on();
el15ss 0:12cfe63faa6a 213 wait(0.1);
el15ss 0:12cfe63faa6a 214 pad.leds_off();
el15ss 0:12cfe63faa6a 215 wait(0.1);
el15ss 0:12cfe63faa6a 216
el15ss 0:12cfe63faa6a 217 }
el15ss 0:12cfe63faa6a 218 menu();
el15ss 0:12cfe63faa6a 219 }
el15ss 0:12cfe63faa6a 220
el15ss 0:12cfe63faa6a 221 void over() {
el15ss 2:98a41609c827 222
el15ss 2:98a41609c827 223 pad.init();
el15ss 2:98a41609c827 224 // lcd.clear();
el15ss 2:98a41609c827 225 sd.mount();
el15ss 2:98a41609c827 226
el15ss 1:db9ff66f67c8 227
el15ss 2:98a41609c827 228 sprintf (score, " Score : %d",counter);
el15ss 2:98a41609c827 229
el15ss 2:98a41609c827 230 lcd.printString(score,0,2);
el15ss 2:98a41609c827 231 lcd.printString("GAME OVER!! ",0,0);
el15ss 2:98a41609c827 232 //lcd.printString(" ",0,1);
el15ss 1:db9ff66f67c8 233
el15ss 2:98a41609c827 234 file = fopen("/sd/scoreFile.txt", "r");
el15ss 2:98a41609c827 235 if(file ==NULL)
el15ss 2:98a41609c827 236 {
el15ss 2:98a41609c827 237 file = fopen("/sd/scoreFile.txt", "w");
el15ss 2:98a41609c827 238 fprintf(file,"%d",counter);
el15ss 2:98a41609c827 239 fclose(file);
el15ss 2:98a41609c827 240 lcd.printString("HIGH SCORE",0,3);
el15ss 2:98a41609c827 241
el15ss 2:98a41609c827 242 }
el15ss 2:98a41609c827 243 else{
el15ss 2:98a41609c827 244 fscanf(file,"%d", &highScore);
el15ss 2:98a41609c827 245 fclose(file);
el15ss 2:98a41609c827 246
el15ss 2:98a41609c827 247 if(counter>highScore)
el15ss 2:98a41609c827 248 {
el15ss 2:98a41609c827 249
el15ss 2:98a41609c827 250 file = fopen("/sd/scoreFile.txt", "w");
el15ss 2:98a41609c827 251 fprintf(file,"%d",counter);
el15ss 2:98a41609c827 252 fclose(file);
el15ss 2:98a41609c827 253 lcd.printString("HIGH SCORE",0,3);
el15ss 2:98a41609c827 254 }
el15ss 2:98a41609c827 255
el15ss 2:98a41609c827 256 }
el15ss 2:98a41609c827 257
el15ss 1:db9ff66f67c8 258
el15ss 0:12cfe63faa6a 259 lcd.printString(" PRESS START ",0,4);
el15ss 0:12cfe63faa6a 260
el15ss 0:12cfe63faa6a 261 lcd.refresh();
el15ss 2:98a41609c827 262 sd.unmount();
el15ss 0:12cfe63faa6a 263
el15ss 2:98a41609c827 264
el15ss 0:12cfe63faa6a 265 while ( pad.check_event(Gamepad::START_PRESSED) == false) {
el15ss 0:12cfe63faa6a 266 pad.leds_on();
el15ss 1:db9ff66f67c8 267 //pad.tone(1000.0,0.5);
el15ss 0:12cfe63faa6a 268 wait(0.1);
el15ss 0:12cfe63faa6a 269 pad.leds_off();
el15ss 1:db9ff66f67c8 270 // pad.tone(1000.0,0.5);
el15ss 0:12cfe63faa6a 271 wait(0.1);
el15ss 0:12cfe63faa6a 272 if( pad.check_event(Gamepad::START_PRESSED)) {
el15ss 0:12cfe63faa6a 273 main();
el15ss 0:12cfe63faa6a 274 wait(1);
el15ss 0:12cfe63faa6a 275 }
el15ss 0:12cfe63faa6a 276 }
el15ss 0:12cfe63faa6a 277
el15ss 0:12cfe63faa6a 278 }
el15ss 0:12cfe63faa6a 279
el15ss 2:98a41609c827 280 void displayHighScore()
el15ss 2:98a41609c827 281 {
el15ss 2:98a41609c827 282 sd.mount();
el15ss 2:98a41609c827 283 lcd.clear();
el15ss 2:98a41609c827 284
el15ss 2:98a41609c827 285
el15ss 2:98a41609c827 286 file = fopen("/sd/scoreFile.txt", "r");
el15ss 2:98a41609c827 287 if(file ==NULL)
el15ss 2:98a41609c827 288 {
el15ss 2:98a41609c827 289 highScore = 0;
el15ss 2:98a41609c827 290
el15ss 2:98a41609c827 291 }
el15ss 2:98a41609c827 292 else{
el15ss 2:98a41609c827 293 fscanf(file,"%d", &highScore);
el15ss 2:98a41609c827 294 fclose(file);
el15ss 2:98a41609c827 295
el15ss 2:98a41609c827 296 }
el15ss 2:98a41609c827 297
el15ss 2:98a41609c827 298 sprintf (score, "High Score : %d",highScore);
el15ss 2:98a41609c827 299
el15ss 2:98a41609c827 300 lcd.printString(score,0,2);
el15ss 2:98a41609c827 301 lcd.printString(" START - reset ",0,4);
el15ss 2:98a41609c827 302 lcd.printString(" BACK - menu ",0,5);
el15ss 2:98a41609c827 303 lcd.refresh();
el15ss 2:98a41609c827 304 sd.unmount();
el15ss 2:98a41609c827 305
el15ss 2:98a41609c827 306 while(1)
el15ss 2:98a41609c827 307 {
el15ss 2:98a41609c827 308 if( pad.check_event(Gamepad::START_PRESSED)) {
el15ss 2:98a41609c827 309 sd.mount();
el15ss 2:98a41609c827 310 file = fopen("/sd/scoreFile.txt", "r");
el15ss 2:98a41609c827 311 if(!file ==NULL)
el15ss 2:98a41609c827 312 {
el15ss 2:98a41609c827 313 fclose(file);
el15ss 2:98a41609c827 314 remove("/sd/scoreFile.txt");
el15ss 2:98a41609c827 315
el15ss 2:98a41609c827 316 }
el15ss 2:98a41609c827 317 sd.unmount();
el15ss 2:98a41609c827 318 displayHighScore();
el15ss 2:98a41609c827 319
el15ss 2:98a41609c827 320 }
el15ss 2:98a41609c827 321
el15ss 2:98a41609c827 322 if( pad.check_event(Gamepad::BACK_PRESSED)) {
el15ss 2:98a41609c827 323 menu();
el15ss 2:98a41609c827 324 }
el15ss 2:98a41609c827 325
el15ss 2:98a41609c827 326 sleep();
el15ss 2:98a41609c827 327
el15ss 2:98a41609c827 328 }
el15ss 2:98a41609c827 329
el15ss 2:98a41609c827 330
el15ss 2:98a41609c827 331 }
el15ss 2:98a41609c827 332
el15ss 0:12cfe63faa6a 333 void menu() {
el15ss 0:12cfe63faa6a 334 int fps =8;
el15ss 0:12cfe63faa6a 335 bool i = true;
el15ss 0:12cfe63faa6a 336 while(i == true)
el15ss 0:12cfe63faa6a 337 {
el15ss 2:98a41609c827 338 lcd.clear();
el15ss 2:98a41609c827 339 lcd.printString(" Menu ",0,0);
el15ss 0:12cfe63faa6a 340 lcd.printString("A)New Game ",0,2);
el15ss 0:12cfe63faa6a 341 lcd.printString("B)Continue ",0,3);
el15ss 0:12cfe63faa6a 342 lcd.printString("X)Instructions ",0,4);
el15ss 2:98a41609c827 343 lcd.printString("Y)High Score ",0,5);
el15ss 0:12cfe63faa6a 344
el15ss 0:12cfe63faa6a 345 lcd.refresh();
el15ss 0:12cfe63faa6a 346
el15ss 0:12cfe63faa6a 347 // wait flashing LEDs until start button is pressed
el15ss 0:12cfe63faa6a 348 if( pad.check_event(Gamepad::A_PRESSED) ) {
el15ss 1:db9ff66f67c8 349 //pad.tone(1000.0,0.5);
el15ss 0:12cfe63faa6a 350 i = false;
el15ss 0:12cfe63faa6a 351 lcd.clear();
el15ss 0:12cfe63faa6a 352 lcd.refresh();
el15ss 1:db9ff66f67c8 353 init();
el15ss 0:12cfe63faa6a 354
el15ss 0:12cfe63faa6a 355 //break;
el15ss 0:12cfe63faa6a 356 }
el15ss 0:12cfe63faa6a 357
el15ss 0:12cfe63faa6a 358 else if( pad.check_event(Gamepad::B_PRESSED) ) {
el15ss 0:12cfe63faa6a 359 //lcd.clear();
el15ss 1:db9ff66f67c8 360 // pad.tone(1000.0,0.5);
el15ss 0:12cfe63faa6a 361 i = false;
el15ss 0:12cfe63faa6a 362 lcd.refresh();
el15ss 0:12cfe63faa6a 363
el15ss 0:12cfe63faa6a 364
el15ss 0:12cfe63faa6a 365 }
el15ss 0:12cfe63faa6a 366
el15ss 0:12cfe63faa6a 367 else if( pad.check_event(Gamepad::X_PRESSED) ) {
el15ss 1:db9ff66f67c8 368 // pad.tone(1000.0,0.5);
el15ss 0:12cfe63faa6a 369 Instructions();
el15ss 2:98a41609c827 370 wait(1.0f/fps);
el15ss 2:98a41609c827 371 i = false;
el15ss 2:98a41609c827 372 }
el15ss 2:98a41609c827 373
el15ss 2:98a41609c827 374 else if( pad.check_event(Gamepad::Y_PRESSED) ) {
el15ss 2:98a41609c827 375 // pad.tone(1000.0,0.5);
el15ss 2:98a41609c827 376 displayHighScore();
el15ss 2:98a41609c827 377 wait(10.0f/fps);
el15ss 0:12cfe63faa6a 378 i = false;
el15ss 0:12cfe63faa6a 379 }
el15ss 0:12cfe63faa6a 380
el15ss 0:12cfe63faa6a 381
el15ss 0:12cfe63faa6a 382 }
el15ss 0:12cfe63faa6a 383 }
el15ss 0:12cfe63faa6a 384
el15ss 0:12cfe63faa6a 385 void Instructions()
el15ss 0:12cfe63faa6a 386 {
el15ss 0:12cfe63faa6a 387 bool i = true;
el15ss 0:12cfe63faa6a 388 lcd.clear();
el15ss 2:98a41609c827 389 lcd.printString("INSTURCTIONS: ",0,0);
el15ss 0:12cfe63faa6a 390 lcd.printString("Collect the ",0,2);
el15ss 2:98a41609c827 391 lcd.printString("gems and dodge ",0,3);
el15ss 2:98a41609c827 392 lcd.printString("the obstacles ",0,4);
el15ss 2:98a41609c827 393 lcd.printString("to get points ",0,5);
el15ss 0:12cfe63faa6a 394 lcd.refresh();
el15ss 0:12cfe63faa6a 395
el15ss 0:12cfe63faa6a 396 while(i == true){
el15ss 0:12cfe63faa6a 397
el15ss 0:12cfe63faa6a 398 if( pad.check_event(Gamepad::BACK_PRESSED) ) {
el15ss 1:db9ff66f67c8 399 //pad.tone(1000.0,0.5);
el15ss 0:12cfe63faa6a 400 i = false;
el15ss 0:12cfe63faa6a 401 menu();
el15ss 0:12cfe63faa6a 402 }
el15ss 0:12cfe63faa6a 403 }
el15ss 0:12cfe63faa6a 404
el15ss 0:12cfe63faa6a 405 }