Minimal abstract interface for simple games
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

280 lines
7.3 KiB

/**
Simple testing program for SAF.
by drummyfish, released under CC0 1.0, public domain
*/
#define SAF_PROGRAM_NAME "Test"
#define SAF_SETTING_BACKGROUND_COLOR 0xe0
#define SAF_SETTING_FORCE_1BIT 0
#define SAF_SETTING_1BIT_DITHER 0
#define SAF_SETTING_FASTER_1BIT 2
#define SAF_SETTING_ENABLE_SOUND 1
#include "../saf.h"
uint8_t saveValue = 0;
void screen1()
{
SAF_clearScreen(SAF_COLOR_BLACK);
SAF_drawText("SAF test!",2,2,SAF_COLOR_WHITE,1);
uint8_t index = 0;
for (uint8_t y = 0; y < 16; ++y)
for (uint8_t x = 0; x < 16; ++x)
{
uint8_t color = ((x % 8) << 5) | ((y % 8) << 2) | (x / 8 + 2 * (y / 8));
int8_t x2 = 2 + 2 * x;
int8_t y2 = 12 + 2 * y;
for (int8_t j = 0; j < 2; ++j)
for (int8_t i = 0; i < 2; ++i)
SAF_drawPixel(x2 + i,y2 + j,color);
index++;
}
char btnChars[SAF_BUTTONS + 1] = "UDLRABC";
char btnString[2] = "x";
for (int8_t i = 0; i < SAF_BUTTONS; ++i)
{
btnString[0] = btnChars[i];
uint8_t pressed = SAF_buttonPressed(i);
int8_t x = 2 + i * 8;
SAF_drawRect(x,48,7,8,pressed ? SAF_COLOR_WHITE : SAF_COLOR_GRAY_DARK,1);
SAF_drawText(btnString,x + 2,50,pressed ? SAF_COLOR_BLACK : SAF_COLOR_WHITE,1);
for (int8_t j = 0; j < (pressed / 32); ++j)
SAF_drawPixel(x + j,58,SAF_COLOR_WHITE);
}
SAF_drawCircle(48,28,12,SAF_COLOR_WHITE,0);
SAF_drawLine(48,28,48 + (SAF_sin(SAF_frame()) * 12) / 128,28 + (SAF_cos(SAF_frame()) * 12) / 128,SAF_COLOR_YELLOW);
}
void screen2()
{
SAF_clearScreen(SAF_COLOR_WHITE);
SAF_drawRect(43,46,SAF_sin(((SAF_frame() * 2) % 256)) / 2,SAF_cos((SAF_frame() % 256)) / 2,SAF_COLOR_RED,1);
SAF_drawCircle(-10,-20,SAF_frame() % 128,SAF_COLOR_BLUE,0);
SAF_drawCircle(31,31,(SAF_frame() >> 1) % 32,SAF_COLOR_GREEN,0);
SAF_drawText("random:\n b",1,1,SAF_COLOR_BLACK,1);
uint8_t bit = (SAF_frame() >> 4) % 8;
char numberStr[2];
SAF_intToStr(bit,numberStr);
SAF_drawText(numberStr,11,6,SAF_COLOR_BLACK,1);
bit = 0x01 << bit;
for (int8_t y = 0; y < 16; ++y)
for (int8_t x = 0; x < 16; ++x)
{
uint8_t value = SAF_random();
SAF_drawPixel(44 + x,11 + y,value);
SAF_drawPixel(23 + x,11 + y,value < 128 ? SAF_COLOR_BLACK : SAF_COLOR_GRAY);
value = value & bit;
value = value ? SAF_COLOR_BLACK : SAF_COLOR_GRAY;
SAF_drawPixel(2 + x,11 + y,value);
}
SAF_drawText("frame\ntime\nplat.",1,30,SAF_COLOR_BLACK,1);
char numberStr2[32];
SAF_intToStr(SAF_frame(),numberStr2);
SAF_drawText(numberStr2,34,30,SAF_COLOR_BLACK,1);
SAF_floatToStr(SAF_time() / 1000.0,numberStr2,3);
SAF_drawText(numberStr2,34,35,SAF_COLOR_BLACK,1);
SAF_drawText(SAF_PLATFORM_NAME,34,40,SAF_COLOR_BLACK,1);
char allChars[10][11] =
{
" !\"#$%&'()",
"*+-./01234",
"56789:;<=>",
"?@ABCDEFGH",
"IJKLMNOPQR",
"STUVWXYZ[]",
"^,_@`abcde",
"fghijklmno",
"pqrstuvwxy",
"z{|}~ "
};
SAF_drawText(allChars[(SAF_frame() >> 5) % 10],1,50,SAF_COLOR_BLACK,1);
char num[] = "xxx";
SAF_drawText(SAF_intToStr(saveValue,num),
SAF_drawText("saved:",1,58,SAF_COLOR_BLACK,1),58,SAF_COLOR_BLACK,1);
}
uint8_t img[44] = {
0x07,0x06,0xff,0x00,0x00,0xff,0x00,0x00,0xff,0x00,0xed,0xed,0x00,0xed,0xe0,0x00,
0x00,0xed,0xe0,0xed,0xe0,0x60,0x00,0xff,0x00,0xe0,0xe0,0x60,0x00,0xff,0xff,0xff,
0x00,0x60,0x00,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0xff,0xff};
uint8_t imgCompressed[227] = {
0x13,0x20,0xe0,0x00,0x28,0x7c,0x07,0xfe,0x4c,0xff,0x71,0x70,0x95,0x6d,0x92,0x24,
0x48,0x49,0x60,0x41,0xd0,0x01,0x2d,0x01,0xc0,0x01,0x0f,0x08,0x0a,0x1c,0x01,0xa0,
0x01,0x08,0x3a,0x15,0x01,0x90,0x01,0x59,0x06,0x01,0xa0,0x06,0x05,0x27,0x05,0x06,
0xa0,0x06,0x15,0x27,0x15,0x06,0x90,0x06,0x15,0x27,0x15,0x06,0x70,0x11,0x38,0x0e,
0x08,0x2a,0x11,0x30,0x11,0x0f,0x08,0x7a,0x08,0x1c,0x11,0x00,0x01,0x3f,0x3b,0x38,
0x1b,0x2c,0x11,0x3d,0xa2,0x06,0x02,0x01,0x00,0x11,0x0d,0x16,0x0e,0x12,0x0e,0x08,
0x09,0x1e,0x08,0x06,0x11,0x30,0x01,0x02,0x69,0x18,0x11,0x70,0x06,0x05,0x47,0x05,
0x06,0x90,0x06,0x15,0x27,0x15,0x06,0xa0,0x16,0x25,0x16,0xd0,0x02,0x03,0x02,0x80,
0x34,0x20,0x02,0x03,0x02,0x10,0x43,0x00,0x14,0x10,0x14,0x10,0x02,0x0a,0x02,0x10,
0x13,0x10,0x13,0x14,0x10,0x14,0x10,0x02,0x0e,0x02,0x10,0x13,0x10,0x13,0x14,0x10,
0x14,0x10,0x01,0x02,0x01,0x10,0x43,0x00,0x54,0x10,0x01,0x02,0x01,0x10,0x13,0x10,
0x13,0x14,0x10,0x14,0x00,0x01,0x1c,0x0a,0x01,0x00,0x13,0x10,0x13,0x14,0x10,0x14,
0x00,0x01,0x22,0x01,0x00,0x43,0x80,0x01,0x02,0x01,0xf0,0x01,0x02,0x01,0xf0,0x01,
0x02,0x01,0xe0,0x01,0x1b,0x0c,0x01,0xb0,0x11,0x3b,0x0c,0x11,0x80,0x01,0x82,0x01,
0x70,0xa1,0x30};
uint8_t img1Bit[25] = {
0x0c,0x0f,0xe9,0x7c,0x03,0x40,0x20,0x00,0x80,0x11,0xf8,0x96,0x9d,0x69,0xcf,0x3a,
0x01,0x90,0x1c,0xeb,0xc1,0xbe,0x07,0xe3,0xf0};
uint8_t img1BitMask[25] = {
0x0c,0x0f,0x16,0x83,0xfc,0xbf,0xdf,0xff,0x7f,0xef,0xff,0x7f,0xe3,0xfe,0x3f,0xc7,
0xfe,0x7f,0xe3,0xfc,0x3f,0xc1,0xf8,0x1c,0x00};
uint8_t imgLogo[2 + 8 * 8];
int8_t trianglePoints[6] = {1,2,3,4,5,6};
void screen3()
{
SAF_clearScreen(SAF_COLOR_YELLOW);
int8_t s = SAF_sin(SAF_frame());
int8_t c = SAF_cos(SAF_frame());
int8_t a = 32 - s / 2, b = 32 + s / 2;
SAF_drawLine(a,32 - 64,b,32 + 64,SAF_COLOR_RED);
SAF_drawLine(32 - 64,b,32 + 64,a,SAF_COLOR_RED);
uint8_t transform = SAF_TRANSFORM_NONE + (SAF_frame() >> 4) % 4;
if ((SAF_frame() >> 3) % 2)
transform |= SAF_TRANSFORM_FLIP;
SAF_drawImage(img,
32 + s / 4 - img[0] / 2,
32 + c / 4 - img[1] / 2,
transform | SAF_TRANSFORM_SCALE_3 | ((SAF_frame() & 0x10) ? 0 : SAF_TRANSFORM_INVERT),SAF_COLOR_WHITE);
SAF_drawImageCompressed(imgCompressed,1,1,transform,SAF_COLOR_RED);
SAF_drawImage(img,40,1,transform,SAF_COLOR_WHITE);
SAF_drawImage1Bit(img1Bit,40,20,img1BitMask,255,0,transform);
SAF_drawImage1Bit(img1Bit,50,45,0,255,0,SAF_TRANSFORM_NONE);
SAF_drawImage1Bit(imgLogo,2,40,imgLogo,SAF_COLOR_BLUE,255,SAF_TRANSFORM_NONE);
for (int i = 0; i < 6; ++i)
{
int8_t add = SAF_random() > 127 ? 1 : -1;
if ((add > 0 && trianglePoints[i] < 16) || (add < 0 && trianglePoints[i] > -16))
trianglePoints[i] += add;
}
for (uint8_t i = 0; i < 3; ++i)
{
uint8_t i1 = 2 * i, i2 = 2 * (i + 1) % 6;
SAF_drawLine(
trianglePoints[i1] + 25,
trianglePoints[i1 + 1] + 40,
trianglePoints[i2] + 25,
trianglePoints[i2 + 1] + 40,
SAF_COLOR_BLACK);
}
}
uint8_t phase = 0;
void SAF_init(void)
{
saveValue = SAF_load(0);
saveValue++;
SAF_save(0,saveValue);
imgLogo[0] = 8;
imgLogo[1] = 8;
imgLogo[2] = (SAF_LOGO_IMAGE >> 56) & 0xff;
imgLogo[3] = (SAF_LOGO_IMAGE >> 48) & 0xff;
imgLogo[4] = (SAF_LOGO_IMAGE >> 40) & 0xff;
imgLogo[5] = (SAF_LOGO_IMAGE >> 32) & 0xff;
imgLogo[6] = (SAF_LOGO_IMAGE >> 24) & 0xff;
imgLogo[7] = (SAF_LOGO_IMAGE >> 16) & 0xff;
imgLogo[8] = (SAF_LOGO_IMAGE >> 8) & 0xff;
imgLogo[9] = SAF_LOGO_IMAGE & 0xff;
}
uint8_t SAF_loop(void)
{
#if 0
screen2();
#else
switch (phase)
{
case 0: screen1(); break;
case 1: screen2(); break;
case 2: screen3(); break;
default: break;
}
uint32_t f = SAF_frame() % 64;
if (f >= 24 && f < 35)
{
SAF_drawRect(3,56,45,6,SAF_COLOR_GRAY_DARK,1);
uint8_t i = (SAF_frame() / 64) % SAF_SOUNDS;
char s[8] = "sound x";
s[6] = '0' + i;
SAF_drawText(s,4,57,SAF_COLOR_RED,1);
if (f == 24)
SAF_playSound(i);
}
if (SAF_frame() != 0 && SAF_frame() % 128 == 0)
{
phase++;
phase %= 3;
}
return 1;
#endif
}