(svn r2817) -Codechange: [autoreplace]: moved autoreplace and autorenew to serverside

-This means that one company can only have one setting for renew and replacing
    more clients will not fight due to different settings anymore
  -This is a needed step in the line to fix autoreplacing dualheaded locomotives
  NOTE: savegame revision bump (peter1138 + me in coop)
This commit is contained in:
bjarni
2005-08-06 16:07:22 +00:00
parent a1a91eb7f7
commit 9952ff0b59
14 changed files with 234 additions and 75 deletions

View File

@@ -1322,7 +1322,7 @@ static void ShowVehicleGettingOld(Vehicle *v, StringID msg)
return;
// Do not show getting-old message if autorenew is active
if (_patches.autorenew)
if (GetPlayer(v->owner)->engine_renew)
return;
SetDParam(0, _vehicle_type_names[v->type - 0x10]);
@@ -1360,32 +1360,25 @@ extern int32 CmdRefitRailVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p
extern int32 CmdRefitShip(int x, int y, uint32 flags, uint32 p1, uint32 p2);
extern int32 CmdRefitAircraft(int x, int y, uint32 flags, uint32 p1, uint32 p2);
/** Replaces a vehicle (used to be called autorenew).
* @param x,y unused
* @param p1 index of vehicle being replaced
* @param p2 various bitstuffed elements
* - p2 = (bit 0-15) - new engine type for the vehicle (p2 & 0xFFFF)
* - p2 = (bit 16-31) - money the player wants to have left after replacement counted in 100.000 (100K) (p2 >> 16)
* Must be called with _current_player set to the owner of the vehicle
* @param v Vehicle to replace
*/
int32 CmdReplaceVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2)
int32 ReplaceVehicle(Vehicle *v)
{
/* makesvariables to inform about how much money the player wants to have left after replacing
and which engine to replace with out of p2.
the first 16 bit is the money. The last 5 digits (all 0) were removed when sent, so we add them again.
This way the max is 6553 millions and it is more than the 32 bit that is stored in _patches
This is a nice way to send 32 bit and only use 16 bit
the last 8 bit is the engine. The 8 bits in front of the engine is free so it have room for 16 bit engine entries */
EngineID new_engine_type = (p2 & 0xFFFF);
uint32 autorefit_money = (p2 >> 16) * 100000;
Vehicle *v, *u, *first;
Player *p = GetPlayer(v->owner);
EngineID old_engine_type = v->engine_type;
EngineID new_engine_type = p->engine_replacement[old_engine_type];
Vehicle *u, *first;
int cost, build_cost, rear_engine_cost = 0;
EngineID old_engine_type;
if (!IsVehicleIndex(p1)) return CMD_ERROR;
// If replacing due to age only, use the same type :-)
if (new_engine_type == INVALID_ENGINE)
new_engine_type = old_engine_type;
v = u = GetVehicle(p1);
old_engine_type = v->engine_type;
u = v;
/* First we make sure that it's a valid type the user requested
* check that it's an engine that is in the engine array */
@@ -1449,7 +1442,7 @@ int32 CmdReplaceVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2)
/* Check if there is money for the upgrade.. if not, give a nice news-item
(that is needed, because this CMD is called automaticly) */
if ( GetPlayer(v->owner)->money64 < (int32)(autorefit_money + build_cost + rear_engine_cost - v->value)) {
if ( p->money64 < (p->engine_renew_money + build_cost + rear_engine_cost - v->value)) {
if (( _local_player == v->owner ) && ( v->unitnumber != 0 )) { //v->unitnumber = 0 for train cars
int message;
SetDParam(0, v->unitnumber);
@@ -1469,8 +1462,7 @@ int32 CmdReplaceVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2)
}
cost = build_cost - v->value + rear_engine_cost;
if (flags & DC_EXEC) {
if (old_engine_type != new_engine_type) {
/* We do not really buy a new vehicle, we upgrade the old one */
const Engine* e = GetEngine(new_engine_type);
@@ -1615,22 +1607,27 @@ int32 CmdReplaceVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2)
v->cargo_count = v->cargo_cap;
}
}
InvalidateWindow(WC_REPLACE_VEHICLE, v->type);
ResortVehicleLists();
InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
}
// A replaced vehicle should be classed as new
v->age = 0;
InvalidateWindow(WC_REPLACE_VEHICLE, v->type);
ResortVehicleLists();
InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
//needs to be down here because refitting will change SET_EXPENSES_TYPE if called
SET_EXPENSES_TYPE(EXPENSES_NEW_VEHICLES);
SubtractMoneyFromPlayer(cost);
if (_current_player == _local_player)
ShowCostOrIncomeAnimation(v->x_pos, v->y_pos, v->z_pos, cost);
return cost;
}
void MaybeReplaceVehicle(Vehicle *v)
{
uint32 new_engine_and_autoreplace_money;
if (v->owner != _local_player)
return;
Player *p = GetPlayer(v->owner);
// uncomment next line if you want to see what engine type just entered a depot
//printf("engine type: %d\n", v->engine_type);
@@ -1639,31 +1636,20 @@ void MaybeReplaceVehicle(Vehicle *v)
// Standard is -6, meaning 6 months before his max age
// It can be any value between -12 and 12.
// Here it also checks if the vehicles is listed for replacement
if (!_patches.autorenew || v->age - v->max_age < (_patches.autorenew_months * 30)) { //replace if engine is too old
if (_autoreplace_array[v->engine_type] == v->engine_type && v->type != VEH_Train) //updates to a new model
if (!p->engine_renew || v->age - v->max_age < (p->engine_renew_months * 30)) { //replace if engine is too old
if (p->engine_replacement[v->engine_type] == INVALID_ENGINE && v->type != VEH_Train) // updates to a new model
return;
}
/* Now replace the vehicle */
_current_player = v->owner;
/* makes the variable to inform about how much money the player wants to have left after replacing
and which engine to replace with
the first 16 bit is the money. Since we know the last 5 digits is 0, they are thrown away.
This way the max is 6553 millions and it is more than the 32 bit that is stored in _patches
This is a nice way to send 32 bit and only use 16 bit
the last 8 bit is the engine. The 8 bits in front of the engine is free so it have room for 16 bit engine entries */
new_engine_and_autoreplace_money = ((_patches.autorenew_money / 100000) << 16) + _autoreplace_array[v->engine_type];
assert(v->type == GetEngine(_autoreplace_array[v->engine_type])->type);
if ( v->type != VEH_Train ) {
DoCommandP(v->tile, v->index, new_engine_and_autoreplace_money, NULL, CMD_REPLACE_VEHICLE | CMD_SHOW_NO_ERROR);
ReplaceVehicle(v);
} else {
// checks if any of the engines in the train are either old or listed for replacement
do {
if ( v->engine_type != _autoreplace_array[v->engine_type] || (_patches.autorenew && (v->age - v->max_age) > (_patches.autorenew_months * 30))) {
new_engine_and_autoreplace_money = (new_engine_and_autoreplace_money & 0xFFFF0000) + _autoreplace_array[v->engine_type]; // sets the new engine replacement type
DoCommandP(v->tile, v->index, new_engine_and_autoreplace_money, NULL, CMD_REPLACE_VEHICLE | CMD_SHOW_NO_ERROR);
if (p->engine_replacement[v->engine_type] != INVALID_ENGINE || (p->engine_renew && (v->age - v->max_age) > (p->engine_renew_months * 30))) {
ReplaceVehicle(v);
}
} while ((v=v->next) != NULL);
}