project for 2035

Dependencies:   mbed wave_player 4DGL-uLCD-SE MMA8452

Committer:
kblake9
Date:
Wed Nov 25 04:48:22 2020 +0000
Revision:
22:33f1a0dff46c
Parent:
21:fe15f6311822
final

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DCchico 2:4947d6a82971 1 //=================================================================
DCchico 2:4947d6a82971 2 // The main program file.
DCchico 2:4947d6a82971 3 //
DCchico 2:4947d6a82971 4 // Copyright 2020 Georgia Tech. All rights reserved.
DCchico 2:4947d6a82971 5 // The materials provided by the instructor in this course are for
DCchico 2:4947d6a82971 6 // the use of the students currently enrolled in the course.
DCchico 2:4947d6a82971 7 // Copyrighted course materials may not be further disseminated.
DCchico 2:4947d6a82971 8 // This file must not be made publicly available anywhere.
DCchico 2:4947d6a82971 9 //==================================================================
DCchico 2:4947d6a82971 10
DCchico 2:4947d6a82971 11 // Project includes
DCchico 1:10330bce85cb 12 #include "globals.h"
DCchico 1:10330bce85cb 13 #include "hardware.h"
DCchico 1:10330bce85cb 14 #include "map.h"
DCchico 1:10330bce85cb 15 #include "graphics.h"
DCchico 1:10330bce85cb 16 #include "snake.h"
kblake9 22:33f1a0dff46c 17 #include <string>
DCchico 1:10330bce85cb 18 #include <math.h>
DCchico 1:10330bce85cb 19 #include<stdio.h>
DCchico 1:10330bce85cb 20
DCchico 1:10330bce85cb 21 #define CITY_HIT_MARGIN 1
DCchico 1:10330bce85cb 22 #define CITY_UPPER_BOUND (SIZE_Y-(LANDSCAPE_HEIGHT+MAX_BUILDING_HEIGHT))
DCchico 2:4947d6a82971 23
DCchico 1:10330bce85cb 24 // Helper function declarations
DCchico 1:10330bce85cb 25 void playSound(char* wav);
DCchico 1:10330bce85cb 26
DCchico 1:10330bce85cb 27 /**
DCchico 1:10330bce85cb 28 * The main game state. Must include snake locations and previous locations for
DCchico 1:10330bce85cb 29 * drawing to work properly. Other items can be added as needed.
DCchico 1:10330bce85cb 30 */
DCchico 1:10330bce85cb 31
DCchico 1:10330bce85cb 32 /**
DCchico 1:10330bce85cb 33 * Given the game inputs, determine what kind of update needs to happen.
DCchico 1:10330bce85cb 34 * Possbile return values are defined below.
DCchico 1:10330bce85cb 35 */
DCchico 1:10330bce85cb 36 Snake snake;
DCchico 1:10330bce85cb 37
DCchico 1:10330bce85cb 38 // Function prototypes
DCchico 2:4947d6a82971 39
DCchico 2:4947d6a82971 40 /**
DCchico 2:4947d6a82971 41 * Given the game inputs, determine what kind of update needs to happen.
DCchico 2:4947d6a82971 42 * Possible return values are defined below.
DCchico 2:4947d6a82971 43 */
DCchico 2:4947d6a82971 44 #define NO_RESULT 0
DCchico 2:4947d6a82971 45 #define NO_ACTION 0
DCchico 2:4947d6a82971 46 #define ACTION_BUTTON 1
DCchico 2:4947d6a82971 47 #define MENU_BUTTON 2
DCchico 2:4947d6a82971 48 #define GO_LEFT 3
DCchico 2:4947d6a82971 49 #define GO_RIGHT 4
DCchico 2:4947d6a82971 50 #define GO_UP 5
DCchico 2:4947d6a82971 51 #define GO_DOWN 6
DCchico 2:4947d6a82971 52 #define GAME_OVER 7
DCchico 2:4947d6a82971 53 #define FULL_DRAW 8
DCchico 1:10330bce85cb 54 // Get Actions from User (push buttons & accelerometer)
DCchico 2:4947d6a82971 55 // Based on push button and accelerometer inputs, determine which action
DCchico 2:4947d6a82971 56 // needs to be performed (may be no action).
DCchico 1:10330bce85cb 57 int get_action(GameInputs inputs)
DCchico 1:10330bce85cb 58 {
kblake9 22:33f1a0dff46c 59 if (inputs.b1 == 1) {
kblake9 22:33f1a0dff46c 60 return ACTION_BUTTON;
kblake9 22:33f1a0dff46c 61 } else if (inputs.b2 == 1) {
kblake9 22:33f1a0dff46c 62 return MENU_BUTTON;
kblake9 22:33f1a0dff46c 63 }
kblake9 22:33f1a0dff46c 64 if(abs(inputs.ax) > abs(inputs.ay)) {
kblake9 22:33f1a0dff46c 65 if (inputs.ax > 0) {
kblake9 22:33f1a0dff46c 66 pc.printf("going right\r\n");
kblake9 22:33f1a0dff46c 67 return GO_RIGHT;
kblake9 22:33f1a0dff46c 68 } else {
kblake9 22:33f1a0dff46c 69 pc.printf("going left\r\n");
kblake9 22:33f1a0dff46c 70 return GO_LEFT;
kblake9 22:33f1a0dff46c 71 }
kblake9 22:33f1a0dff46c 72 } else {
kblake9 22:33f1a0dff46c 73 if (inputs.ay > 0) {
kblake9 22:33f1a0dff46c 74 pc.printf("going up\r\n");
kblake9 22:33f1a0dff46c 75 return GO_UP;
kblake9 22:33f1a0dff46c 76 } else {
kblake9 22:33f1a0dff46c 77 pc.printf("going down\r\n");
kblake9 22:33f1a0dff46c 78 return GO_DOWN;
kblake9 22:33f1a0dff46c 79 }
kblake9 22:33f1a0dff46c 80 }
DCchico 1:10330bce85cb 81 }
DCchico 1:10330bce85cb 82 /**
DCchico 1:10330bce85cb 83 * Update the game state based on the user action. For example, if the user
DCchico 1:10330bce85cb 84 * requests GO_UP, then this function should determine if that is possible by
DCchico 1:10330bce85cb 85 * consulting the map, and update the snake position accordingly.
DCchico 1:10330bce85cb 86 *
DCchico 1:10330bce85cb 87 * Return values are defined below. FULL_DRAW indicates that for this frame,
DCchico 1:10330bce85cb 88 * draw_game should not optimize drawing and should draw every tile, even if
DCchico 1:10330bce85cb 89 * the snake has not moved.
DCchico 1:10330bce85cb 90 */
DCchico 1:10330bce85cb 91 int update_game(int action)
DCchico 1:10330bce85cb 92 {
kblake9 22:33f1a0dff46c 93 switch(action) {
kblake9 22:33f1a0dff46c 94 case GO_LEFT:
kblake9 22:33f1a0dff46c 95 MapItem* collideLeft = get_west(snake.head_x, snake.head_y);
kblake9 22:33f1a0dff46c 96 if (collideLeft != NULL) {
kblake9 22:33f1a0dff46c 97 } else {
kblake9 22:33f1a0dff46c 98 snake.head_px = snake.head_x;
kblake9 22:33f1a0dff46c 99 snake.head_x -=1;
kblake9 22:33f1a0dff46c 100 for (int i = 0; i < snake.score + 2; i++) {
kblake9 22:33f1a0dff46c 101 if (i == 0) {
kblake9 22:33f1a0dff46c 102 snake.locations[i].x -= 1;
kblake9 22:33f1a0dff46c 103 } else {
kblake9 22:33f1a0dff46c 104 snake.locations[i] = snake.locations[i-1];
kblake9 22:33f1a0dff46c 105 }
kblake9 22:33f1a0dff46c 106 }
kblake9 22:33f1a0dff46c 107 }
kblake9 22:33f1a0dff46c 108 break;
kblake9 22:33f1a0dff46c 109 case GO_RIGHT:
kblake9 22:33f1a0dff46c 110 MapItem* collideRight = get_east(snake.head_x, snake.head_y);
kblake9 22:33f1a0dff46c 111 if (collideRight != NULL) {
kblake9 22:33f1a0dff46c 112 } else {
kblake9 22:33f1a0dff46c 113 snake.head_px = snake.head_x;
kblake9 22:33f1a0dff46c 114 snake.head_x +=1;
kblake9 22:33f1a0dff46c 115 for (int i = 0; i < snake.score + 2; i++) {
kblake9 22:33f1a0dff46c 116 if (i == 0) {
kblake9 22:33f1a0dff46c 117 snake.locations[i].x += 1;
kblake9 22:33f1a0dff46c 118 } else {
kblake9 22:33f1a0dff46c 119 snake.locations[i] = snake.locations[i-1];
kblake9 22:33f1a0dff46c 120 }
kblake9 22:33f1a0dff46c 121 }
kblake9 22:33f1a0dff46c 122 }
kblake9 22:33f1a0dff46c 123 break;
kblake9 22:33f1a0dff46c 124 case GO_UP:
kblake9 22:33f1a0dff46c 125 MapItem* collideUp = get_north(snake.head_x, snake.head_y);
kblake9 22:33f1a0dff46c 126 if (collideUp != NULL) {
kblake9 22:33f1a0dff46c 127 } else {
kblake9 22:33f1a0dff46c 128 snake.head_py = snake.head_y;
kblake9 22:33f1a0dff46c 129 snake.head_y +=1;
kblake9 22:33f1a0dff46c 130 for (int i = 0; i < snake.score + 2; i++) {
kblake9 22:33f1a0dff46c 131 if (i == 0) {
kblake9 22:33f1a0dff46c 132 snake.locations[i].y += 1;
kblake9 22:33f1a0dff46c 133 } else {
kblake9 22:33f1a0dff46c 134 snake.locations[i] = snake.locations[i-1];
kblake9 22:33f1a0dff46c 135 }
kblake9 22:33f1a0dff46c 136 }
kblake9 22:33f1a0dff46c 137 }
kblake9 22:33f1a0dff46c 138 break;
kblake9 22:33f1a0dff46c 139 case GO_DOWN:
kblake9 22:33f1a0dff46c 140 MapItem* collideDown = get_south(snake.head_x, snake.head_y);
kblake9 22:33f1a0dff46c 141 if (collideDown != NULL) {
kblake9 22:33f1a0dff46c 142 } else {
kblake9 22:33f1a0dff46c 143 snake.head_py = snake.head_y;
kblake9 22:33f1a0dff46c 144 snake.head_y -= 1;
kblake9 22:33f1a0dff46c 145 for (int i = 0; i < snake.score + 2; i++) {
kblake9 22:33f1a0dff46c 146 if (i == 0) {
kblake9 22:33f1a0dff46c 147 snake.locations[i].y -= 1;
kblake9 22:33f1a0dff46c 148 } else {
kblake9 22:33f1a0dff46c 149 snake.locations[i] = snake.locations[i-1];
kblake9 22:33f1a0dff46c 150 }
kblake9 22:33f1a0dff46c 151 }
kblake9 22:33f1a0dff46c 152 }
kblake9 22:33f1a0dff46c 153 break;
kblake9 22:33f1a0dff46c 154 case ACTION_BUTTON:
kblake9 22:33f1a0dff46c 155 break;
kblake9 22:33f1a0dff46c 156 case MENU_BUTTON:
kblake9 22:33f1a0dff46c 157 break;
kblake9 22:33f1a0dff46c 158 default:
kblake9 22:33f1a0dff46c 159 return 0;
kblake9 22:33f1a0dff46c 160 }
kblake9 22:33f1a0dff46c 161 return 8;
DCchico 1:10330bce85cb 162 }
DCchico 1:10330bce85cb 163
DCchico 1:10330bce85cb 164 /**
DCchico 1:10330bce85cb 165 * Draw the upper status bar.
DCchico 1:10330bce85cb 166 */
kblake9 22:33f1a0dff46c 167 void draw_upper_status(){
kblake9 22:33f1a0dff46c 168 uLCD.locate(0, 0);
kblake9 22:33f1a0dff46c 169 uLCD.printf("X: %d, Y: %1d", snake.head_x, snake.head_y);
kblake9 22:33f1a0dff46c 170 }
DCchico 1:10330bce85cb 171
DCchico 1:10330bce85cb 172 /**
DCchico 1:10330bce85cb 173 * Draw the lower status bar.
DCchico 1:10330bce85cb 174 */
DCchico 1:10330bce85cb 175 void draw_lower_status()
DCchico 1:10330bce85cb 176 {
kblake9 22:33f1a0dff46c 177 uLCD.locate(0, 15);
kblake9 22:33f1a0dff46c 178 uLCD.printf("score: %d", snake.score);
DCchico 1:10330bce85cb 179 }
DCchico 1:10330bce85cb 180
DCchico 1:10330bce85cb 181 /**
DCchico 1:10330bce85cb 182 * Draw the border for the map.
DCchico 1:10330bce85cb 183 */
DCchico 1:10330bce85cb 184 void draw_border()
DCchico 1:10330bce85cb 185 {
DCchico 1:10330bce85cb 186 uLCD.filled_rectangle(0, 9, 127, 14, WHITE); // Top
DCchico 1:10330bce85cb 187 uLCD.filled_rectangle(0, 13, 2, 114, WHITE); // Left
DCchico 1:10330bce85cb 188 uLCD.filled_rectangle(0, 114, 127, 117, WHITE); // Bottom
DCchico 1:10330bce85cb 189 uLCD.filled_rectangle(124, 14, 127, 117, WHITE); // Right
DCchico 1:10330bce85cb 190 }
DCchico 1:10330bce85cb 191
DCchico 1:10330bce85cb 192 /**
DCchico 1:10330bce85cb 193 * Entry point for frame drawing. This should be called once per iteration of
DCchico 1:10330bce85cb 194 * the game loop. This draws all tiles on the screen, followed by the status
DCchico 1:10330bce85cb 195 * bars. Unless init is nonzero, this function will optimize drawing by only
DCchico 1:10330bce85cb 196 * drawing tiles that have changed from the previous frame.
DCchico 1:10330bce85cb 197 */
DCchico 1:10330bce85cb 198 void draw_game(int draw_option)
DCchico 1:10330bce85cb 199 {
DCchico 1:10330bce85cb 200 // Draw game border first
DCchico 1:10330bce85cb 201 if(draw_option == FULL_DRAW)
DCchico 1:10330bce85cb 202 {
DCchico 1:10330bce85cb 203 draw_border();
kblake9 22:33f1a0dff46c 204 int length = snake.score + 2;
kblake9 22:33f1a0dff46c 205 for (int i = 0; i < length; i++){
kblake9 22:33f1a0dff46c 206 if (i == 0) {
kblake9 22:33f1a0dff46c 207 draw_snake_head(snake.locations[0].x, snake.locations[0].y);
kblake9 22:33f1a0dff46c 208 } else if (i == length - 1) {
kblake9 22:33f1a0dff46c 209 draw_snake_tail(snake.locations[i].x, snake.locations[i].y);
kblake9 22:33f1a0dff46c 210 } else {
kblake9 22:33f1a0dff46c 211 draw_snake_body(snake.locations[i].x, snake.locations[i].y);
kblake9 22:33f1a0dff46c 212 }
kblake9 22:33f1a0dff46c 213 }
DCchico 1:10330bce85cb 214 }
DCchico 1:10330bce85cb 215 // Iterate over all visible map tiles
DCchico 1:10330bce85cb 216 for (int i = -5; i <= 5; i++) { // Iterate over columns of tiles
DCchico 1:10330bce85cb 217 for (int j = -4; j <= 4; j++) { // Iterate over one column of tiles
DCchico 1:10330bce85cb 218 // Here, we have a given (i,j)
DCchico 1:10330bce85cb 219
DCchico 1:10330bce85cb 220 // Compute the current map (x,y) of this tile
DCchico 1:10330bce85cb 221 int x = i + snake.head_x;
DCchico 1:10330bce85cb 222 int y = j + snake.head_y;
DCchico 1:10330bce85cb 223
DCchico 1:10330bce85cb 224 // Compute the previous map (px, py) of this tile
DCchico 1:10330bce85cb 225 int px = i + snake.head_px;
DCchico 1:10330bce85cb 226 int py = j + snake.head_py;
DCchico 1:10330bce85cb 227
DCchico 1:10330bce85cb 228 // Compute u,v coordinates for drawing
DCchico 1:10330bce85cb 229 int u = (i+5)*11 + 3;
DCchico 1:10330bce85cb 230 int v = (j+4)*11 + 15;
DCchico 1:10330bce85cb 231
DCchico 1:10330bce85cb 232 // Figure out what to draw
DCchico 1:10330bce85cb 233 DrawFunc draw = NULL;
DCchico 1:10330bce85cb 234 if (x >= 0 && y >= 0 && x < map_width() && y < map_height()) { // Current (i,j) in the map
DCchico 1:10330bce85cb 235 MapItem* curr_item = get_here(x, y);
DCchico 1:10330bce85cb 236 MapItem* prev_item = get_here(px, py);
DCchico 1:10330bce85cb 237 if (draw_option || curr_item != prev_item) { // Only draw if they're different
DCchico 1:10330bce85cb 238 if (curr_item) { // There's something here! Draw it
DCchico 1:10330bce85cb 239 draw = curr_item->draw;
DCchico 1:10330bce85cb 240 } else { // There used to be something, but now there isn't
DCchico 1:10330bce85cb 241 draw = draw_nothing;
DCchico 1:10330bce85cb 242 }
DCchico 1:10330bce85cb 243 } else if (curr_item && curr_item->type == CLEAR) {
DCchico 1:10330bce85cb 244 // This is a special case for erasing things like doors.
DCchico 1:10330bce85cb 245 draw = curr_item->draw; // i.e. draw_nothing
DCchico 1:10330bce85cb 246 }
DCchico 1:10330bce85cb 247 } else if (draw_option) { // If doing a full draw, but we're out of bounds, draw the walls.
DCchico 1:10330bce85cb 248 draw = draw_wall;
DCchico 1:10330bce85cb 249 }
DCchico 1:10330bce85cb 250
DCchico 1:10330bce85cb 251 // Actually draw the tile
DCchico 1:10330bce85cb 252 if (draw) draw(u, v);
DCchico 1:10330bce85cb 253 }
DCchico 1:10330bce85cb 254 }
DCchico 1:10330bce85cb 255
DCchico 1:10330bce85cb 256 // Draw status bars
DCchico 1:10330bce85cb 257 draw_upper_status();
DCchico 1:10330bce85cb 258 draw_lower_status();
DCchico 1:10330bce85cb 259 }
DCchico 1:10330bce85cb 260
DCchico 1:10330bce85cb 261 /**
DCchico 1:10330bce85cb 262 * Initialize the main world map. Add walls around the edges, interior chambers,
DCchico 1:10330bce85cb 263 * and plants in the background so you can see motion.
DCchico 1:10330bce85cb 264 */
DCchico 1:10330bce85cb 265 void init_main_map()
DCchico 1:10330bce85cb 266 {
DCchico 1:10330bce85cb 267 // "Random" plants
DCchico 1:10330bce85cb 268 Map* map = set_active_map(0);
kblake9 18:92431a28b46b 269 pc.printf("set active map successfully\r\n");
DCchico 1:10330bce85cb 270 for(int i = map_width() + 3; i < map_area(); i += 39) {
DCchico 1:10330bce85cb 271 add_goodie(i % map_width(), i / map_width());
DCchico 1:10330bce85cb 272 }
DCchico 1:10330bce85cb 273 pc.printf("plants\r\n");
DCchico 1:10330bce85cb 274
DCchico 1:10330bce85cb 275 pc.printf("Adding walls!\r\n");
DCchico 1:10330bce85cb 276 add_wall(0, 0, HORIZONTAL, map_width());
DCchico 1:10330bce85cb 277 add_wall(0, map_height()-1, HORIZONTAL, map_width());
DCchico 1:10330bce85cb 278 add_wall(0, 0, VERTICAL, map_height());
DCchico 1:10330bce85cb 279 add_wall(map_width()-1, 0, VERTICAL, map_height());
DCchico 1:10330bce85cb 280 pc.printf("Walls done!\r\n");
DCchico 1:10330bce85cb 281
DCchico 1:10330bce85cb 282 add_snake_head(snake.locations[0].x, snake.locations[0].y);
kblake9 18:92431a28b46b 283 add_snake_tail(snake.locations[1].x, snake.locations[1].y);
DCchico 1:10330bce85cb 284
DCchico 1:10330bce85cb 285 pc.printf("Add extra chamber\r\n");
DCchico 1:10330bce85cb 286 add_wall(30, 0, VERTICAL, 10);
DCchico 1:10330bce85cb 287 add_wall(30, 10, HORIZONTAL, 10);
DCchico 1:10330bce85cb 288 add_wall(39, 0, VERTICAL, 10);
DCchico 1:10330bce85cb 289 pc.printf("Added!\r\n");
DCchico 1:10330bce85cb 290
DCchico 1:10330bce85cb 291
DCchico 1:10330bce85cb 292 // Add stairs to chamber (map 1)
DCchico 1:10330bce85cb 293 //add_stairs(15, 5, 1, 5, 5);
DCchico 1:10330bce85cb 294
DCchico 1:10330bce85cb 295 // profile_hashtable();
DCchico 1:10330bce85cb 296 print_map();
DCchico 1:10330bce85cb 297 }
DCchico 1:10330bce85cb 298
DCchico 1:10330bce85cb 299 /**
DCchico 1:10330bce85cb 300 * Program entry point! This is where it all begins.
DCchico 1:10330bce85cb 301 * This function or all the parts of the game. Most of your
DCchico 1:10330bce85cb 302 * implementation should be elsewhere - this holds the game loop, and should
DCchico 1:10330bce85cb 303 * read like a road map for the rest of the code.
DCchico 1:10330bce85cb 304 */
DCchico 1:10330bce85cb 305 int main()
DCchico 1:10330bce85cb 306 {
DCchico 1:10330bce85cb 307 // First things first: initialize hardware
DCchico 1:10330bce85cb 308 ASSERT_P(hardware_init() == ERROR_NONE, "Hardware init failed!");
kblake9 18:92431a28b46b 309 pc.printf("Hardware Succeeded\r\n");
DCchico 1:10330bce85cb 310 snake_init(&snake);
kblake9 18:92431a28b46b 311 pc.printf("snake initialized\r\n");
DCchico 2:4947d6a82971 312 // 0. Initialize the maps -- implement this function:
DCchico 1:10330bce85cb 313 maps_init();
kblake9 18:92431a28b46b 314 pc.printf("ran map init\r\n");
DCchico 1:10330bce85cb 315 init_main_map();
kblake9 18:92431a28b46b 316 pc.printf("If we reach here we good\r\n");
DCchico 1:10330bce85cb 317
DCchico 1:10330bce85cb 318 // Initialize game state
DCchico 1:10330bce85cb 319 set_active_map(0);
DCchico 1:10330bce85cb 320 snake.head_x = snake.head_y = 5;
DCchico 1:10330bce85cb 321 // Initial drawing
DCchico 1:10330bce85cb 322 draw_game(FULL_DRAW);
kblake9 22:33f1a0dff46c 323 pc.printf("Do we ever draw the whole game?\r\n");
DCchico 1:10330bce85cb 324 // Main game loop
DCchico 1:10330bce85cb 325 while(1) {
kblake9 22:33f1a0dff46c 326 pc.printf("in loop now\r\n");
DCchico 1:10330bce85cb 327 // Timer to measure game update speed
DCchico 1:10330bce85cb 328 Timer t;
DCchico 1:10330bce85cb 329 t.start();
DCchico 1:10330bce85cb 330
DCchico 2:4947d6a82971 331 // 1. Read inputs -- implement this function:
DCchico 2:4947d6a82971 332 GameInputs inputs = read_inputs();
DCchico 2:4947d6a82971 333
DCchico 2:4947d6a82971 334 // 2. Determine action (move, act, menu, etc.) -- implement this function:
DCchico 2:4947d6a82971 335 int action = get_action(inputs);
DCchico 2:4947d6a82971 336 // 3. Update game -- implement this function:
DCchico 2:4947d6a82971 337 int result = update_game(action);
DCchico 2:4947d6a82971 338 // 3b. Check for game over based on result
DCchico 2:4947d6a82971 339 // and if so, handle game over -- implement this.
DCchico 2:4947d6a82971 340
DCchico 2:4947d6a82971 341 // 4. Draw screen -- provided:
DCchico 2:4947d6a82971 342 draw_game(result);
DCchico 2:4947d6a82971 343
DCchico 1:10330bce85cb 344 // Compute update time
DCchico 1:10330bce85cb 345 t.stop();
DCchico 1:10330bce85cb 346 int dt = t.read_ms();
DCchico 1:10330bce85cb 347
DCchico 1:10330bce85cb 348 // Display and wait
DCchico 1:10330bce85cb 349 // NOTE: Text is 8 pixels tall
DCchico 1:10330bce85cb 350 if (dt < 100) wait_ms(100 - dt);
DCchico 1:10330bce85cb 351 }
DCchico 1:10330bce85cb 352 }
DCchico 1:10330bce85cb 353
DCchico 1:10330bce85cb 354 // Plays a wavfile
DCchico 1:10330bce85cb 355 void playSound(char* wav)
DCchico 1:10330bce85cb 356 {
DCchico 1:10330bce85cb 357
DCchico 1:10330bce85cb 358 }