(svn r2594) Fix: [strgen] Misc updates to the string system.

- Renamed the plural command to "P" instead of "PLURAL". Now write something like this to append an s on plural: {P "" s}. (You can optionally still add an argument index to explicitly specifiy which number that's used)
  - Removed the pluralized cargo strings from the string files. The new method is to use the plural specifier {P}
  - Added support for genders. First add "##gender der das die" on top, then use {G=der} on a cargoname/industry to set the gender, and to switch between genders do something like {G neu neu neue} {STRING}
  - Updated the swedish/english translation with P strings.
This commit is contained in:
ludde
2005-07-16 20:58:04 +00:00
parent 01f3b6b6fe
commit 64f6839816
13 changed files with 159 additions and 148 deletions

View File

@@ -59,6 +59,9 @@ static uint32 _hash;
static char _lang_name[32], _lang_ownname[32], _lang_isocode[16];
static byte _lang_pluralform;
static char _genders[8][8];
static int _numgenders;
// for each plural value, this is the number of plural forms.
static const byte _plural_form_counts[] = { 2,1,2,3,3,3,3,3,4 };
@@ -245,16 +248,28 @@ char *ParseWord(char **buf)
// Forward declaration
static int TranslateArgumentIdx(int arg, bool relative);
static void EmitWordList(char **words, int nw)
{
int i,j;
PutByte(nw);
for(i=0; i<nw; i++)
PutByte(strlen(words[i]));
for(i=0; i<nw; i++) {
for(j=0; words[i][j]; j++)
PutByte(words[i][j]);
}
}
static void EmitPlural(char *buf, int value)
{
int v,i,j;
int v;
bool relative;
char *words[5];
int nw = 0;
// Parse out the number.
if (!ParseRelNum(&buf, &v, &relative))
Fatal("Plural param invalid");
// Parse out the number, if one exists.
if (!ParseRelNum(&buf, &v, &relative)) { v = -1; relative = true; }
// Parse each string
for(nw=0; nw<5; nw++) {
@@ -272,16 +287,48 @@ static void EmitPlural(char *buf, int value)
PutByte(0x7D);
PutByte(TranslateArgumentIdx(v, relative));
PutByte(nw);
for(i=0; i<nw; i++)
PutByte(strlen(words[i]));
for(i=0; i<nw; i++) {
for(j=0; words[i][j]; j++)
PutByte(words[i][j]);
}
EmitWordList(words, nw);
}
static void EmitGender(char *buf, int value)
{
int v;
bool relative;
char *words[8];
int nw;
if (buf[0] == '=') {
buf++;
// This is a {G=DER} command
for(nw=0; ;nw++) {
if (nw >= 8)
Fatal("G argument '%s' invalid", buf);
if (!strcmp(buf, _genders[nw]))
break;
}
// now nw contains the gender index
PutByte(0x87);
PutByte(nw);
} else {
// This is a {G 0 foo bar two} command.
if (!ParseRelNum(&buf, &v, &relative)) { v = 0; relative = true; }
for(nw=0; nw<8; nw++) {
words[nw] = ParseWord(&buf);
if (!words[nw])
break;
}
if (nw != _numgenders) Fatal("Bad # of arguments for gender command");
PutByte(0x85);
PutByte(13);
PutByte(TranslateArgumentIdx(v, relative));
EmitWordList(words, nw);
}
}
static const CmdStruct _cmd_structs[] = {
// Update position
@@ -346,8 +393,10 @@ static const CmdStruct _cmd_structs[] = {
{"STATIONFEATURES", EmitEscapedByte, 10, 1}, // station features string, icons of the features
{"INDUSTRY", EmitEscapedByte, 11, 1}, // industry, takes an industry #
{"VOLUME", EmitEscapedByte, 12, 1},
{"PLURAL", EmitPlural, 0, 0, true}, // plural specifier
{"P", EmitPlural, 0, 0, true}, // plural specifier
{"G", EmitGender, 0, 0, true}, // gender specifier
{"DATE_LONG", EmitSingleByte, 0x82, 1},
{"DATE_SHORT", EmitSingleByte, 0x83, 1},
@@ -355,7 +404,6 @@ static const CmdStruct _cmd_structs[] = {
{"VELOCITY", EmitSingleByte, 0x84, 1},
{"SKIP", EmitSingleByte, 0x86, 1},
{"VOLUME", EmitSingleByte, 0x87, 1},
{"STRING", EmitSingleByte, 0x88, 1},
@@ -431,7 +479,7 @@ static const CmdStruct *ParseCommandString(char **str, char *param, int *argno,
start = s;
for(;;) {
c = *s++;
if (c == '}' || c == ' ')
if (c == '}' || c == ' ' || c == '=')
break;
if (c == '\0') {
Error("Missing } from command '%s'", start);
@@ -445,7 +493,8 @@ static const CmdStruct *ParseCommandString(char **str, char *param, int *argno,
return NULL;
}
if (c == ' ') {
if (c != '}') {
if (c == '=') s--;
// copy params
start = s;
for(;;) {
@@ -482,6 +531,15 @@ static void HandlePragma(char *str)
_lang_pluralform = atoi(str + 7);
if (_lang_pluralform >= lengthof(_plural_form_counts))
Fatal("Invalid pluralform %d", _lang_pluralform);
} else if (!memcmp(str, "gender ", 7)) {
char *buf = str + 7, *s;
int i;
for(i=0; i<8; i++) {
s = ParseWord(&buf);
if (!s) break;
ttd_strlcpy(_genders[i], s, sizeof(_genders[i]));
_numgenders++;
}
} else {
Fatal("unknown pragma '%s'", str);
}