From 8e9ca5ebcb016aa0e15c52f08a8a6f5e1c8439e7 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Tue, 13 Sep 2022 23:14:14 +0100 Subject: [PATCH 01/11] Fix: Online Players list mouse hover behaviour. Hover highlight was visible even if the mouse pointer was in a different window, and the window refreshed itself every frame if the mouse pointer was not over its matrix widget. Resolved by using OnMouseOver() instead of OnMouseLoop(), and only redrawing if the hover position has changed. --- src/network/network_gui.cpp | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index 4017c0e71c..ae3f8c8f9b 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -2115,21 +2115,19 @@ public: } } - virtual void OnMouseLoop() override + void OnMouseOver(Point pt, int widget) override { - if (GetWidgetFromPos(this, _cursor.pos.x - this->left, _cursor.pos.y - this->top) != WID_CL_MATRIX) { - this->hover_index = -1; - this->SetDirty(); - return; - } - - NWidgetBase *nwi = this->GetWidget(WID_CL_MATRIX); - int y = _cursor.pos.y - this->top - nwi->pos_y - 2; - int index = y / this->line_height; - - if (index != this->hover_index) { - this->hover_index = index; - this->SetDirty(); + if (widget != WID_CL_MATRIX) { + if (this->hover_index != -1) { + this->hover_index = -1; + this->SetWidgetDirty(WID_CL_MATRIX); + } + } else { + int index = this->GetRowFromWidget(pt.y, widget, 0, -1); + if (index != this->hover_index) { + this->hover_index = index; + this->SetWidgetDirty(WID_CL_MATRIX); + } } } }; From fa5e2ca276de55233ff4f5f72f7eb4ba752e1ee5 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 14 Sep 2022 00:41:47 +0100 Subject: [PATCH 02/11] Cleanup: Tweak panel layout of Online Players window. This ensures panel borders not hidden behind other widgets. --- src/network/network_gui.cpp | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/network/network_gui.cpp b/src/network/network_gui.cpp index ae3f8c8f9b..695ea492bd 100644 --- a/src/network/network_gui.cpp +++ b/src/network/network_gui.cpp @@ -1336,15 +1336,17 @@ static const NWidgetPart _nested_client_list_widgets[] = { NWidget(WWT_PUSHIMGBTN, COLOUR_GREY, WID_CL_CLIENT_NAME_EDIT), SetMinimalSize(12, 14), SetDataTip(SPR_RENAME, STR_NETWORK_CLIENT_LIST_PLAYER_NAME_EDIT_TOOLTIP), EndContainer(), EndContainer(), - NWidget(NWID_HORIZONTAL), - NWidget(NWID_VERTICAL), - NWidget(WWT_MATRIX, COLOUR_GREY, WID_CL_MATRIX), SetMinimalSize(180, 0), SetResize(1, 1), SetFill(1, 1), SetMatrixDataTip(1, 0, STR_NULL), SetScrollbar(WID_CL_SCROLLBAR), + EndContainer(), + NWidget(NWID_HORIZONTAL), + NWidget(NWID_VERTICAL), + NWidget(WWT_MATRIX, COLOUR_GREY, WID_CL_MATRIX), SetMinimalSize(180, 0), SetResize(1, 1), SetFill(1, 1), SetMatrixDataTip(1, 0, STR_NULL), SetScrollbar(WID_CL_SCROLLBAR), + NWidget(WWT_PANEL, COLOUR_GREY), NWidget(WWT_TEXT, COLOUR_GREY, WID_CL_CLIENT_COMPANY_COUNT), SetFill(1, 0), SetMinimalTextLines(1, 0), SetResize(1, 0), SetPadding(2, 1, 2, 1), SetAlignment(SA_CENTER), SetDataTip(STR_NETWORK_CLIENT_LIST_CLIENT_COMPANY_COUNT, STR_NULL), EndContainer(), - NWidget(NWID_VERTICAL), - NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_CL_SCROLLBAR), - NWidget(WWT_RESIZEBOX, COLOUR_GREY), - EndContainer(), + EndContainer(), + NWidget(NWID_VERTICAL), + NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_CL_SCROLLBAR), + NWidget(WWT_RESIZEBOX, COLOUR_GREY), EndContainer(), EndContainer(), }; From f59f0195e3c58a9c2b8a5bfd1c25c813b74b91b4 Mon Sep 17 00:00:00 2001 From: PeterN Date: Tue, 20 Sep 2022 20:54:42 +0100 Subject: [PATCH 03/11] Fix: Wrong string used to determine size of zoomed out station sign. (#10036) --- src/station_cmd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/station_cmd.cpp b/src/station_cmd.cpp index f0bde9f45f..56486be4df 100644 --- a/src/station_cmd.cpp +++ b/src/station_cmd.cpp @@ -424,7 +424,7 @@ void Station::UpdateVirtCoord() SetDParam(0, this->index); SetDParam(1, this->facilities); - this->sign.UpdatePosition(pt.x, pt.y, STR_VIEWPORT_STATION); + this->sign.UpdatePosition(pt.x, pt.y, STR_VIEWPORT_STATION, STR_VIEWPORT_STATION_TINY); _viewport_sign_kdtree.Insert(ViewportSignKdtreeItem::MakeStation(this->index)); From 0bac74ec2b0e3f5ed03f73b38b0276b595ce723c Mon Sep 17 00:00:00 2001 From: PeterN Date: Wed, 21 Sep 2022 08:31:59 +0100 Subject: [PATCH 04/11] Fix #10038: Missing upper bounds check when loading custom playlists (#10039) --- src/music_gui.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/music_gui.cpp b/src/music_gui.cpp index 80d55eb4ba..b4a4de5196 100644 --- a/src/music_gui.cpp +++ b/src/music_gui.cpp @@ -127,11 +127,11 @@ void MusicSystem::BuildPlaylists() /* Load custom playlists * Song index offsets are 1-based, zero indicates invalid/end-of-list value */ for (uint i = 0; i < NUM_SONGS_PLAYLIST; i++) { - if (_settings_client.music.custom_1[i] > 0) { + if (_settings_client.music.custom_1[i] > 0 && _settings_client.music.custom_1[i] <= NUM_SONGS_AVAILABLE) { PlaylistEntry entry(set, _settings_client.music.custom_1[i] - 1); if (entry.IsValid()) this->standard_playlists[PLCH_CUSTOM1].push_back(entry); } - if (_settings_client.music.custom_2[i] > 0) { + if (_settings_client.music.custom_2[i] > 0 && _settings_client.music.custom_2[i] <= NUM_SONGS_AVAILABLE) { PlaylistEntry entry(set, _settings_client.music.custom_2[i] - 1); if (entry.IsValid()) this->standard_playlists[PLCH_CUSTOM2].push_back(entry); } From 0a7ffae0d9f62f234f0f061d7713ce4ca6388f10 Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Fri, 9 Sep 2022 17:40:13 +0100 Subject: [PATCH 05/11] Fix #10010: Memory leak in IConsolePrint in non-dedicated case --- src/console.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/console.cpp b/src/console.cpp index 10e0bc279a..393dca2754 100644 --- a/src/console.cpp +++ b/src/console.cpp @@ -123,6 +123,7 @@ void IConsolePrint(TextColour colour_code, const std::string &string) IConsoleWriteToLogFile(str); IConsoleGUIPrint(colour_code, str); + free(str); } /** From 20f7ff8ac08ffe717098a5ba2b47db4fed477c0d Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Fri, 9 Sep 2022 17:40:50 +0100 Subject: [PATCH 06/11] Codechange: Fix unnecessary string reallocation in IConsoleLine constructor --- src/console_gui.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/console_gui.cpp b/src/console_gui.cpp index dcc4cd5b35..eaef1e4efa 100644 --- a/src/console_gui.cpp +++ b/src/console_gui.cpp @@ -53,8 +53,8 @@ struct IConsoleLine { * @param buffer the data to print. * @param colour the colour of the line. */ - IConsoleLine(const std::string &buffer, TextColour colour) : - buffer(buffer), + IConsoleLine(std::string buffer, TextColour colour) : + buffer(std::move(buffer)), colour(colour), time(0) { From 5e413c9dcdf91de1309ef6160219caadac796daf Mon Sep 17 00:00:00 2001 From: Jonathan G Rennison Date: Wed, 21 Sep 2022 11:37:11 +0100 Subject: [PATCH 07/11] Fix #9804: Only apply sprite_zoom_min setting when sprites available (#9988) Only discard sprite zoom levels when a suitable higher zoom level is defined in the same colour mode This is to avoid placeholder or empty sprites being used, causing visual artefacts --- src/spritecache.cpp | 49 ++++++++++++++++++++++++++----- src/spritecache.h | 7 +++++ src/spriteloader/grf.cpp | 21 ++++++++++--- src/spriteloader/grf.hpp | 2 +- src/spriteloader/spriteloader.hpp | 3 +- 5 files changed, 69 insertions(+), 13 deletions(-) diff --git a/src/spritecache.cpp b/src/spritecache.cpp index 6d5ce0189c..337069a8fa 100644 --- a/src/spritecache.cpp +++ b/src/spritecache.cpp @@ -36,6 +36,7 @@ struct SpriteCache { int16 lru; SpriteType type; ///< In some cases a single sprite is misused by two NewGRFs. Once as real sprite and once as recolour sprite. If the recolour sprite gets into the cache it might be drawn as real sprite which causes enormous trouble. bool warned; ///< True iff the user has been warned about incorrect use of this sprite + byte control_flags; ///< Control flags, see SpriteCacheCtrlFlags }; @@ -471,10 +472,10 @@ static void *ReadSprite(const SpriteCache *sc, SpriteID id, SpriteType sprite_ty SpriteLoaderGrf sprite_loader(file.GetContainerVersion()); if (sprite_type != ST_MAPGEN && encoder->Is32BppSupported()) { /* Try for 32bpp sprites first. */ - sprite_avail = sprite_loader.LoadSprite(sprite, file, file_pos, sprite_type, true); + sprite_avail = sprite_loader.LoadSprite(sprite, file, file_pos, sprite_type, true, sc->control_flags); } if (sprite_avail == 0) { - sprite_avail = sprite_loader.LoadSprite(sprite, file, file_pos, sprite_type, false); + sprite_avail = sprite_loader.LoadSprite(sprite, file, file_pos, sprite_type, false, sc->control_flags); } if (sprite_avail == 0) { @@ -529,9 +530,13 @@ static void *ReadSprite(const SpriteCache *sc, SpriteID id, SpriteType sprite_ty return encoder->Encode(sprite, allocator); } +struct GrfSpriteOffset { + size_t file_pos; + byte control_flags; +}; /** Map from sprite numbers to position in the GRF file. */ -static std::map _grf_sprite_offsets; +static std::map _grf_sprite_offsets; /** * Get the file offset for a specific sprite in the sprite section of a GRF. @@ -540,7 +545,7 @@ static std::map _grf_sprite_offsets; */ size_t GetGRFSpriteOffset(uint32 id) { - return _grf_sprite_offsets.find(id) != _grf_sprite_offsets.end() ? _grf_sprite_offsets[id] : SIZE_MAX; + return _grf_sprite_offsets.find(id) != _grf_sprite_offsets.end() ? _grf_sprite_offsets[id].file_pos : SIZE_MAX; } /** @@ -557,13 +562,35 @@ void ReadGRFSpriteOffsets(SpriteFile &file) size_t old_pos = file.GetPos(); file.SeekTo(data_offset, SEEK_CUR); + GrfSpriteOffset offset = { 0, 0 }; + /* Loop over all sprite section entries and store the file * offset for each newly encountered ID. */ uint32 id, prev_id = 0; while ((id = file.ReadDword()) != 0) { - if (id != prev_id) _grf_sprite_offsets[id] = file.GetPos() - 4; + if (id != prev_id) { + _grf_sprite_offsets[prev_id] = offset; + offset.file_pos = file.GetPos() - 4; + offset.control_flags = 0; + } prev_id = id; - file.SkipBytes(file.ReadDword()); + uint length = file.ReadDword(); + if (length > 0) { + byte colour = file.ReadByte() & SCC_MASK; + length--; + if (length > 0) { + byte zoom = file.ReadByte(); + length--; + if (colour != 0 && zoom == 0) { // ZOOM_LVL_OUT_4X (normal zoom) + SetBit(offset.control_flags, (colour != SCC_PAL) ? SCCF_ALLOW_ZOOM_MIN_1X_32BPP : SCCF_ALLOW_ZOOM_MIN_1X_PAL); + SetBit(offset.control_flags, (colour != SCC_PAL) ? SCCF_ALLOW_ZOOM_MIN_2X_32BPP : SCCF_ALLOW_ZOOM_MIN_2X_PAL); + } + if (colour != 0 && zoom == 2) { // ZOOM_LVL_OUT_2X (2x zoomed in) + SetBit(offset.control_flags, (colour != SCC_PAL) ? SCCF_ALLOW_ZOOM_MIN_2X_32BPP : SCCF_ALLOW_ZOOM_MIN_2X_PAL); + } + } + } + file.SkipBytes(length); } /* Continue processing the data section. */ @@ -591,6 +618,7 @@ bool LoadNextSprite(int load_index, SpriteFile &file, uint file_sprite_id) SpriteType type; void *data = nullptr; + byte control_flags = 0; if (grf_type == 0xFF) { /* Some NewGRF files have "empty" pseudo-sprites which are 1 * byte long. Catch these so the sprites won't be displayed. */ @@ -607,7 +635,13 @@ bool LoadNextSprite(int load_index, SpriteFile &file, uint file_sprite_id) return false; } /* It is not an error if no sprite with the provided ID is found in the sprite section. */ - file_pos = GetGRFSpriteOffset(file.ReadDword()); + auto iter = _grf_sprite_offsets.find(file.ReadDword()); + if (iter != _grf_sprite_offsets.end()) { + file_pos = iter->second.file_pos; + control_flags = iter->second.control_flags; + } else { + file_pos = SIZE_MAX; + } type = ST_NORMAL; } else { file.SkipBytes(7); @@ -637,6 +671,7 @@ bool LoadNextSprite(int load_index, SpriteFile &file, uint file_sprite_id) sc->id = file_sprite_id; sc->type = type; sc->warned = false; + sc->control_flags = control_flags; return true; } diff --git a/src/spritecache.h b/src/spritecache.h index 367d690951..be64843b5a 100644 --- a/src/spritecache.h +++ b/src/spritecache.h @@ -22,6 +22,13 @@ struct Sprite { byte data[]; ///< Sprite data. }; +enum SpriteCacheCtrlFlags { + SCCF_ALLOW_ZOOM_MIN_1X_PAL = 0, ///< Allow use of sprite min zoom setting at 1x in palette mode. + SCCF_ALLOW_ZOOM_MIN_1X_32BPP = 1, ///< Allow use of sprite min zoom setting at 1x in 32bpp mode. + SCCF_ALLOW_ZOOM_MIN_2X_PAL = 2, ///< Allow use of sprite min zoom setting at 2x in palette mode. + SCCF_ALLOW_ZOOM_MIN_2X_32BPP = 3, ///< Allow use of sprite min zoom setting at 2x in 32bpp mode. +}; + extern uint _sprite_cache_size; typedef void *AllocatorProc(size_t size); diff --git a/src/spriteloader/grf.cpp b/src/spriteloader/grf.cpp index 1530db0c81..6c71a2d96d 100644 --- a/src/spriteloader/grf.cpp +++ b/src/spriteloader/grf.cpp @@ -17,6 +17,7 @@ #include "../core/math_func.hpp" #include "../core/alloc_type.hpp" #include "../core/bitmath_func.hpp" +#include "../spritecache.h" #include "grf.hpp" #include "../safeguards.h" @@ -241,7 +242,7 @@ uint8 LoadSpriteV1(SpriteLoader::Sprite *sprite, SpriteFile &file, size_t file_p return 0; } -uint8 LoadSpriteV2(SpriteLoader::Sprite *sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp) +uint8 LoadSpriteV2(SpriteLoader::Sprite *sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, byte control_flags) { static const ZoomLevel zoom_lvl_map[6] = {ZOOM_LVL_OUT_4X, ZOOM_LVL_NORMAL, ZOOM_LVL_OUT_2X, ZOOM_LVL_OUT_8X, ZOOM_LVL_OUT_16X, ZOOM_LVL_OUT_32X}; @@ -269,7 +270,19 @@ uint8 LoadSpriteV2(SpriteLoader::Sprite *sprite, SpriteFile &file, size_t file_p bool is_wanted_zoom_lvl; if (sprite_type != ST_MAPGEN) { - is_wanted_zoom_lvl = (zoom < lengthof(zoom_lvl_map) && zoom_lvl_map[zoom] >= _settings_client.gui.sprite_zoom_min); + if (zoom < lengthof(zoom_lvl_map)) { + is_wanted_zoom_lvl = true; + if (_settings_client.gui.sprite_zoom_min >= ZOOM_LVL_OUT_2X && + HasBit(control_flags, load_32bpp ? SCCF_ALLOW_ZOOM_MIN_2X_32BPP : SCCF_ALLOW_ZOOM_MIN_2X_PAL) && zoom_lvl_map[zoom] < ZOOM_LVL_OUT_2X) { + is_wanted_zoom_lvl = false; + } + if (_settings_client.gui.sprite_zoom_min >= ZOOM_LVL_OUT_4X && + HasBit(control_flags, load_32bpp ? SCCF_ALLOW_ZOOM_MIN_1X_32BPP : SCCF_ALLOW_ZOOM_MIN_1X_PAL) && zoom_lvl_map[zoom] < ZOOM_LVL_OUT_4X) { + is_wanted_zoom_lvl = false; + } + } else { + is_wanted_zoom_lvl = false; + } } else { is_wanted_zoom_lvl = (zoom == 0); } @@ -326,10 +339,10 @@ uint8 LoadSpriteV2(SpriteLoader::Sprite *sprite, SpriteFile &file, size_t file_p return loaded_sprites; } -uint8 SpriteLoaderGrf::LoadSprite(SpriteLoader::Sprite *sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp) +uint8 SpriteLoaderGrf::LoadSprite(SpriteLoader::Sprite *sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, byte control_flags) { if (this->container_ver >= 2) { - return LoadSpriteV2(sprite, file, file_pos, sprite_type, load_32bpp); + return LoadSpriteV2(sprite, file, file_pos, sprite_type, load_32bpp, control_flags); } else { return LoadSpriteV1(sprite, file, file_pos, sprite_type, load_32bpp); } diff --git a/src/spriteloader/grf.hpp b/src/spriteloader/grf.hpp index c100590afb..27253bc398 100644 --- a/src/spriteloader/grf.hpp +++ b/src/spriteloader/grf.hpp @@ -17,7 +17,7 @@ class SpriteLoaderGrf : public SpriteLoader { byte container_ver; public: SpriteLoaderGrf(byte container_ver) : container_ver(container_ver) {} - uint8 LoadSprite(SpriteLoader::Sprite *sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp); + uint8 LoadSprite(SpriteLoader::Sprite *sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, byte control_flags); }; #endif /* SPRITELOADER_GRF_HPP */ diff --git a/src/spriteloader/spriteloader.hpp b/src/spriteloader/spriteloader.hpp index beadbb6591..fdd8be8612 100644 --- a/src/spriteloader/spriteloader.hpp +++ b/src/spriteloader/spriteloader.hpp @@ -72,9 +72,10 @@ public: * @param file_pos The position within the file the image begins. * @param sprite_type The type of sprite we're trying to load. * @param load_32bpp True if 32bpp sprites should be loaded, false for a 8bpp sprite. + * @param control_flags Control flags, see SpriteCacheCtrlFlags. * @return Bit mask of the zoom levels successfully loaded or 0 if no sprite could be loaded. */ - virtual uint8 LoadSprite(SpriteLoader::Sprite *sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp) = 0; + virtual uint8 LoadSprite(SpriteLoader::Sprite *sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, byte control_flags) = 0; virtual ~SpriteLoader() { } }; From a4e00c5cb596038096dcd8c72e61d67fe0818f7f Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Wed, 21 Sep 2022 04:38:03 -0600 Subject: [PATCH 08/11] Fix #9989: Zero Net Profit is neither negative nor positive (#9991) --- src/company_gui.cpp | 6 ++++-- src/lang/english.txt | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/company_gui.cpp b/src/company_gui.cpp index 8e0f1e8774..6cafcb9e1a 100644 --- a/src/company_gui.cpp +++ b/src/company_gui.cpp @@ -214,9 +214,11 @@ static void DrawCategories(const Rect &r) static void DrawPrice(Money amount, int left, int right, int top, TextColour colour) { StringID str = STR_FINANCES_NEGATIVE_INCOME; - if (amount < 0) { + if (amount == 0) { + str = STR_FINANCES_ZERO_INCOME; + } else if (amount < 0) { amount = -amount; - str++; + str = STR_FINANCES_POSITIVE_INCOME; } SetDParam(0, amount); DrawString(left, right, top, str, colour, SA_RIGHT); diff --git a/src/lang/english.txt b/src/lang/english.txt index 9dc7974c07..07e0c5a615 100644 --- a/src/lang/english.txt +++ b/src/lang/english.txt @@ -3641,6 +3641,7 @@ STR_FINANCES_SECTION_LOAN_INTEREST :{GOLD}Loan Inte STR_FINANCES_SECTION_OTHER :{GOLD}Other STR_FINANCES_NEGATIVE_INCOME :-{CURRENCY_LONG} +STR_FINANCES_ZERO_INCOME :{CURRENCY_LONG} STR_FINANCES_POSITIVE_INCOME :+{CURRENCY_LONG} STR_FINANCES_NET_PROFIT :{WHITE}Net Profit STR_FINANCES_BANK_BALANCE_TITLE :{WHITE}Bank Balance From 6d84b1e1089e39434576eceff880d09f92a504b2 Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Mon, 12 Sep 2022 09:42:55 -0600 Subject: [PATCH 09/11] Fix ca19a0d: Send the proper network command when loading favorite face --- src/company_cmd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp index 2e24b01cb2..83958f037a 100644 --- a/src/company_cmd.cpp +++ b/src/company_cmd.cpp @@ -847,7 +847,7 @@ CommandCost CmdCompanyCtrl(DoCommandFlag flags, CompanyCtrlAction cca, CompanyID /* In network games, we need to try setting the company manager face here to sync it to all clients. * If a favorite company manager face is selected, choose it. Otherwise, use a random face. */ - if (_company_manager_face != 0) Command::Post(_company_manager_face); + if (_company_manager_face != 0) Command::SendNet(STR_NULL, c->index, _company_manager_face); /* Now that we have a new company, broadcast our company settings to * all clients so everything is in sync */ From 07443969f9d071c1a7b3bc8599e7f638ec77db70 Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Mon, 12 Sep 2022 09:49:23 -0600 Subject: [PATCH 10/11] Fix ca19a0d: Network hosts also use favorite face --- src/company_cmd.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/company_cmd.cpp b/src/company_cmd.cpp index 83958f037a..229cd8f46e 100644 --- a/src/company_cmd.cpp +++ b/src/company_cmd.cpp @@ -564,8 +564,8 @@ Company *DoStartupNewCompany(bool is_ai, CompanyID company = INVALID_COMPANY) c->inaugurated_year = _cur_year; /* If starting a player company in singleplayer and a favorite company manager face is selected, choose it. Otherwise, use a random face. - * In a network game, we'll choose the favorite face later in CmdCompanyCtrl to sync it to all clients. */ - if (_company_manager_face != 0 && !is_ai && !_networking) { + * In a network game, we'll choose the favorite face later in CmdCompanyCtrl to sync it to all clients, but we choose it here for the first (host) company. */ + if (_company_manager_face != 0 && !is_ai) { c->face = _company_manager_face; } else { RandomCompanyManagerFaceBits(c->face, (GenderEthnicity)Random(), false, false); From 164ec3ac07c514cdce692554f6339ce1f05d8869 Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Wed, 21 Sep 2022 04:39:56 -0600 Subject: [PATCH 11/11] Fix: Disable "turn around" button for other companies' road vehicles (#10033) --- src/vehicle_gui.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 2fe403391b..e4fc8aa554 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -2795,6 +2795,9 @@ public: if (v->type == VEH_TRAIN) { this->SetWidgetLoweredState(WID_VV_FORCE_PROCEED, Train::From(v)->force_proceed == TFP_SIGNAL); this->SetWidgetDisabledState(WID_VV_FORCE_PROCEED, !is_localcompany); + } + + if (v->type == VEH_TRAIN || v->type == VEH_ROAD) { this->SetWidgetDisabledState(WID_VV_TURN_AROUND, !is_localcompany); }