Snake vs Block Game to be run upon K64F.

Dependencies:   mbed

Committer:
AhmedPlaymaker
Date:
Thu Apr 18 14:03:43 2019 +0000
Revision:
37:ee47699915b8
Parent:
36:dfdd619874ae
Child:
38:30e4e6191762
Added feature that sets the real length to max 10, the virtual length increases upto anything i want, currently 20, I may have second thoughts on this, so may revert commit.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AhmedPlaymaker 7:48ba87cd79b5 1 #include "SnakevsBlock.h"
AhmedPlaymaker 7:48ba87cd79b5 2
AhmedPlaymaker 7:48ba87cd79b5 3 SnakevsBlock::SnakevsBlock()
AhmedPlaymaker 7:48ba87cd79b5 4 {
AhmedPlaymaker 7:48ba87cd79b5 5
AhmedPlaymaker 7:48ba87cd79b5 6 }
AhmedPlaymaker 7:48ba87cd79b5 7
AhmedPlaymaker 7:48ba87cd79b5 8 SnakevsBlock::~SnakevsBlock()
AhmedPlaymaker 7:48ba87cd79b5 9 {
AhmedPlaymaker 7:48ba87cd79b5 10
AhmedPlaymaker 7:48ba87cd79b5 11 }
AhmedPlaymaker 7:48ba87cd79b5 12
AhmedPlaymaker 7:48ba87cd79b5 13 void SnakevsBlock::init()
AhmedPlaymaker 7:48ba87cd79b5 14 {
AhmedPlaymaker 7:48ba87cd79b5 15 //The snake length configuration and all the other initial information passing will be done here
AhmedPlaymaker 12:1e601b176437 16 length = 3;
AhmedPlaymaker 19:05cc9f801468 17 level = 1;
AhmedPlaymaker 12:1e601b176437 18 foodbuff = 0;
AhmedPlaymaker 12:1e601b176437 19 send=0;
AhmedPlaymaker 13:9785f2404045 20 speed = 1;
AhmedPlaymaker 36:dfdd619874ae 21 blockgap = 400;
AhmedPlaymaker 32:3a3bdeffdf62 22 blockbuff = -50;
AhmedPlaymaker 22:ee698f66146f 23 for(int i=0; i<=14; i++) {
AhmedPlaymaker 22:ee698f66146f 24 b[i] = 1;
AhmedPlaymaker 22:ee698f66146f 25 }
AhmedPlaymaker 25:e827f1a8fadc 26 _s.init();
AhmedPlaymaker 25:e827f1a8fadc 27 _f.init();
AhmedPlaymaker 25:e827f1a8fadc 28 _ff.init();
AhmedPlaymaker 25:e827f1a8fadc 29 _fff.init();
AhmedPlaymaker 25:e827f1a8fadc 30 _b.init();
AhmedPlaymaker 7:48ba87cd79b5 31 }
AhmedPlaymaker 7:48ba87cd79b5 32
AhmedPlaymaker 7:48ba87cd79b5 33
AhmedPlaymaker 7:48ba87cd79b5 34
AhmedPlaymaker 7:48ba87cd79b5 35 void SnakevsBlock::read_input(Gamepad &pad)
AhmedPlaymaker 7:48ba87cd79b5 36 {
AhmedPlaymaker 7:48ba87cd79b5 37 _d = pad.get_direction(); //Obtains Direction pushed towards on Joystick.
AhmedPlaymaker 7:48ba87cd79b5 38 _mag = pad.get_mag(); //Obtains Magnitude of Joystick.
AhmedPlaymaker 7:48ba87cd79b5 39 }
AhmedPlaymaker 7:48ba87cd79b5 40
AhmedPlaymaker 27:3b4775a0d0bb 41 void SnakevsBlock::draw(N5110 &lcd, Gamepad &pad) {
AhmedPlaymaker 20:1e6338403427 42 length = _s.draw(pad, lcd, length, level); //Draws the Snake. //Make these snake buffs relative to the snake drops which in turn relate to the game speed
AhmedPlaymaker 9:d1d79d4ee673 43 if(foodbuff >=0) {
AhmedPlaymaker 36:dfdd619874ae 44 _f.draw(lcd, blockbuff); //Draws the first food.
AhmedPlaymaker 9:d1d79d4ee673 45 if(foodbuff >=50) {
AhmedPlaymaker 36:dfdd619874ae 46 _ff.draw(lcd, blockbuff); //Draws the second food.
AhmedPlaymaker 9:d1d79d4ee673 47 if(foodbuff >=80) {
AhmedPlaymaker 36:dfdd619874ae 48 _fff.draw(lcd, blockbuff); //Draws the third food.
AhmedPlaymaker 9:d1d79d4ee673 49 }
AhmedPlaymaker 9:d1d79d4ee673 50 }
AhmedPlaymaker 9:d1d79d4ee673 51 foodbuff +=1;
AhmedPlaymaker 9:d1d79d4ee673 52 }
AhmedPlaymaker 16:7b474f873683 53 if(foodbuff >=8) {
AhmedPlaymaker 36:dfdd619874ae 54 send = _b.draw(lcd, length, blockgap);
AhmedPlaymaker 19:05cc9f801468 55 }
AhmedPlaymaker 36:dfdd619874ae 56 if(foodbuff == 8) {
AhmedPlaymaker 36:dfdd619874ae 57 blockbuff = -11;
AhmedPlaymaker 13:9785f2404045 58 }
AhmedPlaymaker 7:48ba87cd79b5 59 //Code to print length on game screen.
AhmedPlaymaker 7:48ba87cd79b5 60 char bufferscore[14];
AhmedPlaymaker 7:48ba87cd79b5 61 sprintf(bufferscore,"%d",length);
AhmedPlaymaker 25:e827f1a8fadc 62 lcd.printString(bufferscore,1,0);
AhmedPlaymaker 7:48ba87cd79b5 63 }
AhmedPlaymaker 7:48ba87cd79b5 64
AhmedPlaymaker 7:48ba87cd79b5 65
AhmedPlaymaker 33:249cf423fb18 66 int SnakevsBlock::update(Gamepad &pad, SDFileSystem &sd) //Updates objects on screen.
AhmedPlaymaker 7:48ba87cd79b5 67 {
AhmedPlaymaker 18:b391caa5754c 68 CheckSnakeBlockCollision(pad); //Function checks for when the snake collides with any of the blocks.
AhmedPlaymaker 12:1e601b176437 69 CheckSnakeFoodCollision(pad); //Function checks for when the snake collides with it's food.
AhmedPlaymaker 13:9785f2404045 70 CheckSnakeBlockSidesCollision(pad, _d); //Function checks for when the snake collides with any of the blocks' sides.
AhmedPlaymaker 36:dfdd619874ae 71 _s.update(pad.get_direction(), length, speed, b); //_d is the direction of joystick and b controls thew motion of a section of the snake relative to obstruction
AhmedPlaymaker 9:d1d79d4ee673 72 _f.update();
AhmedPlaymaker 9:d1d79d4ee673 73 _ff.update();
AhmedPlaymaker 9:d1d79d4ee673 74 _fff.update();
AhmedPlaymaker 12:1e601b176437 75 _b.update(blocknum, srn, send);
AhmedPlaymaker 19:05cc9f801468 76 blockbuff++;
AhmedPlaymaker 36:dfdd619874ae 77 if(blockbuff == blockgap) { //this makes blockbuff reset every time the new set of blocks appear.
AhmedPlaymaker 36:dfdd619874ae 78 blockbuff = -11;
AhmedPlaymaker 19:05cc9f801468 79 }
AhmedPlaymaker 37:ee47699915b8 80 if(length >= 20) { //to make progressive levels harder
AhmedPlaymaker 33:249cf423fb18 81 if(blockgap>=50) { //to make progressive levels harder
AhmedPlaymaker 33:249cf423fb18 82 blockgap -= 20;
AhmedPlaymaker 33:249cf423fb18 83 }
AhmedPlaymaker 19:05cc9f801468 84 level += 1;
AhmedPlaymaker 33:249cf423fb18 85 _statset.write(level, sd);
AhmedPlaymaker 16:7b474f873683 86 }
AhmedPlaymaker 25:e827f1a8fadc 87 if(pad.check_event(Gamepad::BACK_PRESSED)){ //Waits for Back button to be pressed.
AhmedPlaymaker 25:e827f1a8fadc 88 back = 1;
AhmedPlaymaker 25:e827f1a8fadc 89 //add some warning here and use A as the button to confirm
AhmedPlaymaker 25:e827f1a8fadc 90 SnakevsBlock::init();
AhmedPlaymaker 25:e827f1a8fadc 91 }
AhmedPlaymaker 25:e827f1a8fadc 92 else {
AhmedPlaymaker 25:e827f1a8fadc 93 back = 0;
AhmedPlaymaker 25:e827f1a8fadc 94 }
AhmedPlaymaker 25:e827f1a8fadc 95 return back;
AhmedPlaymaker 7:48ba87cd79b5 96 }
AhmedPlaymaker 7:48ba87cd79b5 97
AhmedPlaymaker 7:48ba87cd79b5 98 void SnakevsBlock::get_pos()
AhmedPlaymaker 7:48ba87cd79b5 99 {
AhmedPlaymaker 9:d1d79d4ee673 100 Vector2D snake_pos = _s.get_pos(length);
AhmedPlaymaker 7:48ba87cd79b5 101 //printf("player pos = %f %f \n", player_pos.x, player_pos.y); //top left of player sprite
AhmedPlaymaker 7:48ba87cd79b5 102 // 81.000000 0.000000 top right
AhmedPlaymaker 7:48ba87cd79b5 103 // 0.000000 0.000000 is top left
AhmedPlaymaker 7:48ba87cd79b5 104 // 81.000000 45.000000 bottom right
AhmedPlaymaker 7:48ba87cd79b5 105 snakex = snake_pos.x;
AhmedPlaymaker 7:48ba87cd79b5 106 snakey = snake_pos.y;
AhmedPlaymaker 7:48ba87cd79b5 107 //printf("snakexy in GAME = %d %d \n", snakex, snakey);
AhmedPlaymaker 7:48ba87cd79b5 108 }
AhmedPlaymaker 7:48ba87cd79b5 109
AhmedPlaymaker 9:d1d79d4ee673 110
AhmedPlaymaker 27:3b4775a0d0bb 111 void SnakevsBlock::CheckSnakeFoodCollision(Gamepad &pad) {
AhmedPlaymaker 32:3a3bdeffdf62 112 //Obtains all required coordinates.
AhmedPlaymaker 32:3a3bdeffdf62 113 Vector2D food_pos[3];
AhmedPlaymaker 32:3a3bdeffdf62 114 food_pos[0] = _f.get_pos();
AhmedPlaymaker 32:3a3bdeffdf62 115 food_pos[1] = _ff.get_pos();
AhmedPlaymaker 32:3a3bdeffdf62 116 food_pos[2] = _fff.get_pos();
AhmedPlaymaker 32:3a3bdeffdf62 117 Vector2D snake_pos = _s.get_pos(length);
AhmedPlaymaker 32:3a3bdeffdf62 118 //If statements check if the snake sprite has collided with any
AhmedPlaymaker 32:3a3bdeffdf62 119 //of the three food sprites, if so then the food location is reset and
AhmedPlaymaker 32:3a3bdeffdf62 120 //length of the snake is increased using the length variable.
AhmedPlaymaker 29:c6358c39a70e 121 for(int y=0; y<=2; y++) { //this loop automatically detects each combination of collision in the y postion
AhmedPlaymaker 29:c6358c39a70e 122 for(int x=0; x<=2; x++) { //this loop automatically detects each combination of collision in the x postion
AhmedPlaymaker 29:c6358c39a70e 123 for(int food_sr=0; food_sr<=2; food_sr++) { //this loop automatically detects which food we are interacting with.
AhmedPlaymaker 29:c6358c39a70e 124 if (
AhmedPlaymaker 29:c6358c39a70e 125 ((snake_pos.y + y == food_pos[food_sr].y) ||
AhmedPlaymaker 29:c6358c39a70e 126 (snake_pos.y + y == food_pos[food_sr].y + 1) ||
AhmedPlaymaker 29:c6358c39a70e 127 (snake_pos.y + y == food_pos[food_sr].y + 2)) &&
AhmedPlaymaker 29:c6358c39a70e 128 ((snake_pos.x + x == food_pos[food_sr].x) ||
AhmedPlaymaker 29:c6358c39a70e 129 (snake_pos.x + x == food_pos[food_sr].x + 1) ||
AhmedPlaymaker 29:c6358c39a70e 130 (snake_pos.x + x == food_pos[food_sr].x + 2))
AhmedPlaymaker 29:c6358c39a70e 131 ) {
AhmedPlaymaker 29:c6358c39a70e 132 //printf("snake feast working \n");
AhmedPlaymaker 29:c6358c39a70e 133 //audio feedback
AhmedPlaymaker 29:c6358c39a70e 134 pad.tone(1000.0,0.1);
AhmedPlaymaker 29:c6358c39a70e 135 food_pos[food_sr].x = rand() % 82;
AhmedPlaymaker 29:c6358c39a70e 136 if((blockbuff>=11)&&(blockbuff<=blockgap-11)) { //this makes sure that the snake food appears seperated from the block
AhmedPlaymaker 29:c6358c39a70e 137 food_pos[food_sr].y = -2;
AhmedPlaymaker 29:c6358c39a70e 138 }
AhmedPlaymaker 29:c6358c39a70e 139 length+=1;
AhmedPlaymaker 29:c6358c39a70e 140 }
AhmedPlaymaker 25:e827f1a8fadc 141 }
AhmedPlaymaker 25:e827f1a8fadc 142 }
AhmedPlaymaker 9:d1d79d4ee673 143 }
AhmedPlaymaker 29:c6358c39a70e 144 _f.set_pos(food_pos[0]);
AhmedPlaymaker 29:c6358c39a70e 145 _ff.set_pos(food_pos[1]);
AhmedPlaymaker 29:c6358c39a70e 146 _fff.set_pos(food_pos[2]);
AhmedPlaymaker 29:c6358c39a70e 147 }
AhmedPlaymaker 12:1e601b176437 148
AhmedPlaymaker 12:1e601b176437 149 void SnakevsBlock::CheckSnakeBlockCollision(Gamepad &pad)
AhmedPlaymaker 12:1e601b176437 150 {
AhmedPlaymaker 12:1e601b176437 151 //Obtains all required coordinates.
AhmedPlaymaker 12:1e601b176437 152 Vector2D b_pos = _b.get_pos();
AhmedPlaymaker 12:1e601b176437 153 int *b_number;
AhmedPlaymaker 12:1e601b176437 154 b_number = _b.get_number();
AhmedPlaymaker 12:1e601b176437 155 Vector2D snake_pos = _s.get_pos(length);
AhmedPlaymaker 12:1e601b176437 156 //If statements check if the snake sprite has collided with any
AhmedPlaymaker 12:1e601b176437 157 //of the blocks which are a maximum of 5, if so then the snake length reduces and the block number reduces
AhmedPlaymaker 12:1e601b176437 158 //the block has to move slower and come down after every 2/3 iterations(dependent on the snake size.(think about this)
AhmedPlaymaker 33:249cf423fb18 159 for(int block=0; block<=83; block+=1) { //this loop automatically detects for each section of block and each combination of collision
AhmedPlaymaker 33:249cf423fb18 160 if ((snake_pos.y == b_pos.y + 10) && (snake_pos.x + 1 == b_pos.x + block)) {
AhmedPlaymaker 33:249cf423fb18 161 //printf("snake collision working \n");
AhmedPlaymaker 33:249cf423fb18 162 //audio feedback
AhmedPlaymaker 33:249cf423fb18 163 if(blocknum > 0) {b_pos.y = 0;} //change this to speed y = 0 when length = 10.
AhmedPlaymaker 33:249cf423fb18 164 srn = CheckBlock(block); //this tells us which of the 5 blocks we are colliding with
AhmedPlaymaker 33:249cf423fb18 165 blocknum = b_number[srn];
AhmedPlaymaker 33:249cf423fb18 166 ImplementCollision(pad);
AhmedPlaymaker 37:ee47699915b8 167 if((length>=10)&&(b_number[srn]>0)) { //this makes the block stop moving down if it's length is more than 10 and still collides.
AhmedPlaymaker 37:ee47699915b8 168 _b.velocity.y = 0;
AhmedPlaymaker 37:ee47699915b8 169 break;//change this so that it collides slower.
AhmedPlaymaker 37:ee47699915b8 170 }
AhmedPlaymaker 37:ee47699915b8 171 else {_b.velocity.y = 1;}
AhmedPlaymaker 33:249cf423fb18 172 }
AhmedPlaymaker 12:1e601b176437 173 }
AhmedPlaymaker 27:3b4775a0d0bb 174 }
AhmedPlaymaker 29:c6358c39a70e 175
AhmedPlaymaker 29:c6358c39a70e 176 int SnakevsBlock::CheckBlock(int block) {
AhmedPlaymaker 29:c6358c39a70e 177 int srn;
AhmedPlaymaker 29:c6358c39a70e 178 if((block>=0)&&(block<=18)) {srn = 0;}
AhmedPlaymaker 29:c6358c39a70e 179 if((block>=19)&&(block<=34)) {srn = 1;}
AhmedPlaymaker 29:c6358c39a70e 180 if((block>=35)&&(block<=50)) {srn = 2;}
AhmedPlaymaker 29:c6358c39a70e 181 if((block>=51)&&(block<=66)) {srn = 3;}
AhmedPlaymaker 29:c6358c39a70e 182 if((block>=67)&&(block<=83)) {srn = 4;}
AhmedPlaymaker 29:c6358c39a70e 183 return srn;
AhmedPlaymaker 29:c6358c39a70e 184 }
AhmedPlaymaker 27:3b4775a0d0bb 185
AhmedPlaymaker 27:3b4775a0d0bb 186 void SnakevsBlock::ImplementCollision(Gamepad &pad) {
AhmedPlaymaker 27:3b4775a0d0bb 187 send=1;
AhmedPlaymaker 27:3b4775a0d0bb 188 blocknum-=1;
AhmedPlaymaker 27:3b4775a0d0bb 189 if(blocknum >= 0) { // to make sure that snake doesn't decrease in length if number on the block is less than 1;
AhmedPlaymaker 27:3b4775a0d0bb 190 length-=1;
AhmedPlaymaker 27:3b4775a0d0bb 191 pad.tone(1000.0,0.1);
AhmedPlaymaker 29:c6358c39a70e 192 wait(0.04);
AhmedPlaymaker 12:1e601b176437 193 }
AhmedPlaymaker 13:9785f2404045 194 }
AhmedPlaymaker 13:9785f2404045 195
AhmedPlaymaker 13:9785f2404045 196 void SnakevsBlock::CheckSnakeBlockSidesCollision(Gamepad &pad, Direction d)
AhmedPlaymaker 13:9785f2404045 197 {
AhmedPlaymaker 26:3495f7b0ede7 198 //Obtains all required coordinates for checking block sides and snake collision.
AhmedPlaymaker 13:9785f2404045 199 Vector2D b_pos = _b.get_pos();
AhmedPlaymaker 24:1c118b071430 200 snake_pos[0] = _s.get_pos(length);
AhmedPlaymaker 24:1c118b071430 201 snake_pos[1] = _s.get_pos_before1(length);
AhmedPlaymaker 24:1c118b071430 202 snake_pos[2] = _s.get_pos_before2(length);
AhmedPlaymaker 24:1c118b071430 203 snake_pos[3] = _s.get_pos_before3(length);
AhmedPlaymaker 24:1c118b071430 204 snake_pos[4] = _s.get_pos_before4(length);
AhmedPlaymaker 24:1c118b071430 205 snake_pos[5] = _s.get_pos_before5(length);
AhmedPlaymaker 24:1c118b071430 206 snake_pos[6] = _s.get_pos_before6(length);
AhmedPlaymaker 24:1c118b071430 207 snake_pos[7] = _s.get_pos_before7(length);
AhmedPlaymaker 24:1c118b071430 208 snake_pos[8] = _s.get_pos_before8(length);
AhmedPlaymaker 24:1c118b071430 209 snake_pos[9] = _s.get_pos_before9(length);
AhmedPlaymaker 37:ee47699915b8 210 /*
AhmedPlaymaker 24:1c118b071430 211 snake_pos[10] = _s.get_pos_before10(length);
AhmedPlaymaker 24:1c118b071430 212 snake_pos[11] = _s.get_pos_before11(length);
AhmedPlaymaker 24:1c118b071430 213 snake_pos[12] = _s.get_pos_before12(length);
AhmedPlaymaker 24:1c118b071430 214 snake_pos[13] = _s.get_pos_before13(length);
AhmedPlaymaker 24:1c118b071430 215 snake_pos[14] = _s.get_pos_before14(length);
AhmedPlaymaker 37:ee47699915b8 216 */
AhmedPlaymaker 13:9785f2404045 217 //If statements check if the snake sprite has collided with any
AhmedPlaymaker 13:9785f2404045 218 //of the blocks' sides and then stop the snake moving in x axis
AhmedPlaymaker 13:9785f2404045 219
AhmedPlaymaker 37:ee47699915b8 220 int _length;
AhmedPlaymaker 37:ee47699915b8 221
AhmedPlaymaker 37:ee47699915b8 222 if(length<=10) {_length = length;} //to stop the snake length virtually at 10 when it goes past it.
AhmedPlaymaker 37:ee47699915b8 223 else {_length = 10;}
AhmedPlaymaker 37:ee47699915b8 224
AhmedPlaymaker 37:ee47699915b8 225 for(int i=0; i<=9; i++) {
AhmedPlaymaker 24:1c118b071430 226 b[i] = 1;
AhmedPlaymaker 24:1c118b071430 227 }
AhmedPlaymaker 23:592345a70329 228
AhmedPlaymaker 37:ee47699915b8 229 for(int i=0; i<=9; i++) { //i checks for all possible collisions with the snake respective to it's length.
AhmedPlaymaker 36:dfdd619874ae 230 for(int b_y_combination=0; b_y_combination<=10; b_y_combination++) {
AhmedPlaymaker 26:3495f7b0ede7 231 if (
AhmedPlaymaker 36:dfdd619874ae 232 (snake_pos[i].y == b_pos.y + b_y_combination) ||
AhmedPlaymaker 36:dfdd619874ae 233 (snake_pos[i].y + 1 == b_pos.y + b_y_combination) ||
AhmedPlaymaker 36:dfdd619874ae 234 (snake_pos[i].y + 2 == b_pos.y + b_y_combination)) {
AhmedPlaymaker 36:dfdd619874ae 235 for(int b_x_combination=2; b_x_combination<=82; b_x_combination+=16) {
AhmedPlaymaker 36:dfdd619874ae 236 //For West side of walls
AhmedPlaymaker 36:dfdd619874ae 237 if(
AhmedPlaymaker 36:dfdd619874ae 238 ((snake_pos[i].x == b_pos.x + b_x_combination+2) || //W
AhmedPlaymaker 37:ee47699915b8 239 (snake_pos[i].x + 1 == b_x_combination+2))&&(d != E)&&(_length > i) //W
AhmedPlaymaker 36:dfdd619874ae 240 ) {
AhmedPlaymaker 36:dfdd619874ae 241 //code makes sure that the colliding part doesn't move in x axis.
AhmedPlaymaker 37:ee47699915b8 242 for(int snake_beed_num=0; snake_beed_num<=10; snake_beed_num++) {
AhmedPlaymaker 37:ee47699915b8 243 if(_length == snake_beed_num + i) {
AhmedPlaymaker 36:dfdd619874ae 244 b[snake_beed_num - 1] = 0;
AhmedPlaymaker 36:dfdd619874ae 245 }
AhmedPlaymaker 26:3495f7b0ede7 246 }
AhmedPlaymaker 25:e827f1a8fadc 247 }
AhmedPlaymaker 36:dfdd619874ae 248
AhmedPlaymaker 36:dfdd619874ae 249 //for East side of walls
AhmedPlaymaker 36:dfdd619874ae 250 else if (
AhmedPlaymaker 36:dfdd619874ae 251 ((snake_pos[i].x + 1 == b_x_combination) || //E
AhmedPlaymaker 37:ee47699915b8 252 (snake_pos[i].x + 2 == b_x_combination))&&(d != W)&&(_length > i) //E
AhmedPlaymaker 36:dfdd619874ae 253 ) {
AhmedPlaymaker 36:dfdd619874ae 254 //code makes sure that the colliding part doesn't move in x axis.
AhmedPlaymaker 37:ee47699915b8 255 for(int snake_beed_num=0; snake_beed_num<=10; snake_beed_num++) {
AhmedPlaymaker 37:ee47699915b8 256 if(_length == snake_beed_num + i) {
AhmedPlaymaker 36:dfdd619874ae 257 b[snake_beed_num - 1] = 0;
AhmedPlaymaker 36:dfdd619874ae 258 }
AhmedPlaymaker 32:3a3bdeffdf62 259 }
AhmedPlaymaker 32:3a3bdeffdf62 260 }
AhmedPlaymaker 26:3495f7b0ede7 261 }
AhmedPlaymaker 25:e827f1a8fadc 262 }
AhmedPlaymaker 24:1c118b071430 263 }
AhmedPlaymaker 15:f4d069da093d 264 }
AhmedPlaymaker 22:ee698f66146f 265 }