X-Git-Url: http://git.shiar.nl/netris.git/blobdiff_plain/0e779d807aa1830dde2f4a75117fd16f5627dc76..50f9d7882f93716af8b7436e88d1da62f05e198b:/game.c diff --git a/game.c b/game.c index 6ad7e8b..5779d84 100644 --- a/game.c +++ b/game.c @@ -15,8 +15,6 @@ * You should have received a copy of the GNU General Public License * 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.39 1999/05/16 06:56:27 mhw Exp $ */ #define NOEXT @@ -52,14 +50,17 @@ static struct option options[] = { { 0, 0, 0, 0 } }; -enum { KT_left, KT_right, KT_rotright, KT_rotleft, KT_drop, KT_down, - KT_faster, KT_pause, KT_redraw, KT_quit, KT_numKeys }; +enum { + KT_left, KT_right, KT_rotright, KT_rotleft, KT_drop, KT_down, + KT_faster, KT_pause, KT_redraw, KT_quit, KT_numKeys +}; static char *keyNames[KT_numKeys+1] = { "Left", "Right", "RotRight", "RotLeft", "Drop", "Down", - "Faster", "Pause", "Redraw", "Quit", NULL }; + "Faster", "Pause", "Redraw", "Quit", NULL +}; -_Sets Sets = {7, 0, 1, 1, 1}; //Sets +_Sets Sets = {7, 0, 1, 1, 1}; static char keyTable[KT_numKeys+1]; @@ -96,13 +97,13 @@ void MapKeys(char *newKeys) fprintf(stderr, "Duplicate key mappings:\n"); errs++; fprintf(stderr, " %s mapped to both %s and %s\n", - scratch, keyNames[used[ch]-1], keyNames[k]); + scratch, keyNames[used[ch]-1], keyNames[k]); } used[ch] = k + 1; } if (errs) exit(1); -} //MapKeys +} void WriteConf(void) { @@ -116,60 +117,64 @@ void WriteConf(void) fclose(file_out); fprintf(stderr, "Wrote new game configuration to %s\n", CONFIG_FILE); -} //WriteConf +} void HandleOption(char tag, char *value) { switch (tag) { - case 'a': //ascii - if (value && !strcasecmp(value, "0")) Sets.ascii = 0; - else Sets.ascii = 1; - break; - case 'c': //connect - game = GT_classicTwo; - hostStr = value; - break; - case 'p': //port - port = atoi(value); - break; - case 'i': //speed (of level 1) - Game.initspeed = atof(value) * 1e6; - break; - case 'l': //level - if ((Players[0].score.level = atof(value)) < 1) - Players[0].score.level = 1; - if (Players[0].score.level > 15) - Players[0].score.level = 15; - break; - case 'n': //nick - memcpy(Players[0].name, value, strlen(value) + 1); - break; - case 't': //team - Players[0].team = atoi(value); - break; - case 'd': //dropmode - Sets.dropmode = atoi(value); - break; - case 'C': //color - if (value && !strcasecmp(value, "1")) Sets.color = 1; - else Sets.color = 0; - break; - case 'S': //slowterm - if (value && !strcasecmp(value, "1")) Sets.standout = 1; - else Sets.standout = 0; - break; - case 'k': //keys - MapKeys(value); break; - case 'H': //info - DistInfo(); exit(0); - case 'R': //rules - Rules(); exit(0); - case 'h': //help - Usage(); exit(0); - default: - Usage(); exit(1); + case 'a': //ascii + if (value && !strcasecmp(value, "0")) Sets.ascii = 0; + else Sets.ascii = 1; + Sets.drawstyle &= ~Sets.ascii; + break; + case 'c': //connect + game = GT_classicTwo; + hostStr = value; + break; + case 'p': //port + port = atoi(value); + break; + case 'i': //speed (of level 1) + Game.initspeed = atof(value) * 1e6; + break; + case 'l': //level + Players[0].score.level = MIN(MAX(atof(value), 1), 15); + break; + case 'n': //nick + memcpy(Players[0].name, value, strlen(value) + 1); + break; + case 't': //team + Players[0].team = atoi(value); + break; + case 'd': //dropmode + Sets.dropmode = atoi(value); + break; + case 'C': //color + if (value && !strcasecmp(value, "1")) Sets.color = 1; + else Sets.color = 0; + break; + case 'S': //slowterm + if (value && !strcasecmp(value, "1")) Sets.standout = 1; + else Sets.standout = 0; + break; + case 'k': //keys + MapKeys(value); + break; + case 'H': //info + Header(); + DistInfo(); + exit(0); + case 'R': //rules + Rules(); + exit(0); + case 'h': //help + Usage(); + exit(0); + default: + Usage(); + exit(1); } -} //HandleParam +} void ReadConf(char *filename) { @@ -184,7 +189,7 @@ void ReadConf(char *filename) while (fgets(buf, 512, file_in) != NULL) { if ((ch = strchr(buf, '#'))) *ch = '\0'; // truncate string from # char - for (i = strlen(buf)-1; i >= 0; i--) + for (i = strlen(buf) - 1; i >= 0; i--) if (buf[i] == ' ' || buf[i] == '\n' || buf[i] == '\t' || buf[i] == 13) buf[i] = '\0'; else break; @@ -203,7 +208,7 @@ void ReadConf(char *filename) fprintf(stderr, "Unable to open config file %s.\n", filename); } //defaults -} //ReadConf +} int StartNewPiece(int scr, char shape) { @@ -215,7 +220,7 @@ int StartNewPiece(int scr, char shape) Players[scr].curY = Players[scr].boardVisible + 4; Players[scr].curX = Players[scr].boardWidth / 2 - 2; while (!ShapeVisible(Players[scr].curShape, scr, - Players[scr].curY, Players[scr].curX)) + Players[scr].curY, Players[scr].curX)) Players[scr].curY--; if (!ShapeFits(Players[scr].curShape, scr, Players[scr].curY, Players[scr].curX)) @@ -233,7 +238,7 @@ void checkPaused(void) for (i = 1; i < MAX_SCREENS; i++) if (Players[i].alive > 0) paused |= Players[i].flags & SCF_paused; if (paused) paused = 1; -} //checkPaused +} void StartGame(void) { //init new game @@ -246,7 +251,7 @@ void StartGame(void) Game.speed /= SPEEDINC; if (Game.speed < SPEEDMINIMUM) Game.speed = SPEEDMINIMUM; - ResetBaseTime(); //reset timer + ResetBaseTime(); //reset timer SetITimer(Game.speed, Game.speed); Players[me].nextShape = ChooseOption(stdOptions); for (i = 1; i <= maxPlayer; i++) { @@ -256,7 +261,7 @@ void StartGame(void) ClearField(i); } //reset all players InitFields(); -} //StartGame +} void CheckClears(int scr) { //check for full lines @@ -265,7 +270,7 @@ void CheckClears(int scr) // int linevaluesq[] = { 25, 50, 100, 200, 500, 720, 980, 1280, 1620, 2000, // 2420, 2880, 3380, 3920, 4500, 5120, 5780, 6480 }; int linevaluesq[] = { 20, 50, 100, 200, 500, 750, 1000, 1250, 1500, 2000, - 2500, 3000, 3500, 4000, 4500, 5000, 6000, 7500 }; + 2500, 3000, 3500, 4000, 4500, 5000, 6000, 7500 }; if ((linesCleared = ClearFullLines(scr)) > 0) { if (game == GT_onePlayer) @@ -287,8 +292,7 @@ void CheckClears(int scr) short junkLines; netint4 data[1]; - if (Game.gravity) junkLines = linesCleared - 1; - else junkLines = linesCleared - (linesCleared < 4); + junkLines = linesCleared - (Game.gravity ? 1 : linesCleared < 4); data[0] = junkLines; SendPacket(me, NP_giveJunk, sizeof(data), data); Message("\\%dYou send %d lines", @@ -301,7 +305,7 @@ void CheckClears(int scr) } //singleplayer } //IT'S YOU } //lines cleared -} //CheckClears +} void OneGame(void) { @@ -315,98 +319,104 @@ void OneGame(void) { char *p; - if (key == 13) { - if (!(chatMode = !chatMode)) { + if (chatMode) { + if (key == 13) { + // enter text + chatMode = 0; if (chatText[0]) { Message("<\\%d%s\\7> %s", Players[me].team > 7 ? 7 : Players[me].team, Players[me].name, chatText); - if (game==GT_classicTwo) + if (game == GT_classicTwo) SendPacket(me, NP_msg, strlen(chatText) + 1, chatText); memset(chatText, 0, sizeof(chatText)); } //say it else Messagetype(27, -1, NULL); //escape return; - } //leave chat mode - } //enter pressed (start/stop chat mode) - if (chatMode) { - if (key == 27) //escape + } + else if (key == 27) //escape chatMode = 0; else if (key == 127 && chatText) //backspace chatText[strlen(chatText) - 1] = 0; - else if (key != 13 && strlen(chatText) < MSG_WIDTH-1) //text + else if (strlen(chatText) < MSG_WIDTH-1) //text chatText[strlen(chatText)] = key; Messagetype(key, strlen(chatText) - 1, chatText); return; } //key in chat mode + + if (key == 13) { + chatMode = 1; + Messagetype(key, strlen(chatText) - 1, chatText); + } + if (!(p = strchr(keyTable, tolower(key)))) return; key = p - keyTable; if (Players[me].alive <= 0 && key != KT_quit) return; if (paused && key < KT_pause) return; switch (key) { - case KT_left: - if (MovePiece(me, 0, -1) && spied) SendPacket(me, NP_left, 0, NULL); - break; - case KT_right: - if (MovePiece(me, 0, 1) && spied) SendPacket(me, NP_right, 0, NULL); - break; - case KT_rotleft: - if (RotatePiece(me, -1) && spied) SendPacket(me, NP_rotleft, 0, NULL); - break; - case KT_rotright: - if (RotatePiece(me, 1) && spied) SendPacket(me, NP_rotright, 0, NULL); - break; - case KT_down: - SetITimer(Game.speed, Game.speed); - if (MovePiece(me, -1, 0)) { - if (spied) SendPacket(me, NP_down, 0, NULL); - } //move one down - else - gameStatus = 1; //completely dropped - break; - case KT_drop: - SetITimer(Game.speed, Game.speed); - if (DropPiece(me)) { - if (spied) SendPacket(me, NP_drop, 0, NULL); - if (!Sets.dropmode) gameStatus = 1; //instadrop - } - else gameStatus = 1; //dropped - dropMode = Sets.dropmode>1; - break; - case KT_faster: - if (game != GT_onePlayer) break; - if ((Game.speed /= SPEEDINC) < SPEEDMINIMUM) - Game.speed = SPEEDMINIMUM; - SetITimer(Game.speed, SetITimer(0, 0)); - Players[me].score.level++; - ShowScore(me, Players[me].score); - changed = 1; - break; - case KT_pause: - Players[me].flags ^= SCF_paused; - if (Game.started > 1) - Message(Players[me].flags & SCF_paused - ? "You paused the game" : "You unpaused the game"); - else - Message(Players[me].flags & SCF_paused - ? "You are not ready" : "You are ready"); - checkPaused(); - if (game == GT_classicTwo) - SendPacket(me, NP_pause, 0, NULL); - ShowPause(me); - changed = 1; - break; - case KT_redraw: - clear(); - InitFields(); -// ScheduleFullRedraw(); - refresh(); - break; - case KT_quit: - ShowPause(me); - refresh(); - gameStatus = 0; - break; + case KT_left: + if (MovePiece(me, 0, -1) && spied) SendPacket(me, NP_left, 0, NULL); + break; + case KT_right: + if (MovePiece(me, 0, 1) && spied) SendPacket(me, NP_right, 0, NULL); + break; + case KT_rotleft: + if (RotatePiece(me, -1) && spied) SendPacket(me, NP_rotleft, 0, NULL); + break; + case KT_rotright: + if (RotatePiece(me, 1) && spied) SendPacket(me, NP_rotright, 0, NULL); + break; + case KT_down: + SetITimer(Game.speed, Game.speed); + if (MovePiece(me, -1, 0)) { + if (spied) SendPacket(me, NP_down, 0, NULL); + } //move one down + else + gameStatus = 1; //completely dropped + break; + case KT_drop: + SetITimer(Game.speed, Game.speed); + if (DropPiece(me)) { + if (spied) SendPacket(me, NP_drop, 0, NULL); + if (!Sets.dropmode) gameStatus = 1; //instadrop + } + else gameStatus = 1; //dropped + dropMode = Sets.dropmode > 1; + break; + case KT_faster: + if (game != GT_onePlayer) break; + if ((Game.speed /= SPEEDINC) < SPEEDMINIMUM) + Game.speed = SPEEDMINIMUM; + SetITimer(Game.speed, SetITimer(0, 0)); + Players[me].score.level++; + ShowScore(me, Players[me].score); + changed = 1; + break; + case KT_pause: + Players[me].flags ^= SCF_paused; + if (Game.started > 1) + Message(Players[me].flags & SCF_paused + ? "You paused the game" : "You unpaused the game"); + else + Message(Players[me].flags & SCF_paused + ? "You are not ready" : "You are ready"); + checkPaused(); + if (game == GT_classicTwo) + SendPacket(me, NP_pause, 0, NULL); + ShowPause(me); + changed = 1; + break; + case KT_redraw: + clear(); + InitFields(); +// ScheduleFullRedraw(); + refresh(); + break; + case KT_quit: + ShowPause(me); + refresh(); + gameStatus = 0; + break; } //E_key if (dropMode && DropPiece(me) > 0) { SetITimer(Game.speed, Game.speed); @@ -422,7 +432,6 @@ void OneGame(void) switch(net.type) { case NP_newPiece: { - FreezePiece(net.uid); memcpy(&Players[net.uid].nextShape, net.data, sizeof(Players[0].nextShape)); StartNewPiece(net.uid, Players[net.uid].curShape); @@ -462,11 +471,11 @@ void OneGame(void) netint4 data[3]; short column; - if (Players[me].alive<=0) break; + if (Players[me].alive <= 0) break; memcpy(data, net.data, sizeof(data[0])); column = Random(0, Players[me].boardWidth); Message("\\%d%s sends %d lines", - Players[net.uid].team>7 ? 7 : Players[net.uid].team, + Players[net.uid].team > 7 ? 7 : Players[net.uid].team, Players[net.uid].name, data[0]); lastadd = net.uid; InsertJunk(me, Players[net.uid].team, data[0], column); @@ -480,7 +489,7 @@ void OneGame(void) case NP_msg: { Message("<\\%d%s\\7> %s", - Players[net.uid].team>7 ? 7 : Players[net.uid].team, + Players[net.uid].team > 7 ? 7 : Players[net.uid].team, Players[net.uid].name, net.data, net.type); break; } //chat @@ -491,30 +500,30 @@ void OneGame(void) Game.started = 2; paused = 0; Message("The game has started"); - for (i = 1; i0) + for (i = 1; i < MAX_SCREENS; i++) if (Players[i].alive > 0) ShowPause(i); break; } //start game case NP_stop: { - if (Game.started>1) { + if (Game.started > 1) { int winner; float timer; int i; Message("The game has ended"); - timer = CurTimeval()/1e6; - if (timer>5) { - for (i = MAX_SCREENS-1; i>0; i--) if (Players[i].alive>=0) { + timer = CurTimeval() / 1e6; + if (timer > 5) { + for (i = MAX_SCREENS-1; i > 0; i--) if (Players[i].alive >= 0) { Message("\\%d%10s%6.1fp%5.1fa", - Players[i].team>7 ? 7 : Players[i].team, Players[i].name, - Players[i].score.pieces/timer*60, - Players[i].score.adds/timer*60); - if (Players[i].alive>0) winner = i; + Players[i].team > 7 ? 7 : Players[i].team, Players[i].name, + Players[i].score.pieces / timer * 60, + Players[i].score.adds / timer * 60); + if (Players[i].alive > 0) winner = i; } //show player stats if (winner) Message("%s won after %0.0f'%02d\"", - Players[winner].name, timer/60, (int)timer%60); + Players[winner].name, timer / 60, (int)timer % 60); } //show game stats Message(NULL); } //game was playing @@ -523,7 +532,7 @@ void OneGame(void) { int i; - for (i = 1; i=0) { + for (i = 1; i < MAX_SCREENS; i++) if (Players[i].alive >= 0) { Players[i].alive = 1; Players[i].flags |= SCF_paused; } //reset players @@ -545,12 +554,12 @@ void OneGame(void) memcpy(&Players[net.uid], net.data, net.size); ClearField(net.uid); InitFields(); - if (Players[net.uid].team>7) + if (Players[net.uid].team > 7) Message("%s joined the game", Players[net.uid].name); else Message("%s joined %s team", Players[net.uid].name, teams[Players[net.uid].team]); - if (Players[net.uid].flags&SCF_paused) { + if (Players[net.uid].flags & SCF_paused) { checkPaused(); } //player has paused // DrawField(net.uid); @@ -563,7 +572,7 @@ void OneGame(void) char s[20]; Players[net.uid].flags ^= SCF_paused; - if (Game.started>1) + if (Game.started > 1) strcpy(s, Players[net.uid].flags&SCF_paused ? "paused the game" : "unpaused the game"); else @@ -576,29 +585,29 @@ void OneGame(void) break; } //(un)pause case NP_part: + // player left checkPaused(); oldPaused = 0; - { Players[net.uid].alive = -1; Message("%s left", Players[net.uid].name); checkPaused(); ShowPause(net.uid); changed = 1; break; - } //player left case NP_argghhh: { char i; memcpy(&i, net.data, sizeof(i)); Players[net.uid].alive = 0; - if (i == me) Message("\\%dYou fragged %s", - Players[me].team>7 ? 7 : Players[me].team, Players[net.uid].name); - else if (i==net.uid) + if (i == me) + Message("\\%dYou fragged %s", + Players[me].team > 7 ? 7 : Players[me].team, Players[net.uid].name); + else if (i == net.uid) Message("\\%d%s died", - Players[i].team>7 ? 7 : Players[i].team, Players[i].name); + Players[i].team > 7 ? 7 : Players[i].team, Players[i].name); else Message("\\%d%s fragged %s", - Players[i].team>7 ? 7 : Players[i].team, Players[i].name, + Players[i].team > 7 ? 7 : Players[i].team, Players[i].name, Players[net.uid].name); checkPaused(); ShowPause(net.uid); @@ -655,21 +664,21 @@ GameLoop: if (playercount < 1) gameStatus = 0; } switch (WaitMyEvent(&event, EM_any)) { - case E_alarm: - if (!paused && Players[me].alive > 0) - if (!MovePiece(me, -1, 0)) //move down - gameStatus = 1; //new piece - else - if (spied) SendPacket(me, NP_down, 0, NULL); - break; - case E_key: - GameKey(event.u.key); - break; - case E_net: - GameNet(event.u.net); - break; - case E_lostConn: - goto gameOver; + case E_alarm: + if (!paused && Players[me].alive > 0) + if (!MovePiece(me, -1, 0)) //move down + gameStatus = 1; //new piece + else + if (spied) SendPacket(me, NP_down, 0, NULL); + break; + case E_key: + GameKey(event.u.key); + break; + case E_net: + GameNet(event.u.net); + break; + case E_lostConn: + goto gameOver; } //handle event if (paused != oldPaused) { if (paused) { @@ -727,8 +736,9 @@ int main(int argc, char **argv) // ReadConf(optarg); // else ReadConf(CONFIG_FILE); - while ((ch = getopt_long(argc, argv, - "hHRk:c:n:odDSCap:i:l:t:", options, NULL)) != -1) + while ((ch = getopt_long( + argc, argv, "hHRk:c:n:odDSCap:i:l:t:", options, NULL + )) != -1) HandleOption(ch, optarg); if (optind < argc) { Usage(); @@ -736,7 +746,8 @@ int main(int argc, char **argv) } // WriteConf(); - InitScreens(); //setup screen + InitScreens(); //setup screen + if (game == GT_classicTwo) { spied = 1; InitiateConnection(hostStr, port); @@ -756,7 +767,3 @@ int main(int argc, char **argv) return 0; } -/* - * vi: ts=4 ai - * vim: noai si - */