Merge branch 'master' into jgrpp

# Conflicts:
#	config.lib
#	projects/openttd_vs140.vcxproj
#	projects/openttd_vs140.vcxproj.filters
#	projects/openttd_vs141.vcxproj
#	projects/openttd_vs141.vcxproj.filters
#	projects/openttd_vs142.vcxproj
#	projects/openttd_vs142.vcxproj.filters
#	src/aircraft_cmd.cpp
#	src/base_station_base.h
#	src/core/pool_type.hpp
#	src/disaster_vehicle.cpp
#	src/economy.cpp
#	src/engine.cpp
#	src/group.h
#	src/group_cmd.cpp
#	src/group_gui.cpp
#	src/lang/english.txt
#	src/lang/german.txt
#	src/linkgraph/linkgraph_gui.cpp
#	src/network/network_command.cpp
#	src/network/network_server.cpp
#	src/openttd.cpp
#	src/order_cmd.cpp
#	src/road_cmd.cpp
#	src/saveload/afterload.cpp
#	src/saveload/cargopacket_sl.cpp
#	src/saveload/linkgraph_sl.cpp
#	src/saveload/order_sl.cpp
#	src/saveload/station_sl.cpp
#	src/saveload/town_sl.cpp
#	src/saveload/vehicle_sl.cpp
#	src/screenshot.cpp
#	src/screenshot.h
#	src/settings_gui.cpp
#	src/settings_type.h
#	src/smallmap_gui.cpp
#	src/station.cpp
#	src/station_cmd.cpp
#	src/table/settings.ini
#	src/toolbar_gui.cpp
#	src/town_cmd.cpp
#	src/train.h
#	src/train_cmd.cpp
#	src/train_gui.cpp
#	src/vehicle.cpp
#	src/vehicle_base.h
#	src/vehiclelist.cpp
#	src/window_type.h
This commit is contained in:
Jonathan G Rennison
2020-01-06 18:45:51 +00:00
281 changed files with 2714 additions and 2467 deletions

View File

