mirror of https://github.com/OpenTTD/OpenTTD
(svn r17439) -Fix (r17436): you weren't paid for cargo delivered to houses and headquarters anymore
parent
9168ddd550
commit
22e9d59559
|
@ -929,6 +929,9 @@ static Money DeliverGoods(int num_pieces, CargoID cargo_type, StationID dest, Ti
|
||||||
/* Give the goods to the industry. */
|
/* Give the goods to the industry. */
|
||||||
uint accepted = DeliverGoodsToIndustry(st, cargo_type, num_pieces, src_type == ST_INDUSTRY ? src : INVALID_INDUSTRY);
|
uint accepted = DeliverGoodsToIndustry(st, cargo_type, num_pieces, src_type == ST_INDUSTRY ? src : INVALID_INDUSTRY);
|
||||||
|
|
||||||
|
/* If there are non-industries around accepting the cargo, accept it all */
|
||||||
|
if (HasBit(st->town_acc, cargo_type)) accepted = num_pieces;
|
||||||
|
|
||||||
/* Determine profit */
|
/* Determine profit */
|
||||||
Money profit = GetTransportedGoodsIncome(accepted, DistanceManhattan(source_tile, st->xy), days_in_transit, cargo_type);
|
Money profit = GetTransportedGoodsIncome(accepted, DistanceManhattan(source_tile, st->xy), days_in_transit, cargo_type);
|
||||||
|
|
||||||
|
|
|
@ -392,7 +392,7 @@ static Foundation GetFoundation_Industry(TileIndex tile, Slope tileh)
|
||||||
return FlatteningFoundation(tileh);
|
return FlatteningFoundation(tileh);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void AddAcceptedCargo_Industry(TileIndex tile, CargoArray &acceptance)
|
static void AddAcceptedCargo_Industry(TileIndex tile, CargoArray &acceptance, uint32 *town_acc)
|
||||||
{
|
{
|
||||||
IndustryGfx gfx = GetIndustryGfx(tile);
|
IndustryGfx gfx = GetIndustryGfx(tile);
|
||||||
const IndustryTileSpec *itspec = GetIndustryTileSpec(gfx);
|
const IndustryTileSpec *itspec = GetIndustryTileSpec(gfx);
|
||||||
|
|
|
@ -159,7 +159,7 @@ public:
|
||||||
td.grf = NULL;
|
td.grf = NULL;
|
||||||
|
|
||||||
CargoArray acceptance;
|
CargoArray acceptance;
|
||||||
AddAcceptedCargo(tile, acceptance);
|
AddAcceptedCargo(tile, acceptance, NULL);
|
||||||
GetTileDesc(tile, &td);
|
GetTileDesc(tile, &td);
|
||||||
|
|
||||||
uint line_nr = 0;
|
uint line_nr = 0;
|
||||||
|
|
|
@ -1946,6 +1946,11 @@ bool AfterLoadGame()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (CheckSavegameVersion(127)) {
|
||||||
|
Station *st;
|
||||||
|
FOR_ALL_STATIONS(st) UpdateStationAcceptance(st, false);
|
||||||
|
}
|
||||||
|
|
||||||
AfterLoadLabelMaps();
|
AfterLoadLabelMaps();
|
||||||
|
|
||||||
GamelogPrintDebug(1);
|
GamelogPrintDebug(1);
|
||||||
|
|
|
@ -48,7 +48,7 @@
|
||||||
|
|
||||||
#include "saveload_internal.h"
|
#include "saveload_internal.h"
|
||||||
|
|
||||||
extern const uint16 SAVEGAME_VERSION = 126;
|
extern const uint16 SAVEGAME_VERSION = 127;
|
||||||
|
|
||||||
SavegameType _savegame_type; ///< type of savegame we are loading
|
SavegameType _savegame_type; ///< type of savegame we are loading
|
||||||
|
|
||||||
|
|
|
@ -326,6 +326,7 @@ static const SaveLoad _station_desc[] = {
|
||||||
SLE_VAR(Station, last_vehicle_type, SLE_UINT8),
|
SLE_VAR(Station, last_vehicle_type, SLE_UINT8),
|
||||||
SLE_VAR(Station, had_vehicle_of_type, SLE_UINT8),
|
SLE_VAR(Station, had_vehicle_of_type, SLE_UINT8),
|
||||||
SLE_LST(Station, loading_vehicles, REF_VEHICLE),
|
SLE_LST(Station, loading_vehicles, REF_VEHICLE),
|
||||||
|
SLE_CONDVAR(Station, town_acc, SLE_UINT32, 127, SL_MAX_VERSION),
|
||||||
|
|
||||||
SLE_END()
|
SLE_END()
|
||||||
};
|
};
|
||||||
|
|
|
@ -85,6 +85,7 @@ public:
|
||||||
byte last_vehicle_type;
|
byte last_vehicle_type;
|
||||||
std::list<Vehicle *> loading_vehicles;
|
std::list<Vehicle *> loading_vehicles;
|
||||||
GoodsEntry goods[NUM_CARGO]; ///< Goods at this station
|
GoodsEntry goods[NUM_CARGO]; ///< Goods at this station
|
||||||
|
uint32 town_acc; ///< Bitmask of cargos accepted by town houses and headquarters
|
||||||
|
|
||||||
IndustryVector industries_near; ///< Cached list of industries near the station that can accept cargo, @see DeliverGoodsToIndustry()
|
IndustryVector industries_near; ///< Cached list of industries near the station that can accept cargo, @see DeliverGoodsToIndustry()
|
||||||
|
|
||||||
|
|
|
@ -510,10 +510,12 @@ CargoArray GetProductionAroundTiles(TileIndex tile, int w, int h, int rad)
|
||||||
* @param w X extent of area
|
* @param w X extent of area
|
||||||
* @param h Y extent of area
|
* @param h Y extent of area
|
||||||
* @param rad Search radius in addition to given area
|
* @param rad Search radius in addition to given area
|
||||||
|
* @param town_acc bitmask of cargo accepted by houses and headquarters; can be NULL
|
||||||
*/
|
*/
|
||||||
CargoArray GetAcceptanceAroundTiles(TileIndex tile, int w, int h, int rad)
|
CargoArray GetAcceptanceAroundTiles(TileIndex tile, int w, int h, int rad, uint32 *town_acc)
|
||||||
{
|
{
|
||||||
CargoArray acceptance;
|
CargoArray acceptance;
|
||||||
|
if (town_acc != NULL) *town_acc = 0;
|
||||||
|
|
||||||
int x = TileX(tile);
|
int x = TileX(tile);
|
||||||
int y = TileY(tile);
|
int y = TileY(tile);
|
||||||
|
@ -533,7 +535,7 @@ CargoArray GetAcceptanceAroundTiles(TileIndex tile, int w, int h, int rad)
|
||||||
for (int yc = y1; yc != y2; yc++) {
|
for (int yc = y1; yc != y2; yc++) {
|
||||||
for (int xc = x1; xc != x2; xc++) {
|
for (int xc = x1; xc != x2; xc++) {
|
||||||
TileIndex tile = TileXY(xc, yc);
|
TileIndex tile = TileXY(xc, yc);
|
||||||
AddAcceptedCargo(tile, acceptance);
|
AddAcceptedCargo(tile, acceptance, town_acc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -544,7 +546,7 @@ CargoArray GetAcceptanceAroundTiles(TileIndex tile, int w, int h, int rad)
|
||||||
* @param st Station to update
|
* @param st Station to update
|
||||||
* @param show_msg controls whether to display a message that acceptance was changed.
|
* @param show_msg controls whether to display a message that acceptance was changed.
|
||||||
*/
|
*/
|
||||||
static void UpdateStationAcceptance(Station *st, bool show_msg)
|
void UpdateStationAcceptance(Station *st, bool show_msg)
|
||||||
{
|
{
|
||||||
/* old accepted goods types */
|
/* old accepted goods types */
|
||||||
uint old_acc = GetAcceptanceMask(st);
|
uint old_acc = GetAcceptanceMask(st);
|
||||||
|
@ -556,7 +558,8 @@ static void UpdateStationAcceptance(Station *st, bool show_msg)
|
||||||
TileXY(st->rect.left, st->rect.top),
|
TileXY(st->rect.left, st->rect.top),
|
||||||
st->rect.right - st->rect.left + 1,
|
st->rect.right - st->rect.left + 1,
|
||||||
st->rect.bottom - st->rect.top + 1,
|
st->rect.bottom - st->rect.top + 1,
|
||||||
st->GetCatchmentRadius()
|
st->GetCatchmentRadius(),
|
||||||
|
&st->town_acc
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,9 @@ void ShowStationViewWindow(StationID station);
|
||||||
void UpdateAllStationVirtCoords();
|
void UpdateAllStationVirtCoords();
|
||||||
|
|
||||||
CargoArray GetProductionAroundTiles(TileIndex tile, int w, int h, int rad);
|
CargoArray GetProductionAroundTiles(TileIndex tile, int w, int h, int rad);
|
||||||
CargoArray GetAcceptanceAroundTiles(TileIndex tile, int w, int h, int rad);
|
CargoArray GetAcceptanceAroundTiles(TileIndex tile, int w, int h, int rad, uint32 *town_acc = NULL);
|
||||||
|
|
||||||
|
void UpdateStationAcceptance(Station *st, bool show_msg);
|
||||||
|
|
||||||
const DrawTileSprites *GetStationTileLayout(StationType st, byte gfx);
|
const DrawTileSprites *GetStationTileLayout(StationType st, byte gfx);
|
||||||
void StationPickerDrawSprite(int x, int y, StationType st, RailType railtype, RoadType roadtype, int image);
|
void StationPickerDrawSprite(int x, int y, StationType st, RailType railtype, RoadType roadtype, int image);
|
||||||
|
|
|
@ -78,10 +78,11 @@ typedef CommandCost ClearTileProc(TileIndex tile, DoCommandFlag flags);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tile callback function signature for obtaining cargo acceptance of a tile
|
* Tile callback function signature for obtaining cargo acceptance of a tile
|
||||||
* @param tile Tile queried for its accepted cargo
|
* @param tile Tile queried for its accepted cargo
|
||||||
* @param acceptance Storage destination of the cargo acceptance in 1/8
|
* @param acceptance Storage destination of the cargo acceptance in 1/8
|
||||||
|
* @param town_acc Bitmask of town and headquarters-accepted cargo
|
||||||
*/
|
*/
|
||||||
typedef void AddAcceptedCargoProc(TileIndex tile, CargoArray &acceptance);
|
typedef void AddAcceptedCargoProc(TileIndex tile, CargoArray &acceptance, uint32 *town_acc);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tile callback function signature for obtaining a tile description
|
* Tile callback function signature for obtaining a tile description
|
||||||
|
@ -164,11 +165,12 @@ VehicleEnterTileStatus VehicleEnterTile(Vehicle *v, TileIndex tile, int x, int y
|
||||||
void ChangeTileOwner(TileIndex tile, Owner old_owner, Owner new_owner);
|
void ChangeTileOwner(TileIndex tile, Owner old_owner, Owner new_owner);
|
||||||
void GetTileDesc(TileIndex tile, TileDesc *td);
|
void GetTileDesc(TileIndex tile, TileDesc *td);
|
||||||
|
|
||||||
static inline void AddAcceptedCargo(TileIndex tile, CargoArray &acceptance)
|
static inline void AddAcceptedCargo(TileIndex tile, CargoArray &acceptance, uint32 *town_acc)
|
||||||
{
|
{
|
||||||
AddAcceptedCargoProc *proc = _tile_type_procs[GetTileType(tile)]->add_accepted_cargo_proc;
|
AddAcceptedCargoProc *proc = _tile_type_procs[GetTileType(tile)]->add_accepted_cargo_proc;
|
||||||
if (proc == NULL) return;
|
if (proc == NULL) return;
|
||||||
proc(tile, acceptance);
|
uint32 dummy = 0; // use dummy bitmask so there don't need to be several 'town_acc != NULL' checks
|
||||||
|
proc(tile, acceptance, town_acc == NULL ? &dummy : town_acc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void AddProducedCargo(TileIndex tile, CargoArray &produced)
|
static inline void AddProducedCargo(TileIndex tile, CargoArray &produced)
|
||||||
|
|
|
@ -579,7 +579,14 @@ static void AddProducedCargo_Town(TileIndex tile, CargoArray &produced)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void AddAcceptedCargo_Town(TileIndex tile, CargoArray &acceptance)
|
static inline void AddAcceptedCargoSetMask(CargoID cargo, uint amount, CargoArray &acceptance, uint32 *town_acc)
|
||||||
|
{
|
||||||
|
if (cargo == CT_INVALID || amount == 0) return;
|
||||||
|
acceptance[cargo] += amount;
|
||||||
|
SetBit(*town_acc, cargo);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void AddAcceptedCargo_Town(TileIndex tile, CargoArray &acceptance, uint32 *town_acc)
|
||||||
{
|
{
|
||||||
const HouseSpec *hs = HouseSpec::Get(GetHouseType(tile));
|
const HouseSpec *hs = HouseSpec::Get(GetHouseType(tile));
|
||||||
CargoID accepts[3];
|
CargoID accepts[3];
|
||||||
|
@ -604,13 +611,13 @@ static void AddAcceptedCargo_Town(TileIndex tile, CargoArray &acceptance)
|
||||||
if (HasBit(hs->callback_mask, CBM_HOUSE_CARGO_ACCEPTANCE)) {
|
if (HasBit(hs->callback_mask, CBM_HOUSE_CARGO_ACCEPTANCE)) {
|
||||||
uint16 callback = GetHouseCallback(CBID_HOUSE_CARGO_ACCEPTANCE, 0, 0, GetHouseType(tile), Town::GetByTile(tile), tile);
|
uint16 callback = GetHouseCallback(CBID_HOUSE_CARGO_ACCEPTANCE, 0, 0, GetHouseType(tile), Town::GetByTile(tile), tile);
|
||||||
if (callback != CALLBACK_FAILED) {
|
if (callback != CALLBACK_FAILED) {
|
||||||
if (accepts[0] != CT_INVALID) acceptance[accepts[0]] += GB(callback, 0, 4);
|
AddAcceptedCargoSetMask(accepts[0], GB(callback, 0, 4), acceptance, town_acc);
|
||||||
if (accepts[1] != CT_INVALID) acceptance[accepts[1]] += GB(callback, 4, 4);
|
AddAcceptedCargoSetMask(accepts[1], GB(callback, 4, 4), acceptance, town_acc);
|
||||||
if (_settings_game.game_creation.landscape != LT_TEMPERATE && HasBit(callback, 12)) {
|
if (_settings_game.game_creation.landscape != LT_TEMPERATE && HasBit(callback, 12)) {
|
||||||
/* The 'S' bit indicates food instead of goods */
|
/* The 'S' bit indicates food instead of goods */
|
||||||
acceptance[CT_FOOD] += GB(callback, 8, 4);
|
AddAcceptedCargoSetMask(CT_FOOD, GB(callback, 8, 4), acceptance, town_acc);
|
||||||
} else {
|
} else {
|
||||||
if (accepts[2] != CT_INVALID) acceptance[accepts[2]] += GB(callback, 8, 4);
|
AddAcceptedCargoSetMask(accepts[2], GB(callback, 8, 4), acceptance, town_acc);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -618,7 +625,7 @@ static void AddAcceptedCargo_Town(TileIndex tile, CargoArray &acceptance)
|
||||||
|
|
||||||
/* No custom acceptance, so fill in with the default values */
|
/* No custom acceptance, so fill in with the default values */
|
||||||
for (uint8 i = 0; i < lengthof(accepts); i++) {
|
for (uint8 i = 0; i < lengthof(accepts); i++) {
|
||||||
if (accepts[i] != CT_INVALID) acceptance[accepts[i]] += hs->cargo_acceptance[i];
|
AddAcceptedCargoSetMask(accepts[i], hs->cargo_acceptance[i], acceptance, town_acc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -301,7 +301,7 @@ static CommandCost ClearTile_Unmovable(TileIndex tile, DoCommandFlag flags)
|
||||||
return CommandCost();
|
return CommandCost();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void AddAcceptedCargo_Unmovable(TileIndex tile, CargoArray &acceptance)
|
static void AddAcceptedCargo_Unmovable(TileIndex tile, CargoArray &acceptance, uint32 *town_acc)
|
||||||
{
|
{
|
||||||
if (!IsCompanyHQ(tile)) return;
|
if (!IsCompanyHQ(tile)) return;
|
||||||
|
|
||||||
|
@ -314,12 +314,14 @@ static void AddAcceptedCargo_Unmovable(TileIndex tile, CargoArray &acceptance)
|
||||||
/* Top town building generates 10, so to make HQ interesting, the top
|
/* Top town building generates 10, so to make HQ interesting, the top
|
||||||
* type makes 20. */
|
* type makes 20. */
|
||||||
acceptance[CT_PASSENGERS] += max(1U, level);
|
acceptance[CT_PASSENGERS] += max(1U, level);
|
||||||
|
SetBit(*town_acc, CT_PASSENGERS);
|
||||||
|
|
||||||
/* Top town building generates 4, HQ can make up to 8. The
|
/* Top town building generates 4, HQ can make up to 8. The
|
||||||
* proportion passengers:mail is different because such a huge
|
* proportion passengers:mail is different because such a huge
|
||||||
* commercial building generates unusually high amount of mail
|
* commercial building generates unusually high amount of mail
|
||||||
* correspondence per physical visitor. */
|
* correspondence per physical visitor. */
|
||||||
acceptance[CT_MAIL] += max(1U, level / 2);
|
acceptance[CT_MAIL] += max(1U, level / 2);
|
||||||
|
SetBit(*town_acc, CT_MAIL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue