changeset 15963:3877138a17d5 draft

(svn r20651) -Codechange: add a function to determine whether an object is available and use it
author rubidium <rubidium@openttd.org>
date Sat, 28 Aug 2010 17:36:28 +0000
parents 397063a81cfa
children f8b2485b1bd7
files src/newgrf_object.cpp src/newgrf_object.h src/object_cmd.cpp
diffstat 3 files changed, 18 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- 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 @@
 	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()
 {
--- a/src/newgrf_object.h
+++ b/src/newgrf_object.h
@@ -70,6 +70,12 @@
 	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.
 	 */
--- a/src/object_cmd.cpp
+++ b/src/object_cmd.cpp
@@ -122,7 +122,7 @@
 
 	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;