#define rLED 3
#define yLED 5
#define gLED 6

#define p1LED 9
#define p2LED 10

#define BUZPIN 11

#define p1BUTTON 2
#define p2BUTTON 13

#define RESETBUTTON 8

bool gameOver = true;
bool pressLive = false;
bool resetReady = true;

void setup() {
  Serial.begin(9600);

  pinMode(rLED, OUTPUT);
  pinMode(yLED, OUTPUT);
  pinMode(gLED, OUTPUT);
  pinMode(p1LED, OUTPUT);
  pinMode(p2LED, OUTPUT);
  pinMode(p1BUTTON, INPUT);
  pinMode(p2BUTTON, INPUT);
  pinMode(RESETBUTTON, INPUT);

  digitalWrite(p1BUTTON, HIGH);
  digitalWrite(p2BUTTON, HIGH);
  digitalWrite(RESETBUTTON, HIGH);

  randomSeed(analogRead(0));
}

void loop() {
  if (digitalRead(p1BUTTON) == LOW) {
    //Serial.println("hi im pressed");
  }

  if (gameOver == false) {
    trafficlight(random(1000, 10000));
    gameOver = true;
  }
  
  if (pressLive == true && digitalRead(p1BUTTON) == LOW) {
    pressLive = false;
    digitalWrite(p1LED, HIGH);
    delay(50);
    digitalWrite(p1LED, LOW);
    delay(50);
    digitalWrite(p1LED, HIGH);
    delay(50);
    digitalWrite(p1LED, LOW);
    delay(50);
    digitalWrite(p1LED, HIGH);

    delay(500);
    victoryTheme();
    lightFlicker();
    resetReady = true;
  }


  if (pressLive == true && digitalRead(p2BUTTON) == LOW) {
    pressLive = false;
    digitalWrite(p2LED, HIGH);
    delay(50);
    digitalWrite(p2LED, LOW);
    delay(50);
    digitalWrite(p2LED, HIGH);
    delay(50);
    digitalWrite(p2LED, LOW);
    delay(50);
    digitalWrite(p2LED, HIGH);

    delay(500);
    victoryTheme();
    lightFlicker();
    resetReady = true;
  }
  if (resetReady && digitalRead(RESETBUTTON) == LOW) {
    digitalWrite(p1LED, LOW);
    digitalWrite(p2LED, LOW);
    delay(500);
    gameOver = false;
    resetReady = false;
  }
}

void trafficlight(int wait) {
  tone(BUZPIN, 300, 100);
  digitalWrite(rLED, HIGH);
  delay(1000);
  tone(BUZPIN, 300, 100);
  digitalWrite(rLED, LOW);
  digitalWrite(yLED, HIGH);
  delay(wait);
  tone(BUZPIN, 600, 100);
  digitalWrite(yLED, LOW);
  digitalWrite(gLED, HIGH);
  pressLive = true;
}

void victoryTheme() {
  tone(BUZPIN, 523.25, 133);
  delay(133);
  tone(BUZPIN, 523.25, 133);
  delay(133);
  tone(BUZPIN, 523.25, 133);
  delay(133);
  tone(BUZPIN, 523.25, 400);
  delay(400);
  tone(BUZPIN, 415.30, 400);
  delay(400);
  tone(BUZPIN, 466.16, 400);
  delay(400);
  tone(BUZPIN, 523.25, 133);
  delay(133);
  delay(133);
  tone(BUZPIN, 466.16, 133);
  delay(133);
  tone(BUZPIN, 523.25, 1200);
  delay(1200);
}

void lightFlicker() {
  digitalWrite(rLED, HIGH);
  digitalWrite(yLED, HIGH);
  digitalWrite(gLED, HIGH);
  delay(100);
  digitalWrite(rLED, LOW);
  digitalWrite(yLED, LOW);
  digitalWrite(gLED, LOW);
  delay(100);
  digitalWrite(rLED, HIGH);
  digitalWrite(yLED, HIGH);
  digitalWrite(gLED, HIGH);
  delay(100);
  digitalWrite(rLED, LOW);
  digitalWrite(yLED, LOW);
  digitalWrite(gLED, LOW);
  delay(100);
  digitalWrite(rLED, HIGH);
  digitalWrite(yLED, HIGH);
  digitalWrite(gLED, HIGH);
  delay(100);
  digitalWrite(rLED, LOW);
  digitalWrite(yLED, LOW);
  digitalWrite(gLED, LOW);
}