dev-version:

- STRINGS
  strings.txt für deutsch und englisch um einen Haufen fehlender Einträge
  erweitert.language.c schreibt jetzt auf Wunsch ein logfile aller fehlender
  strings, was extrem hilfreich beim ergänzen ist.

- LOKALISIERUNG
  Man kann jetzt Befehle komplett in einer anderen Sprache geben. Der NR macht
  Talente, Zugvorlage und Gegenstände in der eigenen Sprache.

- monster.h
  zu monster.c nach gamecode verschoben

- locale_string(key, NULL)
  NULL-locale liefert jetzt den key selbst zurück.

- CR:
  1. Anzeige der hashes statt der lokalisierten strings
  2. TRANSLATION Block

- Messages:
  make_message heisst jetzt msg_message
  msg_error() ist eine neue funktion für fehlermeldungen

- strings.txt, messages.xml
  Einen Haufen neuer Einträge gemacht.
This commit is contained in:
Enno Rehling 2001-04-16 14:34:19 +00:00
parent 0106d6d2fa
commit 6f50f9282a
57 changed files with 1760 additions and 818 deletions

View file

@ -397,7 +397,7 @@ main(int argc, char *argv[])
sprintf(buf, "fopen(%s): ", "res/spells"); sprintf(buf, "fopen(%s): ", "res/spells");
perror(buf); perror(buf);
} }
/*
F = fopen("res/bonus", "wt"); F = fopen("res/bonus", "wt");
if (F) { if (F) {
race_t r; race_t r;
@ -422,7 +422,7 @@ main(int argc, char *argv[])
sprintf(buf, "fopen(%s): ", "res/spells"); sprintf(buf, "fopen(%s): ", "res/spells");
perror(buf); perror(buf);
} }
*/
debug = 0; debug = 0;
quickleave = 0; quickleave = 0;

View file

@ -74,6 +74,68 @@ extern int quiet;
/* globals */ /* globals */
#define C_REPORT_VERSION 57 #define C_REPORT_VERSION 57
/*
* translation table
*/
typedef struct translation {
struct translation * next;
const char * key;
const char * value;
} translation;
#define TRANSMAXHASH 255
static translation * translation_table[TRANSMAXHASH];
static translation * junkyard;
static const char *
add_translation(const char * key, const char * value)
{
int kk = ((key[0] << 5) + key[0]) % TRANSMAXHASH;
translation * t = translation_table[kk];
while (t && strcmp(t->key, key)!=0) t=t->next;
if (!t) {
if (junkyard) {
t = junkyard;
junkyard = junkyard->next;
} else t = malloc(sizeof(translation));
t->key = key;
t->value = value;
t->next = translation_table[kk];
translation_table[kk] = t;
}
return key;
}
static void
write_translations(FILE * F)
{
int i;
fputs("TRANSLATION\n", F);
for (i=0;i!=TRANSMAXHASH;++i) {
translation * t = translation_table[i];
while (t) {
fprintf(F, "\"%s\";%s\n", t->value, t->key);
t = t->next;
}
}
}
static void
reset_translations(void)
{
int i;
for (i=0;i!=TRANSMAXHASH;++i) {
translation * t = translation_table[i];
while (t) {
translation * c = t->next;
t->next = junkyard;
junkyard = t;
t = c;
}
translation_table[i] = 0;
}
}
/* implementation */ /* implementation */
void void
cr_output_str_list(FILE * F, const char *title, const strlist * S, faction * f) cr_output_str_list(FILE * F, const char *title, const strlist * S, faction * f)
@ -114,11 +176,12 @@ print_curses(FILE * F, void * obj, typ_t typ, attrib *a, int self)
} }
} else if (a->type==&at_effect && self) { } else if (a->type==&at_effect && self) {
effect_data * data = (effect_data *)a->data.v; effect_data * data = (effect_data *)a->data.v;
const char * key = resourcename(data->type->itype->rtype, 0);
if (!header) { if (!header) {
header = 1; header = 1;
fputs("EFFECTS\n", F); fputs("EFFECTS\n", F);
} }
fprintf(F, "\"%d %s\"\n", data->value, locale_string(NULL, resourcename(data->type->itype->rtype, 0))); fprintf(F, "\"%d %s\"\n", data->value, add_translation(key, locale_string(NULL, key)));
} }
a = a->next; a = a->next;
} }
@ -185,22 +248,37 @@ cr_resource(const void * v, char * buffer, const void * userdata)
const faction * report = (const faction*)userdata; const faction * report = (const faction*)userdata;
const resource_type * r = (const resource_type *)v; const resource_type * r = (const resource_type *)v;
if (r) { if (r) {
sprintf(buffer, "\"%s\"", locale_string(report->locale, resourcename(r, 0))); const char * key = resourcename(r, 0);
sprintf(buffer, "\"%s\"",
add_translation(key, locale_string(report->locale, key)));
return 0; return 0;
} }
return -1; return -1;
} }
static int
cr_race(const void * v, char * buffer, const void * userdata)
{
const faction * report = (const faction*)userdata;
int rc = (int)v;
const char * key = race[rc].name[0];
sprintf(buffer, "\"%s\"",
add_translation(key, locale_string(report->locale, key)));
return 0;
}
static int static int
cr_skill(const void * v, char * buffer, const void * userdata) cr_skill(const void * v, char * buffer, const void * userdata)
{ {
const faction * report = (const faction*)userdata; const faction * report = (const faction*)userdata;
skill_t sk = (skill_t)v; skill_t sk = (skill_t)v;
if (sk!=NOSKILL) sprintf(buffer, "\"%s\"", locale_string(report->locale, skillnames[sk])); if (sk!=NOSKILL) sprintf(buffer, "\"%s\"",
add_translation(skillname(sk, NULL), skillname(sk, report->locale)));
else strcpy(buffer, "\"\""); else strcpy(buffer, "\"\"");
return 0; return 0;
} }
void void
creport_init(void) creport_init(void)
{ {
@ -214,11 +292,19 @@ creport_init(void)
tsf_register("building", &cr_building); tsf_register("building", &cr_building);
tsf_register("skill", &cr_skill); tsf_register("skill", &cr_skill);
tsf_register("resource", &cr_resource); tsf_register("resource", &cr_resource);
tsf_register("race", &cr_race);
tsf_register("direction", &cr_int);
} }
void void
creport_cleanup(void) creport_cleanup(void)
{ {
while (junkyard) {
translation * t = junkyard;
junkyard = junkyard->next;
free(t);
}
junkyard = 0;
} }
static int msgno; static int msgno;
@ -315,7 +401,7 @@ cr_output_buildings(FILE * F, building * b, unit * u, int fno, faction *f)
const attrib * a = a_find(b->attribs, &at_icastle); const attrib * a = a_find(b->attribs, &at_icastle);
if (a) type = ((icastle_data*)a->data.v)->type; if (a) type = ((icastle_data*)a->data.v)->type;
} }
fprintf(F, "\"%s\";Typ\n", buildingtype(b, b->size, f->locale)); fprintf(F, "\"%s\";Typ\n", add_translation(b->type->_name, locale_string(f->locale, b->type->_name)));
fprintf(F, "\"%s\";Name\n", b->name); fprintf(F, "\"%s\";Name\n", b->name);
if (strlen(b->display)) if (strlen(b->display))
fprintf(F, "\"%s\";Beschr\n", b->display); fprintf(F, "\"%s\";Beschr\n", b->display);
@ -352,7 +438,7 @@ cr_output_ship(FILE * F, ship * s, unit * u, int fcaptain, faction * f, region *
fprintf(F, "\"%s\";Name\n", s->name); fprintf(F, "\"%s\";Name\n", s->name);
if (strlen(s->display)) if (strlen(s->display))
fprintf(F, "\"%s\";Beschr\n", s->display); fprintf(F, "\"%s\";Beschr\n", s->display);
fprintf(F, "\"%s\";Typ\n", s->type->name[0]); fprintf(F, "\"%s\";Typ\n", add_translation(s->type->name[0], locale_string(f->locale, s->type->name[0])));
fprintf(F, "%d;Groesse\n", s->size); fprintf(F, "%d;Groesse\n", s->size);
if (s->damage) { if (s->damage) {
int percent = s->damage*100/(s->size*DAMAGE_SCALE); int percent = s->damage*100/(s->size*DAMAGE_SCALE);
@ -444,10 +530,12 @@ cr_output_unit(FILE * F, region * r,
pzTmp = get_racename(u->attribs); pzTmp = get_racename(u->attribs);
if (pzTmp==NULL) fprintf(F, "\"%s\";Typ\n", race[u->irace].name[1]); if (pzTmp==NULL) fprintf(F, "\"%s\";Typ\n",
add_translation(race[u->irace].name[1], locale_string(f->locale, race[u->irace].name[1])));
else fprintf(F, "\"%s\";Typ\n", pzTmp); else fprintf(F, "\"%s\";Typ\n", pzTmp);
if ((pzTmp || u->irace != u->race) && u->faction==f) { if ((pzTmp || u->irace != u->race) && u->faction==f) {
fprintf(F, "\"%s\";wahrerTyp\n", race[u->race].name[1]); fprintf(F, "\"%s\";wahrerTyp\n",
add_translation(race[u->race].name[1], locale_string(f->locale, race[u->race].name[1])));
} }
if (u->building) if (u->building)
@ -502,7 +590,7 @@ cr_output_unit(FILE * F, region * r,
fprintf(F, "COMMANDS\n"); fprintf(F, "COMMANDS\n");
if(u->lastorder[0]) fprintf(F, "\"%s\"\n", u->lastorder); if(u->lastorder[0]) fprintf(F, "\"%s\"\n", u->lastorder);
for (S = u->orders; S; S = S->next) { for (S = u->orders; S; S = S->next) {
if(is_persistent(S->s)) { if(is_persistent(S->s, u->faction->locale)) {
fprintf(F, "\"%s\"\n", S->s); fprintf(F, "\"%s\"\n", S->s);
} }
} }
@ -519,7 +607,8 @@ cr_output_unit(FILE * F, region * r,
/* 0 ist nur der Kompatibilität wegen drin, rausnehmen */ /* 0 ist nur der Kompatibilität wegen drin, rausnehmen */
fprintf(F, "0 %d;%s\n", eff_skill(u, sk, r), skillnames[sk]); fprintf(F, "0 %d;%s\n", eff_skill(u, sk, r), skillnames[sk]);
#else #else
fprintf(F, "%d %d;%s\n", get_skill(u, sk), eff_skill(u, sk, r), skillnames[sk]); fprintf(F, "%d %d;%s\n", get_skill(u, sk), eff_skill(u, sk, r),
add_translation(skillname(sk, NULL), skillname(sk, f->locale)));
#endif #endif
} }
/* spells */ /* spells */
@ -733,6 +822,7 @@ report_computer(FILE * F, faction * f)
else printf(" - schreibe Computerreport\n"); else printf(" - schreibe Computerreport\n");
fprintf(F, "VERSION %d\n", C_REPORT_VERSION); fprintf(F, "VERSION %d\n", C_REPORT_VERSION);
fprintf(F, "\"%s\";locale\n", locale_name(f->locale));
fprintf(F, "\"%s\";Spiel\n", global.gamename); fprintf(F, "\"%s\";Spiel\n", global.gamename);
fprintf(F, "\"%s\";Konfiguration\n", "Standard"); fprintf(F, "\"%s\";Konfiguration\n", "Standard");
fprintf(F, "\"%s\";Koordinaten\n", "Hex"); fprintf(F, "\"%s\";Koordinaten\n", "Hex");
@ -748,7 +838,7 @@ report_computer(FILE * F, faction * f)
fprintf(F, "%d;Punkte\n", f->score); fprintf(F, "%d;Punkte\n", f->score);
fprintf(F, "%d;Punktedurchschnitt\n", average_score_of_age(f->age, f->age / 24 + 1)); fprintf(F, "%d;Punktedurchschnitt\n", average_score_of_age(f->age, f->age / 24 + 1));
} }
fprintf(F, "\"%s\";Typ\n", race[f->race].name[1]); fprintf(F, "\"%s\";Typ\n", add_translation(race[f->race].name[1], locale_string(f->locale, race[f->race].name[1])));
fprintf(F, "%d;Rekrutierungskosten\n", race[f->race].rekrutieren); fprintf(F, "%d;Rekrutierungskosten\n", race[f->race].rekrutieren);
fprintf(F, "%d;Anzahl Personen\n", count_all(f)); fprintf(F, "%d;Anzahl Personen\n", count_all(f));
fprintf(F, "\"%s\";Magiegebiet\n", neue_gebiete[f->magiegebiet]); fprintf(F, "\"%s\";Magiegebiet\n", neue_gebiete[f->magiegebiet]);
@ -800,13 +890,14 @@ report_computer(FILE * F, faction * f)
m = ptype->itype->construction->materials; m = ptype->itype->construction->materials;
ch = resourcename(ptype->itype->rtype, 0); ch = resourcename(ptype->itype->rtype, 0);
fprintf(F, "TRANK %d\n", hashstring(ch)); fprintf(F, "TRANK %d\n", hashstring(ch));
fprintf(F, "\"%s\";Name\n", locale_string(f->locale, ch)); fprintf(F, "\"%s\";Name\n", add_translation(ch, locale_string(f->locale, ch)));
fprintf(F, "%d;Stufe\n", ptype->level); fprintf(F, "%d;Stufe\n", ptype->level);
fprintf(F, "\"%s\";Beschr\n", ptype->text); fprintf(F, "\"%s\";Beschr\n", ptype->text);
fprintf(F, "ZUTATEN\n"); fprintf(F, "ZUTATEN\n");
while (m->number) { while (m->number) {
fprintf(F, "\"%s\"\n", locale_string(f->locale, resourcename(oldresourcetype[m->type], 0))); ch = resourcename(oldresourcetype[m->type], 0);
fprintf(F, "\"%s\"\n", add_translation(ch, locale_string(f->locale, ch)));
m++; m++;
} }
} }
@ -836,7 +927,7 @@ report_computer(FILE * F, faction * f)
else tname = terrain[rterrain(r)].name; else tname = terrain[rterrain(r)].name;
} }
fprintf(F, "\"%s\";Terrain\n", locale_string(f->locale, tname)); fprintf(F, "\"%s\";Terrain\n", add_translation(tname, locale_string(f->locale, tname)));
if (sd->mode != see_neighbour) if (sd->mode != see_neighbour)
{ {
int g = 0; int g = 0;
@ -879,10 +970,11 @@ report_computer(FILE * F, faction * f)
if(rpeasants(r)/TRADE_FRACTION > 0) { if(rpeasants(r)/TRADE_FRACTION > 0) {
fputs("PREISE\n", F); fputs("PREISE\n", F);
while (dmd) { while (dmd) {
fprintf(F, "%d;%s\n", (dmd->value const char * ch = resourcename(dmd->type->itype->rtype, 0);
? dmd->value*dmd->type->price fprintf(F, "%d;%s\n", (dmd->value
: -dmd->type->price), ? dmd->value*dmd->type->price
locale_string(f->locale, resourcename(dmd->type->itype->rtype, 0))); : -dmd->type->price),
add_translation(ch, locale_string(f->locale, ch)));
dmd=dmd->next; dmd=dmd->next;
} }
} }
@ -1009,4 +1101,6 @@ report_computer(FILE * F, faction * f)
} /* region traversal */ } /* region traversal */
} }
report_crtypes(F, f->locale); report_crtypes(F, f->locale);
write_translations(F);
reset_translations();
} }

View file

