![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
Asteroids for MBED game with Bluetooth LE UART Friend Controller, uLCD, speaker, and uSD.
Dependencies: 4DGL-uLCD-SE mbed-rtos mbed
Asteroids for MBED game with Bluetooth LE UART Friend Controller
main.cpp@6:7d1d8945b2f7, 2016-03-12 (annotated)
- Committer:
- agamemaker
- Date:
- Sat Mar 12 17:47:01 2016 +0000
- Revision:
- 6:7d1d8945b2f7
- Parent:
- 5:f41d3bfc6701
- Child:
- 7:ff87ab834590
collisions added
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
agamemaker | 0:16094a49131e | 1 | #include "mbed.h" |
agamemaker | 0:16094a49131e | 2 | #include "rtos.h" |
agamemaker | 0:16094a49131e | 3 | #include "uLCD_4DGL.h" |
agamemaker | 1:0328ad927150 | 4 | #include <math.h> |
agamemaker | 1:0328ad927150 | 5 | #include <list> |
agamemaker | 1:0328ad927150 | 6 | using namespace std; |
agamemaker | 3:14a2729625f6 | 7 | |
agamemaker | 2:332ca4f1a3e3 | 8 | //constants |
agamemaker | 3:14a2729625f6 | 9 | #define ACCEL .5 |
agamemaker | 3:14a2729625f6 | 10 | #define ROTTA .2 |
agamemaker | 5:f41d3bfc6701 | 11 | #define MAXSP 10 |
agamemaker | 3:14a2729625f6 | 12 | |
agamemaker | 2:332ca4f1a3e3 | 13 | //devices |
agamemaker | 5:f41d3bfc6701 | 14 | //DigitalOut myled(LED1); |
agamemaker | 2:332ca4f1a3e3 | 15 | uLCD_4DGL ulcd(p28,p27,p29); |
agamemaker | 5:f41d3bfc6701 | 16 | BusOut myled(LED1,LED2,LED3,LED4); |
agamemaker | 5:f41d3bfc6701 | 17 | Serial blue(p13,p14); |
agamemaker | 5:f41d3bfc6701 | 18 | |
agamemaker | 5:f41d3bfc6701 | 19 | //Globals |
agamemaker | 5:f41d3bfc6701 | 20 | int game_speed = 25; |
agamemaker | 5:f41d3bfc6701 | 21 | bool up = 0; |
agamemaker | 5:f41d3bfc6701 | 22 | bool left = 0; |
agamemaker | 5:f41d3bfc6701 | 23 | bool right = 0; |
agamemaker | 6:7d1d8945b2f7 | 24 | bool stop = 0; |
agamemaker | 5:f41d3bfc6701 | 25 | bool four = 0; |
agamemaker | 5:f41d3bfc6701 | 26 | |
agamemaker | 0:16094a49131e | 27 | |
agamemaker | 0:16094a49131e | 28 | class Movement |
agamemaker | 0:16094a49131e | 29 | { |
agamemaker | 1:0328ad927150 | 30 | public: |
agamemaker | 1:0328ad927150 | 31 | double x_pos; // x position of object |
agamemaker | 1:0328ad927150 | 32 | double y_pos; // |
agamemaker | 1:0328ad927150 | 33 | double x_vel; // x velocity of object |
agamemaker | 1:0328ad927150 | 34 | double y_vel; // |
agamemaker | 1:0328ad927150 | 35 | double angle; // angle of object |
agamemaker | 1:0328ad927150 | 36 | int hit_rad; // hit box radius of object |
agamemaker | 1:0328ad927150 | 37 | bool wrap; |
agamemaker | 1:0328ad927150 | 38 | Movement(double xp,double yp,double xv,double yv,double a,double r,double w); |
agamemaker | 6:7d1d8945b2f7 | 39 | void assign(double xp,double yp,double xv,double yv,double a,double r,double w); |
agamemaker | 6:7d1d8945b2f7 | 40 | //void move(); |
agamemaker | 1:0328ad927150 | 41 | void accelerate(); |
agamemaker | 3:14a2729625f6 | 42 | void turn_left(); |
agamemaker | 3:14a2729625f6 | 43 | void turn_right(); |
agamemaker | 1:0328ad927150 | 44 | |
agamemaker | 0:16094a49131e | 45 | }; |
agamemaker | 0:16094a49131e | 46 | |
agamemaker | 1:0328ad927150 | 47 | Movement::Movement(double xp,double yp,double xv,double yv,double a,double r,double w) |
agamemaker | 1:0328ad927150 | 48 | { |
agamemaker | 1:0328ad927150 | 49 | x_pos = xp; |
agamemaker | 1:0328ad927150 | 50 | y_pos = yp; |
agamemaker | 1:0328ad927150 | 51 | x_vel = xv; |
agamemaker | 1:0328ad927150 | 52 | y_vel = yv; |
agamemaker | 1:0328ad927150 | 53 | angle = a; |
agamemaker | 1:0328ad927150 | 54 | hit_rad = r; |
agamemaker | 1:0328ad927150 | 55 | wrap = w; |
agamemaker | 1:0328ad927150 | 56 | } |
agamemaker | 1:0328ad927150 | 57 | |
agamemaker | 6:7d1d8945b2f7 | 58 | void Movement::assign(double xp,double yp,double xv,double yv,double a,double r,double w) |
agamemaker | 6:7d1d8945b2f7 | 59 | { |
agamemaker | 6:7d1d8945b2f7 | 60 | x_pos = xp; |
agamemaker | 6:7d1d8945b2f7 | 61 | y_pos = yp; |
agamemaker | 6:7d1d8945b2f7 | 62 | x_vel = xv; |
agamemaker | 6:7d1d8945b2f7 | 63 | y_vel = yv; |
agamemaker | 6:7d1d8945b2f7 | 64 | angle = a; |
agamemaker | 6:7d1d8945b2f7 | 65 | hit_rad = r; |
agamemaker | 6:7d1d8945b2f7 | 66 | wrap = w; |
agamemaker | 6:7d1d8945b2f7 | 67 | } |
agamemaker | 1:0328ad927150 | 68 | |
agamemaker | 6:7d1d8945b2f7 | 69 | /*void Movement::move() |
agamemaker | 1:0328ad927150 | 70 | { |
agamemaker | 1:0328ad927150 | 71 | x_pos += x_vel; |
agamemaker | 1:0328ad927150 | 72 | y_pos += y_vel; |
agamemaker | 6:7d1d8945b2f7 | 73 | if(x_pos < 0 || x_pos > 144 || y_pos < 0 || y_pos > 144) { |
agamemaker | 2:332ca4f1a3e3 | 74 | if(wrap) { |
agamemaker | 3:14a2729625f6 | 75 | x_pos += 144*(1 - ceil(x_pos/144)); |
agamemaker | 3:14a2729625f6 | 76 | y_pos += 144*(1 - ceil(y_pos/144)); |
agamemaker | 2:332ca4f1a3e3 | 77 | } else { |
agamemaker | 6:7d1d8945b2f7 | 78 | } |
agamemaker | 2:332ca4f1a3e3 | 79 | } |
agamemaker | 6:7d1d8945b2f7 | 80 | }*/ |
agamemaker | 1:0328ad927150 | 81 | |
agamemaker | 1:0328ad927150 | 82 | void Movement::accelerate() |
agamemaker | 1:0328ad927150 | 83 | { |
agamemaker | 2:332ca4f1a3e3 | 84 | x_vel += ACCEL * cos(angle); |
agamemaker | 2:332ca4f1a3e3 | 85 | y_vel += ACCEL * sin(angle); |
agamemaker | 5:f41d3bfc6701 | 86 | if(sqrt(pow(x_vel,2) + pow(y_vel,2)) > MAXSP) { |
agamemaker | 5:f41d3bfc6701 | 87 | x_vel = x_vel * MAXSP / sqrt(pow(x_vel,2) + pow(y_vel,2)); |
agamemaker | 5:f41d3bfc6701 | 88 | y_vel = y_vel * MAXSP / sqrt(pow(x_vel,2) + pow(y_vel,2)); |
agamemaker | 1:0328ad927150 | 89 | } |
agamemaker | 1:0328ad927150 | 90 | } |
agamemaker | 1:0328ad927150 | 91 | |
agamemaker | 6:7d1d8945b2f7 | 92 | void Movement::turn_left() |
agamemaker | 6:7d1d8945b2f7 | 93 | { |
agamemaker | 3:14a2729625f6 | 94 | angle -= ROTTA; |
agamemaker | 3:14a2729625f6 | 95 | } |
agamemaker | 3:14a2729625f6 | 96 | |
agamemaker | 6:7d1d8945b2f7 | 97 | void Movement::turn_right() |
agamemaker | 6:7d1d8945b2f7 | 98 | { |
agamemaker | 3:14a2729625f6 | 99 | angle += ROTTA; |
agamemaker | 3:14a2729625f6 | 100 | } |
agamemaker | 5:f41d3bfc6701 | 101 | |
agamemaker | 5:f41d3bfc6701 | 102 | //Threads |
agamemaker | 5:f41d3bfc6701 | 103 | //Controls |
agamemaker | 5:f41d3bfc6701 | 104 | int read_getc(Serial &blue) |
agamemaker | 5:f41d3bfc6701 | 105 | { |
agamemaker | 6:7d1d8945b2f7 | 106 | while(!blue.readable()) { |
agamemaker | 5:f41d3bfc6701 | 107 | Thread::yield(); |
agamemaker | 5:f41d3bfc6701 | 108 | } |
agamemaker | 5:f41d3bfc6701 | 109 | return blue.getc(); |
agamemaker | 5:f41d3bfc6701 | 110 | } |
agamemaker | 5:f41d3bfc6701 | 111 | |
agamemaker | 5:f41d3bfc6701 | 112 | void controls(void const *args) |
agamemaker | 5:f41d3bfc6701 | 113 | { |
agamemaker | 5:f41d3bfc6701 | 114 | char bnum=0; |
agamemaker | 5:f41d3bfc6701 | 115 | char bhit=0; |
agamemaker | 5:f41d3bfc6701 | 116 | while(1) { |
agamemaker | 6:7d1d8945b2f7 | 117 | //Thread::wait(100); |
agamemaker | 5:f41d3bfc6701 | 118 | if (read_getc(blue)=='!') { |
agamemaker | 5:f41d3bfc6701 | 119 | if (read_getc(blue)=='B') { //button data packet |
agamemaker | 5:f41d3bfc6701 | 120 | bnum = read_getc(blue); //button number |
agamemaker | 5:f41d3bfc6701 | 121 | bhit = read_getc(blue); //1=hit, 0=release |
agamemaker | 5:f41d3bfc6701 | 122 | if (read_getc(blue)==char(~('!' + 'B' + bnum + bhit))) { //checksum OK? |
agamemaker | 5:f41d3bfc6701 | 123 | myled = bnum - '0'; //current button number will appear on LEDs |
agamemaker | 5:f41d3bfc6701 | 124 | switch (bnum) { |
agamemaker | 5:f41d3bfc6701 | 125 | case '1': //number button 1 |
agamemaker | 5:f41d3bfc6701 | 126 | if (bhit=='1') { |
agamemaker | 6:7d1d8945b2f7 | 127 | game_speed = 25; |
agamemaker | 5:f41d3bfc6701 | 128 | } else { |
agamemaker | 5:f41d3bfc6701 | 129 | //add release code here |
agamemaker | 5:f41d3bfc6701 | 130 | } |
agamemaker | 5:f41d3bfc6701 | 131 | break; |
agamemaker | 5:f41d3bfc6701 | 132 | case '2': //number button 2 |
agamemaker | 5:f41d3bfc6701 | 133 | if (bhit=='1') { |
agamemaker | 6:7d1d8945b2f7 | 134 | game_speed = 100; |
agamemaker | 5:f41d3bfc6701 | 135 | } else { |
agamemaker | 5:f41d3bfc6701 | 136 | //add release code here |
agamemaker | 5:f41d3bfc6701 | 137 | } |
agamemaker | 5:f41d3bfc6701 | 138 | break; |
agamemaker | 5:f41d3bfc6701 | 139 | case '3': //number button 3 |
agamemaker | 5:f41d3bfc6701 | 140 | if (bhit=='1') { |
agamemaker | 5:f41d3bfc6701 | 141 | //add hit code here |
agamemaker | 5:f41d3bfc6701 | 142 | } else { |
agamemaker | 5:f41d3bfc6701 | 143 | //add release code here |
agamemaker | 5:f41d3bfc6701 | 144 | } |
agamemaker | 5:f41d3bfc6701 | 145 | break; |
agamemaker | 5:f41d3bfc6701 | 146 | case '4': //number button 4 |
agamemaker | 5:f41d3bfc6701 | 147 | if (bhit=='1') { |
agamemaker | 6:7d1d8945b2f7 | 148 | four = 1; |
agamemaker | 5:f41d3bfc6701 | 149 | } else { |
agamemaker | 6:7d1d8945b2f7 | 150 | four = 0; |
agamemaker | 5:f41d3bfc6701 | 151 | } |
agamemaker | 5:f41d3bfc6701 | 152 | break; |
agamemaker | 5:f41d3bfc6701 | 153 | case '5': //button 5 up arrow |
agamemaker | 5:f41d3bfc6701 | 154 | if (bhit=='1') { |
agamemaker | 6:7d1d8945b2f7 | 155 | up = 1; |
agamemaker | 5:f41d3bfc6701 | 156 | } else { |
agamemaker | 6:7d1d8945b2f7 | 157 | up = 0; |
agamemaker | 6:7d1d8945b2f7 | 158 | } |
agamemaker | 6:7d1d8945b2f7 | 159 | break; |
agamemaker | 6:7d1d8945b2f7 | 160 | case '6': //button 6 down arrow |
agamemaker | 6:7d1d8945b2f7 | 161 | if (bhit=='1') { |
agamemaker | 6:7d1d8945b2f7 | 162 | stop = 1; |
agamemaker | 6:7d1d8945b2f7 | 163 | } else { |
agamemaker | 6:7d1d8945b2f7 | 164 | stop = 0; |
agamemaker | 5:f41d3bfc6701 | 165 | } |
agamemaker | 5:f41d3bfc6701 | 166 | break; |
agamemaker | 5:f41d3bfc6701 | 167 | case '7': //button 7 left arrow |
agamemaker | 5:f41d3bfc6701 | 168 | if (bhit=='1') { |
agamemaker | 6:7d1d8945b2f7 | 169 | left = 1; |
agamemaker | 5:f41d3bfc6701 | 170 | } else { |
agamemaker | 6:7d1d8945b2f7 | 171 | left = 0; |
agamemaker | 5:f41d3bfc6701 | 172 | } |
agamemaker | 6:7d1d8945b2f7 | 173 | break; |
agamemaker | 5:f41d3bfc6701 | 174 | case '8': //button 8 right arrow |
agamemaker | 5:f41d3bfc6701 | 175 | if (bhit=='1') { |
agamemaker | 6:7d1d8945b2f7 | 176 | right = 1; |
agamemaker | 5:f41d3bfc6701 | 177 | } else { |
agamemaker | 6:7d1d8945b2f7 | 178 | right = 0; |
agamemaker | 5:f41d3bfc6701 | 179 | } |
agamemaker | 5:f41d3bfc6701 | 180 | break; |
agamemaker | 5:f41d3bfc6701 | 181 | default: |
agamemaker | 5:f41d3bfc6701 | 182 | break; |
agamemaker | 5:f41d3bfc6701 | 183 | } |
agamemaker | 5:f41d3bfc6701 | 184 | } |
agamemaker | 5:f41d3bfc6701 | 185 | } |
agamemaker | 5:f41d3bfc6701 | 186 | } |
agamemaker | 5:f41d3bfc6701 | 187 | } |
agamemaker | 5:f41d3bfc6701 | 188 | } |
agamemaker | 6:7d1d8945b2f7 | 189 | |
agamemaker | 6:7d1d8945b2f7 | 190 | void move(Movement &p) |
agamemaker | 6:7d1d8945b2f7 | 191 | { |
agamemaker | 6:7d1d8945b2f7 | 192 | p.x_pos += p.x_vel; |
agamemaker | 6:7d1d8945b2f7 | 193 | p.y_pos += p.y_vel; |
agamemaker | 6:7d1d8945b2f7 | 194 | if(p.x_pos < 0 || p.x_pos > 144 || p.y_pos < 0 || p.y_pos > 144) { |
agamemaker | 6:7d1d8945b2f7 | 195 | if(p.wrap) { |
agamemaker | 6:7d1d8945b2f7 | 196 | p.x_pos += 144*(1 - ceil(p.x_pos/144)); |
agamemaker | 6:7d1d8945b2f7 | 197 | p.y_pos += 144*(1 - ceil(p.y_pos/144)); |
agamemaker | 6:7d1d8945b2f7 | 198 | } else { |
agamemaker | 6:7d1d8945b2f7 | 199 | } |
agamemaker | 6:7d1d8945b2f7 | 200 | } |
agamemaker | 6:7d1d8945b2f7 | 201 | } |
agamemaker | 6:7d1d8945b2f7 | 202 | |
agamemaker | 6:7d1d8945b2f7 | 203 | //move |
agamemaker | 6:7d1d8945b2f7 | 204 | void move_all(Movement &player, list<Movement> &asteroids, list<Movement> &bullets) |
agamemaker | 6:7d1d8945b2f7 | 205 | { |
agamemaker | 6:7d1d8945b2f7 | 206 | move(player); |
agamemaker | 6:7d1d8945b2f7 | 207 | list<Movement>::iterator iterator; |
agamemaker | 6:7d1d8945b2f7 | 208 | for (iterator = asteroids.begin(); iterator != asteroids.end(); ++iterator) { |
agamemaker | 6:7d1d8945b2f7 | 209 | move(*iterator); |
agamemaker | 6:7d1d8945b2f7 | 210 | } |
agamemaker | 6:7d1d8945b2f7 | 211 | } |
agamemaker | 6:7d1d8945b2f7 | 212 | |
agamemaker | 2:332ca4f1a3e3 | 213 | //collisions |
agamemaker | 1:0328ad927150 | 214 | bool collision(Movement p1, Movement p2) |
agamemaker | 1:0328ad927150 | 215 | { |
agamemaker | 1:0328ad927150 | 216 | int rad = p1.hit_rad + p2.hit_rad; |
agamemaker | 1:0328ad927150 | 217 | double dist = sqrt(pow((p1.x_pos - p2.x_pos),2) + pow((p1.y_pos - p2.y_pos),2)); |
agamemaker | 1:0328ad927150 | 218 | return dist < rad; |
agamemaker | 1:0328ad927150 | 219 | } |
agamemaker | 1:0328ad927150 | 220 | |
agamemaker | 6:7d1d8945b2f7 | 221 | void calc_collisions(Movement &player, list<Movement> &asteroids, list<Movement> &bullets) |
agamemaker | 2:332ca4f1a3e3 | 222 | { |
agamemaker | 6:7d1d8945b2f7 | 223 | list<Movement>::iterator iterator; |
agamemaker | 6:7d1d8945b2f7 | 224 | for (iterator = asteroids.begin(); iterator != asteroids.end(); ++iterator) { |
agamemaker | 6:7d1d8945b2f7 | 225 | if(collision(player,*iterator)){ |
agamemaker | 6:7d1d8945b2f7 | 226 | ulcd.printf("crash"); |
agamemaker | 6:7d1d8945b2f7 | 227 | } |
agamemaker | 6:7d1d8945b2f7 | 228 | } |
agamemaker | 1:0328ad927150 | 229 | } |
agamemaker | 1:0328ad927150 | 230 | |
agamemaker | 2:332ca4f1a3e3 | 231 | //drawing |
agamemaker | 6:7d1d8945b2f7 | 232 | void draw_triangle(Movement p) |
agamemaker | 6:7d1d8945b2f7 | 233 | { |
agamemaker | 4:563648944ecc | 234 | int x1 = p.x_pos + p.hit_rad * cos(p.angle); |
agamemaker | 6:7d1d8945b2f7 | 235 | int y1 = p.y_pos + p.hit_rad * sin(p.angle); |
agamemaker | 6:7d1d8945b2f7 | 236 | int x2 = p.x_pos + p.hit_rad * cos(p.angle + 2.5); |
agamemaker | 6:7d1d8945b2f7 | 237 | int y2 = p.y_pos + p.hit_rad * sin(p.angle + 2.5); |
agamemaker | 6:7d1d8945b2f7 | 238 | int x3 = p.x_pos + p.hit_rad * cos(p.angle - 2.5); |
agamemaker | 6:7d1d8945b2f7 | 239 | int y3 = p.y_pos + p.hit_rad * sin(p.angle - 2.5); |
agamemaker | 4:563648944ecc | 240 | ulcd.triangle(x1,y1,x2,y2,x3,y3,BLUE); |
agamemaker | 6:7d1d8945b2f7 | 241 | } |
agamemaker | 6:7d1d8945b2f7 | 242 | |
agamemaker | 2:332ca4f1a3e3 | 243 | void draw_objs(Movement player, list<Movement> asteroids, list<Movement> bullets) |
agamemaker | 2:332ca4f1a3e3 | 244 | { |
agamemaker | 6:7d1d8945b2f7 | 245 | ulcd.cls(); |
agamemaker | 4:563648944ecc | 246 | draw_triangle(player); |
agamemaker | 4:563648944ecc | 247 | ulcd.circle(player.x_pos,player.y_pos,player.hit_rad,BLUE); |
agamemaker | 6:7d1d8945b2f7 | 248 | list<Movement>::const_iterator iterator; |
agamemaker | 6:7d1d8945b2f7 | 249 | for (iterator = asteroids.begin(); iterator != asteroids.end(); ++iterator) { |
agamemaker | 6:7d1d8945b2f7 | 250 | ulcd.circle(iterator->x_pos,iterator->y_pos,iterator->hit_rad,RED); |
agamemaker | 6:7d1d8945b2f7 | 251 | } |
agamemaker | 2:332ca4f1a3e3 | 252 | } |
agamemaker | 1:0328ad927150 | 253 | |
agamemaker | 1:0328ad927150 | 254 | int main() |
agamemaker | 1:0328ad927150 | 255 | { |
agamemaker | 5:f41d3bfc6701 | 256 | Thread buttons(controls); |
agamemaker | 6:7d1d8945b2f7 | 257 | Movement temp(100, 0, 0, 5, 0, 10, 1); |
agamemaker | 6:7d1d8945b2f7 | 258 | Movement player(50, 100, 0, -5, 0, 10, 1); |
agamemaker | 6:7d1d8945b2f7 | 259 | list<Movement> asteroids; |
agamemaker | 6:7d1d8945b2f7 | 260 | list<Movement> bullets; |
agamemaker | 6:7d1d8945b2f7 | 261 | asteroids.push_back(temp); |
agamemaker | 6:7d1d8945b2f7 | 262 | temp.assign(20, 0, 0, 5, 0, 10, 1); |
agamemaker | 6:7d1d8945b2f7 | 263 | asteroids.push_back(temp); |
agamemaker | 0:16094a49131e | 264 | while(1) { |
agamemaker | 6:7d1d8945b2f7 | 265 | //controls |
agamemaker | 6:7d1d8945b2f7 | 266 | if(up) { |
agamemaker | 6:7d1d8945b2f7 | 267 | player.accelerate(); |
agamemaker | 6:7d1d8945b2f7 | 268 | } |
agamemaker | 6:7d1d8945b2f7 | 269 | if(left) { |
agamemaker | 6:7d1d8945b2f7 | 270 | player.turn_left(); |
agamemaker | 6:7d1d8945b2f7 | 271 | } |
agamemaker | 6:7d1d8945b2f7 | 272 | if(right) { |
agamemaker | 6:7d1d8945b2f7 | 273 | player.turn_right(); |
agamemaker | 6:7d1d8945b2f7 | 274 | } |
agamemaker | 6:7d1d8945b2f7 | 275 | if(stop) { |
agamemaker | 6:7d1d8945b2f7 | 276 | player.x_vel = 0; |
agamemaker | 6:7d1d8945b2f7 | 277 | player.y_vel = 0; |
agamemaker | 6:7d1d8945b2f7 | 278 | } |
agamemaker | 6:7d1d8945b2f7 | 279 | //move |
agamemaker | 6:7d1d8945b2f7 | 280 | //player.move(); |
agamemaker | 6:7d1d8945b2f7 | 281 | |
agamemaker | 6:7d1d8945b2f7 | 282 | move_all(player, asteroids, bullets); |
agamemaker | 6:7d1d8945b2f7 | 283 | calc_collisions(player, asteroids, bullets); |
agamemaker | 6:7d1d8945b2f7 | 284 | draw_objs(player, asteroids, bullets); |
agamemaker | 6:7d1d8945b2f7 | 285 | Thread::wait(game_speed); |
agamemaker | 0:16094a49131e | 286 | } |
agamemaker | 4:563648944ecc | 287 | } |