From 8ddb3941f71470611285f0bdda976d0d15e8b00c Mon Sep 17 00:00:00 2001 From: terkhen Date: Sun, 12 Jun 2011 20:53:16 +0000 Subject: (svn r22571) -Add: [NewGRF] Show town persistent storage in the NewGRF debug GUI. --- src/newgrf_debug_gui.cpp | 23 ++++++++++++++++++----- src/newgrf_town.cpp | 1 + src/table/newgrf_debug_data.h | 14 ++++++++++++++ 3 files changed, 33 insertions(+), 5 deletions(-) (limited to 'src') 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 @@ -163,10 +163,19 @@ public: return ro.GetVariable(&ro, var, param, avail); } + /** + * 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::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 = { -- cgit v1.2.3-70-g09d2