src/cargopacket.cpp
author rubidium
Sun, 06 Apr 2008 12:26:40 +0000
branchnoai
changeset 9867 b7d9ffe24f81
parent 9837 c9ec4f82e0d0
child 10142 56ee7da4ad56
permissions -rw-r--r--
(svn r12589) [NoAI] -Add: GetLastError support for AIBridge.
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
     1
/* $Id$ */
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
     2
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
     3
/** @file cargopacket.cpp Implementation of the cargo packets */
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
     4
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
     5
#include "stdafx.h"
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
     6
#include "openttd.h"
9837
c9ec4f82e0d0 (svn r12503) [NoAI] -Sync: with trunk r12461:12501.
rubidium
parents: 9732
diff changeset
     7
#include "station_base.h"
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
     8
#include "cargopacket.h"
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
     9
#include "saveload.h"
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    10
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    11
/* Initialize the cargopacket-pool */
9694
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9631
diff changeset
    12
DEFINE_OLD_POOL_GENERIC(CargoPacket, CargoPacket)
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    13
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    14
void InitializeCargoPackets()
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    15
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    16
	/* Clean the cargo packet pool and create 1 block in it */
9694
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9631
diff changeset
    17
	_CargoPacket_pool.CleanPool();
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9631
diff changeset
    18
	_CargoPacket_pool.AddBlockToPool();
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    19
}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    20
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    21
CargoPacket::CargoPacket(StationID source, uint16 count)
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    22
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    23
	if (source != INVALID_STATION) assert(count != 0);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    24
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    25
	this->source          = source;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    26
	this->source_xy       = (source != INVALID_STATION) ? GetStation(source)->xy : 0;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    27
	this->loaded_at_xy    = this->source_xy;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    28
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    29
	this->count           = count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    30
	this->days_in_transit = 0;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    31
	this->feeder_share    = 0;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    32
	this->paid_for        = false;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    33
}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    34
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    35
CargoPacket::~CargoPacket()
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    36
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    37
	this->count = 0;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    38
}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    39
9732
f8eb3e208514 (svn r12211) [NoAI] -Sync: with trunk r12050:12209
glx
parents: 9701
diff changeset
    40
