# HG changeset patch # User darkvater # Date 1094303169 0 # Node ID 8fef5e5752d6632a865204ad2b18b7eaba525c3f # Parent 81e9878f3678219d79d71559657f6593eb769974 (svn r157) -Feature: [1009708] Percent-based service intervals. Send a vehicle to depot after it has lost X% of its reliability (mivlad) diff -r 81e9878f3678 -r 8fef5e5752d6 aircraft_cmd.c --- a/aircraft_cmd.c Fri Sep 03 21:48:21 2004 +0000 +++ b/aircraft_cmd.c Sat Sep 04 13:06:09 2004 +0000 @@ -529,7 +529,7 @@ if (_patches.servint_aircraft == 0) return; - if (v->date_of_last_service + v->service_interval > _date) + if (SERVICE_INTERVAL) return; if (v->vehstatus & VS_STOPPED) @@ -1061,7 +1061,7 @@ } if ((v->next_order & (OT_MASK|OF_UNLOAD|OF_FULL_LOAD)) == (OT_GOTO_DEPOT|OF_UNLOAD|OF_FULL_LOAD) && - v->date_of_last_service+v->service_interval > _date) { + SERVICE_INTERVAL) { v->cur_order_index++; } diff -r 81e9878f3678 -r 8fef5e5752d6 aircraft_gui.c --- a/aircraft_gui.c Fri Sep 03 21:48:21 2004 +0000 +++ b/aircraft_gui.c Sat Sep 04 13:06:09 2004 +0000 @@ -309,6 +309,9 @@ switch(e->event) { case WE_PAINT: w->disabled_state = v->owner == _local_player ? 0 : (1 << 2); + if (!_patches.servint_aircraft) // disable service-scroller when interval is set to disabled + w->disabled_state |= (1 << 5) | (1 << 6); + SET_DPARAM16(0, v->string_id); SET_DPARAM16(1, v->unitnumber); DrawWindowWidgets(w); @@ -356,7 +359,7 @@ { SET_DPARAM16(0, v->service_interval); SET_DPARAM16(1, v->date_of_last_service); - DrawString(13, 103, STR_883C_SERVICING_INTERVAL_DAYS, 0); + DrawString(13, 103, _patches.servint_ispercent?STR_SERVICING_INTERVAL_PERCENT:STR_883C_SERVICING_INTERVAL_DAYS, 0); } DrawAircraftImage(v, 3, 57, INVALID_VEHICLE); @@ -403,14 +406,19 @@ break; case 5: /* increase int */ - mod = 10; + mod = _ctrl_pressed? 5 : 10; goto change_int; case 6: /* decrease int */ - mod = -10; + mod = _ctrl_pressed?- 5 : -10; change_int: mod += v->service_interval; - if (!IS_INT_INSIDE(mod, 30, 800+1)) + + /* %-based service interval max 5%-90% + day-based service interval max 30-800 days */ + mod = _patches.servint_ispercent ? clamp(mod, MIN_SERVINT_PERCENT, MAX_SERVINT_PERCENT) : clamp(mod, MIN_SERVINT_DAYS, MAX_SERVINT_DAYS+1); + if (mod == v->service_interval) return; + DoCommandP(v->tile, v->index, mod, NULL, CMD_CHANGE_AIRCRAFT_SERVICE_INT | CMD_MSG(STR_018A_CAN_T_CHANGE_SERVICING)); break; diff -r 81e9878f3678 -r 8fef5e5752d6 lang/english.txt --- a/lang/english.txt Fri Sep 03 21:48:21 2004 +0000 +++ b/lang/english.txt Sat Sep 04 13:06:09 2004 +0000 @@ -1003,13 +1003,13 @@ STR_CONFIG_PATCHES_AINEW_ACTIVE :{LTBLUE}Enable new AI (alpha): {ORANGE}{STRING} -STR_CONFIG_PATCHES_SERVINT_TRAINS :{LTBLUE}Default service interval for trains: {ORANGE}{STRING} days +STR_CONFIG_PATCHES_SERVINT_TRAINS :{LTBLUE}Default service interval for trains: {ORANGE}{STRING} days/% STR_CONFIG_PATCHES_SERVINT_TRAINS_DISABLED :{LTBLUE}Default service interval for trains: {ORANGE}disabled -STR_CONFIG_PATCHES_SERVINT_ROADVEH :{LTBLUE}Default service interval for road vehicles: {ORANGE}{STRING} days +STR_CONFIG_PATCHES_SERVINT_ROADVEH :{LTBLUE}Default service interval for road vehicles: {ORANGE}{STRING} days/% STR_CONFIG_PATCHES_SERVINT_ROADVEH_DISABLED :{LTBLUE}Default service interval for road vehicles: {ORANGE}disabled -STR_CONFIG_PATCHES_SERVINT_AIRCRAFT :{LTBLUE}Default service interval for aircraft: {ORANGE}{STRING} days +STR_CONFIG_PATCHES_SERVINT_AIRCRAFT :{LTBLUE}Default service interval for aircraft: {ORANGE}{STRING} days/% STR_CONFIG_PATCHES_SERVINT_AIRCRAFT_DISABLED :{LTBLUE}Default service interval for aircraft: {ORANGE}disabled -STR_CONFIG_PATCHES_SERVINT_SHIPS :{LTBLUE}Default service interval for ships: {ORANGE}{STRING} days +STR_CONFIG_PATCHES_SERVINT_SHIPS :{LTBLUE}Default service interval for ships: {ORANGE}{STRING} days/% STR_CONFIG_PATCHES_SERVINT_SHIPS_DISABLED :{LTBLUE}Default service interval for ships: {ORANGE}disabled STR_CONFIG_PATCHES_COLORED_NEWS_DATE :{LTBLUE}Coloured news appears in: {ORANGE}{STRING} @@ -1033,6 +1033,7 @@ STR_CONFIG_PATCHES_CURRENCY :{CURRENCY} STR_CONFIG_PATCHES_QUERY_CAPT :{WHITE}Change setting value +STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE :{WHITE}Some or all of the default service interval(s) below are incompatible with chosen setting! 5-90% and 30-800 days are valid STR_TEMPERATE_LANDSCAPE :temperate landscape STR_SUB_ARCTIC_LANDSCAPE :sub-arctic landscape @@ -1151,6 +1152,7 @@ STR_RAIL_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Select type of cargo for train to carry STR_RAIL_REFIT_TO_CARRY_HIGHLIGHTED :{BLACK}Refit train to carry highlighted cargo type STR_RAIL_CAN_T_REFIT_VEHICLE :{WHITE}Can't refit train... +STR_CONFIG_PATCHES_SERVINT_ISPERCENT :{LTBLUE}Service intervals are in percents: {ORANGE}{STRING} TEMP_AI_IN_PROGRESS :{WHITE}Welcome to this new AI, in progress. You can expect problems. When you do, make a screenshot and post it at the forum. Enjoy! TEMP_AI_ACTIVATED :{WHITE}Warning: this new AI is still alpha! Currently, only trucks and busses work! @@ -2261,6 +2263,7 @@ STR_883A_UNABLE_TO_FIND_ROUTE_TO :{WHITE}Unable to find route to local depot STR_883B_CAN_T_STOP_START_TRAIN :{WHITE}Can't stop/start train... STR_883C_SERVICING_INTERVAL_DAYS :{BLACK}Servicing interval: {LTBLUE}{COMMA16}days{BLACK} Last service: {LTBLUE}{DATE_LONG} +STR_SERVICING_INTERVAL_PERCENT :{BLACK}Servicing interval: {LTBLUE}{COMMA16}%{BLACK} Last service: {LTBLUE}{DATE_LONG} STR_883D_TRAINS_CLICK_ON_TRAIN_FOR :{BLACK}Trains - click on train for information STR_883E_BUILD_NEW_TRAINS_REQUIRES :{BLACK}Build new trains (requires train depot) STR_883F_TRAINS_CLICK_ON_TRAIN_FOR :{BLACK}Trains - click on train for info., drag vehicle to add/remove from train diff -r 81e9878f3678 -r 8fef5e5752d6 roadveh_cmd.c --- a/roadveh_cmd.c Fri Sep 03 21:48:21 2004 +0000 +++ b/roadveh_cmd.c Sat Sep 04 13:06:09 2004 +0000 @@ -651,7 +651,7 @@ } if ((v->next_order & (OT_MASK|OF_UNLOAD|OF_FULL_LOAD)) == (OT_GOTO_DEPOT|OF_UNLOAD|OF_FULL_LOAD) && - v->date_of_last_service+v->service_interval > _date) { + SERVICE_INTERVAL ) { v->cur_order_index++; } @@ -1500,7 +1500,7 @@ if (_patches.servint_roadveh == 0) return; - if (v->date_of_last_service + v->service_interval > _date) + if (SERVICE_INTERVAL) return; if (v->vehstatus & VS_STOPPED) diff -r 81e9878f3678 -r 8fef5e5752d6 roadveh_gui.c --- a/roadveh_gui.c Fri Sep 03 21:48:21 2004 +0000 +++ b/roadveh_gui.c Sat Sep 04 13:06:09 2004 +0000 @@ -39,6 +39,9 @@ switch(e->event) { case WE_PAINT: w->disabled_state = v->owner == _local_player ? 0 : (1 << 2); + if (!_patches.servint_roadveh) // disable service-scroller when interval is set to disabled + w->disabled_state |= (1 << 5) | (1 << 6); + SET_DPARAM16(0, v->string_id); SET_DPARAM16(1, v->unitnumber); DrawWindowWidgets(w); @@ -86,7 +89,7 @@ { SET_DPARAM16(0, v->service_interval); SET_DPARAM16(1, v->date_of_last_service); - DrawString(13, 90, STR_883C_SERVICING_INTERVAL_DAYS, 0); + DrawString(13, 90, _patches.servint_ispercent?STR_SERVICING_INTERVAL_PERCENT:STR_883C_SERVICING_INTERVAL_DAYS, 0); } DrawRoadVehImage(v, 3, 57, INVALID_VEHICLE); @@ -118,14 +121,19 @@ break; case 5: /* increase int */ - mod = 10; + mod = _ctrl_pressed? 5 : 10; goto change_int; case 6: /* decrease int */ - mod = -10; + mod = _ctrl_pressed? -5 : -10; change_int: mod += v->service_interval; - if (!IS_INT_INSIDE(mod, 30, 800+1)) + + /* %-based service interval max 5%-90% + day-based service interval max 30-800 days */ + mod = _patches.servint_ispercent ? clamp(mod, MIN_SERVINT_PERCENT, MAX_SERVINT_PERCENT) : clamp(mod, MIN_SERVINT_DAYS, MAX_SERVINT_DAYS+1); + if (mod == v->service_interval) return; + DoCommandP(v->tile, v->index, mod, NULL, CMD_CHANGE_ROADVEH_SERVICE_INT | CMD_MSG(STR_018A_CAN_T_CHANGE_SERVICING)); break; } diff -r 81e9878f3678 -r 8fef5e5752d6 settings.c --- a/settings.c Fri Sep 03 21:48:21 2004 +0000 +++ b/settings.c Sat Sep 04 13:06:09 2004 +0000 @@ -835,6 +835,7 @@ {"max_aircraft", SDT_UINT8, (void*)40,(void*)offsetof(Patches, max_aircraft)}, {"max_ships", SDT_UINT8, (void*)50,(void*)offsetof(Patches, max_ships)}, + {"servint_ispercent", SDT_BOOL, (void*)false,(void*)offsetof(Patches, servint_ispercent)}, {"servint_trains", SDT_UINT16, (void*)150,(void*)offsetof(Patches, servint_trains)}, {"servint_roadveh", SDT_UINT16, (void*)150,(void*)offsetof(Patches, servint_roadveh)}, {"servint_ships", SDT_UINT16, (void*)360,(void*)offsetof(Patches, servint_ships)}, diff -r 81e9878f3678 -r 8fef5e5752d6 settings_gui.c --- a/settings_gui.c Fri Sep 03 21:48:21 2004 +0000 +++ b/settings_gui.c Sat Sep 04 13:06:09 2004 +0000 @@ -684,6 +684,34 @@ return 0; } +int32 InValidateDetailsWindow(int32 p1) +{ + InvalidateWindowClasses(WC_VEHICLE_DETAILS); + return 0; +} + +/* Check service intervals of vehicles, p1 is value of % or day based servicing */ +int32 CheckInterval(int32 p1) +{ + bool warning; + if (p1) { + warning = ( (IS_INT_INSIDE(_patches.servint_trains, 5, 90+1) || _patches.servint_trains == 0) && + (IS_INT_INSIDE(_patches.servint_roadveh, 5, 90+1) || _patches.servint_roadveh == 0) && + (IS_INT_INSIDE(_patches.servint_aircraft, 5, 90+1) || _patches.servint_aircraft == 0) && + (IS_INT_INSIDE(_patches.servint_ships, 5, 90+1) || _patches.servint_ships == 0) ); + } else { + warning = ( (IS_INT_INSIDE(_patches.servint_trains, 30, 800+1) || _patches.servint_trains == 0) && + (IS_INT_INSIDE(_patches.servint_roadveh, 30, 800+1) || _patches.servint_roadveh == 0) && + (IS_INT_INSIDE(_patches.servint_aircraft, 30, 800+1) || _patches.servint_aircraft == 0) && + (IS_INT_INSIDE(_patches.servint_ships, 30, 800+1) || _patches.servint_ships == 0) ); + } + + if (!warning) + ShowErrorMessage(-1, STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE, 0, 0); + + return InValidateDetailsWindow(0); +} + typedef int32 PatchButtonClick(int32); typedef struct PatchEntry { @@ -754,10 +782,11 @@ {PE_UINT8, 0, STR_CONFIG_PATCHES_MAX_AIRCRAFT, &_patches.max_aircraft, 0, 240, 10}, {PE_UINT8, 0, STR_CONFIG_PATCHES_MAX_SHIPS, &_patches.max_ships, 0, 240, 10}, - {PE_UINT16, PF_0ISDIS, STR_CONFIG_PATCHES_SERVINT_TRAINS, &_patches.servint_trains, 30, 1200, 10}, - {PE_UINT16, PF_0ISDIS, STR_CONFIG_PATCHES_SERVINT_ROADVEH, &_patches.servint_roadveh, 30, 1200, 10}, - {PE_UINT16, PF_0ISDIS, STR_CONFIG_PATCHES_SERVINT_AIRCRAFT, &_patches.servint_aircraft, 30, 1200, 10}, - {PE_UINT16, PF_0ISDIS, STR_CONFIG_PATCHES_SERVINT_SHIPS, &_patches.servint_ships, 30, 1200, 10}, + {PE_BOOL, 0, STR_CONFIG_PATCHES_SERVINT_ISPERCENT, &_patches.servint_ispercent, 0, 0, 0, &CheckInterval}, + {PE_UINT16, PF_0ISDIS, STR_CONFIG_PATCHES_SERVINT_TRAINS, &_patches.servint_trains, 5, 800, 5, &InValidateDetailsWindow}, + {PE_UINT16, PF_0ISDIS, STR_CONFIG_PATCHES_SERVINT_ROADVEH, &_patches.servint_roadveh, 5, 800, 5, &InValidateDetailsWindow}, + {PE_UINT16, PF_0ISDIS, STR_CONFIG_PATCHES_SERVINT_AIRCRAFT, &_patches.servint_aircraft, 5, 800, 5, &InValidateDetailsWindow}, + {PE_UINT16, PF_0ISDIS, STR_CONFIG_PATCHES_SERVINT_SHIPS, &_patches.servint_ships, 5, 800, 5, &InValidateDetailsWindow}, }; static const PatchEntry _patches_stations[] = { diff -r 81e9878f3678 -r 8fef5e5752d6 ship_cmd.c --- a/ship_cmd.c Fri Sep 03 21:48:21 2004 +0000 +++ b/ship_cmd.c Sat Sep 04 13:06:09 2004 +0000 @@ -88,7 +88,7 @@ if (_patches.servint_ships == 0) return; - if (v->date_of_last_service + v->service_interval > _date) + if (SERVICE_INTERVAL) return; if (v->vehstatus & VS_STOPPED) @@ -206,7 +206,7 @@ } if ((v->next_order & (OT_MASK|OF_UNLOAD|OF_FULL_LOAD)) == (OT_GOTO_DEPOT|OF_UNLOAD|OF_FULL_LOAD) && - v->date_of_last_service+v->service_interval > _date) { + SERVICE_INTERVAL) { v->cur_order_index++; } diff -r 81e9878f3678 -r 8fef5e5752d6 ship_gui.c --- a/ship_gui.c Fri Sep 03 21:48:21 2004 +0000 +++ b/ship_gui.c Sat Sep 04 13:06:09 2004 +0000 @@ -154,6 +154,9 @@ switch(e->event) { case WE_PAINT: w->disabled_state = v->owner == _local_player ? 0 : (1 << 2); + if (!_patches.servint_ships) // disable service-scroller when interval is set to disabled + w->disabled_state |= (1 << 5) | (1 << 6); + SET_DPARAM16(0, v->string_id); SET_DPARAM16(1, v->unitnumber); DrawWindowWidgets(w); @@ -201,7 +204,7 @@ { SET_DPARAM16(0, v->service_interval); SET_DPARAM16(1, v->date_of_last_service); - DrawString(13, 90, STR_883C_SERVICING_INTERVAL_DAYS, 0); + DrawString(13, 90, _patches.servint_ispercent?STR_SERVICING_INTERVAL_PERCENT:STR_883C_SERVICING_INTERVAL_DAYS, 0); } DrawShipImage(v, 3, 57, INVALID_VEHICLE); @@ -232,14 +235,19 @@ ShowQueryString(v->string_id, STR_9831_NAME_SHIP, 31, 150, w->window_class, w->window_number); break; case 5: /* increase int */ - mod = 10; + mod = _ctrl_pressed? 5 : 10; goto change_int; case 6: /* decrease int */ - mod = -10; + mod = _ctrl_pressed?- 5 : -10; change_int: mod += v->service_interval; - if (!IS_INT_INSIDE(mod, 30, 800+1)) + + /* %-based service interval max 5%-90% + day-based service interval max 30-800 days */ + mod = _patches.servint_ispercent ? clamp(mod, MIN_SERVINT_PERCENT, MAX_SERVINT_PERCENT) : clamp(mod, MIN_SERVINT_DAYS, MAX_SERVINT_DAYS+1); + if (mod == v->service_interval) return; + DoCommandP(v->tile, v->index, mod, NULL, CMD_CHANGE_SHIP_SERVICE_INT | CMD_MSG(STR_018A_CAN_T_CHANGE_SERVICING)); break; } diff -r 81e9878f3678 -r 8fef5e5752d6 train_cmd.c --- a/train_cmd.c Fri Sep 03 21:48:21 2004 +0000 +++ b/train_cmd.c Sat Sep 04 13:06:09 2004 +0000 @@ -1549,7 +1549,7 @@ } if ((v->next_order & (OT_MASK|OF_UNLOAD|OF_FULL_LOAD)) == (OT_GOTO_DEPOT|OF_UNLOAD|OF_FULL_LOAD) && - v->date_of_last_service+v->service_interval > _date) { + SERVICE_INTERVAL) { v->cur_order_index++; } @@ -2541,7 +2541,7 @@ if (_patches.servint_trains == 0) return; - if (v->date_of_last_service + v->service_interval > _date) + if (SERVICE_INTERVAL) return; if (v->vehstatus & VS_STOPPED) diff -r 81e9878f3678 -r 8fef5e5752d6 train_gui.c --- a/train_gui.c Fri Sep 03 21:48:21 2004 +0000 +++ b/train_gui.c Sat Sep 04 13:06:09 2004 +0000 @@ -959,6 +959,9 @@ if (v->owner != _local_player) w->disabled_state |= (1 << 2); + if (!_patches.servint_trains) // disable service-scroller when interval is set to disabled + w->disabled_state |= (1 << 6) | (1 << 7); + SET_DPARAM16(0, v->string_id); SET_DPARAM16(1, v->unitnumber); DrawWindowWidgets(w); @@ -994,7 +997,7 @@ SET_DPARAM16(0, v->service_interval); SET_DPARAM16(1, v->date_of_last_service); - DrawString(x + 11, 141, STR_883C_SERVICING_INTERVAL_DAYS, 0); + DrawString(x + 11, 141, _patches.servint_ispercent?STR_SERVICING_INTERVAL_PERCENT:STR_883C_SERVICING_INTERVAL_DAYS, 0); x = 1; y = 57; @@ -1045,16 +1048,20 @@ ShowQueryString(v->string_id, STR_8865_NAME_TRAIN, 31, 150, w->window_class, w->window_number); break; case 6: /* inc serv interval */ - mod = 10; + mod = _ctrl_pressed? 5 : 10; goto do_change_service_int; case 7: /* dec serv interval */ - mod = -10; + mod = _ctrl_pressed? -5 : -10; do_change_service_int: v = &_vehicles[w->window_number]; mod += v->service_interval; - if (!IS_INT_INSIDE(mod, 30, 800+1)) - return; + + /* %-based service interval max 5%-90% + day-based service interval max 30-800 days */ + mod = _patches.servint_ispercent ? clamp(mod, MIN_SERVINT_PERCENT, MAX_SERVINT_PERCENT) : clamp(mod, MIN_SERVINT_DAYS, MAX_SERVINT_DAYS+1); + if (mod == v->service_interval) + return; DoCommandP(v->tile, v->index, mod, NULL, CMD_CHANGE_TRAIN_SERVICE_INT | CMD_MSG(STR_018A_CAN_T_CHANGE_SERVICING)); break; diff -r 81e9878f3678 -r 8fef5e5752d6 variables.h --- a/variables.h Fri Sep 03 21:48:21 2004 +0000 +++ b/variables.h Sat Sep 04 13:06:09 2004 +0000 @@ -118,6 +118,7 @@ byte max_aircraft; //max planes in game per player byte max_ships; //max ships in game per player + bool servint_ispercent; // service intervals are in percents uint16 servint_trains; // service interval for trains uint16 servint_roadveh; // service interval for road vehicles uint16 servint_aircraft;// service interval for aircraft diff -r 81e9878f3678 -r 8fef5e5752d6 vehicle.h --- a/vehicle.h Fri Sep 03 21:48:21 2004 +0000 +++ b/vehicle.h Sat Sep 04 13:06:09 2004 +0000 @@ -414,4 +414,10 @@ #define INVALID_VEHICLE 0xffff +#define SERVICE_INTERVAL (_patches.servint_ispercent ? (v->reliability > _engines[v->engine_type].reliability * (100 - v->service_interval) / 100) : (v->date_of_last_service + v->service_interval > _date)) +#define MIN_SERVINT_PERCENT 5 +#define MAX_SERVINT_PERCENT 90 +#define MIN_SERVINT_DAYS 30 +#define MAX_SERVINT_DAYS 800 + #endif /* VEHICLE_H */