From 37e49422322ddf7c32fcb85722d915e8e2ddedb9 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 17 Apr 2024 21:47:41 +0100 Subject: [PATCH] Add: [NewGRF] Vehicle property to copy properties of an existing definition. This simplifies creation of similar variants, but can also be used for distinct types. Strings and Action 3-2-1 chains are not copied. --- src/newgrf.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 662fc3e38b..910a0cfeff 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -1334,6 +1334,16 @@ static ChangeInfoResult RailVehicleChangeInfo(uint engine, int numinfo, int prop SB(ei->callback_mask, 8, 8, buf->ReadByte()); break; + case 0x80: { // Copy existing train properties + uint16_t sourceid = buf->ReadWord(); + Engine *source = GetNewEngine(_cur.grffile, VEH_TRAIN, sourceid, true); + if (source == nullptr) break; + *ei = source->info; + *rvi = source->u.rail; + _gted[e->index] = _gted[source->index]; + break; + } + default: ret = CommonVehicleChangeInfo(ei, prop, buf); break; @@ -1540,6 +1550,16 @@ static ChangeInfoResult RoadVehicleChangeInfo(uint engine, int numinfo, int prop SB(ei->callback_mask, 8, 8, buf->ReadByte()); break; + case 0x80: { // Copy existing road vehicle properties + uint16_t sourceid = buf->ReadWord(); + Engine *source = GetNewEngine(_cur.grffile, VEH_ROAD, sourceid, true); + if (source == nullptr) break; + *ei = source->info; + *rvi = source->u.road; + _gted[e->index] = _gted[source->index]; + break; + } + default: ret = CommonVehicleChangeInfo(ei, prop, buf); break; @@ -1732,6 +1752,16 @@ static ChangeInfoResult ShipVehicleChangeInfo(uint engine, int numinfo, int prop svi->acceleration = std::max(1, buf->ReadByte()); break; + case 0x80: { // Copy existing ship properties + uint16_t sourceid = buf->ReadWord(); + Engine *source = GetNewEngine(_cur.grffile, VEH_SHIP, sourceid, true); + if (source == nullptr) break; + *ei = source->info; + *svi = source->u.ship; + _gted[e->index] = _gted[source->index]; + break; + } + default: ret = CommonVehicleChangeInfo(ei, prop, buf); break; @@ -1897,6 +1927,16 @@ static ChangeInfoResult AircraftVehicleChangeInfo(uint engine, int numinfo, int SB(ei->callback_mask, 8, 8, buf->ReadByte()); break; + case 0x80: { // Copy existing aircraft properties + uint16_t sourceid = buf->ReadWord(); + Engine *source = GetNewEngine(_cur.grffile, VEH_AIRCRAFT, sourceid, true); + if (source == nullptr) break; + *ei = source->info; + *avi = source->u.air; + _gted[e->index] = _gted[source->index]; + break; + } + default: ret = CommonVehicleChangeInfo(ei, prop, buf); break;