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
This commit is contained in:
@@ -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 = ©->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 IndustryCompare {
|
||||
bool operator() (const Industry *lhs, const Industry *rhs) const;
|
||||
struct IndustryListEntry {
|
||||
uint distance;
|
||||
Industry *industry;
|
||||
|
||||
bool operator==(const IndustryListEntry &other) const { return this->distance == other.distance && this->industry == other.industry; }
|
||||
bool operator!=(const IndustryListEntry &other) const { return !(*this == other); }
|
||||
};
|
||||
|
||||
typedef btree::btree_set<Industry *, IndustryCompare> IndustryList;
|
||||
struct IndustryCompare {
|
||||
bool operator() (const IndustryListEntry &lhs, const IndustryListEntry &rhs) const;
|
||||
};
|
||||
|
||||
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();
|
||||
|
Reference in New Issue
Block a user