Game For ECE 2035

Dependencies:   mbed wave_player 4DGL-uLCD-SE MMA8452

Revision:
10:e18685911e84
Parent:
9:cbb9cfb1f6c5
Child:
11:6cd02a8539d1
diff -r cbb9cfb1f6c5 -r e18685911e84 main.cpp
--- a/main.cpp	Tue Nov 30 00:48:48 2021 +0000
+++ b/main.cpp	Wed Dec 01 22:07:24 2021 +0000
@@ -16,8 +16,11 @@
 int main ();
 
 
+
 FILE *wave_file;
 
+
+
 /**
  * The main game state. Must include Player locations and previous locations for
  * drawing to work properly. Other items can be added as needed.
@@ -94,17 +97,22 @@
 
 
 
+
+
 #define NO_RESULT 0
 #define GAME_OVER 1
 #define FULL_DRAW 2
 int update_game(int action)
 {
-    // Save player previous location before updating
+   
+         
+            
+    //walk_npc();
+    
+    
+ // Save player previous location before updating
     Player.px = Player.x;
     Player.py = Player.y;
-    
-    
-
 
     // Do different things based on the each action.
     // You can define functions like "go_up()" that get called for each case.
@@ -115,7 +123,7 @@
             MapItem* north = get_north(Player.x,Player.y);
             if (north->walkable && north == NULL || north->type == (PORTAL || PLANT) && Player.y != 0 || Player.god ) {
                 Player.y--;
-                
+
             }
             break;
         }
@@ -174,7 +182,7 @@
             }
 
             if((north->type == PLANT||south->type == PLANT||east->type == PLANT||west->type == PLANT||curr->type == PLANT)&&
-                    (north->data == FRUIT||south->data == FRUIT||east->data == FRUIT||west->data == FRUIT||curr->data == FRUIT)){
+                    (north->data == FRUIT||south->data == FRUIT||east->data == FRUIT||west->data == FRUIT||curr->data == FRUIT)) {
                 if(Player.HP < 100) {
                     fruit();
                     Player.HP += 5;
@@ -183,194 +191,228 @@
                     east->data = NULL;
                     west->data = NULL;
                     curr->data = NULL;
-                } else 
+                } else
                     no_fruit();
-                  wave_file = fopen("/sd/rzelda-1s.wav","r");
-                  waver.play(wave_file);
-                  fclose(wave_file);
-                  
-                    
-                    
-                
+                wave_file = fopen("/sd/rupee-collect.wav","r");
+                waver.play(wave_file);
+                fclose(wave_file);
+
+
+
+
             }
-            }
-            break;
-            case MENU_BUTTON: {
-                init_spells();
-                Player.spell = spell();
-            }
+        }
+        break;
+        case MENU_BUTTON: {
+            init_spells();
+            Player.spell = spell();
+        }
+        break;
+        case GOD_MODE: {
+
+            Player.god = !Player.god;
+            if (Player.god) {
+                god_modeOn();
+            } else
+                god_modeOff();
+
+        }
+        break;
+
+        default:
+
             break;
-            case GOD_MODE: {
+    }
+    
+
+    //delete_npc(9,9);
+    
+    return NO_RESULT;
+
+    
+}
+
+/**
+ * Entry point for frame drawing. This should be called once per iteration of
+ * the game loop. This draws all tiles on the screen, followed by the status
+ * bars. Unless init is nonzero, this function will optimize drawing by only
+ * drawing tiles that have changed from the previous frame.
+ */
+void draw_game(int init)
+{
+    // Draw game border first
+    if(init) draw_border();
+
+    // Iterate over all visible map tiles
+    for (int i = -5; i <= 5; i++) { // Iterate over columns of tiles
+        for (int j = -4; j <= 4; j++) { // Iterate over one column of tiles
+            // Here, we have a given (i,j)
+
+            // Compute the current map (x,y) of this tile
+            int x = i + Player.x;
+            int y = j + Player.y;
 
-                Player.god = !Player.god;
-                if (Player.god) {
-                    god_modeOn();
-                } else
-                    god_modeOff();
-                    
+            // Compute the previous map (px, py) of this tile
+            int px = i + Player.px;
+            int py = j + Player.py;
+
+            // Compute u,v coordinates for drawing
+            int u = (i+5)*11 + 3;
+            int v = (j+4)*11 + 15;
+
+            // Figure out what to draw
+            DrawFunc draw = NULL;
+            if (init && i == 0 && j == 0) { // Only draw the player on init
+                draw_player(u, v, Player.has_key);
+                continue;
+            } else if (x >= 0 && y >= 0 && x < map_width() && y < map_height()) { // Current (i,j) in the map
+                MapItem* curr_item = get_here(x, y);
+                MapItem* prev_item = get_here(px, py);
+                if (init || curr_item != prev_item) { // Only draw if they're different
+                    if (curr_item) { // There's something here! Draw it
+                        draw = curr_item->draw;
+                    } else { // There used to be something, but now there isn't
+                        draw = draw_nothing;
+                    }
+                }
+            } else if (init) { // If doing a full draw, but we're out of bounds, draw the walls.
+                draw = draw_wall;
             }
-            break;
 
-            default:
-
-                break;
-            }
-            return NO_RESULT;
+            // Actually draw the tile
+            if (draw) draw(u, v);
+        }
     }
 
