//Base on: https://www.youtube.com/watch?v=Oh9vgomyuOI
//Souce code: bytesnbits.co.uk/arduino-breakout-spi-lcd-touchscreen/#google_vignette

//TEMPLATE ???? for DOC

//### Pin Connections 
//| Arduino Pin | Device        |
//| ----------- | ------------- |
//| 12          | Red LED       |
//| 11          | Green LED     |
//| 10          | Blue LED      |
//| 9           | Yellow LED    |
//| 8           | Buzzer        |
//| 5           | Red Button    |
//| 4           | Green Button  |
//| 3           | Blue Button   |
//| 2           | Yellow Button |



#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#include <Keypad.h>

// function declarations
boolean checkCollision(int x1, int y1, int width1, int height1, int x2, int y2, int width2, int height2);

// For the Adafruit shield, these are the default.
#define TFT_CS 10
#define TFT_DC 9
#define TFT_MOSI 11
#define TFT_CLK 13
#define TFT_RST 8
#define TFT_MISO 12

#define TS_CS 7

#define ROTATION 1


// Use hardware SPI (on Uno, #13, #12, #11) and the above for CS/DC/RST
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);

float xCalM = 0.0, yCalM = 0.0;
float xCalC = 0.0, yCalC = 0.0;
float xPos = 0.0, yPos = 0.0;
float xPosLast = 0.0, yPosLast = 0.0;
float xVel = 0.0, yVel = 0.0;
int8_t topBorder = 20;
int8_t batWidth = 35;
int8_t batHeight = 4;
int16_t batX = 0, batY = 0;
int16_t newBatX;
int8_t ballSize = 10;
int playerLives = 3;
int playerScore = 0;
int level = 1;
int gameState = 1; // 1=start 2=playing 3=gameover
float xPosNBA = 0.0, yPosNBA = 0.0, xStart = 0.0;
boolean dyPosNBA; // true = to down, false = to up 
float timeNBA = 0, stepNBA = 0.1;
int xVelNBA = 1, yVelNBA = 1;
float vXNBA, vYNBA;
float angleNBA, FNBA;
String  welcome = "Czaro NBA";
boolean hit;

/* Keypad setup */
const byte KEYPAD_ROWS = 4;
const byte KEYPAD_COLS = 4;
byte rowPins[KEYPAD_ROWS] = {5, 4, 3, 2};
byte colPins[KEYPAD_COLS] = {A3, A2, A1, A0};
char keys[KEYPAD_ROWS][KEYPAD_COLS] = {
  {'1', '2', '3', '+'},
  {'4', '5', '6', '-'},
  {'7', '8', '9', '*'},
  {'.', '0', '=', '/'}
};

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, KEYPAD_ROWS, KEYPAD_COLS);

//const unsigned char PROGMEM bmp0[] =
const uint16_t ball_black[] PROGMEM={
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
};

const uint16_t basket[] PROGMEM={
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0xE8E4, 0xE8E4, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0x8802, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xFBE4, 0xFBE4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xFF80, 0xFF80, 0, 0, 0, 0, 0, 0, 0, 0, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0xE8E4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 

};


const uint16_t ball3[] PROGMEM={
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0000, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0000, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0000, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0x0000, 0x0, 0x0, 0x0, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0, 0x0, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0, 0x0, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0, 0x0, 0x0, 0x0000, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0x0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0000, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0000, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0000, 0x0000, 0xFBE4, 0xFBE4, 0x0000, 0xFBE4, 0xFBE4, 0xFBE4, 0x0000, 0x0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 
};

int16_t tftWidth = 0, tftHeight = 0;

class ScreenPoint {
  public:
    int16_t x;
    int16_t y;

    ScreenPoint(){
      // default contructor
    }

    ScreenPoint(int16_t xIn, int16_t yIn){
      x = xIn;
      y = yIn;
    }
};

class Block {
  public:
    int x;
    int y;
    int width;
    int height;
    int colour;
    int score;
    boolean isActive;

    // default constructor
    Block(){}
    
    Block(int xpos, int ypos, int bwidth, int bheight, int bcol, int bscore){
      x = xpos;
      y = ypos;
      width = bwidth;
      height = bheight;
      colour = bcol;
      score = bscore;
      isActive = true;
      drawBlock();
    }

    void drawBlock(){
      tft.fillRect(x,y,width,height,colour);
    }

    void removeBlock(){
      tft.fillRect(x,y,width,height,ILI9341_BLACK);
      isActive = false;
    }

