My Oled is not working... need help?

I tried to write the code for my Arduino Uno to execute the tamagochi program, but the screen doesn't show up, there isn't any sound, and the buttons don't move, but when I disconnect the screen, there is sound, and every button press works.

/* Tamaguino
 by Alojz Jakob <http://jakobdesign.com>

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

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

const int button1Pin = 9;
const int button2Pin = 8; 
const int button3Pin = 7; 

const int sound = 6; 

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 LOW

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(13,OUTPUT);

  randomSeed(analogRead(0));

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  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(13,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(13,LOW);
      }else{
        display.fillRect(117,28,11,11,WHITE);
        display.setTextColor(BLACK);
        digitalWrite(13,HIGH);
      }
      display.setCursor(120,30);
      display.println(F("!"));
      if(dead){
         digitalWrite(13,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;
  }
}

Test your circuit with one of the example sketches from the Adafruit_SSD1306 library. Then you will know if it is a hardware or software problem.

I tried with the example SSD1306 128x64 i2c, but it still didn't work.

My circuit is built on this.

Your wiring is ok I think.

Try running the i2c scanner sketch from the examples menu in the IDE.

#define OLED_RESET 4  ?
#include <Wire.h>
 
 
void setup()
{
  Wire.begin();
 
  Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}
 
 
void loop()
{
  byte error, address;
  int nDevices;
 
  Serial.println("Scanning...");
 
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
 
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
 
      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknown error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
 
  delay(5000);           // wait 5 seconds for n
}

stuck in Serial monitor:
"
I2C Scanner

Scanning..."

Defines the reset pin for the OLED display.

Do you have SDA & SCL wires swapped? I cannot tell from your diagram, the pin labels are blurry. A schematic would have been clearer.

Disconnect the OLED and run i2c scanner to check that it runs correctly and reports "no devices found"

Do you have any other i2c devices to test? Like an RTC or a sensor of some kind?

1 Like

3,3v/5v to VCC(red)
gnd to gnd(orange)
sda to a4(purple)
scl to a5(gray)

Test all your Dupont cables. They are unreliable.

You're right. My Dupont cables are having trouble. Thanks for your help.

1 Like

Then you should mark my post as the solution, not your own. I'm not really looking for points to add to my score, but marking you own post as the solution just seems ungrateful.

If you want to avoid Dupont cables as much as possible, build your prototype on breadboard, use a breadboard compatible Arduino and use solid-core hookup wire cut to length and laid flat to the breadboard. This may sound like more work, and it is at first, but if you keep the used lengths of wire in a box or jar, you can re-use them many times.

1 Like

Thanks for your suggestion. I hope I can gain more experience from you in the future.

1 Like

How did you fit the original sketch on an Uno?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.