diff --git a/firmware/l0dable/starfld.c b/firmware/l0dable/starfld.c new file mode 100644 index 0000000..1a41eef --- /dev/null +++ b/firmware/l0dable/starfld.c @@ -0,0 +1,73 @@ +#include + +#include "basic/basic.h" +#include "basic/config.h" + +#include "lcd/lcd.h" +#include "lcd/print.h" + +#include "usetable.h" + +#define NUM_STARS 150 + +typedef struct { + short x, y, z, speed; +} s_star; + +static s_star stars[NUM_STARS]; + +void init_star(s_star *star, int z); + +void ram(void) +{ + short centerx = RESX >> 1; + short centery = RESY >> 1; + short i; + + for (i = 0; i < NUM_STARS; i++) { + init_star(stars + i, i + 1); + } + + while(getInputRaw()==BTN_NONE){ + lcdClear(); + + for (i = 0; i < NUM_STARS; i++) { + stars[i].z -= stars[i].speed; + + if (stars[i].z <= 0) + init_star(stars + i, i + 1); + + short tempx = ((stars[i].x * 30) / stars[i].z) + centerx; + short tempy = ((stars[i].y * 30) / stars[i].z) + centery; + + if (tempx < 0 || tempx > RESX - 1 || tempy < 0 || tempy > RESY - 1) { + init_star(stars + i, i + 1); + continue; + } + + lcdSetPixel(tempx, tempy, 1); + if (stars[i].z < 50) { + lcdSetPixel(tempx + 1, tempy, 1); + } + if (stars[i].z < 20) { + lcdSetPixel(tempx, tempy + 1, 1); + lcdSetPixel(tempx + 1, tempy + 1, 1); + } + } + + lcdRefresh(); + + delayms_queue_plus(50,0); + } +} + +void init_star(s_star *star, int z) +{ + star->x = (getRandom() % RESX) - (RESX >> 1); + star->y = (getRandom() % RESY) - (RESY >> 1); + star->z = z; + star->speed = (getRandom() % 4) + 1; + + return; +} +