Changeset - r26727:e2c8c42642ff
[Not reviewed]
master
0 1 0
Rubidium - 17 months ago 2023-01-06 17:16:28
rubidium@openttd.org
Fix: bad oddness checks

Modulo on a signed number returns negative values for negative values, so
i % 2 == 1 will only return true for positive odd numbers, whereas i % 2 != 0
returns true for both positive and negative odd numbers.
1 file changed with 4 insertions and 4 deletions:
0 comments (0 inline, 0 general)
src/timetable_gui.cpp
Show inline comments
 
@@ -310,13 +310,13 @@ struct TimetableWindow : Window {
 
			bool disable = true;
 
			if (selected != -1) {
 
				const Order *order = v->GetOrder(((selected + 1) / 2) % v->GetNumOrders());
 
				if (selected % 2 == 1) {
 
				if (selected % 2 != 0) {
 
					disable = order != nullptr && (order->IsType(OT_CONDITIONAL) || order->IsType(OT_IMPLICIT));
 
				} else {
 
					disable = order == nullptr || ((!order->IsType(OT_GOTO_STATION) || (order->GetNonStopType() & ONSF_NO_STOP_AT_DESTINATION_STATION)) && !order->IsType(OT_CONDITIONAL));
 
				}
 
			}
 
			bool disable_speed = disable || selected % 2 != 1 || v->type == VEH_AIRCRAFT;
 
			bool disable_speed = disable || selected % 2 == 0 || v->type == VEH_AIRCRAFT;
 

	
 
			this->SetWidgetDisabledState(WID_VT_CHANGE_TIME, disable);
 
			this->SetWidgetDisabledState(WID_VT_CLEAR_TIME, disable);
 
@@ -505,7 +505,7 @@ struct TimetableWindow : Window {
 
	static inline std::tuple<VehicleOrderID, ModifyTimetableFlags> PackTimetableArgs(const Vehicle *v, uint selected, bool speed)
 
	{
 
		uint order_number = (selected + 1) / 2;
 
		ModifyTimetableFlags mtf = (selected % 2 == 1) ? (speed ? MTF_TRAVEL_SPEED : MTF_TRAVEL_TIME) : MTF_WAIT_TIME;
 
		ModifyTimetableFlags mtf = (selected % 2 != 0) ? (speed ? MTF_TRAVEL_SPEED : MTF_TRAVEL_TIME) : MTF_WAIT_TIME;
 

	
 
		if (order_number >= v->GetNumOrders()) order_number = 0;
 

	
 
@@ -543,7 +543,7 @@ struct TimetableWindow : Window {
 
				StringID current = STR_EMPTY;
 

	
 
				if (order != nullptr) {
 
					uint time = (selected % 2 == 1) ? order->GetTravelTime() : order->GetWaitTime();
 
					uint time = (selected % 2 != 0) ? order->GetTravelTime() : order->GetWaitTime();
 
					if (!_settings_client.gui.timetable_in_ticks) time /= DAY_TICKS;
 

	
 
					if (time != 0) {
0 comments (0 inline, 0 general)