newgrf_text.c
author peter1138
Fri, 15 Sep 2006 12:27:00 +0000
changeset 4603 3ccd4ee0a2e2
parent 4504 3d20af4bd525
child 4624 378f5dfcd7a7
permissions -rw-r--r--
(svn r6455) - Feature: Add 2cc (two company colours) livery schemes. This replaces the original colour selection window and bumps the saveload version. Liveries are supported for all vehicles, not just those with 2cc support. Thanks to lakie for GUI inspiration.
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
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
     3
/** @file
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"
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    20
#include "newgrf_text.h"
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    21
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    22
#define GRFTAB  28
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    23
#define TABSIZE 11
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
/**
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    26
 * Explains the newgrf shift bit positionning.
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    27
 * 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
    28
 * jumping from standard langID scheme to the new one.
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    29
 */
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    30
typedef enum grf_base_languages {
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    31
	GRFLB_AMERICAN    = 0x01,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    32
	GRFLB_ENGLISH     = 0x02,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    33
	GRFLB_GERMAN      = 0x04,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    34
	GRFLB_FRENCH      = 0x08,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    35
	GRFLB_SPANISH     = 0x10,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    36
	GRFLB_GENERIC     = 0x80,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    37
} grf_base_language;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    38
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    39
typedef enum grf_extended_languages {
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    40
	GRFLX_AMERICAN    = 0x00,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    41
	GRFLX_ENGLISH     = 0x01,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    42
	GRFLX_GERMAN      = 0x02,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    43
	GRFLX_FRENCH      = 0x03,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    44
	GRFLX_SPANISH     = 0x04,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    45
	GRFLX_RUSSIAN     = 0x07,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    46
	GRFLX_CZECH       = 0x15,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    47
	GRFLX_SLOVAK      = 0x16,
3856
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
    48
	GRFLX_AFRIKAANS   = 0x1B,
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
    49
	GRFLX_GREEK       = 0x1E,
3605
045805e70df0 (svn r4497) - NewGRF minor fixes: (Rubidium)
peter1138
parents: 3603
diff changeset
    50
	GRFLX_DUTCH       = 0x1F,
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    51
	GRFLX_CATALAN     = 0x22,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    52
	GRFLX_HUNGARIAN   = 0x24,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    53
	GRFLX_ITALIAN     = 0x27,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    54
	GRFLX_ROMANIAN    = 0x28,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    55
	GRFLX_ICELANDIC   = 0x29,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    56
	GRFLX_LATVIAN     = 0x2A,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    57
	GRFLX_LITHUANIAN  = 0x2B,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    58
	GRFLX_SLOVENIAN   = 0x2C,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    59
	GRFLX_DANISH      = 0x2D,
3605
045805e70df0 (svn r4497) - NewGRF minor fixes: (Rubidium)
peter1138
parents: 3603
diff changeset
    60
	GRFLX_SWEDISH     = 0x2E,
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    61
	GRFLX_NORWEGIAN   = 0x2F,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    62
	GRFLX_POLISH      = 0x30,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    63
	GRFLX_GALICIAN    = 0x31,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    64
	GRFLX_FRISIAN     = 0x32,
3856
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
    65
	GRFLX_UKRAINIAN   = 0x33,
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    66
	GRFLX_ESTONIAN    = 0x34,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    67
	GRFLX_FINNISH     = 0x35,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    68
	GRFLX_PORTUGUESE  = 0x36,
3605
045805e70df0 (svn r4497) - NewGRF minor fixes: (Rubidium)
peter1138
parents: 3603
diff changeset
    69
	GRFLX_BRAZILIAN   = 0x37,
3856
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
    70
	GRFLX_CROATIAN    = 0x38,
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    71
	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
    72
	GRFLX_UNSPECIFIED = 0x7F,
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    73
} grf_language;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    74
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    75
3603
b79fac8ba026 (svn r4495) - NewGRF: Implement conversion from old language IDs (bitmask) to new language IDs (value)
peter1138
parents: 3602
diff changeset
    76