-    /**
-     * Entry point for frame drawing. This should be called once per iteration of
-     * the game loop. This draws all tiles on the screen, followed by the status
-     * bars. Unless init is nonzero, this function will optimize drawing by only
-     * drawing tiles that have changed from the previous frame.
-     */
-    void draw_game(int init) {
-        // Draw game border first
-        if(init) draw_border();
+    // Draw status bars
+    draw_upper_status(Player.x,Player.y);
+    draw_lower_status(Player.HP,Player.MP);
+}
 
-        // Iterate over all visible map tiles
-        for (int i = -5; i <= 5; i++) { // Iterate over columns of tiles
-            for (int j = -4; j <= 4; j++) { // Iterate over one column of tiles
-                // Here, we have a given (i,j)
-
-                // Compute the current map (x,y) of this tile
-                int x = i + Player.x;
-                int y = j + Player.y;
-
-                // Compute the previous map (px, py) of this tile
-                int px = i + Player.px;
-                int py = j + Player.py;
-
-                // Compute u,v coordinates for drawing
-                int u = (i+5)*11 + 3;
-                int v = (j+4)*11 + 15;
 
-                // Figure out what to draw
-                DrawFunc draw = NULL;
-                if (init && i == 0 && j == 0) { // Only draw the player on init
-                    draw_player(u, v, Player.has_key);
-                    continue;
-                } else if (x >= 0 && y >= 0 && x < map_width() && y < map_height()) { // Current (i,j) in the map
-                    MapItem* curr_item = get_here(x, y);
-                    MapItem* prev_item = get_here(px, py);
-                    if (init || curr_item != prev_item) { // Only draw if they're different
-                        if (curr_item) { // There's something here! Draw it
-                            draw = curr_item->draw;
-                        } else { // There used to be something, but now there isn't
-                            draw = draw_nothing;
-                        }
-                    }
-                } else if (init) { // If doing a full draw, but we're out of bounds, draw the walls.
-                    draw = draw_wall;
-                }
+/**
+ * Initialize the main world map. Add walls around the edges, interior chambers,
+ * and plants in the background so you can see motion. Note: using the similar
+ * procedure you can init the secondary map(s).
+ */
+void init_main_map()
+{
+    // "Random" plants
+    Map* map = set_active_map(0);
+    for(int i = map_width() + 3; i < map_area(); i += 39) {
+        add_plant(i % map_width(), i / map_width());
+    }
+    pc.printf("plants\r\n");
 
-                // Actually draw the tile
-                if (draw) draw(u, v);
-            }
+    pc.printf("Adding walls!\r\n");
+    add_wall(0,              0,              HORIZONTAL, map_width());
+    add_wall(0,              map_height()-1, HORIZONTAL, map_width());
+    add_wall(0,              0,              VERTICAL,   map_height());
+    add_wall(map_width()-1,  0,              VERTICAL,   map_height());
+    pc.printf("Walls done!\r\n");
+
+
+
+    for(int i = 7; i < 13; i++) {
+        for (int j = 23; j <31; j++) {
+            add_kindom(j,i);
         }
-
-        // Draw status bars
-        draw_upper_status(Player.x,Player.y);
-        draw_lower_status(Player.HP,Player.MP);
     }
 
 
-    /**
-     * Initialize the main world map. Add walls around the edges, interior chambers,
-     * and plants in the background so you can see motion. Note: using the similar
-     * procedure you can init the secondary map(s).
-     */
-    void init_main_map() {
-        // "Random" plants
-        Map* map = set_active_map(0);
-        for(int i = map_width() + 3; i < map_area(); i += 39) {
-            add_plant(i % map_width(), i / map_width());
-        }
-        pc.printf("plants\r\n");
+
+    set_npc(9,9);
+
+    //add_chest(10,10);
+
+    add_door(26,12);
+
+    add_portal(20,35);
+
+    print_map();
+}
+
 
-        pc.printf("Adding walls!\r\n");
-        add_wall(0,              0,              HORIZONTAL, map_width());
-        add_wall(0,              map_height()-1, HORIZONTAL, map_width());
-        add_wall(0,              0,              VERTICAL,   map_height());
-        add_wall(map_width()-1,  0,              VERTICAL,   map_height());
-        pc.printf("Walls done!\r\n");
+/**
+ * Program entry point! This is where it all begins.
+ * This function orchestrates all the parts of the game. Most of your
+ * implementation should be elsewhere - this holds the game loop, and should
+ * read like a road map for the rest of the code.
+ */
+int main()
+{
+
+    Player.HP = 100;
+    Player.MP = 100;
+
+    // MapItem* north = get_north(Player.x,Player.y);
 
 
+    // First things first: initialize hardware
+    ASSERT_P(hardware_init() == ERROR_NONE, "Hardware init failed!");
 
-        for(int i = 7; i < 13; i++) {
-            for (int j = 23; j <31; j++) {
-                add_kindom(j,i);
-            }
+    // Initialize the maps
+    maps_init();
+    init_main_map();
+
+    // Initialize game state
+    set_active_map(0);
+    Player.x = Player.y = 5;
+
+    draw_start();
+
+    //wave_file = fopen("/sd/godfather.wav","r");
+    //waver.play(wave_file);
+    //fclose(wave_file);
+
+    while(1) {
+
+        Timer t;
+        t.start();
+        GameInputs inp =  read_inputs();
+        int action = get_action(inp);
+
+
+        if( action == ACTION_BUTTON) {
+
+            break;
         }
-    
-     
-     
-        set_npc(9,9);
+        t.stop();
+        int dt = t.read_ms();
+        if (dt < 100) wait_ms(100-dt);
 
-        //add_chest(10,10);
-
-        add_door(26,12);
-
-        add_portal(20,35);
-
-        print_map();
     }
 
 
-    /**
-     * Program entry point! This is where it all begins.
-     * This function orchestrates all the parts of the game. Most of your
-     * implementation should be elsewhere - this holds the game loop, and should
-     * read like a road map for the rest of the code.
-     */
-    int main() {
+    // Initial drawing
+    draw_game(true);
+    // Main game loop
+    while(1) {
+        // Timer to measure game update speed
+        Timer t;
+        t.start();
 
-        Player.HP = 100;
-        Player.MP = 100;
+        // Actually do the game update:
+        // 1. Read inputs
+        GameInputs input = read_inputs();
+        // 2. Determine action (get_action)
+        int action = get_action(input);
+        // 3. Update game (update_game)
+        update_game(action);
+        // 3b. Check for game over
+        if(Player.won == 1) {
+            draw_gameover();
+            break;
+        }
+        // 4. Draw frame (draw_game)
+        draw_game(true);
 
-        // MapItem* north = get_north(Player.x,Player.y);
+        // 5. Frame delay
+        t.stop();
+        int dt = t.read_ms();
+        if (dt < 100) wait_ms(100 - dt);
+    }
+    //
 
 
-        // First things first: initialize hardware
-        ASSERT_P(hardware_init() == ERROR_NONE, "Hardware init failed!");
-
-        // Initialize the maps
-        maps_init();
-        init_main_map();
-
-        // Initialize game state
-        set_active_map(0);
-        Player.x = Player.y = 5;
-
-        // Initial drawing
-        draw_game(true);
-        // Main game loop
-        while(1) {
-            // Timer to measure game update speed
-            Timer t;
-            t.start();
-
-            // Actually do the game update:
-            // 1. Read inputs
-            GameInputs input = read_inputs();
-            // 2. Determine action (get_action)
-            int action = get_action(input);
-            // 3. Update game (update_game)
-            update_game(action);
-            // 3b. Check for game over
-            if(Player.won == 1) {
-                draw_gameover();
-                break;
-            }
-            // 4. Draw frame (draw_game)
-            draw_game(true);
-
-            // 5. Frame delay
-            t.stop();
-            int dt = t.read_ms();
-            if (dt < 100) wait_ms(100 - dt);
-        }
-        //
-
-
-    }
+}