bool CargoPacket::SameSource(const CargoPacket *cp) const
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    41
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    42
	return this->source_xy == cp->source_xy && this->days_in_transit == cp->days_in_transit && this->paid_for == cp->paid_for;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    43
}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    44
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    45
static const SaveLoad _cargopacket_desc[] = {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    46
	SLE_VAR(CargoPacket, source,          SLE_UINT16),
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    47
	SLE_VAR(CargoPacket, source_xy,       SLE_UINT32),
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    48
	SLE_VAR(CargoPacket, loaded_at_xy,    SLE_UINT32),
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    49
	SLE_VAR(CargoPacket, count,           SLE_UINT16),
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    50
	SLE_VAR(CargoPacket, days_in_transit, SLE_UINT8),
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    51
	SLE_VAR(CargoPacket, feeder_share,    SLE_INT64),
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    52
	SLE_VAR(CargoPacket, paid_for,        SLE_BOOL),
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    53
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    54
	SLE_END()
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    55
};
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    56
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    57
static void Save_CAPA()
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    58
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    59
	CargoPacket *cp;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    60
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    61
	FOR_ALL_CARGOPACKETS(cp) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    62
		SlSetArrayIndex(cp->index);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    63
		SlObject(cp, _cargopacket_desc);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    64
	}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    65
}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    66
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    67
static void Load_CAPA()
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    68
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    69
	int index;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    70
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    71
	while ((index = SlIterateArray()) != -1) {
9694
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9631
diff changeset
    72
		CargoPacket *cp = new (index) CargoPacket();
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    73
		SlObject(cp, _cargopacket_desc);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    74
	}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    75
}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    76
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    77
extern const ChunkHandler _cargopacket_chunk_handlers[] = {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    78
	{ 'CAPA', Save_CAPA, Load_CAPA, CH_ARRAY | CH_LAST},
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    79
};
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    80
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    81
/*
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    82
 *
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    83
 * Cargo list implementation
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    84
 *
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    85
 */
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    86
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    87
CargoList::~CargoList()
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    88
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    89
	while (!packets.empty()) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    90
		delete packets.front();
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    91
		packets.pop_front();
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    92
	}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    93
}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    94
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    95
const CargoList::List *CargoList::Packets() const
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    96
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    97
	return &packets;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    98
}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    99
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   100
void CargoList::AgeCargo()
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   101
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   102
	if (empty) return;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   103
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   104
	uint dit = 0;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   105
	for (List::const_iterator it = packets.begin(); it != packets.end(); it++) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   106
		if ((*it)->days_in_transit != 0xFF) (*it)->days_in_transit++;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   107
		dit += (*it)->days_in_transit * (*it)->count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   108
	}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   109
	days_in_transit = dit / count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   110
}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   111
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   112
bool CargoList::Empty() const
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   113
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   114
	return empty;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   115
}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   116
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   117
uint CargoList::Count() const
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   118
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   119
	return count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   120
}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   121
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   122
bool CargoList::UnpaidCargo() const
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   123
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   124
	return unpaid_cargo;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   125
}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   126
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   127
Money CargoList::FeederShare() const
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   128
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   129
	return feeder_share;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   130
}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   131
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   132
StationID CargoList::Source() const
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   133
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   134
	return source;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   135
}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   136
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   137
uint CargoList::DaysInTransit() const
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   138
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   139
	return days_in_transit;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   140
}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   141
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   142
void CargoList::Append(CargoPacket *cp)
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   143
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   144
	assert(cp != NULL);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   145
	assert(cp->IsValid());
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   146
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   147
	for (List::iterator it = packets.begin(); it != packets.end(); it++) {
9631
8a2d1c2ceb88 (svn r10461) [NoAI] -Sync with trunk r10349:r10460.
rubidium
parents: 9629
diff changeset
   148
		if ((*it)->SameSource(cp) && (*it)->count + cp->count <= 65535) {
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   149
			(*it)->count        += cp->count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   150
			(*it)->feeder_share += cp->feeder_share;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   151
			delete cp;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   152
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   153
			InvalidateCache();
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   154
			return;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   155
		}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   156
	}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   157
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   158
	/* The packet could not be merged with another one */
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   159
	packets.push_back(cp);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   160
	InvalidateCache();
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   161
}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   162
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   163
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   164
void CargoList::Truncate(uint count)
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   165
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   166
	for (List::iterator it = packets.begin(); it != packets.end(); it++) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   167
		uint local_count = (*it)->count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   168
		if (local_count <= count) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   169
			count -= local_count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   170
			continue;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   171
		}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   172
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   173
		(*it)->count = count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   174
		count = 0;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   175
	}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   176
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   177
	while (!packets.empty()) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   178
		CargoPacket *cp = packets.back();
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   179
		if (cp->count != 0) break;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   180
		delete cp;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   181
		packets.pop_back();
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   182
	}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   183
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   184
	InvalidateCache();
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   185
}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   186
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   187
bool CargoList::MoveTo(CargoList *dest, uint count, CargoList::MoveToAction mta, uint data)
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   188
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   189
	assert(mta == MTA_FINAL_DELIVERY || dest != NULL);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   190
	CargoList tmp;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   191
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   192
	while (!packets.empty() && count > 0) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   193
		CargoPacket *cp = *packets.begin();
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   194
		if (cp->count <= count) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   195
			/* Can move the complete packet */
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   196
			packets.remove(cp);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   197
			switch (mta) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   198
				case MTA_FINAL_DELIVERY:
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   199
					if (cp->source == data) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   200
						tmp.Append(cp);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   201
					} else {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   202
						count -= cp->count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   203
						delete cp;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   204
					}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   205
					break;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   206
				case MTA_CARGO_LOAD:
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   207
					cp->loaded_at_xy = data;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   208
					/* When cargo is moved into another vehicle you have *always* paid for it */
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   209
					cp->paid_for     = false;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   210
					/* FALL THROUGH */
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   211
				case MTA_OTHER:
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   212
					count -= cp->count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   213
					dest->packets.push_back(cp);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   214
					break;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   215
			}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   216
		} else {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   217
			/* Can move only part of the packet, so split it into two pieces */
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   218
			if (mta != MTA_FINAL_DELIVERY) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   219
				CargoPacket *cp_new = new CargoPacket();
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   220
				cp_new->source          = cp->source;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   221
				cp_new->source_xy       = cp->source_xy;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   222
				cp_new->loaded_at_xy    = (mta == MTA_CARGO_LOAD) ? data : cp->loaded_at_xy;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   223
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   224
				cp_new->days_in_transit = cp->days_in_transit;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   225
				cp_new->feeder_share    = cp->feeder_share / count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   226
				/* When cargo is moved into another vehicle you have *always* paid for it */
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   227
				cp_new->paid_for        = (mta == MTA_CARGO_LOAD) ? false : cp->paid_for;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   228
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   229
				cp_new->count = count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   230
				dest->packets.push_back(cp_new);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   231
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   232
				cp->feeder_share /= cp->count - count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   233
			}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   234
			cp->count -= count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   235
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   236
			count = 0;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   237
		}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   238
	}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   239
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   240
	bool remaining = !packets.empty();
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   241
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   242
	if (mta == MTA_FINAL_DELIVERY && !tmp.Empty()) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   243
		/* There are some packets that could not be delivered at the station, put them back */
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   244
		tmp.MoveTo(this, MAX_UVALUE(uint));
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   245
		tmp.packets.clear();
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   246
	}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   247
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   248
	if (dest != NULL) dest->InvalidateCache();
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   249
	InvalidateCache();
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   250
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   251
	return remaining;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   252
}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   253
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   254
void CargoList::InvalidateCache()
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   255
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   256
	empty = packets.empty();
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   257
	count = 0;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   258
	unpaid_cargo = false;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   259
	feeder_share = 0;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   260
	source = INVALID_STATION;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   261
	days_in_transit = 0;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   262
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   263
	if (empty) return;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   264
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   265
	uint dit = 0;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   266
	for (List::const_iterator it = packets.begin(); it != packets.end(); it++) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   267
		count        += (*it)->count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   268
		unpaid_cargo |= !(*it)->paid_for;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   269
		dit          += (*it)->days_in_transit * (*it)->count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   270
		feeder_share += (*it)->feeder_share;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   271
	}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   272
	days_in_transit = dit / count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   273
	source = (*packets.begin())->source;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   274
}