Add try to acquire slot order subtype

This commit is contained in:
Jonathan G Rennison
2024-01-11 20:58:45 +00:00
parent 2fc631b15b
commit 041f36d565
7 changed files with 118 additions and 77 deletions

View File

@@ -247,6 +247,13 @@ void Order::MakeReleaseSlot()
this->flags = OSST_RELEASE;
}
void Order::MakeTryAcquireSlot()
{
this->type = OT_SLOT;
this->dest = INVALID_TRACE_RESTRICT_SLOT_ID;
this->flags = OSST_TRY_ACQUIRE;
}
void Order::MakeChangeCounter()
{
this->type = OT_COUNTER;
@@ -1277,6 +1284,7 @@ CommandCost CmdInsertOrderIntl(DoCommandFlag flags, Vehicle *v, VehicleOrderID s
}
switch (new_order.GetSlotSubType()) {
case OSST_RELEASE:
case OSST_TRY_ACQUIRE:
break;
default:
@@ -3070,6 +3078,31 @@ static std::vector<TraceRestrictSlotID> _pco_deferred_slot_releases;
static btree::btree_map<TraceRestrictCounterID, int32_t> _pco_deferred_counter_values;
static btree::btree_map<Order *, int8_t> _pco_deferred_original_percent_cond;
static bool ExecuteVehicleInSlotOrderCondition(VehicleID vehicle, TraceRestrictSlot *slot, ProcessConditionalOrderMode mode, bool acquire)
{
bool occupant = slot->IsOccupant(vehicle);
if (mode == PCO_DEFERRED) {
if (occupant && find_index(_pco_deferred_slot_releases, slot->index) >= 0) {
occupant = false;
} else if (!occupant && find_index(_pco_deferred_slot_acquires, slot->index) >= 0) {
occupant = true;
}
}
if (acquire) {
if (!occupant && mode == PCO_EXEC) {
occupant = slot->Occupy(vehicle);
}
if (!occupant && mode == PCO_DEFERRED) {
occupant = slot->OccupyDryRun(vehicle);
if (occupant) {
include(_pco_deferred_slot_acquires, slot->index);
container_unordered_remove(_pco_deferred_slot_releases, slot->index);
}
}
}
return occupant;
}
/**
* Process a conditional order and determine the next order.
* @param order the order the vehicle currently has
@@ -3140,30 +3173,14 @@ VehicleOrderID ProcessConditionalOrder(const Order *order, const Vehicle *v, Pro
break;
}
case OCV_VEH_IN_SLOT: {
TraceRestrictSlotID slot_id = order->GetXData();
TraceRestrictSlot* slot = TraceRestrictSlot::GetIfValid(slot_id);
TraceRestrictSlot *slot = TraceRestrictSlot::GetIfValid(order->GetXData());
if (slot != nullptr) {
bool occupant = slot->IsOccupant(v->index);
if (mode == PCO_DEFERRED) {
if (occupant && find_index(_pco_deferred_slot_releases, slot_id) >= 0) {
occupant = false;
} else if (!occupant && find_index(_pco_deferred_slot_acquires, slot_id) >= 0) {
occupant = true;
}
}
bool acquire = false;
if (occ == OCC_EQUALS || occ == OCC_NOT_EQUALS) {
if (!occupant && mode == PCO_EXEC) {
occupant = slot->Occupy(v->index);
}
if (!occupant && mode == PCO_DEFERRED) {
occupant = slot->OccupyDryRun(v->index);
if (occupant) {
include(_pco_deferred_slot_acquires, slot_id);
container_unordered_remove(_pco_deferred_slot_releases, slot_id);
}
}
acquire = true;
occ = (occ == OCC_EQUALS) ? OCC_IS_TRUE : OCC_IS_FALSE;
}
bool occupant = ExecuteVehicleInSlotOrderCondition(v->index, slot, mode, acquire);
skip_order = OrderConditionCompare(occ, occupant, value);
}
break;
@@ -3254,6 +3271,9 @@ VehicleOrderID AdvanceOrderIndexDeferred(const Vehicle *v, VehicleOrderID index)
include(_pco_deferred_slot_releases, order->GetDestination());
container_unordered_remove(_pco_deferred_slot_acquires, order->GetDestination());
break;
case OSST_TRY_ACQUIRE:
ExecuteVehicleInSlotOrderCondition(v->index, TraceRestrictSlot::Get(order->GetDestination()), PCO_DEFERRED, true);
break;
}
}
break;
@@ -3435,6 +3455,9 @@ bool UpdateOrderDest(Vehicle *v, const Order *order, int conditional_depth, bool
case OSST_RELEASE:
slot->Vacate(v->index);
break;
case OSST_TRY_ACQUIRE:
slot->Occupy(v->index);
break;
}
}
}