Add timetable lateness/earliness conditional order

This commit is contained in:
Jonathan G Rennison
2021-03-27 23:10:04 +00:00
parent 63fda2f16e
commit 912c62d749
11 changed files with 132 additions and 4 deletions

View File

@@ -1783,6 +1783,10 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
if (data != OCC_IS_TRUE && data != OCC_IS_FALSE && data != OCC_EQUALS && data != OCC_NOT_EQUALS) return CMD_ERROR;
break;
case OCV_TIMETABLE:
if (data == OCC_IS_TRUE || data == OCC_IS_FALSE || data == OCC_EQUALS || data == OCC_NOT_EQUALS) return CMD_ERROR;
break;
default:
if (data == OCC_IS_TRUE || data == OCC_IS_FALSE) return CMD_ERROR;
break;
@@ -1815,6 +1819,7 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
case OCV_CARGO_WAITING_AMOUNT:
case OCV_COUNTER_VALUE:
case OCV_TIME_DATE:
case OCV_TIMETABLE:
if (data >= (1 << 16)) return CMD_ERROR;
break;
@@ -1839,6 +1844,10 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
if (data >= TRTDVF_END) return CMD_ERROR;
break;
case OCV_TIMETABLE:
if (data >= OTCM_END) return CMD_ERROR;
break;
default:
return CMD_ERROR;
}
@@ -1951,6 +1960,7 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
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);
bool old_var_was_tt = (order->GetConditionVariable() == OCV_TIMETABLE);
order->SetConditionVariable((OrderConditionVariable)data);
OrderConditionComparator occ = order->GetConditionComparator();
@@ -1976,6 +1986,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_TIMETABLE:
if (!old_var_was_tt) order->GetXDataRef() = 0;
if (occ == OCC_IS_TRUE || occ == OCC_IS_FALSE || occ == OCC_EQUALS || occ == OCC_NOT_EQUALS) order->SetConditionComparator(OCC_LESS_THAN);
break;
case OCV_CARGO_ACCEPTANCE:
case OCV_CARGO_WAITING:
if (!old_var_was_cargo) order->SetConditionValue((uint16) GetFirstValidCargo());
@@ -2002,7 +2017,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 || old_var_was_time) order->SetConditionValue(0);
if (old_var_was_cargo || old_var_was_slot || old_var_was_counter || old_var_was_time || old_var_was_tt) order->SetConditionValue(0);
if (occ == OCC_IS_TRUE || occ == OCC_IS_FALSE) order->SetConditionComparator(OCC_EQUALS);
break;
}
@@ -2019,6 +2034,7 @@ CommandCost CmdModifyOrder(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
case OCV_TRAIN_IN_SLOT:
case OCV_CARGO_LOAD_PERCENTAGE:
case OCV_TIME_DATE:
case OCV_TIMETABLE:
order->GetXDataRef() = data;
break;
@@ -2821,6 +2837,23 @@ VehicleOrderID ProcessConditionalOrder(const Order *order, const Vehicle *v, boo
skip_order = OrderConditionCompare(occ, GetTraceRestrictTimeDateValue(static_cast<TraceRestrictTimeDateValueField>(value)), order->GetXData());
break;
}
case OCV_TIMETABLE: {
int tt_value = 0;
switch (static_cast<OrderTimetableConditionMode>(value)) {
case OTCM_LATENESS:
tt_value = v->lateness_counter;
break;
case OTCM_EARLINESS:
tt_value = -v->lateness_counter;
break;
default:
break;
}
skip_order = OrderConditionCompare(occ, tt_value, order->GetXData());
break;
}
default: NOT_REACHED();
}