OpenTTD Source: src/cargomonitor.cpp Source File

OpenTTD Source 14.0-beta3

cargomonitor.cpp
Go to the documentation of this file.
1 /*
2 * This file is part of OpenTTD.
3 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
4 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
5 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
6 */
7
10 #include "stdafx.h"
11 #include "cargomonitor.h"
12 #include "station_base.h"
13
14 #include "safeguards.h"
15
16 CargoMonitorMap _cargo_pickups;
17 CargoMonitorMap _cargo_deliveries;
18
26 static void ClearCargoMonitoring(CargoMonitorMap &cargo_monitor_map, CompanyID company = INVALID_OWNER)
27 {
28 if (company == INVALID_OWNER) {
29 cargo_monitor_map.clear();
30 return;
31 }
32
33 for (auto it = cargo_monitor_map.begin(); it != cargo_monitor_map.end(); /* nothing */) {
34 if (DecodeMonitorCompany(it->first) == company) {
35 it = cargo_monitor_map.erase(it);
36 } else {
37 ++it;
38 }
39 }
40 }
41
47 void ClearCargoPickupMonitoring(CompanyID company)
48 {
49 ClearCargoMonitoring(_cargo_pickups, company);
50 }
51
57 void ClearCargoDeliveryMonitoring(CompanyID company)
58 {
59 ClearCargoMonitoring(_cargo_deliveries, company);
60 }
61
69 static int32_t GetAmount(CargoMonitorMap &monitor_map, CargoMonitorID monitor, bool keep_monitoring)
70 {
71 CargoMonitorMap::iterator iter = monitor_map.find(monitor);
72 if (iter == monitor_map.end()) {
73 if (keep_monitoring) {
74 std::pair<CargoMonitorID, uint32_t> p(monitor, 0);
75 monitor_map.insert(p);
76 }
77 return 0;
78 } else {
79 int32_t result = iter->second;
80 iter->second = 0;
81 if (!keep_monitoring) monitor_map.erase(iter);
82 return result;
83 }
84 }
85
92 int32_t GetDeliveryAmount(CargoMonitorID monitor, bool keep_monitoring)
93 {
94 return GetAmount(_cargo_deliveries, monitor, keep_monitoring);
95 }
96
104 int32_t GetPickupAmount(CargoMonitorID monitor, bool keep_monitoring)
105 {
106 return GetAmount(_cargo_pickups, monitor, keep_monitoring);
107 }
108
119 void AddCargoDelivery(CargoID cargo_type, CompanyID company, uint32_t amount, SourceType src_type, SourceID src, const Station *st, IndustryID dest)
120 {
121 if (amount == 0) return;
122
123 if (src != INVALID_SOURCE) {
124 /* Handle pickup update. */
125 switch (src_type) {
126 case SourceType::Industry: {
127 CargoMonitorID num = EncodeCargoIndustryMonitor(company, cargo_type, src);
128 CargoMonitorMap::iterator iter = _cargo_pickups.find(num);
129 if (iter != _cargo_pickups.end()) iter->second += amount;
130 break;
131 }
132 case SourceType::Town: {
133 CargoMonitorID num = EncodeCargoTownMonitor(company, cargo_type, src);
134 CargoMonitorMap::iterator iter = _cargo_pickups.find(num);
135 if (iter != _cargo_pickups.end()) iter->second += amount;
136 break;
137 }
138 default: break;
139 }
140 }
141
142 /* Handle delivery.
143 * Note that delivery in the right area is sufficient to prevent trouble with neighbouring industries or houses. */
144
145 /* Town delivery. */
146 CargoMonitorID num = EncodeCargoTownMonitor(company, cargo_type, st->town->index);
147 CargoMonitorMap::iterator iter = _cargo_deliveries.find(num);
148 if (iter != _cargo_deliveries.end()) iter->second += amount;
149
150 /* Industry delivery. */
151 for (const auto &i : st->industries_near) {
152 if (i.industry->index != dest) continue;
153 CargoMonitorID num = EncodeCargoIndustryMonitor(company, cargo_type, i.industry->index);
154 CargoMonitorMap::iterator iter = _cargo_deliveries.find(num);
155 if (iter != _cargo_deliveries.end()) iter->second += amount;
156 }
157 }
158
GetAmount
static int32_t GetAmount(CargoMonitorMap &monitor_map, CargoMonitorID monitor, bool keep_monitoring)
Get and reset the amount associated with a cargo monitor.
Definition: cargomonitor.cpp:69
CargoMonitorMap
std::map< CargoMonitorID, OverflowSafeInt32 > CargoMonitorMap
Map type for storing and updating active cargo monitor numbers and their amounts.
Definition: cargomonitor.h:32
BaseStation::town
Town * town
The town this station is associated with.
Definition: base_station_base.h:73
Station
Station data structure.
Definition: station_base.h:442
ClearCargoDeliveryMonitoring
void ClearCargoDeliveryMonitoring(CompanyID company)
Clear all delivery cargo monitors.
Definition: cargomonitor.cpp:57
EncodeCargoTownMonitor
CargoMonitorID EncodeCargoTownMonitor(CompanyID company, CargoID ctype, TownID town)
Encode a cargo monitoring number for pickup or delivery at a town.
Definition: cargomonitor.h:81
Pool::PoolItem::index
Tindex index
Index of this pool item.
Definition: pool_type.hpp:234
Owner
Owner
Enum for all companies/owners.
Definition: company_type.h:18
EncodeCargoIndustryMonitor
CargoMonitorID EncodeCargoIndustryMonitor(CompanyID company, CargoID ctype, IndustryID ind)
Encode a cargo monitor for pickup or delivery at an industry.
Definition: cargomonitor.h:61
INVALID_OWNER
@ INVALID_OWNER
An invalid owner.
Definition: company_type.h:29
_cargo_pickups
CargoMonitorMap _cargo_pickups
Map of monitored pick-ups to the amount since last query/activation.
Definition: cargomonitor.cpp:16
SourceID
uint16_t SourceID
Contains either industry ID, town ID or company ID (or INVALID_SOURCE)
Definition: cargo_type.h:139
safeguards.h
CargoID
byte CargoID
Cargo slots to indicate a cargo type within a game.
Definition: cargo_type.h:22
SourceType::Industry
@ Industry
Source/destination is an industry.
stdafx.h
SourceType::Town
@ Town
Source/destination is a town.
_cargo_deliveries
CargoMonitorMap _cargo_deliveries
Map of monitored deliveries to the amount since last query/activation.
Definition: cargomonitor.cpp:17
Station::industries_near
IndustryList industries_near
Cached list of industries near the station that can accept cargo,.
Definition: station_base.h:474
station_base.h
SourceType
SourceType
Types of cargo source and destination.
Definition: cargo_type.h:133
ClearCargoMonitoring
static void ClearCargoMonitoring(CargoMonitorMap &cargo_monitor_map, CompanyID company=INVALID_OWNER)
Helper method for ClearCargoPickupMonitoring and ClearCargoDeliveryMonitoring.
Definition: cargomonitor.cpp:26
GetDeliveryAmount
int32_t GetDeliveryAmount(CargoMonitorID monitor, bool keep_monitoring)
Get the amount of cargo delivered for the given cargo monitor since activation or last query.
Definition: cargomonitor.cpp:92
ClearCargoPickupMonitoring
void ClearCargoPickupMonitoring(CompanyID company)
Clear all pick-up cargo monitors.
Definition: cargomonitor.cpp:47
INVALID_SOURCE
static const SourceID INVALID_SOURCE
Invalid/unknown index of source.
Definition: cargo_type.h:140
DecodeMonitorCompany
CompanyID DecodeMonitorCompany(CargoMonitorID num)
Extract the company from the cargo monitor.
Definition: cargomonitor.h:98
AddCargoDelivery
void AddCargoDelivery(CargoID cargo_type, CompanyID company, uint32_t amount, SourceType src_type, SourceID src, const Station *st, IndustryID dest)
Cargo was delivered to its final destination, update the pickup and delivery maps.
Definition: cargomonitor.cpp:119
GetPickupAmount
int32_t GetPickupAmount(CargoMonitorID monitor, bool keep_monitoring)
Get the amount of cargo picked up for the given cargo monitor since activation or last query.
Definition: cargomonitor.cpp:104
cargomonitor.h
CargoMonitorID
uint32_t CargoMonitorID
Unique number for a company / cargo type / (town or industry).
Definition: cargomonitor.h:19