diff options
Diffstat (limited to 'draw.c')
| -rw-r--r-- | draw.c | 1310 |
1 files changed, 655 insertions, 655 deletions
@@ -1,655 +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 ; i++)
- {
- x += sx;
- cumul += dy;
- if(cumul > dx)
- {
- cumul -= dx;
- y += sy;
- }
- pixel(buffer, x, y, color);
- }
- }
- else
- {
- cumul = dy / 2;
- for(i=1 ; i<dy ; i++)
- {
- y += sy;
- cumul += dx;
- if(cumul > 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;
- }
-}
+#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 ; i++) + { + x += sx; + cumul += dy; + if(cumul > dx) + { + cumul -= dx; + y += sy; + } + pixel(buffer, x, y, color); + } + } + else + { + cumul = dy / 2; + for(i=1 ; i<dy ; i++) + { + y += sy; + cumul += dx; + if(cumul > 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; + } +} |