@ -733,7 +733,7 @@ giveunit(region * r, unit * u, unit * u2, strlist * S)
* HELFE, PASSWORT, STIRB (Katja) */ * HELFE, PASSWORT, STIRB (Katja) */
for (S = u->orders; S; S = S->next) { for (S = u->orders; S; S = S->next) {
switch (igetkeyword(S->s)) { switch (igetkeyword(S->s, u->faction->locale)) {
case K_BIETE: case K_BIETE:
case K_RESEARCH: case K_RESEARCH:
case K_BUY: case K_BUY:
@ -791,7 +791,7 @@ dogive(region * r, unit * u, strlist * S, boolean liefere)
s = getstrtoken(); s = getstrtoken();
if (findparam(s) == P_CONTROL) { if (findparam(s, u->faction->locale) == P_CONTROL) {
if (!u2) { if (!u2) {
cmistake(u, S->s, notfound_error, MSG_EVENT); cmistake(u, S->s, notfound_error, MSG_EVENT);
return; return;
@ -849,7 +849,7 @@ dogive(region * r, unit * u, strlist * S, boolean liefere)
} }
/* Übergabe aller Kräuter */ /* Übergabe aller Kräuter */
if (findparam(s) == P_HERBS) { if (findparam(s, u->faction->locale) == P_HERBS) {
if (!(race[u->race].ec_flags & GIVEITEM)) { if (!(race[u->race].ec_flags & GIVEITEM)) {
sprintf(buf, "%s geben nichts weg", race[u->race].name[1]); sprintf(buf, "%s geben nichts weg", race[u->race].name[1]);
mistake(u, S->s, buf, MSG_COMMERCE); mistake(u, S->s, buf, MSG_COMMERCE);
@ -876,12 +876,12 @@ dogive(region * r, unit * u, strlist * S, boolean liefere)
if (!n) cmistake(u, S->s, 38, MSG_COMMERCE); if (!n) cmistake(u, S->s, 38, MSG_COMMERCE);
return; return;
} }
if (findparam(s) == P_ZAUBER) { /* Uebergebe alle Sprüche */ if (findparam(s, u->faction->locale) == P_ZAUBER) { /* Uebergebe alle Sprüche */
cmistake(u, S->s, 7, MSG_COMMERCE); cmistake(u, S->s, 7, MSG_COMMERCE);
/* geht nimmer */ /* geht nimmer */
return; return;
} }
if (findparam(s) == P_UNIT) { /* Einheiten uebergeben */ if (findparam(s, u->faction->locale) == P_UNIT) { /* Einheiten uebergeben */
if (!(race[u->race].ec_flags & GIVEUNIT)) { if (!(race[u->race].ec_flags & GIVEUNIT)) {
cmistake(u, S->s, 167, MSG_COMMERCE); cmistake(u, S->s, 167, MSG_COMMERCE);
return; return;
@ -894,7 +894,7 @@ dogive(region * r, unit * u, strlist * S, boolean liefere)
giveunit(r, u, u2, S); giveunit(r, u, u2, S);
return; return;
} }
if (findparam(s) == P_ANY) { /* Alle Gegenstände übergeben */ if (findparam(s, u->faction->locale) == P_ANY) { /* Alle Gegenstände übergeben */
char * s = getstrtoken(); char * s = getstrtoken();
const resource_type * rtype = findresourcetype(s, u->faction->locale); const resource_type * rtype = findresourcetype(s, u->faction->locale);
if (rtype!=NULL) { if (rtype!=NULL) {
@ -923,7 +923,7 @@ dogive(region * r, unit * u, strlist * S, boolean liefere)
} }
return; return;
} }
i = findparam(s); i = findparam(s, u->faction->locale);
if (i == P_PERSON) { if (i == P_PERSON) {
if (!(race[u->race].ec_flags & GIVEPERSON)) { if (!(race[u->race].ec_flags & GIVEPERSON)) {
sprintf(buf, "%s können nicht neu gruppiert werden.", unitname(u)); sprintf(buf, "%s können nicht neu gruppiert werden.", unitname(u));
@ -934,16 +934,6 @@ dogive(region * r, unit * u, strlist * S, boolean liefere)
givemen(n, u, u2, S); givemen(n, u, u2, S);
return; return;
} }
if (i == P_SILVER) {
if ((race[u->race].ec_flags & HOARDMONEY)) {
sprintf(buf, "%s geben kein Silber weg.", race[u->race].name[1]);
mistake(u, S->s, buf, MSG_COMMERCE);
return;
}
n = get_resource(u, R_SILVER) - get_resvalue(u, R_SILVER);
givesilver(n, u, r, u2, S);
return;
}
if (!(race[u->race].ec_flags & GIVEITEM)) { if (!(race[u->race].ec_flags & GIVEITEM)) {
sprintf(buf, "%s geben nichts weg.", race[u->race].name[1]); sprintf(buf, "%s geben nichts weg.", race[u->race].name[1]);
@ -977,7 +967,7 @@ dogive(region * r, unit * u, strlist * S, boolean liefere)
return; return;
} }
} }
i = findparam(s); i = findparam(s, u->faction->locale);
if (i == P_PERSON) { if (i == P_PERSON) {
if (!(race[u->race].ec_flags & GIVEPERSON)) { if (!(race[u->race].ec_flags & GIVEPERSON)) {
sprintf(buf, "%s können nicht neu gruppiert werden.", unitname(u)); sprintf(buf, "%s können nicht neu gruppiert werden.", unitname(u));
@ -987,15 +977,6 @@ dogive(region * r, unit * u, strlist * S, boolean liefere)
givemen(n, u, u2, S); givemen(n, u, u2, S);
return; return;
} }
if (i == P_SILVER) {
if ((race[u->race].ec_flags & HOARDMONEY)) {
sprintf(buf, "%s geben kein Silber weg.", race[u->race].name[1]);
mistake(u, S->s, buf, MSG_COMMERCE);
return;
}
givesilver(n, u, r, u2, S);
return;
}
if (!(race[u->race].ec_flags & GIVEITEM)) { if (!(race[u->race].ec_flags & GIVEITEM)) {
sprintf(buf, "%s geben nichts weg.", race[u->race].name[1]); sprintf(buf, "%s geben nichts weg.", race[u->race].name[1]);
@ -1018,9 +999,9 @@ forgetskill(unit * u)
s = getstrtoken(); s = getstrtoken();
if ((talent = findskill(s)) != NOSKILL) { if ((talent = findskill(s, u->faction->locale)) != NOSKILL) {
set_skill(u, talent, 0); set_skill(u, talent, 0);
/* sprintf(buf, "%s vergißt das Talent %s.", unitname(u), skillnames[talent]); */ /* sprintf(buf, "%s vergißt das Talent %s.", u, talent); */
add_message(&u->faction->msgs, new_message(u->faction, add_message(&u->faction->msgs, new_message(u->faction,
"forget%u:unit%t:skill", u, talent)); "forget%u:unit%t:skill", u, talent));
} }
@ -1259,7 +1240,7 @@ economics(void)
for (u = r->units; u; u = u->next) { for (u = r->units; u; u = u->next) {
for (S = u->orders; S; S = S->next) { for (S = u->orders; S; S = S->next) {
switch (igetkeyword(S->s)) { switch (igetkeyword(S->s, u->faction->locale)) {
case K_DESTROY: case K_DESTROY:
destroy(r, u, S->s); destroy(r, u, S->s);
@ -1285,7 +1266,7 @@ economics(void)
for (u = r->units; u; u = u->next) { for (u = r->units; u; u = u->next) {
for (S = u->orders; S; S = S->next) { for (S = u->orders; S; S = S->next) {
if (igetkeyword(S->s) == K_RECRUIT) { if (igetkeyword(S->s, u->faction->locale) == K_RECRUIT) {
recruit(r, u, S, &recruitorders); recruit(r, u, S, &recruitorders);
break; break;
} }
@ -1323,14 +1304,13 @@ manufacture(unit * u, const item_type * itype, int want)
n = build(u, itype->construction, 0, want); n = build(u, itype->construction, 0, want);
switch (n) { switch (n) {
case ENEEDSKILL: case ENEEDSKILL:
sprintf(buf, "dazu braucht man das Talent %s", skillnames[sk]); add_message(&u->faction->msgs,
mistake(u, u->thisorder, buf, MSG_PRODUCE); msg_error(u, u->thisorder, "skill_needed", "skill", sk));
return; return;
case ELOWSKILL: case ELOWSKILL:
sprintf(buf, "man benötigt mindestens %s %d, um %s zu machen", add_message(&u->faction->msgs,
skillnames[sk], msg_error(u, u->thisorder, "manufacture_skills", "skill minskill product",
minskill, locale_string(u->faction->locale, resourcename(itype->rtype, 1))); sk, minskill, itype->rtype, 1));
mistake(u, u->thisorder, buf, MSG_PRODUCE);
return; return;
case ENOMATERIALS: case ENOMATERIALS:
/* something missing from the list of materials */ /* something missing from the list of materials */
@ -1457,17 +1437,16 @@ allocate_resource(unit * u, const resource_type * rtype, int want)
assert(itype->construction->skill!=0 || "limited resource needs a required skill for making it"); assert(itype->construction->skill!=0 || "limited resource needs a required skill for making it");
skill = eff_skill(u, itype->construction->skill, u->region); skill = eff_skill(u, itype->construction->skill, u->region);
if (skill == 0) { if (skill == 0) {
sprintf(buf, "dazu braucht man das Talent %s", skill_t sk = itype->construction->skill;
skillnames[itype->construction->skill]); add_message(&u->faction->msgs,
mistake(u, u->thisorder, buf, MSG_PRODUCE); msg_error(u, u->thisorder, "skill_needed", "skill", sk));
return; return;
} }
if (skill < itype->construction->minskill) { if (skill < itype->construction->minskill) {
const char * iname = locale_string(u->faction->locale, resourcename(itype->rtype, 1)); skill_t sk = itype->construction->skill;
sprintf(buf, "man benötigt mindestens %s %d, um %s zu machen", add_message(&u->faction->msgs,
skillnames[itype->construction->skill], msg_error(u, u->thisorder, "manufacture_skills", "skill minskill product",
itype->construction->minskill, iname); sk, itype->construction->minskill, itype->rtype));
mistake(u, u->thisorder, buf, MSG_PRODUCE);
return; return;
} else { } else {
struct building * b = inside_building(u); struct building * b = inside_building(u);
@ -1683,7 +1662,7 @@ make(region * r, unit * u)
m = INT_MAX; m = INT_MAX;
} }
p = findparam(s); p = findparam(s, u->faction->locale);
/* MACHE TEMP kann hier schon gar nicht auftauchen, weil diese nicht in /* MACHE TEMP kann hier schon gar nicht auftauchen, weil diese nicht in
* thisorder abgespeichert werden - und auf den ist getstrtoken() beim * thisorder abgespeichert werden - und auf den ist getstrtoken() beim
@ -2142,7 +2121,7 @@ sell(region * r, unit * u, request ** sellorders, const char * cmd)
* (das geld der region) aufgebraucht wird. */ * (das geld der region) aufgebraucht wird. */
s = getstrtoken(); s = getstrtoken();
if (findparam(s) == P_ANY) { if (findparam(s, u->faction->locale) == P_ANY) {
n = (rpeasants(r) - rpeasants(r) / RECRUITFRACTION) / TRADE_FRACTION; n = (rpeasants(r) - rpeasants(r) / RECRUITFRACTION) / TRADE_FRACTION;
if (rterrain(r) == T_DESERT && buildingtype_exists(r, &bt_caravan)) if (rterrain(r) == T_DESERT && buildingtype_exists(r, &bt_caravan))
n *= 2; n *= 2;
@ -2348,7 +2327,7 @@ zuechte(region *r, unit *u)
int n, c; int n, c;
int gezuechtet = 0; int gezuechtet = 0;
if (getparam() == P_HERBS) { if (getparam(u->faction->locale) == P_HERBS) {
plant(r, u); plant(r, u);
return; return;
} else { } else {
@ -2404,7 +2383,7 @@ research(region *r, unit *u)
s = getstrtoken(); s = getstrtoken();
if (findparam(s) == P_HERBS) { if (findparam(s, u->faction->locale) == P_HERBS) {
if (eff_skill(u, SK_HERBALISM, r) < 7) { if (eff_skill(u, SK_HERBALISM, r) < 7) {
cmistake(u, u->thisorder, 227, MSG_EVENT); cmistake(u, u->thisorder, 227, MSG_EVENT);
@ -2839,7 +2818,7 @@ produce(void)
} }
for (s=u->orders;s;s=s->next) { for (s=u->orders;s;s=s->next) {
todo = igetkeyword(s->s); todo = igetkeyword(s->s, u->faction->locale);
switch (todo) { switch (todo) {
case K_BUY: case K_BUY:
buy(r, u, &buyorders, s->s); buy(r, u, &buyorders, s->s);
@ -2859,7 +2838,7 @@ produce(void)
continue; continue;
} }
todo = igetkeyword(u->thisorder); todo = igetkeyword(u->thisorder, u->faction->locale);
if (todo == NOKEYWORD) continue; if (todo == NOKEYWORD) continue;
if (rterrain(r) == T_OCEAN && u->race != RC_AQUARIAN && if (rterrain(r) == T_OCEAN && u->race != RC_AQUARIAN &&

View file

@ -1,6 +1,6 @@
/* vi: set ts=2: /* vi: set ts=2:
* *
* *
* Eressea PB(E)M host Copyright (C) 1998-2000 * Eressea PB(E)M host Copyright (C) 1998-2000
* Christian Schlittchen (corwin@amber.kn-bremen.de) * Christian Schlittchen (corwin@amber.kn-bremen.de)
* Katja Zedel (katze@felidae.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de)
@ -29,6 +29,13 @@
# include "old/trigger.h" # include "old/trigger.h"
#endif #endif
/* gamecode includes */
#include "creation.h"
#include "economy.h"
#include "monster.h"
#include "randenc.h"
#include "study.h"
/* kernel includes */ /* kernel includes */
#include <alchemy.h> #include <alchemy.h>
#include <border.h> #include <border.h>
@ -40,7 +47,6 @@
#include <ship.h> #include <ship.h>
#include <skill.h> #include <skill.h>
#include <movement.h> #include <movement.h>
#include <monster.h>
#include <spy.h> #include <spy.h>
#include <race.h> #include <race.h>
#include <battle.h> #include <battle.h>
@ -52,12 +58,6 @@
#include <building.h> #include <building.h>
#include <group.h> #include <group.h>
/* gamecode includes */
#include "study.h"
#include "economy.h"
#include "creation.h"
#include "randenc.h"
/* attributes includes */ /* attributes includes */
#include <attributes/racename.h> #include <attributes/racename.h>
@ -898,7 +898,7 @@ quit(void)
for (r = regions; r; r = r->next) for (r = regions; r; r = r->next)
for (u = r->units; u; u = u->next) for (u = r->units; u; u = u->next)
for (S = u->orders; S; S = S->next) for (S = u->orders; S; S = S->next)
if (igetkeyword(S->s) == K_QUIT) { if (igetkeyword(S->s, u->faction->locale) == K_QUIT) {
if (strcmp(getstrtoken(), u->faction->passw) == 0) { if (strcmp(getstrtoken(), u->faction->passw) == 0) {
destroyfaction(u->faction); destroyfaction(u->faction);
} else { } else {
@ -906,7 +906,7 @@ quit(void)
printf(" Warnung: STIRB mit falschem Passwort für Partei %s: %s\n", printf(" Warnung: STIRB mit falschem Passwort für Partei %s: %s\n",
factionid(u->faction), S->s); factionid(u->faction), S->s);
} }
} else if(igetkeyword(S->s) == K_RESTART && u->number > 0) { } else if(igetkeyword(S->s, u->faction->locale) == K_RESTART && u->number > 0) {
if (!landregion(rterrain(r))) { if (!landregion(rterrain(r))) {
cmistake(u, S->s, 242, MSG_EVENT); cmistake(u, S->s, 242, MSG_EVENT);
continue; continue;
@ -996,7 +996,7 @@ set_ally(unit * u, strlist * S)
if (!s[0]) if (!s[0])
keyword = P_ANY; keyword = P_ANY;
else else
keyword = findparam(s); keyword = findparam(s, u->faction->locale);
sfp = &u->faction->allies; sfp = &u->faction->allies;
#ifdef GROUPS #ifdef GROUPS
@ -1009,7 +1009,7 @@ set_ally(unit * u, strlist * S)
if (sf->faction == f) if (sf->faction == f)
break; /* Gleich die passende raussuchen, wenn vorhanden */ break; /* Gleich die passende raussuchen, wenn vorhanden */
not_kw = getparam(); /* HELFE partei [modus] NICHT */ not_kw = getparam(u->faction->locale); /* HELFE partei [modus] NICHT */
if (!sf) { if (!sf) {
if (keyword == P_NOT || not_kw == P_NOT) { if (keyword == P_NOT || not_kw == P_NOT) {
@ -1024,7 +1024,6 @@ set_ally(unit * u, strlist * S)
} }
switch (keyword) { switch (keyword) {
case P_NOT: case P_NOT:
case P_NEUTRAL:
sf->status = 0; sf->status = 0;
break; break;
@ -1032,7 +1031,6 @@ set_ally(unit * u, strlist * S)
cmistake(u, S->s, 137, MSG_EVENT); cmistake(u, S->s, 137, MSG_EVENT);
return; return;
case P_FRIEND:
case P_ANY: case P_ANY:
if (not_kw == P_NOT) if (not_kw == P_NOT)
sf->status = 0; sf->status = 0;
@ -1091,7 +1089,7 @@ set_display(region * r, unit * u, strlist * S)
s = 0; s = 0;
switch (getparam()) { switch (getparam(u->faction->locale)) {
case P_BUILDING: case P_BUILDING:
case P_GEBAEUDE: case P_GEBAEUDE:
if (!u->building) { if (!u->building) {
@ -1191,11 +1189,11 @@ set_name(region * r, unit * u, strlist * S)
s = 0; s = 0;
p = getparam(); p = getparam(u->faction->locale);
if(p == P_FOREIGN) { if(p == P_FOREIGN) {
foreign = true; foreign = true;
p = getparam(); p = getparam(u->faction->locale);
} }
switch (p) { switch (p) {
@ -1456,7 +1454,7 @@ distributeMail(region * r, unit * u, strlist * S)
if(strcasecmp(s, "an") == 0) if(strcasecmp(s, "an") == 0)
s = getstrtoken(); s = getstrtoken();
switch (findparam(s)) { switch (findparam(s, u->faction->locale)) {
case P_REGION: /* können alle Einheiten in der Region sehen */ case P_REGION: /* können alle Einheiten in der Region sehen */
s = getstrtoken(); s = getstrtoken();
@ -1514,7 +1512,7 @@ distributeMail(region * r, unit * u, strlist * S)
} }
if(see == false) { if(see == false) {
cmistake(u, S->s, 63, MSG_MESSAGE); cmistake(u, S->s, 64, MSG_MESSAGE);
return; return;
} }
@ -1602,7 +1600,7 @@ mail(void)
for (r = regions; r; r = r->next) for (r = regions; r; r = r->next)
for (u = r->units; u; u = u->next) for (u = r->units; u; u = u->next)
for (S = u->orders; S; S = S->next) for (S = u->orders; S; S = S->next)
if (igetkeyword(S->s) == K_MAIL) if (igetkeyword(S->s, u->faction->locale) == K_MAIL)
distributeMail(r, u, S); distributeMail(r, u, S);
} }
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
@ -1641,7 +1639,7 @@ set_passw(void)
for (r = regions; r; r = r->next) for (r = regions; r; r = r->next)
for (u = r->units; u; u = u->next) for (u = r->units; u; u = u->next)
for (S = u->orders; S; S = S->next) { for (S = u->orders; S; S = S->next) {
switch (igetkeyword(S->s)) { switch (igetkeyword(S->s, u->faction->locale)) {
case NOKEYWORD: case NOKEYWORD:
cmistake(u, S->s, 22, MSG_EVENT); cmistake(u, S->s, 22, MSG_EVENT);
break; break;
@ -1716,23 +1714,6 @@ set_passw(void)
} }
break; break;
case K_LOCALE:
s = getstrtoken();
#define LOCALES
#ifdef LOCALES
if (find_locale(s)) {
u->faction->locale = find_locale(s);
} else {
cmistake(u, S->s, 257, MSG_EVENT);
}
#else
if(strcmp(s, "de") == 0) {
u->faction->locale = find_locale(s);
} else {
cmistake(u, S->s, 257, MSG_EVENT);
}
#endif
break;
case K_SEND: case K_SEND:
s = getstrtoken(); s = getstrtoken();
o = findoption(s); o = findoption(s);
@ -1763,7 +1744,7 @@ set_passw(void)
cmistake(u, S->s, 135, MSG_EVENT); cmistake(u, S->s, 135, MSG_EVENT);
} else { } else {
i = (int) pow(2, o); i = (int) pow(2, o);
if (getparam() == P_NOT) { if (getparam(u->faction->locale) == P_NOT) {
u->faction->options = u->faction->options & ~i; u->faction->options = u->faction->options & ~i;
} else { } else {
u->faction->options = u->faction->options | i; u->faction->options = u->faction->options | i;
@ -1814,14 +1795,20 @@ display_item(faction *f, unit *u, const item_type * itype)
const char *name; const char *name;
if (u && *i_find(&u->items, itype) == NULL) return false; if (u && *i_find(&u->items, itype) == NULL) return false;
name = locale_string(NULL, resourcename(itype->rtype, 0)); name = resourcename(itype->rtype, 0);
sprintf(filename, "%s/%s/items/%s", resourcepath(), locale_name(f->locale), name); sprintf(filename, "%s/%s/items/%s", resourcepath(), locale_name(f->locale), name);
fp = fopen(filename, "r"); fp = fopen(filename, "r");
if (!fp) { if (!fp) {
sprintf(filename, "%s/%s/items/%s", resourcepath(), locale_name(NULL), name); name = locale_string(f->locale, resourcename(itype->rtype, 0));
sprintf(filename, "%s/%s/items/%s", resourcepath(), locale_name(f->locale), name);
fp = fopen(filename, "r"); fp = fopen(filename, "r");
if (!fp) return false;
} }
if (!fp) {
name = resourcename(itype->rtype, 0);
sprintf(filename, "%s/items/%s", resourcepath(), name);
fp = fopen(filename, "r");
}
if (!fp) return false;
sprintf(buf, "%s: ", name); sprintf(buf, "%s: ", name);
@ -1937,14 +1924,14 @@ instant_orders(void)
#ifdef GROUPS #ifdef GROUPS
for (S = u->orders; S; S = S->next) for (S = u->orders; S; S = S->next)
{ {
if (igetkeyword(S->s)==K_GROUP) { if (igetkeyword(S->s, u->faction->locale)==K_GROUP) {
set_group(u); set_group(u);
} }
} }
#endif #endif
for (S = u->orders; S; S = S->next) for (S = u->orders; S; S = S->next)
switch (igetkeyword(S->s)) { switch (igetkeyword(S->s, u->faction->locale)) {
case K_URSPRUNG: case K_URSPRUNG:
{ {
int px, py; int px, py;
@ -1966,7 +1953,7 @@ instant_orders(void)
case K_STATUS: case K_STATUS:
param = getstrtoken(); param = getstrtoken();
switch (findparam(param)) { switch (findparam(param, u->faction->locale)) {
case P_NOT: case P_NOT:
u->status = ST_AVOID; u->status = ST_AVOID;
break; break;
@ -1993,7 +1980,7 @@ instant_orders(void)
#ifdef NOAID #ifdef NOAID
case P_HELP: case P_HELP:
param = getstrtoken(); param = getstrtoken();
if(findparam(param) == P_NOT) { if(findparam(param, u->faction->locale) == P_NOT) {
fset(u, FL_NOAID); fset(u, FL_NOAID);
} else { } else {
fset(u, FL_NOAID); fset(u, FL_NOAID);
@ -2017,13 +2004,13 @@ instant_orders(void)
s = getstrtoken(); s = getstrtoken();
/* KAMPFZAUBER [NICHT] löscht alle gesetzten Kampfzauber */ /* KAMPFZAUBER [NICHT] löscht alle gesetzten Kampfzauber */
if (!s || *s == 0 || findparam(s) == P_NOT) { if (!s || *s == 0 || findparam(s, u->faction->locale) == P_NOT) {
unset_combatspell(u, 0); unset_combatspell(u, 0);
break; break;
} }
/* Optional: STUFE n */ /* Optional: STUFE n */
if (findparam(s) == P_LEVEL) { if (findparam(s, u->faction->locale) == P_LEVEL) {
/* Merken, setzen kommt erst später */ /* Merken, setzen kommt erst später */
s = getstrtoken(); s = getstrtoken();
level = atoi(s); level = atoi(s);
@ -2041,7 +2028,7 @@ instant_orders(void)
/* KAMPFZAUBER "<Spruchname>" NICHT löscht diesen speziellen /* KAMPFZAUBER "<Spruchname>" NICHT löscht diesen speziellen
* Kampfzauber */ * Kampfzauber */
s = getstrtoken(); s = getstrtoken();
if(findparam(s) == P_NOT){ if(findparam(s, u->faction->locale) == P_NOT){
unset_combatspell(u,spell); unset_combatspell(u,spell);
break; break;
} }
@ -2062,15 +2049,15 @@ instant_orders(void)
cmistake(u, S->s, 223, MSG_EVENT); cmistake(u, S->s, 223, MSG_EVENT);
break; break;
} }
if (getparam() == P_NOT) if (getparam(u->faction->locale) == P_NOT)
setguard(u, GUARD_NONE); setguard(u, GUARD_NONE);
break; break;
case K_RESHOW: case K_RESHOW:
s = getstrtoken(); s = getstrtoken();
if(findparam(s) == P_ANY) { if(findparam(s, u->faction->locale) == P_ANY) {
param_t p = getparam(); param_t p = getparam(u->faction->locale);
if(p == P_ZAUBER) { if(p == P_ZAUBER) {
a_removeall(&u->faction->attribs, &at_seenspell); a_removeall(&u->faction->attribs, &at_seenspell);
@ -2152,7 +2139,7 @@ bewache_an(void)
for (u = r->units; u; u = u->next) for (u = r->units; u; u = u->next)
if (!fval(u, FL_MOVED)) { if (!fval(u, FL_MOVED)) {
for (S = u->orders; S; S = S->next) { for (S = u->orders; S; S = S->next) {
if (igetkeyword(S->s) == K_GUARD && getparam() != P_NOT) { if (igetkeyword(S->s, u->faction->locale) == K_GUARD && getparam(u->faction->locale) != P_NOT) {
if (rterrain(r) != T_OCEAN) { if (rterrain(r) != T_OCEAN) {
if (!illusionary(u) && u->race != RC_SPELL) { if (!illusionary(u) && u->race != RC_SPELL) {
#ifdef WACH_WAFF #ifdef WACH_WAFF
@ -2297,9 +2284,9 @@ reorder(void)
if (!fval(u, FL_MARK)) { if (!fval(u, FL_MARK)) {
strlist * o; strlist * o;
for (o=u->orders;o;o=o->next) { for (o=u->orders;o;o=o->next) {
if (igetkeyword(o->s)==K_SORT) { if (igetkeyword(o->s, u->faction->locale)==K_SORT) {
const char * s = getstrtoken(); const char * s = getstrtoken();
param_t p = findparam(s); param_t p = findparam(s, u->faction->locale);
int id = getid(); int id = getid();
unit **vp, *v = findunit(id); unit **vp, *v = findunit(id);
if (v==NULL || v->faction!=u->faction || v->region!=r) { if (v==NULL || v->faction!=u->faction || v->region!=r) {
@ -2354,9 +2341,9 @@ renumber(void)
for (r=regions;r;r=r->next) { for (r=regions;r;r=r->next) {
for (u=r->units;u;u=u->next) { for (u=r->units;u;u=u->next) {
faction * f = u->faction; faction * f = u->faction;
for (S = u->orders; S; S = S->next) if (igetkeyword(S->s)==K_NUMBER) { for (S = u->orders; S; S = S->next) if (igetkeyword(S->s, u->faction->locale)==K_NUMBER) {
s = getstrtoken(); s = getstrtoken();
switch(findparam(s)) { switch(findparam(s, u->faction->locale)) {
case P_FACTION: case P_FACTION:
s = getstrtoken(); s = getstrtoken();
@ -2549,7 +2536,7 @@ new_units (void)
for (r = regions; r; r = r->next) for (r = regions; r; r = r->next)
for (u = r->units; u; u = u->next) for (u = r->units; u; u = u->next)
for (S = u->orders; S;) { for (S = u->orders; S;) {
if ((igetkeyword(S->s) == K_MAKE) && (getparam() == P_TEMP)) { if ((igetkeyword(S->s, u->faction->locale) == K_MAKE) && (getparam(u->faction->locale) == P_TEMP)) {
const attrib * a; const attrib * a;
int g; int g;
char * name; char * name;
@ -2563,7 +2550,7 @@ new_units (void)
S = S->next; S = S->next;
while (S) { while (S) {
if (igetkeyword(S->s) == K_END) if (igetkeyword(S->s, u->faction->locale) == K_END)
break; break;
S2 = S->next; S2 = S->next;
removelist(&u->orders, S); removelist(&u->orders, S);
@ -2604,7 +2591,7 @@ new_units (void)
S = S->next; S = S->next;
while (S) { while (S) {
if (igetkeyword(S->s) == K_END) if (igetkeyword(S->s, u->faction->locale) == K_END)
break; break;
S2 = S->next; S2 = S->next;
translist(&u->orders, &u2->orders, S); translist(&u->orders, &u2->orders, S);
@ -2635,7 +2622,7 @@ setdefaults (void)
set_string(&u->thisorder, u->lastorder); set_string(&u->thisorder, u->lastorder);
for(S = u->orders; S; S = S->next) { for(S = u->orders; S; S = S->next) {
keyword_t keyword = igetkeyword(S->s); keyword_t keyword = igetkeyword(S->s, u->faction->locale);
switch (keyword) { switch (keyword) {
@ -2656,7 +2643,7 @@ setdefaults (void)
* abgespeichert). */ * abgespeichert). */
case K_MAKE: case K_MAKE:
if (getparam() == P_TEMP) break; if (getparam(u->faction->locale) == P_TEMP) break;
case K_BESIEGE: case K_BESIEGE:
case K_ENTERTAIN: case K_ENTERTAIN:
case K_RESEARCH: case K_RESEARCH:
@ -2670,7 +2657,7 @@ setdefaults (void)
case K_BIETE: case K_BIETE:
case K_PIRACY: case K_PIRACY:
if (idle (u->faction)) { if (idle (u->faction)) {
set_string (&u->thisorder, keywords[K_WORK]); set_string (&u->thisorder, locale_string(u->faction->locale, keywords[K_WORK]));
break; break;
} }
/* Ab hier Befehle, die auch eine idle /* Ab hier Befehle, die auch eine idle
@ -2683,7 +2670,7 @@ setdefaults (void)
case K_DRIVE: case K_DRIVE:
case K_MOVE: case K_MOVE:
if(fval(u, FL_HUNGER)) { if(fval(u, FL_HUNGER)) {
set_string(&u->thisorder, keywords[K_WORK]); set_string(&u->thisorder, locale_string(u->faction->locale, keywords[K_WORK]));
} else { } else {
set_string(&u->thisorder, S->s); set_string(&u->thisorder, S->s);
} }
@ -2711,7 +2698,7 @@ setdefaults (void)
* die Einheitsnummer ungueltig). Auch Attackiere sollte nie in * die Einheitsnummer ungueltig). Auch Attackiere sollte nie in
* den Default übernommen werden */ * den Default übernommen werden */
switch (igetkeyword (u->thisorder)) { switch (igetkeyword (u->thisorder, u->faction->locale)) {
case K_MOVE: case K_MOVE:
case K_BIETE: case K_BIETE:
case K_ATTACK: case K_ATTACK:
@ -2721,8 +2708,8 @@ setdefaults (void)
set_string(&u->lastorder, u->thisorder); set_string(&u->lastorder, u->thisorder);
} }
/* Attackiere sollte niemals Default werden */ /* Attackiere sollte niemals Default werden */
if (igetkeyword(u->lastorder) == K_ATTACK) if (igetkeyword(u->lastorder, u->faction->locale) == K_ATTACK)
set_string(&u->lastorder, keywords[K_WORK]); set_string(&u->lastorder, locale_string(u->faction->locale, keywords[K_WORK]));
} }
} }
@ -2838,7 +2825,7 @@ defaultorders (void)
list_foreach(region, regions, r) { list_foreach(region, regions, r) {
list_foreach(unit, r->units, u) { list_foreach(unit, r->units, u) {
list_foreach(strlist, u->orders, s) { list_foreach(strlist, u->orders, s) {
switch (igetkeyword(s->s)) { switch (igetkeyword(s->s, u->faction->locale)) {
case K_DEFAULT: case K_DEFAULT:
c = getstrtoken(); c = getstrtoken();
i = atoi(c); i = atoi(c);
@ -2849,11 +2836,11 @@ defaultorders (void)
s->s[0]=0; s->s[0]=0;
break; break;
case 1 : case 1 :
sprintf(buf, "%s \"%s\"", keywords[K_DEFAULT], getstrtoken()); sprintf(buf, "%s \"%s\"", locale_string(u->faction->locale, keywords[K_DEFAULT]), getstrtoken());
set_string(&s->s, buf); set_string(&s->s, buf);
break; break;
default : default :
sprintf(buf, "%s %d \"%s\"", keywords[K_DEFAULT], i-1, getstrtoken()); sprintf(buf, "%s %d \"%s\"", locale_string(u->faction->locale, keywords[K_DEFAULT]), i-1, getstrtoken());
set_string(&s->s, buf); set_string(&s->s, buf);
break; break;
} }
@ -2925,7 +2912,7 @@ processorders (void)
for (r = regions; r; r = r->next) { for (r = regions; r; r = r->next) {
for (u = r->units; u; u = u->next) { for (u = r->units; u; u = u->next) {
for (S = u->orders; S; S = S->next) { for (S = u->orders; S; S = S->next) {
if (igetkeyword(S->s) == K_USE) { if (igetkeyword(S->s, u->faction->locale) == K_USE) {
char * t = getstrtoken(); char * t = getstrtoken();
const item_type * itype = finditemtype(t, u->faction->locale); const item_type * itype = finditemtype(t, u->faction->locale);

View file

@ -1,6 +1,6 @@
/* vi: set ts=2: /* vi: set ts=2:
* *
* *
* Eressea PB(E)M host Copyright (C) 1998-2000 * Eressea PB(E)M host Copyright (C) 1998-2000
* Christian Schlittchen (corwin@amber.kn-bremen.de) * Christian Schlittchen (corwin@amber.kn-bremen.de)
* Katja Zedel (katze@felidae.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de)
@ -21,22 +21,25 @@
#include <config.h> #include <config.h>
#include "eressea.h" #include "eressea.h"
#include "item.h"
#include "monster.h" #include "monster.h"
#include "reports.h"
#include "message.h"
#include "region.h"
#include "economy.h" #include "economy.h"
#include "faction.h"
#include "movement.h" /* kernel includes */
#include "race.h" #include <item.h>
#include "magic.h" #include <reports.h>
#include "build.h" #include <message.h>
#include "pool.h" #include <region.h>
#include "names.h" #include <faction.h>
#include "unit.h" #include <movement.h>
#include "pathfinder.h" #include <race.h>
#include <magic.h>
#include <skill.h>
#include <build.h>
#include <pool.h>
#include <names.h>
#include <unit.h>
#include <pathfinder.h>
/* util includes */ /* util includes */
#include <attrib.h> #include <attrib.h>
@ -95,7 +98,7 @@ monster_attack(unit * u, const unit * target)
if (is_waiting(u)) return false; if (is_waiting(u)) return false;
sprintf(zText, "%s %s", sprintf(zText, "%s %s",
keywords[K_ATTACK], unitid(target)); locale_string(u->faction->locale, keywords[K_ATTACK]), unitid(target));
S = makestrlist(zText); S = makestrlist(zText);
addlist(&u->orders, S); addlist(&u->orders, S);
return true; return true;
@ -106,7 +109,7 @@ taxed_by_monster(unit * u)
{ {
strlist *S; strlist *S;
S = makestrlist(keywords[K_TAX]); S = makestrlist(locale_string(u->faction->locale, keywords[K_TAX]));
addlist(&u->orders, S); addlist(&u->orders, S);
} }
@ -348,7 +351,7 @@ move_monster(region * r, unit * u)
if (d == NODIRECTION) if (d == NODIRECTION)
return; return;
sprintf(buf, "%s %s", keywords[K_MOVE], directions[d]); sprintf(buf, "%s %s", locale_string(u->faction->locale, keywords[K_MOVE]), locale_string(u->faction->locale, directions[d]));
S = makestrlist(buf); S = makestrlist(buf);
S->next = u->orders; S->next = u->orders;
@ -438,7 +441,7 @@ set_movement_order(unit * u, const region * target, int moves, boolean (*allowed
return false; return false;
} }
strcpy(buf, keywords[K_MOVE]); strcpy(buf, locale_string(u->faction->locale, keywords[K_MOVE]));
c = buf + strlen(buf); c = buf + strlen(buf);
while (position!=moves && plan[position+1]) { while (position!=moves && plan[position+1]) {
@ -447,7 +450,7 @@ set_movement_order(unit * u, const region * target, int moves, boolean (*allowed
direction_t dir = reldirection(prev, next); direction_t dir = reldirection(prev, next);
assert(dir!=NODIRECTION); assert(dir!=NODIRECTION);
*c++ = ' '; *c++ = ' ';
strcpy(c, directions[dir]); strcpy(c, locale_string(u->faction->locale, directions[dir]));
c += strlen(c); c += strlen(c);
} }
@ -530,7 +533,7 @@ monster_seeks_target(region *r, unit *u)
if( d == NODIRECTION ) if( d == NODIRECTION )
return; return;
sprintf(buf, "%s %s", keywords[K_MOVE], directions[d]); sprintf(buf, "%s %s", locale_string(u->faction->locale, keywords[K_MOVE]), locale_string(u->faction->locale, directions[d]));
SP = &u->orders; SP = &u->orders;
S = makestrlist(buf); S = makestrlist(buf);
addlist2(SP, S); addlist2(SP, S);
@ -605,14 +608,14 @@ random_attack_by_monster(const region * r, unit * u)
&& target != u && target != u
&& humanoid(target) && humanoid(target)
&& !illusionary(target) && !illusionary(target)
&& target->number <= max) && target->number <= max)
{ {
if (monster_attack(u, target)) { if (monster_attack(u, target)) {
unit * u2; unit * u2;
success = true; success = true;
for (u2 = r->units; u2; u2 = u2->next) { for (u2 = r->units; u2; u2 = u2->next) {
if (u2->faction->no == MONSTER_FACTION if (u2->faction->no == MONSTER_FACTION
&& rand() % 100 < 75) && rand() % 100 < 75)
{ {
monster_attack(u2, target); monster_attack(u2, target);
} }
@ -867,7 +870,8 @@ learn_monster(unit *u)
if(get_skill(u, sk) > 0) { if(get_skill(u, sk) > 0) {
c++; c++;
if(c == n) { if(c == n) {
sprintf(buf, "%s %s", keywords[K_STUDY], skillnames[sk]); sprintf(buf, "%s %s", locale_string(u->faction->locale, keywords[K_STUDY]),
skillname(sk, u->faction->locale));
set_string(&u->thisorder, buf); set_string(&u->thisorder, buf);
break; break;
} }
@ -943,7 +947,7 @@ plan_monsters(void)
if (ta && strncmp(u->lastorder, "WARTEN", 6) != 0) { if (ta && strncmp(u->lastorder, "WARTEN", 6) != 0) {
unit * tu = (unit *)ta->data.v; unit * tu = (unit *)ta->data.v;
if (tu && tu->region==r) { if (tu && tu->region==r) {
sprintf(buf, "%s %s", keywords[K_ATTACK], itoa36(tu->no)); sprintf(buf, "%s %s", locale_string(u->faction->locale, keywords[K_ATTACK]), itoa36(tu->no));
S = makestrlist(buf); S = makestrlist(buf);
addlist(&u->orders, S); addlist(&u->orders, S);
} else if (tu) { } else if (tu) {
@ -964,7 +968,7 @@ plan_monsters(void)
if (!(fval(u, FL_ISNEW)) && r->terrain != T_OCEAN) { /* Monster bewachen immer */ if (!(fval(u, FL_ISNEW)) && r->terrain != T_OCEAN) { /* Monster bewachen immer */
strlist *S; strlist *S;
S = makestrlist(keywords[K_GUARD]); S = makestrlist(locale_string(u->faction->locale, keywords[K_GUARD]));
addlist(&u->orders, S); addlist(&u->orders, S);
} }
@ -977,15 +981,15 @@ plan_monsters(void)
} else { } else {
boolean done = false; boolean done = false;
if((race[u->race].flags & RCF_ATTACKRANDOM) if((race[u->race].flags & RCF_ATTACKRANDOM)
&& rand()%100<MONSTERATTACK && rand()%100<MONSTERATTACK
&& is_moving == false) && is_moving == false)
{ {
done = random_attack_by_monster(r, u); done = random_attack_by_monster(r, u);
} }
if (!done) { if (!done) {
if(u->race == RC_SEASERPENT) { if(u->race == RC_SEASERPENT) {
set_string(&u->thisorder, keywords[K_PIRACY]); set_string(&u->thisorder, locale_string(u->faction->locale, keywords[K_PIRACY]));
set_string(&u->lastorder, keywords[K_PIRACY]); set_string(&u->lastorder, locale_string(u->faction->locale, keywords[K_PIRACY]));
} else if(race[u->race].flags & RCF_LEARN) { } else if(race[u->race].flags & RCF_LEARN) {
learn_monster(u); learn_monster(u);
} }

View file

@ -1,6 +1,6 @@
/* vi: set ts=2: /* vi: set ts=2:
* *
* *
* Eressea PB(E)M host Copyright (C) 1998-2000 * Eressea PB(E)M host Copyright (C) 1998-2000
* Christian Schlittchen (corwin@amber.kn-bremen.de) * Christian Schlittchen (corwin@amber.kn-bremen.de)
* Katja Zedel (katze@felidae.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de)

View file

@ -1025,8 +1025,8 @@ randomevents(void)
u->hp += unit_max_hp(u) * increase; u->hp += unit_max_hp(u) * increase;
add_message(&u->faction->msgs, new_message(u->faction, add_message(&u->faction->msgs, new_message(u->faction,
"orcgrowth%u:unit%i:amount%s:race", "orcgrowth%u:unit%i:amount%i:race",
u, increase, increase == 1 ? race[u->race].name[0] : race[u->race].name[1])); u, increase, u->race));
} }
} }
} }
@ -1095,7 +1095,8 @@ randomevents(void)
#if 0 #if 0
/* ist kaputt. weiß nicht, wieso. */ /* ist kaputt. weiß nicht, wieso. */
if (r==s) { if (r==s) {
sprintf(buf, "Durch Konzentrationsmangel vergißt %s das Talent %s vollständig", unitname(u), skillnames[sk]); sprintf(buf, "Durch Konzentrationsmangel vergißt %s das Talent %s vollständig",
unitname(u), skillname(u->faction->local, sk));
addmessage(0, u->faction, buf, MSG_EVENT, ML_IMPORTANT); addmessage(0, u->faction, buf, MSG_EVENT, ML_IMPORTANT);
} }
#endif #endif

View file

@ -1,6 +1,6 @@
/* vi: set ts=2: /* vi: set ts=2:
* *
* *
* Eressea PB(E)M host Copyright (C) 1998-2000 * Eressea PB(E)M host Copyright (C) 1998-2000
* Christian Schlittchen (corwin@amber.kn-bremen.de) * Christian Schlittchen (corwin@amber.kn-bremen.de)
* Katja Zedel (katze@felidae.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de)
@ -649,9 +649,9 @@ print_curses(FILE *F, const void * obj, typ_t typ, const attrib *a, int self, in
} }
} else if (a->type==&at_effect && self) { } else if (a->type==&at_effect && self) {
effect_data * data = (effect_data *)a->data.v; effect_data * data = (effect_data *)a->data.v;
sprintf(buf, "Auf der Einheit lieg%s %d Wirkung%s %s.", sprintf(buf, "Auf der Einheit lieg%s %d Wirkung%s %s.",
(data->value==1 ? "t" : "en"), (data->value==1 ? "t" : "en"),
data->value, data->value,
(data->value==1 ? "" : "en"), (data->value==1 ? "" : "en"),
locale_string(NULL, resourcename(data->type->itype->rtype, 0))); locale_string(NULL, resourcename(data->type->itype->rtype, 0)));
rnl(F); rnl(F);
@ -795,16 +795,10 @@ f_regionid(const region * r, const faction * f)
else { else {
pl = getplane(r); pl = getplane(r);
if(pl && fval(pl,PFL_NOCOORDS)) { if(pl && fval(pl,PFL_NOCOORDS)) {
if (rterrain(r) == T_OCEAN) sprintf(buf, "%s", rname(r, f->locale));
sprintf(buf, "Ozean");
else
sprintf(buf, "%s", rname(r, f->locale));
} else { } else {
if (rterrain(r) == T_OCEAN) sprintf(buf, "%s (%d,%d%s%s)", rname(r, f->locale), region_x(r,f), region_y(r,f), pl?",":"", pl?pl->name:"");
sprintf(buf, "Ozean (%d,%d%s%s)", region_x(r,f), region_y(r,f), pl?",":"", pl?pl->name:""); }
else
sprintf(buf, "%s (%d,%d%s%s)", rname(r, f->locale), region_x(r,f), region_y(r,f), pl?",":"", pl?pl->name:"");
}
} }
return buf; return buf;
@ -1038,13 +1032,13 @@ describe(FILE * F, region * r, int partial, faction * f)
scat((char *)a_do->data.v); scat((char *)a_do->data.v);
} else { } else {
int nrd = 0; int nrd = 0;
/* Nachbarregionen, die gesehen werden, ermitteln */ /* Nachbarregionen, die gesehen werden, ermitteln */
for (d = 0; d != MAXDIRECTIONS; d++) for (d = 0; d != MAXDIRECTIONS; d++)
if (see[d] && rconnect(r, d)) nrd++; if (see[d] && rconnect(r, d)) nrd++;
/* Richtungen aufzählen */ /* Richtungen aufzählen */
dh = false; dh = false;
for (d = 0; d != MAXDIRECTIONS; d++) if (see[d]) { for (d = 0; d != MAXDIRECTIONS; d++) if (see[d]) {
region * r2 = rconnect(r, d); region * r2 = rconnect(r, d);
@ -1055,7 +1049,7 @@ describe(FILE * F, region * r, int partial, faction * f)
else scat(", im "); else scat(", im ");
} }
else scat(" Im "); else scat(" Im ");
scat(directions[d]); scat(locale_string(f->locale, directions[d]));
scat(" "); scat(" ");
if (!dh) scat("der Region liegt "); if (!dh) scat("der Region liegt ");
sprintf(dbuf, trailinto(r2, f->locale), sprintf(dbuf, trailinto(r2, f->locale),
@ -1128,7 +1122,7 @@ describe(FILE * F, region * r, int partial, faction * f)
if (e->lastd==d) strcat(buf, " und im "); if (e->lastd==d) strcat(buf, " und im ");
else strcat(buf, ", im "); else strcat(buf, ", im ");
} }
strcat(buf, directions[d]); strcat(buf, locale_string(f->locale, directions[d]));
first = false; first = false;
} }
if (!e->transparent) strcat(buf, " versperrt "); if (!e->transparent) strcat(buf, " versperrt ");
@ -1299,7 +1293,7 @@ order_template(FILE * F, faction * f)
rps_nowrap(F, ""); rps_nowrap(F, "");
rnl(F); rnl(F);
sprintf(buf, "%s %s \"hier_passwort_eintragen\"", parameters[P_FACTION], factionid(f)); sprintf(buf, "%s %s \"hier_passwort_eintragen\"", locale_string(f->locale, parameters[P_FACTION]), factionid(f));
rps_nowrap(F, buf); rps_nowrap(F, buf);
rnl(F); rnl(F);
@ -1322,12 +1316,12 @@ order_template(FILE * F, faction * f)
rnl(F); rnl(F);
pl = getplane(r); pl = getplane(r);
if (pl && fval(pl, PFL_NOCOORDS)) { if (pl && fval(pl, PFL_NOCOORDS)) {
sprintf(buf, "REGION; %s", rname(r, f->locale)); sprintf(buf, "%s; %s", locale_string(f->locale, parameters[P_REGION]), rname(r, f->locale));
} else if (pl && pl->id != 0) { } else if (pl && pl->id != 0) {
sprintf(buf, "REGION %d,%d,%d ; %s", region_x(r,f), sprintf(buf, "%s %d,%d,%d ; %s", locale_string(f->locale, parameters[P_REGION]), region_x(r,f),
region_y(r,f), pl->id, rname(r, f->locale)); region_y(r,f), pl->id, rname(r, f->locale));
} else { } else {
sprintf(buf, "REGION %d,%d ; %s", region_x(r,f), sprintf(buf, "%s %d,%d ; %s", locale_string(f->locale, parameters[P_REGION]), region_x(r,f),
region_y(r,f), rname(r, f->locale)); region_y(r,f), rname(r, f->locale));
} }
rps_nowrap(F, buf); rps_nowrap(F, buf);
@ -1340,7 +1334,7 @@ order_template(FILE * F, faction * f)
} }
dh = 1; dh = 1;
sprintf(buf, "%s %s; %s [%d,%d$", parameters[P_UNIT], sprintf(buf, "%s %s; %s [%d,%d$", locale_string(u->faction->locale, parameters[P_UNIT]),
unitid(u), u->name, u->number, get_money(u)); unitid(u), u->name, u->number, get_money(u));
if (u->building != NULL && fval(u, FL_OWNER)) { if (u->building != NULL && fval(u, FL_OWNER)) {
building * b = u->building; building * b = u->building;
@ -1370,7 +1364,7 @@ order_template(FILE * F, faction * f)
rnl(F); rnl(F);
for (S2 = u->orders; S2; S2 = S2->next) { for (S2 = u->orders; S2; S2 = S2->next) {
if(is_persistent(S2->s)) { if(is_persistent(S2->s, u->faction->locale)) {
sprintf(buf, " %s", S2->s); sprintf(buf, " %s", S2->s);
rps_nowrap(F, buf); rps_nowrap(F, buf);
rnl(F); rnl(F);
@ -1388,7 +1382,7 @@ order_template(FILE * F, faction * f)
} }
rps_nowrap(F, ""); rps_nowrap(F, "");
rnl(F); rnl(F);
sprintf(buf, parameters[P_NEXT]); sprintf(buf, locale_string(f->locale, parameters[P_NEXT]));
rps_nowrap(F, buf); rps_nowrap(F, buf);
rnl(F); rnl(F);
} }
@ -1690,7 +1684,7 @@ report(FILE *F, faction * f)
centre(F, gamedate(), true); centre(F, gamedate(), true);
rnl(F); rnl(F);
sprintf(buf, "%s, %s/%s (%s)", factionname(f), race[f->race].name[1], sprintf(buf, "%s, %s/%s (%s)", factionname(f), locale_string(f->locale, race[f->race].name[1]),
neue_gebiete[f->magiegebiet], f->email); neue_gebiete[f->magiegebiet], f->email);
centre(F, buf, true); centre(F, buf, true);
@ -2040,11 +2034,12 @@ report(FILE *F, faction * f)
} }
sprintf(buf, "%s, %s, (%d/%d)", sprintf(buf, "%s, %s, (%d/%d)",
shipname(sh), shipname(sh),
sh->type->name[0], locale_string(f->locale, sh->type->name[0]),
(w + 99) / 100, /* +99 weil sonst die Nachkommastellen ignoriert würden */ (w + 99) / 100, /* +99 weil sonst die Nachkommastellen ignoriert würden */
shipcapacity(sh) / 100); shipcapacity(sh) / 100);
} else { } else {
sprintf(buf, "%s, %s", shipname(sh), sh->type->name[0]); sprintf(buf, "%s, %s", shipname(sh),
locale_string(f->locale, sh->type->name[0]));
} }
assert(sh->type->construction->improvement==NULL); /* sonst ist construction::size nicht ship_type::maxsize */ assert(sh->type->construction->improvement==NULL); /* sonst ist construction::size nicht ship_type::maxsize */
@ -2379,7 +2374,7 @@ seen_region * last;
#define MAXSEEHASH 4095 #define MAXSEEHASH 4095
seen_region * seehash[MAXSEEHASH]; seen_region * seehash[MAXSEEHASH];
static void static void
seen_done(void) seen_done(void)
{ {
while (seen) { while (seen) {
@ -2395,7 +2390,7 @@ seen_done(void)
} }
#if FAST_SEEN #if FAST_SEEN
static void static void
init_intervals() init_intervals()
{ {
region * r; region * r;
@ -3386,17 +3381,38 @@ eval_resource(struct opstack ** stack, const void * userdata)
const faction * report = (const faction*)userdata; const faction * report = (const faction*)userdata;
int j = opop(stack, int); int j = opop(stack, int);
struct resource_type * res = opop(stack, struct resource_type *); struct resource_type * res = opop(stack, struct resource_type *);
const char * c = locale_string(report->locale, resourcename(res, j!=1)); const char * c = locale_string(report->locale, resourcename(res, j!=1));
opush(stack, strcpy(balloc(strlen(c)+1), c)); opush(stack, strcpy(balloc(strlen(c)+1), c));
} }
static void
eval_race(struct opstack ** stack, const void * userdata)
{
const faction * report = (const faction*)userdata;
int j = opop(stack, int);
int r = opop(stack, int);
const char * c = locale_string(report->locale, race[r].name[j!=1]);
opush(stack, strcpy(balloc(strlen(c)+1), c));
}
static void
eval_direction(struct opstack ** stack, const void * userdata)
{
const faction * report = (const faction*)userdata;
int i = opop(stack, int);
const char * c = locale_string(report->locale, directions[i]);
opush(stack, strcpy(balloc(strlen(c)+1), c));
}
static void static void
eval_skill(struct opstack ** stack, const void * userdata) eval_skill(struct opstack ** stack, const void * userdata)
{ {
const faction * report = (const faction*)userdata; const faction * report = (const faction*)userdata;
int sk = opop(stack, int); int sk = opop(stack, int);
const char * c = locale_string(report->locale, skillnames[sk]); const char * c = skillname(sk, report->locale);
opush(stack, strcpy(balloc(strlen(c)+1), c)); opush(stack, strcpy(balloc(strlen(c)+1), c));
unused(userdata); unused(userdata);
} }
@ -3406,9 +3422,11 @@ report_init(void)
{ {
add_function("region", &eval_region); add_function("region", &eval_region);
add_function("resource", &eval_resource); add_function("resource", &eval_resource);
add_function("race", &eval_race);
add_function("faction", &eval_faction); add_function("faction", &eval_faction);
add_function("ship", &eval_ship); add_function("ship", &eval_ship);
add_function("unit", &eval_unit); add_function("unit", &eval_unit);
add_function("building", &eval_building); add_function("building", &eval_building);
add_function("skill", &eval_skill); add_function("skill", &eval_skill);
add_function("direction", &eval_direction);
} }

View file

@ -137,15 +137,15 @@ setstealth(unit * u, strlist * S)
return; return;
} }
switch(findparam(s)) { switch(findparam(s, u->faction->locale)) {
case P_FACTION: case P_FACTION:
/* TARNE PARTEI [NICHT|NUMMER abcd] */ /* TARNE PARTEI [NICHT|NUMMER abcd] */
s = getstrtoken(); s = getstrtoken();
if(!s || *s == 0) { if(!s || *s == 0) {
fset(u, FL_PARTEITARNUNG); fset(u, FL_PARTEITARNUNG);
} else if (findparam(s) == P_NOT) { } else if (findparam(s, u->faction->locale) == P_NOT) {
freset(u, FL_PARTEITARNUNG); freset(u, FL_PARTEITARNUNG);
} else if (findkeyword(s) == K_NUMBER) { } else if (findkeyword(s, u->faction->locale) == K_NUMBER) {
char *s2 = getstrtoken(); char *s2 = getstrtoken();
int nr; int nr;
if(!s2 || *s2 == 0 || (nr = atoi36(s2)) == u->faction->no) { if(!s2 || *s2 == 0 || (nr = atoi36(s2)) == u->faction->no) {
@ -176,7 +176,7 @@ setstealth(unit * u, strlist * S)
return; return;
} }
s = getstrtoken(); s = getstrtoken();
if (findparam(s) == P_NOT) { if (findparam(s, u->faction->locale) == P_NOT) {
a = a_find(u->attribs, &at_fshidden); a = a_find(u->attribs, &at_fshidden);
if(a) a->data.ca[0] = 0; if(a) a->data.ca[0] = 0;
if(a->data.i == 0) a_remove(&u->attribs, a); if(a->data.i == 0) a_remove(&u->attribs, a);
@ -192,7 +192,7 @@ setstealth(unit * u, strlist * S)
cmistake(u, S->s, 277, MSG_EVENT); cmistake(u, S->s, 277, MSG_EVENT);
return; return;
} }
if (findparam(s) == P_NOT) { if (findparam(s, u->faction->locale) == P_NOT) {
a = a_find(u->attribs, &at_fshidden); a = a_find(u->attribs, &at_fshidden);
if(a) a->data.ca[1] = 0; if(a) a->data.ca[1] = 0;
if(a->data.i == 0) a_remove(&u->attribs, a); if(a->data.i == 0) a_remove(&u->attribs, a);
@ -427,7 +427,7 @@ sabotage(region * r, unit * u)
s = getstrtoken(); s = getstrtoken();
i = findparam(s); i = findparam(s, u->faction->locale);
switch (i) { switch (i) {
case P_SHIP: case P_SHIP:

View file

@ -1,6 +1,6 @@
/* vi: set ts=2: /* vi: set ts=2:
* *
* *
* Eressea PB(E)M host Copyright (C) 1998-2000 * Eressea PB(E)M host Copyright (C) 1998-2000
* Christian Schlittchen (corwin@amber.kn-bremen.de) * Christian Schlittchen (corwin@amber.kn-bremen.de)
* Katja Zedel (katze@felidae.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de)
@ -55,9 +55,9 @@
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
static skill_t static skill_t
getskill(void) getskill(const struct locale * lang)
{ {
return findskill(getstrtoken()); return findskill(getstrtoken(), lang);
} }
static magic_t static magic_t
@ -185,7 +185,7 @@ teach_unit(unit * teacher, unit * student, int teaching, skill_t sk, boolean rep
* Deswegen darf C D nie lehren dürfen. * Deswegen darf C D nie lehren dürfen.
* *
* -> Das ist wirr. wer hat das entworfen? * -> Das ist wirr. wer hat das entworfen?
* Besser wäre, man macht erst vorab alle zuordnungen, und dann * Besser wäre, man macht erst vorab alle zuordnungen, und dann
* die Talentänderung (enno). * die Talentänderung (enno).
*/ */
@ -236,24 +236,24 @@ teach(region * r, unit * u)
if (teaching == 0) if (teaching == 0)
return; return;
strcpy(order, keywords[K_TEACH]); strcpy(order, locale_string(u->faction->locale, keywords[K_TEACH]));
u2 = 0; u2 = 0;
count = 0; count = 0;
#if TEACH_ALL #if TEACH_ALL
if (getparam()==P_ANY) { if (getparam(u->faction->locale)==P_ANY) {
unit * student = r->units; unit * student = r->units;
skill_t teachskill[MAXSKILLS]; skill_t teachskill[MAXSKILLS];
int i = 0; int i = 0;
do { do {
sk = getskill(); sk = getskill(u->faction->locale);
teachskill[i++]=sk; teachskill[i++]=sk;
} while (sk!=NOSKILL); } while (sk!=NOSKILL);
while (teaching && student) { while (teaching && student) {
if (student->faction == u->faction) { if (student->faction == u->faction) {
if (igetkeyword(student->thisorder) == K_STUDY) { if (igetkeyword(student->thisorder, student->faction->locale) == K_STUDY) {
/* Input ist nun von student->thisorder !! */ /* Input ist nun von student->thisorder !! */
sk = getskill(); sk = getskill(student->faction->locale);
if (sk!=NOSKILL && teachskill[0]!=NOSKILL) { if (sk!=NOSKILL && teachskill[0]!=NOSKILL) {
for (i=0;teachskill[i]!=NOSKILL;++i) if (sk==teachskill[i]) break; for (i=0;teachskill[i]!=NOSKILL;++i) if (sk==teachskill[i]) break;
sk = teachskill[i]; sk = teachskill[i];
@ -268,9 +268,9 @@ teach(region * r, unit * u)
#if TEACH_FRIENDS #if TEACH_FRIENDS
while (teaching && student) { while (teaching && student) {
if (student->faction != u->faction && allied(u, student->faction, HELP_GUARD)) { if (student->faction != u->faction && allied(u, student->faction, HELP_GUARD)) {
if (igetkeyword(student->thisorder) == K_STUDY) { if (igetkeyword(student->thisorder, student->faction->locale) == K_STUDY) {
/* Input ist nun von student->thisorder !! */ /* Input ist nun von student->thisorder !! */
sk = getskill(); sk = getskill(student->faction->locale);
if (sk != NOSKILL && eff_skill(u, sk, r) > eff_skill(student, sk, r)) { if (sk != NOSKILL && eff_skill(u, sk, r) > eff_skill(student, sk, r)) {
teaching -= teach_unit(u, student, teaching, sk, true); teaching -= teach_unit(u, student, teaching, sk, true);
} }
@ -279,7 +279,7 @@ teach(region * r, unit * u)
student = student->next; student = student->next;
} }
#endif #endif
} }
else else
#endif #endif
for (;;) { for (;;) {
@ -292,7 +292,7 @@ teach(region * r, unit * u)
* LEHRE und 101 wird gelesen (und ignoriert), und dann wird * LEHRE und 101 wird gelesen (und ignoriert), und dann wird
* getunit die einheit 102 zurück liefern. */ * getunit die einheit 102 zurück liefern. */
igetkeyword(u->thisorder); igetkeyword(u->thisorder, u->faction->locale);
for (j = count; j; j--) for (j = count; j; j--)
getstrtoken(); getstrtoken();
@ -305,7 +305,7 @@ teach(region * r, unit * u)
/* Finde den string, der den Fehler verursacht hat */ /* Finde den string, der den Fehler verursacht hat */
igetkeyword(u->thisorder); igetkeyword(u->thisorder, u->faction->locale);
for (j = count; j; j--) for (j = count; j; j--)
getstrtoken(); getstrtoken();
@ -320,7 +320,7 @@ teach(region * r, unit * u)
strcpy(buf, "Die Einheit '"); strcpy(buf, "Die Einheit '");
if (findparam(s) == P_TEMP) { if (findparam(s, u->faction->locale) == P_TEMP) {
/* Für: "Die Einheit 'TEMP ZET' wurde nicht gefunden" oder "Die Einheit /* Für: "Die Einheit 'TEMP ZET' wurde nicht gefunden" oder "Die Einheit
* 'TEMP' wurde nicht gefunden" */ * 'TEMP' wurde nicht gefunden" */
@ -360,11 +360,11 @@ teach(region * r, unit * u)
mistake(u, u->thisorder, buf, MSG_EVENT); mistake(u, u->thisorder, buf, MSG_EVENT);
continue; continue;
} }
i = igetkeyword(u2->thisorder); i = igetkeyword(u2->thisorder, u2->faction->locale);
/* Input ist nun von u2->thisorder !! */ /* Input ist nun von u2->thisorder !! */
if (i != K_STUDY || ((sk = getskill()) == NOSKILL)) { if (i != K_STUDY || ((sk = getskill(u2->faction->locale)) == NOSKILL)) {
sprintf(buf, "%s lernt nicht", unitname(u2)); sprintf(buf, "%s lernt nicht", unitname(u2));
mistake(u, u->thisorder, buf, MSG_EVENT); mistake(u, u->thisorder, buf, MSG_EVENT);
continue; continue;
@ -412,7 +412,7 @@ learn(void)
for (r = regions; r; r = r->next) for (r = regions; r; r = r->next)
for (u = r->units; u; u = u->next) for (u = r->units; u; u = u->next)
if (rterrain(r) != T_OCEAN || u->race == RC_AQUARIAN) if (rterrain(r) != T_OCEAN || u->race == RC_AQUARIAN)
if (igetkeyword(u->thisorder) == K_STUDY) { if (igetkeyword(u->thisorder, u->faction->locale) == K_STUDY) {
double multi = 1.0; double multi = 1.0;
attrib * a = NULL; attrib * a = NULL;
int money = 0; int money = 0;
@ -426,7 +426,7 @@ learn(void)
continue; continue;
} }
i = getskill(); i = getskill(u->faction->locale);
if (i < 0) { if (i < 0) {
cmistake(u, findorder(u, u->thisorder), 77, MSG_EVENT); cmistake(u, findorder(u, u->thisorder), 77, MSG_EVENT);
@ -447,7 +447,7 @@ learn(void)
p = studycost = study_cost(u,i); p = studycost = study_cost(u,i);
a = a_find(u->attribs, &at_learning); a = a_find(u->attribs, &at_learning);
if (btype == &bt_academy) { if (btype == &bt_academy) {
studycost = max(50, studycost * 2); studycost = max(50, studycost * 2);
} }
@ -601,7 +601,7 @@ learn(void)
#ifdef SKILLFIX_SAVE #ifdef SKILLFIX_SAVE
if (a && a->data.i) { if (a && a->data.i) {
int skill = get_skill(u, (skill_t)i); int skill = get_skill(u, (skill_t)i);
skillfix(u, (skill_t)i, skill, skillfix(u, (skill_t)i, skill,
(int)(u->number * 30 * multi), a->data.i); (int)(u->number * 30 * multi), a->data.i);
} }
#endif #endif
@ -666,7 +666,7 @@ teaching(void)
&& !is_cursed(u->attribs, C_KAELTESCHUTZ,0)) && !is_cursed(u->attribs, C_KAELTESCHUTZ,0))
continue; continue;
switch (igetkeyword(u->thisorder)) { switch (igetkeyword(u->thisorder, u->faction->locale)) {
case K_TEACH: case K_TEACH:
if (attacked(u)){ if (attacked(u)){

View file

@ -3364,7 +3364,7 @@ do_battle(void)
strlist *sl; strlist *sl;
list_foreach(strlist, u->orders, sl) { list_foreach(strlist, u->orders, sl) {
if (igetkeyword(sl->s) == K_ATTACK) { if (igetkeyword(sl->s, u->faction->locale) == K_ATTACK) {
unit *u2; unit *u2;
fighter *c1, *c2; fighter *c1, *c2;
@ -3379,7 +3379,7 @@ do_battle(void)
#ifdef DELAYED_OFFENSE #ifdef DELAYED_OFFENSE
if (get_moved(&u->attribs) && !guarded_by(r, u->faction)) { if (get_moved(&u->attribs) && !guarded_by(r, u->faction)) {
add_message(&u->faction->msgs, add_message(&u->faction->msgs,
make_message("no_attack_after_advance", "unit region command", u, u->region, sl->s)); msg_message("no_attack_after_advance", "unit region command", u, u->region, sl->s));
} }
#endif #endif
if (fval(u, FL_HUNGER)) { if (fval(u, FL_HUNGER)) {

View file

@ -267,7 +267,7 @@ do_siege(void)
unit *u; unit *u;
for (u = r->units; u; u = u->next) { for (u = r->units; u; u = u->next) {
if (igetkeyword(u->thisorder) == K_BESIEGE) if (igetkeyword(u->thisorder, u->faction->locale) == K_BESIEGE)
siege(r, u); siege(r, u);
} }
} }
@ -327,7 +327,7 @@ destroy(region * r, unit * u, const char * cmd)
s = getstrtoken(); s = getstrtoken();
if (findparam(s)==P_ROAD) { if (findparam(s, u->faction->locale)==P_ROAD) {
destroy_road(u, INT_MAX, cmd); destroy_road(u, INT_MAX, cmd);
return; return;
} }
@ -345,11 +345,11 @@ destroy(region * r, unit * u, const char * cmd)
} }
} }
if(getparam() == P_ROAD) { if(getparam(u->faction->locale) == P_ROAD) {
destroy_road(u, n, cmd); destroy_road(u, n, cmd);
return; return;
} }
if (u->building) { if (u->building) {
building *b = u->building; building *b = u->building;
#if 0 #if 0
@ -834,11 +834,11 @@ build_building(unit * u, const building_type * btype, int want)
} }
if( want == INT_MAX ) if( want == INT_MAX )
sprintf(buffer, "%s %s %s", keywords[K_MAKE], string2, buildingid(b)); sprintf(buffer, "%s %s %s", locale_string(u->faction->locale, keywords[K_MAKE]), string2, buildingid(b));
else if( want-built <= 0 ) else if( want-built <= 0 )
strcpy(buffer, keywords[K_WORK]); strcpy(buffer, locale_string(u->faction->locale, keywords[K_WORK]));
else else
sprintf(buffer, "%s %d %s %s", keywords[K_MAKE], want-built, string2, buildingid(b)); sprintf(buffer, "%s %d %s %s", locale_string(u->faction->locale, keywords[K_MAKE]), want-built, string2, buildingid(b));
set_string(&u->lastorder, buffer); set_string(&u->lastorder, buffer);
b->size += built; b->size += built;
@ -926,7 +926,7 @@ create_ship(region * r, unit * u, const struct ship_type * newtype, int want)
u->ship = sh; u->ship = sh;
fset(u, FL_OWNER); fset(u, FL_OWNER);
sprintf(buffer, "%s %s %s", sprintf(buffer, "%s %s %s",
keywords[K_MAKE], parameters[P_SHIP], shipid(sh)); locale_string(u->faction->locale, keywords[K_MAKE]), locale_string(u->faction->locale, parameters[P_SHIP]), shipid(sh));
u->lastorder = set_string(&u->lastorder, buffer); u->lastorder = set_string(&u->lastorder, buffer);
build_ship(u, sh, want); build_ship(u, sh, want);
@ -1031,7 +1031,7 @@ do_leave(void)
for (r = regions; r; r = r->next) { for (r = regions; r; r = r->next) {
for (u = r->units; u; u = u->next) { for (u = r->units; u; u = u->next) {
for (S = u->orders; S; S = S->next) { for (S = u->orders; S; S = S->next) {
if(igetkeyword(S->s) == K_LEAVE) { if(igetkeyword(S->s, u->faction->locale) == K_LEAVE) {
if (r->terrain == T_OCEAN && u->ship) { if (r->terrain == T_OCEAN && u->ship) {
if(!(race[u->race].flags & RCF_SWIM)) { if(!(race[u->race].flags & RCF_SWIM)) {
cmistake(u, S->s, 11, MSG_MOVE); cmistake(u, S->s, 11, MSG_MOVE);
@ -1070,7 +1070,7 @@ do_misc(char try)
for (u = r->units; u; u = u->next) { for (u = r->units; u; u = u->next) {
for (S = u->orders; S; S = S->next) { for (S = u->orders; S; S = S->next) {
switch (igetkeyword(S->s)) { switch (igetkeyword(S->s, u->faction->locale)) {
case K_CONTACT: case K_CONTACT:
set_contact(r, u, try); set_contact(r, u, try);
break; break;
@ -1082,10 +1082,10 @@ do_misc(char try)
for (S = u->orders; S;) { for (S = u->orders; S;) {
Snext = S->next; Snext = S->next;
switch (igetkeyword(S->s)) { switch (igetkeyword(S->s, u->faction->locale)) {
case K_ENTER: case K_ENTER:
switch (getparam()) { switch (getparam(u->faction->locale)) {
case P_BUILDING: case P_BUILDING:
case P_GEBAEUDE: case P_GEBAEUDE:

View file

@ -44,6 +44,22 @@ const building_type *
bt_find(const char* name) bt_find(const char* name)
{ {
const struct building_typelist * btl = buildingtypes; const struct building_typelist * btl = buildingtypes;
if (global.data_version < RELEASE_VERSION) {
const char * translation[3][2] = {
{ "illusion", "illusioncastle" },
{ "generic", "genericbuilding" },
{ NULL, NULL }
};
int i;
for (i=0;translation[i][0];++i) {
/* calling a building "illusion" was a bad idea" */
if (strcmp(translation[i][0], name)==0) {
name = translation[i][1];
break;
}
}
}
while (btl && strcasecmp(btl->type->_name, name)) btl = btl->next; while (btl && strcasecmp(btl->type->_name, name)) btl = btl->next;
if (!btl) { if (!btl) {
btl = buildingtypes; btl = buildingtypes;
@ -656,7 +672,7 @@ building_type bt_blessedstonecircle = {
/** Building: illusion */ /** Building: illusion */
building_type bt_illusion = { building_type bt_illusion = {
"illusion", /* _name */ "illusioncastle", /* _name */
BTF_NOBUILD, /* flags */ BTF_NOBUILD, /* flags */
0, 0, 0, /* capac/size, maxcapac, maxsize */ 0, 0, 0, /* capac/size, maxcapac, maxsize */
NULL, /* maintenance */ NULL, /* maintenance */
@ -666,7 +682,7 @@ building_type bt_illusion = {
/** Building: Generisches Gebäude */ /** Building: Generisches Gebäude */
building_type bt_generic = { building_type bt_generic = {
"generic", /* _name */ "genericbuilding", /* _name */
BTF_NOBUILD, /* flags */ BTF_NOBUILD, /* flags */
-1, -1, 1, /* capac/size, maxcapac, maxsize */ -1, -1, 1, /* capac/size, maxcapac, maxsize */
NULL, /* maintenance */ NULL, /* maintenance */

View file

@ -3,14 +3,15 @@
#include "eressea.h" #include "eressea.h"
/* kernel includes */ /* kernel includes */
#include "magic.h" #include "battle.h"
#include "unit.h"
#include "region.h"
#include "item.h"
#include "build.h" #include "build.h"
#include "building.h" #include "building.h"
#include "faction.h"
#include "item.h"
#include "magic.h"
#include "region.h"
#include "unit.h"
#include "movement.h" #include "movement.h"
#include "battle.h"
#include "spell.h" #include "spell.h"
#include "race.h" #include "race.h"
@ -1173,8 +1174,8 @@ sp_denyattack(fighter * fi, int level, int power, spell * sp)
fset(fi, FIG_ATTACKED); fset(fi, FIG_ATTACKED);
/* Hat der Magier ein NACH, wird die angegebene Richtung bevorzugt */ /* Hat der Magier ein NACH, wird die angegebene Richtung bevorzugt */
if (igetkeyword(mage->thisorder) == K_MOVE if (igetkeyword(mage->thisorder, mage->faction->locale) == K_MOVE
|| igetkeyword(mage->thisorder) == K_ROUTE) || igetkeyword(mage->thisorder, mage->faction->locale) == K_ROUTE)
{ {
fi->run.region = movewhere(r, mage); fi->run.region = movewhere(r, mage);
if (!fi->run.region) { if (!fi->run.region) {

View file

@ -25,6 +25,7 @@
/* kernel includes */ /* kernel includes */
#include "magic.h" #include "magic.h"
#include "skill.h"
#include "unit.h" #include "unit.h"
#include "region.h" #include "region.h"
#include "race.h" #include "race.h"
@ -139,7 +140,6 @@ cfindhash(int i)
/* Spruch identifizieren */ /* Spruch identifizieren */
#include "umlaut.h" #include "umlaut.h"
extern struct tnode cursenames;
typedef struct cursetype_list { typedef struct cursetype_list {
struct cursetype_list * next; struct cursetype_list * next;
@ -165,19 +165,15 @@ const curse_type *
ct_find(const char *c) ct_find(const char *c)
{ {
/* TODO: findet nur curse_types, die auch in curse_data sind. /* TODO: findet nur curse_types, die auch in curse_data sind.
* da fehlt noch ene registrierung wie für attrib_type * da fehlt noch eine registrierung wie für attrib_type
*/ */
int i; cursetype_list * ctl = cursetypes;
if (findtoken(&cursenames, c, (void**)&i)==E_TOK_NOMATCH) return NULL; while (ctl) {
if (i == -1 || cursedaten[i].name[0] == 0) { int k = min(strlen(c), strlen(ctl->type->name));
cursetype_list * ctl = cursetypes; if (!strncasecmp(c, ctl->type->name, k)) return ctl->type;
while (ctl) { ctl = ctl->next;
int k = min(strlen(c), strlen(ctl->type->name));
if (!strncasecmp(c, ctl->type->name, k)) return ctl->type;
ctl = ctl->next;
}
} }
return &cursedaten[i]; return NULL;
} }
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
@ -1203,7 +1199,7 @@ cinfo_skill(void * obj, typ_t typ, curse *c, int self)
if (self){ if (self){
sprintf(buf, "%s ist in %s ungewöhnlich ungeschickt. (%s)", u->name, sprintf(buf, "%s ist in %s ungewöhnlich ungeschickt. (%s)", u->name,
skillnames[ck->skill], curseid(c)); skillname(ck->skill, u->faction->locale), curseid(c));
return 1; return 1;
} }
return 0; return 0;

View file

@ -39,7 +39,6 @@
#include "magic.h" #include "magic.h"
#include "building.h" #include "building.h"
#include "battle.h" #include "battle.h"
#include "monster.h"
#include "race.h" #include "race.h"
#include "pool.h" #include "pool.h"
#include "region.h" #include "region.h"
@ -76,14 +75,14 @@ FILE *logfile;
const char *directions[MAXDIRECTIONS+2] = const char *directions[MAXDIRECTIONS+2] =
{ {
"Nordwesten", "northwest",
"Nordosten", "northeast",
"Osten", "east",
"Südosten", "southeast",
"Südwesten", "southwest",
"Westen", "west",
"", "",
"Pause" "pause"
}; };
const char *gr_prefix[3] = { const char *gr_prefix[3] = {
@ -94,6 +93,7 @@ const char *gr_prefix[3] = {
const char *parameters[MAXPARAMS] = const char *parameters[MAXPARAMS] =
{ {
"LOCALE",
"ALLES", "ALLES",
"BAUERN", "BAUERN",
"BURG", "BURG",
@ -111,13 +111,9 @@ const char *parameters[MAXPARAMS] =
"SILBER", "SILBER",
"STRAßEN", "STRAßEN",
"TEMPORÄRE", "TEMPORÄRE",
"FEIND",
"FREUND",
"NEUTRAL",
"FLIEHE", "FLIEHE",
"GEBÄUDE", "GEBÄUDE",
"GIB", /* Für HELFE */ "GIB", /* Für HELFE */
"WAHRNEHMUNG",
"KÄMPFE", "KÄMPFE",
"BEWACHE", "BEWACHE",
"ZAUBERBUCH", "ZAUBERBUCH",
@ -198,7 +194,6 @@ const char *keywords[MAXKEYWORDS] =
"MEINUNG", "MEINUNG",
"MAGIEGEBIET", "MAGIEGEBIET",
"PIRATERIE", "PIRATERIE",
"LOCALE",
"NEUSTART", "NEUSTART",
#ifdef GROUPS #ifdef GROUPS
"GRUPPE", "GRUPPE",
@ -714,7 +709,7 @@ isallied(const plane * pl, const faction * f, const faction * f2, int mode)
if (p==pl) return mode; if (p==pl) return mode;
a=a->next; a=a->next;
} }
if (pl && pl->flags & PFL_FRIENDLY) return mode; if (pl && pl->flags & PFL_FRIENDLY) return mode;
if (mode != HELP_GIVE && pl && (pl->flags & PFL_NOALLIANCES)) return 0; if (mode != HELP_GIVE && pl && (pl->flags & PFL_NOALLIANCES)) return 0;
for (sf = f->allies; sf; sf = sf->next) for (sf = f->allies; sf; sf = sf->next)
@ -1118,57 +1113,82 @@ enum {
UT_NONE, UT_NONE,
UT_PARAM, UT_PARAM,
UT_ITEM, UT_ITEM,
UT_SKILL,
UT_KEYWORD,
UT_BUILDING, UT_BUILDING,
UT_HERB, UT_HERB,
UT_POTION, UT_POTION,
UT_MAX UT_MAX
}; };
struct tnode tokens[UT_MAX]; static struct lstr {
struct tnode spellnames; const struct locale * lang;
struct tnode cursenames; struct tnode tokens[UT_MAX];
struct tnode skillnames;
struct tnode keywords;
struct lstr * next;
} * lstrs;
static struct lstr *
get_lnames(const struct locale * lang)
{
static struct lstr * lnames = NULL;
static const struct locale * lastlang = NULL;
if (lastlang!=lang || lnames==NULL) {
lnames = lstrs;
while (lnames && lnames->lang!=lang) lnames = lnames->next;
if (lnames==NULL) {
lnames = calloc(sizeof(struct lstr), 1);
lnames->lang = lang;
lnames->next = lstrs;
lstrs = lnames;
}
}
return lnames;
}
skill_t skill_t
findskill(const char *s) findskill(const char *s, const struct locale * lang)
{ {
struct lstr * lnames = get_lnames(lang);
int i; int i;
if (findtoken(&tokens[UT_SKILL], s, (void**)&i)==E_TOK_NOMATCH) return NOSKILL;
if (findtoken(&lnames->skillnames, s, (void**)&i)==E_TOK_NOMATCH) return NOSKILL;
return (skill_t)i; return (skill_t)i;
} }
keyword_t keyword_t
findkeyword(const char *s) findkeyword(const char *s, const struct locale * lang)
{ {
struct lstr * lnames = get_lnames(lang);
int i; int i;
#ifdef AT_PERSISTENT #ifdef AT_PERSISTENT
if(*s == '@') s++; if(*s == '@') s++;
#endif #endif
if (findtoken(&tokens[UT_KEYWORD], s, (void**)&i)==E_TOK_NOMATCH) return NOKEYWORD; if (findtoken(&lnames->keywords, s, (void**)&i)==E_TOK_NOMATCH) return NOKEYWORD;
return (keyword_t) i; return (keyword_t) i;
} }
keyword_t keyword_t
igetkeyword (const char *s) igetkeyword (const char *s, const struct locale * lang)
{ {
return findkeyword (igetstrtoken (s)); return findkeyword (igetstrtoken (s), lang);
} }
keyword_t keyword_t
getkeyword (void) getkeyword (const struct locale * lang)
{ {
return findkeyword (getstrtoken ()); return findkeyword (getstrtoken (), lang);
} }
param_t param_t
findparam(const char *s) findparam(const char *s, const struct locale * lang)
{ {
struct lstr * lnames = get_lnames(lang);
const building_type * btype; const building_type * btype;
int i; int i;
if (findtoken(&tokens[UT_PARAM], s, (void**)&i)==E_TOK_NOMATCH) { if (findtoken(&lnames->tokens[UT_PARAM], s, (void**)&i)==E_TOK_NOMATCH) {
btype = findbuildingtype(s, NULL); btype = findbuildingtype(s, lang);
if (btype!=NULL) return (param_t) P_BUILDING; if (btype!=NULL) return (param_t) P_BUILDING;
return NOPARAM; return NOPARAM;
} }
@ -1176,14 +1196,14 @@ findparam(const char *s)
} }
param_t param_t
igetparam (const char *s) igetparam (const char *s, const struct locale *lang)
{ {
return findparam (igetstrtoken (s)); return findparam (igetstrtoken (s), lang);
} }
param_t param_t
getparam (void) getparam (const struct locale * lang)
{ {
return findparam (getstrtoken ()); return findparam (getstrtoken (), lang);
} }
#ifdef FUZZY_BASE36 #ifdef FUZZY_BASE36
@ -1307,7 +1327,7 @@ read_unitid (faction * f, region * r)
* paramliste. machen wir das nicht, dann wird getnewunit in s nach der * paramliste. machen wir das nicht, dann wird getnewunit in s nach der
* nummer suchen, doch dort steht bei temp-units nur "temp" drinnen! */ * nummer suchen, doch dort steht bei temp-units nur "temp" drinnen! */
switch (findparam (s)) { switch (findparam (s, f->locale)) {
case P_TEMP: case P_TEMP:
return read_newunitid(f, r); return read_newunitid(f, r);
} }
@ -1556,7 +1576,7 @@ createunitid(region * r1, faction * f, int number, race_t race, int id, const ch
assert(f->alive); assert(f->alive);
u_setfaction(u, f); u_setfaction(u, f);
set_string(&u->thisorder, ""); set_string(&u->thisorder, "");
set_string(&u->lastorder, keywords[K_WORK]); set_string(&u->lastorder, locale_string(u->faction->locale, keywords[K_WORK]));
u_seteffstealth(u, -1); u_seteffstealth(u, -1);
u->race = race; u->race = race;
u->irace = race; u->irace = race;
@ -1789,6 +1809,7 @@ typedef struct t_umlaut {
* WICHTIG: "setenv LANG en_US" sonst ist ä != Ä * WICHTIG: "setenv LANG en_US" sonst ist ä != Ä
*/ */
#if 0
static const t_umlaut umlaut[] = { static const t_umlaut umlaut[] = {
/* Parameter */ /* Parameter */
{ "Straßen", P_ROAD, UT_PARAM }, { "Straßen", P_ROAD, UT_PARAM },
@ -1825,28 +1846,27 @@ static const t_umlaut umlaut[] = {
{ "Flinkfingerring", I_RING_OF_NIMBLEFINGER, UT_ITEM }, { "Flinkfingerring", I_RING_OF_NIMBLEFINGER, UT_ITEM },
{ NULL, 0, 0 } { NULL, 0, 0 }
}; };
#endif
static void static void
init_tokens(void) init_tokens(const struct locale * lang)
{ {
struct lstr * lnames = get_lnames(lang);
int i; int i;
for (i=0;i!=MAXPARAMS;++i) for (i=0;i!=MAXPARAMS;++i)
addtoken(&tokens[UT_PARAM], parameters[i], (void*)i); addtoken(&lnames->tokens[UT_PARAM], locale_string(lang, parameters[i]), (void*)i);
for (i=0;i!=MAXSKILLS;++i) for (i=0;i!=MAXSKILLS;++i)
addtoken(&tokens[UT_SKILL], skillnames[i], (void*)i); addtoken(&lnames->skillnames, skillname(i, lang), (void*)i);
for (i=0;i!=MAXKEYWORDS;++i) for (i=0;i!=MAXKEYWORDS;++i)
addtoken(&tokens[UT_KEYWORD], keywords[i], (void*)i); addtoken(&lnames->keywords, locale_string(lang, keywords[i]), (void*)i);
#if 0
for (i=0;umlaut[i].txt;++i) for (i=0;umlaut[i].txt;++i)
addtoken(&tokens[umlaut[i].typ], umlaut[i].txt, (void*)umlaut[i].id); addtoken(&lnames->tokens[umlaut[i].typ], umlaut[i].txt, (void*)umlaut[i].id);
for (i=0; spelldaten[i].id != SPL_NOSPELL; i++) #endif
addtoken(&spellnames, spelldaten[i].name, (void*)i);
for (i=0; i!=MAXCURSE; i++){
addtoken(&cursenames, cursedaten[i].name, (void*)i);
}
} }
void void
kernel_done(void) kernel_done(void)
{ {
/* calling this function releases memory assigned to static variables, etc. /* calling this function releases memory assigned to static variables, etc.
* calling it is optional, e.g. a release server will most likely not do it. * calling it is optional, e.g. a release server will most likely not do it.
@ -1856,9 +1876,7 @@ kernel_done(void)
gc_done(); gc_done();
} }
extern void attrib_init(void); static void
void
read_strings(FILE * F) read_strings(FILE * F)
{ {
char rbuf[8192]; char rbuf[8192];
@ -1867,6 +1885,7 @@ read_strings(FILE * F)
locale * lang; locale * lang;
char * key = b; char * key = b;
char * language; char * language;
const char * k;
if (rbuf[0]=='#') continue; if (rbuf[0]=='#') continue;
rbuf[strlen(rbuf)-1] = 0; /* \n weg */ rbuf[strlen(rbuf)-1] = 0; /* \n weg */
@ -1878,14 +1897,181 @@ read_strings(FILE * F)
*b++ = 0; *b++ = 0;
lang = find_locale(language); lang = find_locale(language);
if (!lang) lang = make_locale(language); if (!lang) lang = make_locale(language);
locale_setstring(lang, key, b); k = locale_getstring(lang, key);
if (k) {
log_warning(("Trying to register %s[%s]=\"%s\", already have \"%s\"\n", key, language, k, b));
} else locale_setstring(lang, key, b);
} }
} }
const char * messages[] = {
"%s/%s/messages.xml",
NULL
};
const char * strings[] = {
"%s/%s/strings.txt",
NULL
};
const char * locales[] = {
"de", "en",
NULL
};
void
init_locales(void)
{
FILE * F;
int l;
for (l=0;locales[l];++l) {
char zText[MAX_PATH];
int i;
for (i=0;strings[i];++i) {
sprintf(zText, strings[i], resourcepath(), locales[l]);
F = fopen(zText, "r+");
if (F) {
read_strings(F);
fclose(F);
} else {
sprintf(buf, "fopen(%s): ", zText);
perror(buf);
}
}
for (i=0;messages[i];++i) {
sprintf(zText, messages[i], resourcepath(), locales[l]);
F = fopen(zText, "r+");
if (F) {
read_messages(F, NULL);
fclose(F);
} else {
sprintf(buf, "fopen(%s): ", zText);
perror(buf);
}
}
}
for (l=0;locales[l];++l) {
const struct locale * lang = find_locale(locales[l]);
if (lang) init_tokens(lang);
}
}
/* TODO: soll hier weg */
extern building_type bt_caldera;
extern attrib_type at_traveldir_new;
void
attrib_init(void)
{
/* Gebäudetypen registrieren */
init_buildings();
bt_register(&bt_castle);
bt_register(&bt_lighthouse);
bt_register(&bt_mine);
bt_register(&bt_quarry);
bt_register(&bt_harbour);
bt_register(&bt_academy);
bt_register(&bt_magictower);
bt_register(&bt_smithy);
bt_register(&bt_sawmill);
bt_register(&bt_stables);
bt_register(&bt_monument);
bt_register(&bt_dam);
bt_register(&bt_caravan);
bt_register(&bt_tunnel);
bt_register(&bt_inn);
bt_register(&bt_stonecircle);
bt_register(&bt_blessedstonecircle);
bt_register(&bt_illusion);
bt_register(&bt_generic);
bt_register(&bt_caldera);
/* Schiffstypen registrieren: */
st_register(&st_boat);
st_register(&st_longboat);
st_register(&st_dragonship);
st_register(&st_caravelle);
st_register(&st_trireme);
/* disable: st_register(&st_transport); */
/* Alle speicherbaren Attribute müssen hier registriert werden */
at_register(&at_unitdissolve);
at_register(&at_traveldir_new);
at_register(&at_familiar);
at_register(&at_familiarmage);
at_register(&at_eventhandler);
at_register(&at_stealth);
at_register(&at_mage);
at_register(&at_bauernblut);
at_register(&at_countdown);
at_register(&at_showitem);
at_register(&at_curse);
at_register(&at_cursewall);
at_register(&at_seenspell);
at_register(&at_reportspell);
at_register(&at_deathcloud);
/* neue REGION-Attribute */
at_register(&at_direction);
at_register(&at_moveblock);
#if AT_SALARY
at_register(&at_salary);
#endif
at_register(&at_horseluck);
at_register(&at_peasantluck);
at_register(&at_deathcount);
at_register(&at_chaoscount);
at_register(&at_woodcount);
at_register(&at_laen);
at_register(&at_road);
/* neue UNIT-Attribute */
at_register(&at_alias);
at_register(&at_siege);
at_register(&at_target);
at_register(&at_potion);
at_register(&at_potionuser);
at_register(&at_contact);
at_register(&at_effect);
at_register(&at_private);
#if defined(OLD_TRIGGER)
at_register(&at_pointer_tag);
at_register(&at_relation);
at_register(&at_relbackref);
at_register(&at_trigger);
at_register(&at_action);
#endif
at_register(&at_icastle);
at_register(&at_guard);
at_register(&at_lighthouse);
at_register(&at_group);
at_register(&at_faction_special);
at_register(&at_prayer_timeout);
at_register(&at_prayer_effect);
at_register(&at_wyrm);
at_register(&at_building_generic_type);
/* border-typen */
register_bordertype(&bt_noway);
register_bordertype(&bt_fogwall);
register_bordertype(&bt_wall);
register_bordertype(&bt_illusionwall);
register_bordertype(&bt_firewall);
register_bordertype(&bt_wisps);
register_bordertype(&bt_road);
#if USE_EVENTS
at_register(&at_events);
#endif
at_register(&at_jihad);
}
void void
kernel_init(void) kernel_init(void)
{ {
init_tokens();
skill_init(); skill_init();
attrib_init(); attrib_init();
translation_init(); translation_init();
@ -2054,7 +2240,7 @@ register_faction_id(int id)
boolean boolean
faction_id_is_unused(int id) faction_id_is_unused(int id)
{ {
if(used_faction_ids==NULL) if(used_faction_ids==NULL)
return(true); return(true);
return (boolean)(bsearch(&id, used_faction_ids, no_used_faction_ids, return (boolean)(bsearch(&id, used_faction_ids, no_used_faction_ids,
@ -2147,7 +2333,7 @@ resolve2(void)
#endif #endif
static void static void
init_directions(tnode * root) init_directions(tnode * root)
{ {
/* mit dieser routine kann man mehrere namen für eine direction geben, /* mit dieser routine kann man mehrere namen für eine direction geben,
@ -2488,9 +2674,8 @@ movewhere(region * r, const unit *u)
"(%d,%d) noch nicht generiert!\n", r->x, r->y, "(%d,%d) noch nicht generiert!\n", r->x, r->y,
r->x + delta_x[d], r->y + delta_y[d]); r->x + delta_x[d], r->y + delta_y[d]);
#else #else
sprintf(buf, "%s entdeckt, daß es keinen Weg nach %s gibt.", add_message(&u->faction->msgs,
unitname(u), directions[d]); msg_message("moveblocked", "unit direction", u, d));
addmessage(r, u->faction, buf, MSG_MOVE, ML_WARN);
return NULL; return NULL;
#endif #endif
} }
@ -2504,8 +2689,8 @@ movewhere(region * r, const unit *u)
} }
if (move_blocked(u, r, d) == true) { if (move_blocked(u, r, d) == true) {
add_message(&u->faction->msgs, add_message(&u->faction->msgs,
new_message(u->faction, "moveblocked%u:unit%i:direction", u, d)); msg_message("moveblocked", "unit direction", u, d));
return NULL; return NULL;
} }

View file

@ -138,6 +138,7 @@ struct building_type;
#define BASE36IDS_VERSION 197 #define BASE36IDS_VERSION 197
#define NEWSOURCE_VERSION 197 #define NEWSOURCE_VERSION 197
#define NEWSTATUS_VERSION 198 #define NEWSTATUS_VERSION 198
#define NEWNAMES_VERSION 199
#define LOCALE_VERSION 300 /* TODO */ #define LOCALE_VERSION 300 /* TODO */
/* globale settings des Spieles */ /* globale settings des Spieles */
@ -148,7 +149,7 @@ typedef struct settings {
} settings; } settings;
extern settings global; extern settings global;
#define RELEASE_VERSION NEWSTATUS_VERSION #define RELEASE_VERSION NEWNAMES_VERSION
#define ECHECK_VERSION "3.11" #define ECHECK_VERSION "3.11"
/* changes from->to: 72->73: struct unit::lock entfernt. /* changes from->to: 72->73: struct unit::lock entfernt.
@ -401,7 +402,6 @@ enum {
K_VOTE, K_VOTE,
K_MAGIEGEBIET, K_MAGIEGEBIET,
K_PIRACY, K_PIRACY,
K_LOCALE,
K_RESTART, K_RESTART,
#ifdef GROUPS #ifdef GROUPS
K_GROUP, K_GROUP,
@ -433,6 +433,7 @@ enum {
typedef int param_t; typedef int param_t;
enum { enum {
P_LOCALE,
P_ANY, P_ANY,
P_PEASANT, P_PEASANT,
P_BUILDING, P_BUILDING,
@ -450,13 +451,9 @@ enum {
P_SILVER, P_SILVER,
P_ROAD, P_ROAD,
P_TEMP, P_TEMP,
P_ENEMY,
P_FRIEND,
P_NEUTRAL,
P_FLEE, P_FLEE,
P_GEBAEUDE, P_GEBAEUDE,
P_GIB, P_GIB,
P_OBSERVE,
P_KAEMPFE, P_KAEMPFE,
P_GUARD, P_GUARD,
P_ZAUBER, P_ZAUBER,
@ -569,8 +566,6 @@ enum {
NOSKILL = (skill_t) -1 NOSKILL = (skill_t) -1
}; };
extern const char *skillnames[MAXSKILLS];
/* ------------- Typ von Einheiten ----------------------------- */ /* ------------- Typ von Einheiten ----------------------------- */
enum { enum {
@ -910,15 +905,23 @@ int armedmen(const struct unit * u);
void scat(const char *s); void scat(const char *s);
void icat(int n); void icat(int n);
int findstr(const char **v, const char *s, unsigned char n);
skill_t findskill(const char *s);
int atoip(const char *s); int atoip(const char *s);
int geti(void); int geti(void);
keyword_t igetkeyword(const char *s);
keyword_t getkeyword(void); extern int findstr(const char **v, const char *s, unsigned char n);
keyword_t findkeyword(const char *s);
char *igetstrtoken(const char *s); extern char *igetstrtoken(const char *s);
extern char *getstrtoken(void);
extern skill_t findskill(const char *s, const struct locale * lang);
extern keyword_t findkeyword(const char *s, const struct locale * lang);
extern keyword_t igetkeyword(const char *s, const struct locale * lang);
extern keyword_t getkeyword(const struct locale * lang);
extern param_t findparam(const char *s, const struct locale * lang);
extern param_t igetparam(const char *s, const struct locale * lang);
extern param_t getparam(const struct locale * lang);
#define BASE36_VERSION 93 #define BASE36_VERSION 93
extern int atoi36(const char * s); extern int atoi36(const char * s);
@ -947,12 +950,6 @@ int newunitid(void);
int forbiddenid(int id); int forbiddenid(int id);
int newcontainerid(void); int newcontainerid(void);
char *getstrtoken(void);
char *igetstrtoken(const char *s);
param_t findparam(const char *s);
param_t igetparam(const char *s);
param_t getparam(void);
extern struct unit *createunit(struct region * r, struct faction * f, int number, race_t race); extern struct unit *createunit(struct region * r, struct faction * f, int number, race_t race);
extern struct unit *createunitid(struct region * r1, struct faction * f, int number, race_t race, int id, const char * dname); extern struct unit *createunitid(struct region * r1, struct faction * f, int number, race_t race, int id, const char * dname);
extern boolean getunitpeasants; extern boolean getunitpeasants;
@ -1010,8 +1007,6 @@ void freestrlist(strlist * s);
int change_hitpoints(struct unit *u, int value); int change_hitpoints(struct unit *u, int value);
skill_t findskill(const char *s);
int weight(const struct unit * u); int weight(const struct unit * u);
void changeblockchaos(void); void changeblockchaos(void);

View file

@ -1299,6 +1299,9 @@ init_olditems(void)
item_t i; item_t i;
resource_type * rtype; resource_type * rtype;
const struct locale * lang = find_locale("de");
assert(lang);
for (i=0; i!=MAXITEMS; ++i) { for (i=0; i!=MAXITEMS; ++i) {
int iflags = ITF_NONE; int iflags = ITF_NONE;
int rflags = RTF_ITEM|RTF_POOLED; int rflags = RTF_ITEM|RTF_POOLED;
@ -1354,10 +1357,10 @@ init_olditems(void)
} }
} }
if (name[0]==NULL) { if (name[0]==NULL) {
name[0] = reverse_lookup(NULL, itemdata[i].name[0]); name[0] = reverse_lookup(lang, itemdata[i].name[0]);
name[1] = reverse_lookup(NULL, itemdata[i].name[1]); name[1] = reverse_lookup(lang, itemdata[i].name[1]);
appearance[0] = reverse_lookup(NULL, itemdata[i].name[2]); appearance[0] = reverse_lookup(lang, itemdata[i].name[2]);
appearance[1] = reverse_lookup(NULL, itemdata[i].name[3]); appearance[1] = reverse_lookup(lang, itemdata[i].name[3]);
} }
rtype = new_resourcetype(name, appearance, rflags); rtype = new_resourcetype(name, appearance, rflags);
itype = new_itemtype(rtype, iflags, weight, capacity, minskill, skill); itype = new_itemtype(rtype, iflags, weight, capacity, minskill, skill);
@ -1490,6 +1493,10 @@ init_oldherbs(void)
herb_t h; herb_t h;
const char * names[2]; const char * names[2];
const char * appearance[2] = { "herbbag", "herbbag" }; const char * appearance[2] = { "herbbag", "herbbag" };
const struct locale * lang = find_locale("de");
assert(lang);
for (h=0;h!=MAXHERBS;++h) { for (h=0;h!=MAXHERBS;++h) {
item_type * itype; item_type * itype;
terrain_t t; terrain_t t;
@ -1506,8 +1513,8 @@ init_oldherbs(void)
} }
} }
if (!names[0]) { if (!names[0]) {
names[0] = reverse_lookup(NULL, herbdata[0][h]); names[0] = reverse_lookup(lang, herbdata[0][h]);
names[1] = reverse_lookup(NULL, herbdata[1][h]); names[1] = reverse_lookup(lang, herbdata[1][h]);
} }
rtype = new_resourcetype(names, appearance, RTF_ITEM|RTF_POOLED); rtype = new_resourcetype(names, appearance, RTF_ITEM|RTF_POOLED);
@ -1852,6 +1859,10 @@ init_oldpotions(void)
potion_t p; potion_t p;
const char * names[2]; const char * names[2];
const char * appearance[2] = { "vial", "vials" }; const char * appearance[2] = { "vial", "vials" };
const struct locale * lang = find_locale("de");
assert(lang);
for (p=0;p!=MAXPOTIONS;++p) { for (p=0;p!=MAXPOTIONS;++p) {
item_type * itype; item_type * itype;
resource_type * rtype; resource_type * rtype;
@ -1906,8 +1917,8 @@ init_oldpotions(void)
} }
} }
if (!names[0]) { if (!names[0]) {
names[0] = reverse_lookup(NULL, potionnames[0][p]); names[0] = reverse_lookup(lang, potionnames[0][p]);
names[1] = reverse_lookup(NULL, potionnames[1][p]); names[1] = reverse_lookup(lang, potionnames[1][p]);
} }
rtype = new_resourcetype(names, appearance, RTF_ITEM|RTF_POOLED); rtype = new_resourcetype(names, appearance, RTF_ITEM|RTF_POOLED);

View file

@ -326,7 +326,7 @@ sacrificings(void)
for(r=regions; r; r=r->next) { for(r=regions; r; r=r->next) {
for(u=r->units; u; u=u->next) { for(u=r->units; u; u=u->next) {
if(igetkeyword(u->thisorder) == K_SACRIFICE) { if(igetkeyword(u->thisorder, u->faction->locale) == K_SACRIFICE) {
int n = 1, karma; int n = 1, karma;
char *s = getstrtoken(); char *s = getstrtoken();
@ -338,7 +338,7 @@ sacrificings(void)
s = getstrtoken(); s = getstrtoken();
switch(findparam(s)) { switch(findparam(s, u->faction->locale)) {
case P_SILVER: case P_SILVER:
n = use_pooled(u, r, R_SILVER, n); n = use_pooled(u, r, R_SILVER, n);
@ -386,7 +386,7 @@ prayers(void)
for(r=regions; r; r=r->next) { for(r=regions; r; r=r->next) {
for(u=r->units; u; u=u->next) { for(u=r->units; u; u=u->next) {
for(S = u->orders; S; S = S->next) if(igetkeyword(S->s) == K_PRAY) { for(S = u->orders; S; S = S->next) if(igetkeyword(S->s, u->faction->locale) == K_PRAY) {
attrib *a, *a2; attrib *a, *a2;
unit *u2; unit *u2;
int karma_cost; int karma_cost;
@ -394,9 +394,9 @@ prayers(void)
param_t p; param_t p;
char *s = getstrtoken(); char *s = getstrtoken();
if(findparam(s) == P_FOR) s = getstrtoken(); if(findparam(s, u->faction->locale) == P_FOR) s = getstrtoken();
p = findparam(s); p = findparam(s, u->faction->locale);
switch(p) { switch(p) {
case P_AURA: case P_AURA:
if(!is_mage) { if(!is_mage) {
@ -462,7 +462,7 @@ set_jihad(void)
for(r=regions; r; r=r->next) { for(r=regions; r; r=r->next) {
for(u=r->units; u; u=u->next) { for(u=r->units; u; u=u->next) {
for(S = u->orders; S; S=S->next) if(igetkeyword(S->s) == K_SETJIHAD) { for(S = u->orders; S; S=S->next) if(igetkeyword(S->s, u->faction->locale) == K_SETJIHAD) {
faction *f = u->faction; faction *f = u->faction;
int can = fspecial(f, FS_JIHAD); int can = fspecial(f, FS_JIHAD);
int has = 0; int has = 0;
@ -491,7 +491,7 @@ set_jihad(void)
cmistake(u, S->s, 282, MSG_EVENT); cmistake(u, S->s, 282, MSG_EVENT);
continue; continue;
} }
for(a = a_find(f->attribs, &at_jihad); a; a = a->nexttype) { for(a = a_find(f->attribs, &at_jihad); a; a = a->nexttype) {
if(a->data.sa[0] == jrace) break; if(a->data.sa[0] == jrace) break;
} }
@ -532,7 +532,7 @@ jihad_attacks(void)
strlist *S; strlist *S;
attrib *a; attrib *a;
ally *sf, **sfp; ally *sf, **sfp;
for(f=factions; f; f=f->next) if(fspecial(f, FS_JIHAD)) { for(f=factions; f; f=f->next) if(fspecial(f, FS_JIHAD)) {
for(r=f->first; r != f->last; r = r->next) if(rand()%1000 <= 1) { for(r=f->first; r != f->last; r = r->next) if(rand()%1000 <= 1) {
boolean doit = false; boolean doit = false;
@ -559,7 +559,7 @@ jihad_attacks(void)
if(sf) sf->status = sf->status & (HELP_ALL - HELP_FIGHT); if(sf) sf->status = sf->status & (HELP_ALL - HELP_FIGHT);
sprintf(buf, "%s %s", keywords[K_ATTACK], unitid(u)); sprintf(buf, "%s %s", locale_string(u->faction->locale, keywords[K_ATTACK]), unitid(u));
S = makestrlist(buf); S = makestrlist(buf);
addlist(&u2->orders, S); addlist(&u2->orders, S);
} }

View file

@ -557,7 +557,6 @@ getspell(const unit *u, spellid_t spellid)
/* Spruch identifizieren */ /* Spruch identifizieren */
#include "umlaut.h" #include "umlaut.h"
extern struct tnode spellnames;
spell * spell *
find_spellbyname(unit *u, char *s) find_spellbyname(unit *u, char *s)
@ -565,7 +564,6 @@ find_spellbyname(unit *u, char *s)
sc_mage *m; sc_mage *m;
spell_ptr *spt; spell_ptr *spt;
spell *sp; spell *sp;
int i;
m = get_mage(u); m = get_mage(u);
if (!m) { if (!m) {
@ -578,9 +576,9 @@ find_spellbyname(unit *u, char *s)
return sp; return sp;
} }
} }
#if 0 /* enno: geht vorerst nicht mit locales */
if (findtoken(&spellnames, s, (void**)&i)==0 && getspell(u, spelldaten[i].id)) return &spelldaten[i]; if (findtoken(&spellnames, s, (void**)&i)==0 && getspell(u, spelldaten[i].id)) return &spelldaten[i];
#endif
return (spell *) NULL; return (spell *) NULL;
} }
@ -1940,7 +1938,7 @@ add_spellparameter(region *target_r, unit *u, const char *syntax,
* Einheitennummer kommt dahinter. In beiden Fällen wird der * Einheitennummer kommt dahinter. In beiden Fällen wird der
* Befehl um ein token weiter eingelesen und es muß geprüft * Befehl um ein token weiter eingelesen und es muß geprüft
* werden, ob der Befehlsstring überhaupt lang genug wäre. */ * werden, ob der Befehlsstring überhaupt lang genug wäre. */
switch (findparam(token)) { switch (findparam(token, u->faction->locale)) {
case P_TEMP: case P_TEMP:
i++; i++;
if (par->length < i - skip) { if (par->length < i - skip) {
@ -2086,7 +2084,7 @@ add_spellparameter(region *target_r, unit *u, const char *syntax,
{ /* keyword, dieses Element beschreibt was für ein Typ nachfolgt */ { /* keyword, dieses Element beschreibt was für ein Typ nachfolgt */
c++; /* das nächste Zeichen ist immer ein c für einen c++; /* das nächste Zeichen ist immer ein c für einen
variablen Stringparameter */ variablen Stringparameter */
switch (findparam(token)) { switch (findparam(token, u->faction->locale)) {
case P_REGION: case P_REGION:
{ {
spobj->typ = SPP_REGION; spobj->typ = SPP_REGION;
@ -2109,7 +2107,7 @@ add_spellparameter(region *target_r, unit *u, const char *syntax,
return 0; return 0;
} }
token = strtok(NULL, " "); token = strtok(NULL, " ");
if (findparam(token) == P_TEMP) { if (findparam(token, u->faction->locale) == P_TEMP) {
i++; i++;
if (par->length < i - skip) { if (par->length < i - skip) {
/* Fehler: Ziel vergessen */ /* Fehler: Ziel vergessen */
@ -2611,7 +2609,7 @@ is_moving_ship(const region * r, const ship *sh)
int todo; int todo;
u = shipowner(r, sh); u = shipowner(r, sh);
todo = igetkeyword(u->thisorder); todo = igetkeyword(u->thisorder, u->faction->locale);
if (todo == K_ROUTE || todo == K_MOVE || todo == K_FOLLOW){ if (todo == K_ROUTE || todo == K_MOVE || todo == K_FOLLOW){
return true; return true;
} }
@ -2657,7 +2655,7 @@ magic(void)
} }
for (so = u->orders; so; so = so->next) { for (so = u->orders; so; so = so->next) {
if (igetkeyword(so->s) == K_CAST) { if (igetkeyword(so->s, u->faction->locale) == K_CAST) {
if (fval(u, FL_HUNGER)) { if (fval(u, FL_HUNGER)) {
cmistake(u, so->s, 224, MSG_MAGIC); cmistake(u, so->s, 224, MSG_MAGIC);
continue; continue;
@ -2674,7 +2672,7 @@ magic(void)
skiptokens = 1; skiptokens = 1;
s = getstrtoken(); s = getstrtoken();
/* für Syntax ' STUFE x REGION y z ' */ /* für Syntax ' STUFE x REGION y z ' */
if (findparam(s) == P_LEVEL) { if (findparam(s, u->faction->locale) == P_LEVEL) {
s = getstrtoken(); s = getstrtoken();
level = min(atoip(s), level); level = min(atoip(s), level);
s = getstrtoken(); s = getstrtoken();
@ -2685,7 +2683,7 @@ magic(void)
continue; continue;
} }
} }
if (findparam(s) == P_REGION) { if (findparam(s, u->faction->locale) == P_REGION) {
t_x = atoi(getstrtoken()); t_x = atoi(getstrtoken());
t_x = rel_to_abs(getplane(u->region),u->faction,t_x,0); t_x = rel_to_abs(getplane(u->region),u->faction,t_x,0);
t_y = atoi(getstrtoken()); t_y = atoi(getstrtoken());
@ -2701,7 +2699,7 @@ magic(void)
} }
/* für Syntax ' REGION x y STUFE z ' /* für Syntax ' REGION x y STUFE z '
* hier nach REGION nochmal auf STUFE prüfen */ * hier nach REGION nochmal auf STUFE prüfen */
if (findparam(s) == P_LEVEL) { if (findparam(s, u->faction->locale) == P_LEVEL) {
s = getstrtoken(); s = getstrtoken();
level = min(atoip(s), level); level = min(atoip(s), level);
s = getstrtoken(); s = getstrtoken();

View file

@ -245,11 +245,54 @@ read_messages(FILE * F, const locale * lang)
unused(lang); unused(lang);
} }
message * static void
make_message(const char * name, const char* sig, ...) arg_set(void * args[], const message_type * mtype, char * buffer, void * v)
/* make_message("oops_error", "unit region command", u, r, cmd) */
{ {
int i; int i;
for (i=0;i!=mtype->nparameters;++i) {
if (!strcmp(buffer, mtype->pnames[i])) break;
}
if (i!=mtype->nparameters) args[i] = v;
}
struct message *
msg_error(const struct unit * u, const char * cmd, const char * name, const char* sig, ...)
{
va_list marker;
const message_type * mtype = mt_find(name);
char buffer[64], *oc = buffer;
const char *ic = sig;
void * args[16];
memset(args, 0, sizeof(args));
if (cmd==NULL) cmd = u->thisorder;
if (!mtype) {
fprintf(stderr, "trying to create message of unknown type \"%s\"\n", name);
return NULL;
}
arg_set(args, mtype, "unit", (void*)u);
arg_set(args, mtype, "region", (void*)u->region);
arg_set(args, mtype, "command", (void*)cmd);
va_start(marker, sig);
while (*ic && !isalnum(*ic)) ic++;
while (*ic) {
void * v = va_arg(marker, void *);
while (isalnum(*ic)) *oc++ = *ic++;
*oc = '\0';
arg_set(args, mtype, buffer, v);
while (*ic && !isalnum(*ic)) ic++;
}
va_end(marker);
return msg_create(mtype, (void**)args);
}
message *
msg_message(const char * name, const char* sig, ...)
/* msg_message("oops_error", "unit region command", u, r, cmd) */
{
va_list marker; va_list marker;
const message_type * mtype = mt_find(name); const message_type * mtype = mt_find(name);
char buffer[64], *oc = buffer; char buffer[64], *oc = buffer;
@ -268,10 +311,7 @@ make_message(const char * name, const char* sig, ...)
void * v = va_arg(marker, void *); void * v = va_arg(marker, void *);
while (isalnum(*ic)) *oc++ = *ic++; while (isalnum(*ic)) *oc++ = *ic++;
*oc = '\0'; *oc = '\0';
for (i=0;i!=mtype->nparameters;++i) { arg_set(args, mtype, buffer, v);
if (!strcmp(buffer, mtype->pnames[i])) break;
}
if (i!=mtype->nparameters) args[i] = v;
while (*ic && !isalnum(*ic)) ic++; while (*ic && !isalnum(*ic)) ic++;
} }
va_end(marker); va_end(marker);
@ -369,7 +409,7 @@ new_message(struct faction * receiver, const char* sig, ...)
args[i] = (void*)va_arg(marker, skill_t); args[i] = (void*)va_arg(marker, skill_t);
break; break;
case 'd': case 'd':
args[i] = (void*)directions[i]; args[i] = (void*)i;
break; break;
case 'S': case 'S':
default: default:

View file

@ -49,8 +49,9 @@ void write_msglevels(struct warning * warnings, FILE * F);
void read_msglevels(struct warning ** w, FILE * F); void read_msglevels(struct warning ** w, FILE * F);
void set_msglevel(struct warning ** warnings, const char * type, int level); void set_msglevel(struct warning ** warnings, const char * type, int level);
extern struct message * make_message(const char * name, const char* sig, ...); extern struct message * msg_message(const char * name, const char* sig, ...);
extern struct message * new_message(struct faction * receiver, const char * signature, ...); extern struct message * msg_error(const struct unit *, const char *,
const char * name, const char* sig, ...);
extern struct message * add_message(struct message_list** pm, struct message * m); extern struct message * add_message(struct message_list** pm, struct message * m);
extern void free_messages(struct message_list * m); extern void free_messages(struct message_list * m);
extern void read_messages(FILE * F, const struct locale * lang); extern void read_messages(FILE * F, const struct locale * lang);
@ -60,4 +61,7 @@ extern struct messageclass * msgclasses;
extern const struct messageclass * mc_add(const char * name); extern const struct messageclass * mc_add(const char * name);
extern const struct messageclass * mc_find(const char * name); extern const struct messageclass * mc_find(const char * name);
/* convenience, deprecated */
extern struct message * new_message(struct faction * receiver, const char * signature, ...);
#endif #endif

View file

@ -575,7 +575,7 @@ coords_or_direction(region *r, faction *f, int dir)
plane *pl = getplane(r); plane *pl = getplane(r);
if(fval(pl, PFL_NOCOORDS)) { if(fval(pl, PFL_NOCOORDS)) {
strcpy(lbuf, directions[dir]); strcpy(lbuf, locale_string(f->locale, directions[dir]));
} else { } else {
sprintf(lbuf, "(%d,%d)",region_x(r,f), region_y(r,f)); sprintf(lbuf, "(%d,%d)",region_x(r,f), region_y(r,f));
} }
@ -703,16 +703,14 @@ is_guarded(region * r, unit * u, unsigned int mask)
return NULL; return NULL;
} }
const char *shortdirections[MAXDIRECTIONS+2] = const char *shortdirections[MAXDIRECTIONS] =
{ {
"NW", "dir_NW",
"NO", "dir_NO",
"Ost", "dir_Ost",
"SO", "dir_SO",
"SW", "dir_SW",
"West", "dir_West"
"",
"Pause"
}; };
void void
@ -726,10 +724,10 @@ cycle_route(unit *u, int gereist)
boolean paused = false; boolean paused = false;
boolean pause; boolean pause;
if (igetkeyword(u->thisorder) != K_ROUTE) return; if (igetkeyword(u->thisorder, u->faction->locale) != K_ROUTE) return;
tail[0] = '\0'; tail[0] = '\0';
strcpy(neworder, keywords[K_ROUTE]); strcpy(neworder, locale_string(u->faction->locale, keywords[K_ROUTE]));
for (cm=0;;++cm) { for (cm=0;;++cm) {
pause = false; pause = false;
@ -742,19 +740,19 @@ cycle_route(unit *u, int gereist)
} }
if (cm<gereist) { if (cm<gereist) {
/* hier sollte keine PAUSE auftreten */ /* hier sollte keine PAUSE auftreten */
if (!pause) strcat(strcat(tail, " "), shortdirections[d]); if (!pause) strcat(strcat(tail, " "), locale_string(u->faction->locale, shortdirections[d]));
} }
else if (cm==gereist && !paused && pause){ else if (cm==gereist && !paused && pause){
strcat(strcat(tail, " "), parameters[P_PAUSE]); strcat(strcat(tail, " "), locale_string(u->faction->locale, parameters[P_PAUSE]));
paused=true; paused=true;
} }
/* da PAUSE nicht in ein shortdirections[d] umgesetzt wird (ist /* da PAUSE nicht in ein shortdirections[d] umgesetzt wird (ist
* hier keine normale direction), muss jede PAUSE einzeln * hier keine normale direction), muss jede PAUSE einzeln
* herausgefiltert und explizit gesetzt werden */ * herausgefiltert und explizit gesetzt werden */
else if (pause) { else if (pause) {
strcat(strcat(neworder, " "), parameters[P_PAUSE]); strcat(strcat(neworder, " "), locale_string(u->faction->locale, parameters[P_PAUSE]));
} else } else
strcat(strcat(neworder, " "), shortdirections[d]); strcat(strcat(neworder, " "), locale_string(u->faction->locale, shortdirections[d]));
} }
strcat(neworder, tail); strcat(neworder, tail);
@ -775,14 +773,14 @@ init_drive(void)
* doesn't seem to be an easy way to speed this up. */ * doesn't seem to be an easy way to speed this up. */
for(u=r->units; u; u=u->next) { for(u=r->units; u; u=u->next) {
if(igetkeyword(u->thisorder) == K_DRIVE && !fval(u, FL_LONGACTION)) { if(igetkeyword(u->thisorder, u->faction->locale) == K_DRIVE && !fval(u, FL_LONGACTION)) {
boolean found = false; boolean found = false;
ut = getunit(r, u); ut = getunit(r, u);
if(!ut) { if(!ut) {
cmistake(u, findorder(u, u->thisorder), 64, MSG_MOVE); cmistake(u, findorder(u, u->thisorder), 64, MSG_MOVE);
continue; continue;
} }
for (S = ut->orders; S; S = S->next) if (igetkeyword(S->s) == K_TRANSPORT) { for (S = ut->orders; S; S = S->next) if (igetkeyword(S->s, u->faction->locale) == K_TRANSPORT) {
if(getunit(r, ut) == u) { if(getunit(r, ut) == u) {
found = true; found = true;
break; break;
@ -805,11 +803,11 @@ init_drive(void)
for (u=r->units; u; u=u->next) { for (u=r->units; u; u=u->next) {
w = 0; w = 0;
for (S = u->orders; S; S = S->next) if(igetkeyword(S->s) == K_TRANSPORT) { for (S = u->orders; S; S = S->next) if(igetkeyword(S->s, u->faction->locale) == K_TRANSPORT) {
ut = getunit(r, u); ut = getunit(r, u);
if(!ut) continue; if(!ut) continue;
if (igetkeyword(ut->thisorder) == K_DRIVE && !fval(ut, FL_LONGACTION)) { if (igetkeyword(ut->thisorder, u->faction->locale) == K_DRIVE && !fval(ut, FL_LONGACTION)) {
u2 = getunit(r, u); u2 = getunit(r, u);
if(u2 == u) { if(u2 == u) {
w += weight(ut); w += weight(ut);
@ -845,7 +843,7 @@ cantravel(const unit *u, const region *from, const region * to, boolean (*allowe
} else if (get_item(u, I_HORSE) > 0) { } else if (get_item(u, I_HORSE) > 0) {
return ETRAVEL_NORIDE|ETRAVEL_NOSWIM; return ETRAVEL_NORIDE|ETRAVEL_NOSWIM;
} }
} }
if (!u->ship && leftship(u) && is_guarded(from, u, GUARD_LANDING)) { if (!u->ship && leftship(u) && is_guarded(from, u, GUARD_LANDING)) {
/* An Land kein NACH wenn in dieser Runde Schiff VERLASSEN! */ /* An Land kein NACH wenn in dieser Runde Schiff VERLASSEN! */
return ETRAVEL_LEFTSHIP; return ETRAVEL_LEFTSHIP;
@ -896,8 +894,8 @@ travel(region * first, unit * u, region * next, int flucht)
* Normalerweise verliert man 3 BP pro Region, bei Straßen nur 2 BP. * Normalerweise verliert man 3 BP pro Region, bei Straßen nur 2 BP.
* Außerdem: Wenn Einheit transportiert, nur halbe BP */ * Außerdem: Wenn Einheit transportiert, nur halbe BP */
if (rterrain(current)==T_OCEAN if (rterrain(current)==T_OCEAN
&& !(race[u->race].flags&(RCF_FLY) && rterrain(next)!=T_OCEAN)) && !(race[u->race].flags&(RCF_FLY) && rterrain(next)!=T_OCEAN))
{ /* Die Einheit kann nicht fliegen, ist im Ozean, und will an Land */ { /* Die Einheit kann nicht fliegen, ist im Ozean, und will an Land */
if (u->race != RC_AQUARIAN) if (u->race != RC_AQUARIAN)
{ {
@ -963,7 +961,7 @@ travel(region * first, unit * u, region * next, int flucht)
/* faction special */ /* faction special */
if(fspecial(u->faction, FS_QUICK)) if(fspecial(u->faction, FS_QUICK))
mp = BP_RIDING; mp = BP_RIDING;
/* Siebenmeilentee */ /* Siebenmeilentee */
if (get_effect(u, oldpotiontype[P_FAST]) >= u->number) if (get_effect(u, oldpotiontype[P_FAST]) >= u->number)
mp *= 2; mp *= 2;
@ -1149,11 +1147,11 @@ travel(region * first, unit * u, region * next, int flucht)
/* und jetzt noch die transportierten Einheiten verschieben */ /* und jetzt noch die transportierten Einheiten verschieben */
for (S = u->orders; S; S = S->next) { for (S = u->orders; S; S = S->next) {
if (igetkeyword(S->s) == K_TRANSPORT) { if (igetkeyword(S->s, u->faction->locale) == K_TRANSPORT) {
ut = getunit(first, u); ut = getunit(first, u);
if (ut) { if (ut) {
boolean found = false; boolean found = false;
if (igetkeyword(ut->thisorder) == K_DRIVE if (igetkeyword(ut->thisorder, u->faction->locale) == K_DRIVE
&& !fval(ut, FL_LONGACTION)) { && !fval(ut, FL_LONGACTION)) {
u2 = getunit(first, ut); u2 = getunit(first, ut);
if(u2 == u) { if(u2 == u) {
@ -1316,7 +1314,7 @@ check_takeoff(ship *sh, region *from, region *to)
return true; return true;
} }
boolean boolean
ship_allowed(const struct ship_type * type, region * r) ship_allowed(const struct ship_type * type, region * r)
{ {
int c = 0; int c = 0;
@ -1377,7 +1375,7 @@ sail(region * starting_point, unit * u, region * next_point, boolean move_on_lan
plane *pl = getplane(next_point); plane *pl = getplane(next_point);
if(pl && fval(pl, PFL_NOCOORDS)) { if(pl && fval(pl, PFL_NOCOORDS)) {
sprintf(buf, "Die %s entdeckt, daß im %s Festland ist.", sprintf(buf, "Die %s entdeckt, daß im %s Festland ist.",
shipname(u->ship), directions[dir]); shipname(u->ship), locale_string(u->faction->locale, directions[dir]));
} else { } else {
sprintf(buf, "Die %s entdeckt, daß (%d,%d) Festland ist.", sprintf(buf, "Die %s entdeckt, daß (%d,%d) Festland ist.",
shipname(u->ship), region_x(next_point,u->faction), shipname(u->ship), region_x(next_point,u->faction),
@ -1680,7 +1678,7 @@ move(region * r, unit * u, boolean move_on_land)
region * rc = rconnect(r2,d); region * rc = rconnect(r2,d);
if (rc) { if (rc) {
sprintf(buf, "Im %s ist eine ungeheure magische Präsenz zu verspüren.", sprintf(buf, "Im %s ist eine ungeheure magische Präsenz zu verspüren.",
directions[back[d]]); locale_string(u->faction->locale, directions[back[d]]));
addmessage(rc, NULL, buf, MSG_EVENT, ML_IMPORTANT); addmessage(rc, NULL, buf, MSG_EVENT, ML_IMPORTANT);
} }
} }
@ -1697,11 +1695,11 @@ move(region * r, unit * u, boolean move_on_land)
if (a && a->data.v==u) { if (a && a->data.v==u) {
/* wir basteln ihm ein NACH */ /* wir basteln ihm ein NACH */
int k, i = 0; int k, i = 0;
strcpy(buf, keywords[K_MOVE]); strcpy(buf, locale_string(u->faction->locale, keywords[K_MOVE]));
while (route[i]!=NODIRECTION) while (route[i]!=NODIRECTION)
strcat(strcat(buf, " "), directions[route[i++]]); strcat(strcat(buf, " "), locale_string(u->faction->locale, directions[route[i++]]));
set_string(&uf->thisorder, buf); set_string(&uf->thisorder, buf);
k = igetkeyword(uf->thisorder); k = igetkeyword(uf->thisorder, u->faction->locale);
assert(k==K_MOVE); assert(k==K_MOVE);
move(r, uf, true); move(r, uf, true);
} }
@ -1820,11 +1818,12 @@ piracy(unit *u)
"piratesawvictim%h:ship%r:region%d:dir", sh, r, target_dir)); "piratesawvictim%h:ship%r:region%d:dir", sh, r, target_dir));
/* Befehl konstruieren */ /* Befehl konstruieren */
sprintf(buf, "%s %s", keywords[K_MOVE], directions[target_dir]); sprintf(buf, "%s %s", locale_string(u->faction->locale, keywords[K_MOVE]),
locale_string(u->faction->locale, directions[target_dir]));
set_string(&u->thisorder, buf); set_string(&u->thisorder, buf);
/* Bewegung ausführen */ /* Bewegung ausführen */
igetkeyword(u->thisorder); /* NACH ignorieren */ igetkeyword(u->thisorder, u->faction->locale); /* NACH ignorieren */
move(r, u, true); move(r, u, true);
} }
@ -1895,21 +1894,22 @@ hunt(unit *u)
return false; return false;
} }
sprintf(command, "%s %s", keywords[K_MOVE], directions[dir]); sprintf(command, "%s %s", locale_string(u->faction->locale, keywords[K_MOVE]),
locale_string(u->faction->locale, directions[dir]));
moves = 1; moves = 1;
rc = rconnect(rc, dir); rc = rconnect(rc, dir);
while(moves < shipspeed(u->ship, u) while(moves < shipspeed(u->ship, u)
&& (dir = hunted_dir(rc->attribs, id)) != NODIRECTION) { && (dir = hunted_dir(rc->attribs, id)) != NODIRECTION) {
strcat(command, " "); strcat(command, " ");
strcat(command, directions[dir]); strcat(command, locale_string(u->faction->locale, directions[dir]));
moves++; moves++;
rc = rconnect(rc, dir); rc = rconnect(rc, dir);
} }
/* In command steht jetzt das NACH-Kommando. */ /* In command steht jetzt das NACH-Kommando. */
igetkeyword(command); /* NACH ignorieren und Parsing initialisieren. */ igetkeyword(command, u->faction->locale); /* NACH ignorieren und Parsing initialisieren. */
move(u->region, u, false); /* NACH ausführen */ move(u->region, u, false); /* NACH ausführen */
return true; /* true -> Einheitenliste von vorne durchgehen */ return true; /* true -> Einheitenliste von vorne durchgehen */
} }
@ -2018,7 +2018,7 @@ movement(void)
up = &u; up = &u;
if (u==NULL) break; if (u==NULL) break;
} }
kword = igetkeyword(u->thisorder); kword = igetkeyword(u->thisorder, u->faction->locale);
switch (kword) { switch (kword) {
case K_ROUTE: case K_ROUTE:
case K_MOVE: case K_MOVE:
@ -2053,7 +2053,7 @@ movement(void)
param_t p; param_t p;
for (o=u->orders;o;o=o->next) { for (o=u->orders;o;o=o->next) {
if(igetkeyword(o->s) == K_FOLLOW) { if(igetkeyword(o->s, u->faction->locale) == K_FOLLOW) {
if(attacked(u)) { if(attacked(u)) {
cmistake(u, o->s, 52, MSG_MOVE); cmistake(u, o->s, 52, MSG_MOVE);
u = u2; break; u = u2; break;
@ -2062,7 +2062,7 @@ movement(void)
u = u2; break; u = u2; break;
} }
p = getparam(); p = getparam(u->faction->locale);
if(p != P_SHIP) { if(p != P_SHIP) {
if(p != P_UNIT) { if(p != P_UNIT) {
cmistake(u, o->s, 240, MSG_MOVE); cmistake(u, o->s, 240, MSG_MOVE);
@ -2087,8 +2087,8 @@ movement(void)
for (u = r->units; u;) { for (u = r->units; u;) {
unit * u2 = u->next; unit * u2 = u->next;
if (utarget(u) if (utarget(u)
&& (igetkeyword(u->thisorder) == K_MOVE && (igetkeyword(u->thisorder, u->faction->locale) == K_MOVE
|| igetkeyword(u->thisorder) == K_ROUTE)) { || igetkeyword(u->thisorder, u->faction->locale) == K_ROUTE)) {
if (attacked(u)) { if (attacked(u)) {
cmistake(u, findorder(u, u->thisorder), 52, MSG_PRODUCE); cmistake(u, findorder(u, u->thisorder), 52, MSG_PRODUCE);
} else if (race[u->race].flags & RCF_CANNOTMOVE) { } else if (race[u->race].flags & RCF_CANNOTMOVE) {
@ -2110,7 +2110,7 @@ movement(void)
unit * u; unit * u;
for(u = r->units; u;) { for(u = r->units; u;) {
unit *un = u->next; unit *un = u->next;
if(igetkeyword(u->thisorder) == K_PIRACY) piracy(u); if(igetkeyword(u->thisorder, u->faction->locale) == K_PIRACY) piracy(u);
u = un; u = un;
} }
a_removeall(&r->attribs, &at_piracy_direction); a_removeall(&r->attribs, &at_piracy_direction);
@ -2130,8 +2130,8 @@ follow(void)
if (fval(u, FL_LONGACTION)) continue; if (fval(u, FL_LONGACTION)) continue;
a = a_find(u->attribs, &at_follow); a = a_find(u->attribs, &at_follow);
for (o=u->orders;o;o=o->next) { for (o=u->orders;o;o=o->next) {
if (igetkeyword(o->s) == K_FOLLOW if (igetkeyword(o->s, u->faction->locale) == K_FOLLOW
&& getparam() == P_UNIT) { && getparam(u->faction->locale) == P_UNIT) {
int id = read_unitid(u->faction, r); int id = read_unitid(u->faction, r);
if (id>0) { if (id>0) {
unit * uf = findunit(id); unit * uf = findunit(id);
@ -2151,7 +2151,7 @@ follow(void)
if (!u2 || u2->region!=r || !cansee(u->faction, r, u2, 0)) if (!u2 || u2->region!=r || !cansee(u->faction, r, u2, 0))
continue; continue;
for (o=u2->orders;o;o=o->next) { for (o=u2->orders;o;o=o->next) {
switch (igetkeyword(o->s)) { switch (igetkeyword(o->s, u2->faction->locale)) {
case K_MOVE: case K_MOVE:
case K_ROUTE: case K_ROUTE:
case K_PIRACY: case K_PIRACY:

View file

@ -378,7 +378,7 @@ init_pool(void)
strlist *s; strlist *s;
list_foreach(strlist, u->orders, s) { list_foreach(strlist, u->orders, s) {
if (u->number > 0 && igetkeyword(s->s) == K_RESERVE if (u->number > 0 && igetkeyword(s->s, u->faction->locale) == K_RESERVE
&& (urace(u)->ec_flags & GETITEM)) { && (urace(u)->ec_flags & GETITEM)) {
int count = geti(); int count = geti();
int use; int use;

View file

@ -400,7 +400,7 @@ struct racedata race[MAXRACES] =
true, true,
RCF_KILLPEASANTS|RCF_SCAREPEASANTS|RCF_ATTACKRANDOM|RCF_LEARN|RCF_FLY|RCF_WALK|RCF_NOTEACH, RCF_KILLPEASANTS|RCF_SCAREPEASANTS|RCF_ATTACKRANDOM|RCF_LEARN|RCF_FLY|RCF_WALK|RCF_NOTEACH,
BF_MAGIC_EQUIPMENT, BF_MAGIC_EQUIPMENT,
GETITEM | HOARDMONEY | CANGUARD, GETITEM | CANGUARD,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}, {NORACE,NORACE,NORACE,NORACE,NORACE,NORACE},
&drachen_name, &age_firedragon, &allowed_dragon &drachen_name, &age_firedragon, &allowed_dragon
}, },
@ -421,7 +421,7 @@ struct racedata race[MAXRACES] =
true, true,
( RCF_KILLPEASANTS|RCF_SCAREPEASANTS|RCF_ATTACKRANDOM|RCF_LEARN|RCF_FLY|RCF_WALK|RCF_NOTEACH ), ( RCF_KILLPEASANTS|RCF_SCAREPEASANTS|RCF_ATTACKRANDOM|RCF_LEARN|RCF_FLY|RCF_WALK|RCF_NOTEACH ),
( BF_MAGIC_EQUIPMENT ), ( BF_MAGIC_EQUIPMENT ),
GETITEM | HOARDMONEY | CANGUARD, GETITEM | CANGUARD,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}, {NORACE,NORACE,NORACE,NORACE,NORACE,NORACE},
&drachen_name, &age_dragon, &allowed_dragon &drachen_name, &age_dragon, &allowed_dragon
}, },
@ -442,7 +442,7 @@ struct racedata race[MAXRACES] =
true, true,
( RCF_KILLPEASANTS|RCF_SCAREPEASANTS|RCF_ATTACKRANDOM|RCF_LEARN|RCF_FLY|RCF_WALK|RCF_NOTEACH ), ( RCF_KILLPEASANTS|RCF_SCAREPEASANTS|RCF_ATTACKRANDOM|RCF_LEARN|RCF_FLY|RCF_WALK|RCF_NOTEACH ),
( BF_MAGIC_EQUIPMENT ), ( BF_MAGIC_EQUIPMENT ),
GETITEM | HOARDMONEY | CANGUARD, GETITEM | CANGUARD,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}, {NORACE,NORACE,NORACE,NORACE,NORACE,NORACE},
&drachen_name, NULL, &allowed_dragon &drachen_name, NULL, &allowed_dragon
}, },
@ -1060,7 +1060,7 @@ struct racedata race[MAXRACES] =
true, true,
RCF_KILLPEASANTS|RCF_SCAREPEASANTS|RCF_ATTACKRANDOM|RCF_LEARN|RCF_NOTEACH|RCF_SWIM|RCF_MOVERANDOM, RCF_KILLPEASANTS|RCF_SCAREPEASANTS|RCF_ATTACKRANDOM|RCF_LEARN|RCF_NOTEACH|RCF_SWIM|RCF_MOVERANDOM,
(0), (0),
GETITEM | HOARDMONEY | CANGUARD, GETITEM | CANGUARD,
{NORACE,NORACE,NORACE,NORACE,NORACE,NORACE}, {NORACE,NORACE,NORACE,NORACE,NORACE,NORACE},
&drachen_name, NULL, &allowed_swim &drachen_name, NULL, &allowed_swim
}, },

View file

@ -105,11 +105,10 @@ typedef struct race_type {
#define GIVEPERSON (1<<2) /* übergibt Personen */ #define GIVEPERSON (1<<2) /* übergibt Personen */
#define GIVEUNIT (1<<3) /* Einheiten an andere Partei übergeben */ #define GIVEUNIT (1<<3) /* Einheiten an andere Partei übergeben */
#define GETITEM (1<<4) /* nimmt Gegenstände an */ #define GETITEM (1<<4) /* nimmt Gegenstände an */
#define HOARDMONEY (1<<5) /* geben niemals Silber weg */ #define CANGUARD (1<<5) /* bewachen auch ohne Waffen */
#define CANGUARD (1<<6) /* bewachen auch ohne Waffen */ #define ECF_REC_HORSES (1<<6) /* Rekrutiert aus Pferden */
#define ECF_REC_HORSES (1<<7) /* Rekrutiert aus Pferden */ #define ECF_REC_ETHEREAL (1<<7) /* Rekrutiert aus dem Nichts */
#define ECF_REC_ETHEREAL (1<<8) /* Rekrutiert aus dem Nichts */ #define ECF_REC_UNLIMITED (1<<8) /* Rekrutiert ohne Limit */
#define ECF_REC_UNLIMITED (1<<9) /* Rekrutiert ohne Limit */
/* Battle-Flags */ /* Battle-Flags */
#define BF_EQUIPMENT (1<<0) #define BF_EQUIPMENT (1<<0)

View file

@ -42,7 +42,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
static int g_maxluxuries; static int g_maxluxuries = 0;
const int delta_x[MAXDIRECTIONS] = const int delta_x[MAXDIRECTIONS] =
{ {
@ -730,6 +730,7 @@ setluxuries(region * r, const luxury_type * sale)
void void
terraform(region * r, terrain_t t) terraform(region * r, terrain_t t)
{ {
const struct locale * locale_de = find_locale("de");
/* defaults: */ /* defaults: */
rsetterrain(r, t); rsetterrain(r, t);
@ -816,7 +817,7 @@ terraform(region * r, terrain_t t)
if (terrain[r->terrain].herbs) name = terrain[r->terrain].herbs[rand()%3]; if (terrain[r->terrain].herbs) name = terrain[r->terrain].herbs[rand()%3];
if (name != NULL) { if (name != NULL) {
const item_type * itype = finditemtype(name, NULL); const item_type * itype = finditemtype(name, locale_de);
const herb_type * htype = resource2herb(itype->rtype); const herb_type * htype = resource2herb(itype->rtype);
rsetherbtype(r, htype); rsetherbtype(r, htype);
rsetherbs(r, (short)(50+rand()%31)); rsetherbs(r, (short)(50+rand()%31));

View file

@ -182,7 +182,6 @@ bufunit(const faction * f, const unit * u, int indent,
skill_t sk; skill_t sk;
int getarnt = fval(u, FL_PARTEITARNUNG); int getarnt = fval(u, FL_PARTEITARNUNG);
attrib *a_otherfaction = NULL; attrib *a_otherfaction = NULL;
const char *c;
const char *pzTmp; const char *pzTmp;
spell *sp; spell *sp;
building * b; building * b;
@ -239,14 +238,14 @@ bufunit(const faction * f, const unit * u, int indent,
pzTmp = get_racename(u->attribs); pzTmp = get_racename(u->attribs);
if (pzTmp || u->irace != u->race) { if (pzTmp || u->irace != u->race) {
if (pzTmp) scat(pzTmp); if (pzTmp) scat(pzTmp);
else scat(race[u->irace].name[u->number != 1]); else scat(locale_string(f->locale, race[u->irace].name[u->number != 1]));
if (u->faction == f) { if (u->faction == f) {
scat(" ("); scat(" (");
scat(race[u->race].name[u->number != 1]); scat(locale_string(f->locale, race[u->race].name[u->number != 1]));
scat(")"); scat(")");
} }
} else { } else {
scat(race[u->race].name[u->number != 1]); scat(locale_string(f->locale, race[u->race].name[u->number != 1]));
} }
/* status */ /* status */
@ -286,7 +285,7 @@ bufunit(const faction * f, const unit * u, int indent,
dh = 0; dh = 0;
if (u->faction == f || telepath_see) { if (u->faction == f || telepath_see) {
for (sk = 0; sk != MAXSKILLS; sk++) { for (sk = 0; sk != MAXSKILLS; sk++) {
spskill(u, sk, &dh, 1); spskill(f->locale, u, sk, &dh, 1);
} }
} }
@ -436,7 +435,7 @@ bufunit(const faction * f, const unit * u, int indent,
} }
void void
spskill(const struct unit * u, skill_t sk, int *dh, int days) spskill(const struct locale * lang, const struct unit * u, skill_t sk, int *dh, int days)
{ {
int i, d; int i, d;
if (!u->number) if (!u->number)
@ -452,7 +451,7 @@ spskill(const struct unit * u, skill_t sk, int *dh, int days)
scat("Talente: "); scat("Talente: ");
*dh = 1; *dh = 1;
} }
scat(skillnames[sk]); scat(skillname(sk, lang));
scat(" "); scat(" ");
if (sk == SK_MAGIC){ if (sk == SK_MAGIC){
@ -543,7 +542,7 @@ spy_message(int spy, unit *u, unit *target)
} else { } else {
scat(", "); scat(", ");
} }
scat(skillnames[sk]); scat(skillname(sk, u->faction->locale));
} }
} }
if (found == 0) { if (found == 0) {
@ -578,7 +577,7 @@ spy_message(int spy, unit *u, unit *target)
} else { } else {
scat(", "); scat(", ");
} }
scat(skillnames[sk]); scat(skillname(sk, u->faction->locale));
scat(" "); scat(" ");
icat(eff_skill(target, sk, target->region)); icat(eff_skill(target, sk, target->region));
} }

View file

@ -39,7 +39,7 @@ extern int read_datenames(const char *filename);
void sparagraph(struct strlist ** SP, const char *s, int indent, char mark); void sparagraph(struct strlist ** SP, const char *s, int indent, char mark);
void lparagraph(struct strlist ** SP, char *s, int indent, char mark); void lparagraph(struct strlist ** SP, char *s, int indent, char mark);
const char *hp_status(const struct unit * u); const char *hp_status(const struct unit * u);
extern void spskill(const struct unit * u, skill_t sk, int *dh, int days); /* mapper */ extern void spskill(const struct locale * lang, const struct unit * u, skill_t sk, int *dh, int days); /* mapper */
extern void spunit(struct strlist ** SP, const struct faction * f, const struct unit * u, int indent, int mode); extern void spunit(struct strlist ** SP, const struct faction * f, const struct unit * u, int indent, int mode);
void reports(void); void reports(void);

View file

@ -37,7 +37,6 @@
#include "unit.h" #include "unit.h"
#include "skill.h" #include "skill.h"
#include "message.h" #include "message.h"
#include "monster.h"
#include "objtypes.h" #include "objtypes.h"
#include "border.h" #include "border.h"
#include "karma.h" #include "karma.h"
@ -377,8 +376,8 @@ readunit(FILE * F, struct faction * f)
if (!getbuf(F)) if (!getbuf(F))
break; break;
if (igetkeyword(buf) == NOKEYWORD) { if (igetkeyword(buf, u->faction->locale) == NOKEYWORD) {
p = igetparam(buf); p = igetparam(buf, u->faction->locale);
if (p == P_UNIT || p == P_FACTION || p == P_NEXT) if (p == P_UNIT || p == P_FACTION || p == P_NEXT)
break; break;
} }
@ -473,9 +472,6 @@ version(void)
} }
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
/* TODO: soll hier weg */
extern building_type bt_caldera;
int int
readorders(const char *filename) readorders(const char *filename)
{ {
@ -495,12 +491,31 @@ readorders(const char *filename)
* Partei */ * Partei */
while (b) { while (b) {
const struct locale * lang = f?f->locale:NULL;
int p; int p;
const char * s;
switch (igetparam(b)) { switch (igetparam(b, lang)) {
case P_LOCALE:
s = getstrtoken();
#define LOCALES
#ifdef LOCALES
if (f && find_locale(s)) {
f->locale = find_locale(s);
}
#else
if(strcmp(s, "de") == 0) {
f->locale = find_locale(s);
}
#endif
b = getbuf(F);
break;
case P_FACTION: case P_FACTION:
f = readfaction(); f = readfaction();
if (f) ++nfactions; if (f) {
++nfactions;
}
b = getbuf(F); b = getbuf(F);
@ -515,7 +530,7 @@ readorders(const char *filename)
if (!f || !readunit(F, f)) do { if (!f || !readunit(F, f)) do {
b = getbuf(F); b = getbuf(F);
if (!b) break; if (!b) break;
p = igetparam(b); p = igetparam(b, lang);
} while ((p != P_UNIT || !f) && p != P_FACTION && p != P_NEXT); } while ((p != P_UNIT || !f) && p != P_FACTION && p != P_NEXT);
break; break;
@ -527,7 +542,7 @@ readorders(const char *filename)
* einer Zeile steht, und nun die nächste gelesen werden muß. */ * einer Zeile steht, und nun die nächste gelesen werden muß. */
case P_NEXT: case P_NEXT:
f = 0; f = NULL;
default: default:
b = getbuf(F); b = getbuf(F);
} }
@ -583,12 +598,12 @@ typus2race(unsigned char typus)
} }
boolean boolean
is_persistent(const char *s) is_persistent(const char *s, const struct locale *lang)
{ {
#ifdef AT_PERSISTENT #ifdef AT_PERSISTENT
if(*s == '@') return true; if(*s == '@') return true;
#endif /* Nur kurze Befehle! */ #endif /* Nur kurze Befehle! */
switch(igetkeyword(s)) { switch(igetkeyword(s, lang)) {
case K_BUY: case K_BUY:
case K_SELL: case K_SELL:
case K_KOMMENTAR: case K_KOMMENTAR:
@ -1862,7 +1877,7 @@ writegame(char *path, char quiet)
wi(F, getguard(u)); wi(F, getguard(u));
#endif #endif
for(S=u->orders; S; S=S->next) { for(S=u->orders; S; S=S->next) {
if (is_persistent(S->s)) { if (is_persistent(S->s, u->faction->locale)) {
wspace(F); wspace(F);
ws(F, S->s); ws(F, S->s);
} }
@ -2052,169 +2067,6 @@ struct fjord { int size; faction * f; } fjord[3];
/* ------------------------------------------------------------- */ /* ------------------------------------------------------------- */
extern attrib_type at_traveldir_new;
void
attrib_init(void)
{
/* Gebäudetypen registrieren */
init_buildings();
bt_register(&bt_castle);
bt_register(&bt_lighthouse);
bt_register(&bt_mine);
bt_register(&bt_quarry);
bt_register(&bt_harbour);
bt_register(&bt_academy);
bt_register(&bt_magictower);
bt_register(&bt_smithy);
bt_register(&bt_sawmill);
bt_register(&bt_stables);
bt_register(&bt_monument);
bt_register(&bt_dam);
bt_register(&bt_caravan);
bt_register(&bt_tunnel);
bt_register(&bt_inn);
bt_register(&bt_stonecircle);
bt_register(&bt_blessedstonecircle);
bt_register(&bt_illusion);
bt_register(&bt_generic);
bt_register(&bt_caldera);
/* Schiffstypen registrieren: */
st_register(&st_boat);
st_register(&st_longboat);
st_register(&st_dragonship);
st_register(&st_caravelle);
st_register(&st_trireme);
/* disable: st_register(&st_transport); */
/* Alle speicherbaren Attribute müssen hier registriert werden */
at_register(&at_unitdissolve);
at_register(&at_traveldir_new);
at_register(&at_familiar);
at_register(&at_familiarmage);
at_register(&at_eventhandler);
at_register(&at_stealth);
at_register(&at_mage);
at_register(&at_bauernblut);
at_register(&at_countdown);
at_register(&at_showitem);
at_register(&at_curse);
at_register(&at_cursewall);
at_register(&at_seenspell);
at_register(&at_reportspell);
at_register(&at_deathcloud);
/* neue REGION-Attribute */
at_register(&at_direction);
at_register(&at_moveblock);
#if AT_SALARY
at_register(&at_salary);
#endif
at_register(&at_horseluck);
at_register(&at_peasantluck);
at_register(&at_deathcount);
at_register(&at_chaoscount);
at_register(&at_woodcount);
at_register(&at_laen);
at_register(&at_road);
/* neue UNIT-Attribute */
at_register(&at_alias);
at_register(&at_siege);
at_register(&at_target);
at_register(&at_potion);
at_register(&at_potionuser);
at_register(&at_contact);
at_register(&at_effect);
at_register(&at_private);
#if defined(OLD_TRIGGER)
at_register(&at_pointer_tag);
at_register(&at_relation);
at_register(&at_relbackref);
at_register(&at_trigger);
at_register(&at_action);
#endif
at_register(&at_icastle);
at_register(&at_guard);
at_register(&at_lighthouse);
at_register(&at_group);
at_register(&at_faction_special);
at_register(&at_prayer_timeout);
at_register(&at_prayer_effect);
at_register(&at_wyrm);
at_register(&at_building_generic_type);
/* border-typen */
register_bordertype(&bt_noway);
register_bordertype(&bt_fogwall);
register_bordertype(&bt_wall);
register_bordertype(&bt_illusionwall);
register_bordertype(&bt_firewall);
register_bordertype(&bt_wisps);
register_bordertype(&bt_road);
#if USE_EVENTS
at_register(&at_events);
#endif
at_register(&at_jihad);
}
extern void inittokens(void);
extern void create_teleport_plane(void);
void read_strings(FILE * F);
const char * messages[] = {
"%s/%s/messages.xml",
NULL
};
const char * strings[] = {
"%s/%s/strings.txt",
NULL
};
const char * locales[] = {
"de", "en",
NULL
};
void
init_locales(void)
{
FILE * F;
int l;
for (l=0;locales[l];++l) {
char zText[MAX_PATH];
int i;
for (i=0;strings[i];++i) {
sprintf(zText, strings[i], resourcepath(), locales[l]);
F = fopen(zText, "r+");
if (F) {
read_strings(F);
fclose(F);
} else {
sprintf(buf, "fopen(%s): ", zText);
perror(buf);
}
}
for (i=0;messages[i];++i) {
sprintf(zText, messages[i], resourcepath(), locales[l]);
F = fopen(zText, "r+");
if (F) {
read_messages(F, NULL);
fclose(F);
} else {
sprintf(buf, "fopen(%s): ", zText);
perror(buf);
}
}
}
}
int int
lastturn(void) lastturn(void)
{ {

View file

@ -38,7 +38,7 @@ void writegame(char *path, char quiet);
extern void rsf(FILE * F, char *s, size_t len); extern void rsf(FILE * F, char *s, size_t len);
extern boolean is_persistent(const char *s); extern boolean is_persistent(const char *s, const struct locale * lang);
/* Versionsänderungen: */ /* Versionsänderungen: */
#define HEX_VERSION 81 #define HEX_VERSION 81

View file

@ -36,39 +36,45 @@
#include <stdlib.h> #include <stdlib.h>
/* Umlaute hier drin, weil die in den Report kommen */ /* Umlaute hier drin, weil die in den Report kommen */
const char *skillnames[MAXSKILLS] = static const char *skillnames[MAXSKILLS] =
{ {
"Alchemie", "sk_alchemy",
"Armbrustschießen", "sk_crossbow",
"Bergbau", "sk_mining",
"Bogenschießen", "sk_bow",
"Burgenbau", "sk_building",
"Handeln", "sk_trade",
"Holzfällen", "sk_forestry",
"Katapultbedienung", "sk_catapult",
"Kräuterkunde", "sk_herbalism",
"Magie", "sk_magic",
"Pferdedressur", "sk_training",
"Reiten", "sk_riding",
"Rüstungsbau", "sk_armorer",
"Schiffbau", "sk_shipcraft",
"Hiebwaffen", "sk_melee",
"Segeln", "sk_sailing",
"Stangenwaffen", "sk_polearm",
"Spionage", "sk_espionage",
"Steinbau", "sk_quarrying",
"Straßenbau", "sk_roadwork",
"Taktik", "sk_tactics",
"Tarnung", "sk_stealth",
"Unterhaltung", "sk_entertainment",
"Waffenbau", "sk_weaponsmithing",
"Wagenbau", "sk_cartmaking",
"Wahrnehmung", "sk_perception",
"Steuereintreiben", "sk_taxation",
"Ausdauer", "sk_stamina",
"Waffenloser Kampf" "sk_unarmed"
}; };
const char *
skillname(skill_t sk, const struct locale * lang)
{
return locale_string(lang, skillnames[sk]);
}
/** skillmod attribut **/ /** skillmod attribut **/
static void static void
init_skillmod(attrib * a) { init_skillmod(attrib * a) {

View file

@ -47,6 +47,8 @@ extern void skill_init(void);
extern void skill_done(void); extern void skill_done(void);
extern struct attrib * make_skillmod(skill_t skill, unsigned int flags, int(*special)(const struct unit*, const struct region*, skill_t, int), double multiplier, int bonus); extern struct attrib * make_skillmod(skill_t skill, unsigned int flags, int(*special)(const struct unit*, const struct region*, skill_t, int), double multiplier, int bonus);
extern const char * skillname(skill_t, const struct locale *);
int level_days(int level); int level_days(int level);
void remove_zero_skills(void); void remove_zero_skills(void);

View file

@ -1,6 +1,6 @@
/* vi: set ts=2: /* vi: set ts=2:
* *
* *
* Eressea PB(E)M host Copyright (C) 1998-2000 * Eressea PB(E)M host Copyright (C) 1998-2000
* Christian Schlittchen (corwin@amber.kn-bremen.de) * Christian Schlittchen (corwin@amber.kn-bremen.de)
* Katja Zedel (katze@felidae.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de)
@ -87,11 +87,12 @@ attrib_type at_unitdissolve = {
/* ----------------------------------------------------------------------- */ /* ----------------------------------------------------------------------- */
const char * #ifdef TODO
spellcmd(const strarray * sa) { static const char *
spellcmd(const strarray * sa, const struct locale * lang) {
int i; int i;
char * p = buf; char * p = buf;
strcpy(p, keywords[K_CAST]); strcpy(p, locale_string(lang, keywords[K_CAST]));
p += strlen(p); p += strlen(p);
for (i=0;i!=sa->length;++i) { for (i=0;i!=sa->length;++i) {
*p++ = ' '; *p++ = ' ';
@ -101,11 +102,10 @@ spellcmd(const strarray * sa) {
return buf; return buf;
} }
#ifdef TODO
void void
report_failure(unit * mage, const strarray * sa) { report_failure(unit * mage, const strarray * sa) {
/* Fehler: "Der Zauber schlägt fehl" */ /* Fehler: "Der Zauber schlägt fehl" */
cmistake(mage, strdup(spellcmd(sa)), 180, MSG_MAGIC); cmistake(mage, strdup(spellcmd(sa, mage->faction->locale)), 180, MSG_MAGIC);
} }
#else #else
void void
@ -723,7 +723,7 @@ sp_summon_familiar(castorder *co)
scat(", "); scat(", ");
} }
} }
scat(skillnames[sk]); scat(skillname(sk, mage->faction->locale));
} }
} }
scat(" lernen."); scat(" lernen.");
@ -2031,7 +2031,7 @@ sp_homestone(castorder *co)
unit *mage = (unit *)co->magician; unit *mage = (unit *)co->magician;
int cast_level = co->level; int cast_level = co->level;
int force = co->force; int force = co->force;
if(!mage->building || mage->building->type != &bt_castle){ if(!mage->building || mage->building->type != &bt_castle){
cmistake(mage, strdup(co->order), 197, MSG_MAGIC); cmistake(mage, strdup(co->order), 197, MSG_MAGIC);
return 0; return 0;
@ -2435,7 +2435,7 @@ patzer_peasantmob(castorder *co)
attrib *a; attrib *a;
region *r; region *r;
unit *mage = (unit *)co->magician; unit *mage = (unit *)co->magician;
if (mage->region->land){ if (mage->region->land){
r = mage->region; r = mage->region;
} else { } else {
@ -3541,7 +3541,7 @@ sp_bloodsacrifice(castorder *co)
report_failure(mage, co->order); report_failure(mage, co->order);
return 0; return 0;
} }
damage = min(hp, dice_rand("4d12")); damage = min(hp, dice_rand("4d12"));
if (eff_skill(mage, SK_MAGIC, mage->region) > 8){ if (eff_skill(mage, SK_MAGIC, mage->region) > 8){
@ -3549,7 +3549,7 @@ sp_bloodsacrifice(castorder *co)
} else { } else {
aura = damage / 4; aura = damage / 4;
} }
if (aura <= 0){ if (aura <= 0){
report_failure(mage, co->order); report_failure(mage, co->order);
return 0; return 0;
@ -4381,7 +4381,7 @@ sp_recruit(castorder *co)
u->ship = mage->ship; u->ship = mage->ship;
} }
set_string(&u->name, n == 1 ? "Bauer" : "Bauern"); set_string(&u->name, n == 1 ? "Bauer" : "Bauern");
set_string(&u->thisorder, keywords[K_WORK]); set_string(&u->thisorder, locale_string(u->faction->locale, keywords[K_WORK]));
u->status = mage->status; u->status = mage->status;
/* Parteitarnung */ /* Parteitarnung */
@ -4786,7 +4786,7 @@ sp_puttorest(castorder *co)
laid_to_rest = max(laid_to_rest, deathcount(r)); laid_to_rest = max(laid_to_rest, deathcount(r));
deathcounts(r, -laid_to_rest); deathcounts(r, -laid_to_rest);
/* melden, 1x pro partei */ /* melden, 1x pro partei */
for (u = r->units; u; u = u->next) freset(u->faction, FL_DH); for (u = r->units; u; u = u->next) freset(u->faction, FL_DH);
@ -6271,7 +6271,7 @@ sp_movecastle(castorder *co)
sprintf(buf, "%s in %s: 'ZAUBER \"%s\"': Der Erdelementar " sprintf(buf, "%s in %s: 'ZAUBER \"%s\"': Der Erdelementar "
"weigert sich, nach %s zu gehen.", "weigert sich, nach %s zu gehen.",
unitname(mage), regionid(mage->region), sp->name, unitname(mage), regionid(mage->region), sp->name,
directions[dir]); locale_string(mage->faction->locale, directions[dir]));
addmessage(0, mage->faction, buf, MSG_MAGIC, ML_MISTAKE); addmessage(0, mage->faction, buf, MSG_MAGIC, ML_MISTAKE);
return cast_level; return cast_level;
} }
@ -6294,7 +6294,7 @@ sp_movecastle(castorder *co)
sprintf(buf, "Ein Beben erschüttert %s. Viele kleine Pseudopodien " sprintf(buf, "Ein Beben erschüttert %s. Viele kleine Pseudopodien "
"erheben das Gebäude und tragen es in Richtung %s.", "erheben das Gebäude und tragen es in Richtung %s.",
buildingname(b), directions[dir]); buildingname(b), locale_string(mage->faction->locale, directions[dir]));
if((b->type==&bt_caravan || b->type==&bt_dam || b->type==&bt_tunnel)) { if((b->type==&bt_caravan || b->type==&bt_dam || b->type==&bt_tunnel)) {
boolean damage = false; boolean damage = false;
@ -6743,7 +6743,7 @@ sp_becomewyrm(castorder *co)
* Wirkung: der Magier verdient $50 pro Spruchstufe * Wirkung: der Magier verdient $50 pro Spruchstufe
* Kosten: 1 SP pro Stufe * Kosten: 1 SP pro Stufe
*/ */
#include "../gamecode/economy.h" #include "../gamecode/economy.h"
/* TODO: das ist scheisse, aber spells gehören eh nicht in den kernel */ /* TODO: das ist scheisse, aber spells gehören eh nicht in den kernel */
int int
sp_earn_silver(castorder *co) sp_earn_silver(castorder *co)
@ -7513,7 +7513,7 @@ spell spelldaten[] =
{0, 0, 0}}, {0, 0, 0}},
(spell_f)sp_treewalkexit, patzer (spell_f)sp_treewalkexit, patzer
}, },
{SPL_HOLYGROUND, "Heiliger Boden", {SPL_HOLYGROUND, "Heiliger Boden",
"Dieses Ritual beschwört verschiedene Naturgeister in den Boden der " "Dieses Ritual beschwört verschiedene Naturgeister in den Boden der "
"Region, welche diese fortan bewachen. In einer so gesegneten Region " "Region, welche diese fortan bewachen. In einer so gesegneten Region "
@ -7820,7 +7820,7 @@ spell spelldaten[] =
"sein kann.", "sein kann.",
NULL, NULL,
NULL, NULL,
M_CHAOS, (SPELLLEVEL | FARCASTING | ONSHIPCAST), M_CHAOS, (SPELLLEVEL | FARCASTING | ONSHIPCAST),
5, 6, 5, 6,
{ {
{R_AURA, 5, SPC_LEVEL}, {R_AURA, 5, SPC_LEVEL},
@ -8075,7 +8075,7 @@ spell spelldaten[] =
{0, 0, 0}}, {0, 0, 0}},
(spell_f)sp_destroy_magic, patzer (spell_f)sp_destroy_magic, patzer
}, },
{SPL_UNHOLYPOWER, "Unheilige Kraft", {SPL_UNHOLYPOWER, "Unheilige Kraft",
"Nur geflüstert wird dieses Ritual an den dunklen Akademien an die " "Nur geflüstert wird dieses Ritual an den dunklen Akademien an die "
"Adepten weitergegeben, gehört es doch zu den finstersten, die je " "Adepten weitergegeben, gehört es doch zu den finstersten, die je "
@ -8601,7 +8601,7 @@ spell spelldaten[] =
"es einige Wochen später...", "es einige Wochen später...",
NULL, NULL,
"u+", "u+",
M_TRAUM, M_TRAUM,
(UNITSPELL | TESTRESISTANCE | TESTCANSEE | SPELLLEVEL), 5, 12, (UNITSPELL | TESTRESISTANCE | TESTCANSEE | SPELLLEVEL), 5, 12,
{ {
{R_AURA, 5, SPC_LEVEL}, {R_AURA, 5, SPC_LEVEL},

View file

@ -59,8 +59,7 @@ trailinto(const region * r, const locale * lang)
} }
else s = locale_string(lang, terrain[t].trailname(r)); else s = locale_string(lang, terrain[t].trailname(r));
if (s && *s) { if (s && *s) {
assert(strstr(s, "%s")); if (strstr(s, "%s")) return s;
return s;
} }
} }
return "%s"; return "%s";

View file

@ -196,7 +196,7 @@ gm_give(const char * str, struct unit * u)
if (to==NULL || rplane(to->region) != rplane(u->region)) { if (to==NULL || rplane(to->region) != rplane(u->region)) {
/* unknown or in another plane */ /* unknown or in another plane */
mistake(u, str, "Die Einheit wurde nicht gefunden.\n", 0); cmistake(u, str, 64, MSG_COMMERCE);
} else if (itype==NULL || i_get(u->items, itype)==0) { } else if (itype==NULL || i_get(u->items, itype)==0) {
/* unknown or not enough */ /* unknown or not enough */
mistake(u, str, "So einen Gegenstand hat die Einheit nicht.\n", 0); mistake(u, str, "So einen Gegenstand hat die Einheit nicht.\n", 0);
@ -230,7 +230,7 @@ gm_take(const char * str, struct unit * u)
if (to==NULL || rplane(to->region) != rplane(u->region)) { if (to==NULL || rplane(to->region) != rplane(u->region)) {
/* unknown or in another plane */ /* unknown or in another plane */
mistake(u, str, "Die Einheit wurde nicht gefunden.\n", 0); cmistake(u, str, 64, MSG_COMMERCE);
} else if (itype==NULL || i_get(to->items, itype)==0) { } else if (itype==NULL || i_get(to->items, itype)==0) {
/* unknown or not enough */ /* unknown or not enough */
mistake(u, str, "So einen Gegenstand hat die Einheit nicht.\n", 0); mistake(u, str, "So einen Gegenstand hat die Einheit nicht.\n", 0);
@ -259,15 +259,15 @@ static void
gm_skill(const char * str, struct unit * u) gm_skill(const char * str, struct unit * u)
{ {
unit * to = findunit(atoi36(igetstrtoken(str))); unit * to = findunit(atoi36(igetstrtoken(str)));
skill_t skill = findskill(getstrtoken()); skill_t skill = findskill(getstrtoken(), u->faction->locale);
int num = atoi(getstrtoken()); int num = atoi(getstrtoken());
if (to==NULL || rplane(to->region) != rplane(u->region)) { if (to==NULL || rplane(to->region) != rplane(u->region)) {
/* unknown or in another plane */ /* unknown or in another plane */
mistake(u, str, "Die Einheit wurde nicht gefunden.\n", 0); cmistake(u, str, 64, MSG_COMMERCE);
} else if (skill==NOSKILL || skill==SK_MAGIC || skill==SK_ALCHEMY) { } else if (skill==NOSKILL || skill==SK_MAGIC || skill==SK_ALCHEMY) {
/* unknown or not enough */ /* unknown or not enough */
mistake(u, str, "Dieses Talent ist unbekannt, oder kann nciht erhöht werden.\n", 0); mistake(u, str, "Dieses Talent ist unbekannt, oder kann nicht erhöht werden.\n", 0);
} else if (num<0 || num>5000) { } else if (num<0 || num>5000) {
/* sanity check failed */ /* sanity check failed */
mistake(u, str, "Der gewählte Wert ist nicht zugelassen.\n", 0); mistake(u, str, "Der gewählte Wert ist nicht zugelassen.\n", 0);
@ -297,7 +297,7 @@ gm_command(const char * cmd, struct unit * u)
i = min(16, c-cmd); i = min(16, c-cmd);
strncpy(zText, cmd, i); strncpy(zText, cmd, i);
zText[i]=0; zText[i]=0;
if (findtoken(&g_keys, zText, (void**)&cm) && cm->perform) cm->perform(++c, u); if (findtoken(&g_keys, zText, (void**)&cm)==E_TOK_SUCCESS && cm->perform) cm->perform(++c, u);
} }
void void
@ -329,7 +329,7 @@ gmcommands(void)
unit * u = *up; unit * u = *up;
strlist * order; strlist * order;
for (order = u->orders; order; order = order->next) for (order = u->orders; order; order = order->next)
if (igetkeyword(order->s) == K_GM) { if (igetkeyword(order->s, u->faction->locale) == K_GM) {
gm_command(order->s, u); gm_command(order->s, u);
} }
if (u==*up) up = &u->next; if (u==*up) up = &u->next;

View file

@ -24,12 +24,18 @@
struct curse_type; struct curse_type;
extern const struct curse_type ct_firewall; extern const struct curse_type ct_firewall;
extern void ct_register(const struct curse_type * ct); extern void ct_register(const struct curse_type * ct);
extern curse_type cursedaten[MAXCURSE];
void void
init_spells(void) init_spells(void)
{ {
int i;
/* sp_summon_alp */ /* sp_summon_alp */
init_alp(); init_alp();
/* init_firewall(); */ /* init_firewall(); */
ct_register(&ct_firewall); ct_register(&ct_firewall);
for (i=0;i!=MAXCURSE;++i) {
ct_register(&cursedaten[i]);
}
} }

View file

@ -6,9 +6,9 @@
| | Ingo Wilken <Ingo.Wilken@informatik.uni-oldenburg.de> | | Ingo Wilken <Ingo.Wilken@informatik.uni-oldenburg.de>
+-------------------+ Stefan Reich <reich@halbling.de> +-------------------+ Stefan Reich <reich@halbling.de>
This program may not be used, modified or distributed This program may not be used, modified or distributed
without prior permission by the authors of Eressea. without prior permission by the authors of Eressea.
*/ */
#include <config.h> #include <config.h>
@ -68,7 +68,7 @@ typedef struct crmessage_type {
static crmessage_type * messagetypes; static crmessage_type * messagetypes;
static crmessage_type * static crmessage_type *
crt_find(const struct message_type * mtype) crt_find(const struct message_type * mtype)
{ {
crmessage_type * found = NULL; crmessage_type * found = NULL;
@ -112,9 +112,9 @@ cr_render(const message * msg, char * buffer, const void * userdata)
if (crt==NULL) return -1; if (crt==NULL) return -1;
for (i=0;i!=msg->type->nparameters;++i) { for (i=0;i!=msg->type->nparameters;++i) {
if (crt->renderers[i]==NULL) { if (crt->renderers[i]==NULL) {
log_error(("No renderer for argument %s:%s of \"%s\"\n", log_error(("No renderer for argument %s:%s of \"%s\"\n",
msg->type->pnames[i], msg->type->types[i], msg->type->name)); msg->type->pnames[i], msg->type->types[i], msg->type->name));
continue; /* strcpy(c, (const char*)msg->parameters[i]); */ continue; /* strcpy(c, (const char*)msg->locale_string(u->faction->locale, parameters[i])); */
} else { } else {
if (crt->renderers[i](msg->parameters[i], c, userdata)!=0) continue; if (crt->renderers[i](msg->parameters[i], c, userdata)!=0) continue;
} }

View file

@ -44,7 +44,7 @@ static locale * default_locale;
unsigned int unsigned int
locale_hashkey(const locale * lang) locale_hashkey(const locale * lang)
{ {
if (lang==NULL) lang = default_locale; assert(lang);
return lang->hashkey; return lang->hashkey;
} }
@ -75,6 +75,31 @@ make_locale(const char * name)
return l; return l;
} }
static FILE * s_debug = NULL;
void
debug_language(const char * log)
{
s_debug = fopen(log, "w+");
}
const char *
locale_getstring(const locale * lang, const char * key)
{
unsigned int hkey = hashstring(key);
unsigned int id = hkey % SMAXHASH;
struct locale_string * find;
assert(lang);
if (key==NULL || *key==0) return NULL;
find = lang->strings[id];
while (find) {
if (find->hashkey == hkey && !strcmp(key, find->key)) return find->str;
find = find->nexthash;
}
return NULL;
}
const char * const char *
locale_string(const locale * lang, const char * key) locale_string(const locale * lang, const char * key)
{ {
@ -82,22 +107,28 @@ locale_string(const locale * lang, const char * key)
unsigned int id = hkey % SMAXHASH; unsigned int id = hkey % SMAXHASH;
struct locale_string * find; struct locale_string * find;
if (key==NULL || *key==0) return NULL; if (key == NULL || *key==0) return NULL;
if (lang==NULL) lang = default_locale; if (lang == NULL) return key;
find = lang->strings[id]; find = lang->strings[id];
while (find) { while (find) {
if (find->hashkey == hkey && !strcmp(key, find->key)) break; if (find->hashkey == hkey && !strcmp(key, find->key)) break;
find = find->nexthash; find = find->nexthash;
} }
if (!find) { if (!find) {
if (lang==default_locale) { const char * s = key;
log_warning(("missing translation for \"%s\"\n", key)); if (lang!=default_locale) {
return key; log_warning(("missing translation for \"%s\" in locale %s\n", key, lang->name));
s = locale_string(default_locale, key);
if (s_debug) {
fprintf(s_debug, "%s;%s;%s\n", key, lang->name, s);
locale_setstring((struct locale*)lang, key, s);
}
} }
log_warning(("missing translation for \"%s\" in locale %s\n", key, lang->name)); return s;
return locale_string(default_locale, key); }
else {
return find->str;
} }
return find->str;
} }
void void
@ -108,7 +139,7 @@ locale_setstring(locale * lang, const char * key, const char * value)
unsigned int id = hkey % SMAXHASH; unsigned int id = hkey % SMAXHASH;
struct locale_string * find; struct locale_string * find;
if (lang==NULL) lang = default_locale; assert(lang);
find = lang->strings[id]; find = lang->strings[id];
while (find) { while (find) {
if (find->hashkey==hkey && !strcmp(key, find->key)) break; if (find->hashkey==hkey && !strcmp(key, find->key)) break;
@ -128,7 +159,7 @@ locale_setstring(locale * lang, const char * key, const char * value)
const char * const char *
locale_name(const locale * lang) locale_name(const locale * lang)
{ {
if (lang==NULL) lang = default_locale; assert(lang);
return lang->name; return lang->name;
} }
@ -136,7 +167,7 @@ const char *
reverse_lookup(const locale * lang, const char * str) reverse_lookup(const locale * lang, const char * str)
{ {
int i; int i;
if (lang==NULL) lang = default_locale; assert(lang);
if (lang!=NULL) { if (lang!=NULL) {
for (i=0;i!=SMAXHASH;++i) { for (i=0;i!=SMAXHASH;++i) {
struct locale_string * ls; struct locale_string * ls;

View file

@ -21,10 +21,13 @@ extern locale * find_locale(const char * name);
extern locale * make_locale(const char * key); extern locale * make_locale(const char * key);
/** operations on locales: **/ /** operations on locales: **/
extern const char * locale_string(const locale * lang, const char * key); extern void locale_setstring(struct locale * lang, const char * key, const char * value);
extern void locale_setstring(locale * lang, const char * key, const char * value); extern const char * locale_getstring(const struct locale * lang, const char * key);
extern unsigned int locale_hashkey(const locale * lang); extern const char * locale_string(const struct locale * lang, const char * key); /* does fallback */
extern const char * locale_name(const locale * lang); extern unsigned int locale_hashkey(const struct locale * lang);
extern const char * locale_name(const struct locale * lang);
extern const char * reverse_lookup(const locale * lang, const char * str); extern const char * reverse_lookup(const struct locale * lang, const char * str);
extern void debug_language(const char * log);
#endif #endif

View file

@ -6,9 +6,9 @@
| | Ingo Wilken <Ingo.Wilken@informatik.uni-oldenburg.de> | | Ingo Wilken <Ingo.Wilken@informatik.uni-oldenburg.de>
+-------------------+ Stefan Reich <reich@halbling.de> +-------------------+ Stefan Reich <reich@halbling.de>
This program may not be used, modified or distributed This program may not be used, modified or distributed
without prior permission by the authors of Eressea. without prior permission by the authors of Eressea.
*/ */
#include <config.h> #include <config.h>
@ -20,13 +20,13 @@
#include <string.h> #include <string.h>
#include <stdarg.h> #include <stdarg.h>
const char * const char *
mt_name(const message_type* mtype) mt_name(const message_type* mtype)
{ {
return mtype->name; return mtype->name;
} }
message_type * message_type *
mt_new(const char * name, const char * args[]) mt_new(const char * name, const char * args[])
{ {
int i, nparameters; int i, nparameters;
@ -55,7 +55,7 @@ mt_new(const char * name, const char * args[])
return mtype; return mtype;
} }
message_type * message_type *
mt_new_va(const char * name, ...) mt_new_va(const char * name, ...)
{ {
const char * args[16]; const char * args[16];
@ -107,7 +107,7 @@ typedef struct messagetype_list {
static messagetype_list * messagetypes; static messagetype_list * messagetypes;
const message_type * const message_type *
mt_register(const message_type * type) mt_register(const message_type * type)
{ {
messagetype_list * mtl = messagetypes; messagetype_list * mtl = messagetypes;
@ -121,7 +121,7 @@ mt_register(const message_type * type)
return type; return type;
} }
const message_type * const message_type *
mt_find(const char * name) mt_find(const char * name)
{ {
messagetype_list * mtl = messagetypes; messagetype_list * mtl = messagetypes;

View file

@ -61,7 +61,7 @@ addtoken(tnode * root, const char* str, void * id)
int index, i = 0; int index, i = 0;
char c = *str; char c = *str;
if (c<'a' || c>'z') c = (char)tolower((unsigned char)c); if (c<'a' || c>'z') c = (char)tolower((unsigned char)c);
index = ((unsigned char)c) % 32; index = ((unsigned char)c) % NODEHASHSIZE;
next = root->next[index]; next = root->next[index];
if (!(root->flags & LEAF)) root->id = id; if (!(root->flags & LEAF)) root->id = id;
while (next && next->c != c) next = next->nexthash; while (next && next->c != c) next = next->nexthash;
@ -77,7 +77,7 @@ addtoken(tnode * root, const char* str, void * id)
root->next[index] = ref; root->next[index] = ref;
if (u!=c) { if (u!=c) {
index = ((unsigned char)u) % 32; index = ((unsigned char)u) % NODEHASHSIZE;
ref = malloc(sizeof(tref)); ref = malloc(sizeof(tref));
ref->c = u; ref->c = u;
ref->node = node; ref->node = node;
@ -113,7 +113,7 @@ findtoken(tnode * tk, const char * str, void **result)
/* if (c<'a' || c>'z') c = (char)tolower((unsigned char)c); */ /* if (c<'a' || c>'z') c = (char)tolower((unsigned char)c); */
index = ((unsigned char)c) % 32; index = ((unsigned char)c) % NODEHASHSIZE;
ref = tk->next[index]; ref = tk->next[index];
while (ref && ref->c!=c) ref = ref->nexthash; while (ref && ref->c!=c) ref = ref->nexthash;
++str; ++str;

View file

@ -17,11 +17,11 @@
#define E_TOK_NOMATCH (-1) #define E_TOK_NOMATCH (-1)
#define E_TOK_SUCCESS 0 #define E_TOK_SUCCESS 0
#define NODEHASHSIZE 7
struct tref; struct tref;
typedef struct tnode { typedef struct tnode {
struct tref * next[32]; struct tref * next[NODEHASHSIZE];
unsigned char flags; unsigned char flags;
void * id; void * id;
} tnode; } tnode;

View file

@ -7,21 +7,21 @@
CFG=util - Win32 Conversion CFG=util - Win32 Conversion
!MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run !MESSAGE use the Export Makefile command and run
!MESSAGE !MESSAGE
!MESSAGE NMAKE /f "util-6.mak". !MESSAGE NMAKE /f "util-6.mak".
!MESSAGE !MESSAGE
!MESSAGE You can specify a configuration when running NMAKE !MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE !MESSAGE
!MESSAGE NMAKE /f "util-6.mak" CFG="util - Win32 Conversion" !MESSAGE NMAKE /f "util-6.mak" CFG="util - Win32 Conversion"
!MESSAGE !MESSAGE
!MESSAGE Possible choices for configuration are: !MESSAGE Possible choices for configuration are:
!MESSAGE !MESSAGE
!MESSAGE "util - Win32 Release" (based on "Win32 (x86) Static Library") !MESSAGE "util - Win32 Release" (based on "Win32 (x86) Static Library")
!MESSAGE "util - Win32 Debug" (based on "Win32 (x86) Static Library") !MESSAGE "util - Win32 Debug" (based on "Win32 (x86) Static Library")
!MESSAGE "util - Win32 Conversion" (based on "Win32 (x86) Static Library") !MESSAGE "util - Win32 Conversion" (based on "Win32 (x86) Static Library")
!MESSAGE "util - Win32 Profile" (based on "Win32 (x86) Static Library") !MESSAGE "util - Win32 Profile" (based on "Win32 (x86) Static Library")
!MESSAGE !MESSAGE
# Begin Project # Begin Project
# PROP AllowPerConfigDependencies 0 # PROP AllowPerConfigDependencies 0
@ -122,7 +122,7 @@ LIB32=link.exe -lib
# ADD BASE LIB32 /nologo # ADD BASE LIB32 /nologo
# ADD LIB32 /nologo # ADD LIB32 /nologo
!ENDIF !ENDIF
# Begin Target # Begin Target
@ -209,6 +209,10 @@ SOURCE=.\vset.h
SOURCE=.\windir.h SOURCE=.\windir.h
# End Source File # End Source File
# Begin Source File
SOURCE=.\xml.h
# End Source File
# End Group # End Group
# Begin Source File # Begin Source File
@ -290,5 +294,9 @@ SOURCE=.\vset.c
SOURCE=.\windir.c SOURCE=.\windir.c
# End Source File # End Source File
# Begin Source File
SOURCE=.\xml.c
# End Source File
# End Target # End Target
# End Project # End Project

View file

@ -26,6 +26,7 @@
#include <attributes/hate.h> #include <attributes/hate.h>
#include <attributes/overrideroads.h> #include <attributes/overrideroads.h>
#include <attributes/racename.h> #include <attributes/racename.h>
#include <attributes/otherfaction.h>
#ifdef AT_OPTION #ifdef AT_OPTION
# include <attributes/option.h> # include <attributes/option.h>
#endif #endif
@ -49,6 +50,7 @@ init_attributes(void)
init_hate(); init_hate();
init_reduceproduction(); init_reduceproduction();
init_racename(); init_racename();
init_otherfaction();
#ifdef AT_MOVED #ifdef AT_MOVED
init_moved(); init_moved();
#endif #endif

View file

@ -748,7 +748,7 @@ SOURCE=..\common\attributes\follow.c
!ELSEIF "$(CFG)" == "eressea - Win32 Debug" !ELSEIF "$(CFG)" == "eressea - Win32 Debug"
# PROP Intermediate_Dir "..\common\attributes\Debug" # PROP Intermediate_Dir "../common/attributes/Debug"
!ELSEIF "$(CFG)" == "eressea - Win32 Conversion" !ELSEIF "$(CFG)" == "eressea - Win32 Conversion"
@ -772,7 +772,7 @@ SOURCE=..\common\attributes\follow.h
!ELSEIF "$(CFG)" == "eressea - Win32 Debug" !ELSEIF "$(CFG)" == "eressea - Win32 Debug"
# PROP Intermediate_Dir "..\common\attributes\Debug" # PROP Intermediate_Dir "../common/attributes/Debug"
!ELSEIF "$(CFG)" == "eressea - Win32 Conversion" !ELSEIF "$(CFG)" == "eressea - Win32 Conversion"
@ -796,7 +796,7 @@ SOURCE=..\common\attributes\giveitem.c
!ELSEIF "$(CFG)" == "eressea - Win32 Debug" !ELSEIF "$(CFG)" == "eressea - Win32 Debug"
# PROP Intermediate_Dir "..\common\attributes\Debug" # PROP Intermediate_Dir "../common/attributes/Debug"
!ELSEIF "$(CFG)" == "eressea - Win32 Conversion" !ELSEIF "$(CFG)" == "eressea - Win32 Conversion"
@ -820,7 +820,7 @@ SOURCE=..\common\attributes\giveitem.h
!ELSEIF "$(CFG)" == "eressea - Win32 Debug" !ELSEIF "$(CFG)" == "eressea - Win32 Debug"
# PROP Intermediate_Dir "..\common\attributes\Debug" # PROP Intermediate_Dir "../common/attributes/Debug"
!ELSEIF "$(CFG)" == "eressea - Win32 Conversion" !ELSEIF "$(CFG)" == "eressea - Win32 Conversion"
@ -837,6 +837,19 @@ SOURCE=..\common\attributes\giveitem.h
# Begin Source File # Begin Source File
SOURCE=..\common\attributes\gm.c SOURCE=..\common\attributes\gm.c
!IF "$(CFG)" == "eressea - Win32 Release"
!ELSEIF "$(CFG)" == "eressea - Win32 Debug"
# PROP Intermediate_Dir "../common/attributes/Debug"
!ELSEIF "$(CFG)" == "eressea - Win32 Conversion"
!ELSEIF "$(CFG)" == "eressea - Win32 Profile"
!ENDIF
# End Source File # End Source File
# Begin Source File # Begin Source File
@ -848,7 +861,7 @@ SOURCE=..\common\attributes\hate.c
!ELSEIF "$(CFG)" == "eressea - Win32 Debug" !ELSEIF "$(CFG)" == "eressea - Win32 Debug"
# PROP Intermediate_Dir "..\common\attributes\Debug" # PROP Intermediate_Dir "../common/attributes/Debug"
!ELSEIF "$(CFG)" == "eressea - Win32 Conversion" !ELSEIF "$(CFG)" == "eressea - Win32 Conversion"
@ -872,7 +885,7 @@ SOURCE=..\common\attributes\hate.h
!ELSEIF "$(CFG)" == "eressea - Win32 Debug" !ELSEIF "$(CFG)" == "eressea - Win32 Debug"
# PROP Intermediate_Dir "..\common\attributes\Debug" # PROP Intermediate_Dir "../common/attributes/Debug"
!ELSEIF "$(CFG)" == "eressea - Win32 Conversion" !ELSEIF "$(CFG)" == "eressea - Win32 Conversion"
@ -896,7 +909,7 @@ SOURCE=..\common\attributes\iceberg.c
!ELSEIF "$(CFG)" == "eressea - Win32 Debug" !ELSEIF "$(CFG)" == "eressea - Win32 Debug"
# PROP Intermediate_Dir "..\common\attributes\Debug" # PROP Intermediate_Dir "../common/attributes/Debug"
!ELSEIF "$(CFG)" == "eressea - Win32 Conversion" !ELSEIF "$(CFG)" == "eressea - Win32 Conversion"
@ -920,7 +933,7 @@ SOURCE=..\common\attributes\iceberg.h
!ELSEIF "$(CFG)" == "eressea - Win32 Debug" !ELSEIF "$(CFG)" == "eressea - Win32 Debug"
# PROP Intermediate_Dir "..\common\attributes\Debug" # PROP Intermediate_Dir "../common/attributes/Debug"
!ELSEIF "$(CFG)" == "eressea - Win32 Conversion" !ELSEIF "$(CFG)" == "eressea - Win32 Conversion"
@ -944,7 +957,7 @@ SOURCE=..\common\attributes\key.c
!ELSEIF "$(CFG)" == "eressea - Win32 Debug" !ELSEIF "$(CFG)" == "eressea - Win32 Debug"
# PROP Intermediate_Dir "..\common\attributes\Debug" # PROP Intermediate_Dir "../common/attributes/Debug"
!ELSEIF "$(CFG)" == "eressea - Win32 Conversion" !ELSEIF "$(CFG)" == "eressea - Win32 Conversion"
@ -968,7 +981,7 @@ SOURCE=..\common\attributes\key.h
!ELSEIF "$(CFG)" == "eressea - Win32 Debug" !ELSEIF "$(CFG)" == "eressea - Win32 Debug"
# PROP Intermediate_Dir "..\common\attributes\Debug" # PROP Intermediate_Dir "../common/attributes/Debug"
!ELSEIF "$(CFG)" == "eressea - Win32 Conversion" !ELSEIF "$(CFG)" == "eressea - Win32 Conversion"
@ -992,7 +1005,7 @@ SOURCE=..\common\attributes\matmod.c
!ELSEIF "$(CFG)" == "eressea - Win32 Debug" !ELSEIF "$(CFG)" == "eressea - Win32 Debug"
# PROP Intermediate_Dir "..\common\attributes\Debug" # PROP Intermediate_Dir "../common/attributes/Debug"
!ELSEIF "$(CFG)" == "eressea - Win32 Conversion" !ELSEIF "$(CFG)" == "eressea - Win32 Conversion"
@ -1016,7 +1029,7 @@ SOURCE=..\common\attributes\matmod.h
!ELSEIF "$(CFG)" == "eressea - Win32 Debug" !ELSEIF "$(CFG)" == "eressea - Win32 Debug"
# PROP Intermediate_Dir "..\common\attributes\Debug" # PROP Intermediate_Dir "../common/attributes/Debug"
!ELSEIF "$(CFG)" == "eressea - Win32 Conversion" !ELSEIF "$(CFG)" == "eressea - Win32 Conversion"
@ -1032,6 +1045,40 @@ SOURCE=..\common\attributes\matmod.h
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\common\attributes\moved.c
!IF "$(CFG)" == "eressea - Win32 Release"
!ELSEIF "$(CFG)" == "eressea - Win32 Debug"
# PROP Intermediate_Dir "../common/attributes/Debug"
!ELSEIF "$(CFG)" == "eressea - Win32 Conversion"
!ELSEIF "$(CFG)" == "eressea - Win32 Profile"
!ENDIF
# End Source File
# Begin Source File
SOURCE=..\common\attributes\option.c
!IF "$(CFG)" == "eressea - Win32 Release"
!ELSEIF "$(CFG)" == "eressea - Win32 Debug"
# PROP Intermediate_Dir "../common/attributes/Debug"
!ELSEIF "$(CFG)" == "eressea - Win32 Conversion"
!ELSEIF "$(CFG)" == "eressea - Win32 Profile"
!ENDIF
# End Source File
# Begin Source File
SOURCE=..\common\attributes\orcification.c SOURCE=..\common\attributes\orcification.c
!IF "$(CFG)" == "eressea - Win32 Release" !IF "$(CFG)" == "eressea - Win32 Release"
@ -1040,7 +1087,7 @@ SOURCE=..\common\attributes\orcification.c
!ELSEIF "$(CFG)" == "eressea - Win32 Debug" !ELSEIF "$(CFG)" == "eressea - Win32 Debug"
# PROP Intermediate_Dir "..\common\attributes\Debug" # PROP Intermediate_Dir "../common/attributes/Debug"
!ELSEIF "$(CFG)" == "eressea - Win32 Conversion" !ELSEIF "$(CFG)" == "eressea - Win32 Conversion"
@ -1056,6 +1103,23 @@ SOURCE=..\common\attributes\orcification.c
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\common\attributes\otherfaction.c
!IF "$(CFG)" == "eressea - Win32 Release"
!ELSEIF "$(CFG)" == "eressea - Win32 Debug"
# PROP Intermediate_Dir "../common/attributes/Debug"
!ELSEIF "$(CFG)" == "eressea - Win32 Conversion"
!ELSEIF "$(CFG)" == "eressea - Win32 Profile"
!ENDIF
# End Source File
# Begin Source File
SOURCE=..\common\attributes\overrideroads.c SOURCE=..\common\attributes\overrideroads.c
!IF "$(CFG)" == "eressea - Win32 Release" !IF "$(CFG)" == "eressea - Win32 Release"
@ -1064,7 +1128,7 @@ SOURCE=..\common\attributes\overrideroads.c
!ELSEIF "$(CFG)" == "eressea - Win32 Debug" !ELSEIF "$(CFG)" == "eressea - Win32 Debug"
# PROP Intermediate_Dir "..\common\attributes\Debug" # PROP Intermediate_Dir "../common/attributes/Debug"
!ELSEIF "$(CFG)" == "eressea - Win32 Conversion" !ELSEIF "$(CFG)" == "eressea - Win32 Conversion"
@ -1087,7 +1151,7 @@ SOURCE=..\common\attributes\overrideroads.h
!ELSEIF "$(CFG)" == "eressea - Win32 Debug" !ELSEIF "$(CFG)" == "eressea - Win32 Debug"
# PROP Intermediate_Dir "..\common\attributes\Debug" # PROP Intermediate_Dir "../common/attributes/Debug"
!ELSEIF "$(CFG)" == "eressea - Win32 Conversion" !ELSEIF "$(CFG)" == "eressea - Win32 Conversion"
@ -1102,6 +1166,23 @@ SOURCE=..\common\attributes\overrideroads.h
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=..\common\attributes\racename.c
!IF "$(CFG)" == "eressea - Win32 Release"
!ELSEIF "$(CFG)" == "eressea - Win32 Debug"
# PROP Intermediate_Dir "../common/attributes/Debug"
!ELSEIF "$(CFG)" == "eressea - Win32 Conversion"
!ELSEIF "$(CFG)" == "eressea - Win32 Profile"
!ENDIF
# End Source File
# Begin Source File
SOURCE=..\common\attributes\reduceproduction.c SOURCE=..\common\attributes\reduceproduction.c
!IF "$(CFG)" == "eressea - Win32 Release" !IF "$(CFG)" == "eressea - Win32 Release"
@ -1110,7 +1191,7 @@ SOURCE=..\common\attributes\reduceproduction.c
!ELSEIF "$(CFG)" == "eressea - Win32 Debug" !ELSEIF "$(CFG)" == "eressea - Win32 Debug"
# PROP Intermediate_Dir "..\common\attributes\Debug" # PROP Intermediate_Dir "../common/attributes/Debug"
!ELSEIF "$(CFG)" == "eressea - Win32 Conversion" !ELSEIF "$(CFG)" == "eressea - Win32 Conversion"
@ -1134,7 +1215,7 @@ SOURCE=..\common\attributes\reduceproduction.h
!ELSEIF "$(CFG)" == "eressea - Win32 Debug" !ELSEIF "$(CFG)" == "eressea - Win32 Debug"
# PROP Intermediate_Dir "..\common\attributes\Debug" # PROP Intermediate_Dir "../common/attributes/Debug"
!ELSEIF "$(CFG)" == "eressea - Win32 Conversion" !ELSEIF "$(CFG)" == "eressea - Win32 Conversion"
@ -1158,7 +1239,7 @@ SOURCE=..\common\attributes\targetregion.c
!ELSEIF "$(CFG)" == "eressea - Win32 Debug" !ELSEIF "$(CFG)" == "eressea - Win32 Debug"
# PROP Intermediate_Dir "..\common\attributes\Debug" # PROP Intermediate_Dir "../common/attributes/Debug"
!ELSEIF "$(CFG)" == "eressea - Win32 Conversion" !ELSEIF "$(CFG)" == "eressea - Win32 Conversion"
@ -1182,7 +1263,7 @@ SOURCE=..\common\attributes\targetregion.h
!ELSEIF "$(CFG)" == "eressea - Win32 Debug" !ELSEIF "$(CFG)" == "eressea - Win32 Debug"
# PROP Intermediate_Dir "..\common\attributes\Debug" # PROP Intermediate_Dir "../common/attributes/Debug"
!ELSEIF "$(CFG)" == "eressea - Win32 Conversion" !ELSEIF "$(CFG)" == "eressea - Win32 Conversion"

View file

@ -662,7 +662,7 @@ fix_migrants(void) {
unit * u; unit * u;
for (u=r->units;u;u=u->next) { for (u=r->units;u;u=u->next) {
if (u->race==RC_HUMAN) u->irace=RC_HUMAN; if (u->race==RC_HUMAN) u->irace=RC_HUMAN;
if (u->irace!=u->race && u->race!=RC_ILLUSION && u->race!=RC_DAEMON) { if (u->irace!=u->race && (race[u->race].flags & RCF_SHAPESHIFT)==0) {
log_warning(("[fix_migrants] %s ist ein %s, als %s getarnt\n", unitname(u), race[u->race].name[0], race[u->irace].name[0])); log_warning(("[fix_migrants] %s ist ein %s, als %s getarnt\n", unitname(u), race[u->race].name[0], race[u->irace].name[0]));
} }
} }
@ -2142,17 +2142,33 @@ test_gmquest(void)
} }
#define TEST_LOCALES 0
#if TEST_LOCALES
static void
setup_locales(void)
{
locale * lang = find_locale("en");
faction * f = factions;
while (f) {
f->locale = lang;
f = f->next;
}
}
#endif
void void
korrektur(void) korrektur(void)
{ {
#if TEST_LOCALES
setup_locales();
#endif
#ifdef TEST_GM_COMMANDS #ifdef TEST_GM_COMMANDS
setup_gm_faction(); setup_gm_faction();
#endif #endif
make_gms(); make_gms();
/* Wieder entfernen! */ /* Wieder entfernen! */
#ifdef BROKEN_OWNERS
verify_owners(false); verify_owners(false);
#endif
/* fix_herbtypes(); */ /* fix_herbtypes(); */
#ifdef CONVERT_TRIGGER #ifdef CONVERT_TRIGGER
convert_triggers(); convert_triggers();

View file

@ -132,6 +132,7 @@ game_init(void)
report_init(); report_init();
creport_init(); creport_init();
debug_language("locales.log");
init_locales(); init_locales();
init_races(); init_races();
@ -162,20 +163,6 @@ game_init(void)
} }
} }
static void
create_game(void)
{
assert(regions==NULL || !"game is initialized");
printf("Keine Spieldaten gefunden, erzeuge neues Spiel in %s...\n", datapath());
makedir(datapath(), 0700);
/* erste Insel generieren */
new_region(0, 0);
/* Monsterpartei anlegen */
createmonsters();
/* Teleportebene anlegen */
create_teleport_plane();
}
static void static void
getgarbage(void) getgarbage(void)
{ {
@ -384,7 +371,7 @@ write_stats(void)
i = 0; i = 0;
fputs("\n\t", F); fputs("\n\t", F);
} }
fprintf(F, "{ SK_%s, %d }, ", skillnames[sk], race[r].bonus[sk]); fprintf(F, "{ SK_%s, %d }, ", skillname(sk, NULL), race[r].bonus[sk]);
++i; ++i;
} }
} }

View file

@ -73,7 +73,7 @@ order_string(const order * o, char * buf, size_t len)
len=4096; len=4096;
} }
c = buf; c = buf;
strncpy(c, keywords[o->type], len); strncpy(c, locale_string(u->faction->locale, keywords[o->type]), len);
slen = strlen(c); slen = strlen(c);
len -= slen; len -= slen;
c += slen; c += slen;

View file

@ -322,7 +322,7 @@ modify_talente(unit * u, region * r)
waddnstr(wn, "< Talente >", -1); waddnstr(wn, "< Talente >", -1);
for (i = 0; i < MAXSKILLS; i++) { for (i = 0; i < MAXSKILLS; i++) {
q = get_skill(u, i); q = get_skill(u, i);
sprintf(buf, "%s %d [%d]", skillnames[i], eff_skill(u, i, r), q / u->number); sprintf(buf, "%s %d [%d]", skillname(i, NULL), eff_skill(u, i, r), q / u->number);
TL[i] = strdup(buf); TL[i] = strdup(buf);
if (L > 10) { if (L > 10) {
wmove(wn, i + 1, 4); wmove(wn, i + 1, 4);
@ -395,7 +395,7 @@ modify_talente(unit * u, region * r)
wrefresh(mywin); /* altes Fenster überbügeln */ wrefresh(mywin); /* altes Fenster überbügeln */
} }
set_skill(u, x, q * u->number); set_skill(u, x, q * u->number);
sprintf(buf, "%s %d [%d]", skillnames[x], eff_skill(u, x, r), q); sprintf(buf, "%s %d [%d]", skillname(x, NULL), eff_skill(u, x, r), q);
free(TL[x]); free(TL[x]);
modif = 1; modif = 1;
TL[x] = strdup(buf); TL[x] = strdup(buf);
@ -467,7 +467,7 @@ modify_unit(region * r, unit * modunit)
Addstr(", "); Addstr(", ");
q += 2; q += 2;
} }
sprintf(buf, "%s %d [%d]", skillnames[sk], eff_skill(u, sk, r), a / u->number); sprintf(buf, "%s %d [%d]", skillname(sk, NULL), eff_skill(u, sk, r), a / u->number);
q += strlen(buf); q += strlen(buf);
if (q > SX - 8) { if (q > SX - 8) {
q = strlen(buf); q = strlen(buf);

View file

@ -10,6 +10,36 @@
</locale> </locale>
</message> </message>
<message name="manufacture_skills">
<type>
<arg name="unit" type="unit"></arg>
<arg name="region" type="region"></arg>
<arg name="command" type="string"></arg>
<arg name="skill" type="skill"></arg>
<arg name="minskill" type="int"></arg>
<arg name="product" type="resource"></arg>
</type>
<locale name="de">
<nr section="production">
<text>"$unit($unit) in $region($region): '$command' - Man benötigt mindestens $int($minskill) $skill($skill), um $resource($product,0) zu produzieren."</text>
</nr>
</locale>
</message>
<message name="skill_needed">
<type>
<arg name="unit" type="unit"></arg>
<arg name="region" type="region"></arg>
<arg name="command" type="string"></arg>
<arg name="skill" type="skill"></arg>
</type>
<locale name="de">
<nr section="production">
<text>"$unit($unit) in $region($region): '$command' - Dazu braucht man das Talent $skill"</text>
</nr>
</locale>
</message>
<message name="no_attack_after_advance"> <message name="no_attack_after_advance">
<type> <type>
<arg name="unit" type="unit"></arg> <arg name="unit" type="unit"></arg>
@ -4519,7 +4549,12 @@
</type> </type>
<locale name="de"> <locale name="de">
<nr section="events"> <nr section="events">
<text>"$unit($unit) vermehrt sich um $int($amount) $race($race)."</text> <text>"$unit($unit) vermehrt sich um $int($amount) $race($race,$amount)."</text>
</nr>
</locale>
<locale name="en">
<nr section="events">
<text>"$unit($unit) breeds $int($amount) new $race($race,$amount)."</text>
</nr> </nr>
</locale> </locale>
</message> </message>
@ -4580,6 +4615,11 @@
<text>"$unit($unit) entdeckt, daß es keinen Weg nach $direction($direction) gibt."</text> <text>"$unit($unit) entdeckt, daß es keinen Weg nach $direction($direction) gibt."</text>
</nr> </nr>
</locale> </locale>
<locale name="en">
<nr section="movement">
<text>"$unit($unit) discovers that there is no route going $direction($direction)."</text>
</nr>
</locale>
</message> </message>
<message name="followfail"> <message name="followfail">
@ -5818,12 +5858,12 @@
<message name="growtree_effect"> <message name="growtree_effect">
<type> <type>
<arg name="mage" type="unit"></arg> <arg name="unit" type="unit"></arg>
<arg name="amount" type="int"></arg> <arg name="amount" type="int"></arg>
</type> </type>
<locale name="de"> <locale name="de">
<nr section="magic"> <nr section="magic">
<text>"$unit($mage) erschuf einen heiligen Hain von $int($amount) Bäumen."</text> <text>"$unit($unit) erschuf einen heiligen Hain von $int($amount) Bäumen."</text>
</nr> </nr>
</locale> </locale>
</message> </message>
@ -6129,7 +6169,7 @@
</type> </type>
<locale name="de"> <locale name="de">
<nr section="magic"> <nr section="magic">
<text>"$unit($mage) verwandelt $int($amount) $race($race) aus $unit($target)."</text> <text>"$unit($mage) verwandelt $int($amount) $race($race,$amount) aus $unit($target)."</text>
</nr> </nr>
</locale> </locale>
</message> </message>
@ -6239,7 +6279,7 @@
</type> </type>
<locale name="de"> <locale name="de">
<nr section="events"> <nr section="events">
<text>"Wir erklären allen $race($race) den heiligen Krieg."</text> <text>"Wir erklären allen $race($race,0) den heiligen Krieg."</text>
</nr> </nr>
</locale> </locale>
</message> </message>

View file

@ -1,3 +1,9 @@
Karavelle;de;Karavelle
Boot;de;Boot
Langboot;de;Langboot
Drachenschiff;de;Drachenschiff
Trireme;de;Trireme
# Terraintypen # Terraintypen
maelstrom;de;Mahlstrom maelstrom;de;Mahlstrom
ocean;de;Ozean ocean;de;Ozean
@ -52,6 +58,13 @@ east;de;Osten
southwest;de;Südwesten southwest;de;Südwesten
southeast;de;Südosten southeast;de;Südosten
dir_NW;de;NW
dir_NO;de;NO
dir_Ost;de;Ost
dir_SO;de;SO
dir_SW;de;SW
dir_West;de;West
# Verschiedenes # Verschiedenes
unknownunit;de;eine unbekannte Einheit unknownunit;de;eine unbekannte Einheit
@ -64,6 +77,7 @@ section_magic;de;Magie und Artefakte
section_movement;de;Reisen und Bewegung section_movement;de;Reisen und Bewegung
section_study;de;Lehren und Lernen section_study;de;Lehren und Lernen
section_battle;de;Kämpfe section_battle;de;Kämpfe
section_none;de;Verschiedenes
# Gebäudetypen # Gebäudetypen
fortress_generic;de;Burg fortress_generic;de;Burg
@ -83,8 +97,8 @@ tunnel;de;Tunnel
inn;de;Taverne inn;de;Taverne
stonecircle;de;Steinkreis stonecircle;de;Steinkreis
blessedstonecircle;de;Gesegneter Steinkreis blessedstonecircle;de;Gesegneter Steinkreis
illusion;de;Traumschlößchen illusioncastle;de;Traumschlößchen
generic;de;Struktur genericbuilding;de;Struktur
#Testgebäude #Testgebäude
temple;de;Tempel temple;de;Tempel
@ -126,6 +140,8 @@ person;de;Person
persons;de;Personen persons;de;Personen
#items #items
runesword;de;Runenschwert
runeswords;de;Runenschwerter
iron;de;Eisen iron;de;Eisen
irons;de;Eisen irons;de;Eisen
log;de;Holz log;de;Holz
@ -358,3 +374,229 @@ p14s;de;Heiltr
# Spezialitems # Spezialitems
lmsreward;de;Gürtel der Heldentaten lmsreward;de;Gürtel der Heldentaten
lmsrewards;de;Gürtel der Heldentaten lmsrewards;de;Gürtel der Heldentaten
# Parameter
ALLES;de;ALLES
BAUERN;de;BAUERN
BURG;de;BURG
EINHEIT;de;EINHEIT
PRIVAT;de;PRIVAT
HINTEN;de;HINTEN
KOMMANDO;de;KOMMANDO
KRÄUTER;de;KRÄUTER
NICHT;de;NICHT
NÄCHSTER;de;NÄCHSTER
PARTEI;de;PARTEI
PERSONEN;de;PERSONEN
REGION;de;REGION
SCHIFF;de;SCHIFF
SILBER;de;SILBER
STRAßEN;de;STRAßEN
TEMPORÄRE;de;TEMPORÄRE
FEIND;de;FEIND
FLIEHE;de;FLIEHE
GEBÄUDE;de;GEBÄUDE
GIB;de;GIB
KÄMPFE;de;KÄMPFE
BEWACHE;de;BEWACHE
ZAUBERBUCH;de;ZAUBERBUCH
PAUSE;de;PAUSE
VORNE;de;VORNE
AGGRESSIV;de;AGGRESSIV
DEFENSIV;de;DEFENSIV
STUFE;de;STUFE
HELFE;de;HELFE
FREMDES;de;FREMDES
AURA;de;AURA
UM;de;UM
BEISTAND;de;BEISTAND
GNADE;de;GNADE
HINTER;de;HINTER
VOR;de;VOR
ANZAHL;de;ANZAHL
GEGENSTÄNDE;de;GEGENSTÄNDE
TRÄNKE;de;TRÄNKE
#;Talente:
sk_alchemy;de;Alchemie
sk_crossbow;de;Armbrustschießen
sk_stamina;de;Ausdauer
sk_mining;de;Bergbau
sk_bow;de;Bogenschießen
sk_building;de;Burgenbau
sk_trade;de;Handeln
sk_melee;de;Hiebwaffen
sk_forestry;de;Holzfällen
sk_catapult;de;Katapultbedienung
sk_herbalism;de;Kräuterkunde
sk_magic;de;Magie
sk_training;de;Pferdedressur
sk_riding;de;Reiten
sk_armorer;de;Rüstungsbau
sk_shipcraft;de;Schiffbau
sk_sailing;de;Segeln
sk_espionage;de;Spionage
sk_polearm;de;Stangenwaffen
sk_quarrying;de;Steinbau
sk_taxation;de;Steuereintreiben
sk_roadwork;de;Straßenbau
sk_tactics;de;Taktik
sk_stealth;de;Tarnung
sk_entertainment;de;Unterhaltung
sk_weaponsmithing;de;Waffenbau
sk_unarmed;de;Waffenloser Kampf
sk_cartmaking;de;Wagenbau
sk_perception;de;Wahrnehmung
# Befehle
//;de;//
BANNER;de;BANNER
ARBEITEN;de;ARBEITEN
ATTACKIEREN;de;ATTACKIEREN
BIETEN;de;BIETEN
BEKLAUEN;de;BEKLAUEN
BELAGERE;de;BELAGERE
BENENNEN;de;BENENNEN
BENUTZEN;de;BENUTZEN
BESCHREIBE;de;BESCHREIBE
BETRETEN;de;BETRETEN
BEWACHEN;de;BEWACHEN
BOTSCHAFT;de;BOTSCHAFT
ENDE;de;ENDE
FAHREN;de;FAHREN
NUMMER;de;NUMMER
FOLGEN;de;FOLGEN
FORSCHEN;de;FORSCHEN
HELFEN;de;HELFEN
KÄMPFEN;de;KÄMPFEN
KAMPFZAUBER;de;KAMPFZAUBER
KAUFEN;de;KAUFEN
KONTAKTIERE;de;KONTAKTIERE
LEHREN;de;LEHREN
LERNEN;de;LERNEN
LIEFERE;de;LIEFERE
MACHEN;de;MACHEN
NACH;de;NACH
PASSWORT;de;PASSWORT
REKRUTIEREN;de;REKRUTIEREN
RESERVIEREN;de;RESERVIEREN
ROUTE;de;ROUTE
SABOTIEREN;de;SABOTIEREN
OPTION;de;OPTION
SPIONIEREN;de;SPIONIEREN
STIRB;de;STIRB
TARNEN;de;TARNEN
TRANSPORTIEREN;de;TRANSPORTIEREN
TREIBEN;de;TREIBEN
UNTERHALTEN;de;UNTERHALTEN
VERKAUFE;de;VERKAUFE
VERLASSE;de;VERLASSE
VERGESSE;de;VERGESSE
ZAUBERE;de;ZAUBERE
ZEIGEN;de;ZEIGEN
ZERSTÖREN;de;ZERSTÖREN
ZÜCHTEN;de;ZÜCHTEN
DEFAULT;de;DEFAULT
REPORT;de;REPORT
URSPRUNG;de;URSPRUNG
EMAIL;de;EMAIL
MEINUNG;de;MEINUNG
MAGIEGEBIET;de;MAGIEGEBIET
PIRATERIE;de;PIRATERIE
LOCALE;de;LOCALE
NEUSTART;de;NEUSTART
GRUPPE;de;GRUPPE
OPFERE;de;OPFERE
BETEN;de;BETEN
SORTIEREN;de;SORTIEREN
JIHAD;de;JIHAD
GM;de;GM
Adler;de;Adler
Drache;de;Drache
Drachen;de;Drachen
Dämon;de;Dämon
Dämonen;de;Dämonen
Einhorn;de;Einhorn
Einhörner;de;Einhörner
Elf;de;Elf
Elfen;de;Elfen
Eule;de;Eule
Eulen;de;Eulen
Geist;de;Geist
Geister;de;Geister
Goblin;de;Goblin
Goblins;de;Goblins
Halbling;de;Halbling
Halblinge;de;Halblinge
Hirntöter;de;Hirntöter
Insekt;de;Insekt
Insekten;de;Insekten
Jungdrache;de;Jungdrache
Jungdrachen;de;Jungdrachen
Katze;de;Katze
Katzen;de;Katzen
Luchs;de;Luchs
Luchse;de;Luchse
Meermensch;de;Meermensch
Meermenschen;de;Meermenschen
Mensch;de;Mensch
Menschen;de;Menschen
Ork;de;Ork
Orks;de;Orks
Riesenschildkröte;de;Riesenschildkröte
Riesenschildkröten;de;Riesenschildkröten
Schablone;de;Schablone
Schablonen;de;Schablonen
Schattenritter;de;Schattenritter
Seeschlange;de;Seeschlange
Troll;de;Troll
Trolle;de;Trolle
Untote;de;Untote
Untoter;de;Untoter
Warg;de;Warg
Warge;de;Warge
Zombie;de;Zombie
Zombies;de;Zombies
Zwerg;de;Zwerg
Zwerge;de;Zwerge
# races, future use:
rc_lynx;de;Luchse
rc_unicorns;de;Einhörner
rc_wolves;de;Warge
rc_dragons;de;Drachen
rc_catdragons;de;Katzendrachen
rc_ghosts;de;Geister
rc_cats;de;Katzen
rc_humans;de;Menschen
rc_cat;de;Katze
rc_elf;de;Elf
rc_human;de;Mensch
rc_elves;de;Elfen
rc_aquarian;de;Meermensch
rc_dwarves;de;Zwerge
rc_lynxs;de;Luchs
rc_unicorn;de;Einhorn
rc_wolf;de;Warg
rc_dragon;de;Drache
rc_catdragon;de;Katzendrache
rc_dwarf;de;Zwerg
rc_aquarians;de;Meermenschen
rc_insects;de;Insekten
rc_insect;de;Insekt
rc_ghost;de;Geist
rc_halfling;de;Halbling
rc_halflings;de;Halblinge
rc_trolls;de;Trolle
rc_troll;de;Troll
rc_undead;de;Untote
rc_undeads;de;Untoter
rc_owl;de;Eule
rc_giantturtle;de;Riesenschildkröte
rc_orcs;de;Orks
rc_orc;de;Ork
rc_zombie;de;Zombie
rc_zombies;de;Zombies
rc_shadowknight;de;Schattenritter

View file

@ -241,7 +241,7 @@
</type> </type>
<locale name="en"> <locale name="en">
<nr section="errors"> <nr section="errors">
<text>"$unit($unit) in $region($region): '$command' - Order was unrecognizable."</text> <text>"$unit($unit) in $region($region): '$command' - Unknown command."</text>
</nr> </nr>
</locale> </locale>
</message> </message>
@ -733,7 +733,7 @@
<arg name="region" type="region"></arg> <arg name="region" type="region"></arg>
<arg name="command" type="string"></arg> <arg name="command" type="string"></arg>
</type> </type>
<locale name="de"> <locale name="en">
<nr section="errors"> <nr section="errors">
<text>"$unit($unit) in $region($region): '$command' - The unit could not be found."</text> <text>"$unit($unit) in $region($region): '$command' - The unit could not be found."</text>
</nr> </nr>
@ -2869,7 +2869,7 @@
</type> </type>
<locale name="en"> <locale name="en">
<nr section="none"> <nr section="none">
<text>"$unit($unit) hands $int($amount) $resource($resource,$amount) to $unit($target)."</text> <text>"$unit($unit) gave $int($amount) $resource($resource,$amount) to $unit($target)."</text>
</nr> </nr>
</locale> </locale>
</message> </message>
@ -2906,7 +2906,7 @@
</type> </type>
<locale name="en"> <locale name="en">
<nr section="none"> <nr section="none">
<text>"$unit($unit) hands command over to $unit($receipient)."</text> <text>"$unit($unit) gave control to $unit($receipient)."</text>
</nr> </nr>
</locale> </locale>
</message> </message>
@ -3280,7 +3280,7 @@
</type> </type>
<locale name="en"> <locale name="en">
<nr section="none"> <nr section="none">
<text>"$unit($unit) looses $int($dead) people due to starvation in $region($region)."</text> <text>"$unit($unit) loses $int($dead) people due to starvation in $region($region)."</text>
</nr> </nr>
</locale> </locale>
</message> </message>
@ -3524,7 +3524,7 @@
<arg name="direction" type="direction"></arg> <arg name="direction" type="direction"></arg>
</type> </type>
<locale name="en"> <locale name="en">
<nr section="none"> <nr section="movement">
<text>"$unit($unit) refuses to travel to the$direction($direction)."</text> <text>"$unit($unit) refuses to travel to the$direction($direction)."</text>
</nr> </nr>
</locale> </locale>
@ -3536,7 +3536,7 @@
<arg name="region" type="region"></arg> <arg name="region" type="region"></arg>
</type> </type>
<locale name="en"> <locale name="en">
<nr section="none"> <nr section="movement">
<text>"The crew of the $ship($ship) refuses to travel to $region($region)."</text> <text>"The crew of the $ship($ship) refuses to travel to $region($region)."</text>
</nr> </nr>
</locale> </locale>
@ -3548,7 +3548,7 @@
<arg name="direction" type="direction"></arg> <arg name="direction" type="direction"></arg>
</type> </type>
<locale name="en"> <locale name="en">
<nr section="none"> <nr section="movement">
<text>" The crew of the $ship($ship) refuses to travel to the$direction($direction)."</text> <text>" The crew of the $ship($ship) refuses to travel to the$direction($direction)."</text>
</nr> </nr>
</locale> </locale>
@ -3571,7 +3571,7 @@
<arg name="ship" type="ship"></arg> <arg name="ship" type="ship"></arg>
</type> </type>
<locale name="en"> <locale name="en">
<nr section="none"> <nr section="movement">
<text>"In the very last moment, the crew of the $ship($ship) saved the ship from grounding."</text> <text>"In the very last moment, the crew of the $ship($ship) saved the ship from grounding."</text>
</nr> </nr>
</locale> </locale>
@ -3583,7 +3583,7 @@
<arg name="region" type="region"></arg> <arg name="region" type="region"></arg>
</type> </type>
<locale name="en"> <locale name="en">
<nr section="none"> <nr section="movement">
<text>"$unit($unit) discovered that $region($region) is Ocean."</text> <text>"$unit($unit) discovered that $region($region) is Ocean."</text>
</nr> </nr>
</locale> </locale>
@ -3595,7 +3595,7 @@
<arg name="direction" type="direction"></arg> <arg name="direction" type="direction"></arg>
</type> </type>
<locale name="en"> <locale name="en">
<nr section="none"> <nr section="movement">
<text>"$unit($unit) discovered that an Ocean lies in the $direction($direction)."</text> <text>"$unit($unit) discovered that an Ocean lies in the $direction($direction)."</text>
</nr> </nr>
</locale> </locale>

View file

@ -1,10 +1,25 @@
west;en;West Karavelle;en;caravelle
northwest;en;Northwest Boot;en;boat
northeast;en;Northeast Langboot;en;longboat
east;en;East Drachenschiff;en;dragonboat
southwest;en;Southwest Trireme;en;trireme
southeast;en;Southeast
west;en;west
northwest;en;northwest
northeast;en;northeast
east;en;east
southwest;en;southwest
southeast;en;southeast
dir_NW;en;NW
dir_NO;en;NE
dir_Ost;en;East
dir_SO;en;SE
dir_SW;en;SW
dir_West;en;West
unknownunit;en;an unknown unit unknownunit;en;an unknown unit
section_events;en;Messages and Events section_events;en;Messages and Events
section_errors;en;Warnings and Errors section_errors;en;Warnings and Errors
section_economy;en;Economy and Trade section_economy;en;Economy and Trade
@ -15,6 +30,26 @@ section_study;en;Learning and Teaching
section_battle;en;Battles section_battle;en;Battles
section_none;en;Miscellaneous section_none;en;Miscellaneous
# Building Types
genericbuilding;en;structure
illusioncastle;en;fairy castle
blessedstonecircle;en;blessed stonecircle
stonecircle;en;stonecircle
inn;en;inn
tunnel;en;tunnel
caravan;en;caravanserei
dam;en;dam
monument;en;monument
stables;en;stables
sawmill;en;sawmill
smithy;en;smithy
magictower;en;magic tower
academy;en;academy
harbour;en;harbour
quarry;en;quarry
mine;en;mine
lighthouse;en;lighthouse
# Burgausbaustufen # Burgausbaustufen
site;en;site site;en;site
fortification;en;fortification fortification;en;fortification
@ -25,13 +60,12 @@ citadel;en;citadel
# Items # Items
herb;en;herb herb;en;herb
herbbag;en;herbbag
vial;en;vial vial;en;vial
vials;en;vials vials;en;vials
# Resourcen # Resourcen
money;en;money money;en;silver
moneys;en;moneys moneys;en;silver
hp;en;hp hp;en;hp
hps;en;hps hps;en;hps
aura;en;aura aura;en;aura
@ -65,16 +99,8 @@ chainmail;en;chainmail
chainmails;en;chainmails chainmails;en;chainmails
plate;en;plate plate;en;plate
plates;en;plates plates;en;plates
balm;en;balm firesword;en;flaming sword
spice;en;spice fireswords;en;flaming swords
jewel;en;jewel
jewels;en;jewels
myrrh;en;myrrh
oil;en;oil
silk;en;silk
incense;en;incense
firesword;en;firesword
fireswords;en;fireswords
shieldstone;en;shieldstone shieldstone;en;shieldstone
shieldstones;en;shieldstones shieldstones;en;shieldstones
greatsword;en;great sword greatsword;en;great sword
@ -161,9 +187,58 @@ aurafocuses;en;aurafocuses
presspass;en;presspass presspass;en;presspass
presspasses;en;presspasses presspasses;en;presspasses
trollbelt;en;trollbelt trollbelt;en;trollbelt
person;en;man
persons;en;men
unit;en;unit
units;en;units
ao_chastity;en;amulet of chastity
ao_chastitys;en;amulets of chastity
laens;en;laen
pegasus;en;pegasus
pegasi;en;pegasi
elvenhorse;en;elven horse
elvenhorses;en;elven horses
dolphin;en;dolphin
dolphins;en;dolphins
runesword;en;runesword
runeswords;en;runeswords
magicherbbag;en;bag of conservation
mallornspear;en;mallorn spear
mallornspears;en;mallorn spear
mallornlance;en;mallorn lance
mallornlances;en;mallorn lances
mallornbow;en;mallorn bow
mallornbows;en;mallorn bows
mallorncrossbow;en;mallorn crossbow
mallorncrossbows;en;mallorn crossbows
ao_daemon;en;eye of the Demon
ao_daemons;en;eye of the Demon
museumticket;en;ticket to the grand museum
museumtickets;en;tickets to the grand museum
museumexitticket;en;returnticket for the grand museum
museumexittickets;en;returntickets for the grand museum
griphonwing;en;wing of the gryphon
griphonwings;en;wings of the gryphon
# luxury goods
balm;en;balm
spice;en;spice
jewel;en;jewel
jewels;en;jewels
myrrh;en;myrrh
oil;en;oil
silk;en;silk
incense;en;incense
balms;en;balm
spices;en;spice
myrrhs;en;myrrh
oils;en;oil
silks;en;silk
incenses;en;incense
# Spezialitems # Spezialitems
lmsreward;en;Belt of Heroic Legends lmsreward;en;Belt of Heroic Legends
lmsrewards;en;Belts of Heroic Legends
# Terraintypen # Terraintypen
maelstrom;en;maelstrom maelstrom;en;maelstrom
@ -187,7 +262,7 @@ hall1;en;hallway
corridor1;en;corridor corridor1;en;corridor
maelstrom_trail;en;a %s maelstrom_trail;en;a %s
ocean_trail;en;an %s ocean_trail;en;the %s
plain_trail;en;the plain of %s plain_trail;en;the plain of %s
forest_trail;en;the forests of %s forest_trail;en;the forests of %s
swamp_trail;en;the swamps of %s swamp_trail;en;the swamps of %s
@ -208,3 +283,267 @@ corridor1_trail;en;a %s
caldera;en;caldera caldera;en;caldera
xmas_exit;en;portal xmas_exit;en;portal
viele;en;many
sehr viele;en;a great many
# intranslatables:
h0;en;Flachwurz
h0s;en;Flachwurz
h1;en;Würziger Wagemut
h1s;en;Würzige Wagemut
h2;en;Eulenauge
h2s;en;Eulenaugen
h3;en;Grüner Spinnerich
h3s;en;Grüne Spinneriche
h4;en;Blauer Baumringel
h4s;en;Blaue Baumringel
h5;en;Elfenlieb
h5s;en;Elfenlieb
h6;en;Gurgelkraut
h6s;en;Gurgelkräuter
h7;en;Knotiger Saugwurz
h7s;en;Knotige Saugwurze
h8;en;Blasenmorchel
h8s;en;Blasenmorcheln
h9;en;Wasserfinder
h9s;en;Wasserfinder
h10;en;Kakteenschwitz
h10s;en;Kakteenschwitze
h11;en;Sandfäule
h11s;en;Sandfäulen
h12;en;Windbeutel
h12s;en;Windbeutel
h13;en;Fjordwuchs
h13s;en;Fjordwuchse
h14;en;Alraune
h14s;en;Alraunen
h15;en;Steinbeißer
h15s;en;Steinbeißer
h16;en;Spaltwachs
h16s;en;Spaltwachse
h17;en;Höhlenglimm
h17s;en;Höhlenglimme
h18;en;Eisblume
h18s;en;Eisblumen
h19;en;Weißer Wüterich
h19s;en;Weiße Wüteriche
h20;en;Schneekristall
h20s;en;Schneekristalle
p0;en;Siebenmeilentee
p0s;en;Siebenmeilentees
p1;en;Goliathwasser
p1s;en;Goliathwasser
p2;en;Wasser des Lebens
p2s;en;Wasser des Lebens
p3;en;Schaffenstrunk
p3s;en;Schaffenstrünke
p4;en;Wundsalbe
p4s;en;Wundsalben
p5;en;Bauernblut
p5s;en;Bauernblut
p6;en;Gehirnschmalz
p6s;en;Gehirnschmalz
p7;en;Dumpfbackenbrot
p7s;en;Dumpfbackenbrote
p8;en;Nestwärme
p8s;en;Nestwärme
p9;en;Pferdeglück
p9s;en;Pferdeglück
p10;en;Berserkerblut
p10s;en;Berserkerblut
p11;en;Bauernlieb
p11s;en;Bauernlieb
p12;en;Trank der Wahrheit
p12s;en;Tränke der Wahrheit
p13;en;Elixier der Macht
p13s;en;Elixiere der Macht
p14;en;Heiltrank
p14s;en;Heiltränke
# Parameters
ALLES;en;ALL
BAUERN;en;PEASANTS
BURG;en;FORTIFICATION
EINHEIT;en;UNIT
PRIVAT;en;PRIVATE
HINTEN;en;BACK
KOMMANDO;en;CONTROL
KRÄUTER;en;HERBS
NICHT;en;NOT
NÄCHSTER;en;NEXT
PARTEI;en;PARTEI
PERSONEN;en;MEN
REGION;en;REGION
SCHIFF;en;SHIP
STRAßEN;en;ROADS
TEMPORÄRE;en;TEMPORARY
FLIEHE;en;FLEE
GEBÄUDE;en;BUILDING
GIB;en;GIVE
KÄMPFE;en;COMBAT
BEWACHE;en;GUARD
ZAUBERBUCH;en;SPELLBOOK
PAUSE;en;PAUSE
VORNE;en;FRONT
AGGRESSIV;en;AGGRESSIVE
DEFENSIV;en;DEFENSIVE
STUFE;en;LEVEL
HELFE;en;HELP
FREMDES;en;ALIEN
AURA;en;AURA
UM;en;FOR
BEISTAND;en;AID
GNADE;en;MERCY
HINTER;en;AFTER
VOR;en;BEFORE
ANZAHL;en;NUMBER
GEGENSTÄNDE;en;ITEMS
TRÄNKE;en;POTIONS
SILBER;en;MONEY
# Skills
sk_alchemy;en;alchemy
sk_crossbow;en;crossbow
sk_stamina;en;stamina
sk_mining;en;mining
sk_bow;en;bow
sk_building;en;building
sk_trade;en;trade
sk_melee;en;melee
sk_forestry;en;forestry
sk_catapult;en;catapult
sk_herbalism;en;herbalism
sk_magic;en;magic
sk_training;en;training
sk_riding;en;riding
sk_armorer;en;armorer
sk_shipcraft;en;shipcraft
sk_sailing;en;sailing
sk_espionage;en;espionage
sk_polearm;en;polearm
sk_quarrying;en;quarrying
sk_taxation;en;taxation
sk_roadwork;en;roadwork
sk_tactics;en;tactics
sk_stealth;en;stealth
sk_entertainment;en;entertainment
sk_weaponsmithing;en;weaponsmithing
sk_unarmed;en;unarmed combat
sk_cartmaking;en;cartmaking
sk_perception;en;perception
# Keywords
//;en;//
BANNER;en;BANNER
ARBEITEN;en;WORK
ATTACKIEREN;en;ATTACK
BIETEN;en;BIDD
BEKLAUEN;en;STEAL
BELAGERE;en;BESIEGE
BENENNEN;en;NAME
BENUTZEN;en;USE
BESCHREIBE;en;DESCRIBE
BETRETEN;en;ENTER
BEWACHEN;en;GUARD
BOTSCHAFT;en;MESSAGE
ENDE;en;END
FAHREN;en;HITCH
NUMMER;en;NUMBER
FOLGEN;en;FOLLOW
FORSCHEN;en;RESEARCH
HELFEN;en;HELP
KÄMPFEN;en;COMBAT
KAMPFZAUBER;en;COMBATSPELL
KAUFEN;en;BUY
KONTAKTIERE;en;CONTACT
LEHREN;en;TEACH
LERNEN;en;LEARN
LIEFERE;en;SUPPLY
MACHEN;en;MAKE
NACH;en;MOVE
PASSWORT;en;PASSWORD
REKRUTIEREN;en;RECRUIT
RESERVIEREN;en;RESERVE
ROUTE;en;ROUTE
SABOTIEREN;en;SABOTAGE
OPTION;en;OPTION
SPIONIEREN;en;SPY
STIRB;en;QUIT
TARNEN;en;TARN
TRANSPORTIEREN;en;TRANSPORT
TREIBEN;en;TAX
UNTERHALTEN;en;ENTERTAIN
VERKAUFE;en;SELL
VERLASSE;en;LEAVE
VERGESSE;en;FORGET
ZAUBERE;en;CAST
ZEIGEN;en;SHOW
ZERSTÖREN;en;DESTROY
ZÜCHTEN;en;BREED
DEFAULT;en;DEFAULT
REPORT;en;REPORT
URSPRUNG;en;ORIGIN
EMAIL;en;EMAIL
MEINUNG;en;OPINION
MAGIEGEBIET;en;CIRCLE
PIRATERIE;en;PIRACY
LOCALE;en;LOCALE
NEUSTART;en;RESTART
GRUPPE;en;GROUP
OPFERE;en;SACRIFICE
BETEN;en;PRAY
SORTIEREN;en;SORT
JIHAD;en;JIHAD
GM;en;GM
Luchse;en;lynx
Einhörner;en;unicorns
Warge;en;wolves
Drachen;en;dragons
Katzendrachen;en;catdragons
Geister;en;ghosts
Katzen;en;cats
Menschen;en;humans
Katze;en;cat
Elf;en;elf
Mensch;en;human
Elfen;en;elves
Meermensch;en;aquarian
Zwerge;en;dwarves
Luchs;en;lynx
Einhorn;en;unicorn
Warg;en;wolf
Drache;en;dragon
Katzendrache;en;catdragon
Zwerg;en;dwarf
Meermenschen;en;aquarians
Insekten;en;insects
Insekt;en;insect
Geist;en;ghost
Halbling;en;halfling
Halblinge;en;halflings
Trolle;en;trolls
Troll;en;troll
Untote;en;undead
Untoter;en;undead
Eule;en;owl
Riesenschildkröte;en;giant turtle
Orks;en;orc
Zombie;en;zombie
Zombies;en;zombies
Schattenritter;en;shadow knight
Adler;en;eagle
Hirntöter;en;braineater
Jungdrachen;en;young dragons
Jungdrache;en;young dragons
Seeschlange;en;sea serpent
Eulen;en;owls
Riesenschildkröten;en;giant turtles
Dämon;en;Demon
Ork;en;orc
Dämonen;en;Demons
Schablonen;en;templates
Goblin;en;goblin
Schablone;en;template
Goblins;en;goblins

View file

@ -139,7 +139,7 @@ new_message(struct faction * receiver, const char* sig, ...)
args[i] = resourcename(oldresourcetype[(resource_t)va_arg(marker, resource_t)], 0); args[i] = resourcename(oldresourcetype[(resource_t)va_arg(marker, resource_t)], 0);
break; break;
case 't': case 't':
args[i] = skillnames[va_arg(marker, skill_t)]; args[i] = skillname(va_arg(marker, skill_t), NULL);
break; break;
case 'd': case 'd':
args[i] = directions[i]; args[i] = directions[i];