Mortal Kombat Game ELEC2645

Dependencies:   mbed N5110 ShiftReg Joystick

Committer:
ozy
Date:
Wed Apr 21 22:56:55 2021 +0000
Revision:
6:a1a7dc264fed
Parent:
3:1d99b6ad4f9e
Child:
7:737fb0c3dbef
Code before FighterClass change to GameEngine

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ozy 0:99b49fd71085 1 #include "Fighter.h"
ozy 0:99b49fd71085 2 #include "mbed.h"
ozy 0:99b49fd71085 3
ozy 0:99b49fd71085 4
ozy 0:99b49fd71085 5 Fighter::Fighter() {}
ozy 0:99b49fd71085 6
ozy 3:1d99b6ad4f9e 7 int Fighter::get_x() {
ozy 3:1d99b6ad4f9e 8 return _x;
ozy 3:1d99b6ad4f9e 9 }
ozy 3:1d99b6ad4f9e 10
ozy 3:1d99b6ad4f9e 11 int Fighter::get_y() {
ozy 3:1d99b6ad4f9e 12 return _y;
ozy 3:1d99b6ad4f9e 13 }
ozy 3:1d99b6ad4f9e 14
ozy 3:1d99b6ad4f9e 15 void Fighter::set_x(int x) {
ozy 3:1d99b6ad4f9e 16 _x = x;
ozy 3:1d99b6ad4f9e 17 }
ozy 3:1d99b6ad4f9e 18
ozy 3:1d99b6ad4f9e 19 void Fighter::set_y(int y) {
ozy 3:1d99b6ad4f9e 20 _y = y;
ozy 3:1d99b6ad4f9e 21 }
ozy 3:1d99b6ad4f9e 22
ozy 6:a1a7dc264fed 23 int Fighter::add_x(int x) {
ozy 3:1d99b6ad4f9e 24 _x += x;
ozy 6:a1a7dc264fed 25 return _x;
ozy 3:1d99b6ad4f9e 26 }
ozy 3:1d99b6ad4f9e 27
ozy 6:a1a7dc264fed 28 int Fighter::add_y(int y) {
ozy 3:1d99b6ad4f9e 29 _y += y;
ozy 6:a1a7dc264fed 30 return _y;
ozy 3:1d99b6ad4f9e 31 }
ozy 3:1d99b6ad4f9e 32
ozy 6:a1a7dc264fed 33 // function to move and draw my fighter
ozy 6:a1a7dc264fed 34 void Fighter::draw(N5110 &lcd, DigitalIn &buttonA, DigitalIn &buttonB, DigitalIn &buttonC, DigitalIn &buttonD, AnalogIn &joy_v, AnalogIn &joy_h) {
ozy 0:99b49fd71085 35
ozy 6:a1a7dc264fed 36 // first draw out all the frames of the fighter
ozy 0:99b49fd71085 37 const int standsprite[12][10] = {
ozy 0:99b49fd71085 38 { 0,0,0,0,1,1,0,0,0,0 },
ozy 0:99b49fd71085 39 { 0,0,0,0,1,1,0,0,0,0 },
ozy 0:99b49fd71085 40 { 0,0,1,1,1,1,1,1,0,0 },
ozy 0:99b49fd71085 41 { 0,0,1,0,1,1,0,1,0,0 },
ozy 0:99b49fd71085 42 { 0,1,1,0,1,1,0,1,1,0 },
ozy 0:99b49fd71085 43 { 0,1,0,0,1,1,0,0,1,0 },
ozy 0:99b49fd71085 44 { 0,0,0,1,1,1,1,0,0,0 },
ozy 0:99b49fd71085 45 { 0,0,1,1,0,0,1,1,0,0 },
ozy 0:99b49fd71085 46 { 0,0,1,0,0,0,0,1,0,0 },
ozy 0:99b49fd71085 47 { 0,1,1,0,0,0,0,1,1,0 },
ozy 0:99b49fd71085 48 { 0,1,0,0,0,0,0,0,1,0 },
ozy 0:99b49fd71085 49 { 0,1,0,0,0,0,0,0,1,0 },
ozy 0:99b49fd71085 50 };
ozy 6:a1a7dc264fed 51
ozy 0:99b49fd71085 52 const int run_left[12][10] = {
ozy 0:99b49fd71085 53 { 0,0,1,1,1,0,0,0,0,0 },
ozy 0:99b49fd71085 54 { 0,0,1,1,1,0,0,0,0,0 },
ozy 0:99b49fd71085 55 { 0,0,0,1,1,1,1,0,0,0 },
ozy 0:99b49fd71085 56 { 0,0,1,0,1,1,1,1,0,0 },
ozy 0:99b49fd71085 57 { 1,1,1,0,1,1,0,1,1,0 },
ozy 0:99b49fd71085 58 { 0,0,0,0,1,1,0,0,0,1 },
ozy 0:99b49fd71085 59 { 0,0,0,1,1,1,1,0,0,0 },
ozy 0:99b49fd71085 60 { 0,0,1,1,0,0,1,1,0,0 },
ozy 0:99b49fd71085 61 { 0,1,1,0,0,0,1,1,1,1 },
ozy 0:99b49fd71085 62 { 0,0,1,1,0,0,0,0,0,0 },
ozy 0:99b49fd71085 63 { 0,0,0,1,1,0,0,0,0,0 },
ozy 0:99b49fd71085 64 { 0,0,0,0,1,1,0,0,0,0 },
ozy 0:99b49fd71085 65 };
ozy 6:a1a7dc264fed 66
ozy 6:a1a7dc264fed 67 const int midrun_left[12][10] = {
ozy 0:99b49fd71085 68 { 0,0,1,1,1,0,0,0,0,0 },
ozy 0:99b49fd71085 69 { 0,0,1,1,1,0,0,0,0,0 },
ozy 0:99b49fd71085 70 { 0,0,0,1,1,1,1,0,0,0 },
ozy 0:99b49fd71085 71 { 0,0,1,0,1,1,1,1,0,0 },
ozy 0:99b49fd71085 72 { 1,1,1,0,1,1,0,1,1,0 },
ozy 0:99b49fd71085 73 { 0,0,0,0,1,1,0,0,0,1 },
ozy 0:99b49fd71085 74 { 0,0,0,1,1,1,1,0,0,0 },
ozy 0:99b49fd71085 75 { 0,0,1,1,0,0,1,1,0,0 },
ozy 1:3bdadf6f6dbd 76 { 0,0,0,1,1,1,1,0,0,0 },
ozy 1:3bdadf6f6dbd 77 { 0,0,0,0,1,1,0,0,0,0 },
ozy 1:3bdadf6f6dbd 78 { 0,0,0,0,1,0,1,0,0,0 },
ozy 1:3bdadf6f6dbd 79 { 0,0,0,1,0,0,0,1,0,0 },
ozy 0:99b49fd71085 80 };
ozy 6:a1a7dc264fed 81
ozy 0:99b49fd71085 82 const int run_right[12][10] = {
ozy 0:99b49fd71085 83 { 0,0,0,0,0,1,1,1,0,0 },
ozy 0:99b49fd71085 84 { 0,0,0,0,0,1,1,1,0,0 },
ozy 0:99b49fd71085 85 { 0,0,0,1,1,1,1,0,0,0 },
ozy 0:99b49fd71085 86 { 0,0,1,1,1,1,0,1,0,0 },
ozy 0:99b49fd71085 87 { 0,1,1,0,1,1,0,1,1,1 },
ozy 0:99b49fd71085 88 { 1,0,0,0,1,1,0,0,0,0 },
ozy 0:99b49fd71085 89 { 0,0,0,1,1,1,1,0,0,0 },
ozy 0:99b49fd71085 90 { 0,0,1,1,0,0,1,1,0,0 },
ozy 0:99b49fd71085 91 { 1,1,1,1,0,0,0,1,1,0 },
ozy 0:99b49fd71085 92 { 0,0,0,0,0,0,1,1,0,0 },
ozy 0:99b49fd71085 93 { 0,0,0,0,0,1,1,0,0,0 },
ozy 0:99b49fd71085 94 { 0,0,0,0,1,1,0,0,0,0 },
ozy 0:99b49fd71085 95 };
ozy 0:99b49fd71085 96
ozy 6:a1a7dc264fed 97 const int midrun_right[12][10] = {
ozy 0:99b49fd71085 98 { 0,0,0,0,0,1,1,1,0,0 },
ozy 0:99b49fd71085 99 { 0,0,0,0,0,1,1,1,0,0 },
ozy 0:99b49fd71085 100 { 0,0,0,1,1,1,1,0,0,0 },
ozy 0:99b49fd71085 101 { 0,0,1,1,1,1,0,1,0,0 },
ozy 0:99b49fd71085 102 { 0,1,1,0,1,1,0,1,1,1 },
ozy 0:99b49fd71085 103 { 1,0,0,0,1,1,0,0,0,0 },
ozy 0:99b49fd71085 104 { 0,0,0,1,1,1,1,0,0,0 },
ozy 0:99b49fd71085 105 { 0,0,1,1,0,0,1,1,0,0 },
ozy 0:99b49fd71085 106 { 0,0,0,1,1,1,1,0,0,0 },
ozy 0:99b49fd71085 107 { 0,0,0,0,1,1,0,0,0,0 },
ozy 1:3bdadf6f6dbd 108 { 0,0,0,1,0,1,0,0,0,0 },
ozy 0:99b49fd71085 109 { 0,0,1,0,0,0,1,0,0,0 },
ozy 0:99b49fd71085 110 };
ozy 1:3bdadf6f6dbd 111
ozy 6:a1a7dc264fed 112 const int kick_right[12][10] = {
ozy 0:99b49fd71085 113 { 0,1,1,0,0,0,0,0,0,0 },
ozy 0:99b49fd71085 114 { 0,1,1,0,1,1,0,0,0,0 },
ozy 0:99b49fd71085 115 { 0,0,0,1,1,1,1,0,0,1 },
ozy 0:99b49fd71085 116 { 0,0,1,1,1,0,0,0,1,1 },
ozy 0:99b49fd71085 117 { 0,1,1,1,1,1,1,1,0,0 },
ozy 0:99b49fd71085 118 { 0,1,0,0,1,1,1,0,0,0 },
ozy 0:99b49fd71085 119 { 1,1,0,0,1,1,0,0,0,0 },
ozy 0:99b49fd71085 120 { 0,0,0,0,1,0,0,0,0,0 },
ozy 0:99b49fd71085 121 { 0,0,0,1,1,0,0,0,0,0 },
ozy 0:99b49fd71085 122 { 0,0,0,1,0,0,0,0,0,0 },
ozy 0:99b49fd71085 123 { 0,0,1,1,0,0,0,0,0,0 },
ozy 0:99b49fd71085 124 { 0,0,1,1,0,0,0,0,0,0 },
ozy 0:99b49fd71085 125 };
ozy 6:a1a7dc264fed 126
ozy 6:a1a7dc264fed 127 const int kick_left[12][10] = {
ozy 0:99b49fd71085 128 { 0,0,0,0,0,0,0,1,1,0 },
ozy 0:99b49fd71085 129 { 0,0,0,0,1,1,0,1,1,0 },
ozy 0:99b49fd71085 130 { 1,0,0,1,1,1,1,0,0,0 },
ozy 0:99b49fd71085 131 { 1,1,0,0,0,1,1,1,0,0 },
ozy 0:99b49fd71085 132 { 0,0,1,1,1,1,1,1,1,0 },
ozy 0:99b49fd71085 133 { 0,0,0,1,1,1,0,0,1,0 },
ozy 0:99b49fd71085 134 { 0,0,0,0,1,1,0,0,1,1 },
ozy 0:99b49fd71085 135 { 0,0,0,0,0,1,0,0,0,0 },
ozy 0:99b49fd71085 136 { 0,0,0,0,1,1,0,0,0,0 },
ozy 0:99b49fd71085 137 { 0,0,0,0,1,0,0,0,0,0 },
ozy 0:99b49fd71085 138 { 0,0,0,0,1,1,0,0,0,0 },
ozy 0:99b49fd71085 139 { 0,0,0,0,1,1,0,0,0,0 },
ozy 0:99b49fd71085 140 };
ozy 6:a1a7dc264fed 141
ozy 6:a1a7dc264fed 142 const int punch_right[12][10] = {
ozy 0:99b49fd71085 143 { 0,0,0,0,1,1,0,0,0,1 },
ozy 0:99b49fd71085 144 { 0,0,0,0,1,1,0,0,1,1 },
ozy 0:99b49fd71085 145 { 0,0,1,1,1,1,0,1,1,0 },
ozy 0:99b49fd71085 146 { 0,1,0,0,1,1,1,1,0,0 },
ozy 0:99b49fd71085 147 { 0,1,1,0,1,1,0,0,0,0 },
ozy 0:99b49fd71085 148 { 0,0,0,0,1,1,0,0,0,0 },
ozy 0:99b49fd71085 149 { 0,0,0,1,1,1,1,0,0,0 },
ozy 0:99b49fd71085 150 { 0,0,0,1,0,0,1,1,0,0 },
ozy 0:99b49fd71085 151 { 0,0,1,1,0,0,1,1,0,0 },
ozy 0:99b49fd71085 152 { 0,0,1,0,0,0,1,0,0,0 },
ozy 0:99b49fd71085 153 { 0,1,1,0,0,0,1,0,0,0 },
ozy 0:99b49fd71085 154 { 1,1,0,0,0,1,1,0,0,0 },
ozy 0:99b49fd71085 155 };
ozy 6:a1a7dc264fed 156
ozy 6:a1a7dc264fed 157 const int punch_left[12][10] = {
ozy 0:99b49fd71085 158 { 1,0,0,0,1,1,0,0,0,0 },
ozy 0:99b49fd71085 159 { 1,1,0,0,1,1,0,0,0,0 },
ozy 0:99b49fd71085 160 { 0,1,1,0,1,1,1,1,0,0 },
ozy 0:99b49fd71085 161 { 0,0,1,1,1,1,0,0,1,0 },
ozy 0:99b49fd71085 162 { 0,0,0,0,1,1,0,1,1,0 },
ozy 0:99b49fd71085 163 { 0,0,0,0,1,1,0,0,0,0 },
ozy 0:99b49fd71085 164 { 0,0,0,1,1,1,1,0,0,0 },
ozy 0:99b49fd71085 165 { 0,0,1,1,0,0,1,0,0,0 },
ozy 0:99b49fd71085 166 { 0,0,1,1,0,0,1,1,0,0 },
ozy 0:99b49fd71085 167 { 0,0,0,1,0,0,0,1,0,0 },
ozy 0:99b49fd71085 168 { 0,0,0,1,0,0,0,1,1,0 },
ozy 0:99b49fd71085 169 { 0,0,0,1,1,0,0,0,1,1 },
ozy 0:99b49fd71085 170 };
ozy 6:a1a7dc264fed 171
ozy 0:99b49fd71085 172 const int guard[12][10] = {
ozy 0:99b49fd71085 173 { 0,0,0,0,1,1,0,0,0,0 },
ozy 0:99b49fd71085 174 { 0,0,0,0,1,1,0,0,0,0 },
ozy 0:99b49fd71085 175 { 0,0,0,1,1,1,1,0,0,0 },
ozy 0:99b49fd71085 176 { 0,0,1,0,1,1,0,1,0,0 },
ozy 0:99b49fd71085 177 { 0,0,1,0,1,1,0,1,0,0 },
ozy 0:99b49fd71085 178 { 0,0,0,1,1,1,1,0,0,0 },
ozy 0:99b49fd71085 179 { 0,0,0,0,1,1,0,0,0,0 },
ozy 0:99b49fd71085 180 { 0,0,0,1,1,1,1,0,0,0 },
ozy 0:99b49fd71085 181 { 0,0,1,1,1,1,1,1,0,0 },
ozy 0:99b49fd71085 182 { 0,1,0,0,0,0,0,0,1,0 },
ozy 0:99b49fd71085 183 { 0,1,0,0,0,0,0,0,1,0 },
ozy 0:99b49fd71085 184 { 0,1,0,0,0,0,0,0,1,0 },
ozy 0:99b49fd71085 185 };
ozy 6:a1a7dc264fed 186
ozy 6:a1a7dc264fed 187
ozy 6:a1a7dc264fed 188 // getting joystick coordinates using read() function
ozy 6:a1a7dc264fed 189 // joystick centered at (0.50,0.50) with utmost left at (1.00,0.50) and utmost right being (0.00,0.50)
ozy 6:a1a7dc264fed 190 // read each of the pins
ozy 6:a1a7dc264fed 191 float _x = joy_h.read();
ozy 6:a1a7dc264fed 192 float _y = joy_v.read();
ozy 6:a1a7dc264fed 193 // printf("x = %.2f | y = %.2f \n",x,y);
ozy 6:a1a7dc264fed 194
ozy 6:a1a7dc264fed 195 // get x and y coordinates of fighter
ozy 6:a1a7dc264fed 196 int x_coord = get_x();
ozy 6:a1a7dc264fed 197 int y_coord = get_y();
ozy 6:a1a7dc264fed 198 printf("x = %i, y = %i \n", x_coord, y_coord);
ozy 6:a1a7dc264fed 199
ozy 6:a1a7dc264fed 200 /*
ozy 6:a1a7dc264fed 201 Code idea:
ozy 6:a1a7dc264fed 202 if joystick is not moved , display standing sprite
ozy 6:a1a7dc264fed 203 if joystick is moved right, toggle between runright and midrunright
ozy 6:a1a7dc264fed 204 if joystick is moved left, toggle between runleft and midrunleft
ozy 6:a1a7dc264fed 205 */
ozy 6:a1a7dc264fed 206
ozy 6:a1a7dc264fed 207 if(_x > 0.48 && _x < 0.52) { // joystick not moved - we use ± 0.02 to take account of fluctuation in joystick tolerance and noice on ADC
ozy 6:a1a7dc264fed 208 lcd.drawSprite(x_coord,y_coord,12,10,(int *)standsprite);; // draw standing fighter
ozy 6:a1a7dc264fed 209 lcd.refresh();
ozy 6:a1a7dc264fed 210 wait(0.3);
ozy 6:a1a7dc264fed 211
ozy 6:a1a7dc264fed 212 // Preform kick move if user presses button A
ozy 6:a1a7dc264fed 213 if (buttonA.read() == 1) {
ozy 6:a1a7dc264fed 214 lcd.drawSprite(x_coord,y_coord,12,10,(int *)kick_right); // draw kick on same coordinates as the standing sprite
ozy 6:a1a7dc264fed 215 lcd.refresh();
ozy 6:a1a7dc264fed 216 wait(0.3);
ozy 6:a1a7dc264fed 217 }
ozy 6:a1a7dc264fed 218 // Preform punch move if user presses button B
ozy 6:a1a7dc264fed 219 if (buttonB.read() == 1) {
ozy 6:a1a7dc264fed 220 lcd.drawSprite(x_coord,y_coord,12,10,(int *)punch_right); // draw kick
ozy 6:a1a7dc264fed 221 lcd.refresh();
ozy 6:a1a7dc264fed 222 wait(0.3);
ozy 6:a1a7dc264fed 223 }
ozy 6:a1a7dc264fed 224 // Guard if user presses button C
ozy 6:a1a7dc264fed 225 while (buttonC.read() == 1) {
ozy 6:a1a7dc264fed 226 lcd.drawSprite(x_coord,y_coord,12,10,(int *)guard); // draw guard move frame
ozy 6:a1a7dc264fed 227 lcd.refresh();
ozy 6:a1a7dc264fed 228 wait(0.3);
ozy 6:a1a7dc264fed 229 }
ozy 6:a1a7dc264fed 230 }
ozy 6:a1a7dc264fed 231 else if(_x < 0.48) { // joystick moved to the right
ozy 6:a1a7dc264fed 232 // print the move_right animation, refresh, then print the 2nd move_right animation (toggling animations to create moving legs!)
ozy 6:a1a7dc264fed 233 _x = add_x(5); // increment x position by 5
ozy 6:a1a7dc264fed 234 lcd.drawSprite(x_coord,y_coord,12,10,(int *)run_right);
ozy 6:a1a7dc264fed 235 lcd.refresh();
ozy 6:a1a7dc264fed 236 wait(0.1);
ozy 6:a1a7dc264fed 237 lcd.drawSprite(x_coord,y_coord,12,10,(int *)midrun_right);
ozy 6:a1a7dc264fed 238 lcd.refresh();
ozy 6:a1a7dc264fed 239 wait(0.08);
ozy 6:a1a7dc264fed 240
ozy 6:a1a7dc264fed 241 if (x_coord > 68) { // code to stop fighter moving out of lcd screen
ozy 6:a1a7dc264fed 242 x_coord = add_x(-5);
ozy 6:a1a7dc264fed 243 }
ozy 6:a1a7dc264fed 244 // kick if user presses button A
ozy 6:a1a7dc264fed 245 if (buttonA.read() == 1) {
ozy 6:a1a7dc264fed 246 lcd.drawSprite(x_coord,y_coord,12,10,(int *)kick_right);
ozy 6:a1a7dc264fed 247 lcd.refresh();
ozy 6:a1a7dc264fed 248 wait(0.3);
ozy 6:a1a7dc264fed 249 }
ozy 6:a1a7dc264fed 250 // Preform punch move if user presses button B
ozy 6:a1a7dc264fed 251 if (buttonB.read() == 1) {
ozy 6:a1a7dc264fed 252 lcd.drawSprite(x_coord,y_coord,12,10,(int *)punch_right); // draw punch on same coordinates as the sprite
ozy 6:a1a7dc264fed 253 lcd.refresh();
ozy 6:a1a7dc264fed 254 wait(0.3);
ozy 6:a1a7dc264fed 255 }
ozy 6:a1a7dc264fed 256 // Guard if user presses button C
ozy 6:a1a7dc264fed 257 while (buttonC.read() == 1) { // we use while not if here because user would hold to guard
ozy 6:a1a7dc264fed 258 lcd.drawSprite(x_coord,y_coord,12,10,(int *)guard); // draw kick on same coordinates as the sprite
ozy 6:a1a7dc264fed 259 lcd.refresh();
ozy 6:a1a7dc264fed 260 wait(0.3);
ozy 6:a1a7dc264fed 261 }
ozy 6:a1a7dc264fed 262 }
ozy 6:a1a7dc264fed 263 else if(_x > 0.52) { // joystick moved to the left
ozy 6:a1a7dc264fed 264 _x = add_x(-5); // decrement left by 5
ozy 6:a1a7dc264fed 265 lcd.drawSprite(x_coord,y_coord,12,10,(int *)run_left);
ozy 6:a1a7dc264fed 266 lcd.refresh();
ozy 6:a1a7dc264fed 267 wait(0.1);
ozy 6:a1a7dc264fed 268 lcd.drawSprite(x_coord,y_coord,12,10,(int *)midrun_left);
ozy 6:a1a7dc264fed 269 lcd.refresh();
ozy 6:a1a7dc264fed 270 wait(0.08);
ozy 6:a1a7dc264fed 271
ozy 6:a1a7dc264fed 272 if (x_coord < 3) { // code to stop fighter moving out of lcd screen
ozy 6:a1a7dc264fed 273 x_coord = add_x(5);
ozy 6:a1a7dc264fed 274 }
ozy 6:a1a7dc264fed 275
ozy 6:a1a7dc264fed 276 // kick if user presses button A
ozy 6:a1a7dc264fed 277 if (buttonA.read() == 1) {
ozy 6:a1a7dc264fed 278 lcd.drawSprite(x_coord,y_coord,12,10,(int *)kick_left);
ozy 6:a1a7dc264fed 279 lcd.refresh();
ozy 6:a1a7dc264fed 280 wait(0.3);
ozy 6:a1a7dc264fed 281 }
ozy 6:a1a7dc264fed 282 if (buttonB.read() == 1) {
ozy 6:a1a7dc264fed 283 lcd.drawSprite(x_coord,y_coord,12,10,(int *)punch_left); // draw punch on same coordinates as the sprite
ozy 6:a1a7dc264fed 284 lcd.refresh();
ozy 6:a1a7dc264fed 285 wait(0.3);
ozy 6:a1a7dc264fed 286 }
ozy 6:a1a7dc264fed 287 // Guard if user presses button C
ozy 6:a1a7dc264fed 288 if (buttonC.read() == 1) {
ozy 6:a1a7dc264fed 289 lcd.drawSprite(x_coord,y_coord,12,10,(int *)guard); // draw guard on same coordinates as the sprite
ozy 6:a1a7dc264fed 290 lcd.refresh();
ozy 6:a1a7dc264fed 291 wait(0.3);
ozy 6:a1a7dc264fed 292 }
ozy 6:a1a7dc264fed 293 }
ozy 6:a1a7dc264fed 294
ozy 0:99b49fd71085 295 }
ozy 0:99b49fd71085 296
ozy 0:99b49fd71085 297
ozy 0:99b49fd71085 298
ozy 0:99b49fd71085 299
ozy 0:99b49fd71085 300
ozy 0:99b49fd71085 301