summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfrosch <frosch@openttd.org>2012-04-22 16:28:27 +0000
committerfrosch <frosch@openttd.org>2012-04-22 16:28:27 +0000
commit34969178db5433cbe8e198d420976c899e72ae2a (patch)
treebbc47721773f360007e03639a9ebc8e8042d2e19
parent6d9a0ff72396fc99151878e551fd0756ef71ce64 (diff)
downloadopenttd-34969178db5433cbe8e198d420976c899e72ae2a.tar.xz
(svn r24169) -Add: Make NewGRFClass distinguish between defined specs and specs visible for the user.
-rw-r--r--src/newgrf_airport.cpp6
-rw-r--r--src/newgrf_class.h7
-rw-r--r--src/newgrf_class_func.h17
-rw-r--r--src/newgrf_object.cpp6
-rw-r--r--src/newgrf_station.cpp6
5 files changed, 42 insertions, 0 deletions
diff --git a/src/newgrf_airport.cpp b/src/newgrf_airport.cpp
index d526f6d54..2ece7cf0f 100644
--- a/src/newgrf_airport.cpp
+++ b/src/newgrf_airport.cpp
@@ -31,6 +31,12 @@ template <typename Tspec, typename Tid, Tid Tmax>
AirportClass::Get(AirportClass::Allocate('HELI'))->name = STR_AIRPORT_CLASS_HELIPORTS;
}
+template <typename Tspec, typename Tid, Tid Tmax>
+bool NewGRFClass<Tspec, Tid, Tmax>::IsUIAvailable(uint index) const
+{
+ return true;
+}
+
INSTANTIATE_NEWGRF_CLASS_METHODS(AirportClass, AirportSpec, AirportClassID, APC_MAX)
diff --git a/src/newgrf_class.h b/src/newgrf_class.h
index 0690c6a51..2dfeceba3 100644
--- a/src/newgrf_class.h
+++ b/src/newgrf_class.h
@@ -21,6 +21,7 @@ template <typename Tspec, typename Tid, Tid Tmax>
struct NewGRFClass {
private:
uint count; ///< Number of specs in this class.
+ uint ui_count; ///< Number of specs in this class potentially available to the user.
Tspec **spec; ///< Array of specifications.
/**
@@ -43,13 +44,19 @@ public:
/** Get the number of allocated specs within the class. */
uint GetSpecCount() const { return this->count; }
+ /** Get the number of potentially user-available specs within the class. */
+ uint GetUISpecCount() const { return this->ui_count; }
const Tspec *GetSpec(uint index) const;
+ /** Check whether the spec will be available to the user at some point in time. */
+ bool IsUIAvailable(uint index) const;
+
static void Reset();
static Tid Allocate(uint32 global_id);
static void Assign(Tspec *spec);
static uint GetClassCount();
+ static uint GetUIClassCount();
static NewGRFClass *Get(Tid cls_id);
static const Tspec *GetByGrf(uint32 grfid, byte local_id, int *index);
diff --git a/src/newgrf_class_func.h b/src/newgrf_class_func.h
index 9bcb6b3c9..b5af35fdb 100644
--- a/src/newgrf_class_func.h
+++ b/src/newgrf_class_func.h
@@ -31,6 +31,7 @@ DEFINE_NEWGRF_CLASS_METHOD(void)::ResetClass()
this->global_id = 0;
this->name = STR_EMPTY;
this->count = 0;
+ this->ui_count = 0;
free(this->spec);
this->spec = NULL;
@@ -80,6 +81,8 @@ DEFINE_NEWGRF_CLASS_METHOD(void)::Insert(Tspec *spec)
this->spec = ReallocT(this->spec, this->count);
this->spec[i] = spec;
+
+ if (this->IsUIAvailable(i)) this->ui_count++;
}
/**
@@ -117,6 +120,19 @@ DEFINE_NEWGRF_CLASS_METHOD(uint)::GetClassCount()
}
/**
+ * Get the number of classes available to the user.
+ * @return The number of classes.
+ */
+DEFINE_NEWGRF_CLASS_METHOD(uint)::GetUIClassCount()
+{
+ uint cnt = 0;
+ for (uint i = 0; i < Tmax && classes[i].global_id != 0; i++) {
+ if (classes[i].GetUISpecCount() > 0) cnt++;
+ }
+ return cnt;
+}
+
+/**
* Get a spec from the class at a given index.
* @param index The index where to find the spec.
* @return The spec at given location.
@@ -163,5 +179,6 @@ DEFINE_NEWGRF_CLASS_METHOD(const Tspec *)::GetByGrf(uint32 grfid, byte local_id,
template void name::Assign(Tspec *spec); \
template NewGRFClass<Tspec, Tid, Tmax> *name::Get(Tid cls_id); \
template uint name::GetClassCount(); \
+ template uint name::GetUIClassCount(); \
template const Tspec *name::GetSpec(uint index) const; \
template const Tspec *name::GetByGrf(uint32 grfid, byte localidx, int *index);
diff --git a/src/newgrf_object.cpp b/src/newgrf_object.cpp
index 1c92c4293..e38fa9c9e 100644
--- a/src/newgrf_object.cpp
+++ b/src/newgrf_object.cpp
@@ -113,6 +113,12 @@ template <typename Tspec, typename Tid, Tid Tmax>
ObjectClass::Assign(&_object_specs[OBJECT_TRANSMITTER]);
}
+template <typename Tspec, typename Tid, Tid Tmax>
+bool NewGRFClass<Tspec, Tid, Tmax>::IsUIAvailable(uint index) const
+{
+ return this->GetSpec(index)->IsEverAvailable();
+}
+
INSTANTIATE_NEWGRF_CLASS_METHODS(ObjectClass, ObjectSpec, ObjectClassID, OBJECT_CLASS_MAX)
diff --git a/src/newgrf_station.cpp b/src/newgrf_station.cpp
index 38e2507ee..9aee46307 100644
--- a/src/newgrf_station.cpp
+++ b/src/newgrf_station.cpp
@@ -40,6 +40,12 @@ template <typename Tspec, typename Tid, Tid Tmax>
classes[1].Insert(NULL);
}
+template <typename Tspec, typename Tid, Tid Tmax>
+bool NewGRFClass<Tspec, Tid, Tmax>::IsUIAvailable(uint index) const
+{
+ return true;
+}
+
INSTANTIATE_NEWGRF_CLASS_METHODS(StationClass, StationSpec, StationClassID, STAT_CLASS_MAX)
static const uint MAX_SPECLIST = 255;