initial interface requests
[netris.git] / game.c
diff --git a/game.c b/game.c
index b40c12948035f365d4fc7a5a5463bd57c33577dc..423befb475c35d7686916d6f59cdd4118998fbd6 100644 (file)
--- a/game.c
+++ b/game.c
 #include <sys/types.h>
 #include <netinet/in.h>
 
-enum { KT_left, KT_rotate, KT_right, KT_drop, KT_down,
+enum { KT_left, KT_right, KT_rotright, KT_rotleft, KT_drop, KT_down,
        KT_toggleSpy, KT_pause, KT_faster, KT_redraw, KT_numKeys };
 
 static char *keyNames[KT_numKeys+1] = {
-       "Left", "Rotate", "Right", "Drop", "Down", "ToggleSpy", "Pause",
-       "Faster", "Redraw", NULL };
+       "Left", "Right", "RotRight", "RotLeft", "Drop", "Down",
+       "ToggleSpy", "Pause", "Faster", "Redraw", NULL };
 
 static char *gameNames[GT_len] = { "OnePlayer", "ClassicTwo" };
 
@@ -77,14 +77,19 @@ ExtFunc void MapKeys(char *newKeys)
 
 ExtFunc int StartNewPiece(int scr, Shape *shape)
 {
-       curShape[scr] = shape;
+       if (nextShape[scr]) {
+               curShape[scr] = nextShape[scr];
+               nextShape[scr] = shape;
+       }
+       else
+               curShape[scr] = shape;
        curY[scr] = boardVisible[scr] + 4;
        curX[scr] = boardWidth[scr] / 2;
-       while (!ShapeVisible(shape, scr, curY[scr], curX[scr]))
+       while (!ShapeVisible(curShape[scr], scr, curY[scr], curX[scr]))
                --curY[scr];
-       if (!ShapeFits(shape, scr, curY[scr], curX[scr]))
+       if (!ShapeFits(curShape[scr], scr, curY[scr], curX[scr]))
                return 0;
-       PlotShape(shape, scr, curY[scr], curX[scr], 1);
+       PlotShape(curShape[scr], scr, curY[scr], curX[scr], 1);
        return 1;
 }
 
@@ -92,6 +97,7 @@ ExtFunc void OneGame(int scr, int scr2)
 {
        MyEvent event;
        int linesCleared, changed = 0;
+       int totalDrops = 0, totalLines = 0, totalAdds = 0;
        int spied = 0, spying = 0, dropMode = 0;
        int oldPaused = 0, paused = 0, pausedByMe = 0, pausedByThem = 0;
        long pauseTimeLeft;
@@ -127,7 +133,9 @@ ExtFunc void OneGame(int scr, int scr2)
                RobotCmd(0, "BeginGame\n");
                RobotTimeStamp();
        }
+       nextShape[scr] = ChooseOption(stdOptions);
        while (StartNewPiece(scr, ChooseOption(stdOptions))) {
+               ShowScore(scr, totalDrops, totalLines, totalAdds);
                if (robotEnable && !fairRobot)
                        RobotCmd(1, "NewPiece %d\n", ++pieceCount);
                if (spied) {
@@ -136,7 +144,7 @@ ExtFunc void OneGame(int scr, int scr2)
 
                        shapeNum = ShapeToNetNum(curShape[scr]);
                        data[0] = hton2(shapeNum);
-                       SendPacket(NP_newPiece, sizeof(data), data);
+                       SendPacket(scr, NP_newPiece, sizeof(data), data);
                }
                for (;;) {
                        changed = RefreshBoard(scr) || changed;
@@ -152,7 +160,7 @@ ExtFunc void OneGame(int scr, int scr2)
                                        if (!MovePiece(scr, -1, 0))
                                                goto nextPiece;
                                        else if (spied)
-                                               SendPacket(NP_down, 0, NULL);
+                                               SendPacket(scr, NP_down, 0, NULL);
                                        break;
                                case E_key:
                                        p = strchr(keyTable, tolower(event.u.key));
@@ -171,19 +179,24 @@ ExtFunc void OneGame(int scr, int scr2)
                                        switch(key) {
                                                case KT_left:
                                                        if (MovePiece(scr, 0, -1) && spied)
-                                                               SendPacket(NP_left, 0, NULL);
+                                                               SendPacket(scr, NP_left, 0, NULL);
                                                        break;
                                                case KT_right:
                                                        if (MovePiece(scr, 0, 1) && spied)
-                                                               SendPacket(NP_right, 0, NULL);
+                                                               SendPacket(scr, NP_right, 0, NULL);
+                                                       break;
+                                               case KT_rotleft:
+                                                       if (RotatePiece(scr, 0) && spied)
+                                                               SendPacket(scr, NP_rotleft, 0, NULL);
                                                        break;
-                                               case KT_rotate:
-                                                       if (RotatePiece(scr) && spied)
-                                                               SendPacket(NP_rotate, 0, NULL);
+                                               case KT_rotright:
+                                                       if (RotatePiece(scr, 1) && spied)
+                                                               SendPacket(scr, NP_rotright, 0, NULL);
                                                        break;
                                                case KT_down:
                                                        if (MovePiece(scr, -1, 0) && spied)
-                                                               SendPacket(NP_down, 0, NULL);
+                                                               SendPacket(scr, NP_down, 0, NULL);
+                                                       SetITimer(speed, speed);
                                                        break;
                                                case KT_toggleSpy:
                                                        spying = (!spying) && (scr2 >= 0);
@@ -191,8 +204,11 @@ ExtFunc void OneGame(int scr, int scr2)
                                                case KT_drop:
                                                        if (DropPiece(scr) > 0) {
                                                                if (spied)
-                                                                       SendPacket(NP_drop, 0, NULL);
-                                                               SetITimer(speed, speed);
+                                                                       SendPacket(scr, NP_drop, 0, NULL);
+                                                               if (dropModeEnable == 2)
+                                                                       SetITimer(speed, 1); //instantdrop
+                                                               else
+                                                                       SetITimer(speed, speed);
                                                        }
                                                        dropMode = dropModeEnable;
                                                        break;
@@ -202,7 +218,7 @@ ExtFunc void OneGame(int scr, int scr2)
                                                                netint2 data[1];
 
                                                                data[0] = hton2(pausedByMe);
-                                                               SendPacket(NP_pause, sizeof(data), data);
+                                                               SendPacket(scr, NP_pause, sizeof(data), data);
                                                        }
                                                        paused = pausedByMe || pausedByThem;
                                                        if (robotEnable)
@@ -227,7 +243,7 @@ ExtFunc void OneGame(int scr, int scr2)
                                        }
                                        if (dropMode && DropPiece(scr) > 0) {
                                                if (spied)
-                                                       SendPacket(NP_drop, 0, NULL);
+                                                       SendPacket(scr, NP_drop, 0, NULL);
                                                SetITimer(speed, speed);
                                        }
                                        break;
@@ -263,7 +279,8 @@ ExtFunc void OneGame(int scr, int scr2)
                                                        data[1] = hton2(column);
                                                        InsertJunk(scr, ntoh2(data[0]), column);
                                                        if (spied)
-                                                               SendPacket(NP_insertJunk, sizeof(data), data);
+                                                               SendPacket(scr, NP_insertJunk, sizeof(data), data);
+//                                                     Message("Opponent added %d lines");
                                                        break;
                                                }
                                                case NP_newPiece:
