changeset 17786:9c79dc561eaa draft

(svn r22571) -Add: [NewGRF] Show town persistent storage in the NewGRF debug GUI.
author terkhen <terkhen@openttd.org>
date Sun, 12 Jun 2011 20:53:16 +0000
parents cbd020284e09
children f494fc48030a
files src/newgrf_debug_gui.cpp src/newgrf_town.cpp src/table/newgrf_debug_data.h
diffstat 3 files changed, 33 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/newgrf_debug_gui.cpp
+++ b/src/newgrf_debug_gui.cpp
@@ -164,9 +164,18 @@
 	}
 
 	/**
+	 * Used to decide if the PSA needs a parameter or not.
+	 * @return True iff this item has a PSA that requires a parameter.
+	 */
+	virtual bool PSAWithParameter() const
+	{
+		return false;
+	}
+
+	/**
 	 * Allows to know the size of the persistent storage.
 	 * @param index Index of the item.
-	 * @param grfid Unused.
+	 * @param grfid Parameter for the PSA. Only required for items with parameters.
 	 * @return Size of the persistent storage in indices.
 	 */
 	virtual uint GetPSASize(uint index, uint32 grfid) const
@@ -177,7 +186,7 @@
 	/**
 	 * Gets the first position of the array containing the persistent storage.
 	 * @param index Index of the item.
-	 * @param grfid Unused.
+	 * @param grfid Parameter for the PSA. Only required for items with parameters.
 	 * @return Pointer to the first position of the storage array or NULL if not present.
 	 */
 	virtual int32 *GetPSAFirstPosition(uint index, uint32 grfid) const
@@ -388,10 +397,14 @@
 			}
 		}
 
-		uint psa_size = nih->GetPSASize(index, 0);
-		int32 *psa = nih->GetPSAFirstPosition(index, 0);
+		uint psa_size = nih->GetPSASize(index, this->caller_grfid);
+		int32 *psa = nih->GetPSAFirstPosition(index, this->caller_grfid);
 		if (psa_size != 0 && psa != NULL) {
-			this->DrawString(r, i++, "Persistent storage:");
+			if (nih->PSAWithParameter()) {
+				this->DrawString(r, i++, "Persistent storage [%08X]:", BSWAP32(this->caller_grfid));
+			} else {
+				this->DrawString(r, i++, "Persistent storage:");
+			}
 			assert(psa_size % 4 == 0);
 			for (uint j = 0; j < psa_size; j += 4, psa += 4) {
 				this->DrawString(r, i++, "  %i: %i %i %i %i", j, psa[0], psa[1], psa[2], psa[3]);
--- a/src/newgrf_town.cpp
+++ b/src/newgrf_town.cpp
@@ -158,6 +158,7 @@
 	}
 
 	/* Create a new storage. */
+	assert(PersistentStorage::CanAllocateItem());
 	PersistentStorage *psa = new PersistentStorage(grfid);
 	psa->StoreValue(pos, value);
 	t->psa_list.push_back(psa);
--- a/src/table/newgrf_debug_data.h
+++ b/src/table/newgrf_debug_data.h
@@ -443,6 +443,20 @@
 	void SetStringParameters(uint index) const           { this->SetSimpleStringParameters(STR_TOWN_NAME, index); }
 	uint32 GetGRFID(uint index) const                    { return 0; }
 	uint Resolve(uint index, uint var, uint param, bool *avail) const { return TownGetVariable(var, param, avail, Town::Get(index), NULL); }
+	bool PSAWithParameter() const                        { return true; }
+	uint GetPSASize(uint index, uint32 grfid) const      { return cpp_lengthof(PersistentStorage, storage); }
+
+	int32 *GetPSAFirstPosition(uint index, uint32 grfid) const
+	{
+		Town *t = Town::Get(index);
+
+		std::list<PersistentStorage *>::iterator iter;
+		for (iter = t->psa_list.begin(); iter != t->psa_list.end(); iter++) {
+			if ((*iter)->grfid == grfid) return (int32 *)(&(*iter)->storage[0]);
+		}
+
+		return NULL;
+	}
 };
 
 static const NIFeature _nif_town = {