X-Git-Url: http://git.shiar.net/netris.git/blobdiff_plain/21add7c13bc1df386e45aad2939ee5ff2a152c2b..4f561019fc85c2817e3a72341397d1df32bc0868:/board.c diff --git a/board.c b/board.c index 8524cc5..55983b4 100644 --- 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