mirror of
https://github.com/JGRennison/OpenTTD-patches.git
synced 2024-11-17 21:25:40 +00:00
Add GRF ID/name to "Too many NewGRF string parameters" messages
This commit is contained in:
parent
0c3fbecb96
commit
1c0643e419
@ -394,7 +394,7 @@ void CDECL _intl_grfmsg(int severity, const char *str, ...)
|
|||||||
* @param grfid The grfID to obtain the file for
|
* @param grfid The grfID to obtain the file for
|
||||||
* @return The file.
|
* @return The file.
|
||||||
*/
|
*/
|
||||||
static GRFFile *GetFileByGRFID(uint32 grfid)
|
GRFFile *GetFileByGRFID(uint32 grfid)
|
||||||
{
|
{
|
||||||
for (GRFFile * const file : _grf_files) {
|
for (GRFFile * const file : _grf_files) {
|
||||||
if (file->grfid == grfid) return file;
|
if (file->grfid == grfid) return file;
|
||||||
|
@ -740,6 +740,9 @@ const char *GetGRFStringFromGRFText(const GRFText *text)
|
|||||||
return default_text;
|
return default_text;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static std::array<std::pair<uint16, const char *>, 16> _grf_string_ptr_log;
|
||||||
|
static unsigned int _grf_string_ptr_log_next = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a C-string from a stringid set by a newgrf.
|
* Get a C-string from a stringid set by a newgrf.
|
||||||
*/
|
*/
|
||||||
@ -748,10 +751,15 @@ const char *GetGRFStringPtr(uint16 stringid)
|
|||||||
assert(_grf_text[stringid].grfid != 0);
|
assert(_grf_text[stringid].grfid != 0);
|
||||||
|
|
||||||
const char *str = GetGRFStringFromGRFText(_grf_text[stringid].textholder);
|
const char *str = GetGRFStringFromGRFText(_grf_text[stringid].textholder);
|
||||||
if (str != nullptr) return str;
|
if (str == nullptr) {
|
||||||
|
/* Use the default string ID if the fallback string isn't available */
|
||||||
|
str = GetStringPtr(_grf_text[stringid].def_string);
|
||||||
|
}
|
||||||
|
|
||||||
/* Use the default string ID if the fallback string isn't available */
|
_grf_string_ptr_log[_grf_string_ptr_log_next] = std::pair<uint16, const char *>(stringid, str);
|
||||||
return GetStringPtr(_grf_text[stringid].def_string);
|
_grf_string_ptr_log_next = (_grf_string_ptr_log_next + 1) % _grf_string_ptr_log.size();
|
||||||
|
|
||||||
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -809,6 +817,10 @@ void CleanUpStrings()
|
|||||||
_grf_text[id].textholder = nullptr;
|
_grf_text[id].textholder = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (id = 0; id < _grf_string_ptr_log.size(); id++) {
|
||||||
|
_grf_string_ptr_log[id] = std::pair<uint16, const char *>(0, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
_num_grf_texts = 0;
|
_num_grf_texts = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -973,6 +985,29 @@ void RewindTextRefStack()
|
|||||||
*/
|
*/
|
||||||
uint RemapNewGRFStringControlCode(uint scc, char *buf_start, char **buff, const char **str, int64 *argv, uint argv_size, bool modify_argv)
|
uint RemapNewGRFStringControlCode(uint scc, char *buf_start, char **buff, const char **str, int64 *argv, uint argv_size, bool modify_argv)
|
||||||
{
|
{
|
||||||
|
auto too_many_newgrf_params = [&]() {
|
||||||
|
const char *buffer = *str;
|
||||||
|
uint32 grfid = 0;
|
||||||
|
for (uint entry = 0; entry < _grf_string_ptr_log.size(); entry++) {
|
||||||
|
const char *txt = _grf_string_ptr_log[entry].second;
|
||||||
|
uint16 stringid = _grf_string_ptr_log[entry].first;
|
||||||
|
if (txt != nullptr &&
|
||||||
|
buffer >= txt && buffer < txt + 8192 &&
|
||||||
|
buffer < txt + strlen(txt) &&
|
||||||
|
_grf_text[stringid].grfid != 0) {
|
||||||
|
grfid = _grf_text[stringid].grfid;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (grfid) {
|
||||||
|
extern GRFFile *GetFileByGRFID(uint32 grfid);
|
||||||
|
const GRFFile *grffile = GetFileByGRFID(grfid);
|
||||||
|
DEBUG(misc, 0, "Too many NewGRF string parameters (in %X, %s).", BSWAP32(grfid), grffile ? grffile->filename : "????");
|
||||||
|
} else {
|
||||||
|
DEBUG(misc, 0, "Too many NewGRF string parameters.");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
switch (scc) {
|
switch (scc) {
|
||||||
default: break;
|
default: break;
|
||||||
|
|
||||||
@ -1000,7 +1035,7 @@ uint RemapNewGRFStringControlCode(uint scc, char *buf_start, char **buff, const
|
|||||||
case SCC_NEWGRF_PRINT_WORD_STATION_NAME:
|
case SCC_NEWGRF_PRINT_WORD_STATION_NAME:
|
||||||
case SCC_NEWGRF_PRINT_WORD_CARGO_NAME:
|
case SCC_NEWGRF_PRINT_WORD_CARGO_NAME:
|
||||||
if (argv_size < 1) {
|
if (argv_size < 1) {
|
||||||
DEBUG(misc, 0, "Too many NewGRF string parameters.");
|
too_many_newgrf_params();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -1009,7 +1044,7 @@ uint RemapNewGRFStringControlCode(uint scc, char *buf_start, char **buff, const
|
|||||||
case SCC_NEWGRF_PRINT_WORD_CARGO_SHORT:
|
case SCC_NEWGRF_PRINT_WORD_CARGO_SHORT:
|
||||||
case SCC_NEWGRF_PRINT_WORD_CARGO_TINY:
|
case SCC_NEWGRF_PRINT_WORD_CARGO_TINY:
|
||||||
if (argv_size < 2) {
|
if (argv_size < 2) {
|
||||||
DEBUG(misc, 0, "Too many NewGRF string parameters.");
|
too_many_newgrf_params();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user