From ba07c2bc98fdba991b6d6444d57f0f897cf5959f Mon Sep 17 00:00:00 2001 From: schneefux Date: Sun, 12 Jun 2016 20:08:57 +0200 Subject: import full project --- src/draw.c | 655 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 655 insertions(+) create mode 100644 src/draw.c (limited to 'src/draw.c') diff --git a/src/draw.c b/src/draw.c new file mode 100644 index 0000000..de2d6c5 --- /dev/null +++ b/src/draw.c @@ -0,0 +1,655 @@ +#include "sprites.h" +#include "global.h" + +//also from ML, a bit modified + +void pixel(char *buffer, int x, int y, int type) +{ + if(x&~127 || y&~63) return; + switch (type) + { + case 0: + (*(buffer + (y << 4) + (x >> 3))) &= ( ~ (128 >> (x & 7))); + (*(1024 + buffer + (y << 4) + (x >> 3))) &= ( ~ (128 >> (x & 7))); + (*(2048 + buffer + (y << 4) + (x >> 3))) &= ( ~ (128 >> (x & 7))); + break; + case 1: + (*(2048 + buffer + (y << 4) + (x >> 3))) |= (128 >> (x & 7)); + (*(1024 + buffer + (y << 4) + (x >> 3))) |= (128 >> (x & 7)); + (*(buffer + (y << 4) + (x >> 3))) |= (128 >> (x & 7)); + break; + } +} + +void pixelgray(char *buffer, int x,int y, int type) +{ + switch (type) + { + case 0: + (*(buffer + (y << 4) + (x >> 3))) &= ( ~ (128 >> (x & 7))); + (*(1024 + buffer + (y << 4) + (x >> 3))) &= ( ~ (128 >> (x & 7))); + (*(2048 + buffer + (y << 4) + (x >> 3))) &= ( ~ (128 >> (x & 7))); + break; + case 3: + (*(2048 + buffer + (y << 4) + (x >> 3))) |= (128 >> (x & 7)); + case 2: + (*(1024 + buffer + (y << 4) + (x >> 3))) |= (128 >> (x & 7)); + case 1: + (*(buffer + (y << 4) + (x >> 3))) |= (128 >> (x & 7)); + break; + } +} + +#define Abs(x) ((x < 0)? -x : x) +#define sgn(x) (x == 0)?0:(x > 0)?1:-1 + +void line(char *buffer, int x1, int y1, int x2, int y2, int color) +{ + int i, x, y, dx, dy, sx, sy, cumul; + + y1 = y1 + 7; + y2 = y2 + 7; + + x = x1; + y = y1; + dx = x2 - x1; + dy = y2 - y1; + sx = sgn(dx); + sy = sgn(dy); + dx = Abs(dx); + dy = Abs(dy); + pixel(buffer, x, y, color); + if(dx > dy) + { + cumul = dx / 2; + for(i=1 ; i dx) + { + cumul -= dx; + y += sy; + } + pixel(buffer, x, y, color); + } + } + else + { + cumul = dy / 2; + for(i=1 ; i dy) + { + cumul -= dy; + x += sx; + } + pixel(buffer, x, y, color); + } + } +} +//end of ML stuff + +void drawChar(char *buffer, char charact, int posx, int posy) +{ + int xcount, ycount; + + for(xcount = 0; xcount < 5; xcount ++) + { + for(ycount = 0; ycount < 3; ycount ++) + { + pixel(buffer, posx + xcount, posy - ycount, character[charact - 65][xcount][ycount]); + //this should be optimized: it is drawed pixel per pixel + } + } +} + +void drawString(char *buffer, char *string, unsigned char strlenght, int posx, int posy) +{ + int ycount, charcount; + + for(charcount = strlenght - 1 , ycount = posy; charcount >= 0; charcount --, ycount += 4) + { + drawChar(buffer, *(string + charcount), posx, ycount); + //every char seperately + } +} + +void drawNumber(char *buffer, char num, int posx, int posy) +{ + int xcount, ycount; + + for(xcount = 0; xcount < 5; xcount ++) + { + for(ycount = 0; ycount < 3; ycount ++) + { + pixel(buffer, (int)posx + xcount, (int)posy - ycount, (int)numbers[num][xcount][ycount]); + //like drawChar + } + } +} + +void fillbox(char *buffer, int posx, int posy, int type) +{ + int ycount, xcount; + + for(ycount = 0; ycount <= 4; ycount ++) + { + for(xcount = 0; xcount <= 4; xcount ++) + { + pixelgray(buffer, posx * 5 + xcount + 1, posy * 5 + ycount + 1 + 7, spritesheed[type][ycount][xcount]); + //draw a brick box pixel per pixel + } + } +} + +void normalfillbox(char *buffer, int posx, int posy, int type) +{ + int ycount, xcount; + + for(ycount = 0; ycount <= 4; ycount ++) + { + for(xcount = 0; xcount <= 4; xcount ++) + { + pixelgray(buffer, posx * 5 + xcount - 2, posy * 5 + ycount, spritesheed[type][ycount][xcount]); + //like fillbox, just a different position + } + } +} + +int DrawSprite() +{ + char fit = True; + + int xcount, ycount; + right = True; + left = True; + + memset(&changemap, 0, 210); + + //now draw a brick, the sizes are different + //structs and a drawing function would be better, it would save code + + switch(block) + { + case 1: + for(xcount = 0; xcount < 4; xcount ++) + { + for(ycount = 0; ycount < 3; ycount ++) + { + if(blockO[dir][ycount][xcount] == 1 && ypos - ycount - 2 >= 0) + { + if(xpos - xcount - 2 < 0 || xpos - xcount - 2 > 9 || ypos - ycount - 2 > 20) + { + fit = False; + } + else + { + changemap[ypos - ycount - 2][xpos - xcount - 2] = 1; + if(globalmap[ypos - ycount - 2][xpos - xcount - 2] != 0 || ypos - ycount - 2 >= 20) + { + fit = False; + } + if(globalmap[ypos - ycount - 2][xpos - xcount - 1 - 2] != 0 || xpos - xcount - 2 < 1) + { + right = False; + } + if(globalmap[ypos - ycount - 2][xpos - xcount + 1 - 2] != 0 || xpos - xcount - 2 > 8) + { + left = False; + } + } + } + } + } + break; + case 2: + for(xcount = 0; xcount < 4; xcount ++) + { + for(ycount = 0; ycount < 4; ycount ++) + { + if(blockI[dir][ycount][xcount] == 1 && ypos - ycount - 2 >= 0) + { + if(xpos - xcount - 2 < 0 || xpos - xcount - 2 > 9 || ypos - ycount - 2 > 20) + { + fit = False; + } + else + { + changemap[ypos - ycount - 2][xpos - xcount - 2] = 2; + if(globalmap[ypos - ycount - 2][xpos - xcount - 2] != 0 || ypos - ycount - 2 >= 20) + { + fit = False; + } + if(globalmap[ypos - ycount - 2][xpos - xcount - 1 - 2] != 0 || xpos - xcount - 2 < 1) + { + right = False; + } + if(globalmap[ypos - ycount - 2][xpos - xcount + 1 - 2] != 0 || xpos - xcount - 2 > 8) + { + left = False; + } + } + } + } + } + break; + case 3: + for(xcount = 0; xcount < 3; xcount ++) + { + for(ycount = 0; ycount < 3; ycount ++) + { + if(blockT[dir][ycount][xcount] == 1&& ypos - ycount - 2 >= 0) + { + if(xpos - xcount - 2 < 0 || xpos - xcount - 2 > 9 || ypos - ycount - 2 > 20) + { + fit = False; + } + else + { + changemap[ypos - ycount - 2][xpos - xcount - 2] = 3; + if(globalmap[ypos - ycount - 2][xpos - xcount - 2] != 0 || ypos - ycount - 2 >= 20) + { + fit = False; + } + if(globalmap[ypos - ycount - 2][xpos - xcount - 1 - 2] != 0 || xpos - xcount - 2 < 1) + { + right = False; + } + if(globalmap[ypos - ycount - 2][xpos - xcount + 1 - 2] != 0 || xpos - xcount - 2 > 8) + { + left = False; + } + } + } + } + } + break; + case 4: + for(xcount = 0; xcount < 3; xcount ++) + { + for(ycount = 0; ycount < 3; ycount ++) + { + if(blockJ[dir][ycount][xcount] == 1 && ypos - ycount - 2 >= 0) + { + if(xpos - xcount - 2 < 0 || xpos - xcount - 2 > 9 || ypos - ycount - 2 > 20) + { + fit = False; + } + else + { + changemap[ypos - ycount - 2][xpos - xcount - 2] = 4; + if(globalmap[ypos - ycount - 2][xpos - xcount - 2] != 0 || ypos - ycount - 2 >= 20) + { + fit = False; + } + if(globalmap[ypos - ycount - 2][xpos - xcount - 1 - 2] != 0 || xpos - xcount - 2 < 1) + { + right = False; + } + if(globalmap[ypos - ycount - 2][xpos - xcount + 1 - 2] != 0 || xpos - xcount - 2 > 8) + { + left = False; + } + } + } + } + } + break; + case 5: + for(xcount = 0; xcount < 3; xcount ++) + { + for(ycount = 0; ycount < 3; ycount ++) + { + if(blockL[dir][ycount][xcount] == 1 && ypos - ycount - 2 >= 0) + { + if(xpos - xcount - 2 < 0 || xpos - xcount - 2 > 9 || ypos - ycount - 2 > 20) + { + fit = False; + } + else + { + changemap[ypos - ycount - 2][xpos - xcount - 2] = 5; + if(globalmap[ypos - ycount - 2][xpos - xcount - 2] != 0 || ypos - ycount - 2 >= 20) + { + fit = False; + } + if(globalmap[ypos - ycount - 2][xpos - xcount - 1 - 2] != 0 || xpos - xcount - 2 < 1) + { + right = False; + } + if(globalmap[ypos - ycount - 2][xpos - xcount + 1 - 2] != 0 || xpos - xcount - 2 > 8) + { + left = False; + } + } + } + } + } + break; + case 6: + for(xcount = 0; xcount < 3; xcount ++) + { + for(ycount = 0; ycount < 3; ycount ++) + { + if(blockZ[dir][ycount][xcount] == 1 && ypos - ycount - 2 >= 0) + { + if(xpos - xcount - 2 < 0 || xpos - xcount - 2 > 9 || ypos - ycount - 2 > 20) + { + fit = False; + } + else + { + changemap[ypos - ycount - 2][xpos - xcount - 2] = 6; + if(globalmap[ypos - ycount - 2][xpos - xcount - 2] != 0 || ypos - ycount - 2 >= 20) + { + fit = False; + } + if(globalmap[ypos - ycount - 2][xpos - xcount - 1 - 2] != 0 || xpos - xcount - 2 < 1) + { + right = False; + } + if(globalmap[ypos - ycount - 2][xpos - xcount + 1 - 2] != 0 || xpos - xcount - 2 > 8) + { + left = False; + } + } + } + } + } + break; + case 7: + for(xcount = 0; xcount < 3; xcount ++) + { + for(ycount = 0; ycount < 3; ycount ++) + { + if(blockS[dir][ycount][xcount] == 1 && ypos - ycount - 2 >= 0) + { + if(xpos - xcount - 2 < 0 || xpos - xcount - 2 > 9 || ypos - ycount - 2 > 20) + { + fit = False; + } + else + { + changemap[ypos - ycount - 2][xpos - xcount - 2] = 7; + if(globalmap[ypos - ycount - 2][xpos - xcount - 2] != 0 || ypos - ycount - 2 >= 20) + { + fit = False; + } + if(globalmap[ypos - ycount - 2][xpos - xcount - 1 - 2] != 0 || xpos - xcount - 2 < 1) + { + right = False; + } + if(globalmap[ypos - ycount - 2][xpos - xcount + 1 - 2] != 0 || xpos - xcount - 2 > 8) + { + left = False; + } + } + } + } + } + break; + } + return fit; +} + +void DrawBlock() +{ + int xcount, ycount; + + clrbuffer(pScreen); + + drawNumber(pScreen, (int)(level / 10) % 10, 115, 39); + drawNumber(pScreen, (int)(level / 10) % 100 / 10, 115, 43); + + drawString(pScreen, &"LV", 2, 115, 59); + + drawNumber(pScreen, points % 10, 109, 39); + drawNumber(pScreen, points % 100 / 10, 109, 43); + drawNumber(pScreen, points % 1000 / 100, 109, 47); + drawNumber(pScreen, points % 10000 / 1000, 109, 51); + drawNumber(pScreen, points % 100000 / 10000, 109, 55); + drawNumber(pScreen, points % 1000000 / 100000, 109, 59); + drawNumber(pScreen, points / 1000000, 109, 63); + + drawString(pScreen, &"PTS", 3, 103, 51); + + drawString(pScreen, &"LINE", 4, 121, 51); + + drawNumber(pScreen, level % 10, 121, 39); + drawNumber(pScreen, level % 100 / 10, 121, 43); + drawNumber(pScreen, level % 1000 / 100, 121, 47); + + if(DrawSprite() == False) + { + for(ycount = 0; ycount < 20; ycount ++) + { + for(xcount = 0; xcount < 10; xcount ++) + { + if(changemap[ycount + 1][xcount] != 0) + { + globalmap[ycount][xcount] = changemap[ycount + 1][xcount]; + } + } + } + CreateBlock(); + if(nextdir == Fast) + { + nextdir = Down; + } + } + + line(pScreen, 0 , 0 , 101 , 0, 1); + line(pScreen, 0 , 0 , 0 , 51, 1); + line(pScreen, 101 , 0 , 101 , 51, 1); + line(pScreen, 101 , 51 , 0 , 51, 1); + + for(ycount = 0; ycount < 20; ycount ++) + { + for(xcount = 0; xcount < 10; xcount ++) + { + if(globalmap[ycount][xcount] != 0 || changemap[ycount][xcount] != 0) + { + fillbox(pScreen, ycount, xcount, (globalmap[ycount][xcount] != 0)? globalmap[ycount][xcount] - 1 : changemap[ycount][xcount] - 1); + } + } + } + + drawString(pScreen, &"NEXT", 4, 103, 2); + + //draw the next block + + switch(nextblock) + { + case 1 : + for(xcount = 0; xcount < 4; xcount ++) + { + for(ycount = 0; ycount < 3; ycount ++) + { + if(blockO[0][ycount][xcount] == 1) + { + normalfillbox(pScreen, 22 + ycount , 0 + xcount, 0); + } + } + } + break; + + case 2 : + for(xcount = 0; xcount < 4; xcount ++) + { + for(ycount = 0; ycount < 4; ycount ++) + { + if(blockI[0][ycount][xcount] == 1) + { + normalfillbox(pScreen, 22 + ycount , 0 + xcount, 1); + } + } + } + break; + + case 3 : + for(xcount = 0; xcount < 3; xcount ++) + { + for(ycount = 0; ycount < 3; ycount ++) + { + if(blockT[0][ycount][xcount] == 1) + { + normalfillbox(pScreen, 22 + ycount , 0 + xcount, 2); + } + } + } + break; + + case 4 : + for(xcount = 0; xcount < 3; xcount ++) + { + for(ycount = 0; ycount < 3; ycount ++) + { + if(blockJ[0][ycount][xcount] == 1) + { + normalfillbox(pScreen, 22 + ycount , 0 + xcount, 3); + } + } + } + break; + + case 5 : + for(xcount = 0; xcount < 3; xcount ++) + { + for(ycount = 0; ycount < 3; ycount ++) + { + if(blockL[0][ycount][xcount] == 1) + { + normalfillbox(pScreen, 22 + ycount , 0 + xcount, 4); + } + } + } + break; + + case 6 : + for(xcount = 0; xcount < 3; xcount ++) + { + for(ycount = 0; ycount < 3; ycount ++) + { + if(blockZ[0][ycount][xcount] == 1) + { + normalfillbox(pScreen, 22 + ycount , 0 + xcount, 5); + } + } + } + break; + + case 7 : + for(xcount = 0; xcount < 3; xcount ++) + { + for(ycount = 0; ycount < 3; ycount ++) + { + if(blockS[0][ycount][xcount] == 1) + { + normalfillbox(pScreen, 22 + ycount , 0 + xcount, 6); + } + } + } + break; + } + + drawString(pScreen, &"HOLD", 4, 103, 22); + + //draw the stored block + + switch(hold) + { + case 1 : + for(xcount = 0; xcount < 4; xcount ++) + { + for(ycount = 0; ycount < 3; ycount ++) + { + if(blockO[0][ycount][xcount] == 1) + { + normalfillbox(pScreen, 22 + ycount , 4 + xcount, 0); + } + } + } + break; + + case 2 : + for(xcount = 0; xcount < 4; xcount ++) + { + for(ycount = 0; ycount < 4; ycount ++) + { + if(blockI[0][ycount][xcount] == 1) + { + normalfillbox(pScreen, 22 + ycount , 4 + xcount, 1); + } + } + } + break; + + case 3 : + for(xcount = 0; xcount < 3; xcount ++) + { + for(ycount = 0; ycount < 3; ycount ++) + { + if(blockT[0][ycount][xcount] == 1) + { + normalfillbox(pScreen, 22 + ycount , 4 + xcount, 2); + } + } + } + break; + + case 4 : + for(xcount = 0; xcount < 3; xcount ++) + { + for(ycount = 0; ycount < 3; ycount ++) + { + if(blockJ[0][ycount][xcount] == 1) + { + normalfillbox(pScreen, 22 + ycount , 4 + xcount, 3); + } + } + } + break; + + case 5 : + for(xcount = 0; xcount < 3; xcount ++) + { + for(ycount = 0; ycount < 3; ycount ++) + { + if(blockL[0][ycount][xcount] == 1) + { + normalfillbox(pScreen, 22 + ycount , 4 + xcount, 4); + } + } + } + break; + + case 6 : + for(xcount = 0; xcount < 3; xcount ++) + { + for(ycount = 0; ycount < 3; ycount ++) + { + if(blockZ[0][ycount][xcount] == 1) + { + normalfillbox(pScreen, 22 + ycount , 4 + xcount, 5); + } + } + } + break; + + case 7 : + for(xcount = 0; xcount < 3; xcount ++) + { + for(ycount = 0; ycount < 3; ycount ++) + { + if(blockS[0][ycount][xcount] == 1) + { + normalfillbox(pScreen, 22 + ycount , 4 + xcount, 6); + } + } + } + break; + } +} -- cgit v1.3.1