diff --git a/src/newgrf.cpp b/src/newgrf.cpp index cda3f4d5d3..b0fb95c30f 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -9518,6 +9518,8 @@ static void FinaliseObjectsArray() } } } + + ObjectSpec::BindToClasses(); } /** diff --git a/src/newgrf_commons.cpp b/src/newgrf_commons.cpp index eb8d3f8c40..071e4a108a 100644 --- a/src/newgrf_commons.cpp +++ b/src/newgrf_commons.cpp @@ -316,7 +316,6 @@ void ObjectOverrideManager::SetEntitySpec(ObjectSpec *spec) /* Now that we know we can use the given id, copy the spec to its final destination. */ memcpy(&_object_specs[type], spec, sizeof(*spec)); - ObjectClass::Assign(&_object_specs[type]); } /** diff --git a/src/newgrf_object.cpp b/src/newgrf_object.cpp index ccd46e2e92..c7c2c770ee 100644 --- a/src/newgrf_object.cpp +++ b/src/newgrf_object.cpp @@ -90,6 +90,18 @@ uint ObjectSpec::Index() const return this - _object_specs; } +/** + * Tie all ObjectSpecs to their class. + */ +/* static */ void ObjectSpec::BindToClasses() +{ + for (auto &spec : _object_specs) { + if (spec.IsEnabled() && spec.cls_id != INVALID_OBJECT_CLASS) { + ObjectClass::Assign(&spec); + } + } +} + /** This function initialize the spec arrays of objects. */ void ResetObjects() { @@ -104,20 +116,17 @@ void ResetObjects() for (uint16 i = 0; i < lengthof(_original_objects); i++) { _object_specs[i].grf_prop.local_id = i; } + + /* Set class for originals. */ + _object_specs[OBJECT_LIGHTHOUSE].cls_id = ObjectClass::Allocate('LTHS'); + _object_specs[OBJECT_TRANSMITTER].cls_id = ObjectClass::Allocate('TRNS'); } template /* static */ void NewGRFClass::InsertDefaults() { - ObjectClassID cls = ObjectClass::Allocate('LTHS'); - ObjectClass::Get(cls)->name = STR_OBJECT_CLASS_LTHS; - _object_specs[OBJECT_LIGHTHOUSE].cls_id = cls; - ObjectClass::Assign(&_object_specs[OBJECT_LIGHTHOUSE]); - - cls = ObjectClass::Allocate('TRNS'); - ObjectClass::Get(cls)->name = STR_OBJECT_CLASS_TRNS; - _object_specs[OBJECT_TRANSMITTER].cls_id = cls; - ObjectClass::Assign(&_object_specs[OBJECT_TRANSMITTER]); + ObjectClass::Get(ObjectClass::Allocate('LTHS'))->name = STR_OBJECT_CLASS_LTHS; + ObjectClass::Get(ObjectClass::Allocate('TRNS'))->name = STR_OBJECT_CLASS_TRNS; } template diff --git a/src/newgrf_object.h b/src/newgrf_object.h index a441d3ceec..f283e36407 100644 --- a/src/newgrf_object.h +++ b/src/newgrf_object.h @@ -101,6 +101,8 @@ struct ObjectSpec { static const ObjectSpec *Get(ObjectType index); static const ObjectSpec *GetByTile(TileIndex tile); + + static void BindToClasses(); }; /** Object scope resolver. */