Add conditional order for current time/date

This commit is contained in:
Jonathan G Rennison
2021-02-10 18:34:46 +00:00
parent 62ea3b7794
commit d42ad99688
7 changed files with 62 additions and 3 deletions

View File

@@ -1797,6 +1797,7 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
case OCV_CARGO_WAITING_AMOUNT:
case OCV_COUNTER_VALUE:
case OCV_TIME_DATE:
if (data >= (1 << 16)) return CMD_ERROR;
break;
@@ -1817,6 +1818,10 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
if (data != INVALID_TRACE_RESTRICT_COUNTER_ID && !TraceRestrictCounter::IsValidID(data)) return CMD_ERROR;
break;
case OCV_TIME_DATE:
if (data >= TRTDVF_END) return CMD_ERROR;
break;
default:
return CMD_ERROR;
}
@@ -1924,6 +1929,7 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
|| 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);
bool old_var_was_time = (order->GetConditionVariable() == OCV_TIME_DATE);
order->SetConditionVariable((OrderConditionVariable)data);
OrderConditionComparator occ = order->GetConditionComparator();
@@ -1944,6 +1950,11 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
if (occ == OCC_IS_TRUE || occ == OCC_IS_FALSE) order->SetConditionComparator(OCC_EQUALS);
break;
case OCV_TIME_DATE:
if (!old_var_was_time) order->GetXDataRef() = 0;
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());
@@ -1970,7 +1981,7 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
FALLTHROUGH;
default:
if (old_var_was_cargo || old_var_was_slot || old_var_was_counter) order->SetConditionValue(0);
if (old_var_was_cargo || old_var_was_slot || old_var_was_counter || old_var_was_time) order->SetConditionValue(0);
if (occ == OCC_IS_TRUE || occ == OCC_IS_FALSE) order->SetConditionComparator(OCC_EQUALS);
break;
}
@@ -1986,6 +1997,7 @@ 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_TIME_DATE:
order->GetXDataRef() = data;
break;
@@ -2780,6 +2792,10 @@ VehicleOrderID ProcessConditionalOrder(const Order *order, const Vehicle *v, boo
if (ctr != nullptr) skip_order = OrderConditionCompare(occ, ctr->value, GB(order->GetXData(), 0, 16));
break;
}
case OCV_TIME_DATE: {
skip_order = OrderConditionCompare(occ, GetTraceRestrictTimeDateValue(static_cast<TraceRestrictTimeDateValueField>(value)), order->GetXData());
break;
}
default: NOT_REACHED();
}