apps/flpybird: optimization and tweaks

This commit is contained in:
2025-10-15 16:48:59 +03:00
parent 8acb681003
commit 5fa6448935
3 changed files with 299 additions and 398 deletions

View File

@@ -1,6 +1,25 @@
## Floppy Bird for KolibriOS
* [Forum topic](http://board.kolibrios.org/viewtopic.php?t=4471) <br>
* [Directory in official KolibriOS Git repository](kolibrios\programs\games\floppybird)
Simple clone of world-famous Flappy Bird game for KolibriOS, written in C.
<img src="https://i.ibb.co/RXCXwmp/showcase.png" alt="Showcase" width="100%">
### Links
* [Forum topic](http://board.kolibrios.org/viewtopic.php?t=4471)
### Controls
* Main menu:
* 1 - fast game mode
* 2 - slow game mode
* Game:
* Space - jump
* Game over:
* Space - restart
* Escape - return to main menu
### Authors
* zorggish - initial author, all game code
* Burer - rewrite to C, some tweaks
<img src="https://i.ibb.co/JW3MCHmM/showcase.png" alt="Showcase" width="100%">

View File

@@ -6,11 +6,6 @@
// Contributor zorggish - Main code
// Contributor Burer - Rewrite to C
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>
#include <sys/ksys.h>
#include "images.h"
@@ -20,25 +15,33 @@
static const char HEADER_STRING[] = "Floppy Bird";
static const char CONTROL_STRING[] = "SPACEBAR TO JUMP";
static const char GAMEOVER_STRING[] = "GAME OVER";
static const char SPA_KEY_STRING[] = "Press SPACEBAR for Restart";
static const char ESC_KEY_STRING[] = "Press ESCAPE for Menu";
static const char SPA_KEY_STRING[] = "PRESS SPACEBAR FOR RESTART";
static const char ESC_KEY_STRING[] = "PRESS ESCAPE FOR MENU";
static const char FAST_STRING[] = "1 - FAST";
static const char SLOW_STRING[] = "2 - SLOW";
/* ===== Global const variables ===== */
/* ===== Global window variables ===== */
static const int WIN_W = 400;
static const int WIN_H = 376;
static int BORDER_TOP = 24;
static const int BORDER_WIN = 5;
#define WIN_W 400
#define WIN_H 376
#define WIN_B 5
#define WIN_S 10
/* ===== Game state ===== */
static int WIN_X;
static int WIN_Y;
static int WIN_T;
typedef enum GameState {
GAMESTATE_MENU,
GAMESTATE_STARTED,
GAMESTATE_GAMEOVER
} GameState;
/* ===== Global game variables ===== */
#define GAMESTATE_MENU 0
#define GAMESTATE_STARTED 1
#define GAMESTATE_GAMEOVER 2
static int game_rng;
static int game_speed = 1;
static int game_pause = 0;
static char game_score[] = "Score: 000";
static int game_state;
/* ===== Bird ===== */
@@ -46,30 +49,21 @@ typedef enum GameState {
#define BIRD_H 20
#define BIRD_X 100
typedef struct Bird {
int prev_y;
int y;
int acceleration;
} Bird;
static int bird_pos;
static int bird_acc;
static void Bird_initialize(Bird* b) {
b->y = WIN_H / 2 + BORDER_TOP;
b->acceleration = 0;
b->prev_y = b->y;
static void Bird_initialize(void) {
bird_pos = (WIN_H + WIN_T) / 2;
bird_acc = 0;
}
static void Bird_move(Bird* b) {
if (b->acceleration <= 30) b->acceleration += 2;
b->prev_y = b->y;
b->y += b->acceleration / 10;
static void Bird_move(void) {
bird_acc += (bird_acc <= 30) * 2; // 2 or 0
bird_pos += bird_acc / 10;
}
static void Bird_jump(Bird* b) {
b->acceleration = -50;
}
static void Bird_draw(const Bird* b) {
_ksys_draw_bitmap(birdImage, BIRD_X, b->y, BIRD_W, BIRD_H);
static void Bird_jump(void) {
bird_acc = -50;
}
/* ===== Tube ===== */
@@ -78,304 +72,279 @@ static void Bird_draw(const Bird* b) {
#define TUBE_GAPHEIGHT 100
#define TUBE_HEADHEIGHT 18
typedef struct Tube {
int x;
int gapY;
} Tube;
#define tube_num 3
static void Tube_randomize(Tube* t) {
t->x = WIN_W + 1;
t->gapY = rand() % (WIN_H / 2) + (WIN_H / 2 - TUBE_GAPHEIGHT - BORDER_WIN) / 2;
static int tube_pos[tube_num];
static int tube_gap[tube_num];
static void Tube_randomize(int t) {
int x = game_rng; x ^= x << 13; x ^= x >> 17; x ^= x << 5; game_rng = x;
int r = x & 255u;
if (r >= WIN_H / 2)
r -= 256 - WIN_H / 2;
tube_pos[t] = WIN_W + 1;
tube_gap[t] = r + (WIN_H / 2 - TUBE_GAPHEIGHT - WIN_B) / 2;
}
static void Tube_move(Tube* t) {
t->x -= 2;
if (t->x < -TUBE_WIDTH - 2) {
static void Tube_move(int t) {
tube_pos[t] -= 2;
if (tube_pos[t] < -TUBE_WIDTH - 2)
Tube_randomize(t);
}
}
static void Tube_draw(const Tube* t) {
static void Tube_draw(int t) {
/* cleanup */
int pixels = (WIN_W - (BORDER_WIN + BORDER_WIN)) - (t->x + TUBE_WIDTH + 2);
if (pixels >= -1) {
pixels = (pixels == -1) ? 1 : 2;
_ksys_draw_bar(t->x + TUBE_WIDTH, t->gapY - TUBE_HEADHEIGHT, pixels, TUBE_HEADHEIGHT, 0x00FFFF);
_ksys_draw_bar(t->x + TUBE_WIDTH, t->gapY + TUBE_GAPHEIGHT , pixels, TUBE_HEADHEIGHT, 0x00FFFF);
int pixels = WIN_W - WIN_S - TUBE_WIDTH - tube_pos[t];
if (pixels > 0) {
if (pixels > 2)
pixels = 2;
_ksys_draw_bar(tube_pos[t] + TUBE_WIDTH, tube_gap[t] - TUBE_HEADHEIGHT, pixels, TUBE_HEADHEIGHT, GAME_PALETTE[0]);
_ksys_draw_bar(tube_pos[t] + TUBE_WIDTH, tube_gap[t] + TUBE_GAPHEIGHT , pixels, TUBE_HEADHEIGHT, GAME_PALETTE[0]);
}
if (t->x <= 0) {
_ksys_draw_bar(0, t->gapY - TUBE_HEADHEIGHT, 1, TUBE_HEADHEIGHT, 0x00FFFF);
_ksys_draw_bar(0, t->gapY + TUBE_GAPHEIGHT , 1, TUBE_HEADHEIGHT, 0x00FFFF);
if (tube_pos[t] < 0) {
int w = -tube_pos[t];
if (w > 2)
w = 2;
_ksys_draw_bar(0, tube_gap[t] - TUBE_HEADHEIGHT, w, TUBE_HEADHEIGHT, GAME_PALETTE[0]);
_ksys_draw_bar(0, tube_gap[t] + TUBE_GAPHEIGHT , w, TUBE_HEADHEIGHT, GAME_PALETTE[0]);
}
int offset = t->x >= 0 ? 0 : -t->x;
int trim = (t->x + TUBE_WIDTH >= WIN_W - (BORDER_WIN + BORDER_WIN))
? WIN_W - t->x - TUBE_WIDTH - (BORDER_WIN + BORDER_WIN) : 0;
int offset = tube_pos[t] >= 0 ? 0 : -tube_pos[t];
int trim = (tube_pos[t] + TUBE_WIDTH >= WIN_W - WIN_S)
? WIN_W - tube_pos[t] - TUBE_WIDTH - WIN_S : 0;
if (offset >= TUBE_WIDTH + trim)
return;
/* top */
for (int y = 0; y < t->gapY - TUBE_HEADHEIGHT; ++y)
_ksys_draw_bitmap(tubeBodyImage + offset,
t->x + offset, y, TUBE_WIDTH - offset + trim, 1);
for (int y = 0; y < tube_gap[t] - TUBE_HEADHEIGHT; ++y)
ksys_draw_bitmap_palette(
TUBE_BODY_IMAGE + offset,
tube_pos[t] + offset, y, TUBE_WIDTH - offset + trim, 1, 8, GAME_PALETTE, 0
);
/* head top */
for (int y = t->gapY - TUBE_HEADHEIGHT; y < t->gapY; ++y)
_ksys_draw_bitmap(tubeHeadImage + TUBE_WIDTH * (y - (t->gapY - TUBE_HEADHEIGHT)) + offset,
t->x + offset, y, TUBE_WIDTH - offset + trim, 1);
for (int y = tube_gap[t] - TUBE_HEADHEIGHT; y < tube_gap[t]; ++y)
ksys_draw_bitmap_palette(
TUBE_HEAD_IMAGE + TUBE_WIDTH * (y - tube_gap[t] + TUBE_HEADHEIGHT) + offset,
tube_pos[t] + offset, y, TUBE_WIDTH - offset + trim, 1, 8, GAME_PALETTE, 0
);
/* head down */
for (int y = t->gapY + TUBE_GAPHEIGHT; y < t->gapY + TUBE_GAPHEIGHT + TUBE_HEADHEIGHT; ++y)
_ksys_draw_bitmap(tubeHeadImage + TUBE_WIDTH * (y - (t->gapY + TUBE_GAPHEIGHT)) + offset,
t->x + offset, y, TUBE_WIDTH - offset + trim, 1);
for (int y = tube_gap[t] + TUBE_GAPHEIGHT; y < tube_gap[t] + TUBE_GAPHEIGHT + TUBE_HEADHEIGHT; ++y)
ksys_draw_bitmap_palette(
TUBE_HEAD_IMAGE + TUBE_WIDTH * (y - tube_gap[t] - TUBE_GAPHEIGHT) + offset,
tube_pos[t] + offset, y, TUBE_WIDTH - offset + trim, 1, 8, GAME_PALETTE, 0
);
/* down */
for (int y = t->gapY + TUBE_GAPHEIGHT + TUBE_HEADHEIGHT; y < WIN_H - BORDER_WIN; ++y)
_ksys_draw_bitmap(tubeBodyImage + offset,
t->x + offset, y, TUBE_WIDTH - offset + trim, 1);
for (int y = tube_gap[t] + TUBE_GAPHEIGHT + TUBE_HEADHEIGHT; y < WIN_H - WIN_B; ++y)
ksys_draw_bitmap_palette(
TUBE_BODY_IMAGE + offset,
tube_pos[t] + offset, y, TUBE_WIDTH - offset + trim, 1, 8, GAME_PALETTE, 0
);
}
/* ===== Globals ===== */
static int loopDelay;
static GameState gameState;
static char scoreString[] = "Score: ";
static bool scoreChanged;
static int score;
static Bird bird;
static int tubeNumber;
static Tube tubes[3];
static int WIN_X;
static int WIN_Y;
/* ===== Functions - Helpers ===== */
static void WriteBorderedText(uint32_t x, uint32_t y, uint8_t fontType, uint32_t textColor,
const char *textPtr, uint32_t textLen, uint32_t borderColor, int borderSize) {
uint32_t bc = ((uint32_t)fontType << 24) | (borderColor & 0x00FFFFFF);
uint32_t tc = ((uint32_t)fontType << 24) | (textColor & 0x00FFFFFF);
for (int bx = x - borderSize; bx <= x + borderSize; bx++) {
for (int by = y - borderSize; by <= y + borderSize; by++) {
_ksys_draw_text(textPtr, bx, by, textLen, bc);
static void WriteBorderedText(int x, int y, const char* textPtr, int textLen, int fontType) {
for (int bx = x + 2; bx >= x - 2; --bx) {
for (int by = y + 2; by >= y - 2; --by) {
_ksys_draw_text(textPtr, bx, by, textLen, fontType);
}
}
_ksys_draw_text(textPtr, x, y, textLen, tc);
_ksys_draw_text(textPtr, x, y, textLen, fontType | 0x00FFFFFF);
}
/* ===== Functions - Game Logic ===== */
static bool checkCollision(const Tube* t) {
return ((t->x <= (BIRD_X + BIRD_W) && t->x + TUBE_WIDTH >= BIRD_X)
&& (bird.y <= t->gapY || bird.y + BIRD_H >= t->gapY + TUBE_GAPHEIGHT));
static inline int checkCollision(int t) {
return ((tube_pos[t] <= (BIRD_X + BIRD_W) && tube_pos[t] + TUBE_WIDTH >= BIRD_X)
&& (bird_pos <= tube_gap[t] || bird_pos + BIRD_H >= tube_gap[t] + TUBE_GAPHEIGHT)) ? 1 : 0;
}
static bool checkAddScore(const Tube* t) {
return (((BIRD_X - (t->x + TUBE_WIDTH)) >> 1) == 0);
static inline int checkAddScore(int t) {
int r = tube_pos[t] + TUBE_WIDTH;
return (r + 2 >= BIRD_X) & (r < BIRD_X);
}
static void updateScoreString(void) {
int temp = score;
int index = 9;
do {
scoreString[index--] = (char)(temp % 10 + '0');
temp /= 10;
} while (temp > 0);
for (int i = 9; i >= 6; --i) {
if (++game_score[i] <= '9') return;
game_score[i] = '0';
}
}
/* ===== Functions - Game Drawing ===== */
static void drawGameWindow(void) {
BORDER_TOP = _ksys_get_skin_height();
_ksys_create_window(WIN_X, WIN_Y, WIN_W, WIN_H + BORDER_TOP, HEADER_STRING, 0x00FFFF, 0x34);
static inline void createGameWindow(void) {
_ksys_create_window(WIN_X, WIN_Y, WIN_W, WIN_H + WIN_T, HEADER_STRING, GAME_PALETTE[0], 0x34);
}
static void redrawGameWindow(void) {
/* cleaning the score area */
if (scoreChanged)
_ksys_draw_bar(8, 8, 122, 18, 0x00FFFF);
if (bird.y > bird.prev_y)
_ksys_draw_bar(BIRD_X, bird.prev_y, BIRD_W, bird.y - bird.prev_y, 0x00FFFF);
else
_ksys_draw_bar(BIRD_X, bird.y + BIRD_H, BIRD_W, bird.prev_y - bird.y, 0x00FFFF);
int move = bird_acc / 10;
if (move < 0)
move = -move;
_ksys_draw_bar(BIRD_X, bird_pos - move, BIRD_W, move * 2 + BIRD_H, GAME_PALETTE[0]);
Bird_draw(&bird);
for (int i = 0; i < tubeNumber; ++i) Tube_draw(&tubes[i]);
ksys_draw_bitmap_palette(BIRD_IMAGE, BIRD_X, bird_pos, BIRD_W, BIRD_H, 8, GAME_PALETTE, 0);
WriteBorderedText(10, 10, 0x81, 0xFFFFFF, scoreString, 0, 0x000000, 2);
Tube_draw(0); Tube_draw(1); Tube_draw(2);
WriteBorderedText(10, 10, game_score, 0, 0x81000000);
}
static void drawGameOverWindow(void) {
BORDER_TOP = _ksys_get_skin_height();
_ksys_create_window(WIN_X, WIN_Y, WIN_W, WIN_H + BORDER_TOP, HEADER_STRING, 0x000000, 0x34);
createGameWindow();
_ksys_draw_text(GAMEOVER_STRING, 116, 100, 0, 0x82FFFFFF);
_ksys_draw_text( scoreString, 136, 154, 0, 0x81FFFFFF);
_ksys_draw_text( SPA_KEY_STRING, 40, 200, 0, 0x81FFFFFF);
_ksys_draw_text( ESC_KEY_STRING, 70, 230, 0, 0x81FFFFFF);
WriteBorderedText(116, 100, GAMEOVER_STRING, 0, 0x82000000);
WriteBorderedText(136, 157, game_score, 0, 0x81000000);
WriteBorderedText( 40, 207, SPA_KEY_STRING, 0, 0x81000000);
WriteBorderedText( 70, 241, ESC_KEY_STRING, 0, 0x81000000);
}
static void drawMenuWindow(void) {
BORDER_TOP = _ksys_get_skin_height();
_ksys_create_window(WIN_X, WIN_Y, WIN_W, WIN_H + BORDER_TOP, HEADER_STRING, 0x00FFFF, 0x34);
createGameWindow();
WriteBorderedText( 88, 34, 0x04, 0xFFFFFF, HEADER_STRING, 6, 0x000000, 2);
WriteBorderedText(188, 87, 0x04, 0xFFFFFF, HEADER_STRING + 7, 4, 0x000000, 2);
WriteBorderedText( 88, 34, HEADER_STRING, 6, 0x04000000);
WriteBorderedText(188, 87, HEADER_STRING + 7, 4, 0x04000000);
// FAST and SLOW mode buttons
_ksys_define_button(50, 158, WIN_W - (BORDER_WIN + BORDER_WIN + 50) - 1, TUBE_WIDTH - 5, 0x6000000A, 0x00);
_ksys_define_button(50, 240, WIN_W - (BORDER_WIN + BORDER_WIN + 50) - 1, TUBE_WIDTH - 5, 0x6000000B, 0x00);
rgb_t* pos = &tubeHeadImage[0];
char* pos = &TUBE_HEAD_IMAGE[0];
for (int x = 50 - 1; x >= 50 - TUBE_HEADHEIGHT; --x) {
for (int y = 156; y < 156 + TUBE_WIDTH; ++y) {
_ksys_draw_pixel(x, y, (pos->red << 16) + (pos->green << 8) + (pos->blue));
_ksys_draw_pixel(x, y + 82, (pos->red << 16) + (pos->green << 8) + (pos->blue));
ksys_draw_bitmap_palette(pos, x, y , 1, 1, 8, GAME_PALETTE, 0);
ksys_draw_bitmap_palette(pos, x, y + 82, 1, 1, 8, GAME_PALETTE, 0);
++pos;
}
}
for (int x = 50; x < WIN_W - (BORDER_WIN + BORDER_WIN); ++x)
for (int x = 50; x < WIN_W - WIN_S; ++x)
{
_ksys_draw_bitmap(tubeBodyImage, x, 156, 1, TUBE_WIDTH);
_ksys_draw_bitmap(tubeBodyImage, x, 238, 1, TUBE_WIDTH);
ksys_draw_bitmap_palette(TUBE_BODY_IMAGE, x, 156, 1, TUBE_WIDTH, 8, GAME_PALETTE, 0);
ksys_draw_bitmap_palette(TUBE_BODY_IMAGE, x, 238, 1, TUBE_WIDTH, 8, GAME_PALETTE, 0);
}
WriteBorderedText(139, 171, 0x82, 0xFFFFFF, FAST_STRING, 0, 0x000000, 2);
WriteBorderedText(139, 253, 0x82, 0xFFFFFF, SLOW_STRING, 0, 0x000000, 2);
WriteBorderedText(139, 171, FAST_STRING, 0, 0x82000000);
WriteBorderedText(139, 253, SLOW_STRING, 0, 0x82000000);
// Control hint
WriteBorderedText(100, 322, 0x81, 0xFFFFFF, CONTROL_STRING, 0, 0x000000, 2);
WriteBorderedText(100, 322, CONTROL_STRING, 0, 0x81000000);
}
/* ===== Functions - Game Main ===== */
static void startGame(void) {
Bird_initialize(&bird);
createGameWindow();
score = 0;
memset((uint8_t*)scoreString + 6, ' ', 3);
updateScoreString();
game_score[7] = game_score[8] = game_score[9] = '0';
tubeNumber = 1;
Tube_randomize(&tubes[0]);
Bird_initialize();
gameState = GAMESTATE_STARTED;
drawGameWindow();
const int spacing = (WIN_W + TUBE_WIDTH) / 3;
for (int i = tube_num - 1; i >= 0; --i) {
Tube_randomize(i);
tube_pos[i] = WIN_W + i * spacing;
}
game_state = GAMESTATE_STARTED;
}
int main(int argc, char **argv) {
_ksys_set_key_input_mode(KSYS_KEY_INPUT_MODE_SCANC);
static void frameGame(void) {
Bird_move();
/* Seed PRNG ? was rtlSrand(kos_GetSystemClock()); */
/* Processing all tubes */
for (int i = tube_num - 1; i >= 0; --i) {
/* Adding score */
if (checkAddScore(i)) {
updateScoreString();
_ksys_draw_bar(92, 8, 38, 18, GAME_PALETTE[0]);
}
/* Check collision with bird */
if (checkCollision(i))
goto game_over;
/* Move tube */
Tube_move(i);
}
/* Checking bird is too high or low */
if (bird_pos + BIRD_H > WIN_H - WIN_B || bird_pos < 0)
goto game_over;
redrawGameWindow();
return;
game_over:
game_state = GAMESTATE_GAMEOVER;
drawGameOverWindow();
return;
}
int main(void) {
/* Setting RNG seed */
ksys_time_t t = _ksys_get_time();
srand((unsigned)(t.val)); // ok for simple tube RNG
game_rng = (int)t.val | 1u;
/* Centering window */
ksys_pos_t screen = _ksys_screen_size();
WIN_X = (screen.x - WIN_W) / 2;
WIN_Y = (screen.y - WIN_H) / 2;
WIN_T = _ksys_get_skin_height();
gameState = GAMESTATE_MENU;
game_state = GAMESTATE_MENU;
for (;;) {
switch (gameState) {
case GAMESTATE_STARTED: {
_ksys_delay(loopDelay);
_ksys_delay(game_speed);
Bird_move(&bird);
/* Adding new tubes */
if ((tubeNumber == 1 || tubeNumber == 2) && (tubes[tubeNumber - 1].x < (WIN_W - WIN_W / 3)))
Tube_randomize(&tubes[tubeNumber++]);
/* Processing all tubes */
scoreChanged = false;
for (int i = 0; i < tubeNumber; ++i) {
/* Adding score */
if (checkAddScore(&tubes[i])) {
++score;
scoreChanged = true;
}
/* Check collision with bird */
if (checkCollision(&tubes[i])) {
gameState = GAMESTATE_GAMEOVER;
continue;
}
/* Move tube */
Tube_move(&tubes[i]);
}
if (scoreChanged) updateScoreString();
/* Checking bird is too high or low */
if (bird.y + BIRD_H > WIN_H - (BORDER_WIN - 1) || bird.y < 0) {
gameState = GAMESTATE_GAMEOVER;
continue;
}
redrawGameWindow();
switch (_ksys_check_event()) {
case KSYS_EVENT_REDRAW:
drawGameWindow();
switch (_ksys_check_event()) {
case KSYS_EVENT_NONE:
if (game_state == GAMESTATE_STARTED)
frameGame();
break;
case KSYS_EVENT_REDRAW: {
switch (game_state) {
case GAMESTATE_MENU: drawMenuWindow(); break;
case GAMESTATE_STARTED: redrawGameWindow(); break;
case GAMESTATE_GAMEOVER: drawGameOverWindow(); break;
}
break;
}
case KSYS_EVENT_KEY: {
ksys_oskey_t k = _ksys_get_key();
if (k.code == KSYS_SCANCODE_SPACE)
Bird_jump(&bird);
} break;
case KSYS_EVENT_BUTTON:
_ksys_exit();
break;
}
} break;
case GAMESTATE_GAMEOVER:
drawGameOverWindow();
switch (_ksys_wait_event()) {
case KSYS_EVENT_REDRAW:
drawGameOverWindow();
break;
case KSYS_EVENT_KEY: {
ksys_oskey_t k = _ksys_get_key();
if (k.code == KSYS_SCANCODE_SPACE)
startGame();
if (k.code == KSYS_SCANCODE_ESC) {
gameState = GAMESTATE_MENU;
drawMenuWindow();
}
} break;
case KSYS_EVENT_BUTTON:
_ksys_exit();
break;
}
break;
case GAMESTATE_MENU:
switch (_ksys_wait_event()) {
case KSYS_EVENT_REDRAW:
drawMenuWindow();
break;
case KSYS_EVENT_KEY: {
ksys_oskey_t k = _ksys_get_key();
if (k.code == KSYS_SCANCODE_1 || k.code == KSYS_SCANCODE_2) {
loopDelay = k.code - 1;
startGame();
}
} break;
case KSYS_EVENT_BUTTON: {
int button = _ksys_get_button();
if (button >= 0x0A) {
loopDelay = button - 0x09;
startGame();
switch (game_state) {
case GAMESTATE_MENU: {
unsigned kc = k.code - 49; // 1 or 2
if (kc <= 1) {
game_speed = kc + 1;
startGame();
}
break;
}
_ksys_exit();
} break;
} break;
case GAMESTATE_STARTED: {
if (k.code == 32) // SPACE
Bird_jump();
break;
}
case GAMESTATE_GAMEOVER: {
if (k.code == 32) // SPACE
startGame();
if (k.code == 27) // ESCAPE
{
game_state = GAMESTATE_MENU;
drawMenuWindow();
}
break;
}
}
break;
}
case KSYS_EVENT_BUTTON:
_ksys_exit();
break;
}
}

View File

@@ -8,154 +8,67 @@
#pragma once
#include <stdint.h>
#include <sys/ksys.h>
#define rgb_hex(rgb) { \
(uint8_t)((rgb) & 0xFF), \
(uint8_t)(((rgb)>>8) & 0xFF), \
(uint8_t)(((rgb)>>16)& 0xFF) \
}
static const rgb_t birdImage[] = {
rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0xC08040),
rgb_hex(0xC08040), rgb_hex(0xC08040), rgb_hex(0x608080), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF),
rgb_hex(0x40C0C0), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0xC08040), rgb_hex(0xE0C080), rgb_hex(0xC08040),
rgb_hex(0xE0C080), rgb_hex(0x806040), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0xC0DCC0), rgb_hex(0xA06040),
rgb_hex(0x80C0C0), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x80C0C0), rgb_hex(0xE0A040), rgb_hex(0xE0E080), rgb_hex(0xE0C080), rgb_hex(0xE0E080),
rgb_hex(0x806040), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0xC08040), rgb_hex(0xE0C080), rgb_hex(0xA06040),
rgb_hex(0x20C0C0), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0xC06040), rgb_hex(0xE0C080), rgb_hex(0xC0A080), rgb_hex(0xC0A080), rgb_hex(0xA0A080), rgb_hex(0x806040),
rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0xC08040), rgb_hex(0xE0C080), rgb_hex(0xE0E080), rgb_hex(0xA06040),
rgb_hex(0x20C0C0), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0xA06040), rgb_hex(0xC08040), rgb_hex(0x800040), rgb_hex(0x800040), rgb_hex(0xE02080), rgb_hex(0xE060C0), rgb_hex(0x40C0C0),
rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0xA06040), rgb_hex(0xC08040), rgb_hex(0xE0E080), rgb_hex(0xC0DCC0), rgb_hex(0xA06040),
rgb_hex(0x20C0C0), rgb_hex(0x20C0C0), rgb_hex(0xC06040), rgb_hex(0x808080), rgb_hex(0xE02080), rgb_hex(0xE020C0), rgb_hex(0xE02080), rgb_hex(0xE0A0C0), rgb_hex(0x804080), rgb_hex(0x40C0C0),
rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0xC08040), rgb_hex(0xE0A040), rgb_hex(0xE0C080), rgb_hex(0xE0E080), rgb_hex(0xFFFBF0), rgb_hex(0x806040),
rgb_hex(0xC06040), rgb_hex(0xC0DCC0), rgb_hex(0x800040), rgb_hex(0xE040C0), rgb_hex(0xE040C0), rgb_hex(0x002040), rgb_hex(0xE0E080), rgb_hex(0xA0A080), rgb_hex(0x404040), rgb_hex(0x404040),
rgb_hex(0x806080), rgb_hex(0x806080), rgb_hex(0xA08080), rgb_hex(0xA06040), rgb_hex(0xE0A040), rgb_hex(0xC08040), rgb_hex(0xE0C080), rgb_hex(0xFFFBF0), rgb_hex(0xC0DCC0), rgb_hex(0xA06040),
rgb_hex(0xC0DCC0), rgb_hex(0xE020C0), rgb_hex(0xE0C080), rgb_hex(0xE0C080), rgb_hex(0xE0E080), rgb_hex(0xE0E000), rgb_hex(0xA0A0A4), rgb_hex(0xC0A080), rgb_hex(0x20A080), rgb_hex(0x40A0C0),
rgb_hex(0x40A0C0), rgb_hex(0x60C0C0), rgb_hex(0x20C0C0), rgb_hex(0xA06040), rgb_hex(0xE0A040), rgb_hex(0xC08040), rgb_hex(0xE0C040), rgb_hex(0xFFFBF0), rgb_hex(0xC0C080), rgb_hex(0x80A040),
rgb_hex(0xC00080), rgb_hex(0xFFFF00), rgb_hex(0xFFFF00), rgb_hex(0xE0E080), rgb_hex(0xC0A040), rgb_hex(0xA0A080), rgb_hex(0x60A080), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF),
rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x80A080), rgb_hex(0xC08040), rgb_hex(0xE0A040), rgb_hex(0xE0A040), rgb_hex(0xE0C080), rgb_hex(0xFFFBF0), rgb_hex(0xC0C0C0), rgb_hex(0xE0C040),
rgb_hex(0xE0E040), rgb_hex(0xC0E000), rgb_hex(0xC0C080), rgb_hex(0xA0A080), rgb_hex(0xC0C0C0), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF),
rgb_hex(0x00FFFF), rgb_hex(0x40C0C0), rgb_hex(0x80A080), rgb_hex(0xE0A040), rgb_hex(0xE0C080), rgb_hex(0xE0C040), rgb_hex(0xE0E080), rgb_hex(0x80E080), rgb_hex(0xC0E000), rgb_hex(0xE0E080),
rgb_hex(0xE0E080), rgb_hex(0xE0E080), rgb_hex(0xC0A080), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF),
rgb_hex(0x00FFFF), rgb_hex(0x40C0C0), rgb_hex(0xA06040), rgb_hex(0xA0C040), rgb_hex(0xA0A040), rgb_hex(0xA0C080), rgb_hex(0xC0E000), rgb_hex(0xC0E000), rgb_hex(0xE0E080), rgb_hex(0xE0E080),
rgb_hex(0xE0E080), rgb_hex(0xE0E080), rgb_hex(0x40C080), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x60E080), rgb_hex(0xC0DCC0),
rgb_hex(0x00FFFF), rgb_hex(0x80C0C0), rgb_hex(0x606080), rgb_hex(0x606080), rgb_hex(0xA0E040), rgb_hex(0xC0E000), rgb_hex(0xE0E000), rgb_hex(0xE0E080), rgb_hex(0xE0E080), rgb_hex(0xE0E080),
rgb_hex(0xC0C040), rgb_hex(0x60A040), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0xC0E080), rgb_hex(0xC0C000), rgb_hex(0xE0E000),
rgb_hex(0xC0DCC0), rgb_hex(0x80A040), rgb_hex(0xA0E040), rgb_hex(0xA0C040), rgb_hex(0xC0E000), rgb_hex(0xE0E080), rgb_hex(0xE0E080), rgb_hex(0xE0E080), rgb_hex(0xC0E000), rgb_hex(0xC0C000),
rgb_hex(0x60A040), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0xA0A0A4), rgb_hex(0xA0A080), rgb_hex(0xA0E040), rgb_hex(0xC0E000),
rgb_hex(0x80A080), rgb_hex(0xA0C040), rgb_hex(0xC0E000), rgb_hex(0xE0E040), rgb_hex(0xE0E080), rgb_hex(0xE0E080), rgb_hex(0xC0E000), rgb_hex(0xA0E040), rgb_hex(0x808040), rgb_hex(0x20C0C0),
rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0xC0E080), rgb_hex(0xE0E000), rgb_hex(0xA0A080), rgb_hex(0x80A080), rgb_hex(0xA0C040),
rgb_hex(0xE0E040), rgb_hex(0xE0E040), rgb_hex(0xE0E040), rgb_hex(0xC0E040), rgb_hex(0xC0E000), rgb_hex(0xA0E040), rgb_hex(0x808040), rgb_hex(0xA0C080), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF),
rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x80A080), rgb_hex(0xA0C000), rgb_hex(0xC0E000), rgb_hex(0xA0E040), rgb_hex(0xA0C040), rgb_hex(0xC0E000),
rgb_hex(0xC0E000), rgb_hex(0xC0E000), rgb_hex(0xC0E000), rgb_hex(0xA0E040), rgb_hex(0x80A040), rgb_hex(0x80C0C0), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF),
rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0xA0C000), rgb_hex(0x6080C0), rgb_hex(0xA0C040), rgb_hex(0xC0E000), rgb_hex(0xC0E000), rgb_hex(0xC0E000), rgb_hex(0xC0E000),
rgb_hex(0xA0C040), rgb_hex(0x80A040), rgb_hex(0x808040), rgb_hex(0xA0C0C0), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF),
rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x80A080), rgb_hex(0xA0C080), rgb_hex(0xC0E000), rgb_hex(0xA0E040), rgb_hex(0xC0E040), rgb_hex(0x808040), rgb_hex(0x808040), rgb_hex(0x808040),
rgb_hex(0xA0C0C0), rgb_hex(0x20C0C0), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF),
rgb_hex(0x00FFFF), rgb_hex(0xA0E080), rgb_hex(0x808040), rgb_hex(0xA0A040), rgb_hex(0x808040), rgb_hex(0x808040), rgb_hex(0x80C0C0), rgb_hex(0xA0C0C0), rgb_hex(0x20C0C0), rgb_hex(0x00FFFF),
rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF)
static const int GAME_PALETTE[77] = {
// Shared colors
0x0000FFFF, 0x00E0E080, 0x00C0C080, 0x0080A040, 0x00A0C040, 0x00A0C080, 0x00A0E040, 0x0060A040,
0x00C0E080,
// Bird-only colors
0x00C08040, 0x00608080, 0x0040C0C0, 0x00E0C080, 0x00806040, 0x00C0DCC0, 0x00A06040, 0x0080C0C0,
0x00E0A040, 0x0020C0C0, 0x00C06040, 0x00C0A080, 0x00A0A080, 0x00800040, 0x00E02080, 0x00E060C0,
0x00808080, 0x00E020C0, 0x00E0A0C0, 0x00804080, 0x00FFFBF0, 0x00E040C0, 0x00002040, 0x00404040,
0x00806080, 0x00A08080, 0x00E0E000, 0x00A0A0A4, 0x0020A080, 0x0040A0C0, 0x0060C0C0, 0x00E0C040,
0x00C00080, 0x00FFFF00, 0x00C0A040, 0x0060A080, 0x0080A080, 0x00C0C0C0, 0x00E0E040, 0x00C0E000,
0x0080E080, 0x00A0A040, 0x0040C080, 0x0060E080, 0x00606080, 0x00C0C040, 0x00C0C000, 0x00808040,
0x00C0E040, 0x00A0C000, 0x006080C0, 0x00A0C0C0, 0x00A0E080,
// Tube-only colors
0x00000000, 0x00608040,
0x0080E040, 0x0080C040, 0x0060A000, 0x0040A000, 0x00408000, 0x00204000, 0x00206000, 0x00200040,
0x00402000, 0x00608000, 0x00406000, 0x0060C000, 0x00402040
};
static const rgb_t tubeBodyImage[] = {
rgb_hex(0x00FFFF), rgb_hex(0x00FFFF), rgb_hex(0x000000), rgb_hex(0x608040), rgb_hex(0x80E040), rgb_hex(0xE0E080), rgb_hex(0xA0E040), rgb_hex(0xA0E040), rgb_hex(0x80C040), rgb_hex(0x80C040),
rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x80E040), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x80E040), rgb_hex(0x80E040), rgb_hex(0x60A000), rgb_hex(0x40A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x40A000), rgb_hex(0x60A000), rgb_hex(0x408000), rgb_hex(0x408000),
rgb_hex(0x204000), rgb_hex(0x60A000), rgb_hex(0x408000), rgb_hex(0x408000), rgb_hex(0x204000), rgb_hex(0x206000), rgb_hex(0x204000), rgb_hex(0x200040), rgb_hex(0x00FFFF), rgb_hex(0x00FFFF)
static const char BIRD_IMAGE[380] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 10, 0, 0, 0, 0, 0, 0, 0,
11, 0, 0, 0, 0, 0, 0, 9, 12, 9, 12, 13, 0, 0, 0, 0, 0, 0, 14, 15,
16, 0, 0, 0, 0, 16, 17, 1, 12, 1, 13, 0, 0, 0, 0, 0, 0, 9, 12, 15,
18, 0, 0, 0, 19, 12, 20, 20, 21, 13, 0, 0, 0, 0, 0, 0, 9, 12, 1, 15,
18, 0, 0, 15, 9, 22, 22, 23, 24, 11, 0, 0, 0, 0, 0, 15, 9, 1, 14, 15,
18, 18, 19, 25, 23, 26, 23, 27, 28, 11, 0, 0, 0, 0, 9, 17, 12, 1, 29, 13,
19, 14, 22, 30, 30, 31, 1, 21, 32, 32, 33, 33, 34, 15, 17, 9, 12, 29, 14, 15,
14, 26, 12, 12, 1, 35, 36, 20, 37, 38, 38, 39, 18, 15, 17, 9, 40, 29, 2, 3,
41, 42, 42, 1, 43, 21, 44, 0, 0, 0, 0, 0, 45, 9, 17, 17, 12, 29, 46, 40,
47, 48, 2, 21, 46, 0, 0, 0, 0, 0, 0, 11, 45, 17, 12, 40, 1, 49, 48, 1,
1, 1, 20, 0, 0, 0, 0, 0, 0, 0, 0, 11, 15, 4, 50, 5, 48, 48, 1, 1,
1, 1, 51, 0, 0, 0, 0, 0, 52, 14, 0, 16, 53, 53, 6, 48, 35, 1, 1, 1,
54, 7, 0, 0, 0, 0, 0, 8, 55, 35, 14, 3, 6, 4, 48, 1, 1, 1, 48, 55,
7, 0, 0, 0, 0, 0, 36, 21, 6, 48, 45, 4, 48, 47, 1, 1, 48, 6, 56, 18,
0, 0, 0, 0, 0, 8, 35, 21, 45, 4, 47, 47, 47, 57, 48, 6, 56, 5, 0, 0,
0, 0, 0, 0, 45, 58, 48, 6, 4, 48, 48, 48, 48, 6, 3, 16, 0, 0, 0, 0,
0, 0, 0, 58, 59, 4, 48, 48, 48, 48, 4, 3, 56, 60, 0, 0, 0, 0, 0, 0,
0, 0, 45, 5, 48, 6, 57, 56, 56, 56, 60, 18, 0, 0, 0, 0, 0, 0, 0, 0,
0, 61, 56, 50, 56, 56, 16, 60, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
static const rgb_t tubeHeadImage[] = {
rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000),
rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000),
rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000),
rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000),
rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040),
rgb_hex(0x402000), rgb_hex(0x408000), rgb_hex(0x408000), rgb_hex(0x608040), rgb_hex(0x80A040), rgb_hex(0xC0C080), rgb_hex(0xC0C080), rgb_hex(0xC0C080), rgb_hex(0xC0C080), rgb_hex(0xC0C080),
rgb_hex(0xC0C080), rgb_hex(0xC0C080), rgb_hex(0xC0C080), rgb_hex(0xC0C080), rgb_hex(0xC0C080), rgb_hex(0xC0C080), rgb_hex(0xC0C080), rgb_hex(0xC0C080), rgb_hex(0xC0C080), rgb_hex(0xC0C080),
rgb_hex(0xC0C080), rgb_hex(0xC0C080), rgb_hex(0xC0C080), rgb_hex(0xC0C080), rgb_hex(0xC0C080), rgb_hex(0xC0C080), rgb_hex(0xC0C080), rgb_hex(0xC0C080), rgb_hex(0xA0C040), rgb_hex(0x60A040),
rgb_hex(0x60A040), rgb_hex(0xA0C080), rgb_hex(0xA0C080), rgb_hex(0x60A040), rgb_hex(0x60A040), rgb_hex(0x80A040), rgb_hex(0x60A040), rgb_hex(0x60A040), rgb_hex(0x60A040), rgb_hex(0x60A040),
rgb_hex(0x60A040), rgb_hex(0x80A040), rgb_hex(0x80A040), rgb_hex(0x80A040), rgb_hex(0x80A040), rgb_hex(0x608000), rgb_hex(0x406000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x402000),
rgb_hex(0x402000), rgb_hex(0x60C000), rgb_hex(0x60C000), rgb_hex(0x80C040), rgb_hex(0xA0E040), rgb_hex(0xE0E080), rgb_hex(0xE0E080), rgb_hex(0xE0E080), rgb_hex(0xE0E080), rgb_hex(0xC0E080),
rgb_hex(0xC0E080), rgb_hex(0xC0E080), rgb_hex(0xE0E080), rgb_hex(0xC0E080), rgb_hex(0xC0E080), rgb_hex(0xC0E080), rgb_hex(0xC0E080), rgb_hex(0xC0E080), rgb_hex(0xC0E080), rgb_hex(0xC0E080),
rgb_hex(0xC0E080), rgb_hex(0xC0E080), rgb_hex(0xC0E080), rgb_hex(0xC0E080), rgb_hex(0xC0E080), rgb_hex(0xC0E080), rgb_hex(0xC0E080), rgb_hex(0xC0E080), rgb_hex(0xC0E080), rgb_hex(0x80C040),
rgb_hex(0x80C040), rgb_hex(0xC0E080), rgb_hex(0xC0E080), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x80E040), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x80E040), rgb_hex(0x80E040),
rgb_hex(0x80E040), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x80E040), rgb_hex(0x60A000), rgb_hex(0x408000), rgb_hex(0x206000), rgb_hex(0x206000), rgb_hex(0x402000),
rgb_hex(0x402040), rgb_hex(0x80E040), rgb_hex(0x80E040), rgb_hex(0xC0E080), rgb_hex(0xE0E080), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x40A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x80E040), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000),
rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000),
rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000),
rgb_hex(0x40A000), rgb_hex(0x204000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x60A000), rgb_hex(0x206000), rgb_hex(0x204000), rgb_hex(0x206000), rgb_hex(0x206000), rgb_hex(0x402000),
rgb_hex(0x402040), rgb_hex(0x80E040), rgb_hex(0x80E040), rgb_hex(0xC0E080), rgb_hex(0xE0E080), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x80E040), rgb_hex(0x60A000), rgb_hex(0x40A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x206000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x60A000), rgb_hex(0x206000), rgb_hex(0x206000), rgb_hex(0x206000), rgb_hex(0x206000), rgb_hex(0x402000),
rgb_hex(0x402040), rgb_hex(0x80E040), rgb_hex(0x80E040), rgb_hex(0xC0E080), rgb_hex(0xE0E080), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x80E040), rgb_hex(0x60A000), rgb_hex(0x40A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x206000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x60A000), rgb_hex(0x206000), rgb_hex(0x204000), rgb_hex(0x206000), rgb_hex(0x206000), rgb_hex(0x402000),
rgb_hex(0x402040), rgb_hex(0x80E040), rgb_hex(0x80E040), rgb_hex(0xC0E080), rgb_hex(0xE0E080), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x80E040), rgb_hex(0x60A000), rgb_hex(0x40A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x206000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x60A000), rgb_hex(0x206000), rgb_hex(0x204000), rgb_hex(0x206000), rgb_hex(0x206000), rgb_hex(0x402000),
rgb_hex(0x402040), rgb_hex(0x80E040), rgb_hex(0x80E040), rgb_hex(0xC0E080), rgb_hex(0xE0E080), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x80E040), rgb_hex(0x60A000), rgb_hex(0x40A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x206000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x60A000), rgb_hex(0x206000), rgb_hex(0x204000), rgb_hex(0x206000), rgb_hex(0x206000), rgb_hex(0x402000),
rgb_hex(0x402040), rgb_hex(0x80E040), rgb_hex(0x80E040), rgb_hex(0xC0E080), rgb_hex(0xE0E080), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x80E040), rgb_hex(0x60A000), rgb_hex(0x40A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x206000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x60A000), rgb_hex(0x206000), rgb_hex(0x204000), rgb_hex(0x206000), rgb_hex(0x206000), rgb_hex(0x402000),
rgb_hex(0x402040), rgb_hex(0x80E040), rgb_hex(0x80E040), rgb_hex(0xC0E080), rgb_hex(0xE0E080), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x80E040), rgb_hex(0x60A000), rgb_hex(0x40A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x206000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x60A000), rgb_hex(0x206000), rgb_hex(0x204000), rgb_hex(0x206000), rgb_hex(0x206000), rgb_hex(0x402000),
rgb_hex(0x402040), rgb_hex(0x80E040), rgb_hex(0x80E040), rgb_hex(0xC0E080), rgb_hex(0xE0E080), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x80E040), rgb_hex(0x60A000), rgb_hex(0x40A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x206000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x60A000), rgb_hex(0x206000), rgb_hex(0x204000), rgb_hex(0x206000), rgb_hex(0x206000), rgb_hex(0x402000),
rgb_hex(0x402040), rgb_hex(0x80E040), rgb_hex(0x80E040), rgb_hex(0xC0E080), rgb_hex(0xE0E080), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x80E040), rgb_hex(0x60A000), rgb_hex(0x40A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x206000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x60A000), rgb_hex(0x206000), rgb_hex(0x204000), rgb_hex(0x206000), rgb_hex(0x206000), rgb_hex(0x402000),
rgb_hex(0x402040), rgb_hex(0x80E040), rgb_hex(0x80E040), rgb_hex(0xC0E080), rgb_hex(0xE0E080), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x80E040), rgb_hex(0x60A000), rgb_hex(0x40A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x206000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x60A000), rgb_hex(0x206000), rgb_hex(0x204000), rgb_hex(0x206000), rgb_hex(0x206000), rgb_hex(0x402000),
rgb_hex(0x402040), rgb_hex(0x80E040), rgb_hex(0x80E040), rgb_hex(0xC0E080), rgb_hex(0xE0E080), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x80C040), rgb_hex(0x40A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x80E040), rgb_hex(0x60A000), rgb_hex(0x40A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000),
rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000),
rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000), rgb_hex(0x40A000),
rgb_hex(0x60A000), rgb_hex(0x206000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x60A000), rgb_hex(0x206000), rgb_hex(0x204000), rgb_hex(0x206000), rgb_hex(0x206000), rgb_hex(0x402000),
rgb_hex(0x402040), rgb_hex(0x80E040), rgb_hex(0x80E040), rgb_hex(0xC0E080), rgb_hex(0xE0E080), rgb_hex(0x80E040), rgb_hex(0x80E040), rgb_hex(0x80E040), rgb_hex(0x80E040), rgb_hex(0x60A000),
rgb_hex(0x60C000), rgb_hex(0x60C000), rgb_hex(0xA0E040), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000), rgb_hex(0x60A000),
rgb_hex(0x60A000), rgb_hex(0x206000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x60A000), rgb_hex(0x206000), rgb_hex(0x204000), rgb_hex(0x206000), rgb_hex(0x206000), rgb_hex(0x402000),
rgb_hex(0x402000), rgb_hex(0x408000), rgb_hex(0x408000), rgb_hex(0x608000), rgb_hex(0x608040), rgb_hex(0x408000), rgb_hex(0x408000), rgb_hex(0x408000), rgb_hex(0x408000), rgb_hex(0x406000),
rgb_hex(0x408000), rgb_hex(0x408000), rgb_hex(0x408000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x406000),
rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x406000),
rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x406000), rgb_hex(0x406000),
rgb_hex(0x406000), rgb_hex(0x206000), rgb_hex(0x206000), rgb_hex(0x206000), rgb_hex(0x406000), rgb_hex(0x206000), rgb_hex(0x206000), rgb_hex(0x206000), rgb_hex(0x206000), rgb_hex(0x402000),
rgb_hex(0x402000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000),
rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000),
rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000),
rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000),
rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x204000), rgb_hex(0x206000), rgb_hex(0x206000), rgb_hex(0x402000),
rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000),
rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x000000), rgb_hex(0x000000), rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040),
rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040),
rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040),
rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040), rgb_hex(0x200040)
};
static const char TUBE_BODY_IMAGE[50] = {
0, 0, 62, 63, 64, 1, 6, 6, 65, 65, 65, 65, 64, 66, 66, 64, 64, 66, 67, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 67, 66, 68, 68, 69, 66, 68, 68, 69, 70, 69, 71, 0, 0
};
static const char TUBE_HEAD_IMAGE[900] = {
71, 71, 71, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 71, 71, 71, 71, 71,
72, 68, 68, 63, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 7, 7, 5, 5, 7, 7, 3, 7, 7, 7, 7, 7, 3, 3, 3, 3, 73, 74, 69, 69, 72,
72, 75, 75, 65, 6, 1, 1, 1, 1, 8, 8, 8, 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 65, 65, 8, 8, 65, 65, 64, 65, 65, 64, 64, 64, 65, 65, 65, 64, 66, 68, 70, 70, 72,
76, 64, 64, 8, 1, 65, 65, 65, 65, 67, 66, 66, 64, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 69, 74, 74, 66, 70, 69, 70, 70, 72,
76, 64, 64, 8, 1, 65, 65, 65, 65, 66, 66, 66, 64, 66, 67, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 70, 74, 74, 66, 70, 70, 70, 70, 72,
76, 64, 64, 8, 1, 65, 65, 65, 65, 66, 66, 66, 64, 66, 67, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 70, 74, 74, 66, 70, 69, 70, 70, 72,
76, 64, 64, 8, 1, 65, 65, 65, 65, 66, 66, 66, 64, 66, 67, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 70, 74, 74, 66, 70, 69, 70, 70, 72,
76, 64, 64, 8, 1, 65, 65, 65, 65, 66, 66, 66, 64, 66, 67, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 70, 74, 74, 66, 70, 69, 70, 70, 72,
76, 64, 64, 8, 1, 65, 65, 65, 65, 66, 66, 66, 64, 66, 67, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 70, 74, 74, 66, 70, 69, 70, 70, 72,
76, 64, 64, 8, 1, 65, 65, 65, 65, 66, 66, 66, 64, 66, 67, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 70, 74, 74, 66, 70, 69, 70, 70, 72,
76, 64, 64, 8, 1, 65, 65, 65, 65, 66, 66, 66, 64, 66, 67, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 70, 74, 74, 66, 70, 69, 70, 70, 72,
76, 64, 64, 8, 1, 65, 65, 65, 65, 66, 66, 66, 64, 66, 67, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 70, 74, 74, 66, 70, 69, 70, 70, 72,
76, 64, 64, 8, 1, 65, 65, 65, 65, 66, 66, 66, 64, 66, 67, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 70, 74, 74, 66, 70, 69, 70, 70, 72,
76, 64, 64, 8, 1, 65, 65, 65, 65, 67, 66, 66, 64, 66, 67, 66, 66, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 66, 70, 74, 74, 66, 70, 69, 70, 70, 72,
76, 64, 64, 8, 1, 64, 64, 64, 64, 66, 75, 75, 6, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 70, 74, 74, 66, 70, 69, 70, 70, 72,
72, 68, 68, 73, 63, 68, 68, 68, 68, 74, 68, 68, 68, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 70, 70, 70, 74, 70, 70, 70, 70, 72,
72, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 70, 70, 72,
71, 71, 71, 71, 62, 62, 62, 62, 62, 62, 62, 62, 62, 71, 71, 62, 62, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71
};