Game codes for Pokemon Academy Yiu Fai Kwok - 201198802 I have read the University Regulations on Plagiarism and state that the work covered by this declaration is my own and does not contain any unacknowledged work from other sources.

Dependencies:   mbed FXOS8700CQ mbed-rtos

Score/Score.cpp

Committer:
yfkwok
Date:
2019-05-09
Revision:
34:3ddfaa217eca
Parent:
32:58def659f463

File content as of revision 34:3ddfaa217eca:

#include "Score.h"

Score::Score()
{

}

Score::~Score()
{

}

// Background music played during main title screen, music originally from Pokemon (R/B/Y) title screen.
void Score::title_music(Gamepad &pad)
{
    while(1){
        pad.tone(NOTE_G3,0.1);
        wait(0.1);
        pad.tone(NOTE_B3,0.1);
        wait(0.1);
        pad.tone(NOTE_D4,0.1);
        wait(0.1);
        pad.tone(NOTE_FS4,0.1);
        wait(0.1);
        // Note: to break out of the looping of the title music
        if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
        pad.tone(NOTE_G4,0.4);
        wait(0.4);
        if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
        pad.tone(NOTE_G4,0.4);
        wait(0.4);
        if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
        wait(0.2);
        pad.tone(NOTE_G4,0.1);
        wait(0.1);
        pad.tone(NOTE_G4,0.1);
        wait(0.1);
        if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
        pad.tone(NOTE_G4,0.4);
        wait(0.4);
        if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
        pad.tone(NOTE_G4,0.4);
        wait(0.4);
        if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
        pad.tone(NOTE_G4,0.4);
        wait(0.4);
        if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
        pad.tone(NOTE_F4,0.4/3);
        wait(0.4/3);
        pad.tone(NOTE_F4,0.4/3);
        wait(0.4/3);
        pad.tone(NOTE_F4,0.4/3);
        wait(0.4/3);
        if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
        pad.tone(NOTE_F4,0.4/3);
        wait(0.4/3);
        pad.tone(NOTE_F4,0.4/3);
        wait(0.4/3);
        pad.tone(NOTE_FS4,0.4/3);
        wait(0.4/3);
        if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
        
        // Looping the section of the music infinitely until START_button is pressed
        while(1){
            // bar 4
            pad.tone(NOTE_G4,0.6);
            wait(0.6);
            pad.tone(NOTE_B4,0.2);
            wait(0.2);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_D5,0.8);
            wait(0.8);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_C4,0.6);
            wait(0.6);
            pad.tone(NOTE_F4,0.2);
            wait(0.2);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_F5,0.6);
            wait(0.6);
            pad.tone(NOTE_E5,0.1);
            wait(0.1);
            pad.tone(NOTE_DS5,0.1);
            wait(0.1);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            // bar 6
            pad.tone(NOTE_D5,0.8);
            wait(0.8);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_F4,0.6);
            wait(0.6);
            pad.tone(NOTE_E4,0.1);
            wait(0.1);
            pad.tone(NOTE_DS4,0.1);
            wait(0.1);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_D4,0.8);
            wait(0.8);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_C4,0.8/3);
            wait(0.8/3);
            pad.tone(NOTE_B3,0.8/3);
            wait(0.8/3);
            pad.tone(NOTE_C4,0.8/3);
            wait(0.8/3);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_G4,0.6);
            wait(0.6);
            pad.tone(NOTE_B4,0.2);
            wait(0.2);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_D5,0.8);
            wait(0.8);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_C4,0.8);
            wait(0.8);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_C5,0.8/3);
            wait(0.8/3);
            pad.tone(NOTE_B4,0.8/3);
            wait(0.8/3);
            pad.tone(NOTE_C5,0.8/3);
            wait(0.8/3);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_D5,0.8);
            wait(0.8);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_F4,0.8/3);
            wait(0.8/3);
            pad.tone(NOTE_E4,0.8/3);
            wait(0.8/3);
            pad.tone(NOTE_C4,0.8/3);
            wait(0.8/3);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_D4,1.0);
            wait(1.0);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_B3,0.2);
            wait(0.2);
            pad.tone(NOTE_C4,0.2);
            wait(0.2);
            pad.tone(NOTE_D4,0.2);
            wait(0.2);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            //bar 12
            pad.tone(NOTE_G4,0.6);
            wait(0.6);
            pad.tone(NOTE_B4,0.2);
            wait(0.2);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_D5,0.8);
            wait(0.8);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_C4,0.6);
            wait(0.6);
            pad.tone(NOTE_F4,0.2);
            wait(0.2);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_F5,0.6);
            wait(0.6);
            pad.tone(NOTE_E5,0.1);
            wait(0.1);
            pad.tone(NOTE_DS5,0.1);
            wait(0.1);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_D5,0.8);
            wait(0.8);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_F4,0.6);
            wait(0.6);
            pad.tone(NOTE_E4,0.1);
            wait(0.1);
            pad.tone(NOTE_DS4,0.1);
            wait(0.1);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_D4,0.8);
            wait(0.8);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_C4,0.8/3);
            wait(0.8/3);
            pad.tone(NOTE_B3,0.8/3);
            wait(0.8/3);
            pad.tone(NOTE_C4,0.8/3);
            wait(0.8/3);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_G4,0.6);
            wait(0.6);
            pad.tone(NOTE_B4,0.2);
            wait(0.2);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_D5,0.8);
            wait(0.8);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            // bar 17
            pad.tone(NOTE_C4,0.6);
            wait(0.6);
            pad.tone(NOTE_C4,0.2);
            wait(0.2);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_F5,0.8/3);
            wait(0.8/3);
            pad.tone(NOTE_E5,0.8/3);
            wait(0.8/3);
            pad.tone(NOTE_F5,0.8/3);
            wait(0.8/3);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_G5,0.6);
            wait(0.6);
            pad.tone(NOTE_AS5,0.2);
            wait(0.2);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_G5,0.8);
            wait(0.8);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_G5,0.6);
            wait(0.6);
            pad.tone(NOTE_A4,0.2);
            wait(0.2);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_A5,0.8);
            wait(0.8);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_AS5,0.6);
            wait(0.6);
            pad.tone(NOTE_F5,0.2);
            wait(0.2);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_F5,0.8);
            wait(0.8);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_F5,0.8);
            wait(0.8);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_AS5,0.4);
            wait(0.4);
            pad.tone(NOTE_B5,0.4);
            wait(0.4);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_C6,0.6);
            wait(0.6);
            pad.tone(NOTE_G5,0.2);
            wait(0.2);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_G5,0.8);
            wait(0.8);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            // bar 23
            pad.tone(NOTE_G5,0.8);
            wait(0.8);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_C6,0.4);
            wait(0.4);
            pad.tone(NOTE_CS6,0.4);
            wait(0.4);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_D6,0.3);
            wait(0.3);
            pad.tone(NOTE_D5,0.1);
            wait(0.1);
            wait(0.3);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_D5,0.1);
            wait(0.1);
            wait(0.3);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_D5,0.1);
            wait(0.1);
            wait(0.3);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_D5,0.1);
            wait(0.1);
            wait(0.3);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_D5,0.1);
            wait(0.1);
            wait(0.3);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_D5,0.1);
            wait(0.1);
            pad.tone(NOTE_C6,0.8/3);
            wait(0.8/3);
            pad.tone(NOTE_C6,0.8/3);
            wait(0.8/3);
            pad.tone(NOTE_CS6,0.8/3);
            wait(0.8/3);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_D6,0.3);
            wait(0.3);
            pad.tone(NOTE_D5,0.1);
            wait(0.1);
            wait(0.3);
            pad.tone(NOTE_D5,0.1);
            wait(0.1);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            wait(0.3);
            pad.tone(NOTE_D5,0.1);
            wait(0.1);
            wait(0.3);
            pad.tone(NOTE_D5,0.1);
            wait(0.1);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            wait(0.3);
            pad.tone(NOTE_D5,0.1);
            wait(0.1);
            wait(0.3);
            pad.tone(NOTE_D5,0.1);
            wait(0.1);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
            pad.tone(NOTE_C6,0.8/3);
            wait(0.8/3);
            pad.tone(NOTE_C6,0.8/3);
            wait(0.8/3);
            pad.tone(NOTE_B5,0.8/3);
            wait(0.8/3);
            if(pad.check_event(Gamepad::START_PRESSED) == true){break;}
        }
        
        break;
    }
}

