Merge branch 'master' into jgrpp

# Conflicts:
#	src/economy.cpp
#	src/linkgraph/refresh.cpp
#	src/order_cmd.cpp
#	src/saveload/vehicle_sl.cpp
#	src/station.cpp
#	src/station_base.h
#	src/timetable_cmd.cpp
#	src/timetable_gui.cpp
#	src/vehicle.cpp
#	src/vehicle_base.h
#	src/vehicle_cmd.cpp
pull/375/head
Jonathan G Rennison 2 years ago
commit e5a421b65a

@ -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);

@ -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;
}

@ -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<uint32, std::vector<Departure*>> 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) {

@ -334,13 +334,13 @@ void ChangeOwnershipOfCompanyItems(Owner old_owner, Owner new_owner)
/* Sell all the shares that people have on this company */
Backup<CompanyID> 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 <class F>
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;

@ -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);
}

@ -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

@ -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}

@ -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

@ -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つの閉塞内に複数の列車が入ることを許容します。このタイプのパス信号は信号の背面から通過することはできません

@ -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

@ -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

@ -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

@ -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<uint>(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<uint>(64, this->vehicle->orders.list->GetNumOrders()) && skip_to != next) {
if (skip_to != nullptr && num_hops < std::min<uint>(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);

@ -525,8 +525,8 @@ struct MpsMachine {
Channel channels[16]; ///< playback status for each MIDI channel
std::vector<uint32> 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();

@ -67,9 +67,9 @@ OrderBackup::OrderBackup(const Vehicle *v, uint32 user)
tail = &copy->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. */

@ -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) {

@ -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<Ticks>(order->GetWaitTime()));
if (!order->IsType(OT_CONDITIONAL)) v->orders->UpdateTotalDuration(-static_cast<Ticks>(order->GetWaitTime()));
if (order->IsWaitTimetabled()) {
if (!order->IsType(OT_CONDITIONAL)) v->orders.list->UpdateTimetableDuration(-static_cast<Ticks>(order->GetTimetabledWait()));
if (!order->IsType(OT_CONDITIONAL)) v->orders->UpdateTimetableDuration(-static_cast<Ticks>(order->GetTimetabledWait()));
order->SetWaitTimetabled(false);
}
order->SetWaitTime(0);

@ -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);
}

@ -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();

@ -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));

@ -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;
}
}
}

@ -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<DispatchSchedule> &scheds = v->orders.list->GetScheduledDispatchScheduleSet();
std::vector<DispatchSchedule> &scheds = v->orders->GetScheduledDispatchScheduleSet();
scheds.erase(scheds.begin() + schedule_index);
for (Order *o = v->GetFirstOrder(); o != nullptr; o = o->next) {
int idx = o->GetDispatchScheduleIndex();

@ -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<int>(this->schedule_index, 0, this->vehicle->orders.list->GetScheduledDispatchScheduleCount() - 1);
if (this->vehicle->orders != nullptr && this->vehicle->orders->GetScheduledDispatchScheduleCount() > 0) {
this->schedule_index = Clamp<int>(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;

@ -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);

@ -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)

@ -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);
}
}
}

@ -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<Industry *, IndustryCompare> IndustryList;
typedef btree::btree_set<IndustryListEntry, IndustryCompare> IndustryList;
/** Station data structure */
struct Station FINAL : SpecializedStation<Station, false> {
@ -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

@ -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);
}

@ -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);

@ -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<Vehicle *> 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<TimetableProgress> 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;
}

@ -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<void(StringID, bool)> 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::function<void(StringID, boo
if (have_bad_full_load) handler(STR_TIMETABLE_WARNING_FULL_LOAD, true);
if (have_conditional && HasBit(v->vehicle_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<void(StringID, boo
handler(str, true);
}
};
std::vector<bool> seen_sched_dispatch_orders(v->orders.list->GetScheduledDispatchScheduleCount());
std::vector<bool> 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<NWidgetStacked>(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);

@ -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;

@ -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);

@ -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) {

@ -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<Rect> &viewport_redraw_rects, const Point &pt)

@ -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;

@ -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();

Loading…
Cancel
Save