1
0
Fork 0

(svn r27756) -Codechange: Add StringTab enum

release/1.7
frosch 2017-02-26 19:40:53 +00:00
parent f4da8ece0c
commit a56e2bccd0
10 changed files with 65 additions and 50 deletions

View File

@ -14,9 +14,6 @@
#include "../core/smallvec_type.hpp" #include "../core/smallvec_type.hpp"
/** The tab we place our strings in. */
static const uint GAME_TEXT_TAB = 18;
const char *GetGameStringPtr(uint id); const char *GetGameStringPtr(uint id);
void RegisterGameTranslation(class Squirrel *engine); void RegisterGameTranslation(class Squirrel *engine);
void ReconsiderGameScriptLanguage(); void ReconsiderGameScriptLanguage();

View File

@ -22,9 +22,6 @@ static const uint8 CASE_GENDER_LEN = 16; ///< The (maximum) length of a case/gen
static const uint8 MAX_NUM_GENDERS = 8; ///< Maximum number of supported genders. static const uint8 MAX_NUM_GENDERS = 8; ///< Maximum number of supported genders.
static const uint8 MAX_NUM_CASES = 16; ///< Maximum number of supported cases. static const uint8 MAX_NUM_CASES = 16; ///< Maximum number of supported cases.
static const uint TAB_COUNT_BITS = 5; ///< The number of bits used for the amount of tabs.
static const uint TAB_COUNT = 1 << TAB_COUNT_BITS; ///< The amount of tabs.
/** Header of a language file. */ /** Header of a language file. */
struct LanguagePackHeader { struct LanguagePackHeader {
static const uint32 IDENT = 0x474E414C; ///< Identifier for OpenTTD language files, big endian for "LANG" static const uint32 IDENT = 0x474E414C; ///< Identifier for OpenTTD language files, big endian for "LANG"
@ -34,7 +31,7 @@ struct LanguagePackHeader {
char name[32]; ///< the international name of this language char name[32]; ///< the international name of this language
char own_name[32]; ///< the localized name of this language char own_name[32]; ///< the localized name of this language
char isocode[16]; ///< the ISO code for the language (not country code) char isocode[16]; ///< the ISO code for the language (not country code)
uint16 offsets[TAB_COUNT]; ///< the offsets uint16 offsets[TEXT_TAB_END]; ///< the offsets
/** Thousand separator used for anything not currencies */ /** Thousand separator used for anything not currencies */
char digit_group_separator[8]; char digit_group_separator[8];

View File

@ -35,8 +35,6 @@
#include "safeguards.h" #include "safeguards.h"
#define GRFTAB 28
/** /**
* Explains the newgrf shift bit positioning. * Explains the newgrf shift bit positioning.
* the grf base will not be used in order to find the string, but rather for * the grf base will not be used in order to find the string, but rather for
@ -695,7 +693,7 @@ StringID AddGRFString(uint32 grfid, uint16 stringid, byte langid_to_add, bool ne
grfmsg(3, "Added 0x%X: grfid %08X string 0x%X lang 0x%X string '%s'", id, grfid, stringid, newtext->langid, newtext->text); grfmsg(3, "Added 0x%X: grfid %08X string 0x%X lang 0x%X string '%s'", id, grfid, stringid, newtext->langid, newtext->text);
return MakeStringID(GRFTAB, 0) + id; // Id reaches across multiple tabs return MakeStringID(TEXT_TAB_NEWGRF1, 0) + id; // Id reaches across multiple tabs
} }
/** /**
@ -705,7 +703,7 @@ StringID GetGRFStringID(uint32 grfid, uint16 stringid)
{ {
for (uint id = 0; id < _num_grf_texts; id++) { for (uint id = 0; id < _num_grf_texts; id++) {
if (_grf_text[id].grfid == grfid && _grf_text[id].stringid == stringid) { if (_grf_text[id].grfid == grfid && _grf_text[id].stringid == stringid) {
return MakeStringID(GRFTAB, 0) + id; // Id reaches across multiple tabs return MakeStringID(TEXT_TAB_NEWGRF1, 0) + id; // Id reaches across multiple tabs
} }
} }

View File

@ -502,11 +502,11 @@ static void Check_PLYR()
/* We do not load old custom names */ /* We do not load old custom names */
if (IsSavegameVersionBefore(84)) { if (IsSavegameVersionBefore(84)) {
if (GetStringTab(cprops->name_1) == 15) { if (GetStringTab(cprops->name_1) == TEXT_TAB_OLD_CUSTOM) {
cprops->name_1 = STR_GAME_SAVELOAD_NOT_AVAILABLE; cprops->name_1 = STR_GAME_SAVELOAD_NOT_AVAILABLE;
} }
if (GetStringTab(cprops->president_name_1) == 15) { if (GetStringTab(cprops->president_name_1) == TEXT_TAB_OLD_CUSTOM) {
cprops->president_name_1 = STR_GAME_SAVELOAD_NOT_AVAILABLE; cprops->president_name_1 = STR_GAME_SAVELOAD_NOT_AVAILABLE;
} }
} }

View File

@ -61,7 +61,7 @@ char *_old_name_array = NULL;
char *CopyFromOldName(StringID id) char *CopyFromOldName(StringID id)
{ {
/* Is this name an (old) custom name? */ /* Is this name an (old) custom name? */
if (GetStringTab(id) != 15) return NULL; if (GetStringTab(id) != TEXT_TAB_OLD_CUSTOM) return NULL;
if (IsSavegameVersionBefore(37)) { if (IsSavegameVersionBefore(37)) {
/* Allow for expansion when converted to UTF-8. */ /* Allow for expansion when converted to UTF-8. */

View File

@ -286,7 +286,7 @@ static void Load_TOWN()
SlObject(&t->received[i], _town_received_desc); SlObject(&t->received[i], _town_received_desc);
} }
if (t->townnamegrfid == 0 && !IsInsideMM(t->townnametype, SPECSTR_TOWNNAME_START, SPECSTR_TOWNNAME_LAST + 1) && GetStringTab(t->townnametype) != 15) { if (t->townnamegrfid == 0 && !IsInsideMM(t->townnametype, SPECSTR_TOWNNAME_START, SPECSTR_TOWNNAME_LAST + 1) && GetStringTab(t->townnametype) != TEXT_TAB_OLD_CUSTOM) {
SlErrorCorrupt("Invalid town name generator"); SlErrorCorrupt("Invalid town name generator");
} }

View File

@ -34,15 +34,16 @@ ScriptError::ScriptErrorMapString ScriptError::error_map_string = ScriptError::S
{ {
uint index = GetStringIndex(internal_string_id); uint index = GetStringIndex(internal_string_id);
switch (GetStringTab(internal_string_id)) { switch (GetStringTab(internal_string_id)) {
case 26: case 28: case 29: case 30: // NewGRF strings. case TEXT_TAB_NEWGRF1:
return ERR_NEWGRF_SUPPLIED_ERROR; case TEXT_TAB_NEWGRF2:
case TEXT_TAB_NEWGRF3:
return ERR_NEWGRF_SUPPLIED_ERROR; // NewGRF strings.
/* DO NOT SWAP case 14 and 4 because that will break StringToError due case TEXT_TAB_SPECIAL:
* to the index dependency that relies on FALL THROUGHs. */ if (index < 0xE4) break; // Player name
case 14: if (index < 0xE4) break; // Player name /* FALL THROUGH */
case 4: if (index < 0xC0) break; // Town name case TEXT_TAB_TOWN:
case 15: // Custom name if (index < 0xC0) break; // Town name
case 31: // Dynamic strings
/* These strings are 'random' and have no meaning. /* These strings are 'random' and have no meaning.
* They actually shouldn't even be returned as error messages. */ * They actually shouldn't even be returned as error messages. */
return ERR_UNKNOWN; return ERR_UNKNOWN;

View File

@ -187,20 +187,20 @@ struct LanguagePack : public LanguagePackHeader {
static char **_langpack_offs; static char **_langpack_offs;
static LanguagePack *_langpack; static LanguagePack *_langpack;
static uint _langtab_num[TAB_COUNT]; ///< Offset into langpack offs static uint _langtab_num[TEXT_TAB_END]; ///< Offset into langpack offs
static uint _langtab_start[TAB_COUNT]; ///< Offset into langpack offs static uint _langtab_start[TEXT_TAB_END]; ///< Offset into langpack offs
static bool _scan_for_gender_data = false; ///< Are we scanning for the gender of the current string? (instead of formatting it) static bool _scan_for_gender_data = false; ///< Are we scanning for the gender of the current string? (instead of formatting it)
const char *GetStringPtr(StringID string) const char *GetStringPtr(StringID string)
{ {
switch (GetStringTab(string)) { switch (GetStringTab(string)) {
case GAME_TEXT_TAB: return GetGameStringPtr(GetStringIndex(string)); case TEXT_TAB_GAMESCRIPT: return GetGameStringPtr(GetStringIndex(string));
/* 0xD0xx and 0xD4xx IDs have been converted earlier. */ /* 0xD0xx and 0xD4xx IDs have been converted earlier. */
case 26: NOT_REACHED(); case TEXT_TAB_OLD_NEWGRF: NOT_REACHED();
case 28: return GetGRFStringPtr(GetStringIndex(string)); case TEXT_TAB_NEWGRF1: return GetGRFStringPtr(GetStringIndex(string));
case 29: return GetGRFStringPtr(GetStringIndex(string) + 0x0800); case TEXT_TAB_NEWGRF2: return GetGRFStringPtr(GetStringIndex(string) + 0x0800);
case 30: return GetGRFStringPtr(GetStringIndex(string) + 0x1000); case TEXT_TAB_NEWGRF3: return GetGRFStringPtr(GetStringIndex(string) + 0x1000);
default: return _langpack_offs[_langtab_start[GetStringTab(string)] + GetStringIndex(string)]; default: return _langpack_offs[_langtab_start[GetStringTab(string)] + GetStringIndex(string)];
} }
} }
@ -220,42 +220,45 @@ char *GetStringWithArgs(char *buffr, StringID string, StringParameters *args, co
if (string == 0) return GetStringWithArgs(buffr, STR_UNDEFINED, args, last); if (string == 0) return GetStringWithArgs(buffr, STR_UNDEFINED, args, last);
uint index = GetStringIndex(string); uint index = GetStringIndex(string);
uint tab = GetStringTab(string); StringTab tab = GetStringTab(string);
switch (tab) { switch (tab) {
case 4: case TEXT_TAB_TOWN:
if (index >= 0xC0 && !game_script) { if (index >= 0xC0 && !game_script) {
return GetSpecialTownNameString(buffr, index - 0xC0, args->GetInt32(), last); return GetSpecialTownNameString(buffr, index - 0xC0, args->GetInt32(), last);
} }
break; break;
case 14: case TEXT_TAB_SPECIAL:
if (index >= 0xE4 && !game_script) { if (index >= 0xE4 && !game_script) {
return GetSpecialNameString(buffr, index - 0xE4, args, last); return GetSpecialNameString(buffr, index - 0xE4, args, last);
} }
break; break;
case 15: case TEXT_TAB_OLD_CUSTOM:
/* Old table for custom names. This is no longer used */ /* Old table for custom names. This is no longer used */
if (!game_script) { if (!game_script) {
error("Incorrect conversion of custom name string."); error("Incorrect conversion of custom name string.");
} }
break; break;
case GAME_TEXT_TAB: case TEXT_TAB_GAMESCRIPT:
return FormatString(buffr, GetGameStringPtr(index), args, last, case_index, true); return FormatString(buffr, GetGameStringPtr(index), args, last, case_index, true);
case 26: case TEXT_TAB_OLD_NEWGRF:
NOT_REACHED(); NOT_REACHED();
case 28: case TEXT_TAB_NEWGRF1:
return FormatString(buffr, GetGRFStringPtr(index), args, last, case_index); return FormatString(buffr, GetGRFStringPtr(index), args, last, case_index);
case 29: case TEXT_TAB_NEWGRF2:
return FormatString(buffr, GetGRFStringPtr(index + 0x0800), args, last, case_index); return FormatString(buffr, GetGRFStringPtr(index + 0x0800), args, last, case_index);
case 30: case TEXT_TAB_NEWGRF3:
return FormatString(buffr, GetGRFStringPtr(index + 0x1000), args, last, case_index); return FormatString(buffr, GetGRFStringPtr(index + 0x1000), args, last, case_index);
default:
break;
} }
if (index >= _langtab_num[tab]) { if (index >= _langtab_num[tab]) {
@ -886,7 +889,7 @@ static char *FormatString(char *buff, const char *str_arg, StringParameters *arg
buff = strecat(buff, "(invalid sub-StringID)", last); buff = strecat(buff, "(invalid sub-StringID)", last);
break; break;
} }
param = MakeStringID(GAME_TEXT_TAB, param); param = MakeStringID(TEXT_TAB_GAMESCRIPT, param);
} }
sub_args.SetParam(i++, param); sub_args.SetParam(i++, param);
@ -901,7 +904,7 @@ static char *FormatString(char *buff, const char *str_arg, StringParameters *arg
/* If we didn't error out, we can actually print the string. */ /* If we didn't error out, we can actually print the string. */
if (*str != '\0') { if (*str != '\0') {
str = p; str = p;
buff = GetStringWithArgs(buff, MakeStringID(GAME_TEXT_TAB, stringid), &sub_args, last, true); buff = GetStringWithArgs(buff, MakeStringID(TEXT_TAB_GAMESCRIPT, stringid), &sub_args, last, true);
} }
for (int i = 0; i < 20; i++) { for (int i = 0; i < 20; i++) {
@ -1017,7 +1020,7 @@ static char *FormatString(char *buff, const char *str_arg, StringParameters *arg
case SCC_STRING: {// {STRING} case SCC_STRING: {// {STRING}
StringID str = args->GetInt32(SCC_STRING); StringID str = args->GetInt32(SCC_STRING);
if (game_script && GetStringTab(str) != GAME_TEXT_TAB) break; if (game_script && GetStringTab(str) != TEXT_TAB_GAMESCRIPT) break;
/* WARNING. It's prohibited for the included string to consume any arguments. /* WARNING. It's prohibited for the included string to consume any arguments.
* For included strings that consume argument, you should use STRING1, STRING2 etc. * For included strings that consume argument, you should use STRING1, STRING2 etc.
* To debug stuff you can set argv to NULL and it will tell you */ * To debug stuff you can set argv to NULL and it will tell you */
@ -1036,7 +1039,7 @@ static char *FormatString(char *buff, const char *str_arg, StringParameters *arg
case SCC_STRING7: { // {STRING1..7} case SCC_STRING7: { // {STRING1..7}
/* Strings that consume arguments */ /* Strings that consume arguments */
StringID str = args->GetInt32(b); StringID str = args->GetInt32(b);
if (game_script && GetStringTab(str) != GAME_TEXT_TAB) break; if (game_script && GetStringTab(str) != TEXT_TAB_GAMESCRIPT) break;
uint size = b - SCC_STRING1 + 1; uint size = b - SCC_STRING1 + 1;
if (game_script && size > args->GetDataLeft()) { if (game_script && size > args->GetDataLeft()) {
buff = strecat(buff, "(too many parameters)", last); buff = strecat(buff, "(too many parameters)", last);
@ -1736,13 +1739,13 @@ bool ReadLanguagePack(const LanguageMetadata *lang)
} }
#if TTD_ENDIAN == TTD_BIG_ENDIAN #if TTD_ENDIAN == TTD_BIG_ENDIAN
for (uint i = 0; i < TAB_COUNT; i++) { for (uint i = 0; i < TEXT_TAB_END; i++) {
lang_pack->offsets[i] = ReadLE16Aligned(&lang_pack->offsets[i]); lang_pack->offsets[i] = ReadLE16Aligned(&lang_pack->offsets[i]);
} }
#endif /* TTD_ENDIAN == TTD_BIG_ENDIAN */ #endif /* TTD_ENDIAN == TTD_BIG_ENDIAN */
uint count = 0; uint count = 0;
for (uint i = 0; i < TAB_COUNT; i++) { for (uint i = 0; i < TEXT_TAB_END; i++) {
uint16 num = lang_pack->offsets[i]; uint16 num = lang_pack->offsets[i];
if (num > TAB_SIZE) { if (num > TAB_SIZE) {
free(lang_pack); free(lang_pack);
@ -2051,12 +2054,12 @@ class LanguagePackGlyphSearcher : public MissingGlyphSearcher {
/* virtual */ const char *NextString() /* virtual */ const char *NextString()
{ {
if (this->i >= TAB_COUNT) return NULL; if (this->i >= TEXT_TAB_END) return NULL;
const char *ret = _langpack_offs[_langtab_start[this->i] + this->j]; const char *ret = _langpack_offs[_langtab_start[this->i] + this->j];
this->j++; this->j++;
while (this->i < TAB_COUNT && this->j >= _langtab_num[this->i]) { while (this->i < TEXT_TAB_END && this->j >= _langtab_num[this->i]) {
this->i++; this->i++;
this->j = 0; this->j = 0;
} }

View File

@ -22,9 +22,9 @@
* @param str String identifier * @param str String identifier
* @return StringTab from \a str * @return StringTab from \a str
*/ */
static inline uint GetStringTab(StringID str) static inline StringTab GetStringTab(StringID str)
{ {
return GB(str, TAB_SIZE_BITS, 5); return (StringTab)GB(str, TAB_SIZE_BITS, 5);
} }
/** /**
@ -43,8 +43,9 @@ static inline uint GetStringIndex(StringID str)
* @param index StringIndex * @param index StringIndex
* @return StringID composed from \a tab and \a index * @return StringID composed from \a tab and \a index
*/ */
static inline StringID MakeStringID(uint tab, uint index) static inline StringID MakeStringID(StringTab tab, uint index)
{ {
assert(tab < TEXT_TAB_END);
assert(index < TAB_SIZE); assert(index < TAB_SIZE);
return tab << TAB_SIZE_BITS | index; return tab << TAB_SIZE_BITS | index;
} }

View File

@ -26,6 +26,24 @@ enum TextDirection {
TD_RTL, ///< Text is written right-to-left by default TD_RTL, ///< Text is written right-to-left by default
}; };
/** StringTabs to group StringIDs */
enum StringTab {
/* Tabs 0..1 for regular strings */
TEXT_TAB_TOWN = 4,
TEXT_TAB_INDUSTRY = 9,
TEXT_TAB_STATION = 12,
TEXT_TAB_SPECIAL = 14,
TEXT_TAB_OLD_CUSTOM = 15,
TEXT_TAB_VEHICLE = 16,
/* Tab 17 for regular strings */
TEXT_TAB_GAMESCRIPT = 18,
TEXT_TAB_OLD_NEWGRF = 26,
TEXT_TAB_NEWGRF1 = 28,
TEXT_TAB_NEWGRF2 = 29,
TEXT_TAB_NEWGRF3 = 30,
TEXT_TAB_END = 32
};
/** Number of bits for the StringIndex within a StringTab */ /** Number of bits for the StringIndex within a StringTab */
static const uint TAB_SIZE_BITS = 11; static const uint TAB_SIZE_BITS = 11;
/** Number of strings per StringTab */ /** Number of strings per StringTab */