Conditional orders: Add mode to check waiting station cargo via next node
This commit is contained in:
@@ -1609,7 +1609,7 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
|
||||
break;
|
||||
|
||||
case OT_CONDITIONAL:
|
||||
if (mof != MOF_COND_VARIABLE && mof != MOF_COND_COMPARATOR && mof != MOF_COND_VALUE && mof != MOF_COND_VALUE_2 && mof != MOF_COND_DESTINATION) return CMD_ERROR;
|
||||
if (mof != MOF_COND_VARIABLE && mof != MOF_COND_COMPARATOR && mof != MOF_COND_VALUE && mof != MOF_COND_VALUE_2 && mof != MOF_COND_VALUE_3 && mof != MOF_COND_DESTINATION) return CMD_ERROR;
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -1711,6 +1711,7 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
|
||||
break;
|
||||
|
||||
case OCV_CARGO_WAITING_AMOUNT:
|
||||
if (data >= (1 << 16)) return CMD_ERROR;
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -1731,6 +1732,17 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
|
||||
}
|
||||
break;
|
||||
|
||||
case MOF_COND_VALUE_3:
|
||||
switch (order->GetConditionVariable()) {
|
||||
case OCV_CARGO_WAITING_AMOUNT:
|
||||
if (!(data == NEW_STATION || Station::GetIfValid(data) != nullptr)) return CMD_ERROR;
|
||||
break;
|
||||
|
||||
default:
|
||||
return CMD_ERROR;
|
||||
}
|
||||
break;
|
||||
|
||||
case MOF_COND_DESTINATION:
|
||||
if (data >= v->GetNumOrders()) return CMD_ERROR;
|
||||
break;
|
||||
@@ -1866,10 +1878,13 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
|
||||
case OCV_SLOT_OCCUPANCY:
|
||||
case OCV_TRAIN_IN_SLOT:
|
||||
case OCV_CARGO_LOAD_PERCENTAGE:
|
||||
case OCV_CARGO_WAITING_AMOUNT:
|
||||
order->GetXDataRef() = data;
|
||||
break;
|
||||
|
||||
case OCV_CARGO_WAITING_AMOUNT:
|
||||
SB(order->GetXDataRef(), 0, 16, data);
|
||||
break;
|
||||
|
||||
default:
|
||||
order->SetConditionValue(data);
|
||||
break;
|
||||
@@ -1880,6 +1895,10 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
|
||||
order->SetConditionValue(data);
|
||||
break;
|
||||
|
||||
case MOF_COND_VALUE_3:
|
||||
SB(order->GetXDataRef(), 16, 16, data + 2);
|
||||
break;
|
||||
|
||||
case MOF_COND_DESTINATION:
|
||||
order->SetConditionSkipToOrder(data);
|
||||
break;
|
||||
@@ -2592,7 +2611,13 @@ VehicleOrderID ProcessConditionalOrder(const Order *order, const Vehicle *v)
|
||||
}
|
||||
case OCV_CARGO_WAITING_AMOUNT: {
|
||||
StationID next_station = GetNextRealStation(v, order);
|
||||
if (Station::IsValidID(next_station)) skip_order = OrderConditionCompare(occ, Station::Get(next_station)->goods[value].cargo.AvailableCount(), order->GetXData());
|
||||
if (Station::IsValidID(next_station)) {
|
||||
if (GB(order->GetXData(), 16, 16) == 0) {
|
||||
skip_order = OrderConditionCompare(occ, Station::Get(next_station)->goods[value].cargo.AvailableCount(), GB(order->GetXData(), 0, 16));
|
||||
} else {
|
||||
skip_order = OrderConditionCompare(occ, Station::Get(next_station)->goods[value].cargo.AvailableViaCount(GB(order->GetXData(), 16, 16) - 2), GB(order->GetXData(), 0, 16));
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case OCV_CARGO_ACCEPTANCE: {
|
||||
|
||||
Reference in New Issue
Block a user