// Level up sound effect for when player progress to next year or next term, music originally from Pokemon (R/B/Y) when pokemon levels up.
void Score::level_up(Gamepad &pad)
{
    pad.tone(NOTE_E5,0.12);
    wait(0.15);
    pad.tone(NOTE_E5,0.12);
    wait(0.15);
    pad.tone(NOTE_E5,0.12);
    wait(0.15);
    pad.tone(NOTE_B5,0.45);
    wait(0.45);
}

// Congratulation music for when player select its starter or when the starter evolves, music originally from Pokemon (R/B/Y) when pokemon evovlved.
void Score::congrats(Gamepad &pad)
{
    pad.tone(NOTE_A5,0.35);
    wait(0.35);
    pad.tone(NOTE_F5,0.35);
    wait(0.35);
    pad.tone(NOTE_C5,0.7);
    wait(0.7);
    pad.tone(NOTE_AS5,0.35/3);
    wait(0.35/3);
    pad.tone(NOTE_AS5,0.35/3);
    wait(0.35/3);
    pad.tone(NOTE_AS5,0.35/3);
    wait(0.35/3);
    pad.tone(NOTE_G5,0.35/3);
    wait(0.35/3);
    pad.tone(NOTE_G5,0.35/3);
    wait(0.35/3);
    pad.tone(NOTE_AS5,0.35/3);
    wait(0.35/3);
    pad.tone(NOTE_A5,0.7);
    wait(0.7);
}

// Coin sound effect for different games
void Score::coin(Gamepad &pad)
{
    pad.tone(NOTE_B5,0.1);
    wait(0.1);
    pad.tone(NOTE_E6,0.4);
}

// Evolution music and animation which will be played for the chosen pokemon when the enter a new year, music originally from Pokemon (R/B/Y) when pokemon evolves.
void Score::evolution_music(Gamepad &pad, N5110 &lcd, int cha, int year)
{
    //Initiate position for name titles
    int x = 84;
    int y = 12;
    // bar 1
    draw(lcd, cha, year, x, y);
    pad.tone(NOTE_G5,0.5/4);
    wait(0.5/4);
    pad.tone(NOTE_D5,0.5/4);
    wait(0.5/4);
    pad.tone(NOTE_G5,0.5/4);
    wait(0.5/4);
    pad.tone(NOTE_D5,0.5/4);
    wait(0.5/4);
    wait(1.5);
    // bar 2
    
    pad.tone(NOTE_G4,0.5/2);
    wait(0.5);
    lcd.clear();
    lcd.refresh();
    pad.tone(NOTE_G4,0.5/2);
    wait(0.25);
    draw(lcd, cha, year, x, y);;
    wait(0.25);
    pad.tone(NOTE_G4,0.5/2);
    wait(0.25);
    lcd.clear();
    lcd.refresh();
    wait(0.25);
    pad.tone(NOTE_G4,0.5/2);
    wait(0.5);
    draw(lcd, cha, year, x, y);
    pad.tone(NOTE_G4,0.5/2);
    wait(0.25);
    lcd.clear();
    lcd.refresh();
    wait(0.25);
    pad.tone(NOTE_G4,0.5/2);
    wait(0.25);
    draw(lcd, cha, year, x, y);
    wait(0.25);
    pad.tone(NOTE_G4,0.5/2);
    wait(0.5);
    lcd.clear();
    lcd.refresh();
    pad.tone(NOTE_A4,0.5);
    wait(0.5);
    // bar 4
    draw(lcd, cha, year, x, y);
    pad.tone(NOTE_G4,0.5/2);
    wait(0.5);
    lcd.clear();
    lcd.refresh();
    pad.tone(NOTE_G4,0.5/2);
    wait(0.5);
    draw(lcd, cha, year, x, y);
    pad.tone(NOTE_G4,0.5/2);
    wait(0.5);
    lcd.clear();
    lcd.refresh();
    pad.tone(NOTE_G4,0.5/2);
    wait(0.5);
    draw(lcd, cha, year, x, y);
    pad.tone(NOTE_G4,0.5/2);
    wait(0.25);
    lcd.clear();
    lcd.refresh();
    wait(0.25);
    draw(lcd, cha, year, x, y);
    pad.tone(NOTE_G4,0.5/2);
    wait(0.25);
    lcd.clear();
    lcd.refresh();
    wait(0.25);
    draw(lcd, cha, year, x, y);
    pad.tone(NOTE_G4,0.5/2);
    wait(0.25);
    lcd.clear();
    lcd.refresh();
    wait(0.25);
    draw(lcd, cha, year, x, y);
    pad.tone(NOTE_B4,0.5);
    wait(0.25);
    lcd.clear();
    lcd.refresh();
    wait(0.25);
    // Define motion of name title for final evolution, activate when year = year + 1 = 3. Update lcd screen at 10 frames per sec.
    year = year + 1;
    if(year == 3){
        while(x > -170){
            draw(lcd, cha, year, x, y);;
            x = x - 10;
            wait(0.10);
        }
    }
    // Decrease parameter (year) to draw the corresponding evolution sprite
    year = year - 1;
    congrats(pad, lcd, cha, year);
}

