#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Wire.h> 
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define KEY A1
Adafruit_SSD1306 d(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire);
const byte PROGMEM ball[] = {
  B00011000,
  B01100110,
  B01000010,
  B11000011,
  B01000010,
  B01100110,
  B00011000,
};  
#define LITAK_W 17
#define LITAK_H 12
const byte PROGMEM litak_r[] = {
 B11000111, B00000000,B00000000,
 B10100100, B10000000,B00000000,
 B10010010, B01000000,B00000000,
 B01001111, B11111100,B00000000,
 B10000000, B00000011,B00000000,
 B11100000, B01010100,B10000000,
 B00011100, B00000000,B10000000,
 B00000100, B01111111,B00000000,
 B00001000, B10000000,B00000000,
 B00001001, B00000000,B00000000,
 B00010010, B00000000,B00000000,
 B00011100, B00000000,B00000000,
};
const byte PROGMEM litak_l[] = {
  B00000000,B01110001,B10000000,
  B00000000,B10010010,B10000000,
  B00000001,B00100100,B10000000,
  B00011111,B11111001,B00000000,
  B01100000,B00000000,B10000000,
  B10010101,B00000011,B10000000,
  B10000000,B00011100,B00000000,
  B01111111,B00010000,B00000000,
  B00000000,B10001000,B00000000,
  B00000000,B01001000,B00000000,
  B00000000,B00100100,B00000000,
  B00000000,B00011100,B00000000,
};
#define BOMB_W 5
#define BOMB_H 7
const byte PROGMEM bomb[] = {
  B01110000,
  B00100000,
  B01110000,
  B10001000,
  B10001000,
  B01110000,
  B00100000,
};
#define TANK_W 14
#define TANK_H 7
const byte PROGMEM tank_r[] = {
  B00011111,B00000000,
  B00100000,B11111100,
  B00100000,B10000000,
  B01000000,B01000000,
  B11111111,B11111000,
  B10000000,B00010000,
  B01111111,B11100000,
};
const byte PROGMEM tank_l[] = {
  B00000011,B11100000,
  B11111100,B00010000,
  B00000100,B00010000,
  B00001000,B00001000,
  B01111111,B11111100,
  B00100000,B00000100,
  B00011111,B11111000,
};
#define BABAH_W 14
#define BABAH_H 7
const byte PROGMEM babah[] = {
  B01001101,B00100100,
  B00011111,B11111000,
  B00001111,B11110000,
  B00010101,B11100000,
  B00001111,B11111000,
  B00000111,B10100000,
  B00000111,B11010000,
};
int pause=0;
int score=0;
void setup() {
  Serial.begin(115200);
  pinMode( KEY, INPUT_PULLUP );
  d.begin(SSD1306_SWITCHCAPVCC, 0x3C); 
  d.clearDisplay();
  /*
  d.drawBitmap( 10,10, litak_r, LITAK_W, LITAK_H, 1);
  d.drawBitmap( 40,10, bomb, BOMB_W, BOMB_H, 1);
  d.drawBitmap( 40,30, tank_r, TANK_W, TANK_H, 1);
  */
  d.display();
  randomSeed( analogRead(A0) );
  d.setTextColor(1);
}
float litak_x=-127, litak_y=0, litak_sx=-5, litak_sy=0;
float tank_x=-127, tank_sx=1;
float bomb_x=-127, bomb_y=500, bomb_sx=3, bomb_sy=0;
void moveLitak(){
  // рух літака
  if ( litak_sx > 0 )
    d.drawBitmap( litak_x,litak_y, litak_r, LITAK_W, LITAK_H, 0);
  else  
    d.drawBitmap( litak_x,litak_y, litak_l, LITAK_W, LITAK_H, 0);
  
  litak_x += litak_sx;
  litak_y += litak_sy;
  
  if ( (litak_x > 127) || (litak_x < -LITAK_W) ) {
    litak_sx = (float) random( 30, 60 ) / 10;
    if ( random(2) == 0 ) litak_sx = -litak_sx;
    if ( litak_sx > 0 ) litak_x = -LITAK_W;
    else litak_x = 127;
    litak_y = random( 63 - LITAK_H - TANK_H - 20 );
  }  
  if ( litak_sx > 0 )
    d.drawBitmap( litak_x,litak_y, litak_r, LITAK_W, LITAK_H, 1);
  else  
    d.drawBitmap( litak_x,litak_y, litak_l, LITAK_W, LITAK_H, 1);
  d.setCursor(0,0);
  d.print(score);
}
void moveTank(){
  // рух танка
  if ( tank_sx > 0 )
    d.drawBitmap( tank_x, 63-TANK_H , tank_r, TANK_W, TANK_H, 0);
  else   
    d.drawBitmap( tank_x, 63-TANK_H , tank_l, TANK_W, TANK_H, 0);
  tank_x += tank_sx;
  if ( ( tank_x > 127 ) || ( tank_x < -TANK_W ) ) {
    tank_sx = (float) random( 10, 30 ) / 10;
    if ( random(2) == 0 ) tank_sx = -tank_sx;
    if ( tank_sx > 0 ) tank_x = -TANK_W;
    else tank_x = 127;
  }
  if ( tank_sx > 0 )
    d.drawBitmap( tank_x, 63-TANK_H , tank_r, TANK_W, TANK_H, 1);
  else  
    d.drawBitmap( tank_x, 63-TANK_H , tank_l, TANK_W, TANK_H, 1);
}
void moveBomb(){
  // рух бомби
  if ( bomb_y < SCREEN_HEIGHT ) {
    d.drawBitmap(bomb_x, bomb_y, bomb, BOMB_W, BOMB_H, 0 );
    bomb_sy = bomb_sy + 1;
    if ( bomb_sy > TANK_H ) bomb_sy = TANK_H; 
    bomb_x = bomb_x + bomb_sx;
    bomb_y = bomb_y + bomb_sy;
    d.drawBitmap(bomb_x, bomb_y, bomb, BOMB_W, BOMB_H, 1 );
  }
  else {
    if ( digitalRead(KEY) == 0 ) {
        // запускаємо нову бомбу
        bomb_x = litak_x;
        bomb_y = litak_y;
        bomb_sx = litak_sx/2;
        bomb_sy = 0;
    }
  }
}
void checkHit(){
  if ( bomb_x + BOMB_W >= tank_x) {
    if ( bomb_x < tank_x + TANK_W ) {
      if (bomb_y > SCREEN_HEIGHT - TANK_H ) {
        if ( bomb_y < SCREEN_HEIGHT ) {
          // попала в танк
          d.drawBitmap( bomb_x, SCREEN_HEIGHT-TANK_H-BABAH_H, babah, BABAH_W, BABAH_H, 1);
          
          //Serial.println("Hit!");
          //Serial.println(bomb_x);
          //Serial.println(bomb_y);
          if ( tank_sx > 0 ) tank_sx = 0.001;
          else tank_sx = -0.001;
          d.drawBitmap(bomb_x, bomb_y, bomb, BOMB_W, BOMB_H, 0 );
          bomb_y = SCREEN_HEIGHT * 2;
          d.display();
          pause = 20;
        }
      }
    }
  }
}
void loop() {
  moveLitak();
  moveTank();
  moveBomb();
  checkHit();
  if (pause > 0) {
    pause--;
    if ( pause == 10 ){
      d.drawBitmap( bomb_x, SCREEN_HEIGHT-TANK_H-BABAH_H, babah, BABAH_W, BABAH_H, 0);
    }
    if ( pause == 0 ){
      d.clearDisplay();
      tank_x = SCREEN_WIDTH * 2;
      score++;
      d.setCursor(0,0);
      d.print(score);
    }
  }
  d.display();
}