    boolean isHit(float x1,float y1, int w1,int h1){
      if (checkCollision((int)round(x1),(int)round(y1),w1,h1,x,y,width,height)){
        return true;
      }
      else {
        return false;
      }
    }
};
Block blocks[5][16];

ScreenPoint getScreenCoords(int16_t x, int16_t y){
  int16_t xCoord = round((x * xCalM) + xCalC);
  int16_t yCoord = round((y * yCalM) + yCalC);
  if(xCoord < 0) xCoord = 0;
  if(xCoord >= tftWidth) xCoord = tftWidth - 1;
  if(yCoord < 0) yCoord = 0;
  if(yCoord >= tftHeight) yCoord = tftHeight - 1;
  return(ScreenPoint(xCoord, yCoord));
}

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

  // avoid chip select contention
  pinMode(TS_CS, OUTPUT);
  digitalWrite(TS_CS, HIGH);
  pinMode(TFT_CS, OUTPUT);
  digitalWrite(TFT_CS, HIGH);
 
  tft.begin();
  tft.setRotation(ROTATION);
  tft.fillScreen(ILI9341_BLACK);
  tftWidth = tft.width();
  tftHeight = tft.height();

  batY = tftHeight - batHeight -30;
  Serial.print("szerokosc = ");
  Serial.print( tftWidth );
  Serial.print("Wysokosc = ");
  Serial.println( tftHeight );

  //initialize random generator
  unsigned long noise = 0;
  for( int i = A0; i <= A7; i++) {  // select the analog pins that your board supports
    noise += analogRead( i);
    noise <<= 2;                    // for a little more random
  }
  randomSeed( noise);

}

void initGameNBA() {
  timeNBA = 0;
  stepNBA = 0.01;
  FNBA = 920.0;
  angleNBA = 45.0;
  tft.fillScreen(ILI9341_BLACK);
  tft.drawFastHLine(0, topBorder-1, tftWidth, ILI9341_BLUE);
  
  drawScore();
  drawLevel();
  drawLives();
    
  xPos = xPosNBA = xStart = ballSize + random() % 200;
  //debug
  Serial.println(xStart);
  yPos = yPosNBA = -20+tftHeight - ballSize;

  batX = 265;
  batY = 115;
  tft.drawRGBBitmap(batX-5, batY-17, basket, 45, 48);
  tft.fillRect(batX, batY, batWidth, batHeight,ILI9341_RED);
  tft.fillCircle(round(xStart), round(yPosNBA), ballSize, ILI9341_ORANGE);

}

void initDemo(){
  Serial.println( "initDemo" );

  batY = tftHeight - batHeight -30;

  xPosLast = xPos = 10;
  yPosLast = yPos = 230;
  xVel = 2;
  yVel = 2;

  playerLives = 3;
  playerScore = 0;
  level = 1;

  //draw Basket Ball
  int x = 40, y = 40;
  tft.fillCircle(x, y, 30, ILI9341_ORANGE);
  tft.drawCircle(x+36, y+18, 30, ILI9341_BLACK);
  tft.drawCircle(x+36, y+19, 30, ILI9341_BLACK);
  tft.drawCircle(x-36, y-18, 30, ILI9341_BLACK);
  tft.drawCircle(x-36, y-19, 30, ILI9341_BLACK);
  tft.drawLine(x-36, y-18, x+36,y+18 ,ILI9341_BLACK);
  tft.drawLine(x-36, y-19, x+36,y+17 ,ILI9341_BLACK);
  tft.drawLine(x+18, y-36, x-18,y+36 ,ILI9341_BLACK);
  tft.drawLine(x+18, y-37, x-18,y+35 ,ILI9341_BLACK);
  //tft.drawLine(x, y, x-36,y-18 ,ILI9341_BLACK);
  //tft.drawLine(x, y, x+36,y+18 ,ILI9341_BLACK);
  //tft.drawLine(x, y, x+18,y-36 ,ILI9341_BLACK);
  //tft.drawLine(x, y, x-18,y+36 ,ILI9341_BLACK);
  tft.setTextColor(ILI9341_WHITE);
  tft.setTextSize(3);
  tft.setCursor(x+45,y-20);
  tft.print(welcome);

  x = (tftWidth/2)-155;
  y = (tftHeight/2)-40;
  //tft.fillRect((tftWidth/2)-170,(tftHeight/2)-20,300,40,ILI9341_GREEN);
  blocks[0][0] = Block(x, y, 310, 40, ILI9341_GREEN, 0);
  tft.setCursor(x+30,y+12);
  tft.setTextSize(2);
  tft.setTextColor(ILI9341_WHITE);
  tft.print("PRESS ANY KEY TO PLAY");
}

