unofficial version 0.7.1: ui improvements
[netris.git] / board.c
diff --git a/board.c b/board.c
index 8524cc5b7adeceff018baa0c2b8df445fca8880a..55983b477de3513218ebab9b019e0db1e029956f 100644 (file)
--- a/board.c
+++ b/board.c
@@ -33,11 +33,18 @@ static BlockType oldBoard[MAX_SCREENS][MAX_BOARD_HEIGHT][MAX_BOARD_WIDTH];
 static unsigned int changed[MAX_SCREENS][MAX_BOARD_HEIGHT];
 static int falling[MAX_SCREENS][MAX_BOARD_WIDTH];
 static int oldFalling[MAX_SCREENS][MAX_BOARD_WIDTH];
+static int shadowy;
 
-ExtFunc void CleanupBoard(int scr)
+
+ExtFunc void ClearField(int scr)
 {
-       CleanupScreen(scr);
-}
+       int y, x;
+
+       for (y = Players[scr].boardHeight - 1; y >= 0; --y)
+               for (x = 0; x < Players[scr].boardWidth; ++x) {
+                       oldBoard[scr][y][x] = board[scr][y][x] = BT_none;
+               }
+} //ClearField
 
 ExtFunc BlockType GetBlock(int scr, int y, int x)
 {
@@ -47,7 +54,7 @@ ExtFunc BlockType GetBlock(int scr, int y, int x)
                return BT_none;
        else
                return abs(board[scr][y][x]);
-}
+} //GetBlock
 
 ExtFunc void SetBlock(int scr, int y, int x, BlockType type)
 {
@@ -58,10 +65,10 @@ ExtFunc void SetBlock(int scr, int y, int x, BlockType type)
                board[scr][y][x] = type;
                changed[scr][y] |= 1 << x;
        }
-}
+} //SetBlock
 
 ExtFunc int RefreshBoard(int scr)
-{
+{ //draw changes to screen
        int y, x, any = 0;
        unsigned int c;
        BlockType b;
@@ -77,7 +84,7 @@ ExtFunc int RefreshBoard(int scr)
                                        RobotCmd(0, " %d", b);
                                }
                                RobotCmd(0, "\n");
-                       }
+                       } //robot
                        changed[scr][y] = 0;
                        any = 1;
                        for (x = 0; c; (c >>= 1), (++x))
@@ -85,9 +92,8 @@ ExtFunc int RefreshBoard(int scr)
                                        PlotBlock(scr, y, x, B_OLD(board[scr][y][x]));
                                        oldBoard[scr][y][x] = B_OLD(board[scr][y][x]);
                                }
-               }
-       if (robotEnable)
-               RobotTimeStamp();
+               } //changed row
+       if (robotEnable) RobotTimeStamp();
        for (x = 0; x < Players[scr].boardWidth; ++x)
                if (oldFalling[scr][x] != !!falling[scr][x]) {
                        oldFalling[scr][x] = !!falling[scr][x];
@@ -95,78 +101,90 @@ ExtFunc int RefreshBoard(int scr)
                        any = 1;
                }
        return any;
-}
+} //RefreshBoard
 
 ExtFunc int GlanceFunc(int scr, int y, int x, BlockType type, void *data)
 {
        PlotBlock1(scr, 20 - y, x * 2, type);
        return 0;
-}
+} //GlanceFunc
+
+ExtFunc int ShadowFunc(int scr, int y, int x, BlockType type, void *data)
+{ //draw shadow
+       SetBlock(scr, y, x, BT_shadow);
+       return 0;
+} //ShadowFunc
 
 ExtFunc int PlotFunc(int scr, int y, int x, BlockType type, void *data)
 {
        SetBlock(scr, y, x, type);
        return 0;
 }
+ExtFunc void PlotShape(Shape *shape, int scr, int y, int x, int falling, int shadow)
+{ //put shape on field
+       if (shadow && scr == me) {
+               for (shadowy = y - 1; shadowy >= 0; shadowy--)
+                       if (!ShapeFits(shape, scr, shadowy, x))
+                               break;
+               ShapeIterate(shape, scr, shadowy + 1, x, falling, ShadowFunc, NULL);
+       } //draw shadow
+       ShapeIterate(shape, scr, y, x, falling, PlotFunc, NULL);
+} //PlotShape
 
 ExtFunc int EraseFunc(int scr, int y, int x, BlockType type, void *data)
 {
        SetBlock(scr, y, x, BT_none);
        return 0;
 }
+ExtFunc void EraseShape(Shape *shape, int scr, int y, int x, int shadow)
+{ //remove block from field
+       ShapeIterate(shape, scr, y, x, 0, EraseFunc, NULL);
+       if (shadow && scr == me) //draw shadow
+               ShapeIterate(shape, scr, shadowy + 1, x, 0, EraseFunc, NULL);
+} //EraseShape
 
 ExtFunc int CollisionFunc(int scr, int y, int x, BlockType type, void *data)
 {
-       return GetBlock(scr, y, x) != BT_none;
+       return GetBlock(scr, y, x) > BT_none;
 }
