OpenTTD Source  20241121-master-g67a0fccfad
newgrf_text.cpp File Reference

Implementation of Action 04 "universal holder" structure and functions. More...

#include "stdafx.h"
#include "newgrf.h"
#include "strings_internal.h"
#include "newgrf_storage.h"
#include "newgrf_text.h"
#include "newgrf_cargo.h"
#include "string_func.h"
#include "timer/timer_game_calendar.h"
#include "debug.h"
#include "core/alloc_type.hpp"
#include "language.h"
#include <sstream>
#include "table/strings.h"
#include "table/control_codes.h"
#include "safeguards.h"

Go to the source code of this file.

Data Structures

struct  GRFTextEntry
 Holder of the above structure. More...
 
struct  UnmappedChoiceList
 Helper structure for mapping choice lists. More...
 
struct  TextRefStack
 

Enumerations

enum  GRFBaseLanguages {
  GRFLB_AMERICAN = 0x01 , GRFLB_ENGLISH = 0x02 , GRFLB_GERMAN = 0x04 , GRFLB_FRENCH = 0x08 ,
  GRFLB_SPANISH = 0x10 , GRFLB_GENERIC = 0x80
}
 Explains the newgrf shift bit positioning. More...
 
enum  GRFExtendedLanguages {
  GRFLX_AMERICAN = 0x00 , GRFLX_ENGLISH = 0x01 , GRFLX_GERMAN = 0x02 , GRFLX_FRENCH = 0x03 ,
  GRFLX_SPANISH = 0x04 , GRFLX_UNSPECIFIED = 0x7F
}
 

Functions

std::string TranslateTTDPatchCodes (uint32_t grfid, uint8_t language_id, bool allow_newlines, std::string_view str, StringControlCode byte80)
 Translate TTDPatch string codes into something OpenTTD can handle (better). More...
 
static void AddGRFTextToList (GRFTextList &list, uint8_t langid, std::string_view text_to_add)
 Add a new text to a GRFText list. More...
 
void AddGRFTextToList (GRFTextList &list, uint8_t langid, uint32_t grfid, bool allow_newlines, std::string_view text_to_add)
 Add a string to a GRFText list. More...
 
void AddGRFTextToList (GRFTextWrapper &list, uint8_t langid, uint32_t grfid, bool allow_newlines, std::string_view text_to_add)
 Add a string to a GRFText list. More...
 
void AddGRFTextToList (GRFTextWrapper &list, std::string_view text_to_add)
 Add a GRFText to a GRFText list. More...
 
StringID AddGRFString (uint32_t grfid, uint16_t stringid, uint8_t langid_to_add, bool new_scheme, bool allow_newlines, std::string_view text_to_add, StringID def_string)
 Add the new read string into our structure.
 
StringID GetGRFStringID (uint32_t grfid, StringID stringid)
 Returns the index for this stringid associated with its grfID.
 
const char * GetGRFStringFromGRFText (const GRFTextList &text_list)
 Get a C-string from a GRFText-list. More...
 
const char * GetGRFStringFromGRFText (const GRFTextWrapper &text)
 Get a C-string from a GRFText-list. More...
 
const char * GetGRFStringPtr (uint32_t stringid)
 Get a C-string from a stringid set by a newgrf.
 
void SetCurrentGrfLangID (uint8_t language_id)
 Equivalence Setter function between game and newgrf langID. More...
 
bool CheckGrfLangID (uint8_t lang_id, uint8_t grf_version)
 
void CleanUpStrings ()
 House cleaning. More...
 
bool UsingNewGRFTextStack ()
 Check whether the NewGRF text stack is in use. More...
 
struct TextRefStackCreateTextRefStackBackup ()
 Create a backup of the current NewGRF text stack. More...
 
void RestoreTextRefStackBackup (struct TextRefStack *backup)
 Restore a copy of the text stack to the used stack. More...
 
