/* static */ int32 ScriptCargoMonitor::GetTownPickupAmount(ScriptCompany::CompanyID company, CargoID cargo, TownID town_id, bool keep_monitoring)
{
	CompanyID cid = static_cast<CompanyID>(company);
	if (cid < OWNER_BEGIN || cid >= MAX_COMPANIES) return -1;
	if (!ScriptCargo::IsValidCargo(cargo)) return -1;
	if (!::Town::IsValidID(town_id)) return -1;

	CargoMonitorID monitor = EncodeCargoTownMonitor(cid, cargo, town_id);
	return GetPickupAmount(monitor, keep_monitoring);
}
Example #2
0
/**
 * Cargo was delivered to its final destination, update the pickup and delivery maps.
 * @param cargo_type type of cargo.
 * @param company company delivering the cargo.
 * @param amount Amount of cargo delivered.
 * @param src_type type of \a src.
 * @param src index of source.
 * @param st station where the cargo is delivered to.
 */
void AddCargoDelivery(CargoID cargo_type, CompanyID company, uint32 amount, SourceType src_type, SourceID src, const Station *st)
{
	if (amount == 0) return;

	if (src != INVALID_SOURCE) {
		/* Handle pickup update. */
		switch (src_type) {
			case ST_INDUSTRY: {
				CargoMonitorID num = EncodeCargoIndustryMonitor(company, cargo_type, src);
				CargoMonitorMap::iterator iter = _cargo_pickups.find(num);
				if (iter != _cargo_pickups.end()) iter->second += amount;
				break;
			}
			case ST_TOWN: {
				CargoMonitorID num = EncodeCargoTownMonitor(company, cargo_type, src);
				CargoMonitorMap::iterator iter = _cargo_pickups.find(num);
				if (iter != _cargo_pickups.end()) iter->second += amount;
				break;
			}
			default: break;
		}
	}

	/* Handle delivery.
	 * Note that delivery in the right area is sufficient to prevent trouble with neighbouring industries or houses. */

	/* Town delivery. */
	CargoMonitorID num = EncodeCargoTownMonitor(company, cargo_type, st->town->index);
	CargoMonitorMap::iterator iter = _cargo_deliveries.find(num);
	if (iter != _cargo_deliveries.end()) iter->second += amount;

	/* Industry delivery. */
	for (const Industry * const *ip = st->industries_near.Begin(); ip != st->industries_near.End(); ip++) {
		CargoMonitorID num = EncodeCargoIndustryMonitor(company, cargo_type, (*ip)->index);
		CargoMonitorMap::iterator iter = _cargo_deliveries.find(num);
		if (iter != _cargo_deliveries.end()) iter->second += amount;
	}
}
Example #3
0
/* static */ uint32 ScriptCargoMonitor::GetTownPickupAmount(ScriptCompany::CompanyID company, CargoID cargo, TownID town_id, bool keep_monitoring)
{
	CargoMonitorID monitor = EncodeCargoTownMonitor(static_cast<CompanyID>(company), cargo, town_id);
	return GetPickupAmount(monitor, keep_monitoring);
}