Fix order flags collision in OT_GOTO_DEPOT
Move depot wait is timetabled flag to xflags
This commit is contained in:
@@ -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" },
|
||||||
|
Reference in New Issue
Block a user