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: * - VLW_STATION_LIST: index of station to generate a list for
peter1138@9348: * - VLW_SHARED_ORDERS: index of order to generate a list for
-
peter1138@9348: *
- VLW_STANDARD: not used
-
peter1138@9348: *
- VLW_DEPOT_LIST: TileIndex of the depot/hangar to make the list for
peter1138@9348: * - VLW_GROUP_LIST: index of group to generate a list for
belugas@9963: * - VLW_WAYPOINT_LIST: index of waypoint to generate a list for
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: }