Add conditional order which tests counter value

This commit is contained in:
Jonathan G Rennison
2020-08-31 22:52:26 +01:00
parent 817bc44a3e
commit 9ee8091ecc
7 changed files with 115 additions and 9 deletions

View File

@@ -1679,6 +1679,7 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
if (data == OCV_FREE_PLATFORMS && v->type != VEH_TRAIN) return CMD_ERROR;
if (data == OCV_SLOT_OCCUPANCY && v->type != VEH_TRAIN) return CMD_ERROR;
if (data == OCV_TRAIN_IN_SLOT && v->type != VEH_TRAIN) return CMD_ERROR;
if (data == OCV_COUNTER_VALUE && v->type != VEH_TRAIN) return CMD_ERROR;
if (data >= OCV_END) return CMD_ERROR;
break;
@@ -1730,6 +1731,7 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
break;
case OCV_CARGO_WAITING_AMOUNT:
case OCV_COUNTER_VALUE:
if (data >= (1 << 16)) return CMD_ERROR;
break;
@@ -1746,6 +1748,10 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
if (!(data < NUM_CARGO && CargoSpec::Get(data)->IsValid())) return CMD_ERROR;
break;
case OCV_COUNTER_VALUE:
if (data != INVALID_TRACE_RESTRICT_COUNTER_ID && !TraceRestrictCounter::IsValidID(data)) return CMD_ERROR;
break;
default:
return CMD_ERROR;
}
@@ -1852,6 +1858,7 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
bool old_var_was_cargo = (order->GetConditionVariable() == OCV_CARGO_ACCEPTANCE || order->GetConditionVariable() == OCV_CARGO_WAITING
|| order->GetConditionVariable() == OCV_CARGO_LOAD_PERCENTAGE || order->GetConditionVariable() == OCV_CARGO_WAITING_AMOUNT);
bool old_var_was_slot = (order->GetConditionVariable() == OCV_SLOT_OCCUPANCY || order->GetConditionVariable() == OCV_TRAIN_IN_SLOT);
bool old_var_was_counter = (order->GetConditionVariable() == OCV_COUNTER_VALUE);
order->SetConditionVariable((OrderConditionVariable)data);
OrderConditionComparator occ = order->GetConditionComparator();
@@ -1867,6 +1874,11 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
if (occ != OCC_IS_TRUE && occ != OCC_IS_FALSE) order->SetConditionComparator(OCC_IS_TRUE);
break;
case OCV_COUNTER_VALUE:
if (!old_var_was_counter) order->GetXDataRef() = INVALID_TRACE_RESTRICT_COUNTER_ID << 16;
if (occ == OCC_IS_TRUE || occ == OCC_IS_FALSE) order->SetConditionComparator(OCC_EQUALS);
break;
case OCV_CARGO_ACCEPTANCE:
case OCV_CARGO_WAITING:
if (!old_var_was_cargo) order->SetConditionValue((uint16) GetFirstValidCargo());
@@ -1893,7 +1905,7 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
FALLTHROUGH;
default:
if (old_var_was_cargo || old_var_was_slot) order->SetConditionValue(0);
if (old_var_was_cargo || old_var_was_slot || old_var_was_counter) order->SetConditionValue(0);
if (occ == OCC_IS_TRUE || occ == OCC_IS_FALSE) order->SetConditionComparator(OCC_EQUALS);
break;
}
@@ -1913,6 +1925,7 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
break;
case OCV_CARGO_WAITING_AMOUNT:
case OCV_COUNTER_VALUE:
SB(order->GetXDataRef(), 0, 16, data);
break;
@@ -1923,7 +1936,15 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
break;
case MOF_COND_VALUE_2:
order->SetConditionValue(data);
switch (order->GetConditionVariable()) {
case OCV_COUNTER_VALUE:
SB(order->GetXDataRef(), 16, 16, data);
break;
default:
order->SetConditionValue(data);
break;
}
break;
case MOF_COND_VALUE_3:
@@ -2698,6 +2719,11 @@ VehicleOrderID ProcessConditionalOrder(const Order *order, const Vehicle *v, boo
break;
}
case OCV_REMAINING_LIFETIME: skip_order = OrderConditionCompare(occ, max(v->max_age - v->age + DAYS_IN_LEAP_YEAR - 1, 0) / DAYS_IN_LEAP_YEAR, value); break;
case OCV_COUNTER_VALUE: {
const TraceRestrictCounter* ctr = TraceRestrictCounter::GetIfValid(GB(order->GetXData(), 16, 16));
if (ctr != nullptr) skip_order = OrderConditionCompare(occ, ctr->value, GB(order->GetXData(), 0, 16));
break;
}
default: NOT_REACHED();
}