TAMAGUINO

Официальная страница проекта

Код:
/* Tamaguino
  by Alojz Jakob 

 ********** TAMAGUINO ***********
   Tamagotchi clone for Arduino
 ********************************

*/

#include 
#include 
#include 
#include 

#define OLED_DC          26
#define OLED_CS          31
#define OLED_RESET       24
Adafruit_SH1106 display(OLED_DC, OLED_RESET, OLED_CS);

const int button1Pin = 2;
const int button2Pin = 12;
const int button3Pin = 13;

const int ledPin = 0;

const int sound = 15;

int button1State = 0;
int button2State = 0;
int button3State = 0;



// splash 48x26
const unsigned char splash1 [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x39, 0xc0, 0x00,
  0x00, 0x00, 0x00, 0x39, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38,
  0x00, 0x00, 0x00, 0x00, 0x07, 0xb9, 0xce, 0x78, 0x0f, 0xc0, 0x0f, 0xf9, 0xcf, 0xfc, 0x1f, 0xe0,
  0x1f, 0xf9, 0xcf, 0xfe, 0x3f, 0xf0, 0x3c, 0x79, 0xcf, 0x1e, 0x38, 0x78, 0x38, 0x39, 0xce, 0x0e,
  0x70, 0x38, 0x38, 0x39, 0xce, 0x0e, 0x70, 0x38, 0x38, 0x39, 0xce, 0x0e, 0x70, 0x38, 0x38, 0x39,
  0xce, 0x0e, 0x70, 0x38, 0x38, 0x39, 0xce, 0x0e, 0x70, 0x38, 0x3c, 0x79, 0xce, 0x0e, 0x78, 0x70,
  0x1f, 0xf9, 0xce, 0x0e, 0x3f, 0xf0, 0x0f, 0xf9, 0xce, 0x0e, 0x1f, 0xe0, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x02, 0x00, 0x10, 0x00, 0x10, 0x25, 0x37, 0x53, 0x90, 0xe1, 0xb8, 0x29, 0x22,
  0x51, 0xd0, 0x93, 0x90, 0x19, 0x22, 0x52, 0x50, 0x92, 0x10, 0x11, 0x23, 0x73, 0xd0, 0xf1, 0x98,
  0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
//splash dino 80x40
const unsigned char splash2 [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xff, 0xe0, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
  0xe1, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xfe, 0x3e, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x5e, 0xc1, 0xde, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7d, 0x80, 0x2f,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x01, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x07, 0xf4,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf5, 0xe0, 0x1f, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
  0xaa, 0xbc, 0x7f, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x55, 0x5f, 0xff, 0xa0, 0x00, 0x00,
  0x00, 0x00, 0x00, 0xea, 0xaa, 0xaf, 0xff, 0x40, 0x00, 0x00, 0x00, 0x00, 0x03, 0xd5, 0x55, 0xff,
  0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x07, 0xab, 0xae, 0xbf, 0xfd, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x1f, 0x5f, 0xdf, 0xff, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0xee, 0xfb, 0x6f, 0xf4, 0x00,
  0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff, 0xf7,
  0xff, 0xff, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x00, 0x00, 0x00,
  0x00, 0x1f, 0xff, 0xff, 0xff, 0xfd, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xdf, 0xff, 0xfe, 0xfe,
  0x80, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xef, 0xef, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff,
  0x9f, 0xdf, 0xff, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x1f, 0xa1, 0xfc, 0x7f, 0x80, 0x00,
  0x0f, 0xff, 0xff, 0xe0, 0x1f, 0xb0, 0x03, 0xbf, 0x80, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x0f, 0xc0,
  0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};


// front grass 32x10
const unsigned char grass_front [] PROGMEM = {
  0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x08, 0x89, 0xc0, 0x48, 0x5c, 0x50, 0x84,
  0x9c, 0x48, 0x50, 0x22, 0x88, 0x80, 0x44, 0x22, 0x40, 0x84, 0x2e, 0x21, 0x49, 0x24, 0xa4, 0xb1,
};
//grass 2 (dino walking on) 4x8
const unsigned char grass [] PROGMEM = {
  0xff, 0xee, 0xbb, 0x55, 0xaa, 0x11,
};

//trees
const unsigned char trees [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x10, 0x05, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x15, 0x00,
  0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x55, 0x40, 0x00, 0x55, 0x40, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x15, 0x04, 0x40, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x02, 0xa0, 0x00, 0x00, 0x01, 0x10, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
  0x00, 0x28, 0x84, 0x24, 0x40, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x82, 0x00,
  0x00, 0x01, 0x10, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x20, 0x00, 0x00, 0x00,
  0x41, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x00, 0x88, 0x82, 0x40, 0x91, 0x04, 0x24,
  0x41, 0x10, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x44, 0x44, 0x11, 0x04, 0x10, 0x11, 0x04, 0x01, 0x00, 0x00,
  0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
  0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x02, 0x10, 0x00, 0x80, 0x00, 0x00, 0x08, 0x00, 0x04,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x20, 0x00, 0x01, 0x00,
  0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
};

const unsigned char mountains [] PROGMEM = {
  0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
  0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e,
  0x01, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f,
  0x03, 0xf8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f,
  0x07, 0x74, 0x07, 0x80, 0x10, 0x00, 0x00, 0x80, 0x00, 0x06, 0x80, 0x00, 0x00, 0x00, 0x00, 0xd5,
  0x0e, 0xc2, 0x0d, 0xc0, 0x28, 0x01, 0x01, 0xc1, 0x00, 0x1f, 0x40, 0x00, 0x00, 0x00, 0x01, 0x28,
  0x1d, 0x13, 0x1b, 0x60, 0x54, 0x03, 0x83, 0xa3, 0x80, 0x36, 0x20, 0x00, 0x00, 0x00, 0x06, 0xd0,
  0x3a, 0x41, 0xb4, 0x30, 0xe2, 0xcc, 0xf7, 0x57, 0xc0, 0xd8, 0x10, 0x00, 0x00, 0x00, 0x19, 0x20,
  0x68, 0x84, 0x49, 0x19, 0xa1, 0x36, 0x5d, 0x2a, 0xa1, 0xa0, 0x10, 0x00, 0x00, 0x00, 0xe6, 0x40,
  0xd2, 0x10, 0xa4, 0x0c, 0x80, 0x8c, 0x1a, 0x15, 0x57, 0x40, 0x88, 0x00, 0x00, 0x1f, 0x38, 0x80,
  0x49, 0x08, 0x00, 0x06, 0x02, 0xc0, 0x24, 0x18, 0x0b, 0x80, 0x05, 0x0b, 0x8c, 0xe0, 0x23, 0x00,
  0xa0, 0x20, 0x00, 0x11, 0x00, 0x00, 0x48, 0x84, 0x84, 0x02, 0x20, 0x5d, 0xf3, 0x00, 0xcd, 0xc0,
  0x50, 0x00, 0x04, 0x04, 0x01, 0x44, 0x00, 0x00, 0x08, 0x00, 0x00, 0x30, 0x04, 0x07, 0x10, 0x20,
  0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x40, 0x40, 0x00, 0x10,
  0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x01, 0x11, 0x01, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x20, 0x02,
};


const unsigned char cloud2 [] PROGMEM = {
  0x04, 0x70, 0x18, 0x00, 0x6e, 0xfb, 0x7c, 0xee, 0xff, 0xff, 0xfd, 0xff, 0x6f, 0xfb, 0x38, 0xee,
  0x07, 0x70, 0x52, 0x00,
};



// walking sprites
// walk right
const unsigned char dinoWalk0 [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x60, 0x00,
  0x00, 0x00, 0x1f, 0xf1, 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xb8, 0x00, 0x00, 0x00, 0x7b, 0xff,
  0xfc, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd8, 0x00, 0x00, 0x03, 0xff, 0x7f, 0xe0, 0x00, 0x00, 0x0f,
  0xf7, 0xde, 0x00, 0x00, 0x00, 0x7f, 0xf8, 0x3c, 0x00, 0x00, 0x00, 0x00, 0xbc, 0x7a, 0x00, 0x00,
};
const unsigned char dinoWalk1 [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x60, 0x00,
  0x00, 0x00, 0x1f, 0xf1, 0xf0, 0x00, 0x00, 0x00, 0x37, 0xff, 0xb8, 0x00, 0x00, 0x00, 0x7f, 0xff,
  0xfc, 0x00, 0x00, 0x00, 0xff, 0x7f, 0xd8, 0x00, 0x00, 0x03, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x0f,
  0xbf, 0xda, 0x00, 0x00, 0x00, 0x7f, 0xf8, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, 0x00, 0x00,
};
const unsigned char dinoWalk2 [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x60, 0x00,
  0x00, 0x00, 0x1b, 0xf1, 0xf0, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xb8, 0x00, 0x00, 0x00, 0x7f, 0x7f,
  0xfc, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd8, 0x00, 0x00, 0x03, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x0f,
  0xbf, 0xfa, 0x00, 0x00, 0x00, 0x7f, 0x78, 0x3c, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x5e, 0x00, 0x00,
};
// walk left
const unsigned char dinoWalk3 [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0xe0, 0x00, 0x00,
  0x00, 0x0f, 0x8f, 0xf8, 0x00, 0x00, 0x00, 0x1d, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xde,
  0x00, 0x00, 0x00, 0x1b, 0xff, 0xff, 0x00, 0x00, 0x00, 0x07, 0xfe, 0xff, 0xc0, 0x00, 0x00, 0x00,
  0x7b, 0xef, 0xf0, 0x00, 0x00, 0x00, 0x3c, 0x1f, 0xfe, 0x00, 0x00, 0x00, 0x5e, 0x3d, 0x00, 0x00,
};
const unsigned char dinoWalk4 [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0xe0, 0x00, 0x00,
  0x00, 0x0f, 0x8f, 0xf8, 0x00, 0x00, 0x00, 0x1d, 0xff, 0xec, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xfe,
  0x00, 0x00, 0x00, 0x1b, 0xfe, 0xff, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00,
  0x5b, 0xfd, 0xf0, 0x00, 0x00, 0x00, 0x3c, 0x1f, 0xfe, 0x00, 0x00, 0x00, 0x18, 0x0c, 0x00, 0x00,
};
const unsigned char dinoWalk5 [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x03, 0xe0, 0x00, 0x00,
  0x00, 0x0f, 0x8f, 0xd8, 0x00, 0x00, 0x00, 0x1d, 0xff, 0xfc, 0x00, 0x00, 0x00, 0x3f, 0xfe, 0xfe,
  0x00, 0x00, 0x00, 0x1b, 0xff, 0xff, 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xc0, 0x00, 0x00, 0x00,
  0x5f, 0xfd, 0xf0, 0x00, 0x00, 0x00, 0x3c, 0x1e, 0xfe, 0x00, 0x00, 0x00, 0x7a, 0x2f, 0x00, 0x00,
};


/* --------- GAME SPRITES ---------- */
const unsigned char dinoJump [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x60, 0x00,
  0x00, 0x00, 0x1f, 0xf1, 0xf0, 0x00, 0x00, 0x00, 0x3b, 0xff, 0xb8, 0x00, 0x00, 0x00, 0x7f, 0xdf,
  0xfc, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd8, 0x00, 0x00, 0x03, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x0f,
  0xff, 0xfe, 0x00, 0x00, 0x00, 0x7d, 0xf8, 0x1f, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x07, 0x80, 0x00,

};

const unsigned char obstacle1 [] PROGMEM = {
  0x00, 0x00, 0x1e, 0x00, 0x2f, 0x00, 0x5e, 0x80, 0x5f, 0xc0, 0xb7, 0xc0,
};

const unsigned char obstacle2 [] PROGMEM = {
  0x14, 0x00, 0x08, 0x00, 0x52, 0x00, 0x34, 0x00, 0x69, 0x40, 0xf0, 0x80,
};

const unsigned char poop [] PROGMEM = {
  0x80, 0x88, 0x01, 0x81, 0x02, 0xe0, 0x27, 0x10, 0x0b, 0xf0, 0x1c, 0x08,
};


#define WALKSIZE 6
//const unsigned char* const dinoWalk[WALKSIZE] PROGMEM = {
const unsigned char* dinoWalk[WALKSIZE] = {
  //dinoWalk0,dinoWalk0,dinoWalk1,dinoWalk1,dinoWalk2,dinoWalk2,
  //dinoWalk3,dinoWalk3,dinoWalk4,dinoWalk4,dinoWalk5,dinoWalk5
  dinoWalk0, dinoWalk1, dinoWalk2,
  dinoWalk3, dinoWalk4, dinoWalk5
};
int walkPos = 0;
int walkXPos = 0;
bool walkAnimReverse = false;
bool walkRight = false;
int walkDirOffset = 2;



// EATING

const unsigned char eating1 [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff,
  0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x00, 0x00, 0x00,
  0x7f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x01, 0xff, 0xff, 0xfc, 0x00,
  0x00, 0x03, 0x7c, 0x7f, 0xfe, 0x00, 0x00, 0x02, 0xf9, 0xff, 0xfe, 0x00, 0x00, 0x0c, 0xf3, 0xff,
  0xff, 0x00, 0x00, 0x1f, 0xf4, 0x7f, 0xff, 0x80, 0x00, 0x7f, 0xf0, 0x7f, 0xff, 0xc0, 0x00, 0xff,
  0xf8, 0xff, 0xff, 0xc0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xe0,
  0x1f, 0xe7, 0xff, 0xe0, 0xff, 0xe0, 0x3f, 0xdf, 0xff, 0xde, 0xff, 0xf0, 0x7f, 0xbf, 0xff, 0xbf,
  0x7f, 0xf0, 0x7f, 0x7f, 0xfe, 0x77, 0xbf, 0xf8, 0x7f, 0x7f, 0xf9, 0xf7, 0xbf, 0xfc, 0x3f, 0xff,
  0xe7, 0xef, 0xbf, 0xfe, 0x5f, 0xfe, 0x1f, 0x1f, 0xbf, 0xff, 0x67, 0xf1, 0xf9, 0x1f, 0xbf, 0xff,
  0x38, 0x0f, 0xe8, 0x3f, 0xbf, 0xff, 0x1f, 0xff, 0xe0, 0x3f, 0xbf, 0xff, 0x0e, 0xfe, 0x40, 0xbf,
  0x6f, 0xff, 0x04, 0x54, 0x00, 0xff, 0x57, 0xff, 0x00, 0x10, 0x01, 0xfe, 0xab, 0xff, 0x00, 0x18,
  0x01, 0xfd, 0x55, 0xff, 0x00, 0x18, 0x05, 0xfa, 0xaa, 0xff, 0x00, 0x1d, 0x27, 0xf1, 0x55, 0x5f,
  0x00, 0x0f, 0x7f, 0xe0, 0xaa, 0xaf, 0x00, 0x07, 0xff, 0x80, 0x55, 0x57, 0x00, 0x03, 0xfe, 0x00,
  0x2a, 0xab, 0x00, 0x01, 0xf0, 0x00, 0x15, 0x55, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xaa, 0x00, 0x00,
  0x00, 0x00, 0x05, 0x55, 0x00, 0x00, 0x00, 0x00, 0x02, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x01, 0x55,

};
const unsigned char eating2 [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff,
  0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x00, 0x00, 0x00,
  0x7f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x01, 0xff, 0xff, 0xfc, 0x00,
  0x00, 0x03, 0x7c, 0x7f, 0xfe, 0x00, 0x00, 0x02, 0xf9, 0xff, 0xfe, 0x00, 0x00, 0x0c, 0xf3, 0xff,
  0xff, 0x00, 0x00, 0x1f, 0xf4, 0x7f, 0xff, 0x80, 0x00, 0x7f, 0xf0, 0x7f, 0xff, 0xc0, 0x00, 0xff,
  0xf8, 0xff, 0xff, 0xc0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xe0,
  0x1f, 0xe7, 0xff, 0xe0, 0xff, 0xe0, 0x3f, 0xdf, 0xff, 0xde, 0xff, 0xf0, 0x7f, 0xbf, 0xff, 0xbf,
  0x7f, 0xf0, 0x7f, 0x7f, 0xfe, 0x77, 0xbf, 0xf8, 0x7f, 0x7f, 0xf9, 0xf7, 0xbf, 0xfc, 0x3f, 0xff,
  0xe7, 0xef, 0xbf, 0xfe, 0x5f, 0xfe, 0x1f, 0x1f, 0xbf, 0xff, 0x67, 0xf1, 0xf9, 0x1f, 0xbf, 0xff,
  0x38, 0x0f, 0xe8, 0x3f, 0xbf, 0xff, 0x1f, 0xff, 0xe1, 0x7f, 0x3f, 0xff, 0x0e, 0xfe, 0x41, 0xfe,
  0xef, 0xff, 0x04, 0xd4, 0x0b, 0xfd, 0x57, 0xff, 0x00, 0xd4, 0x0f, 0xfa, 0xab, 0xff, 0x00, 0x60,
  0x9f, 0xf5, 0x55, 0xff, 0x00, 0x75, 0xff, 0xca, 0xaa, 0xff, 0x00, 0x3f, 0xff, 0x05, 0x55, 0x5f,
  0x00, 0x1f, 0xfc, 0x02, 0xaa, 0xaf, 0x00, 0x07, 0xc0, 0x01, 0x55, 0x57, 0x00, 0x00, 0x00, 0x00,
  0xaa, 0xab, 0x00, 0x00, 0x00, 0x00, 0x15, 0x55, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xaa, 0x00, 0x00,
  0x00, 0x00, 0x05, 0x55, 0x00, 0x00, 0x00, 0x00, 0x02, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x01, 0x55,

};
const unsigned char eating3 [] PROGMEM = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff,
  0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x3f, 0xff, 0xe0, 0x00, 0x00, 0x00,
  0x7f, 0xff, 0xf0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x01, 0xff, 0xff, 0xfc, 0x00,
  0x00, 0x03, 0x7c, 0x7f, 0xfe, 0x00, 0x00, 0x02, 0xf9, 0xff, 0xfe, 0x00, 0x00, 0x0c, 0xf3, 0xff,
  0xff, 0x00, 0x00, 0x1f, 0xf4, 0x7f, 0xff, 0x80, 0x00, 0x7f, 0xf0, 0x7f, 0xff, 0xc0, 0x00, 0xff,
  0xf8, 0xff, 0xff, 0xc0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xe0,
  0x1f, 0xe7, 0xff, 0xe0, 0xff, 0xe0, 0x3f, 0xdf, 0xff, 0xde, 0xff, 0xf0, 0x7f, 0xbf, 0xff, 0xbf,
  0x7f, 0xf0, 0x7f, 0x7f, 0xfe, 0x77, 0xbf, 0xf8, 0x7f, 0x7f, 0xf9, 0xf7, 0xbf, 0xfc, 0x3f, 0xff,
  0xe7, 0xef, 0xbf, 0xfe, 0x5f, 0xfe, 0x1f, 0xdf, 0xbf, 0xff, 0x67, 0xf1, 0xff, 0x3f, 0xbf, 0xff,
  0x38, 0x0f, 0xfc, 0xff, 0xbf, 0xff, 0x1f, 0xff, 0xf3, 0xff, 0x3f, 0xff, 0x0f, 0xff, 0xcf, 0xfe,
  0xef, 0xff, 0x00, 0x38, 0x3f, 0xf9, 0x57, 0xff, 0x07, 0x83, 0xff, 0xea, 0xab, 0xff, 0x01, 0xff,
  0xfe, 0x15, 0x55, 0xff, 0x00, 0xff, 0xf0, 0x0a, 0xaa, 0xff, 0x00, 0x3f, 0xc0, 0x05, 0x55, 0x5f,
  0x00, 0x00, 0x00, 0x02, 0xaa, 0xaf, 0x00, 0x00, 0x00, 0x05, 0x55, 0x57, 0x00, 0x00, 0x00, 0x02,
  0xaa, 0xab, 0x00, 0x00, 0x00, 0x01, 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa, 0x00, 0x00,
  0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xaa, 0x00, 0x00, 0x00, 0x00, 0x01, 0x55,

};


