diff --git a/engine.c b/engine.c index ddaa6391dc..4862bd5fcb 100644 --- a/engine.c +++ b/engine.c @@ -110,18 +110,21 @@ static void CalcEngineReliability(Engine *e) if (age < e->duration_phase_1) { uint start = e->reliability_start; e->reliability = age * (e->reliability_max - start) / e->duration_phase_1 + start; - } else if ((age -= e->duration_phase_1) < e->duration_phase_2) { + } else if ((age -= e->duration_phase_1) < e->duration_phase_2 || _patches.never_expire_vehicles) { + /* We are at the peak of this engines life. It will have max reliability. + * This is also true if the engines never expire. They will not go bad over time */ e->reliability = e->reliability_max; } else if ((age -= e->duration_phase_2) < e->duration_phase_3) { uint max = e->reliability_max; e->reliability = (int)age * (int)(e->reliability_final - max) / e->duration_phase_3 + max; } else { - // time's up for this engine - // make it either available to all players (if never_expire_vehicles is enabled and if it was available earlier) - // or disable this engine completely - e->player_avail = (_patches.never_expire_vehicles && e->player_avail)? -1 : 0; + /* time's up for this engine. + * We will now completely retire this design */ + e->player_avail = 0; e->reliability = e->reliability_final; + InvalidateWindowClassesData(WC_BUILD_VEHICLE); // Kick this engine out of the lists } + InvalidateWindowClasses(WC_BUILD_VEHICLE); // Update to show the new reliability } void AddTypeToEngines(void) diff --git a/train_gui.c b/train_gui.c index d679288ddb..0782e38742 100644 --- a/train_gui.c +++ b/train_gui.c @@ -276,6 +276,27 @@ static void DrawTrainBuildWindow(Window *w) if (WP(w,buildtrain_d).data_invalidated) { GenerateBuildList(&WP(w,buildtrain_d).engines, &WP(w,buildtrain_d).num_engines, &WP(w,buildtrain_d).wagons, &WP(w,buildtrain_d).num_wagons, WP(w,buildtrain_d).railtype); WP(w,buildtrain_d).data_invalidated = false; + + /* Make sure that the selected engine is still in the list*/ + if (WP(w,buildtrain_d).sel_engine != INVALID_ENGINE) { + int i; + bool found = false; + if (HASBIT(WP(w,buildtrain_d).show_engine_wagon, 0)) { + for (i = 0; i < WP(w,buildtrain_d).num_engines; i++) { + if (WP(w,buildtrain_d).sel_engine != WP(w,buildtrain_d).engines[i]) continue; + found = true; + break; + } + } + if (!found && HASBIT(WP(w,buildtrain_d).show_engine_wagon, 1)) { + for (i = 0; i < WP(w,buildtrain_d).num_wagons; i++) { + if (WP(w,buildtrain_d).sel_engine != WP(w,buildtrain_d).wagons[i]) continue; + found = true; + break; + } + } + if (!found) WP(w,buildtrain_d).sel_engine = INVALID_ENGINE; + } } if (HASBIT(WP(w,buildtrain_d).show_engine_wagon, 0)) scrollcount += WP(w,buildtrain_d).num_engines; @@ -330,6 +351,7 @@ static void NewRailVehicleWndProc(Window *w, WindowEvent *e) WP(w,buildtrain_d).wagons = NULL; WP(w,buildtrain_d).show_engine_wagon = 3; WP(w,buildtrain_d).data_invalidated = true; + WP(w,buildtrain_d).sel_engine = INVALID_ENGINE; break; case WE_INVALIDATE_DATA: