| @@ -304,6 +304,33 @@ static uint32 GetCountAndDistanceOfClosestInstance(byte param_setID, byte layout | ||
| return GetCountAndDistanceOfClosestInstance(parameter, layout_filter, town_filter, this->industry); | ||
| } | ||
|
|
||
| case 0x69: | ||
| case 0x6A: | ||
| case 0x6B: | ||
| case 0x6C: | ||
| case 0x6D: { | ||
| CargoID cargo = GetCargoTranslation(parameter, this->ro.grffile); | ||
| int index = this->industry->GetCargoProducedIndex(cargo); | ||
| if (index < 0) return 0; // invalid cargo | ||
| if (variable == 0x69) return this->industry->produced_cargo_waiting[index]; | ||
| if (variable == 0x6A) return this->industry->this_month_production[index]; | ||
| if (variable == 0x6B) return this->industry->this_month_transported[index]; | ||
| if (variable == 0x6C) return this->industry->last_month_production[index]; | ||
| if (variable == 0x6D) return this->industry->last_month_transported[index]; | ||
| NOT_REACHED(); | ||
| } | ||
|
|
||
|
|
||
| case 0x6E: | ||
| case 0x6F: { | ||
| CargoID cargo = GetCargoTranslation(parameter, this->ro.grffile); | ||
| int index = this->industry->GetCargoAcceptedIndex(cargo); | ||
| if (index < 0) return 0; // invalid cargo | ||
| if (variable == 0x6E) return this->industry->last_cargo_accepted_at[index]; | ||
| if (variable == 0x6F) return this->industry->incoming_cargo_waiting[index]; | ||
| NOT_REACHED(); | ||
| } | ||
|
|
||
| /* Get a variable from the persistent storage */ | ||
| case 0x7C: return (this->industry->psa != NULL) ? this->industry->psa->GetValue(parameter) : 0; | ||
|
|
||
| @@ -364,7 +391,10 @@ static uint32 GetCountAndDistanceOfClosestInstance(byte param_setID, byte layout | ||
|
|
||
| case 0xB0: return Clamp(this->industry->construction_date - DAYS_TILL_ORIGINAL_BASE_YEAR, 0, 65535); // Date when built since 1920 (in days) | ||
| case 0xB3: return this->industry->construction_type; // Construction type | ||
| case 0xB4: return Clamp(this->industry->last_cargo_accepted_at - DAYS_TILL_ORIGINAL_BASE_YEAR, 0, 65535); // Date last cargo accepted since 1920 (in days) | ||
| case 0xB4: { | ||
| Date *latest = std::max_element(this->industry->last_cargo_accepted_at, endof(this->industry->last_cargo_accepted_at)); | ||
| return Clamp((*latest) - DAYS_TILL_ORIGINAL_BASE_YEAR, 0, 65535); // Date last cargo accepted since 1920 (in days) | ||
| } | ||
| } | ||
|
|
||
| DEBUG(grf, 1, "Unhandled industry variable 0x%X", variable); | ||
| @@ -575,13 +605,28 @@ void IndustryProductionCallback(Industry *ind, int reason) | ||
| if (tgroup == NULL || tgroup->type != SGT_INDUSTRY_PRODUCTION) break; | ||
| const IndustryProductionSpriteGroup *group = (const IndustryProductionSpriteGroup *)tgroup; | ||
|
|
||
| bool deref = (group->version == 1); | ||
| bool deref = (group->version >= 1); | ||
|
|
||
| for (uint i = 0; i < 3; i++) { | ||
| ind->incoming_cargo_waiting[i] = Clamp(ind->incoming_cargo_waiting[i] - DerefIndProd(group->subtract_input[i], deref) * multiplier, 0, 0xFFFF); | ||
| } | ||
| for (uint i = 0; i < 2; i++) { | ||
| ind->produced_cargo_waiting[i] = Clamp(ind->produced_cargo_waiting[i] + max(DerefIndProd(group->add_output[i], deref), 0) * multiplier, 0, 0xFFFF); | ||
| if (group->version < 2) { | ||
|
This conversation was marked as resolved
by nielsmh
frosch123
The comments here are misleading. |
||
| /* Callback parameters map directly to industry cargo slot indices */ | ||
| for (uint i = 0; i < group->num_input; i++) { | ||
| ind->incoming_cargo_waiting[i] = Clamp(ind->incoming_cargo_waiting[i] - DerefIndProd(group->subtract_input[i], deref) * multiplier, 0, 0xFFFF); | ||
| } | ||
| for (uint i = 0; i < group->num_output; i++) { | ||
| ind->produced_cargo_waiting[i] = Clamp(ind->produced_cargo_waiting[i] + max(DerefIndProd(group->add_output[i], deref), 0) * multiplier, 0, 0xFFFF); | ||
| } | ||
| } else { | ||
| /* Callback receives list of cargos to apply for, which need to have their cargo slots in industry looked up */ | ||
| for (uint i = 0; i < group->num_input; i++) { | ||
| int cargo_index = ind->GetCargoAcceptedIndex(group->cargo_input[i]); | ||
| if (cargo_index < 0) continue; | ||
| ind->incoming_cargo_waiting[cargo_index] = Clamp(ind->incoming_cargo_waiting[cargo_index] - DerefIndProd(group->subtract_input[i], deref) * multiplier, 0, 0xFFFF); | ||
| } | ||
| for (uint i = 0; i < group->num_output; i++) { | ||
| int cargo_index = ind->GetCargoProducedIndex(group->cargo_output[i]); | ||
| if (cargo_index < 0) continue; | ||
| ind->produced_cargo_waiting[cargo_index] = Clamp(ind->produced_cargo_waiting[cargo_index] + max(DerefIndProd(group->add_output[i], deref), 0) * multiplier, 0, 0xFFFF); | ||
| } | ||
| } | ||
|
|
||
| int32 again = DerefIndProd(group->again, deref); | ||
| @@ -602,12 +647,7 @@ void IndustryProductionCallback(Industry *ind, int reason) | ||
| */ | ||
| bool IndustryTemporarilyRefusesCargo(Industry *ind, CargoID cargo_type) | ||
| { | ||
| assert( | ||
| cargo_type == ind->accepts_cargo[0] || cargo_type == ind->accepts_cargo[1] || cargo_type == ind->accepts_cargo[2] || cargo_type == ind->accepts_cargo[3] || | ||
| cargo_type == ind->accepts_cargo[4] || cargo_type == ind->accepts_cargo[5] || cargo_type == ind->accepts_cargo[6] || cargo_type == ind->accepts_cargo[7] || | ||
| cargo_type == ind->accepts_cargo[8] || cargo_type == ind->accepts_cargo[9] || cargo_type == ind->accepts_cargo[10] || cargo_type == ind->accepts_cargo[11] || | ||
| cargo_type == ind->accepts_cargo[12] || cargo_type == ind->accepts_cargo[13] || cargo_type == ind->accepts_cargo[14] || cargo_type == ind->accepts_cargo[15] | ||
| ); | ||
| assert(std::find(ind->accepts_cargo, endof(ind->accepts_cargo), cargo_type) != endof(ind->accepts_cargo)); | ||
|
|
||
| const IndustrySpec *indspec = GetIndustrySpec(ind->type); | ||
| if (HasBit(indspec->callback_mask, CBM_IND_REFUSE_CARGO)) { | ||
| @@ -384,12 +384,12 @@ bool FindSubsidyIndustryCargoRoute() | ||
|
|
||
| /* Randomize cargo type */ | ||
| int num_cargos = 0; | ||
| for (size_t ci = 0; ci < lengthof(src_ind->produced_cargo); ci++) { | ||
| if (src_ind->produced_cargo[ci] != CT_INVALID) num_cargos++; | ||
| uint cargo_index; | ||
| for (cargo_index = 0; cargo_index < lengthof(src_ind->produced_cargo); cargo_index++) { | ||
| if (src_ind->produced_cargo[cargo_index] != CT_INVALID) num_cargos++; | ||
nielsmh
Why such a weird algorithm to select a random cargo type. Could as well add valid types to a std::vector and select an element from that. |
||
| } | ||
| if (num_cargos == 0) return false; // industry produces nothing | ||
| int cargo_num = RandomRange(num_cargos) + 1; | ||
| int cargo_index; | ||
| for (cargo_index = 0; cargo_index < lengthof(src_ind->produced_cargo); cargo_index++) { | ||
nielsmh
This algorithm feels overly complicated. Does it seem right? |
||
| if (src_ind->produced_cargo[cargo_index] != CT_INVALID) cargo_num--; | ||
| if (cargo_num == 0) break; | ||
frosch123Nov 3, 2018
Member
DisableGrf(..) if num_cargoes > lengthof(tsp->acceptance)