src/vehiclelist.cpp
author truebrain
Mon, 30 Jun 2008 13:51:28 +0000
branchnoai
changeset 11102 aacdde10b4ad
parent 10776 07203fc29812
permissions -rw-r--r--
(svn r13660) [NoAI] -Fix: Is(Tunnel|Bridge)Tile could cause asserts (spotted by Yexo and ST_)
10776
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
     1
/* $Id$ */
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
     2
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
     3
/** @file vehicle.cpp Base implementations of all vehicles. */
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
     4
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
     5
#include "stdafx.h"
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
     6
#include "openttd.h"
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
     7
#include "vehicle_type.h"
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
     8
#include "vehicle_func.h"
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
     9
#include "vehicle_base.h"
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    10
#include "vehicle_gui.h"
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    11
#include "core/alloc_func.hpp"
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    12
#include "train.h"
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    13
#include "vehiclelist.h"
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    14
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    15
/**
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    16
 * Generate a list of vehicles inside a depot.
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    17
 * @param type    Type of vehicle
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    18
 * @param tile    The tile the depot is located on
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    19
 * @param engines Pointer to list to add vehicles to
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    20
 * @param wagons  Pointer to list to add wagons to (can be NULL)
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    21
 */
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    22
void BuildDepotVehicleList(VehicleType type, TileIndex tile, VehicleList *engines, VehicleList *wagons)
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    23
{
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    24
	engines->Clear();
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    25
	if (wagons != NULL && wagons != engines) wagons->Clear();
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    26
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    27
	const Vehicle *v;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    28
	FOR_ALL_VEHICLES(v) {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    29
		/* General tests for all vehicle types */
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    30
		if (v->type != type) continue;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    31
		if (v->tile != tile) continue;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    32
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    33
		switch (type) {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    34
			case VEH_TRAIN:
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    35
				if (v->u.rail.track != TRACK_BIT_DEPOT) continue;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    36
				if (wagons != NULL && IsFreeWagon(v)) {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    37
					*wagons->Append() = v;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    38
					continue;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    39
				}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    40
				break;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    41
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    42
			default:
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    43
				if (!v->IsInDepot()) continue;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    44
				break;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    45
		}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    46
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    47
		if (!v->IsPrimaryVehicle()) continue;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    48
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    49
		*engines->Append() = v;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    50
	}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    51
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    52
	/* Ensure the lists are not wasting too much space. If the lists are fresh
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    53
	 * (i.e. built within a command) then this will actually do nothing. */
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    54
	engines->Compact();
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    55
	if (wagons != NULL && wagons != engines) wagons->Compact();
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    56
}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    57
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    58
/**
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    59
 * Generate a list of vehicles based on window type.
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    60
 * @param list        Pointer to list to add vehicles to
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    61
 * @param type        Type of vehicle
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    62
 * @param owner       Player to generate list for
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    63
 * @param index       This parameter has different meanings depending on window_type
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    64
 *    <ul>
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    65
 *      <li>VLW_STATION_LIST:  index of station to generate a list for</li>
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    66
 *      <li>VLW_SHARED_ORDERS: index of order to generate a list for<li>
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    67
 *      <li>VLW_STANDARD: not used<li>
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    68
 *      <li>VLW_DEPOT_LIST: TileIndex of the depot/hangar to make the list for</li>
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    69
 *      <li>VLW_GROUP_LIST: index of group to generate a list for</li>
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    70
 *    </ul>
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    71
 * @param window_type The type of window the list is for, using the VLW_ flags in vehicle_gui.h
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    72
 */
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    73
void GenerateVehicleSortList(VehicleList *list, VehicleType type, PlayerID owner, uint32 index, uint16 window_type)
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    74
{
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    75
	list->Clear();
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    76
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    77
	const Vehicle *v;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    78
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    79
	switch (window_type) {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    80
		case VLW_STATION_LIST:
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    81
			FOR_ALL_VEHICLES(v) {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    82
				if (v->type == type && v->IsPrimaryVehicle()) {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    83
					const Order *order;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    84
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    85
					FOR_VEHICLE_ORDERS(v, order) {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    86
						if (order->IsType(OT_GOTO_STATION) && order->GetDestination() == index) {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    87
							*list->Append() = v;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    88
							break;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    89
						}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    90
					}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    91
				}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    92
			}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    93
			break;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    94
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    95
		case VLW_SHARED_ORDERS:
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    96
			FOR_ALL_VEHICLES(v) {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    97
				/* Find a vehicle with the order in question */
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    98
				if (v->orders != NULL && v->orders->index == index) {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
    99
					/* Add all vehicles from this vehicle's shared order list */
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   100
					for (v = GetFirstVehicleFromSharedList(v); v != NULL; v = v->next_shared) {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   101
						*list->Append() = v;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   102
					}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   103
					break;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   104
				}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   105
			}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   106
			break;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   107
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   108
		case VLW_STANDARD:
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   109
			FOR_ALL_VEHICLES(v) {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   110
				if (v->type == type && v->owner == owner && v->IsPrimaryVehicle()) {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   111
					*list->Append() = v;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   112
				}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   113
			}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   114
			break;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   115
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   116
		case VLW_DEPOT_LIST:
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   117
			FOR_ALL_VEHICLES(v) {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   118
				if (v->type == type && v->IsPrimaryVehicle()) {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   119
					const Order *order;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   120
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   121
					FOR_VEHICLE_ORDERS(v, order) {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   122
						if (order->IsType(OT_GOTO_DEPOT) && order->GetDestination() == index) {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   123
							*list->Append() = v;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   124
							break;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   125
						}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   126
					}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   127
				}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   128
			}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   129
			break;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   130
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   131
		case VLW_GROUP_LIST:
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   132
			FOR_ALL_VEHICLES(v) {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   133
				if (v->type == type && v->IsPrimaryVehicle() &&
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   134
						v->owner == owner && v->group_id == index) {
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   135
					*list->Append() = v;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   136
				}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   137
			}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   138
			break;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   139
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   140
		default: NOT_REACHED(); break;
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   141
	}
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   142
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   143
	list->Compact();
07203fc29812 (svn r13326) [NoAI] -Sync with trunk r13264:13325
glx
parents:
diff changeset
   144
}