@@ -286,8 +303,11 @@ ExtFunc void OneGame(int scr, int scr2)
                                                case NP_right:
                                                        MovePiece(scr2, 0, 1);
                                                        break;
-                                               case NP_rotate:
-                                                       RotatePiece(scr2);
+                                               case NP_rotleft:
+                                                       RotatePiece(scr2, 0);
+                                                       break;
+                                               case NP_rotright:
+                                                       RotatePiece(scr2, 1);
                                                        break;
                                                case NP_drop:
                                                        DropPiece(scr2);
@@ -338,16 +358,20 @@ ExtFunc void OneGame(int scr, int scr2)
        nextPiece:
                dropMode = 0;
                FreezePiece(scr);
-               linesCleared = ClearFullLines(scr);
+               totalDrops++;
+               if ((linesCleared = ClearFullLines(scr)) > 0) {
+                       totalLines += linesCleared;
+                       totalAdds += linesCleared - (linesCleared < 4);
+               }
                if (linesCleared > 0 && spied)
-                       SendPacket(NP_clear, 0, NULL);
+                       SendPacket(scr, NP_clear, 0, NULL);
                if (game == GT_classicTwo && linesCleared > 1) {
                        short junkLines;
                        netint2 data[1];
 
                        junkLines = linesCleared - (linesCleared < 4);
                        data[0] = hton2(junkLines);
-                       SendPacket(NP_giveJunk, sizeof(data), data);
+                       SendPacket(scr, NP_giveJunk, sizeof(data), data);
                }
        }
 gameOver:
@@ -362,7 +386,7 @@ ExtFunc int main(int argc, char **argv)
        standoutEnable = colorEnable = 1;
        stepDownInterval = DEFAULT_INTERVAL;
        MapKeys(DEFAULT_KEYS);
-       while ((ch = getopt(argc, argv, "hHRs:r:Fk:c:woDSCp:i:")) != -1)
+       while ((ch = getopt(argc, argv, "hHRs:r:Fk:c:wodDSCp:i:")) != -1)
                switch (ch) {
                        case 'c':
                                initConn = 1;
@@ -390,9 +414,12 @@ ExtFunc int main(int argc, char **argv)
                                fairRobot = 1;
                                myFlags |= SCF_fairRobot;
                                break;
-                       case 'D':
+                       case 'd':
                                dropModeEnable = 1;
                                break;
+                       case 'D':
+                               dropModeEnable = 2;
+                               break;
                        case 'C':
                                colorEnable = 0;
                                break;
@@ -440,7 +467,7 @@ ExtFunc int main(int argc, char **argv)
 
                        data[0] = hton4(MAJOR_VERSION);
                        data[1] = hton4(PROTOCOL_VERSION);
-                       SendPacket(NP_version, sizeof(data), data);
+                       SendPacket(0, NP_version, sizeof(data), data);
                        if (WaitMyEvent(&event, EM_net) != E_net)
                                fatal("Network negotiation failed");
                        memcpy(data, event.u.net.data, sizeof(data));
@@ -476,7 +503,7 @@ ExtFunc int main(int argc, char **argv)
                        data[0] = hton4(myFlags);
                        data[1] = hton4(seed);
                        data[2] = hton4(stepDownInterval);
-                       SendPacket(NP_startConn, len, data);
+                       SendPacket(0, NP_startConn, len, data);
                        if (WaitMyEvent(&event, EM_net) != E_net ||
                                        event.u.net.type != NP_startConn)
                                fatal("Network negotiation failed");
@@ -508,7 +535,7 @@ ExtFunc int main(int argc, char **argv)
                        len = strlen(userName)+1;
                        if (len > sizeof(opponentName))
                                len = sizeof(opponentName);
-                       SendPacket(NP_userName, len, userName);
+                       SendPacket(0, NP_userName, len, userName);
                        if (WaitMyEvent(&event, EM_net) != E_net ||
                                        event.u.net.type != NP_userName)
                                fatal("Network negotiation failed");