Mortal Kombat Game ELEC2645

Dependencies:   mbed N5110 ShiftReg Joystick

Enemy.cpp

Committer:
ozy
Date:
2021-04-25
Revision:
13:eaf070d5f599
Parent:
12:b4477a312158
Child:
14:7f23841685ad

File content as of revision 13:eaf070d5f599:

#include "Enemy.h"
#include "mbed.h"
#include <stdlib.h>

Enemy::Enemy() {}

int Enemy::get_x() {
    return _x;
}

int Enemy::get_y() {
    return _y;
}

void Enemy::set_x(int x) {
    _x = x;
}

void Enemy::set_y(int y) {
    _y = y;
}

void Enemy::add_x(int x) {
    _x += x;
}

void Enemy::add_y(int y) {
    _y += y;
}

void Enemy::init(int input) {
    // function to initialize position of each enemy god
    if (input == 1){
        set_x(50);
        set_y(34);
    }
    else if (input == 2) {
        set_x(10);
        set_y(34);
    }
    else if (input == 3) {
        set_x(55);
        set_y(34);
    }
    else if (input == 4) {
        set_x(15);
        set_y(34);
    }
    else if (input == 5) {
        set_x(56);
        set_y(34);
    }

}
void Enemy::draw(N5110 &lcd, int input) {

    const int look_left[12][10] =   {
    { 0,0,1,1,1,0,0,0,0,0 },
    { 0,0,1,1,1,0,0,0,0,0 },
    { 0,0,0,1,1,1,1,1,1,0 },
    { 0,0,1,0,1,1,0,0,1,0 },
    { 1,1,1,0,1,1,0,1,1,1 },
    { 0,0,0,0,1,1,0,0,1,0 },
    { 0,0,0,1,1,1,1,0,0,0 },
    { 0,0,1,1,0,0,1,1,0,0 },
    { 0,1,1,0,0,0,1,1,0,0 },
    { 0,0,1,1,0,0,0,1,1,0 },
    { 0,0,0,1,0,0,0,0,1,0 },
    { 0,1,1,1,0,0,0,1,1,0 },
    };

    const int look_right[12][10] =   {
    { 0,0,0,0,0,1,1,1,0,0 },
    { 0,0,0,0,0,1,1,1,0,0 },
    { 0,0,0,1,1,1,1,0,0,0 },
    { 0,0,1,1,1,1,1,0,1,0 },
    { 0,1,1,0,1,1,0,1,1,1 },
    { 0,0,0,0,1,1,0,0,1,0 },
    { 0,0,0,1,1,1,1,0,0,0 },
    { 0,0,1,1,0,0,1,1,0,0 },
    { 0,0,1,1,0,0,0,1,1,0 },
    { 0,1,1,0,0,0,1,1,0,0 },
    { 0,1,0,0,0,1,1,0,0,0 },
    { 0,1,1,0,1,1,1,1,0,0 },
    };

    if (input == 1) {
        lcd.drawSprite(_x,_y,12,10,(int *)look_right);
        }
    else {
        lcd.drawSprite(_x,_y,12,10,(int *)look_left);
        }
        
}
// ************************************************************************


void Enemy::move_left(N5110 &lcd){
    const int run_left[12][10] =   {
    { 0,0,1,1,1,0,0,0,0,0 },
    { 0,0,1,1,1,0,0,0,0,0 },
    { 0,0,0,1,1,1,1,1,1,0 },
    { 0,0,1,0,1,1,0,0,1,0 },
    { 1,1,1,0,1,1,0,1,1,1 },
    { 0,0,0,0,1,1,0,0,1,0 },
    { 0,0,0,1,1,1,1,0,0,0 },
    { 0,0,1,1,0,0,1,1,0,0 },
    { 0,1,1,0,0,0,1,1,1,1 },
    { 0,0,1,1,0,0,0,0,0,0 },
    { 0,0,0,1,1,0,0,0,0,0 },
    { 0,0,0,0,1,1,0,0,0,0 },
    };
    
    const int run_left2[12][10] =   {
    { 0,0,1,1,1,0,0,0,0,0 },
    { 0,0,1,1,1,0,0,0,0,0 },
    { 0,0,0,1,1,1,1,1,1,0 },
    { 0,0,1,0,1,1,0,0,1,0 },
    { 1,1,1,0,1,1,0,1,1,1 },
    { 0,0,0,0,1,1,0,0,1,0 },
    { 0,0,0,1,1,1,1,0,0,0 },
    { 0,0,1,1,0,0,1,1,0,0 },
    { 0,0,0,1,1,1,1,0,0,0 },
    { 0,0,0,0,1,1,0,0,0,0 },
    { 0,0,0,0,1,0,1,0,0,0 },
    { 0,0,0,1,0,0,0,1,0,0 },
    };
    // x position
    add_x(-4); // move enemy to the left across lcd through increments
    
    // code to toggle between both move left animations (show some leg movement!)
    int x = rand() % 5;
    if (x == 0) {
        // x = 1;
        lcd.drawSprite(_x,_y,12,10,(int *)run_left);
    }
    else if(x == 1) {
        // x = 0;
        lcd.drawSprite(_x,_y,12,10,(int *)run_left2);
    }
}


