#include <SPI.h>
#include <MFRC522.h>
 
#define SS_PIN 10
#define RST_PIN 9
MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.

// from _75 hc, setting up on/off mapping to make each digit in 7-seg display
byte seven_seg_digits[10] = { B11111100,  // = 0
                              B01100000,  // = 1
                              B11011010,  // = 2
                              B11110010,  // = 3
                              B01100110,  // = 4
                              B10110110,  // = 5
                              B10111110,  // = 6
                              B11100000,  // = 7
                              B11111110,  // = 8
                              B11100110   // = 9
                             };
//7-seg display pin assignments
int latchPin = 3;
int clockPin = 4;
int dataPin = 2;

void setup() {
   Serial.begin(9600);
   SPI.begin();      // Initiate  SPI bus
   mfrc522.PCD_Init();   // Initiate MFRC522

Serial.println("Break time, Human!");
delay(500);
Serial.println("Select difficulty for your 'Super Fun Break' game:");
delay(500);
Serial.println("1: Easy");
delay(500);
Serial.println("2: Medium");
delay(1000);
Serial.println("3: Brutal >:)");

  // Set latchPin, clockPin, dataPin as output
  pinMode(latchPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
}

// display a number on the digital segment display
void numba(byte digit) {
  // set the latchPin to low potential, before sending data
  digitalWrite(latchPin, LOW);
     
  // the original data (bit pattern)
  shiftOut(dataPin, clockPin, LSBFIRST, seven_seg_digits[digit]);  
 
  // set the latchPin to high potential, after sending data
  digitalWrite(latchPin, HIGH);
}
  
void loop() {
if ( ! mfrc522.PICC_IsNewCardPresent()) 
  {
    //return;
  if(Serial.available() > 0) {
  char x = Serial.read();
  Serial.println(x);
  if(x == '1') {
    Serial.println("Lame..."); 
    delay(1000);
    //makes the timer "act weird"
    for (byte digit = 10; digit > 0; --digit) {
    delay(100);
    numba(digit - 1);
    }
    numba(7);
    delay(100);
    numba(3);
    delay(100);
    numba(5);
    delay(100);
    numba(2);
    delay(100);
    numba(8);
    delay(100);
    numba(1);
    delay(100);
    numba(9);
    delay(100);
    numba(4);
    delay(100);
    numba(2);
    delay(100);
    numba(8);
    delay(100);
    numba(8);
    delay(100);
    numba(1);
    delay(100);
    numba(9);
    delay(100);
    numba(4);
    delay(100);
    numba(2);
    delay(100);
    Serial.println("Oops! Looks like that difficulty doesn't work yet. Try again!");
  }
  
  if(x == '2') {
    Serial.println("Let's see...");
    delay(1000);
    //makes the timer "act weird"
    for (byte digit = 0; digit < 10; ++digit) {
    delay(100);
    numba(digit + 1); 
    }
    for (byte digit = 0; digit < 10; ++digit) {
    delay(100);
    numba(digit + 1); 
    }
    for (byte digit = 0; digit < 10; ++digit) {
    delay(100);
    numba(digit + 1); 
    }
    Serial.println("Huh");
    delay(2000);
    Serial.println("Looks like there are some technical issues going on.");
    delay(2000);
    Serial.println("So weird.");
    delay(750);
    Serial.println("Well, guess you need to select a different option!");
  }
  
  if(x == '3') {
    Serial.println("AWWWWWWWWWWW YEAH!");
    delay(3000);
    Serial.println("Ahem.");
    delay(500);
    Serial.println("Difficulty set. Activate your play session by scanning your 'FUN' card where instructed.");
    Serial.println("Check the countdown timer - your time starts now!");
    for (byte digit = 10; digit > 0; --digit) {
    delay(3500);
    numba(digit - 1);
    }
    delay(10000);
    Serial.println("Um... did you read the instructions?");
  }  
  }
}

 // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial()) 
  {
    return;
  }
  //Show UID on serial monitor
  //Serial.print("UID tag :");
  String content= "";
  byte letter;
  for (byte i = 0; i < mfrc522.uid.size; i++) 
  {
     //Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
     //Serial.print(mfrc522.uid.uidByte[i], HEX);
     content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
     content.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  //Serial.println();
  //Serial.print("Message : ");
  content.toUpperCase();
  if (content.substring(1) == "9B 95 EB 0A") //change here the UID of the card/cards that you want to give access
  {
    Serial.println("Wow, you figured it out! Nice job!");
    Serial.println();
    Serial.println("Now it's time to play the REAL game!");
    delay(3000); //keeps from spamming the serial monitor
    Serial.println("Oh, break time's over! Wasn't that fun??");
    delay(1000);
    Serial.println("Now get back to work! ^_^");
    delay(3000);
  }
 
 else   { //if you try a different card or tag
    Serial.println("Um, no. I said 'FUN' card, remember?");
    delay(3000);
  }

}

/*some extra code I tried and either didn't figure out or didn't need:

  Serial.print("UID tag :");
  String content= "";
  byte letter;
  for (byte i = 0; i < mfrc522.uid.size; i++) 
  {
     Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
     Serial.print(mfrc522.uid.uidByte[i], HEX);
     content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
     content.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  Serial.println();
  Serial.print("Message : ");
   content.toUpperCase();
   if (content.substring(1) == "9B 95 EB 0A") //change here the UID of the card/cards that you want to give access
  {
    Serial.println("Authorized access");
    Serial.println();
      Display(9);
   delay(5000);
   Display(10);
    delay(5000);
    Display(11);
    delay(5000);
     Display(12);
   delay(5000);
    Display(13);
    delay(5000);
    Display(14);
    delay(5000);
    Display(15);
    delay(5000);
  }
 
   else   {
    Serial.println(" Access denied");
    delay(3000);
  }*/

  /*int latch=5;  //74HC595  pin 9 STCP
int clock=6; //74HC595  pin 10 SHCP
int data=4;   //74HC595  pin 8 DS

/*unsigned char table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c
,0x39,0x5e,0x79,0x71,0x00};*/

/*const byte numbers[10][7] = {
                            // 0: segment lit, 1: unlit
  // a  b  c  d  e  f  g
    {0, 0, 0, 0, 0, 0, 1},   // 0
    {1, 0, 0, 1, 1, 1, 1},   // 1
    {0, 0, 1, 0, 0, 1, 0},   // 2
    {0, 0, 0, 0, 1, 1, 0},   // 3
    {1, 0, 0, 1, 1, 0, 0},   // 4
    {0, 1, 0, 0, 1, 0, 0},   // 5
    {0, 1, 0, 0, 0, 0, 0},   // 6
    {0, 0, 0, 1, 1, 1, 1},   // 7
    {0, 0, 0, 0, 0, 0, 0},   // 8
    {0, 0, 0, 1, 1, 0, 0},   // 9
};*/

/*void Display(unsigned char num) //this is a function for the LED display
{

  digitalWrite(latch,LOW);
  shiftOut(data,clock,MSBFIRST,table[num]);
  digitalWrite(latch,HIGH);
  
}*/

//THIS IS THE SECOND SET OF CODE FOR SIMON SAYS WITH THE RFID!!!!!!!!

#include <SPI.h>
#include <MFRC522.h>
 
#define SS_PIN 10
#define RST_PIN 9
#define greenLED 2
#define blueLED 3
#define yellowLED 4
#define gButton 5
#define bButton 6
#define yButton 7
#define start 8
MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance.

void setup() {
  Serial.begin(9600);   // Initiate a serial communication
  SPI.begin();      // Initiate  SPI bus
  mfrc522.PCD_Init();   // Initiate MFRC522
  Serial.println("Approximate your card to the reader...");
  Serial.println();

  pinMode(greenLED, OUTPUT);
  pinMode(blueLED, OUTPUT);
  pinMode(yellowLED, OUTPUT);
  pinMode(gButton, INPUT_PULLUP);
  pinMode(bButton, INPUT_PULLUP);
  pinMode(yButton, INPUT_PULLUP);
  pinMode(start, INPUT_PULLUP);
}

void loop() {
// Look for new cards
  if ( ! mfrc522.PICC_IsNewCardPresent()) 
  {
    return;
  }
  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial()) 
  {
    return;
  }
  //Show UID on serial monitor
  //Serial.print("UID tag :");
  String content= "";
  byte letter;
  for (byte i = 0; i < mfrc522.uid.size; i++) 
  {
     //Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
     //Serial.print(mfrc522.uid.uidByte[i], HEX);
     content.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "));
     content.concat(String(mfrc522.uid.uidByte[i], HEX));
  }
  //Serial.println();
  //Serial.print("Message : ");
  content.toUpperCase();
  if (content.substring(1) == "9B 95 EB 0A") //change here the UID of the card/cards that you want to give access
  { //that time I wrote snarky dialogue and then remembered this would never be seen :'(
    Serial.println("Oh, you want to play Simon Says?");
    delay(200);
    Serial.println("BRING IT");
    Serial.println();
    delay(200);
    //simon says sequence
      digitalWrite(blueLED, HIGH);
      delay(200);
      digitalWrite(blueLED, LOW);
      delay(200);
      digitalWrite(greenLED, HIGH);
      delay(200);
      digitalWrite(greenLED, LOW);
      delay(200);
      digitalWrite(greenLED, HIGH);
      delay(200);
      digitalWrite(greenLED, LOW);
      delay(200);
      digitalWrite(yellowLED, HIGH);
      delay(200);
      digitalWrite(yellowLED, LOW);
      delay(200);
      digitalWrite(blueLED, HIGH);
      delay(200);
      digitalWrite(blueLED, LOW);
      delay(200);
      digitalWrite(greenLED, HIGH);
      delay(200);
      digitalWrite(greenLED, LOW);
      delay(200);
      digitalWrite(greenLED, HIGH);
      delay(200);
      digitalWrite(greenLED, LOW);
      delay(200);
      digitalWrite(yellowLED, HIGH);
      delay(200);
      digitalWrite(yellowLED, LOW);
      delay(200);
      digitalWrite(blueLED, HIGH);
      delay(200);
      digitalWrite(blueLED, LOW);
      delay(200);
      digitalWrite(greenLED, HIGH);
      delay(200);
      digitalWrite(greenLED, LOW);
      delay(200);
      digitalWrite(yellowLED, HIGH);
      delay(200);
      digitalWrite(yellowLED, LOW);
      delay(200);
      digitalWrite(blueLED, HIGH);
      delay(200);
      digitalWrite(blueLED, LOW);
      delay(200);
      digitalWrite(greenLED, HIGH);
      delay(200);
      digitalWrite(greenLED, LOW);
      delay(200);
      
    Serial.print("YOUR TURN >:)");
    Serial.print("Press the 3 leftmost buttons to replay the sequence. Press the right button to reset, then rescan");
    Serial.print("and prepare to lose again!!!!!");

    while (digitalRead(start) == HIGH) {
      if (digitalRead(gButton) == LOW) {
        digitalWrite(blueLED, LOW);
        digitalWrite(greenLED, HIGH);
        digitalWrite(yellowLED,LOW);
      }
      if (digitalRead(bButton) == LOW) {
        digitalWrite(blueLED, HIGH);
        digitalWrite(greenLED, LOW);
        digitalWrite(yellowLED,LOW);
      }
      if (digitalRead(yButton) == LOW) {
        digitalWrite(blueLED, LOW);
        digitalWrite(greenLED, LOW);
        digitalWrite(yellowLED,HIGH);
      }
      if (digitalRead(start) == LOW) {
        digitalWrite(blueLED, HIGH);
        digitalWrite(yellowLED, HIGH);
        digitalWrite(greenLED, HIGH);
        delay(200);
        digitalWrite(blueLED, LOW);
        digitalWrite(yellowLED, LOW);
        digitalWrite(greenLED, LOW);
        delay(200);
        digitalWrite(blueLED, HIGH);
        digitalWrite(yellowLED, HIGH);
        digitalWrite(greenLED, HIGH);
        delay(200);
        digitalWrite(blueLED, LOW);
        digitalWrite(yellowLED, LOW);
        digitalWrite(greenLED, LOW);
        return;
      }
      else {
        digitalWrite(blueLED, LOW);
        digitalWrite(greenLED, LOW);
        digitalWrite(yellowLED,LOW);
      }
  }

}
 else   {
    Serial.println(" Access denied");
    delay(3000);
}
}