//Programme OK #include #define MINITEL_PORT Serial2 //for ESP32 //#define MINITEL_PORT Serial1 //for Leonardo #define DEBUG true #define DEBUG_PORT Serial #if DEBUG // Debug enabled #define debugBegin(x) DEBUG_PORT.begin(x) #define debugPrint(x) DEBUG_PORT.println(x) #define debugPrintHEX(x) DEBUG_PORT.println(x,HEX) #define debugPrintBIN(x) DEBUG_PORT.println(x,BIN) #else // Debug disabled : Empty macro functions #define debugBegin(x) #define debugPrint(x) #define debugPrintHEX(x) #define debugPrintBIN(x) #endif // SOUND FX #define SOUND 1 // score using bip //#define SOUND2 1 // hit using modem connection // SCREEN SIZE #define WIDTH 40 #define HEIGHT 24 // GAME FIELD #define X1 2 //player1 column #define X2 40 //player2 column #define XNET 21 //net column #define SPACE 2 //score digit space #define YSCORE 2 //score top row #define WSCORE 2 //score width #define HSCORE 4 //score height #define XSCORE1 14 //player 1 score column - align right #define XSCORE1_U XSCORE1-WSCORE+1 //unit digit #define XSCORE1_T XSCORE1_U-WSCORE-SPACE //tenth digit #define XSCORE2 26 //player 2 score column - align left #define XSCORE2_T XSCORE2 // unit digit #define XSCORE2_U XSCORE2+WSCORE+SPACE // tenth digit // GAME PARAMETER #define NBALL 15 //NB OF BALLS IN THE MATCH // BALL DIRECTION #define HAUT_DROITE 1 #define BAS_DROITE 2 #define BAS_GAUCHE 3 #define HAUT_GAUCHE 4 Minitel minitel(MINITEL_PORT); int yP1 = 13; //player1 position int yP2 = 13; //player2 position int xBall = 0; int yBall = 0; int xBallOld = 0; int yBallOld = 0; int d = HAUT_DROITE; //ball direction int p1 = 0; //player1 score int p2 = 0; //player2 score int startingCounter = 0; int level = 2; //the smaller the quicker int bypassCounter = 0; int hitCounter = 0; //nb hit bool ping = true; const byte digit[10][WSCORE*HSCORE] = { // digit de 0 à 9 sur 2 cellules par 4 // les cellules sont décrites horizontalement de gauche a droite et de haut en bas {0b111110,0b111101,0b101010,0b010101,0b101010,0b010101,0b101111,0b011111}, //0 {0b000000,0b010101,0b000000,0b010101,0b000000,0b010101,0b000000,0b010101}, //1 {0b111100,0b111101,0b001111,0b011111,0b101010,0b000000,0b101111,0b001111}, //2 {0b111100,0b111101,0b001111,0b011111,0b000000,0b010101,0b001111,0b011111}, //3 {0b101010,0b010101,0b101111,0b011111,0b000000,0b010101,0b000000,0b010101}, //4 {0b111110,0b111100,0b101111,0b001111,0b000000,0b010101,0b001111,0b011111}, //5 {0b101010,0b000000,0b101111,0b001111,0b101010,0b010101,0b101111,0b011111}, //6 {0b111100,0b111101,0b000000,0b010101,0b000000,0b010101,0b000000,0b010101}, //7 {0b111110,0b111101,0b101111,0b011111,0b101010,0b010101,0b101111,0b011111}, //8 {0b111110,0b111101,0b101111,0b011111,0b000000,0b010101,0b000000,0b010101} //9 }; // image of welcome page // made from jpg using processing IDE // +jpgtovdt2.pde (PAMAL) to get vdt from jpg // +conversion_videotex_hex (Eserandour) to get hex from vdt typedef unsigned char PROGMEM prog_uchar; const int LONGUEUR_TRAME_IMAGE = 1650; const prog_uchar IMAGE[] PROGMEM = {0x0C,0x0E,0x1B,0x40,0x1B,0x50,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x37,0x37,0x23,0x27,0x2D,0x6F,0x3B,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x3F,0x27,0x2F,0x6F,0x2F,0x7F,0x2F,0x1B,0x51,0x3F,0x1B,0x55,0x2F,0x2F,0x2F,0x2F,0x1B,0x51,0x6F,0x1B,0x50,0x2B,0x6F,0x77,0x3F,0x2F,0x1B,0x51,0x3F,0x1B,0x53,0x2F,0x1B,0x57,0x2F,0x2F,0x2F,0x1B,0x52,0x2F,0x1B,0x50,0x2F,0x6F,0x2B,0x7F,0x3F,0x2B,0x1B,0x55,0x3F,0x1B,0x56,0x2F,0x2F,0x1B,0x55,0x2F,0x1B,0x50,0x2F,0x6F,0x7B,0x37,0x27,0x3F,0x1B,0x55,0x2F,0x1B,0x57,0x2F,0x2F,0x2F,0x1B,0x52,0x6F,0x1B,0x50,0x6F,0x70,0x1B,0x52,0x35,0x1B,0x47,0x1B,0x57,0x2B,0x63,0x62,0x22,0x1B,0x45,0x22,0x1B,0x40,0x6B,0x1B,0x50,0x6F,0x2F,0x2F,0x1B,0x57,0x37,0x1B,0x45,0x21,0x1B,0x47,0x71,0x71,0x69,0x31,0x1B,0x43,0x22,0x1B,0x40,0x2B,0x1B,0x55,0x6F,0x1B,0x50,0x6F,0x3F,0x1B,0x54,0x3F,0x1B,0x57,0x27,0x1B,0x46,0x21,0x1B,0x47,0x7B,0x72,0x1B,0x43,0x22,0x1B,0x40,0x2B,0x1B,0x54,0x6F,0x1B,0x50,0x2B,0x35,0x1B,0x51,0x3F,0x1B,0x57,0x27,0x1B,0x46,0x21,0x1B,0x47,0x61,0x34,0x7A,0x1B,0x40,0x1B,0x56,0x6A,0x1B,0x50,0x6A,0x7F,0x1B,0x52,0x35,0x1B,0x47,0x1B,0x57,0x7A,0x1B,0x43,0x68,0x1B,0x40,0x7C,0x74,0x1B,0x46,0x30,0x1B,0x43,0x22,0x1B,0x40,0x1B,0x52,0x6B,0x1B,0x50,0x37,0x1B,0x57,0x37,0x1B,0x43,0x21,0x1B,0x47,0x68,0x1B,0x40,0x78,0x7C,0x1B,0x56,0x7C,0x1B,0x57,0x7C,0x1B,0x41,0x30,0x1B,0x47,0x21,0x1B,0x41,0x22,0x1B,0x40,0x1B,0x55,0x6F,0x1B,0x50,0x3F,0x1B,0x53,0x37,0x1B,0x47,0x1B,0x57,0x21,0x1B,0x42,0x60,0x1B,0x40,0x78,0x7C,0x1B,0x45,0x30,0x1B,0x47,0x7B,0x1B,0x40,0x6A,0x1B,0x50,0x77,0x1B,0x54,0x3F,0x1B,0x44,0x1B,0x57,0x25,0x1B,0x47,0x21,0x1B,0x42,0x60,0x1B,0x40,0x78,0x1B,0x56,0x7C,0x1B,0x57,0x7C,0x1B,0x56,0x7E,0x1B,0x50,0x7A,0x75,0x1B,0x52,0x35,0x1B,0x47,0x1B,0x57,0x7E,0x1B,0x43,0x6A,0x1B,0x40,0x1B,0x50,0x6A,0x3D,0x1B,0x45,0x1B,0x57,0x35,0x1B,0x47,0x3A,0x1B,0x40,0x1B,0x56,0x6A,0x1B,0x51,0x37,0x1B,0x42,0x1B,0x57,0x25,0x1B,0x47,0x77,0x1B,0x40,0x7A,0x1B,0x50,0x7C,0x78,0x24,0x61,0x1B,0x55,0x7D,0x1B,0x41,0x1B,0x57,0x30,0x1B,0x47,0x38,0x1B,0x40,0x6A,0x1B,0x50,0x2B,0x1B,0x41,0x1B,0x57,0x35,0x1B,0x47,0x6F,0x1B,0x44,0x6A,0x1B,0x40,0x1B,0x50,0x7E,0x37,0x1B,0x53,0x35,0x1B,0x47,0x1B,0x57,0x62,0x1B,0x42,0x6A,0x1B,0x40,0x1B,0x50,0x6B,0x1B,0x53,0x35,0x1B,0x47,0x1B,0x57,0x21,0x1B,0x42,0x60,0x1B,0x40,0x1B,0x52,0x7E,0x1B,0x50,0x74,0x7D,0x67,0x78,0x7E,0x75,0x1B,0x52,0x35,0x1B,0x47,0x1B,0x57,0x3F,0x1B,0x43,0x2A,0x1B,0x40,0x2F,0x23,0x1B,0x43,0x21,0x1B,0x46,0x60,0x1B,0x40,0x1B,0x52,0x7A,0x1B,0x55,0x35,0x1B,0x47,0x1B,0x57,0x21,0x1B,0x43,0x68,0x1B,0x40,0x1B,0x54,0x6A,0x1B,0x50,0x6A,0x2F,0x7D,0x23,0x22,0x1B,0x57,0x35,0x1B,0x47,0x23,0x1B,0x45,0x6A,0x1B,0x40,0x1B,0x50,0x6B,0x1B,0x41,0x1B,0x57,0x35,0x1B,0x47,0x2E,0x1B,0x44,0x1B,0x53,0x6A,0x1B,0x40,0x1B,0x50,0x7F,0x35,0x1B,0x56,0x35,0x1B,0x47,0x1B,0x57,0x3F,0x1B,0x46,0x6A,0x1B,0x40,0x1B,0x50,0x6A,0x1B,0x44,0x1B,0x57,0x35,0x1B,0x47,0x72,0x1B,0x44,0x6A,0x1B,0x40,0x1B,0x50,0x3F,0x1B,0x53,0x2F,0x2F,0x2F,0x1B,0x52,0x6F,0x1B,0x50,0x6B,0x3F,0x1B,0x55,0x35,0x1B,0x47,0x1B,0x57,0x7D,0x6A,0x70,0x1B,0x43,0x60,0x1B,0x41,0x70,0x1B,0x40,0x7A,0x1B,0x50,0x7E,0x1B,0x55,0x35,0x1B,0x47,0x1B,0x57,0x30,0x1B,0x43,0x2A,0x1B,0x40,0x1B,0x55,0x6B,0x1B,0x50,0x73,0x6B,0x6B,0x2C,0x78,0x1B,0x57,0x35,0x1B,0x47,0x74,0x1B,0x45,0x6A,0x1B,0x40,0x1B,0x50,0x7E,0x1B,0x41,0x1B,0x57,0x35,0x1B,0x47,0x6F,0x1B,0x44,0x1B,0x53,0x6A,0x1B,0x40,0x1B,0x50,0x7C,0x35,0x1B,0x52,0x35,0x1B,0x47,0x1B,0x57,0x37,0x1B,0x46,0x6A,0x1B,0x40,0x1B,0x50,0x6A,0x1B,0x44,0x1B,0x57,0x35,0x1B,0x47,0x76,0x1B,0x41,0x6A,0x1B,0x40,0x1B,0x50,0x25,0x1B,0x42,0x1B,0x57,0x35,0x1B,0x47,0x60,0x3A,0x1B,0x40,0x1B,0x56,0x6A,0x1B,0x50,0x7E,0x7F,0x1B,0x55,0x35,0x1B,0x47,0x1B,0x57,0x7D,0x1B,0x43,0x6A,0x1B,0x40,0x1B,0x55,0x7C,0x7C,0x1B,0x50,0x7E,0x7E,0x78,0x1B,0x54,0x7D,0x1B,0x41,0x1B,0x57,0x34,0x1B,0x47,0x79,0x1B,0x40,0x2A,0x1B,0x51,0x6F,0x1B,0x50,0x6A,0x6A,0x3F,0x1B,0x53,0x3F,0x1B,0x46,0x1B,0x57,0x21,0x1B,0x47,0x7A,0x1B,0x40,0x7A,0x1B,0x50,0x61,0x1B,0x41,0x1B,0x57,0x35,0x1B,0x47,0x25,0x1B,0x44,0x1B,0x53,0x6A,0x1B,0x40,0x1B,0x50,0x7F,0x35,0x1B,0x52,0x35,0x1B,0x47,0x1B,0x57,0x7C,0x1B,0x46,0x6A,0x1B,0x40,0x1B,0x50,0x6A,0x1B,0x56,0x75,0x1B,0x43,0x1B,0x57,0x30,0x22,0x1B,0x40,0x2B,0x1B,0x55,0x7C,0x1B,0x46,0x1B,0x57,0x35,0x1B,0x47,0x37,0x1B,0x40,0x1B,0x53,0x6A,0x1B,0x50,0x2A,0x7F,0x1B,0x55,0x35,0x1B,0x47,0x1B,0x57,0x6E,0x6A,0x1B,0x40,0x1B,0x50,0x6A,0x7F,0x75,0x7F,0x7F,0x35,0x1B,0x56,0x7D,0x1B,0x45,0x1B,0x57,0x30,0x1B,0x47,0x3D,0x1B,0x42,0x22,0x1B,0x40,0x23,0x23,0x23,0x1B,0x43,0x21,0x1B,0x47,0x6B,0x1B,0x40,0x68,0x1B,0x50,0x7E,0x34,0x1B,0x41,0x1B,0x57,0x35,0x1B,0x47,0x68,0x1B,0x44,0x1B,0x53,0x6A,0x1B,0x40,0x1B,0x50,0x7F,0x35,0x1B,0x52,0x35,0x1B,0x47,0x1B,0x57,0x70,0x1B,0x46,0x6A,0x1B,0x40,0x1B,0x50,0x6A,0x7D,0x1B,0x57,0x74,0x1B,0x47,0x30,0x22,0x1B,0x44,0x22,0x1B,0x46,0x21,0x1B,0x47,0x77,0x1B,0x40,0x1B,0x53,0x6A,0x1B,0x50,0x27,0x7F,0x1B,0x51,0x35,0x1B,0x47,0x1B,0x57,0x68,0x1B,0x43,0x6A,0x1B,0x40,0x1B,0x50,0x6A,0x6B,0x7F,0x7F,0x7F,0x75,0x35,0x1B,0x52,0x7D,0x1B,0x57,0x70,0x1B,0x46,0x30,0x1B,0x47,0x70,0x7E,0x70,0x1B,0x41,0x60,0x1B,0x40,0x78,0x1B,0x50,0x7E,0x6B,0x75,0x1B,0x41,0x1B,0x57,0x35,0x1B,0x47,0x70,0x1B,0x44,0x1B,0x53,0x6A,0x1B,0x40,0x1B,0x50,0x6A,0x35,0x1B,0x52,0x35,0x1B,0x47,0x1B,0x57,0x70,0x1B,0x46,0x6A,0x1B,0x40,0x1B,0x50,0x6A,0x7D,0x76,0x1B,0x57,0x7D,0x30,0x1B,0x43,0x30,0x1B,0x47,0x70,0x60,0x1B,0x40,0x1B,0x53,0x6A,0x1B,0x50,0x6F,0x37,0x1B,0x51,0x7D,0x1B,0x53,0x7C,0x7C,0x1B,0x50,0x7E,0x6A,0x7F,0x7F,0x7F,0x7F,0x7D,0x7D,0x7E,0x1B,0x54,0x7D,0x1B,0x56,0x7C,0x7C,0x1B,0x52,0x7E,0x1B,0x50,0x7E,0x7E,0x7C,0x7E,0x7F,0x1B,0x55,0x7D,0x7C,0x7E,0x1B,0x50,0x7E,0x75,0x1B,0x54,0x7D,0x1B,0x55,0x7C,0x7C,0x1B,0x50,0x7E,0x6C,0x7D,0x7C,0x7E,0x1B,0x51,0x7D,0x1B,0x52,0x7C,0x7C,0x1B,0x50,0x7E,0x7A,0x7D,0x7D,0x7E,0x7D,0x7C,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7D,0x7E,0x7E,0x7D,0x7C,0x71,0x7E,0x7F,0x7F,0x7F,0x7F,0x7D,0x7D,0x7E,0x7F,0x7F,0x7C,0x7D,0x7F,0x7D,0x7E,0x7F,0x7F,0x7F,0x7F,0x70,0x70,0x7E,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F}; //const int LONGUEUR_TRAME_IMAGE = 1666; //const prog_uchar IMAGE[] PROGMEM = {0x0C,0x0E,0x1B,0x40,0x1B,0x50,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x3F,0x1B,0x51,0x2F,0x1B,0x50,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x1B,0x52,0x37,0x1B,0x57,0x23,0x23,0x23,0x2F,0x1B,0x50,0x6F,0x7F,0x7F,0x7F,0x7F,0x1B,0x56,0x3F,0x1B,0x57,0x23,0x1B,0x41,0x21,0x1B,0x45,0x23,0x1B,0x40,0x23,0x1B,0x52,0x6F,0x1B,0x50,0x7F,0x7F,0x7F,0x7F,0x1B,0x57,0x3F,0x1B,0x41,0x21,0x1B,0x47,0x7F,0x1B,0x45,0x22,0x1B,0x40,0x6B,0x1B,0x50,0x7F,0x7F,0x7F,0x7F,0x1B,0x54,0x3F,0x1B,0x57,0x2F,0x23,0x1B,0x44,0x23,0x1B,0x40,0x1B,0x53,0x6B,0x1B,0x50,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x1B,0x52,0x35,0x1B,0x47,0x1B,0x57,0x7F,0x7F,0x7F,0x7F,0x1B,0x40,0x2A,0x1B,0x54,0x6F,0x1B,0x50,0x7F,0x7F,0x1B,0x57,0x27,0x1B,0x47,0x21,0x7F,0x1B,0x42,0x60,0x1B,0x46,0x30,0x1B,0x47,0x7F,0x1B,0x45,0x22,0x1B,0x40,0x1B,0x52,0x6B,0x1B,0x50,0x7F,0x7F,0x1B,0x57,0x3F,0x1B,0x43,0x21,0x1B,0x46,0x60,0x1B,0x40,0x70,0x1B,0x45,0x30,0x1B,0x43,0x22,0x1B,0x40,0x6F,0x1B,0x50,0x7F,0x7F,0x1B,0x52,0x3F,0x1B,0x41,0x1B,0x57,0x21,0x1B,0x47,0x7F,0x1B,0x46,0x60,0x1B,0x42,0x70,0x1B,0x44,0x1B,0x53,0x6A,0x1B,0x40,0x1B,0x50,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x1B,0x52,0x35,0x1B,0x47,0x1B,0x57,0x7F,0x1B,0x40,0x6A,0x1B,0x51,0x7C,0x1B,0x57,0x34,0x1B,0x47,0x22,0x1B,0x40,0x1B,0x56,0x6A,0x1B,0x50,0x7F,0x1B,0x53,0x3F,0x1B,0x43,0x1B,0x57,0x21,0x1B,0x44,0x60,0x1B,0x40,0x1B,0x53,0x7E,0x1B,0x50,0x7E,0x7D,0x1B,0x57,0x74,0x1B,0x43,0x30,0x1B,0x44,0x2A,0x1B,0x40,0x1B,0x50,0x7F,0x7F,0x1B,0x57,0x21,0x1B,0x47,0x60,0x1B,0x40,0x7E,0x1B,0x50,0x7F,0x1B,0x53,0x75,0x1B,0x47,0x1B,0x57,0x7F,0x1B,0x40,0x6A,0x1B,0x50,0x7F,0x1B,0x54,0x3F,0x1B,0x57,0x21,0x1B,0x47,0x60,0x1B,0x40,0x78,0x1B,0x54,0x7E,0x1B,0x50,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x1B,0x52,0x35,0x1B,0x47,0x1B,0x57,0x7F,0x1B,0x40,0x6A,0x1B,0x50,0x7F,0x1B,0x55,0x35,0x1B,0x47,0x1B,0x57,0x35,0x1B,0x40,0x1B,0x56,0x6A,0x1B,0x50,0x7F,0x1B,0x44,0x1B,0x57,0x25,0x1B,0x47,0x7F,0x1B,0x40,0x1B,0x56,0x7E,0x1B,0x50,0x7F,0x7F,0x7F,0x7F,0x1B,0x57,0x75,0x1B,0x47,0x7F,0x1B,0x40,0x1B,0x53,0x6A,0x1B,0x50,0x7F,0x1B,0x42,0x1B,0x57,0x35,0x1B,0x47,0x6A,0x1B,0x40,0x1B,0x50,0x6A,0x7F,0x35,0x1B,0x47,0x1B,0x57,0x7F,0x1B,0x40,0x6A,0x1B,0x50,0x7F,0x1B,0x56,0x37,0x1B,0x47,0x1B,0x57,0x21,0x1B,0x40,0x6A,0x1B,0x50,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x1B,0x52,0x35,0x1B,0x47,0x1B,0x57,0x7F,0x1B,0x40,0x2A,0x1B,0x56,0x2F,0x1B,0x57,0x25,0x1B,0x47,0x60,0x1B,0x40,0x1B,0x56,0x6A,0x1B,0x50,0x7F,0x1B,0x43,0x1B,0x57,0x35,0x1B,0x44,0x6A,0x1B,0x40,0x1B,0x50,0x7F,0x7F,0x7F,0x7F,0x7F,0x35,0x1B,0x47,0x1B,0x57,0x34,0x1B,0x44,0x6A,0x1B,0x40,0x1B,0x50,0x7F,0x1B,0x42,0x1B,0x57,0x35,0x1B,0x47,0x6A,0x1B,0x40,0x1B,0x50,0x6A,0x7F,0x35,0x1B,0x47,0x1B,0x57,0x7F,0x1B,0x40,0x6A,0x1B,0x50,0x7F,0x1B,0x57,0x35,0x1B,0x47,0x68,0x1B,0x40,0x1B,0x55,0x6A,0x1B,0x50,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x1B,0x52,0x35,0x1B,0x47,0x1B,0x57,0x7F,0x7F,0x7F,0x7F,0x1B,0x40,0x60,0x1B,0x54,0x7E,0x1B,0x50,0x7F,0x1B,0x43,0x1B,0x57,0x35,0x1B,0x44,0x6A,0x1B,0x40,0x1B,0x50,0x7F,0x7F,0x7F,0x7F,0x7F,0x35,0x1B,0x47,0x1B,0x57,0x35,0x1B,0x45,0x6A,0x1B,0x40,0x1B,0x50,0x7F,0x1B,0x42,0x1B,0x57,0x35,0x1B,0x47,0x6A,0x1B,0x40,0x1B,0x50,0x6A,0x7F,0x35,0x1B,0x47,0x1B,0x57,0x7F,0x1B,0x40,0x6A,0x1B,0x50,0x7F,0x1B,0x57,0x35,0x1B,0x47,0x6A,0x1B,0x40,0x1B,0x51,0x6A,0x1B,0x50,0x37,0x1B,0x44,0x1B,0x57,0x23,0x23,0x1B,0x40,0x1B,0x53,0x6B,0x1B,0x50,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x1B,0x52,0x35,0x1B,0x47,0x1B,0x57,0x7F,0x1B,0x40,0x60,0x70,0x7C,0x1B,0x54,0x7E,0x1B,0x50,0x7F,0x7F,0x1B,0x46,0x1B,0x57,0x35,0x1B,0x42,0x22,0x1B,0x40,0x1B,0x54,0x6F,0x1B,0x50,0x7F,0x7F,0x7F,0x7F,0x1B,0x55,0x3F,0x1B,0x47,0x1B,0x57,0x25,0x1B,0x40,0x6A,0x1B,0x50,0x7F,0x1B,0x42,0x1B,0x57,0x35,0x1B,0x47,0x6A,0x1B,0x40,0x1B,0x50,0x6A,0x7F,0x35,0x1B,0x47,0x1B,0x57,0x7F,0x1B,0x40,0x6A,0x1B,0x50,0x7F,0x1B,0x56,0x35,0x1B,0x47,0x1B,0x57,0x22,0x1B,0x40,0x1B,0x53,0x6B,0x1B,0x50,0x75,0x1B,0x44,0x1B,0x57,0x70,0x1B,0x47,0x7F,0x1B,0x44,0x1B,0x53,0x6A,0x1B,0x40,0x1B,0x50,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x1B,0x52,0x35,0x1B,0x47,0x1B,0x57,0x7F,0x1B,0x40,0x1B,0x56,0x6A,0x1B,0x50,0x7F,0x7F,0x7F,0x7F,0x7F,0x1B,0x57,0x35,0x1B,0x47,0x7F,0x1B,0x40,0x2A,0x1B,0x50,0x6F,0x7F,0x7F,0x1B,0x54,0x3F,0x1B,0x57,0x25,0x1B,0x47,0x7F,0x1B,0x40,0x1B,0x53,0x7A,0x1B,0x50,0x7F,0x1B,0x42,0x1B,0x57,0x35,0x1B,0x47,0x6A,0x1B,0x40,0x1B,0x50,0x6A,0x7F,0x35,0x1B,0x47,0x1B,0x57,0x7F,0x1B,0x40,0x6A,0x1B,0x50,0x7F,0x1B,0x55,0x7D,0x1B,0x43,0x1B,0x57,0x34,0x1B,0x41,0x22,0x1B,0x40,0x1B,0x56,0x6F,0x1B,0x51,0x35,0x1B,0x47,0x1B,0x57,0x7F,0x1B,0x44,0x1B,0x53,0x6A,0x1B,0x40,0x1B,0x50,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x1B,0x52,0x35,0x1B,0x47,0x1B,0x57,0x7F,0x1B,0x40,0x1B,0x56,0x6A,0x1B,0x50,0x7F,0x7F,0x7F,0x7F,0x7F,0x1B,0x51,0x7D,0x1B,0x41,0x1B,0x57,0x30,0x1B,0x47,0x7F,0x1B,0x40,0x22,0x2B,0x27,0x1B,0x41,0x21,0x1B,0x47,0x7F,0x1B,0x40,0x68,0x1B,0x50,0x7F,0x7F,0x1B,0x42,0x1B,0x57,0x35,0x1B,0x47,0x6A,0x1B,0x40,0x1B,0x50,0x6A,0x7F,0x35,0x1B,0x47,0x1B,0x57,0x7F,0x1B,0x40,0x6A,0x1B,0x50,0x7F,0x7F,0x1B,0x57,0x75,0x1B,0x47,0x30,0x1B,0x46,0x22,0x1B,0x40,0x23,0x1B,0x47,0x7F,0x1B,0x44,0x1B,0x53,0x6A,0x1B,0x40,0x1B,0x50,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x1B,0x52,0x35,0x1B,0x47,0x1B,0x57,0x7F,0x1B,0x40,0x1B,0x56,0x6A,0x1B,0x50,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x1B,0x56,0x7D,0x1B,0x57,0x30,0x1B,0x47,0x30,0x7F,0x7F,0x60,0x1B,0x40,0x78,0x1B,0x50,0x7E,0x7F,0x7F,0x1B,0x42,0x1B,0x57,0x35,0x1B,0x47,0x6A,0x1B,0x40,0x1B,0x50,0x6A,0x7F,0x35,0x1B,0x47,0x1B,0x57,0x7F,0x1B,0x40,0x6A,0x1B,0x50,0x7F,0x7F,0x7D,0x1B,0x57,0x74,0x1B,0x42,0x30,0x1B,0x47,0x7F,0x7F,0x1B,0x44,0x1B,0x53,0x6A,0x1B,0x40,0x1B,0x50,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x1B,0x52,0x7D,0x1B,0x57,0x7C,0x1B,0x56,0x7E,0x1B,0x50,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x1B,0x57,0x7D,0x7C,0x7C,0x7E,0x1B,0x50,0x7F,0x7F,0x7F,0x7F,0x1B,0x57,0x7C,0x7C,0x1B,0x50,0x7E,0x7F,0x7D,0x1B,0x57,0x7C,0x7E,0x1B,0x50,0x7F,0x7F,0x7F,0x7F,0x1B,0x51,0x7D,0x1B,0x57,0x7C,0x7C,0x1B,0x53,0x7E,0x1B,0x50,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F,0x7F}; void setup() { debugBegin(115200); debugPrint("debug port ready"); delay(500); // wait minitel to init //init minitel at 4800 bauds if (minitel.searchSpeed() != 4800) { // search speed if (minitel.changeSpeed(4800) < 0) { // set to 4800 if different minitel.searchSpeed(); // search speed again if change has failed } } minitel.modeVideotex(); minitel.echo(false); } void loop() { welcome(); startGame(); } void welcome() { //draw welcome screen minitel.newScreen(); minitel.attributs(CARACTERE_BLANC); minitel.attributs(FOND_NOIR); for (int i=0; ip2) drawScore1(p1); else drawScore2(p2); #ifdef SOUND minitel.bip(); delay(1000); minitel.bip(); delay(1000); minitel.bip(); delay(1000); #else delay(5000); #endif #ifdef SOUND2 if (!ping) ping = pingpong(ping); #endif p1 = 0; p2 = 0; yP1 = 13; yP2 = 13; xBall = 0; yBall = 0; ping = true; } void handlePlayer() { int dy1 = 0; int dy2 = 0; byte key = getKeyCodeOverride(); if (key == 215 && yP1<22) dy1++; if (key == 209 && yP1>3) dy1--; if (key == 78 && yP2<22) dy2++; if (key == 202 && yP2>3) dy2--; minitel.graphic(0b111111, X1, yP1+3*dy1); minitel.moveCursorXY(X1, yP1-2*dy1); if (dy1!=0) minitel.graphic(0b000000); else minitel.graphic(0b111111); //preserve frame rate yP1+=dy1; minitel.graphic(0b111111, X2, yP2+3*dy2); minitel.moveCursorXY(40, yP2-2*dy2); if (dy2!=0) minitel.graphic(0b000000); else minitel.graphic(0b111111); //preserve frame rate yP2+=dy2; } void playGame() { handlePlayer(); if (startingCounter > 0) { countdown(); } else { //updateLevel if (hitCounter == 3) level=1; if (hitCounter == 6) level=0; if (bypassCounter < level) { //bypass frame to slow down bypassCounter++; } else { bypassCounter=0; xBallOld = xBall; yBallOld = yBall; // move ball if(d == HAUT_DROITE){ xBall+=2; yBall--; } if(d == BAS_DROITE){ xBall+=2; yBall++; } if(d == BAS_GAUCHE){ xBall-=2; yBall++; } if(d == HAUT_GAUCHE){ xBall-=2; yBall--; } //erase old ball eraseBall(xBallOld, yBallOld); //draw new ball minitel.graphic(0b111111, xBall, yBall); // top limit if(yBall == 1) { if(d == HAUT_DROITE) d = BAS_DROITE; if(d == HAUT_GAUCHE) d = BAS_GAUCHE; } // bottom limit if(yBall == HEIGHT) { if (d == BAS_GAUCHE) d = HAUT_GAUCHE; if (d == BAS_DROITE) d = HAUT_DROITE; } // player1 side if (xBall <= X1 + 2) { // player1 send back if(abs(yBall-yP1) < 3) { if(d == BAS_GAUCHE) d = BAS_DROITE; if(d == HAUT_GAUCHE) d = HAUT_DROITE; hitCounter++; #ifdef SOUND2 ping = pingpong(ping); #endif } else{ // player2 win #ifdef SOUND minitel.bip(); #endif p2++; drawScore2(p2); initGame(); } } // player2 side if (xBall >= X2 - 2) { // player2 send back if(abs(yBall-yP2) < 3) { if(d == BAS_DROITE) d = BAS_GAUCHE; if(d == HAUT_DROITE) d = HAUT_GAUCHE; hitCounter++; #ifdef SOUND2 ping = pingpong(ping); #endif } else{ // player1 win #ifdef SOUND minitel.bip(); #endif p1++; drawScore1(p1); initGame(); } } } } } bool pingpong(bool ping) { if (ping) { minitel.connexion(true); return false; } else { minitel.connexion(false); return true; } } void eraseBall(int x, int y) { // erase ball preserving game field and score minitel.moveCursorXY(x,y); bool erase = true; if (x == XNET) { // Ball in net if (y%2 == 1) erase = false; } if (y >= YSCORE && y < YSCORE + HSCORE) { // Ball in score if (x >= XSCORE1_T && x < XSCORE1_T + WSCORE) { //ball in score1 tenth if (p1 >= 10) { drawDigit(p1/10, XSCORE1_T, YSCORE); erase = false; } } if (x >= XSCORE1_U && x < XSCORE1_U + WSCORE) { //ball in score1 unit drawDigit(p1%10, XSCORE1_U, YSCORE); erase = false; } if (x >= XSCORE2_T && x < XSCORE2_T + WSCORE) { //ball in score2 tenth if (p2 >= 10) { drawDigit(p2/10, XSCORE2_T, YSCORE); erase = false; } } if (x >= XSCORE2_U && x < XSCORE2_U + WSCORE) { //ball in score2 unit drawDigit(p2%10, XSCORE2_U, YSCORE); erase = false; } } if (erase) minitel.graphic(0b000000); } /*void drawDigit(int num, int x, int y) { for (int i = 0; i < WSCORE; i++) { for (int j = 0; j < HSCORE; j++) { minitel.graphic(digit[num][i+WSCORE*j],x+i,y+j); } } }*/ void initGame() { // init level hitCounter = 0; level = 2; bypassCounter = 2; // get random starting point xBallOld = xBall; yBallOld = yBall; d = random(1,4); xBall = random(1,5)*2+1; if (d>2) xBall = 40-xBall; yBall = random(3,22); // draw new ball minitel.graphic(0b111111, xBall, yBall); // starting countdown startingCounter = 10; } void countdown() { if (xBallOld != 0) { if (startingCounter == 8) { minitel.attributs(CARACTERE_BLEU); minitel.graphic(0b111111, xBallOld, yBallOld); minitel.attributs(CARACTERE_BLANC); } if (startingCounter == 6) { minitel.attributs(CARACTERE_VERT); minitel.graphic(0b111111, xBallOld, yBallOld); minitel.attributs(CARACTERE_BLANC); } if (startingCounter == 4) { minitel.attributs(CARACTERE_BLEU); minitel.graphic(0b111111, xBallOld, yBallOld); minitel.attributs(CARACTERE_BLANC); } if (startingCounter == 2) { minitel.attributs(CARACTERE_VERT); minitel.graphic(0b111111, xBallOld, yBallOld); minitel.attributs(CARACTERE_BLANC); } if (startingCounter == 1) { minitel.graphic(0b000000, xBallOld, yBallOld); //erase ball #ifdef SOUND2 ping = pingpong(ping); #endif } } startingCounter--; } byte getKeyCodeOverride() { byte b = 255; if (MINITEL_PORT.available()) { b = MINITEL_PORT.read(); MINITEL_PORT.flush(); debugPrint(b); } return b; } void drawGameField() { //draw net for (int i = 1; i < HEIGHT; i+=2) { minitel.graphic(0b111111, 21, i); } //draw players for (int i = -2; i < 3; i++) { minitel.graphic(0b111111,X1,yP1+i); minitel.graphic(0b111111,X2,yP2+i); } // draw score drawScore1(p1); drawScore2(p2); } void drawScore1(int score) { drawDigit(score%10, XSCORE1_U, YSCORE); if (score>=10) drawDigit(score/10, XSCORE1_T, YSCORE); } void drawScore2(int score) { drawDigit(score%10, XSCORE2_U, YSCORE); if (score>=10) drawDigit(score/10, XSCORE2_T, YSCORE); } void drawDigit(int num, int x, int y) { for (int i = 0; i < WSCORE; i++) { for (int j = 0; j < HSCORE; j++) { minitel.graphic(digit[num][i+WSCORE*j],x+i,y+j); } } }