// Music to congratulate player the pokemon has succesfully evolved. Draw the pokemon sprite according to the selection made.
void Score::congrats(Gamepad &pad, N5110 &lcd, int cha, int year)
{
    // Draw the corresponding evolution depending on the year (year) and character selected (cha)
    draw_cong(lcd, cha, year);
    // bar 1
    pad.tone(NOTE_A5,0.4);
    wait(0.4);
    pad.tone(NOTE_F5,0.4);
    wait(0.4);
    pad.tone(NOTE_C5,0.8);
    wait(0.8);
    // bar 2
    pad.tone(NOTE_AS5,0.4/3);
    wait(0.4/3);
    pad.tone(NOTE_AS5,0.4/3);
    wait(0.4/3);
    pad.tone(NOTE_AS5,0.4/3);
    wait(0.4/3);
    pad.tone(NOTE_G5,0.4/3);
    wait(0.4/3);
    pad.tone(NOTE_G5,0.4/3);
    wait(0.4/3);
    pad.tone(NOTE_AS5,0.4/3);
    wait(0.4/3);
    pad.tone(NOTE_A5,0.8);
    wait(0.8);
}

// Draw function used to create the animation for the evolution while the music is being played
void Score::draw(N5110 &lcd, int cha, int year, int x, int y)
{
    // Draw sprite of selected character, call functions from Characters folder, then draw the corresponding sprite depending on which year the game is in.
    lcd.clear();
    if(year == 1 && cha == 1) {_s1.evo_1_sprite(lcd, 23, 9);}
    else if(year == 1 && cha == 2) {_c1.evo_1_sprite(lcd, 23, 7);}
    else if(year == 1 && cha == 0) {_b1.evo_1_sprite(lcd, 27, 14);}
    else if(year == 2 && cha == 1) {_s1.evo_2_sprite(lcd, 20, 2);}
    else if(year == 2 && cha == 2) {_c1.evo_2_sprite(lcd, 17, 2);}
    else if(year == 2 && cha == 0) {_b1.evo_2_sprite(lcd, 14, 1);}
    else if(year == 3 && cha == 1) {_s1.evo_3_sprite(lcd, x, y);}
    else if(year == 3 && cha == 2) {_c1.evo_3_sprite(lcd, x, y);}
    else if(year == 3 && cha == 0) {_b1.evo_3_sprite(lcd, x, y);}
    lcd.refresh();
}

