diff --git a/src/autoreplace_cmd.cpp b/src/autoreplace_cmd.cpp index b2bc2d8d33..34c7b453bd 100644 --- a/src/autoreplace_cmd.cpp +++ b/src/autoreplace_cmd.cpp @@ -207,7 +207,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/cargomonitor.cpp b/src/cargomonitor.cpp index c6aa9041a1..133aedd055 100644 --- a/src/cargomonitor.cpp +++ b/src/cargomonitor.cpp @@ -148,9 +148,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/departures.cpp b/src/departures.cpp index cb5ce47bce..9d63e5a4c1 100644 --- a/src/departures.cpp +++ b/src/departures.cpp @@ -95,14 +95,14 @@ static inline bool VehicleSetNextDepartureTime(DateTicks *previous_departure, ui { if (HasBit(v->vehicle_flags, VF_SCHEDULED_DISPATCH)) { auto is_current_implicit_order = [&v](const Order *o) -> bool { - if (v->cur_implicit_order_index >= v->orders.list->GetNumOrders()) return false; - return v->orders.list->GetOrderAt(v->cur_implicit_order_index) == o; + if (v->cur_implicit_order_index >= v->orders->GetNumOrders()) return false; + return v->orders->GetOrderAt(v->cur_implicit_order_index) == o; }; /* This condition means that we want departure time for the dispatch order */ /* but not if the vehicle has arrived at the dispatch order because the timetable is already shifted */ if (order->IsScheduledDispatchOrder(true) && !(arrived_at_timing_point && is_current_implicit_order(order))) { - const DispatchSchedule &ds = v->orders.list->GetDispatchScheduleByIndex(order->GetDispatchScheduleIndex()); + const DispatchSchedule &ds = v->orders->GetDispatchScheduleByIndex(order->GetDispatchScheduleIndex()); DateTicksScaled actual_departure = -1; const DateTicksScaled begin_time = ds.GetScheduledDispatchStartTick(); @@ -147,7 +147,7 @@ static inline bool VehicleSetNextDepartureTime(DateTicks *previous_departure, ui } /* This is special case for proper calculation of arrival time. */ - if (arrived_at_timing_point && v->cur_implicit_order_index < v->orders.list->GetNumOrders() && v->orders.list->GetOrderAt(v->cur_implicit_order_index)->IsScheduledDispatchOrder(true)) { + if (arrived_at_timing_point && v->cur_implicit_order_index < v->orders->GetNumOrders() && v->orders->GetOrderAt(v->cur_implicit_order_index)->IsScheduledDispatchOrder(true)) { *previous_departure += order->GetTravelTime() + order->GetWaitTime(); *waiting_time = -v->lateness_counter + order->GetWaitTime(); return false; @@ -165,7 +165,7 @@ static void ScheduledDispatchDepartureLocalFix(DepartureList *departure_list) /* Seperate departure by each shared order group */ std::map> separated_departure; for (Departure* departure : *departure_list) { - separated_departure[departure->vehicle->orders.list->index].push_back(departure); + separated_departure[departure->vehicle->orders->index].push_back(departure); } for (auto& pair : separated_departure) { diff --git a/src/economy.cpp b/src/economy.cpp index 00556593c5..1123d979a2 100644 --- a/src/economy.cpp +++ b/src/economy.cpp @@ -334,13 +334,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 */ @@ -1078,7 +1078,8 @@ static SmallIndustryList _cargo_delivery_destinations; template void ForAcceptingIndustries(const Station *st, CargoID cargo_type, IndustryID source, CompanyID company, F&& f) { - for (Industry *ind : st->industries_near) { + for (const auto &i : st->industries_near) { + Industry *ind = i.industry; if (ind->index == source) continue; uint cargo_index; @@ -1470,7 +1471,7 @@ void PrepareUnload(Vehicle *front_v) front_v->cargo_payment = new CargoPayment(front_v); CargoStationIDStackSet 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()) { if (GetUnloadType(v) & OUFB_NO_UNLOAD) continue; diff --git a/src/industry_cmd.cpp b/src/industry_cmd.cpp index c74d9c1a12..344c9d3570 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); } if (_game_mode == GM_NORMAL) RegisterGameEvents(GEF_INDUSTRY_DELETE); @@ -1772,15 +1772,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; }); } @@ -3155,7 +3154,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/lang/finnish.txt b/src/lang/finnish.txt index cb872805f1..fdbfbf07e0 100644 --- a/src/lang/finnish.txt +++ b/src/lang/finnish.txt @@ -1755,6 +1755,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 diff --git a/src/lang/galician.txt b/src/lang/galician.txt index 202050b099..ba47a4b89f 100644 --- a/src/lang/galician.txt +++ b/src/lang/galician.txt @@ -501,11 +501,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 @@ -2119,7 +2119,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 @@ -2807,7 +2807,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} @@ -3049,11 +3049,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. @@ -3462,7 +3462,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 @@ -4521,7 +4521,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 @@ -4552,7 +4552,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 712eb56eae..fd78fcccfd 100644 --- a/src/lang/indonesian.txt +++ b/src/lang/indonesian.txt @@ -5127,8 +5127,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 @@ -5230,11 +5230,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 @@ -5260,11 +5260,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 @@ -5292,11 +5292,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 @@ -5367,18 +5367,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/japanese.txt b/src/lang/japanese.txt index 79bbf17e2a..eaa58210d3 100644 --- a/src/lang/japanese.txt +++ b/src/lang/japanese.txt @@ -332,7 +332,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 @@ -431,7 +431,7 @@ STR_MAP_MENU_PLAN_LIST :計画一覧表 # Town menu ###length 2 STR_TOWN_MENU_TOWN_DIRECTORY :街一覧 -STR_TOWN_MENU_FOUND_TOWN :街新設に出資 +STR_TOWN_MENU_FOUND_TOWN :街の新設に出資 # Subsidies menu ###length 1 @@ -500,7 +500,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 :スプライトを整列 @@ -1755,6 +1755,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 :新会社の設立や社の経営危機などのニュースを表示するかを設定します @@ -2056,8 +2058,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}'に戻ります @@ -2691,6 +2693,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}出口信号 (腕木式){}動作は普通の閉塞信号と同様ですが、入口/コンボ信号を使用する場合に必要になります。ホームの入り口に良く使われます @@ -2699,7 +2702,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つの閉塞内に複数の列車が入ることを許容します。このタイプのパス信号は信号の背面から通過することはできません diff --git a/src/lang/latvian.txt b/src/lang/latvian.txt index bb0323bc06..d6914613b5 100644 --- a/src/lang/latvian.txt +++ b/src/lang/latvian.txt @@ -1757,6 +1757,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 @@ -2274,6 +2276,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}) @@ -2690,6 +2693,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 diff --git a/src/lang/traditional_chinese.txt b/src/lang/traditional_chinese.txt index 59b4580a59..7d000b453e 100644 --- a/src/lang/traditional_chinese.txt +++ b/src/lang/traditional_chinese.txt @@ -1424,6 +1424,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 及遊戲腳本可提供更加細緻的設定 @@ -3710,6 +3711,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 鍵再點選機車或車卡以切換是否顯示機車或車卡的種類 @@ -3726,6 +3728,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 diff --git a/src/lang/turkish.txt b/src/lang/turkish.txt index 0b5f78db63..faddb3b182 100644 --- a/src/lang/turkish.txt +++ b/src/lang/turkish.txt @@ -2673,7 +2673,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 diff --git a/src/linkgraph/refresh.cpp b/src/linkgraph/refresh.cpp index f79070736d..8fbad15014 100644 --- a/src/linkgraph/refresh.cpp +++ b/src/linkgraph/refresh.cpp @@ -27,14 +27,14 @@ /* static */ void LinkRefresher::Run(Vehicle *v, bool allow_merge, bool is_full_loading, CargoTypes cargo_mask) { /* If there are no orders we can't predict anything.*/ - if (v->orders.list == nullptr) return; + if (v->orders == nullptr) return; CargoTypes have_cargo_mask = v->GetLastLoadingStationValidCargoMask(); /* Scan orders for cargo-specific load/unload, and run LinkRefresher separately for each set of cargoes where they differ. */ while (cargo_mask != 0) { CargoTypes iter_cargo_mask = cargo_mask; - for (const Order *o = v->orders.list->GetFirstOrder(); o != nullptr; o = o->next) { + for (const Order *o = v->orders->GetFirstOrder(); o != nullptr; o = o->next) { if (o->IsType(OT_GOTO_STATION) || o->IsType(OT_IMPLICIT)) { if (o->GetUnloadType() == OUFB_CARGO_TYPE_UNLOAD) { CargoMaskValueFilter(iter_cargo_mask, [&](CargoID cargo) -> uint { @@ -50,7 +50,7 @@ } /* Make sure the first order is a useful order. */ - const Order *first = v->orders.list->GetNextDecisionNode(v->GetOrder(v->cur_implicit_order_index), 0, iter_cargo_mask); + const Order *first = v->orders->GetNextDecisionNode(v->GetOrder(v->cur_implicit_order_index), 0, iter_cargo_mask); if (first != nullptr) { HopSet seen_hops; LinkRefresher refresher(v, &seen_hops, allow_merge, is_full_loading, iter_cargo_mask); @@ -202,17 +202,17 @@ const Order *LinkRefresher::PredictNextOrder(const Order *cur, const Order *next if (next->IsType(OT_CONDITIONAL)) { if (next->GetConditionVariable() == OCV_UNCONDITIONALLY) { CargoTypes this_cargo_mask = this->cargo_mask; - next = this->vehicle->orders.list->GetNextDecisionNode( - this->vehicle->orders.list->GetOrderAt(next->GetConditionSkipToOrder()), + next = this->vehicle->orders->GetNextDecisionNode( + this->vehicle->orders->GetOrderAt(next->GetConditionSkipToOrder()), num_hops++, this_cargo_mask); assert(this_cargo_mask == this->cargo_mask); continue; } CargoTypes this_cargo_mask = this->cargo_mask; - const Order *skip_to = this->vehicle->orders.list->GetNextDecisionNode( - this->vehicle->orders.list->GetOrderAt(next->GetConditionSkipToOrder()), num_hops, this_cargo_mask); + const Order *skip_to = this->vehicle->orders->GetNextDecisionNode( + this->vehicle->orders->GetOrderAt(next->GetConditionSkipToOrder()), num_hops, this_cargo_mask); assert(this_cargo_mask == this->cargo_mask); - if (skip_to != nullptr && num_hops < std::min(64, this->vehicle->orders.list->GetNumOrders()) && skip_to != next) { + if (skip_to != nullptr && num_hops < std::min(64, this->vehicle->orders->GetNumOrders()) && skip_to != next) { /* 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 @@ -225,8 +225,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.*/ CargoTypes this_cargo_mask = this->cargo_mask; - next = this->vehicle->orders.list->GetNextDecisionNode( - this->vehicle->orders.list->GetNext(next), num_hops++, this_cargo_mask); + next = this->vehicle->orders->GetNextDecisionNode( + this->vehicle->orders->GetNext(next), num_hops++, this_cargo_mask); assert(this_cargo_mask == this->cargo_mask); } return next; @@ -267,16 +267,16 @@ void LinkRefresher::RefreshStats(const Order *cur, const Order *next, uint8 flag * 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, + this->vehicle->orders->GetTotalDuration(), 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, EUM_INCREASE | restricted_mode); } else { IncreaseStats(st, c, next_station, cargo_quantity, 0, EUM_REFRESH | restricted_mode); diff --git a/src/music/midifile.cpp b/src/music/midifile.cpp index dcd2cefd8d..2932df2107 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(); diff --git a/src/order_backup.cpp b/src/order_backup.cpp index de0dfd07a3..c44a9a25f0 100644 --- a/src/order_backup.cpp +++ b/src/order_backup.cpp @@ -67,9 +67,9 @@ OrderBackup::OrderBackup(const Vehicle *v, uint32 user) tail = ©->next; } - if (v->orders.list != nullptr && HasBit(v->vehicle_flags, VF_SCHEDULED_DISPATCH)) { + if (v->orders != nullptr && HasBit(v->vehicle_flags, VF_SCHEDULED_DISPATCH)) { SetBit(this->vehicle_flags, VF_SCHEDULED_DISPATCH); - this->dispatch_schedules = v->orders.list->GetScheduledDispatchScheduleSet(); + this->dispatch_schedules = v->orders->GetScheduledDispatchScheduleSet(); } } @@ -86,12 +86,12 @@ void OrderBackup::DoRestore(Vehicle *v) if (this->clone != nullptr) { DoCommand(0, v->index | CO_SHARE << 30, this->clone->index, DC_EXEC, CMD_CLONE_ORDER); } 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; if (HasBit(this->vehicle_flags, VF_SCHEDULED_DISPATCH)) { SetBit(v->vehicle_flags, VF_SCHEDULED_DISPATCH); - v->orders.list->GetScheduledDispatchScheduleSet() = std::move(this->dispatch_schedules); + v->orders->GetScheduledDispatchScheduleSet() = std::move(this->dispatch_schedules); } /* Make sure buoys/oil rigs are updated in the station list. */ diff --git a/src/order_cmd.cpp b/src/order_cmd.cpp index 7e10d9b84a..e30a3e506b 100644 --- a/src/order_cmd.cpp +++ b/src/order_cmd.cpp @@ -844,7 +844,7 @@ void OrderList::DebugCheckSanity() const for (const Vehicle *v = this->first_shared; v != nullptr; v = v->NextShared()) { ++check_num_vehicles; - assert_msg(v->orders.list == this, "%p, %p", v->orders.list, this); + assert_msg(v->orders == this, "%p, %p", v->orders, this); } assert_msg(this->num_vehicles == check_num_vehicles, "%u, %u", this->num_vehicles, check_num_vehicles); DEBUG(misc, 6, "... detected %u orders (%u manual), %u vehicles, %i timetabled, %i total", @@ -934,7 +934,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); } @@ -1207,7 +1207,7 @@ CommandCost CmdInsertOrderIntl(DoCommandFlag flags, Vehicle *v, VehicleOrderID s 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(); @@ -1228,16 +1228,16 @@ CommandCost CmdInsertOrderIntl(DoCommandFlag flags, Vehicle *v, VehicleOrderID s 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. @@ -1389,12 +1389,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.IsAnyLoadingType()) { CancelLoadingDueToDeletedOrder(u); @@ -1532,7 +1532,7 @@ CommandCost CmdMoveOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 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(); @@ -1574,7 +1574,7 @@ CommandCost CmdMoveOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 u->cur_timetable_order_index = INVALID_VEH_ORDER_ID; - 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 << 16)); } @@ -1653,7 +1653,7 @@ CommandCost CmdReverseOrderList(TileIndex tile, DoCommandFlag flags, uint32 p1, CommandCost cost = CmdInsertOrderIntl(flags, v, order_count, new_order, true); if (cost.Failed()) return cost; if (flags & DC_EXEC) { - Order *order = v->orders.list->GetOrderAt(order_count); + Order *order = v->orders->GetOrderAt(order_count); order->SetRefit(new_order.GetRefitCargo()); order->SetMaxSpeed(new_order.GetMaxSpeed()); if (wait_fixed) { @@ -2322,7 +2322,7 @@ CommandCost CmdCloneOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 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); } @@ -2332,7 +2332,7 @@ CommandCost CmdCloneOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 * (We mainly do this to keep the order indices valid and in range.) */ DeleteVehicleOrders(dst, false, ShouldResetOrderIndicesOnOrderCopy(src, dst)); - dst->orders.list = src->orders.list; + dst->orders = src->orders; /* Link this vehicle in the shared-list */ dst->AddToShared(src); @@ -2424,20 +2424,20 @@ CommandCost CmdCloneOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 (*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); } /* Copy over scheduled dispatch data */ - assert(dst->orders.list != nullptr); - if (src->orders.list != nullptr) { - dst->orders.list->GetScheduledDispatchScheduleSet() = src->orders.list->GetScheduledDispatchScheduleSet(); + assert(dst->orders != nullptr); + if (src->orders != nullptr) { + dst->orders->GetScheduledDispatchScheduleSet() = src->orders->GetScheduledDispatchScheduleSet(); } /* Set automation bit if target has it. */ @@ -2595,7 +2595,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; } } @@ -2604,7 +2604,7 @@ void CheckOrders(const Vehicle *v) if (n_st < 2 && message == INVALID_STRING_ID) message = STR_NEWS_VEHICLE_HAS_TOO_FEW_ORDERS; #ifndef NDEBUG - if (v->orders.list != nullptr) v->orders.list->DebugCheckSanity(); + if (v->orders != nullptr) v->orders->DebugCheckSanity(); #endif if (message == INVALID_STRING_ID && !has_depot_order && v->type != VEH_AIRCRAFT && _settings_client.gui.no_depot_order_warn) message = STR_NEWS_VEHICLE_NO_DEPOT_ORDER; @@ -2685,13 +2685,13 @@ 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; + v->orders = nullptr; } else { DeleteWindowById(GetWindowClassForVehicleType(v->type), VehicleListIdentifier(VL_SHARED_ORDERS, v->type, v->owner, v->index).Pack()); - if (v->orders.list != nullptr) { + 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; } } @@ -3353,7 +3353,7 @@ CommandCost CmdMassChangeOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, u if (CmdInsertOrderIntl(flags, v, index + 1, new_order, true).Succeeded()) { DoCommand(0, v->index, index, flags, CMD_DELETE_ORDER); - order = v->orders.list->GetOrderAt(index); + order = v->orders->GetOrderAt(index); order->SetRefit(new_order.GetRefitCargo()); order->SetMaxSpeed(new_order.GetMaxSpeed()); if (wait_fixed) { diff --git a/src/order_cmd.h b/src/order_cmd.h index 1e841b52c9..7ab889f2f2 100644 --- a/src/order_cmd.h +++ b/src/order_cmd.h @@ -53,9 +53,9 @@ restart: UnregisterOrderDestination(order, v->type, v->owner); /* Clear wait time */ - if (!order->IsType(OT_CONDITIONAL)) v->orders.list->UpdateTotalDuration(-static_cast(order->GetWaitTime())); + if (!order->IsType(OT_CONDITIONAL)) v->orders->UpdateTotalDuration(-static_cast(order->GetWaitTime())); if (order->IsWaitTimetabled()) { - if (!order->IsType(OT_CONDITIONAL)) v->orders.list->UpdateTimetableDuration(-static_cast(order->GetTimetabledWait())); + if (!order->IsType(OT_CONDITIONAL)) v->orders->UpdateTimetableDuration(-static_cast(order->GetTimetabledWait())); order->SetWaitTimetabled(false); } order->SetWaitTime(0); diff --git a/src/order_gui.cpp b/src/order_gui.cpp index 9caee23db5..65fa6dc967 100644 --- a/src/order_gui.cpp +++ b/src/order_gui.cpp @@ -1079,7 +1079,7 @@ void DrawOrderString(const Vehicle *v, const Order *order, int order_index, int } if (timetable && HasBit(v->vehicle_flags, VF_SCHEDULED_DISPATCH) && order->IsScheduledDispatchOrder(false) && edge != 0) { StringID str = order->IsWaitTimetabled() ? STR_TIMETABLE_SCHEDULED_DISPATCH_ORDER : STR_TIMETABLE_SCHEDULED_DISPATCH_ORDER_NO_WAIT_TIME; - SetDParam(0, v->orders.list->GetScheduledDispatchScheduleCount() > 1 ? STR_TIMETABLE_SCHEDULED_DISPATCH_ORDER_SCHEDULE_INDEX : STR_EMPTY); + SetDParam(0, v->orders->GetScheduledDispatchScheduleCount() > 1 ? STR_TIMETABLE_SCHEDULED_DISPATCH_ORDER_SCHEDULE_INDEX : STR_EMPTY); SetDParam(1, order->GetDispatchScheduleIndex() + 1); edge = DrawString(rtl ? left : edge + 3, rtl ? edge - 3 : right, y, str, colour); } diff --git a/src/saveload/afterload.cpp b/src/saveload/afterload.cpp index 3e299e08a0..458f894ec0 100644 --- a/src/saveload/afterload.cpp +++ b/src/saveload/afterload.cpp @@ -2037,9 +2037,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 63758d4ff9..8a46806060 100644 --- a/src/saveload/oldloader_sl.cpp +++ b/src/saveload/oldloader_sl.cpp @@ -1336,7 +1336,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 b3cfa16775..4c99988710 100644 --- a/src/saveload/vehicle_sl.cpp +++ b/src/saveload/vehicle_sl.cpp @@ -272,26 +272,26 @@ void AfterLoadVehicles(bool part_of_load) for (Vehicle *v : Vehicle::Iterate()) { si_v = v; - 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); } } } @@ -313,13 +313,13 @@ void AfterLoadVehicles(bool part_of_load) /* Before 105 there was no order for shared orders, thus it messed up horribly */ for (Vehicle *v : Vehicle::Iterate()) { si_v = v; - 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/schdispatch_cmd.cpp b/src/schdispatch_cmd.cpp index ef4042dca9..42ab0075e5 100644 --- a/src/schdispatch_cmd.cpp +++ b/src/schdispatch_cmd.cpp @@ -86,15 +86,15 @@ CommandCost CmdScheduledDispatchAdd(TileIndex tile, DoCommandFlag flags, uint32 CommandCost ret = CheckOwnership(v->owner); if (ret.Failed()) return ret; - if (v->orders.list == nullptr) return CMD_ERROR; + if (v->orders == nullptr) return CMD_ERROR; - if (schedule_index >= v->orders.list->GetScheduledDispatchScheduleCount()) return CMD_ERROR; + if (schedule_index >= v->orders->GetScheduledDispatchScheduleCount()) return CMD_ERROR; if (extra_slots > 512) return_cmd_error(STR_ERROR_SCHDISPATCH_TRIED_TO_ADD_TOO_MANY_SLOTS); if (extra_slots > 0 && offset == 0) return CMD_ERROR; if (flags & DC_EXEC) { - DispatchSchedule &ds = v->orders.list->GetDispatchScheduleByIndex(schedule_index); + DispatchSchedule &ds = v->orders->GetDispatchScheduleByIndex(schedule_index); ds.AddScheduledDispatch(p2); for (uint i = 0; i < extra_slots; i++) { p2 += offset; @@ -126,12 +126,12 @@ CommandCost CmdScheduledDispatchRemove(TileIndex tile, DoCommandFlag flags, uint CommandCost ret = CheckOwnership(v->owner); if (ret.Failed()) return ret; - if (v->orders.list == nullptr) return CMD_ERROR; + if (v->orders == nullptr) return CMD_ERROR; - if (schedule_index >= v->orders.list->GetScheduledDispatchScheduleCount()) return CMD_ERROR; + if (schedule_index >= v->orders->GetScheduledDispatchScheduleCount()) return CMD_ERROR; if (flags & DC_EXEC) { - v->orders.list->GetDispatchScheduleByIndex(schedule_index).RemoveScheduledDispatch(p2); + v->orders->GetDispatchScheduleByIndex(schedule_index).RemoveScheduledDispatch(p2); SetTimetableWindowsDirty(v, true); } @@ -159,12 +159,12 @@ CommandCost CmdScheduledDispatchSetDuration(TileIndex tile, DoCommandFlag flags, CommandCost ret = CheckOwnership(v->owner); if (ret.Failed()) return ret; - if (v->orders.list == nullptr) return CMD_ERROR; + if (v->orders == nullptr) return CMD_ERROR; - if (schedule_index >= v->orders.list->GetScheduledDispatchScheduleCount()) return CMD_ERROR; + if (schedule_index >= v->orders->GetScheduledDispatchScheduleCount()) return CMD_ERROR; if (flags & DC_EXEC) { - DispatchSchedule &ds = v->orders.list->GetDispatchScheduleByIndex(schedule_index); + DispatchSchedule &ds = v->orders->GetDispatchScheduleByIndex(schedule_index); ds.SetScheduledDispatchDuration(p2); ds.UpdateScheduledDispatch(nullptr); SetTimetableWindowsDirty(v, true); @@ -196,15 +196,15 @@ CommandCost CmdScheduledDispatchSetStartDate(TileIndex tile, DoCommandFlag flags CommandCost ret = CheckOwnership(v->owner); if (ret.Failed()) return ret; - if (v->orders.list == nullptr) return CMD_ERROR; + if (v->orders == nullptr) return CMD_ERROR; - if (schedule_index >= v->orders.list->GetScheduledDispatchScheduleCount()) return CMD_ERROR; + if (schedule_index >= v->orders->GetScheduledDispatchScheduleCount()) return CMD_ERROR; int32 date = (int32)p2; uint16 full_date_fract = GB(p3, 0, 16); if (flags & DC_EXEC) { - DispatchSchedule &ds = v->orders.list->GetDispatchScheduleByIndex(schedule_index); + DispatchSchedule &ds = v->orders->GetDispatchScheduleByIndex(schedule_index); ds.SetScheduledDispatchStartDate(date, full_date_fract); ds.UpdateScheduledDispatch(nullptr); SetTimetableWindowsDirty(v, true); @@ -234,12 +234,12 @@ CommandCost CmdScheduledDispatchSetDelay(TileIndex tile, DoCommandFlag flags, ui CommandCost ret = CheckOwnership(v->owner); if (ret.Failed()) return ret; - if (v->orders.list == nullptr) return CMD_ERROR; + if (v->orders == nullptr) return CMD_ERROR; - if (schedule_index >= v->orders.list->GetScheduledDispatchScheduleCount()) return CMD_ERROR; + if (schedule_index >= v->orders->GetScheduledDispatchScheduleCount()) return CMD_ERROR; if (flags & DC_EXEC) { - v->orders.list->GetDispatchScheduleByIndex(schedule_index).SetScheduledDispatchDelay(p2); + v->orders->GetDispatchScheduleByIndex(schedule_index).SetScheduledDispatchDelay(p2); SetTimetableWindowsDirty(v, true); } @@ -272,12 +272,12 @@ CommandCost CmdScheduledDispatchResetLastDispatch(TileIndex tile, DoCommandFlag CommandCost ret = CheckOwnership(v->owner); if (ret.Failed()) return ret; - if (v->orders.list == nullptr) return CMD_ERROR; + if (v->orders == nullptr) return CMD_ERROR; - if (schedule_index >= v->orders.list->GetScheduledDispatchScheduleCount()) return CMD_ERROR; + if (schedule_index >= v->orders->GetScheduledDispatchScheduleCount()) return CMD_ERROR; if (flags & DC_EXEC) { - v->orders.list->GetDispatchScheduleByIndex(schedule_index).SetScheduledDispatchLastDispatch(0); + v->orders->GetDispatchScheduleByIndex(schedule_index).SetScheduledDispatchLastDispatch(0); SetTimetableWindowsDirty(v, true); } @@ -305,12 +305,12 @@ CommandCost CmdScheduledDispatchClear(TileIndex tile, DoCommandFlag flags, uint3 CommandCost ret = CheckOwnership(v->owner); if (ret.Failed()) return ret; - if (v->orders.list == nullptr) return CMD_ERROR; + if (v->orders == nullptr) return CMD_ERROR; - if (schedule_index >= v->orders.list->GetScheduledDispatchScheduleCount()) return CMD_ERROR; + if (schedule_index >= v->orders->GetScheduledDispatchScheduleCount()) return CMD_ERROR; if (flags & DC_EXEC) { - v->orders.list->GetDispatchScheduleByIndex(schedule_index).ClearScheduledDispatch(); + v->orders->GetDispatchScheduleByIndex(schedule_index).ClearScheduledDispatch(); SetTimetableWindowsDirty(v, true); } @@ -340,15 +340,15 @@ CommandCost CmdScheduledDispatchAddNewSchedule(TileIndex tile, DoCommandFlag fla CommandCost ret = CheckOwnership(v->owner); if (ret.Failed()) return ret; - if (v->orders.list == nullptr) return CMD_ERROR; - if (v->orders.list->GetScheduledDispatchScheduleCount() >= 4096) return CMD_ERROR; + if (v->orders == nullptr) return CMD_ERROR; + if (v->orders->GetScheduledDispatchScheduleCount() >= 4096) return CMD_ERROR; int32 date = GB(p3, 0, 32); uint16 full_date_fract = GB(p3, 32, 16); if (flags & DC_EXEC) { - v->orders.list->GetScheduledDispatchScheduleSet().emplace_back(); - DispatchSchedule &ds = v->orders.list->GetScheduledDispatchScheduleSet().back(); + v->orders->GetScheduledDispatchScheduleSet().emplace_back(); + DispatchSchedule &ds = v->orders->GetScheduledDispatchScheduleSet().back(); ds.SetScheduledDispatchDuration(p2); ds.SetScheduledDispatchStartDate(date, full_date_fract); ds.UpdateScheduledDispatch(nullptr); @@ -379,12 +379,12 @@ CommandCost CmdScheduledDispatchRemoveSchedule(TileIndex tile, DoCommandFlag fla CommandCost ret = CheckOwnership(v->owner); if (ret.Failed()) return ret; - if (v->orders.list == nullptr) return CMD_ERROR; + if (v->orders == nullptr) return CMD_ERROR; - if (schedule_index >= v->orders.list->GetScheduledDispatchScheduleCount()) return CMD_ERROR; + if (schedule_index >= v->orders->GetScheduledDispatchScheduleCount()) return CMD_ERROR; if (flags & DC_EXEC) { - std::vector &scheds = v->orders.list->GetScheduledDispatchScheduleSet(); + std::vector &scheds = v->orders->GetScheduledDispatchScheduleSet(); scheds.erase(scheds.begin() + schedule_index); for (Order *o = v->GetFirstOrder(); o != nullptr; o = o->next) { int idx = o->GetDispatchScheduleIndex(); diff --git a/src/schdispatch_gui.cpp b/src/schdispatch_gui.cpp index 98addf0b09..bfa2553feb 100644 --- a/src/schdispatch_gui.cpp +++ b/src/schdispatch_gui.cpp @@ -89,9 +89,9 @@ static void ScheduleAddIntl(uint32 p1, DateTicksScaled date, uint extra_slots, u VehicleID veh = GB(p1, 0, 20); uint schedule_index = GB(p1, 20, 12); Vehicle *v = Vehicle::GetIfValid(veh); - if (v == nullptr || !v->IsPrimaryVehicle() || schedule_index >= v->orders.list->GetScheduledDispatchScheduleCount()) return; + if (v == nullptr || !v->IsPrimaryVehicle() || schedule_index >= v->orders->GetScheduledDispatchScheduleCount()) return; - const DispatchSchedule &ds = v->orders.list->GetDispatchScheduleByIndex(schedule_index); + const DispatchSchedule &ds = v->orders->GetDispatchScheduleByIndex(schedule_index); /* Make sure the time is the closest future to the timetable start */ DateTicksScaled start_tick = ds.GetScheduledDispatchStartTick(); @@ -227,14 +227,14 @@ struct SchdispatchWindow : GeneralVehicleWindow { bool IsScheduleSelected() const { - return this->vehicle->orders.list != nullptr && this->schedule_index >= 0 && (uint)this->schedule_index < this->vehicle->orders.list->GetScheduledDispatchScheduleCount(); + return this->vehicle->orders != nullptr && this->schedule_index >= 0 && (uint)this->schedule_index < this->vehicle->orders->GetScheduledDispatchScheduleCount(); } void AutoSelectSchedule() { if (!this->IsScheduleSelected()) { - if (this->vehicle->orders.list != nullptr && this->vehicle->orders.list->GetScheduledDispatchScheduleCount() > 0) { - this->schedule_index = Clamp(this->schedule_index, 0, this->vehicle->orders.list->GetScheduledDispatchScheduleCount() - 1); + if (this->vehicle->orders != nullptr && this->vehicle->orders->GetScheduledDispatchScheduleCount() > 0) { + this->schedule_index = Clamp(this->schedule_index, 0, this->vehicle->orders->GetScheduledDispatchScheduleCount() - 1); } else { this->schedule_index = -1; } @@ -243,7 +243,7 @@ struct SchdispatchWindow : GeneralVehicleWindow { const DispatchSchedule &GetSelectedSchedule() const { - return this->vehicle->orders.list->GetDispatchScheduleByIndex(this->schedule_index); + return this->vehicle->orders->GetDispatchScheduleByIndex(this->schedule_index); } virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override @@ -319,13 +319,13 @@ struct SchdispatchWindow : GeneralVehicleWindow { const Vehicle *v = this->vehicle; CountItem(); - bool unusable = (v->owner != _local_company) || (v->orders.list == nullptr); + bool unusable = (v->owner != _local_company) || (v->orders == nullptr); this->SetWidgetDisabledState(WID_SCHDISPATCH_ENABLED, unusable || HasBit(v->vehicle_flags, VF_TIMETABLE_SEPARATION)); - this->SetWidgetDisabledState(WID_SCHDISPATCH_PREV, v->orders.list == nullptr || this->schedule_index <= 0); - this->SetWidgetDisabledState(WID_SCHDISPATCH_NEXT, v->orders.list == nullptr || this->schedule_index >= (int)(v->orders.list->GetScheduledDispatchScheduleCount() - 1)); - this->SetWidgetDisabledState(WID_SCHDISPATCH_ADD_SCHEDULE, unusable || v->orders.list->GetScheduledDispatchScheduleCount() >= 4096); + this->SetWidgetDisabledState(WID_SCHDISPATCH_PREV, v->orders == nullptr || this->schedule_index <= 0); + this->SetWidgetDisabledState(WID_SCHDISPATCH_NEXT, v->orders == nullptr || this->schedule_index >= (int)(v->orders->GetScheduledDispatchScheduleCount() - 1)); + this->SetWidgetDisabledState(WID_SCHDISPATCH_ADD_SCHEDULE, unusable || v->orders->GetScheduledDispatchScheduleCount() >= 4096); bool disabled = unusable || !HasBit(v->vehicle_flags, VF_SCHEDULED_DISPATCH) || !this->IsScheduleSelected(); this->SetWidgetDisabledState(WID_SCHDISPATCH_ADD, disabled); @@ -351,7 +351,7 @@ struct SchdispatchWindow : GeneralVehicleWindow { if (this->IsScheduleSelected()) { SetDParam(0, STR_SCHDISPATCH_SCHEDULE_ID); SetDParam(1, this->schedule_index + 1); - SetDParam(2, this->vehicle->orders.list->GetScheduledDispatchScheduleCount()); + SetDParam(2, this->vehicle->orders->GetScheduledDispatchScheduleCount()); } else { SetDParam(0, STR_SCHDISPATCH_NO_SCHEDULES); } @@ -549,7 +549,7 @@ struct SchdispatchWindow : GeneralVehicleWindow { y += FONT_HEIGHT_NORMAL; if (!have_conditional) { - const int required_vehicle = CalculateMaxRequiredVehicle(v->orders.list->GetTimetableTotalDuration(), ds.GetScheduledDispatchDuration(), ds.GetScheduledDispatch()); + const int required_vehicle = CalculateMaxRequiredVehicle(v->orders->GetTimetableTotalDuration(), ds.GetScheduledDispatchDuration(), ds.GetScheduledDispatch()); if (required_vehicle > 0) { SetDParam(0, required_vehicle); DrawString(r.left + WD_FRAMERECT_LEFT, r.right - WD_FRAMERECT_RIGHT, y, STR_SCHDISPATCH_SUMMARY_L1); @@ -657,7 +657,7 @@ struct SchdispatchWindow : GeneralVehicleWindow { if (!HasBit(v->vehicle_flags, VF_SCHEDULED_DISPATCH)) SetBit(p2, 0); DoCommandP(0, v->index, p2, CMD_SCHEDULED_DISPATCH | CMD_MSG(STR_ERROR_CAN_T_TIMETABLE_VEHICLE)); - if (HasBit(p2, 0) && this->vehicle->orders.list != nullptr && this->vehicle->orders.list->GetScheduledDispatchScheduleCount() == 0) { + if (HasBit(p2, 0) && this->vehicle->orders != nullptr && this->vehicle->orders->GetScheduledDispatchScheduleCount() == 0) { AddNewScheduledDispatchSchedule(v->index); } break; @@ -729,7 +729,7 @@ struct SchdispatchWindow : GeneralVehicleWindow { case WID_SCHDISPATCH_NEXT: if (!this->IsScheduleSelected()) break; - if (this->schedule_index < (int)(this->vehicle->orders.list->GetScheduledDispatchScheduleCount() - 1)) this->schedule_index++; + if (this->schedule_index < (int)(this->vehicle->orders->GetScheduledDispatchScheduleCount() - 1)) this->schedule_index++; this->ReInit(); break; diff --git a/src/script/api/script_order.cpp b/src/script/api/script_order.cpp index 70e2daded2..ae34b68fbd 100644 --- a/src/script/api/script_order.cpp +++ b/src/script/api/script_order.cpp @@ -90,7 +90,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 f46b2759d9..223c627667 100644 --- a/src/script/api/script_vehicle.cpp +++ b/src/script/api/script_vehicle.cpp @@ -453,7 +453,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/station.cpp b/src/station.cpp index 7b15893e33..01d6c3ad4b 100644 --- a/src/station.cpp +++ b/src/station.cpp @@ -408,12 +408,24 @@ bool Station::IsWithinRangeOfDockingTile(TileIndex tile, uint max_distance) cons /** * 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) { + this->industries_near.erase(pos); + this->industries_near.insert(IndustryListEntry{distance, ind}); + } + return; + } /* Include only industries that can accept cargo */ uint cargo_index; @@ -422,9 +434,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. */ @@ -474,11 +498,11 @@ void Station::RecomputeCatchment(bool no_clear_nearby_lists) } /* 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}); /* Loop finding all station tiles */ TileArea ta(TileXY(this->rect.left, this->rect.top), TileXY(this->rect.right, this->rect.bottom)); @@ -524,7 +548,7 @@ void Station::RecomputeCatchment(bool no_clear_nearby_lists) 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 8849418588..f82af82b66 100644 --- a/src/station_base.h +++ b/src/station_base.h @@ -784,11 +784,19 @@ private: } }; +struct IndustryListEntry { + uint distance; + Industry *industry; + + bool operator==(const IndustryListEntry &other) const { return this->distance == other.distance && this->industry == other.industry; } + bool operator!=(const IndustryListEntry &other) const { return !(*this == other); } +}; + struct IndustryCompare { - bool operator() (const Industry *lhs, const Industry *rhs) const; + bool operator() (const IndustryListEntry &lhs, const IndustryListEntry &rhs) const; }; -typedef btree::btree_set IndustryList; +typedef btree::btree_set IndustryList; /** Station data structure */ struct Station FINAL : SpecializedStation { @@ -860,7 +868,8 @@ public: } 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 371503a819..9ab9869c61 100644 --- a/src/subsidy.cpp +++ b/src/subsidy.cpp @@ -609,9 +609,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); } diff --git a/src/table/newgrf_debug_data.h b/src/table/newgrf_debug_data.h index 1558f13873..2e105b8a8f 100644 --- a/src/table/newgrf_debug_data.h +++ b/src/table/newgrf_debug_data.h @@ -1264,8 +1264,8 @@ class NIHStationStruct : public NIHelper { } seprintf(buffer, lastof(buffer), " Nearby industries: %u", (uint) st->industries_near.size()); output.print(buffer); - for (const Industry *ind : st->industries_near) { - seprintf(buffer, lastof(buffer), " %u: %s", ind->index, ind->GetCachedName()); + for (const auto &i : st->industries_near) { + seprintf(buffer, lastof(buffer), " %u: %s, distance: %u", i.industry->index, i.industry->GetCachedName(), i.distance); output.print(buffer); } seprintf(buffer, lastof(buffer), " Station tiles: %u", st->station_tiles); diff --git a/src/timetable_cmd.cpp b/src/timetable_cmd.cpp index b2910d87de..7b1ec528a0 100644 --- a/src/timetable_cmd.cpp +++ b/src/timetable_cmd.cpp @@ -99,8 +99,8 @@ static void ChangeTimetable(Vehicle *v, VehicleOrderID order_number, uint32 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); SetTimetableWindowsDirty(v, mtf == MTF_ASSIGN_SCHEDULE); @@ -219,7 +219,7 @@ CommandCost CmdChangeTimetable(TileIndex tile, DoCommandFlag flags, uint32 p1, u case MTF_ASSIGN_SCHEDULE: dispatch_index = (int)p2; - if (dispatch_index < -1 || dispatch_index >= (int)v->orders.list->GetScheduledDispatchScheduleCount()) return CMD_ERROR; + if (dispatch_index < -1 || dispatch_index >= (int)v->orders->GetScheduledDispatchScheduleCount()) return CMD_ERROR; break; default: @@ -382,7 +382,7 @@ CommandCost CmdSetVehicleOnTime(TileIndex tile, DoCommandFlag flags, uint32 p1, VehicleID veh = GB(p1, 0, 20); 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; @@ -453,12 +453,12 @@ CommandCost CmdSetTimetableStart(TileIndex tile, DoCommandFlag flags, uint32 p1, bool timetable_all = HasBit(p1, 20); Vehicle *v = Vehicle::GetIfValid(GB(p1, 0, 20)); uint16 sub_ticks = GB(p1, 21, 11); - 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; - if (timetable_all && !v->orders.list->IsCompleteTimetable()) return CMD_ERROR; + if (timetable_all && !v->orders->IsCompleteTimetable()) return CMD_ERROR; const DateTicksScaled now = _scaled_date_ticks; DateTicksScaled start_date_scaled = (_settings_game.economy.day_length_factor * (((DateTicksScaled)_date * DAY_TICKS) + _date_fract + (DateTicksScaled)(int32)p2)) + sub_ticks; @@ -467,7 +467,7 @@ CommandCost CmdSetTimetableStart(TileIndex tile, DoCommandFlag flags, uint32 p1, 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); } SetTimetableWindowsDirty(v); @@ -476,7 +476,7 @@ CommandCost CmdSetTimetableStart(TileIndex tile, DoCommandFlag flags, uint32 p1, SetWindowDirty(WC_VEHICLE_TIMETABLE, v->index); } - int total_duration = v->orders.list->GetTimetableTotalDuration(); + int total_duration = v->orders->GetTimetableTotalDuration(); int num_vehs = (uint)vehs.size(); if (num_vehs >= 2) { @@ -522,7 +522,7 @@ CommandCost CmdAutofillTimetable(TileIndex tile, DoCommandFlag flags, uint32 p1, VehicleID veh = GB(p1, 0, 20); 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; @@ -612,7 +612,7 @@ CommandCost CmdAutomateTimetable(TileIndex index, DoCommandFlag flags, uint32 p1 } SetTimetableWindowsDirty(v); if (!HasBit(p2, 0) && !HasBit(p2, 1)) { - OrderList *orders = v->orders.list; + OrderList *orders = v->orders; if (orders != nullptr) { for (int i = 0; i < orders->GetNumOrders(); i++) { ChangeTimetable(v, i, 0, MTF_WAIT_TIME, false); @@ -734,7 +734,7 @@ void UpdateSeparationOrder(Vehicle *v_start) std::vector progress_array = PopulateSeparationState(v_start); if (progress_array.size() < 2) return; - const uint duration = v_start->orders.list->GetTotalDuration(); + const uint duration = v_start->orders->GetTotalDuration(); Vehicle *v = Vehicle::Get(progress_array.back().id); Vehicle *v_ahead = Vehicle::Get(progress_array.front().id); uint behind_index = (uint)progress_array.size() - 1; @@ -844,7 +844,7 @@ void UpdateVehicleTimetable(Vehicle *v, bool travelling) if (HasBit(v->vehicle_flags, VF_SCHEDULED_DISPATCH) && v->cur_implicit_order_index != INVALID_VEH_ORDER_ID) { Order *real_implicit_order = v->GetOrder(v->cur_implicit_order_index); if (real_implicit_order->IsScheduledDispatchOrder(true) && travelling) { - DispatchSchedule &ds = v->orders.list->GetDispatchScheduleByIndex(real_implicit_order->GetDispatchScheduleIndex()); + DispatchSchedule &ds = v->orders->GetDispatchScheduleByIndex(real_implicit_order->GetDispatchScheduleIndex()); /* Update scheduled information */ ds.UpdateScheduledDispatch(v); @@ -1029,7 +1029,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 554956c530..91257ab44c 100644 --- a/src/timetable_gui.cpp +++ b/src/timetable_gui.cpp @@ -195,7 +195,7 @@ static void FillTimetableArrivalDepartureTable(const Vehicle *v, VehicleOrderID if (order->IsScheduledDispatchOrder(true) && !(i == start && !travelling)) { if (!no_offset) sum -= v->lateness_counter; extern DateTicksScaled GetScheduledDispatchTime(const DispatchSchedule &ds, DateTicksScaled leave_time); - DispatchSchedule &ds = v->orders.list->GetDispatchScheduleByIndex(order->GetDispatchScheduleIndex()); + DispatchSchedule &ds = v->orders->GetDispatchScheduleByIndex(order->GetDispatchScheduleIndex()); DispatchSchedule predicted_ds; predicted_ds.BorrowSchedule(ds); predicted_ds.UpdateScheduledDispatchToDate(_scaled_date_ticks + sum); @@ -221,7 +221,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); @@ -260,7 +260,7 @@ static void ChangeTimetableStartCallback(const Window *w, DateTicksScaled date) void ProcessTimetableWarnings(const Vehicle *v, std::function handler) { - Ticks total_time = v->orders.list != nullptr ? v->orders.list->GetTimetableDurationIncomplete() : 0; + Ticks total_time = v->orders != nullptr ? v->orders->GetTimetableDurationIncomplete() : 0; bool have_conditional = false; bool have_missing_wait = false; @@ -313,9 +313,9 @@ void ProcessTimetableWarnings(const Vehicle *v, std::functionvehicle_flags, VF_AUTOFILL_TIMETABLE)) handler(STR_TIMETABLE_WARNING_AUTOFILL_CONDITIONAL, true); if (total_time && have_non_timetabled_conditional_branch) handler(STR_TIMETABLE_NON_TIMETABLED_BRANCH, false); - if (HasBit(v->vehicle_flags, VF_SCHEDULED_DISPATCH) && v->orders.list != nullptr) { + if (HasBit(v->vehicle_flags, VF_SCHEDULED_DISPATCH) && v->orders != nullptr) { auto sd_warning = [&](int schedule_index, StringID str) { - if (v->orders.list->GetScheduledDispatchScheduleCount() > 1) { + if (v->orders->GetScheduledDispatchScheduleCount() > 1) { SetDParam(0, schedule_index + 1); SetDParam(1, str); handler(STR_TIMETABLE_WARNING_SCHEDULE_ID, true); @@ -323,7 +323,7 @@ void ProcessTimetableWarnings(const Vehicle *v, std::function seen_sched_dispatch_orders(v->orders.list->GetScheduledDispatchScheduleCount()); + std::vector seen_sched_dispatch_orders(v->orders->GetScheduledDispatchScheduleCount()); for (int n = 0; n < v->GetNumOrders(); n++) { const Order *order = v->GetOrder(n); @@ -574,9 +574,9 @@ struct TimetableWindow : GeneralVehicleWindow { this->SetWidgetDisabledState(WID_VT_CLEAR_SPEED, disable_speed); this->SetWidgetDisabledState(WID_VT_SHARED_ORDER_LIST, !(v->IsOrderListShared() || _settings_client.gui.enable_single_veh_shared_order_gui)); - this->SetWidgetDisabledState(WID_VT_START_DATE, v->orders.list == nullptr || HasBit(v->vehicle_flags, VF_TIMETABLE_SEPARATION) || HasBit(v->vehicle_flags, VF_SCHEDULED_DISPATCH)); - this->SetWidgetDisabledState(WID_VT_RESET_LATENESS, v->orders.list == nullptr); - this->SetWidgetDisabledState(WID_VT_AUTOFILL, v->orders.list == nullptr || HasBit(v->vehicle_flags, VF_AUTOMATE_TIMETABLE)); + this->SetWidgetDisabledState(WID_VT_START_DATE, v->orders == nullptr || HasBit(v->vehicle_flags, VF_TIMETABLE_SEPARATION) || HasBit(v->vehicle_flags, VF_SCHEDULED_DISPATCH)); + this->SetWidgetDisabledState(WID_VT_RESET_LATENESS, v->orders == nullptr); + this->SetWidgetDisabledState(WID_VT_AUTOFILL, v->orders == nullptr || HasBit(v->vehicle_flags, VF_AUTOMATE_TIMETABLE)); this->SetWidgetDisabledState(WID_VT_AUTO_SEPARATION, HasBit(v->vehicle_flags, VF_SCHEDULED_DISPATCH)); this->EnableWidget(WID_VT_AUTOMATE); this->EnableWidget(WID_VT_ADD_VEH_GROUP); @@ -607,7 +607,7 @@ struct TimetableWindow : GeneralVehicleWindow { this->SetWidgetLoweredState(WID_VT_SCHEDULED_DISPATCH, HasBit(v->vehicle_flags, VF_SCHEDULED_DISPATCH)); this->SetWidgetLoweredState(WID_VT_SCHEDULED_DISPATCH, HasBit(v->vehicle_flags, VF_SCHEDULED_DISPATCH)); - this->SetWidgetDisabledState(WID_VT_SCHEDULED_DISPATCH, v->orders.list == nullptr); + this->SetWidgetDisabledState(WID_VT_SCHEDULED_DISPATCH, v->orders == nullptr); this->GetWidget(WID_VT_START_DATE_SELECTION)->SetDisplayedPlane(HasBit(v->vehicle_flags, VF_SCHEDULED_DISPATCH) ? 1 : 0); this->DrawWidgets(); @@ -743,7 +743,7 @@ struct TimetableWindow : GeneralVehicleWindow { * 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()); @@ -796,10 +796,10 @@ struct TimetableWindow : GeneralVehicleWindow { 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, 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; @@ -910,7 +910,7 @@ struct TimetableWindow : GeneralVehicleWindow { case WID_VT_START_DATE: // Change the date that the timetable starts. if (_settings_time.time_in_minutes && _settings_client.gui.timetable_start_text_entry) { - this->set_start_date_all = v->orders.list->IsCompleteTimetable() && _ctrl_pressed; + this->set_start_date_all = v->orders->IsCompleteTimetable() && _ctrl_pressed; StringID str = STR_JUST_INT; uint64 time = _scaled_date_ticks; time /= _settings_time.ticks_per_minute; @@ -920,7 +920,7 @@ struct TimetableWindow : GeneralVehicleWindow { SetDParam(0, time); ShowQueryString(str, STR_TIMETABLE_STARTING_DATE, 31, this, CS_NUMERAL, QSF_ACCEPT_UNCHANGED); } else { - ShowSetDateWindow(this, v->index | (v->orders.list->IsCompleteTimetable() && _ctrl_pressed ? 1U << 20 : 0), + ShowSetDateWindow(this, v->index | (v->orders->IsCompleteTimetable() && _ctrl_pressed ? 1U << 20 : 0), _scaled_date_ticks, _cur_year, _cur_year + 15, ChangeTimetableStartCallback); } break; @@ -1065,7 +1065,7 @@ struct TimetableWindow : GeneralVehicleWindow { DropDownList list; list.emplace_back(new DropDownListStringItem(STR_TIMETABLE_ASSIGN_SCHEDULE_NONE, -1, false)); - for (uint i = 0; i < v->orders.list->GetScheduledDispatchScheduleCount(); i++) { + for (uint i = 0; i < v->orders->GetScheduledDispatchScheduleCount(); i++) { DropDownListParamStringItem *item = new DropDownListParamStringItem(STR_TIMETABLE_ASSIGN_SCHEDULE_ID, i, false); item->SetParam(0, i + 1); list.emplace_back(item); diff --git a/src/tracerestrict.cpp b/src/tracerestrict.cpp index 40e0d8a399..052532ce99 100644 --- a/src/tracerestrict.cpp +++ b/src/tracerestrict.cpp @@ -288,11 +288,11 @@ void TraceRestrictProgram::Execute(const Train* v, const TraceRestrictProgramInp break; case TRIT_COND_NEXT_ORDER: { - if (v->orders.list == nullptr) break; - if (v->orders.list->GetNumOrders() == 0) break; + if (v->orders == nullptr) break; + if (v->orders->GetNumOrders() == 0) break; const Order *current_order = v->GetOrder(v->cur_real_order_index); - for (const Order *order = v->orders.list->GetNext(current_order); order != current_order; order = v->orders.list->GetNext(order)) { + for (const Order *order = v->orders->GetNext(current_order); order != current_order; order = v->orders->GetNext(order)) { if (order->IsGotoOrder()) { result = TestOrderCondition(order, item); break; diff --git a/src/train_cmd.cpp b/src/train_cmd.cpp index efe34e32b2..163fa50c56 100644 --- a/src/train_cmd.cpp +++ b/src/train_cmd.cpp @@ -2247,7 +2247,7 @@ CommandCost CmdSellRailWagon(DoCommandFlag flags, Vehicle *t, uint16 data, uint3 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); @@ -2264,7 +2264,7 @@ CommandCost CmdSellRailWagon(DoCommandFlag flags, Vehicle *t, uint16 data, uint3 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 1684ecf68c..f55e4e5859 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -3219,7 +3219,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; @@ -3257,7 +3257,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(); @@ -4057,10 +4057,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; @@ -4070,7 +4070,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); } /** @@ -4083,7 +4083,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. */ @@ -4093,9 +4093,9 @@ void Vehicle::RemoveFromShared() if (this->next_shared != nullptr) this->next_shared->previous_shared = this->previous_shared; - if (this->orders.list->GetNumVehicles() == 1) InvalidateVehicleOrder(this->FirstShared(), VIWD_MODIFY_ORDERS); + if (this->orders->GetNumVehicles() == 1) InvalidateVehicleOrder(this->FirstShared(), VIWD_MODIFY_ORDERS); - if (this->orders.list->GetNumVehicles() == 1 && !_settings_client.gui.enable_single_veh_shared_order_gui) { + if (this->orders->GetNumVehicles() == 1 && !_settings_client.gui.enable_single_veh_shared_order_gui) { /* When there is only one vehicle, remove the shared order list window. */ DeleteWindowById(GetWindowClassForVehicleType(this->type), vli.Pack()); } else if (were_first) { diff --git a/src/vehicle_base.h b/src/vehicle_base.h index 0aafaa68df..5543add254 100644 --- a/src/vehicle_base.h +++ b/src/vehicle_base.h @@ -368,9 +368,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 @@ -746,7 +746,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(); } /** * Clears this vehicle's separation status @@ -772,25 +772,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. @@ -799,7 +799,7 @@ public: inline CargoStationIDStackSet GetNextStoppingStation() const { CargoStationIDStackSet set; - if (this->orders.list != nullptr) set.FillNextStoppingStation(this, this->orders.list); + if (this->orders != nullptr) set.FillNextStoppingStation(this, this->orders); return set; } @@ -810,7 +810,7 @@ public: inline StationIDStack GetNextStoppingStationCargoIndependent() const { StationIDStack set; - if (this->orders.list != nullptr) set = this->orders.list->GetNextStoppingStation(this, 0).station; + if (this->orders != nullptr) set = this->orders->GetNextStoppingStation(this, 0).station; return set; } @@ -1003,7 +1003,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); } /** @@ -1013,7 +1013,7 @@ public: */ inline VehicleOrderID GetIndexOfOrder(const Order *order) const { - return (this->orders.list == nullptr) ? INVALID_VEH_ORDER_ID : this->orders.list->GetIndexOfOrder(order); + return (this->orders == nullptr) ? INVALID_VEH_ORDER_ID : this->orders->GetIndexOfOrder(order); } /** @@ -1022,7 +1022,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; @@ -1199,7 +1199,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); } }; inline bool IsPointInViewportVehicleRedrawArea(const std::vector &viewport_redraw_rects, const Point &pt) diff --git a/src/vehicle_cmd.cpp b/src/vehicle_cmd.cpp index 4accdac79e..41b87c0537 100644 --- a/src/vehicle_cmd.cpp +++ b/src/vehicle_cmd.cpp @@ -236,9 +236,9 @@ CommandCost CmdSellVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3 /* Can we actually make the order backup, i.e. are there enough orders? */ if (p1 & MAKE_ORDER_BACKUP_FLAG && - 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. */ p1 &= ~MAKE_ORDER_BACKUP_FLAG; diff --git a/src/vehicle_gui.cpp b/src/vehicle_gui.cpp index e9d017f385..82cf4ff771 100644 --- a/src/vehicle_gui.cpp +++ b/src/vehicle_gui.cpp @@ -1759,7 +1759,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); @@ -4151,6 +4151,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; @@ -4186,10 +4187,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();