X-Git-Url: http://git.shiar.net/netris.git/blobdiff_plain/c11ae0d113cc5f60bfd1bed29b47211013f8adef..776faa936ea4b3f5ccaacda0f05a2ed1e945d304:/game.c diff --git a/game.c b/game.c index 82c03bf..423befb 100644 --- a/game.c +++ b/game.c @@ -1,6 +1,6 @@ /* - * Netris -- A free networked version of Tetris - * Copyright (C) 1994,1995 Mark Weaver + * Netris -- A free networked version of T*tris + * Copyright (C) 1994,1995,1996 Mark H. Weaver * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * - * $Id: game.c,v 1.37 1995/07/11 08:53:23 mhw Exp $ + * $Id: game.c,v 1.39 1999/05/16 06:56:27 mhw Exp $ */ #define NOEXT @@ -27,29 +27,69 @@ #include #include -enum { KT_left, KT_rotate, KT_right, KT_drop, - KT_down, KT_toggleSpy, KT_pause, KT_faster, KT_numKeys }; +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", NULL }; + "Left", "Right", "RotRight", "RotLeft", "Drop", "Down", + "ToggleSpy", "Pause", "Faster", "Redraw", NULL }; static char *gameNames[GT_len] = { "OnePlayer", "ClassicTwo" }; -static char keyTable[KT_numKeys+1] = "jkl mspf"; +static char keyTable[KT_numKeys+1]; static int dropModeEnable = 0; static char *robotProg; +ExtFunc void MapKeys(char *newKeys) +{ + int i, k, ch; + char used[256]; + int errs = 0; + + /* XXX assumptions about ASCII encoding here */ + for (i = k = 0; newKeys[i] && k < KT_numKeys; i++,k++) { + if (newKeys[i] == '^' && newKeys[i+1]) + keyTable[k] = toupper(newKeys[++i]) - ('A' - 1); + else + keyTable[k] = newKeys[i]; + } + memset(used, 0, sizeof(used)); + for (k = 0; k < KT_numKeys; k++) { + ch = (unsigned char) keyTable[k]; + if (used[ch]) { + if (iscntrl(ch) && ch < ' ') + sprintf(scratch, "Ctrl-%c", ch + ('A' - 1)); + else if (isprint(ch)) + sprintf(scratch, "\"%c\"", ch); + else + sprintf(scratch, "0x%X", ch); + if (!errs) + fprintf(stderr, "Duplicate key mappings:\n"); + errs++; + fprintf(stderr, " %s mapped to both %s and %s\n", + scratch, keyNames[used[ch]-1], keyNames[k]); + } + used[ch] = k + 1; + } + if (errs) + exit(1); +} + 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; } @@ -57,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; @@ -92,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) { @@ -101,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; @@ -117,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)); @@ -131,24 +174,29 @@ ExtFunc void OneGame(int scr, int scr2) if (!p) break; keyEvent: - if (paused && (key != KT_pause)) + if (paused && (key != KT_pause) && (key != KT_redraw)) break; 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_rotate: - if (RotatePiece(scr) && spied) - SendPacket(NP_rotate, 0, NULL); + case KT_rotleft: + if (RotatePiece(scr, 0) && spied) + SendPacket(scr, NP_rotleft, 0, NULL); + break; + 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); @@ -156,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; @@ -167,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) @@ -184,10 +235,15 @@ ExtFunc void OneGame(int scr, int scr2) ShowDisplayInfo(); changed = 1; break; + case KT_redraw: + ScheduleFullRedraw(); + if (paused) + RefreshScreen(); + break; } if (dropMode && DropPiece(scr) > 0) { if (spied) - SendPacket(NP_drop, 0, NULL); + SendPacket(scr, NP_drop, 0, NULL); SetITimer(speed, speed); } break; @@ -223,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: @@ -246,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); @@ -298,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: @@ -319,9 +383,10 @@ ExtFunc int main(int argc, char **argv) int initConn = 0, waitConn = 0, ch; char *hostStr = NULL, *portStr = NULL; - standoutEnable = 1; + standoutEnable = colorEnable = 1; stepDownInterval = DEFAULT_INTERVAL; - while ((ch = getopt(argc, argv, "hHRs:r:Fk:c:woDSp:i:")) != -1) + MapKeys(DEFAULT_KEYS); + while ((ch = getopt(argc, argv, "hHRs:r:Fk:c:wodDSCp:i:")) != -1) switch (ch) { case 'c': initConn = 1; @@ -349,26 +414,27 @@ 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; case 'S': standoutEnable = 0; break; + case 'k': + MapKeys(optarg); + break; case 'H': DistInfo(); exit(0); case 'R': Rules(); exit(0); - case 'k': - { - int i; - - for (i=0;optarg[i] && i < KT_numKeys;i++) - keyTable[i] = optarg[i]; - break; - } case 'h': Usage(); exit(0); @@ -401,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)); @@ -437,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"); @@ -469,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"); @@ -492,3 +558,7 @@ ExtFunc int main(int argc, char **argv) return 0; } +/* + * vi: ts=4 ai + * vim: noai si + */