// ************************************************************************

void Enemy::move_right(N5110 &lcd) {

    const int run_right[12][10] =   {
    { 0,0,0,0,0,1,1,1,0,0 },
    { 0,0,0,0,0,1,1,1,0,0 },
    { 0,0,0,1,1,1,1,0,0,0 },
    { 0,0,1,1,1,1,1,0,1,0 },
    { 0,1,1,0,1,1,0,1,1,1 },
    { 0,0,0,0,1,1,0,0,1,0 },
    { 0,0,0,1,1,1,1,0,0,0 },
    { 0,0,1,1,0,0,1,1,0,0 },
    { 1,1,1,1,0,0,0,1,1,0 },
    { 0,0,0,0,0,0,1,1,0,0 },
    { 0,0,0,0,0,1,1,0,0,0 },
    { 0,0,0,0,1,1,0,0,0,0 },
    };
lcd.drawSprite(_x,_y,12,10,(int *)run_right);
}

void Enemy::move_right2(N5110 &lcd) {
const int midrun_right[12][10] =   {
    { 0,0,0,0,0,1,1,1,0,0 },
    { 0,0,0,0,0,1,1,1,0,0 },
    { 0,0,0,1,1,1,1,0,0,0 },
    { 0,0,1,1,1,1,1,0,1,0 },
    { 0,1,1,0,1,1,0,1,1,1 },
    { 0,0,0,0,1,1,0,0,1,0 },
    { 0,0,0,1,1,1,1,0,0,0 },
    { 0,0,1,1,0,0,1,1,0,0 },
    { 0,0,0,1,1,1,1,0,0,0 },
    { 0,0,0,0,1,1,0,0,0,0 },
    { 0,0,0,1,0,1,0,0,0,0 },
    { 0,0,1,0,0,0,1,0,0,0 },
    };
lcd.drawSprite(_x,_y,12,10,(int *)midrun_right);
}


void Enemy::sword_right(N5110 &lcd) {
    const int swordsprite[12][10] =   {
    { 0,0,1,1,1,1,0,0,0,0 },
    { 1,0,1,1,1,1,0,0,0,0 },
    { 1,0,0,1,1,0,0,0,0,0 },
    { 1,1,0,1,1,0,1,0,0,0 },
    { 0,1,1,1,1,1,1,1,1,1 },
    { 0,0,0,1,1,0,1,0,0,0 },
    { 0,0,0,1,1,0,0,0,0,0 },
    { 0,0,0,1,1,0,0,0,0,0 },
    { 0,0,1,1,1,1,0,0,0,0 },
    { 0,1,1,0,0,1,1,0,0,0 },
    { 0,1,0,0,1,1,0,0,0,0 },
    { 1,1,0,0,1,0,0,0,0,0 },
    };
lcd.drawSprite(_x,_y,12,10,(int *)swordsprite);
}

// ************************************************************************