const unsigned char* eating[4] = {
  eating1, eating2, eating3, eating2
};

//const unsigned char apple0 [] PROGMEM = {
const unsigned char apple [] PROGMEM = {
  0x00, 0x01, 0xf0, 0x00, 0x07, 0xe0, 0x00, 0x0f, 0xe0, 0x3f, 0x1f, 0xc0, 0x00, 0xdf, 0x80, 0x00,
  0x20, 0x00, 0x0f, 0xd7, 0xf0, 0x3f, 0xff, 0xfc, 0x7f, 0xff, 0xfe, 0x78, 0xff, 0xfe, 0xf0, 0x7f,
  0xff, 0xe0, 0x7f, 0xff, 0xe0, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xfe, 0x7f, 0xff, 0xfe, 0x3f, 0xff, 0xfc, 0x1f,
  0xff, 0xf8, 0x0f, 0xff, 0xf0, 0x07, 0xc3, 0xe0,
};


const unsigned char steak [] PROGMEM = {
  0x0f, 0xe0, 0x00, 0x3f, 0xf8, 0x00, 0x31, 0xfe, 0x00, 0x6e, 0x7f, 0x00, 0xd1, 0x7f, 0x80, 0xa0,
  0xbf, 0x80, 0xa0, 0xbf, 0xc0, 0xa0, 0xbf, 0xc0, 0xd1, 0x3f, 0xc0, 0xae, 0xff, 0xe0, 0xd1, 0xff,
  0xe0, 0xef, 0xff, 0xe0, 0x77, 0xff, 0xf0, 0x7b, 0xff, 0xd0, 0x3d, 0xff, 0x78, 0x1e, 0xf9, 0xfe,
  0x0f, 0x67, 0xff, 0x07, 0x7f, 0xff, 0x03, 0x9f, 0xfc, 0x03, 0xc3, 0xf9, 0x01, 0xf8, 0xc3, 0x00,
  0xff, 0x1e, 0x00, 0x1f, 0xfe, 0x00, 0x01, 0xfc,
};