void StartTextRefStackUsage (const GRFFile *grffile, uint8_t numEntries, const uint32_t *values)
 Start using the TTDP compatible string code parsing. More...
 
void StopTextRefStackUsage ()
 Stop using the TTDP compatible string code parsing.
 
uint RemapNewGRFStringControlCode (uint scc, const char **str, StringParameters &parameters, bool modify_parameters)
 FormatString for NewGRF specific "magic" string control codes. More...
 

Variables

static std::vector< GRFTextEntry_grf_text
 
static uint8_t _currentLangID = GRFLX_ENGLISH
 by default, english is used.
 
static TextRefStack _newgrf_textrefstack
 The stack that is used for TTDP compatible string code parsing.
 

Detailed Description

Implementation of Action 04 "universal holder" structure and functions.

This file implements a linked-lists of strings, holding everything that the newgrf action 04 will send over to OpenTTD. One of the biggest problems is that Dynamic lang Array uses ISO codes as way to identifying current user lang, while newgrf uses bit shift codes not related to ISO. So equivalence functionality had to be set.

Definition in file newgrf_text.cpp.

Enumeration Type Documentation

◆ GRFBaseLanguages

Explains the newgrf shift bit positioning.

the grf base will not be used in order to find the string, but rather for jumping from standard langID scheme to the new one.

Definition at line 42 of file newgrf_text.cpp.

Function Documentation

◆ AddGRFTextToList() [1/4]

static void AddGRFTextToList ( GRFTextList list,
uint8_t  langid,
std::string_view  text_to_add 
)
static

Add a new text to a GRFText list.

Parameters
listThe list where the text should be added to.
langidThe The language of the new text.
text_to_addThe text to add to the list.

Definition at line 485 of file newgrf_text.cpp.

Referenced by AddGRFTextToList(), ChangeGRFDescription(), ChangeGRFName(), ChangeGRFParamDescription(), ChangeGRFParamName(), and ChangeGRFURL().

◆ AddGRFTextToList() [2/4]

void AddGRFTextToList ( GRFTextList list,
uint8_t  langid,
uint32_t  grfid,
bool  allow_newlines,
std::string_view  text_to_add 
)

Add a string to a GRFText list.

Parameters
listThe list where the text should be added to.
langidThe language of the new text.
grfidThe grfid where this string is defined.
allow_newlinesWhether newlines are allowed in this string.
text_to_addThe text to add to the list.
Note
All text-codes will be translated.

Definition at line 508 of file newgrf_text.cpp.

References AddGRFTextToList(), and TranslateTTDPatchCodes().

◆ AddGRFTextToList() [3/4]

void AddGRFTextToList ( GRFTextWrapper list,
std::string_view  text_to_add 
)

Add a GRFText to a GRFText list.

The text should not contain any text-codes. The text will be added as a 'default language'-text.

Parameters
listThe list where the text should be added to.
text_to_addThe text to add to the list.

Definition at line 534 of file newgrf_text.cpp.

References AddGRFTextToList().

◆ AddGRFTextToList() [4/4]

void AddGRFTextToList ( GRFTextWrapper list,
uint8_t  langid,
uint32_t  grfid,
bool  allow_newlines,
std::string_view  text_to_add 
)

Add a string to a GRFText list.

Parameters
listThe list where the text should be added to.
langidThe language of the new text.
grfidThe grfid where this string is defined.
allow_newlinesWhether newlines are allowed in this string.
text_to_addThe text to add to the list.
Note
All text-codes will be translated.

Definition at line 522 of file newgrf_text.cpp.

References AddGRFTextToList().

◆ CleanUpStrings()

void CleanUpStrings ( )

House cleaning.

Remove all strings.

Definition at line 682 of file newgrf_text.cpp.

Referenced by ResetNewGRFData().

◆ CreateTextRefStackBackup()

struct TextRefStack* CreateTextRefStackBackup ( )

Create a backup of the current NewGRF text stack.

Returns
A copy of the current text stack.

