diff options
Diffstat (limited to 'examples/redis-unstable/src/lolwut6.c')
| -rw-r--r-- | examples/redis-unstable/src/lolwut6.c | 181 |
1 files changed, 0 insertions, 181 deletions
diff --git a/examples/redis-unstable/src/lolwut6.c b/examples/redis-unstable/src/lolwut6.c deleted file mode 100644 index e88be3b..0000000 --- a/examples/redis-unstable/src/lolwut6.c +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (c) 2019-Present, Redis Ltd. - * All rights reserved. - * - * Licensed under your choice of (a) the Redis Source Available License 2.0 - * (RSALv2); or (b) the Server Side Public License v1 (SSPLv1); or (c) the - * GNU Affero General Public License v3 (AGPLv3). - * - * ---------------------------------------------------------------------------- - * - * This file implements the LOLWUT command. The command should do something - * fun and interesting, and should be replaced by a new implementation at - * each new version of Redis. - * - * Thanks to Michele Hiki Falcone for the original image that inspired - * the image, part of his game, Plaguemon. - * - * Thanks to the Shhh computer art collective for the help in tuning the - * output to have a better artistic effect. - */ - -#include "server.h" -#include "lolwut.h" - -/* Render the canvas using the four gray levels of the standard color - * terminal: they match very well to the grayscale display of the gameboy. */ -static sds renderCanvas(lwCanvas *canvas) { - sds text = sdsempty(); - for (int y = 0; y < canvas->height; y++) { - for (int x = 0; x < canvas->width; x++) { - int color = lwGetPixel(canvas,x,y); - char *ce; /* Color escape sequence. */ - - /* Note that we set both the foreground and background color. - * This way we are able to get a more consistent result among - * different terminals implementations. */ - switch(color) { - case 0: ce = "0;30;40m"; break; /* Black */ - case 1: ce = "0;90;100m"; break; /* Gray 1 */ - case 2: ce = "0;37;47m"; break; /* Gray 2 */ - case 3: ce = "0;97;107m"; break; /* White */ - default: ce = "0;30;40m"; break; /* Just for safety. */ - } - text = sdscatprintf(text,"\033[%s \033[0m",ce); - } - if (y != canvas->height-1) text = sdscatlen(text,"\n",1); - } - return text; -} - -/* Draw a skyscraper on the canvas, according to the parameters in the - * 'skyscraper' structure. Window colors are random and are always one - * of the two grays. */ -struct skyscraper { - int xoff; /* X offset. */ - int width; /* Pixels width. */ - int height; /* Pixels height. */ - int windows; /* Draw windows if true. */ - int color; /* Color of the skyscraper. */ -}; - -void generateSkyscraper(lwCanvas *canvas, struct skyscraper *si) { - int starty = canvas->height-1; - int endy = starty - si->height + 1; - for (int y = starty; y >= endy; y--) { - for (int x = si->xoff; x < si->xoff+si->width; x++) { - /* The roof is four pixels less wide. */ - if (y == endy && (x <= si->xoff+1 || x >= si->xoff+si->width-2)) - continue; - int color = si->color; - /* Alter the color if this is a place where we want to - * draw a window. We check that we are in the inner part of the - * skyscraper, so that windows are far from the borders. */ - if (si->windows && - x > si->xoff+1 && - x < si->xoff+si->width-2 && - y > endy+1 && - y < starty-1) - { - /* Calculate the x,y position relative to the start of - * the window area. */ - int relx = x - (si->xoff+1); - int rely = y - (endy+1); - - /* Note that we want the windows to be two pixels wide - * but just one pixel tall, because terminal "pixels" - * (characters) are not square. */ - if (relx/2 % 2 && rely % 2) { - do { - color = 1 + rand() % 2; - } while (color == si->color); - /* Except we want adjacent pixels creating the same - * window to be the same color. */ - if (relx % 2) color = lwGetPixel(canvas,x-1,y); - } - } - lwDrawPixel(canvas,x,y,color); - } - } -} - -/* Generate a skyline inspired by the parallax backgrounds of 8 bit games. */ -void generateSkyline(lwCanvas *canvas) { - struct skyscraper si; - - /* First draw the background skyscraper without windows, using the - * two different grays. We use two passes to make sure that the lighter - * ones are always in the background. */ - for (int color = 2; color >= 1; color--) { - si.color = color; - for (int offset = -10; offset < canvas->width;) { - offset += rand() % 8; - si.xoff = offset; - si.width = 10 + rand()%9; - if (color == 2) - si.height = canvas->height/2 + rand()%canvas->height/2; - else - si.height = canvas->height/2 + rand()%canvas->height/3; - si.windows = 0; - generateSkyscraper(canvas, &si); - if (color == 2) - offset += si.width/2; - else - offset += si.width+1; - } - } - - /* Now draw the foreground skyscraper with the windows. */ - si.color = 0; - for (int offset = -10; offset < canvas->width;) { - offset += rand() % 8; - si.xoff = offset; - si.width = 5 + rand()%14; - if (si.width % 4) si.width += (si.width % 3); - si.height = canvas->height/3 + rand()%canvas->height/2; - si.windows = 1; - generateSkyscraper(canvas, &si); - offset += si.width+5; - } -} - -/* The LOLWUT 6 command: - * - * LOLWUT [columns] [rows] - * - * By default the command uses 80 columns, 40 squares per row - * per column. - */ -void lolwut6Command(client *c) { - long cols = 80; - long rows = 20; - - /* Parse the optional arguments if any. */ - if (c->argc > 1 && - getLongFromObjectOrReply(c,c->argv[1],&cols,NULL) != C_OK) - return; - - if (c->argc > 2 && - getLongFromObjectOrReply(c,c->argv[2],&rows,NULL) != C_OK) - return; - - /* Limits. We want LOLWUT to be always reasonably fast and cheap to execute - * so we have maximum number of columns, rows, and output resolution. */ - if (cols < 1) cols = 1; - if (cols > 1000) cols = 1000; - if (rows < 1) rows = 1; - if (rows > 1000) rows = 1000; - - /* Generate the city skyline and reply. */ - lwCanvas *canvas = lwCreateCanvas(cols,rows,3); - generateSkyline(canvas); - sds rendered = renderCanvas(canvas); - rendered = sdscat(rendered, - "\nDedicated to the 8 bit game developers of past and present.\n" - "Original 8 bit image from Plaguemon by hikikomori. Redis ver. "); - rendered = sdscat(rendered,REDIS_VERSION); - rendered = sdscatlen(rendered,"\n",1); - addReplyVerbatim(c,rendered,sdslen(rendered),"txt"); - sdsfree(rendered); - lwFreeCanvas(canvas); -} |
