tMake the display of fight messages occur in the new user interface area; resize this area and the chat messages window when the curses window is resized. - vaccinewars - be a doctor and try to vaccinate the world (HTM) git clone git://src.adamsgaard.dk/vaccinewars (DIR) Log (DIR) Files (DIR) Refs (DIR) README (DIR) LICENSE --- (DIR) commit cfcd93e53df69e6bb0806d59cf6c404a347bfbbb (DIR) parent 574051390dc6bfb24f9cf35c036d069c357b3a3c (HTM) Author: Ben Webb <ben@salilab.org> Date: Sun, 26 Jan 2003 19:39:42 +0000 Make the display of fight messages occur in the new user interface area; resize this area and the chat messages window when the curses window is resized. Diffstat: M src/curses_client/curses_client.c | 112 ++++++++++++++++++------------- 1 file changed, 66 insertions(+), 46 deletions(-) --- (DIR) diff --git a/src/curses_client/curses_client.c b/src/curses_client/curses_client.c t@@ -1,5 +1,4 @@ /************************************************************************ - * * curses_client.c dopewars client using the (n)curses console library * * Copyright (C) 1998-2003 Ben Webb * * Email: ben@bellatrix.pcl.ox.ac.uk * t@@ -159,17 +158,30 @@ static int get_msg_area_top(void) return 10; } +static int get_separator_line(void) +{ + if (!Network) { + return 14; + } else if (Depth <= 20) { + return 11; + } else if (Depth <= 24) { + return Depth - 9; + } else { + return 11 + (Depth - 20) * 2 / 3; + } +} + /* * Returns the bottommost row of the message area */ static int get_msg_area_bottom(void) { - return 14; + return get_separator_line() - 1; } static int get_ui_area_top(void) { - return 16; + return get_separator_line() + (Network ? 1 : 2); } static int get_ui_area_bottom(void) t@@ -436,7 +448,7 @@ static gboolean SelectServerFromMetaServer(Player *Play, GString *errstr) g_string_sprintf(text, _("Comment: %s"), ThisServer->Comment); mvaddstr(top + 4, 1, text->str); attrset(PromptAttr); - mvaddstr(get_prompt_line() + 1, 1, + mvaddstr(top + 5, 1, _("N>ext server; P>revious server; S>elect this server... ")); /* The three keys that are valid responses to the previous question - t@@ -1696,48 +1708,54 @@ void nice_wait() */ void DisplayFightMessage(Player *Play, char *text) { - static char Messages[5][79]; - static int x, y; + static GList *msgs = NULL; + static int num_msgs = 0; gchar *textpt; gchar *AttackName, *DefendName, *BitchName; - gint i, DefendHealth, DefendBitches, BitchesKilled, ArmPercent; + gint y, DefendHealth, DefendBitches, BitchesKilled, ArmPercent; gboolean Loot; + int top = get_ui_area_top(), bottom = get_ui_area_bottom() - 4; if (text == NULL) { - x = 0; - y = 15; - for (i = 0; i < 5; i++) - Messages[i][0] = '\0'; - } else if (!text[0]) { + GList *pt; + for (pt = msgs; pt; pt = g_list_next(pt)) { + g_free(pt->data); + } + g_list_free(msgs); + msgs = NULL; + num_msgs = 0; + } else { + GList *pt; + if (text[0]) { + if (HaveAbility(Play, A_NEWFIGHT)) { + ReceiveFightMessage(text, &AttackName, &DefendName, &DefendHealth, + &DefendBitches, &BitchName, &BitchesKilled, + &ArmPercent, &fp, &RunHere, &Loot, &CanFire, + &textpt); + } else { + textpt = text; + if (Play->Flags & FIGHTING) + fp = F_MSG; + else + fp = F_LASTLEAVE; + CanFire = (Play->Flags & CANSHOOT); + RunHere = FALSE; + } + msgs = g_list_append(msgs, g_strdup(textpt)); + num_msgs++; + } attrset(TextAttr); clear_bottom(); - for (i = 16; i <= 20; i++) - mvaddstr(i, 1, Messages[i - 16]); - } else { - if (HaveAbility(Play, A_NEWFIGHT)) { - ReceiveFightMessage(text, &AttackName, &DefendName, &DefendHealth, - &DefendBitches, &BitchName, &BitchesKilled, - &ArmPercent, &fp, &RunHere, &Loot, &CanFire, - &textpt); - } else { - textpt = text; - if (Play->Flags & FIGHTING) - fp = F_MSG; - else - fp = F_LASTLEAVE; - CanFire = (Play->Flags & CANSHOOT); - RunHere = FALSE; + pt = g_list_last(msgs); + y = bottom; + while (pt && g_list_previous(pt) && y > top) { + y--; + pt = g_list_previous(pt); } - while (textpt[0]) { - if (y < 20) - y++; - else - for (i = 0; i < 4; i++) - strcpy(Messages[i], Messages[i + 1]); - - strncpy(Messages[y - 16], textpt, 78); - Messages[y - 16][78] = '\0'; - textpt += MIN(strlen(textpt), 78); + y = top; + while (pt) { + mvaddstr(y++, 1, pt->data); + pt = g_list_next(pt); } } } t@@ -1780,7 +1798,7 @@ void display_message(const char *buf) depth = get_msg_area_bottom() - top + 1; wid = Width - 4; - if (wid < 0 || depth < 0) { + if (wid < 0 || depth < 0 || !Network) { return; } t@@ -1807,6 +1825,7 @@ void display_message(const char *buf) if (num_msgs == MaxMessages && msgs) { g_free(msgs->data); msgs = g_list_remove(msgs, msgs->data); + --num_msgs; } msgs = g_list_append(msgs, g_strdup(buf)); ++num_msgs; t@@ -1882,7 +1901,7 @@ void print_location(char *text) move(0, Width / 2 - 9); for (i = 0; i < 18; i++) addch(' '); - mvaddstr(0, (Width - strlen(text)) / 2, text); + mvaddcentstr(0, text); attrset(TextAttr); } t@@ -1904,7 +1923,7 @@ void print_status(Player *Play, gboolean DispDrug) mvaddstr(0, 3, text->str); attrset(StatsAttr); - for (i = 2; i <= 14; i++) { + for (i = get_separator_line() - 1; i >= 2; i--) { mvaddch(i, 1, ACS_VLINE); mvaddch(i, Width - 2, ACS_VLINE); } t@@ -1923,11 +1942,11 @@ void print_status(Player *Play, gboolean DispDrug) addch(' '); } if (!Network) { - mvaddch(14, 1, ACS_LLCORNER); + mvaddch(get_separator_line(), 1, ACS_LLCORNER); for (i = 0; i < Width - 4; i++) addch(ACS_HLINE); addch(ACS_LRCORNER); - mvaddch(14, Width / 2, ACS_BTEE); + mvaddch(get_separator_line(), Width / 2, ACS_BTEE); } else { mvaddch(9, 1, ACS_LTEE); for (i = 0; i < Width - 4; i++) t@@ -1938,9 +1957,10 @@ void print_status(Player *Play, gboolean DispDrug) /* Title of the "Messages" window in the curses client */ mvaddstr(9, 9, _("Messages (-/+ scrolls up/down)")); - mvaddch(15, 1, ACS_LLCORNER); - for (i = 0; i < Width - 4; i++) + mvaddch(get_separator_line(), 1, ACS_LLCORNER); + for (i = 0; i < Width - 4; i++) { addch(ACS_HLINE); + } addch(ACS_LRCORNER); } t@@ -2038,7 +2058,7 @@ void print_status(Player *Play, gboolean DispDrug) } attrset(TextAttr); if (!Network) - clear_line(15); + clear_line(get_separator_line() + 1); refresh(); g_string_free(text, TRUE); }