From a83cd9b4f5067f49b0f28d3ba90d4d28a3e2c4d7 Mon Sep 17 00:00:00 2001 From: translators Date: Mon, 7 Feb 2022 18:48:47 +0000 Subject: [PATCH 01/11] Update: Translations from eints turkish: 1 change by AlphenLLC --- src/lang/turkish.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt index c535e3bf52..b6ad0bdab3 100644 --- a/src/lang/turkish.txt +++ b/src/lang/turkish.txt @@ -2662,7 +2662,7 @@ STR_WAYPOINT_GRAPHICS_TOOLTIP :{BLACK}Yerimi t # Rail station construction window STR_STATION_BUILD_RAIL_CAPTION :{WHITE}Tren istasyonu Seçimi STR_STATION_BUILD_ORIENTATION :{BLACK}Yön -STR_STATION_BUILD_RAILROAD_ORIENTATION_TOOLTIP :{BLACK}Tren istasyonu yönünü seç +STR_STATION_BUILD_RAILROAD_ORIENTATION_TOOLTIP :{BLACK}Tren istasyonunun yönünü seç STR_STATION_BUILD_NUMBER_OF_TRACKS :{BLACK}Ray sayısı STR_STATION_BUILD_NUMBER_OF_TRACKS_TOOLTIP :{BLACK}Tren istasyonu için peron sayısı seç STR_STATION_BUILD_PLATFORM_LENGTH :{BLACK}Platform uzunluğu From 8028794bee7332746781f01cbe709f81cd89a1a6 Mon Sep 17 00:00:00 2001 From: frosch Date: Tue, 8 Feb 2022 23:08:03 +0100 Subject: [PATCH 02/11] Fix #9811, 9156d7b: Use the NewGRF-defined vehicle center when dragging ships and aircraft. (#9812) The alignment using the total-width of the vehicle-chain was meant for articulated trains and road vehicles only. --- src/vehicle_gui.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 5ca65ea641..70ac8ca86e 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -3186,6 +3186,7 @@ void SetMouseCursorVehicle(const Vehicle *v, EngineImageType image_type) int total_width = 0; int y_offset = 0; bool rotor_seq = false; // Whether to draw the rotor of the vehicle in this step. + bool is_ground_vehicle = v->IsGroundVehicle(); while (v != nullptr) { if (total_width >= ScaleGUITrad(2 * (int)VEHICLEINFO_FULL_VEHICLE_WIDTH)) break; @@ -3221,10 +3222,13 @@ void SetMouseCursorVehicle(const Vehicle *v, EngineImageType image_type) } } - int offs = (ScaleGUITrad(VEHICLEINFO_FULL_VEHICLE_WIDTH) - total_width) / 2; - if (rtl) offs = -offs; - for (uint i = 0; i < _cursor.sprite_count; ++i) { - _cursor.sprite_pos[i].x += offs; + if (is_ground_vehicle) { + /* Center trains and road vehicles on the front vehicle */ + int offs = (ScaleGUITrad(VEHICLEINFO_FULL_VEHICLE_WIDTH) - total_width) / 2; + if (rtl) offs = -offs; + for (uint i = 0; i < _cursor.sprite_count; ++i) { + _cursor.sprite_pos[i].x += offs; + } } UpdateCursorSize(); From 81adc381765d8a235be44fc067d2f9a4114e3b65 Mon Sep 17 00:00:00 2001 From: translators Date: Wed, 9 Feb 2022 18:49:48 +0000 Subject: [PATCH 03/11] Update: Translations from eints japanese: 9 changes by Azusa257 --- src/lang/japanese.txt | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/lang/japanese.txt b/src/lang/japanese.txt index 3946ef3895..a32a7eda19 100644 --- a/src/lang/japanese.txt +++ b/src/lang/japanese.txt @@ -327,7 +327,7 @@ STR_GROUP_BY_SHARED_ORDERS :共有注文 # Order button in shared orders vehicle list STR_GOTO_ORDER_VIEW :{BLACK}指令 -STR_GOTO_ORDER_VIEW_TOOLTIP :{BLACK}指令表示を開けます +STR_GOTO_ORDER_VIEW_TOOLTIP :{BLACK}指令表示を開く # Tooltips for the main toolbar ###length 31 @@ -425,7 +425,7 @@ STR_MAP_MENU_SIGN_LIST :標識リスト # Town menu ###length 2 STR_TOWN_MENU_TOWN_DIRECTORY :街一覧 -STR_TOWN_MENU_FOUND_TOWN :街新設に出資 +STR_TOWN_MENU_FOUND_TOWN :街の新設に出資 # Subsidies menu ###length 1 @@ -494,7 +494,7 @@ STR_ABOUT_MENU_LAND_BLOCK_INFO :地域情報 STR_ABOUT_MENU_SEPARATOR :――――――――――――――――― STR_ABOUT_MENU_TOGGLE_CONSOLE :コンソールの表示切替 STR_ABOUT_MENU_AI_DEBUG :AI/ゲームスクリプトのデバッグ -STR_ABOUT_MENU_SCREENSHOT :スクリーンショット撮影(現在のズーム) +STR_ABOUT_MENU_SCREENSHOT :スクリーンショット STR_ABOUT_MENU_SHOW_FRAMERATE :フレームレートを表示 STR_ABOUT_MENU_ABOUT_OPENTTD :OpenTTDについて STR_ABOUT_MENU_SPRITE_ALIGNER :スプライトを整列 @@ -1743,6 +1743,8 @@ STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER_HELPTEXT :他社の新し STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS :事故/災害: {STRING} STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS_HELPTEXT :事故や災害が発生したときにニュースを表示するかを設定します +STR_CONFIG_SETTING_NEWS_ACCIDENT_OTHER :競合他社の事故: {STRING} +STR_CONFIG_SETTING_NEWS_ACCIDENT_OTHER_HELPTEXT :競合他社で起きた事故についてニュースを表示 STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION :会社情報: {STRING} STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION_HELPTEXT :新会社の設立や社の経営危機などのニュースを表示するかを設定します @@ -2040,8 +2042,8 @@ STR_CONFIG_ERROR_DUPLICATE_GRFID :{WHITE}'{1:STRI STR_CONFIG_ERROR_INVALID_GRF :{WHITE}{1:STRING}為、NewGRF '{0:STRING}'は読み込まれませんでした STR_CONFIG_ERROR_INVALID_GRF_NOT_FOUND :ファイルが見つからない STR_CONFIG_ERROR_INVALID_GRF_UNSAFE :安定版ではない -STR_CONFIG_ERROR_INVALID_GRF_SYSTEM :システムNewGRFの -STR_CONFIG_ERROR_INVALID_GRF_INCOMPATIBLE :このバージョンのOpenTTDとは互換性がない +STR_CONFIG_ERROR_INVALID_GRF_SYSTEM :システムNewGRF +STR_CONFIG_ERROR_INVALID_GRF_INCOMPATIBLE :このバージョンのOpenTTDとは互換性がありません STR_CONFIG_ERROR_INVALID_GRF_UNKNOWN :未知の理由の STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_LEVEL :{WHITE}'{STRING}'の圧縮レベルが不正です STR_CONFIG_ERROR_INVALID_SAVEGAME_COMPRESSION_ALGORITHM :{WHITE}データ形式'{STRING}'には対応していません。'{STRING}'に戻ります @@ -2675,6 +2677,7 @@ STR_STATION_CLASS_WAYP :中継駅 # Signal window STR_BUILD_SIGNAL_CAPTION :{WHITE}信号種類の選択 +STR_BUILD_SIGNAL_TOGGLE_ADVANCED_SIGNAL_TOOLTIP :{BLACK}高度な信号の表示切替 STR_BUILD_SIGNAL_SEMAPHORE_NORM_TOOLTIP :{BLACK}閉塞信号 (腕木式){}最も一般的な信号で、1つの閉塞内(信号同士の間の区間)には1編成のみが進入できます。配置した信号をクリックすると信号の向きを「一方向→一方向(逆)→二方向」の順で変えられます。一方向式の信号は背面から通過できません STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TOOLTIP :{BLACK}入口信号 (腕木式){}この信号の先にある出口信号のうち最低でも1つが緑であれば緑になりますが、そうでなければ赤になります。場内信号に良く使われます STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP :{BLACK}出口信号 (腕木式){}動作は普通の閉塞信号と同様ですが、入口/コンボ信号を使用する場合に必要になります。ホームの入り口に良く使われます @@ -2683,7 +2686,7 @@ STR_BUILD_SIGNAL_SEMAPHORE_PBS_TOOLTIP :{BLACK}パス STR_BUILD_SIGNAL_SEMAPHORE_PBS_OWAY_TOOLTIP :{BLACK}一方通行パス信号 (腕木式){}パス信号では、互いに衝突しない経路が確保できる場合には1つの閉塞内に複数の列車が入ることを許容します。このタイプのパス信号は信号の背面から通過することはできません STR_BUILD_SIGNAL_ELECTRIC_NORM_TOOLTIP :{BLACK}閉塞信号 (色灯式){}最も一般的な信号で、1つの閉塞内(信号同士の間の区間)には1編成のみが進入できます。配置した信号をクリックすると信号の向きを「一方向→一方向(逆)→二方向」の順で変えられます。一方向式の信号は背面から通過できません STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TOOLTIP :{BLACK}入口信号 (色灯式){}この信号の先にある出口信号のうち最低でも1つが緑であれば緑になりますが、そうでなければ赤になります。場内信号に良く使われます -STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}出口信号 (色灯式){}動作は普通の閉塞信号と同様ですが、入口/コンボ信号を使用する場合に必要になります。ホームの入り口に良く使われます +STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}出口信号 (色灯式){}動作は普通の閉塞信号と同様ですが、入口/コンボ信号を使用する場合に必要になります。ホームの入り口に良く使われます。 STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}コンボ信号 (色灯式){}コンボ信号は入口信号と出口信号の機能を併せ持つ信号です。この信号を使うと多数の分岐のあるような場内信号網を作ることができます STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP :{BLACK}パス信号 (色灯式){}パス信号では、互いに衝突しない経路が確保できる場合には1つの閉塞内に複数の列車が入ることを許容します。汎用性は高いですが、一方向式しか使えず信号の背面から進行してくる列車を防護できません。この信号で列車が停車中に正面から対向列車が来ると問答無用で衝突事故を起こします! STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP :{BLACK}一方通行パス信号 (色灯式){}パス信号では、互いに衝突しない経路が確保できる場合には1つの閉塞内に複数の列車が入ることを許容します。このタイプのパス信号は信号の背面から通過することはできません From 41c40f130b907e73475f41706510a54a519b78e4 Mon Sep 17 00:00:00 2001 From: Niels Martin Hansen Date: Tue, 25 Jan 2022 21:18:17 +0100 Subject: [PATCH 04/11] Fix: Original music playback rate was slightly too fast Found a new tempo value experimentally. The new value gives a timing error of less than 0.01 second per minute. --- src/music/midifile.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/music/midifile.cpp b/src/music/midifile.cpp index 4240f4d8df..8f12aae1e3 100644 --- a/src/music/midifile.cpp +++ b/src/music/midifile.cpp @@ -525,8 +525,8 @@ struct MpsMachine { Channel channels[16]; ///< playback status for each MIDI channel std::vector segments; ///< pointers into songdata to repeatable data segments int16 tempo_ticks; ///< ticker that increments when playing a frame, decrements before playing a frame - int16 current_tempo; ///< threshold for actually playing a frame - int16 initial_tempo; ///< starting tempo of song + int16 current_tempo; ///< threshold for actually playing a frame + int16 initial_tempo; ///< starting tempo of song bool shouldplayflag; ///< not-end-of-song flag static const int TEMPO_RATE; @@ -787,10 +787,11 @@ struct MpsMachine { bool PlayInto() { /* Tempo seems to be handled as TEMPO_RATE = 148 ticks per second. - * Use this as the tickdiv, and define the tempo to be one second (1M microseconds) per tickdiv. + * Use this as the tickdiv, and define the tempo to be somewhat less than one second (1M microseconds) per quarter note. + * This value was found experimentally to give a very close approximation of the correct playback speed. * MIDI software loading exported files will show a bogus tempo, but playback will be correct. */ this->target.tickdiv = TEMPO_RATE; - this->target.tempos.push_back(MidiFile::TempoChange(0, 1000000)); + this->target.tempos.push_back(MidiFile::TempoChange(0, 980500)); /* Initialize playback simulation */ this->RestartSong(); From e68bf58989c2923af2d0391aac65bbee7cee8656 Mon Sep 17 00:00:00 2001 From: Niels Martin Hansen Date: Sat, 12 Feb 2022 19:28:34 +0100 Subject: [PATCH 05/11] Codechange: Use anonymous union for vehicle orders/old orders list --- src/autoreplace_cmd.cpp | 2 +- src/economy.cpp | 2 +- src/linkgraph/refresh.cpp | 24 +++++++------- src/order_backup.cpp | 2 +- src/order_cmd.cpp | 54 +++++++++++++++---------------- src/saveload/afterload.cpp | 6 ++-- src/saveload/oldloader_sl.cpp | 2 +- src/saveload/vehicle_sl.cpp | 18 +++++------ src/script/api/script_order.cpp | 2 +- src/script/api/script_vehicle.cpp | 2 +- src/timetable_cmd.cpp | 18 +++++------ src/timetable_gui.cpp | 16 ++++----- src/train_cmd.cpp | 4 +-- src/vehicle.cpp | 14 ++++---- src/vehicle_base.h | 24 +++++++------- src/vehicle_cmd.cpp | 6 ++-- src/vehicle_gui.cpp | 2 +- 17 files changed, 99 insertions(+), 99 deletions(-) diff --git a/src/autoreplace_cmd.cpp b/src/autoreplace_cmd.cpp index 5bdf8d0e59..eba804788e 100644 --- a/src/autoreplace_cmd.cpp +++ b/src/autoreplace_cmd.cpp @@ -211,7 +211,7 @@ static int GetIncompatibleRefitOrderIdForAutoreplace(const Vehicle *v, EngineID const Order *o; const Vehicle *u = (v->type == VEH_TRAIN) ? v->First() : v; - const OrderList *orders = u->orders.list; + const OrderList *orders = u->orders; if (orders == nullptr) return -1; for (VehicleOrderID i = 0; i < orders->GetNumOrders(); i++) { o = orders->GetOrderAt(i); diff --git a/src/economy.cpp b/src/economy.cpp index f2e70f34f2..e915653efd 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -1268,7 +1268,7 @@ void PrepareUnload(Vehicle *front_v) front_v->cargo_payment = new CargoPayment(front_v); StationIDStack next_station = front_v->GetNextStoppingStation(); - if (front_v->orders.list == nullptr || (front_v->current_order.GetUnloadType() & OUFB_NO_UNLOAD) == 0) { + if (front_v->orders == nullptr || (front_v->current_order.GetUnloadType() & OUFB_NO_UNLOAD) == 0) { Station *st = Station::Get(front_v->last_station_visited); for (Vehicle *v = front_v; v != nullptr; v = v->Next()) { const GoodsEntry *ge = &st->goods[v->cargo_type]; diff --git a/src/linkgraph/refresh.cpp b/src/linkgraph/refresh.cpp index 78fdd1643e..2665f92a9f 100644 --- a/src/linkgraph/refresh.cpp +++ b/src/linkgraph/refresh.cpp @@ -26,10 +26,10 @@ /* static */ void LinkRefresher::Run(Vehicle *v, bool allow_merge, bool is_full_loading) { /* If there are no orders we can't predict anything.*/ - if (v->orders.list == nullptr) return; + if (v->orders == nullptr) return; /* Make sure the first order is a useful order. */ - const Order *first = v->orders.list->GetNextDecisionNode(v->GetOrder(v->cur_implicit_order_index), 0); + const Order *first = v->orders->GetNextDecisionNode(v->GetOrder(v->cur_implicit_order_index), 0); if (first == nullptr) return; HopSet seen_hops; @@ -173,9 +173,9 @@ const Order *LinkRefresher::PredictNextOrder(const Order *cur, const Order *next SetBit(flags, USE_NEXT); if (next->IsType(OT_CONDITIONAL)) { - const Order *skip_to = this->vehicle->orders.list->GetNextDecisionNode( - this->vehicle->orders.list->GetOrderAt(next->GetConditionSkipToOrder()), num_hops); - if (skip_to != nullptr && num_hops < this->vehicle->orders.list->GetNumOrders()) { + const Order *skip_to = this->vehicle->orders->GetNextDecisionNode( + this->vehicle->orders->GetOrderAt(next->GetConditionSkipToOrder()), num_hops); + if (skip_to != nullptr && num_hops < this->vehicle->orders->GetNumOrders()) { /* Make copies of capacity tracking lists. There is potential * for optimization here: If the vehicle never refits we don't * need to copy anything. Also, if we've seen the branched link @@ -187,8 +187,8 @@ const Order *LinkRefresher::PredictNextOrder(const Order *cur, const Order *next /* Reassign next with the following stop. This can be a station or a * depot.*/ - next = this->vehicle->orders.list->GetNextDecisionNode( - this->vehicle->orders.list->GetNext(next), num_hops++); + next = this->vehicle->orders->GetNextDecisionNode( + this->vehicle->orders->GetNext(next), num_hops++); } return next; } @@ -230,16 +230,16 @@ void LinkRefresher::RefreshStats(const Order *cur, const Order *next) * loading. Don't do that if the vehicle has been waiting for longer than the entire * order list is supposed to take, though. If that is the case the total duration is * probably far off and we'd greatly overestimate the capacity by increasing.*/ - if (this->is_full_loading && this->vehicle->orders.list != nullptr && + if (this->is_full_loading && this->vehicle->orders != nullptr && st->index == vehicle->last_station_visited && - this->vehicle->orders.list->GetTotalDuration() > + this->vehicle->orders->GetTotalDuration() > (Ticks)this->vehicle->current_order_time) { uint effective_capacity = cargo_quantity * this->vehicle->load_unload_ticks; - if (effective_capacity > (uint)this->vehicle->orders.list->GetTotalDuration()) { + if (effective_capacity > (uint)this->vehicle->orders->GetTotalDuration()) { IncreaseStats(st, c, next_station, effective_capacity / - this->vehicle->orders.list->GetTotalDuration(), 0, 0, + this->vehicle->orders->GetTotalDuration(), 0, 0, EUM_INCREASE | restricted_mode); - } else if (RandomRange(this->vehicle->orders.list->GetTotalDuration()) < effective_capacity) { + } else if (RandomRange(this->vehicle->orders->GetTotalDuration()) < effective_capacity) { IncreaseStats(st, c, next_station, 1, 0, 0, EUM_INCREASE | restricted_mode); } else { IncreaseStats(st, c, next_station, cargo_quantity, 0, time_estimate, EUM_REFRESH | restricted_mode); diff --git a/src/order_backup.cpp b/src/order_backup.cpp index 4e21130c2a..be4d7180ca 100644 --- a/src/order_backup.cpp +++ b/src/order_backup.cpp @@ -77,7 +77,7 @@ void OrderBackup::DoRestore(Vehicle *v) if (this->clone != nullptr) { Command::Do(DC_EXEC, CO_SHARE, v->index, this->clone->index); } else if (this->orders != nullptr && OrderList::CanAllocateItem()) { - v->orders.list = new OrderList(this->orders, v); + v->orders = new OrderList(this->orders, v); this->orders = nullptr; /* Make sure buoys/oil rigs are updated in the station list. */ InvalidateWindowClassesData(WC_STATION_LIST, 0); diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp index 9c6b1a3fcd..42cad82ad3 100644 --- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -637,7 +637,7 @@ void OrderList::DebugCheckSanity() const for (const Vehicle *v = this->first_shared; v != nullptr; v = v->NextShared()) { ++check_num_vehicles; - assert(v->orders.list == this); + assert(v->orders == this); } assert(this->num_vehicles == check_num_vehicles); Debug(misc, 6, "... detected {} orders ({} manual), {} vehicles, {} timetabled, {} total", @@ -715,7 +715,7 @@ uint GetOrderDistance(const Order *prev, const Order *cur, const Vehicle *v, int conditional_depth++; int dist1 = GetOrderDistance(prev, v->GetOrder(cur->GetConditionSkipToOrder()), v, conditional_depth); - int dist2 = GetOrderDistance(prev, cur->next == nullptr ? v->orders.list->GetFirstOrder() : cur->next, v, conditional_depth); + int dist2 = GetOrderDistance(prev, cur->next == nullptr ? v->orders->GetFirstOrder() : cur->next, v, conditional_depth); return std::max(dist1, dist2); } @@ -906,7 +906,7 @@ CommandCost CmdInsertOrder(DoCommandFlag flags, VehicleID veh, VehicleOrderID se if (v->GetNumOrders() >= MAX_VEH_ORDER_ID) return_cmd_error(STR_ERROR_TOO_MANY_ORDERS); if (!Order::CanAllocateItem()) return_cmd_error(STR_ERROR_NO_MORE_SPACE_FOR_ORDERS); - if (v->orders.list == nullptr && !OrderList::CanAllocateItem()) return_cmd_error(STR_ERROR_NO_MORE_SPACE_FOR_ORDERS); + if (v->orders == nullptr && !OrderList::CanAllocateItem()) return_cmd_error(STR_ERROR_NO_MORE_SPACE_FOR_ORDERS); if (flags & DC_EXEC) { Order *new_o = new Order(); @@ -926,16 +926,16 @@ CommandCost CmdInsertOrder(DoCommandFlag flags, VehicleID veh, VehicleOrderID se void InsertOrder(Vehicle *v, Order *new_o, VehicleOrderID sel_ord) { /* Create new order and link in list */ - if (v->orders.list == nullptr) { - v->orders.list = new OrderList(new_o, v); + if (v->orders == nullptr) { + v->orders = new OrderList(new_o, v); } else { - v->orders.list->InsertOrderAt(new_o, sel_ord); + v->orders->InsertOrderAt(new_o, sel_ord); } Vehicle *u = v->FirstShared(); DeleteOrderWarnings(u); for (; u != nullptr; u = u->NextShared()) { - assert(v->orders.list == u->orders.list); + assert(v->orders == u->orders); /* If there is added an order before the current one, we need * to update the selected order. We do not change implicit/real order indices though. @@ -1047,12 +1047,12 @@ static void CancelLoadingDueToDeletedOrder(Vehicle *v) */ void DeleteOrder(Vehicle *v, VehicleOrderID sel_ord) { - v->orders.list->DeleteOrderAt(sel_ord); + v->orders->DeleteOrderAt(sel_ord); Vehicle *u = v->FirstShared(); DeleteOrderWarnings(u); for (; u != nullptr; u = u->NextShared()) { - assert(v->orders.list == u->orders.list); + assert(v->orders == u->orders); if (sel_ord == u->cur_real_order_index && u->current_order.IsType(OT_LOADING)) { CancelLoadingDueToDeletedOrder(u); @@ -1159,7 +1159,7 @@ CommandCost CmdMoveOrder(DoCommandFlag flags, VehicleID veh, VehicleOrderID movi if (moving_one == nullptr) return CMD_ERROR; if (flags & DC_EXEC) { - v->orders.list->MoveOrder(moving_order, target_order); + v->orders->MoveOrder(moving_order, target_order); /* Update shared list */ Vehicle *u = v->FirstShared(); @@ -1199,7 +1199,7 @@ CommandCost CmdMoveOrder(DoCommandFlag flags, VehicleID veh, VehicleOrderID movi u->cur_implicit_order_index++; } - assert(v->orders.list == u->orders.list); + assert(v->orders == u->orders); /* Update any possible open window of the vehicle */ InvalidateVehicleOrder(u, moving_order | (target_order << 8)); } @@ -1541,7 +1541,7 @@ CommandCost CmdCloneOrder(DoCommandFlag flags, CloneOptions action, VehicleID ve return_cmd_error(STR_ERROR_AIRCRAFT_NOT_ENOUGH_RANGE); } - if (src->orders.list == nullptr && !OrderList::CanAllocateItem()) { + if (src->orders == nullptr && !OrderList::CanAllocateItem()) { return_cmd_error(STR_ERROR_NO_MORE_SPACE_FOR_ORDERS); } @@ -1551,7 +1551,7 @@ CommandCost CmdCloneOrder(DoCommandFlag flags, CloneOptions action, VehicleID ve * (We mainly do this to keep the order indices valid and in range.) */ DeleteVehicleOrders(dst, false, dst->GetNumOrders() != src->GetNumOrders()); - dst->orders.list = src->orders.list; + dst->orders = src->orders; /* Link this vehicle in the shared-list */ dst->AddToShared(src); @@ -1607,14 +1607,14 @@ CommandCost CmdCloneOrder(DoCommandFlag flags, CloneOptions action, VehicleID ve (*order_dst)->AssignOrder(*order); order_dst = &(*order_dst)->next; } - if (dst->orders.list == nullptr) { - dst->orders.list = new OrderList(first, dst); + if (dst->orders == nullptr) { + dst->orders = new OrderList(first, dst); } else { - assert(dst->orders.list->GetFirstOrder() == nullptr); - assert(!dst->orders.list->IsShared()); - delete dst->orders.list; + assert(dst->orders->GetFirstOrder() == nullptr); + assert(!dst->orders->IsShared()); + delete dst->orders; assert(OrderList::CanAllocateItem()); - dst->orders.list = new OrderList(first, dst); + dst->orders = new OrderList(first, dst); } InvalidateVehicleOrder(dst, VIWD_REMOVE_ALL_ORDERS); @@ -1734,7 +1734,7 @@ void CheckOrders(const Vehicle *v) if (v->GetNumOrders() > 1) { const Order *last = v->GetLastOrder(); - if (v->orders.list->GetFirstOrder()->Equals(*last)) { + if (v->orders->GetFirstOrder()->Equals(*last)) { message = STR_NEWS_VEHICLE_HAS_DUPLICATE_ENTRY; } } @@ -1743,7 +1743,7 @@ void CheckOrders(const Vehicle *v) if (n_st < 2 && message == INVALID_STRING_ID) message = STR_NEWS_VEHICLE_HAS_TOO_FEW_ORDERS; #ifdef WITH_ASSERT - if (v->orders.list != nullptr) v->orders.list->DebugCheckSanity(); + if (v->orders != nullptr) v->orders->DebugCheckSanity(); #endif /* We don't have a problem */ @@ -1801,9 +1801,9 @@ restart: } /* Clear wait time */ - v->orders.list->UpdateTotalDuration(-order->GetWaitTime()); + v->orders->UpdateTotalDuration(-order->GetWaitTime()); if (order->IsWaitTimetabled()) { - v->orders.list->UpdateTimetableDuration(-order->GetTimetabledWait()); + v->orders->UpdateTimetableDuration(-order->GetTimetabledWait()); order->SetWaitTimetabled(false); } order->SetWaitTime(0); @@ -1854,11 +1854,11 @@ void DeleteVehicleOrders(Vehicle *v, bool keep_orderlist, bool reset_order_indic if (v->IsOrderListShared()) { /* Remove ourself from the shared order list. */ v->RemoveFromShared(); - v->orders.list = nullptr; - } else if (v->orders.list != nullptr) { + v->orders = nullptr; + } else if (v->orders != nullptr) { /* Remove the orders */ - v->orders.list->FreeChain(keep_orderlist); - if (!keep_orderlist) v->orders.list = nullptr; + v->orders->FreeChain(keep_orderlist); + if (!keep_orderlist) v->orders = nullptr; } if (reset_order_indices) { diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index bc8ffd2474..ce26c1f5b2 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -1720,9 +1720,9 @@ bool AfterLoadGame() for (Order *order : Order::Iterate()) order->ConvertFromOldSavegame(); for (Vehicle *v : Vehicle::Iterate()) { - if (v->orders.list != nullptr && v->orders.list->GetFirstOrder() != nullptr && v->orders.list->GetFirstOrder()->IsType(OT_NOTHING)) { - v->orders.list->FreeChain(); - v->orders.list = nullptr; + if (v->orders != nullptr && v->orders->GetFirstOrder() != nullptr && v->orders->GetFirstOrder()->IsType(OT_NOTHING)) { + v->orders->FreeChain(); + v->orders = nullptr; } v->current_order.ConvertFromOldSavegame(); diff --git a/src/saveload/oldloader_sl.cpp b/src/saveload/oldloader_sl.cpp index cfcc6bd37f..bab302dc8d 100644 --- a/src/saveload/oldloader_sl.cpp +++ b/src/saveload/oldloader_sl.cpp @@ -1335,7 +1335,7 @@ bool LoadOldVehicle(LoadgameState *ls, int num) if (_old_order_ptr != 0 && _old_order_ptr != 0xFFFFFFFF) { uint max = _savegame_type == SGT_TTO ? 3000 : 5000; uint old_id = RemapOrderIndex(_old_order_ptr); - if (old_id < max) v->orders.old = Order::Get(old_id); // don't accept orders > max number of orders + if (old_id < max) v->old_orders = Order::Get(old_id); // don't accept orders > max number of orders } v->current_order.AssignOrder(UnpackOldOrder(_old_order)); diff --git a/src/saveload/vehicle_sl.cpp b/src/saveload/vehicle_sl.cpp index 85df6efcec..178275f54a 100644 --- a/src/saveload/vehicle_sl.cpp +++ b/src/saveload/vehicle_sl.cpp @@ -263,26 +263,26 @@ void AfterLoadVehicles(bool part_of_load) std::map mapping; for (Vehicle *v : Vehicle::Iterate()) { - if (v->orders.old != nullptr) { + if (v->old_orders != nullptr) { if (IsSavegameVersionBefore(SLV_105)) { // Pre-105 didn't save an OrderList - if (mapping[v->orders.old] == nullptr) { + if (mapping[v->old_orders] == nullptr) { /* This adds the whole shared vehicle chain for case b */ /* Creating an OrderList here is safe because the number of vehicles * allowed in these savegames matches the number of OrderLists. As * such each vehicle can get an OrderList and it will (still) fit. */ assert(OrderList::CanAllocateItem()); - v->orders.list = mapping[v->orders.old] = new OrderList(v->orders.old, v); + v->orders = mapping[v->old_orders] = new OrderList(v->old_orders, v); } else { - v->orders.list = mapping[v->orders.old]; + v->orders = mapping[v->old_orders]; /* For old games (case a) we must create the shared vehicle chain */ if (IsSavegameVersionBefore(SLV_5, 2)) { - v->AddToShared(v->orders.list->GetFirstSharedVehicle()); + v->AddToShared(v->orders->GetFirstSharedVehicle()); } } } else { // OrderList was saved as such, only recalculate not saved values if (v->PreviousShared() == nullptr) { - v->orders.list->Initialize(v->orders.list->first, v); + v->orders->Initialize(v->orders->first, v); } } } @@ -302,13 +302,13 @@ void AfterLoadVehicles(bool part_of_load) if (IsSavegameVersionBefore(SLV_105)) { /* Before 105 there was no order for shared orders, thus it messed up horribly */ for (Vehicle *v : Vehicle::Iterate()) { - if (v->First() != v || v->orders.list != nullptr || v->previous_shared != nullptr || v->next_shared == nullptr) continue; + if (v->First() != v || v->orders != nullptr || v->previous_shared != nullptr || v->next_shared == nullptr) continue; /* As above, allocating OrderList here is safe. */ assert(OrderList::CanAllocateItem()); - v->orders.list = new OrderList(nullptr, v); + v->orders = new OrderList(nullptr, v); for (Vehicle *u = v; u != nullptr; u = u->next_shared) { - u->orders.list = v->orders.list; + u->orders = v->orders; } } } diff --git a/src/script/api/script_order.cpp b/src/script/api/script_order.cpp index e2ee1e6085..c127d11e3c 100644 --- a/src/script/api/script_order.cpp +++ b/src/script/api/script_order.cpp @@ -91,7 +91,7 @@ static int ScriptOrderPositionToRealOrderPosition(VehicleID vehicle_id, ScriptOr assert(ScriptOrder::IsValidVehicleOrder(vehicle_id, order_position)); int res = (int)order_position; - const Order *order = v->orders.list->GetFirstOrder(); + const Order *order = v->orders->GetFirstOrder(); for (; order->GetType() == OT_IMPLICIT; order = order->next) res++; while (order_position > 0) { order_position = (ScriptOrder::OrderPosition)(order_position - 1); diff --git a/src/script/api/script_vehicle.cpp b/src/script/api/script_vehicle.cpp index b7b5fd9503..82db2dfce8 100644 --- a/src/script/api/script_vehicle.cpp +++ b/src/script/api/script_vehicle.cpp @@ -454,7 +454,7 @@ if (!IsValidVehicle(vehicle_id)) return false; Vehicle *v = ::Vehicle::Get(vehicle_id); - return v->orders.list != nullptr && v->orders.list->GetNumVehicles() > 1; + return v->orders != nullptr && v->orders->GetNumVehicles() > 1; } /* static */ int ScriptVehicle::GetReliability(VehicleID vehicle_id) diff --git a/src/timetable_cmd.cpp b/src/timetable_cmd.cpp index fa8ecf51e3..b717f8224c 100644 --- a/src/timetable_cmd.cpp +++ b/src/timetable_cmd.cpp @@ -55,8 +55,8 @@ static void ChangeTimetable(Vehicle *v, VehicleOrderID order_number, uint16 val, default: NOT_REACHED(); } - v->orders.list->UpdateTotalDuration(total_delta); - v->orders.list->UpdateTimetableDuration(timetable_delta); + v->orders->UpdateTotalDuration(total_delta); + v->orders->UpdateTimetableDuration(timetable_delta); for (v = v->FirstShared(); v != nullptr; v = v->NextShared()) { if (v->cur_real_order_index == order_number && v->current_order.Equals(*order)) { @@ -182,7 +182,7 @@ CommandCost CmdChangeTimetable(DoCommandFlag flags, VehicleID veh, VehicleOrderI CommandCost CmdSetVehicleOnTime(DoCommandFlag flags, VehicleID veh) { Vehicle *v = Vehicle::GetIfValid(veh); - if (v == nullptr || !v->IsPrimaryVehicle() || v->orders.list == nullptr) return CMD_ERROR; + if (v == nullptr || !v->IsPrimaryVehicle() || v->orders == nullptr) return CMD_ERROR; CommandCost ret = CheckOwnership(v->owner); if (ret.Failed()) return ret; @@ -244,7 +244,7 @@ static bool VehicleTimetableSorter(Vehicle * const &a, Vehicle * const &b) CommandCost CmdSetTimetableStart(DoCommandFlag flags, VehicleID veh_id, bool timetable_all, Date start_date) { Vehicle *v = Vehicle::GetIfValid(veh_id); - if (v == nullptr || !v->IsPrimaryVehicle() || v->orders.list == nullptr) return CMD_ERROR; + if (v == nullptr || !v->IsPrimaryVehicle() || v->orders == nullptr) return CMD_ERROR; CommandCost ret = CheckOwnership(v->owner); if (ret.Failed()) return ret; @@ -253,20 +253,20 @@ CommandCost CmdSetTimetableStart(DoCommandFlag flags, VehicleID veh_id, bool tim if (start_date < 0 || start_date > MAX_DAY) return CMD_ERROR; if (start_date - _date > 15 * DAYS_IN_LEAP_YEAR) return CMD_ERROR; if (_date - start_date > DAYS_IN_LEAP_YEAR) return CMD_ERROR; - if (timetable_all && !v->orders.list->IsCompleteTimetable()) return CMD_ERROR; + if (timetable_all && !v->orders->IsCompleteTimetable()) return CMD_ERROR; if (flags & DC_EXEC) { std::vector vehs; if (timetable_all) { - for (Vehicle *w = v->orders.list->GetFirstSharedVehicle(); w != nullptr; w = w->NextShared()) { + for (Vehicle *w = v->orders->GetFirstSharedVehicle(); w != nullptr; w = w->NextShared()) { vehs.push_back(w); } } else { vehs.push_back(v); } - int total_duration = v->orders.list->GetTimetableTotalDuration(); + int total_duration = v->orders->GetTimetableTotalDuration(); int num_vehs = (uint)vehs.size(); if (num_vehs >= 2) { @@ -304,7 +304,7 @@ CommandCost CmdSetTimetableStart(DoCommandFlag flags, VehicleID veh_id, bool tim CommandCost CmdAutofillTimetable(DoCommandFlag flags, VehicleID veh, bool autofill, bool preserve_wait_time) { Vehicle *v = Vehicle::GetIfValid(veh); - if (v == nullptr || !v->IsPrimaryVehicle() || v->orders.list == nullptr) return CMD_ERROR; + if (v == nullptr || !v->IsPrimaryVehicle() || v->orders == nullptr) return CMD_ERROR; CommandCost ret = CheckOwnership(v->owner); if (ret.Failed()) return ret; @@ -441,7 +441,7 @@ void UpdateVehicleTimetable(Vehicle *v, bool travelling) * length of a full cycle till lateness is less than the length of a timetable * cycle. When the timetable isn't fully filled the cycle will be INVALID_TICKS. */ if (v->lateness_counter > (int)timetabled) { - Ticks cycle = v->orders.list->GetTimetableTotalDuration(); + Ticks cycle = v->orders->GetTimetableTotalDuration(); if (cycle != INVALID_TICKS && v->lateness_counter > cycle) { v->lateness_counter %= cycle; } diff --git a/src/timetable_gui.cpp b/src/timetable_gui.cpp index 9a09bce365..662919829f 100644 --- a/src/timetable_gui.cpp +++ b/src/timetable_gui.cpp @@ -123,7 +123,7 @@ static void FillTimetableArrivalDepartureTable(const Vehicle *v, VehicleOrderID if (i >= v->GetNumOrders()) { i = 0; assert(order == nullptr); - order = v->orders.list->GetFirstOrder(); + order = v->orders->GetFirstOrder(); } } while (i != start); @@ -322,9 +322,9 @@ struct TimetableWindow : Window { this->SetWidgetDisabledState(WID_VT_CLEAR_SPEED, disable_speed); this->SetWidgetDisabledState(WID_VT_SHARED_ORDER_LIST, !v->IsOrderListShared()); - this->SetWidgetDisabledState(WID_VT_START_DATE, v->orders.list == nullptr); - this->SetWidgetDisabledState(WID_VT_RESET_LATENESS, v->orders.list == nullptr); - this->SetWidgetDisabledState(WID_VT_AUTOFILL, v->orders.list == nullptr); + this->SetWidgetDisabledState(WID_VT_START_DATE, v->orders == nullptr); + this->SetWidgetDisabledState(WID_VT_RESET_LATENESS, v->orders == nullptr); + this->SetWidgetDisabledState(WID_VT_AUTOFILL, v->orders == nullptr); } else { this->DisableWidget(WID_VT_START_DATE); this->DisableWidget(WID_VT_CHANGE_TIME); @@ -424,7 +424,7 @@ struct TimetableWindow : Window { * i.e. are only shown if we can calculate all times. * Excluding order lists with only one order makes some things easier. */ - Ticks total_time = v->orders.list != nullptr ? v->orders.list->GetTimetableDurationIncomplete() : 0; + Ticks total_time = v->orders != nullptr ? v->orders->GetTimetableDurationIncomplete() : 0; if (total_time <= 0 || v->GetNumOrders() <= 1 || !HasBit(v->vehicle_flags, VF_TIMETABLE_STARTED)) break; TimetableArrivalDeparture *arr_dep = AllocaM(TimetableArrivalDeparture, v->GetNumOrders()); @@ -475,10 +475,10 @@ struct TimetableWindow : Window { case WID_VT_SUMMARY_PANEL: { int y = r.top + WD_FRAMERECT_TOP; - Ticks total_time = v->orders.list != nullptr ? v->orders.list->GetTimetableDurationIncomplete() : 0; + Ticks total_time = v->orders != nullptr ? v->orders->GetTimetableDurationIncomplete() : 0; if (total_time != 0) { SetTimetableParams(0, 1, total_time); - DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, v->orders.list->IsCompleteTimetable() ? STR_TIMETABLE_TOTAL_TIME : STR_TIMETABLE_TOTAL_TIME_INCOMPLETE); + DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, v->orders->IsCompleteTimetable() ? STR_TIMETABLE_TOTAL_TIME : STR_TIMETABLE_TOTAL_TIME_INCOMPLETE); } y += FONT_HEIGHT_NORMAL; @@ -531,7 +531,7 @@ struct TimetableWindow : Window { } case WID_VT_START_DATE: // Change the date that the timetable starts. - ShowSetDateWindow(this, v->index, _date, _cur_year, _cur_year + 15, ChangeTimetableStartCallback, reinterpret_cast(static_cast(v->orders.list->IsCompleteTimetable() && _ctrl_pressed))); + ShowSetDateWindow(this, v->index, _date, _cur_year, _cur_year + 15, ChangeTimetableStartCallback, reinterpret_cast(static_cast(v->orders->IsCompleteTimetable() && _ctrl_pressed))); break; case WID_VT_CHANGE_TIME: { // "Wait For" button. diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index 2fd081898e..2af665a4a6 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -1382,7 +1382,7 @@ CommandCost CmdSellRailWagon(DoCommandFlag flags, Vehicle *t, bool sell_chain, b return ret; } - if (first->orders.list == nullptr && !OrderList::CanAllocateItem()) { + if (first->orders == nullptr && !OrderList::CanAllocateItem()) { /* Restore the train we had. */ RestoreTrainBackup(original); return_cmd_error(STR_ERROR_NO_MORE_SPACE_FOR_ORDERS); @@ -1399,7 +1399,7 @@ CommandCost CmdSellRailWagon(DoCommandFlag flags, Vehicle *t, bool sell_chain, b if (v == first && v->IsEngine() && !sell_chain && new_head != nullptr && new_head->IsFrontEngine()) { /* We are selling the front engine. In this case we want to * 'give' the order, unit number and such to the new head. */ - new_head->orders.list = first->orders.list; + new_head->orders = first->orders; new_head->AddToShared(first); DeleteVehicleOrders(first); diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 120c4a259f..b2c92d7db3 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -2161,7 +2161,7 @@ void Vehicle::BeginLoading() break; } target_index++; - if (target_index >= this->orders.list->GetNumOrders()) { + if (target_index >= this->orders->GetNumOrders()) { if (this->GetNumManualOrders() == 0 && this->GetNumOrders() < IMPLICIT_ORDER_ONLY_CAP) { break; @@ -2199,7 +2199,7 @@ void Vehicle::BeginLoading() } } } else if (!suppress_implicit_orders && - ((this->orders.list == nullptr ? OrderList::CanAllocateItem() : this->orders.list->GetNumOrders() < MAX_VEH_ORDER_ID)) && + ((this->orders == nullptr ? OrderList::CanAllocateItem() : this->orders->GetNumOrders() < MAX_VEH_ORDER_ID)) && Order::CanAllocateItem()) { /* Insert new implicit order */ Order *implicit_order = new Order(); @@ -2770,10 +2770,10 @@ void Vehicle::AddToShared(Vehicle *shared_chain) { assert(this->previous_shared == nullptr && this->next_shared == nullptr); - if (shared_chain->orders.list == nullptr) { + if (shared_chain->orders == nullptr) { assert(shared_chain->previous_shared == nullptr); assert(shared_chain->next_shared == nullptr); - this->orders.list = shared_chain->orders.list = new OrderList(nullptr, shared_chain); + this->orders = shared_chain->orders = new OrderList(nullptr, shared_chain); } this->next_shared = shared_chain->next_shared; @@ -2783,7 +2783,7 @@ void Vehicle::AddToShared(Vehicle *shared_chain) if (this->next_shared != nullptr) this->next_shared->previous_shared = this; - shared_chain->orders.list->AddVehicle(this); + shared_chain->orders->AddVehicle(this); } /** @@ -2796,7 +2796,7 @@ void Vehicle::RemoveFromShared() bool were_first = (this->FirstShared() == this); VehicleListIdentifier vli(VL_SHARED_ORDERS, this->type, this->owner, this->FirstShared()->index); - this->orders.list->RemoveVehicle(this); + this->orders->RemoveVehicle(this); if (!were_first) { /* We are not the first shared one, so only relink our previous one. */ @@ -2806,7 +2806,7 @@ void Vehicle::RemoveFromShared() if (this->next_shared != nullptr) this->next_shared->previous_shared = this->previous_shared; - if (this->orders.list->GetNumVehicles() == 1) { + if (this->orders->GetNumVehicles() == 1) { /* When there is only one vehicle, remove the shared order list window. */ CloseWindowById(GetWindowClassForVehicleType(this->type), vli.Pack()); InvalidateVehicleOrder(this->FirstShared(), VIWD_MODIFY_ORDERS); diff --git a/src/vehicle_base.h b/src/vehicle_base.h index a5ab42989c..7a19727ff8 100644 --- a/src/vehicle_base.h +++ b/src/vehicle_base.h @@ -332,9 +332,9 @@ public: Order current_order; ///< The current order (+ status, like: loading) union { - OrderList *list; ///< Pointer to the order list for this vehicle - Order *old; ///< Only used during conversion of old save games - } orders; ///< The orders currently assigned to the vehicle. + OrderList *orders; ///< Pointer to the order list for this vehicle + Order *old_orders; ///< Only used during conversion of old save games + }; uint16 load_unload_ticks; ///< Ticks to wait before starting next cycle. GroupID group_id; ///< Index of group Pool array @@ -669,7 +669,7 @@ public: * Get the first order of the vehicles order list. * @return first order of order list. */ - inline Order *GetFirstOrder() const { return (this->orders.list == nullptr) ? nullptr : this->orders.list->GetFirstOrder(); } + inline Order *GetFirstOrder() const { return (this->orders == nullptr) ? nullptr : this->orders->GetFirstOrder(); } void AddToShared(Vehicle *shared_chain); void RemoveFromShared(); @@ -690,25 +690,25 @@ public: * Get the first vehicle of this vehicle chain. * @return the first vehicle of the chain. */ - inline Vehicle *FirstShared() const { return (this->orders.list == nullptr) ? this->First() : this->orders.list->GetFirstSharedVehicle(); } + inline Vehicle *FirstShared() const { return (this->orders == nullptr) ? this->First() : this->orders->GetFirstSharedVehicle(); } /** * Check if we share our orders with another vehicle. * @return true if there are other vehicles sharing the same order */ - inline bool IsOrderListShared() const { return this->orders.list != nullptr && this->orders.list->IsShared(); } + inline bool IsOrderListShared() const { return this->orders != nullptr && this->orders->IsShared(); } /** * Get the number of orders this vehicle has. * @return the number of orders this vehicle has. */ - inline VehicleOrderID GetNumOrders() const { return (this->orders.list == nullptr) ? 0 : this->orders.list->GetNumOrders(); } + inline VehicleOrderID GetNumOrders() const { return (this->orders == nullptr) ? 0 : this->orders->GetNumOrders(); } /** * Get the number of manually added orders this vehicle has. * @return the number of manually added orders this vehicle has. */ - inline VehicleOrderID GetNumManualOrders() const { return (this->orders.list == nullptr) ? 0 : this->orders.list->GetNumManualOrders(); } + inline VehicleOrderID GetNumManualOrders() const { return (this->orders == nullptr) ? 0 : this->orders->GetNumManualOrders(); } /** * Get the next station the vehicle will stop at. @@ -716,7 +716,7 @@ public: */ inline StationIDStack GetNextStoppingStation() const { - return (this->orders.list == nullptr) ? INVALID_STATION : this->orders.list->GetNextStoppingStation(this); + return (this->orders == nullptr) ? INVALID_STATION : this->orders->GetNextStoppingStation(this); } void ResetRefitCaps(); @@ -878,7 +878,7 @@ public: */ inline Order *GetOrder(int index) const { - return (this->orders.list == nullptr) ? nullptr : this->orders.list->GetOrderAt(index); + return (this->orders == nullptr) ? nullptr : this->orders->GetOrderAt(index); } /** @@ -887,7 +887,7 @@ public: */ inline Order *GetLastOrder() const { - return (this->orders.list == nullptr) ? nullptr : this->orders.list->GetLastOrder(); + return (this->orders == nullptr) ? nullptr : this->orders->GetLastOrder(); } bool IsEngineCountable() const; @@ -1038,7 +1038,7 @@ public: * Returns an iterable ensemble of orders of a vehicle * @return an iterable ensemble of orders of a vehicle */ - IterateWrapper Orders() const { return IterateWrapper(this->orders.list); } + IterateWrapper Orders() const { return IterateWrapper(this->orders); } }; /** diff --git a/src/vehicle_cmd.cpp b/src/vehicle_cmd.cpp index 11b8d9508b..2261456a33 100644 --- a/src/vehicle_cmd.cpp +++ b/src/vehicle_cmd.cpp @@ -219,9 +219,9 @@ CommandCost CmdSellVehicle(DoCommandFlag flags, VehicleID v_id, bool sell_chain, /* Can we actually make the order backup, i.e. are there enough orders? */ if (backup_order && - front->orders.list != nullptr && - !front->orders.list->IsShared() && - !Order::CanAllocateItem(front->orders.list->GetNumOrders())) { + front->orders != nullptr && + !front->orders->IsShared() && + !Order::CanAllocateItem(front->orders->GetNumOrders())) { /* Only happens in exceptional cases when there aren't enough orders anyhow. * Thus it should be safe to just drop the orders in that case. */ backup_order = false; diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index 70ac8ca86e..2fe403391b 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -1444,7 +1444,7 @@ static void DrawSmallOrderList(const Vehicle *v, int left, int right, int y, uin oid++; order = order->next; if (order == nullptr) { - order = v->orders.list->GetFirstOrder(); + order = v->orders->GetFirstOrder(); oid = 0; } } while (oid != start); From 36bee83864ecffe526d7693dab8bb04fb3f6a4e2 Mon Sep 17 00:00:00 2001 From: dP Date: Sat, 19 Feb 2022 21:08:23 +0300 Subject: [PATCH 06/11] Change: Deliver cargo to the closest industry first (#9536) --- src/cargomonitor.cpp | 6 +++--- src/economy.cpp | 3 ++- src/industry_cmd.cpp | 14 +++++++------- src/station.cpp | 41 +++++++++++++++++++++++++++++++++-------- src/station_base.h | 16 ++++++++++++---- src/subsidy.cpp | 6 +++--- 6 files changed, 60 insertions(+), 26 deletions(-) diff --git a/src/cargomonitor.cpp b/src/cargomonitor.cpp index 2941a29556..7614cba6ec 100644 --- a/src/cargomonitor.cpp +++ b/src/cargomonitor.cpp @@ -149,9 +149,9 @@ void AddCargoDelivery(CargoID cargo_type, CompanyID company, uint32 amount, Sour if (iter != _cargo_deliveries.end()) iter->second += amount; /* Industry delivery. */ - for (Industry *ind : st->industries_near) { - if (ind->index != dest) continue; - CargoMonitorID num = EncodeCargoIndustryMonitor(company, cargo_type, ind->index); + for (const auto &i : st->industries_near) { + if (i.industry->index != dest) continue; + CargoMonitorID num = EncodeCargoIndustryMonitor(company, cargo_type, i.industry->index); CargoMonitorMap::iterator iter = _cargo_deliveries.find(num); if (iter != _cargo_deliveries.end()) iter->second += amount; } diff --git a/src/economy.cpp b/src/economy.cpp index e915653efd..bc3692e3a4 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -1040,9 +1040,10 @@ static uint DeliverGoodsToIndustry(const Station *st, CargoID cargo_type, uint n uint accepted = 0; - for (Industry *ind : st->industries_near) { + for (const auto &i : st->industries_near) { if (num_pieces == 0) break; + Industry *ind = i.industry; if (ind->index == source) continue; uint cargo_index; diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index e6a01c097d..90e917cd35 100644 --- a/src/industry_cmd.cpp +++ b/src/industry_cmd.cpp @@ -199,7 +199,7 @@ Industry::~Industry() CargoPacket::InvalidateAllFrom(ST_INDUSTRY, this->index); for (Station *st : this->stations_near) { - st->industries_near.erase(this); + st->RemoveIndustryToDeliver(this); } } @@ -1701,15 +1701,14 @@ static void PopulateStationsNearby(Industry *ind) /* Industry has a neutral station. Use it and ignore any other nearby stations. */ ind->stations_near.insert(ind->neutral_station); ind->neutral_station->industries_near.clear(); - ind->neutral_station->industries_near.insert(ind); + ind->neutral_station->industries_near.insert(IndustryListEntry{0, ind}); return; } ForAllStationsAroundTiles(ind->location, [ind](Station *st, TileIndex tile) { if (!IsTileType(tile, MP_INDUSTRY) || GetIndustryIndex(tile) != ind->index) return false; - ind->stations_near.insert(st); - st->AddIndustryToDeliver(ind); - return true; + st->AddIndustryToDeliver(ind, tile); + return false; }); } @@ -3069,7 +3068,8 @@ extern const TileTypeProcs _tile_type_industry_procs = { TerraformTile_Industry, // terraform_tile_proc }; -bool IndustryCompare::operator() (const Industry *lhs, const Industry *rhs) const +bool IndustryCompare::operator() (const IndustryListEntry &lhs, const IndustryListEntry &rhs) const { - return lhs->index < rhs->index; + /* Compare by distance first and use index as a tiebreaker. */ + return std::tie(lhs.distance, lhs.industry->index) < std::tie(rhs.distance, rhs.industry->index); } diff --git a/src/station.cpp b/src/station.cpp index 877f53d4e0..fc258fcc92 100644 --- a/src/station.cpp +++ b/src/station.cpp @@ -357,12 +357,25 @@ Rect Station::GetCatchmentRect() const /** * Add nearby industry to station's industries_near list if it accepts cargo. - * @param ind Industry + * For industries that are already on the list update distance if it's closer. + * @param ind Industry + * @param tile Tile of the industry to measure distance to. */ -void Station::AddIndustryToDeliver(Industry *ind) +void Station::AddIndustryToDeliver(Industry *ind, TileIndex tile) { - /* Don't check further if this industry is already in the list */ - if (this->industries_near.find(ind) != this->industries_near.end()) return; + /* Using DistanceMax to get about the same order as with previously used CircularTileSearch. */ + uint distance = DistanceMax(this->xy, tile); + + /* Don't check further if this industry is already in the list but update the distance if it's closer */ + auto pos = std::find_if(this->industries_near.begin(), this->industries_near.end(), [&](const IndustryListEntry &e) { return e.industry->index == ind->index; }); + if (pos != this->industries_near.end()) { + if (pos->distance > distance) { + auto node = this->industries_near.extract(pos); + node.value().distance = distance; + this->industries_near.insert(std::move(node)); + } + return; + } /* Include only industries that can accept cargo */ uint cargo_index; @@ -371,9 +384,21 @@ void Station::AddIndustryToDeliver(Industry *ind) } if (cargo_index >= lengthof(ind->accepts_cargo)) return; - this->industries_near.insert(ind); + this->industries_near.insert(IndustryListEntry{distance, ind}); } +/** + * Remove nearby industry from station's industries_near list. + * @param ind Industry + */ +void Station::RemoveIndustryToDeliver(Industry *ind) { + auto pos = std::find_if(this->industries_near.begin(), this->industries_near.end(), [&](const IndustryListEntry &e) { return e.industry->index == ind->index; }); + if (pos != this->industries_near.end()) { + this->industries_near.erase(pos); + } +} + + /** * Remove this station from the nearby stations lists of all towns and industries. */ @@ -423,11 +448,11 @@ void Station::RecomputeCatchment() } /* The industry's stations_near may have been computed before its neutral station was built so clear and re-add here. */ for (Station *st : this->industry->stations_near) { - st->industries_near.erase(this->industry); + st->RemoveIndustryToDeliver(this->industry); } this->industry->stations_near.clear(); this->industry->stations_near.insert(this); - this->industries_near.insert(this->industry); + this->industries_near.insert(IndustryListEntry{0, this->industry}); return; } @@ -462,7 +487,7 @@ void Station::RecomputeCatchment() i->stations_near.insert(this); /* Add if we can deliver to this industry as well */ - this->AddIndustryToDeliver(i); + this->AddIndustryToDeliver(i, tile); } } } diff --git a/src/station_base.h b/src/station_base.h index eff191860c..ebb29026a9 100644 --- a/src/station_base.h +++ b/src/station_base.h @@ -437,11 +437,18 @@ private: } }; -struct IndustryCompare { - bool operator() (const Industry *lhs, const Industry *rhs) const; +struct IndustryListEntry { + uint distance; + Industry *industry; + + bool operator== (const IndustryListEntry &other) const { return this->distance == other.distance && this->industry == other.industry; }; }; -typedef std::set IndustryList; +struct IndustryCompare { + bool operator() (const IndustryListEntry &lhs, const IndustryListEntry &rhs) const; +}; + +typedef std::set IndustryList; /** Station data structure */ struct Station FINAL : SpecializedStation { @@ -500,7 +507,8 @@ public: uint GetCatchmentRadius() const; Rect GetCatchmentRect() const; bool CatchmentCoversTown(TownID t) const; - void AddIndustryToDeliver(Industry *ind); + void AddIndustryToDeliver(Industry *ind, TileIndex tile); + void RemoveIndustryToDeliver(Industry *ind); void RemoveFromAllNearbyLists(); inline bool TileIsInCatchment(TileIndex tile) const diff --git a/src/subsidy.cpp b/src/subsidy.cpp index 0c32dbcf12..6b56feead2 100644 --- a/src/subsidy.cpp +++ b/src/subsidy.cpp @@ -600,9 +600,9 @@ bool CheckSubsidised(CargoID cargo_type, CompanyID company, SourceType src_type, if (s->cargo_type == cargo_type && s->src_type == src_type && s->src == src && (!s->IsAwarded() || s->awarded == company)) { switch (s->dst_type) { case ST_INDUSTRY: - for (Industry *ind : st->industries_near) { - if (s->dst == ind->index) { - assert(ind->part_of_subsidy & POS_DST); + for (const auto &i : st->industries_near) { + if (s->dst == i.industry->index) { + assert(i.industry->part_of_subsidy & POS_DST); subsidised = true; if (!s->IsAwarded()) s->AwardTo(company); } From 22f6502b143041b95702011c0df2c38fea9d9a88 Mon Sep 17 00:00:00 2001 From: translators Date: Tue, 22 Feb 2022 18:50:00 +0000 Subject: [PATCH 07/11] Update: Translations from eints chinese (traditional): 3 changes by benny30111 galician: 9 changes by mgtrad, 1 change by NicoSGF64 indonesian: 14 changes by bsuseno --- src/lang/galician.txt | 20 ++++++++++---------- src/lang/indonesian.txt | 28 ++++++++++++++-------------- src/lang/traditional_chinese.txt | 3 +++ 3 files changed, 27 insertions(+), 24 deletions(-) diff --git a/src/lang/galician.txt b/src/lang/galician.txt index c5817d0f47..d62fb5f59d 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -496,11 +496,11 @@ STR_ABOUT_MENU_SEPARATOR : STR_ABOUT_MENU_TOGGLE_CONSOLE :(Des)Activar consola STR_ABOUT_MENU_AI_DEBUG :Depuración IA/script do xogo STR_ABOUT_MENU_SCREENSHOT :Captura de pantalla -STR_ABOUT_MENU_SHOW_FRAMERATE :Mostrar frame rate -STR_ABOUT_MENU_ABOUT_OPENTTD :Acerca de 'OpenTTD' +STR_ABOUT_MENU_SHOW_FRAMERATE :Amosar o número de imaxes por segundo +STR_ABOUT_MENU_ABOUT_OPENTTD :Sobre 'OpenTTD' STR_ABOUT_MENU_SPRITE_ALIGNER :Aliñador de sprites STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Activa/desactiva caixas delimitadoras -STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Activa/desactiva o coloreado de bloques modificados +STR_ABOUT_MENU_TOGGLE_DIRTY_BLOCKS :Activa/desactiva a coloración de bloques modificados # Place in highscore window ###length 15 @@ -2108,7 +2108,7 @@ STR_QUIT_NO :{BLACK}Non # Abandon game STR_ABANDON_GAME_CAPTION :{WHITE}Saír da partida STR_ABANDON_GAME_QUERY :{YELLOW}Estás seguro de que queres saír desta partida? -STR_ABANDON_SCENARIO_QUERY :{YELLOW}Estás seguro de que desexas saír deste escenario? +STR_ABANDON_SCENARIO_QUERY :{YELLOW}Estás seguro de que queres saír deste escenario? # Cheat window STR_CHEATS :{WHITE}Trampulladas @@ -2796,7 +2796,7 @@ STR_AIRPORT_HELISTATION :Heliestación STR_AIRPORT_CLASS_SMALL :Aeroportos pequenos STR_AIRPORT_CLASS_LARGE :Aeroportos grandes STR_AIRPORT_CLASS_HUB :Aeroportos centrais -STR_AIRPORT_CLASS_HELIPORTS :Aeroportos para helicópteros +STR_AIRPORT_CLASS_HELIPORTS :Heliportos STR_STATION_BUILD_NOISE :{BLACK}Ruído xerado: {GOLD}{COMMA} @@ -3038,11 +3038,11 @@ STR_ABOUT_VERSION :{BLACK}OpenTTD STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}OpenTTD {COPYRIGHT}2002-{STRING} O equipo de OpenTTD # Framerate display window -STR_FRAMERATE_CAPTION :{WHITE}Frame rate +STR_FRAMERATE_CAPTION :{WHITE}Imaxes por segundo STR_FRAMERATE_CAPTION_SMALL :{STRING}{WHITE} ({DECIMAL}x) STR_FRAMERATE_RATE_GAMELOOP :{BLACK}Velocidade de simulación: {STRING} STR_FRAMERATE_RATE_GAMELOOP_TOOLTIP :{BLACK}Número de ticks do xogo simulados por segundo. -STR_FRAMERATE_RATE_BLITTER :{BLACK}Velocidade de refresco: {STRING} +STR_FRAMERATE_RATE_BLITTER :{BLACK}Imaxes por segundo: {STRING} STR_FRAMERATE_RATE_BLITTER_TOOLTIP :{BLACK}Número de frames renderizados por segundo. STR_FRAMERATE_SPEED_FACTOR :{BLACK}Factor de velocidade do xogo actual: {DECIMAL}x STR_FRAMERATE_SPEED_FACTOR_TOOLTIP :{BLACK}Como de rápido está a correr o xogo, comparado coa velocidade esperada a unha velocidade de simulación normal. @@ -3447,7 +3447,7 @@ STR_LOCAL_AUTHORITY_ACTION_SMALL_ADVERTISING_CAMPAIGN :Pequena campañ STR_LOCAL_AUTHORITY_ACTION_MEDIUM_ADVERTISING_CAMPAIGN :Campaña publicitaria mediana STR_LOCAL_AUTHORITY_ACTION_LARGE_ADVERTISING_CAMPAIGN :Gran campaña publicitaria STR_LOCAL_AUTHORITY_ACTION_ROAD_RECONSTRUCTION :Financia-la reparación das fochancas nas rúas da cidade -STR_LOCAL_AUTHORITY_ACTION_STATUE_OF_COMPANY :Construír unha estatua a Manuel Fraga +STR_LOCAL_AUTHORITY_ACTION_STATUE_OF_COMPANY :Construír unha estatua ao propietario da compañía STR_LOCAL_AUTHORITY_ACTION_NEW_BUILDINGS :Financiar novos edificios STR_LOCAL_AUTHORITY_ACTION_EXCLUSIVE_TRANSPORT :Compra-los dereitos exclusivos de transporte STR_LOCAL_AUTHORITY_ACTION_BRIBE :Suborna-la autoridade local @@ -4506,7 +4506,7 @@ STR_AI_DEBUG_BREAK_STR_TOOLTIP :{BLACK}Cando un STR_AI_DEBUG_MATCH_CASE :{BLACK}Coincidir maiúsculas STR_AI_DEBUG_MATCH_CASE_TOOLTIP :{BLACK}Alterna a coincidencia de maiúsculas ao comparar as mensaxes no log da IA coa cadea de parada STR_AI_DEBUG_CONTINUE :{BLACK}Continuar -STR_AI_DEBUG_CONTINUE_TOOLTIP :{BLACK}Quita-la pausa e continua-la IA +STR_AI_DEBUG_CONTINUE_TOOLTIP :{BLACK}Quitar a pausa e continuar a IA STR_AI_DEBUG_SELECT_AI_TOOLTIP :{BLACK}Ve-la saída da depuración desta IA STR_AI_GAME_SCRIPT :{BLACK}Script do xogo STR_AI_GAME_SCRIPT_TOOLTIP :{BLACK}Comproba o log do script do xogo @@ -4537,7 +4537,7 @@ STR_AI_CONFIG_CHANGE_AI :IA STR_AI_CONFIG_CHANGE_GAMESCRIPT :Script do xogo STR_AI_CONFIG_CHANGE_TOOLTIP :{BLACK}Cargar outro script STR_AI_CONFIG_CONFIGURE :{BLACK}Configurar -STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Configura-los parámetros do script +STR_AI_CONFIG_CONFIGURE_TOOLTIP :{BLACK}Configurar os parámetros do script # Available AIs window STR_AI_LIST_CAPTION :{WHITE}Dispoñíbel {STRING} diff --git a/src/lang/indonesian.txt b/src/lang/indonesian.txt index af5fe37acd..3a10ddedac 100644 --- a/src/lang/indonesian.txt +++ b/src/lang/indonesian.txt @@ -5106,8 +5106,8 @@ STR_INDUSTRY_NAME_WATER_TOWER :Menara Air STR_INDUSTRY_NAME_FACTORY_2 :Pabrik STR_INDUSTRY_NAME_FARM_2 :Pertanian STR_INDUSTRY_NAME_LUMBER_MILL :Pabrik Pengolahan Kayu Gelondongan -STR_INDUSTRY_NAME_COTTON_CANDY_FOREST :Hutan Harum Manis -STR_INDUSTRY_NAME_CANDY_FACTORY :Pabrik Manisan +STR_INDUSTRY_NAME_COTTON_CANDY_FOREST :Hutan Arum Manis +STR_INDUSTRY_NAME_CANDY_FACTORY :Pabrik Kembang Gula STR_INDUSTRY_NAME_BATTERY_FARM :Pertanian Baterai STR_INDUSTRY_NAME_COLA_WELLS :Sumur Cola STR_INDUSTRY_NAME_TOY_SHOP :Toko Mainan @@ -5209,11 +5209,11 @@ STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_WATER_TANKER :Gerbong Tangki STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_FRUIT_TRUCK :Gerbong Buah STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_RUBBER_TRUCK :Gerbong Karet STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_SUGAR_TRUCK :Gerbong Gula -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COTTON_CANDY_HOPPER :Gerbong Harum Manis +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COTTON_CANDY_HOPPER :Gerbong Arum Manis STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_TOFFEE_HOPPER :Gerbong Permen STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_BUBBLE_VAN :Gerbong Gelembung STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_COLA_TANKER :Gerbong Tangki Cola -STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_CANDY_VAN :Gerbong Manisan +STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_CANDY_VAN :Gerbong Kembang Gula STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_TOY_VAN :Gerbong Mainan STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_BATTERY_TRUCK :Gerbong Baterai STR_VEHICLE_NAME_TRAIN_WAGON_RAIL_FIZZY_DRINK_TRUCK :Gerbong Minuman Ringan @@ -5239,11 +5239,11 @@ STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_WATER_TANKER :Gerbong Tangki STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_FRUIT_TRUCK :Gerbong Buah STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_RUBBER_TRUCK :Gerbong Karet STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_SUGAR_TRUCK :Gerbong Gula -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_COTTON_CANDY_HOPPER :Gerbong Harum Manis +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_COTTON_CANDY_HOPPER :Gerbong Arum Manis STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_TOFFEE_HOPPER :Gerbong Permen STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_BUBBLE_VAN :Gerbong Gelembung STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_COLA_TANKER :Gerbong Cola -STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_CANDY_VAN :Gerbong Manisan +STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_CANDY_VAN :Gerbong Kembang Gula STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_TOY_VAN :Gerbong Mainan STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_BATTERY_TRUCK :Gerbong Baterai STR_VEHICLE_NAME_TRAIN_WAGON_MONORAIL_FIZZY_DRINK_TRUCK :Gerbong Minuman Ringan @@ -5271,11 +5271,11 @@ STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_WATER_TANKER :Gerbong Tangki STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_FRUIT_TRUCK :Gerbong Buah STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_RUBBER_TRUCK :Gerbong Karet STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_SUGAR_TRUCK :Gerbong Gula -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_COTTON_CANDY_HOPPER :Gerbong Harum Manis +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_COTTON_CANDY_HOPPER :Gerbong Arum Manis STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_TOFFEE_HOPPER :Gerbong Permen STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_BUBBLE_VAN :Gerbong Gelembung STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_COLA_TANKER :Gerbong Cola -STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_CANDY_VAN :Gerbong Manisan +STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_CANDY_VAN :Gerbong Kembang Gula STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_TOY_VAN :Gerbong Mainan STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_BATTERY_TRUCK :Gerbong Baterai STR_VEHICLE_NAME_TRAIN_WAGON_MAGLEV_FIZZY_DRINK_TRUCK :Gerbong Minuman Ringan @@ -5346,18 +5346,18 @@ STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_SUGAR_TRUCK :Truk Gula Wizzo STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_COLA_TRUCK :Truk Cola MightyMover STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_COLA_TRUCK :Truk Cola Powernaught STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_COLA_TRUCK :Truk Cola Wizzowow -STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_COTTON_CANDY :Truk Harum Manis MightyMover -STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_COTTON_CANDY :Truk Harum Manis Powernaught -STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_COTTON_CANDY_TRUCK :Truk Harum Manis Wizzowow +STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_COTTON_CANDY :Truk Arum Manis MightyMover +STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_COTTON_CANDY :Truk Arum Manis Powernaught +STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_COTTON_CANDY_TRUCK :Truk Arum Manis Wizzowow STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_TOFFEE_TRUCK :Truk Permen MightyMover STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_TOFFEE_TRUCK :Truk Permen Powernaught STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_TOFFEE_TRUCK :Truk Permen Wizzowow STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_TOY_VAN :Truk Mainan MightyMover STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_TOY_VAN :Truk Mainan Powernaught STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_TOY_VAN :Truk Mainan Wizzowow -STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_CANDY_TRUCK :Truk Manisan MightyMover -STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_CANDY_TRUCK :Truk Manisan Powernaught -STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_CANDY_TRUCK :Truk Manisan Wizzowow +STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_CANDY_TRUCK :Truk Kembang Gula MightyMover +STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_CANDY_TRUCK :Truk Kembang Gula Powernaught +STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_CANDY_TRUCK :Truk Kembang Gula Wizzowow STR_VEHICLE_NAME_ROAD_VEHICLE_MIGHTYMOVER_BATTERY_TRUCK :Truk Baterai MightyMover STR_VEHICLE_NAME_ROAD_VEHICLE_POWERNAUGHT_BATTERY_TRUCK :Truk Baterai Powernaught STR_VEHICLE_NAME_ROAD_VEHICLE_WIZZOWOW_BATTERY_TRUCK :Truk Baterai Wizzowow diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index f8e60b6e7a..8e95132c5b 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -1413,6 +1413,7 @@ STR_CONFIG_SETTING_POPULATION_IN_LABEL_HELPTEXT :在地圖的市 STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS :圖像上的線條之粗細值: {STRING} STR_CONFIG_SETTING_GRAPH_LINE_THICKNESS_HELPTEXT :設定圖像上的線條之粗細值。較幼細的線條能較準確地顯示數值,而較粗大的線較容易看到和分辨 +STR_CONFIG_SETTING_SHOW_NEWGRF_NAME :在購買運具介面的下方顯示 NewGRF 的名稱:{STRING} STR_CONFIG_SETTING_LANDSCAPE :場景:{STRING} STR_CONFIG_SETTING_LANDSCAPE_HELPTEXT :此設定決定基本的遊戲場景、可供運輸的貨物種類,以及城鎮發展的條件。然而,NewGRF 及遊戲腳本可提供更加細緻的設定 @@ -3693,6 +3694,7 @@ STR_PURCHASE_INFO_NONE :無 STR_PURCHASE_INFO_ALL_BUT :所有貨物({CARGO_LIST}除外) STR_PURCHASE_INFO_MAX_TE :{BLACK}最大牽引力:{GOLD}{FORCE} STR_PURCHASE_INFO_AIRCRAFT_RANGE :{BLACK}範圍: {GOLD}{COMMA} 方格 +STR_PURCHASE_INFO_AIRCRAFT_TYPE :{BLACK}飛機類型: {GOLD}{STRING} ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_LIST_TOOLTIP :{BLACK}列車選單。點選機車或車卡檢視詳細資訊,或者按住 Ctrl 鍵再點選機車或車卡以切換是否顯示機車或車卡的種類 @@ -3709,6 +3711,7 @@ STR_BUY_VEHICLE_AIRCRAFT_BUY_VEHICLE_BUTTON :{BLACK}購買 ###length VEHICLE_TYPES STR_BUY_VEHICLE_TRAIN_BUY_REFIT_VEHICLE_BUTTON :{BLACK}購買並改裝車輛 STR_BUY_VEHICLE_ROAD_VEHICLE_BUY_REFIT_VEHICLE_BUTTON :{BLACK}購買並改裝車輛 +STR_BUY_VEHICLE_SHIP_BUY_REFIT_VEHICLE_BUTTON :{BLACK}購買並改裝船舶 STR_BUY_VEHICLE_AIRCRAFT_BUY_REFIT_VEHICLE_BUTTON :{BLACK}購買並改裝飛機 ###length VEHICLE_TYPES From 89dba56782040fa72f9c4222b74cb7b0cbe717b6 Mon Sep 17 00:00:00 2001 From: Tyler Trahan Date: Tue, 22 Feb 2022 14:09:13 -0700 Subject: [PATCH 08/11] Fix e740c24: Use correct command flag, not just DC_EXEC --- src/water_cmd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/water_cmd.cpp b/src/water_cmd.cpp index b4bfa8d01f..6d26888d14 100644 --- a/src/water_cmd.cpp +++ b/src/water_cmd.cpp @@ -1373,7 +1373,7 @@ static CommandCost TerraformTile_Water(TileIndex tile, DoCommandFlag flags, int /* Canals can't be terraformed */ if (IsWaterTile(tile) && IsCanal(tile)) return_cmd_error(STR_ERROR_MUST_DEMOLISH_CANAL_FIRST); - return Command::Do(DC_EXEC, tile); + return Command::Do(flags, tile); } From 1c256a4be79ac393185944dc0e4461da02be450e Mon Sep 17 00:00:00 2001 From: Rubidium Date: Wed, 2 Feb 2022 22:37:38 +0100 Subject: [PATCH 09/11] Fix: do not let shares in the company taking over another company disappear --- src/economy.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/economy.cpp b/src/economy.cpp index bc3692e3a4..c6fd2ed398 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -324,13 +324,13 @@ void ChangeOwnershipOfCompanyItems(Owner old_owner, Owner new_owner) /* Sell all the shares that people have on this company */ Backup cur_company2(_current_company, FILE_LINE); - const Company *c = Company::Get(old_owner); + Company *c = Company::Get(old_owner); for (i = 0; i < 4; i++) { if (c->share_owners[i] == INVALID_OWNER) continue; if (c->bankrupt_value == 0 && c->share_owners[i] == new_owner) { /* You are the one buying the company; so don't sell the shares back to you. */ - Company::Get(new_owner)->share_owners[i] = INVALID_OWNER; + c->share_owners[i] = INVALID_OWNER; } else { cur_company2.Change(c->share_owners[i]); /* Sell the shares */ From acaea776ebe7adfbc4bce870273e153d87a041b4 Mon Sep 17 00:00:00 2001 From: translators Date: Mon, 28 Feb 2022 18:49:10 +0000 Subject: [PATCH 10/11] Update: Translations from eints finnish: 2 changes by RedJimi --- src/lang/finnish.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/lang/finnish.txt b/src/lang/finnish.txt index 2d08b1e3c7..0b6ef50a56 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -1743,6 +1743,8 @@ STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER_HELPTEXT :Näytä sanomal STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS :Vahingot/onnettomuudet: {STRING} STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS_HELPTEXT :Näytä sanomalehti vahingon tai onnettomuuden sattuessa +STR_CONFIG_SETTING_NEWS_ACCIDENT_OTHER :Kilpailijan kulkuneuvojen vahingot: {STRING} +STR_CONFIG_SETTING_NEWS_ACCIDENT_OTHER_HELPTEXT :Näytä sanomalehti vahingon sattuessa kilpailijan kulkuneuvoille STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION :Yhtiön tiedot: {STRING} STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION_HELPTEXT :Näytä sanomalehti kun uusi yhtiö aloittaa toimintansa tai kun jokin yhtiö on lähellä konkurssia From 0d8fbf647b2c819bee0a0883b5fc831aa64e4ee0 Mon Sep 17 00:00:00 2001 From: translators Date: Thu, 3 Mar 2022 18:45:52 +0000 Subject: [PATCH 11/11] Update: Translations from eints latvian: 4 changes by lexuslatvia --- src/lang/latvian.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt index 2416d61e45..dae04f99e5 100644 --- a/src/lang/latvian.txt +++ b/src/lang/latvian.txt @@ -1745,6 +1745,8 @@ STR_CONFIG_SETTING_NEWS_ARRIVAL_FIRST_VEHICLE_OTHER_HELPTEXT :Rādīt avīzi STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS :Negadījumi / katastrofas: {STRING} STR_CONFIG_SETTING_NEWS_ACCIDENTS_DISASTERS_HELPTEXT :Rādīt avīzi, kad notiek nelaimes gadījumi vai katastrofas +STR_CONFIG_SETTING_NEWS_ACCIDENT_OTHER :Konkuretu transportlīdzekļu negadījumi: {STRING} +STR_CONFIG_SETTING_NEWS_ACCIDENT_OTHER_HELPTEXT :Rādīt avīzi par konkuretu transportlīdzekļu negadījumiem STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION :Uzņēmuma informācija: {STRING} STR_CONFIG_SETTING_NEWS_COMPANY_INFORMATION_HELPTEXT :Rādīt avīzi kad darbību sāk jauns uzņēmums, vai kad uzņēmumi riskē bankrotēt @@ -2262,6 +2264,7 @@ STR_NETWORK_SERVER_LIST_LANDSCAPE :{SILVER}Ainava: STR_NETWORK_SERVER_LIST_MAP_SIZE :{SILVER}Kartes izmērs: {WHITE}{COMMA}x{COMMA} STR_NETWORK_SERVER_LIST_SERVER_VERSION :{SILVER}Servera versija: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_SERVER_ADDRESS :{SILVER}Servera adrese: {WHITE}{STRING} +STR_NETWORK_SERVER_LIST_INVITE_CODE :{SILVER}Uzaicinājuma kods: {WHITE}{STRING} STR_NETWORK_SERVER_LIST_START_DATE :{SILVER}Sākuma datums: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_CURRENT_DATE :{SILVER}Šībrīža datums: {WHITE}{DATE_SHORT} STR_NETWORK_SERVER_LIST_GAMESCRIPT :{SILVER}Spēles Skripts: {WHITE}{STRING} (v{NUM}) @@ -2678,6 +2681,7 @@ STR_STATION_CLASS_WAYP :Pieturas punkti # Signal window STR_BUILD_SIGNAL_CAPTION :{WHITE}Signāla izvēle +STR_BUILD_SIGNAL_TOGGLE_ADVANCED_SIGNAL_TOOLTIP :{BLACK}Pārslēdziet papildu signālu veidu rādīšanu STR_BUILD_SIGNAL_SEMAPHORE_NORM_TOOLTIP :{BLACK}Bloka signālierīce (semafors){}Šis ir pats vienkāršākais signālierīces veids, kas ļauj uz bloka vienlaicīgi atrasties tikai vienam vilcienam STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TOOLTIP :{BLACK}Ieejas signālierīce (semafors){}Zaļš kamēr ir viens vai vairāki zaļi izejas signāli no sekojošās sliežu sekcijas. Citādi signāls būs sarkans STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP :{BLACK}Izejas signālierīce (semafors){}Uzvedas tāpat kā bloka signālierīce, bet tā ir nepieciešama, lai pirmssignālu ierīces rādītu pareizās krāsas