void clearOldBallPos(){
  //tft.fillCircle(round(xPos), round(yPos), ballSize, ILI9341_BLACK);
  tft.fillRect(round(xPos)-ballSize,round(yPos)-ballSize,ballSize*2+1,ballSize*2+1,ILI9341_BLACK);

}

void moveBall_demo(){
  //Serial.print("demo -> ");
  //Serial.print(xVel);
  //Serial.println(yVel);
  
float newX, newY;
  newX = xPos + xVel;
  newY = yPos + yVel;
  if (newX < (float)ballSize){
    newX = (float)ballSize;
    xVel = -xVel;
  }
  if (newX > (float)(tftWidth - ballSize - 1)){
    newX = (float)(tftWidth - ballSize - 1);
    xVel = -xVel;
  }
  if (newY < topBorder + (float)ballSize){
    newY = topBorder + (float)ballSize;
    yVel = -yVel;
  }
  if (newY > tftHeight - (float)ballSize){
    yVel = -yVel;
  }
  
  if ((round(newX) != round(xPosLast)) || (round(newY) != round(yPosLast))){
    // draw ball
    clearOldBallPos();
    tft.fillCircle(round(newX), round(newY), ballSize, ILI9341_ORANGE);
    xPosLast = newX;
    yPosLast = newY;
  }
  xPos = newX;
  yPos = newY;
}

void moveBall(){
  tft.fillCircle(round(xPosNBA), round(yPosNBA), ballSize, ILI9341_BLACK);
  //tft.drawRGBBitmap(round(xPosNBA), round(yPosNBA), ball_black, 21, 20);

  float tmpY = yPosNBA;
  timeNBA += stepNBA;
  xPosNBA = xStart + ballSize + timeNBA*FNBA*cos(angleNBA*3.14/180)/3.0;
  yPosNBA = -20+tftHeight - ballSize - ((timeNBA*FNBA*sin(angleNBA*3.14/180.0) - 981.0*timeNBA*timeNBA/2.0));
  
  if(tmpY < yPosNBA) dyPosNBA = true;
  else dyPosNBA = false;
  
  //debug
  //Serial.print("y=");
  //Serial.print((timeNBA*FNBA*sin(angleNBA*3.14/180.0) - 981.0*timeNBA*timeNBA/2.0));
  //Serial.print(", y1=");
  //Serial.print((timeNBA*FNBA*sin(angleNBA*3.14/180.0)));
  //Serial.print(", y2=");
  //Serial.println((981*timeNBA*timeNBA/2));
  if(xPosNBA + ballSize > tftWidth) gameState = 13;
  if(xPosNBA - ballSize < 0 ) gameState = 13;
  if(yPosNBA + ballSize > tftHeight) gameState = 13;

  //             ballSize  y ^        
  //                    :    | 
  // tftHeight - ballSize    |       
  //             ballSize  x ------>  tftWidth  - ballSize
  
  //tft.fillCircle(round(xPosNBA), round(yPosNBA), ballSize, ILI9341_ORANGE);
  tft.drawRGBBitmap(round(xPosNBA)-ballSize, round(yPosNBA)-ballSize, ball3, 21, 20);
}

void drawScore(){
  // clear old score
  tft.fillRect(50,5,25,10,ILI9341_BLACK);
  // print new score
  tft.setCursor(50,5);
  tft.setTextSize(1);
  tft.setTextColor(ILI9341_WHITE);
  tft.print(playerScore);

  tft.setCursor(0,5);
  tft.print("SCORE :");
}

void drawLives(){
  // clear old lives
  tft.fillRect((tftWidth/2)+50,5,25,10,ILI9341_BLACK);
  // print new score
  tft.setCursor((tftWidth/2)+50,5);
  tft.setTextSize(1);
  tft.setTextColor(ILI9341_WHITE);
  tft.print(playerLives);

  tft.setCursor((tftWidth/2), 5);
  tft.print("LIVES :");
}

void drawLevel(){
  // clear old level
  tft.fillRect(tftWidth-25,5,25,10,ILI9341_BLACK);
  // print new score
  tft.setCursor(tftWidth-25,5);
  tft.setTextSize(1);
  tft.setTextColor(ILI9341_WHITE);
  tft.print(level);

  tft.setCursor(tftWidth - 75, 5);
  tft.print("LEVEL :");
}

// bounding box collision detection
boolean checkCollision(int x1, int y1, int width1, int height1, int x2, int y2, int width2, int height2){
  boolean hit = false;
  if (
    (((x2 + width2) >= x1) && (x2 <= (x1 + width1))) &&
    (((y2 + height2) >= y1) && (y2 <= (y1 + height1)))
    ) {
      hit = true;
    }
  
  return hit;
}

void checkHitBat(){
  // check bat and bottom half of ball

  hit = checkCollision(batX, batY, batWidth, batHeight, (int)round(xPosNBA)-ballSize, (int)round(yPosNBA)-ballSize, ballSize*2, ballSize*2);
  if (hit)
    if(!dyPosNBA) { //^ UP
      gameState = 13;
    } else { //  \/ DOWN
      if((batX + ballSize/2< (int)round(xPosNBA)) && ((batX + batWidth - ballSize/2) > (int)round(xPosNBA)) ) {gameState = 14;}
      else {gameState = 13;}
    }
}

void checkHitBlock(){
  int row, col;
  for (row=0; row<1; row++){
    for (col=0; col<1; col++){
//      if (blocks[row][col].isActive && blocks[row][col].isHit(xPos, yPos, ballSize*2, ballSize*2)){
      if (blocks[row][col].isActive && blocks[row][col].isHit(xPos, yPos-ballSize, ballSize*2, ballSize*2)){
        //blocks[row][col].removeBlock();
        yVel = -yVel;
        return;
      }
    }
  }
}

void processInput(char key) {
  switch (key) {
    case '+':
    case '-':
    case '*':
    case '/':
      break;

    case '=':
      break;

  }
  Serial.println(key);
  return;
}


unsigned long lastFrame = millis();

void loop(void) {
  static int i = 0;

  // limit frame rate
  while((millis() - lastFrame) < 20);
  lastFrame = millis();

  char key;

  switch(gameState){
    case 1: // start
      gameState = 11;
      //Serial.println("state: 1 -> 11");
      break;

    case 11: // click to play
      //tft.fillRect((tftWidth/2)-170,(tftHeight/2)-20,300,40,ILI9341_GREEN);
      //tft.setCursor((tftWidth/2)-170+30,(tftHeight/2)-20+12);
      //tft.setTextSize(2);
      //tft.setTextColor(ILI9341_WHITE);
      //tft.print("PRESS ANY KEY TO PLAY");
      gameState = 12;
      initDemo();
      //Serial.println("state: 11 -> 12");
      break;

    case 12: // wait for click to play
      moveBall_demo();
      checkHitBlock();
      key = keypad.getKey();
      if (key != NO_KEY) {
        //processInput(key);
        initGameNBA();
        gameState = 20;
        //Serial.println("state: 12 -> 20");
      };
      break;

    case 20: // wait for click to play
      key = keypad.getKey();
      if (key != NO_KEY) {
        //processInput(key);
        gameState = 2;
        //Serial.println("state: 20 -> 2");
      };
      break;

    case 13: // ring - wait for click to play again
      yPosNBA = max(ballSize+20, yPosNBA);
      tft.fillCircle(round(xPosNBA), round(yPosNBA), ballSize, ILI9341_RED);
      playerLives --;
      tft.drawFastHLine(0, topBorder-1, tftWidth, ILI9341_BLUE);
      drawScore();
      drawLevel();
      drawLives();
      gameState = 15;
      //Serial.println("state: 13 -> 15");
      if (playerLives == 0) {
        int x = 0, y = 60;
        tft.setTextColor(ILI9341_WHITE);
        tft.setTextSize(2);
        tft.setCursor(x,y-20);
        tft.print("Czaro to nie Twoja liga \nNBA!");
      }
      break;

    case 14: // OK - wait for click to play on next level
      tft.fillCircle(round(xPosNBA), round(yPosNBA), ballSize, ILI9341_GREEN);
      playerScore += level*10;
      level++;
      tft.drawFastHLine(0, topBorder-1, tftWidth, ILI9341_BLUE);
      drawScore();
      drawLevel();
      drawLives();
      gameState = 15;
      //Serial.println("state: 14 -> 15");
      break;

    case 15: // OK - wait for click to play on next level
      key = keypad.getKey();
      if (key != NO_KEY) {
        if (playerLives > 0){
          initGameNBA();
          gameState = 2; // new game
          //Serial.println("state: 15 -> 2");
        }
        else {
          gameState = 3; // end game
          //Serial.println("state: 15 -> 3");
        }
      }
      break;

    case 2: // play
      moveBall();
      checkHitBat();
      break;

    case 3: // end
      tft.fillScreen(ILI9341_BLACK);
      gameState = 11; // click to play
      break;
  }
}