void Score::draw_cong(N5110 &lcd, int cha, int year)
{
    // Draw sprite of selected character after evolution, call functions from Characters folder, then draw the corresponding sprite depending on which year the game is in.
    lcd.clear();
    if(year == 0 && cha == 1) {_s1.evo_1_cong(lcd);}
    else if(year == 0 && cha == 2) {_c1.evo_1_cong(lcd);}
    else if(year == 0 && cha == 0) {_b1.evo_1_cong(lcd);}
    else if(year == 1 && cha == 1) {_s1.evo_2_cong(lcd);}
    else if(year == 1 && cha == 2) {_c1.evo_2_cong(lcd);}
    else if(year == 1 && cha == 0) {_b1.evo_2_cong(lcd);}
    else if(year == 2 && cha == 1) {_s1.evo_3_cong(lcd);}
    else if(year == 2 && cha == 2) {_c1.evo_3_cong(lcd);}
    else if(year == 2 && cha == 0) {_b1.evo_3_cong(lcd);}
    lcd.refresh();
}

// Music that plays when the player wins the mini game or passes the exam, music originally from Pokemon (R/B/Y) when player wins trainer battle
void Score::win(Gamepad &pad)
{
    // bar 1
    pad.tone(NOTE_E5,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_FS5,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_GS5,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_A5,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_B5,0.33*3);
    wait(0.33*3);
    // bar 2
    pad.tone(NOTE_B4,0.25/2);
    wait(0.33/2);
    pad.tone(NOTE_A4,0.25/2);
    wait(0.33/2);
    pad.tone(NOTE_GS4,0.25/2);
    wait(0.33/2);
    pad.tone(NOTE_A4,0.25/2);
    wait(0.33/2);
    pad.tone(NOTE_B4,0.25/2);
    wait(0.33/2);
    pad.tone(NOTE_B4,0.25/2);
    wait(0.33/2);
    pad.tone(NOTE_B4,0.25);
    wait(0.33);
    // bar 3
    pad.tone(NOTE_CS5,0.25/2);
    wait(0.33/2);
    pad.tone(NOTE_CS5,0.25/2);
    wait(0.33/2);
    pad.tone(NOTE_CS5,0.25);
    wait(0.33);
    pad.tone(NOTE_B4,0.25/2);
    wait(0.33/2);
    pad.tone(NOTE_B4,0.25/2);
    wait(0.33/2);
    pad.tone(NOTE_B4,0.25);
    wait(0.33);
    // bar 4
    pad.tone(NOTE_B4,0.25/2);
    wait(0.33/2);
    pad.tone(NOTE_A4,0.25/2);
    wait(0.33/2);
    pad.tone(NOTE_GS4,0.25/2);
    wait(0.33/2);
    pad.tone(NOTE_A4,0.25/2);
    wait(0.33/2);
    pad.tone(NOTE_B4,0.25/2);
    wait(0.33/2);
    pad.tone(NOTE_B4,0.25/2);
    wait(0.33/2);
    pad.tone(NOTE_B4,0.25);
    wait(0.33);
    // bar 5
    pad.tone(NOTE_CS5,0.25/2);
    wait(0.33/2);
    pad.tone(NOTE_CS5,0.25/2);
    wait(0.33/2);
    pad.tone(NOTE_CS5,0.25);
    wait(0.33);
    pad.tone(NOTE_B4,0.25);
    wait(0.6);
}

// Introduction music to the EXAM page, music originally from Pokemon (R/B/Y) when player starts the battle with GYM leader.
void Score::exam_intro(Gamepad &pad)
{
    // bar 1
    pad.tone(NOTE_F5,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_E5,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_DS5,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_E5,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_DS5,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_D5,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_DS5,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_D5,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_CS5,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_D5,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_CS5,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_C5,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_E4,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_DS4,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_D4,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_DS4,0.33/4);
    wait(0.33/4);
    // bar 2
    pad.tone(NOTE_D4,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_C4,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_FS4,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_F4,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_E4,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_F4,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_E4,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_DS4,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_E4,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_DS4,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_D4,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_DS4,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_D4,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_C4,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_D4,0.33/4);
    wait(0.33/4);
    pad.tone(NOTE_C4,0.33/4);
    wait(0.33/4);
}