typedef struct iso_grf {
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    77
	char code[6];
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    78
	byte grfLangID;
3603
b79fac8ba026 (svn r4495) - NewGRF: Implement conversion from old language IDs (bitmask) to new language IDs (value)
peter1138
parents: 3602
diff changeset
    79
} iso_grf;
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    80
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
 * ISO code VS NewGrf langID conversion array.
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    83
 * This array is used in two ways:
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    84
 * 1-its ISO part is matching OpenTTD dynamic language id
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    85
 *   with newgrf bit positionning language id
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    86
 * 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
    87
 *   watch for when inserting new strings, hence analysing newgrf langid
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    88
 */
3605
045805e70df0 (svn r4497) - NewGRF minor fixes: (Rubidium)
peter1138
parents: 3603
diff changeset
    89
const iso_grf iso_codes[] = {
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    90
	{"en_US", GRFLX_AMERICAN},
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
    91
	{"en_GB", GRFLX_ENGLISH},
3856
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
    92
	{"de_DE", GRFLX_GERMAN},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
    93
	{"fr_FR", GRFLX_FRENCH},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
    94
	{"es_ES", GRFLX_SPANISH},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
    95
	{"af_ZA", GRFLX_AFRIKAANS},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
    96
	{"hr_HR", GRFLX_CROATIAN},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
    97
	{"cs_CS", GRFLX_CZECH},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
    98
	{"ca_ES", GRFLX_CATALAN},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
    99
	{"da_DA", GRFLX_DANISH},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   100
	{"nl_NL", GRFLX_DUTCH},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   101
	{"et_ET", GRFLX_ESTONIAN},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   102
	{"fi_FI", GRFLX_FINNISH},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   103
	{"fy_NL", GRFLX_FRISIAN},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   104
	{"gl_ES", GRFLX_GALICIAN},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   105
	{"el_GR", GRFLX_GREEK},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   106
	{"hu_HU", GRFLX_HUNGARIAN},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   107
	{"is_IS", GRFLX_ICELANDIC},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   108
	{"it_IT", GRFLX_ITALIAN},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   109
	{"lv_LV", GRFLX_LATVIAN},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   110
	{"lt_LT", GRFLX_LITHUANIAN},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   111
	{"nb_NO", GRFLX_NORWEGIAN},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   112
	{"pl_PL", GRFLX_POLISH},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   113
	{"pt_PT", GRFLX_PORTUGUESE},
3605
045805e70df0 (svn r4497) - NewGRF minor fixes: (Rubidium)
peter1138
parents: 3603
diff changeset
   114
	{"pt_BR", GRFLX_BRAZILIAN},
3856
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   115
	{"ro_RO", GRFLX_ROMANIAN},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   116
	{"ru_RU", GRFLX_RUSSIAN},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   117
	{"sk_SK", GRFLX_SLOVAK},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   118
	{"sl_SL", GRFLX_SLOVENIAN},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   119
	{"sv_SE", GRFLX_SWEDISH},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   120
	{"tr_TR", GRFLX_TURKISH},
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   121
	{"uk_UA", GRFLX_UKRAINIAN},
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   122
	{"gen",   GRFLB_GENERIC}   //this is not iso code, but there has to be something...
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   123
};
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   124
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   125
4305
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   126
/**
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   127
 * Element of the linked list.
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   128
 * Each of those elements represent the string,
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   129
 * but according to a different lang.
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   130
 */
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   131
typedef struct GRFText {
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   132
	struct GRFText *next;
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   133
	byte langid;
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   134
	char text[VARARRAY_SIZE];
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   135
} GRFText;
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   136
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
/**
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   139
 * Holder of the above structure.
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   140
 * 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
   141
 * since it is NOT SUPPOSED to happen.
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   142
 */
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   143
typedef struct GRFTextEntry {
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   144
	uint32 grfid;
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   145
	uint16 stringid;
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   146
	StringID def_string;
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   147
	GRFText *textholder;
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   148
} GRFTextEntry;
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   149
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   150
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   151
static uint _num_grf_texts = 0;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   152
static GRFTextEntry _grf_text[(1 << TABSIZE) * 3];
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   153
static byte _currentLangID = GRFLX_ENGLISH;  //by default, english is used.
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   154
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   155
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
   156
static void TranslateTTDPatchCodes(char *str)
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
   157
{
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
   158
	char *c;
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
   159
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
   160
	for (c = str; *c != '\0'; c++) {
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
   161
		switch ((byte)*c) {
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
   162
			case 0x01: c++; 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
   163
			case 0x0D: *c = 10; 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
   164
			case 0x0E: *c = 8; 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
   165
			case 0x0F: *c = 9; 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
   166
			case 0x1F: *c = 2; c += 2; 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
   167
			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
   168
			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
   169
			case 0x7D:
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
   170
			case 0x7E: *c = 0x8E; 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
   171
			case 0x81: c += 2; 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
   172
			case 0x85: *c = 0x86; 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
   173
			case 0x88: *c = 15; 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
   174
			case 0x89: *c = 16; 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
   175
			case 0x8A: *c = 17; 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
   176
			case 0x8B: *c = 18; 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
   177
			case 0x8C: *c = 19; 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
   178
			case 0x8D: *c = 20; 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
   179
			case 0x8E: *c = 21; 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
   180
			case 0x8F: *c = 22; 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
   181
			case 0x90: *c = 23; 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
   182
			case 0x91: *c = 24; 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
   183
			case 0x92: *c = 25; 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
   184
			case 0x93: *c = 26; 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
   185
			case 0x94: *c = 27; 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
   186
			case 0x95: *c = 28; 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
   187
			case 0x96: *c = 29; 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
   188
			case 0x97: *c = 30; 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
   189
			case 0x98: *c = 31; 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
   190
			default:
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
   191
				/* Validate any unhandled character */
4299
b86602eaaff1 (svn r5944) -Merge TGP (r5578, r5579, r5724, r5726): -Feature: filter for textboxes to only
truelight
parents: 3868
diff changeset
   192
				if (!IsValidAsciiChar(*c, CS_ALPHANUMERAL)) *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
   193
				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
   194
		}
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
	}
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
   196
}
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
   197
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
   198
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   199
/**
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
   200
 * Add the new read string into our structure.
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   201
 */
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
   202
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
   203
{
3603
b79fac8ba026 (svn r4495) - NewGRF: Implement conversion from old language IDs (bitmask) to new language IDs (value)
peter1138
parents: 3602
diff changeset
   204
	GRFText *newtext;
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   205
	uint id;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   206
4504
3d20af4bd525 (svn r6289) -Fix(r6108) : case 0x48 (generic text) should not have been set over newstations.
belugas
parents: 4305
diff changeset
   207
	/* We do not allow strings of only one char or even fewer*/
3d20af4bd525 (svn r6289) -Fix(r6108) : case 0x48 (generic text) should not have been set over newstations.
belugas
parents: 4305
diff changeset
   208
	if (strlen(text_to_add) <= 1) return STR_EMPTY;
3d20af4bd525 (svn r6289) -Fix(r6108) : case 0x48 (generic text) should not have been set over newstations.
belugas
parents: 4305
diff changeset
   209
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
   210
	/* 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
   211
	 * 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
   212
	 * 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
   213
	 * 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
   214
	 * actually translated.
b79fac8ba026 (svn r4495) - NewGRF: Implement conversion from old language IDs (bitmask) to new language IDs (value)
peter1138
parents: 3602
diff changeset
   215
	 */
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
   216
	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
   217
		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
   218
			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
   219
		} else {
b79fac8ba026 (svn r4495) - NewGRF: Implement conversion from old language IDs (bitmask) to new language IDs (value)
peter1138
parents: 3602
diff changeset
   220
			StringID ret = STR_EMPTY;
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
   221
			if (langid_to_add & GRFLB_GERMAN)  ret = AddGRFString(grfid, stringid, 1 << 6 | GRFLX_GERMAN,  true, text_to_add, def_string);
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
   222
			if (langid_to_add & GRFLB_FRENCH)  ret = AddGRFString(grfid, stringid, 1 << 6 | GRFLX_FRENCH,  true, text_to_add, def_string);
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
   223
			if (langid_to_add & GRFLB_SPANISH) ret = AddGRFString(grfid, stringid, 1 << 6 | 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
   224
			return ret;
b79fac8ba026 (svn r4495) - NewGRF: Implement conversion from old language IDs (bitmask) to new language IDs (value)
peter1138
parents: 3602
diff changeset
   225
		}
b79fac8ba026 (svn r4495) - NewGRF: Implement conversion from old language IDs (bitmask) to new language IDs (value)
peter1138
parents: 3602
diff changeset
   226
	}
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   227
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   228
	for (id = 0; id < _num_grf_texts; id++) {
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   229
		if (_grf_text[id].grfid == grfid && _grf_text[id].stringid == stringid) {
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   230
			break;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   231
		}
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   232
	}
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   233
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   234
	/* Too many strings allocated, return empty */
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   235
	if (id == lengthof(_grf_text)) return STR_EMPTY;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   236
