Fix order flags collision in OT_GOTO_DEPOT

Move depot wait is timetabled flag to xflags
pull/661/head
Jonathan G Rennison 4 months ago
parent 821c5970db
commit c6893388ab

@ -53,7 +53,7 @@ void ClearOrderDestinationRefcountMap();
/* /*
* xflags bits: * xflags bits:
* Bit 0: OT_CONDITIONAL: IsWaitTimetabled(): For branch travel time * Bit 0: OT_CONDITIONAL and OT_GOTO_DEPOT: IsWaitTimetabled(): Depot: wait is timetabled, conditional: branch travel time
* Bit 1: IsWaitFixed(): Wait time fixed * Bit 1: IsWaitFixed(): Wait time fixed
* Bits 2-3: GetLeaveType(): Order leave type * Bits 2-3: GetLeaveType(): Order leave type
* Bit 4: IsTravelFixed(): Travel time fixed * Bit 4: IsTravelFixed(): Travel time fixed
@ -170,6 +170,11 @@ public:
return this->extra->xdata2; return this->extra->xdata2;
} }
inline uint16_t GetRawFlags() const
{
return this->flags;
}
Order *next; ///< Pointer to next order. If nullptr, end of list Order *next; ///< Pointer to next order. If nullptr, end of list
Order() : flags(0), refit_cargo(CARGO_NO_REFIT), max_speed(UINT16_MAX) {} Order() : flags(0), refit_cargo(CARGO_NO_REFIT), max_speed(UINT16_MAX) {}
@ -475,7 +480,7 @@ public:
inline bool IsWaitTimetabled() const inline bool IsWaitTimetabled() const
{ {
if (this->HasNoTimetableTimes()) return true; if (this->HasNoTimetableTimes()) return true;
return this->IsType(OT_CONDITIONAL) ? HasBit(this->GetXFlags(), 0) : HasBit(this->flags, 3); return (this->IsType(OT_CONDITIONAL) || this->IsType(OT_GOTO_DEPOT)) ? HasBit(this->GetXFlags(), 0) : HasBit(this->flags, 3);
} }
/** Does this order have an explicit travel time set? */ /** Does this order have an explicit travel time set? */
inline bool IsTravelTimetabled() const inline bool IsTravelTimetabled() const
@ -504,7 +509,8 @@ public:
inline void SetWaitTimetabled(bool timetabled) inline void SetWaitTimetabled(bool timetabled)
{ {
if (this->HasNoTimetableTimes()) return; if (this->HasNoTimetableTimes()) return;
if (this->IsType(OT_CONDITIONAL)) { if (this->IsType(OT_CONDITIONAL) || this->IsType(OT_GOTO_DEPOT)) {
if (this->extra == nullptr && !timetabled) return;
SB(this->GetXFlagsRef(), 0, 1, timetabled ? 1 : 0); SB(this->GetXFlagsRef(), 0, 1, timetabled ? 1 : 0);
} else { } else {
SB(this->flags, 3, 1, timetabled ? 1 : 0); SB(this->flags, 3, 1, timetabled ? 1 : 0);

@ -2153,15 +2153,25 @@ bool AfterLoadGame()
} }
if (IsSavegameVersionBefore(SLV_DEPOT_UNBUNCHING) && SlXvIsFeatureMissing(XSLFI_DEPOT_UNBUNCHING)) { if (IsSavegameVersionBefore(SLV_DEPOT_UNBUNCHING) && SlXvIsFeatureMissing(XSLFI_DEPOT_UNBUNCHING)) {
/* OrderDepotActionFlags were moved, instead of starting at bit 4 they now start at bit 3. */ /* OrderDepotActionFlags were moved, instead of starting at bit 4 they now start at bit 3,
* this clobbers the wait is timetabled flag of XSLFI_TT_WAIT_IN_DEPOT (version 1). */
for (Order *order : Order::Iterate()) { for (Order *order : Order::Iterate()) {
if (!order->IsType(OT_GOTO_DEPOT)) continue; if (!order->IsType(OT_GOTO_DEPOT)) continue;
if (SlXvIsFeaturePresent(XSLFI_TT_WAIT_IN_DEPOT, 1, 1)) {
/* Bit 3 was previously the wait is timetabled flag, move that to xflags (version 2 of XSLFI_TT_WAIT_IN_DEPOT) */
order->SetWaitTimetabled(HasBit(order->GetRawFlags(), 3));
}
OrderDepotActionFlags flags = (OrderDepotActionFlags)(order->GetDepotActionType() >> 1); OrderDepotActionFlags flags = (OrderDepotActionFlags)(order->GetDepotActionType() >> 1);
if (((flags & (1 << 2)) != 0) && SlXvIsFeatureMissing(XSLFI_DEPOT_UNBUNCHING)) { if (((flags & (1 << 2)) != 0) && !SlXvIsFeatureMissing(XSLFI_DEPOT_UNBUNCHING)) {
flags ^= (ODATFB_SELL | ODATFB_UNBUNCH); // Unbunch moved from bit 2 to bit 3 flags ^= (ODATFB_SELL | ODATFB_UNBUNCH); // Unbunch moved from bit 2 to bit 3
} }
order->SetDepotActionType(flags); order->SetDepotActionType(flags);
} }
} else if (SlXvIsFeaturePresent(XSLFI_TT_WAIT_IN_DEPOT, 1, 1)) {
for (Order *order : Order::Iterate()) {
/* Bit 3 was previously the wait is timetabled flag, move that to xflags (version 2 of XSLFI_TT_WAIT_IN_DEPOT) */
if (order->IsType(OT_GOTO_DEPOT)) order->SetWaitTimetabled(HasBit(order->GetRawFlags(), 3));
}
} }
if (SlXvIsFeaturePresent(XSLFI_JOKERPP, 1, SL_JOKER_1_23)) { if (SlXvIsFeaturePresent(XSLFI_JOKERPP, 1, SL_JOKER_1_23)) {

@ -98,7 +98,7 @@ const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = {
{ XSLFI_SIG_TUNNEL_BRIDGE, XSCF_NULL, 10, 10, "signal_tunnel_bridge", nullptr, nullptr, "XBSS" }, { XSLFI_SIG_TUNNEL_BRIDGE, XSCF_NULL, 10, 10, "signal_tunnel_bridge", nullptr, nullptr, "XBSS" },
{ XSLFI_IMPROVED_BREAKDOWNS, XSCF_NULL, 8, 8, "improved_breakdowns", nullptr, nullptr, nullptr }, { XSLFI_IMPROVED_BREAKDOWNS, XSCF_NULL, 8, 8, "improved_breakdowns", nullptr, nullptr, nullptr },
{ XSLFI_CONSIST_BREAKDOWN_FLAG, XSCF_NULL, 1, 1, "consist_breakdown_flag", nullptr, nullptr, nullptr }, { XSLFI_CONSIST_BREAKDOWN_FLAG, XSCF_NULL, 1, 1, "consist_breakdown_flag", nullptr, nullptr, nullptr },
{ XSLFI_TT_WAIT_IN_DEPOT, XSCF_NULL, 1, 1, "tt_wait_in_depot", nullptr, nullptr, nullptr }, { XSLFI_TT_WAIT_IN_DEPOT, XSCF_NULL, 2, 2, "tt_wait_in_depot", nullptr, nullptr, nullptr },
{ XSLFI_AUTO_TIMETABLE, XSCF_NULL, 5, 5, "auto_timetables", nullptr, nullptr, nullptr }, { XSLFI_AUTO_TIMETABLE, XSCF_NULL, 5, 5, "auto_timetables", nullptr, nullptr, nullptr },
{ XSLFI_VEHICLE_REPAIR_COST, XSCF_NULL, 2, 2, "vehicle_repair_cost", nullptr, nullptr, nullptr }, { XSLFI_VEHICLE_REPAIR_COST, XSCF_NULL, 2, 2, "vehicle_repair_cost", nullptr, nullptr, nullptr },
{ XSLFI_ENH_VIEWPORT_PLANS, XSCF_IGNORABLE_ALL, 4, 4, "enh_viewport_plans", nullptr, nullptr, "PLAN" }, { XSLFI_ENH_VIEWPORT_PLANS, XSCF_IGNORABLE_ALL, 4, 4, "enh_viewport_plans", nullptr, nullptr, "PLAN" },

Loading…
Cancel
Save