Definition at line 765 of file newgrf_text.cpp.

References _newgrf_textrefstack.

Referenced by FormatString().

◆ GetGRFStringFromGRFText() [1/2]

const char* GetGRFStringFromGRFText ( const GRFTextList text_list)

Get a C-string from a GRFText-list.

If there is a translation for the current language it is returned, otherwise the default translation is returned. If there is neither a default nor a translation for the current language nullptr is returned.

Parameters
text_listThe GRFTextList to get the string from.

Definition at line 606 of file newgrf_text.cpp.

References _currentLangID.

Referenced by GRFConfig::GetDescription(), GetGRFStringFromGRFText(), GRFConfig::GetName(), and GRFConfig::GetURL().

◆ GetGRFStringFromGRFText() [2/2]

const char* GetGRFStringFromGRFText ( const GRFTextWrapper text)

Get a C-string from a GRFText-list.

If there is a translation for the current language it is returned, otherwise the default translation is returned. If there is neither a default nor a translation for the current language nullptr is returned.

Parameters
textThe GRFTextList to get the string from.

Definition at line 631 of file newgrf_text.cpp.

References GetGRFStringFromGRFText().

◆ RemapNewGRFStringControlCode()

◆ RestoreTextRefStackBackup()

void RestoreTextRefStackBackup ( struct TextRefStack backup)

Restore a copy of the text stack to the used stack.

Parameters
backupThe copy to restore.

Definition at line 774 of file newgrf_text.cpp.

References _newgrf_textrefstack.

Referenced by FormatString().

◆ SetCurrentGrfLangID()

void SetCurrentGrfLangID ( uint8_t  language_id)

Equivalence Setter function between game and newgrf langID.

This function will adjust _currentLangID as to what is the LangID of the current language set by the user. This function is called after the user changed language, from strings.cpp:ReadLanguagePack

Parameters
language_idiso code of current selection

Definition at line 659 of file newgrf_text.cpp.

References _currentLangID.

◆ StartTextRefStackUsage()

void StartTextRefStackUsage ( const GRFFile grffile,
uint8_t  numEntries,
const uint32_t *  values 
)

Start using the TTDP compatible string code parsing.

On start a number of values is copied on the TextRefStack. You can then use GetString() and the normal string drawing functions, and they will use the TextRefStack for NewGRF string codes.

However, when you want to draw a string multiple times using the same stack, you have to call #RewindTextRefStack() between draws.

After you are done with drawing, you must disable usage of the TextRefStack by calling StopTextRefStackUsage(), so NewGRF string codes operate on the normal string parameters again.

Parameters
grffilethe NewGRF providing the stack data
numEntriesnumber of entries to copy from the registers
valuesvalues to copy onto the stack; if nullptr the temporary NewGRF registers will be used instead

Definition at line 798 of file newgrf_text.cpp.

◆ TranslateTTDPatchCodes()

std::string TranslateTTDPatchCodes ( uint32_t  grfid,
uint8_t  language_id,
bool  allow_newlines,
std::string_view  str,
StringControlCode  byte80 
)

Translate TTDPatch string codes into something OpenTTD can handle (better).

Parameters
grfidThe (NewGRF) ID associated with this string
language_idThe (NewGRF) language ID associated with this string.
allow_newlinesWhether newlines are allowed in the string or not.
strThe string to translate.
byte80The control code to use as replacement for the 0x80-value.
Returns
The translated string.

Definition at line 236 of file newgrf_text.cpp.

References NFO_UTF8_IDENTIFIER, Utf8Decode(), and Utf8EncodedCharLen().

Referenced by AddGRFTextToList().

◆ UsingNewGRFTextStack()

bool UsingNewGRFTextStack ( )

Check whether the NewGRF text stack is in use.

Returns
True iff the NewGRF text stack is used.

Definition at line 756 of file newgrf_text.cpp.

References _newgrf_textrefstack.

Referenced by FormatString().