tron@2186: /* $Id$ */ tron@2186: rubidium@10238: /** @file vehiclelist.cpp Lists of vehicles. */ belugas@6423: truelight@0: #include "stdafx.h" Darkvater@1891: #include "openttd.h" peter1138@9396: #include "vehicle_type.h" peter1138@9396: #include "vehicle_func.h" peter1138@9396: #include "vehicle_base.h" matthijs@1752: #include "vehicle_gui.h" peter1138@9348: #include "core/alloc_func.hpp" peter1138@9396: #include "train.h" peter1138@9396: #include "vehiclelist.h" bjarni@2244: peter1138@9348: /** peter1138@9348: * Generate a list of vehicles inside a depot. peter1138@9348: * @param type Type of vehicle peter1138@9348: * @param tile The tile the depot is located on peter1138@9348: * @param engines Pointer to list to add vehicles to peter1138@9348: * @param wagons Pointer to list to add wagons to (can be NULL) frosch@10193: * @param individual_wagons If true add every wagon to #wagons which is not attached to an engine. If false only add the first wagon of every row. peter1138@9348: */ frosch@10193: void BuildDepotVehicleList(VehicleType type, TileIndex tile, VehicleList *engines, VehicleList *wagons, bool individual_wagons) peter1138@9348: { peter1138@9348: engines->Clear(); peter1138@9348: if (wagons != NULL && wagons != engines) wagons->Clear(); peter1138@9348: peter1138@9348: const Vehicle *v; peter1138@9340: FOR_ALL_VEHICLES(v) { peter1138@9340: /* General tests for all vehicle types */ peter1138@9340: if (v->type != type) continue; peter1138@9340: if (v->tile != tile) continue; peter1138@9340: peter1138@9340: switch (type) { peter1138@9340: case VEH_TRAIN: frosch@10193: if (IsArticulatedPart(v) || IsRearDualheaded(v)) continue; peter1138@9340: if (v->u.rail.track != TRACK_BIT_DEPOT) continue; frosch@10193: if (wagons != NULL && IsFreeWagon(v->First())) { frosch@10193: if (individual_wagons || IsFreeWagon(v)) *wagons->Append() = v; peter1138@9340: continue; bjarni@4635: } peter1138@9340: break; peter1138@9340: peter1138@9340: default: peter1138@9340: if (!v->IsInDepot()) continue; peter1138@9340: break; peter1138@9340: } peter1138@9340: peter1138@9340: if (!v->IsPrimaryVehicle()) continue; peter1138@9340: peter1138@9348: *engines->Append() = v; bjarni@4635: } peter1138@9348: peter1138@9348: /* Ensure the lists are not wasting too much space. If the lists are fresh peter1138@9348: * (i.e. built within a command) then this will actually do nothing. */ peter1138@9348: engines->Compact(); peter1138@9348: if (wagons != NULL && wagons != engines) wagons->Compact(); bjarni@4635: } bjarni@4635: bjarni@4497: /** peter1138@9348: * Generate a list of vehicles based on window type. peter1138@9348: * @param list Pointer to list to add vehicles to peter1138@9348: * @param type Type of vehicle rubidium@10207: * @param owner Company to generate list for peter1138@9348: * @param index This parameter has different meanings depending on window_type peter1138@9348: * peter1138@9348: * @param window_type The type of window the list is for, using the VLW_ flags in vehicle_gui.h peter1138@9348: */ rubidium@10207: void GenerateVehicleSortList(VehicleList *list, VehicleType type, Owner owner, uint32 index, uint16 window_type) peter1138@9348: { peter1138@9348: list->Clear(); peter1138@9348: bjarni@4497: const Vehicle *v; bjarni@4497: bjarni@4497: switch (window_type) { peter1138@9348: case VLW_STATION_LIST: bjarni@4497: FOR_ALL_VEHICLES(v) { maedhros@6773: if (v->type == type && v->IsPrimaryVehicle()) { bjarni@4497: const Order *order; bjarni@4497: bjarni@4497: FOR_VEHICLE_ORDERS(v, order) { rubidium@8840: if (order->IsType(OT_GOTO_STATION) && order->GetDestination() == index) { peter1138@9348: *list->Append() = v; bjarni@4497: break; bjarni@4497: } bjarni@4497: } bjarni@4497: } bjarni@4497: } bjarni@4497: break; peter1138@9348: peter1138@9348: case VLW_SHARED_ORDERS: rubidium@9942: /* Add all vehicles from this vehicle's shared order list */ rubidium@9942: for (v = GetVehicle(index); v != NULL; v = v->NextShared()) { rubidium@9942: *list->Append() = v; bjarni@4497: } bjarni@4497: break; peter1138@9348: peter1138@9348: case VLW_STANDARD: bjarni@4497: FOR_ALL_VEHICLES(v) { maedhros@6773: if (v->type == type && v->owner == owner && v->IsPrimaryVehicle()) { peter1138@9348: *list->Append() = v; bjarni@4497: } bjarni@4497: } bjarni@4497: break; peter1138@9348: peter1138@9348: case VLW_DEPOT_LIST: bjarni@4681: FOR_ALL_VEHICLES(v) { maedhros@6773: if (v->type == type && v->IsPrimaryVehicle()) { bjarni@4681: const Order *order; bjarni@4681: bjarni@4681: FOR_VEHICLE_ORDERS(v, order) { rubidium@8840: if (order->IsType(OT_GOTO_DEPOT) && order->GetDestination() == index) { peter1138@9348: *list->Append() = v; bjarni@4681: break; bjarni@4681: } bjarni@4681: } bjarni@4681: } bjarni@4681: } bjarni@4681: break; bjarni@4681: belugas@9963: case VLW_WAYPOINT_LIST: belugas@9949: FOR_ALL_VEHICLES(v) { belugas@9949: if (v->type == type && v->IsPrimaryVehicle()) { belugas@9949: const Order *order; belugas@9949: belugas@9949: FOR_VEHICLE_ORDERS(v, order) { belugas@9949: if (order->IsType(OT_GOTO_WAYPOINT) && order->GetDestination() == index) { belugas@9949: *list->Append() = v; belugas@9949: break; belugas@9949: } belugas@9949: } belugas@9949: } belugas@9949: } belugas@9949: break; belugas@9949: rubidium@8970: case VLW_GROUP_LIST: rubidium@6643: FOR_ALL_VEHICLES(v) { maedhros@6773: if (v->type == type && v->IsPrimaryVehicle() && maedhros@6773: v->owner == owner && v->group_id == index) { peter1138@9348: *list->Append() = v; rubidium@6643: } rubidium@6643: } rubidium@6643: break; rubidium@6643: bjarni@4497: default: NOT_REACHED(); break; bjarni@4497: } bjarni@4497: peter1138@9348: list->Compact(); bjarni@4497: }