//ground
int grassXPos = 0;
float treesXPos = -20;
//sky
float couldsXPos = 0;
const int sunRadius = 3;
bool sunOrMoon = false;
const int moonShadow = 2;
float sunXPos = -2 * sunRadius;
//clouds
const int cloud1Width = 32;
float cloud1XPos = display.width() + cloud1Width;


int stars [6][2];




// menus
bool menuOpened = false;
int menu = 0;
int subMenu = 1;
bool menuDepth = false;
bool justOpened = false;
#define MENUSIZE 8
#define STRING_SIZE 11

const char mainMenu[MENUSIZE][8][STRING_SIZE] PROGMEM = {
  {"food", "apple", "steak", "water", NULL},
  {"game", NULL},
  {"sleep", NULL},
  {"clean", NULL},
  {"doctor", NULL},
  {"discipline", NULL},
  {"stats", "hunger", "happiness", "health", "discipline", "weight", "age", NULL},
  { "settings", "sound",
    //"something",
    NULL
  },
};

/* ------- PET STATS ------- */

float hunger = 100;
float happiness = 100;
float health = 100;
float discipline = 100;
float weight = 1;
float age = 0;

//settings
bool soundEnabled = true;

int action = 0;
int setting = 0;

bool notification = false;
int notificationBlink = 0;
bool dead = false;

