mirror of https://github.com/OpenTTD/OpenTTD
(svn r27) -Fix: [1006715] Autorenew issues
-Add: PE_CURRENCY to patchmenurelease/0.4.5
parent
4b0d4dd3fe
commit
210ada1b51
|
@ -903,15 +903,19 @@ STR_TRAIN_IS_LOST :{WHITE}Train {COMMA16} is lost.
|
||||||
STR_TRAIN_IS_UNPROFITABLE :{WHITE}Train {COMMA16}'s profit last year was {CURRENCY}
|
STR_TRAIN_IS_UNPROFITABLE :{WHITE}Train {COMMA16}'s profit last year was {CURRENCY}
|
||||||
STR_EURO_INTRODUCE :{BLACK}{BIGFONT}European Monetary Union!{}{}The Euro is introduced as the sole currency for everyday transactions in your country!
|
STR_EURO_INTRODUCE :{BLACK}{BIGFONT}European Monetary Union!{}{}The Euro is introduced as the sole currency for everyday transactions in your country!
|
||||||
|
|
||||||
|
STR_TRAIN_AUTORENEW_FAILED :{WHITE}Autorenew failed on train {COMMA16} (money limit)
|
||||||
STR_TRAIN_HAS_TOO_FEW_ORDERS :{WHITE}Train {COMMA16} has too few orders in the schedule
|
STR_TRAIN_HAS_TOO_FEW_ORDERS :{WHITE}Train {COMMA16} has too few orders in the schedule
|
||||||
STR_TRAIN_HAS_VOID_ORDER :{WHITE}Train {COMMA16} has a void order
|
STR_TRAIN_HAS_VOID_ORDER :{WHITE}Train {COMMA16} has a void order
|
||||||
STR_TRAIN_HAS_DUPLICATE_ENTRY :{WHITE}Train {COMMA16} has duplicate orders
|
STR_TRAIN_HAS_DUPLICATE_ENTRY :{WHITE}Train {COMMA16} has duplicate orders
|
||||||
|
STR_AIRCRAFT_AUTORENEW_FAILED :{WHITE}Autorenew failed on aircraft {COMMA16} (money limit)
|
||||||
STR_AIRCRAFT_HAS_TOO_FEW_ORDERS :{WHITE}Aircraft {COMMA16} has too few orders in the schedule
|
STR_AIRCRAFT_HAS_TOO_FEW_ORDERS :{WHITE}Aircraft {COMMA16} has too few orders in the schedule
|
||||||
STR_AIRCRAFT_HAS_VOID_ORDER :{WHITE}Aircraft {COMMA16} has void order
|
STR_AIRCRAFT_HAS_VOID_ORDER :{WHITE}Aircraft {COMMA16} has void order
|
||||||
STR_AIRCRAFT_HAS_DUPLICATE_ENTRY :{WHITE}Aircraft {COMMA16} has duplicate orders
|
STR_AIRCRAFT_HAS_DUPLICATE_ENTRY :{WHITE}Aircraft {COMMA16} has duplicate orders
|
||||||
|
STR_ROADVEHICLE_AUTORENEW_FAILED :{WHITE}Autorenew failed on road vehicle {COMMA16} (money limit)
|
||||||
STR_ROADVEHICLE_HAS_TOO_FEW_ORDERS :{WHITE}Road Vehicle {COMMA16} has too few orders in the schedule
|
STR_ROADVEHICLE_HAS_TOO_FEW_ORDERS :{WHITE}Road Vehicle {COMMA16} has too few orders in the schedule
|
||||||
STR_ROADVEHICLE_HAS_VOID_ORDER :{WHITE}Road Vehicle {COMMA16} has void order
|
STR_ROADVEHICLE_HAS_VOID_ORDER :{WHITE}Road Vehicle {COMMA16} has void order
|
||||||
STR_ROADVEHICLE_HAS_DUPLICATE_ENTRY :{WHITE}Road Vehicle {COMMA16} has duplicate orders
|
STR_ROADVEHICLE_HAS_DUPLICATE_ENTRY :{WHITE}Road Vehicle {COMMA16} has duplicate orders
|
||||||
|
STR_SHIP_AUTORENEW_FAILED :{WHITE}Autorenew failed on ship {COMMA16} (money limit)
|
||||||
STR_SHIP_HAS_TOO_FEW_ORDERS :{WHITE}Ship {COMMA16} has too few orders in the schedule
|
STR_SHIP_HAS_TOO_FEW_ORDERS :{WHITE}Ship {COMMA16} has too few orders in the schedule
|
||||||
STR_SHIP_HAS_VOID_ORDER :{WHITE}Ship {COMMA16} has void order
|
STR_SHIP_HAS_VOID_ORDER :{WHITE}Ship {COMMA16} has void order
|
||||||
STR_SHIP_HAS_DUPLICATE_ENTRY :{WHITE}Ship {COMMA16} has duplicate orders
|
STR_SHIP_HAS_DUPLICATE_ENTRY :{WHITE}Ship {COMMA16} has duplicate orders
|
||||||
|
@ -953,7 +957,9 @@ STR_CONFIG_PATCHES_LOST_TRAIN_DAYS :{LTBLUE}A train is lost if no progress is m
|
||||||
STR_CONFIG_PATCHES_LOST_TRAIN_DAYS_DISABLED :{LTBLUE}A train is lost if no progress is made for: {ORANGE}disabled
|
STR_CONFIG_PATCHES_LOST_TRAIN_DAYS_DISABLED :{LTBLUE}A train is lost if no progress is made for: {ORANGE}disabled
|
||||||
STR_CONFIG_PATCHES_WARN_INCOME_LESS :{LTBLUE}Warn if a train's income is negative: {ORANGE}{STRING}
|
STR_CONFIG_PATCHES_WARN_INCOME_LESS :{LTBLUE}Warn if a train's income is negative: {ORANGE}{STRING}
|
||||||
STR_CONFIG_PATCHES_NEVER_EXPIRE_VEHICLES :{LTBLUE}Vehicles never expire: {ORANGE}{STRING}
|
STR_CONFIG_PATCHES_NEVER_EXPIRE_VEHICLES :{LTBLUE}Vehicles never expire: {ORANGE}{STRING}
|
||||||
STR_CONFIG_AUTORENEW_VEHICLE :{LTBLUE}Autorenew vehicle when it gets old
|
STR_CONFIG_PATCHES_AUTORENEW_VEHICLE :{LTBLUE}Autorenew vehicle when it gets old
|
||||||
|
STR_CONFIG_PATCHES_AUTORENEW_MONTHS :{LTBLUE}Autorenew when vehice is {ORANGE}{STRING}{LTBLUE} months before/after max age
|
||||||
|
STR_CONFIG_PATCHES_AUTORENEW_MONEY :{LTBLUE}Autorenew minimum needed money for renew: {ORANGE}{STRING}
|
||||||
STR_CONFIG_PATCHES_ERRMSG_DURATION :{LTBLUE}Duration of error message: {ORANGE}{STRING}
|
STR_CONFIG_PATCHES_ERRMSG_DURATION :{LTBLUE}Duration of error message: {ORANGE}{STRING}
|
||||||
STR_CONFIG_PATCHES_SNOWLINE_HEIGHT :{LTBLUE}Snow line height: {ORANGE}{STRING}
|
STR_CONFIG_PATCHES_SNOWLINE_HEIGHT :{LTBLUE}Snow line height: {ORANGE}{STRING}
|
||||||
STR_CONFIG_PATCHES_STATION_SPREAD :{LTBLUE}Max station spread: {ORANGE}{STRING}
|
STR_CONFIG_PATCHES_STATION_SPREAD :{LTBLUE}Max station spread: {ORANGE}{STRING}
|
||||||
|
@ -991,6 +997,7 @@ STR_CONFIG_PATCHES_AI :{BLACK}Competitors
|
||||||
|
|
||||||
STR_CONFIG_PATCHES_DISABLED :disabled
|
STR_CONFIG_PATCHES_DISABLED :disabled
|
||||||
STR_CONFIG_PATCHES_INT32 :{INT32}
|
STR_CONFIG_PATCHES_INT32 :{INT32}
|
||||||
|
STR_CONFIG_PATCHES_CURRENCY :{CURRENCY}
|
||||||
|
|
||||||
STR_CONFIG_PATCHES_QUERY_CAPT :{WHITE}Change setting value
|
STR_CONFIG_PATCHES_QUERY_CAPT :{WHITE}Change setting value
|
||||||
|
|
||||||
|
|
|
@ -837,7 +837,8 @@ static const SettingDesc patch_settings[] = {
|
||||||
{"servint_aircraft", SDT_UINT16, (void*)100,(void*)offsetof(Patches, servint_aircraft)},
|
{"servint_aircraft", SDT_UINT16, (void*)100,(void*)offsetof(Patches, servint_aircraft)},
|
||||||
|
|
||||||
{"autorenew", SDT_BOOL, (void*)false,(void*)offsetof(Patches, autorenew)},
|
{"autorenew", SDT_BOOL, (void*)false,(void*)offsetof(Patches, autorenew)},
|
||||||
{"autorenew_months", SDT_UINT16, (void*)-12, (void*)offsetof(Patches, autorenew_months)},
|
{"autorenew_months", SDT_INT16, (void*)-6, (void*)offsetof(Patches, autorenew_months)},
|
||||||
|
{"autorenew_money", SDT_INT32, (void*)100000, (void*)offsetof(Patches, autorenew_money)},
|
||||||
|
|
||||||
{"new_pathfinding", SDT_BOOL, (void*)false, (void*)offsetof(Patches, new_pathfinding)},
|
{"new_pathfinding", SDT_BOOL, (void*)false, (void*)offsetof(Patches, new_pathfinding)},
|
||||||
{"pf_maxlength", SDT_UINT16, (void*)512, (void*)offsetof(Patches, pf_maxlength)},
|
{"pf_maxlength", SDT_UINT16, (void*)512, (void*)offsetof(Patches, pf_maxlength)},
|
||||||
|
|
|
@ -659,8 +659,8 @@ typedef struct PatchEntry {
|
||||||
byte flags; // selector flags
|
byte flags; // selector flags
|
||||||
StringID str; // string with descriptive text
|
StringID str; // string with descriptive text
|
||||||
void *variable; // pointer to the variable
|
void *variable; // pointer to the variable
|
||||||
int16 min,max; // range for spinbox setting
|
int32 min,max; // range for spinbox setting
|
||||||
uint16 step; // step for spinbox
|
uint32 step; // step for spinbox
|
||||||
} PatchEntry;
|
} PatchEntry;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -669,6 +669,7 @@ enum {
|
||||||
PE_INT16 = 2,
|
PE_INT16 = 2,
|
||||||
PE_UINT16 = 3,
|
PE_UINT16 = 3,
|
||||||
PE_INT32 = 4,
|
PE_INT32 = 4,
|
||||||
|
PE_CURRENCY = 5,
|
||||||
|
|
||||||
PF_0ISDIS = 1,
|
PF_0ISDIS = 1,
|
||||||
PF_NOCOMMA = 2,
|
PF_NOCOMMA = 2,
|
||||||
|
@ -706,7 +707,9 @@ static const PatchEntry _patches_vehicles[] = {
|
||||||
{PE_BOOL, 0, STR_CONFIG_PATCHES_NEVER_EXPIRE_VEHICLES, &_patches.never_expire_vehicles},
|
{PE_BOOL, 0, STR_CONFIG_PATCHES_NEVER_EXPIRE_VEHICLES, &_patches.never_expire_vehicles},
|
||||||
|
|
||||||
{PE_UINT16, PF_0ISDIS, STR_CONFIG_PATCHES_LOST_TRAIN_DAYS, &_patches.lost_train_days, 180, 720, 60},
|
{PE_UINT16, PF_0ISDIS, STR_CONFIG_PATCHES_LOST_TRAIN_DAYS, &_patches.lost_train_days, 180, 720, 60},
|
||||||
{PE_BOOL, 0, STR_CONFIG_AUTORENEW_VEHICLE, &_patches.autorenew},
|
{PE_BOOL, 0, STR_CONFIG_PATCHES_AUTORENEW_VEHICLE, &_patches.autorenew},
|
||||||
|
{PE_INT16, 0, STR_CONFIG_PATCHES_AUTORENEW_MONTHS, &_patches.autorenew_months, -12, 12, 1},
|
||||||
|
{PE_CURRENCY, 0, STR_CONFIG_PATCHES_AUTORENEW_MONEY, &_patches.autorenew_money, 0, 2000000, 100000},
|
||||||
|
|
||||||
{PE_UINT8, 0, STR_CONFIG_PATCHES_MAX_TRAINS, &_patches.max_trains, 0, 240, 10},
|
{PE_UINT8, 0, STR_CONFIG_PATCHES_MAX_TRAINS, &_patches.max_trains, 0, 240, 10},
|
||||||
{PE_UINT8, 0, STR_CONFIG_PATCHES_MAX_ROADVEH, &_patches.max_roadveh, 0, 240, 10},
|
{PE_UINT8, 0, STR_CONFIG_PATCHES_MAX_ROADVEH, &_patches.max_roadveh, 0, 240, 10},
|
||||||
|
@ -764,6 +767,8 @@ static const PatchPage _patches_page[] = {
|
||||||
{_patches_ai, lengthof(_patches_ai) },
|
{_patches_ai, lengthof(_patches_ai) },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern uint GetCurrentCurrencyRate();
|
||||||
|
|
||||||
static int32 ReadPE(const PatchEntry*pe)
|
static int32 ReadPE(const PatchEntry*pe)
|
||||||
{
|
{
|
||||||
switch(pe->type) {
|
switch(pe->type) {
|
||||||
|
@ -772,6 +777,7 @@ static int32 ReadPE(const PatchEntry*pe)
|
||||||
case PE_INT16: return *(int16*)pe->variable;
|
case PE_INT16: return *(int16*)pe->variable;
|
||||||
case PE_UINT16: return *(uint16*)pe->variable;
|
case PE_UINT16: return *(uint16*)pe->variable;
|
||||||
case PE_INT32: return *(int32*)pe->variable;
|
case PE_INT32: return *(int32*)pe->variable;
|
||||||
|
case PE_CURRENCY: return (*(int64*)pe->variable) * GetCurrentCurrencyRate();
|
||||||
default:
|
default:
|
||||||
NOT_REACHED();
|
NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
@ -816,6 +822,15 @@ static void WritePE(const PatchEntry *pe, int32 val)
|
||||||
else
|
else
|
||||||
*(int32*)pe->variable = val;
|
*(int32*)pe->variable = val;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case PE_CURRENCY: val /= GetCurrentCurrencyRate();
|
||||||
|
if ((int64)val > (int64)pe->max)
|
||||||
|
*(int64*)pe->variable = (int64)pe->max;
|
||||||
|
else if ((int64)val < (int64)pe->min)
|
||||||
|
*(int64*)pe->variable = (int64)pe->min;
|
||||||
|
else
|
||||||
|
*(int64*)pe->variable = val;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
NOT_REACHED();
|
NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
@ -852,12 +867,17 @@ static void PatchesSelectionWndProc(Window *w, WindowEvent *e)
|
||||||
DrawStringCentered(x+20, y+1, STR_681A, 0);
|
DrawStringCentered(x+20, y+1, STR_681A, 0);
|
||||||
|
|
||||||
val = ReadPE(pe);
|
val = ReadPE(pe);
|
||||||
|
if (pe->type == PE_CURRENCY)
|
||||||
|
val /= GetCurrentCurrencyRate();
|
||||||
disabled = ((val == 0) && (pe->flags & PF_0ISDIS));
|
disabled = ((val == 0) && (pe->flags & PF_0ISDIS));
|
||||||
if (disabled) {
|
if (disabled) {
|
||||||
SET_DPARAM16(0, STR_CONFIG_PATCHES_DISABLED);
|
SET_DPARAM16(0, STR_CONFIG_PATCHES_DISABLED);
|
||||||
} else {
|
} else {
|
||||||
SET_DPARAM32(1, val);
|
SET_DPARAM32(1, val);
|
||||||
SET_DPARAM16(0, pe->flags & PF_NOCOMMA ? STR_CONFIG_PATCHES_INT32 : STR_7024);
|
if (pe->type == PE_CURRENCY)
|
||||||
|
SET_DPARAM16(0, STR_CONFIG_PATCHES_CURRENCY);
|
||||||
|
else
|
||||||
|
SET_DPARAM16(0, pe->flags & PF_NOCOMMA ? STR_CONFIG_PATCHES_INT32 : STR_7024);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DrawString(30, y+1, (pe->str)+disabled, 0);
|
DrawString(30, y+1, (pe->str)+disabled, 0);
|
||||||
|
@ -898,6 +918,7 @@ static void PatchesSelectionWndProc(Window *w, WindowEvent *e)
|
||||||
case PE_INT16:
|
case PE_INT16:
|
||||||
case PE_UINT16:
|
case PE_UINT16:
|
||||||
case PE_INT32:
|
case PE_INT32:
|
||||||
|
case PE_CURRENCY:
|
||||||
// don't allow too fast scrolling
|
// don't allow too fast scrolling
|
||||||
if ((w->flags4 & WF_TIMEOUT_MASK) > 2 << WF_TIMEOUT_SHL) {
|
if ((w->flags4 & WF_TIMEOUT_MASK) > 2 << WF_TIMEOUT_SHL) {
|
||||||
_left_button_clicked = false;
|
_left_button_clicked = false;
|
||||||
|
|
|
@ -322,6 +322,10 @@ static byte *FormatMonthAndYear(byte *buff, uint16 number)
|
||||||
return FormatNoCommaNumber(buff, ymd.year + 1920);
|
return FormatNoCommaNumber(buff, ymd.year + 1920);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint GetCurrentCurrencyRate() {
|
||||||
|
return (&_currency_specs[_opt.currency])->rate;
|
||||||
|
}
|
||||||
|
|
||||||
static byte *FormatGenericCurrency(byte *buff, const CurrencySpec *spec, int64 number, bool compact)
|
static byte *FormatGenericCurrency(byte *buff, const CurrencySpec *spec, int64 number, bool compact)
|
||||||
{
|
{
|
||||||
const char *s;
|
const char *s;
|
||||||
|
|
|
@ -120,7 +120,8 @@ typedef struct Patches {
|
||||||
uint16 servint_ships; // service interval for ships
|
uint16 servint_ships; // service interval for ships
|
||||||
|
|
||||||
bool autorenew;
|
bool autorenew;
|
||||||
uint16 autorenew_months;
|
int16 autorenew_months;
|
||||||
|
int32 autorenew_money;
|
||||||
|
|
||||||
bool new_pathfinding; // use optimized pathfinding algoritm for trains
|
bool new_pathfinding; // use optimized pathfinding algoritm for trains
|
||||||
byte pf_maxdepth; // maximum recursion depth when searching for a train route for new pathfinder
|
byte pf_maxdepth; // maximum recursion depth when searching for a train route for new pathfinder
|
||||||
|
|
35
vehicle.c
35
vehicle.c
|
@ -1302,6 +1302,9 @@ static void ShowVehicleGettingOld(Vehicle *v, StringID msg)
|
||||||
{
|
{
|
||||||
if (v->owner != _local_player)
|
if (v->owner != _local_player)
|
||||||
return;
|
return;
|
||||||
|
// Do not show getting-old message if autorenew is active
|
||||||
|
if (_patches.autorenew)
|
||||||
|
return;
|
||||||
|
|
||||||
SET_DPARAM16(0, _vehicle_type_names[v->type - 0x10]);
|
SET_DPARAM16(0, _vehicle_type_names[v->type - 0x10]);
|
||||||
SET_DPARAM16(1, v->unitnumber);
|
SET_DPARAM16(1, v->unitnumber);
|
||||||
|
@ -1334,13 +1337,33 @@ void MaybeRenewVehicle(Vehicle *v, int32 build_cost)
|
||||||
{
|
{
|
||||||
Engine *e;
|
Engine *e;
|
||||||
|
|
||||||
// When automatically renewing a vehicle we want to prevent the
|
// A vehicle is autorenewed when it it gets the amount of months
|
||||||
// "getting old" messages so we renew it if it won't enter the
|
// give by _patches.autorenew_months away for his max age.
|
||||||
// depot during the next service sooner than half a year before
|
// Standard is -6, meaning 6 months before his max age
|
||||||
// the vehicle getting old (that's one year before it reaches
|
// It can be any value between -12 and 12.
|
||||||
// the max_age, see AgeVehicle).
|
if (!_patches.autorenew || v->age - v->max_age < (_patches.autorenew_months * 30))
|
||||||
if (!(_patches.autorenew && v->max_age - v->age < 366 + 183 + v->service_interval))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (DEREF_PLAYER(v->owner)->money64 < _patches.autorenew_money + build_cost - v->value) {
|
||||||
|
if (v->owner == _local_player) {
|
||||||
|
int message;
|
||||||
|
SET_DPARAM16(0, v->unitnumber);
|
||||||
|
switch (v->type) {
|
||||||
|
case VEH_Train: message = STR_TRAIN_AUTORENEW_FAILED; break;
|
||||||
|
case VEH_Road: message = STR_ROADVEHICLE_AUTORENEW_FAILED; break;
|
||||||
|
case VEH_Ship: message = STR_SHIP_AUTORENEW_FAILED; break;
|
||||||
|
case VEH_Aircraft: message = STR_AIRCRAFT_AUTORENEW_FAILED; break;
|
||||||
|
// This should never happen
|
||||||
|
default: message = 0; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
AddNewsItem(message, NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), v->index, 0);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Withdraw the money from the right player ;)
|
||||||
|
_current_player = v->owner;
|
||||||
|
|
||||||
e = &_engines[v->engine_type];
|
e = &_engines[v->engine_type];
|
||||||
v->reliability = e->reliability;
|
v->reliability = e->reliability;
|
||||||
|
|
Loading…
Reference in New Issue