Change: Reorganise industry accept/produce arrays. (#10853)

Use a array of struct for each cargo instead of an array for each statistic.
This makes iterating for acceptance and production much simpler.
pct_transported is now calculated when needed.
This commit is contained in:
PeterN
2023-05-25 21:25:46 +01:00
committed by GitHub
parent db3b086a52
commit 584faaf064
16 changed files with 527 additions and 355 deletions

View File

@@ -382,21 +382,20 @@ bool FindSubsidyIndustryCargoRoute()
CargoID cid;
/* Randomize cargo type */
int num_cargos = 0;
uint cargo_index;
for (cargo_index = 0; cargo_index < lengthof(src_ind->produced_cargo); cargo_index++) {
if (IsValidCargoID(src_ind->produced_cargo[cargo_index])) num_cargos++;
}
int num_cargos = std::count_if(std::begin(src_ind->produced), std::end(src_ind->produced), [](const auto &p) { return IsValidCargoID(p.cargo); });
if (num_cargos == 0) return false; // industry produces nothing
int cargo_num = RandomRange(num_cargos) + 1;
for (cargo_index = 0; cargo_index < lengthof(src_ind->produced_cargo); cargo_index++) {
if (IsValidCargoID(src_ind->produced_cargo[cargo_index])) cargo_num--;
auto it = std::begin(src_ind->produced);
for (/* nothing */; it != std::end(src_ind->produced); ++it) {
if (IsValidCargoID(it->cargo)) cargo_num--;
if (cargo_num == 0) break;
}
assert(cargo_num == 0); // indicates loop didn't break as intended
cid = src_ind->produced_cargo[cargo_index];
trans = src_ind->last_month_pct_transported[cargo_index];
total = src_ind->last_month_production[cargo_index];
assert(it != std::end(src_ind->produced)); // indicates loop didn't end as intended
cid = it->cargo;
trans = it->history[LAST_MONTH].PctTransported();
total = it->history[LAST_MONTH].production;
/* Quit if no production in this industry
* or if the pct transported is already large enough