Merge remote-tracking branch 'upstream/master'
This commit is contained in:
+38
-31
@@ -74,13 +74,13 @@ static const uint GEN_HASHX_BUCKET_BITS = 7;
|
||||
static const uint GEN_HASHY_BUCKET_BITS = 6;
|
||||
|
||||
/* Compute hash for vehicle coord */
|
||||
#define GEN_HASHX(x) GB((x), GEN_HASHX_BUCKET_BITS + ZOOM_LVL_SHIFT, GEN_HASHX_BITS)
|
||||
#define GEN_HASHY(y) (GB((y), GEN_HASHY_BUCKET_BITS + ZOOM_LVL_SHIFT, GEN_HASHY_BITS) << GEN_HASHX_BITS)
|
||||
#define GEN_HASHX(x) GB((x), GEN_HASHX_BUCKET_BITS + ZOOM_BASE_SHIFT, GEN_HASHX_BITS)
|
||||
#define GEN_HASHY(y) (GB((y), GEN_HASHY_BUCKET_BITS + ZOOM_BASE_SHIFT, GEN_HASHY_BITS) << GEN_HASHX_BITS)
|
||||
#define GEN_HASH(x, y) (GEN_HASHY(y) + GEN_HASHX(x))
|
||||
|
||||
/* Maximum size until hash repeats */
|
||||
static const int GEN_HASHX_SIZE = 1 << (GEN_HASHX_BUCKET_BITS + GEN_HASHX_BITS + ZOOM_LVL_SHIFT);
|
||||
static const int GEN_HASHY_SIZE = 1 << (GEN_HASHY_BUCKET_BITS + GEN_HASHY_BITS + ZOOM_LVL_SHIFT);
|
||||
static const int GEN_HASHX_SIZE = 1 << (GEN_HASHX_BUCKET_BITS + GEN_HASHX_BITS + ZOOM_BASE_SHIFT);
|
||||
static const int GEN_HASHY_SIZE = 1 << (GEN_HASHY_BUCKET_BITS + GEN_HASHY_BITS + ZOOM_BASE_SHIFT);
|
||||
|
||||
/* Increments to reach next bucket in hash table */
|
||||
static const int GEN_HASHX_INC = 1;
|
||||
@@ -273,7 +273,7 @@ bool Vehicle::NeedsAutomaticServicing() const
|
||||
{
|
||||
if (this->HasDepotOrder()) return false;
|
||||
if (this->current_order.IsType(OT_LOADING)) return false;
|
||||
if (this->current_order.IsType(OT_GOTO_DEPOT) && this->current_order.GetDepotOrderType() != ODTFB_SERVICE) return false;
|
||||
if (this->current_order.IsType(OT_GOTO_DEPOT) && (this->current_order.GetDepotOrderType() & ODTFB_SERVICE) == 0) return false;
|
||||
return NeedsServicing();
|
||||
}
|
||||
|
||||
@@ -347,7 +347,7 @@ void VehicleLengthChanged(const Vehicle *u)
|
||||
{
|
||||
/* show a warning once for each engine in whole game and once for each GRF after each game load */
|
||||
const Engine *engine = u->GetEngine();
|
||||
uint32_t grfid = engine->grf_prop.grffile->grfid;
|
||||
uint32_t grfid = engine->grf_prop.grfid;
|
||||
GRFConfig *grfconfig = GetGRFConfig(grfid);
|
||||
if (_gamelog.GRFBugReverse(grfid, engine->grf_prop.local_id) || !HasBit(grfconfig->grf_bugs, GBUG_VEH_LENGTH)) {
|
||||
ShowNewGrfVehicleError(u->engine_type, STR_NEWGRF_BROKEN, STR_NEWGRF_BROKEN_VEHICLE_LENGTH, GBUG_VEH_LENGTH, true);
|
||||
@@ -552,7 +552,7 @@ CommandCost EnsureNoVehicleOnGround(TileIndex tile)
|
||||
* Such a message does not affect MP synchronisation.
|
||||
*/
|
||||
Vehicle *v = VehicleFromPos(tile, &z, &EnsureNoVehicleProcZ, true);
|
||||
if (v != nullptr) return_cmd_error(STR_ERROR_TRAIN_IN_THE_WAY + v->type);
|
||||
if (v != nullptr) return CommandCost(STR_ERROR_TRAIN_IN_THE_WAY + v->type);
|
||||
return CommandCost();
|
||||
}
|
||||
|
||||
@@ -581,7 +581,7 @@ CommandCost TunnelBridgeIsFree(TileIndex tile, TileIndex endtile, const Vehicle
|
||||
Vehicle *v = VehicleFromPos(tile, const_cast<Vehicle *>(ignore), &GetVehicleTunnelBridgeProc, true);
|
||||
if (v == nullptr) v = VehicleFromPos(endtile, const_cast<Vehicle *>(ignore), &GetVehicleTunnelBridgeProc, true);
|
||||
|
||||
if (v != nullptr) return_cmd_error(STR_ERROR_TRAIN_IN_THE_WAY + v->type);
|
||||
if (v != nullptr) return CommandCost(STR_ERROR_TRAIN_IN_THE_WAY + v->type);
|
||||
return CommandCost();
|
||||
}
|
||||
|
||||
@@ -612,7 +612,7 @@ CommandCost EnsureNoTrainOnTrackBits(TileIndex tile, TrackBits track_bits)
|
||||
* Such a message does not affect MP synchronisation.
|
||||
*/
|
||||
Vehicle *v = VehicleFromPos(tile, &track_bits, &EnsureNoTrainOnTrackProc, true);
|
||||
if (v != nullptr) return_cmd_error(STR_ERROR_TRAIN_IN_THE_WAY + v->type);
|
||||
if (v != nullptr) return CommandCost(STR_ERROR_TRAIN_IN_THE_WAY + v->type);
|
||||
return CommandCost();
|
||||
}
|
||||
|
||||
@@ -908,8 +908,10 @@ Vehicle::~Vehicle()
|
||||
|
||||
UpdateVehicleTileHash(this, true);
|
||||
UpdateVehicleViewportHash(this, INVALID_COORD, 0, this->sprite_cache.old_coord.left, this->sprite_cache.old_coord.top);
|
||||
DeleteVehicleNews(this->index, INVALID_STRING_ID);
|
||||
DeleteNewGRFInspectWindow(GetGrfSpecFeature(this->type), this->index);
|
||||
if (this->type != VEH_EFFECT) {
|
||||
DeleteVehicleNews(this->index, INVALID_STRING_ID);
|
||||
DeleteNewGRFInspectWindow(GetGrfSpecFeature(this->type), this->index);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1031,10 +1033,13 @@ void CallVehicleTicks()
|
||||
/* Do not play any sound when stopped */
|
||||
if ((front->vehstatus & VS_STOPPED) && (front->type != VEH_TRAIN || front->cur_speed == 0)) continue;
|
||||
|
||||
/* Update motion counter for animation purposes. */
|
||||
v->motion_counter += front->cur_speed;
|
||||
|
||||
/* Check vehicle type specifics */
|
||||
switch (v->type) {
|
||||
case VEH_TRAIN:
|
||||
if (Train::From(v)->IsWagon()) continue;
|
||||
if (!Train::From(v)->IsEngine()) continue;
|
||||
break;
|
||||
|
||||
case VEH_ROAD:
|
||||
@@ -1049,7 +1054,6 @@ void CallVehicleTicks()
|
||||
break;
|
||||
}
|
||||
|
||||
v->motion_counter += front->cur_speed;
|
||||
/* Play a running sound if the motion counter passes 256 (Do we not skip sounds?) */
|
||||
if (GB(v->motion_counter, 0, 8) < front->cur_speed) PlayVehicleSound(v, VSE_RUNNING);
|
||||
|
||||
@@ -1065,7 +1069,7 @@ void CallVehicleTicks()
|
||||
}
|
||||
}
|
||||
|
||||
Backup<CompanyID> cur_company(_current_company, FILE_LINE);
|
||||
Backup<CompanyID> cur_company(_current_company);
|
||||
for (auto &it : _vehicles_to_autoreplace) {
|
||||
Vehicle *v = Vehicle::Get(it.first);
|
||||
/* Autoreplace needs the current company set as the vehicle owner */
|
||||
@@ -1157,8 +1161,8 @@ void ViewportAddVehicles(DrawPixelInfo *dpi)
|
||||
const int b = dpi->top + dpi->height;
|
||||
|
||||
/* Border size of MAX_VEHICLE_PIXEL_xy */
|
||||
const int xb = MAX_VEHICLE_PIXEL_X * ZOOM_LVL_BASE;
|
||||
const int yb = MAX_VEHICLE_PIXEL_Y * ZOOM_LVL_BASE;
|
||||
const int xb = MAX_VEHICLE_PIXEL_X * ZOOM_BASE;
|
||||
const int yb = MAX_VEHICLE_PIXEL_Y * ZOOM_BASE;
|
||||
|
||||
/* The hash area to scan */
|
||||
int xl, xu, yl, yu;
|
||||
@@ -1253,8 +1257,8 @@ Vehicle *CheckClickOnVehicle(const Viewport *vp, int x, int y)
|
||||
y = ScaleByZoom(y, vp->zoom) + vp->virtual_top;
|
||||
|
||||
/* Border size of MAX_VEHICLE_PIXEL_xy */
|
||||
const int xb = MAX_VEHICLE_PIXEL_X * ZOOM_LVL_BASE;
|
||||
const int yb = MAX_VEHICLE_PIXEL_Y * ZOOM_LVL_BASE;
|
||||
const int xb = MAX_VEHICLE_PIXEL_X * ZOOM_BASE;
|
||||
const int yb = MAX_VEHICLE_PIXEL_Y * ZOOM_BASE;
|
||||
|
||||
/* The hash area to scan */
|
||||
int xl = GEN_HASHX(x - xb);
|
||||
@@ -1301,7 +1305,7 @@ void DecreaseVehicleValue(Vehicle *v)
|
||||
SetWindowDirty(WC_VEHICLE_DETAILS, v->index);
|
||||
}
|
||||
|
||||
static const byte _breakdown_chance[64] = {
|
||||
static const uint8_t _breakdown_chance[64] = {
|
||||
3, 3, 3, 3, 3, 3, 3, 3,
|
||||
4, 4, 5, 5, 6, 6, 7, 7,
|
||||
8, 8, 9, 9, 10, 10, 11, 11,
|
||||
@@ -1451,6 +1455,9 @@ void AgeVehicle(Vehicle *v)
|
||||
|
||||
SetWindowDirty(WC_VEHICLE_DETAILS, v->index);
|
||||
|
||||
/* Don't warn if warnings are disabled */
|
||||
if (!_settings_client.gui.old_vehicle_warn) return;
|
||||
|
||||
/* Don't warn about vehicles which are non-primary (e.g., part of an articulated vehicle), don't belong to us, are crashed, or are stopped */
|
||||
if (v->Previous() != nullptr || v->owner != _local_company || (v->vehstatus & VS_CRASHED) != 0 || (v->vehstatus & VS_STOPPED) != 0) return;
|
||||
|
||||
@@ -1509,7 +1516,7 @@ uint8_t CalcPercentVehicleFilled(const Vehicle *front, StringID *colour)
|
||||
unloading += HasBit(v->vehicle_flags, VF_CARGO_UNLOADING) ? 1 : 0;
|
||||
loading |= !order_no_load &&
|
||||
(order_full_load || st->goods[v->cargo_type].HasRating()) &&
|
||||
!HasBit(v->vehicle_flags, VF_LOADING_FINISHED) && !HasBit(v->vehicle_flags, VF_STOP_LOADING);
|
||||
!HasBit(front->vehicle_flags, VF_LOADING_FINISHED) && !HasBit(front->vehicle_flags, VF_STOP_LOADING);
|
||||
cars++;
|
||||
}
|
||||
}
|
||||
@@ -1619,7 +1626,7 @@ void VehicleEnterDepot(Vehicle *v)
|
||||
}
|
||||
|
||||
if (v->current_order.IsRefit()) {
|
||||
Backup<CompanyID> cur_company(_current_company, v->owner, FILE_LINE);
|
||||
Backup<CompanyID> cur_company(_current_company, v->owner);
|
||||
CommandCost cost = std::get<0>(Command<CMD_REFIT_VEHICLE>::Do(DC_EXEC, v->index, v->current_order.GetRefitCargo(), 0xFF, false, false, 0));
|
||||
cur_company.Restore();
|
||||
|
||||
@@ -1701,8 +1708,8 @@ void Vehicle::UpdateBoundingBoxCoordinates(bool update_cache) const
|
||||
Point pt = RemapCoords(this->x_pos + this->x_offs, this->y_pos + this->y_offs, this->z_pos);
|
||||
new_coord.left += pt.x;
|
||||
new_coord.top += pt.y;
|
||||
new_coord.right += pt.x + 2 * ZOOM_LVL_BASE;
|
||||
new_coord.bottom += pt.y + 2 * ZOOM_LVL_BASE;
|
||||
new_coord.right += pt.x + 2 * ZOOM_BASE;
|
||||
new_coord.bottom += pt.y + 2 * ZOOM_BASE;
|
||||
|
||||
if (update_cache) {
|
||||
/*
|
||||
@@ -1913,7 +1920,7 @@ UnitID GetFreeUnitNumber(VehicleType type)
|
||||
* @return true if there is any reason why you may build
|
||||
* the infrastructure for the given vehicle type
|
||||
*/
|
||||
bool CanBuildVehicleInfrastructure(VehicleType type, byte subtype)
|
||||
bool CanBuildVehicleInfrastructure(VehicleType type, uint8_t subtype)
|
||||
{
|
||||
assert(IsCompanyBuildableVehicleType(type));
|
||||
|
||||
@@ -2055,7 +2062,7 @@ LiveryScheme GetEngineLiveryScheme(EngineID engine_type, EngineID parent_engine_
|
||||
* @param livery_setting The livery settings to use for acquiring the livery information.
|
||||
* @return livery to use
|
||||
*/
|
||||
const Livery *GetEngineLivery(EngineID engine_type, CompanyID company, EngineID parent_engine_type, const Vehicle *v, byte livery_setting)
|
||||
const Livery *GetEngineLivery(EngineID engine_type, CompanyID company, EngineID parent_engine_type, const Vehicle *v, uint8_t livery_setting)
|
||||
{
|
||||
const Company *c = Company::Get(company);
|
||||
LiveryScheme scheme = LS_DEFAULT;
|
||||
@@ -2389,7 +2396,7 @@ void Vehicle::LeaveStation()
|
||||
}
|
||||
if (this->type == VEH_ROAD && !(this->vehstatus & VS_CRASHED)) {
|
||||
/* Trigger road stop animation */
|
||||
if (IsRoadStopTile(this->tile)) {
|
||||
if (IsStationRoadStopTile(this->tile)) {
|
||||
TriggerRoadStopRandomisation(st, this->tile, RSRT_VEH_DEPARTS);
|
||||
TriggerRoadStopAnimation(st, this->tile, SAT_TRAIN_DEPARTS);
|
||||
}
|
||||
@@ -2587,7 +2594,7 @@ CommandCost Vehicle::SendToDepot(DoCommandFlag flags, DepotCommand command)
|
||||
|
||||
if (this->current_order.IsType(OT_GOTO_DEPOT)) {
|
||||
bool halt_in_depot = (this->current_order.GetDepotActionType() & ODATFB_HALT) != 0;
|
||||
if (((command & DepotCommand::Service) != DepotCommand::None) == halt_in_depot) {
|
||||
if (HasFlag(command, DepotCommand::Service) == halt_in_depot) {
|
||||
/* We called with a different DEPOT_SERVICE setting.
|
||||
* Now we change the setting to apply the new one and let the vehicle head for the same depot.
|
||||
* Note: the if is (true for requesting service == true for ordered to stop in depot) */
|
||||
@@ -2599,7 +2606,7 @@ CommandCost Vehicle::SendToDepot(DoCommandFlag flags, DepotCommand command)
|
||||
return CommandCost();
|
||||
}
|
||||
|
||||
if ((command & DepotCommand::DontCancel) != DepotCommand::None) return CMD_ERROR; // Requested no cancellation of depot orders
|
||||
if (HasFlag(command, DepotCommand::DontCancel)) return CMD_ERROR; // Requested no cancellation of depot orders
|
||||
if (flags & DC_EXEC) {
|
||||
/* If the orders to 'goto depot' are in the orders list (forced servicing),
|
||||
* then skip to the next order; effectively cancelling this forced service */
|
||||
@@ -2618,7 +2625,7 @@ CommandCost Vehicle::SendToDepot(DoCommandFlag flags, DepotCommand command)
|
||||
|
||||
ClosestDepot closestDepot = this->FindClosestDepot();
|
||||
static const StringID no_depot[] = {STR_ERROR_UNABLE_TO_FIND_ROUTE_TO, STR_ERROR_UNABLE_TO_FIND_LOCAL_DEPOT, STR_ERROR_UNABLE_TO_FIND_LOCAL_DEPOT, STR_ERROR_CAN_T_SEND_AIRCRAFT_TO_HANGAR};
|
||||
if (!closestDepot.found) return_cmd_error(no_depot[this->type]);
|
||||
if (!closestDepot.found) return CommandCost(no_depot[this->type]);
|
||||
|
||||
if (flags & DC_EXEC) {
|
||||
if (this->current_order.IsType(OT_LOADING)) this->LeaveStation();
|
||||
@@ -2630,7 +2637,7 @@ CommandCost Vehicle::SendToDepot(DoCommandFlag flags, DepotCommand command)
|
||||
|
||||
this->SetDestTile(closestDepot.location);
|
||||
this->current_order.MakeGoToDepot(closestDepot.destination, ODTF_MANUAL);
|
||||
if ((command & DepotCommand::Service) == DepotCommand::None) this->current_order.SetDepotActionType(ODATFB_HALT);
|
||||
if (!HasFlag(command, DepotCommand::Service)) this->current_order.SetDepotActionType(ODATFB_HALT);
|
||||
SetWindowWidgetDirty(WC_VEHICLE_VIEW, this->index, WID_VV_START_STOP);
|
||||
|
||||
/* If there is no depot in front and the train is not already reversing, reverse automatically (trains only) */
|
||||
@@ -2661,7 +2668,7 @@ void Vehicle::UpdateVisualEffect(bool allow_power_change)
|
||||
const Engine *e = this->GetEngine();
|
||||
|
||||
/* Evaluate properties */
|
||||
byte visual_effect;
|
||||
uint8_t visual_effect;
|
||||
switch (e->type) {
|
||||
case VEH_TRAIN: visual_effect = e->u.rail.visual_effect; break;
|
||||
case VEH_ROAD: visual_effect = e->u.road.visual_effect; break;
|
||||
|
||||
Reference in New Issue
Block a user