X-Git-Url: http://git.shiar.net/netris.git/blobdiff_plain/2708de3d9437a12ee943f0740830aa97d9c3c136..HEAD:/client.c diff --git a/client.c b/client.c index e3a2ffc..d4ab95a 100644 --- a/client.c +++ b/client.c @@ -44,7 +44,6 @@ static struct option options[] = { { "color", 2, 0, 'C' }, { "slowterm", 2, 0, 'S' }, { "keys", 1, 0, 'k' }, - { "rules", 0, 0, 'R' }, { "info", 0, 0, 'H' }, { "help", 0, 0, 'h' }, { 0, 0, 0, 0 } @@ -60,7 +59,7 @@ static char *keyNames[KT_numKeys+1] = { "Faster", "Pause", "Redraw", "Say", "Quit", NULL }; -_Sets Sets = {7, 0, 1, 1, 1}; +sets_t Sets = {3, 0, 1, 1, 1}; static char keyTable[KT_numKeys+1]; @@ -73,11 +72,11 @@ static char *cmds[] = { }; static char *hostStr; -static int paused = 0; +static bool paused = 0; static char lastadd; -void handle_setkeys(char *newKeys) +static void handle_setkeys(char *newKeys) { int i, k, ch; char used[256]; @@ -113,7 +112,7 @@ void handle_setkeys(char *newKeys) exit(1); } -void Usage(void) +static void Usage(void) { Header(); fprintf(stderr, @@ -121,7 +120,6 @@ void Usage(void) "\n" " -h, --help\t\tPrint this usage information\n" " -H, --info\t\tShow distribution and warranty information\n" - " -R, --rules\t\tShow game rules\n" "\n" " -S, --slowterm\tDisable inverse/bold/color for slow terminals\n" " -a, --ascii\t\tUse ascii characters\n" @@ -133,15 +131,12 @@ void Usage(void) " -t, --team \tJoin a team (don't receive lines from your teammates)\n" " -l, --level \tBegin at a higher level (can be used as handicap)\n" " -k, --keys \tRemap keys (default is \"%s\" for cursors)\n" - "\n" - " -r, --robot \tExecute program to control the game instead of keyboard\n" - " -F, --fair-robot\tUse fair robot interface\n" "\n", DEFAULT_PORT, DEFAULT_KEYS ); } -void handle_arg(char tag, char *value) +static void handle_arg(char tag, char *value) { switch (tag) { case 'a': //ascii @@ -180,9 +175,6 @@ void handle_arg(char tag, char *value) Header(); DistInfo(); exit(0); - case 'R': //rules - Rules(); - exit(0); case 'h': //help Usage(); exit(0); @@ -192,7 +184,7 @@ void handle_arg(char tag, char *value) } } -void handle_conffile(char *filename) +static void handle_conffile(char *filename) { FILE *file_in; char buf[513]; @@ -225,7 +217,7 @@ void handle_conffile(char *filename) } //defaults } -int game_piece(int scr, char shape) +static int player_piece(int scr, char shape) { Players[scr].score.pieces++; { @@ -234,51 +226,53 @@ int game_piece(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, + while (!shape_visible(Players[scr].curShape, scr, Players[scr].curY, Players[scr].curX)) Players[scr].curY--; - if (!ShapeFits(Players[scr].curShape, scr, + if (!shape_get(Players[scr].curShape, scr, Players[scr].curY, Players[scr].curX)) return 0; - PlotShape(Players[scr].curShape, scr, + shape_draw(Players[scr].curShape, scr, Players[scr].curY, Players[scr].curX, scr == me); return 1; } -void game_setpaused(void) +static void game_setpaused(void) { //check whether anyone paused the game int i; paused = Game.started < 1; for (i = 1; i < MAX_SCREENS; i++) if (Players[i].alive > 0) - paused |= Players[i].flags & SCF_paused; - if (paused) paused = 1; + paused |= (Players[i].flags & SCF_paused) != 0; } -void game_reset(void) +static void game_reset(void) { //init new game int i; lastadd = me; SRandom(Game.seed); + + // speed = MAX(initspeed / SPEEDINC ** (level - 1), SPEEDMINIMUM) Game.speed = Game.initspeed; for (i = 1; i < Players[me].score.level; i++) Game.speed /= SPEEDINC; if (Game.speed < SPEEDMINIMUM) Game.speed = SPEEDMINIMUM; + ResetBaseTime(); //reset timer SetITimer(Game.speed, Game.speed); - Players[me].nextShape = ChooseOption(stdOptions); + Players[me].nextShape = ChooseOption(Game.shapes); for (i = 1; i <= maxPlayer; i++) { Players[i].score.score = Players[i].score.lines = Players[i].score.adds = 0; Players[i].score.pieces = -1; - ClearField(i); + player_empty(i); } //reset all players - InitFields(); + screen_setup(); } -void game_clear(int scr) +static void game_clear(int scr) { //check for full lines int linesCleared; int linevalues[] = { 40, 100, 400, 1200, }; //= 50*lines! - 10*(lines==1) @@ -287,7 +281,7 @@ void game_clear(int scr) int linevaluesq[] = { 20, 50, 100, 200, 500, 750, 1000, 1250, 1500, 2000, 2500, 3000, 3500, 4000, 4500, 5000, 6000, 7500 }; - if ((linesCleared = ClearFullLines(scr)) > 0) { + if ((linesCleared = player_lineclear(scr)) > 0) { if (Game.type == GT_onePlayer) if ((Players[scr].score.lines / 10) < ((Players[scr].score.lines+linesCleared)/10)) { @@ -310,19 +304,19 @@ void game_clear(int scr) junkLines = linesCleared - (Game.gravity ? 1 : linesCleared < 4); data[0] = junkLines; SendPacket(me, NP_giveJunk, sizeof(data), data); - Message("\\%dYou send %d lines", + msg_add("\\%d" MSG_GAME_LINES_SELF, Players[me].team > 7 ? 7 : Players[me].team, junkLines); } //send junk to others } //multiplayer else { - Message("\\%dYou cleared %d lines", + msg_add("\\%d" MSG_GAME_LINE_SELF, Players[me].team > 7 ? 7 : Players[me].team, linesCleared); } //singleplayer } //IT'S YOU } //lines cleared } -void game_loop(void) +static void game_loop(void) { bool changed = 0; short gameStatus = 2; //2=loop; 1=new piece; 0=quit @@ -333,7 +327,7 @@ void game_loop(void) { switch (cmd) { case CT_quit: - ShowPause(me); + window_msg_status(me); refresh(); gameStatus = 0; return; @@ -341,15 +335,15 @@ void game_loop(void) if (Players[me].alive <= 0) return; Players[me].flags ^= SCF_paused; if (Game.started > 1) - Message(Players[me].flags & SCF_paused - ? "You paused the game" : "You unpaused the game"); + msg_add(Players[me].flags & SCF_paused + ? MSG_GAME_PAUSE_SELF : MSG_GAME_UNPAUSE_SELF); else - Message(Players[me].flags & SCF_paused - ? "You are not ready" : "You are ready"); + msg_add(Players[me].flags & SCF_paused + ? MSG_GAME_UNREADY_SELF : MSG_GAME_READY_SELF); game_setpaused(); if (Game.type == GT_classicTwo) SendPacket(me, NP_pause, 0, NULL); - ShowPause(me); + window_msg_status(me); changed = 1; return; } @@ -371,7 +365,7 @@ void game_loop(void) return handle_cmd(i, cmdend + 1); } } - Message("Unknown command /%s", cmd); + msg_add(MSG_CMD_EUNKNOWN, cmd); } void handle_str(char *str) @@ -384,7 +378,7 @@ void game_loop(void) memmove(chatText, chatText + 1, strlen(chatText)); } - Message("<\\%d%s\\7> %s", + msg_add("<\\%d%s\\7> %s", Players[me].team > 7 ? 7 : Players[me].team, Players[me].name, chatText); if (Game.type == GT_classicTwo) @@ -403,7 +397,7 @@ void game_loop(void) handle_str(chatText); memset(chatText, 0, sizeof(chatText)); } //say it - else Messagetype(27, -1, NULL); //escape + else msg_add_char(27, -1, NULL); //escape return; } else if (key == 27) //escape @@ -412,7 +406,7 @@ void game_loop(void) chatText[strlen(chatText) - 1] = 0; else if (strlen(chatText) < MSG_WIDTH-1) //text chatText[strlen(chatText)] = key; - Messagetype(key, strlen(chatText) - 1, chatText); + msg_add_char(key, strlen(chatText) - 1, chatText); return; } //key in chat mode @@ -424,13 +418,13 @@ void game_loop(void) switch (key) { case KT_redraw: clear(); - InitFields(); + screen_setup(); // ScheduleFullRedraw(); refresh(); return; case KT_say: chatMode = 1; - Messagetype(key, strlen(chatText) - 1, chatText); + msg_add_char(key, strlen(chatText) - 1, chatText); return; case KT_quit: handle_cmd(CT_quit, NULL); @@ -444,20 +438,20 @@ void game_loop(void) // actions only available while actually playing switch (key) { case KT_left: - if (MovePiece(me, 0, -1) && spied) SendPacket(me, NP_left, 0, NULL); + if (player_move(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); + if (player_move(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); + if (player_rotate(me, -1) && spied) SendPacket(me, NP_rotleft, 0, NULL); break; case KT_rotright: - if (RotatePiece(me, 1) && spied) SendPacket(me, NP_rotright, 0, NULL); + if (player_rotate(me, 1) && spied) SendPacket(me, NP_rotright, 0, NULL); break; case KT_down: SetITimer(Game.speed, Game.speed); - if (MovePiece(me, -1, 0)) { + if (player_move(me, -1, 0)) { if (spied) SendPacket(me, NP_down, 0, NULL); } //move one down else @@ -465,14 +459,14 @@ void game_loop(void) break; case KT_dropsoft: SetITimer(Game.speed, Game.speed); - if (DropPiece(me)) { + if (player_drop(me)) { if (spied) SendPacket(me, NP_drop, 0, NULL); } else gameStatus = 1; //dropped break; case KT_drop: SetITimer(Game.speed, Game.speed); - if (DropPiece(me)) { + if (player_drop(me)) { if (spied) SendPacket(me, NP_drop, 0, NULL); } gameStatus = 1; // drop @@ -483,7 +477,7 @@ void game_loop(void) Game.speed = SPEEDMINIMUM; SetITimer(Game.speed, SetITimer(0, 0)); Players[me].score.level++; - ShowScore(me, Players[me].score); + status_draw(me, Players[me].score); changed = 1; break; } @@ -500,26 +494,26 @@ void game_loop(void) { memcpy(&Players[net.uid].nextShape, net.data, sizeof(Players[0].nextShape)); - game_piece(net.uid, Players[net.uid].curShape); + player_piece(net.uid, Players[net.uid].curShape); break; } case NP_down: - MovePiece(net.uid, -1, 0); + player_move(net.uid, -1, 0); break; case NP_left: - MovePiece(net.uid, 0, -1); + player_move(net.uid, 0, -1); break; case NP_right: - MovePiece(net.uid, 0, 1); + player_move(net.uid, 0, 1); break; case NP_rotleft: - RotatePiece(net.uid, -1); + player_rotate(net.uid, -1); break; case NP_rotright: - RotatePiece(net.uid, 1); + player_rotate(net.uid, 1); break; case NP_drop: - DropPiece(net.uid); + player_drop(net.uid); break; case NP_clear: game_clear(net.uid); @@ -529,7 +523,7 @@ void game_loop(void) netint4 data[3]; memcpy(data, net.data, sizeof(data)); - InsertJunk(net.uid, Players[data[2]].team, data[0], data[1]); + player_lineadd(net.uid, Players[data[2]].team, data[0], data[1]); break; } //player added junklines case NP_giveJunk: @@ -540,11 +534,11 @@ void game_loop(void) 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", + msg_add("\\%d" MSG_GAME_LINES, 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); + player_lineadd(me, Players[net.uid].team, data[0], column); if (spied) { data[1] = column; data[2] = net.uid; @@ -554,7 +548,7 @@ void game_loop(void) } //receive junklines case NP_msg: { - Message("<\\%d%s\\7> %s", + msg_add("<\\%d%s\\7> %s", Players[net.uid].team > 7 ? 7 : Players[net.uid].team, Players[net.uid].name, net.data, net.type); break; @@ -565,9 +559,9 @@ void game_loop(void) Game.started = 2; paused = 0; - Message("The game has started"); + msg_add(MSG_GAME_START); for (i = 1; i < MAX_SCREENS; i++) if (Players[i].alive > 0) - ShowPause(i); + window_msg_status(i); break; } //start game case NP_stop: @@ -577,21 +571,21 @@ void game_loop(void) float timer; int i; - Message("The game has ended"); + msg_add(MSG_GAME_STOP); 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", + msg_add("\\%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; } //show player stats if (winner) - Message("%s won after %0.0f'%02d\"", + msg_add(MSG_GAME_WINNER, Players[winner].name, timer / 60, (int)timer % 60); } //show game stats - Message(NULL); + msg_add(NULL); } //game was playing Game.started = 0; memcpy(&Game.seed, net.data, net.size); @@ -604,7 +598,7 @@ void game_loop(void) } //reset players } game_reset(); //reset everything - ShowTime(); //redraw timer while unpaused + status_tick(); //redraw timer while unpaused game_setpaused(); //pause oldPaused = 0; //reset pause changed = 1; @@ -613,23 +607,20 @@ void game_loop(void) } //stop game case NP_newPlayer: { - char teams[10][7] = { "", "Green", "Cyan", "Blue", "Purple", - "Red", "Grey", "White", "*Orange" }; - if (net.uid>maxPlayer) maxPlayer = net.uid; memcpy(&Players[net.uid], net.data, net.size); - ClearField(net.uid); - InitFields(); + player_empty(net.uid); + screen_setup(); if (Players[net.uid].team > 7) - Message("%s joined the game", Players[net.uid].name); + msg_add(MSG_GAME_JOIN, Players[net.uid].name); else - Message("%s joined %s team", Players[net.uid].name, - teams[Players[net.uid].team]); + msg_add(MSG_GAME_JOIN_TEAM, Players[net.uid].name, + teamname[Players[net.uid].team]); if (Players[net.uid].flags & SCF_paused) { game_setpaused(); } //player has paused -// DrawField(net.uid); -// ShowPause(net.uid); +// window_draw(net.uid); +// window_msg_status(net.uid); changed = 1; break; } //player joined @@ -640,13 +631,13 @@ void game_loop(void) Players[net.uid].flags ^= SCF_paused; if (Game.started > 1) strcpy(s, Players[net.uid].flags&SCF_paused - ? "paused the game" : "unpaused the game"); + ? MSG_GAME_PAUSE : MSG_GAME_UNPAUSE); else strcpy(s, Players[net.uid].flags&SCF_paused - ? "is not ready" : "is ready"); - Message("%s %s", Players[net.uid].name, s); + ? MSG_GAME_UNREADY : MSG_GAME_READY); + msg_add(s, Players[net.uid].name); game_setpaused(); - ShowPause(net.uid); + window_msg_status(net.uid); changed = 1; break; } //(un)pause @@ -655,9 +646,9 @@ void game_loop(void) game_setpaused(); oldPaused = 0; Players[net.uid].alive = -1; - Message("%s left", Players[net.uid].name); + msg_add(MSG_GAME_PART, Players[net.uid].name); game_setpaused(); - ShowPause(net.uid); + window_msg_status(net.uid); changed = 1; break; case NP_argghhh: @@ -666,17 +657,17 @@ void game_loop(void) memcpy(&i, net.data, sizeof(i)); Players[net.uid].alive = 0; if (i == me) - Message("\\%dYou fragged %s", + msg_add("\\%d" MSG_GAME_KILL_1_2, Players[me].team > 7 ? 7 : Players[me].team, Players[net.uid].name); else if (i == net.uid) - Message("\\%d%s died", + msg_add("\\%d" MSG_GAME_KILL_2_2, Players[i].team > 7 ? 7 : Players[i].team, Players[i].name); else - Message("\\%d%s fragged %s", + msg_add("\\%d" MSG_GAME_KILL_2_3, Players[i].team > 7 ? 7 : Players[i].team, Players[i].name, Players[net.uid].name); game_setpaused(); - ShowPause(net.uid); + window_msg_status(net.uid); changed = 1; break; } //G/O @@ -693,22 +684,22 @@ void game_loop(void) while (gameStatus) { gameStatus = 2; if (Players[me].alive > 0) { - if (!game_piece(me, ChooseOption(stdOptions))) { + if (!player_piece(me, ChooseOption(Game.shapes))) { netint4 data[4]; Players[me].alive = 0; - if (lastadd == me) Message("\\%dYou died", + if (lastadd == me) msg_add("\\%d" MSG_GAME_KILL_1_1, Players[me].team > 7 ? 7 : Players[me].team); - else Message("\\%d%s fragged you", + else msg_add("\\%d" MSG_GAME_KILL_2_1, Players[lastadd].team > 7 ? 7 : Players[lastadd].team, Players[lastadd].name); if (Game.type == GT_classicTwo) SendPacket(me, NP_argghhh, sizeof(lastadd), &lastadd); - ShowPause(me); + window_msg_status(me); changed = 1; } //die else { - ShowScore(me, Players[me].score); + status_draw(me, Players[me].score); if (spied) { SendPacket(me, NP_newPiece, sizeof(Players[me].curShape), &Players[me].curShape); } //send new piece @@ -716,10 +707,10 @@ void game_loop(void) } //new piece while (gameStatus == 2) { for (i = 1; i < MAX_SCREENS; i++) - if (Players[i].alive > 0 && PlayerDisp[i]) - changed |= RefreshBoard(i); + if (Players[i].alive > 0 && window[i].shown) + changed |= player_draw(i); if (changed) { - if (!paused) ShowTime(); + if (!paused) status_tick(); refresh(); changed = 0; } //screen update @@ -732,7 +723,7 @@ void game_loop(void) switch (WaitMyEvent(&event, EM_any)) { case E_alarm: if (!paused && Players[me].alive > 0) - if (!MovePiece(me, -1, 0)) //move down + if (!player_move(me, -1, 0)) //move down gameStatus = 1; //new piece else if (spied) SendPacket(me, NP_down, 0, NULL); @@ -786,7 +777,7 @@ int main(int argc, char **argv) Players[i].boardHeight = MAX_BOARD_HEIGHT; Players[i].boardVisible = 20; strcpy(Players[i].name, "???"); - ClearField(i); + player_empty(i); } if (!(userName = getenv("LOGNAME")) || !userName[0]) if (!(userName = getenv("USER")) || !userName[0]) @@ -801,7 +792,7 @@ int main(int argc, char **argv) // else handle_conffile(CONFIG_FILE); while ((ch = getopt_long( - argc, argv, "hHRk:c:n:oSCap:i:l:t:", options, NULL + argc, argv, "hHk:c:n:oSCap:i:l:t:", options, NULL )) != -1) handle_arg(ch, optarg); if (optind < argc) { @@ -821,10 +812,13 @@ int main(int argc, char **argv) game_loop(); } //client else { + int i; Game.seed = time(0); + for (i = 0; i < sizeof(Game.shapes) / sizeof(Game.shapes[0]); i++) + Game.shapes[i] = 1; Game.started = 2; me = 1; - memcpy(&Players[me], &Players[0], sizeof(_Player)); + memcpy(&Players[me], &Players[0], sizeof(player_t)); Players[me].team = 7; game_loop(); } //singleplay