src/cargopacket.cpp
author truebrain
Mon, 16 Jun 2008 14:43:19 +0000
branchnoai
changeset 10978 13fd0364b2c6
parent 10455 22c441f5adf9
child 11126 72d4c9314c72
permissions -rw-r--r--
(svn r13532) [NoAI] -Fix: in MultiPlayer SignID wasn't set correctly, causing weird effects. Code is now more unified, which should avoid simular effects in the future (tnx to glx for initial patch)
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"
10142
56ee7da4ad56 (svn r12673) [NoAI] -Sync: with trunk r12596:12672. Note that due to the order rewrite AIOrder.ChangeOrder does currently not work as expected.
rubidium
parents: 9837
diff changeset
    10
#include "oldpool_func.h"
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    11
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    12
/* Initialize the cargopacket-pool */
9694
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9631
diff changeset
    13
DEFINE_OLD_POOL_GENERIC(CargoPacket, CargoPacket)
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    14
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    15
void InitializeCargoPackets()
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    16
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    17
	/* 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
    18
	_CargoPacket_pool.CleanPool();
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9631
diff changeset
    19
	_CargoPacket_pool.AddBlockToPool();
9629
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
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    22
CargoPacket::CargoPacket(StationID source, uint16 count)
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    23
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    24
	if (source != INVALID_STATION) assert(count != 0);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    25
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    26
	this->source          = source;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    27
	this->source_xy       = (source != INVALID_STATION) ? GetStation(source)->xy : 0;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    28
	this->loaded_at_xy    = this->source_xy;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    29
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    30
	this->count           = count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    31
	this->days_in_transit = 0;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    32
	this->feeder_share    = 0;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    33
	this->paid_for        = false;
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
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    36
CargoPacket::~CargoPacket()
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    37
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    38
	this->count = 0;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    39
}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    40
9732
f8eb3e208514 (svn r12211) [NoAI] -Sync: with trunk r12050:12209
glx
parents: 9701
diff changeset
    41
bool CargoPacket::SameSource(const CargoPacket *cp) const
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    42
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    43
	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
    44
}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    45
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    46
static const SaveLoad _cargopacket_desc[] = {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    47
	SLE_VAR(CargoPacket, source,          SLE_UINT16),
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    48
	SLE_VAR(CargoPacket, source_xy,       SLE_UINT32),
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    49
	SLE_VAR(CargoPacket, loaded_at_xy,    SLE_UINT32),
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    50
	SLE_VAR(CargoPacket, count,           SLE_UINT16),
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    51
	SLE_VAR(CargoPacket, days_in_transit, SLE_UINT8),
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    52
	SLE_VAR(CargoPacket, feeder_share,    SLE_INT64),
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    53
	SLE_VAR(CargoPacket, paid_for,        SLE_BOOL),
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    54
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    55
	SLE_END()
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
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    58
static void Save_CAPA()
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    59
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    60
	CargoPacket *cp;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    61
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    62
	FOR_ALL_CARGOPACKETS(cp) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    63
		SlSetArrayIndex(cp->index);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    64
		SlObject(cp, _cargopacket_desc);
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
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    68
static void Load_CAPA()
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    69
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    70
	int index;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    71
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    72
	while ((index = SlIterateArray()) != -1) {
9694
e72987579514 (svn r10775) [NoAI] -Sync: with trunk r10535:r10774.
rubidium
parents: 9631
diff changeset
    73
		CargoPacket *cp = new (index) CargoPacket();
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    74
		SlObject(cp, _cargopacket_desc);
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
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    78
extern const ChunkHandler _cargopacket_chunk_handlers[] = {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    79
	{ 'CAPA', Save_CAPA, Load_CAPA, CH_ARRAY | CH_LAST},
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
 *
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    84
 * Cargo list implementation
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
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    88
CargoList::~CargoList()
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    89
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    90
	while (!packets.empty()) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    91
		delete packets.front();
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    92
		packets.pop_front();
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
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    96
const CargoList::List *CargoList::Packets() const
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    97
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
    98
	return &packets;
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
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   101
void CargoList::AgeCargo()
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   102
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   103
	if (empty) return;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   104
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   105
	uint dit = 0;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   106
	for (List::const_iterator it = packets.begin(); it != packets.end(); it++) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   107
		if ((*it)->days_in_transit != 0xFF) (*it)->days_in_transit++;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   108
		dit += (*it)->days_in_transit * (*it)->count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   109
	}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   110
	days_in_transit = dit / count;
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
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   113
bool CargoList::Empty() const
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   114
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   115
	return empty;
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
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   118
uint CargoList::Count() const
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   119
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   120
	return count;
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
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   123
bool CargoList::UnpaidCargo() const
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   124
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   125
	return unpaid_cargo;
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
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   128
Money CargoList::FeederShare() const
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   129
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   130
	return feeder_share;
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
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   133
StationID CargoList::Source() const
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   134
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   135
	return source;
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
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   138
uint CargoList::DaysInTransit() const
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   139
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   140
	return days_in_transit;
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
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   143
void CargoList::Append(CargoPacket *cp)
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   144
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   145
	assert(cp != NULL);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   146
	assert(cp->IsValid());
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   147
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   148
	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
   149
		if ((*it)->SameSource(cp) && (*it)->count + cp->count <= 65535) {
9629
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   150
			(*it)->count        += cp->count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   151
			(*it)->feeder_share += cp->feeder_share;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   152
			delete cp;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   153
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   154
			InvalidateCache();
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   155
			return;
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
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   159
	/* The packet could not be merged with another one */
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   160
	packets.push_back(cp);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   161
	InvalidateCache();
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
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   165
void CargoList::Truncate(uint count)
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   166
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   167
	for (List::iterator it = packets.begin(); it != packets.end(); it++) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   168
		uint local_count = (*it)->count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   169
		if (local_count <= count) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   170
			count -= local_count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   171
			continue;
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
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   174
		(*it)->count = count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   175
		count = 0;
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
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   178
	while (!packets.empty()) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   179
		CargoPacket *cp = packets.back();
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   180
		if (cp->count != 0) break;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   181
		delete cp;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   182
		packets.pop_back();
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
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   185
	InvalidateCache();
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
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   188
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
   189
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   190
	assert(mta == MTA_FINAL_DELIVERY || dest != NULL);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   191
	CargoList tmp;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   192
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   193
	while (!packets.empty() && count > 0) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   194
		CargoPacket *cp = *packets.begin();
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   195
		if (cp->count <= count) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   196
			/* Can move the complete packet */
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   197
			packets.remove(cp);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   198
			switch (mta) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   199
				case MTA_FINAL_DELIVERY:
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   200
					if (cp->source == data) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   201
						tmp.Append(cp);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   202
					} else {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   203
						count -= cp->count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   204
						delete cp;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   205
					}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   206
					break;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   207
				case MTA_CARGO_LOAD:
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   208
					cp->loaded_at_xy = data;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   209
					/* 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
   210
					cp->paid_for     = false;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   211
					/* FALL THROUGH */
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   212
				case MTA_OTHER:
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   213
					count -= cp->count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   214
					dest->packets.push_back(cp);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   215
					break;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   216
			}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   217
		} else {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   218
			/* 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
   219
			if (mta != MTA_FINAL_DELIVERY) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   220
				CargoPacket *cp_new = new CargoPacket();
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   221
				cp_new->source          = cp->source;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   222
				cp_new->source_xy       = cp->source_xy;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   223
				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
   224
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   225
				cp_new->days_in_transit = cp->days_in_transit;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   226
				cp_new->feeder_share    = cp->feeder_share / count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   227
				/* 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
   228
				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
   229
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   230
				cp_new->count = count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   231
				dest->packets.push_back(cp_new);
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   232
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   233
				cp->feeder_share /= cp->count - count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   234
			}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   235
			cp->count -= count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   236
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   237
			count = 0;
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
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   241
	bool remaining = !packets.empty();
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   242
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   243
	if (mta == MTA_FINAL_DELIVERY && !tmp.Empty()) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   244
		/* 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
   245
		tmp.MoveTo(this, MAX_UVALUE(uint));
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   246
		tmp.packets.clear();
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
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   249
	if (dest != NULL) dest->InvalidateCache();
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   250
	InvalidateCache();
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   251
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   252
	return remaining;
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
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   255
void CargoList::InvalidateCache()
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   256
{
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   257
	empty = packets.empty();
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   258
	count = 0;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   259
	unpaid_cargo = false;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   260
	feeder_share = 0;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   261
	source = INVALID_STATION;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   262
	days_in_transit = 0;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   263
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   264
	if (empty) return;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   265
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   266
	uint dit = 0;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   267
	for (List::const_iterator it = packets.begin(); it != packets.end(); it++) {
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   268
		count        += (*it)->count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   269
		unpaid_cargo |= !(*it)->paid_for;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   270
		dit          += (*it)->days_in_transit * (*it)->count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   271
		feeder_share += (*it)->feeder_share;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   272
	}
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   273
	days_in_transit = dit / count;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   274
	source = (*packets.begin())->source;
66dde6412125 (svn r10350) [NoAI] -Sync with trunk r10194:10349
glx
parents:
diff changeset
   275
}
10455
22c441f5adf9 (svn r12997) [NoAI] -Sync: with trunk r12895:12996.
rubidium
parents: 10142
diff changeset
   276
22c441f5adf9 (svn r12997) [NoAI] -Sync: with trunk r12895:12996.
rubidium
parents: 10142
diff changeset
   277
/** Restore an array of cargo packets  from a backup
22c441f5adf9 (svn r12997) [NoAI] -Sync: with trunk r12895:12996.
rubidium
parents: 10142
diff changeset
   278
 * The end of the row should be marked by an invalid packet
22c441f5adf9 (svn r12997) [NoAI] -Sync: with trunk r12895:12996.
rubidium
parents: 10142
diff changeset
   279
 */
22c441f5adf9 (svn r12997) [NoAI] -Sync: with trunk r12895:12996.
rubidium
parents: 10142
diff changeset
   280
void CargoPacket::RestoreBackup() const
22c441f5adf9 (svn r12997) [NoAI] -Sync: with trunk r12895:12996.
rubidium
parents: 10142
diff changeset
   281
{
22c441f5adf9 (svn r12997) [NoAI] -Sync: with trunk r12895:12996.
rubidium
parents: 10142
diff changeset
   282
	for (const CargoPacket *cargo = this; cargo->IsValid(); cargo++) {
22c441f5adf9 (svn r12997) [NoAI] -Sync: with trunk r12895:12996.
rubidium
parents: 10142
diff changeset
   283
		CargoPacket *dest = GetCargoPacket(cargo->index);
22c441f5adf9 (svn r12997) [NoAI] -Sync: with trunk r12895:12996.
rubidium
parents: 10142
diff changeset
   284
		assert(!dest->IsValid());
22c441f5adf9 (svn r12997) [NoAI] -Sync: with trunk r12895:12996.
rubidium
parents: 10142
diff changeset
   285
		memcpy(dest, cargo, sizeof(CargoPacket));
22c441f5adf9 (svn r12997) [NoAI] -Sync: with trunk r12895:12996.
rubidium
parents: 10142
diff changeset
   286
	}
22c441f5adf9 (svn r12997) [NoAI] -Sync: with trunk r12895:12996.
rubidium
parents: 10142
diff changeset
   287
}