Adding applications/justget10 demo

remotes/origin_old/ugfx_release_2.6
Joel Bodenmann 2016-07-27 16:34:41 +02:00
parent 2fe5c112b0
commit 85ec38ac1c
92 changed files with 26617 additions and 0 deletions

View File

@ -0,0 +1,9 @@
DEMODIR = $(GFXLIB)/demos/applications/justget10
GFXINC += $(DEMODIR) \
$(DEMODIR)/resources/romfs
GFXSRC += $(DEMODIR)/main.c \
$(DEMODIR)/jg10.c
DEFS += -DJG10_SHOW_SPLASH=TRUE

View File

@ -0,0 +1,95 @@
/*
* Copyright (c) 2012, 2013, Joel Bodenmann aka Tectu <joel@unormal.org>
* Copyright (c) 2012, 2013, Andrew Hannam aka inmarket
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the <organization> nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _GFXCONF_H
#define _GFXCONF_H
/* GFX sub-systems to turn on */
#define GFX_USE_GDISP TRUE
#define GFX_USE_GEVENT TRUE
#define GFX_USE_GTIMER TRUE
#define GFX_USE_GINPUT TRUE
#define GFX_USE_GFILE TRUE
#define GFILE_NEED_ROMFS TRUE
#define GFILE_MAX_GFILES 24
/* Features for the GDISP sub-system. */
#define GDISP_NEED_CONTROL TRUE
#define GDISP_NEED_VALIDATION TRUE
#define GDISP_NEED_CLIP TRUE
#define GDISP_NEED_TEXT TRUE
#define GDISP_NEED_MULTITHREAD TRUE
#define GDISP_NEED_IMAGE TRUE
#define GDISP_NEED_IMAGE_BMP TRUE
#define GDISP_NEED_CIRCLE TRUE
#define GDISP_NEED_ELLIPSE TRUE
#define GDISP_NEED_ARC TRUE
#define GDISP_NEED_STARTUP_LOGO FALSE
//////////////////
#define GFX_USE_GWIN TRUE
#define GWIN_NEED_WINDOWMANAGER TRUE
#define GQUEUE_NEED_ASYNC TRUE
#define GFX_USE_GQUEUE TRUE
#define GWIN_REDRAW_IMMEDIATE TRUE
#define GWIN_REDRAW_SINGLEOP TRUE
#define GWIN_NEED_WIDGET TRUE
#define GWIN_NEED_BUTTON TRUE
#define GWIN_BUTTON_LAZY_RELEASE FALSE
#define GWIN_NEED_SLIDER TRUE
#define GWIN_FLAT_STYLING FALSE
#define GWIN_NEED_CONTAINERS TRUE
#define GWIN_NEED_CONTAINER TRUE
#define GWIN_NEED_FRAME FALSE
#define GWIN_NEED_TABSET FALSE
#define GWIN_NEED_CONSOLE TRUE
#define GWIN_CONSOLE_USE_HISTORY TRUE
#define GWIN_CONSOLE_HISTORY_AVERAGING TRUE
#define GWIN_CONSOLE_HISTORY_ATCREATE TRUE
#define GWIN_CONSOLE_ESCSEQ TRUE
#define GWIN_CONSOLE_USE_BASESTREAM TRUE
#define GWIN_NEED_GRAPH TRUE
/* Builtin Fonts */
#define GDISP_INCLUDE_FONT_DEJAVUSANS16 TRUE
/* Features for the GINPUT sub-system. */
#define GINPUT_NEED_MOUSE TRUE
#endif /* _GFXCONF_H */

View File

