diff --git a/src/newgrf_object.cpp b/src/newgrf_object.cpp index 30dd23df53..dc01d11d3c 100644 --- a/src/newgrf_object.cpp +++ b/src/newgrf_object.cpp @@ -11,6 +11,7 @@ #include "stdafx.h" #include "core/mem_func.hpp" +#include "date_func.h" #include "newgrf.h" #include "newgrf_class_func.h" #include "newgrf_object.h" @@ -35,6 +36,16 @@ ObjectSpec _object_specs[NUM_OBJECTS]; return ObjectSpec::Get(GetObjectType(tile)); } +bool ObjectSpec::IsAvailable() const +{ + return + this->enabled && + _date > this->introduction_date && + (_date < this->end_of_life_date || this->end_of_life_date < this->introduction_date + 365) && + HasBit(this->climate, _settings_game.game_creation.landscape) && + (flags & (_game_mode != GM_EDITOR ? OBJECT_FLAG_ONLY_IN_SCENEDIT : OBJECT_FLAG_ONLY_IN_GAME)) == 0; +} + /** This function initialize the spec arrays of objects. */ void ResetObjects() { diff --git a/src/newgrf_object.h b/src/newgrf_object.h index da2874c3c1..5aaf5c286e 100644 --- a/src/newgrf_object.h +++ b/src/newgrf_object.h @@ -69,6 +69,12 @@ struct ObjectSpec { uint8 height; ///< The height of this structure, in heightlevels; max MAX_TILE_HEIGHT. bool enabled; ///< Is this spec enabled? + /** + * Check whether the object is available at this time. + * @return true if it is available. + */ + bool IsAvailable() const; + /** * Get the cost for building a structure of this type. * @return The cost for building. diff --git a/src/object_cmd.cpp b/src/object_cmd.cpp index 564c9f9a6d..660d32991d 100644 --- a/src/object_cmd.cpp +++ b/src/object_cmd.cpp @@ -122,7 +122,7 @@ CommandCost CmdBuildObject(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3 ObjectType type = (ObjectType)GB(p1, 0, 8); const ObjectSpec *spec = ObjectSpec::Get(type); - if (!spec->enabled) return CMD_ERROR; + if (!spec->IsAvailable()) return CMD_ERROR; if (spec->flags & OBJECT_FLAG_ONLY_IN_SCENEDIT && (_game_mode != GM_EDITOR || _current_company != OWNER_NONE)) return CMD_ERROR; if (spec->flags & OBJECT_FLAG_ONLY_IN_GAME && (_game_mode != GM_NORMAL || _current_company > MAX_COMPANIES)) return CMD_ERROR;