Index: src/lang/english.txt =================================================================== --- src/lang/english.txt (revision 12968) +++ src/lang/english.txt (working copy) @@ -2714,6 +2714,7 @@ STR_ORDER_CONDITIONAL_AGE :Vehicle age (years) STR_ORDER_CONDITIONAL_REQUIRES_SERVICE :Requires service STR_ORDER_CONDITIONAL_UNCONDITIONALLY :Always +STR_ORDER_CONDITIONAL_RANDOM :Random chance (%) STR_ORDER_CONDITIONAL_COMPARATOR_EQUALS :is equal to STR_ORDER_CONDITIONAL_COMPARATOR_NOT_EQUALS :is not equal to STR_ORDER_CONDITIONAL_COMPARATOR_LESS_THAN :is less than @@ -2726,6 +2727,7 @@ STR_CONDITIONAL_UNCONDITIONAL :Jump to order {COMMA} STR_CONDITIONAL_NUM :Jump to order {COMMA} when {STRING} {STRING} {COMMA} STR_CONDITIONAL_TRUE_FALSE :Jump to order {COMMA} when {STRING} {STRING} +STR_CONDITIONAL_RANDOM :Jump to order {COMMA} with a random chance of {COMMA}% STR_TIMETABLE_TRAVEL_NOT_TIMETABLED :Travel (not timetabled) STR_TIMETABLE_TRAVEL_FOR :Travel for {STRING1} Index: src/order_cmd.cpp =================================================================== --- src/order_cmd.cpp (revision 12968) +++ src/order_cmd.cpp (working copy) @@ -968,6 +968,7 @@ case OCV_LOAD_PERCENTAGE: case OCV_RELIABILITY: + case OCV_RANDOM: if (order->GetConditionValue() > 100) order->SetConditionValue(100); /* FALL THROUGH */ default: @@ -1755,6 +1756,7 @@ case OCV_AGE: skip_order = OrderConditionCompare(occ, v->age / 366, value); break; case OCV_REQUIRES_SERVICE: skip_order = OrderConditionCompare(occ, v->NeedsServicing(), value); break; case OCV_UNCONDITIONALLY: skip_order = true; break; + case OCV_RANDOM: skip_order = Chance16(value, 100); break; default: NOT_REACHED(); } UpdateVehicleTimetable(v, true); Index: src/order_gui.cpp =================================================================== --- src/order_gui.cpp (revision 12968) +++ src/order_gui.cpp (working copy) @@ -193,6 +193,7 @@ STR_ORDER_CONDITIONAL_AGE, STR_ORDER_CONDITIONAL_REQUIRES_SERVICE, STR_ORDER_CONDITIONAL_UNCONDITIONALLY, + STR_ORDER_CONDITIONAL_RANDOM, INVALID_STRING_ID, }; @@ -289,17 +290,24 @@ case OT_CONDITIONAL: SetDParam(2, order->GetConditionSkipToOrder() + 1); - if (order->GetConditionVariable() == OCV_UNCONDITIONALLY) { - SetDParam(1, STR_CONDITIONAL_UNCONDITIONAL); - } else { - OrderConditionComparator occ = order->GetConditionComparator(); - SetDParam(1, (occ == OCC_IS_TRUE || occ == OCC_IS_FALSE) ? STR_CONDITIONAL_TRUE_FALSE : STR_CONDITIONAL_NUM); - SetDParam(3, STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE + order->GetConditionVariable()); - SetDParam(4, STR_ORDER_CONDITIONAL_COMPARATOR_EQUALS + occ); + uint value = order->GetConditionValue(); + switch (order->GetConditionVariable()) { + case OCV_UNCONDITIONALLY: + SetDParam(1, STR_CONDITIONAL_UNCONDITIONAL); + break; + case OCV_RANDOM: + SetDParam(1, STR_CONDITIONAL_RANDOM); + SetDParam(3, value); + break; + default: + OrderConditionComparator occ = order->GetConditionComparator(); + SetDParam(1, (occ == OCC_IS_TRUE || occ == OCC_IS_FALSE) ? STR_CONDITIONAL_TRUE_FALSE : STR_CONDITIONAL_NUM); + SetDParam(3, STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE + order->GetConditionVariable()); + SetDParam(4, STR_ORDER_CONDITIONAL_COMPARATOR_EQUALS + occ); - uint value = order->GetConditionValue(); - if (order->GetConditionVariable() == OCV_MAX_SPEED) value = ConvertSpeedToDisplaySpeed(value); - SetDParam(5, value); + if (order->GetConditionVariable() == OCV_MAX_SPEED) value = ConvertSpeedToDisplaySpeed(value); + SetDParam(5, value); + break; } break; @@ -386,7 +394,7 @@ w->ShowWidget(ORDER_WIDGET_COND_VALUE); OrderConditionVariable ocv = order->GetConditionVariable(); - w->SetWidgetDisabledState(ORDER_WIDGET_COND_COMPARATOR, ocv == OCV_UNCONDITIONALLY); + w->SetWidgetDisabledState(ORDER_WIDGET_COND_COMPARATOR, ocv == OCV_UNCONDITIONALLY || ocv == OCV_RANDOM); w->SetWidgetDisabledState(ORDER_WIDGET_COND_VALUE, ocv == OCV_REQUIRES_SERVICE || ocv == OCV_UNCONDITIONALLY); uint value = order->GetConditionValue(); @@ -910,6 +918,7 @@ case OCV_RELIABILITY: case OCV_LOAD_PERCENTAGE: + case OCV_RANDOM: value = Clamp(value, 0, 100); default: Index: src/order_type.h =================================================================== --- src/order_type.h (revision 12968) +++ src/order_type.h (working copy) @@ -96,6 +96,7 @@ OCV_AGE, ///< Skip based on the age OCV_REQUIRES_SERVICE, ///< Skip when the vehicle requires service OCV_UNCONDITIONALLY, ///< Always skip + OCV_RANDOM, ///< Skip based on a random check OCV_END };