diff options
-rw-r--r-- | src/misc_gui.cpp | 831 | ||||
-rw-r--r-- | src/network/network_gui.cpp | 1645 |
2 files changed, 1247 insertions, 1229 deletions
diff --git a/src/misc_gui.cpp b/src/misc_gui.cpp index e032e5569..89079c482 100644 --- a/src/misc_gui.cpp +++ b/src/misc_gui.cpp @@ -92,26 +92,20 @@ static const WindowDesc _land_info_desc = { static void Place_LandInfo(TileIndex tile) { - Player *p; - Window *w; - Town *t; - Money old_money; - CommandCost costclear; AcceptedCargo ac; TileDesc td; - StringID str; DeleteWindowById(WC_LAND_INFO, 0); - w = AllocateWindowDesc(&_land_info_desc); + Window *w = AllocateWindowDesc(&_land_info_desc); WP(w, void_d).data = &_landinfo_data; - p = GetPlayer(IsValidPlayer(_local_player) ? _local_player : PLAYER_FIRST); - t = ClosestTownFromTile(tile, _patches.dist_local_authority); + Player *p = GetPlayer(IsValidPlayer(_local_player) ? _local_player : PLAYER_FIRST); + Town *t = ClosestTownFromTile(tile, _patches.dist_local_authority); - old_money = p->player_money; + Money old_money = p->player_money; p->player_money = INT64_MAX; - costclear = DoCommand(tile, 0, 0, 0, CMD_LANDSCAPE_CLEAR); + CommandCost costclear = DoCommand(tile, 0, 0, 0, CMD_LANDSCAPE_CLEAR); p->player_money = old_money; /* Because build_date is not set yet in every TileDesc, we make sure it is empty */ @@ -126,7 +120,7 @@ static void Place_LandInfo(TileIndex tile) if (td.owner != OWNER_NONE && td.owner != OWNER_WATER) GetNameOfOwner(td.owner, tile); GetString(_landinfo_data[1], STR_01A7_OWNER, lastof(_landinfo_data[1])); - str = STR_01A4_COST_TO_CLEAR_N_A; + StringID str = STR_01A4_COST_TO_CLEAR_N_A; if (CmdSucceeded(costclear)) { SetDParam(0, costclear.GetCost()); str = STR_01A5_COST_TO_CLEAR; @@ -147,36 +141,33 @@ static void Place_LandInfo(TileIndex tile) } GetString(_landinfo_data[4], STR_01A8_LOCAL_AUTHORITY, lastof(_landinfo_data[4])); - { - char *p = GetString(_landinfo_data[5], STR_01CE_CARGO_ACCEPTED, lastof(_landinfo_data[5])); - bool found = false; + char *strp = GetString(_landinfo_data[5], STR_01CE_CARGO_ACCEPTED, lastof(_landinfo_data[5])); + bool found = false; - for (CargoID i = 0; i < NUM_CARGO; ++i) { - if (ac[i] > 0) { - /* Add a comma between each item. */ - if (found) { - *p++ = ','; - *p++ = ' '; - } - found = true; + for (CargoID i = 0; i < NUM_CARGO; ++i) { + if (ac[i] > 0) { + /* Add a comma between each item. */ + if (found) { + *strp++ = ','; + *strp++ = ' '; + } + found = true; - /* If the accepted value is less than 8, show it in 1/8:ths */ - if (ac[i] < 8) { - SetDParam(0, ac[i]); - SetDParam(1, GetCargo(i)->name); - p = GetString(p, STR_01D1_8, lastof(_landinfo_data[5])); - } else { - p = GetString(p, GetCargo(i)->name, lastof(_landinfo_data[5])); - } + /* If the accepted value is less than 8, show it in 1/8:ths */ + if (ac[i] < 8) { + SetDParam(0, ac[i]); + SetDParam(1, GetCargo(i)->name); + strp = GetString(strp, STR_01D1_8, lastof(_landinfo_data[5])); + } else { + strp = GetString(strp, GetCargo(i)->name, lastof(_landinfo_data[5])); } } - - if (!found) _landinfo_data[5][0] = '\0'; } + if (!found) _landinfo_data[5][0] = '\0'; if (td.build_date != 0) { SetDParam(0, td.build_date); - GetString(_landinfo_data[6], STR_BUILD_DATE, lastof(_landinfo_data[6])); + GetString(_landinfo_data[6], STR_BUILD_DATE, lastof(_landinfo_data[6])); } else { _landinfo_data[6][0] = '\0'; } @@ -265,40 +256,41 @@ static const char *credits[] = { static void AboutWindowProc(Window *w, WindowEvent *e) { switch (e->event) { - case WE_CREATE: // Set up window counter and start position of scroller - WP(w, scroller_d).counter = 5; - WP(w, scroller_d).height = w->height - 40; - break; - case WE_PAINT: { - uint i; - int y = WP(w, scroller_d).height; - DrawWindowWidgets(w); + case WE_CREATE: // Set up window counter and start position of scroller + WP(w, scroller_d).counter = 5; + WP(w, scroller_d).height = w->height - 40; + break; - /* Show original copyright and revision version */ - DrawStringCentered(210, 17, STR_00B6_ORIGINAL_COPYRIGHT, TC_FROMSTRING); - DrawStringCentered(210, 17 + 10, STR_00B7_VERSION, TC_FROMSTRING); + case WE_PAINT: { + int y = WP(w, scroller_d).height; + DrawWindowWidgets(w); - /* Show all scrolling credits */ - for (i = 0; i < lengthof(credits); i++) { - if (y >= 50 && y < (w->height - 40)) { - DoDrawString(credits[i], 10, y, TC_BLACK); + /* Show original copyright and revision version */ + DrawStringCentered(210, 17, STR_00B6_ORIGINAL_COPYRIGHT, TC_FROMSTRING); + DrawStringCentered(210, 17 + 10, STR_00B7_VERSION, TC_FROMSTRING); + + /* Show all scrolling credits */ + for (uint i = 0; i < lengthof(credits); i++) { + if (y >= 50 && y < (w->height - 40)) { + DoDrawString(credits[i], 10, y, TC_BLACK); + } + y += 10; } - y += 10; - } - /* If the last text has scrolled start anew from the start */ - if (y < 50) WP(w, scroller_d).height = w->height - 40; + /* If the last text has scrolled start anew from the start */ + if (y < 50) WP(w, scroller_d).height = w->height - 40; - DoDrawStringCentered(210, w->height - 25, "Website: http://www.openttd.org", TC_BLACK); - DrawStringCentered(210, w->height - 15, STR_00BA_COPYRIGHT_OPENTTD, TC_FROMSTRING); - } break; - case WE_TICK: // Timer to scroll the text and adjust the new top - if (--WP(w, scroller_d).counter == 0) { - WP(w, scroller_d).counter = 5; - WP(w, scroller_d).height--; - SetWindowDirty(w); - } - break; + DoDrawStringCentered(210, w->height - 25, "Website: http://www.openttd.org", TC_BLACK); + DrawStringCentered(210, w->height - 15, STR_00BA_COPYRIGHT_OPENTTD, TC_FROMSTRING); + } break; + + case WE_TICK: // Timer to scroll the text and adjust the new top + if (--WP(w, scroller_d).counter == 0) { + WP(w, scroller_d).counter = 5; + WP(w, scroller_d).height--; + SetWindowDirty(w); + } + break; } } @@ -343,82 +335,83 @@ static const PalSpriteID _tree_sprites[] = { static void BuildTreesWndProc(Window *w, WindowEvent *e) { switch (e->event) { - case WE_PAINT: { - int x,y; - int i, count; + case WE_PAINT: { + int i, count; - DrawWindowWidgets(w); + DrawWindowWidgets(w); - WP(w, tree_d).base = i = _tree_base_by_landscape[_opt.landscape]; - WP(w, tree_d).count = count = _tree_count_by_landscape[_opt.landscape]; - - x = 18; - y = 54; - do { - DrawSprite(_tree_sprites[i].sprite, _tree_sprites[i].pal, x, y); - x += 35; - if (!(++i & 3)) { - x -= 35 * 4; - y += 47; - } - } while (--count); - } break; + WP(w, tree_d).base = i = _tree_base_by_landscape[_opt.landscape]; + WP(w, tree_d).count = count = _tree_count_by_landscape[_opt.landscape]; + + int x = 18; + int y = 54; + do { + DrawSprite(_tree_sprites[i].sprite, _tree_sprites[i].pal, x, y); + x += 35; + if (!(++i & 3)) { + x -= 35 * 4; + y += 47; + } + } while (--count); + } break; - case WE_CLICK: { - int wid = e->we.click.widget; + case WE_CLICK: { + int wid = e->we.click.widget; - switch (wid) { - case 0: - ResetObjectToPlace(); - break; + switch (wid) { + case 0: + ResetObjectToPlace(); + break; - case 3: case 4: case 5: case 6: - case 7: case 8: case 9: case 10: - case 11:case 12: case 13: case 14: - if (wid - 3 >= WP(w, tree_d).count) break; + case 3: case 4: case 5: case 6: + case 7: case 8: case 9: case 10: + case 11:case 12: case 13: case 14: + if (wid - 3 >= WP(w, tree_d).count) break; - if (HandlePlacePushButton(w, wid, SPR_CURSOR_TREE, VHM_RECT, NULL)) - _tree_to_plant = WP(w, tree_d).base + wid - 3; - break; + if (HandlePlacePushButton(w, wid, SPR_CURSOR_TREE, VHM_RECT, NULL)) { + _tree_to_plant = WP(w, tree_d).base + wid - 3; + } + break; - case 15: // tree of random type. - if (HandlePlacePushButton(w, 15, SPR_CURSOR_TREE, VHM_RECT, NULL)) - _tree_to_plant = -1; - break; + case 15: // tree of random type. + if (HandlePlacePushButton(w, 15, SPR_CURSOR_TREE, VHM_RECT, NULL)) { + _tree_to_plant = -1; + } + break; - case 16: // place trees randomly over the landscape - w->LowerWidget(16); - w->flags4 |= 5 << WF_TIMEOUT_SHL; - SndPlayFx(SND_15_BEEP); - PlaceTreesRandomly(); - MarkWholeScreenDirty(); - break; - } - } break; + case 16: // place trees randomly over the landscape + w->LowerWidget(16); + w->flags4 |= 5 << WF_TIMEOUT_SHL; + SndPlayFx(SND_15_BEEP); + PlaceTreesRandomly(); + MarkWholeScreenDirty(); + break; + } + } break; - case WE_PLACE_OBJ: - VpStartPlaceSizing(e->we.place.tile, VPM_X_AND_Y_LIMITED, DDSP_PLANT_TREES); - VpSetPlaceSizingLimit(20); - break; + case WE_PLACE_OBJ: + VpStartPlaceSizing(e->we.place.tile, VPM_X_AND_Y_LIMITED, DDSP_PLANT_TREES); + VpSetPlaceSizingLimit(20); + break; - case WE_PLACE_DRAG: - VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, e->we.place.select_method); - return; + case WE_PLACE_DRAG: + VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, e->we.place.select_method); + return; - case WE_PLACE_MOUSEUP: - if (e->we.place.pt.x != -1 && e->we.place.select_proc == DDSP_PLANT_TREES) { - DoCommandP(e->we.place.tile, _tree_to_plant, e->we.place.starttile, NULL, - CMD_PLANT_TREE | CMD_MSG(STR_2805_CAN_T_PLANT_TREE_HERE)); - } - break; + case WE_PLACE_MOUSEUP: + if (e->we.place.pt.x != -1 && e->we.place.select_proc == DDSP_PLANT_TREES) { + DoCommandP(e->we.place.tile, _tree_to_plant, e->we.place.starttile, NULL, + CMD_PLANT_TREE | CMD_MSG(STR_2805_CAN_T_PLANT_TREE_HERE)); + } + break; - case WE_TIMEOUT: - w->RaiseWidget(16); - break; + case WE_TIMEOUT: + w->RaiseWidget(16); + break; - case WE_ABORT_PLACE_OBJ: - w->RaiseButtons(); - break; + case WE_ABORT_PLACE_OBJ: + w->RaiseButtons(); + break; } } @@ -513,70 +506,72 @@ static const Widget _errmsg_face_widgets[] = { static void ErrmsgWndProc(Window *w, WindowEvent *e) { switch (e->event) { - case WE_PAINT: - CopyInDParam(0, _errmsg_decode_params, lengthof(_errmsg_decode_params)); - DrawWindowWidgets(w); - CopyInDParam(0, _errmsg_decode_params, lengthof(_errmsg_decode_params)); - - /* If the error message comes from a NewGRF, we must use the text ref. stack reserved for error messages. - * If the message doesn't come from a NewGRF, it won't use the TTDP-style text ref. stack, so we won't hurt anything - */ - SwitchToErrorRefStack(); - RewindTextRefStack(); - - if (!IsWindowOfPrototype(w, _errmsg_face_widgets)) { - DrawStringMultiCenter( - 120, - (_errmsg_message_1 == INVALID_STRING_ID ? 25 : 15), - _errmsg_message_2, - w->width - 2); - if (_errmsg_message_1 != INVALID_STRING_ID) + case WE_PAINT: + CopyInDParam(0, _errmsg_decode_params, lengthof(_errmsg_decode_params)); + DrawWindowWidgets(w); + CopyInDParam(0, _errmsg_decode_params, lengthof(_errmsg_decode_params)); + + /* If the error message comes from a NewGRF, we must use the text ref. stack reserved for error messages. + * If the message doesn't come from a NewGRF, it won't use the TTDP-style text ref. stack, so we won't hurt anything + */ + SwitchToErrorRefStack(); + RewindTextRefStack(); + + if (!IsWindowOfPrototype(w, _errmsg_face_widgets)) { DrawStringMultiCenter( 120, - 30, - _errmsg_message_1, + (_errmsg_message_1 == INVALID_STRING_ID ? 25 : 15), + _errmsg_message_2, w->width - 2); - } else { - const Player *p = GetPlayer((PlayerID)GetDParamX(_errmsg_decode_params,2)); - DrawPlayerFace(p->face, p->player_color, 2, 16); - - DrawStringMultiCenter( - 214, - (_errmsg_message_1 == INVALID_STRING_ID ? 65 : 45), - _errmsg_message_2, - w->width - 2); - if (_errmsg_message_1 != INVALID_STRING_ID) + if (_errmsg_message_1 != INVALID_STRING_ID) { + DrawStringMultiCenter( + 120, + 30, + _errmsg_message_1, + w->width - 2); + } + } else { + const Player *p = GetPlayer((PlayerID)GetDParamX(_errmsg_decode_params,2)); + DrawPlayerFace(p->face, p->player_color, 2, 16); + DrawStringMultiCenter( 214, - 90, - _errmsg_message_1, + (_errmsg_message_1 == INVALID_STRING_ID ? 65 : 45), + _errmsg_message_2, w->width - 2); - } + if (_errmsg_message_1 != INVALID_STRING_ID) { + DrawStringMultiCenter( + 214, + 90, + _errmsg_message_1, + w->width - 2); + } + } - /* Switch back to the normal text ref. stack for NewGRF texts */ - SwitchToNormalRefStack(); - break; + /* Switch back to the normal text ref. stack for NewGRF texts */ + SwitchToNormalRefStack(); + break; - case WE_MOUSELOOP: - if (_right_button_down) DeleteWindow(w); - break; + case WE_MOUSELOOP: + if (_right_button_down) DeleteWindow(w); + break; - case WE_4: - if (--_errmsg_duration == 0) DeleteWindow(w); - break; + case WE_4: + if (--_errmsg_duration == 0) DeleteWindow(w); + break; - case WE_DESTROY: - SetRedErrorSquare(0); - _switch_mode_errorstr = INVALID_STRING_ID; - break; + case WE_DESTROY: + SetRedErrorSquare(0); + _switch_mode_errorstr = INVALID_STRING_ID; + break; - case WE_KEYPRESS: - if (e->we.keypress.keycode == WKC_SPACE) { - /* Don't continue. */ - e->we.keypress.cont = false; - DeleteWindow(w); - } - break; + case WE_KEYPRESS: + if (e->we.keypress.keycode == WKC_SPACE) { + /* Don't continue. */ + e->we.keypress.cont = false; + DeleteWindow(w); + } + break; } } @@ -588,8 +583,7 @@ void ShowErrorMessage(StringID msg_1, StringID msg_2, int x, int y) DeleteWindowById(WC_ERRMSG, 0); - //assert(msg_2); - if (msg_2 == 0) msg_2 = STR_EMPTY; + if (msg_2 == STR_NULL) msg_2 = STR_EMPTY; _errmsg_message_1 = msg_1; _errmsg_message_2 = msg_2; @@ -598,8 +592,7 @@ void ShowErrorMessage(StringID msg_1, StringID msg_2, int x, int y) if (!_errmsg_duration) return; if (_errmsg_message_1 != STR_013B_OWNED_BY || GetDParamX(_errmsg_decode_params,2) >= 8) { - - if ( (x|y) != 0) { + if ((x | y) != 0) { pt = RemapCoords2(x, y); vp = FindWindowById(WC_MAIN_WINDOW, 0)->viewport; @@ -617,7 +610,7 @@ void ShowErrorMessage(StringID msg_1, StringID msg_2, int x, int y) } w = AllocateWindow(pt.x, pt.y, 240, 46, ErrmsgWndProc, WC_ERRMSG, _errmsg_widgets); } else { - if ( (x|y) != 0) { + if ((x | y) != 0) { pt = RemapCoords2(x, y); vp = FindWindowById(WC_MAIN_WINDOW, 0)->viewport; pt.x = Clamp(UnScaleByZoom(pt.x - vp->virtual_left, vp->zoom) + vp->left - (334/2), 0, _screen.width - 334); @@ -699,17 +692,15 @@ static const Widget _tooltips_widgets[] = { static void TooltipsWndProc(Window *w, WindowEvent *e) { switch (e->event) { - case WE_PAINT: { - uint arg; + case WE_PAINT: GfxFillRect(0, 0, w->width - 1, w->height - 1, 0); GfxFillRect(1, 1, w->width - 2, w->height - 2, 0x44); - for (arg = 0; arg < WP(w, tooltips_d).paramcount; arg++) { + for (uint arg = 0; arg < WP(w, tooltips_d).paramcount; arg++) { SetDParam(arg, WP(w, tooltips_d).params[arg]); } DrawStringMultiCenter((w->width >> 1), (w->height >> 1) - 5, WP(w, tooltips_d).string_id, w->width - 2); break; - } case WE_MOUSELOOP: /* We can show tooltips while dragging tools. These are shown as long as @@ -731,21 +722,16 @@ static void TooltipsWndProc(Window *w, WindowEvent *e) * added to a tooltip; currently only supports parameters of {NUM} (integer) */ void GuiShowTooltipsWithArgs(StringID str, uint paramcount, const uint64 params[]) { - char buffer[512]; - Dimension br; - Window *w; - uint i; - int x, y; - DeleteWindowById(WC_TOOLTIPS, 0); /* We only show measurement tooltips with patch setting on */ if (str == STR_NULL || (paramcount != 0 && !_patches.measure_tooltip)) return; - for (i = 0; i != paramcount; i++) SetDParam(i, params[i]); + for (uint i = 0; i != paramcount; i++) SetDParam(i, params[i]); + char buffer[512]; GetString(buffer, str, lastof(buffer)); - br = GetStringBoundingBox(buffer); + Dimension br = GetStringBoundingBox(buffer); br.width += 6; br.height += 4; // increase slightly to have some space around the box /* Cut tooltip length to 200 pixels max, wrap to new line if longer */ @@ -757,11 +743,11 @@ void GuiShowTooltipsWithArgs(StringID str, uint paramcount, const uint64 params[ /* Correctly position the tooltip position, watch out for window and cursor size * Clamp value to below main toolbar and above statusbar. If tooltip would * go below window, flip it so it is shown above the cursor */ - y = Clamp(_cursor.pos.y + _cursor.size.y + _cursor.offs.y + 5, 22, _screen.height - 12); + int y = Clamp(_cursor.pos.y + _cursor.size.y + _cursor.offs.y + 5, 22, _screen.height - 12); if (y + br.height > _screen.height - 12) y = _cursor.pos.y + _cursor.offs.y - br.height - 5; - x = Clamp(_cursor.pos.x - (br.width >> 1), 0, _screen.width - br.width); + int x = Clamp(_cursor.pos.x - (br.width >> 1), 0, _screen.width - br.width); - w = AllocateWindow(x, y, br.width, br.height, TooltipsWndProc, WC_TOOLTIPS, _tooltips_widgets); + Window *w = AllocateWindow(x, y, br.width, br.height, TooltipsWndProc, WC_TOOLTIPS, _tooltips_widgets); WP(w, tooltips_d).string_id = str; assert(sizeof(WP(w, tooltips_d).params[0]) == sizeof(params[0])); @@ -863,14 +849,12 @@ void SetHScrollCount(Window *w, int num) static void DelChar(Textbuf *tb, bool backspace) { WChar c; - uint width; - size_t len; char *s = tb->buf + tb->caretpos; if (backspace) s = Utf8PrevChar(s); - len = Utf8Decode(&c, s); - width = GetCharacterWidth(FS_NORMAL, c); + size_t len = Utf8Decode(&c, s); + uint width = GetCharacterWidth(FS_NORMAL, c); tb->width -= width; if (backspace) { @@ -949,35 +933,38 @@ bool InsertTextBufferChar(Textbuf *tb, WChar key) bool MoveTextBufferPos(Textbuf *tb, int navmode) { switch (navmode) { - case WKC_LEFT: - if (tb->caretpos != 0) { - WChar c; - const char *s = Utf8PrevChar(tb->buf + tb->caretpos); - Utf8Decode(&c, s); - tb->caretpos = s - tb->buf; // -= (tb->buf + tb->caretpos - s) - tb->caretxoffs -= GetCharacterWidth(FS_NORMAL, c); + case WKC_LEFT: + if (tb->caretpos != 0) { + WChar c; + const char *s = Utf8PrevChar(tb->buf + tb->caretpos); + Utf8Decode(&c, s); + tb->caretpos = s - tb->buf; // -= (tb->buf + tb->caretpos - s) + tb->caretxoffs -= GetCharacterWidth(FS_NORMAL, c); + + return true; + } + break; - return true; - } - break; - case WKC_RIGHT: - if (tb->caretpos < tb->length) { - WChar c; + case WKC_RIGHT: + if (tb->caretpos < tb->length) { + WChar c; - tb->caretpos += Utf8Decode(&c, tb->buf + tb->caretpos); - tb->caretxoffs += GetCharacterWidth(FS_NORMAL, c); + tb->caretpos += Utf8Decode(&c, tb->buf + tb->caretpos); + tb->caretxoffs += GetCharacterWidth(FS_NORMAL, c); + return true; + } + break; + + case WKC_HOME: + tb->caretpos = 0; + tb->caretxoffs = 0; + return true; + + case WKC_END: + tb->caretpos = tb->length; + tb->caretxoffs = tb->width; return true; - } - break; - case WKC_HOME: - tb->caretpos = 0; - tb->caretxoffs = 0; - return true; - case WKC_END: - tb->caretpos = tb->length; - tb->caretxoffs = tb->width; - return true; } return false; @@ -1029,32 +1016,33 @@ int HandleEditBoxKey(Window *w, querystr_d *string, int wid, WindowEvent *e) e->we.keypress.cont = false; switch (e->we.keypress.keycode) { - case WKC_ESC: return 2; - case WKC_RETURN: case WKC_NUM_ENTER: return 1; - case (WKC_CTRL | 'V'): - if (InsertTextBufferClipboard(&string->text)) - w->InvalidateWidget(wid); - break; - case (WKC_CTRL | 'U'): - DeleteTextBufferAll(&string->text); - w->InvalidateWidget(wid); - break; - case WKC_BACKSPACE: case WKC_DELETE: - if (DeleteTextBufferChar(&string->text, e->we.keypress.keycode)) - w->InvalidateWidget(wid); - break; - case WKC_LEFT: case WKC_RIGHT: case WKC_END: case WKC_HOME: - if (MoveTextBufferPos(&string->text, e->we.keypress.keycode)) + case WKC_ESC: return 2; + + case WKC_RETURN: case WKC_NUM_ENTER: return 1; + + case (WKC_CTRL | 'V'): + if (InsertTextBufferClipboard(&string->text)) w->InvalidateWidget(wid); + break; + + case (WKC_CTRL | 'U'): + DeleteTextBufferAll(&string->text); w->InvalidateWidget(wid); - break; - default: - if (IsValidChar(e->we.keypress.key, string->afilter)) { - if (InsertTextBufferChar(&string->text, e->we.keypress.key)) { - w->InvalidateWidget(wid); + break; + + case WKC_BACKSPACE: case WKC_DELETE: + if (DeleteTextBufferChar(&string->text, e->we.keypress.keycode)) w->InvalidateWidget(wid); + break; + + case WKC_LEFT: case WKC_RIGHT: case WKC_END: case WKC_HOME: + if (MoveTextBufferPos(&string->text, e->we.keypress.keycode)) w->InvalidateWidget(wid); + break; + + default: + if (IsValidChar(e->we.keypress.key, string->afilter)) { + if (InsertTextBufferChar(&string->text, e->we.keypress.key)) w->InvalidateWidget(wid); + } else { // key wasn't caught. Continue only if standard entry specified + e->we.keypress.cont = (string->afilter == CS_ALPHANUMERAL); } - } else { // key wasn't caught. Continue only if standard entry specified - e->we.keypress.cont = (string->afilter == CS_ALPHANUMERAL); - } } return 0; @@ -1090,11 +1078,12 @@ void DrawEditBox(Window *w, querystr_d *string, int wid) /* Limit the drawing of the string inside the widget boundaries */ if (!FillDrawPixelInfo(&dpi, - wi->left + 4, - wi->top + 1, - wi->right - wi->left - 4, - wi->bottom - wi->top - 1) - ) return; + wi->left + 4, + wi->top + 1, + wi->right - wi->left - 4, + wi->bottom - wi->top - 1)) { + return; + } old_dpi = _cur_dpi; _cur_dpi = &dpi; @@ -1222,7 +1211,6 @@ char _orig_str_buf[lengthof(_edit_str_buf)]; * @param afilter filters out unwanted character input */ void ShowQueryString(StringID str, StringID caption, uint maxlen, uint maxwidth, Window *parent, CharSetFilter afilter) { - Window *w; uint realmaxlen = maxlen & ~0x1000; assert(realmaxlen < lengthof(_edit_str_buf)); @@ -1230,7 +1218,7 @@ void ShowQueryString(StringID str, StringID caption, uint maxlen, uint maxwidth, DeleteWindowById(WC_QUERY_STRING, 0); DeleteWindowById(WC_SAVELOAD, 0); - w = AllocateWindowDesc(&_query_string_desc); + Window *w = AllocateWindowDesc(&_query_string_desc); w->parent = parent; GetString(_edit_str_buf, str, lastof(_edit_str_buf)); @@ -1474,196 +1462,201 @@ static void SaveLoadDlgWndProc(Window *w, WindowEvent *e) static FiosItem o_dir; switch (e->event) { - case WE_CREATE: // Set up OPENTTD button - w->vscroll.cap = 10; - w->resize.step_width = 2; - w->resize.step_height = 10; - - o_dir.type = FIOS_TYPE_DIRECT; - switch (_saveload_mode) { - case SLD_SAVE_GAME: - case SLD_LOAD_GAME: - FioGetDirectory(o_dir.name, lengthof(o_dir.name), SAVE_DIR); - break; - - case SLD_SAVE_SCENARIO: - case SLD_LOAD_SCENARIO: - FioGetDirectory(o_dir.name, lengthof(o_dir.name), SCENARIO_DIR); - break; - - case SLD_LOAD_HEIGHTMAP: - FioGetDirectory(o_dir.name, lengthof(o_dir.name), HEIGHTMAP_DIR); - break; - - default: - ttd_strlcpy(o_dir.name, _personal_dir, lengthof(o_dir.name)); - } - break; + case WE_CREATE: // Set up OPENTTD button + w->vscroll.cap = 10; + w->resize.step_width = 2; + w->resize.step_height = 10; + + o_dir.type = FIOS_TYPE_DIRECT; + switch (_saveload_mode) { + case SLD_SAVE_GAME: + case SLD_LOAD_GAME: + FioGetDirectory(o_dir.name, lengthof(o_dir.name), SAVE_DIR); + break; + + case SLD_SAVE_SCENARIO: + case SLD_LOAD_SCENARIO: + FioGetDirectory(o_dir.name, lengthof(o_dir.name), SCENARIO_DIR); + break; - case WE_PAINT: { - int pos; - int y; + case SLD_LOAD_HEIGHTMAP: + FioGetDirectory(o_dir.name, lengthof(o_dir.name), HEIGHTMAP_DIR); + break; - SetVScrollCount(w, _fios_num); - DrawWindowWidgets(w); - DrawFiosTexts(w->width); + default: + ttd_strlcpy(o_dir.name, _personal_dir, lengthof(o_dir.name)); + } + break; - if (_savegame_sort_dirty) { - _savegame_sort_dirty = false; - MakeSortedSaveGameList(); - } + case WE_PAINT: { + int pos; + int y; - GfxFillRect(w->widget[7].left + 1, w->widget[7].top + 1, w->widget[7].right, w->widget[7].bottom, 0xD7); - DrawSortButtonState(w, _savegame_sort_order & SORT_BY_NAME ? 2 : 3, _savegame_sort_order & SORT_DESCENDING ? SBS_DOWN : SBS_UP); + SetVScrollCount(w, _fios_num); + DrawWindowWidgets(w); + DrawFiosTexts(w->width); - y = w->widget[7].top + 1; - for (pos = w->vscroll.pos; pos < _fios_num; pos++) { - const FiosItem *item = _fios_list + pos; + if (_savegame_sort_dirty) { + _savegame_sort_dirty = false; + MakeSortedSaveGameList(); + } - DoDrawStringTruncated(item->title, 4, y, _fios_colors[item->type], w->width - 18); - y += 10; - if (y >= w->vscroll.cap * 10 + w->widget[7].top + 1) break; - } + GfxFillRect(w->widget[7].left + 1, w->widget[7].top + 1, w->widget[7].right, w->widget[7].bottom, 0xD7); + DrawSortButtonState(w, _savegame_sort_order & SORT_BY_NAME ? 2 : 3, _savegame_sort_order & SORT_DESCENDING ? SBS_DOWN : SBS_UP); - if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO) { - DrawEditBox(w, &WP(w, querystr_d), 10); - } - break; - } + y = w->widget[7].top + 1; + for (pos = w->vscroll.pos; pos < _fios_num; pos++) { + const FiosItem *item = _fios_list + pos; - case WE_CLICK: - switch (e->we.click.widget) { - case 2: // Sort save names by name - _savegame_sort_order = (_savegame_sort_order == SORT_BY_NAME) ? - SORT_BY_NAME | SORT_DESCENDING : SORT_BY_NAME; - _savegame_sort_dirty = true; - SetWindowDirty(w); - break; + DoDrawStringTruncated(item->title, 4, y, _fios_colors[item->type], w->width - 18); + y += 10; + if (y >= w->vscroll.cap * 10 + w->widget[7].top + 1) break; + } - case 3: // Sort save names by date - _savegame_sort_order = (_savegame_sort_order == SORT_BY_DATE) ? - SORT_BY_DATE | SORT_DESCENDING : SORT_BY_DATE; - _savegame_sort_dirty = true; - SetWindowDirty(w); + if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO) { + DrawEditBox(w, &WP(w, querystr_d), 10); + } break; + } - case 6: // OpenTTD 'button', jumps to OpenTTD directory - FiosBrowseTo(&o_dir); - SetWindowDirty(w); - BuildFileList(); - break; + case WE_CLICK: + switch (e->we.click.widget) { + case 2: // Sort save names by name + _savegame_sort_order = (_savegame_sort_order == SORT_BY_NAME) ? + SORT_BY_NAME | SORT_DESCENDING : SORT_BY_NAME; + _savegame_sort_dirty = true; + SetWindowDirty(w); + break; - case 7: { // Click the listbox - int y = (e->we.click.pt.y - w->widget[e->we.click.widget].top - 1) / 10; - char *name; - const FiosItem *file; + case 3: // Sort save names by date + _savegame_sort_order = (_savegame_sort_order == SORT_BY_DATE) ? + SORT_BY_DATE | SORT_DESCENDING : SORT_BY_DATE; + _savegame_sort_dirty = true; + SetWindowDirty(w); + break; - if (y < 0 || (y += w->vscroll.pos) >= w->vscroll.count) return; + case 6: // OpenTTD 'button', jumps to OpenTTD directory + FiosBrowseTo(&o_dir); + SetWindowDirty(w); + BuildFileList(); + break; - file = _fios_list + y; + case 7: { // Click the listbox + int y = (e->we.click.pt.y - w->widget[e->we.click.widget].top - 1) / 10; + char *name; + const FiosItem *file; - name = FiosBrowseTo(file); - if (name != NULL) { - if (_saveload_mode == SLD_LOAD_GAME || _saveload_mode == SLD_LOAD_SCENARIO) { - _switch_mode = (_game_mode == GM_EDITOR) ? SM_LOAD_SCENARIO : SM_LOAD; + if (y < 0 || (y += w->vscroll.pos) >= w->vscroll.count) return; - SetFiosType(file->type); - ttd_strlcpy(_file_to_saveload.name, name, sizeof(_file_to_saveload.name)); - ttd_strlcpy(_file_to_saveload.title, file->title, sizeof(_file_to_saveload.title)); + file = _fios_list + y; - DeleteWindow(w); - } else if (_saveload_mode == SLD_LOAD_HEIGHTMAP) { - SetFiosType(file->type); - ttd_strlcpy(_file_to_saveload.name, name, sizeof(_file_to_saveload.name)); - ttd_strlcpy(_file_to_saveload.title, file->title, sizeof(_file_to_saveload.title)); + name = FiosBrowseTo(file); + if (name != NULL) { + if (_saveload_mode == SLD_LOAD_GAME || _saveload_mode == SLD_LOAD_SCENARIO) { + _switch_mode = (_game_mode == GM_EDITOR) ? SM_LOAD_SCENARIO : SM_LOAD; - DeleteWindow(w); - ShowHeightmapLoad(); - } else { - /* SLD_SAVE_GAME, SLD_SAVE_SCENARIO copy clicked name to editbox */ - ttd_strlcpy(WP(w, querystr_d).text.buf, file->title, WP(w, querystr_d).text.maxlength); - UpdateTextBufferSize(&WP(w, querystr_d).text); - w->InvalidateWidget(10); + SetFiosType(file->type); + ttd_strlcpy(_file_to_saveload.name, name, sizeof(_file_to_saveload.name)); + ttd_strlcpy(_file_to_saveload.title, file->title, sizeof(_file_to_saveload.title)); + + DeleteWindow(w); + } else if (_saveload_mode == SLD_LOAD_HEIGHTMAP) { + SetFiosType(file->type); + ttd_strlcpy(_file_to_saveload.name, name, sizeof(_file_to_saveload.name)); + ttd_strlcpy(_file_to_saveload.title, file->title, sizeof(_file_to_saveload.title)); + + DeleteWindow(w); + ShowHeightmapLoad(); + } else { + /* SLD_SAVE_GAME, SLD_SAVE_SCENARIO copy clicked name to editbox */ + ttd_strlcpy(WP(w, querystr_d).text.buf, file->title, WP(w, querystr_d).text.maxlength); + UpdateTextBufferSize(&WP(w, querystr_d).text); + w->InvalidateWidget(10); + } + } else { + /* Changed directory, need repaint. */ + SetWindowDirty(w); + BuildFileList(); + } + break; } - } else { - /* Changed directory, need repaint. */ - SetWindowDirty(w); - BuildFileList(); + + case 10: // edit box + ShowOnScreenKeyboard(w, &WP(w, querystr_d), e->we.click.widget, 0, 0); + break; + + case 11: case 12: // Delete, Save game + break; } break; - } - case 10: // edit box - ShowOnScreenKeyboard(w, &WP(w, querystr_d), e->we.click.widget, 0, 0); + case WE_MOUSELOOP: + if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO) { + HandleEditBox(w, &WP(w, querystr_d), 10); + } break; - case 11: case 12: // Delete, Save game + case WE_KEYPRESS: + if (e->we.keypress.keycode == WKC_ESC) { + DeleteWindow(w); + return; + } + + if ((_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO) && + HandleEditBoxKey(w, &WP(w, querystr_d), 10, e) == 1) { // Press Enter + w->HandleButtonClick(12); + } break; - } - break; - case WE_MOUSELOOP: - if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO) { - HandleEditBox(w, &WP(w, querystr_d), 10); - } - break; - case WE_KEYPRESS: - if (e->we.keypress.keycode == WKC_ESC) { - DeleteWindow(w); - return; - } - if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO) { - if (HandleEditBoxKey(w, &WP(w, querystr_d), 10, e) == 1) // Press Enter - w->HandleButtonClick(12); - } - break; - case WE_TIMEOUT: - /* This test protects against using widgets 11 and 12 which are only available - * in those two saveload mode */ - if (!(_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO)) break; - - if (w->IsWidgetLowered(11)) { // Delete button clicked - if (!FiosDelete(WP(w, querystr_d).text.buf)) { - ShowErrorMessage(INVALID_STRING_ID, STR_4008_UNABLE_TO_DELETE_FILE, 0, 0); - } else { - BuildFileList(); - /* Reset file name to current date on successful delete */ - if (_saveload_mode == SLD_SAVE_GAME) GenerateFileName(); + case WE_TIMEOUT: + /* This test protects against using widgets 11 and 12 which are only available + * in those two saveload mode */ + if (!(_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO)) break; + + if (w->IsWidgetLowered(11)) { // Delete button clicked + if (!FiosDelete(WP(w, querystr_d).text.buf)) { + ShowErrorMessage(INVALID_STRING_ID, STR_4008_UNABLE_TO_DELETE_FILE, 0, 0); + } else { + BuildFileList(); + /* Reset file name to current date on successful delete */ + if (_saveload_mode == SLD_SAVE_GAME) GenerateFileName(); + } + + UpdateTextBufferSize(&WP(w, querystr_d).text); + SetWindowDirty(w); + } else if (w->IsWidgetLowered(12)) { // Save button clicked + _switch_mode = SM_SAVE; + FiosMakeSavegameName(_file_to_saveload.name, WP(w, querystr_d).text.buf, sizeof(_file_to_saveload.name)); + + /* In the editor set up the vehicle engines correctly (date might have changed) */ + if (_game_mode == GM_EDITOR) StartupEngines(); } + break; - UpdateTextBufferSize(&WP(w, querystr_d).text); - SetWindowDirty(w); - } else if (w->IsWidgetLowered(12)) { // Save button clicked - _switch_mode = SM_SAVE; - FiosMakeSavegameName(_file_to_saveload.name, WP(w, querystr_d).text.buf, sizeof(_file_to_saveload.name)); + case WE_DESTROY: + /* pause is only used in single-player, non-editor mode, non menu mode */ + if (!_networking && _game_mode != GM_EDITOR && _game_mode != GM_MENU) { + if (_pause_game >= 0) DoCommandP(0, 0, 0, NULL, CMD_PAUSE); + } + FiosFreeSavegameList(); + ClrBit(_no_scroll, SCROLL_SAVE); + break; - /* In the editor set up the vehicle engines correctly (date might have changed) */ - if (_game_mode == GM_EDITOR) StartupEngines(); - } - break; - case WE_DESTROY: - /* pause is only used in single-player, non-editor mode, non menu mode */ - if (!_networking && _game_mode != GM_EDITOR && _game_mode != GM_MENU) { - if (_pause_game >= 0) DoCommandP(0, 0, 0, NULL, CMD_PAUSE); - } - FiosFreeSavegameList(); - ClrBit(_no_scroll, SCROLL_SAVE); - break; - case WE_RESIZE: { - /* Widget 2 and 3 have to go with halve speed, make it so obiwan */ - uint diff = e->we.sizing.diff.x / 2; - w->widget[2].right += diff; - w->widget[3].left += diff; - w->widget[3].right += e->we.sizing.diff.x; - - /* Same for widget 11 and 12 in save-dialog */ - if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO) { - w->widget[11].right += diff; - w->widget[12].left += diff; - w->widget[12].right += e->we.sizing.diff.x; - } + case WE_RESIZE: { + /* Widget 2 and 3 have to go with halve speed, make it so obiwan */ + uint diff = e->we.sizing.diff.x / 2; + w->widget[2].right += diff; + w->widget[3].left += diff; + w->widget[3].right += e->we.sizing.diff.x; + + /* Same for widget 11 and 12 in save-dialog */ + if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO) { + w->widget[11].right += diff; + w->widget[12].left += diff; + w->widget[12].right += e->we.sizing.diff.x; + } - w->vscroll.cap += e->we.sizing.diff.y / 10; + w->vscroll.cap += e->we.sizing.diff.y / 10; } break; } } diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index 52077aa6b..6881fd47f 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -255,58 +255,57 @@ static void NetworkGameWindowWndProc(Window *w, WindowEvent *e) list_d *ld = &WP(w, network_ql_d).l; switch (e->event) { - case WE_CREATE: // Focus input box - w->vscroll.cap = 13; - w->resize.step_height = NET_PRC__SIZE_OF_ROW; + case WE_CREATE: // Focus input box + w->vscroll.cap = 13; + w->resize.step_height = NET_PRC__SIZE_OF_ROW; - nd->field = NGWW_PLAYER; - nd->server = NULL; + nd->field = NGWW_PLAYER; + nd->server = NULL; - WP(w, network_ql_d).sort_list = NULL; - ld->flags = VL_REBUILD | (_ng_sorting.order ? VL_DESC : VL_NONE); - ld->sort_type = _ng_sorting.criteria; - break; + WP(w, network_ql_d).sort_list = NULL; + ld->flags = VL_REBUILD | (_ng_sorting.order ? VL_DESC : VL_NONE); + ld->sort_type = _ng_sorting.criteria; + break; - case WE_PAINT: { - const NetworkGameList *sel = nd->server; - const SortButtonState arrow = (ld->flags & VL_DESC) ? SBS_DOWN : SBS_UP; + case WE_PAINT: { + const NetworkGameList *sel = nd->server; + const SortButtonState arrow = (ld->flags & VL_DESC) ? SBS_DOWN : SBS_UP; - if (ld->flags & VL_REBUILD) { - BuildNetworkGameList(&WP(w, network_ql_d)); - SetVScrollCount(w, ld->list_length); - } - if (ld->flags & VL_RESORT) SortNetworkGameList(&WP(w, network_ql_d)); - - /* 'Refresh' button invisible if no server selected */ - w->SetWidgetDisabledState(NGWW_REFRESH, sel == NULL); - /* 'Join' button disabling conditions */ - w->SetWidgetDisabledState(NGWW_JOIN, sel == NULL || // no Selected Server - !sel->online || // Server offline - sel->info.clients_on >= sel->info.clients_max || // Server full - !sel->info.compatible); // Revision mismatch - - /* 'NewGRF Settings' button invisible if no NewGRF is used */ - w->SetWidgetHiddenState(NGWW_NEWGRF, sel == NULL || - !sel->online || - sel->info.grfconfig == NULL); - - SetDParam(0, 0x00); - SetDParam(1, _lan_internet_types_dropdown[_network_lan_internet]); - DrawWindowWidgets(w); - - /* Edit box to set player name */ - DrawEditBox(w, &WP(w, network_ql_d).q, NGWW_PLAYER); - - DrawString(w->widget[NGWW_PLAYER].left - 100, 23, STR_NETWORK_PLAYER_NAME, TC_GOLD); - - /* Sort based on widgets: name, clients, compatibility */ - switch (ld->sort_type) { - case NGWW_NAME - NGWW_NAME: DrawSortButtonState(w, NGWW_NAME, arrow); break; - case NGWW_CLIENTS - NGWW_NAME: DrawSortButtonState(w, NGWW_CLIENTS, arrow); break; - case NGWW_INFO - NGWW_NAME: DrawSortButtonState(w, NGWW_INFO, arrow); break; - } + if (ld->flags & VL_REBUILD) { + BuildNetworkGameList(&WP(w, network_ql_d)); + SetVScrollCount(w, ld->list_length); + } + if (ld->flags & VL_RESORT) SortNetworkGameList(&WP(w, network_ql_d)); + + /* 'Refresh' button invisible if no server selected */ + w->SetWidgetDisabledState(NGWW_REFRESH, sel == NULL); + /* 'Join' button disabling conditions */ + w->SetWidgetDisabledState(NGWW_JOIN, sel == NULL || // no Selected Server + !sel->online || // Server offline + sel->info.clients_on >= sel->info.clients_max || // Server full + !sel->info.compatible); // Revision mismatch + + /* 'NewGRF Settings' button invisible if no NewGRF is used */ + w->SetWidgetHiddenState(NGWW_NEWGRF, sel == NULL || + !sel->online || + sel->info.grfconfig == NULL); + + SetDParam(0, 0x00); + SetDParam(1, _lan_internet_types_dropdown[_network_lan_internet]); + DrawWindowWidgets(w); + + /* Edit box to set player name */ + DrawEditBox(w, &WP(w, network_ql_d).q, NGWW_PLAYER); + + DrawString(w->widget[NGWW_PLAYER].left - 100, 23, STR_NETWORK_PLAYER_NAME, TC_GOLD); + + /* Sort based on widgets: name, clients, compatibility */ + switch (ld->sort_type) { + case NGWW_NAME - NGWW_NAME: DrawSortButtonState(w, NGWW_NAME, arrow); break; + case NGWW_CLIENTS - NGWW_NAME: DrawSortButtonState(w, NGWW_CLIENTS, arrow); break; + case NGWW_INFO - NGWW_NAME: DrawSortButtonState(w, NGWW_INFO, arrow); break; + } - { // draw list of games uint16 y = NET_PRC__OFFSET_TOP_WIDGET + 3; int32 n = 0; int32 pos = w->vscroll.pos; @@ -347,261 +346,270 @@ static void NetworkGameWindowWndProc(Window *w, WindowEvent *e) y += NET_PRC__SIZE_OF_ROW; if (++n == w->vscroll.cap) break; // max number of games in the window } - } - /* Draw the right menu */ - GfxFillRect(w->widget[NGWW_DETAILS].left + 1, 43, w->widget[NGWW_DETAILS].right - 1, 92, 157); - if (sel == NULL) { - DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, 58, STR_NETWORK_GAME_INFO, TC_FROMSTRING); - } else if (!sel->online) { - SetDParamStr(0, sel->info.server_name); - DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, 68, STR_ORANGE, TC_FROMSTRING); // game name - - DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, 132, STR_NETWORK_SERVER_OFFLINE, TC_FROMSTRING); // server offline - } else { // show game info - uint16 y = 100; - const uint16 x = w->widget[NGWW_DETAILS].left + 5; - - DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, 48, STR_NETWORK_GAME_INFO, TC_FROMSTRING); - - - SetDParamStr(0, sel->info.server_name); - DrawStringCenteredTruncated(w->widget[NGWW_DETAILS].left, w->widget[NGWW_DETAILS].right, 62, STR_ORANGE, TC_BLACK); // game name - - SetDParamStr(0, sel->info.map_name); - DrawStringCenteredTruncated(w->widget[NGWW_DETAILS].left, w->widget[NGWW_DETAILS].right, 74, STR_02BD, TC_BLACK); // map name - - SetDParam(0, sel->info.clients_on); - SetDParam(1, sel->info.clients_max); - SetDParam(2, sel->info.companies_on); - SetDParam(3, sel->info.companies_max); - DrawString(x, y, STR_NETWORK_CLIENTS, TC_GOLD); - y += 10; - - SetDParam(0, STR_NETWORK_LANG_ANY + sel->info.server_lang); - DrawString(x, y, STR_NETWORK_LANGUAGE, TC_GOLD); // server language - y += 10; - - SetDParam(0, STR_TEMPERATE_LANDSCAPE + sel->info.map_set); - DrawString(x, y, STR_NETWORK_TILESET, TC_GOLD); // tileset - y += 10; - - SetDParam(0, sel->info.map_width); - SetDParam(1, sel->info.map_height); - DrawString(x, y, STR_NETWORK_MAP_SIZE, TC_GOLD); // map size - y += 10; - - SetDParamStr(0, sel->info.server_revision); - DrawString(x, y, STR_NETWORK_SERVER_VERSION, TC_GOLD); // server version - y += 10; - - SetDParamStr(0, sel->info.hostname); - SetDParam(1, sel->port); - DrawString(x, y, STR_NETWORK_SERVER_ADDRESS, TC_GOLD); // server address - y += 10; - - SetDParam(0, sel->info.start_date); - DrawString(x, y, STR_NETWORK_START_DATE, TC_GOLD); // start date - y += 10; - - SetDParam(0, sel->info.game_date); - DrawString(x, y, STR_NETWORK_CURRENT_DATE, TC_GOLD); // current date - y += 10; - - y += 2; - - if (!sel->info.compatible) { - DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, y, sel->info.version_compatible ? STR_NETWORK_GRF_MISMATCH : STR_NETWORK_VERSION_MISMATCH, TC_FROMSTRING); // server mismatch - } else if (sel->info.clients_on == sel->info.clients_max) { - /* Show: server full, when clients_on == clients_max */ - DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, y, STR_NETWORK_SERVER_FULL, TC_FROMSTRING); // server full - } else if (sel->info.use_password) { - DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, y, STR_NETWORK_PASSWORD, TC_FROMSTRING); // password warning + /* Draw the right menu */ + GfxFillRect(w->widget[NGWW_DETAILS].left + 1, 43, w->widget[NGWW_DETAILS].right - 1, 92, 157); + if (sel == NULL) { + DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, 58, STR_NETWORK_GAME_INFO, TC_FROMSTRING); + } else if (!sel->online) { + SetDParamStr(0, sel->info.server_name); + DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, 68, STR_ORANGE, TC_FROMSTRING); // game name + + DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, 132, STR_NETWORK_SERVER_OFFLINE, TC_FROMSTRING); // server offline + } else { // show game info + uint16 y = 100; + const uint16 x = w->widget[NGWW_DETAILS].left + 5; + + DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, 48, STR_NETWORK_GAME_INFO, TC_FROMSTRING); + + + SetDParamStr(0, sel->info.server_name); + DrawStringCenteredTruncated(w->widget[NGWW_DETAILS].left, w->widget[NGWW_DETAILS].right, 62, STR_ORANGE, TC_BLACK); // game name + + SetDParamStr(0, sel->info.map_name); + DrawStringCenteredTruncated(w->widget[NGWW_DETAILS].left, w->widget[NGWW_DETAILS].right, 74, STR_02BD, TC_BLACK); // map name + + SetDParam(0, sel->info.clients_on); + SetDParam(1, sel->info.clients_max); + SetDParam(2, sel->info.companies_on); + SetDParam(3, sel->info.companies_max); + DrawString(x, y, STR_NETWORK_CLIENTS, TC_GOLD); + y += 10; + + SetDParam(0, STR_NETWORK_LANG_ANY + sel->info.server_lang); + DrawString(x, y, STR_NETWORK_LANGUAGE, TC_GOLD); // server language + y += 10; + + SetDParam(0, STR_TEMPERATE_LANDSCAPE + sel->info.map_set); + DrawString(x, y, STR_NETWORK_TILESET, TC_GOLD); // tileset + y += 10; + + SetDParam(0, sel->info.map_width); + SetDParam(1, sel->info.map_height); + DrawString(x, y, STR_NETWORK_MAP_SIZE, TC_GOLD); // map size + y += 10; + + SetDParamStr(0, sel->info.server_revision); + DrawString(x, y, STR_NETWORK_SERVER_VERSION, TC_GOLD); // server version + y += 10; + + SetDParamStr(0, sel->info.hostname); + SetDParam(1, sel->port); + DrawString(x, y, STR_NETWORK_SERVER_ADDRESS, TC_GOLD); // server address + y += 10; + + SetDParam(0, sel->info.start_date); + DrawString(x, y, STR_NETWORK_START_DATE, TC_GOLD); // start date + y += 10; + + SetDParam(0, sel->info.game_date); + DrawString(x, y, STR_NETWORK_CURRENT_DATE, TC_GOLD); // current date + y += 10; + + y += 2; + + if (!sel->info.compatible) { + DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, y, sel->info.version_compatible ? STR_NETWORK_GRF_MISMATCH : STR_NETWORK_VERSION_MISMATCH, TC_FROMSTRING); // server mismatch + } else if (sel->info.clients_on == sel->info.clients_max) { + /* Show: server full, when clients_on == clients_max */ + DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, y, STR_NETWORK_SERVER_FULL, TC_FROMSTRING); // server full + } else if (sel->info.use_password) { + DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, y, STR_NETWORK_PASSWORD, TC_FROMSTRING); // password warning + } + + y += 10; } + } break; - y += 10; - } - } break; + case WE_CLICK: + nd->field = e->we.click.widget; + switch (e->we.click.widget) { + case NGWW_PLAYER: + ShowOnScreenKeyboard(w, &WP(w, network_ql_d).q, NGWW_PLAYER, 0, 0); + break; - case WE_CLICK: - nd->field = e->we.click.widget; - switch (e->we.click.widget) { - case NGWW_PLAYER: - ShowOnScreenKeyboard(w, &WP(w, network_ql_d).q, NGWW_PLAYER, 0, 0); - break; - case NGWW_CANCEL: // Cancel button - DeleteWindowById(WC_NETWORK_WINDOW, 0); - break; - case NGWW_CONN_BTN: // 'Connection' droplist - ShowDropDownMenu(w, _lan_internet_types_dropdown, _network_lan_internet, NGWW_CONN_BTN, 0, 0); // do it for widget NSSW_CONN_BTN - break; - case NGWW_NAME: // Sort by name - case NGWW_CLIENTS: // Sort by connected clients - case NGWW_INFO: // Connectivity (green dot) - if (ld->sort_type == e->we.click.widget - NGWW_NAME) ld->flags ^= VL_DESC; - ld->flags |= VL_RESORT; - ld->sort_type = e->we.click.widget - NGWW_NAME; - - _ng_sorting.order = !!(ld->flags & VL_DESC); - _ng_sorting.criteria = ld->sort_type; - SetWindowDirty(w); - break; - case NGWW_MATRIX: { // Matrix to show networkgames - NetworkGameList *cur_item; - uint32 id_v = (e->we.click.pt.y - NET_PRC__OFFSET_TOP_WIDGET) / NET_PRC__SIZE_OF_ROW; + case NGWW_CANCEL: // Cancel button + DeleteWindowById(WC_NETWORK_WINDOW, 0); + break; - if (id_v >= w->vscroll.cap) return; // click out of bounds - id_v += w->vscroll.pos; + case NGWW_CONN_BTN: // 'Connection' droplist + ShowDropDownMenu(w, _lan_internet_types_dropdown, _network_lan_internet, NGWW_CONN_BTN, 0, 0); // do it for widget NSSW_CONN_BTN + break; - cur_item = _network_game_list; - for (; id_v > 0 && cur_item != NULL; id_v--) cur_item = cur_item->next; + case NGWW_NAME: // Sort by name + case NGWW_CLIENTS: // Sort by connected clients + case NGWW_INFO: // Connectivity (green dot) + if (ld->sort_type == e->we.click.widget - NGWW_NAME) ld->flags ^= VL_DESC; + ld->flags |= VL_RESORT; + ld->sort_type = e->we.click.widget - NGWW_NAME; - nd->server = cur_item; - SetWindowDirty(w); - } break; - case NGWW_FIND: // Find server automatically - switch (_network_lan_internet) { - case 0: NetworkUDPSearchGame(); break; - case 1: NetworkUDPQueryMasterServer(); break; - } - break; - case NGWW_ADD: { // Add a server - ShowQueryString( - BindCString(_network_default_ip), - STR_NETWORK_ENTER_IP, - 31 | 0x1000, // maximum number of characters OR - 250, // characters up to this width pixels, whichever is satisfied first - w, CS_ALPHANUMERAL); - } break; - case NGWW_START: // Start server - ShowNetworkStartServerWindow(); - break; - case NGWW_JOIN: // Join Game - if (nd->server != NULL) { - snprintf(_network_last_host, sizeof(_network_last_host), "%s", inet_ntoa(*(struct in_addr *)&nd->server->ip)); - _network_last_port = nd->server->port; - ShowNetworkLobbyWindow(nd->server); + _ng_sorting.order = !!(ld->flags & VL_DESC); + _ng_sorting.criteria = ld->sort_type; + SetWindowDirty(w); + break; + + case NGWW_MATRIX: { // Matrix to show networkgames + NetworkGameList *cur_item; + uint32 id_v = (e->we.click.pt.y - NET_PRC__OFFSET_TOP_WIDGET) / NET_PRC__SIZE_OF_ROW; + + if (id_v >= w->vscroll.cap) return; // click out of bounds + id_v += w->vscroll.pos; + + cur_item = _network_game_list; + for (; id_v > 0 && cur_item != NULL; id_v--) cur_item = cur_item->next; + + nd->server = cur_item; + SetWindowDirty(w); + } break; + + case NGWW_FIND: // Find server automatically + switch (_network_lan_internet) { + case 0: NetworkUDPSearchGame(); break; + case 1: NetworkUDPQueryMasterServer(); break; + } + break; + + case NGWW_ADD: // Add a server + ShowQueryString( + BindCString(_network_default_ip), + STR_NETWORK_ENTER_IP, + 31 | 0x1000, // maximum number of characters OR + 250, // characters up to this width pixels, whichever is satisfied first + w, CS_ALPHANUMERAL); + break; + + case NGWW_START: // Start server + ShowNetworkStartServerWindow(); + break; + + case NGWW_JOIN: // Join Game + if (nd->server != NULL) { + snprintf(_network_last_host, sizeof(_network_last_host), "%s", inet_ntoa(*(struct in_addr *)&nd->server->ip)); + _network_last_port = nd->server->port; + ShowNetworkLobbyWindow(nd->server); + } + break; + + case NGWW_REFRESH: // Refresh + if (nd->server != NULL) NetworkUDPQueryServer(nd->server->info.hostname, nd->server->port); + break; + + case NGWW_NEWGRF: // NewGRF Settings + if (nd->server != NULL) ShowNewGRFSettings(false, false, false, &nd->server->info.grfconfig); + break; } break; - case NGWW_REFRESH: // Refresh - if (nd->server != NULL) - NetworkUDPQueryServer(nd->server->info.hostname, nd->server->port); - break; - case NGWW_NEWGRF: // NewGRF Settings - if (nd->server != NULL) ShowNewGRFSettings(false, false, false, &nd->server->info.grfconfig); - break; - } break; + case WE_DROPDOWN_SELECT: // we have selected a dropdown item in the list + switch (e->we.dropdown.button) { + case NGWW_CONN_BTN: + _network_lan_internet = e->we.dropdown.index; + break; - case WE_DROPDOWN_SELECT: // we have selected a dropdown item in the list - switch (e->we.dropdown.button) { - case NGWW_CONN_BTN: - _network_lan_internet = e->we.dropdown.index; - break; - default: - NOT_REACHED(); - } + default: + NOT_REACHED(); + } - SetWindowDirty(w); - break; + SetWindowDirty(w); + break; - case WE_MOUSELOOP: - if (nd->field == NGWW_PLAYER) HandleEditBox(w, &WP(w, network_ql_d).q, NGWW_PLAYER); - break; + case WE_MOUSELOOP: + if (nd->field == NGWW_PLAYER) HandleEditBox(w, &WP(w, network_ql_d).q, NGWW_PLAYER); + break; - case WE_MESSAGE: - if (e->we.message.msg != 0) nd->server = NULL; - ld->flags |= VL_REBUILD; - SetWindowDirty(w); - break; - - case WE_KEYPRESS: - if (nd->field != NGWW_PLAYER) { - if (nd->server != NULL) { - if (e->we.keypress.keycode == WKC_DELETE) { // Press 'delete' to remove servers - NetworkGameListRemoveItem(nd->server); - NetworkRebuildHostList(); - nd->server = NULL; + case WE_MESSAGE: + if (e->we.message.msg != 0) nd->server = NULL; + ld->flags |= VL_REBUILD; + SetWindowDirty(w); + break; + + case WE_KEYPRESS: + if (nd->field != NGWW_PLAYER) { + if (nd->server != NULL) { + if (e->we.keypress.keycode == WKC_DELETE) { // Press 'delete' to remove servers + NetworkGameListRemoveItem(nd->server); + NetworkRebuildHostList(); + nd->server = NULL; + } } + break; } - break; - } - if (HandleEditBoxKey(w, &WP(w, network_ql_d).q, NGWW_PLAYER, e) == 1) break; // enter pressed + if (HandleEditBoxKey(w, &WP(w, network_ql_d).q, NGWW_PLAYER, e) == 1) break; // enter pressed - /* The name is only allowed when it starts with a letter! */ - if (_edit_str_net_buf[0] != '\0' && _edit_str_net_buf[0] != ' ') { - ttd_strlcpy(_network_player_name, _edit_str_net_buf, lengthof(_network_player_name)); - } else { - ttd_strlcpy(_network_player_name, "Player", lengthof(_network_player_name)); - } + /* The name is only allowed when it starts with a letter! */ + if (_edit_str_net_buf[0] != '\0' && _edit_str_net_buf[0] != ' ') { + ttd_strlcpy(_network_player_name, _edit_str_net_buf, lengthof(_network_player_name)); + } else { + ttd_strlcpy(_network_player_name, "Player", lengthof(_network_player_name)); + } - break; + break; - case WE_ON_EDIT_TEXT: - NetworkAddServer(e->we.edittext.str); - NetworkRebuildHostList(); - break; + case WE_ON_EDIT_TEXT: + NetworkAddServer(e->we.edittext.str); + NetworkRebuildHostList(); + break; - case WE_RESIZE: { - w->vscroll.cap += e->we.sizing.diff.y / (int)w->resize.step_height; + case WE_RESIZE: { + w->vscroll.cap += e->we.sizing.diff.y / (int)w->resize.step_height; - w->widget[NGWW_MATRIX].data = (w->vscroll.cap << 8) + 1; + w->widget[NGWW_MATRIX].data = (w->vscroll.cap << 8) + 1; - SetVScrollCount(w, ld->list_length); + SetVScrollCount(w, ld->list_length); - int widget_width = w->widget[NGWW_FIND].right - w->widget[NGWW_FIND].left; - int space = (w->width - 4 * widget_width - 25) / 3; + int widget_width = w->widget[NGWW_FIND].right - w->widget[NGWW_FIND].left; + int space = (w->width - 4 * widget_width - 25) / 3; - int offset = 10; - for (uint i = 0; i < 4; i++) { - w->widget[NGWW_FIND + i].left = offset; - offset += widget_width; - w->widget[NGWW_FIND + i].right = offset; - offset += space; - } - } break; + int offset = 10; + for (uint i = 0; i < 4; i++) { + w->widget[NGWW_FIND + i].left = offset; + offset += widget_width; + w->widget[NGWW_FIND + i].right = offset; + offset += space; + } + } break; - case WE_DESTROY: // Nicely clean up the sort-list - free(WP(w, network_ql_d).sort_list); - break; + case WE_DESTROY: // Nicely clean up the sort-list + free(WP(w, network_ql_d).sort_list); + break; } } static const Widget _network_game_window_widgets[] = { /* TOP */ -{ WWT_CLOSEBOX, RESIZE_NONE, BGC, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, // NGWW_CLOSE -{ WWT_CAPTION, RESIZE_RIGHT, BGC, 11, 449, 0, 13, STR_NETWORK_MULTIPLAYER, STR_NULL}, -{ WWT_PANEL, RESIZE_RB, BGC, 0, 449, 14, 263, 0x0, STR_NULL}, +{ WWT_CLOSEBOX, RESIZE_NONE, BGC, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, // NGWW_CLOSE +{ WWT_CAPTION, RESIZE_RIGHT, BGC, 11, 449, 0, 13, STR_NETWORK_MULTIPLAYER, STR_NULL}, +{ WWT_PANEL, RESIZE_RB, BGC, 0, 449, 14, 263, 0x0, STR_NULL}, -{ WWT_TEXT, RESIZE_NONE, BGC, 9, 85, 23, 35, STR_NETWORK_CONNECTION, STR_NULL}, -{ WWT_DROPDOWNIN, RESIZE_NONE, BGC, 90, 181, 22, 33, STR_NETWORK_LAN_INTERNET_COMBO, STR_NETWORK_CONNECTION_TIP}, // NGWW_CONN_BTN +{ WWT_TEXT, RESIZE_NONE, BGC, 9, 85, 23, 35, STR_NETWORK_CONNECTION, STR_NULL}, +{ WWT_DROPDOWNIN, RESIZE_NONE, BGC, 90, 181, 22, 33, STR_NETWORK_LAN_INTERNET_COMBO, STR_NETWORK_CONNECTION_TIP}, // NGWW_CONN_BTN { WWT_EDITBOX, RESIZE_LR, BGC, 290, 440, 22, 33, STR_NETWORK_PLAYER_NAME_OSKTITLE, STR_NETWORK_ENTER_NAME_TIP}, // NGWW_PLAYER /* LEFT SIDE */ -{ WWT_PUSHTXTBTN, RESIZE_RIGHT, BTC, 10, 70, 42, 53, STR_NETWORK_GAME_NAME, STR_NETWORK_GAME_NAME_TIP}, // NGWW_NAME -{ WWT_PUSHTXTBTN, RESIZE_LR, BTC, 71, 150, 42, 53, STR_NETWORK_CLIENTS_CAPTION, STR_NETWORK_CLIENTS_CAPTION_TIP}, // NGWW_CLIENTS -{ WWT_PUSHTXTBTN, RESIZE_LR, BTC, 151, 190, 42, 53, STR_EMPTY, STR_NETWORK_INFO_ICONS_TIP}, // NGWW_INFO +{ WWT_PUSHTXTBTN, RESIZE_RIGHT, BTC, 10, 70, 42, 53, STR_NETWORK_GAME_NAME, STR_NETWORK_GAME_NAME_TIP}, // NGWW_NAME +{ WWT_PUSHTXTBTN, RESIZE_LR, BTC, 71, 150, 42, 53, STR_NETWORK_CLIENTS_CAPTION, STR_NETWORK_CLIENTS_CAPTION_TIP}, // NGWW_CLIENTS +{ WWT_PUSHTXTBTN, RESIZE_LR, BTC, 151, 190, 42, 53, STR_EMPTY, STR_NETWORK_INFO_ICONS_TIP}, // NGWW_INFO -{ WWT_MATRIX, RESIZE_RB, BGC, 10, 190, 54, 236, (13 << 8) + 1, STR_NETWORK_CLICK_GAME_TO_SELECT}, // NGWW_MATRIX -{ WWT_SCROLLBAR, RESIZE_LRB, BGC, 191, 202, 42, 236, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, +{ WWT_MATRIX, RESIZE_RB, BGC, 10, 190, 54, 236, (13 << 8) + 1, STR_NETWORK_CLICK_GAME_TO_SELECT}, // NGWW_MATRIX +{ WWT_SCROLLBAR, RESIZE_LRB, BGC, 191, 202, 42, 236, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, /* RIGHT SIDE */ -{ WWT_PANEL, RESIZE_LRB, BGC, 210, 440, 42, 236, 0x0, STR_NULL}, // NGWW_DETAILS +{ WWT_PANEL, RESIZE_LRB, BGC, 210, 440, 42, 236, 0x0, STR_NULL}, // NGWW_DETAILS -{ WWT_PUSHTXTBTN, RESIZE_LRTB, BTC, 215, 315, 215, 226, STR_NETWORK_JOIN_GAME, STR_NULL}, // NGWW_JOIN -{ WWT_PUSHTXTBTN, RESIZE_LRTB, BTC, 330, 435, 215, 226, STR_NETWORK_REFRESH, STR_NETWORK_REFRESH_TIP}, // NGWW_REFRESH +{ WWT_PUSHTXTBTN, RESIZE_LRTB, BTC, 215, 315, 215, 226, STR_NETWORK_JOIN_GAME, STR_NULL}, // NGWW_JOIN +{ WWT_PUSHTXTBTN, RESIZE_LRTB, BTC, 330, 435, 215, 226, STR_NETWORK_REFRESH, STR_NETWORK_REFRESH_TIP}, // NGWW_REFRESH -{ WWT_PUSHTXTBTN, RESIZE_LRTB, BTC, 330, 435, 197, 208, STR_NEWGRF_SETTINGS_BUTTON, STR_NULL}, // NGWW_NEWGRF +{ WWT_PUSHTXTBTN, RESIZE_LRTB, BTC, 330, 435, 197, 208, STR_NEWGRF_SETTINGS_BUTTON, STR_NULL}, // NGWW_NEWGRF /* BOTTOM */ -{ WWT_PUSHTXTBTN, RESIZE_TB, BTC, 10, 110, 246, 257, STR_NETWORK_FIND_SERVER, STR_NETWORK_FIND_SERVER_TIP}, // NGWW_FIND -{ WWT_PUSHTXTBTN, RESIZE_TB, BTC, 118, 218, 246, 257, STR_NETWORK_ADD_SERVER, STR_NETWORK_ADD_SERVER_TIP}, // NGWW_ADD -{ WWT_PUSHTXTBTN, RESIZE_TB, BTC, 226, 326, 246, 257, STR_NETWORK_START_SERVER, STR_NETWORK_START_SERVER_TIP}, // NGWW_START -{ WWT_PUSHTXTBTN, RESIZE_TB, BTC, 334, 434, 246, 257, STR_012E_CANCEL, STR_NULL}, // NGWW_CANCEL +{ WWT_PUSHTXTBTN, RESIZE_TB, BTC, 10, 110, 246, 257, STR_NETWORK_FIND_SERVER, STR_NETWORK_FIND_SERVER_TIP}, // NGWW_FIND +{ WWT_PUSHTXTBTN, RESIZE_TB, BTC, 118, 218, 246, 257, STR_NETWORK_ADD_SERVER, STR_NETWORK_ADD_SERVER_TIP}, // NGWW_ADD +{ WWT_PUSHTXTBTN, RESIZE_TB, BTC, 226, 326, 246, 257, STR_NETWORK_START_SERVER, STR_NETWORK_START_SERVER_TIP}, // NGWW_START +{ WWT_PUSHTXTBTN, RESIZE_TB, BTC, 334, 434, 246, 257, STR_012E_CANCEL, STR_NULL}, // NGWW_CANCEL -{ WWT_RESIZEBOX, RESIZE_LRTB, BGC, 438, 449, 252, 263, 0x0, STR_RESIZE_BUTTON }, +{ WWT_RESIZEBOX, RESIZE_LRTB, BGC, 438, 449, 252, 263, 0x0, STR_RESIZE_BUTTON }, { WIDGETS_END}, }; @@ -617,12 +625,11 @@ static const WindowDesc _network_game_window_desc = { void ShowNetworkGameWindow() { static bool first = true; - Window *w; DeleteWindowById(WC_NETWORK_WINDOW, 0); /* Only show once */ if (first) { - char* const *srv; + char * const *srv; first = false; // add all servers from the config file to our list @@ -634,7 +641,7 @@ void ShowNetworkGameWindow() _ng_sorting.order = 0; // sort ascending by default } - w = AllocateWindowDesc(&_network_game_window_desc); + Window *w = AllocateWindowDesc(&_network_game_window_desc); if (w != NULL) { querystr_d *querystr = &WP(w, network_ql_d).q; @@ -687,245 +694,254 @@ static void NetworkStartServerWindowWndProc(Window *w, WindowEvent *e) network_d *nd = &WP(w, network_ql_d).n; switch (e->event) { - case WE_CREATE: // focus input box - nd->field = NSSW_GAMENAME; - _network_game_info.use_password = (_network_server_password[0] != '\0'); - break; - - case WE_PAINT: { - int y = NSSWND_START, pos; - const FiosItem *item; - - /* draw basic widgets */ - SetDParam(1, _connection_types_dropdown[_network_advertise]); - SetDParam(2, _network_game_info.clients_max); - SetDParam(3, _network_game_info.companies_max); - SetDParam(4, _network_game_info.spectators_max); - SetDParam(5, STR_NETWORK_LANG_ANY + _network_game_info.server_lang); - DrawWindowWidgets(w); - - /* editbox to set game name */ - DrawEditBox(w, &WP(w, network_ql_d).q, NSSW_GAMENAME); - - /* if password is set, draw red '*' next to 'Set password' button */ - if (_network_game_info.use_password) DoDrawString("*", 408, 23, TC_RED); - - /* draw list of maps */ - GfxFillRect(11, 63, 258, 215, 0xD7); // black background of maps list - - pos = w->vscroll.pos; - while (pos < _fios_num + 1) { - item = _fios_list + pos - 1; - if (item == nd->map || (pos == 0 && nd->map == NULL)) - GfxFillRect(11, y - 1, 258, y + 10, 155); // show highlighted item with a different colour - - if (pos == 0) { - DrawString(14, y, STR_4010_GENERATE_RANDOM_NEW_GAME, TC_DARK_GREEN); - } else { - DoDrawString(item->title, 14, y, _fios_colors[item->type] ); - } - pos++; - y += NSSWND_ROWSIZE; - - if (y >= w->vscroll.cap * NSSWND_ROWSIZE + NSSWND_START) break; - } - } break; - - case WE_CLICK: - if (e->we.click.widget != NSSW_CONNTYPE_BTN && e->we.click.widget != NSSW_LANGUAGE_BTN) HideDropDownMenu(w); - nd->field = e->we.click.widget; - switch (e->we.click.widget) { - case NSSW_CLOSE: // Close 'X' - case NSSW_CANCEL: // Cancel button - ShowNetworkGameWindow(); - break; - case NSSW_GAMENAME: - ShowOnScreenKeyboard(w, &WP(w, network_ql_d).q, NSSW_GAMENAME, 0, 0); - break; - case NSSW_SETPWD: // Set password button - nd->widget_id = NSSW_SETPWD; - ShowQueryString(BindCString(_network_server_password), STR_NETWORK_SET_PASSWORD, 20, 250, w, CS_ALPHANUMERAL); + case WE_CREATE: // focus input box + nd->field = NSSW_GAMENAME; + _network_game_info.use_password = (_network_server_password[0] != '\0'); break; - case NSSW_SELMAP: { // Select map - int y = (e->we.click.pt.y - NSSWND_START) / NSSWND_ROWSIZE; + case WE_PAINT: { + int y = NSSWND_START, pos; + const FiosItem *item; - y += w->vscroll.pos; - if (y >= w->vscroll.count) return; + /* draw basic widgets */ + SetDParam(1, _connection_types_dropdown[_network_advertise]); + SetDParam(2, _network_game_info.clients_max); + SetDParam(3, _network_game_info.companies_max); + SetDParam(4, _network_game_info.spectators_max); + SetDParam(5, STR_NETWORK_LANG_ANY + _network_game_info.server_lang); + DrawWindowWidgets(w); - nd->map = (y == 0) ? NULL : _fios_list + y - 1; - SetWindowDirty(w); - } break; - case NSSW_CONNTYPE_BTN: // Connection type - ShowDropDownMenu(w, _connection_types_dropdown, _network_advertise, NSSW_CONNTYPE_BTN, 0, 0); // do it for widget NSSW_CONNTYPE_BTN - break; - case NSSW_CLIENTS_BTND: case NSSW_CLIENTS_BTNU: // Click on up/down button for number of clients - case NSSW_COMPANIES_BTND: case NSSW_COMPANIES_BTNU: // Click on up/down button for number of companies - case NSSW_SPECTATORS_BTND: case NSSW_SPECTATORS_BTNU: // Click on up/down button for number of spectators - /* Don't allow too fast scrolling */ - if ((w->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) { - w->HandleButtonClick(e->we.click.widget); - SetWindowDirty(w); - switch (e->we.click.widget) { - default: NOT_REACHED(); - case NSSW_CLIENTS_BTND: case NSSW_CLIENTS_BTNU: - _network_game_info.clients_max = Clamp(_network_game_info.clients_max + e->we.click.widget - NSSW_CLIENTS_TXT, 2, MAX_CLIENTS); - break; - case NSSW_COMPANIES_BTND: case NSSW_COMPANIES_BTNU: - _network_game_info.companies_max = Clamp(_network_game_info.companies_max + e->we.click.widget - NSSW_COMPANIES_TXT, 1, MAX_PLAYERS); - break; - case NSSW_SPECTATORS_BTND: case NSSW_SPECTATORS_BTNU: - _network_game_info.spectators_max = Clamp(_network_game_info.spectators_max + e->we.click.widget - NSSW_SPECTATORS_TXT, 0, MAX_CLIENTS); - break; + /* editbox to set game name */ + DrawEditBox(w, &WP(w, network_ql_d).q, NSSW_GAMENAME); + + /* if password is set, draw red '*' next to 'Set password' button */ + if (_network_game_info.use_password) DoDrawString("*", 408, 23, TC_RED); + + /* draw list of maps */ + GfxFillRect(11, 63, 258, 215, 0xD7); // black background of maps list + + pos = w->vscroll.pos; + while (pos < _fios_num + 1) { + item = _fios_list + pos - 1; + if (item == nd->map || (pos == 0 && nd->map == NULL)) + GfxFillRect(11, y - 1, 258, y + 10, 155); // show highlighted item with a different colour + + if (pos == 0) { + DrawString(14, y, STR_4010_GENERATE_RANDOM_NEW_GAME, TC_DARK_GREEN); + } else { + DoDrawString(item->title, 14, y, _fios_colors[item->type] ); } + pos++; + y += NSSWND_ROWSIZE; + + if (y >= w->vscroll.cap * NSSWND_ROWSIZE + NSSWND_START) break; } - _left_button_clicked = false; - break; - case NSSW_CLIENTS_TXT: // Click on number of players - nd->widget_id = NSSW_CLIENTS_TXT; - SetDParam(0, _network_game_info.clients_max); - ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_NETWORK_NUMBER_OF_CLIENTS, 3, 50, w, CS_NUMERAL); - break; - case NSSW_COMPANIES_TXT: // Click on number of companies - nd->widget_id = NSSW_COMPANIES_TXT; - SetDParam(0, _network_game_info.companies_max); - ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_NETWORK_NUMBER_OF_COMPANIES, 3, 50, w, CS_NUMERAL); - break; - case NSSW_SPECTATORS_TXT: // Click on number of spectators - nd->widget_id = NSSW_SPECTATORS_TXT; - SetDParam(0, _network_game_info.spectators_max); - ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_NETWORK_NUMBER_OF_SPECTATORS, 3, 50, w, CS_NUMERAL); - break; - case NSSW_LANGUAGE_BTN: { // Language - uint sel = 0; - for (uint i = 0; i < lengthof(_language_dropdown) - 1; i++) { - if (_language_dropdown[i] == STR_NETWORK_LANG_ANY + _network_game_info.server_lang) { - sel = i; + } break; + + case WE_CLICK: + if (e->we.click.widget != NSSW_CONNTYPE_BTN && e->we.click.widget != NSSW_LANGUAGE_BTN) HideDropDownMenu(w); + nd->field = e->we.click.widget; + switch (e->we.click.widget) { + case NSSW_CLOSE: // Close 'X' + case NSSW_CANCEL: // Cancel button + ShowNetworkGameWindow(); + break; + + case NSSW_GAMENAME: + ShowOnScreenKeyboard(w, &WP(w, network_ql_d).q, NSSW_GAMENAME, 0, 0); + break; + + case NSSW_SETPWD: // Set password button + nd->widget_id = NSSW_SETPWD; + ShowQueryString(BindCString(_network_server_password), STR_NETWORK_SET_PASSWORD, 20, 250, w, CS_ALPHANUMERAL); break; - } - } - ShowDropDownMenu(w, _language_dropdown, sel, NSSW_LANGUAGE_BTN, 0, 0); - break; - } - case NSSW_START: // Start game - _is_network_server = true; - - if (nd->map == NULL) { // start random new game - ShowGenerateLandscape(); - } else { // load a scenario - char *name = FiosBrowseTo(nd->map); - if (name != NULL) { - SetFiosType(nd->map->type); - _file_to_saveload.filetype = FT_SCENARIO; - ttd_strlcpy(_file_to_saveload.name, name, sizeof(_file_to_saveload.name)); - ttd_strlcpy(_file_to_saveload.title, nd->map->title, sizeof(_file_to_saveload.title)); + case NSSW_SELMAP: { // Select map + int y = (e->we.click.pt.y - NSSWND_START) / NSSWND_ROWSIZE; + + y += w->vscroll.pos; + if (y >= w->vscroll.count) return; + + nd->map = (y == 0) ? NULL : _fios_list + y - 1; + SetWindowDirty(w); + } break; + + case NSSW_CONNTYPE_BTN: // Connection type + ShowDropDownMenu(w, _connection_types_dropdown, _network_advertise, NSSW_CONNTYPE_BTN, 0, 0); // do it for widget NSSW_CONNTYPE_BTN + break; + + case NSSW_CLIENTS_BTND: case NSSW_CLIENTS_BTNU: // Click on up/down button for number of clients + case NSSW_COMPANIES_BTND: case NSSW_COMPANIES_BTNU: // Click on up/down button for number of companies + case NSSW_SPECTATORS_BTND: case NSSW_SPECTATORS_BTNU: // Click on up/down button for number of spectators + /* Don't allow too fast scrolling */ + if ((w->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) { + w->HandleButtonClick(e->we.click.widget); + SetWindowDirty(w); + switch (e->we.click.widget) { + default: NOT_REACHED(); + case NSSW_CLIENTS_BTND: case NSSW_CLIENTS_BTNU: + _network_game_info.clients_max = Clamp(_network_game_info.clients_max + e->we.click.widget - NSSW_CLIENTS_TXT, 2, MAX_CLIENTS); + break; + case NSSW_COMPANIES_BTND: case NSSW_COMPANIES_BTNU: + _network_game_info.companies_max = Clamp(_network_game_info.companies_max + e->we.click.widget - NSSW_COMPANIES_TXT, 1, MAX_PLAYERS); + break; + case NSSW_SPECTATORS_BTND: case NSSW_SPECTATORS_BTNU: + _network_game_info.spectators_max = Clamp(_network_game_info.spectators_max + e->we.click.widget - NSSW_SPECTATORS_TXT, 0, MAX_CLIENTS); + break; + } + } + _left_button_clicked = false; + break; + + case NSSW_CLIENTS_TXT: // Click on number of players + nd->widget_id = NSSW_CLIENTS_TXT; + SetDParam(0, _network_game_info.clients_max); + ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_NETWORK_NUMBER_OF_CLIENTS, 3, 50, w, CS_NUMERAL); + break; + + case NSSW_COMPANIES_TXT: // Click on number of companies + nd->widget_id = NSSW_COMPANIES_TXT; + SetDParam(0, _network_game_info.companies_max); + ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_NETWORK_NUMBER_OF_COMPANIES, 3, 50, w, CS_NUMERAL); + break; + + case NSSW_SPECTATORS_TXT: // Click on number of spectators + nd->widget_id = NSSW_SPECTATORS_TXT; + SetDParam(0, _network_game_info.spectators_max); + ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_NETWORK_NUMBER_OF_SPECTATORS, 3, 50, w, CS_NUMERAL); + break; + + case NSSW_LANGUAGE_BTN: { // Language + uint sel = 0; + for (uint i = 0; i < lengthof(_language_dropdown) - 1; i++) { + if (_language_dropdown[i] == STR_NETWORK_LANG_ANY + _network_game_info.server_lang) { + sel = i; + break; + } + } + ShowDropDownMenu(w, _language_dropdown, sel, NSSW_LANGUAGE_BTN, 0, 0); + } break; + + case NSSW_START: // Start game + _is_network_server = true; + + if (nd->map == NULL) { // start random new game + ShowGenerateLandscape(); + } else { // load a scenario + char *name = FiosBrowseTo(nd->map); + if (name != NULL) { + SetFiosType(nd->map->type); + _file_to_saveload.filetype = FT_SCENARIO; + ttd_strlcpy(_file_to_saveload.name, name, sizeof(_file_to_saveload.name)); + ttd_strlcpy(_file_to_saveload.title, nd->map->title, sizeof(_file_to_saveload.title)); + + DeleteWindow(w); + SwitchMode(SM_START_SCENARIO); + } + } + break; + + case NSSW_LOAD: // Load game + _is_network_server = true; + /* XXX - WC_NETWORK_WINDOW (this window) should stay, but if it stays, it gets + * copied all the elements of 'load game' and upon closing that, it segfaults */ DeleteWindow(w); - SwitchMode(SM_START_SCENARIO); - } + ShowSaveLoadDialog(SLD_LOAD_GAME); + break; } break; - case NSSW_LOAD: // Load game - _is_network_server = true; - /* XXX - WC_NETWORK_WINDOW (this window) should stay, but if it stays, it gets - * copied all the elements of 'load game' and upon closing that, it segfaults */ - DeleteWindow(w); - ShowSaveLoadDialog(SLD_LOAD_GAME); - break; - } - break; - case WE_DROPDOWN_SELECT: // we have selected a dropdown item in the list - switch (e->we.dropdown.button) { - case NSSW_CONNTYPE_BTN: - _network_advertise = (e->we.dropdown.index != 0); - break; - case NSSW_LANGUAGE_BTN: - _network_game_info.server_lang = _language_dropdown[e->we.dropdown.index] - STR_NETWORK_LANG_ANY; - break; - default: - NOT_REACHED(); - } + case WE_DROPDOWN_SELECT: // we have selected a dropdown item in the list + switch (e->we.dropdown.button) { + case NSSW_CONNTYPE_BTN: + _network_advertise = (e->we.dropdown.index != 0); + break; + case NSSW_LANGUAGE_BTN: + _network_game_info.server_lang = _language_dropdown[e->we.dropdown.index] - STR_NETWORK_LANG_ANY; + break; + default: + NOT_REACHED(); + } - SetWindowDirty(w); - break; + SetWindowDirty(w); + break; - case WE_MOUSELOOP: - if (nd->field == NSSW_GAMENAME) HandleEditBox(w, &WP(w, network_ql_d).q, NSSW_GAMENAME); - break; + case WE_MOUSELOOP: + if (nd->field == NSSW_GAMENAME) HandleEditBox(w, &WP(w, network_ql_d).q, NSSW_GAMENAME); + break; - case WE_KEYPRESS: - if (nd->field == NSSW_GAMENAME) { - if (HandleEditBoxKey(w, &WP(w, network_ql_d).q, NSSW_GAMENAME, e) == 1) break; // enter pressed + case WE_KEYPRESS: + if (nd->field == NSSW_GAMENAME) { + if (HandleEditBoxKey(w, &WP(w, network_ql_d).q, NSSW_GAMENAME, e) == 1) break; // enter pressed - ttd_strlcpy(_network_server_name, WP(w, network_ql_d).q.text.buf, sizeof(_network_server_name)); - } - break; + ttd_strlcpy(_network_server_name, WP(w, network_ql_d).q.text.buf, sizeof(_network_server_name)); + } + break; - case WE_ON_EDIT_TEXT: - if (e->we.edittext.str == NULL) break; + case WE_ON_EDIT_TEXT: + if (e->we.edittext.str == NULL) break; - if (nd->widget_id == NSSW_SETPWD) { - ttd_strlcpy(_network_server_password, e->we.edittext.str, lengthof(_network_server_password)); - _network_game_info.use_password = (_network_server_password[0] != '\0'); - } else { - int32 value = atoi(e->we.edittext.str); - w->InvalidateWidget(nd->widget_id); - switch (nd->widget_id) { - default: NOT_REACHED(); - case NSSW_CLIENTS_TXT: _network_game_info.clients_max = Clamp(value, 2, MAX_CLIENTS); break; - case NSSW_COMPANIES_TXT: _network_game_info.companies_max = Clamp(value, 1, MAX_PLAYERS); break; - case NSSW_SPECTATORS_TXT: _network_game_info.spectators_max = Clamp(value, 0, MAX_CLIENTS); break; + if (nd->widget_id == NSSW_SETPWD) { + ttd_strlcpy(_network_server_password, e->we.edittext.str, lengthof(_network_server_password)); + _network_game_info.use_password = (_network_server_password[0] != '\0'); + } else { + int32 value = atoi(e->we.edittext.str); + w->InvalidateWidget(nd->widget_id); + switch (nd->widget_id) { + default: NOT_REACHED(); + case NSSW_CLIENTS_TXT: _network_game_info.clients_max = Clamp(value, 2, MAX_CLIENTS); break; + case NSSW_COMPANIES_TXT: _network_game_info.companies_max = Clamp(value, 1, MAX_PLAYERS); break; + case NSSW_SPECTATORS_TXT: _network_game_info.spectators_max = Clamp(value, 0, MAX_CLIENTS); break; + } } - } - SetWindowDirty(w); - break; + SetWindowDirty(w); + break; } } static const Widget _network_start_server_window_widgets[] = { /* Window decoration and background panel */ -{ WWT_CLOSEBOX, RESIZE_NONE, BGC, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW }, // NSSW_CLOSE -{ WWT_CAPTION, RESIZE_NONE, BGC, 11, 419, 0, 13, STR_NETWORK_START_GAME_WINDOW, STR_NULL}, -{ WWT_PANEL, RESIZE_NONE, BGC, 0, 419, 14, 243, 0x0, STR_NULL}, +{ WWT_CLOSEBOX, RESIZE_NONE, BGC, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW }, // NSSW_CLOSE +{ WWT_CAPTION, RESIZE_NONE, BGC, 11, 419, 0, 13, STR_NETWORK_START_GAME_WINDOW, STR_NULL}, +{ WWT_PANEL, RESIZE_NONE, BGC, 0, 419, 14, 243, 0x0, STR_NULL}, /* Set game name and password widgets */ -{ WWT_TEXT, RESIZE_NONE, BGC, 10, 90, 22, 34, STR_NETWORK_NEW_GAME_NAME, STR_NULL}, +{ WWT_TEXT, RESIZE_NONE, BGC, 10, 90, 22, 34, STR_NETWORK_NEW_GAME_NAME, STR_NULL}, { WWT_EDITBOX, RESIZE_NONE, BGC, 100, 272, 22, 33, STR_NETWORK_NEW_GAME_NAME_OSKTITLE, STR_NETWORK_NEW_GAME_NAME_TIP}, // NSSW_GAMENAME -{ WWT_PUSHTXTBTN, RESIZE_NONE, BTC, 285, 405, 22, 33, STR_NETWORK_SET_PASSWORD, STR_NETWORK_PASSWORD_TIP}, // NSSW_SETPWD +{ WWT_PUSHTXTBTN, RESIZE_NONE, BTC, 285, 405, 22, 33, STR_NETWORK_SET_PASSWORD, STR_NETWORK_PASSWORD_TIP}, // NSSW_SETPWD /* List of playable scenarios */ -{ WWT_TEXT, RESIZE_NONE, BGC, 10, 110, 43, 55, STR_NETWORK_SELECT_MAP, STR_NULL}, -{ WWT_INSET, RESIZE_NONE, BGC, 10, 271, 62, 216, STR_NULL, STR_NETWORK_SELECT_MAP_TIP}, // NSSW_SELMAP -{ WWT_SCROLLBAR, RESIZE_NONE, BGC, 259, 270, 63, 215, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, +{ WWT_TEXT, RESIZE_NONE, BGC, 10, 110, 43, 55, STR_NETWORK_SELECT_MAP, STR_NULL}, +{ WWT_INSET, RESIZE_NONE, BGC, 10, 271, 62, 216, STR_NULL, STR_NETWORK_SELECT_MAP_TIP}, // NSSW_SELMAP +{ WWT_SCROLLBAR, RESIZE_NONE, BGC, 259, 270, 63, 215, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST}, /* Combo/selection boxes to control Connection Type / Max Clients / Max Companies / Max Observers / Language */ -{ WWT_TEXT, RESIZE_NONE, BGC, 280, 419, 63, 75, STR_NETWORK_CONNECTION, STR_NULL}, -{ WWT_DROPDOWNIN, RESIZE_NONE, BGC, 280, 410, 77, 88, STR_NETWORK_LAN_INTERNET_COMBO, STR_NETWORK_CONNECTION_TIP}, // NSSW_CONNTYPE_BTN +{ WWT_TEXT, RESIZE_NONE, BGC, 280, 419, 63, 75, STR_NETWORK_CONNECTION, STR_NULL}, +{ WWT_DROPDOWNIN, RESIZE_NONE, BGC, 280, 410, 77, 88, STR_NETWORK_LAN_INTERNET_COMBO, STR_NETWORK_CONNECTION_TIP}, // NSSW_CONNTYPE_BTN -{ WWT_TEXT, RESIZE_NONE, BGC, 280, 419, 95, 107, STR_NETWORK_NUMBER_OF_CLIENTS, STR_NULL}, -{ WWT_IMGBTN, RESIZE_NONE, BGC, 280, 291, 109, 120, SPR_ARROW_DOWN, STR_NETWORK_NUMBER_OF_CLIENTS_TIP}, // NSSW_CLIENTS_BTND -{ WWT_PUSHTXTBTN, RESIZE_NONE, BGC, 292, 397, 109, 120, STR_NETWORK_CLIENTS_SELECT, STR_NETWORK_NUMBER_OF_CLIENTS_TIP}, // NSSW_CLIENTS_TXT -{ WWT_IMGBTN, RESIZE_NONE, BGC, 398, 410, 109, 120, SPR_ARROW_UP, STR_NETWORK_NUMBER_OF_CLIENTS_TIP}, // NSSW_CLIENTS_BTNU +{ WWT_TEXT, RESIZE_NONE, BGC, 280, 419, 95, 107, STR_NETWORK_NUMBER_OF_CLIENTS, STR_NULL}, +{ WWT_IMGBTN, RESIZE_NONE, BGC, 280, 291, 109, 120, SPR_ARROW_DOWN, STR_NETWORK_NUMBER_OF_CLIENTS_TIP}, // NSSW_CLIENTS_BTND +{ WWT_PUSHTXTBTN, RESIZE_NONE, BGC, 292, 397, 109, 120, STR_NETWORK_CLIENTS_SELECT, STR_NETWORK_NUMBER_OF_CLIENTS_TIP}, // NSSW_CLIENTS_TXT +{ WWT_IMGBTN, RESIZE_NONE, BGC, 398, 410, 109, 120, SPR_ARROW_UP, STR_NETWORK_NUMBER_OF_CLIENTS_TIP}, // NSSW_CLIENTS_BTNU -{ WWT_TEXT, RESIZE_NONE, BGC, 280, 419, 127, 139, STR_NETWORK_NUMBER_OF_COMPANIES, STR_NULL}, -{ WWT_IMGBTN, RESIZE_NONE, BGC, 280, 291, 141, 152, SPR_ARROW_DOWN, STR_NETWORK_NUMBER_OF_COMPANIES_TIP}, // NSSW_COMPANIES_BTND -{ WWT_PUSHTXTBTN, RESIZE_NONE, BGC, 292, 397, 141, 152, STR_NETWORK_COMPANIES_SELECT, STR_NETWORK_NUMBER_OF_COMPANIES_TIP}, // NSSW_COMPANIES_TXT -{ WWT_IMGBTN, RESIZE_NONE, BGC, 398, 410, 141, 152, SPR_ARROW_UP, STR_NETWORK_NUMBER_OF_COMPANIES_TIP}, // NSSW_COMPANIES_BTNU +{ WWT_TEXT, RESIZE_NONE, BGC, 280, 419, 127, 139, STR_NETWORK_NUMBER_OF_COMPANIES, STR_NULL}, +{ WWT_IMGBTN, RESIZE_NONE, BGC, 280, 291, 141, 152, SPR_ARROW_DOWN, STR_NETWORK_NUMBER_OF_COMPANIES_TIP}, // NSSW_COMPANIES_BTND +{ WWT_PUSHTXTBTN, RESIZE_NONE, BGC, 292, 397, 141, 152, STR_NETWORK_COMPANIES_SELECT, STR_NETWORK_NUMBER_OF_COMPANIES_TIP}, // NSSW_COMPANIES_TXT +{ WWT_IMGBTN, RESIZE_NONE, BGC, 398, 410, 141, 152, SPR_ARROW_UP, STR_NETWORK_NUMBER_OF_COMPANIES_TIP}, // NSSW_COMPANIES_BTNU -{ WWT_TEXT, RESIZE_NONE, BGC, 280, 419, 159, 171, STR_NETWORK_NUMBER_OF_SPECTATORS, STR_NULL}, -{ WWT_IMGBTN, RESIZE_NONE, BGC, 280, 291, 173, 184, SPR_ARROW_DOWN, STR_NETWORK_NUMBER_OF_SPECTATORS_TIP}, // NSSW_SPECTATORS_BTND -{ WWT_PUSHTXTBTN, RESIZE_NONE, BGC, 292, 397, 173, 184, STR_NETWORK_SPECTATORS_SELECT, STR_NETWORK_NUMBER_OF_SPECTATORS_TIP}, // NSSW_SPECTATORS_TXT -{ WWT_IMGBTN, RESIZE_NONE, BGC, 398, 410, 173, 184, SPR_ARROW_UP, STR_NETWORK_NUMBER_OF_SPECTATORS_TIP}, // NSSW_SPECTATORS_BTNU +{ WWT_TEXT, RESIZE_NONE, BGC, 280, 419, 159, 171, STR_NETWORK_NUMBER_OF_SPECTATORS, STR_NULL}, +{ WWT_IMGBTN, RESIZE_NONE, BGC, 280, 291, 173, 184, SPR_ARROW_DOWN, STR_NETWORK_NUMBER_OF_SPECTATORS_TIP}, // NSSW_SPECTATORS_BTND +{ WWT_PUSHTXTBTN, RESIZE_NONE, BGC, 292, 397, 173, 184, STR_NETWORK_SPECTATORS_SELECT, STR_NETWORK_NUMBER_OF_SPECTATORS_TIP}, // NSSW_SPECTATORS_TXT +{ WWT_IMGBTN, RESIZE_NONE, BGC, 398, 410, 173, 184, SPR_ARROW_UP, STR_NETWORK_NUMBER_OF_SPECTATORS_TIP}, // NSSW_SPECTATORS_BTNU -{ WWT_TEXT, RESIZE_NONE, BGC, 280, 419, 191, 203, STR_NETWORK_LANGUAGE_SPOKEN, STR_NULL}, -{ WWT_DROPDOWNIN, RESIZE_NONE, BGC, 280, 410, 205, 216, STR_NETWORK_LANGUAGE_COMBO, STR_NETWORK_LANGUAGE_TIP}, // NSSW_LANGUAGE_BTN +{ WWT_TEXT, RESIZE_NONE, BGC, 280, 419, 191, 203, STR_NETWORK_LANGUAGE_SPOKEN, STR_NULL}, +{ WWT_DROPDOWNIN, RESIZE_NONE, BGC, 280, 410, 205, 216, STR_NETWORK_LANGUAGE_COMBO, STR_NETWORK_LANGUAGE_TIP}, // NSSW_LANGUAGE_BTN /* Buttons Start / Load / Cancel */ -{ WWT_PUSHTXTBTN, RESIZE_NONE, BTC, 40, 140, 224, 235, STR_NETWORK_START_GAME, STR_NETWORK_START_GAME_TIP}, // NSSW_START -{ WWT_PUSHTXTBTN, RESIZE_NONE, BTC, 150, 250, 224, 235, STR_NETWORK_LOAD_GAME, STR_NETWORK_LOAD_GAME_TIP}, // NSSW_LOAD -{ WWT_PUSHTXTBTN, RESIZE_NONE, BTC, 260, 360, 224, 235, STR_012E_CANCEL, STR_NULL}, // NSSW_CANCEL +{ WWT_PUSHTXTBTN, RESIZE_NONE, BTC, 40, 140, 224, 235, STR_NETWORK_START_GAME, STR_NETWORK_START_GAME_TIP}, // NSSW_START +{ WWT_PUSHTXTBTN, RESIZE_NONE, BTC, 150, 250, 224, 235, STR_NETWORK_LOAD_GAME, STR_NETWORK_LOAD_GAME_TIP}, // NSSW_LOAD +{ WWT_PUSHTXTBTN, RESIZE_NONE, BTC, 260, 360, 224, 235, STR_012E_CANCEL, STR_NULL}, // NSSW_CANCEL { WIDGETS_END}, }; @@ -940,10 +956,9 @@ static const WindowDesc _network_start_server_window_desc = { static void ShowNetworkStartServerWindow() { - Window *w; DeleteWindowById(WC_NETWORK_WINDOW, 0); - w = AllocateWindowDesc(&_network_start_server_window_desc); + Window *w = AllocateWindowDesc(&_network_start_server_window_desc); ttd_strlcpy(_edit_str_net_buf, _network_server_name, lengthof(_edit_str_net_buf)); _saveload_mode = SLD_NEW_GAME; @@ -957,11 +972,8 @@ static void ShowNetworkStartServerWindow() static PlayerID NetworkLobbyFindCompanyIndex(byte pos) { - PlayerID i; - - /* Scroll through all _network_player_info and get the 'pos' item - that is not empty */ - for (i = PLAYER_FIRST; i < MAX_PLAYERS; i++) { + /* Scroll through all _network_player_info and get the 'pos' item that is not empty */ + for (PlayerID i = PLAYER_FIRST; i < MAX_PLAYERS; i++) { if (_network_player_info[i].company_name[0] != '\0') { if (pos-- == 0) return i; } @@ -996,142 +1008,148 @@ static void NetworkLobbyWindowWndProc(Window *w, WindowEvent *e) network_d *nd = &WP(w, network_d); switch (e->event) { - case WE_CREATE: - nd->company = INVALID_PLAYER; - break; - - case WE_PAINT: { - const NetworkGameInfo *gi = &nd->server->info; - int y = NET_PRC__OFFSET_TOP_WIDGET_COMPANY, pos; - - /* Join button is disabled when no company is selected */ - w->SetWidgetDisabledState(NLWW_JOIN, nd->company == INVALID_PLAYER); - /* Cannot start new company if there are too many */ - w->SetWidgetDisabledState(NLWW_NEW, gi->companies_on >= gi->companies_max); - /* Cannot spectate if there are too many spectators */ - w->SetWidgetDisabledState(NLWW_SPECTATE, gi->spectators_on >= gi->spectators_max); - - /* Draw window widgets */ - SetDParamStr(0, gi->server_name); - DrawWindowWidgets(w); - - /* Draw company list */ - pos = w->vscroll.pos; - while (pos < gi->companies_on) { - byte company = NetworkLobbyFindCompanyIndex(pos); - bool income = false; - if (nd->company == company) - GfxFillRect(11, y - 1, 154, y + 10, 10); // show highlighted item with a different colour - - DoDrawStringTruncated(_network_player_info[company].company_name, 13, y, TC_BLACK, 135 - 13); - if (_network_player_info[company].use_password != 0) DrawSprite(SPR_LOCK, PAL_NONE, 135, y); - - /* If the company's income was positive puts a green dot else a red dot */ - if (_network_player_info[company].income >= 0) income = true; - DrawSprite(SPR_BLOT, income ? PALETTE_TO_GREEN : PALETTE_TO_RED, 145, y); - - pos++; - y += NET_PRC__SIZE_OF_ROW; - if (pos >= w->vscroll.cap) break; - } + case WE_CREATE: + nd->company = INVALID_PLAYER; + break; - /* Draw info about selected company when it is selected in the left window */ - GfxFillRect(174, 39, 403, 75, 157); - DrawStringCentered(290, 50, STR_NETWORK_COMPANY_INFO, TC_FROMSTRING); - if (nd->company != INVALID_PLAYER) { - const uint x = 183; - const uint trunc_width = w->widget[NLWW_DETAILS].right - x; - y = 80; - - SetDParam(0, nd->server->info.clients_on); - SetDParam(1, nd->server->info.clients_max); - SetDParam(2, nd->server->info.companies_on); - SetDParam(3, nd->server->info.companies_max); - DrawString(x, y, STR_NETWORK_CLIENTS, TC_GOLD); - y += 10; - - SetDParamStr(0, _network_player_info[nd->company].company_name); - DrawStringTruncated(x, y, STR_NETWORK_COMPANY_NAME, TC_GOLD, trunc_width); - y += 10; - - SetDParam(0, _network_player_info[nd->company].inaugurated_year); - DrawString(x, y, STR_NETWORK_INAUGURATION_YEAR, TC_GOLD); // inauguration year - y += 10; - - SetDParam(0, _network_player_info[nd->company].company_value); - DrawString(x, y, STR_NETWORK_VALUE, TC_GOLD); // company value - y += 10; - - SetDParam(0, _network_player_info[nd->company].money); - DrawString(x, y, STR_NETWORK_CURRENT_BALANCE, TC_GOLD); // current balance - y += 10; - - SetDParam(0, _network_player_info[nd->company].income); - DrawString(x, y, STR_NETWORK_LAST_YEARS_INCOME, TC_GOLD); // last year's income - y += 10; - - SetDParam(0, _network_player_info[nd->company].performance); - DrawString(x, y, STR_NETWORK_PERFORMANCE, TC_GOLD); // performance - y += 10; - - SetDParam(0, _network_player_info[nd->company].num_vehicle[0]); - SetDParam(1, _network_player_info[nd->company].num_vehicle[1]); - SetDParam(2, _network_player_info[nd->company].num_vehicle[2]); - SetDParam(3, _network_player_info[nd->company].num_vehicle[3]); - SetDParam(4, _network_player_info[nd->company].num_vehicle[4]); - DrawString(x, y, STR_NETWORK_VEHICLES, TC_GOLD); // vehicles - y += 10; - - SetDParam(0, _network_player_info[nd->company].num_station[0]); - SetDParam(1, _network_player_info[nd->company].num_station[1]); - SetDParam(2, _network_player_info[nd->company].num_station[2]); - SetDParam(3, _network_player_info[nd->company].num_station[3]); - SetDParam(4, _network_player_info[nd->company].num_station[4]); - DrawString(x, y, STR_NETWORK_STATIONS, TC_GOLD); // stations - y += 10; - - SetDParamStr(0, _network_player_info[nd->company].players); - DrawStringTruncated(x, y, STR_NETWORK_PLAYERS, TC_GOLD, trunc_width); // players - } - } break; + case WE_PAINT: { + const NetworkGameInfo *gi = &nd->server->info; + int y = NET_PRC__OFFSET_TOP_WIDGET_COMPANY, pos; - case WE_CLICK: - switch (e->we.click.widget) { - case NLWW_CLOSE: // Close 'X' - case NLWW_CANCEL: // Cancel button - ShowNetworkGameWindow(); - break; - case NLWW_MATRIX: { // Company list - uint32 id_v = (e->we.click.pt.y - NET_PRC__OFFSET_TOP_WIDGET_COMPANY) / NET_PRC__SIZE_OF_ROW; + /* Join button is disabled when no company is selected */ + w->SetWidgetDisabledState(NLWW_JOIN, nd->company == INVALID_PLAYER); + /* Cannot start new company if there are too many */ + w->SetWidgetDisabledState(NLWW_NEW, gi->companies_on >= gi->companies_max); + /* Cannot spectate if there are too many spectators */ + w->SetWidgetDisabledState(NLWW_SPECTATE, gi->spectators_on >= gi->spectators_max); - if (id_v >= w->vscroll.cap) break; + /* Draw window widgets */ + SetDParamStr(0, gi->server_name); + DrawWindowWidgets(w); - id_v += w->vscroll.pos; - nd->company = (id_v >= nd->server->info.companies_on) ? INVALID_PLAYER : NetworkLobbyFindCompanyIndex(id_v); - SetWindowDirty(w); + /* Draw company list */ + pos = w->vscroll.pos; + while (pos < gi->companies_on) { + byte company = NetworkLobbyFindCompanyIndex(pos); + bool income = false; + if (nd->company == company) + GfxFillRect(11, y - 1, 154, y + 10, 10); // show highlighted item with a different colour + + DoDrawStringTruncated(_network_player_info[company].company_name, 13, y, TC_BLACK, 135 - 13); + if (_network_player_info[company].use_password != 0) DrawSprite(SPR_LOCK, PAL_NONE, 135, y); + + /* If the company's income was positive puts a green dot else a red dot */ + if (_network_player_info[company].income >= 0) income = true; + DrawSprite(SPR_BLOT, income ? PALETTE_TO_GREEN : PALETTE_TO_RED, 145, y); + + pos++; + y += NET_PRC__SIZE_OF_ROW; + if (pos >= w->vscroll.cap) break; + } + + /* Draw info about selected company when it is selected in the left window */ + GfxFillRect(174, 39, 403, 75, 157); + DrawStringCentered(290, 50, STR_NETWORK_COMPANY_INFO, TC_FROMSTRING); + if (nd->company != INVALID_PLAYER) { + const uint x = 183; + const uint trunc_width = w->widget[NLWW_DETAILS].right - x; + y = 80; + + SetDParam(0, nd->server->info.clients_on); + SetDParam(1, nd->server->info.clients_max); + SetDParam(2, nd->server->info.companies_on); + SetDParam(3, nd->server->info.companies_max); + DrawString(x, y, STR_NETWORK_CLIENTS, TC_GOLD); + y += 10; + + SetDParamStr(0, _network_player_info[nd->company].company_name); + DrawStringTruncated(x, y, STR_NETWORK_COMPANY_NAME, TC_GOLD, trunc_width); + y += 10; + + SetDParam(0, _network_player_info[nd->company].inaugurated_year); + DrawString(x, y, STR_NETWORK_INAUGURATION_YEAR, TC_GOLD); // inauguration year + y += 10; + + SetDParam(0, _network_player_info[nd->company].company_value); + DrawString(x, y, STR_NETWORK_VALUE, TC_GOLD); // company value + y += 10; + + SetDParam(0, _network_player_info[nd->company].money); + DrawString(x, y, STR_NETWORK_CURRENT_BALANCE, TC_GOLD); // current balance + y += 10; + + SetDParam(0, _network_player_info[nd->company].income); + DrawString(x, y, STR_NETWORK_LAST_YEARS_INCOME, TC_GOLD); // last year's income + y += 10; + + SetDParam(0, _network_player_info[nd->company].performance); + DrawString(x, y, STR_NETWORK_PERFORMANCE, TC_GOLD); // performance + y += 10; + + SetDParam(0, _network_player_info[nd->company].num_vehicle[0]); + SetDParam(1, _network_player_info[nd->company].num_vehicle[1]); + SetDParam(2, _network_player_info[nd->company].num_vehicle[2]); + SetDParam(3, _network_player_info[nd->company].num_vehicle[3]); + SetDParam(4, _network_player_info[nd->company].num_vehicle[4]); + DrawString(x, y, STR_NETWORK_VEHICLES, TC_GOLD); // vehicles + y += 10; + + SetDParam(0, _network_player_info[nd->company].num_station[0]); + SetDParam(1, _network_player_info[nd->company].num_station[1]); + SetDParam(2, _network_player_info[nd->company].num_station[2]); + SetDParam(3, _network_player_info[nd->company].num_station[3]); + SetDParam(4, _network_player_info[nd->company].num_station[4]); + DrawString(x, y, STR_NETWORK_STATIONS, TC_GOLD); // stations + y += 10; + + SetDParamStr(0, _network_player_info[nd->company].players); + DrawStringTruncated(x, y, STR_NETWORK_PLAYERS, TC_GOLD, trunc_width); // players + } } break; - case NLWW_JOIN: // Join company - /* Button can be clicked only when it is enabled */ - _network_playas = nd->company; - NetworkClientConnectGame(_network_last_host, _network_last_port); - break; - case NLWW_NEW: // New company - _network_playas = PLAYER_NEW_COMPANY; - NetworkClientConnectGame(_network_last_host, _network_last_port); - break; - case NLWW_SPECTATE: // Spectate game - _network_playas = PLAYER_SPECTATOR; - NetworkClientConnectGame(_network_last_host, _network_last_port); - break; - case NLWW_REFRESH: // Refresh - NetworkTCPQueryServer(_network_last_host, _network_last_port); // company info - NetworkUDPQueryServer(_network_last_host, _network_last_port); // general data + + case WE_CLICK: + switch (e->we.click.widget) { + case NLWW_CLOSE: // Close 'X' + case NLWW_CANCEL: // Cancel button + ShowNetworkGameWindow(); + break; + + case NLWW_MATRIX: { // Company list + uint32 id_v = (e->we.click.pt.y - NET_PRC__OFFSET_TOP_WIDGET_COMPANY) / NET_PRC__SIZE_OF_ROW; + + if (id_v >= w->vscroll.cap) break; + + id_v += w->vscroll.pos; + nd->company = (id_v >= nd->server->info.companies_on) ? INVALID_PLAYER : NetworkLobbyFindCompanyIndex(id_v); + SetWindowDirty(w); + } break; + + case NLWW_JOIN: // Join company + /* Button can be clicked only when it is enabled */ + _network_playas = nd->company; + NetworkClientConnectGame(_network_last_host, _network_last_port); + break; + + case NLWW_NEW: // New company + _network_playas = PLAYER_NEW_COMPANY; + NetworkClientConnectGame(_network_last_host, _network_last_port); + break; + + case NLWW_SPECTATE: // Spectate game + _network_playas = PLAYER_SPECTATOR; + NetworkClientConnectGame(_network_last_host, _network_last_port); + break; + + case NLWW_REFRESH: // Refresh + NetworkTCPQueryServer(_network_last_host, _network_last_port); // company info + NetworkUDPQueryServer(_network_last_host, _network_last_port); // general data + break; + } break; - } break; - case WE_MESSAGE: - SetWindowDirty(w); - break; + case WE_MESSAGE: + SetWindowDirty(w); + break; } } @@ -1171,13 +1189,12 @@ static const WindowDesc _network_lobby_window_desc = { * @param ngl Selected game pointer which is passed to the new window */ static void ShowNetworkLobbyWindow(NetworkGameList *ngl) { - Window *w; DeleteWindowById(WC_NETWORK_WINDOW, 0); NetworkTCPQueryServer(_network_last_host, _network_last_port); // company info NetworkUDPQueryServer(_network_last_host, _network_last_port); // general data - w = AllocateWindowDesc(&_network_lobby_window_desc); + Window *w = AllocateWindowDesc(&_network_lobby_window_desc); if (w != NULL) { WP(w, network_ql_d).n.server = ngl; strcpy(_edit_str_net_buf, ""); @@ -1254,36 +1271,39 @@ static void ClientList_Kick(byte client_no) static void ClientList_Ban(byte client_no) { - uint i; uint32 ip = NetworkFindClientInfo(client_no)->client_ip; - for (i = 0; i < lengthof(_network_ban_list); i++) { + for (uint i = 0; i < lengthof(_network_ban_list); i++) { if (_network_ban_list[i] == NULL) { _network_ban_list[i] = strdup(inet_ntoa(*(struct in_addr *)&ip)); break; } } - if (client_no < MAX_PLAYERS) + if (client_no < MAX_PLAYERS) { SEND_COMMAND(PACKET_SERVER_ERROR)(DEREF_CLIENT(client_no), NETWORK_ERROR_KICKED); + } } static void ClientList_GiveMoney(byte client_no) { - if (NetworkFindClientInfo(client_no) != NULL) + if (NetworkFindClientInfo(client_no) != NULL) { ShowNetworkGiveMoneyWindow(NetworkFindClientInfo(client_no)->client_playas); + } } static void ClientList_SpeakToClient(byte client_no) { - if (NetworkFindClientInfo(client_no) != NULL) + if (NetworkFindClientInfo(client_no) != NULL) { ShowNetworkChatQueryWindow(DESTTYPE_CLIENT, NetworkFindClientInfo(client_no)->client_index); + } } static void ClientList_SpeakToCompany(byte client_no) { - if (NetworkFindClientInfo(client_no) != NULL) + if (NetworkFindClientInfo(client_no) != NULL) { ShowNetworkChatQueryWindow(DESTTYPE_TEAM, NetworkFindClientInfo(client_no)->client_playas); + } } static void ClientList_SpeakToAll(byte client_no) @@ -1293,34 +1313,38 @@ static void ClientList_SpeakToAll(byte client_no) static void ClientList_None(byte client_no) { - // No action ;) + /* No action ;) */ } -// Help, a action is clicked! What do we do? +/** + * An action is clicked! What do we do? + */ static void HandleClientListPopupClick(byte index, byte clientno) { - // A click on the Popup of the ClientList.. handle the command + /* A click on the Popup of the ClientList.. handle the command */ if (index < MAX_CLIENTLIST_ACTION && _clientlist_proc[index] != NULL) { _clientlist_proc[index](clientno); } } -// Finds the amount of clients and set the height correct +/** + * Finds the amount of clients and set the height correct + */ static bool CheckClientListHeight(Window *w) { int num = 0; const NetworkClientInfo *ci; - // Should be replaced with a loop through all clients + /* Should be replaced with a loop through all clients */ FOR_ALL_ACTIVE_CLIENT_INFOS(ci) { num++; } num *= CLNWND_ROWSIZE; - // If height is changed + /* If height is changed */ if (w->height != CLNWND_OFFSET + num + 1) { // XXX - magic unfortunately; (num + 2) has to be one bigger than heigh (num + 1) SetWindowDirty(w); @@ -1332,13 +1356,15 @@ static bool CheckClientListHeight(Window *w) return true; } -// Finds the amount of actions in the popup and set the height correct +/** + * Finds the amount of actions in the popup and set the height correct + */ static uint ClientListPopupHeight() { - int i, num = 0; + int num = 0; // Find the amount of actions - for (i = 0; i < MAX_CLIENTLIST_ACTION; i++) { + for (int i = 0; i < MAX_CLIENTLIST_ACTION; i++) { if (_clientlist_action[i][0] == '\0') continue; if (_clientlist_proc[i] == NULL) continue; num++; @@ -1349,21 +1375,25 @@ static uint ClientListPopupHeight() return num + 1; } -// Show the popup (action list) +/** + * Show the popup (action list) + */ static Window *PopupClientList(Window *w, int client_no, int x, int y) { - int i, h; + int i; const NetworkClientInfo *ci; DeleteWindowById(WC_TOOLBAR_MENU, 0); - // Clean the current actions + /* Clean the current actions */ for (i = 0; i < MAX_CLIENTLIST_ACTION; i++) { _clientlist_action[i][0] = '\0'; _clientlist_proc[i] = NULL; } - // Fill the actions this client has - // Watch is, max 50 chars long! + /* + * Fill the actions this client has. + * Watch is, max 50 chars long! + */ ci = NetworkFindClientInfo(client_no); if (ci == NULL) return NULL; @@ -1389,7 +1419,7 @@ static Window *PopupClientList(Window *w, int client_no, int x, int y) } } - // A server can kick clients (but not himself) + /* A server can kick clients (but not himself) */ if (_network_server && _network_own_client_index != ci->client_index) { GetString(_clientlist_action[i], STR_NETWORK_CLIENTLIST_KICK, lastof(_clientlist_action[i])); _clientlist_proc[i++] = &ClientList_Kick; @@ -1404,9 +1434,9 @@ static Window *PopupClientList(Window *w, int client_no, int x, int y) } /* Calculate the height */ - h = ClientListPopupHeight(); + int h = ClientListPopupHeight(); - // Allocate the popup + /* Allocate the popup */ w = AllocateWindow(x, y, 150, h + 1, ClientListPopupWndProc, WC_TOOLBAR_MENU, _client_list_popup_widgets); w->widget[0].bottom = w->widget[0].top + h; w->widget[0].right = w->widget[0].left + 150; @@ -1427,127 +1457,127 @@ static Window *PopupClientList(Window *w, int client_no, int x, int y) static void ClientListPopupWndProc(Window *w, WindowEvent *e) { switch (e->event) { - case WE_PAINT: { - int i, y, sel; - TextColour colour; - DrawWindowWidgets(w); - - // Draw the actions - sel = WP(w, menu_d).sel_index; - y = 1; - for (i = 0; i < MAX_CLIENTLIST_ACTION; i++, y += CLNWND_ROWSIZE) { - if (_clientlist_action[i][0] == '\0') continue; - if (_clientlist_proc[i] == NULL) continue; - - if (sel-- == 0) { // Selected item, highlight it - GfxFillRect(1, y, 150 - 2, y + CLNWND_ROWSIZE - 1, 0); - colour = TC_WHITE; - } else { - colour = TC_BLACK; - } + case WE_PAINT: { + DrawWindowWidgets(w); - DoDrawString(_clientlist_action[i], 4, y, colour); - } - } break; + /* Draw the actions */ + int sel = WP(w, menu_d).sel_index; + int y = 1; + for (int i = 0; i < MAX_CLIENTLIST_ACTION; i++, y += CLNWND_ROWSIZE) { + if (_clientlist_action[i][0] == '\0') continue; + if (_clientlist_proc[i] == NULL) continue; + + TextColour colour; + if (sel-- == 0) { // Selected item, highlight it + GfxFillRect(1, y, 150 - 2, y + CLNWND_ROWSIZE - 1, 0); + colour = TC_WHITE; + } else { + colour = TC_BLACK; + } - case WE_POPUPMENU_SELECT: { - // We selected an action - int index = (e->we.popupmenu.pt.y - w->top) / CLNWND_ROWSIZE; + DoDrawString(_clientlist_action[i], 4, y, colour); + } + } break; - if (index >= 0 && e->we.popupmenu.pt.y >= w->top) - HandleClientListPopupClick(index, WP(w, menu_d).main_button); + case WE_POPUPMENU_SELECT: { + /* We selected an action */ + int index = (e->we.popupmenu.pt.y - w->top) / CLNWND_ROWSIZE; - DeleteWindowById(WC_TOOLBAR_MENU, 0); - } break; + if (index >= 0 && e->we.popupmenu.pt.y >= w->top) { + HandleClientListPopupClick(index, WP(w, menu_d).main_button); + } - case WE_POPUPMENU_OVER: { - // Our mouse hoovers over an action? Select it! - int index = (e->we.popupmenu.pt.y - w->top) / CLNWND_ROWSIZE; + DeleteWindowById(WC_TOOLBAR_MENU, 0); + } break; - if (index == -1 || index == WP(w, menu_d).sel_index) return; + case WE_POPUPMENU_OVER: { + /* Our mouse hoovers over an action? Select it! */ + int index = (e->we.popupmenu.pt.y - w->top) / CLNWND_ROWSIZE; - WP(w, menu_d).sel_index = index; - SetWindowDirty(w); - } break; + if (index == -1 || index == WP(w, menu_d).sel_index) return; + WP(w, menu_d).sel_index = index; + SetWindowDirty(w); + } break; } } -// Main handle for clientlist +/** + * Main handle for clientlist + */ static void ClientListWndProc(Window *w, WindowEvent *e) { switch (e->event) { - case WE_PAINT: { - NetworkClientInfo *ci; - int y, i = 0; - TextColour colour; + case WE_PAINT: { + NetworkClientInfo *ci; + int i = 0; - // Check if we need to reset the height - if (!CheckClientListHeight(w)) break; + /* Check if we need to reset the height */ + if (!CheckClientListHeight(w)) break; - DrawWindowWidgets(w); + DrawWindowWidgets(w); - y = CLNWND_OFFSET; + int y = CLNWND_OFFSET; - FOR_ALL_ACTIVE_CLIENT_INFOS(ci) { - if (_selected_clientlist_item == i++) { // Selected item, highlight it - GfxFillRect(1, y, 248, y + CLNWND_ROWSIZE - 1, 0); - colour = TC_WHITE; - } else { - colour = TC_BLACK; - } + FOR_ALL_ACTIVE_CLIENT_INFOS(ci) { + TextColour colour; + if (_selected_clientlist_item == i++) { // Selected item, highlight it + GfxFillRect(1, y, 248, y + CLNWND_ROWSIZE - 1, 0); + colour = TC_WHITE; + } else { + colour = TC_BLACK; + } - if (ci->client_index == NETWORK_SERVER_INDEX) { - DrawString(4, y, STR_NETWORK_SERVER, colour); - } else { - DrawString(4, y, STR_NETWORK_CLIENT, colour); - } + if (ci->client_index == NETWORK_SERVER_INDEX) { + DrawString(4, y, STR_NETWORK_SERVER, colour); + } else { + DrawString(4, y, STR_NETWORK_CLIENT, colour); + } - // Filter out spectators - if (IsValidPlayer(ci->client_playas)) DrawPlayerIcon(ci->client_playas, 64, y + 1); + /* Filter out spectators */ + if (IsValidPlayer(ci->client_playas)) DrawPlayerIcon(ci->client_playas, 64, y + 1); - DoDrawString(ci->client_name, 81, y, colour); + DoDrawString(ci->client_name, 81, y, colour); - y += CLNWND_ROWSIZE; - } - } break; + y += CLNWND_ROWSIZE; + } + } break; - case WE_CLICK: - // Show the popup with option - if (_selected_clientlist_item != 255) { - PopupClientList(w, _selected_clientlist_item, e->we.click.pt.x + w->left, e->we.click.pt.y + w->top); - } + case WE_CLICK: + /* Show the popup with option */ + if (_selected_clientlist_item != 255) { + PopupClientList(w, _selected_clientlist_item, e->we.click.pt.x + w->left, e->we.click.pt.y + w->top); + } + break; - break; + case WE_MOUSEOVER: + /* -1 means we left the current window */ + if (e->we.mouseover.pt.y == -1) { + _selected_clientlist_y = 0; + _selected_clientlist_item = 255; + SetWindowDirty(w); + break; + } + /* It did not change.. no update! */ + if (e->we.mouseover.pt.y == _selected_clientlist_y) break; - case WE_MOUSEOVER: - // -1 means we left the current window - if (e->we.mouseover.pt.y == -1) { - _selected_clientlist_y = 0; - _selected_clientlist_item = 255; + /* Find the new selected item (if any) */ + _selected_clientlist_y = e->we.mouseover.pt.y; + if (e->we.mouseover.pt.y > CLNWND_OFFSET) { + _selected_clientlist_item = (e->we.mouseover.pt.y - CLNWND_OFFSET) / CLNWND_ROWSIZE; + } else { + _selected_clientlist_item = 255; + } + + /* Repaint */ SetWindowDirty(w); break; - } - // It did not change.. no update! - if (e->we.mouseover.pt.y == _selected_clientlist_y) break; - - // Find the new selected item (if any) - _selected_clientlist_y = e->we.mouseover.pt.y; - if (e->we.mouseover.pt.y > CLNWND_OFFSET) { - _selected_clientlist_item = (e->we.mouseover.pt.y - CLNWND_OFFSET) / CLNWND_ROWSIZE; - } else { - _selected_clientlist_item = 255; - } - - // Repaint - SetWindowDirty(w); - break; - case WE_DESTROY: case WE_CREATE: - // When created or destroyed, data is reset - _selected_clientlist_item = 255; - _selected_clientlist_y = 0; - break; + case WE_DESTROY: case WE_CREATE: + /* When created or destroyed, data is reset */ + _selected_clientlist_item = 255; + _selected_clientlist_y = 0; + break; } } @@ -1577,54 +1607,52 @@ void ShowNetworkNeedPassword(NetworkPasswordType npt) static void NetworkJoinStatusWindowWndProc(Window *w, WindowEvent *e) { switch (e->event) { - case WE_PAINT: { - uint8 progress; // used for progress bar - DrawWindowWidgets(w); - - DrawStringCentered(125, 35, STR_NETWORK_CONNECTING_1 + _network_join_status, TC_GREY); - switch (_network_join_status) { - case NETWORK_JOIN_STATUS_CONNECTING: case NETWORK_JOIN_STATUS_AUTHORIZING: - case NETWORK_JOIN_STATUS_GETTING_COMPANY_INFO: - progress = 10; // first two stages 10% - break; - case NETWORK_JOIN_STATUS_WAITING: - SetDParam(0, _network_join_waiting); - DrawStringCentered(125, 46, STR_NETWORK_CONNECTING_WAITING, TC_GREY); - progress = 15; // third stage is 15% - break; - case NETWORK_JOIN_STATUS_DOWNLOADING: - SetDParam(0, _network_join_kbytes); - SetDParam(1, _network_join_kbytes_total); - DrawStringCentered(125, 46, STR_NETWORK_CONNECTING_DOWNLOADING, TC_GREY); - /* Fallthrough */ - default: /* Waiting is 15%, so the resting receivement of map is maximum 70% */ - progress = 15 + _network_join_kbytes * (100 - 15) / _network_join_kbytes_total; - } + case WE_PAINT: { + uint8 progress; // used for progress bar + DrawWindowWidgets(w); - /* Draw nice progress bar :) */ - DrawFrameRect(20, 18, (int)((w->width - 20) * progress / 100), 28, 10, FR_NONE); - } break; + DrawStringCentered(125, 35, STR_NETWORK_CONNECTING_1 + _network_join_status, TC_GREY); + switch (_network_join_status) { + case NETWORK_JOIN_STATUS_CONNECTING: case NETWORK_JOIN_STATUS_AUTHORIZING: + case NETWORK_JOIN_STATUS_GETTING_COMPANY_INFO: + progress = 10; // first two stages 10% + break; + case NETWORK_JOIN_STATUS_WAITING: + SetDParam(0, _network_join_waiting); + DrawStringCentered(125, 46, STR_NETWORK_CONNECTING_WAITING, TC_GREY); + progress = 15; // third stage is 15% + break; + case NETWORK_JOIN_STATUS_DOWNLOADING: + SetDParam(0, _network_join_kbytes); + SetDParam(1, _network_join_kbytes_total); + DrawStringCentered(125, 46, STR_NETWORK_CONNECTING_DOWNLOADING, TC_GREY); + /* Fallthrough */ + default: /* Waiting is 15%, so the resting receivement of map is maximum 70% */ + progress = 15 + _network_join_kbytes * (100 - 15) / _network_join_kbytes_total; + } - case WE_CLICK: - switch (e->we.click.widget) { - case 2: /* Disconnect button */ + /* Draw nice progress bar :) */ + DrawFrameRect(20, 18, (int)((w->width - 20) * progress / 100), 28, 10, FR_NONE); + } break; + + case WE_CLICK: + if (e->we.click.widget == 2) { //Disconnect button NetworkDisconnect(); DeleteWindow(w); SwitchMode(SM_MENU); ShowNetworkGameWindow(); - break; - } - break; - - /* If the server asks for a password, we need to fill it in */ - case WE_ON_EDIT_TEXT_CANCEL: - NetworkDisconnect(); - ShowNetworkGameWindow(); + } break; - case WE_ON_EDIT_TEXT: - SEND_COMMAND(PACKET_CLIENT_PASSWORD)(pw_type, e->we.edittext.str); - break; + /* If the server asks for a password, we need to fill it in */ + case WE_ON_EDIT_TEXT_CANCEL: + NetworkDisconnect(); + ShowNetworkGameWindow(); + break; + + case WE_ON_EDIT_TEXT: + SEND_COMMAND(PACKET_CLIENT_PASSWORD)(pw_type, e->we.edittext.str); + break; } } @@ -1645,9 +1673,8 @@ static const WindowDesc _network_join_status_window_desc = { void ShowJoinStatusWindow() { - Window *w; DeleteWindowById(WC_NETWORK_STATUS_WINDOW, 0); - w = AllocateWindowDesc(&_network_join_status_window_desc); + Window *w = AllocateWindowDesc(&_network_join_status_window_desc); /* Parent the status window to the lobby */ if (w != NULL) w->parent = FindWindowById(WC_NETWORK_WINDOW, 0); } @@ -1802,60 +1829,60 @@ static void ChatTabCompletion(Window *w) static void ChatWindowWndProc(Window *w, WindowEvent *e) { switch (e->event) { - case WE_CREATE: - SendWindowMessage(WC_NEWS_WINDOW, 0, WE_CREATE, w->height, 0); - SetBit(_no_scroll, SCROLL_CHAT); // do not scroll the game with the arrow-keys - break; - - case WE_PAINT: { - static const StringID chat_captions[] = { - STR_NETWORK_CHAT_ALL_CAPTION, - STR_NETWORK_CHAT_COMPANY_CAPTION, - STR_NETWORK_CHAT_CLIENT_CAPTION - }; - - DrawWindowWidgets(w); - - assert((uint)WP(w, chatquerystr_d).dtype < lengthof(chat_captions)); - DrawStringRightAligned(w->widget[2].left - 2, w->widget[2].top + 1, chat_captions[WP(w, chatquerystr_d).dtype], TC_BLACK); - DrawEditBox(w, &WP(w, chatquerystr_d), 2); - } break; - - case WE_CLICK: - switch (e->we.click.widget) { - case 2: - ShowOnScreenKeyboard(w, &WP(w, chatquerystr_d), 2, 0, 3); - break; + case WE_CREATE: + SendWindowMessage(WC_NEWS_WINDOW, 0, WE_CREATE, w->height, 0); + SetBit(_no_scroll, SCROLL_CHAT); // do not scroll the game with the arrow-keys + break; - case 3: /* Send */ - SendChat(WP(w, chatquerystr_d).text.buf, WP(w, chatquerystr_d).dtype, WP(w, chatquerystr_d).dest); - /* FALLTHROUGH */ - case 0: /* Cancel */ DeleteWindow(w); break; - } - break; - - case WE_MOUSELOOP: - HandleEditBox(w, &WP(w, chatquerystr_d), 2); - break; - - case WE_KEYPRESS: - if (e->we.keypress.keycode == WKC_TAB) { - ChatTabCompletion(w); - } else { - _chat_tab_completion_active = false; - switch (HandleEditBoxKey(w, &WP(w, chatquerystr_d), 2, e)) { - case 1: /* Return */ + case WE_PAINT: { + static const StringID chat_captions[] = { + STR_NETWORK_CHAT_ALL_CAPTION, + STR_NETWORK_CHAT_COMPANY_CAPTION, + STR_NETWORK_CHAT_CLIENT_CAPTION + }; + + DrawWindowWidgets(w); + + assert((uint)WP(w, chatquerystr_d).dtype < lengthof(chat_captions)); + DrawStringRightAligned(w->widget[2].left - 2, w->widget[2].top + 1, chat_captions[WP(w, chatquerystr_d).dtype], TC_BLACK); + DrawEditBox(w, &WP(w, chatquerystr_d), 2); + } break; + + case WE_CLICK: + switch (e->we.click.widget) { + case 2: + ShowOnScreenKeyboard(w, &WP(w, chatquerystr_d), 2, 0, 3); + break; + + case 3: /* Send */ SendChat(WP(w, chatquerystr_d).text.buf, WP(w, chatquerystr_d).dtype, WP(w, chatquerystr_d).dest); /* FALLTHROUGH */ - case 2: /* Escape */ DeleteWindow(w); break; + case 0: /* Cancel */ DeleteWindow(w); break; } - } - break; + break; - case WE_DESTROY: - SendWindowMessage(WC_NEWS_WINDOW, 0, WE_DESTROY, 0, 0); - ClrBit(_no_scroll, SCROLL_CHAT); - break; + case WE_MOUSELOOP: + HandleEditBox(w, &WP(w, chatquerystr_d), 2); + break; + + case WE_KEYPRESS: + if (e->we.keypress.keycode == WKC_TAB) { + ChatTabCompletion(w); + } else { + _chat_tab_completion_active = false; + switch (HandleEditBoxKey(w, &WP(w, chatquerystr_d), 2, e)) { + case 1: /* Return */ + SendChat(WP(w, chatquerystr_d).text.buf, WP(w, chatquerystr_d).dtype, WP(w, chatquerystr_d).dest); + /* FALLTHROUGH */ + case 2: /* Escape */ DeleteWindow(w); break; + } + } + break; + + case WE_DESTROY: + SendWindowMessage(WC_NEWS_WINDOW, 0, WE_DESTROY, 0, 0); + ClrBit(_no_scroll, SCROLL_CHAT); + break; } } @@ -1877,14 +1904,12 @@ static const WindowDesc _chat_window_desc = { void ShowNetworkChatQueryWindow(DestType type, int dest) { - Window *w; - DeleteWindowById(WC_SEND_NETWORK_MSG, 0); _edit_str_net_buf[0] = '\0'; _chat_tab_completion_active = false; - w = AllocateWindowDesc(&_chat_window_desc); + Window *w = AllocateWindowDesc(&_chat_window_desc); w->LowerWidget(2); WP(w, chatquerystr_d).dtype = type; |