#include "demo.h" //0 = trans //1 = white //2 = yellow //3 = green static const char luigi1[] = "0000000000000000" "0000000000000000" "0000000111110000" "0000011111120000" "0000111111220000" "0000111111111110" "0000333223222000" "0003223223322220" "0003223322222222" "0033223322232222" "0033222223333330" "0003322222333330" "0000032222222200" "0000311122200000" "0003133313000000" "0003133331300000" "0033133333112200" "0031133333332222" "0031113333332222" "0001113333333222" "0001111333333222" "0001111113331000" "0001111111111000" "0001111111113000" "3333111111131100" "3333111113311100" "3333111131111000" "3333111001111000" "3333000003333000" "3300000003333000" "3000000003333330" "0000000003333330"; static const char luigi2[] = "0000000000000000" "0000001111100000" "0000111111200000" "0001111112200000" "0001111111111100" "0003332232220000" "0032232233222200" "0032233222222220" "0332233222322220" "0332222233333300" "0033222223333300" "0003322222222000" "0000111122000000" "0003133113300000" "0031333311300000" "0031333311330000" "0031333311130000" "0031333332230000" "0031333322220000" "0011133322221000" "0011133322221100" "0011113322211100" "0011111133111100" "0001111133311000" "0000111333333000" "0000113333330000" "0000011333300000" "0000031113330000" "0000033330330000" "0000333330000000" "0000333333300000" "0000003333300000"; static const char luigi3[] = "0000001111100000" "0000111111200000" "0001111112200000" "0001111111111100" "0003332232220000" "0032232233222200" "0032233222222220" "0332233222322220" "0332222233333300" "0333222223333300" "0003322222222000" "0000033322000000" "0000111133100020" "0003333113310222" "0033333311313222" "0333333311331222" "0333333311331323" "0333333111331330" "3333331112132300" "3333111111111000" "2222211111111000" "2222211111111003" "2222111111111033" "0222111111133333" "0001311111133333" "0031131111133333" "3331113311133333" "3333111100033333" "3333310000000000" "0333000000000000" "0333000000000000" "0033300000000000"; static int draw_luigi(struct ncplane* n, const char* sprite){ cell bgc = CELL_TRIVIAL_INITIALIZER; cell_bg_set_alpha(&bgc, 3); ncplane_set_background(n, &bgc); cell_release(n, &bgc); size_t s; int sbytes; uint64_t channels = 0; // optimization so we can elide more color changes, see README's "#perf" notcurses_bg_prep(&channels, 0x00, 0x00, 0x00); for(s = 0 ; s < strlen(sprite) ; ++s){ switch(sprite[s]){ case '0': ncplane_cursor_move_yx(n, (s + 1) / 16, (s + 1) % 16); break; case '1': notcurses_fg_prep(&channels, 0xff, 0xff, 0xff); break; case '2': notcurses_fg_prep(&channels, 0xe3, 0x9d, 0x25); break; case '3': notcurses_fg_prep(&channels, 0x3a, 0x84, 0x00); break; } if(sprite[s] != '0'){ if(ncplane_putegc(n, "\u2588", 0, channels, &sbytes) != 1){ return -1; } } } return 0; } int luigi_demo(struct notcurses* nc){ struct ncplane* n = notcurses_stdplane(nc); int averr = 0; struct ncvisual* nv = ncplane_visual_open(n, "../tests/megaman2.bmp", &averr); if(nv == NULL){ return -1; } if(ncvisual_decode(nv, &averr) == NULL){ return -1; } if(ncvisual_render(nv)){ return -1; } int rows, cols; ncplane_dim_yx(n, &rows, &cols); // he should be walking on the platform ~4/5 of the way down const int height = 32; int yoff = rows * 4 / 5 - height + 1; // tuned struct ncplane* lns[3]; int i; for(i = 0 ; i < 3 ; ++i){ lns[i] = notcurses_newplane(nc, height, 16, yoff, -16, NULL); if(lns[i] == NULL){ while(--i){ ncplane_destroy(lns[i]); } return -1; } } draw_luigi(lns[0], luigi1); draw_luigi(lns[1], luigi2); draw_luigi(lns[2], luigi3); struct ncplane* lastseen = NULL; struct timespec stepdelay; ns_to_timespec(timespec_to_ns(&demodelay) / (cols - 16 - 1), &stepdelay); for(i = 0 ; i < cols - 16 - 1 ; ++i){ if(lastseen){ // hide the previous sprite ncplane_move_yx(lastseen, yoff, -16); } if(i % 4 == 3){ lastseen = lns[1]; }else{ lastseen = lns[i % 4]; } ncplane_move_yx(lastseen, yoff, i); notcurses_render(nc); nanosleep(&stepdelay, NULL); } for(i = 0 ; i < 3 ; ++i){ ncplane_destroy(lns[i]); } ncvisual_destroy(nv); return 0; }