@ -0,0 +1,501 @@
#include "gfx.h"
#include "src/gwin/gwin_class.h"
#include "stdlib.h"
#include "string.h"
#include "jg10.h"
GEventMouse ev;
GHandle mainWin, Jg10SelectWidget;
typedef struct jg10WidgetObject_t {
GWidgetObject w; // Base Class
} jg10WidgetObject;
GHandle jg10SelectionWidgetGCreate(GDisplay* g, jg10WidgetObject* wo, GWidgetInit* pInit);
#define jg10SelectionWidgetCreate(wo, pInit) jg10SelectionWidgetGCreate(GDISP, wo, pInit)
typedef struct { // Node properties
uint8_t num; // Node number
bool_t check; // Node needs to be checked or not
bool_t sel; // Node selected or not
} nodeProps;
nodeProps jg10Field[JG10_FIELD_WIDTH][JG10_FIELD_HEIGHT]; // jg10 field array
bool_t jg10GameOver = FALSE;
const char *jg10Graph[] = {"background.bmp", "1.bmp","2.bmp","3.bmp","4.bmp","5.bmp","6.bmp","7.bmp","8.bmp", "9.bmp", "10.bmp", "11.bmp", "12.bmp", "13.bmp", "14.bmp", "15.bmp", "16.bmp", "17.bmp", "18.bmp", "19.bmp", "20.bmp"}; // 21 elements (0-20)
gdispImage jg10Image[JG10_MAX_COUNT];
#define JG10_ANIM_IMAGES 5
#define JG10_ANIM_DELAY 60
const char *jg10GraphAnim[] = {"a1.bmp","a2.bmp","a3.bmp","a4.bmp","background.bmp"}; // 5 elements (0-4)
gdispImage jg10ImageAnim[JG10_ANIM_IMAGES];
uint8_t jg10MaxVal=4; // Max value in field...
font_t font;
#if JG10_SHOW_SPLASH
GTimer jg10SplashBlink;
bool_t jg10SplashTxtVisible = FALSE;
gdispImage jg10SplashImage;
#endif
static void initRng(void) {
srand(gfxSystemTicks());
}
static uint32_t randomInt(uint32_t max) {
return rand() % max;
}
static int uitoa(unsigned int value, char * buf, int max) {
int n = 0;
int i = 0;
int tmp = 0;
if (!buf) return -3;
if (2 > max) return -4;
i=1;
tmp = value;
if (0 > tmp) {
tmp *= -1;
i++;
}
for (;;) {
tmp /= 10;
if (0 >= tmp) break;
i++;
}
if (i >= max) {
buf[0] = '?';
buf[1] = 0x0;
return 2;
}
n = i;
tmp = value;
if (0 > tmp) {
tmp *= -1;
}
buf[i--] = 0x0;
for (;;) {
buf[i--] = (tmp % 10) + '0';
tmp /= 10;
if (0 >= tmp) break;
}
if (-1 != i) {
buf[i--] = '-';
}
return n;
}
static bool_t inRange(int16_t x, int16_t y) {
if ((x >= 0) && (x < JG10_FIELD_WIDTH) && (y >= 0) && (y < JG10_FIELD_HEIGHT)) return TRUE; else return FALSE;
}
static void clean_SelCheck(void) {
uint16_t i ,j;
for (i = 0; i < JG10_FIELD_WIDTH; i++) {
for (j = 0; j < JG10_FIELD_HEIGHT; j++) {
jg10Field[i][j].check = FALSE;
jg10Field[i][j].sel = FALSE;
}
}
}
static void remove_Selected(void) {
uint16_t i ,j, step;
systemticks_t delay_start = 0;
systemticks_t delay=0;
for (step = 0; step < JG10_ANIM_IMAGES; step++) {
delay_start = gfxSystemTicks();
for (i = 0; i < JG10_FIELD_WIDTH; i++) {
for (j = 0; j < JG10_FIELD_HEIGHT; j++) {
if (jg10Field[i][j].sel) {
gdispImageDraw(&jg10ImageAnim[step], (i*JG10_CELL_HEIGHT)+1, (j*JG10_CELL_WIDTH)+1, JG10_CELL_WIDTH, JG10_CELL_HEIGHT, 0, 0);
}
}
}
delay = gfxSystemTicks()-delay_start;
if (delay <= JG10_ANIM_DELAY) {
gfxSleepMilliseconds(JG10_ANIM_DELAY-delay);
}
}
for (i = 0; i < JG10_FIELD_WIDTH; i++) {
for (j = 0; j < JG10_FIELD_HEIGHT; j++) {
if (jg10Field[i][j].sel) {
jg10Field[i][j].sel = FALSE;
jg10Field[i][j].num = 0;
}
}
}
// gwinRedraw(mainWin);
}
static uint8_t jg10_randomer(uint8_t max, uint8_t th) {
uint32_t r = randomInt((1<<max)-1);
if (r != 0) {
for (int8_t i = max; i >= 0; i--) {
if (r >= (uint32_t)(1<<i)) {
if ((max-i) >= th) {
return randomInt(max-i)+1;
} else {
return randomInt(th)+1;
}
}
}
}
return randomInt(max-1)+1;
}
static void movePiecesDown(void) {
uint8_t tmp = 0;
bool_t needToCheck = TRUE;
while (needToCheck) {
needToCheck = FALSE;
for (int8_t y = (JG10_FIELD_HEIGHT-1); y >= 0; y--) {
for (uint8_t x = 0; x < JG10_FIELD_WIDTH; x++) {
if (jg10Field[x][y].num == 0) {
// check if there is at least single none empty piece
tmp = 0;
for (int8_t tmpy = y; tmpy >= 0; tmpy--) {
if (jg10Field[x][tmpy].num != 0) tmp++;
}
if (tmp != 0) {
for (int8_t tmpy = y; tmpy > 0; tmpy--) {
jg10Field[x][tmpy].num = jg10Field[x][tmpy-1].num;
}
jg10Field[x][0].num = 0;
needToCheck = TRUE;
}
}
}
}
}
gwinRedraw(mainWin);
// Add new pieces
needToCheck = TRUE;
while (needToCheck) {
needToCheck = FALSE;
for (int8_t y = (JG10_FIELD_HEIGHT-1); y >= 0; y--) {
for (uint8_t x = 0; x < JG10_FIELD_WIDTH; x++) {
if (jg10Field[x][y].num == 0) {
for (int8_t tmpy = y; tmpy > 0; tmpy--) {
jg10Field[x][tmpy].num = jg10Field[x][tmpy-1].num;
}
jg10Field[x][0].num = jg10_randomer(jg10MaxVal, 3);
needToCheck = TRUE;
}
}
}
gwinRedraw(mainWin);
gfxSleepMilliseconds(50);
}
}
static bool_t checkForPossibleMove(void) {
bool_t canMove = FALSE;
uint16_t i ,j;
for (i = 0; i < JG10_FIELD_WIDTH; i++) {
for (j = 0; j < JG10_FIELD_HEIGHT; j++) {
if ((inRange(i,j-1) && jg10Field[i][j-1].num == jg10Field[i][j].num) ||
(inRange(i-1,j) && jg10Field[i-1][j].num == jg10Field[i][j].num) ||
(inRange(i,j+1) && jg10Field[i][j+1].num == jg10Field[i][j].num) ||
(inRange(i+1,j) && jg10Field[i+1][j].num == jg10Field[i][j].num)) {
canMove = TRUE;
return canMove;
}
}
}
return canMove;
}
static void printGameOver(void) {
gdispFillArea(JG10_TOTAL_FIELD_WIDTH, (gdispGetHeight()/2)-10, gdispGetWidth()-JG10_TOTAL_FIELD_WIDTH, 80, Black);
if (jg10GameOver) {
gdispDrawString(JG10_TOTAL_FIELD_WIDTH+((gdispGetWidth()-JG10_TOTAL_FIELD_WIDTH)/2)-(gdispGetStringWidth("Game Over", font)/2), gdispGetHeight()/2, "Game Over", font, White);
}
}
static void printCongrats(void) {
char pps_str[3];
gdispFillArea(JG10_TOTAL_FIELD_WIDTH, (gdispGetHeight()/2)-10, gdispGetWidth()-JG10_TOTAL_FIELD_WIDTH, 80, Black);
gdispDrawString(JG10_TOTAL_FIELD_WIDTH+((gdispGetWidth()-JG10_TOTAL_FIELD_WIDTH)/2)-(gdispGetStringWidth("Congrats, now try to get", font)/2), gdispGetHeight()/2, "Congrats, now try to get", font, White);
uitoa(jg10MaxVal+1, pps_str, sizeof(pps_str));
gdispDrawString(JG10_TOTAL_FIELD_WIDTH+((gdispGetWidth()-JG10_TOTAL_FIELD_WIDTH)/2)-(gdispGetStringWidth(pps_str, font)/2), (gdispGetHeight()/2)+20, pps_str, font, Red);
}
static DECLARE_THREAD_FUNCTION(thdJg10, msg) {
(void)msg;
uint16_t x,y;
while (!jg10GameOver) {
srand(gfxSystemTicks());
ginputGetMouseStatus(0, &ev);
if (ev.buttons & GINPUT_MOUSE_BTN_LEFT) {
x = ev.x/JG10_CELL_WIDTH;
y = ev.y/JG10_CELL_HEIGHT;
if (x < JG10_FIELD_WIDTH && y < JG10_FIELD_HEIGHT) {
while (ev.buttons & GINPUT_MOUSE_BTN_LEFT) { // Wait until release
ginputGetMouseStatus(0, &ev);
}
if (!jg10Field[x][y].sel) {
// Check if we have at least two
if ((inRange(x,y-1) && jg10Field[x][y-1].num == jg10Field[x][y].num) ||
(inRange(x-1,y) && jg10Field[x-1][y].num == jg10Field[x][y].num) ||
(inRange(x,y+1) && jg10Field[x][y+1].num == jg10Field[x][y].num) ||
(inRange(x+1,y) && jg10Field[x+1][y].num == jg10Field[x][y].num)) {
gwinSetVisible(Jg10SelectWidget, FALSE);
clean_SelCheck();
jg10Field[x][y].check = TRUE;
gwinSetVisible(Jg10SelectWidget, TRUE);
}
} else {
// already selected section clicked...
jg10Field[x][y].num++;
if (jg10Field[x][y].num > jg10MaxVal) {
jg10MaxVal = jg10Field[x][y].num;
if (jg10MaxVal >= 10) printCongrats();
if (jg10MaxVal == 20) { // Just in case someone got so far :D I cannot imaginge though
jg10GameOver = TRUE;
printGameOver();
}
}
jg10Field[x][y].sel = FALSE;
gwinSetVisible(Jg10SelectWidget, FALSE);
remove_Selected();
movePiecesDown();
if (checkForPossibleMove()) {
clean_SelCheck();
//gwinRedraw(mainWin);
} else {
jg10GameOver = TRUE;
printGameOver();
}
}
}
}
}
THREAD_RETURN(0);
}
static void initField(void) {
jg10MaxVal = 4;
for (uint8_t x = 0; x < JG10_FIELD_WIDTH; x++) {
for (uint8_t y = 0; y < JG10_FIELD_HEIGHT; y++) {
jg10Field[x][y].num = randomInt(jg10MaxVal)+1;
//jg10Field[x][y].num = 1; // good for animation testing
//jg10Field[x][y].num = x+x+5; // good to get high score fast
//jg10Field[x][y].num = x+y+5; // good demo to check out pieces :D
jg10Field[x][y].check = FALSE;
jg10Field[x][y].sel = FALSE;
}
}
jg10GameOver = FALSE;
printGameOver();
}
static void mainWinDraw(GWidgetObject* gw, void* param) {
(void)param;
for (uint8_t x = 0; x < JG10_FIELD_WIDTH; x++) {
for (uint8_t y = 0; y < JG10_FIELD_HEIGHT; y++) {
gdispGImageDraw(gw->g.display, &jg10Image[jg10Field[x][y].num], (x*JG10_CELL_HEIGHT)+1, (y*JG10_CELL_WIDTH)+1, JG10_CELL_WIDTH, JG10_CELL_HEIGHT, 0, 0);
}
}
}
static void jg10SelectionWidget_Draw(GWidgetObject* gw, void* param) {
int16_t x, y;
bool_t needToCheck = TRUE;
(void)param;
while (needToCheck) {
needToCheck = FALSE;
for (x = 0; x < JG10_FIELD_WIDTH; x++) {
for (y = 0; y < JG10_FIELD_HEIGHT; y++) {
if (jg10Field[x][y].check && !jg10Field[x][y].sel) {
jg10Field[x][y].sel = TRUE;
jg10Field[x][y].check = FALSE;
// Up
if (inRange(x, y-1) && !jg10Field[x][y-1].sel && (jg10Field[x][y-1].num == jg10Field[x][y].num)) {
jg10Field[x][y-1].check = TRUE;
needToCheck = TRUE;
} else if (!inRange(x, y-1) || (inRange(x, y-1) && !jg10Field[x][y-1].sel)) {
// We need longer line if this is wide corner inside shape
if (inRange(x+1, y) && inRange(x+1, y-1) && (jg10Field[x][y].num == jg10Field[x+1][y].num) && (jg10Field[x][y].num == jg10Field[x+1][y-1].num)) {
gdispGFillArea(gw->g.display, (x*JG10_CELL_WIDTH)+1, (y*JG10_CELL_HEIGHT)+1, JG10_CELL_WIDTH+2, 2, JG10_SEL_COLOR);
} else {
gdispGFillArea(gw->g.display, (x*JG10_CELL_WIDTH)+1, (y*JG10_CELL_HEIGHT)+1, JG10_CELL_WIDTH, 2, JG10_SEL_COLOR);
}
}
// Down
if (inRange(x, y+1) && !jg10Field[x][y+1].sel && (jg10Field[x][y+1].num == jg10Field[x][y].num)) {
jg10Field[x][y+1].check = TRUE;
needToCheck = TRUE;
} else if (!inRange(x, y+1) || (inRange(x, y+1) && !jg10Field[x][y+1].sel)) {
// We need longer line if this is wide corner inside shape
if (inRange(x-1, y) && inRange(x-1, y+1) && (jg10Field[x][y].num == jg10Field[x-1][y].num) && (jg10Field[x][y].num == jg10Field[x-1][y+1].num)) {
gdispGFillArea(gw->g.display, (x*JG10_CELL_WIDTH)-1, ((y+1)*JG10_CELL_HEIGHT)-1, JG10_CELL_WIDTH+2, 2, JG10_SEL_COLOR);
} else {
gdispGFillArea(gw->g.display, (x*JG10_CELL_WIDTH)+1, ((y+1)*JG10_CELL_HEIGHT)-1, JG10_CELL_WIDTH, 2, JG10_SEL_COLOR);
}
}
// Left
if (inRange(x-1, y) && !jg10Field[x-1][y].sel && (jg10Field[x-1][y].num == jg10Field[x][y].num)) {
jg10Field[x-1][y].check = TRUE;
needToCheck = TRUE;
} else if (!inRange(x-1, y) || (inRange(x-1, y) && !jg10Field[x-1][y].sel)) {
// We need longer line if this is wide corner inside shape
if (inRange(x, y-1) && inRange(x-1, y-1) && (jg10Field[x][y].num == jg10Field[x][y-1].num) && (jg10Field[x][y].num == jg10Field[x-1][y-1].num)) {
gdispGFillArea(gw->g.display, (x*JG10_CELL_WIDTH)+1, (y*JG10_CELL_HEIGHT)-1, 2, JG10_CELL_HEIGHT+2, JG10_SEL_COLOR);
} else {
gdispGFillArea(gw->g.display, (x*JG10_CELL_WIDTH)+1, (y*JG10_CELL_HEIGHT)+1, 2, JG10_CELL_HEIGHT, JG10_SEL_COLOR);
}
}
// Right
if (inRange(x+1, y) && !jg10Field[x+1][y].sel && (jg10Field[x+1][y].num == jg10Field[x][y].num)) {
jg10Field[x+1][y].check = TRUE;
needToCheck = TRUE;
} else if (!inRange(x+1, y) || (inRange(x+1, y) && !jg10Field[x+1][y].sel)) {
// We need longer line if this is wide corner inside shape
if (inRange(x, y+1) && inRange(x+1, y+1) && (jg10Field[x][y].num == jg10Field[x][y+1].num) && (jg10Field[x][y].num == jg10Field[x+1][y+1].num)) {
gdispGFillArea(gw->g.display, ((x+1)*JG10_CELL_WIDTH)-1, (y*JG10_CELL_HEIGHT)+1, 2, JG10_CELL_HEIGHT+2, JG10_SEL_COLOR);
} else {
gdispGFillArea(gw->g.display, ((x+1)*JG10_CELL_WIDTH)-1, (y*JG10_CELL_HEIGHT)+1, 2, JG10_CELL_HEIGHT, JG10_SEL_COLOR);
}
}
}
}
}
}
}
static const gwidgetVMT jg10SelectionWidgetVMT = {
{
"jg10SelectionWidget", // The classname
sizeof(jg10WidgetObject), // The object size
_gwidgetDestroy, // The destroy routine
_gwidgetRedraw, // The redraw routine
0, // The after-clear routine
},
jg10SelectionWidget_Draw, // The default drawing routine
#if GINPUT_NEED_MOUSE
{
0, // Process mouse down events
0, // Process mouse up events
0, // Process mouse move events
},
#endif
#if GINPUT_NEED_KEYBOARD || GWIN_NEED_KEYBOARD
{
0 // Process keyboard events
},
#endif
#if GINPUT_NEED_TOGGLE
{
0, // Toggle role
0, // Assign Toggles
0, // Get Toggles
0, // Process toggle off events
0, // Process toggle on events
},
#endif
#if GINPUT_NEED_DIAL
{
0, // No dial roles
0, // Assign Dials
0, // Get Dials
0, // Process dial move events
},
#endif
};
GHandle jg10SelectionWidgetGCreate(GDisplay* g, jg10WidgetObject* wo, GWidgetInit* pInit) {
if (!(wo = (jg10WidgetObject*)_gwidgetCreate(g, &wo->w, pInit, &jg10SelectionWidgetVMT))) {
return 0;
}
gwinSetVisible((GHandle)wo, pInit->g.show);
return (GHandle)wo;
}
static void createMainWin(void) {
GWidgetInit wi;
gwinWidgetClearInit(&wi);
// Container - mainWin
wi.g.show = FALSE;
wi.g.x = 0;
wi.g.y = 0;
wi.g.width = gdispGetWidth();
wi.g.height = gdispGetHeight();
wi.g.parent = 0;
wi.text = "Container";
wi.customDraw = mainWinDraw;
wi.customParam = 0;
wi.customStyle = 0;
mainWin = gwinContainerCreate(0, &wi, 0);
// create selection widget
wi.g.show = FALSE;
wi.g.x = 0;
wi.g.y = 0;
wi.g.width = 272;
wi.g.height = 480;
wi.g.parent = mainWin;
wi.customDraw = jg10SelectionWidget_Draw;
Jg10SelectWidget = jg10SelectionWidgetCreate(0, &wi);
}
void guiCreate(void) {
GWidgetInit wi;
gwinWidgetClearInit(&wi);
createMainWin();
gwinHide(mainWin);
gwinShow(mainWin);
}
void jg10Start(void) {
#if JG10_SHOW_SPLASH
gtimerStop(&jg10SplashBlink);
gdispClear(Black);
#endif
initField();
guiCreate();
gfxThreadCreate(0, 1024, NORMAL_PRIORITY, thdJg10, 0);
while (!jg10GameOver) {
gfxSleepMilliseconds(100);
}
}
void jg10Init(void) {
initRng();
for (uint8_t i = 0; i < JG10_MAX_COUNT; i++) {
gdispImageOpenFile(&jg10Image[i], jg10Graph[i]);
gdispImageCache(&jg10Image[i]);
}
for (uint8_t i = 0; i < JG10_ANIM_IMAGES; i++) {
gdispImageOpenFile(&jg10ImageAnim[i], jg10GraphAnim[i]);
gdispImageCache(&jg10ImageAnim[i]);
}
font = gdispOpenFont("DejaVuSans16_aa");
}
#if JG10_SHOW_SPLASH
static void jg10SplashBlinker(void* arg) {
(void)arg;
jg10SplashTxtVisible = !jg10SplashTxtVisible;
if (jg10SplashTxtVisible) {
gdispImageOpenFile(&jg10SplashImage, "splashtxt.bmp");
} else {
gdispImageOpenFile(&jg10SplashImage, "splashclr.bmp");
}
gdispImageDraw(&jg10SplashImage, (gdispGetWidth()/2)-150+106, (gdispGetHeight()/2)-100+168, 89, 9, 0, 0);
gdispImageClose(&jg10SplashImage);
}
void jg10ShowSplash(void) {
gdispImageOpenFile(&jg10SplashImage, "splash.bmp");
gdispImageDraw(&jg10SplashImage, (gdispGetWidth()/2)-150, (gdispGetHeight()/2)-100, 300, 200, 0, 0);
gdispImageClose(&jg10SplashImage);
gtimerStart(&jg10SplashBlink, jg10SplashBlinker, 0, TRUE, 400);
}
#endif

