ELEC2645 (2018/19) / Mbed 2 deprecated el17lw

Dependencies:   mbed

Committer:
lewisgw
Date:
Tue May 07 08:39:38 2019 +0000
Revision:
28:be77ad6c0bda
Parent:
27:c920c5ec31af
Child:
29:bdc4138b5171
Added a tests class to be run in main to test sprites on the LCD. Updated documentation.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lewisgw 5:eda40cdde3e7 1 #include "Engine.h"
lewisgw 5:eda40cdde3e7 2
lewisgw 23:ff9073e12106 3 // Reference for the technique used to generate random numbers.
lewisgw 26:4253656c0755 4 // [1] "rand" cplusplus. [Online] Available:
lewisgw 26:4253656c0755 5 // http://www.cplusplus.com/reference/cstdlib/rand/ [Accessed: 22 April 2019].
lewisgw 23:ff9073e12106 6
lewisgw 21:20478f086bc2 7 // Buffer to print updated score.
lewisgw 21:20478f086bc2 8 char buffer[14];
lewisgw 15:876c047a6ec9 9
lewisgw 21:20478f086bc2 10 // Constructor and destructor.
lewisgw 9:fff2009f826e 11 Engine::Engine() {}
lewisgw 5:eda40cdde3e7 12
lewisgw 9:fff2009f826e 13 Engine::~Engine() {}
lewisgw 5:eda40cdde3e7 14
lewisgw 15:876c047a6ec9 15 void Engine::init() {
lewisgw 15:876c047a6ec9 16 reset_skater();
lewisgw 17:f377df4ea7b1 17 reset_engine();
lewisgw 23:ff9073e12106 18 srand(time(NULL)); // Set up for generating random numbers, [1].
lewisgw 15:876c047a6ec9 19 }
lewisgw 15:876c047a6ec9 20
lewisgw 20:a8cad4e044ea 21 void Engine::check_reset(N5110 &lcd, Gamepad &gamepad) {
lewisgw 21:20478f086bc2 22 // If reset flag is true, end and restart the game.
lewisgw 9:fff2009f826e 23 if (_skater.get_reset_flag()) {
lewisgw 26:4253656c0755 24 gamepad.leds_on();
lewisgw 21:20478f086bc2 25 execute_dying_sequence(lcd, gamepad);
lewisgw 26:4253656c0755 26 wait(1); // Short pause.
lewisgw 20:a8cad4e044ea 27 reset_skater();
lewisgw 20:a8cad4e044ea 28 reset_engine();
lewisgw 9:fff2009f826e 29 }
lewisgw 9:fff2009f826e 30 }
lewisgw 9:fff2009f826e 31
lewisgw 21:20478f086bc2 32 void Engine::execute_dying_sequence(N5110 &lcd, Gamepad &gamepad) {
lewisgw 26:4253656c0755 33 wait(1); // Short pause.
lewisgw 26:4253656c0755 34 gamepad.leds_off();
lewisgw 21:20478f086bc2 35 lcd.clear();
lewisgw 21:20478f086bc2 36 for (int i = 0; i < 40; i = i + 8) { // Counter for y direction, sweeps top
lewisgw 21:20478f086bc2 37 // to bottom.
lewisgw 23:ff9073e12106 38 for (int j = 0; j < 84; j++) { // Counter for x direction, sweeps L to R.
lewisgw 21:20478f086bc2 39 lcd.setPixel(j,i,true);
lewisgw 21:20478f086bc2 40 lcd.setPixel(i,j,true);
lewisgw 21:20478f086bc2 41 lcd.printString("TRY AGAIN",30,5);
lewisgw 21:20478f086bc2 42 lcd.refresh();
lewisgw 27:c920c5ec31af 43 gamepad.tone(int(1099 - 15.4*j - 1.2*i), 0.05); // Frequency of tone is
lewisgw 26:4253656c0755 44 // dependent on counters.
lewisgw 26:4253656c0755 45 wait(0.001); // Control speed of the sequence.
lewisgw 21:20478f086bc2 46 sprintf(buffer,"%2d",_player_score);
lewisgw 21:20478f086bc2 47 lcd.printString(buffer,0,5);
lewisgw 21:20478f086bc2 48 }
lewisgw 21:20478f086bc2 49 }
lewisgw 21:20478f086bc2 50 }
lewisgw 21:20478f086bc2 51
lewisgw 9:fff2009f826e 52 void Engine::reset_skater() {
lewisgw 18:304700b5d8f8 53 _skater_direction = Left;
lewisgw 23:ff9073e12106 54 _start_platform_flag = true; // For printing start text in EngineController.
lewisgw 17:f377df4ea7b1 55 _skater.set_reset_flag(false);
lewisgw 19:f35887b14c23 56 _moving_counter = 0;
lewisgw 26:4253656c0755 57 _jump_counter = 20; // Start game falling onto the platform.
lewisgw 19:f35887b14c23 58 _fall_flag = false;
lewisgw 17:f377df4ea7b1 59 }
lewisgw 17:f377df4ea7b1 60
lewisgw 17:f377df4ea7b1 61 void Engine::reset_engine() {
lewisgw 17:f377df4ea7b1 62 _input.coord.x = 0;
lewisgw 17:f377df4ea7b1 63 _input.coord.y = 0;
lewisgw 17:f377df4ea7b1 64 _input.A_flag = false;
lewisgw 21:20478f086bc2 65 _lower_platforms.init(40); // 40 is the platform y coord.
lewisgw 21:20478f086bc2 66 _upper_platforms.init(22); // 22 is the platform y coord.
lewisgw 17:f377df4ea7b1 67 _coin.init();
lewisgw 18:304700b5d8f8 68 _fire.init();
lewisgw 17:f377df4ea7b1 69 _coin_collision_flag = false;
lewisgw 17:f377df4ea7b1 70 _player_score = 0;
lewisgw 26:4253656c0755 71 _fire_height = 0;
lewisgw 9:fff2009f826e 72 }
lewisgw 8:5327418f823a 73
lewisgw 5:eda40cdde3e7 74 void Engine::read_input(Gamepad &gamepad) {
lewisgw 26:4253656c0755 75 // Set up the input struct.
lewisgw 9:fff2009f826e 76 _input.coord = gamepad.get_mapped_coord();
lewisgw 9:fff2009f826e 77 _input.A_flag = gamepad.check_event(Gamepad::A_PRESSED);
lewisgw 9:fff2009f826e 78 }
lewisgw 5:eda40cdde3e7 79
lewisgw 20:a8cad4e044ea 80 void Engine::process_y(Gamepad &gamepad) {
lewisgw 21:20478f086bc2 81 // Sets the y coord by first checking if the skater should be falling.
lewisgw 26:4253656c0755 82 set_fall_flag(); // Update the fall flag dependent on skater position.
lewisgw 9:fff2009f826e 83 if (_fall_flag) {
lewisgw 20:a8cad4e044ea 84 _skater.fall(_fall_flag, gamepad);
lewisgw 9:fff2009f826e 85 } else {
lewisgw 28:be77ad6c0bda 86 _skater.set_y_position(_input.A_flag, _jump_counter, _level_condition,
lewisgw 21:20478f086bc2 87 gamepad);
lewisgw 9:fff2009f826e 88 }
lewisgw 21:20478f086bc2 89 _fall_flag = _skater.get_fall_flag(); // Update fall flag.
lewisgw 18:304700b5d8f8 90 _skater_y = _skater.get_y_position();
lewisgw 21:20478f086bc2 91 _jump_counter = _skater.get_jump_counter(); // Update jump counter.
lewisgw 9:fff2009f826e 92 }
lewisgw 14:9861fe85c803 93
lewisgw 9:fff2009f826e 94 void Engine::set_fall_flag() {
lewisgw 21:20478f086bc2 95 // Set the fall flag to true if the skater is not on one of the lower
lewisgw 26:4253656c0755 96 // platforms. The start platform condition has been offset by 6 to account for
lewisgw 26:4253656c0755 97 // skater sprite size.
lewisgw 26:4253656c0755 98 // If the skater is between platform 1 and 2, and on the lower level.
lewisgw 21:20478f086bc2 99 if (((_lower_line_1.x_end < _skater_x)
lewisgw 21:20478f086bc2 100 && (_skater_x < (_lower_line_2.x_start - 6)))
lewisgw 26:4253656c0755 101 && _skater_y == 23) {
lewisgw 9:fff2009f826e 102 _fall_flag = true;
lewisgw 26:4253656c0755 103 // If the skater is between platforms 2 and 3, and on the lower level.
lewisgw 21:20478f086bc2 104 } else if (((_lower_line_2.x_end < _skater_x)
lewisgw 21:20478f086bc2 105 && (_skater_x < (_lower_line_3.x_start - 6)))
lewisgw 21:20478f086bc2 106 && _skater_y == 23) {
lewisgw 9:fff2009f826e 107 _fall_flag = true;
lewisgw 26:4253656c0755 108 // If the skater is between platforms 3 and 1, and on the lower level.
lewisgw 21:20478f086bc2 109 } else if (((_lower_line_3.x_end < _skater_x)
lewisgw 21:20478f086bc2 110 && (_skater_x < (_lower_line_1.x_start - 6)))
lewisgw 21:20478f086bc2 111 && _skater_y == 23) {
lewisgw 9:fff2009f826e 112 _fall_flag = true;
lewisgw 9:fff2009f826e 113 }
lewisgw 9:fff2009f826e 114 }
lewisgw 5:eda40cdde3e7 115
lewisgw 17:f377df4ea7b1 116 void Engine::process_x(int game_counter) {
lewisgw 21:20478f086bc2 117 // Sets the x coord.
lewisgw 17:f377df4ea7b1 118 _skater.set_x_position_and_sprite(_input.coord.x,
lewisgw 17:f377df4ea7b1 119 _moving_counter,
lewisgw 18:304700b5d8f8 120 _skater_direction,
lewisgw 17:f377df4ea7b1 121 _input.coord.y);
lewisgw 18:304700b5d8f8 122 _skater_x = _skater.get_x_position();
lewisgw 21:20478f086bc2 123 _moving_counter = _skater.get_moving_counter(); // Update moving counter.
lewisgw 26:4253656c0755 124 _speed_divider = int(-0.05*_player_score + 4); // Speed divider is calculated
lewisgw 26:4253656c0755 125 // from player score.
lewisgw 26:4253656c0755 126 // Move the skater along with platforms at rate determined by speed divider if
lewisgw 26:4253656c0755 127 // the skater is not moving left.
lewisgw 21:20478f086bc2 128 if ((game_counter % _speed_divider == 0) && (_input.coord.x > -0.1)) {
lewisgw 17:f377df4ea7b1 129 _moving_counter--;
lewisgw 9:fff2009f826e 130 }
lewisgw 9:fff2009f826e 131 }
lewisgw 5:eda40cdde3e7 132
lewisgw 5:eda40cdde3e7 133 void Engine::process_sprite() {
lewisgw 14:9861fe85c803 134 // Update the sprite and direction.
lewisgw 18:304700b5d8f8 135 _skater_sprite = _skater.get_sprite_value();
lewisgw 18:304700b5d8f8 136 _skater_direction = _skater.get_direction();
lewisgw 9:fff2009f826e 137 }
lewisgw 5:eda40cdde3e7 138
lewisgw 5:eda40cdde3e7 139
lewisgw 10:8bf3713d9e9c 140 void Engine::set_level_condition() {
lewisgw 14:9861fe85c803 141 // If the skater is under or on top of any of the upper platforms, set
lewisgw 26:4253656c0755 142 // level condition to 1.
lewisgw 26:4253656c0755 143 // Offset of 6 is to account for sprite size.
lewisgw 26:4253656c0755 144 // If the skater is between start and end of upper platform 1.
lewisgw 21:20478f086bc2 145 if (((_upper_line_1.x_start - 6) <= _skater_x)
lewisgw 21:20478f086bc2 146 && (_skater_x <= _upper_line_1.x_end)) {
lewisgw 10:8bf3713d9e9c 147 _level_condition = 1;
lewisgw 26:4253656c0755 148 // If the skater is between start and end of upper platform 2.
lewisgw 21:20478f086bc2 149 } else if (((_upper_line_2.x_start - 6) <= _skater_x)
lewisgw 21:20478f086bc2 150 && (_skater_x <= _upper_line_2.x_end)) {
lewisgw 10:8bf3713d9e9c 151 _level_condition = 1;
lewisgw 26:4253656c0755 152 // If the skater is between start and end of upper platform 3.
lewisgw 21:20478f086bc2 153 } else if (((_upper_line_3.x_start - 6) <= _skater_x)
lewisgw 21:20478f086bc2 154 && (_skater_x <= _upper_line_3.x_end)) {
lewisgw 10:8bf3713d9e9c 155 _level_condition = 1;
lewisgw 9:fff2009f826e 156 } else {
lewisgw 10:8bf3713d9e9c 157 _level_condition = 0;
lewisgw 10:8bf3713d9e9c 158 }
lewisgw 9:fff2009f826e 159 }
lewisgw 7:bbc2b75c1418 160
lewisgw 17:f377df4ea7b1 161 void Engine::generate_level(int game_counter) {
lewisgw 26:4253656c0755 162 // Generate properties for the level.
lewisgw 10:8bf3713d9e9c 163 generate_lower_lines();
lewisgw 10:8bf3713d9e9c 164 generate_upper_lines();
lewisgw 15:876c047a6ec9 165 _coin.generate_coin();
lewisgw 18:304700b5d8f8 166 generate_fire(game_counter);
lewisgw 9:fff2009f826e 167 }
lewisgw 5:eda40cdde3e7 168
lewisgw 26:4253656c0755 169 void Engine::draw_screen_fire(int game_counter, N5110 &lcd) {
lewisgw 26:4253656c0755 170 // Prints the dynamic fire at the bottom of the screen.
lewisgw 26:4253656c0755 171 // Restricts the max fire height multiplier, which is dependent on player
lewisgw 27:c920c5ec31af 172 // score. Fire will start when score = 3.
lewisgw 26:4253656c0755 173 if (_player_score < 15) {
lewisgw 26:4253656c0755 174 _fire_height = _player_score;
lewisgw 26:4253656c0755 175 } else {
lewisgw 26:4253656c0755 176 _fire_height = 14;
lewisgw 26:4253656c0755 177 }
lewisgw 26:4253656c0755 178 // i corresponds to horizontal positions of pixels.
lewisgw 26:4253656c0755 179 for (int i = 1; i < 84; i++) {
lewisgw 26:4253656c0755 180 if (i % 4 == 0) {
lewisgw 26:4253656c0755 181 // j corresponds to vertical height of pixels, and the max height is
lewisgw 26:4253656c0755 182 // dependent on game counter (0 to 99) so changes every loop, and is
lewisgw 26:4253656c0755 183 // scaled.
lewisgw 26:4253656c0755 184 for (int j = 0; j < game_counter*0.01*_fire_height; j++) {
lewisgw 26:4253656c0755 185 lcd.setPixel(i + (rand() % 8 + 1) ,50 - j*1.3,true); // Horizontal
lewisgw 26:4253656c0755 186 // position of pixel is constrained random [1], multiplier on j varies
lewisgw 26:4253656c0755 187 // local height.
lewisgw 26:4253656c0755 188 lcd.setPixel(i - (rand() % 8 + 1) ,50 - j*1.2,true); // [1].
lewisgw 26:4253656c0755 189 lcd.setPixel(i - (rand() % 8 + 1) ,50 - j*1.6,true); // [1].
lewisgw 26:4253656c0755 190 lcd.setPixel(i + (rand() % 8 + 1) ,50 - j*1.1,true); // [1].
lewisgw 26:4253656c0755 191 lcd.setPixel(i - (rand() % 8 + 1) ,50 - j*1.4,true); // [1].
lewisgw 26:4253656c0755 192 }
lewisgw 26:4253656c0755 193 }
lewisgw 26:4253656c0755 194 }
lewisgw 26:4253656c0755 195 }
lewisgw 26:4253656c0755 196
lewisgw 10:8bf3713d9e9c 197 void Engine::generate_lower_lines() {
lewisgw 14:9861fe85c803 198 // Use a scaled random number to generate the length of the lower lines.
lewisgw 26:4253656c0755 199 _length_1 = (rand() %20) + 10; // [1].
lewisgw 21:20478f086bc2 200 _lower_platforms.set_line_1(_length_1);
lewisgw 18:304700b5d8f8 201 _lower_line_1 = _lower_platforms.get_line_1();
lewisgw 26:4253656c0755 202 _length_2 = (rand() %20) + 10; // [1].
lewisgw 21:20478f086bc2 203 _lower_platforms.set_line_2(_length_2);
lewisgw 18:304700b5d8f8 204 _lower_line_2 = _lower_platforms.get_line_2();
lewisgw 26:4253656c0755 205 _length_3 = (rand() %20) + 10; // [1].
lewisgw 21:20478f086bc2 206 _lower_platforms.set_line_3(_length_3);
lewisgw 18:304700b5d8f8 207 _lower_line_3 = _lower_platforms.get_line_3();
lewisgw 10:8bf3713d9e9c 208 }
lewisgw 10:8bf3713d9e9c 209
lewisgw 10:8bf3713d9e9c 210 void Engine::generate_upper_lines() {
lewisgw 21:20478f086bc2 211 // Set the length of the upper lines to be proportionally smaller to
lewisgw 21:20478f086bc2 212 // the length of the lower lines.
lewisgw 21:20478f086bc2 213 _upper_platforms.set_line_1(_length_1 / 2);
lewisgw 18:304700b5d8f8 214 _upper_line_1 = _upper_platforms.get_line_1();
lewisgw 21:20478f086bc2 215 _upper_platforms.set_line_2(_length_2 / 2);
lewisgw 18:304700b5d8f8 216 _upper_line_2 = _upper_platforms.get_line_2();
lewisgw 21:20478f086bc2 217 _upper_platforms.set_line_3(_length_3 / 2);
lewisgw 18:304700b5d8f8 218 _upper_line_3 = _upper_platforms.get_line_3();
lewisgw 10:8bf3713d9e9c 219 }
lewisgw 5:eda40cdde3e7 220
lewisgw 18:304700b5d8f8 221 void Engine::generate_fire(int game_counter) {
lewisgw 21:20478f086bc2 222 // Generates the x and y coordinate of the fire. Y oscillates from 5 to 23.
lewisgw 21:20478f086bc2 223 _fire.generate_fire(); // Generates X coord of fire.
lewisgw 26:4253656c0755 224 // Y is calculated from parabolic relation to game counter.
lewisgw 21:20478f086bc2 225 _fire_y = int(-0.0073*game_counter*game_counter + 0.73*game_counter + 5);
lewisgw 16:331be5c7ed80 226 }
lewisgw 16:331be5c7ed80 227
lewisgw 26:4253656c0755 228 void Engine::update_lcd(N5110 &lcd, int game_counter){
lewisgw 26:4253656c0755 229 // Draw all sprites, screen fire, platforms and player score.
lewisgw 21:20478f086bc2 230 lcd.drawSprite(_skater_x,_skater_y,17,10,
lewisgw 21:20478f086bc2 231 (int *)_skater.get_sprite(_skater_sprite));
lewisgw 21:20478f086bc2 232 lcd.drawSprite(_coin.get_coin_x(),_coin.get_coin_y(),5,5,
lewisgw 21:20478f086bc2 233 (int*)_coin.get_coin_sprite());
lewisgw 18:304700b5d8f8 234 lcd.drawSprite(_fire.get_fire_x(),_fire_y,5,8,(int*)_fire.get_fire_sprite());
lewisgw 21:20478f086bc2 235 lcd.drawLine(_lower_line_2.x_start,_lower_line_2.y,_lower_line_2.x_end,
lewisgw 21:20478f086bc2 236 _lower_line_2.y,FILL_BLACK);
lewisgw 21:20478f086bc2 237 lcd.drawLine(_lower_line_1.x_start,_lower_line_1.y,_lower_line_1.x_end,
lewisgw 21:20478f086bc2 238 _lower_line_1.y,FILL_BLACK);
lewisgw 21:20478f086bc2 239 lcd.drawLine(_lower_line_3.x_start,_lower_line_3.y,_lower_line_3.x_end,
lewisgw 21:20478f086bc2 240 _lower_line_3.y,FILL_BLACK);
lewisgw 21:20478f086bc2 241 lcd.drawLine(_upper_line_2.x_start,_upper_line_2.y,_upper_line_2.x_end,
lewisgw 21:20478f086bc2 242 _upper_line_2.y,FILL_BLACK);
lewisgw 21:20478f086bc2 243 lcd.drawLine(_upper_line_1.x_start,_upper_line_1.y,_upper_line_1.x_end,
lewisgw 21:20478f086bc2 244 _upper_line_1.y,FILL_BLACK);
lewisgw 21:20478f086bc2 245 lcd.drawLine(_upper_line_3.x_start,_upper_line_3.y,_upper_line_3.x_end,
lewisgw 21:20478f086bc2 246 _upper_line_3.y,FILL_BLACK);
lewisgw 15:876c047a6ec9 247 sprintf(buffer,"%2d",_player_score);
lewisgw 15:876c047a6ec9 248 lcd.printString(buffer,0,0);
lewisgw 26:4253656c0755 249 draw_screen_fire(game_counter, lcd);
lewisgw 11:b66170249a26 250 }
lewisgw 11:b66170249a26 251
lewisgw 21:20478f086bc2 252 bool Engine::get_start_platform_flag() {
lewisgw 26:4253656c0755 253 if (_input.A_flag) _start_platform_flag = false; // Makes starting platform
lewisgw 26:4253656c0755 254 // vanish after first jump of the game.
lewisgw 21:20478f086bc2 255 return _start_platform_flag;
lewisgw 15:876c047a6ec9 256 }
lewisgw 15:876c047a6ec9 257
lewisgw 20:a8cad4e044ea 258 void Engine::check_coin_collision(Gamepad &gamepad) {
lewisgw 26:4253656c0755 259 // If skater x and y coord matches the coin's. Small adjustment for Y coord
lewisgw 26:4253656c0755 260 // compensates for skater sprite size.
lewisgw 21:20478f086bc2 261 if (_skater_x == _coin.get_coin_x()
lewisgw 26:4253656c0755 262 && (_skater_y == _coin.get_coin_y() - 10)) {
lewisgw 15:876c047a6ec9 263 _coin_collision_flag = true;
lewisgw 15:876c047a6ec9 264 _player_score++;
lewisgw 21:20478f086bc2 265 _coin.set_coin((rand() % 100),(abs(rand() % 100 - 20))); // Place coin
lewisgw 23:ff9073e12106 266 // on a constrained random position, [1].
lewisgw 26:4253656c0755 267 gamepad.tone(1500, 0.05); // Make collection noise on buzzer.
lewisgw 20:a8cad4e044ea 268 wait(0.05);
lewisgw 20:a8cad4e044ea 269 gamepad.tone(3000, 0.05);
lewisgw 15:876c047a6ec9 270 }
lewisgw 16:331be5c7ed80 271 }
lewisgw 16:331be5c7ed80 272
lewisgw 26:4253656c0755 273 void Engine::check_fire_collision(Gamepad &gamepad, int game_counter) {
lewisgw 26:4253656c0755 274 // If skater is not ducking, has same x coord and within a range of y coord
lewisgw 26:4253656c0755 275 // as fire.
lewisgw 21:20478f086bc2 276 if (_input.coord.y > -0.1
lewisgw 21:20478f086bc2 277 && _skater_x == _fire.get_fire_x()
lewisgw 21:20478f086bc2 278 && _skater_y > _fire_y - 10
lewisgw 26:4253656c0755 279 && _skater_y < _fire_y + 10
lewisgw 26:4253656c0755 280 ) { // A range of Y coords to make collision
lewisgw 26:4253656c0755 281 // more frequent.
lewisgw 17:f377df4ea7b1 282 _skater.set_reset_flag(true);
lewisgw 26:4253656c0755 283 gamepad.tone(400, 0.25); // Make collision noise on buzzer.
lewisgw 20:a8cad4e044ea 284 wait(0.05);
lewisgw 20:a8cad4e044ea 285 gamepad.tone(200, 0.25);
lewisgw 21:20478f086bc2 286 } else if ( _skater_x < -10 || _skater_x > 84 ) { // If skater goes off the
lewisgw 21:20478f086bc2 287 // screen.
lewisgw 16:331be5c7ed80 288 _skater.set_reset_flag(true);
lewisgw 20:a8cad4e044ea 289 gamepad.tone(200, 0.5);
lewisgw 16:331be5c7ed80 290 }
lewisgw 26:4253656c0755 291 // If the skater collides with the scaled peak of the background fire.
lewisgw 26:4253656c0755 292 if (_skater_y > (50 - game_counter*_fire_height*0.023)) {
lewisgw 26:4253656c0755 293 _fall_flag = true;
lewisgw 26:4253656c0755 294 wait(0.05); // Slow down falling sequence.
lewisgw 26:4253656c0755 295 }
lewisgw 16:331be5c7ed80 296 }
lewisgw 17:f377df4ea7b1 297
lewisgw 17:f377df4ea7b1 298 int Engine::get_player_score() {
lewisgw 17:f377df4ea7b1 299 return _player_score;
lewisgw 17:f377df4ea7b1 300 }
lewisgw 16:331be5c7ed80 301