////CS-GO C4 PROP by Halil YILMAZ////
//////////////HATEK//////////////////

#include <LiquidCrystal_I2C.h>
#include <Keypad.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

unsigned long BipMillis = 0;
unsigned long SonMillis;

unsigned long CozumMillis = 0;

unsigned long BasimAni = 0;
unsigned long Basilma = 0;

unsigned long SifreCozumMillis = 0;

int butVal = 0;
int button = 10;

int CozumSuresi = 10;
int CozulmeD = 0;

const int b = 11; //Buzzer pini
int a = 2709; //Sürekli çalan bip notası
int B = 1046; //Sonda seri çalan bip notası
int c = 5; //Sonda seri çalan bip sayısının değişkeni

int BipKilit = 0; //Defuse sesinin sadece 1 kere çalmasını sağlamak için

int EkranKilit1 = 0; //Ekranı sürekli olarak sil-yaz yapmamak için
int EkranKilit2 = 0;
int EkranKilit3 = 0;

int Bekleme = 1000; 

char kod[7];
char kod2[7] = {7,3,5,5,6,0,8};
int yer = 0;
int kon = 3;
int say = 0;
int temiz = 0;

const uint8_t ROWS = 4;
const uint8_t COLS = 4;
char keys[ROWS][COLS] = {
  { '1', '2', '3', 'A' },
  { '4', '5', '6', 'B' },
  { '7', '8', '9', 'C' },
  { '*', '0', '#', 'D' }
};
uint8_t colPins[COLS] = { 5, 4, 3, 2 };
uint8_t rowPins[ROWS] = { 9, 8, 7, 6 };
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
int krksay = 0;
int konum = 15;

void setup() {
  pinMode(button, INPUT);
  pinMode(b, OUTPUT);

  lcd.begin(16,2);
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(3,0);
  lcd.print("* * * * * * *");
  ////Açılış Sesi////
  tone(b,1686);
  delay(70);
  noTone(b);
  delay(70);
  tone(b,1686);
  delay(70);
  noTone(b);
  //////////////////

  /*////LCD Şifre Animasyon////
  lcd.setCursor(3,0);
  lcd.print("* * * * * * *");
  delay(500);
  lcd.clear();
  lcd.setCursor(3,0);
  lcd.print("* * * * * * 7");
  delay(500);
  lcd.clear();
  lcd.setCursor(3,0);
  lcd.print("* * * * * 7 3");
  delay(500);
  lcd.clear();
  lcd.setCursor(3,0);
  lcd.print("* * * * 7 3 5");
  delay(500);
  lcd.clear();
  lcd.setCursor(3,0);
  lcd.print("* * * 7 3 5 5");
  delay(500);
  lcd.clear();
  lcd.setCursor(3,0);
  lcd.print("* * 7 3 5 5 6");
  delay(500);
  lcd.clear();
  lcd.setCursor(3,0);
  lcd.print("* 7 3 5 5 6 0");
  delay(500);
  lcd.clear();
  lcd.setCursor(3,0);
  lcd.print("7 3 5 5 6 0 3");
  delay(500);
  ///////////////////////////*/

}

void loop() {
  butVal = digitalRead(button);
  SonMillis = millis();

  char key = keypad.getKey();
  lcd.setCursor(konum,0);
  if (key != NO_KEY) {
    tone(b,a);
    delay(70);
    noTone(b);
    kod[krksay] = key;
    krksay += 1;
    if(key != '#'){
      for(int i = 0; i <= 7; i++){
        lcd.print(kod[i]);
        lcd.print(" ");
        delay(10);
      }
      konum -= 2;
    }
  }
  if(kod[0] == '7' && kod[1] == '3' && kod[2] == '5' && kod[3] == '5' && kod[4] == '6' && kod[5] == '0' && kod[6] == '8'){

  if(CozulmeD == 0){
    if(EkranKilit1 == 0){
      lcd.clear();
      lcd.setCursor(1,0);
      lcd.print("Bomba Kuruldu!");
      EkranKilit1 = 1;
    }
    
    if(SonMillis - BipMillis >= Bekleme && Bekleme > 207){
      tone(b,a);
      delay(125);
      noTone(b);
      //SonMillis = 0;
      BipMillis = SonMillis;
      Bekleme -=13;
      if(Bekleme == 207){
        Bekleme = 103;
        for(B; B <= 2000 ; B++){
          delay(1);
          tone(b,B);
          if(B == 2000){
            noTone(b);
            for(c; c>= 0; c--){
              tone(b,2000);
              delay(70);
              noTone(b);
              delay(70);
            }
          }
        }
      }
      if(Bekleme == 103){
        CozulmeD = 1;
        lcd.clear();
        lcd.setCursor(1,0);
        lcd.print("Bomba Patladi!");
        delay(3000);
        lcd.clear();
        lcd.setCursor(2,0);
        lcd.print("Teroristler");
        lcd.setCursor(4,1);
        lcd.print("Kazandi");
        
      }
    }
  }
  

  if(butVal == HIGH && BasimAni == 0){
    BasimAni = millis();
  }

  if(butVal == LOW && BasimAni != 0 && CozulmeD == 0){
    lcd.clear();
    BasimAni = 0;
    Basilma = 0;
    CozumSuresi = 10;
    EkranKilit1 = 0;
    BipKilit = 0;
    temiz = 0;
  }

  if(butVal == HIGH && BasimAni != 0 && CozulmeD == 0){
    Basilma = millis() - BasimAni;
    if(SonMillis - SifreCozumMillis >= 240){
    SifreCozumMillis = SonMillis;
    say +=1;
    lcd.setCursor(kon,0);
    lcd.print(say);
    if(say == 10){
      say = 0;
    }
    if(say == kod2[yer]){
      say = -1;
      kon += 2;
      yer += 1;
    }

  }
    if(SonMillis - CozumMillis >= 1000 && CozumSuresi >= 0){
      if(temiz == 0){
        lcd.clear();
        temiz = 1;
        lcd.setCursor(3,0);
        lcd.print("* * * * * * *");
      }
      ////Çözüm Sesi////
      if(BipKilit == 0){
        tone(b,1686);
        delay(70);
        noTone(b);
        delay(70);
        tone(b,1686);
        delay(70);
        noTone(b);
        delay(70);
        tone(b,1686);
        delay(70);
        noTone(b);
        BipKilit = 1;
      }
      /////////////////
      
      lcd.setCursor(4,1);
      lcd.print("Cozuluyor:");
      
      if(CozumSuresi == 10){
        lcd.print(CozumSuresi);
      }
      if(CozumSuresi < 10){
        lcd.print("0");
        lcd.print(CozumSuresi);
      }
      CozumSuresi -= 1;
      CozumMillis = SonMillis;
    }
    if(Basilma >= 10500){
      CozulmeD = 1;
      if(EkranKilit2 == 0){
        lcd.clear();
        EkranKilit2 = 1;
      }
      
      lcd.setCursor(1,0);
      lcd.print("Bomba Cozuldu!");
      delay(3000);
      lcd.clear();
      lcd.print("Anti-Teroristler");
      lcd.setCursor(4,1);
      lcd.print("Kazandi");
    }
  }
  }
}