+ for (y = y1 + 1; y < y2; y++) {
+ mvaddch(y, x1, Sets.ascii ? '|' : ACS_VLINE); //left
+ mvaddch(y, x2, Sets.ascii ? '|' : ACS_VLINE); //right
+ } //draw vertical lines
+ move(y1, x1); //top
+ addch(Sets.ascii ? '+' : ACS_ULCORNER);
+ for (x = x1 + 1; x < x2; x++)
+ addch(Sets.ascii ? '-' : ACS_HLINE);
+ addch(Sets.ascii ? '+' : ACS_URCORNER);
+ move(y2, x1); //bottom
+ addch(Sets.ascii ? '+' : ACS_LLCORNER);
+ for (x = x1 + 1; x < x2; x++)
+ addch(Sets.ascii ? '-' : ACS_HLINE);
+ addch(Sets.ascii ? '+' : ACS_LRCORNER);
+} //DrawBox
+
+void DrawField(int scr)
+{ //draw field for player scr
+ if (!PlayerDisp[scr]) return;
+ DrawBox(boardXPos[scr] - 1, boardYPos[scr] - Players[scr].boardVisible,
+ boardXPos[scr] + boardSize[scr] * Players[scr].boardWidth, boardYPos[scr] + 1);
+ {
+ char s[boardSize[scr]*Players[scr].boardWidth+1];
+
+ if (Players[scr].host && Players[scr].host[0])
+ snprintf(s, sizeof(s), " %s <%s> ",
+ Players[scr].name, Players[scr].host);
+ else snprintf(s, sizeof(s), " %s ", Players[scr].name);
+ s[sizeof(s)] = 0;
+ if (haveColor && Players[scr].team > 0 && Players[scr].team <= 7)
+ attrset(A_REVERSE | COLOR_PAIR(Players[scr].team + 1));
+ mvaddstr(1, boardXPos[scr], s);
+ if (haveColor) standend();
+ } //display playername/host
+
+ {
+ int x, y;
+ for (y = 0; y <= Players[scr].boardVisible; y++)
+ for (x = 0; x <= Players[scr].boardWidth; x++)
+ PlotBlock(scr, y, x, GetBlock(scr, y, x));
+ } //draw field
+
+ ShowPause(scr);
+} //DrawField
+
+void InitFields(void)
+{ //calculate positions of all fields
+ int scr, prevscr;
+ int y, x;
+ int spaceavail;
+
+ clear();
+ DrawTitle();
+ getmaxyx(stdscr, y, x);
+ boardSize[me] = 2;
+ boardXPos[me] = 1;
+ boardYPos[me] = 21;
+ PlayerDisp[me] = 1;
+ statusXPos = boardSize[me] * Players[me].boardWidth + 3;
+ statusYPos = 21;
+ ShowScore(me, Players[me].score);
+
+ messageXPos = 2;
+ messageYPos = 24;
+ if ((messageWidth = x - messageXPos - 2) > MSG_WIDTH) messageWidth = MSG_WIDTH;
+ if ((messageHeight = y - messageYPos - 1) > MSG_HEIGHT) messageHeight = MSG_HEIGHT;
+ if (messageHeight <= 0) {
+ messageWidth = 27;
+ messageHeight = y - 3;
+ messageXPos = statusXPos + 16;
+ messageYPos = 2;
+ } //messagebox doesn't fit below
+ DrawBox(messageXPos - 2, messageYPos - 1,
+ messageXPos + messageWidth + 1, messageYPos+messageHeight);
+ if (msgwin = subwin(stdscr, messageHeight, messageWidth,
+ messageYPos, messageXPos))
+ scrollok(msgwin, 1); //allow scrolling
+ wmove(msgwin, messageHeight - 2, 0);
+ for (scr = messageHeight - 2; scr >= 0; scr--) //display message history
+ DisplayMessage(message[scr]);
+
+ spaceavail = x;
+ for (scr = 1; scr <= maxPlayer; scr++)
+ spaceavail -= Players[scr].boardWidth+2;
+ prevscr = me;
+ for (scr = 1; scr < MAX_SCREENS; scr++) if (scr != me) {
+ boardYPos[scr] = 21;
+ boardXPos[scr] =
+ boardXPos[prevscr] + 2 + boardSize[prevscr] * Players[prevscr].boardWidth;
+ if (prevscr == me) {
+ boardXPos[scr] += 15; //scorebar
+ if (messageYPos < 24)
+ boardXPos[scr] += messageWidth + 4; //messagebox
+ spaceavail -= boardXPos[scr] - 3;
+ } //stuff before second player
+ if (spaceavail >= 0) {
+ boardSize[scr] = 2;
+ spaceavail -= Players[scr].boardWidth;
+ } //not enough space, half width
+ else
+ boardSize[scr] = 1;
+ if (x < boardXPos[scr] + 1 + boardSize[scr] * Players[scr].boardWidth)
+ PlayerDisp[scr] = 0; //field doesn't fit on screen
+ else
+ PlayerDisp[scr] = 1;
+ prevscr = scr;