void Enemy::sword_left(N5110 &lcd) {
    const int swordsprite[12][10] =   {
    { 0,0,0,0,1,1,1,1,0,0 },
    { 0,0,0,0,1,1,1,1,0,1 },
    { 0,0,0,0,0,1,1,0,0,1 },
    { 0,0,0,1,0,1,1,0,1,1 },
    { 1,1,1,1,1,1,1,1,1,0 },
    { 0,0,0,1,0,1,1,0,0,0 },
    { 0,0,0,0,0,1,1,0,0,0 },
    { 0,0,0,0,0,1,1,0,0,0 },
    { 0,0,0,0,1,1,1,1,0,0 },
    { 0,0,0,1,1,0,0,1,1,0 },
    { 0,0,0,0,1,1,0,0,1,0 },
    { 0,0,0,0,0,1,0,0,1,1 },
    };
lcd.drawSprite(_x,_y,12,10,(int *)swordsprite);
}

// ************************************************************************


void Enemy::kick_right(N5110 &lcd) {
    const int kick[12][10] =   {
    { 0,1,1,0,0,0,0,0,0,0 },
    { 0,1,1,0,1,1,0,0,0,0 },
    { 0,0,0,1,1,1,1,0,0,1 },
    { 0,0,1,1,1,0,0,0,1,1 },
    { 0,1,1,1,1,1,1,1,0,0 },
    { 0,1,0,0,1,1,1,0,0,0 },
    { 1,1,1,0,1,1,0,0,0,0 },
    { 0,1,0,0,1,0,0,0,0,0 },
    { 0,1,0,1,1,0,0,0,0,0 },
    { 0,0,0,1,0,0,0,0,0,0 },
    { 0,0,1,1,0,0,0,0,0,0 },
    { 0,0,1,1,0,0,0,0,0,0 },
    };
lcd.drawSprite(_x,_y,12,10,(int *)kick);
}

// ************************************************************************


void Enemy::kick_left(N5110 &lcd) {
    const int kick[12][10] =   {
    { 0,0,0,0,0,0,0,1,1,0 },
    { 0,0,0,0,1,1,0,1,1,0 },
    { 1,0,0,1,1,1,1,0,0,0 },
    { 1,1,0,0,0,1,1,1,0,0 },
    { 0,0,1,1,1,1,1,1,1,0 },
    { 0,0,0,1,1,1,0,0,1,0 },
    { 0,0,0,0,1,1,0,1,1,1 },
    { 0,0,0,0,0,1,0,0,1,0 },
    { 0,0,0,0,1,1,0,0,1,0 },
    { 0,0,0,0,1,0,0,0,0,0 },
    { 0,0,0,0,1,1,0,0,0,0 },
    { 0,0,0,0,1,1,0,0,0,0 },
    };
lcd.drawSprite(_x,_y,12,10,(int *)kick);
}

// ************************************************************************

void Enemy::twoway_punch(N5110 &lcd){
    const int punchpunch[12][10] =   {
    { 0,0,0,0,0,0,0,0,0,0 },
    { 0,0,0,0,1,1,0,0,0,0 },
    { 0,0,0,0,1,1,0,0,0,0 },
    { 0,0,0,0,1,1,0,0,1,0 },
    { 1,1,1,1,1,1,1,1,1,1 },
    { 0,0,0,0,1,1,0,0,1,0 },
    { 0,0,0,0,1,1,0,0,0,0 },
    { 0,0,0,1,1,1,1,0,0,0 },
    { 0,0,1,1,0,0,1,1,0,0 },
    { 0,1,0,0,0,0,0,0,1,0 },
    { 0,1,0,0,0,0,0,0,1,0 },
    { 0,1,0,0,0,0,0,0,1,0 },
    };

lcd.drawSprite(_x,_y,12,10,(int *)punchpunch);
}

void Enemy::randomize_moves(N5110 &lcd, int input) {
    int move_number = rand()%12;
    draw(lcd, input);
    // enemy state: looking to the right (input is 1)
    if(input == 1) {
        if (move_number == 0) {
            kick_right(lcd);
        }
        else if (move_number == 1) {
            sword_right(lcd);
        }
        else if (move_number == 2){
            twoway_punch(lcd);
        }
        else{draw(lcd, input);} // else have the enemy standing still but looking at fighter
    }
    else if(input == 0) { // enemy state: looking to the left 
        if (move_number == 0) {
            kick_left(lcd);
        }
        else if (move_number == 1) {
            sword_left(lcd);
        }
        else if (move_number == 2){
            twoway_punch(lcd);
        }
        else{draw(lcd, input);}
    }
}