summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/newgrf_debug_gui.cpp23
-rw-r--r--src/newgrf_town.cpp1
-rw-r--r--src/table/newgrf_debug_data.h14
3 files changed, 33 insertions, 5 deletions
diff --git a/src/newgrf_debug_gui.cpp b/src/newgrf_debug_gui.cpp
index 6ba47e7ee..4bd32f337 100644
--- a/src/newgrf_debug_gui.cpp
+++ b/src/newgrf_debug_gui.cpp
@@ -164,9 +164,18 @@ public:
}
/**
+ * 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 @@ public:
/**
* 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 @@ struct NewGRFInspectWindow : Window {
}
}
- 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]);
diff --git a/src/newgrf_town.cpp b/src/newgrf_town.cpp
index c177406ab..5f379766b 100644
--- a/src/newgrf_town.cpp
+++ b/src/newgrf_town.cpp
@@ -158,6 +158,7 @@ void TownStorePSA(Town *t, const GRFFile *caller_grffile, uint pos, int32 value)
}
/* Create a new storage. */
+ assert(PersistentStorage::CanAllocateItem());
PersistentStorage *psa = new PersistentStorage(grfid);
psa->StoreValue(pos, value);
t->psa_list.push_back(psa);
diff --git a/src/table/newgrf_debug_data.h b/src/table/newgrf_debug_data.h
index 94e030620..0faf2979b 100644
--- a/src/table/newgrf_debug_data.h
+++ b/src/table/newgrf_debug_data.h
@@ -443,6 +443,20 @@ class NIHTown : public NIHelper {
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 = {