Adventure game written for ECE2035 at the Georgia Institute of Technology

Dependencies:   mbed wave_player 4DGL-uLCD-SE MMA8452

Committer:
trmontgomery
Date:
Wed Apr 18 20:18:51 2018 +0000
Revision:
3:289762133fd6
Parent:
2:0876296d9473
Child:
4:cdc54191ff07
The second map works!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rconnorlawson 0:35660d7952f7 1 // Project includes
rconnorlawson 0:35660d7952f7 2 #include "globals.h"
rconnorlawson 0:35660d7952f7 3 #include "hardware.h"
rconnorlawson 0:35660d7952f7 4 #include "map.h"
rconnorlawson 0:35660d7952f7 5 #include "graphics.h"
rconnorlawson 0:35660d7952f7 6 #include "speech.h"
trmontgomery 2:0876296d9473 7 #include "startmenu.h"
rconnorlawson 0:35660d7952f7 8
rconnorlawson 0:35660d7952f7 9 // Functions in this file
rconnorlawson 0:35660d7952f7 10 int get_action (GameInputs inputs);
rconnorlawson 0:35660d7952f7 11 int update_game (int action);
rconnorlawson 0:35660d7952f7 12 void draw_game (int init);
trmontgomery 3:289762133fd6 13 void init_main_map();
trmontgomery 3:289762133fd6 14 void init_house_map();
rconnorlawson 0:35660d7952f7 15 int main ();
rconnorlawson 0:35660d7952f7 16
rconnorlawson 0:35660d7952f7 17 /**
rconnorlawson 0:35660d7952f7 18 * The main game state. Must include Player locations and previous locations for
rconnorlawson 0:35660d7952f7 19 * drawing to work properly. Other items can be added as needed.
rconnorlawson 0:35660d7952f7 20 */
rconnorlawson 0:35660d7952f7 21 struct {
rconnorlawson 0:35660d7952f7 22 int x,y; // Current locations
rconnorlawson 0:35660d7952f7 23 int px, py; // Previous locations
rconnorlawson 0:35660d7952f7 24 int has_key;
trmontgomery 2:0876296d9473 25 int quest_complete;
rconnorlawson 0:35660d7952f7 26 } Player;
rconnorlawson 0:35660d7952f7 27
trmontgomery 3:289762133fd6 28 int house_enabled = false;
trmontgomery 2:0876296d9473 29 int door_open = false;
trmontgomery 2:0876296d9473 30 int game_over = false;
trmontgomery 2:0876296d9473 31 int health = 0;
trmontgomery 2:0876296d9473 32
rconnorlawson 0:35660d7952f7 33 /**
rconnorlawson 0:35660d7952f7 34 * Given the game inputs, determine what kind of update needs to happen.
rconnorlawson 0:35660d7952f7 35 * Possbile return values are defined below.
rconnorlawson 0:35660d7952f7 36 */
rconnorlawson 0:35660d7952f7 37 #define NO_ACTION 0
trmontgomery 2:0876296d9473 38 #define BUTTON1 1
trmontgomery 2:0876296d9473 39 #define BUTTON2 2
trmontgomery 2:0876296d9473 40 #define BUTTON3 3
trmontgomery 2:0876296d9473 41 #define MENU_BUTTON 4
trmontgomery 2:0876296d9473 42 #define GO_LEFT 5
trmontgomery 2:0876296d9473 43 #define GO_RIGHT 6
trmontgomery 2:0876296d9473 44 #define GO_UP 7
trmontgomery 2:0876296d9473 45 #define GO_DOWN 8
rconnorlawson 0:35660d7952f7 46 int get_action(GameInputs inputs)
rconnorlawson 0:35660d7952f7 47 {
trmontgomery 2:0876296d9473 48 if(!inputs.b1){
trmontgomery 2:0876296d9473 49 return BUTTON1;
trmontgomery 2:0876296d9473 50 }
trmontgomery 2:0876296d9473 51 if(!inputs.b2){
trmontgomery 2:0876296d9473 52 return BUTTON2;
trmontgomery 2:0876296d9473 53 }
trmontgomery 2:0876296d9473 54 if (!inputs.b3){
trmontgomery 2:0876296d9473 55 return MENU_BUTTON;
trmontgomery 2:0876296d9473 56 }
trmontgomery 2:0876296d9473 57 if ((inputs.ay > 0.05 && inputs.ay < 0.5) && abs(inputs.ax) < .5){
trmontgomery 2:0876296d9473 58 return GO_LEFT;
trmontgomery 2:0876296d9473 59 } else if ((inputs.ay < -0.05 && inputs.ay > -0.5) && abs(inputs.ax) < .5){
trmontgomery 2:0876296d9473 60 return GO_RIGHT;
trmontgomery 2:0876296d9473 61 }else if (inputs.ax > 0.05 && inputs.ax < 0.5){
trmontgomery 2:0876296d9473 62 return GO_DOWN;
trmontgomery 2:0876296d9473 63 }else if (inputs.ax < -0.05 && inputs.ax > -0.5){
trmontgomery 2:0876296d9473 64 return GO_UP;
trmontgomery 2:0876296d9473 65 }
rconnorlawson 0:35660d7952f7 66 return NO_ACTION;
rconnorlawson 0:35660d7952f7 67 }
rconnorlawson 0:35660d7952f7 68
rconnorlawson 0:35660d7952f7 69 /**
rconnorlawson 0:35660d7952f7 70 * Update the game state based on the user action. For example, if the user
rconnorlawson 0:35660d7952f7 71 * requests GO_UP, then this function should determine if that is possible by
rconnorlawson 0:35660d7952f7 72 * consulting the map, and update the Player position accordingly.
rconnorlawson 0:35660d7952f7 73 *
rconnorlawson 0:35660d7952f7 74 * Return values are defined below. FULL_DRAW indicates that for this frame,
rconnorlawson 0:35660d7952f7 75 * draw_game should not optimize drawing and should draw every tile, even if
rconnorlawson 0:35660d7952f7 76 * the player has not moved.
rconnorlawson 0:35660d7952f7 77 */
rconnorlawson 0:35660d7952f7 78 #define NO_RESULT 0
rconnorlawson 0:35660d7952f7 79 #define GAME_OVER 1
rconnorlawson 0:35660d7952f7 80 #define FULL_DRAW 2
rconnorlawson 0:35660d7952f7 81 int update_game(int action)
rconnorlawson 0:35660d7952f7 82 {
rconnorlawson 0:35660d7952f7 83 // Save player previous location before updating
rconnorlawson 0:35660d7952f7 84 Player.px = Player.x;
rconnorlawson 0:35660d7952f7 85 Player.py = Player.y;
rconnorlawson 0:35660d7952f7 86
rconnorlawson 0:35660d7952f7 87 // Do different things based on the each action.
rconnorlawson 0:35660d7952f7 88 // You can define functions like "go_up()" that get called for each case.
trmontgomery 2:0876296d9473 89 switch(action) //have a function called for each type of object. Pass a pointer to the object to the interact function
rconnorlawson 0:35660d7952f7 90 {
trmontgomery 2:0876296d9473 91 case GO_UP:
trmontgomery 2:0876296d9473 92 if (MapItem* object = get_north(Player.x, Player.y)){
trmontgomery 2:0876296d9473 93 if (object -> type == NPC){
trmontgomery 2:0876296d9473 94 NonPlayer* n = (NonPlayer*)object -> data;
trmontgomery 2:0876296d9473 95 if(n -> quest_requested == false){
trmontgomery 2:0876296d9473 96 speech("Get dat money", "its dat way");
trmontgomery 2:0876296d9473 97 n -> quest_requested = true;
trmontgomery 2:0876296d9473 98 } else if (Player.quest_complete == false){ //should quest complete be in the player struct?
trmontgomery 2:0876296d9473 99 speech("What are u waitin for?", "get it boi");
trmontgomery 2:0876296d9473 100 } else if (n -> has_key == true) {
trmontgomery 2:0876296d9473 101 speech("Congrats!", "Here's the keyyyy");
trmontgomery 2:0876296d9473 102 n -> has_key = false;
trmontgomery 2:0876296d9473 103 Player.has_key = true;
trmontgomery 2:0876296d9473 104 } else if(n -> has_key == false){
trmontgomery 2:0876296d9473 105 speech("Congrats!", "Quest complete.");
trmontgomery 2:0876296d9473 106 }
trmontgomery 2:0876296d9473 107 // else if (object -> type == DOOR){
trmontgomery 2:0876296d9473 108 // bool o = object -> data;
trmontgomery 2:0876296d9473 109 // if (Player.has_key == true){
trmontgomery 2:0876296d9473 110 // o = true;
trmontgomery 2:0876296d9473 111 // }
trmontgomery 2:0876296d9473 112 //}
trmontgomery 2:0876296d9473 113
trmontgomery 2:0876296d9473 114 return NO_RESULT;
trmontgomery 2:0876296d9473 115 }
trmontgomery 2:0876296d9473 116 else if (object -> walkable == false){
trmontgomery 2:0876296d9473 117 return NO_RESULT;
trmontgomery 2:0876296d9473 118 }
trmontgomery 2:0876296d9473 119 }
trmontgomery 2:0876296d9473 120 Player.y = Player.y - 1;
trmontgomery 2:0876296d9473 121 return FULL_DRAW;
trmontgomery 2:0876296d9473 122 case GO_LEFT:
trmontgomery 2:0876296d9473 123 if (MapItem* object = get_west(Player.x, Player.y)){
trmontgomery 2:0876296d9473 124 if (object -> type == ROCK){
trmontgomery 2:0876296d9473 125 add_rock(Player.x + 2, Player.y);
trmontgomery 2:0876296d9473 126 map_erase(Player.x+1, Player.y);
trmontgomery 2:0876296d9473 127 Player.x = Player.x + 1;
trmontgomery 2:0876296d9473 128 Player.quest_complete = true;
trmontgomery 2:0876296d9473 129 return FULL_DRAW;
trmontgomery 2:0876296d9473 130
trmontgomery 2:0876296d9473 131 } else if(object -> type == SPIKE){
trmontgomery 2:0876296d9473 132 //lower health bar
trmontgomery 2:0876296d9473 133 health++;
trmontgomery 2:0876296d9473 134 return NO_RESULT;
trmontgomery 2:0876296d9473 135
trmontgomery 2:0876296d9473 136 }
trmontgomery 2:0876296d9473 137 if (object -> walkable == false){
trmontgomery 2:0876296d9473 138 return NO_RESULT;
trmontgomery 2:0876296d9473 139 }
trmontgomery 2:0876296d9473 140 }
trmontgomery 2:0876296d9473 141 Player.x = Player.x + 1;
trmontgomery 2:0876296d9473 142 return FULL_DRAW;
trmontgomery 2:0876296d9473 143 case GO_DOWN:
trmontgomery 2:0876296d9473 144 if (MapItem* object = get_south(Player.x, Player.y)){
trmontgomery 2:0876296d9473 145 if (object -> type == DOOR){
trmontgomery 2:0876296d9473 146 if (Player.has_key == true){
trmontgomery 2:0876296d9473 147 map_erase(Player.x, Player.y + 1);
trmontgomery 2:0876296d9473 148 Player.y = Player.y + 1;
trmontgomery 2:0876296d9473 149 door_open = true;
trmontgomery 2:0876296d9473 150 return FULL_DRAW;
trmontgomery 2:0876296d9473 151 }
trmontgomery 2:0876296d9473 152 return NO_RESULT;
trmontgomery 2:0876296d9473 153 }
trmontgomery 2:0876296d9473 154 if (object -> walkable == false){
trmontgomery 2:0876296d9473 155 return NO_RESULT;
trmontgomery 2:0876296d9473 156 }
trmontgomery 2:0876296d9473 157 }
trmontgomery 2:0876296d9473 158 Player.y = Player.y + 1;
trmontgomery 2:0876296d9473 159 return FULL_DRAW;
trmontgomery 2:0876296d9473 160
trmontgomery 2:0876296d9473 161 case GO_RIGHT:
trmontgomery 2:0876296d9473 162 if (MapItem* object = get_east(Player.x, Player.y)){
trmontgomery 2:0876296d9473 163 if (object -> type == GOAL){
trmontgomery 2:0876296d9473 164 if(door_open == true){
trmontgomery 2:0876296d9473 165 game_over = true;
trmontgomery 2:0876296d9473 166 return NO_RESULT;
trmontgomery 2:0876296d9473 167 }
trmontgomery 2:0876296d9473 168
trmontgomery 3:289762133fd6 169 } else if(object -> type == DOOR){
trmontgomery 3:289762133fd6 170 init_house_map(); //add a bit of a wait here to simulate going into the house
trmontgomery 3:289762133fd6 171 }
trmontgomery 2:0876296d9473 172 if (object -> walkable == false){
trmontgomery 2:0876296d9473 173 return NO_RESULT;
trmontgomery 2:0876296d9473 174 }
trmontgomery 2:0876296d9473 175 }
trmontgomery 2:0876296d9473 176 Player.x = Player.x - 1;
trmontgomery 2:0876296d9473 177 return FULL_DRAW;
trmontgomery 2:0876296d9473 178
trmontgomery 2:0876296d9473 179 case BUTTON1:
trmontgomery 2:0876296d9473 180 omni();
trmontgomery 2:0876296d9473 181 break;
trmontgomery 2:0876296d9473 182 case BUTTON2:
trmontgomery 2:0876296d9473 183 break;
trmontgomery 2:0876296d9473 184 case MENU_BUTTON:
trmontgomery 2:0876296d9473 185
trmontgomery 2:0876296d9473 186 break;
rconnorlawson 0:35660d7952f7 187 default: break;
rconnorlawson 0:35660d7952f7 188 }
rconnorlawson 0:35660d7952f7 189 return NO_RESULT;
rconnorlawson 0:35660d7952f7 190 }
rconnorlawson 0:35660d7952f7 191
rconnorlawson 0:35660d7952f7 192 /**
rconnorlawson 0:35660d7952f7 193 * Entry point for frame drawing. This should be called once per iteration of
rconnorlawson 0:35660d7952f7 194 * the game loop. This draws all tiles on the screen, followed by the status
rconnorlawson 0:35660d7952f7 195 * bars. Unless init is nonzero, this function will optimize drawing by only
rconnorlawson 0:35660d7952f7 196 * drawing tiles that have changed from the previous frame.
rconnorlawson 0:35660d7952f7 197 */
rconnorlawson 0:35660d7952f7 198 void draw_game(int init)
rconnorlawson 0:35660d7952f7 199 {
trmontgomery 2:0876296d9473 200 // int param1;
trmontgomery 2:0876296d9473 201 //int param2;
rconnorlawson 0:35660d7952f7 202 // Draw game border first
rconnorlawson 0:35660d7952f7 203 if(init) draw_border();
rconnorlawson 0:35660d7952f7 204
rconnorlawson 0:35660d7952f7 205 // Iterate over all visible map tiles
rconnorlawson 0:35660d7952f7 206 for (int i = -5; i <= 5; i++) // Iterate over columns of tiles
rconnorlawson 0:35660d7952f7 207 {
rconnorlawson 0:35660d7952f7 208 for (int j = -4; j <= 4; j++) // Iterate over one column of tiles
rconnorlawson 0:35660d7952f7 209 {
rconnorlawson 0:35660d7952f7 210 // Here, we have a given (i,j)
rconnorlawson 0:35660d7952f7 211
rconnorlawson 0:35660d7952f7 212 // Compute the current map (x,y) of this tile
rconnorlawson 0:35660d7952f7 213 int x = i + Player.x;
rconnorlawson 0:35660d7952f7 214 int y = j + Player.y;
rconnorlawson 0:35660d7952f7 215
rconnorlawson 0:35660d7952f7 216 // Compute the previous map (px, py) of this tile
rconnorlawson 0:35660d7952f7 217 int px = i + Player.px;
rconnorlawson 0:35660d7952f7 218 int py = j + Player.py;
rconnorlawson 0:35660d7952f7 219
rconnorlawson 0:35660d7952f7 220 // Compute u,v coordinates for drawing
rconnorlawson 0:35660d7952f7 221 int u = (i+5)*11 + 3;
rconnorlawson 0:35660d7952f7 222 int v = (j+4)*11 + 15;
rconnorlawson 0:35660d7952f7 223
rconnorlawson 0:35660d7952f7 224 // Figure out what to draw
rconnorlawson 0:35660d7952f7 225 DrawFunc draw = NULL;
trmontgomery 2:0876296d9473 226 if (init && i == 0 && j == 0) // Only draw the player on init (this is when the loop hits the center of the screen)
rconnorlawson 0:35660d7952f7 227 {
rconnorlawson 0:35660d7952f7 228 draw_player(u, v, Player.has_key);
trmontgomery 2:0876296d9473 229
rconnorlawson 0:35660d7952f7 230 continue;
rconnorlawson 0:35660d7952f7 231 }
rconnorlawson 0:35660d7952f7 232 else if (x >= 0 && y >= 0 && x < map_width() && y < map_height()) // Current (i,j) in the map
rconnorlawson 0:35660d7952f7 233 {
rconnorlawson 0:35660d7952f7 234 MapItem* curr_item = get_here(x, y);
rconnorlawson 0:35660d7952f7 235 MapItem* prev_item = get_here(px, py);
rconnorlawson 0:35660d7952f7 236 if (init || curr_item != prev_item) // Only draw if they're different
rconnorlawson 0:35660d7952f7 237 {
rconnorlawson 0:35660d7952f7 238 if (curr_item) // There's something here! Draw it
rconnorlawson 0:35660d7952f7 239 {
trmontgomery 2:0876296d9473 240 //if (curr_item -> type == ROCK){
trmontgomery 2:0876296d9473 241 //set parameters
trmontgomery 2:0876296d9473 242 // Rock* r = (Rock*) curr_item -> data;
trmontgomery 2:0876296d9473 243 //param1 = r -> x;
trmontgomery 2:0876296d9473 244 //param2 = r -> y;
trmontgomery 2:0876296d9473 245 //}
rconnorlawson 0:35660d7952f7 246 draw = curr_item->draw;
rconnorlawson 0:35660d7952f7 247 }
rconnorlawson 0:35660d7952f7 248 else // There used to be something, but now there isn't
rconnorlawson 0:35660d7952f7 249 {
trmontgomery 3:289762133fd6 250 if (house_enabled){
trmontgomery 3:289762133fd6 251 draw = draw_house_floor;
trmontgomery 3:289762133fd6 252 }
rconnorlawson 0:35660d7952f7 253 draw = draw_nothing;
rconnorlawson 0:35660d7952f7 254 }
rconnorlawson 0:35660d7952f7 255 }
rconnorlawson 0:35660d7952f7 256 }
rconnorlawson 0:35660d7952f7 257 else if (init) // If doing a full draw, but we're out of bounds, draw the walls.
rconnorlawson 0:35660d7952f7 258 {
rconnorlawson 0:35660d7952f7 259 draw = draw_wall;
rconnorlawson 0:35660d7952f7 260 }
rconnorlawson 0:35660d7952f7 261
rconnorlawson 0:35660d7952f7 262 // Actually draw the tile
trmontgomery 2:0876296d9473 263 //MapItem* curr_item = get_here(x, y);
trmontgomery 2:0876296d9473 264 //MapItem* prev_item = get_here(px, py);
trmontgomery 2:0876296d9473 265 if (draw){
trmontgomery 2:0876296d9473 266 // if(curr_item){
trmontgomery 2:0876296d9473 267 // if(curr_item -> type == ROCK){
trmontgomery 2:0876296d9473 268 // draw(param1, param2);
trmontgomery 2:0876296d9473 269 //}
trmontgomery 2:0876296d9473 270 //}
trmontgomery 2:0876296d9473 271 draw(u,v);
trmontgomery 2:0876296d9473 272 }
rconnorlawson 0:35660d7952f7 273 }
rconnorlawson 0:35660d7952f7 274 }
rconnorlawson 0:35660d7952f7 275
rconnorlawson 0:35660d7952f7 276 // Draw status bars
trmontgomery 2:0876296d9473 277 draw_upper_status(health);
trmontgomery 2:0876296d9473 278 draw_lower_status(Player.x, Player.y);
rconnorlawson 0:35660d7952f7 279 }
rconnorlawson 0:35660d7952f7 280
rconnorlawson 0:35660d7952f7 281
rconnorlawson 0:35660d7952f7 282 /**
rconnorlawson 0:35660d7952f7 283 * Initialize the main world map. Add walls around the edges, interior chambers,
rconnorlawson 0:35660d7952f7 284 * and plants in the background so you can see motion.
rconnorlawson 0:35660d7952f7 285 */
rconnorlawson 0:35660d7952f7 286 void init_main_map()
rconnorlawson 0:35660d7952f7 287 {
rconnorlawson 0:35660d7952f7 288 // "Random" plants
trmontgomery 3:289762133fd6 289
trmontgomery 3:289762133fd6 290 maps_init(50, 50, 5);
rconnorlawson 0:35660d7952f7 291 for(int i = map_width() + 3; i < map_area(); i += 39)
rconnorlawson 0:35660d7952f7 292 {
rconnorlawson 0:35660d7952f7 293 add_plant(i % map_width(), i / map_width());
rconnorlawson 0:35660d7952f7 294 }
trmontgomery 2:0876296d9473 295
trmontgomery 2:0876296d9473 296 srand(time(NULL));
trmontgomery 2:0876296d9473 297 for(int i = 0; i < 30; i++)
trmontgomery 2:0876296d9473 298 {
trmontgomery 2:0876296d9473 299 int x = rand()%((map_width()+1)-1) + 1;
trmontgomery 2:0876296d9473 300 int y = rand()%((map_height()+1)-1) + 1;
trmontgomery 2:0876296d9473 301 add_spike(x, y);
trmontgomery 2:0876296d9473 302 }
trmontgomery 2:0876296d9473 303
rconnorlawson 0:35660d7952f7 304 pc.printf("plants\r\n");
rconnorlawson 0:35660d7952f7 305
rconnorlawson 0:35660d7952f7 306 pc.printf("Adding walls!\r\n");
rconnorlawson 0:35660d7952f7 307 add_wall(0, 0, HORIZONTAL, map_width());
rconnorlawson 0:35660d7952f7 308 add_wall(0, map_height()-1, HORIZONTAL, map_width());
rconnorlawson 0:35660d7952f7 309 add_wall(0, 0, VERTICAL, map_height());
rconnorlawson 0:35660d7952f7 310 add_wall(map_width()-1, 0, VERTICAL, map_height());
trmontgomery 2:0876296d9473 311 add_wall(20, 20, HORIZONTAL, 15);
trmontgomery 2:0876296d9473 312 add_npc(13, 13);
trmontgomery 2:0876296d9473 313 add_rock(6, 42);
trmontgomery 2:0876296d9473 314 add_door(7, 48);
trmontgomery 2:0876296d9473 315 add_goal(43, 5);
rconnorlawson 0:35660d7952f7 316 pc.printf("Walls done!\r\n");
rconnorlawson 0:35660d7952f7 317
rconnorlawson 0:35660d7952f7 318 print_map();
rconnorlawson 0:35660d7952f7 319 }
rconnorlawson 0:35660d7952f7 320
trmontgomery 3:289762133fd6 321 void init_house_map()
trmontgomery 3:289762133fd6 322 {
trmontgomery 3:289762133fd6 323
trmontgomery 3:289762133fd6 324 Map* map = set_active_map(1); //one is a house map
trmontgomery 3:289762133fd6 325 maps_init(20, 20, 5);
trmontgomery 3:289762133fd6 326 Player.x = Player.y = 5;
trmontgomery 3:289762133fd6 327
trmontgomery 3:289762133fd6 328 add_wall(0, 0, HORIZONTAL, map_width());
trmontgomery 3:289762133fd6 329 add_wall(0, map_height()-1, HORIZONTAL, map_width());
trmontgomery 3:289762133fd6 330 add_wall(0, 0, VERTICAL, map_height());
trmontgomery 3:289762133fd6 331 add_wall(map_width()-1, 0, VERTICAL, map_height());
trmontgomery 3:289762133fd6 332
trmontgomery 3:289762133fd6 333 add_npc(5, 15); //place NPC in the house
trmontgomery 3:289762133fd6 334 }
trmontgomery 3:289762133fd6 335
rconnorlawson 0:35660d7952f7 336 /**
rconnorlawson 0:35660d7952f7 337 * Program entry point! This is where it all begins.
rconnorlawson 0:35660d7952f7 338 * This function orchestrates all the parts of the game. Most of your
rconnorlawson 0:35660d7952f7 339 * implementation should be elsewhere - this holds the game loop, and should
rconnorlawson 0:35660d7952f7 340 * read like a road map for the rest of the code.
rconnorlawson 0:35660d7952f7 341 */
rconnorlawson 0:35660d7952f7 342 int main()
rconnorlawson 0:35660d7952f7 343 {
trmontgomery 3:289762133fd6 344 Map* map = set_active_map(0);
trmontgomery 2:0876296d9473 345 int start = menu();
rconnorlawson 0:35660d7952f7 346 // First things first: initialize hardware
rconnorlawson 0:35660d7952f7 347 ASSERT_P(hardware_init() == ERROR_NONE, "Hardware init failed!");
rconnorlawson 0:35660d7952f7 348
rconnorlawson 0:35660d7952f7 349 // Initialize the maps
trmontgomery 3:289762133fd6 350
rconnorlawson 0:35660d7952f7 351 init_main_map();
rconnorlawson 0:35660d7952f7 352
trmontgomery 3:289762133fd6 353
rconnorlawson 0:35660d7952f7 354 // Initialize game state
trmontgomery 3:289762133fd6 355 //set_active_map(0); //this doesn't need to be here twice
rconnorlawson 0:35660d7952f7 356 Player.x = Player.y = 5;
trmontgomery 2:0876296d9473 357 Player.quest_complete = false;
rconnorlawson 0:35660d7952f7 358
rconnorlawson 0:35660d7952f7 359 // Initial drawing
rconnorlawson 0:35660d7952f7 360 draw_game(true);
rconnorlawson 0:35660d7952f7 361
rconnorlawson 0:35660d7952f7 362 // Main game loop
rconnorlawson 0:35660d7952f7 363 while(1)
rconnorlawson 0:35660d7952f7 364 {
rconnorlawson 0:35660d7952f7 365 // Timer to measure game update speed
rconnorlawson 0:35660d7952f7 366 Timer t; t.start();
rconnorlawson 0:35660d7952f7 367
trmontgomery 2:0876296d9473 368 // Actually do the game update:
trmontgomery 2:0876296d9473 369 // 1. Read inputs
trmontgomery 2:0876296d9473 370 GameInputs in = read_inputs();
trmontgomery 2:0876296d9473 371 // 2. Determine action (get_action)
trmontgomery 2:0876296d9473 372 int a = get_action(in);
rconnorlawson 0:35660d7952f7 373 // 3. Update game (update_game)
trmontgomery 2:0876296d9473 374 int u = update_game(a);
rconnorlawson 0:35660d7952f7 375 // 3b. Check for game over
trmontgomery 2:0876296d9473 376 if (game_over == true){
trmontgomery 2:0876296d9473 377 draw_game_over();
trmontgomery 3:289762133fd6 378 }//else if(house_enabled == true){
trmontgomery 3:289762133fd6 379
trmontgomery 3:289762133fd6 380 //Player.x = Player.y = 5; //idk if this should be here...
trmontgomery 3:289762133fd6 381 //}
rconnorlawson 0:35660d7952f7 382 // 4. Draw frame (draw_game)
trmontgomery 2:0876296d9473 383 draw_game(u);
trmontgomery 3:289762133fd6 384
rconnorlawson 0:35660d7952f7 385
rconnorlawson 0:35660d7952f7 386 // 5. Frame delay
rconnorlawson 0:35660d7952f7 387 t.stop();
rconnorlawson 0:35660d7952f7 388 int dt = t.read_ms();
rconnorlawson 0:35660d7952f7 389 if (dt < 100) wait_ms(100 - dt);
rconnorlawson 0:35660d7952f7 390 }
rconnorlawson 0:35660d7952f7 391 }