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)
{
return BT_none;
else
return abs(board[scr][y][x]);
-}
+} //GetBlock
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;
RobotCmd(0, " %d", b);
}
RobotCmd(0, "\n");
- }
+ } //robot
changed[scr][y] = 0;
any = 1;
for (x = 0; c; (c >>= 1), (++x))
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];
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);
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;
}
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)
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