4305
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   237
	newtext = malloc(sizeof(*newtext) + strlen(text_to_add) + 1);
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   238
	newtext->next   = NULL;
3856
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   239
	newtext->langid = GB(langid_to_add, 0, 6);
4305
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   240
	strcpy(newtext->text, text_to_add);
3856
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   241
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   242
	TranslateTTDPatchCodes(newtext->text);
6b6870aa2691 (svn r4888) CodeChange : Newgrf : little cleanup and additions
belugas
parents: 3821
diff changeset
   243
3603
b79fac8ba026 (svn r4495) - NewGRF: Implement conversion from old language IDs (bitmask) to new language IDs (value)
peter1138
parents: 3602
diff changeset
   244
	/* 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
   245
	if (id == _num_grf_texts) _num_grf_texts++;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   246
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   247
	if (_grf_text[id].textholder == NULL) {
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   248
		_grf_text[id].grfid      = grfid;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   249
		_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
   250
		_grf_text[id].def_string = def_string;
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   251
		_grf_text[id].textholder = newtext;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   252
	} else {
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   253
		GRFText *textptr = _grf_text[id].textholder;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   254
		while (textptr->next != NULL) textptr = textptr->next;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   255
		textptr->next = newtext;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   256
	}
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   257
3630
0f7828d892ae (svn r4529) - Codechange: Use proper naming for hex numbers in debug prints eg. 0xF3A6. Use fixed lengths where applicable (newgrf). Unfortunately '%#X' is unusable since it gives 0XFF3 and '%#x' gives 0xff3 while we want 0xFF3 :P
Darkvater
parents: 3605
diff changeset
   258
	DEBUG(grf, 2)("Added 0x%X: grfid 0x%X 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
   259
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   260
	return (GRFTAB << TABSIZE) + id;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   261
}
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   262
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   263
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   264
/**
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   265
 * Returns the index for this stringid associated with its grfID
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   266
 */
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   267
StringID GetGRFStringID(uint32 grfid, uint16 stringid)
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   268
{
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   269
	uint id;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   270
	for (id = 0; id < _num_grf_texts; id++) {
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   271
		if (_grf_text[id].grfid == grfid && _grf_text[id].stringid == stringid) {
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   272
			return (GRFTAB << TABSIZE) + id;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   273
		}
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   274
	}
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   275
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   276
	return STR_UNDEFINED;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   277
}
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   278
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   279
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   280
char *GetGRFString(char *buff, uint16 stringid)
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   281
{
4305
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   282
	const GRFText *default_text = NULL;
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   283
	const GRFText *search_text;
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   284
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   285
	assert(_grf_text[stringid].grfid != 0);
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   286
	/*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
   287
	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
   288
		if (search_text->langid == _currentLangID) {
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   289
			return strecpy(buff, search_text->text, NULL);
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   290
		}
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
   291
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
   292
		/* 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
   293
		 * fallback language if the specific language isn't available. */
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
   294
		if (search_text->langid == GRFLX_ENGLISH || search_text->langid == GRFLX_AMERICAN) {
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
   295
			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
   296
		}
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   297
	}
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   298
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
   299
	/* If there is a fallback string, return that */
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
	if (default_text != NULL) return strecpy(buff, default_text->text, NULL);
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
   301
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
   302
	/* Use the default string ID if the fallback string isn't available */
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
   303
	return GetString(buff, _grf_text[stringid].def_string);
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   304
}
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   305
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   306
/**
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   307
 * Equivalence Setter function between game and newgrf langID.
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   308
 * This function will adjust _currentLangID as to what is the LangID
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   309
 * of the current language set by the user.
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   310
 * The array iso_codes will be used to find that match.
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   311
 * If not found, it will have to be standard english
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   312
 * This function is called after the user changed language,
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   313
 * from strings.c:ReadLanguagePack
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   314
 * @param iso code of current selection
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   315
 */