// Draw function to create the animation in Graduation, takes in the variable x to move the sprite across the screen
void Score::draw_grad(N5110 &lcd, int cha, int year, int x)
{
    // Draw sprite of selected character in graduation, call functions from Characters folder
    lcd.clear();
    if(year == 1 && cha == 1) {_s1.evo_1_sprite(lcd, x, 9);}
    else if(year == 1 && cha == 2) {_c1.evo_1_sprite(lcd, x, 7);}
    else if(year == 1 && cha == 0) {_b1.evo_1_sprite(lcd, x, 14);}
    else if(year == 2 && cha == 1) {_s1.evo_2_sprite(lcd, x, 2);}
    else if(year == 2 && cha == 2) {_c1.evo_2_sprite(lcd, x, 2);}
    else if(year == 2 && cha == 0) {_b1.evo_2_sprite(lcd, x, 1);}
    else if(year == 3 && cha == 1) {_s1.evo_3_cong(lcd);}
    else if(year == 3 && cha == 2) {_c1.evo_3_cong(lcd);}
    else if(year == 3 && cha == 0) {_b1.evo_3_cong(lcd);}
    lcd.refresh();
}

// Function for graduation background music and animation, music originally from Pokemon (R/B/Y) background music of route 3 with a bit of edit to create an ending to the piece 
void Score::graduation(Gamepad &pad, N5110 &lcd, int cha)
{
    // bar 1
    lcd.clear();
    lcd.printString("At Last...", 0, 2);
    lcd.printString("The Time Comes", 0, 3);
    lcd.refresh(); 
    pad.tone(NOTE_G4,0.46/4);
    wait(0.46/4);
    pad.tone(NOTE_A4,0.46/4);
    wait(0.46/4);
    pad.tone(NOTE_B4,0.46*1.5);
    wait(0.46*1.5);
    pad.tone(NOTE_A4,0.46/4);
    wait(0.46/4);
    pad.tone(NOTE_B4,0.46/4);
    wait(0.46/4);
    // bar 2
    draw_grad(lcd, cha, 1, 84);
    pad.tone(NOTE_C5,0.46/2);
    wait(0.46/2);
    pad.tone(NOTE_G3,0.44);
    wait(0.46/2);
    draw_grad(lcd, cha, 1, 74);
    wait(0.46/2);
    draw_grad(lcd, cha, 1, 64);
    pad.tone(NOTE_G3,0.44/4);
    wait(0.46/4);
    pad.tone(NOTE_G3,0.44/4);
    wait(0.46/4);
    draw_grad(lcd, cha, 1, 54);
    pad.tone(NOTE_G3,0.44/2);
    wait(0.46/2);
    draw_grad(lcd, cha, 1, 44);
    pad.tone(NOTE_G3,0.44/2);
    wait(0.46/2);
    draw_grad(lcd, cha, 1, 34);
    pad.tone(NOTE_G3,0.44);
    wait(0.46/2);
    draw_grad(lcd, cha, 1, 24);
    wait(0.46/2);
    // bar 3
    pad.tone(NOTE_G3,0.44/2);
    wait(0.46/2);
    pad.tone(NOTE_G3,0.44);
    wait(0.46);
    pad.tone(NOTE_G3,0.44/4);
    wait(0.46/4);
    pad.tone(NOTE_G3,0.44/4);
    wait(0.46/4);
    pad.tone(NOTE_G3,0.44/2);
    wait(0.46/2);
    pad.tone(NOTE_G3,0.44/2);
    wait(0.46/2);
    pad.tone(NOTE_G3,0.44);
    wait(0.46);
    // bar 4
    pad.tone(NOTE_C5,0.46*1.5);
    wait(0.46*1.5);
    pad.tone(NOTE_G4,0.46/4);
    wait(0.46/4);
    pad.tone(NOTE_C5,0.46/4);
    wait(0.46/4);
    pad.tone(NOTE_E5,0.46*2);
    wait(0.46*2);
    // bar 5
    wait(0.46/2);
    pad.tone(NOTE_G4,0.46/2);
    wait(0.46/2);
    pad.tone(NOTE_C5,0.46/2);
    wait(0.46/2);
    pad.tone(NOTE_G5,0.46/2);
    wait(0.46/2);
    pad.tone(NOTE_F5,0.46/2);
    wait(0.46/2);
    pad.tone(NOTE_E5,0.46/2);
    wait(0.46/2);
    pad.tone(NOTE_D5,0.46/2);
    wait(0.46/2);
    pad.tone(NOTE_C5,0.46/2);
    wait(0.46/2);
    // bar 6
    draw_grad(lcd, cha, 1, 14);
    pad.tone(NOTE_D5,0.46*2);
    wait(0.46/2);
    draw_grad(lcd, cha, 1, 4);
    wait(0.46/2);
    draw_grad(lcd, cha, 1, -6);
    wait(0.46/2);
    draw_grad(lcd, cha, 1, -16);
    wait(0.46/2);
    draw_grad(lcd, cha, 1, -26);
    pad.tone(NOTE_F5,0.46*2);
    wait(0.46/2);
    draw_grad(lcd, cha, 1, -36);
    wait(0.46/2);
    draw_grad(lcd, cha, 1, -46);
    wait(0.46/2);
    draw_grad(lcd, cha, 1, -56);
    wait(0.46/2);
    // bar 7
    draw_grad(lcd, cha, 2, 84);
    pad.tone(NOTE_A4,0.46*2);
    wait(0.46/2);
    draw_grad(lcd, cha, 2, 74);
    wait(0.46/2);
    draw_grad(lcd, cha, 2, 64);
    wait(0.46/2);
    draw_grad(lcd, cha, 2, 54);
    wait(0.46/2);
    draw_grad(lcd, cha, 2, 44);
    pad.tone(NOTE_B4,0.46*2);
    wait(0.46/2);
    draw_grad(lcd, cha, 2, 34);
    wait(0.46/2);
    draw_grad(lcd, cha, 2, 24);
    wait(0.46/2);
    draw_grad(lcd, cha, 2, 17);
    wait(0.46/2);
    // bar 8
    pad.tone(NOTE_C5,0.46*1.5);
    wait(0.46*1.5);
    pad.tone(NOTE_G4,0.46/4);
    wait(0.46/4);
    pad.tone(NOTE_C5,0.46/4);
    wait(0.46/4);
    pad.tone(NOTE_E5,0.46*2);
    wait(0.46*2);
    // bar 9
    wait(0.46/2);
    pad.tone(NOTE_G4,0.46/2);
    wait(0.46/2);
    pad.tone(NOTE_C5,0.46/2);
    wait(0.46/2);
    pad.tone(NOTE_G5,0.46/2);
    wait(0.46/2);
    pad.tone(NOTE_F5,0.46/2);
    wait(0.46/2);
    pad.tone(NOTE_E5,0.46/2);
    wait(0.46/2);
    pad.tone(NOTE_D5,0.46/2);
    wait(0.46/2);
    pad.tone(NOTE_C5,0.46/2);
    wait(0.46/2);
    // bar 10
    pad.tone(NOTE_D5,0.46*2);
    wait(0.46*2);
    pad.tone(NOTE_F5,0.46*2);
    wait(0.46*2);
    // bar 11
    pad.tone(NOTE_B4,0.46*2);
    wait(0.46*2);
    pad.tone(NOTE_D5,0.46*1.5);
    wait(0.46*1.5);
    pad.tone(NOTE_C5,0.46/4);
    wait(0.46/4);
    pad.tone(NOTE_D5,0.46/4);
    wait(0.46/4);
    // bar 12
    pad.tone(NOTE_E5,0.46/2);
    wait(0.46/2);
    draw_grad(lcd, cha, 2, 7);
    pad.tone(NOTE_D5,0.46/2);
    wait(0.46/2);
    draw_grad(lcd, cha, 2, -3);
    pad.tone(NOTE_E5,0.46/2);
    wait(0.46/2);
    draw_grad(lcd, cha, 2, -13);
    pad.tone(NOTE_C5,0.46*2);
    wait(0.46/2);
    draw_grad(lcd, cha, 2, -23);
    wait(0.46/2);
    draw_grad(lcd, cha, 2, -33);
    wait(0.46/2);
    draw_grad(lcd, cha, 2, -43);
    wait(0.46/2);
    draw_grad(lcd, cha, 2, -53);
    pad.tone(NOTE_B4,0.46/4);
    wait(0.46/4);
    pad.tone(NOTE_C5,0.46/4);
    wait(0.46/4);
    draw_grad(lcd, cha, 2, -63);
    // bar 13
    pad.tone(NOTE_D5,0.46/2);
    wait(0.46/2);
    pad.tone(NOTE_G4,0.46);
    wait(0.46);
    pad.tone(NOTE_G5,0.46*2);
    wait(0.46*2);
    pad.tone(NOTE_F5,0.46/4);
    wait(0.46/4);
    pad.tone(NOTE_E5,0.46/4);
    wait(0.46/4);
    // bar 14
    lcd.clear();
    lcd.printString("After All The", 0, 2);
    lcd.printString("Challenges", 0, 3);
    lcd.refresh();
    pad.tone(NOTE_F5,0.46*2/3);
    wait(0.46*2/3);
    pad.tone(NOTE_E5,0.46*2/3);
    wait(0.46*2/3);
    pad.tone(NOTE_C5,0.46*2/3);
    wait(0.46*2/3);
    pad.tone(NOTE_C5,0.46*2);
    wait(0.46*2);
    // bar 15
    lcd.clear();
    lcd.printString("The Journey", 0, 2);
    lcd.printString("Ends!", 0, 3);
    lcd.refresh();
    pad.tone(NOTE_A4,0.46*2);
    wait(0.46*2);
    pad.tone(NOTE_B4,0.46*2);
    wait(0.46*2);
    // bar 16
    draw_grad(lcd, cha, 3, 0);
    pad.tone(NOTE_E5,0.46/2);
    wait(0.46/2);
    pad.tone(NOTE_D5,0.46/2);
    wait(0.46/2);
    pad.tone(NOTE_E5,0.46/2);
    wait(0.46/2);
    pad.tone(NOTE_C5,0.46*2);
    wait(0.46*2);
    pad.tone(NOTE_B4,0.46/4);
    wait(0.46/4);
    pad.tone(NOTE_C5,0.46/4);
    wait(0.46/4);
    // bar 17
    pad.tone(NOTE_D5,0.46/2);
    wait(0.46/2);
    pad.tone(NOTE_G4,0.46);
    wait(0.46);
    pad.tone(NOTE_G5,0.46*2);
    wait(0.46*2);
    pad.tone(NOTE_F5,0.46/4);
    wait(0.46/4);
    pad.tone(NOTE_E5,0.46/4);
    wait(0.46/4);
    // bar 18
    pad.tone(NOTE_F5,0.46*2/3);
    wait(0.46*2/3);
    pad.tone(NOTE_E5,0.46*2/3);
    wait(0.46*2/3);
    pad.tone(NOTE_C5,0.46*2/3);
    wait(0.46*2/3);
    pad.tone(NOTE_C5,0.46*2);
    wait(0.46*2);
    // bar 19
    lcd.clear();
    lcd.printString("You Made It!", 0, 2);
    lcd.refresh();
    pad.tone(NOTE_A4,0.46*1.5);
    wait(0.46*1.5);
    pad.tone(NOTE_G4,0.46/4);
    wait(0.46/4);
    pad.tone(NOTE_A4,0.46/4);
    wait(0.46/4);
    pad.tone(NOTE_B4,0.46);
    wait(0.46);
    pad.tone(NOTE_D5,0.46);
    wait(0.46);
    // bar 20
    pad.tone(NOTE_C5,0.44/2);
    wait(0.46/2);
    pad.tone(NOTE_C5,0.44);
    wait(0.46);
    pad.tone(NOTE_C5,0.44/4);
    wait(0.46/4);
    pad.tone(NOTE_C5,0.44/4);
    wait(0.46/4);
    pad.tone(NOTE_C5,0.44/2);
    wait(0.46/2);
    pad.tone(NOTE_C5,0.44/2);
    wait(0.46/2);
    pad.tone(NOTE_C5,0.44);
    wait(0.46);
}