apps/flpybird: optimization and tweaks
This commit is contained in:
@@ -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%">
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user