diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 10326ef7aa..b1da32a064 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -4213,7 +4213,7 @@ static void InitializeGRFSpecial() | (0 << 0x04) // aichoosechance | (1 << 0x05) // resolutionwidth | (1 << 0x06) // resolutionheight - | (0 << 0x07) // newindustries + | (1 << 0x07) // newindustries | ((_patches.improved_load ? 1 : 0) << 0x08) // fifoloading | (0 << 0x09) // townroadbranchprob | (0 << 0x0A) // tempsnowline diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index f49cfb075b..03248a9bbf 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -400,24 +400,55 @@ static void TileLoop_Town(TileIndex tile) r = Random(); - if (GB(r, 0, 8) < hs->population) { - uint amt = GB(r, 0, 8) / 8 + 1; - uint moved; + if (HASBIT(hs->callback_mask, CBM_HOUSE_PRODUCE_CARGO)) { + for (uint i = 0; i < 256; i++) { + uint16 callback = GetHouseCallback(CBID_HOUSE_PRODUCE_CARGO, i, r, house_id, t, tile); - if (_economy.fluct <= 0) amt = (amt + 1) >> 1; - t->new_max_pass += amt; - moved = MoveGoodsToStation(tile, 1, 1, CT_PASSENGERS, amt); - t->new_act_pass += moved; - } + if (callback == CALLBACK_FAILED) break; + if (callback == 0x20FF) break; - if (GB(r, 8, 8) < hs->mail_generation) { - uint amt = GB(r, 8, 8) / 8 + 1; - uint moved; + CargoID cargo = GetCargoTranslation(GB(callback, 8, 7), hs->grffile); + if (cargo == CT_INVALID) continue; - if (_economy.fluct <= 0) amt = (amt + 1) >> 1; - t->new_max_mail += amt; - moved = MoveGoodsToStation(tile, 1, 1, CT_MAIL, amt); - t->new_act_mail += moved; + uint amt = GB(callback, 0, 8); + uint moved = MoveGoodsToStation(tile, 1, 1, cargo, amt); + + const CargoSpec *cs = GetCargo(cargo); + switch (cs->town_effect) { + case TE_PASSENGERS: + t->new_max_pass += amt; + t->new_act_pass += moved; + break; + + case TE_MAIL: + t->new_max_mail += amt; + t->new_act_mail += moved; + break; + + default: + break; + } + } + } else { + if (GB(r, 0, 8) < hs->population) { + uint amt = GB(r, 0, 8) / 8 + 1; + uint moved; + + if (_economy.fluct <= 0) amt = (amt + 1) >> 1; + t->new_max_pass += amt; + moved = MoveGoodsToStation(tile, 1, 1, CT_PASSENGERS, amt); + t->new_act_pass += moved; + } + + if (GB(r, 8, 8) < hs->mail_generation) { + uint amt = GB(r, 8, 8) / 8 + 1; + uint moved; + + if (_economy.fluct <= 0) amt = (amt + 1) >> 1; + t->new_max_mail += amt; + moved = MoveGoodsToStation(tile, 1, 1, CT_MAIL, amt); + t->new_act_mail += moved; + } } _current_player = OWNER_TOWN;