bool sleeping = false;

//game
bool game = false;
bool paused = false;
bool gameOver = false;
int score = 0;
int hiScore = 0;
int level = 0;
bool newHiScore = false;
bool jumping = false;
bool jumpUp = true;
int jumpPos = 0;
bool obstacle1show = false;
bool obstacle2show = false;
int obstacle1XPos = 0;
int obstacle2XPos = 0;


float poopometer = 0;
int poops [3] = {
  0, 0, 0,
};

#define ACTIVATED HIGH

void setup() {
  pinMode(button1Pin, INPUT);
  pinMode(button2Pin, INPUT);
  pinMode(button3Pin, INPUT);

  //digitalWrite(button1Pin, HIGH);
  //digitalWrite(button2Pin, HIGH);
  //digitalWrite(button3Pin, HIGH);
  // or just
  // pinMode(button1Pin, INPUT_PULLUP)
  // etc

  pinMode(sound, OUTPUT);

  pinMode(ledPin, OUTPUT);

  randomSeed(analogRead(0));

  display.begin(SH1106_SWITCHCAPVCC);
  display.clearDisplay();

  // splash
  display.setTextColor(WHITE);
  //display.println(F("jakobdesign presents"));
  display.print(F(" jakobdesign presents"));
  display.drawBitmap(15, 24, splash1 , 48, 26, WHITE);
  display.drawBitmap(48, 24, splash2 , 80, 40, WHITE);
  display.display();

  //splash tone

  tone(sound, 500, 200);
  delay(200);
  tone(sound, 1000, 200);
  delay(400);
  tone(sound, 700, 200);
  delay(200);
  tone(sound, 1100, 200);

  delay(2200);
  // end splash


  display.clearDisplay();

}



