diff --git a/src/newgrf.cpp b/src/newgrf.cpp index 063638ced2..63e095b2ad 100644 --- a/src/newgrf.cpp +++ b/src/newgrf.cpp @@ -11732,3 +11732,22 @@ uint CountSelectedGRFs(GRFConfig *grfconf) } return i; } + +const char *GetExtendedVariableNameById(int id) +{ + extern const GRFVariableMapDefinition _grf_action2_remappable_variables[]; + for (const GRFVariableMapDefinition *info = _grf_action2_remappable_variables; info->name != nullptr; info++) { + if (id == info->id) { + return info->name; + } + } + + extern const GRFNameOnlyVariableMapDefinition _grf_action2_internal_variable_names[]; + for (const GRFNameOnlyVariableMapDefinition *info = _grf_action2_internal_variable_names; info->name != nullptr; info++) { + if (id == info->id) { + return info->name; + } + } + + return nullptr; +} diff --git a/src/newgrf.h b/src/newgrf.h index 4cb2aaf4fd..ada81b9773 100644 --- a/src/newgrf.h +++ b/src/newgrf.h @@ -209,6 +209,22 @@ struct GRFVariableMapDefinition { {} }; +struct GRFNameOnlyVariableMapDefinition { + const char *name; // nullptr indicates the end of the list + int id; + + /** Create empty object used to identify the end of a list. */ + GRFNameOnlyVariableMapDefinition() : + name(nullptr), + id(0) + {} + + GRFNameOnlyVariableMapDefinition(int id, const char *name) : + name(name), + id(id) + {} +}; + struct GRFVariableMapEntry { uint16 id = 0; uint8 feature = 0; @@ -450,4 +466,6 @@ const char *GetFeatureString(GrfSpecFeature feature); void InitGRFGlobalVars(); +const char *GetExtendedVariableNameById(int id); + #endif /* NEWGRF_H */ diff --git a/src/newgrf_debug_gui.cpp b/src/newgrf_debug_gui.cpp index 1b87ea3ad2..b2fb1c1ea7 100644 --- a/src/newgrf_debug_gui.cpp +++ b/src/newgrf_debug_gui.cpp @@ -649,14 +649,11 @@ struct NewGRFInspectWindow : Window { uint prefix_width = 0; for (const NIVariable *niv = nif->variables; niv->name != nullptr; niv++) { if (niv->var >= 0x100) { - extern const GRFVariableMapDefinition _grf_action2_remappable_variables[]; - for (const GRFVariableMapDefinition *info = _grf_action2_remappable_variables; info->name != nullptr; info++) { - if (niv->var == info->id) { - char buf[512]; - seprintf(buf, lastof(buf), " %s: ", info->name); - prefix_width = std::max(prefix_width, GetStringBoundingBox(buf).width); - break; - } + const char *name = GetExtendedVariableNameById(niv->var); + if (name != nullptr) { + char buf[512]; + seprintf(buf, lastof(buf), " %s: ", name); + prefix_width = std::max(prefix_width, GetStringBoundingBox(buf).width); } } } @@ -670,26 +667,23 @@ struct NewGRFInspectWindow : Window { if (HasVariableParameter(niv->var)) { this->DrawString(r, i++, " %02x[%02x]: %08x (%s)", niv->var, param, value, niv->name); } else if (niv->var >= 0x100) { - extern const GRFVariableMapDefinition _grf_action2_remappable_variables[]; - for (const GRFVariableMapDefinition *info = _grf_action2_remappable_variables; info->name != nullptr; info++) { - if (niv->var == info->id) { - if (_current_text_dir == TD_RTL) { - this->DrawString(r, i++, " %s: %08x (%s)", info->name, value, niv->name); - } else { - if (this->log_console) DEBUG(misc, 0, " %s: %08x (%s)", info->name, value, niv->name); + const char *name = GetExtendedVariableNameById(niv->var); + if (name != nullptr) { + if (_current_text_dir == TD_RTL) { + this->DrawString(r, i++, " %s: %08x (%s)", name, value, niv->name); + } else { + if (this->log_console) DEBUG(misc, 0, " %s: %08x (%s)", name, value, niv->name); - int offset = i - this->vscroll->GetPosition(); - i++; - if (offset >= 0 && offset < this->vscroll->GetCapacity()) { - Rect sr = r.Shrink(WidgetDimensions::scaled.frametext).Shrink(0, offset * this->resize.step_height, 0, 0); - char buf[512]; - seprintf(buf, lastof(buf), " %s: ", info->name); - ::DrawString(sr.left, sr.right, sr.top, buf, TC_BLACK); - seprintf(buf, lastof(buf), "%08x (%s)", value, niv->name); - ::DrawString(sr.left + prefix_width, sr.right, sr.top, buf, TC_BLACK); - } + int offset = i - this->vscroll->GetPosition(); + i++; + if (offset >= 0 && offset < this->vscroll->GetCapacity()) { + Rect sr = r.Shrink(WidgetDimensions::scaled.frametext).Shrink(0, offset * this->resize.step_height, 0, 0); + char buf[512]; + seprintf(buf, lastof(buf), " %s: ", name); + ::DrawString(sr.left, sr.right, sr.top, buf, TC_BLACK); + seprintf(buf, lastof(buf), "%08x (%s)", value, niv->name); + ::DrawString(sr.left + prefix_width, sr.right, sr.top, buf, TC_BLACK); } - break; } } } else { diff --git a/src/newgrf_extension.cpp b/src/newgrf_extension.cpp index 9311bade77..4f1c10a742 100644 --- a/src/newgrf_extension.cpp +++ b/src/newgrf_extension.cpp @@ -197,6 +197,13 @@ extern const GRFVariableMapDefinition _grf_action2_remappable_variables[] = { GRFVariableMapDefinition(), }; +extern const GRFNameOnlyVariableMapDefinition _grf_action2_internal_variable_names[] = { + GRFNameOnlyVariableMapDefinition(A2VRI_VEHICLE_CURRENT_SPEED_SCALED, "current speed scaled"), + GRFNameOnlyVariableMapDefinition(A2VRI_STATION_INFO_NEARBY_TILES_EXT, "68 (extended)"), + GRFNameOnlyVariableMapDefinition(A2VRI_ROADSTOP_INFO_NEARBY_TILES_EXT, "68 (extended)"), + GRFNameOnlyVariableMapDefinition(), +}; + /** Action14 Action5 remappable type list */ extern const Action5TypeRemapDefinition _grf_action5_remappable_types[] = { Action5TypeRemapDefinition("programmable_signals", A5BLOCK_ALLOW_OFFSET, SPR_PROGSIGNAL_BASE, 1, 32, "Programmable pre-signal graphics"), diff --git a/src/newgrf_spritegroup.cpp b/src/newgrf_spritegroup.cpp index 1868d3d35b..1dbf212b69 100644 --- a/src/newgrf_spritegroup.cpp +++ b/src/newgrf_spritegroup.cpp @@ -514,12 +514,9 @@ static char *DumpSpriteGroupAdjust(char *p, const char *last, const Deterministi }; auto append_extended_var = [&](int var_id) { - extern const GRFVariableMapDefinition _grf_action2_remappable_variables[]; - for (const GRFVariableMapDefinition *info = _grf_action2_remappable_variables; info->name != nullptr; info++) { - if (var_id == info->id) { - p += seprintf(p, last, " (%s)", info->name); - break; - } + const char *name = GetExtendedVariableNameById(var_id); + if (name != nullptr) { + p += seprintf(p, last, " (%s)", name); } }; @@ -560,9 +557,7 @@ static char *DumpSpriteGroupAdjust(char *p, const char *last, const Deterministi highlight_tag = (2 << 16) | (adjust.and_mask & 0xFFFF); } p += seprintf(p, last, "var: %X", adjust.variable); - if (adjust.variable == A2VRI_VEHICLE_CURRENT_SPEED_SCALED) { - p += seprintf(p, last, " (current_speed_scaled)"); - } else if (adjust.variable >= 0x100) { + if (adjust.variable >= 0x100) { append_extended_var(adjust.variable); } if (adjust.variable == 0x7B && adjust.parameter >= 0x100) {