3605
045805e70df0 (svn r4497) - NewGRF minor fixes: (Rubidium)
peter1138
parents: 3603
diff changeset
   316
void SetCurrentGrfLangID(const char *iso_name)
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   317
{
3605
045805e70df0 (svn r4497) - NewGRF minor fixes: (Rubidium)
peter1138
parents: 3603
diff changeset
   318
	/* 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
   319
	byte ret = GRFLX_ENGLISH;
c25b05028b71 (svn r5952) - struct GRFText{Entry,} are private to newgrf_text.c
tron
parents: 4299
diff changeset
   320
	byte i;
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   321
3605
045805e70df0 (svn r4497) - NewGRF minor fixes: (Rubidium)
peter1138
parents: 3603
diff changeset
   322
	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
   323
		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
   324
			/* We found a match, so let's use it. */
045805e70df0 (svn r4497) - NewGRF minor fixes: (Rubidium)
peter1138
parents: 3603
diff changeset
   325
			ret = i;
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   326
			break;
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
	_currentLangID = ret;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   330
}
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   331
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   332
/**
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   333
 * House cleaning.
3602
7e1fe983f357 (svn r4494) - NewGRF: Clean up and reset custom texts
peter1138
parents: 3601
diff changeset
   334
 * Remove all strings and reset the text counter.
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   335
 */
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   336
void CleanUpStrings(void)
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   337
{
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   338
	uint id;
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   339
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   340
	for (id = 0; id < _num_grf_texts; id++) {
3602
7e1fe983f357 (svn r4494) - NewGRF: Clean up and reset custom texts
peter1138
parents: 3601
diff changeset
   341
		GRFText *grftext = _grf_text[id].textholder;
7e1fe983f357 (svn r4494) - NewGRF: Clean up and reset custom texts
peter1138
parents: 3601
diff changeset
   342
		while (grftext != NULL) {
7e1fe983f357 (svn r4494) - NewGRF: Clean up and reset custom texts
peter1138
parents: 3601
diff changeset
   343
			GRFText *grftext2 = grftext->next;
7e1fe983f357 (svn r4494) - NewGRF: Clean up and reset custom texts
peter1138
parents: 3601
diff changeset
   344
			free(grftext);
7e1fe983f357 (svn r4494) - NewGRF: Clean up and reset custom texts
peter1138
parents: 3601
diff changeset
   345
			grftext = grftext2;
7e1fe983f357 (svn r4494) - NewGRF: Clean up and reset custom texts
peter1138
parents: 3601
diff changeset
   346
		}
7e1fe983f357 (svn r4494) - NewGRF: Clean up and reset custom texts
peter1138
parents: 3601
diff changeset
   347
		_grf_text[id].grfid      = 0;
7e1fe983f357 (svn r4494) - NewGRF: Clean up and reset custom texts
peter1138
parents: 3601
diff changeset
   348
		_grf_text[id].stringid   = 0;
7e1fe983f357 (svn r4494) - NewGRF: Clean up and reset custom texts
peter1138
parents: 3601
diff changeset
   349
		_grf_text[id].textholder = NULL;
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   350
	}
3602
7e1fe983f357 (svn r4494) - NewGRF: Clean up and reset custom texts
peter1138
parents: 3601
diff changeset
   351
7e1fe983f357 (svn r4494) - NewGRF: Clean up and reset custom texts
peter1138
parents: 3601
diff changeset
   352
	_num_grf_texts = 0;
3601
ac6df06db648 (svn r4493) Newgrf : Action 04. Beginning of implementation.
belugas
parents:
diff changeset
   353
}