void loop() {

  button1State = digitalRead(button1Pin);
  button2State = digitalRead(button2Pin);
  button3State = digitalRead(button3Pin);

  //char* str = "";

  if (!dead) {
    /* -------- MODIFY PET STATS -------- */
    // TODO: different gradients regarding to age
    if (sleeping) {
      hunger -= 0.00005;
      poopometer += 0.00005;
      if (happiness - 0.0001 > 0) {
        happiness -= 0.0001;
      }
      health -= 0.00005 + countPoops() * 0.0001;
      if (discipline - 0.0001 > 0) {
        discipline -= 0.0001;
      }
    } else {
      hunger -= 0.00025;
      poopometer += 0.00025;
      if (happiness - 0.0002 > 0) {
        happiness -= 0.0002;
      }
      health -= 0.0001 + countPoops() * 0.0001;
      if (discipline - 0.0002 > 0) {
        discipline -= 0.0002;
      }
      //discipline-=0.02;
    }
    age += 0.0000025;

    //diarrhea :) for testing
    //poopometer+=0.005;

    //health-=1;
    //health-=countPoops()*0.0001;
    //health-=countPoops()*0.05;

    if (poopometer >= 10) {
      poopometer = countPoops();
      poops[round(poopometer)] = random(20, display.width() + 32);
      if (soundEnabled) {
        tone(sound, 200, 50);
      }
      poopometer = 0;
    }

    if ((hunger > 19.99975 && hunger < 20.00025) || (happiness > 19.9998 && happiness < 20.0002) || (health > 19.9999 && health < 20.0001) && soundEnabled) {
      if (soundEnabled) {
        tone(sound, 200, 50);
      }
    }


    if (hunger <= 20 || countPoops() > 0 || happiness <= 20 || health <= 20) {
      notification = true;
    }
    if (hunger > 20 && countPoops() == 0 && happiness > 20 && health > 20) {
      notification = false;
      digitalWrite(ledPin, LOW);
    }

    if (hunger <= 0 || health <= 0 || happiness <= 0) {
      dead = true;
      if (soundEnabled) {
        tone(sound, 500, 500);
        delay(550);
        tone(sound, 400, 500);
        delay(550);
        tone(sound, 300, 600);
      }
    }


    display.clearDisplay();
    display.setCursor(0, 0);


    /* ------- BUTTON PRESS ACTIONS ------- */

    /* ------- BUTTON 1 - MENU ------- */
    if (button1State == ACTIVATED) {

      // JUMP IN GAME
      if (game) {

        if (!jumping && !paused) {
          if (soundEnabled) {
            tone(sound, 200, 50);
          }
          jumping = true;
        }

      } else {
        // MENU

        if (soundEnabled) {
          tone(sound, 300, 80);
        }

        if (!menuOpened) {
          menuOpened = true;
        } else {
          if (menuDepth) {

            if ((const char*)pgm_read_word(&(mainMenu[menu][subMenu + 1])) == NULL) {
              subMenu = 1;
            } else {
              ++subMenu;
            }
            setting = 100 * (menu + 1) + subMenu;
          } else {
            if (menu == MENUSIZE - 1) {
              menu = 0;
            } else {
              ++menu;
            }

            if ((const char*)pgm_read_word(&(mainMenu[menu][1])) != NULL) {
              subMenu = 1;

              justOpened = true;
            }
            setting = 100 * (menu + 1) + subMenu;
          }
        }

        delay(60);

      }

    }
    /* ------- BUTTON 2 - SELECT ------- */
    if (button2State == ACTIVATED) {

      if (game) {
        if (!gameOver) {
          paused = !paused;
          if (soundEnabled) {
            tone(sound, 600, 80);
          }
          delay(60);
        }

      } else {

        if (soundEnabled) {
          tone(sound, 600, 80);
        }

        if (menuOpened) {

          if (subMenu != 1 && (const char*)pgm_read_word(&(mainMenu[menu][1][0])) != NULL) {
            action = 100 * (menu + 1) + subMenu;
          }
          if (subMenu == 1 && (const char*)pgm_read_word(&(mainMenu[menu][1][0])) == NULL) {
            action = 100 * (menu + 1) + subMenu;
          }
          if (subMenu == 1 && (const char*)pgm_read_word(&(mainMenu[menu][1][0])) != NULL && menuDepth) {
            action = 100 * (menu + 1) + subMenu;
          }
          if ((const char*)pgm_read_word(&(mainMenu[menu][1][0])) != NULL) {
            setting = 100 * (menu + 1) + subMenu;
            menuDepth = true;
          }

        } else {
          action = NULL;

          menuOpened = true;
          menuDepth = true;
          subMenu = 1;
          menu = 6;
          action = 701;
          setting = 701;
        }
        justOpened = false;

        delay(60);

      }

    }
    /* ------- BUTTON 3 - BACK ------- */
    if (button3State == ACTIVATED) {
      if (soundEnabled) {
        tone(sound, 1000, 80);
      }

      if (game || gameOver) {
        walkPos = 0;
        walkXPos = 0;
        walkAnimReverse = false;
        walkRight = true;
        walkDirOffset = 0;
        treesXPos = -20;
        grassXPos = 0;
        obstacle1show = false;
        obstacle2show = false;
        jumping = false;
        jumpPos = 0;
        jumpUp = true;
        game = false;
        score = 0;
        newHiScore = false;
        gameOver = false;
        level = 0;
        paused = false;
      } else {
        if (!menuDepth) {
          menuOpened = false;
          menu = 0;
          setting = 0;
        } else {
          menuDepth = false;
          setting = 100 * (menu + 1) + 1;
        }
        action = NULL;
        subMenu = 1;
      }


      delay(60);
    }



    /* ------- SCENERY AND WALKING ------- */

    //draw sun
    sunXPos += 0.1;
    if (sunXPos > display.width() + 2 * sunRadius) {
      sunXPos = -2 * sunRadius;
      sunOrMoon = !sunOrMoon;
    }
    if (sleeping) {
      sunOrMoon = true;
    }

    if (sleeping) {
      sunOrMoon = true;
    }

    if (!sunOrMoon) {
      display.fillCircle(sunXPos, 2 * sunRadius, sunRadius, WHITE);
    } else {
      display.fillCircle(sunXPos, 2 * sunRadius, sunRadius, WHITE);
      display.fillCircle(sunXPos - moonShadow, 2 * sunRadius, sunRadius, BLACK);
      //if(walkPos == 5){
      if (round(cloud1XPos) % 5 == 0) {
        for (int i = 0; i < 6; i++) {
          stars[i][0] = random(0, display.width());
          stars[i][1] = random(0, 10);
        }
      } else {
        for (int i = 0; i < 6; i++) {

          display.drawPixel(stars[i][0], stars[i][1], WHITE);
        }
      }
    }

    //cloud 1
    cloud1XPos -= 0.3;
    if (cloud1XPos < -cloud1Width) {
      cloud1XPos = display.width() + cloud1Width;
    }
    display.drawBitmap(cloud1XPos, 5, cloud2 , cloud1Width, 5, WHITE);


    //mountains
    display.drawBitmap(0, 7, mountains , 128, 16, WHITE);

    //walk and move ground perspective

    if (game) {


      /* ------ GAME -----*/
      level = round(score / 10);

      if (jumping && !gameOver && !paused) {
        if (jumpUp) {
          jumpPos = jumpPos + 1 + level;
          if (jumpPos >= 12) {
            jumpUp = false;
          }
        } else {
          //jumpPos--;
          jumpPos = jumpPos - 1 - level;
          if (jumpPos <= 0) {
            jumpUp = true;
            jumping = false;
            if (soundEnabled) {
              tone(sound, 100, 50);
            }
            score += 1;
          }
        }
      }


      if (!gameOver && !paused) {
        if (walkAnimReverse) {
          walkPos -= 1;
          if (walkPos == -1) {
            walkPos = 0;
            walkAnimReverse = false;
          }
        } else {
          walkPos += 1;
          if (walkPos == 3) {
            walkPos = 2;
            walkAnimReverse = true;
          }
        }



        walkXPos += 2;
        grassXPos += 4;
        treesXPos = treesXPos + 1 + level;
        obstacle1XPos = obstacle1XPos + 2 + level;
        obstacle2XPos = obstacle2XPos + 2 + level;


        if (!jumping &&
            (
              (obstacle1show && display.width() - obstacle1XPos >= 20 && display.width() - obstacle1XPos <= 46)
              ||
              (obstacle2show && display.width() - obstacle2XPos >= 20 && display.width() - obstacle2XPos <= 46)
            )
           ) {
          gameOver = true;
          jumping = true;
          jumpPos = -2;
          if (soundEnabled) {
            tone(sound, 500, 40);
            delay(50);
            tone(sound, 350, 40);
            delay(50);
            tone(sound, 200, 60);
          }

          if (score > hiScore) {
            hiScore = score;
            newHiScore = true;
          }
          if (happiness + 15 < 100) {
            happiness += 15;
          } else {
            happiness = 100;
          }
          health -= 1;
          if (weight - score * 0.0025 > 5) {
            weight -= score * 0.0025;
          }


        }
      }

      if (walkXPos == display.width()) {
        walkXPos = 0;
      }
      if (grassXPos == display.width()) {
        grassXPos = 0;
      }
      if (treesXPos == display.width()) {
        treesXPos = -128;
      }

      if (jumping) {
        display.drawBitmap(10, 26 - jumpPos, dinoJump , 48, 24, WHITE);
      } else {
        display.drawBitmap(10, 26, dinoWalk[walkPos] , 48, 24, WHITE);
      }

      for (int i = 0; i < display.width() / 4 + 1; i++) {
        display.drawBitmap(-walkXPos + i * 8, 50, grass , 8, 6, WHITE);
      }


      // obstacles 1

      if (obstacle1XPos - 16 >= display.width()) {
        obstacle1XPos = 0;
        obstacle1show = false;
      }
      if (!obstacle1show && random(1, 10) == 1 && obstacle2XPos > 40) {
        obstacle1show = true;
        obstacle1XPos = 0;
      }
      if (obstacle1show) {
        display.drawBitmap(display.width() - obstacle1XPos, 44, obstacle1 , 16, 6, WHITE);
      }

      // obstacles 2
      if (obstacle2XPos - 16 >= display.width()) {
        obstacle2XPos = 0;
        obstacle2show = false;
      }
      if (!obstacle2show && random(1, 10) == 1 && obstacle1XPos > 40) {
        obstacle2show = true;
        obstacle2XPos = 0;
      }

      if (obstacle2show) {
        display.drawBitmap(display.width() - obstacle2XPos, 44, obstacle2 , 16, 6, WHITE);
      }




      //draw front grass
      for (int i = 0; i < display.width() / 16 + 1; i++) {
        display.drawBitmap(-grassXPos + i * 32, 60, grass_front , 32, 8, WHITE);
      }
      //draw trees
      display.drawBitmap(-treesXPos, 23, trees , 112, 20, WHITE);

      if (!gameOver) {
        display.setCursor(0, 56);
        display.setTextColor(WHITE);
        display.print(F("lvl: "));
        display.print(level);
        display.setCursor(64, 56);
        display.setTextColor(WHITE);
        display.print(F("pts: "));
        display.print(score);
      }

      if (paused && round(cloud1XPos) % 2 == 0) {
        display.fillRect(24, 11, 80, 15, BLACK);
        display.fillRect(25, 12, 78, 13, WHITE);
        display.setCursor(47, 15);
        display.setTextColor(BLACK);
        display.println(F("PAUSED"));
      }

      /* ---------- END GAME ----------*/

    } else {

      /* ------ NO GAME -----*/
      if (!sleeping) {
        display.drawBitmap(walkXPos, 26, dinoWalk[walkPos + walkDirOffset] , 48, 24, WHITE);
      } else {
        display.drawBitmap(walkXPos, 29, dinoWalk[walkPos + walkDirOffset] , 48, 24, WHITE);
        if (walkRight) {
          if (round(cloud1XPos) % 3 == 0) {
            display.setCursor(walkXPos + 48, 36);
            display.print(F("Z"));
          } else {
            display.setCursor(walkXPos + 46, 38);
            display.print(F("z"));
          }
        } else {
          if (round(cloud1XPos) % 3 == 0) {
            display.setCursor(walkXPos - 4, 36);
            display.print(F("Z"));
          } else {
            display.setCursor(walkXPos - 2, 38);
            display.print(F("z"));
          }
        }
      }
      if (walkRight) {
        if (!sleeping) {
          walkXPos += 1;
          grassXPos += 2;
          treesXPos += 0.5;
        }
        if (walkXPos > 80) {
          walkRight = false;
          walkDirOffset = 3;
        }
      } else {
        if (!sleeping) {
          walkXPos -= 1;
          grassXPos -= 2;
          treesXPos -= 0.5;
        }
        if (walkXPos < 0) {
          walkRight = true;
          walkDirOffset = 0;
        }
      }

      //draw grass (ground)
      for (int i = 0; i < 2 * display.width() / 4; i++) {
        display.drawBitmap(-walkXPos + i * 8, 50, grass , 8, 6, WHITE);
      }
      // draw poops
      for (int i = 0; i < 3; i++) {
        if (poops[i] > 0) {
          display.drawBitmap(-walkXPos + poops[i], 44, poop , 16, 6, WHITE);
        }
      }
      //draw front grass
      for (int i = 0; i < 2 * display.width() / 16; i++) {
        display.drawBitmap(-grassXPos + i * 32, 56, grass_front , 32, 8, WHITE);
      }
      //draw trees
      display.drawBitmap(-treesXPos, 23, trees , 112, 20, WHITE);



      if (!sleeping) {
        if (walkAnimReverse) {
          --walkPos;
          if (walkPos == -1) {
            walkPos = 0;
            walkAnimReverse = false;
          }
        } else {
          ++walkPos;
          if (walkPos == 3) {
            walkPos = 2;
            walkAnimReverse = true;
          }
        }
      }

    }


    /* ------- MENUS AND ACTIONS ------- */
    //render menu
    if (menuOpened and !game) {
      display.fillRect(0, 0, display.width(), 30, BLACK);
      display.drawRect(0, 0, display.width(), 29, WHITE);
      display.fillRect(1, 1, display.width() - 2, 27, BLACK);
      display.drawRect(0, 0, display.width(), 12, WHITE);
      display.setCursor(8, 2);
      display.setTextSize(1);
      if (menuDepth) {
        display.fillRect(0, 0, display.width(), 12, WHITE);
        display.fillRect(1, 18, 1, 5, WHITE);
        display.fillRect(2, 19, 1, 3, WHITE);
        display.fillRect(3, 20, 1, 1, WHITE);
        display.setTextColor(BLACK, WHITE);
      } else {
        display.fillRect(1, 3, 1, 5, WHITE);
        display.fillRect(2, 4, 1, 3, WHITE);
        display.fillRect(3, 5, 1, 1, WHITE);
        display.setTextColor(WHITE);
      }
      char oneItem [STRING_SIZE];
      memcpy_P (&oneItem, &mainMenu[menu][0], sizeof oneItem);
      //display.println(getItem(menu,0));
      display.println(oneItem);
      if (subMenu) {
        display.setTextColor(WHITE);
        display.setCursor(8, 16);
        char subItem [STRING_SIZE];
        memcpy_P (&subItem, &mainMenu[menu][subMenu], sizeof subItem);
        //display.println(getItem(menu,subMenu));
        display.println(subItem);
      }
    }

    //do actions

    if (action > 0) {


      if ((action == 101 || action == 102 || action == 103) && !sleeping && random(1, (11 - round(discipline / 10))) == 1 ) {
        //95-100 discipline = 100% chance to feed
        //85-95 discipline = 50% chance
        //75-85 discipline = 33.33% chance
        //65-75 discipline = 25% chance
        //55-65 discipline = 20% chance
        //45-55 discipline = 16.67% chance
        //35-45 discipline = 14.28% chance
        //25-35 discipline = 12.5% chance
        //15-25 discipline = 12.5% chance
        //5-15 discipline = 10% chance
        //0-5 discipline = 9% chance

        //animate eating

        display.fillRect(0, 0, display.width(), display.height(), BLACK);
        for (int j = 0; j < 3; j++) {
          for (int i = 0; i < 4; i++) {
            display.clearDisplay();
            switch (action) {
              case 101:
                //apple
                display.drawBitmap(50, 40, apple, 24, 24, WHITE);
                if (j > 0) display.fillCircle(76, 54, 12, BLACK);
                if (j == 2) display.fillCircle(47, 55, 12, BLACK);
                break;
              case 102:
                //steak
                display.drawBitmap(50, 40, steak, 24, 24, WHITE);
                if (j > 0) display.fillCircle(76, 59, 13, BLACK);
                if (j == 2) display.fillCircle(60, 63, 13, BLACK);
                break;
              case 103:
                //water ripples
                display.drawCircle(80, 55, 1 + 1 * i, WHITE);
                display.drawCircle(80, 55, 5 + 2 * i, WHITE);
                display.drawCircle(80, 55, 10 + 4 * i, WHITE);
                break;


            }
            display.drawBitmap(80, 24, eating[i], 48, 40, WHITE);
            delay(150);
            display.display();
          }
        }



        switch (action) {
          //apple
          case 101:
            if (hunger + 10 > 100) {
              hunger = 100;
              weight += 0.1;
            } else {
              hunger += 10;
            }
            if (health + 1 <= 100) {
              health += 1;
            }
            poopometer += 0.02;
            break;
          //steak
          case 102:
            if (hunger + 20 > 100) {
              hunger = 100;
              weight += 0.2;
            } else {
              hunger += 20;
              weight += 0.1;
            }
            if (health - 1 > 0) {
              health -= 1;
            }
            poopometer += 0.05;
            break;
          //water
          case 103:
            if (hunger + 5 <= 100) {
              hunger += 5;
            }
            poopometer += 0.01;
            break;

        }
      } else {
        if (action == 101 || action == 102 || action == 103) {
          if (soundEnabled) {
            tone(sound, 500, 200);
            delay(250);
          }
        }
      }

      switch (action) {
        case 201:
          //game
          if (!sleeping && health > 20) {
            game = true;
            walkPos = 0;
            walkXPos = 0;
            walkAnimReverse = false;
            walkRight = false;
            walkDirOffset = 2;
            treesXPos = -20;
            grassXPos = 0;
          }
          break;
        case 301:
          //sleep
          sleeping = !sleeping;
          if (!sleeping) {
            sunOrMoon = false;
          } else {
            for (int i = 0; i < 6; i++) {
              stars[i][0] = random(0, display.width());
              stars[i][1] = random(0, 10);
            }
          }

          break;
        case 401:
          //bath
          resetPoops();
          break;
        case 501:
          //doctor
          if (health < 60) {
            health = 100;
            for (int i = 0; i < 5; i++) {
              display.clearDisplay();
              if (i % 2 != 0) {
                display.fillRect(32, 23, 64, 16, WHITE);
                display.fillRect(56, 0, 16, 64, WHITE);
              }
              display.display();
              delay(300);
            }
          }

          break;
        case 601:
          //discipline
          if (action == 601 && !sleeping) {
            if (discipline + 12 <= 100) {
              discipline += 12;
            } else {
              discipline = 100;
            }
            if (happiness - 3 > 0) {
              happiness -= 3;
            }
            delay(150);
            for (int i = 0; i < 5; i++) {
              if (soundEnabled) {
                tone(sound, 200 * i, 100);
              }
              display.setCursor(100 + 3 * i, 32);
              display.print(F("!"));
              display.display();
              delay(150);
            }

          }
          break;

        case 801:
          soundEnabled = !soundEnabled;
          break;
      }
      action = 0;
    }

    //display settings
    if (setting > 0 and !game) {
      display.setCursor(8, 16);
      if (setting == 201) {
        display.println(F("increase happiness"));
      }
      if (setting == 301) {
        display.println(F("get some rest"));
      }
      if (setting == 401) {
        display.println(F("keep it healthy"));
      }
      if (setting == 501) {
        display.println(F("when health is bad"));
      }
      if (setting == 601) {
        display.println(F("get smarter"));
      }
      if (setting == 701 || setting == 702 || setting == 703 || setting == 704) {
        display.drawRect(70, 17, 52, 7, WHITE);
      }
      if (setting == 701) {
        drawBar(hunger);
      }
      if (setting == 702) {
        drawBar(happiness);
      }
      if (setting == 703) {
        drawBar(health);
      }
      if (setting == 704) {
        drawBar(discipline);
      }
      if (setting == 705 || setting == 706 || setting == 801) {
        display.setCursor(80, 16);
      }
      if (setting == 705) {
        //display.setCursor(80,16);
        display.print(weight, 1);
        display.println(F(" t"));
      }
      if (setting == 706) {
        display.print(age, 1);
        display.println(F(" y."));
      }
      if (setting == 801) {
        if (soundEnabled) {
          display.println(F("on"));
        } else {
          display.println(F("off"));
        }
      }
    }

    //display notification
    if (notification) {
      ++notificationBlink;
      if (notificationBlink == 10) {
        notificationBlink = 0;
      }
      if (notificationBlink != 1) {
        display.drawRect(117, 28, 11, 11, WHITE);
        display.setTextColor(WHITE);
        digitalWrite(ledPin, LOW);
      } else {
        display.fillRect(117, 28, 11, 11, WHITE);
        display.setTextColor(BLACK);
        digitalWrite(ledPin, HIGH);
      }
      display.setCursor(120, 30);
      display.println(F("!"));
      if (dead) {
        digitalWrite(ledPin, LOW);
      }
    }

    // GAME OVER
    if (gameOver) {



      display.fillRect(15, 11, 98, 43, BLACK);
      display.drawRect(16, 12, 96, 41, WHITE);
      display.fillRect(16, 12, 96, 13, WHITE);
      display.setCursor(36, 15);
      display.setTextColor(BLACK);
      display.println(F("GAME OVER"));
      display.setTextColor(WHITE);
      display.setCursor(21, 29);
      if (newHiScore) {
        display.println(F("NEW HI-SCORE!"));
        display.setCursor(21, 40);
      } else {
        display.println(F("SCORE:"));
        display.setCursor(21, 40);
      }
      display.println(score);



    }

    display.display();

  } else {
    //dead...
    display.clearDisplay();
    display.setCursor(0, 0);
    display.setTextColor(WHITE);
    display.println(F("Pet died...\n\nPress button 1\nto restart"));
    display.display();

    if (button1State == HIGH) {
      if (soundEnabled) {
        tone(sound, 300, 80);
        delay(200);
      }
      noTone(sound);
      asm volatile ("  jmp 0");
    }
  }
}









void drawBar(float value) {
  display.fillRect(72, 19, 48 * value / 100, 3, WHITE);
}

char* getItem(int menu, int index) {
  char oneItem [STRING_SIZE];
  memcpy_P (&oneItem, &mainMenu[menu][index], sizeof oneItem);
  return oneItem;
}

int countPoops() {
  int poopsCnt = 0;
  for (int i = 0; i < 3; i++) {
    if (poops[i] > 0) {
      ++poopsCnt;
    }
  }
  return poopsCnt;
}

void resetPoops() {
  for (int i = 0; i < 3; i++) {
    poops[i] = 0;
  }
}