View File

@ -0,0 +1,19 @@
#ifndef _JG10_H_
#define _JG10_H_
#define JG10_CELL_WIDTH 54
#define JG10_CELL_HEIGHT 54
#define JG10_FIELD_WIDTH 5
#define JG10_FIELD_HEIGHT 5
#define JG10_TOTAL_FIELD_WIDTH (JG10_FIELD_WIDTH*JG10_CELL_WIDTH)
#define JG10_TOTAL_FIELD_HEIGHT (JG10_FIELD_HEIGHT*JG10_CELL_HEIGHT)
#define JG10_SEL_COLOR Yellow
#define JG10_MAX_COUNT 21 // Max number you can get +1, so if max number would be 20, then this number should be 21 (+ background)
void jg10Init(void);
void jg10Start(void);
#if JG10_SHOW_SPLASH
void jg10ShowSplash(void);
#endif
#endif /* _JG10_H_ */

View File

@ -0,0 +1,40 @@
#include "gfx.h"
#include "jg10.h"
int main(void)
{
GEventMouse ev;
#if !JG10_SHOW_SPLASH
font_t font;
#endif
gfxInit();
ginputGetMouse(0);
jg10Init();
#if JG10_SHOW_SPLASH
jg10ShowSplash();
#else
font = gdispOpenFont("DejaVuSans16_aa");
gdispDrawString((gdispGetWidth()/2)-(gdispGetStringWidth("Touch to start!", font)/2), gdispGetHeight()/2, "Touch to start!", font, White);
gdispCloseFont(font);
#endif
while (TRUE) {
ginputGetMouseStatus(0, &ev);
if (ev.buttons & GINPUT_MOUSE_BTN_LEFT) {
while (ev.buttons & GINPUT_MOUSE_BTN_LEFT) { // Wait until release
ginputGetMouseStatus(0, &ev);
}
#if !JG10_SHOW_SPLASH
font = gdispOpenFont("DejaVuSans16");
gdispFillArea((gdispGetWidth()/2)-(gdispGetStringWidth("Touch to start!", font)/2), gdispGetHeight()/2, gdispGetWidth()/2, 17, Black);
gdispCloseFont(font);
#endif
jg10Start();
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

View File

@ -0,0 +1,33 @@
!#/bin/bash
./file2c -c -n jg10_1 -f 1.bmp 1.bmp ../romfs_1.h
./file2c -c -n jg10_2 -f 2.bmp 2.bmp ../romfs_2.h
./file2c -c -n jg10_3 -f 3.bmp 3.bmp ../romfs_3.h
./file2c -c -n jg10_4 -f 4.bmp 4.bmp ../romfs_4.h
./file2c -c -n jg10_5 -f 5.bmp 5.bmp ../romfs_5.h
./file2c -c -n jg10_6 -f 6.bmp 6.bmp ../romfs_6.h
./file2c -c -n jg10_7 -f 7.bmp 7.bmp ../romfs_7.h
./file2c -c -n jg10_8 -f 8.bmp 8.bmp ../romfs_8.h
./file2c -c -n jg10_9 -f 9.bmp 9.bmp ../romfs_9.h
./file2c -c -n jg10_10 -f 10.bmp 10.bmp ../romfs_10.h
./file2c -c -n jg10_11 -f 11.bmp 11.bmp ../romfs_11.h
./file2c -c -n jg10_12 -f 12.bmp 12.bmp ../romfs_12.h
./file2c -c -n jg10_13 -f 13.bmp 13.bmp ../romfs_13.h
./file2c -c -n jg10_14 -f 14.bmp 14.bmp ../romfs_14.h
./file2c -c -n jg10_15 -f 15.bmp 15.bmp ../romfs_15.h
./file2c -c -n jg10_16 -f 15.bmp 16.bmp ../romfs_16.h
./file2c -c -n jg10_17 -f 15.bmp 17.bmp ../romfs_17.h
./file2c -c -n jg10_18 -f 15.bmp 18.bmp ../romfs_18.h
./file2c -c -n jg10_19 -f 15.bmp 19.bmp ../romfs_19.h
./file2c -c -n jg10_20 -f 15.bmp 20.bmp ../romfs_20.h
./file2c -c -n jg10_a1 -f a1.bmp a1.bmp ../romfs_a1.h
./file2c -c -n jg10_a2 -f a2.bmp a2.bmp ../romfs_a2.h
./file2c -c -n jg10_a3 -f a3.bmp a3.bmp ../romfs_a3.h
./file2c -c -n jg10_a4 -f a4.bmp a4.bmp ../romfs_a4.h
./file2c -c -n jg10_a5 -f a5.bmp a5.bmp ../romfs_a5.h
./file2c -c -n jg10_background -f background.bmp background.bmp ../romfs_background.h
./file2c -c -n jg10_splash -f splash.bmp splash.bmp ../romfs_splash.h
./file2c -c -n jg10_splashclr -f splashclr.bmp splashclr.bmp ../romfs_splashclr.h
./file2c -c -n jg10_splashtxt -f splashtxt.bmp splashtxt.bmp ../romfs_splashtxt.h

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 176 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -0,0 +1,571 @@
/**
* This file was generated from "1.bmp" using...
*
* file2c -dcn jg10_1 -f 1.bmp 1.bmp ../romfs_1.h
*
*/
const char jg10_1[] = {
0x42, 0x4D, 0xD0, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00,
0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00,
0x00, 0x00, 0x9A, 0x22, 0x00, 0x00, 0x23, 0x2E, 0x00, 0x00, 0x23, 0x2E, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x0B, 0x09, 0x51,
0x5A, 0x4C, 0x5D, 0x71, 0x55, 0x67, 0x89, 0x5E, 0x6A, 0x9A, 0x66, 0x77, 0xB4, 0x77, 0x8A, 0xBE,
0x78, 0x8B, 0xBF, 0x79, 0x8C, 0xBF, 0x79, 0x8D, 0xC0, 0x7A, 0x8C, 0xC1, 0x7A, 0x82, 0xB6, 0x7A,
0x83, 0xB6, 0x79, 0x83, 0xB6, 0x79, 0x82, 0xB5, 0x79, 0x82, 0xB5, 0x79, 0x81, 0xB5, 0x78, 0x81,
0xB5, 0x78, 0x80, 0xB4, 0x77, 0x80, 0xB3, 0x77, 0x7F, 0xB2, 0x76, 0x7D, 0xB0, 0x74, 0x7E, 0xB0,
0x74, 0x7D, 0xAF, 0x73, 0x7C, 0xAE, 0x72, 0x7C, 0xAF, 0x72, 0x7C, 0xAF, 0x72, 0x7C, 0xB0, 0x73,
0x7C, 0xB1, 0x73, 0x7C, 0xB1, 0x73, 0x7D, 0xB2, 0x75, 0x7D, 0xB2, 0x75, 0x80, 0xB3, 0x76, 0x81,
0xB4, 0x77, 0x81, 0xB6, 0x78, 0x82, 0xB6, 0x79, 0x84, 0xB8, 0x7A, 0x85, 0xB9, 0x7B, 0x85, 0xB9,
0x7C, 0x84, 0xB8, 0x7B, 0x84, 0xB9, 0x7B, 0x85, 0xBA, 0x7B, 0x83, 0xB8, 0x7A, 0x83, 0xB9, 0x7A,
0x84, 0xB9, 0x7A, 0x80, 0xB1, 0x77, 0x73, 0x9E, 0x6B, 0x50, 0x68, 0x4A, 0x14, 0x1A, 0x13, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x3D, 0x3F, 0x3C,
0x95, 0xB8, 0x8B, 0x70, 0xC6, 0x62, 0x79, 0xD1, 0x61, 0x86, 0xD8, 0x67, 0x8D, 0xD6, 0x71, 0x97,
0xD8, 0x7C, 0x81, 0xC7, 0x72, 0x7E, 0xC4, 0x6D, 0x79, 0xBF, 0x68, 0x75, 0xBB, 0x64, 0x72, 0xB8,
0x61, 0x77, 0xB9, 0x5E, 0x76, 0xB8, 0x5D, 0x76, 0xB8, 0x5E, 0x75, 0xB8, 0x5E, 0x75, 0xB7, 0x5D,
0x74, 0xB6, 0x5C, 0x73, 0xB5, 0x5C, 0x74, 0xB5, 0x5D, 0x74, 0xB5, 0x5D, 0x74, 0xB6, 0x5D, 0x74,
0xB5, 0x5C, 0x72, 0xB4, 0x5B, 0x73, 0xB4, 0x5B, 0x73, 0xB4, 0x5B, 0x73, 0xB4, 0x5B, 0x73, 0xB4,
0x5C, 0x72, 0xB5, 0x5C, 0x72, 0xB6, 0x5C, 0x72, 0xB6, 0x5C, 0x74, 0xB8, 0x5C, 0x74, 0xB9, 0x5E,
0x76, 0xB8, 0x5E, 0x76, 0xB8, 0x5E, 0x77, 0xBA, 0x5F, 0x77, 0xBA, 0x5E, 0x78, 0xBB, 0x5F, 0x78,
0xBC, 0x5F, 0x79, 0xBD, 0x60, 0x7D, 0xC0, 0x64, 0x7E, 0xC2, 0x66, 0x80, 0xC5, 0x69, 0x86, 0xCB,
0x6E, 0x8D, 0xD1, 0x74, 0x92, 0xD6, 0x7A, 0x97, 0xD8, 0x7E, 0x9A, 0xDA, 0x80, 0x8F, 0xDA, 0x77,
0x84, 0xC5, 0x73, 0x69, 0x7D, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x39, 0x3C,
0x34, 0x97, 0xD2, 0x7D, 0x5C, 0xC9, 0x47, 0x75, 0xD1, 0x55, 0x74, 0xD0, 0x55, 0x75, 0xD1, 0x56,
0x77, 0xD2, 0x58, 0x7A, 0xD3, 0x5A, 0x8F, 0xD9, 0x76, 0xA2, 0xE7, 0x86, 0xA6, 0xE5, 0x8C, 0xA6,
0xE1, 0x92, 0xA1, 0xDC, 0x92, 0x93, 0xD5, 0x86, 0x91, 0xD2, 0x83, 0x8B, 0xCD, 0x7C, 0x88, 0xC9,
0x75, 0x84, 0xC6, 0x72, 0x83, 0xC4, 0x6F, 0x83, 0xC3, 0x6F, 0x80, 0xC1, 0x6D, 0x7E, 0xBF, 0x6B,
0x7D, 0xBD, 0x69, 0x79, 0xBC, 0x67, 0x77, 0xBB, 0x66, 0x77, 0xBB, 0x66, 0x77, 0xBB, 0x66, 0x77,
0xBB, 0x66, 0x78, 0xBB, 0x67, 0x7D, 0xBD, 0x69, 0x7E, 0xBE, 0x6A, 0x7F, 0xC0, 0x6C, 0x80, 0xC2,
0x6D, 0x83, 0xC4, 0x6E, 0x7C, 0xC3, 0x6B, 0x80, 0xC5, 0x6E, 0x85, 0xC7, 0x74, 0x8A, 0xCB, 0x7C,
0x8D, 0xCD, 0x80, 0x95, 0xD5, 0x87, 0x9D, 0xDB, 0x8E, 0xA7, 0xE1, 0x95, 0xAF, 0xE6, 0x9A, 0xB0,
0xE5, 0x9A, 0xAB, 0xE5, 0x96, 0xA7, 0xE2, 0x91, 0x9A, 0xDB, 0x87, 0x94, 0xD9, 0x81, 0x90, 0xD9,
0x7F, 0x91, 0xDB, 0x81, 0x9A, 0xDA, 0x80, 0x8A, 0xD9, 0x76, 0x79, 0x9D, 0x71, 0x09, 0x09, 0x09,
0x20, 0x20, 0x99, 0xB6, 0x8C, 0x74, 0xC2, 0x59, 0x72, 0xD3, 0x55, 0x74, 0xD0, 0x55, 0x76, 0xD1,
0x57, 0x78, 0xD2, 0x59, 0x77, 0xD2, 0x59, 0x7C, 0xD3, 0x5C, 0x6A, 0xCA, 0x54, 0x79, 0xCF, 0x5F,
0x86, 0xD0, 0x6C, 0x9C, 0xDA, 0x85, 0xB1, 0xE6, 0x9C, 0xB6, 0xE6, 0xA7, 0xB9, 0xE9, 0xAA, 0xC0,
0xEB, 0xB0, 0xC0, 0xEA, 0xB0, 0xC1, 0xE9, 0xB1, 0xAA, 0xDD, 0x9F, 0xA7, 0xDA, 0x9D, 0xA4, 0xD7,
0x9A, 0xA0, 0xD4, 0x97, 0x9D, 0xD1, 0x94, 0xA0, 0xD2, 0x91, 0xA4, 0xD3, 0x91, 0xA3, 0xD2, 0x90,
0xA3, 0xD2, 0x90, 0xA3, 0xD2, 0x90, 0xA0, 0xD2, 0x91, 0x9F, 0xD2, 0x94, 0xA0, 0xD4, 0x96, 0xA1,
0xD5, 0x98, 0xA3, 0xD7, 0x99, 0xA4, 0xD9, 0x9B, 0xBE, 0xE8, 0xAE, 0xBD, 0xE8, 0xAD, 0xC1, 0xEB,
0xB0, 0xBE, 0xEB, 0xAE, 0xBD, 0xEA, 0xAD, 0xB3, 0xE5, 0xA3, 0xAC, 0xE1, 0x9D, 0xA2, 0xDD, 0x94,
0x94, 0xD6, 0x88, 0x8B, 0xD3, 0x80, 0x94, 0xD7, 0x81, 0x95, 0xD8, 0x82, 0x92, 0xD8, 0x7F, 0x93,
0xD8, 0x80, 0x92, 0xDA, 0x80, 0x8F, 0xDB, 0x7C, 0x9F, 0xDC, 0x84, 0x95, 0xDE, 0x80, 0x81, 0xC6,
0x79, 0x3B, 0x44, 0x38, 0x20, 0x20, 0x8C, 0xCB, 0x7B, 0x72, 0xD0, 0x53, 0x77, 0xD2, 0x54, 0x73,
0xCF, 0x55, 0x76, 0xD2, 0x58, 0x78, 0xD2, 0x5A, 0x78, 0xD2, 0x5A, 0x79, 0xD0, 0x5A, 0x73, 0xD1,
0x59, 0x78, 0xD2, 0x5D, 0x7A, 0xCF, 0x60, 0x7F, 0xCD, 0x6A, 0x8B, 0xD1, 0x78, 0x8B, 0xCB, 0x7A,
0x94, 0xCF, 0x80, 0x99, 0xD2, 0x89, 0xA1, 0xD5, 0x92, 0xA6, 0xD6, 0x97, 0xBC, 0xDD, 0xAC, 0xBB,
0xDC, 0xAC, 0xBE, 0xDE, 0xAF, 0xC0, 0xE1, 0xB2, 0xC1, 0xE2, 0xB3, 0xBF, 0xDD, 0xB6, 0xBB, 0xDA,
0xB7, 0xBB, 0xDA, 0xB7, 0xBA, 0xD9, 0xB6, 0xBB, 0xDA, 0xB7, 0xBE, 0xDD, 0xB6, 0xC4, 0xE5, 0xB3,
0xC3, 0xE4, 0xB2, 0xC2, 0xE3, 0xB2, 0xC1, 0xE2, 0xB0, 0xC1, 0xE2, 0xB0, 0xAF, 0xDE, 0xA0, 0xAB,
0xDB, 0x9C, 0xA8, 0xD9, 0x95, 0xA2, 0xD6, 0x8D, 0x9E, 0xD5, 0x8A, 0x94, 0xD4, 0x82, 0x8F, 0xD2,
0x7F, 0x8E, 0xD3, 0x7C, 0x8E, 0xD5, 0x7B, 0x8F, 0xD9, 0x7D, 0x90, 0xD9, 0x7E, 0x92, 0xDA, 0x7F,
0x91, 0xDA, 0x7F, 0x93, 0xDA, 0x80, 0x94, 0xD9, 0x80, 0x92, 0xDD, 0x7B, 0x9E, 0xDC, 0x84, 0x99,
0xDD, 0x83, 0x74, 0xD1, 0x68, 0x57, 0x76, 0x52, 0x20, 0x20, 0x7A, 0xC0, 0x64, 0x75, 0xD6, 0x57,
0x74, 0xCF, 0x53, 0x72, 0xCF, 0x56, 0x74, 0xD0, 0x58, 0x77, 0xD1, 0x5A, 0x77, 0xD1, 0x5A, 0x7A,
0xD1, 0x5C, 0x82, 0xD2, 0x64, 0x80, 0xD3, 0x61, 0x79, 0xD0, 0x60, 0x7D, 0xD0, 0x68, 0x84, 0xD5,
0x75, 0x91, 0xD9, 0x7E, 0x90, 0xD5, 0x7D, 0x8D, 0xD3, 0x7C, 0x8F, 0xD2, 0x7E, 0x90, 0xD2, 0x7F,
0x8C, 0xCB, 0x7F, 0x8B, 0xCA, 0x7E, 0x8B, 0xCA, 0x7E, 0x8B, 0xC9, 0x7E, 0x8A, 0xC8, 0x7E, 0x91,
0xCB, 0x7F, 0x94, 0xCB, 0x80, 0x94, 0xCB, 0x80, 0x94, 0xCB, 0x80, 0x93, 0xCB, 0x7F, 0x90, 0xCA,
0x7E, 0x8B, 0xCA, 0x7E, 0x8B, 0xCA, 0x7D, 0x8B, 0xCB, 0x7D, 0x8B, 0xCB, 0x7D, 0x8C, 0xCC, 0x7E,
0x94, 0xD4, 0x81, 0x92, 0xD4, 0x80, 0x90, 0xD3, 0x7D, 0x90, 0xD7, 0x7D, 0x90, 0xDB, 0x7F, 0x8E,
0xD8, 0x7A, 0x8F, 0xD8, 0x7B, 0x92, 0xD8, 0x7B, 0x95, 0xD9, 0x7D, 0x98, 0xDA, 0x7F, 0x8F, 0xD7,
0x7D, 0x8F, 0xD7, 0x7D, 0x92, 0xDA, 0x7F, 0x93, 0xDA, 0x80, 0x94, 0xDA, 0x80, 0x99, 0xDF, 0x7F,
0x96, 0xDB, 0x82, 0x93, 0xD6, 0x82, 0x8A, 0xDE, 0x73, 0x61, 0x8E, 0x58, 0x20, 0x20, 0x83, 0xC5,
0x6B, 0x7B, 0xD4, 0x5C, 0x71, 0xCE, 0x56, 0x73, 0xD0, 0x57, 0x73, 0xD0, 0x57, 0x76, 0xD0, 0x59,
0x77, 0xD2, 0x5A, 0x7B, 0xD2, 0x5D, 0x7E, 0xD2, 0x62, 0x7B, 0xD2, 0x5E, 0x7D, 0xCF, 0x63, 0x85,
0xCD, 0x6F, 0x9B, 0xD8, 0x85, 0x97, 0xD3, 0x8D, 0x9C, 0xD5, 0x8F, 0xA4, 0xD6, 0x95, 0xAA, 0xD8,
0x96, 0xAD, 0xD8, 0x97, 0xA7, 0xD5, 0x96, 0xA4, 0xD2, 0x95, 0xA3, 0xD0, 0x93, 0xA2, 0xCF, 0x92,
0x9E, 0xCD, 0x90, 0x9C, 0xCC, 0x8C, 0x9A, 0xCC, 0x8A, 0x99, 0xCB, 0x89, 0x99, 0xCB, 0x89, 0x99,
0xCB, 0x89, 0x9A, 0xCB, 0x8A, 0x9E, 0xCD, 0x8D, 0x9F, 0xCF, 0x8E, 0xA3, 0xD1, 0x90, 0xA4, 0xD4,
0x93, 0xA5, 0xD6, 0x94, 0xAD, 0xD9, 0x99, 0xAC, 0xDA, 0x98, 0xA8, 0xD9, 0x99, 0xA7, 0xD9, 0x98,
0xA5, 0xD9, 0x97, 0xAE, 0xDE, 0x9B, 0xAC, 0xDF, 0x99, 0xA8, 0xE1, 0x96, 0x9E, 0xDD, 0x8D, 0x99,
0xDB, 0x87, 0x94, 0xD9, 0x80, 0x94, 0xD9, 0x80, 0x96, 0xDA, 0x81, 0x94, 0xDA, 0x80, 0x93, 0xDA,
0x80, 0x9D, 0xDD, 0x81, 0x88, 0xD9, 0x7F, 0x8C, 0xD0, 0x81, 0xA4, 0xE4, 0x83, 0x63, 0x8F, 0x56,
0x20, 0x20, 0x78, 0xBE, 0x67, 0x84, 0xD5, 0x65, 0x6F, 0xD0, 0x52, 0x7A, 0xD4, 0x59, 0x79, 0xD1,
0x5A, 0x77, 0xCE, 0x5C, 0x7A, 0xD1, 0x5F, 0x7A, 0xD1, 0x5F, 0x7B, 0xD2, 0x60, 0x7D, 0xCD, 0x65,
0x8A, 0xD1, 0x77, 0x99, 0xD8, 0x88, 0xA1, 0xDB, 0x93, 0xAC, 0xDB, 0x98, 0xA9, 0xD8, 0x98, 0xA6,
0xD5, 0x98, 0xA5, 0xD2, 0x9A, 0xA5, 0xD2, 0x9B, 0xA8, 0xD2, 0x9E, 0xA7, 0xCF, 0x9D, 0xA6, 0xCF,
0x9D, 0xA5, 0xCD, 0x9B, 0xA6, 0xCC, 0x9B, 0xA6, 0xCB, 0x9C, 0xA5, 0xC9, 0x9B, 0xA5, 0xC9, 0x9B,
0xA5, 0xC9, 0x9B, 0xA6, 0xCA, 0x9C, 0xA5, 0xCA, 0x9B, 0x9D, 0xC8, 0x94, 0x9E, 0xCA, 0x96, 0xA0,
0xCC, 0x97, 0xA1, 0xCE, 0x98, 0xA3, 0xD0, 0x9A, 0xAA, 0xD4, 0x9E, 0xAA, 0xD5, 0x9E, 0xAB, 0xD7,
0x9F, 0xA9, 0xD7, 0x9E, 0xAA, 0xD9, 0x9F, 0xAA, 0xDB, 0x9F, 0xA7, 0xDB, 0x9C, 0xA7, 0xDB, 0x9A,
0xA5, 0xDC, 0x98, 0xA7, 0xDE, 0x9A, 0xAF, 0xE3, 0x9A, 0xA1, 0xDD, 0x8D, 0x8F, 0xD5, 0x7C, 0x91,
0xDA, 0x7F, 0x92, 0xD5, 0x7D, 0x9A, 0xDA, 0x87, 0x97, 0xE4, 0x7E, 0x94, 0xD8, 0x85, 0x9F, 0xDC,
0x87, 0x70, 0x97, 0x5C, 0x20, 0x20, 0x76, 0xBB, 0x64, 0x92, 0xDF, 0x75, 0x70, 0xCD, 0x55, 0x77,
0xD3, 0x58, 0x78, 0xD3, 0x5A, 0x78, 0xD2, 0x5C, 0x79, 0xD0, 0x5F, 0x79, 0xD0, 0x5F, 0x7F, 0xD0,
0x66, 0x91, 0xDD, 0x7A, 0x99, 0xDB, 0x85, 0x99, 0xD2, 0x88, 0xA4, 0xD9, 0x95, 0xB3, 0xDC, 0xA2,
0xB0, 0xDB, 0xA2, 0xB4, 0xDF, 0xA8, 0xB5, 0xDD, 0xAA, 0xB2, 0xDB, 0xA9, 0xB2, 0xD8, 0xA9, 0xB0,
0xD6, 0xA8, 0xB0, 0xD4, 0xA7, 0xAE, 0xD2, 0xA6, 0xAD, 0xD1, 0xA5, 0xAE, 0xD0, 0xA6, 0xAE, 0xCF,
0xA5, 0xAE, 0xCF, 0xA5, 0xAE, 0xCF, 0xA5, 0xAE, 0xD0, 0xA6, 0xAF, 0xD1, 0xA6, 0xB3, 0xD3, 0xA7,
0xB4, 0xD5, 0xA9, 0xB6, 0xD6, 0xA9, 0xB8, 0xD9, 0xAC, 0xB9, 0xDA, 0xAD, 0xB6, 0xDC, 0xAC, 0xB6,
0xDE, 0xAD, 0xB5, 0xDF, 0xAD, 0xB8, 0xE2, 0xAE, 0xB8, 0xE3, 0xB0, 0xB9, 0xE6, 0xAD, 0xB9, 0xE7,
0xAD, 0xB7, 0xE6, 0xAA, 0xB0, 0xE1, 0xA3, 0xAC, 0xDF, 0x9E, 0xB0, 0xE2, 0x9B, 0xAB, 0xE6, 0x99,
0x99, 0xDD, 0x87, 0x92, 0xD9, 0x80, 0x94, 0xDA, 0x80, 0x98, 0xD8, 0x83, 0x95, 0xE0, 0x7C, 0x98,
0xDB, 0x8B, 0x9D, 0xDB, 0x85, 0x6F, 0x97, 0x5B, 0x20, 0x20, 0x71, 0xB6, 0x60, 0xA3, 0xE9, 0x87,
0x78, 0xCE, 0x61, 0x74, 0xD2, 0x56, 0x79, 0xD5, 0x5A, 0x7A, 0xD4, 0x5D, 0x78, 0xD0, 0x5F, 0x7D,
0xD1, 0x65, 0x8F, 0xD7, 0x7A, 0x98, 0xDC, 0x85, 0x9E, 0xD8, 0x8D, 0xA4, 0xD6, 0x94, 0xB5, 0xE3,
0xA6, 0xBB, 0xE3, 0xB0, 0xBC, 0xE2, 0xB1, 0xB8, 0xDD, 0xAF, 0xB5, 0xD9, 0xAD, 0xB1, 0xD5, 0xA9,
0xB5, 0xD6, 0xAB, 0xB2, 0xD3, 0xA9, 0xB0, 0xD0, 0xA7, 0xB0, 0xCD, 0xA6, 0xAF, 0xCC, 0xA4, 0xAD,
0xCA, 0xA3, 0xAC, 0xC9, 0xA2, 0xAB, 0xC8, 0xA1, 0xAC, 0xC9, 0xA2, 0xAC, 0xC9, 0xA2, 0xAF, 0xCB,
0xA4, 0xB1, 0xCE, 0xA7, 0xB3, 0xD0, 0xA8, 0xB5, 0xD3, 0xAB, 0xB8, 0xD5, 0xAD, 0xB8, 0xD6, 0xAE,
0xB6, 0xD8, 0xAE, 0xB9, 0xDB, 0xB1, 0xB8, 0xDD, 0xB0, 0xBB, 0xE0, 0xB2, 0xB9, 0xE1, 0xB2, 0xC0,
0xE7, 0xB5, 0xC2, 0xEA, 0xB6, 0xC4, 0xEE, 0xB7, 0xBF, 0xEB, 0xB2, 0xBE, 0xEA, 0xAF, 0xB5, 0xE5,
0xA4, 0xAA, 0xE1, 0x99, 0xA3, 0xE1, 0x93, 0x93, 0xD8, 0x81, 0x97, 0xDD, 0x83, 0x91, 0xD6, 0x80,
0x95, 0xDC, 0x7D, 0xA5, 0xE2, 0x96, 0x95, 0xD6, 0x7F, 0x6A, 0x96, 0x57, 0x20, 0x20, 0x6F, 0xB3,
0x5E, 0xA5, 0xE4, 0x8B, 0x8B, 0xD8, 0x76, 0x74, 0xD0, 0x59, 0x79, 0xD4, 0x5A, 0x7D, 0xD5, 0x5E,
0x7D, 0xD0, 0x63, 0x87, 0xD5, 0x71, 0x9A, 0xDB, 0x87, 0x9C, 0xD8, 0x8A, 0xAA, 0xDE, 0x9B, 0xB6,
0xE4, 0xA8, 0xBE, 0xE7, 0xAF, 0xBA, 0xDE, 0xB2, 0xB8, 0xDB, 0xAF, 0xB5, 0xD8, 0xAD, 0xB6, 0xD7,
0xAE, 0xB6, 0xD5, 0xAD, 0xB3, 0xD2, 0xAA, 0xB0, 0xCF, 0xA8, 0xAF, 0xCC, 0xA6, 0xAD, 0xC9, 0xA4,
0xAB, 0xC7, 0xA2, 0xAB, 0xC6, 0xA2, 0xAA, 0xC5, 0xA1, 0xAA, 0xC5, 0xA1, 0xAA, 0xC5, 0xA1, 0xAA,
0xC6, 0xA2, 0xAA, 0xC7, 0xA2, 0xA9, 0xCA, 0xA1, 0xAB, 0xCC, 0xA3, 0xAD, 0xCF, 0xA4, 0xAF, 0xD2,
0xA7, 0xB2, 0xD4, 0xA9, 0xB6, 0xD6, 0xAD, 0xB9, 0xD9, 0xB0, 0xB9, 0xDB, 0xB1, 0xBA, 0xDD, 0xB2,
0xBC, 0xE0, 0xB3, 0xC1, 0xE4, 0xB6, 0xC1, 0xE7, 0xB7, 0xC2, 0xE8, 0xB7, 0xC2, 0xEC, 0xB6, 0xC3,
0xED, 0xB7, 0xC6, 0xF2, 0xB8, 0xAF, 0xE0, 0xA0, 0xAD, 0xE5, 0x9C, 0x9A, 0xDB, 0x88, 0x92, 0xD8,
0x7E, 0x92, 0xD9, 0x81, 0x98, 0xDB, 0x80, 0xAD, 0xE5, 0x9F, 0x86, 0xCC, 0x73, 0x68, 0x96, 0x57,
0x20, 0x20, 0x6E, 0xB2, 0x5E, 0x9B, 0xD4, 0x84, 0x9E, 0xE4, 0x8C, 0x7A, 0xD3, 0x5F, 0x7C, 0xD5,
0x5C, 0x80, 0xD6, 0x60, 0x87, 0xD5, 0x6C, 0x97, 0xDD, 0x82, 0x98, 0xD6, 0x8B, 0xA7, 0xDF, 0x98,
0xB5, 0xE9, 0xA7, 0xB9, 0xE4, 0xAD, 0xB6, 0xDF, 0xAB, 0xBA, 0xDF, 0xB1, 0xBA, 0xDB, 0xB0, 0xB8,
0xD8, 0xAE, 0xB6, 0xD5, 0xAA, 0xB2, 0xD0, 0xA7, 0xAF, 0xCE, 0xA7, 0xAD, 0xCB, 0xA5, 0xAA, 0xC8,
0xA2, 0xA9, 0xC4, 0xA0, 0xA7, 0xC2, 0x9E, 0xA5, 0xC0, 0x9D, 0xA4, 0xC0, 0x9C, 0xA3, 0xBF, 0x9B,