#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[] = {
  B00011111,B00000000,
  B00100000,B11111100,
  B00100000,B10000000,
  B01000000,B01000000,
  B11111111,B11111000,
  B10000000,B00010000,
  B01111111,B11100000,
};
#define BABAH_W 9
#define BABAH_H 7
const byte PROGMEM babah[] = {
  B00000001,B00100100,B10000000,
  B00011111,B11111001,B00000000,
  B01100000,B00000000,B10000000,
  B10010101,B00000011,B10000000,
  B10000000,B00011100,B00000000,
  B01111111,B00010000,B00000000,
  B00000000,B10001000,B00000000,
};
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) );
}
float litak_x=127, litak_y=0, litak_sx=-5, litak_sy=0;
float tank_x=0, tank_sx=1;
float bomb_x=10, bomb_y=500, bomb_sx=3, bomb_sy=0;
int babah_cnt;
void loop() {
  // рух літака
  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 = 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);
  // рух танка
  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 = 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);
  // рух бомби
  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-1;
    bomb_x = bomb_x + bomb_sx;
    bomb_y = bomb_y + bomb_sy;
    if (bomb_y > SCREEN_HEIGHT) bomb_y = SCREEN_HEIGHT; 
    d.drawBitmap(bomb_x, bomb_y, bomb, BOMB_W, BOMB_H, 1 );
  }
 
  if ( digitalRead(KEY) == 0 ) {
    if ( bomb_y >= SCREEN_HEIGHT ) {
      if ( babah_cnt == 0 ) {
        // запускаємо нову бомбу
        if (litak_sx > 0) bomb_x = litak_x;
        else bomb_x = litak_x + LITAK_W - BOMB_W;
        bomb_y = litak_y + LITAK_H/2;
        bomb_sx = litak_sx;
        bomb_sy = 0;
      }
    }
  }
  if ( bomb_x >= tank_x - BOMB_W + 2) {
    if ( bomb_x < tank_x + TANK_W ) {
      if (bomb_y > 63-TANK_H ) {
        if ( bomb_y < SCREEN_HEIGHT ) {
          // попала в танк
          Serial.println("Hit!");
          d.drawBitmap( bomb_x, bomb_y, babah, BABAH_W, BABAH_H, 1);
          tank_sx = 0;
          bomb_y = SCREEN_HEIGHT;
          babah_cnt = 20;
        }
      }
    }
  }
  if ( babah_cnt > 0 ){
    babah_cnt -= 1;
    if (babah_cnt == 0) {
      tank_x = SCREEN_WIDTH + 1;
      d.clearDisplay();    
    }
  }
  d.display();
}