@@ -33,13 +33,11 @@
*/
void ConnectMultiheadedTrains()
{
Train *v;
FOR_ALL_TRAINS(v) {
for (Train *v : Train::Iterate()) {
v->other_multiheaded_part = nullptr;
}
FOR_ALL_TRAINS(v) {
for (Train *v : Train::Iterate()) {
if (v->IsFrontEngine() || v->IsFreeWagon()) {
/* Two ways to associate multiheaded parts to each other:
* sequential-matching: Trains shall be arranged to look like <..>..<..>..<..>..
@@ -113,10 +111,9 @@ void ConnectMultiheadedTrains()
*/
void ConvertOldMultiheadToNew()
{
Train *t;
FOR_ALL_TRAINS(t) SetBit(t->subtype, 7); // indicates that it's the old format and needs to be converted in the next loop
for (Train *t : Train::Iterate()) SetBit(t->subtype, 7); // indicates that it's the old format and needs to be converted in the next loop
FOR_ALL_TRAINS(t) {
for (Train *t : Train::Iterate()) {
if (HasBit(t->subtype, 7) && ((t->subtype & ~0x80) == 0 || (t->subtype & ~0x80) == 4)) {
for (Train *u = t; u != nullptr; u = u->Next()) {
const RailVehicleInfo *rvi = RailVehInfo(u->engine_type);
@@ -167,13 +164,11 @@ void ConvertOldMultiheadToNew()
void UpdateOldAircraft()
{
/* set airport_flags to 0 for all airports just to be sure */
Station *st;
FOR_ALL_STATIONS(st) {
for (Station *st : Station::Iterate()) {
st->airport.flags = 0; // reset airport
}
Aircraft *a;
FOR_ALL_AIRCRAFT(a) {
for (Aircraft *a : Aircraft::Iterate()) {
/* airplane has another vehicle with subtype 4 (shadow), helicopter also has 3 (rotor)
* skip those */
if (a->IsNormalAircraft()) {
@@ -218,14 +213,12 @@ static void CheckValidVehicles()
size_t total_engines = Engine::GetPoolSize();
EngineID first_engine[4] = { INVALID_ENGINE, INVALID_ENGINE, INVALID_ENGINE, INVALID_ENGINE };
Engine *e;
FOR_ALL_ENGINES_OF_TYPE(e, VEH_TRAIN) { first_engine[VEH_TRAIN] = e->index; break; }
FOR_ALL_ENGINES_OF_TYPE(e, VEH_ROAD) { first_engine[VEH_ROAD] = e->index; break; }
FOR_ALL_ENGINES_OF_TYPE(e, VEH_SHIP) { first_engine[VEH_SHIP] = e->index; break; }
FOR_ALL_ENGINES_OF_TYPE(e, VEH_AIRCRAFT) { first_engine[VEH_AIRCRAFT] = e->index; break; }
for (const Engine *e : Engine::IterateType(VEH_TRAIN)) { first_engine[VEH_TRAIN] = e->index; break; }
for (const Engine *e : Engine::IterateType(VEH_ROAD)) { first_engine[VEH_ROAD] = e->index; break; }
for (const Engine *e : Engine::IterateType(VEH_SHIP)) { first_engine[VEH_SHIP] = e->index; break; }
for (const Engine *e : Engine::IterateType(VEH_AIRCRAFT)) { first_engine[VEH_AIRCRAFT] = e->index; break; }
Vehicle *v;
FOR_ALL_VEHICLES(v) {
for (Vehicle *v : Vehicle::Iterate()) {
/* Test if engine types match */
switch (v->type) {
case VEH_TRAIN:
@@ -248,9 +241,10 @@ extern byte _age_cargo_skip_counter; // From misc_sl.cpp
/** Called after load to update coordinates */
void AfterLoadVehicles(bool part_of_load)
{
Vehicle *v = nullptr;
SCOPE_INFO_FMT([&v], "AfterLoadVehicles: %s", scope_dumper().VehicleInfo(v));
FOR_ALL_VEHICLES(v) {
const Vehicle *si_v = nullptr;
SCOPE_INFO_FMT([&si_v], "AfterLoadVehicles: %s", scope_dumper().VehicleInfo(si_v));
for (Vehicle *v : Vehicle::Iterate()) {
si_v = v;
/* Reinstate the previous pointer */
if (v->Next() != nullptr) {
v->Next()->previous = v;
@@ -276,7 +270,8 @@ void AfterLoadVehicles(bool part_of_load)
*/
std::map<Order*, OrderList*> mapping;
FOR_ALL_VEHICLES(v) {
for (Vehicle *v : Vehicle::Iterate()) {
si_v = v;
if (v->orders.old != nullptr) {
if (IsSavegameVersionBefore(SLV_105)) { // Pre-105 didn't save an OrderList
if (mapping[v->orders.old] == nullptr) {
@@ -303,7 +298,8 @@ void AfterLoadVehicles(bool part_of_load)
}
}
FOR_ALL_VEHICLES(v) {
for (Vehicle *v : Vehicle::Iterate()) {
si_v = v;
/* Fill the first pointers */
if (v->Previous() == nullptr) {
for (Vehicle *u = v; u != nullptr; u = u->Next()) {
@@ -315,7 +311,8 @@ void AfterLoadVehicles(bool part_of_load)
if (part_of_load) {
if (IsSavegameVersionBefore(SLV_105)) {
/* Before 105 there was no order for shared orders, thus it messed up horribly */
FOR_ALL_VEHICLES(v) {
for (Vehicle *v : Vehicle::Iterate()) {
si_v = v;
if (v->First() != v || v->orders.list != nullptr || v->previous_shared != nullptr || v->next_shared == nullptr) continue;
/* As above, allocating OrderList here is safe. */
@@ -329,9 +326,8 @@ void AfterLoadVehicles(bool part_of_load)
if (IsSavegameVersionBefore(SLV_157)) {
/* The road vehicle subtype was converted to a flag. */
RoadVehicle *rv;
FOR_ALL_ROADVEHICLES(rv) {
v = rv;
for (RoadVehicle *rv : RoadVehicle::Iterate()) {
si_v = rv;
if (rv->subtype == 0) {
/* The road vehicle is at the front. */
rv->SetFrontEngine();
@@ -347,7 +343,8 @@ void AfterLoadVehicles(bool part_of_load)
if (IsSavegameVersionBefore(SLV_160)) {
/* In some old savegames there might be some "crap" stored. */
FOR_ALL_VEHICLES(v) {
for (Vehicle *v : Vehicle::Iterate()) {
si_v = v;
if (!v->IsPrimaryVehicle() && v->type != VEH_DISASTER) {
v->current_order.Free();
v->unitnumber = 0;
@@ -357,14 +354,16 @@ void AfterLoadVehicles(bool part_of_load)
if (IsSavegameVersionBefore(SLV_162)) {
/* Set the vehicle-local cargo age counter from the old global counter. */
FOR_ALL_VEHICLES(v) {
for (Vehicle *v : Vehicle::Iterate()) {
si_v = v;
v->cargo_age_counter = _age_cargo_skip_counter;
}
}
if (IsSavegameVersionBefore(SLV_180)) {
/* Set service interval flags */
FOR_ALL_VEHICLES(v) {
for (Vehicle *v : Vehicle::Iterate()) {
si_v = v;
if (!v->IsPrimaryVehicle()) continue;
const Company *c = Company::Get(v->owner);
@@ -377,13 +376,11 @@ void AfterLoadVehicles(bool part_of_load)
if (IsSavegameVersionBefore(SLV_SHIP_ROTATION)) {
/* Ship rotation added */
Ship *s;
FOR_ALL_SHIPS(s) {
for (Ship *s : Ship::Iterate()) {
s->rotation = s->direction;
}
} else {
Ship *s;
FOR_ALL_SHIPS(s) {
for (Ship *s : Ship::Iterate()) {
if (s->rotation == s->direction) continue;
/* In case we are rotating on gameload, set the rotation position to
* the current position, otherwise the applied workaround offset would
@@ -395,19 +392,20 @@ void AfterLoadVehicles(bool part_of_load)
}
if (SlXvIsFeaturePresent(XSLFI_TEMPLATE_REPLACEMENT) && (_network_server || !_networking)) {
Train *t;
FOR_ALL_TRAINS(t) {
for (Train *t : Train::Iterate()) {
si_v = t;
if (t->IsVirtual() && t->First() == t) {
delete t;
}
}
}
}
v = nullptr;
si_v = nullptr;
CheckValidVehicles();
FOR_ALL_VEHICLES(v) {
for (Vehicle *v : Vehicle::Iterate()) {
si_v = v;
assert(v->first != nullptr);
v->trip_occupancy = CalcPercentVehicleFilled(v, nullptr);
@@ -452,7 +450,8 @@ void AfterLoadVehicles(bool part_of_load)
/* Stop non-front engines */
if (part_of_load && IsSavegameVersionBefore(SLV_112)) {
FOR_ALL_VEHICLES(v) {
for (Vehicle *v : Vehicle::Iterate()) {
si_v = v;
if (v->type == VEH_TRAIN) {
Train *t = Train::From(v);
if (!t->IsFrontEngine()) {
@@ -470,7 +469,8 @@ void AfterLoadVehicles(bool part_of_load)
}
}
FOR_ALL_VEHICLES(v) {
for (Vehicle *v : Vehicle::Iterate()) {
si_v = v;
switch (v->type) {
case VEH_ROAD:
case VEH_TRAIN:
@@ -519,8 +519,7 @@ void FixupTrainLengths()
{
/* Vehicle center was moved from 4 units behind the front to half the length
* behind the front. Move vehicles so they end up on the same spot. */
Vehicle *v;
FOR_ALL_VEHICLES(v) {
for (Vehicle *v : Vehicle::Iterate()) {
if (v->type == VEH_TRAIN && v->IsPrimaryVehicle()) {
/* The vehicle center is now more to the front depending on vehicle length,
* so we need to move all vehicles forward to cover the difference to the
@@ -991,9 +990,8 @@ static void SetupDescs_VEHS()
static void Save_VEHS()
{
SetupDescs_VEHS();
Vehicle *v;
/* Write the vehicles */
FOR_ALL_VEHICLES(v) {
for (Vehicle *v : Vehicle::Iterate()) {
SlSetArrayIndex(v->index);
SlObjectSaveFiltered(v, GetVehicleDescriptionFiltered(v->type));
}
@@ -1062,8 +1060,7 @@ static void Ptrs_VEHS()
{
SetupDescs_VEHS();
Vehicle *v;
FOR_ALL_VEHICLES(v) {
for (Vehicle *v : Vehicle::Iterate()) {
if (SlXvIsFeaturePresent(XSLFI_CHILLPP)) _cpp_packets = std::move(_veh_cpp_packets[v->index]);
SlObjectPtrOrNullFiltered(v, GetVehicleDescriptionFiltered(v->type));
if (SlXvIsFeaturePresent(XSLFI_CHILLPP)) _veh_cpp_packets[v->index] = std::move(_cpp_packets);
@@ -1075,8 +1072,7 @@ const SaveLoad *GetOrderExtraInfoDescription();
void Save_VEOX()
{
/* save extended order info for vehicle current order */
Vehicle *v;
FOR_ALL_VEHICLES(v) {
for (Vehicle *v : Vehicle::Iterate()) {
if (v->current_order.extra) {
SlSetArrayIndex(v->index);
SlObject(v->current_order.extra.get(), GetOrderExtraInfoDescription());
@@ -1111,8 +1107,7 @@ const SaveLoad *GetVehicleSpeedRestrictionDescription()
void Save_VESR()
{
Train *t;
FOR_ALL_TRAINS(t) {
for (Train *t : Train::Iterate()) {
if (HasBit(t->flags, VRF_PENDING_SPEED_RESTRICTION)) {
auto range = pending_speed_restriction_change_map.equal_range(t->index);
for (auto it = range.first; it != range.second; ++it) {