/* Tamaguino
by Alojz Jakob <http://jakobdesign.com>
********** TAMAGUINO ***********
* Tamagotchi clone for Arduino *
********************************
Source: https://github.com/alojzjakob/Tamaguino/tree/master/Tamaguino-noInputResistor
*/
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(128, 64, &Wire, 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, 0x3d);
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;
}
}