mirror of https://github.com/OpenTTD/OpenTTD
Codechange: Add a depot for each airport that has a hangar.
parent
891e53c72e
commit
620d14c502
|
@ -2425,28 +2425,6 @@ bool AfterLoadGame()
|
|||
for (Depot *d : Depot::Iterate()) d->build_date = TimerGameCalendar::date;
|
||||
}
|
||||
|
||||
/* In old versions it was possible to remove an airport while a plane was
|
||||
* taking off or landing. This gives all kind of problems when building
|
||||
* another airport in the same station so we don't allow that anymore.
|
||||
* For old savegames with such aircraft we just throw them in the air and
|
||||
* treat the aircraft like they were flying already. */
|
||||
if (IsSavegameVersionBefore(SLV_146)) {
|
||||
for (Aircraft *v : Aircraft::Iterate()) {
|
||||
if (!v->IsNormalAircraft()) continue;
|
||||
Station *st = GetTargetAirportIfValid(v);
|
||||
if (st == nullptr && v->state != FLYING) {
|
||||
v->state = FLYING;
|
||||
UpdateAircraftCache(v);
|
||||
AircraftNextAirportPos_and_Order(v);
|
||||
/* get aircraft back on running altitude */
|
||||
if ((v->vehstatus & VS_CRASHED) == 0) {
|
||||
GetAircraftFlightLevelBounds(v, &v->z_pos, nullptr);
|
||||
SetAircraftPosition(v, v->x_pos, v->y_pos, GetAircraftFlightLevel(v));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Move the animation frame to the same location (m7) for all objects. */
|
||||
if (IsSavegameVersionBefore(SLV_147)) {
|
||||
for (auto t : Map::Iterate()) {
|
||||
|
@ -2792,6 +2770,43 @@ bool AfterLoadGame()
|
|||
}
|
||||
}
|
||||
|
||||
if (IsSavegameVersionBefore(SLV_ADD_DEPOTS_TO_HANGARS)) {
|
||||
for (Station *st : Station::Iterate()) {
|
||||
if ((st->facilities & FACIL_AIRPORT) && st->airport.HasHangar()) {
|
||||
/* Add a built-in hangar for some airport types. */
|
||||
assert(Depot::CanAllocateItem());
|
||||
st->airport.AddHangar();
|
||||
} else {
|
||||
/* If airport has no hangar, remove old go to hangar orders
|
||||
* that could remain from removing an airport with a hangar
|
||||
* and rebuilding it with an airport with no hangar. */
|
||||
RemoveOrderFromAllVehicles(OT_GOTO_DEPOT, st->index);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* In old versions it was possible to remove an airport while a plane was
|
||||
* taking off or landing. This gives all kind of problems when building
|
||||
* another airport in the same station so we don't allow that anymore.
|
||||
* For old savegames with such aircraft we just throw them in the air and
|
||||
* treat the aircraft like they were flying already. */
|
||||
if (IsSavegameVersionBefore(SLV_146)) {
|
||||
for (Aircraft *v : Aircraft::Iterate()) {
|
||||
if (!v->IsNormalAircraft()) continue;
|
||||
Station *st = GetTargetAirportIfValid(v);
|
||||
if (st == nullptr && v->state != FLYING) {
|
||||
v->state = FLYING;
|
||||
UpdateAircraftCache(v);
|
||||
AircraftNextAirportPos_and_Order(v);
|
||||
/* get aircraft back on running altitude */
|
||||
if ((v->vehstatus & VS_CRASHED) == 0) {
|
||||
GetAircraftFlightLevelBounds(v, &v->z_pos, nullptr);
|
||||
SetAircraftPosition(v, v->x_pos, v->y_pos, GetAircraftFlightLevel(v));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* This triggers only when old snow_lines were copied into the snow_line_height. */
|
||||
if (IsSavegameVersionBefore(SLV_164) && _settings_game.game_creation.snow_line_height >= MIN_SNOWLINE_HEIGHT * TILE_HEIGHT) {
|
||||
_settings_game.game_creation.snow_line_height /= TILE_HEIGHT;
|
||||
|
|
|
@ -108,6 +108,7 @@ const SaveLoadCompat _station_normal_sl_compat[] = {
|
|||
SLC_VAR("airport.layout"),
|
||||
SLC_VAR("airport.flags"),
|
||||
SLC_VAR("airport.rotation"),
|
||||
SLC_VAR("airport.hangar"),
|
||||
SLC_VAR("storage"),
|
||||
SLC_VAR("airport.psa"),
|
||||
SLC_VAR("indtype"),
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include "../stdafx.h"
|
||||
#include "../debug.h"
|
||||
#include "../station_base.h"
|
||||
#include "../depot_base.h"
|
||||
#include "../thread.h"
|
||||
#include "../town.h"
|
||||
#include "../network/network.h"
|
||||
|
@ -1121,6 +1122,7 @@ static size_t ReferenceToInt(const void *obj, SLRefType rt)
|
|||
case REF_STORAGE: return ((const PersistentStorage*)obj)->index + 1;
|
||||
case REF_LINK_GRAPH: return ((const LinkGraph*)obj)->index + 1;
|
||||
case REF_LINK_GRAPH_JOB: return ((const LinkGraphJob*)obj)->index + 1;
|
||||
case REF_DEPOT: return ((const Depot*)obj)->index + 1;
|
||||
default: NOT_REACHED();
|
||||
}
|
||||
}
|
||||
|
@ -1202,6 +1204,10 @@ static void *IntToReference(size_t index, SLRefType rt)
|
|||
if (LinkGraphJob::IsValidID(index)) return LinkGraphJob::Get(index);
|
||||
SlErrorCorrupt("Referencing invalid LinkGraphJob");
|
||||
|
||||
case REF_DEPOT:
|
||||
if (Depot::IsValidID(index)) return Depot::Get(index);
|
||||
SlErrorCorrupt("Referencing invalid Depot");
|
||||
|
||||
default: NOT_REACHED();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -383,6 +383,7 @@ enum SaveLoadVersion : uint16_t {
|
|||
SLV_GROUP_NUMBERS, ///< 336 PR#12297 Add per-company group numbers.
|
||||
SLV_INCREASE_STATION_TYPE_FIELD_SIZE, ///< 337 PR#12572 Increase size of StationType field in map array
|
||||
SLV_ROAD_WAYPOINTS, ///< 338 PR#12572 Road waypoints
|
||||
SLV_ADD_DEPOTS_TO_HANGARS, ///< 339 PR#10691 Add depots to airports that have a hangar.
|
||||
|
||||
SL_MAX_VERSION, ///< Highest possible saveload version
|
||||
};
|
||||
|
@ -598,6 +599,7 @@ enum SLRefType {
|
|||
REF_STORAGE = 9, ///< Load/save a reference to a persistent storage.
|
||||
REF_LINK_GRAPH = 10, ///< Load/save a reference to a link graph.
|
||||
REF_LINK_GRAPH_JOB = 11, ///< Load/save a reference to a link graph job.
|
||||
REF_DEPOT = 12, ///< Load/save a reference to a depot.
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -610,6 +610,7 @@ public:
|
|||
SLE_CONDVAR(Station, airport.layout, SLE_UINT8, SLV_145, SL_MAX_VERSION),
|
||||
SLE_VAR(Station, airport.flags, SLE_UINT64),
|
||||
SLE_CONDVAR(Station, airport.rotation, SLE_UINT8, SLV_145, SL_MAX_VERSION),
|
||||
SLE_CONDREF(Station, airport.hangar, REF_DEPOT, SLV_ADD_DEPOTS_TO_HANGARS, SL_MAX_VERSION),
|
||||
SLEG_CONDARR("storage", _old_st_persistent_storage.storage, SLE_UINT32, 16, SLV_145, SLV_161),
|
||||
SLE_CONDREF(Station, airport.psa, REF_STORAGE, SLV_161, SL_MAX_VERSION),
|
||||
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include "core/random_func.hpp"
|
||||
#include "linkgraph/linkgraph.h"
|
||||
#include "linkgraph/linkgraphschedule.h"
|
||||
#include "depot_base.h"
|
||||
|
||||
#include "table/strings.h"
|
||||
|
||||
|
@ -727,6 +728,29 @@ Money AirportMaintenanceCost(Owner owner)
|
|||
return total_cost >> 3;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a hangar on the airport.
|
||||
*/
|
||||
void Airport::AddHangar()
|
||||
{
|
||||
assert(this->hangar == nullptr);
|
||||
assert(Depot::CanAllocateItem());
|
||||
assert(this->GetNumHangars() > 0);
|
||||
Station *st = Station::GetByTile(this->GetHangarTile(0));
|
||||
this->hangar = new Depot(this->GetHangarTile(0));
|
||||
this->hangar->build_date = st->build_date;
|
||||
this->hangar->town = st->town;
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete the hangar on the airport.
|
||||
*/
|
||||
void Airport::RemoveHangar()
|
||||
{
|
||||
delete this->hangar;
|
||||
this->hangar = nullptr;
|
||||
}
|
||||
|
||||
bool StationCompare::operator() (const Station *lhs, const Station *rhs) const
|
||||
{
|
||||
return lhs->index < rhs->index;
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
#include "linkgraph/linkgraph_type.h"
|
||||
#include "newgrf_storage.h"
|
||||
#include "bitmap_type.h"
|
||||
#include "depot_type.h"
|
||||
|
||||
static const uint8_t INITIAL_STATION_RATING = 175;
|
||||
static const uint8_t MAX_STATION_RATING = 255;
|
||||
|
@ -294,6 +295,7 @@ struct Airport : public TileArea {
|
|||
uint8_t type; ///< Type of this airport, @see AirportTypes
|
||||
uint8_t layout; ///< Airport layout number.
|
||||
Direction rotation; ///< How this airport is rotated.
|
||||
Depot *hangar; ///< The corresponding hangar of this airport, if any.
|
||||
|
||||
PersistentStorage *psa; ///< Persistent storage for NewGRF airports.
|
||||
|
||||
|
@ -404,6 +406,9 @@ struct Airport : public TileArea {
|
|||
return num;
|
||||
}
|
||||
|
||||
void AddHangar();
|
||||
void RemoveHangar();
|
||||
|
||||
private:
|
||||
/**
|
||||
* Retrieve hangar information of a hangar at a given tile.
|
||||
|
|
|
@ -67,6 +67,7 @@
|
|||
#include "timer/timer_game_tick.h"
|
||||
#include "cheat_type.h"
|
||||
#include "road_func.h"
|
||||
#include "depot_base.h"
|
||||
|
||||
#include "widgets/station_widget.h"
|
||||
|
||||
|
@ -2539,6 +2540,8 @@ CommandCost CmdBuildAirport(DoCommandFlag flags, TileIndex tile, uint8_t airport
|
|||
|
||||
/* Check if a valid, buildable airport was chosen for construction */
|
||||
const AirportSpec *as = AirportSpec::Get(airport_type);
|
||||
|
||||
if (!as->depots.empty() && !Depot::CanAllocateItem()) return CMD_ERROR;
|
||||
if (!as->IsAvailable() || layout >= as->layouts.size()) return CMD_ERROR;
|
||||
if (!as->IsWithinMapBounds(layout, tile)) return CMD_ERROR;
|
||||
|
||||
|
@ -2632,6 +2635,8 @@ CommandCost CmdBuildAirport(DoCommandFlag flags, TileIndex tile, uint8_t airport
|
|||
AirportTileAnimationTrigger(st, iter, AAT_BUILT);
|
||||
}
|
||||
|
||||
if (!as->depots.empty()) st->airport.AddHangar();
|
||||
|
||||
UpdateAirplanesOnNewStation(st);
|
||||
|
||||
Company::Get(st->owner)->infrastructure.airport++;
|
||||
|
@ -2679,6 +2684,7 @@ static CommandCost RemoveAirport(TileIndex tile, DoCommandFlag flags)
|
|||
OrderBackup::Reset(tile_cur, false);
|
||||
CloseWindowById(WC_VEHICLE_DEPOT, tile_cur);
|
||||
}
|
||||
st->airport.RemoveHangar();
|
||||
|
||||
/* The noise level is the noise from the airport and reduce it to account for the distance to the town center.
|
||||
* And as for construction, always remove it, even if the setting is not set, in order to avoid the
|
||||
|
|
Loading…
Reference in New Issue