mirror of https://github.com/OpenTTD/OpenTTD
(svn r17857) -Fix (r10442): [NewGRF] 'subtract-in' is also signed for production callback version 0.
parent
64f9ee3a2d
commit
8e23ba540c
|
@ -2966,15 +2966,15 @@ static void NewSpriteGroup(byte *buf, size_t len)
|
||||||
group->version = type;
|
group->version = type;
|
||||||
if (type == 0) {
|
if (type == 0) {
|
||||||
for (uint i = 0; i < 3; i++) {
|
for (uint i = 0; i < 3; i++) {
|
||||||
group->substract_input[i] = grf_load_word(&buf);
|
group->subtract_input[i] = (int16)grf_load_word(&buf); // signed
|
||||||
}
|
}
|
||||||
for (uint i = 0; i < 2; i++) {
|
for (uint i = 0; i < 2; i++) {
|
||||||
group->add_output[i] = grf_load_word(&buf);
|
group->add_output[i] = grf_load_word(&buf); // unsigned
|
||||||
}
|
}
|
||||||
group->again = grf_load_byte(&buf);
|
group->again = grf_load_byte(&buf);
|
||||||
} else {
|
} else {
|
||||||
for (uint i = 0; i < 3; i++) {
|
for (uint i = 0; i < 3; i++) {
|
||||||
group->substract_input[i] = grf_load_byte(&buf);
|
group->subtract_input[i] = grf_load_byte(&buf);
|
||||||
}
|
}
|
||||||
for (uint i = 0; i < 2; i++) {
|
for (uint i = 0; i < 2; i++) {
|
||||||
group->add_output[i] = grf_load_byte(&buf);
|
group->add_output[i] = grf_load_byte(&buf);
|
||||||
|
|
|
@ -502,7 +502,7 @@ bool CheckIfCallBackAllowsAvailability(IndustryType type, IndustryAvailabilityCa
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32 DerefIndProd(uint field, bool use_register)
|
static int32 DerefIndProd(int field, bool use_register)
|
||||||
{
|
{
|
||||||
return use_register ? (int32)GetRegister(field) : field;
|
return use_register ? (int32)GetRegister(field) : field;
|
||||||
}
|
}
|
||||||
|
@ -543,7 +543,7 @@ void IndustryProductionCallback(Industry *ind, int reason)
|
||||||
bool deref = (group->version == 1);
|
bool deref = (group->version == 1);
|
||||||
|
|
||||||
for (uint i = 0; i < 3; i++) {
|
for (uint i = 0; i < 3; i++) {
|
||||||
ind->incoming_cargo_waiting[i] = Clamp(ind->incoming_cargo_waiting[i] - DerefIndProd(group->substract_input[i], deref) * multiplier, 0, 0xFFFF);
|
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++) {
|
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);
|
ind->produced_cargo_waiting[i] = Clamp(ind->produced_cargo_waiting[i] + max(DerefIndProd(group->add_output[i], deref), 0) * multiplier, 0, 0xFFFF);
|
||||||
|
|
|
@ -279,8 +279,8 @@ struct IndustryProductionSpriteGroup : SpriteGroup {
|
||||||
IndustryProductionSpriteGroup() : SpriteGroup(SGT_INDUSTRY_PRODUCTION) {}
|
IndustryProductionSpriteGroup() : SpriteGroup(SGT_INDUSTRY_PRODUCTION) {}
|
||||||
|
|
||||||
uint8 version;
|
uint8 version;
|
||||||
uint16 substract_input[3];
|
int16 subtract_input[3]; // signed
|
||||||
uint16 add_output[2];
|
uint16 add_output[2]; // unsigned
|
||||||
uint8 again;
|
uint8 again;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue