src/newgrf_text.cpp
author maedhros
Tue, 12 Jun 2007 13:22:14 +0000
changeset 7369 26325201d4d7
parent 7060 aedcbd510a9a
child 7383 23dcf2c27536
permissions -rw-r--r--
(svn r10114) -Fix: Only load newgrf error messages if the language matches the current
language. Since only one error can be loaded anyway, if the language didn't
match you'd get "Undefined string". Also since we're only loading one language
there's no need to use AddGRFString any more.
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
     1
/* $Id$ */
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
     2
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6574
diff changeset
     3
/** @file newgrf_text.cpp
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
     4
 * Implementation of  Action 04 "universal holder" structure and functions.
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
     5
 * This file implements a linked-lists of strings,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
     6
 * holding everything that the newgrf action 04 will send over to OpenTTD.
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
     7
 * One of the biggest problems is that Dynamic lang Array uses ISO codes
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
     8
 * as way to identifying current user lang, while newgrf uses bit shift codes
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
     9
 * not related to ISO.  So equivalence functionnality had to be set.
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    10
 */
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    11
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    12
#include "stdafx.h"
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    13
#include "debug.h"
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    14
#include "openttd.h"
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    15
#include "string.h"
3821
2bb8a2643fdf (svn r4832) - NewGRF: add support for original string ID to newgrf text handling. So far, this is used for vehicles when no English or American translation is provided.
peter1138
parents: 3646
diff changeset
    16
#include "strings.h"
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    17
#include "variables.h"
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    18
#include "macros.h"
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    19
#include "table/strings.h"
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5344
diff changeset
    20
#include "newgrf.h"
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    21
#include "newgrf_text.h"
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
    22
#include "table/control_codes.h"
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
    23
#include "helpers.hpp"
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    24
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    25
#define GRFTAB  28
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    26
#define TABSIZE 11
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    27
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    28
/**
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    29
 * Explains the newgrf shift bit positionning.
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    30
 * the grf base will not be used in order to find the string, but rather for
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    31
 * jumping from standard langID scheme to the new one.
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    32
 */
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
    33
enum grf_base_languages {
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    34
	GRFLB_AMERICAN    = 0x01,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    35
	GRFLB_ENGLISH     = 0x02,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    36
	GRFLB_GERMAN      = 0x04,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    37
	GRFLB_FRENCH      = 0x08,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    38
	GRFLB_SPANISH     = 0x10,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    39
	GRFLB_GENERIC     = 0x80,
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
    40
};
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    41
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
    42
enum grf_extended_languages {
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    43
	GRFLX_AMERICAN    = 0x00,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    44
	GRFLX_ENGLISH     = 0x01,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    45
	GRFLX_GERMAN      = 0x02,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    46
	GRFLX_FRENCH      = 0x03,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    47
	GRFLX_SPANISH     = 0x04,
7060
aedcbd510a9a (svn r9769) [newGRF] -Feature: Add translation support for Esperanto, Bulgarian, Japanese and Korean
belugas
parents: 6977
diff changeset
    48
	GRFLX_ESPERANTO   = 0x05,
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    49
	GRFLX_RUSSIAN     = 0x07,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    50
	GRFLX_CZECH       = 0x15,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    51
	GRFLX_SLOVAK      = 0x16,
7060
aedcbd510a9a (svn r9769) [newGRF] -Feature: Add translation support for Esperanto, Bulgarian, Japanese and Korean
belugas
parents: 6977
diff changeset
    52
	GRFLX_BULGARIAN   = 0x18,
3856
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
    53
	GRFLX_AFRIKAANS   = 0x1B,
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
    54
	GRFLX_GREEK       = 0x1E,
3605
045805e70df0 (svn r4497) - NewGRF minor fixes: (Rubidium)
peter1138
parents: 3603
diff changeset
    55
	GRFLX_DUTCH       = 0x1F,
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    56
	GRFLX_CATALAN     = 0x22,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    57
	GRFLX_HUNGARIAN   = 0x24,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    58
	GRFLX_ITALIAN     = 0x27,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    59
	GRFLX_ROMANIAN    = 0x28,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    60
	GRFLX_ICELANDIC   = 0x29,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    61
	GRFLX_LATVIAN     = 0x2A,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    62
	GRFLX_LITHUANIAN  = 0x2B,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    63
	GRFLX_SLOVENIAN   = 0x2C,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    64
	GRFLX_DANISH      = 0x2D,
3605
045805e70df0 (svn r4497) - NewGRF minor fixes: (Rubidium)
peter1138
parents: 3603
diff changeset
    65
	GRFLX_SWEDISH     = 0x2E,
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    66
	GRFLX_NORWEGIAN   = 0x2F,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    67
	GRFLX_POLISH      = 0x30,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    68
	GRFLX_GALICIAN    = 0x31,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    69
	GRFLX_FRISIAN     = 0x32,
3856
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
    70
	GRFLX_UKRAINIAN   = 0x33,
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    71
	GRFLX_ESTONIAN    = 0x34,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    72
	GRFLX_FINNISH     = 0x35,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    73
	GRFLX_PORTUGUESE  = 0x36,
3605
045805e70df0 (svn r4497) - NewGRF minor fixes: (Rubidium)
peter1138
parents: 3603
diff changeset
    74
	GRFLX_BRAZILIAN   = 0x37,
3856
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
    75
	GRFLX_CROATIAN    = 0x38,
7060
aedcbd510a9a (svn r9769) [newGRF] -Feature: Add translation support for Esperanto, Bulgarian, Japanese and Korean
belugas
parents: 6977
diff changeset
    76
	GRFLX_JAPANESE    = 0x39,
aedcbd510a9a (svn r9769) [newGRF] -Feature: Add translation support for Esperanto, Bulgarian, Japanese and Korean
belugas
parents: 6977
diff changeset
    77
	GRFLX_KOREAN      = 0x3A,
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    78
	GRFLX_TURKISH     = 0x3E,
3641
7dc47659e794 (svn r4550) - NewGRF: update string system to new rules: a grf version of less than 6 uses the old scheme, of 7 or more uses the new scheme. (Moving targets, yay...)
peter1138
parents: 3630
diff changeset
    79
	GRFLX_UNSPECIFIED = 0x7F,
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
    80
};
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    81
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    82
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
    83
struct iso_grf {
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    84
	char code[6];
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    85
	byte grfLangID;
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
    86
};
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    87
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    88
/**
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    89
 * ISO code VS NewGrf langID conversion array.
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    90
 * This array is used in two ways:
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    91
 * 1-its ISO part is matching OpenTTD dynamic language id
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    92
 *   with newgrf bit positionning language id
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    93
 * 2-its shift part is used to know what is the shift to
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    94
 *   watch for when inserting new strings, hence analysing newgrf langid
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    95
 */
3605
045805e70df0 (svn r4497) - NewGRF minor fixes: (Rubidium)
peter1138
parents: 3603
diff changeset
    96
const iso_grf iso_codes[] = {
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    97
	{"en_US", GRFLX_AMERICAN},
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    98
	{"en_GB", GRFLX_ENGLISH},
3856
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
    99
	{"de_DE", GRFLX_GERMAN},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   100
	{"fr_FR", GRFLX_FRENCH},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   101
	{"es_ES", GRFLX_SPANISH},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   102
	{"af_ZA", GRFLX_AFRIKAANS},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   103
	{"hr_HR", GRFLX_CROATIAN},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   104
	{"cs_CS", GRFLX_CZECH},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   105
	{"ca_ES", GRFLX_CATALAN},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   106
	{"da_DA", GRFLX_DANISH},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   107
	{"nl_NL", GRFLX_DUTCH},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   108
	{"et_ET", GRFLX_ESTONIAN},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   109
	{"fi_FI", GRFLX_FINNISH},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   110
	{"fy_NL", GRFLX_FRISIAN},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   111
	{"gl_ES", GRFLX_GALICIAN},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   112
	{"el_GR", GRFLX_GREEK},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   113
	{"hu_HU", GRFLX_HUNGARIAN},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   114
	{"is_IS", GRFLX_ICELANDIC},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   115
	{"it_IT", GRFLX_ITALIAN},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   116
	{"lv_LV", GRFLX_LATVIAN},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   117
	{"lt_LT", GRFLX_LITHUANIAN},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   118
	{"nb_NO", GRFLX_NORWEGIAN},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   119
	{"pl_PL", GRFLX_POLISH},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   120
	{"pt_PT", GRFLX_PORTUGUESE},
3605
045805e70df0 (svn r4497) - NewGRF minor fixes: (Rubidium)
peter1138
parents: 3603
diff changeset
   121
	{"pt_BR", GRFLX_BRAZILIAN},
3856
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   122
	{"ro_RO", GRFLX_ROMANIAN},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   123
	{"ru_RU", GRFLX_RUSSIAN},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   124
	{"sk_SK", GRFLX_SLOVAK},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   125
	{"sl_SL", GRFLX_SLOVENIAN},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   126
	{"sv_SE", GRFLX_SWEDISH},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   127
	{"tr_TR", GRFLX_TURKISH},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   128
	{"uk_UA", GRFLX_UKRAINIAN},
7060
aedcbd510a9a (svn r9769) [newGRF] -Feature: Add translation support for Esperanto, Bulgarian, Japanese and Korean
belugas
parents: 6977
diff changeset
   129
	{"eo_EO", GRFLX_ESPERANTO},
aedcbd510a9a (svn r9769) [newGRF] -Feature: Add translation support for Esperanto, Bulgarian, Japanese and Korean
belugas
parents: 6977
diff changeset
   130
	{"bg_BG", GRFLX_BULGARIAN},
aedcbd510a9a (svn r9769) [newGRF] -Feature: Add translation support for Esperanto, Bulgarian, Japanese and Korean
belugas
parents: 6977
diff changeset
   131
	{"ja_JP", GRFLX_JAPANESE},
aedcbd510a9a (svn r9769) [newGRF] -Feature: Add translation support for Esperanto, Bulgarian, Japanese and Korean
belugas
parents: 6977
diff changeset
   132
	{"ko_KR", GRFLX_KOREAN},
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6574
diff changeset
   133
	{"gen",   GRFLB_GENERIC}   ///< this is not iso code, but there has to be something...
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   134
};
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   135
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   136
4305
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   137
/**
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   138
 * Element of the linked list.
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   139
 * Each of those elements represent the string,
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   140
 * but according to a different lang.
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   141
 */
5906
db41d51fd454 (svn r8114) Allocate struct GRFText in the C++ way
tron
parents: 5860
diff changeset
   142
struct GRFText {
db41d51fd454 (svn r8114) Allocate struct GRFText in the C++ way
tron
parents: 5860
diff changeset
   143
	public:
db41d51fd454 (svn r8114) Allocate struct GRFText in the C++ way
tron
parents: 5860
diff changeset
   144
		static GRFText* New(byte langid, const char* text)
db41d51fd454 (svn r8114) Allocate struct GRFText in the C++ way
tron
parents: 5860
diff changeset
   145
		{
db41d51fd454 (svn r8114) Allocate struct GRFText in the C++ way
tron
parents: 5860
diff changeset
   146
			return new(strlen(text) + 1) GRFText(langid, text);
db41d51fd454 (svn r8114) Allocate struct GRFText in the C++ way
tron
parents: 5860
diff changeset
   147
		}
db41d51fd454 (svn r8114) Allocate struct GRFText in the C++ way
tron
parents: 5860
diff changeset
   148
db41d51fd454 (svn r8114) Allocate struct GRFText in the C++ way
tron
parents: 5860
diff changeset
   149
	private:
db41d51fd454 (svn r8114) Allocate struct GRFText in the C++ way
tron
parents: 5860
diff changeset
   150
		GRFText(byte langid_, const char* text_) : next(NULL), langid(langid_)
db41d51fd454 (svn r8114) Allocate struct GRFText in the C++ way
tron
parents: 5860
diff changeset
   151
		{
db41d51fd454 (svn r8114) Allocate struct GRFText in the C++ way
tron
parents: 5860
diff changeset
   152
			strcpy(text, text_);
db41d51fd454 (svn r8114) Allocate struct GRFText in the C++ way
tron
parents: 5860
diff changeset
   153
		}
db41d51fd454 (svn r8114) Allocate struct GRFText in the C++ way
tron
parents: 5860
diff changeset
   154
db41d51fd454 (svn r8114) Allocate struct GRFText in the C++ way
tron
parents: 5860
diff changeset
   155
		void* operator new(size_t size, size_t extra)
db41d51fd454 (svn r8114) Allocate struct GRFText in the C++ way
tron
parents: 5860
diff changeset
   156
		{
db41d51fd454 (svn r8114) Allocate struct GRFText in the C++ way
tron
parents: 5860
diff changeset
   157
			return ::operator new(size + extra);
db41d51fd454 (svn r8114) Allocate struct GRFText in the C++ way
tron
parents: 5860
diff changeset
   158
		}
db41d51fd454 (svn r8114) Allocate struct GRFText in the C++ way
tron
parents: 5860
diff changeset
   159
5908
a4b003987587 (svn r8117) -Fix (r8114): 'no matching operator delete found' warning on VC8
KUDr
parents: 5906
diff changeset
   160
public:
a4b003987587 (svn r8117) -Fix (r8114): 'no matching operator delete found' warning on VC8
KUDr
parents: 5906
diff changeset
   161
		/* dummy operator delete to silence VC8:
a4b003987587 (svn r8117) -Fix (r8114): 'no matching operator delete found' warning on VC8
KUDr
parents: 5906
diff changeset
   162
		 * 'void *GRFText::operator new(size_t,size_t)' : no matching operator delete found;
a4b003987587 (svn r8117) -Fix (r8114): 'no matching operator delete found' warning on VC8
KUDr
parents: 5906
diff changeset
   163
		 *     memory will not be freed if initialization throws an exception */
a4b003987587 (svn r8117) -Fix (r8114): 'no matching operator delete found' warning on VC8
KUDr
parents: 5906
diff changeset
   164
		void operator delete(void *p, size_t extra)
a4b003987587 (svn r8117) -Fix (r8114): 'no matching operator delete found' warning on VC8
KUDr
parents: 5906
diff changeset
   165
		{
a4b003987587 (svn r8117) -Fix (r8114): 'no matching operator delete found' warning on VC8
KUDr
parents: 5906
diff changeset
   166
			return ::operator delete(p);
a4b003987587 (svn r8117) -Fix (r8114): 'no matching operator delete found' warning on VC8
KUDr
parents: 5906
diff changeset
   167
		}
a4b003987587 (svn r8117) -Fix (r8114): 'no matching operator delete found' warning on VC8
KUDr
parents: 5906
diff changeset
   168
5906
db41d51fd454 (svn r8114) Allocate struct GRFText in the C++ way
tron
parents: 5860
diff changeset
   169
	public:
db41d51fd454 (svn r8114) Allocate struct GRFText in the C++ way
tron
parents: 5860
diff changeset
   170
		GRFText *next;
db41d51fd454 (svn r8114) Allocate struct GRFText in the C++ way
tron
parents: 5860
diff changeset
   171
		byte langid;
db41d51fd454 (svn r8114) Allocate struct GRFText in the C++ way
tron
parents: 5860
diff changeset
   172
		char text[VARARRAY_SIZE];
db41d51fd454 (svn r8114) Allocate struct GRFText in the C++ way
tron
parents: 5860
diff changeset
   173
};
4305
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   174
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   175
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   176
/**
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   177
 * Holder of the above structure.
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   178
 * Putting both grfid and stringid together allows us to avoid duplicates,
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   179
 * since it is NOT SUPPOSED to happen.
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   180
 */
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
   181
struct GRFTextEntry {
4305
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   182
	uint32 grfid;
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   183
	uint16 stringid;
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   184
	StringID def_string;
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   185
	GRFText *textholder;
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6573
diff changeset
   186
};
4305
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   187
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   188
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   189
static uint _num_grf_texts = 0;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   190
static GRFTextEntry _grf_text[(1 << TABSIZE) * 3];
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6574
diff changeset
   191
static byte _currentLangID = GRFLX_ENGLISH;  ///< by default, english is used.
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   192
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   193
5228
c4a780348f66 (svn r7348) -Feature: Initial support for saving NewGRF settings with savegames. Back up your savegames...
peter1138
parents: 5208
diff changeset
   194
char *TranslateTTDPatchCodes(const char *str)
3646
4506e8954c11 (svn r4557) - NewGRF: translate from TTDPatch control codes to our own, instead of just simple validation. We still perform
peter1138
parents: 3641
diff changeset
   195
{
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6574
diff changeset
   196
	char *tmp = MallocT<char>(strlen(str) * 10 + 1); // Allocate space to allow for expansion
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   197
	char *d = tmp;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   198
	bool unicode = false;
5208
71f3d9cfed95 (svn r7323) -Fix (r7182): When translating NewGRF strings, look at the first
peter1138
parents: 5204
diff changeset
   199
	WChar c;
71f3d9cfed95 (svn r7323) -Fix (r7182): When translating NewGRF strings, look at the first
peter1138
parents: 5204
diff changeset
   200
	size_t len = Utf8Decode(&c, str);
3646
4506e8954c11 (svn r4557) - NewGRF: translate from TTDPatch control codes to our own, instead of just simple validation. We still perform
peter1138
parents: 3641
diff changeset
   201
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   202
	if (c == 0x00DE) {
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   203
		/* The thorn ('þ') indicates a unicode string to TTDPatch */
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   204
		unicode = true;
5208
71f3d9cfed95 (svn r7323) -Fix (r7182): When translating NewGRF strings, look at the first
peter1138
parents: 5204
diff changeset
   205
		str += len;
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   206
	}
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   207
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   208
	for (;;) {
6674
64f4781b4653 (svn r9385) -Cleanup: doxygen changes. Today, we are exploring the letter N.
belugas
parents: 6574
diff changeset
   209
		const char *tmp = str; // Used for UTF-8 decoding
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   210
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   211
		c = (byte)*str++;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   212
		if (c == 0) break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   213
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   214
		switch (c) {
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   215
			case 0x01:
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   216
				d += Utf8Encode(d, SCC_SETX);
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   217
				*d++ = *str++;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   218
				break;
5344
026148c4f06f (svn r7515) -Codechange [newgrf]: Ignore ascii code 0x0A in text. Newline is 0x0D.
Darkvater
parents: 5228
diff changeset
   219
			case 0x0A: break;
026148c4f06f (svn r7515) -Codechange [newgrf]: Ignore ascii code 0x0A in text. Newline is 0x0D.
Darkvater
parents: 5228
diff changeset
   220
			case 0x0D: *d++ = 0x0A; break;
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   221
			case 0x0E: d += Utf8Encode(d, SCC_TINYFONT); break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   222
			case 0x0F: d += Utf8Encode(d, SCC_BIGFONT); break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   223
			case 0x1F:
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   224
				d += Utf8Encode(d, SCC_SETXY);
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   225
				*d++ = *str++;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   226
				*d++ = *str++;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   227
				break;
3646
4506e8954c11 (svn r4557) - NewGRF: translate from TTDPatch control codes to our own, instead of just simple validation. We still perform
peter1138
parents: 3641
diff changeset
   228
			case 0x7B:
4506e8954c11 (svn r4557) - NewGRF: translate from TTDPatch control codes to our own, instead of just simple validation. We still perform
peter1138
parents: 3641
diff changeset
   229
			case 0x7C:
4506e8954c11 (svn r4557) - NewGRF: translate from TTDPatch control codes to our own, instead of just simple validation. We still perform
peter1138
parents: 3641
diff changeset
   230
			case 0x7D:
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   231
			case 0x7E: d += Utf8Encode(d, SCC_NUM); break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   232
			case 0x7F: d += Utf8Encode(d, SCC_CURRENCY); break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   233
			case 0x80: d += Utf8Encode(d, SCC_STRING); break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   234
			case 0x81: {
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   235
				StringID string;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   236
				string  = *str++;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   237
				string |= *str++ << 8;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   238
				d += Utf8Encode(d, SCC_STRING_ID);
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   239
				d += Utf8Encode(d, string);
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   240
				break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   241
			}
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   242
			case 0x82: d += Utf8Encode(d, SCC_DATE_TINY); break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   243
			case 0x83: d += Utf8Encode(d, SCC_DATE_SHORT); break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   244
			case 0x84: d += Utf8Encode(d, SCC_VELOCITY); break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   245
			case 0x85: d += Utf8Encode(d, SCC_SKIP);    break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   246
			case 0x86: /* "Rotate down top 4 words on stack" */ break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   247
			case 0x87: d += Utf8Encode(d, SCC_VOLUME);  break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   248
			case 0x88: d += Utf8Encode(d, SCC_BLUE);    break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   249
			case 0x89: d += Utf8Encode(d, SCC_SILVER);  break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   250
			case 0x8A: d += Utf8Encode(d, SCC_GOLD);    break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   251
			case 0x8B: d += Utf8Encode(d, SCC_RED);     break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   252
			case 0x8C: d += Utf8Encode(d, SCC_PURPLE);  break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   253
			case 0x8D: d += Utf8Encode(d, SCC_LTBROWN); break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   254
			case 0x8E: d += Utf8Encode(d, SCC_ORANGE);  break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   255
			case 0x8F: d += Utf8Encode(d, SCC_GREEN);   break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   256
			case 0x90: d += Utf8Encode(d, SCC_YELLOW);  break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   257
			case 0x91: d += Utf8Encode(d, SCC_DKGREEN); break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   258
			case 0x92: d += Utf8Encode(d, SCC_CREAM);   break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   259
			case 0x93: d += Utf8Encode(d, SCC_BROWN);   break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   260
			case 0x94: d += Utf8Encode(d, SCC_WHITE);   break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   261
			case 0x95: d += Utf8Encode(d, SCC_LTBLUE);  break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   262
			case 0x96: d += Utf8Encode(d, SCC_GRAY);    break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   263
			case 0x97: d += Utf8Encode(d, SCC_DKBLUE);  break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   264
			case 0x98: d += Utf8Encode(d, SCC_BLACK);   break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   265
			case 0x9E: d += Utf8Encode(d, 0x20AC); break; // Euro
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   266
			case 0x9F: d += Utf8Encode(d, 0x0178); break; // Y with diaeresis
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   267
			case 0xA0: d += Utf8Encode(d, SCC_UPARROW); break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   268
			case 0xAA: d += Utf8Encode(d, SCC_DOWNARROW); break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   269
			case 0xAC: d += Utf8Encode(d, SCC_CHECKMARK); break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   270
			case 0xAD: d += Utf8Encode(d, SCC_CROSS); break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   271
			case 0xAF: d += Utf8Encode(d, SCC_RIGHTARROW); break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   272
			case 0xB4: d += Utf8Encode(d, SCC_TRAIN); break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   273
			case 0xB5: d += Utf8Encode(d, SCC_LORRY); break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   274
			case 0xB6: d += Utf8Encode(d, SCC_BUS); break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   275
			case 0xB7: d += Utf8Encode(d, SCC_PLANE); break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   276
			case 0xB8: d += Utf8Encode(d, SCC_SHIP); break;
3646
4506e8954c11 (svn r4557) - NewGRF: translate from TTDPatch control codes to our own, instead of just simple validation. We still perform
peter1138
parents: 3641
diff changeset
   277
			default:
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   278
				if (unicode) {
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   279
					d += Utf8Encode(d, Utf8Consume(&tmp));
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   280
					str = tmp;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   281
					break;
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   282
				}
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   283
3646
4506e8954c11 (svn r4557) - NewGRF: translate from TTDPatch control codes to our own, instead of just simple validation. We still perform
peter1138
parents: 3641
diff changeset
   284
				/* Validate any unhandled character */
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   285
				if (!IsValidChar(c, CS_ALPHANUMERAL)) c = '?';
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   286
				d += Utf8Encode(d, c);
3646
4506e8954c11 (svn r4557) - NewGRF: translate from TTDPatch control codes to our own, instead of just simple validation. We still perform
peter1138
parents: 3641
diff changeset
   287
				break;
4506e8954c11 (svn r4557) - NewGRF: translate from TTDPatch control codes to our own, instead of just simple validation. We still perform
peter1138
parents: 3641
diff changeset
   288
		}
4506e8954c11 (svn r4557) - NewGRF: translate from TTDPatch control codes to our own, instead of just simple validation. We still perform
peter1138
parents: 3641
diff changeset
   289
	}
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   290
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   291
	*d = '\0';
5860
7fdc9b423ba1 (svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents: 5838
diff changeset
   292
	tmp = ReallocT(tmp, strlen(tmp) + 1);
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
   293
	return tmp;
3646
4506e8954c11 (svn r4557) - NewGRF: translate from TTDPatch control codes to our own, instead of just simple validation. We still perform
peter1138
parents: 3641
diff changeset
   294
}
4506e8954c11 (svn r4557) - NewGRF: translate from TTDPatch control codes to our own, instead of just simple validation. We still perform
peter1138
parents: 3641
diff changeset
   295
4506e8954c11 (svn r4557) - NewGRF: translate from TTDPatch control codes to our own, instead of just simple validation. We still perform
peter1138
parents: 3641
diff changeset
   296
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   297
/**
3641
7dc47659e794 (svn r4550) - NewGRF: update string system to new rules: a grf version of less than 6 uses the old scheme, of 7 or more uses the new scheme. (Moving targets, yay...)
peter1138
parents: 3630
diff changeset
   298
 * Add the new read string into our structure.
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   299
 */
3821
2bb8a2643fdf (svn r4832) - NewGRF: add support for original string ID to newgrf text handling. So far, this is used for vehicles when no English or American translation is provided.
peter1138
parents: 3646
diff changeset
   300
StringID AddGRFString(uint32 grfid, uint16 stringid, byte langid_to_add, bool new_scheme, const char *text_to_add, StringID def_string)
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   301
{
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   302
	char *translatedtext;
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   303
	uint id;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   304
3641
7dc47659e794 (svn r4550) - NewGRF: update string system to new rules: a grf version of less than 6 uses the old scheme, of 7 or more uses the new scheme. (Moving targets, yay...)
peter1138
parents: 3630
diff changeset
   305
	/* When working with the old language scheme (grf_version is less than 7) and
3603
b79fac8ba026 (svn r4495) - NewGRF: Implement conversion from old language IDs (bitmask) to new language IDs (value)
peter1138
parents: 3602
diff changeset
   306
	 * English or American is among the set bits, simply add it as English in
b79fac8ba026 (svn r4495) - NewGRF: Implement conversion from old language IDs (bitmask) to new language IDs (value)
peter1138
parents: 3602
diff changeset
   307
	 * the new scheme, i.e. as langid = 1.
b79fac8ba026 (svn r4495) - NewGRF: Implement conversion from old language IDs (bitmask) to new language IDs (value)
peter1138
parents: 3602
diff changeset
   308
	 * If English is set, it is pretty safe to assume the translations are not
b79fac8ba026 (svn r4495) - NewGRF: Implement conversion from old language IDs (bitmask) to new language IDs (value)
peter1138
parents: 3602
diff changeset
   309
	 * actually translated.
b79fac8ba026 (svn r4495) - NewGRF: Implement conversion from old language IDs (bitmask) to new language IDs (value)
peter1138
parents: 3602
diff changeset
   310
	 */
3641
7dc47659e794 (svn r4550) - NewGRF: update string system to new rules: a grf version of less than 6 uses the old scheme, of 7 or more uses the new scheme. (Moving targets, yay...)
peter1138
parents: 3630
diff changeset
   311
	if (!new_scheme) {
3603
b79fac8ba026 (svn r4495) - NewGRF: Implement conversion from old language IDs (bitmask) to new language IDs (value)
peter1138
parents: 3602
diff changeset
   312
		if (HASBITS(langid_to_add, GRFLB_AMERICAN | GRFLB_ENGLISH)) {
b79fac8ba026 (svn r4495) - NewGRF: Implement conversion from old language IDs (bitmask) to new language IDs (value)
peter1138
parents: 3602
diff changeset
   313
			langid_to_add = GRFLX_ENGLISH;
b79fac8ba026 (svn r4495) - NewGRF: Implement conversion from old language IDs (bitmask) to new language IDs (value)
peter1138
parents: 3602
diff changeset
   314
		} else {
b79fac8ba026 (svn r4495) - NewGRF: Implement conversion from old language IDs (bitmask) to new language IDs (value)
peter1138
parents: 3602
diff changeset
   315
			StringID ret = STR_EMPTY;
5047
329bb4f145a9 (svn r7096) -Fix (r6995 (sort-of)): Don't set bit 6 when convert grf ver 6 language ids to use ver 7 format
peter1138
parents: 4992
diff changeset
   316
			if (langid_to_add & GRFLB_GERMAN)  ret = AddGRFString(grfid, stringid, GRFLX_GERMAN,  true, text_to_add, def_string);
329bb4f145a9 (svn r7096) -Fix (r6995 (sort-of)): Don't set bit 6 when convert grf ver 6 language ids to use ver 7 format
peter1138
parents: 4992
diff changeset
   317
			if (langid_to_add & GRFLB_FRENCH)  ret = AddGRFString(grfid, stringid, GRFLX_FRENCH,  true, text_to_add, def_string);
329bb4f145a9 (svn r7096) -Fix (r6995 (sort-of)): Don't set bit 6 when convert grf ver 6 language ids to use ver 7 format
peter1138
parents: 4992
diff changeset
   318
			if (langid_to_add & GRFLB_SPANISH) ret = AddGRFString(grfid, stringid, GRFLX_SPANISH, true, text_to_add, def_string);
3603
b79fac8ba026 (svn r4495) - NewGRF: Implement conversion from old language IDs (bitmask) to new language IDs (value)
peter1138
parents: 3602
diff changeset
   319
			return ret;
b79fac8ba026 (svn r4495) - NewGRF: Implement conversion from old language IDs (bitmask) to new language IDs (value)
peter1138
parents: 3602
diff changeset
   320
		}
b79fac8ba026 (svn r4495) - NewGRF: Implement conversion from old language IDs (bitmask) to new language IDs (value)
peter1138
parents: 3602
diff changeset
   321
	}
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   322
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   323
	for (id = 0; id < _num_grf_texts; id++) {
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   324
		if (_grf_text[id].grfid == grfid && _grf_text[id].stringid == stringid) {
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   325
			break;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   326
		}
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   327
	}
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   328
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   329
	/* Too many strings allocated, return empty */
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   330
	if (id == lengthof(_grf_text)) return STR_EMPTY;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   331
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   332
	translatedtext = TranslateTTDPatchCodes(text_to_add);
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   333
5906
db41d51fd454 (svn r8114) Allocate struct GRFText in the C++ way
tron
parents: 5860
diff changeset
   334
	GRFText *newtext = GRFText::New(langid_to_add, translatedtext);
3856
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   335
5108
dc67d70b5a45 (svn r7182) -Feature: Merge utf8 branch. This brings us support for Unicode/UTF-8 and the option for fonts rendered by FreeType. Language changes to come.
peter1138
parents: 5047
diff changeset
   336
	free(translatedtext);
3856
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   337
3603
b79fac8ba026 (svn r4495) - NewGRF: Implement conversion from old language IDs (bitmask) to new language IDs (value)
peter1138
parents: 3602
diff changeset
   338
	/* If we didn't find our stringid and grfid in the list, allocate a new id */
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   339
	if (id == _num_grf_texts) _num_grf_texts++;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   340
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   341
	if (_grf_text[id].textholder == NULL) {
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   342
		_grf_text[id].grfid      = grfid;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   343
		_grf_text[id].stringid   = stringid;
3821
2bb8a2643fdf (svn r4832) - NewGRF: add support for original string ID to newgrf text handling. So far, this is used for vehicles when no English or American translation is provided.
peter1138
parents: 3646
diff changeset
   344
		_grf_text[id].def_string = def_string;
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   345
		_grf_text[id].textholder = newtext;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   346
	} else {
4711
bfeaddae37c5 (svn r6623) - Codechange: When adding a NewGRF string, check to see if it can replace an existing string. Also remove string length check on load which was a quickfix for some grfs.
peter1138
parents: 4710
diff changeset
   347
		GRFText **ptext, *text;
bfeaddae37c5 (svn r6623) - Codechange: When adding a NewGRF string, check to see if it can replace an existing string. Also remove string length check on load which was a quickfix for some grfs.
peter1138
parents: 4710
diff changeset
   348
		bool replaced = false;
bfeaddae37c5 (svn r6623) - Codechange: When adding a NewGRF string, check to see if it can replace an existing string. Also remove string length check on load which was a quickfix for some grfs.
peter1138
parents: 4710
diff changeset
   349
bfeaddae37c5 (svn r6623) - Codechange: When adding a NewGRF string, check to see if it can replace an existing string. Also remove string length check on load which was a quickfix for some grfs.
peter1138
parents: 4710
diff changeset
   350
		/* Loop through all languages and see if we can replace a string */
bfeaddae37c5 (svn r6623) - Codechange: When adding a NewGRF string, check to see if it can replace an existing string. Also remove string length check on load which was a quickfix for some grfs.
peter1138
parents: 4710
diff changeset
   351
		for (ptext = &_grf_text[id].textholder; (text = *ptext) != NULL; ptext = &text->next) {
4992
6d0a80c5c654 (svn r6995) - Codechange: NewGRF; strip bit 7 of the language ID earlier and handle handle a language ID of 0x7F as the preferred default language.
peter1138
parents: 4915
diff changeset
   352
			if (text->langid != langid_to_add) continue;
4711
bfeaddae37c5 (svn r6623) - Codechange: When adding a NewGRF string, check to see if it can replace an existing string. Also remove string length check on load which was a quickfix for some grfs.
peter1138
parents: 4710
diff changeset
   353
			newtext->next = text->next;
bfeaddae37c5 (svn r6623) - Codechange: When adding a NewGRF string, check to see if it can replace an existing string. Also remove string length check on load which was a quickfix for some grfs.
peter1138
parents: 4710
diff changeset
   354
			*ptext = newtext;
5906
db41d51fd454 (svn r8114) Allocate struct GRFText in the C++ way
tron
parents: 5860
diff changeset
   355
			delete text;
4711
bfeaddae37c5 (svn r6623) - Codechange: When adding a NewGRF string, check to see if it can replace an existing string. Also remove string length check on load which was a quickfix for some grfs.
peter1138
parents: 4710
diff changeset
   356
			replaced = true;
bfeaddae37c5 (svn r6623) - Codechange: When adding a NewGRF string, check to see if it can replace an existing string. Also remove string length check on load which was a quickfix for some grfs.
peter1138
parents: 4710
diff changeset
   357
			break;
bfeaddae37c5 (svn r6623) - Codechange: When adding a NewGRF string, check to see if it can replace an existing string. Also remove string length check on load which was a quickfix for some grfs.
peter1138
parents: 4710
diff changeset
   358
		}
bfeaddae37c5 (svn r6623) - Codechange: When adding a NewGRF string, check to see if it can replace an existing string. Also remove string length check on load which was a quickfix for some grfs.
peter1138
parents: 4710
diff changeset
   359
bfeaddae37c5 (svn r6623) - Codechange: When adding a NewGRF string, check to see if it can replace an existing string. Also remove string length check on load which was a quickfix for some grfs.
peter1138
parents: 4710
diff changeset
   360
		/* If a string wasn't replaced, then we must append the new string */
bfeaddae37c5 (svn r6623) - Codechange: When adding a NewGRF string, check to see if it can replace an existing string. Also remove string length check on load which was a quickfix for some grfs.
peter1138
parents: 4710
diff changeset
   361
		if (!replaced) *ptext = newtext;
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   362
	}
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   363
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5344
diff changeset
   364
	grfmsg(3, "Added 0x%X: grfid %08X string 0x%X lang 0x%X string '%s'", id, grfid, stringid, newtext->langid, newtext->text);
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   365
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   366
	return (GRFTAB << TABSIZE) + id;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   367
}
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   368
4710
a663b32b9f96 (svn r6622) - Add support for NewGRF text includes. (Based on mart3p's patch)
peter1138
parents: 4624
diff changeset
   369
/* Used to remember the grfid that the last retrieved string came from */
a663b32b9f96 (svn r6622) - Add support for NewGRF text includes. (Based on mart3p's patch)
peter1138
parents: 4624
diff changeset
   370
static uint32 _last_grfid = 0;
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   371
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   372
/**
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   373
 * Returns the index for this stringid associated with its grfID
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   374
 */
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   375
StringID GetGRFStringID(uint32 grfid, uint16 stringid)
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   376
{
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   377
	uint id;
4710
a663b32b9f96 (svn r6622) - Add support for NewGRF text includes. (Based on mart3p's patch)
peter1138
parents: 4624
diff changeset
   378
a663b32b9f96 (svn r6622) - Add support for NewGRF text includes. (Based on mart3p's patch)
peter1138
parents: 4624
diff changeset
   379
	/* grfid is zero when we're being called via an include */
a663b32b9f96 (svn r6622) - Add support for NewGRF text includes. (Based on mart3p's patch)
peter1138
parents: 4624
diff changeset
   380
	if (grfid == 0) grfid = _last_grfid;
a663b32b9f96 (svn r6622) - Add support for NewGRF text includes. (Based on mart3p's patch)
peter1138
parents: 4624
diff changeset
   381
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   382
	for (id = 0; id < _num_grf_texts; id++) {
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   383
		if (_grf_text[id].grfid == grfid && _grf_text[id].stringid == stringid) {
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   384
			return (GRFTAB << TABSIZE) + id;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   385
		}
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   386
	}
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   387
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   388
	return STR_UNDEFINED;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   389
}
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   390
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   391
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4711
diff changeset
   392
char *GetGRFString(char *buff, uint16 stringid, const char* last)
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   393
{
4305
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   394
	const GRFText *default_text = NULL;
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   395
	const GRFText *search_text;
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   396
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   397
	assert(_grf_text[stringid].grfid != 0);
4710
a663b32b9f96 (svn r6622) - Add support for NewGRF text includes. (Based on mart3p's patch)
peter1138
parents: 4624
diff changeset
   398
a663b32b9f96 (svn r6622) - Add support for NewGRF text includes. (Based on mart3p's patch)
peter1138
parents: 4624
diff changeset
   399
	/* Remember this grfid in case the string has included text */
a663b32b9f96 (svn r6622) - Add support for NewGRF text includes. (Based on mart3p's patch)
peter1138
parents: 4624
diff changeset
   400
	_last_grfid = _grf_text[stringid].grfid;
a663b32b9f96 (svn r6622) - Add support for NewGRF text includes. (Based on mart3p's patch)
peter1138
parents: 4624
diff changeset
   401
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   402
	/*Search the list of lang-strings of this stringid for current lang */
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   403
	for (search_text = _grf_text[stringid].textholder; search_text != NULL; search_text = search_text->next) {
3821
2bb8a2643fdf (svn r4832) - NewGRF: add support for original string ID to newgrf text handling. So far, this is used for vehicles when no English or American translation is provided.
peter1138
parents: 3646
diff changeset
   404
		if (search_text->langid == _currentLangID) {
4915
b3b625640fa6 (svn r6888) - Fix (r6884): Missed a couple of strecpy()s in newgrf text handling
peter1138
parents: 4912
diff changeset
   405
			return strecpy(buff, search_text->text, last);
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   406
		}
3821
2bb8a2643fdf (svn r4832) - NewGRF: add support for original string ID to newgrf text handling. So far, this is used for vehicles when no English or American translation is provided.
peter1138
parents: 3646
diff changeset
   407
2bb8a2643fdf (svn r4832) - NewGRF: add support for original string ID to newgrf text handling. So far, this is used for vehicles when no English or American translation is provided.
peter1138
parents: 3646
diff changeset
   408
		/* If the current string is English or American, set it as the
2bb8a2643fdf (svn r4832) - NewGRF: add support for original string ID to newgrf text handling. So far, this is used for vehicles when no English or American translation is provided.
peter1138
parents: 3646
diff changeset
   409
		 * fallback language if the specific language isn't available. */
4992
6d0a80c5c654 (svn r6995) - Codechange: NewGRF; strip bit 7 of the language ID earlier and handle handle a language ID of 0x7F as the preferred default language.
peter1138
parents: 4915
diff changeset
   410
		if (search_text->langid == GRFLX_UNSPECIFIED || (default_text == NULL && (search_text->langid == GRFLX_ENGLISH || search_text->langid == GRFLX_AMERICAN))) {
3821
2bb8a2643fdf (svn r4832) - NewGRF: add support for original string ID to newgrf text handling. So far, this is used for vehicles when no English or American translation is provided.
peter1138
parents: 3646
diff changeset
   411
			default_text = search_text;
2bb8a2643fdf (svn r4832) - NewGRF: add support for original string ID to newgrf text handling. So far, this is used for vehicles when no English or American translation is provided.
peter1138
parents: 3646
diff changeset
   412
		}
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   413
	}
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   414
3821
2bb8a2643fdf (svn r4832) - NewGRF: add support for original string ID to newgrf text handling. So far, this is used for vehicles when no English or American translation is provided.
peter1138
parents: 3646
diff changeset
   415
	/* If there is a fallback string, return that */
4915
b3b625640fa6 (svn r6888) - Fix (r6884): Missed a couple of strecpy()s in newgrf text handling
peter1138
parents: 4912
diff changeset
   416
	if (default_text != NULL) return strecpy(buff, default_text->text, last);
3821
2bb8a2643fdf (svn r4832) - NewGRF: add support for original string ID to newgrf text handling. So far, this is used for vehicles when no English or American translation is provided.
peter1138
parents: 3646
diff changeset
   417
2bb8a2643fdf (svn r4832) - NewGRF: add support for original string ID to newgrf text handling. So far, this is used for vehicles when no English or American translation is provided.
peter1138
parents: 3646
diff changeset
   418
	/* Use the default string ID if the fallback string isn't available */
4912
d04b3f2bca70 (svn r6884) -Codechange: Add strict bounds checking in string formatting system.
Darkvater
parents: 4711
diff changeset
   419
	return GetString(buff, _grf_text[stringid].def_string, last);
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   420
}
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   421
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   422
/**
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   423
 * Equivalence Setter function between game and newgrf langID.
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   424
 * This function will adjust _currentLangID as to what is the LangID
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   425
 * of the current language set by the user.
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   426
 * The array iso_codes will be used to find that match.
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   427
 * If not found, it will have to be standard english
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   428
 * This function is called after the user changed language,
6977
67b989528f3d (svn r9662) -Documentation: Doxygen corrections and @file omissions
belugas
parents: 6674
diff changeset
   429
 * from strings.cpp:ReadLanguagePack
67b989528f3d (svn r9662) -Documentation: Doxygen corrections and @file omissions
belugas
parents: 6674
diff changeset
   430
 * @param iso_name iso code of current selection
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   431
 */
3605
045805e70df0 (svn r4497) - NewGRF minor fixes: (Rubidium)
peter1138
parents: 3603
diff changeset
   432
void SetCurrentGrfLangID(const char *iso_name)
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   433
{
3605
045805e70df0 (svn r4497) - NewGRF minor fixes: (Rubidium)
peter1138
parents: 3603
diff changeset
   434
	/* Use English by default, if we can't match up the iso_code. */
4305
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   435
	byte ret = GRFLX_ENGLISH;
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   436
	byte i;
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   437
3605
045805e70df0 (svn r4497) - NewGRF minor fixes: (Rubidium)
peter1138
parents: 3603
diff changeset
   438
	for (i=0; i < lengthof(iso_codes); i++) {
3868
363ae2b6b55c (svn r4905) - NewGRF: fix typo that prevented non-english NewGRF text from working.
peter1138
parents: 3856
diff changeset
   439
		if (strncmp(iso_codes[i].code, iso_name, strlen(iso_codes[i].code)) == 0) {
3605
045805e70df0 (svn r4497) - NewGRF minor fixes: (Rubidium)
peter1138
parents: 3603
diff changeset
   440
			/* We found a match, so let's use it. */
045805e70df0 (svn r4497) - NewGRF minor fixes: (Rubidium)
peter1138
parents: 3603
diff changeset
   441
			ret = i;
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   442
			break;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   443
		}
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   444
	}
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   445
	_currentLangID = ret;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   446
}
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   447
7369
26325201d4d7 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 7060
diff changeset
   448
bool CheckGrfLangID(byte lang_id, byte grf_version)
26325201d4d7 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 7060
diff changeset
   449
{
26325201d4d7 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 7060
diff changeset
   450
	if (grf_version < 7) {
26325201d4d7 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 7060
diff changeset
   451
		switch (_currentLangID) {
26325201d4d7 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 7060
diff changeset
   452
			case GRFLX_GERMAN:  return (lang_id & GRFLB_GERMAN)  != 0;
26325201d4d7 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 7060
diff changeset
   453
			case GRFLX_FRENCH:  return (lang_id & GRFLB_FRENCH)  != 0;
26325201d4d7 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 7060
diff changeset
   454
			case GRFLX_SPANISH: return (lang_id & GRFLB_SPANISH) != 0;
26325201d4d7 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 7060
diff changeset
   455
			default:            return (lang_id & (GRFLB_ENGLISH | GRFLB_AMERICAN)) != 0;
26325201d4d7 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 7060
diff changeset
   456
		}
26325201d4d7 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 7060
diff changeset
   457
	}
26325201d4d7 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 7060
diff changeset
   458
26325201d4d7 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 7060
diff changeset
   459
	return (lang_id == _currentLangID || lang_id == GRFLX_UNSPECIFIED);
26325201d4d7 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 7060
diff changeset
   460
}
26325201d4d7 (svn r10114) -Fix: Only load newgrf error messages if the language matches the current
maedhros
parents: 7060
diff changeset
   461
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   462
/**
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   463
 * House cleaning.
3602
7e1fe983f357 (svn r4494) - NewGRF: Clean up and reset custom texts
peter1138
parents: 3601
diff changeset
   464
 * Remove all strings and reset the text counter.
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   465
 */
6573
7624f942237f (svn r9050) -Codechange: Foo(void) -> Foo()
rubidium
parents: 5908
diff changeset
   466
void CleanUpStrings()
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   467
{
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   468
	uint id;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   469
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   470
	for (id = 0; id < _num_grf_texts; id++) {
3602
7e1fe983f357 (svn r4494) - NewGRF: Clean up and reset custom texts
peter1138
parents: 3601
diff changeset
   471
		GRFText *grftext = _grf_text[id].textholder;
7e1fe983f357 (svn r4494) - NewGRF: Clean up and reset custom texts
peter1138
parents: 3601
diff changeset
   472
		while (grftext != NULL) {
7e1fe983f357 (svn r4494) - NewGRF: Clean up and reset custom texts
peter1138
parents: 3601
diff changeset
   473
			GRFText *grftext2 = grftext->next;
5906
db41d51fd454 (svn r8114) Allocate struct GRFText in the C++ way
tron
parents: 5860
diff changeset
   474
			delete grftext;
3602
7e1fe983f357 (svn r4494) - NewGRF: Clean up and reset custom texts
peter1138
parents: 3601
diff changeset
   475
			grftext = grftext2;
7e1fe983f357 (svn r4494) - NewGRF: Clean up and reset custom texts
peter1138
parents: 3601
diff changeset
   476
		}
7e1fe983f357 (svn r4494) - NewGRF: Clean up and reset custom texts
peter1138
parents: 3601
diff changeset
   477
		_grf_text[id].grfid      = 0;
7e1fe983f357 (svn r4494) - NewGRF: Clean up and reset custom texts
peter1138
parents: 3601
diff changeset
   478
		_grf_text[id].stringid   = 0;
7e1fe983f357 (svn r4494) - NewGRF: Clean up and reset custom texts
peter1138
parents: 3601
diff changeset
   479
		_grf_text[id].textholder = NULL;
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   480
	}
3602
7e1fe983f357 (svn r4494) - NewGRF: Clean up and reset custom texts
peter1138
parents: 3601
diff changeset
   481
7e1fe983f357 (svn r4494) - NewGRF: Clean up and reset custom texts
peter1138
parents: 3601
diff changeset
   482
	_num_grf_texts = 0;
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   483
}