+ExtFunc int ShapeFits(Shape *shape, int scr, int y, int x)
+{ //check if there's nothing in the way
+       return !ShapeIterate(shape, scr, y, x, 0, CollisionFunc, NULL);
+} //ShapeFits
 
 ExtFunc int VisibleFunc(int scr, int y, int x, BlockType type, void *data)
 {
        return (y >= 0 && y < Players[scr].boardVisible &&
                        x >= 0 && x < Players[scr].boardWidth);
 }
-
-ExtFunc void PlotShape(Shape *shape, int scr, int y, int x, int falling)
-{
-       ShapeIterate(shape, scr, y, x, falling, PlotFunc, NULL);
-}
-
-ExtFunc void EraseShape(Shape *shape, int scr, int y, int x)
-{
-       ShapeIterate(shape, scr, y, x, 0, EraseFunc, NULL);
-}
-
-ExtFunc int ShapeFits(Shape *shape, int scr, int y, int x)
-{
-       return !ShapeIterate(shape, scr, y, x, 0, CollisionFunc, NULL);
-}
-
 ExtFunc int ShapeVisible(Shape *shape, int scr, int y, int x)
 {
        return ShapeIterate(shape, scr, y, x, 0, VisibleFunc, NULL);
-}
+} //ShapeVisible
 
 ExtFunc int MovePiece(int scr, int deltaY, int deltaX)
 {
        int result;
 
        EraseShape(Players[scr].curShape, scr,
-               Players[scr].curY, Players[scr].curX);
+               Players[scr].curY, Players[scr].curX, 1);
        result = ShapeFits(Players[scr].curShape, scr, Players[scr].curY + deltaY,
                                Players[scr].curX + deltaX);
        if (result) {
                Players[scr].curY += deltaY;
                Players[scr].curX += deltaX;
        }
-       PlotShape(Players[scr].curShape, scr, Players[scr].curY, Players[scr].curX, 1);
+       PlotShape(Players[scr].curShape, scr, Players[scr].curY, Players[scr].curX,
+               1, 1);
        return result;
-}
+} //MovePiece
 
 ExtFunc int RotatePiece(int scr, int dir)
 {
        int result;
 
-       EraseShape(Players[scr].curShape, scr, Players[scr].curY, Players[scr].curX);
+       EraseShape(Players[scr].curShape, scr, Players[scr].curY,
+               Players[scr].curX, 1);
        result = ShapeFits(dir ? Players[scr].curShape->rotateTo
                                                   : Players[scr].curShape->rotateFrom,
                scr, Players[scr].curY, Players[scr].curX);
@@ -174,32 +192,32 @@ ExtFunc int RotatePiece(int scr, int dir)
                Players[scr].curShape = dir ? Players[scr].curShape->rotateTo
                                                                        : Players[scr].curShape->rotateFrom;
        PlotShape(Players[scr].curShape, scr,
-                       Players[scr].curY, Players[scr].curX, 1);
+                       Players[scr].curY, Players[scr].curX, 1, 1);
        return result;
-}
+} //RotatePiece
 
 ExtFunc int DropPiece(int scr)
 {
        int count = 0;
 
        EraseShape(Players[scr].curShape, scr,
-               Players[scr].curY, Players[scr].curX);
+               Players[scr].curY, Players[scr].curX, 1);
        while (ShapeFits(Players[scr].curShape, scr,
                        Players[scr].curY - 1, Players[scr].curX)) {
                --Players[scr].curY;
                ++count;
        }
        PlotShape(Players[scr].curShape, scr,
-               Players[scr].curY, Players[scr].curX, 1);
+               Players[scr].curY, Players[scr].curX, 1, 0);
        return count;
-}
+} //DropPiece
 
 ExtFunc int LineIsFull(int scr, int y)
 {
        int x;
 
        for (x = 0; x < Players[scr].boardWidth; ++x)
-               if (GetBlock(scr, y, x) == BT_none)
+               if (GetBlock(scr, y, x) <= BT_none)
                        return 0;
        return 1;
 }
@@ -242,7 +260,7 @@ ExtFunc void InsertJunk(int scr, int count, int column)
        int y, x;
 
        EraseShape(Players[scr].curShape, scr,
-               Players[scr].curY, Players[scr].curX);
+               Players[scr].curY, Players[scr].curX, 1);
        for (y = Players[scr].boardHeight - count - 1; y >= 0; --y)
                CopyLine(scr, y, y + count);
        for (y = 0; y < count; ++y)
@@ -251,10 +269,11 @@ ExtFunc void InsertJunk(int scr, int count, int column)
        Players[scr].curY += count; //move piece up..
        for (y = 0; y < count; ++y)
                if (ShapeFits(Players[scr].curShape, scr, Players[scr].curY - 1, Players[scr].curX))
-                       Players[scr].curY--; //..and down as far as possible
+                       Players[scr].curY--; //..and down again as far as possible
                else break;
-       PlotShape(Players[scr].curShape, scr, Players[scr].curY, Players[scr].curX, 1);
-}
+       PlotShape(Players[scr].curShape, scr, Players[scr].curY, Players[scr].curX,
+               1, 1);
+} //InoertJunk
 
 /*
  * vi: ts=4 ai