Erster Code für die Dungeons

Neuer XML Parser
Reparatur einiger fehlerhafter XML-Dateien
This commit is contained in:
Enno Rehling 2002-01-05 16:14:38 +00:00
parent e21220aba6
commit 19718d2ff2
26 changed files with 4786 additions and 2039 deletions

View file

@ -76,7 +76,7 @@ extern const char *spelldata[];
extern int quiet;
/* globals */
#define C_REPORT_VERSION 61
#define C_REPORT_VERSION 62
#define TAG_LOCALE "de"
#ifdef TAG_LOCALE
@ -1191,20 +1191,25 @@ report_computer(FILE * F, faction * f, const seen_region * seen,
/* describe both passed and inhabited regions */
show_active_spells(r);
{
boolean see = false;
boolean seeunits = false, seeships = false;
const attrib * ru;
/* show units pulled throuth region */
/* show units pulled through region */
for (ru = a_find(r->attribs, &at_travelunit); ru; ru = ru->nexttype) {
unit * u = (unit*)ru->data.v;
if (cansee_durchgezogen(f, r, u, 0) && r!=u->region) {
if (u->ship && !fval(u, FL_OWNER))
continue;
if (!see) fprintf(F, "DURCHREISE\n");
see = true;
if (u->ship)
fprintf(F, "\"%s\"\n", shipname(u->ship));
else
fprintf(F, "\"%s\"\n", unitname(u));
if (!u->ship || !fval(u, FL_OWNER)) continue;
if (!seeships) fprintf(F, "DURCHSCHIFFUNG\n");
seeships = true;
fprintf(F, "\"%s\"\n", shipname(u->ship));
}
}
for (ru = a_find(r->attribs, &at_travelunit); ru; ru = ru->nexttype) {
unit * u = (unit*)ru->data.v;
if (cansee_durchgezogen(f, r, u, 0) && r!=u->region) {
if (u->ship) continue;
if (!seeunits) fprintf(F, "DURCHREISE\n");
seeunits = true;
fprintf(F, "\"%s\"\n", unitname(u));
}
}
}

View file

@ -2085,16 +2085,16 @@ const char * locales[] = {
NULL
};
static int read_xml(const char * filename);
static int read_xml(const char * filename, struct xml_stack *stack);
static int
parse_tagbegin(struct xml_stack *stack, void *data)
parse_tagbegin(struct xml_stack *stack)
{
const xml_tag * tag = stack->tag;
if (strcmp(tag->name, "include")==0) {
const char * filename = xml_value(tag, "file");
if (filename) {
return read_xml(filename);
return read_xml(filename, stack);
} else {
log_printf("required tag 'file' missing from include");
return XML_USERERROR;
@ -2112,7 +2112,6 @@ parse_tagbegin(struct xml_stack *stack, void *data)
if (maxunits!=0) {
global.maxunits = maxunits;
}
} else if (strcmp(tag->name, "game")==0) {
} else if (strcmp(tag->name, "order")==0) {
const char * name = xml_value(tag, "name");
if (xml_bvalue(tag, "disable")) {
@ -2124,27 +2123,16 @@ parse_tagbegin(struct xml_stack *stack, void *data)
}
}
}
} else if (strcmp(tag->name, "resource")==0) {
xml_readresource(stack->stream, stack);
} else if (strcmp(tag->name, "races")==0) {
read_races(stack->stream, stack);
} else if (strcmp(tag->name, "strings")==0) {
return read_messages(stack->stream, stack);
} else if (strcmp(tag->name, "messages")==0) {
return read_messages(stack->stream, stack);
}
return XML_OK;
}
static xml_callbacks msgcallback = {
NULL,
parse_tagbegin,
NULL,
NULL
static xml_callbacks xml_eressea = {
parse_tagbegin, NULL, NULL
};
static int
read_xml(const char * filename)
read_xml(const char * filename, xml_stack * stack)
{
char zText[80];
FILE * F;
@ -2156,7 +2144,7 @@ read_xml(const char * filename)
return XML_USERERROR;
}
i = xml_parse(F, &msgcallback, NULL, NULL);
i = xml_read(F, stack);
fclose(F);
return i;
}
@ -2164,8 +2152,12 @@ read_xml(const char * filename)
int
init_data(const char * filename)
{
int l = read_xml(filename);
int l;
xml_register(&xml_eressea, "eressea", 0);
xml_register(&xml_eressea, "eressea include", XML_CB_IGNORE);
l = read_xml(filename, NULL);
if (l) return l;
/* old stuff, for removal: */
@ -2336,6 +2328,7 @@ kernel_init(void)
skill_init();
attrib_init();
translation_init();
init_messages();
if (!turn) turn = lastturn();
if (turn == 0)

View file

@ -2035,6 +2035,126 @@ static const char * names[] = {
"unit", "unit_p"
};
#include <xml.h>
typedef struct xml_state {
struct item_type * itype;
struct resource_type * rtype;
struct weapon_type * wtype;
int wmods;
} xml_state;
static int
tagend(struct xml_stack * stack)
{
const xml_tag * tag = stack->tag;
if (strcmp(tag->name, "resource")==0) {
free(stack->state);
}
return XML_OK;
}
static int
tagbegin(struct xml_stack * stack)
{
const xml_tag * tag = stack->tag;
if (strcmp(tag->name, "resource")==0) {
xml_state * state = stack->state = calloc(sizeof(xml_state), 1);
char *names[2], *appearance[2];
const char *tmp;
unsigned int flags = RTF_NONE;
if (xml_bvalue(tag, "pooled")) flags |= RTF_POOLED;
tmp = xml_value(tag, "name");
assert(tmp || "resource needs a name");
names[0] = strdup(tmp);
names[1] = strcat(strcpy((char*)malloc(strlen(tmp)+3), tmp), "_p");
tmp = xml_value(tag, "appearance");
if (tmp!=NULL) {
appearance[0] = strdup(tmp);
appearance[1] = strcat(strcpy((char*)malloc(strlen(tmp)+3), tmp), "_p");
state->rtype = new_resourcetype((const char**)names, (const char**)appearance, flags);
free(appearance[0]);
free(appearance[1]);
} else {
state->rtype = new_resourcetype((const char**)names, NULL, flags);
}
free(names[0]);
free(names[1]);
} else {
xml_state * state = stack->state = stack->next->state;
if (strcmp(tag->name, "item")==0) {
unsigned int flags = ITF_NONE;
int weight = xml_ivalue(tag, "weight");
int capacity = xml_ivalue(tag, "capacity");
assert(state->itype==NULL);
if (xml_bvalue(tag, "cursed")) flags |= ITF_CURSED;
if (xml_bvalue(tag, "notlost")) flags |= ITF_NOTLOST;
if (xml_bvalue(tag, "big")) flags |= ITF_BIG;
if (xml_bvalue(tag, "animal")) flags |= ITF_ANIMAL;
state->rtype->flags |= RTF_ITEM;
state->itype = new_itemtype(state->rtype, flags, weight, capacity);
} else if (strcmp(tag->name, "weapon")==0) {
skill_t skill = sk_find(xml_value(tag, "skill"));
int minskill = xml_ivalue(tag, "minskill");
int offmod = xml_ivalue(tag, "offmod");
int defmod = xml_ivalue(tag, "defmod");
int reload = xml_ivalue(tag, "reload");
double magres = xml_fvalue(tag, "magres");
unsigned int flags = WTF_NONE;
assert(strcmp(stack->next->tag->name, "item")==0);
assert(state->itype!=NULL);
state->itype->flags |= ITF_WEAPON;
state->wtype = new_weapontype(state->itype,
flags, magres, NULL, offmod, defmod, reload, skill, minskill);
} else if (strcmp(tag->name, "damage")==0) {
/* damage of a weapon */
int pos = 0;
const char * type = xml_value(tag, "type");
assert(strcmp(stack->next->tag->name, "weapon")==0);
if (strcmp(type, "default")!=0) pos = 1;
if (state->wtype->damage[pos]) free(state->wtype->damage[pos]);
state->wtype->damage[pos] = strdup(xml_value(tag, "value"));
} else if (strcmp(tag->name, "modifier")==0) {
int value = xml_ivalue(tag, "value");
assert(strcmp(stack->next->tag->name, "weapon")==0);
if (value!=0) {
int flags = 0;
weapon_mod * mods = calloc(sizeof(weapon_mod), state->wmods+2);
assert(state->wtype);
if (xml_bvalue(tag, "walking")) flags|=WMF_WALKING;
if (xml_bvalue(tag, "riding")) flags|=WMF_RIDING;
if (xml_bvalue(tag, "against_walking")) flags|=WMF_AGAINST_WALKING;
if (xml_bvalue(tag, "against_riding")) flags|=WMF_AGAINST_RIDING;
if (xml_bvalue(tag, "offensive")) flags|=WMF_OFFENSIVE;
if (xml_bvalue(tag, "defensive")) flags|=WMF_DEFENSIVE;
if (xml_bvalue(tag, "damage")) flags|=WMF_DAMAGE;
if (xml_bvalue(tag, "skill")) flags|=WMF_SKILL;
if (xml_bvalue(tag, "missile_target")) flags|=WMF_MISSILE_TARGET;
if (state->wmods) {
memcpy(mods, state->wtype->modifiers, sizeof(weapon_mod)*state->wmods);
free(state->wtype->modifiers);
}
mods[state->wmods].value = value;
mods[state->wmods].flags = flags;
state->wtype->modifiers = mods;
++state->wmods;
}
} else {
return XML_USERERROR;
}
}
return XML_OK;
}
static xml_callbacks xml_resource = {
tagbegin, tagend, NULL
};
void
init_resources(void)
{
@ -2416,6 +2536,9 @@ init_items(void)
register_function((pf_generic)use_mistletoe, "usemistletoe");
register_function((pf_generic)give_horses, "givehorses");
/* xml reader */
xml_register(&xml_resource, "eressea resource", 0);
}
int
@ -2593,124 +2716,3 @@ xml_writeitems(const char * file)
fclose(stream);
return 0;
}
#include <xml.h>
typedef struct xml_state {
struct item_type * itype;
struct resource_type * rtype;
struct weapon_type * wtype;
int wmods;
} xml_state;
static int
tagend(struct xml_stack * stack, void * data)
{
unused(stack);
unused(data);
return XML_OK;
}
static int
tagbegin(struct xml_stack * stack, void * data)
{
xml_state * state = (xml_state*)data;
const xml_tag * tag = stack->tag;
if (strcmp(tag->name, "resource")==0) {
char *names[2], *appearance[2];
const char *tmp;
unsigned int flags = RTF_NONE;
if (xml_bvalue(tag, "pooled")) flags |= RTF_POOLED;
memset(state, 0, sizeof(xml_state));
tmp = xml_value(tag, "name");
assert(tmp || "resource needs a name");
names[0] = strdup(tmp);
names[1] = strcat(strcpy((char*)malloc(strlen(tmp)+3), tmp), "_p");
tmp = xml_value(tag, "appearance");
if (tmp!=NULL) {
appearance[0] = strdup(tmp);
appearance[1] = strcat(strcpy((char*)malloc(strlen(tmp)+3), tmp), "_p");
state->rtype = new_resourcetype((const char**)names, (const char**)appearance, flags);
free(appearance[0]);
free(appearance[1]);
} else {
state->rtype = new_resourcetype((const char**)names, NULL, flags);
}
free(names[0]);
free(names[1]);
} else if (strcmp(tag->name, "item")==0) {
unsigned int flags = ITF_NONE;
int weight = xml_ivalue(tag, "weight");
int capacity = xml_ivalue(tag, "capacity");
assert(state->itype==NULL);
if (xml_bvalue(tag, "cursed")) flags |= ITF_CURSED;
if (xml_bvalue(tag, "notlost")) flags |= ITF_NOTLOST;
if (xml_bvalue(tag, "big")) flags |= ITF_BIG;
if (xml_bvalue(tag, "animal")) flags |= ITF_ANIMAL;
state->rtype->flags |= RTF_ITEM;
state->itype = new_itemtype(state->rtype, flags, weight, capacity);
} else if (strcmp(tag->name, "weapon")==0) {
skill_t skill = sk_find(xml_value(tag, "skill"));
int minskill = xml_ivalue(tag, "minskill");
int offmod = xml_ivalue(tag, "offmod");
int defmod = xml_ivalue(tag, "defmod");
int reload = xml_ivalue(tag, "reload");
double magres = xml_fvalue(tag, "magres");
unsigned int flags = WTF_NONE;
assert(strcmp(stack->next->tag->name, "item")==0);
assert(state->itype!=NULL);
state->itype->flags |= ITF_WEAPON;
state->wtype = new_weapontype(state->itype,
flags, magres, NULL, offmod, defmod, reload, skill, minskill);
} else if (strcmp(tag->name, "damage")==0) {
/* damage of a weapon */
int pos = 0;
const char * type = xml_value(tag, "type");
assert(strcmp(stack->next->tag->name, "weapon")==0);
if (strcmp(type, "default")!=0) pos = 1;
if (state->wtype->damage[pos]) free(state->wtype->damage[pos]);
state->wtype->damage[pos] = strdup(xml_value(tag, "value"));
} else if (strcmp(tag->name, "modifier")==0) {
int value = xml_ivalue(tag, "value");
assert(strcmp(stack->next->tag->name, "weapon")==0);
if (value!=0) {
int flags = 0;
weapon_mod * mods = calloc(sizeof(weapon_mod), state->wmods+2);
assert(state->wtype);
if (xml_bvalue(tag, "walking")) flags|=WMF_WALKING;
if (xml_bvalue(tag, "riding")) flags|=WMF_RIDING;
if (xml_bvalue(tag, "against_walking")) flags|=WMF_AGAINST_WALKING;
if (xml_bvalue(tag, "against_riding")) flags|=WMF_AGAINST_RIDING;
if (xml_bvalue(tag, "offensive")) flags|=WMF_OFFENSIVE;
if (xml_bvalue(tag, "defensive")) flags|=WMF_DEFENSIVE;
if (xml_bvalue(tag, "damage")) flags|=WMF_DAMAGE;
if (xml_bvalue(tag, "skill")) flags|=WMF_SKILL;
if (xml_bvalue(tag, "missile_target")) flags|=WMF_MISSILE_TARGET;
if (state->wmods) {
memcpy(mods, state->wtype->modifiers, sizeof(weapon_mod)*state->wmods);
free(state->wtype->modifiers);
}
mods[state->wmods].value = value;
mods[state->wmods].flags = flags;
state->wtype->modifiers = mods;
++state->wmods;
}
} else {
return XML_USERERROR;
}
return XML_OK;
}
static xml_callbacks xml_resource = {
NULL, tagbegin, tagend, NULL
};
int
xml_readresource(FILE * F, struct xml_stack * stack)
{
xml_state state;
return xml_parse(F, &xml_resource, &state, stack);
}

View file

@ -138,10 +138,10 @@ typedef struct xml_state {
} xml_state;
static int
parse_plaintext(struct xml_stack *stack, const char *str, void *data)
parse_plaintext(struct xml_stack *stack, const char *str)
{
xml_state * state = (xml_state*)data;
if (stack) {
xml_state * state = (xml_state*)stack->state;
const xml_tag * tag = stack->tag;
if (strcmp(tag->name, "text")==0) {
const xml_tag * tagparent = stack->next->tag;
@ -156,160 +156,140 @@ parse_plaintext(struct xml_stack *stack, const char *str, void *data)
}
static int
parse_tagbegin(struct xml_stack *stack, void *data)
parse_tagbegin(struct xml_stack *stack)
{
xml_state * state = (xml_state*)data;
const xml_tag * tag = stack->tag;
if (strcmp(tag->name, "messages")==0) {
memset(state, 0, sizeof(xml_state));
if (strcmp(tag->name, "messages")==0 || strcmp(tag->name, "strings")==0) {
stack->state = calloc(sizeof(xml_state), 1);
return XML_OK;
} else if (strcmp(tag->name, "string")==0) {
const char * tname = xml_value(tag, "name");
if (tname) state->mtname = tname;
else {
state->mtname = NULL;
return XML_USERERROR;
}
} else if (strcasecmp(tag->name, "locale")==0) {
if (state->mtname!=NULL) {
const char * zName = xml_value(tag, "name");
if (zName) {
state->lang = find_locale(zName);
if (state->lang==NULL) state->lang = make_locale(zName);
} else {
xml_state * state = (xml_state*)stack->state;
if (strcasecmp(tag->name, "locale")==0) {
if (state->mtname!=NULL) {
const char * zName = xml_value(tag, "name");
if (zName) {
state->lang = find_locale(zName);
if (state->lang==NULL) state->lang = make_locale(zName);
}
}
} else if (strcmp(tag->name, "namespace")==0) {
const char * tname = xml_value(tag, "name");
if (tname) state->nspc = tname;
else state->nspc = NULL;
} else if (strcmp(tag->name, "string")==0) {
const char * tname = xml_value(tag, "name");
if (tname) state->mtname = tname;
else {
state->mtname = NULL;
return XML_USERERROR;
}
}
} else if (strcmp(tag->name, "namespace")==0) {
const char * tname = xml_value(tag, "name");
if (tname) state->nspc = tname;
else state->nspc = NULL;
} else if (strcmp(tag->name, "string")==0) {
const char * tname = xml_value(tag, "name");
if (tname) state->nspc = tname;
else state->nspc = NULL;
} else if (strcmp(tag->name, "message")==0) {
const char * tname = xml_value(tag, "name");
const char * tsection = xml_value(tag, "section");
const char * tlevel = xml_value(tag, "level");
state->argc = 0;
if (tname) state->mtname = tname;
else {
state->mtname = NULL;
return XML_USERERROR;
}
if (!tsection) {
/* by default, put into events */
tsection = "events";
}
state->nrsection = tsection;
mc_add(tsection);
if (tlevel) state->nrlevel = atoi(tlevel);
} else if (strcasecmp(tag->name, "text")==0) {
const char * zLocale = xml_value(tag, "locale");
if (zLocale) {
state->lang = find_locale(zLocale);
if (state->lang==NULL) {
state->lang = make_locale(zLocale);
} else if (strcmp(tag->name, "message")==0) {
const char * tname = xml_value(tag, "name");
const char * tsection = xml_value(tag, "section");
const char * tlevel = xml_value(tag, "level");
state->argc = 0;
if (tname) state->mtname = tname;
else {
state->mtname = NULL;
return XML_USERERROR;
}
}
} else if (strcasecmp(tag->name, "arg")==0) {
if (state->mtname!=NULL) {
const char * zName = xml_value(tag, "name");
const char * zType = xml_value(tag, "type");
if (zName && zType) {
char zBuffer[128];
sprintf(zBuffer, "%s:%s", zName, zType);
state->argv[state->argc++] = strdup(zBuffer);
if (!tsection) {
/* by default, put into events */
tsection = "events";
}
state->nrsection = tsection;
mc_add(tsection);
if (tlevel) state->nrlevel = atoi(tlevel);
} else if (strcasecmp(tag->name, "text")==0) {
const char * zLocale = xml_value(tag, "locale");
if (zLocale) {
state->lang = find_locale(zLocale);
if (state->lang==NULL) {
state->lang = make_locale(zLocale);
}
}
} else if (strcasecmp(tag->name, "arg")==0) {
if (state->mtname!=NULL) {
const char * zName = xml_value(tag, "name");
const char * zType = xml_value(tag, "type");
if (zName && zType) {
char zBuffer[128];
sprintf(zBuffer, "%s:%s", zName, zType);
state->argv[state->argc++] = strdup(zBuffer);
}
} else {
return XML_USERERROR;
}
} else if (strcasecmp(tag->name, "nr")==0) {
if (state->mtname!=NULL) {
const char * zSection = xml_value(tag, "section");
const char * zLevel = xml_value(tag, "level");
if (zSection) {
state->nrsection = zSection;
mc_add(zSection);
}
if (zLevel) state->nrlevel = atoi(zLevel);
}
} else {
return XML_USERERROR;
}
} else if (strcasecmp(tag->name, "nr")==0) {
if (state->mtname!=NULL) {
const char * zSection = xml_value(tag, "section");
const char * zLevel = xml_value(tag, "level");
if (zSection) {
state->nrsection = zSection;
mc_add(zSection);
}
if (zLevel) state->nrlevel = atoi(zLevel);
}
} else {
return XML_USERERROR;
}
return XML_OK;
}
static int
parse_tagend(struct xml_stack *stack, void *data)
parse_tagend(struct xml_stack *stack)
{
xml_state * state = (xml_state*)data;
const xml_tag * tag = stack->tag;
if (strcasecmp(tag->name, "type")==0) {
const struct message_type * mtype;
if (strcmp(tag->name, "messages")==0 || strcmp(tag->name, "strings")==0) {
free(stack->state);
} else {
xml_state * state = (xml_state*)stack->state;
if (strcasecmp(tag->name, "type")==0) {
const struct message_type * mtype;
state->argv[state->argc]=0;
state->argv[state->argc]=0;
/* add the messagetype */
mtype = mt_find(state->mtname);
if (!mtype) mtype = mt_register(mt_new(state->mtname, (const char**)state->argv));
while (state->argc--) {
free(state->argv[state->argc]);
}
if (state->nrtext) {
free(state->nrtext);
state->nrtext = 0;
}
state->mtype = mtype;
} else if (strcasecmp(tag->name, "locale")==0) {
state->lang = NULL;
} else if (strcasecmp(tag->name, "namespace")==0) {
state->nspc = NULL;
} else if (strcasecmp(tag->name, "text")==0) {
const xml_tag * tagparent = stack->next->tag;
if (strcmp(tagparent->name, "string")!=0) {
/* todo: bad test */
if (state->argc) {
nrt_register(state->mtype, state->lang, state->nrtext, state->nrlevel, state->nrsection);
crt_register(state->mtype);
/* add the messagetype */
mtype = mt_find(state->mtname);
if (!mtype) mtype = mt_register(mt_new(state->mtname, (const char**)state->argv));
while (state->argc--) {
free(state->argv[state->argc]);
}
else locale_setstring(state->lang, state->mtname, state->nrtext);
if (state->nrtext) {
free(state->nrtext);
state->nrtext = 0;
}
state->mtype = mtype;
} else if (strcasecmp(tag->name, "locale")==0) {
state->lang = NULL;
} else if (strcasecmp(tag->name, "namespace")==0) {
state->nspc = NULL;
} else if (strcasecmp(tag->name, "text")==0) {
const xml_tag * tagparent = stack->next->tag;
if (strcmp(tagparent->name, "string")!=0) {
/* todo: bad test */
if (state->argc) {
nrt_register(state->mtype, state->lang, state->nrtext, state->nrlevel, state->nrsection);
crt_register(state->mtype);
}
else locale_setstring(state->lang, state->mtname, state->nrtext);
}
} else if (strcasecmp(tag->name, "message")==0) {
state->nrsection = NULL;
}
} else if (strcasecmp(tag->name, "message")==0) {
state->nrsection = NULL;
}
return XML_OK;
}
static xml_callbacks msgcallback = {
parse_plaintext,
static xml_callbacks xml_messages = {
parse_tagbegin,
parse_tagend,
NULL
parse_plaintext
};
int
read_messages(FILE * F, struct xml_stack * stack)
{
xml_state state;
memset(&state, 0, sizeof(state));
return xml_parse(F, &msgcallback, &state, stack);
}
int
load_messages(const char * filename)
{
FILE * F = fopen(filename, "rt+");
if (F) {
int i = read_messages(F, NULL);
fclose(F);
return i;
}
return -1;
}
static void
arg_set(void * args[], const message_type * mtype, const char * buffer, void * v)
{
@ -693,3 +673,10 @@ read_msglevels(struct warning ** w, FILE * F)
fscanf(F, "%s", buf);
}
}
void
init_messages(void)
{
xml_register(&xml_messages, "eressea messages", 0);
xml_register(&xml_messages, "eressea strings", 0);
}

View file

@ -56,6 +56,7 @@ extern struct message * add_message(struct message_list** pm, struct message * m
extern void free_messages(struct message_list * m);
extern int load_messages(const char *);
extern int read_messages(FILE * F, struct xml_stack * stack);
extern void init_messages(void);
/* message sections */
extern struct messageclass * msgclasses;

View file

@ -517,37 +517,34 @@ const char *
drachen_name(const unit *u)
{
static char name[NAMESIZE + 1];
region *r = u->region;
int anzahl = u->number;
char *t;
int rnd = rand() % DTITEL;
const char *t = dtitel[0][rnd];
int anzahl = 1;
switch (rterrain(r)) {
case T_PLAIN:
t = strdup(dtitel[1][rand() % DTITEL]);
break;
case T_MOUNTAIN:
t = strdup(dtitel[2][rand() % DTITEL]);
break;
case T_DESERT:
t = strdup(dtitel[3][rand() % DTITEL]);
break;
case T_SWAMP:
t = strdup(dtitel[4][rand() % DTITEL]);
break;
case T_GLACIER:
t = strdup(dtitel[5][rand() % DTITEL]);
break;
default:
t = strdup(dtitel[0][rand() % DTITEL]);
if (u) {
region *r = u->region;
anzahl = u->number;
switch (rterrain(r)) {
case T_PLAIN:
t = dtitel[1][rnd];
break;
case T_MOUNTAIN:
t = dtitel[2][rnd];
break;
case T_DESERT:
t = dtitel[3][rnd];
break;
case T_SWAMP:
t = dtitel[4][rnd];
break;
case T_GLACIER:
t = dtitel[5][rnd];
break;
}
}
if (anzahl > 1) {
t[0] = (char) toupper(t[0]);
t[1] = 'i'; /* in jedem Fall "Die" */
t[2] = 'e';
strcpy(name, t);
strcat(name, "n von ");
strcat(name, rname(r, NULL));
sprintf(name, "Die %sn von %s", t+4, rname(u->region, NULL));
} else {
char *n = malloc(32*sizeof(char));
@ -555,24 +552,20 @@ drachen_name(const unit *u)
strcat(n, silbe2[rand() % SIL2]);
strcat(n, silbe3[rand() % SIL3]);
if (rand() % 5 > 2) {
strcpy(name, n); /* "Name, der Titel" */
strcat(name, ", ");
strcat(name, t);
sprintf(name, "%s, %s", n, t); /* "Name, der Titel" */
} else {
t[0] = (char) toupper(t[0]);
strcpy(name, t); /* "Der Titel Name" */
name[0] = (char) toupper(name[0]);
strcat(name, " ");
strcat(name, n);
}
if (rand() % 6 > 3) {
if (u && (rand() % 3 == 0)) {
strcat(name, " von ");
strcat(name, rname(r, NULL));
strcat(name, rname(u->region, NULL));
}
}
free(t);
return (name);
return name;
}
/* Dracoide */
@ -716,7 +709,7 @@ name_unit(unit *u)
{
char name[16];
if(u->race->generate_name){
if (u->race->generate_name) {
set_string(&u->name, (u->race->generate_name(u)));
} else {
sprintf(name, "Nummer %s", itoa36(u->no));

View file

@ -31,7 +31,7 @@
#define PFL_NOMAGIC 128 /* Zaubern ist unmöglich */
#define PFL_NOSTEALTH 256 /* Tarnung außer Betrieb */
#define PFL_NOTEACH 512 /* Lehre außer Betrieb */
#define PFL_NOBUILD 1024 /* Lehre außer Betrieb */
#define PFL_NOBUILD 1024 /* Bauen außer Betrieb */
#define PFL_NOFEED 2048 /* Kein Unterhalt nötig TODO */
#define PFL_FRIENDLY 4096 /* everyone is your ally */
#define PFL_NOORCGROWTH 8192 /* orcs don't grow */

View file

@ -606,168 +606,181 @@ typedef struct xml_state {
} xml_state;
static int
tagbegin(struct xml_stack * stack, void * data)
tagbegin(struct xml_stack * stack)
{
xml_state * state = (xml_state*)data;
const xml_tag * tag = stack->tag;
if (strcmp(tag->name, "races")==0) {
memset(state, 0, sizeof(xml_state));
} else if (strcmp(tag->name, "race")==0) {
const char * zName = xml_value(tag, "name");
race * rc;
state->nextattack = 0;
state->nextfamiliar = 0;
stack->state = calloc(sizeof(xml_state), 1);
} else {
xml_state * state = (xml_state*)stack->state;
if (strcmp(tag->name, "race")==0) {
const char * zName = xml_value(tag, "name");
race * rc;
state->nextattack = 0;
state->nextfamiliar = 0;
if (zName) {
rc = rc_find(zName);
if (rc==NULL) {
rc = rc_add(rc_new(zName));
if (zName) {
rc = rc_find(zName);
if (rc==NULL) {
rc = rc_add(rc_new(zName));
}
} else {
log_error(("missing required tag 'name'\n"));
return XML_USERERROR;
}
} else {
log_error(("missing required tag 'name'\n"));
return XML_USERERROR;
}
rc->magres = xml_fvalue(tag, "magres");
rc->maxaura = xml_fvalue(tag, "maxaura");
rc->regaura = xml_fvalue(tag, "regaura");
rc->recruitcost = xml_ivalue(tag, "recruitcost");
rc->maintenance = xml_ivalue(tag, "maintenance");
rc->weight = xml_ivalue(tag, "weight");
rc->speed = xml_fvalue(tag, "speed");
rc->hitpoints = xml_ivalue(tag, "hp");
rc->def_damage = strdup(xml_value(tag, "damage"));
rc->armor = (char)xml_ivalue(tag, "ac");
rc->magres = xml_fvalue(tag, "magres");
rc->maxaura = xml_fvalue(tag, "maxaura");
rc->regaura = xml_fvalue(tag, "regaura");
rc->recruitcost = xml_ivalue(tag, "recruitcost");
rc->maintenance = xml_ivalue(tag, "maintenance");
rc->weight = xml_ivalue(tag, "weight");
rc->speed = xml_fvalue(tag, "speed");
rc->hitpoints = xml_ivalue(tag, "hp");
rc->def_damage = strdup(xml_value(tag, "damage"));
rc->armor = (char)xml_ivalue(tag, "ac");
rc->at_default = (char)xml_ivalue(tag, "unarmedattack");
rc->df_default = (char)xml_ivalue(tag, "unarmeddefense");
rc->at_bonus = (char)xml_ivalue(tag, "attackmodifier");
rc->df_bonus = (char)xml_ivalue(tag, "defensemodifier");
rc->at_default = (char)xml_ivalue(tag, "unarmedattack");
rc->df_default = (char)xml_ivalue(tag, "unarmeddefense");
rc->at_bonus = (char)xml_ivalue(tag, "attackmodifier");
rc->df_bonus = (char)xml_ivalue(tag, "defensemodifier");
if (xml_bvalue(tag, "playerrace")) rc->flags |= RCF_PLAYERRACE;
if (xml_bvalue(tag, "scarepeasants")) rc->flags |= RCF_SCAREPEASANTS;
if (xml_bvalue(tag, "cannotmove")) rc->flags |= RCF_CANNOTMOVE;
if (xml_bvalue(tag, "fly")) rc->flags |= RCF_FLY;
if (xml_bvalue(tag, "swim")) rc->flags |= RCF_SWIM;
if (xml_bvalue(tag, "walk")) rc->flags |= RCF_WALK;
if (xml_bvalue(tag, "nolearn")) rc->flags |= RCF_NOLEARN;
if (xml_bvalue(tag, "noteach")) rc->flags |= RCF_NOTEACH;
if (xml_bvalue(tag, "horse")) rc->flags |= RCF_HORSE;
if (xml_bvalue(tag, "desert")) rc->flags |= RCF_DESERT;
if (xml_bvalue(tag, "absorbpeasants")) rc->flags |= RCF_ABSORBPEASANTS;
if (xml_bvalue(tag, "noheal")) rc->flags |= RCF_NOHEAL;
if (xml_bvalue(tag, "noweapons")) rc->flags |= RCF_NOWEAPONS;
if (xml_bvalue(tag, "shapeshift")) rc->flags |= RCF_SHAPESHIFT;
if (xml_bvalue(tag, "shapeshiftany")) rc->flags |= RCF_SHAPESHIFTANY;
if (xml_bvalue(tag, "illusionary")) rc->flags |= RCF_ILLUSIONARY;
if (xml_bvalue(tag, "undead")) rc->flags |= RCF_UNDEAD;
if (xml_bvalue(tag, "playerrace")) rc->flags |= RCF_PLAYERRACE;
if (xml_bvalue(tag, "scarepeasants")) rc->flags |= RCF_SCAREPEASANTS;
if (xml_bvalue(tag, "cannotmove")) rc->flags |= RCF_CANNOTMOVE;
if (xml_bvalue(tag, "fly")) rc->flags |= RCF_FLY;
if (xml_bvalue(tag, "swim")) rc->flags |= RCF_SWIM;
if (xml_bvalue(tag, "walk")) rc->flags |= RCF_WALK;
if (xml_bvalue(tag, "nolearn")) rc->flags |= RCF_NOLEARN;
if (xml_bvalue(tag, "noteach")) rc->flags |= RCF_NOTEACH;
if (xml_bvalue(tag, "horse")) rc->flags |= RCF_HORSE;
if (xml_bvalue(tag, "desert")) rc->flags |= RCF_DESERT;
if (xml_bvalue(tag, "absorbpeasants")) rc->flags |= RCF_ABSORBPEASANTS;
if (xml_bvalue(tag, "noheal")) rc->flags |= RCF_NOHEAL;
if (xml_bvalue(tag, "noweapons")) rc->flags |= RCF_NOWEAPONS;
if (xml_bvalue(tag, "shapeshift")) rc->flags |= RCF_SHAPESHIFT;
if (xml_bvalue(tag, "shapeshiftany")) rc->flags |= RCF_SHAPESHIFTANY;
if (xml_bvalue(tag, "illusionary")) rc->flags |= RCF_ILLUSIONARY;
if (xml_bvalue(tag, "undead")) rc->flags |= RCF_UNDEAD;
if (xml_bvalue(tag, "nogive")) rc->ec_flags |= NOGIVE;
if (xml_bvalue(tag, "giveitem")) rc->ec_flags |= GIVEITEM;
if (xml_bvalue(tag, "giveperson")) rc->ec_flags |= GIVEPERSON;
if (xml_bvalue(tag, "giveunit")) rc->ec_flags |= GIVEUNIT;
if (xml_bvalue(tag, "getitem")) rc->ec_flags |= GETITEM;
if (xml_bvalue(tag, "canguard")) rc->ec_flags |= CANGUARD;
if (xml_bvalue(tag, "recruithorses")) rc->ec_flags |= ECF_REC_HORSES;
if (xml_bvalue(tag, "recruitethereal")) rc->ec_flags |= ECF_REC_ETHEREAL;
if (xml_bvalue(tag, "recruitunlimited")) rc->ec_flags |= ECF_REC_UNLIMITED;
if (xml_bvalue(tag, "nogive")) rc->ec_flags |= NOGIVE;
if (xml_bvalue(tag, "giveitem")) rc->ec_flags |= GIVEITEM;
if (xml_bvalue(tag, "giveperson")) rc->ec_flags |= GIVEPERSON;
if (xml_bvalue(tag, "giveunit")) rc->ec_flags |= GIVEUNIT;
if (xml_bvalue(tag, "getitem")) rc->ec_flags |= GETITEM;
if (xml_bvalue(tag, "canguard")) rc->ec_flags |= CANGUARD;
if (xml_bvalue(tag, "recruithorses")) rc->ec_flags |= ECF_REC_HORSES;
if (xml_bvalue(tag, "recruitethereal")) rc->ec_flags |= ECF_REC_ETHEREAL;
if (xml_bvalue(tag, "recruitunlimited")) rc->ec_flags |= ECF_REC_UNLIMITED;
if (xml_bvalue(tag, "equipment")) rc->battle_flags |= BF_EQUIPMENT;
if (xml_bvalue(tag, "noblock")) rc->battle_flags |= BF_NOBLOCK;
if (xml_bvalue(tag, "invinciblenonmagic")) rc->battle_flags |= BF_INV_NONMAGIC;
if (xml_bvalue(tag, "resistbash")) rc->battle_flags |= BF_RES_BASH;
if (xml_bvalue(tag, "resistcut")) rc->battle_flags |= BF_RES_CUT;
if (xml_bvalue(tag, "resistpierce")) rc->battle_flags |= BF_RES_PIERCE;
if (xml_bvalue(tag, "equipment")) rc->battle_flags |= BF_EQUIPMENT;
if (xml_bvalue(tag, "noblock")) rc->battle_flags |= BF_NOBLOCK;
if (xml_bvalue(tag, "invinciblenonmagic")) rc->battle_flags |= BF_INV_NONMAGIC;
if (xml_bvalue(tag, "resistbash")) rc->battle_flags |= BF_RES_BASH;
if (xml_bvalue(tag, "resistcut")) rc->battle_flags |= BF_RES_CUT;
if (xml_bvalue(tag, "resistpierce")) rc->battle_flags |= BF_RES_PIERCE;
state->race = rc;
} else if (strcmp(tag->name, "ai")==0) {
race * rc = state->race;
rc->splitsize = xml_ivalue(tag, "splitsize");
state->race = rc;
} else if (strcmp(tag->name, "ai")==0) {
race * rc = state->race;
rc->splitsize = xml_ivalue(tag, "splitsize");
if (xml_bvalue(tag, "killpeasants")) rc->flags |= RCF_KILLPEASANTS;
if (xml_bvalue(tag, "attackrandom")) rc->flags |= RCF_ATTACKRANDOM;
if (xml_bvalue(tag, "moverandom")) rc->flags |= RCF_MOVERANDOM;
if (xml_bvalue(tag, "learn")) rc->flags |= RCF_LEARN;
if (xml_bvalue(tag, "killpeasants")) rc->flags |= RCF_KILLPEASANTS;
if (xml_bvalue(tag, "attackrandom")) rc->flags |= RCF_ATTACKRANDOM;
if (xml_bvalue(tag, "moverandom")) rc->flags |= RCF_MOVERANDOM;
if (xml_bvalue(tag, "learn")) rc->flags |= RCF_LEARN;
} else if (strcmp(tag->name, "skill")==0) {
race * rc = state->race;
const char * name = xml_value(tag, "name");
if (name) {
int mod = xml_ivalue(tag, "modifier");
if (mod!=0) {
skill_t sk = sk_find(name);
if (sk!=NOSKILL) {
rc->bonus[sk] = (char)mod;
} else if (strcmp(tag->name, "skill")==0) {
race * rc = state->race;
const char * name = xml_value(tag, "name");
if (name) {
int mod = xml_ivalue(tag, "modifier");
if (mod!=0) {
skill_t sk = sk_find(name);
if (sk!=NOSKILL) {
rc->bonus[sk] = (char)mod;
} else {
log_error(("unknown skill '%s'\n", name));
}
}
} else {
log_error(("missing required tag 'name'\n"));
return XML_USERERROR;
}
} else if (strcmp(tag->name, "attack")==0) {
race * rc = state->race;
const char * damage = xml_value(tag, "damage");
struct att * a = &rc->attack[state->nextattack++];
if (damage) {
a->data.dice = strdup(damage);
} else {
a->data.iparam = xml_ivalue(tag, "spell");
}
a->type = xml_ivalue(tag, "type");
a->flags = xml_ivalue(tag, "flags");
} else if (strcmp(tag->name, "function")==0) {
race * rc = state->race;
const char * name = xml_value(tag, "name");
const char * value = xml_value(tag, "value");
if (name && value) {
pf_generic fun = get_function(value);
if (fun==NULL) {
log_error(("unknown function value '%s=%s' for race %s\n", name, value, rc->_name[0]));
} else {
log_error(("unknown skill '%s'\n", name));
if (strcmp(name, "name")==0) {
rc->generate_name = (const char* (*)(const struct unit*))fun;
} else if (strcmp(name, "age")==0) {
rc->age = (void(*)(struct unit*))fun;
} else if (strcmp(name, "move")==0) {
rc->move_allowed = (boolean(*)(const struct region *, const struct region *))fun;
} else if (strcmp(name, "itemdrop")==0) {
rc->itemdrop = (struct item *(*)(const struct race *, int))fun;
} else if (strcmp(name, "initfamiliar")==0) {
rc->init_familiar = (void(*)(struct unit *))fun;
} else {
log_error(("unknown function type '%s=%s' for race %s\n", name, value, rc->_name[0]));
}
}
}
} else {
log_error(("missing required tag 'name'\n"));
return XML_USERERROR;
}
} else if (strcmp(tag->name, "attack")==0) {
race * rc = state->race;
const char * damage = xml_value(tag, "damage");
struct att * a = &rc->attack[state->nextattack++];
if (damage) {
a->data.dice = strdup(damage);
} else {
a->data.iparam = xml_ivalue(tag, "spell");
}
a->type = xml_ivalue(tag, "type");
a->flags = xml_ivalue(tag, "flags");
} else if (strcmp(tag->name, "function")==0) {
race * rc = state->race;
const char * name = xml_value(tag, "name");
const char * value = xml_value(tag, "value");
if (name && value) {
pf_generic fun = get_function(value);
if (fun==NULL) {
log_error(("unknown function value '%s=%s' for race %s\n", name, value, rc->_name[0]));
} else {
if (strcmp(name, "name")==0) {
rc->generate_name = (const char* (*)(const struct unit*))fun;
} else if (strcmp(name, "age")==0) {
rc->age = (void(*)(struct unit*))fun;
} else if (strcmp(name, "move")==0) {
rc->move_allowed = (boolean(*)(const struct region *, const struct region *))fun;
} else if (strcmp(name, "itemdrop")==0) {
rc->itemdrop = (struct item *(*)(const struct race *, int))fun;
} else if (strcmp(name, "initfamiliar")==0) {
rc->init_familiar = (void(*)(struct unit *))fun;
} else {
log_error(("unknown function type '%s=%s' for race %s\n", name, value, rc->_name[0]));
} else if (strcmp(tag->name, "familiar")==0) {
race * rc = state->race;
const char * zRace = xml_value(tag, "race");
if (zRace && rc) {
race * frc = rc_find(zRace);
if (frc == NULL) {
frc = rc_add(rc_new(zRace));
}
if (xml_bvalue(tag, "default")) {
rc->familiars[0] = frc;
} else {
rc->familiars[++state->nextfamiliar] = frc;
}
}
}
} else if (strcmp(tag->name, "familiar")==0) {
race * rc = state->race;
const char * zRace = xml_value(tag, "race");
if (zRace && rc) {
race * frc = rc_find(zRace);
if (frc == NULL) {
frc = rc_add(rc_new(zRace));
}
if (xml_bvalue(tag, "default")) {
rc->familiars[0] = frc;
} else {
rc->familiars[++state->nextfamiliar] = frc;
log_error(("missing required tag 'race'\n"));
return XML_USERERROR;
}
} else {
log_error(("missing required tag 'race'\n"));
return XML_USERERROR;
}
}
return XML_OK;
}
static int
tagend(struct xml_stack * stack, void * data)
tagend(struct xml_stack * stack)
{
xml_state * state = (xml_state*)data;
const xml_tag * tag = stack->tag;
if (strcmp(tag->name, "race")==0) {
if (strcmp(tag->name, "races")==0) {
int i;
for (i=0;i!=MAXRACES;++i) {
race * rc = rc_find(oldracenames[i]);
if (rc) {
new_race[i] = rc;
if (rc == new_race[RC_TROLL]) {
a_add(&rc->attribs, make_skillmod(NOSKILL, SMF_RIDING, NULL, 0.0, -1));
}
}
}
} else if (strcmp(tag->name, "race")==0) {
xml_state * state = (xml_state*)stack->state;
state->race = NULL;
state->nextfamiliar = 0;
state->nextattack = 0;
@ -776,27 +789,9 @@ tagend(struct xml_stack * stack, void * data)
}
static xml_callbacks xml_races = {
NULL, tagbegin, tagend, NULL
tagbegin, tagend, NULL
};
int
read_races(FILE * F, struct xml_stack * stack)
{
xml_state state;
int i, err = xml_parse(F, &xml_races, &state, stack);
for (i=0;i!=MAXRACES;++i) {
race * rc = rc_find(oldracenames[i]);
if (rc) {
new_race[i] = rc;
if (rc == new_race[RC_TROLL]) {
a_add(&rc->attribs, make_skillmod(NOSKILL, SMF_RIDING, NULL, 0.0, -1));
}
}
}
return err;
}
void
init_races(void)
{
@ -831,4 +826,6 @@ init_races(void)
/* itemdrop functions */
register_function((pf_generic)dragon_drops, "dragondrops");
sprintf(zBuffer, "%s/races.xml", resourcepath());
xml_register(&xml_races, "eressea races", 0);
}

View file

@ -158,6 +158,4 @@ extern const struct race_syn race_synonyms[];
extern void write_race_reference(const struct race * rc, FILE * F);
extern void read_race_reference(const struct race ** rp, FILE * F);
extern int read_races(FILE * F, struct xml_stack * stack);
#endif

View file

@ -199,8 +199,8 @@ use_wand_of_tears(unit * user, const struct item_type * itype, const char * cmd)
static void
init_wand_of_tears(void)
{
const char * names[2] = {"wand_of_tears", "wands_of_tears"};
const char * appearances[2] = {"wand", "wands"};
const char * names[2] = {"wand_of_tears", "wand_of_tears_p"};
const char * appearances[2] = {"wand", "wand_p"};
item_type * itype = it_find(names[0]);
int i;

View file

@ -0,0 +1,134 @@
/* vi: set ts=2:
+-------------------+ Christian Schlittchen <corwin@amber.kn-bremen.de>
| | Enno Rehling <enno@eressea-pbem.de>
| Eressea PBEM host | Katja Zedel <katze@felidae.kn-bremen.de>
| (c) 1998 - 2001 | Henning Peters <faroul@beyond.kn-bremen.de>
| | Ingo Wilken <Ingo.Wilken@informatik.uni-oldenburg.de>
+-------------------+ Stefan Reich <reich@halbling.de>
This program may not be used, modified or distributed
without prior permission by the authors of Eressea.
*/
#include <config.h>
#include <eressea.h>
#include "dungeon.h"
#include "gmcmd.h"
#include <triggers/gate.h>
#include <triggers/unguard.h>
/* kernel includes */
#include <plane.h>
#include <race.h>
#include <region.h>
#include <building.h>
/* util includes */
#include <event.h>
typedef struct treasure {
const struct item_type * itype;
int amount;
struct treasure * next;
} treasure;
typedef struct monster {
const struct race * race;
double chance;
int maxunits;
int avgsize;
struct treasure * treasures;
struct monster * next;
struct itemtype_list * weapons;
} monster;
typedef struct dungeon {
int level;
int radius;
int size;
double connect;
struct monster * boss;
struct monster * monsters;
} dungeon;
static dungeon * dungeonstyles;
void
make_dungeon(int radius, int level, plane **pp, region **rp)
{
int nb[2][3][2] = {
{ { -1, 0 }, { 0, 1 }, { 1, -1 } },
{ { 1, 0 }, { -1, 1 }, { 0, -1 } }
};
const struct race * bossrace = rc_find("wyrm");
char name[128];
int size = level*level;
double connect = 0.50;
unsigned int flags = PFL_NORECRUITS;
int n = 0;
plane * p;
region *r, *center;
region * rnext;
sprintf(name, "Die Höhlen von %s", bossrace->generate_name(NULL));
p = gm_addplane(radius, flags, name);
center = findregion(p->minx+(p->maxx-p->minx)/2, p->miny+(p->maxy-p->miny)/2);
assert(center);
terraform(center, T_HELL);
rnext = r = center;
while (size>0) {
int d, o = rand() % 3;
for (d=0;d!=3;++d) {
int index = (d+o) % 3;
region * rn = findregion(r->x+nb[n][index][0], r->y+nb[n][index][1]);
assert(r->terrain==T_HELL);
if (rn) {
switch (rn->terrain) {
case T_OCEAN:
if (rand() % 100 < connect*100) {
terraform(rn, T_HELL);
--size;
rnext = rn;
}
else terraform(rn, T_FIREWALL);
break;
case T_HELL:
rnext = rn;
break;
}
if (size == 0) break;
}
rn = findregion(r->x+nb[(n+1)%2][index][0], r->y+nb[(n+1)%2][index][1]);
if (rn && rn->terrain==T_OCEAN) terraform(rn, T_FIREWALL);
}
if (size==0) break;
assert(r!=rnext);
r = rnext;
n = (n+1) % 2;
}
if (pp) *pp=p;
if (rp) *rp=center;
}
void
make_dungeongate(region * source, region * target, int level)
{
building *bsource, *btarget;
bsource = new_building(bt_find("castle"), source, default_locale);
set_string(&bsource->name, "Pforte zur Hölle");
bsource->size = 50;
add_trigger(&bsource->attribs, "timer", trigger_gate(bsource, target));
add_trigger(&bsource->attribs, "create", trigger_unguard(bsource));
fset(bsource, BLD_UNGUARDED);
btarget = new_building(bt_find("castle"), target, default_locale);
set_string(&btarget->name, "Pforte zur Außenwelt");
btarget->size = 50;
add_trigger(&btarget->attribs, "timer", trigger_gate(btarget, source));
add_trigger(&btarget->attribs, "create", trigger_unguard(btarget));
fset(btarget, BLD_UNGUARDED);
}

View file

@ -0,0 +1,18 @@
/* vi: set ts=2:
+-------------------+ Christian Schlittchen <corwin@amber.kn-bremen.de>
| | Enno Rehling <enno@eressea-pbem.de>
| Eressea PBEM host | Katja Zedel <katze@felidae.kn-bremen.de>
| (c) 1998 - 2001 | Henning Peters <faroul@beyond.kn-bremen.de>
| | Ingo Wilken <Ingo.Wilken@informatik.uni-oldenburg.de>
+-------------------+ Stefan Reich <reich@halbling.de>
This program may not be used, modified or distributed
without prior permission by the authors of Eressea.
*/
struct region;
struct plane;
struct building;
extern void make_dungeon(int radius, int level, struct plane **, struct region **);
extern void make_dungeongate(struct region * source, struct region * target, int level);

View file

@ -17,7 +17,6 @@
/* util includes */
#include "attrib.h"
#include "resolve.h"
/* libc includes */
#include <assert.h>

View file

@ -22,15 +22,25 @@
#include <string.h>
#include <ctype.h>
typedef struct xml_hierarchy {
const char * name;
unsigned int flags;
struct xml_callbacks * functions;
struct xml_hierarchy * next;
struct xml_hierarchy * children;
struct xml_hierarchy * parent;
} xml_hierarchy;
static int
__cberror(struct xml_stack * stack, const char* parsed, unsigned int line, int error, void *data)
__cberror(struct xml_stack * stack, const char* parsed, unsigned int line, int error)
{
struct xml_stack * s = stack;
unused(data);
log_printf("Error #%d in line %u while parsing \"%s\"\nXML stacktrace:\n", error, line, parsed);
log_error(("Error #%d in line %u while parsing \"%s\"\n", error, line, parsed));
log_printf("XML stacktrace:\n");
while (s) {
log_printf("\t%s\n", s->tag->name);
if (s->tag && s->tag->name) log_printf("\t%s\n", s->tag->name);
else log_printf("\t<unknown>\n");
s = s->next;
}
return error;
@ -45,12 +55,16 @@ make_tag(const char * name)
}
static void
push_tag(xml_stack ** ostack, xml_tag * tag, FILE * stream)
push_tag(xml_stack ** ostack, xml_tag * tag)
{
xml_stack * stack = calloc(sizeof(xml_stack), 1);
stack->next = *ostack;
stack->stream = stream;
stack->tag = tag;
if (*ostack) {
stack->stream = (*ostack)->stream;
stack->callbacks = (*ostack)->callbacks;
stack->state = (*ostack)->state;
}
*ostack = stack;
}
@ -93,9 +107,60 @@ pop_tag(xml_stack ** ostack)
return tag;
}
int
xml_parse(FILE * stream, struct xml_callbacks * cb, void * data, xml_stack * stack)
static xml_hierarchy * callbacks;
void
xml_register(struct xml_callbacks * cb, const char * path, unsigned int flags)
{
xml_hierarchy ** node=&callbacks;
xml_hierarchy * parent = NULL;
size_t len = strlen(path);
for (;;) {
const char * nextspace = path;
while (*nextspace && !isspace(*nextspace)) ++nextspace;
if (*nextspace == '\0') {
/* advance to the last child: */
while (*node && strcmp((*node)->name, path)!=0) node=&(*node)->next;
if (*node == NULL) {
*node = calloc(sizeof(xml_hierarchy), 1);
(*node)->name = strdup(path);
(*node)->parent = parent;
}
(*node)->flags = flags;
(*node)->functions = cb;
break;
} else {
size_t lpath = nextspace-path;
if (*node == NULL) {
/* adding path into graph */
*node = calloc(sizeof(xml_hierarchy), 1);
(*node)->name = strncpy(calloc(sizeof(char), 1+lpath), path, lpath);
(*node)->parent = parent;
(*node)->functions = NULL;
path = nextspace+1;
while (isspace(*path)) ++path;
assert(*path || !"trailing blanks in path");
parent = *node;
node=&parent->children;
} else if (strlen((*node)->name)==lpath && strncmp((*node)->name, path, lpath)==0) {
path = nextspace+1;
while (isspace(*path)) ++path;
assert(*path || !"trailing blanks in path");
parent = *node;
node=&parent->children;
} else {
node=&(*node)->next;
break;
}
}
}
}
static int
xml_parse(xml_stack * stack)
{
FILE * stream = stack->stream;
xml_stack * start = stack;
enum { TAG, ENDTAG, ATNAME, ATVALUE, PLAIN } state = PLAIN;
boolean startline = true;
@ -105,12 +170,7 @@ xml_parse(FILE * stream, struct xml_callbacks * cb, void * data, xml_stack * sta
unsigned int line = 0;
xml_tag * tag = NULL;
xml_attrib * attrib = NULL;
int (*cb_error)(struct xml_stack*, const char*, unsigned int, int, void*) = __cberror;
if (cb && cb->error) cb_error = cb->error;
if (stack && cb->tagbegin) {
cb->tagbegin(stack, data);
}
int (*cb_error)(struct xml_stack*, const char*, unsigned int, int) = __cberror;
for (;;) {
int reparse;
@ -119,12 +179,15 @@ xml_parse(FILE * stream, struct xml_callbacks * cb, void * data, xml_stack * sta
++line;
} else if (c==EOF) {
if (state==PLAIN) {
const xml_hierarchy * cb = stack->callbacks;
*pos='\0';
if (cb && cb->plaintext && pos!=tokbuffer) cb->plaintext(stack, tokbuffer, data);
if (cb && cb->functions->plaintext && pos!=tokbuffer) {
cb->functions->plaintext(stack, tokbuffer);
}
break;
} else {
*pos='\0';
return cb_error(stack, tokbuffer, line, XML_BROKENSTREAM, data);
return cb_error(stack, tokbuffer, line, XML_BROKENSTREAM);
}
}
do {
@ -134,14 +197,14 @@ xml_parse(FILE * stream, struct xml_callbacks * cb, void * data, xml_stack * sta
switch (c) {
case '<':
*pos='\0';
return cb_error(stack, tokbuffer, line, XML_INVALIDCHAR, data);
return cb_error(stack, tokbuffer, line, XML_INVALIDCHAR);
case '"':
quoted = !quoted;
break;
case '>':
if (quoted) {
*pos='\0';
return cb_error(stack, tokbuffer, line, XML_INVALIDCHAR, data);
return cb_error(stack, tokbuffer, line, XML_INVALIDCHAR);
}
state = TAG;
/* intentional fallthrough */
@ -172,7 +235,7 @@ xml_parse(FILE * stream, struct xml_callbacks * cb, void * data, xml_stack * sta
case '"':
case '/':
*pos='\0';
return cb_error(stack, tokbuffer, line, XML_INVALIDCHAR, data);
return cb_error(stack, tokbuffer, line, XML_INVALIDCHAR);
default:
if (isspace(c) || c == '>') {
*pos++='\0';
@ -189,9 +252,12 @@ xml_parse(FILE * stream, struct xml_callbacks * cb, void * data, xml_stack * sta
case PLAIN:
switch (c) {
case '<':
if (cb && cb->plaintext && pos!=tokbuffer) {
*pos = '\0';
cb->plaintext(stack, tokbuffer, data);
if (pos!=tokbuffer) {
const xml_hierarchy * cb = stack->callbacks;
if (cb && cb->functions->plaintext) {
*pos = '\0';
cb->functions->plaintext(stack, tokbuffer);
}
}
state = TAG;
tag = NULL;
@ -199,7 +265,7 @@ xml_parse(FILE * stream, struct xml_callbacks * cb, void * data, xml_stack * sta
break;
case '>':
*pos='\0';
return cb_error(stack, tokbuffer, line, XML_INVALIDCHAR, data);
return cb_error(stack, tokbuffer, line, XML_INVALIDCHAR);
case '\n':
/* ignore */
if (!startline) *pos++ = ' ';
@ -222,15 +288,27 @@ xml_parse(FILE * stream, struct xml_callbacks * cb, void * data, xml_stack * sta
if (pos==tokbuffer) state = ENDTAG;
else {
*pos='\0';
return cb_error(stack, tokbuffer, line, XML_INVALIDCHAR, data);
return cb_error(stack, tokbuffer, line, XML_INVALIDCHAR);
}
break;
case '>':
if (tag==NULL) {
*pos='\0';
push_tag(&stack, make_tag(tokbuffer), stream);
push_tag(&stack, tag = make_tag(tokbuffer));
}
{
const xml_hierarchy * cnext = stack->callbacks?stack->callbacks->children:callbacks;
while (cnext && strcmp(cnext->name, tag->name)!=0) cnext=cnext->next;
if (cnext==NULL) {
/* unknown tag. assume same handler again: */
cnext = stack->callbacks;
} else if ((cnext->flags & XML_CB_IGNORE) == 0) {
stack->callbacks = cnext;
}
if (cnext->functions->tagbegin) {
cnext->functions->tagbegin(stack);
}
}
if (cb && cb->tagbegin) cb->tagbegin(stack, data);
state = PLAIN;
startline = true;
pos = tokbuffer;
@ -239,7 +317,7 @@ xml_parse(FILE * stream, struct xml_callbacks * cb, void * data, xml_stack * sta
if (isspace(c)) {
if (tag==NULL) {
*pos='\0';
push_tag(&stack, tag = make_tag(tokbuffer), stream);
push_tag(&stack, tag = make_tag(tokbuffer));
state = ATNAME;
pos = tokbuffer;
}
@ -257,13 +335,34 @@ xml_parse(FILE * stream, struct xml_callbacks * cb, void * data, xml_stack * sta
switch (c) {
case '>':
*pos = '\0';
while (stack && strcmp(stack->tag->name, tokbuffer)!=0) free_tag(pop_tag(&stack));
if (stack==NULL) return cb_error(stack, tokbuffer, line, XML_NESTINGERROR, data);
if (cb && cb->tagend) cb->tagend(stack, data);
/* might be an unknown tag: */
if (stack->callbacks) {
/* && strcmp(stack->callbacks->name, stack->tag->name)==0 */
const xml_hierarchy * cb = stack->callbacks;
if (strcmp(stack->tag->name, tokbuffer)!=0) {
xml_stack * top = stack;
cb_error(stack, tokbuffer, line, XML_NESTINGERROR);
while (top && strcmp(top->tag->name, tokbuffer)!=0) top = top->next;
if (top==NULL) return XML_NESTINGERROR;
while (stack && stack!=top) {
if (cb->functions->tagend) {
cb->functions->tagend(stack);
}
free_tag(pop_tag(&stack));
cb = stack->callbacks;
}
}
if (cb->functions->tagend) {
cb->functions->tagend(stack);
}
cb = cb->parent;
}
if (strcmp(stack->tag->name, tokbuffer)!=0) {
return XML_NESTINGERROR;
}
free_tag(pop_tag(&stack));
if (stack==start) {
return XML_OK;
} else {
free_tag(pop_tag(&stack));
}
state = PLAIN;
pos = tokbuffer;
@ -273,7 +372,7 @@ xml_parse(FILE * stream, struct xml_callbacks * cb, void * data, xml_stack * sta
case '=':
case '/':
*pos='\0';
return cb_error(stack, tokbuffer, line, XML_INVALIDCHAR, data);
return cb_error(stack, tokbuffer, line, XML_INVALIDCHAR);
default:
*pos++ = (char)c;
}
@ -284,6 +383,25 @@ xml_parse(FILE * stream, struct xml_callbacks * cb, void * data, xml_stack * sta
return XML_OK; /* SUCCESS */
}
int
xml_read(FILE * stream, xml_stack * stack)
{
xml_stack root;
FILE * save;
if (!stack) {
stack = &root;
memset(stack, 0, sizeof(xml_stack));
}
save = stack->stream;
stack->stream = stream;
while (!feof(stream)) {
int i = xml_parse(stack);
if (i!=0) return i;
}
stack->stream = save;
return XML_OK;
}
const char *
xml_value(const xml_tag * tag, const char * name)
{

View file

@ -12,10 +12,16 @@
#include <stdio.h>
struct xml_hierarchy;
#define XML_CB_IGNORE 1<<0
typedef struct xml_stack {
FILE * stream;
const struct xml_hierarchy * callbacks;
struct xml_stack * next;
struct xml_tag * tag;
void * state;
} xml_stack;
typedef struct xml_tag {
@ -37,15 +43,15 @@ typedef struct xml_attrib {
/* callbacks */
typedef struct xml_callbacks {
int (*plaintext)(struct xml_stack *, const char*, void *);
int (*tagbegin)(struct xml_stack *, void *);
int (*tagend)(struct xml_stack *, void *);
int (*error)(struct xml_stack *, const char*, unsigned int, int, void *);
int (*tagbegin)(struct xml_stack *);
int (*tagend)(struct xml_stack *);
int (*plaintext)(struct xml_stack *, const char*);
} xml_callbacks;
/* parser */
#include <stdio.h>
extern int xml_parse(FILE * stream, struct xml_callbacks *, void *, struct xml_stack *);
extern void xml_register(struct xml_callbacks * cb, const char * parent, unsigned int flags);
extern int xml_read(FILE *, struct xml_stack * stack);
extern const char * xml_value(const struct xml_tag * tag, const char * name);
extern double xml_fvalue(const xml_tag * tag, const char * name);
extern int xml_ivalue(const xml_tag * tag, const char * name);

View file

@ -701,7 +701,7 @@ fix_migrants(void) {
for (u=r->units;u;u=u->next) {
if (u->race == new_race[RC_HUMAN]) u->irace = u->race;
if (u->irace!=u->race && (u->race->flags & RCF_SHAPESHIFT)==0) {
log_warning(("[fix_migrants] %s ist ein %s, als %s getarnt\n", unitname(u), rc_name(u->race, 0), rc_name(u->irace, 0)));
log_warning(("[fix_migrants] %s ist ein %s, als %s getarnt\n", unitname(u), LOC(default_locale, rc_name(u->race, 0)), LOC(default_locale, rc_name(u->irace, 0))));
}
}
}

View file

@ -596,6 +596,7 @@ main(int argc, char *argv[])
region **rp = &regions;
if ((i=readgame(false))!=0) return i;
lostf = findfaction(insertfaction);
lostf->lastorders = turn;
lostf->allies = NULL;
@ -707,6 +708,7 @@ main(int argc, char *argv[])
return 0;
}
if ((i=readgame(false))!=0) return i;
make_dungeon(5, 5, NULL, NULL);
writepasswd();
if (g_killeiswald) {
region * r = findregion(0, 25);

View file

@ -1,4 +1,158 @@
<messages>
<message name="newbieimmunity">
<type>
<arg name="turns" type="int"></arg>
</type>
<locale name="de">
<nr section="events">
<text>"Deine Partei ist noch $int($turns) Wochen immun gegen Angriffe."</text>
</nr>
</locale>
</message>
<message name="error130">
<type>
<arg name="unit" type="unit"></arg>
<arg name="region" type="region"></arg>
<arg name="command" type="string"></arg>
</type>
<locale name="de">
<nr section="errors">
<text>"$unit($unit) in $region($region): '$command' - Syntax: MAGIEGEBIET [1-5]."</text>
</nr>
</locale>
</message>
<message name="error131">
<type>
<arg name="unit" type="unit"></arg>
<arg name="region" type="region"></arg>
<arg name="command" type="string"></arg>
</type>
<locale name="de">
<nr section="errors">
<text>"$unit($unit) in $region($region): '$command' - Um in Gletschern Straßen bauen zu können, muß zuerst ein Tunnel errichtet werden."</text>
</nr>
</locale>
</message>
<message name="pest">
<type>
<arg name="dead" type="int"></arg>
</type>
<locale name="de">
<nr section="events">
<text>"Hier wütete die Pest, und $int($dead) Bauern starben."</text>
</nr>
</locale>
</message>
<message name="usepotion">
<type>
<arg name="unit" type="unit"></arg>
<arg name="potion" type="resource"></arg>
</type>
<locale name="de">
<nr section="events">
<text>"$unit($unit) benutzt einen $resource($potion,1)."</text>
</nr>
</locale>
</message>
<message name="income_tradetax">
<type>
<arg name="unit" type="unit"></arg>
<arg name="region" type="region"></arg>
<arg name="amount" type="int"></arg>
</type>
<locale name="de">
<nr section="economy">
<text>"$unit($unit) verdient am Handel in $region($region) Steuern in Höhe von $int($amount) Silber."</text>
</nr>
</locale>
</message>
<message name="maintenance_late" section="economy">
<type>
<arg name="building" type="building"></arg>
</type>
<text locale="de">"Der Unterhalt von $building($building) konnte nur verspätet gezahlt werden, das Gebäude war diese Woche nicht funktionstüchtig."</text>
<text locale="en">"The upkeep for $building($building) was paid late, the building was not operational this week."</text>
</message>
<message name="maintenancefail">
<type>
<arg name="unit" type="unit"></arg>
<arg name="building" type="building"></arg>
</type>
<locale name="de">
<nr section="economy">
<text>"$unit($unit) kann den Unterhalt von $building($building) nicht bezahlen."</text>
</nr>
</locale>
</message>
<message name="maintenancespecialfail">
<type>
<arg name="unit" type="unit"></arg>
<arg name="item" type="resource"></arg>
<arg name="building" type="building"></arg>
</type>
<locale name="de">
<nr section="economy">
<text>"$unit($unit) fehlen $resource($item,0) für den Betrieb von $building($building)."</text>
</nr>
</locale>
</message>
<message name="maintenance">
<type>
<arg name="unit" type="unit"></arg>
<arg name="building" type="building"></arg>
</type>
<locale name="de">
<nr section="economy">
<text>"$unit($unit) bezahlt den Unterhalt von $building($building)."</text>
</nr>
</locale>
</message>
<message name="give">
<type>
<arg name="unit" type="unit"></arg>
<arg name="amount" type="int"></arg>
<arg name="resource" type="resource"></arg>
<arg name="target" type="unit"></arg>
</type>
<locale name="de">
<nr section="economy">
<text>"$unit($unit) übergibt $int($amount) $resource($resource,$amount) an $unit($target)."</text>
</nr>
</locale>
</message>
<message name="msg_economy">
<type>
<arg name="string" type="string"></arg>
</type>
<locale name="de">
<nr section="economy">
<text>"$string"</text>
</nr>
</locale>
</message>
<message name="msg_event">
<type>
<arg name="string" type="string"></arg>
</type>
<locale name="de">
<nr section="events">
<text>"$string"</text>
</nr>
</locale>
</message>
<message name="rm_stone">
<text locale="de">Steine</text>
<text locale="en">stones</text>
@ -1948,32 +2102,6 @@
</locale>
</message>
<message name="error130">
<type>
<arg name="unit" type="unit"></arg>
<arg name="region" type="region"></arg>
<arg name="command" type="string"></arg>
</type>
<locale name="de">
<nr section="errors">
<text>"$unit($unit) in $region($region): '$command' - Syntax: MAGIEGEBIET <1-5>."</text>
</nr>
</locale>
</message>
<message name="error131">
<type>
<arg name="unit" type="unit"></arg>
<arg name="region" type="region"></arg>
<arg name="command" type="string"></arg>
</type>
<locale name="de">
<nr section="errors">
<text>"$unit($unit) in $region($region): '$command' - Um in Gletschern Straßen bauen zu können, muß zuerst ein Tunnel errichtet werden."</text>
</nr>
</locale>
</message>
<message name="error132">
<type>
<arg name="unit" type="unit"></arg>
@ -4269,33 +4397,14 @@
</locale>
</message>
<message name="error304">
<message name="error304" section="errors">
<type>
<arg name="unit" type="unit"></arg>
<arg name="region" type="region"></arg>
<arg name="command" type="string"></arg>
</type>
<locale name="de">
<nr section="errors">
<text>"$unit($unit) in $region($region): '$command' - Einheiten einer Partei, die noch immun gegen Angriffe ist, dürfen nicht bewachen."</text>
</nr>
</locale>
<locale name="en">
<nr section="errors">
<text>"$unit($unit) in $region($region): '$command' - units of a faction that can't be attacked may not guard."</text>
</nr>
</locale>
</message>
<message name="msg_event">
<type>
<arg name="string" type="string"></arg>
</type>
<locale name="de">
<nr section="events">
<text>"$string"</text>
</nr>
</locale>
<text locale="de">"$unit($unit) in $region($region): '$command' - Einheiten einer Partei, die noch immun gegen Angriffe ist, dürfen nicht bewachen."</text>
<text locale="en">"$unit($unit) in $region($region): '$command' - units of a faction that can't be attacked may not guard."</text>
</message>
<message name="drown_on_ship">
@ -4516,29 +4625,6 @@
</locale>
</message>
<message name="pest">
<type>
<arg name="dead" type="int"></arg>
</type>
<locale name="de">
<nr section="events">
<text>"Hier wütete die Pest, und $int($dead) Bauern starben."</text>
</nr>
</locale>
</message>
<message name="usepotion">
<type>
<arg name="unit" type="unit"></arg>
<arg name="potion" type="resource"></arg>
</type>
<locale name="de">
<nr section="events">
<text>"$unit($unit) benutzt einen $resource($potion,1)."</text>
</nr>
</locale>
</message>
<message name="spydetect">
<type>
<arg name="target" type="unit"></arg>
@ -4622,17 +4708,6 @@
</locale>
</message>
<message name="newbieimmunity">
<type>
<arg name="turns" type="int"></arg>
</type>
<locale name="de">
<nr section="events">
<text>"Deine Partei ist noch $int($turns) Wochen immun gegen Angriffe."</text>
</nr>
</locale>
</message>
<message name="newbie_immunity_error">
<type>
<arg name="turns" type="int"></arg>
@ -5546,31 +5621,6 @@
</locale>
</message>
<message name="msg_economy">
<type>
<arg name="string" type="string"></arg>
</type>
<locale name="de">
<nr section="economy">
<text>"$string"</text>
</nr>
</locale>
</message>
<message name="give">
<type>
<arg name="unit" type="unit"></arg>
<arg name="amount" type="int"></arg>
<arg name="resource" type="resource"></arg>
<arg name="target" type="unit"></arg>
</type>
<locale name="de">
<nr section="economy">
<text>"$unit($unit) übergibt $int($amount) $resource($resource,$amount) an $unit($target)."</text>
</nr>
</locale>
</message>
<message name="income">
<type>
<arg name="unit" type="unit"></arg>
@ -5739,64 +5789,6 @@
</locale>
</message>
<message name="income_tradetax">
<type>
<arg name="unit" type="unit"></arg>
<arg name="region" type="region"></arg>
<arg name="amount" type="int"></arg>
</type>
<locale name="de">
<nr section="economy">
<text>"$unit($unit) verdient am Handel in $region($region) Steuern in Höhe von $int($amount) Silber."</text>
</nr>
</locale>
</message>
<message name="maintenance">
<type>
<arg name="unit" type="unit"></arg>
<arg name="building" type="building"></arg>
</type>
<locale name="de">
<nr section="economy">
<text>"$unit($unit) bezahlt den Unterhalt von $building($building)."</text>
</nr>
</locale>
</message>
<message name="maintenance_late" section="economy">
<type>
<arg name="building" type="building"></arg>
</type>
<text locale="de">"Der Unterhalt von $building($building) konnte nur verspätet gezahlt werden, das Gebäude war diese Woche nicht funktionstüchtig."</text>
<text locale="en">"The upkeep for $building($building) was paid late, the building was not operational this week."</text>
</message>
<message name="maintenancefail">
<type>
<arg name="unit" type="unit"></arg>
<arg name="building" type="building"></arg>
</type>
<locale name="de">
<nr section="economy">
<text>"$unit($unit) kann den Unterhalt von $building($building) nicht bezahlen."</text>
</nr>
</locale>
</message>
<message name="maintenancespecialfail">
<type>
<arg name="unit" type="unit"></arg>
<arg name="item" type="resource"></arg>
<arg name="building" type="building"></arg>
</type>
<locale name="de">
<nr section="economy">
<text>"$unit($unit) fehlen $resource($item,0) für den Betrieb von $building($building)."</text>
</nr>
</locale>
</message>
<message name="buy">
<type>
<arg name="unit" type="unit"></arg>
@ -7351,7 +7343,7 @@
<arg name="name" type="string"></arg>
</type>
<text locale="de">"Zur Feier des Geburtstags von ${name} wird in $region($region) ein großes Feuerwerk abgebrannt, welches noch hier zu bewundern ist. Kaskaden bunter Sterne, leuchtende Wasserfälle aus Licht und strahlende Feuerdrachen erhellen den Himmel."</text>
<text locale="en">"A large firework in honor of ${name}, visible all over the sky, has been started in $region($region)."
<text locale="en">"A large firework in honor of ${name}, visible all over the sky, has been started in $region($region)."</text>
</message>
<message name="birthday_firework_local">

View file

@ -1,676 +0,0 @@
## OPTION <x>
AUSWERTUNG;de;AUSWERTUNG
COMPUTER;de;COMPUTER
ZUGVORLAGE;de;ZUGVORLAGE
SILBERPOOL;de;SILBERPOOL
STATISTIK;de;STATISTIK
DEBUG;de;DEBUG
ZIPPED;de;ZIPPED
ZEITUNG;de;ZEITUNG
MATERIALPOOL;de;MATERIALPOOL
ADRESSEN;de;ADRESSEN
BZIP2;de;BZIP2
PUNKTE;de;PUNKTE
## Schiffstypen
Karavelle;de;Karavelle
Boot;de;Boot
Langboot;de;Langboot
Drachenschiff;de;Drachenschiff
Trireme;de;Trireme
## Terraintypen
maelstrom;de;Mahlstrom
ocean;de;Ozean
plain;de;Ebene
forest;de;Wald
swamp;de;Sumpf
desert;de;Wüste
highland;de;Hochland
mountain;de;Berge
glacier;de;Gletscher
firewall;de;Feuerwand
grassland;de;Steppe
volcano;de;Vulkan
fog;de;Nebel
iceberg;de;Eisberg
thickfog;de;Dichter Nebel
hell;de;Ebene aus Feuer und Dunkelheit
activevolcano;de;Aktiver Vulkan
hall1;de;Halle
corridor1;de;Gang
magicstorm;de;Magischer Sturm
maelstrom_trail;de;ein %s
ocean_trail;de;%s
plain_trail;de;die Ebene von %s
forest_trail;de;der Wald von %s
swamp_trail;de;der Sumpf von %s
desert_trail;de;die Wüste von %s
highland_trail;de;das Hochland von %s
mountain_trail;de;das Bergland von %s
glacier_trail;de;der Gletscher von %s
firewall_trail;de;eine %s
grassland_trail;de;die Steppe von %s
volcano_trail;de;der Vulkan von %s
fog_trail;de;ein %s
iceberg_trail;de;der Eisberg von %s
thickfog_trail;de;%s
hell_trail;de;eine %s
activevolcano_trail;de;ein %s
hall1_trail;de;die %s
corridor1_trail;de;die %s
magicstorm_trail;de;ein %s
caldera;de;Krater
xmas_exit;de;Pforte
coal;de;Kohlenstück
coal_p;de;Kohlenstücke
## Himmelsrichtungen
west;de;Westen
northwest;de;Nordwesten
northeast;de;Nordosten
east;de;Osten
southwest;de;Südwesten
southeast;de;Südosten
dir_nw;de;NW
dir_ne;de;NO
dir_east;de;Ost
dir_se;de;SO
dir_sw;de;SW
dir_west;de;West
## Verschiedenes
unknownunit;de;eine unbekannte Einheit
## Meldungssektionen
section_events;de;Meldungen und Ereignisse
section_errors;de;Warnungen und Fehler
section_economy;de;Wirtschaft und Handel
section_production;de;Rohstoffe und Produktion
section_magic;de;Magie und Artefakte
section_movement;de;Reisen und Bewegung
section_study;de;Lehren und Lernen
section_battle;de;Kämpfe
section_none;de;Verschiedenes
section_newspells;de;Neue Zauber
section_newpotions;de;Neue Tränke
## Gebäudetypen
fortress_generic;de;Burg
lighthouse;de;Leuchtturm
mine;de;Bergwerk
quarry;de;Steinbruch
harbour;de;Hafen
academy;de;Akademie
magictower;de;Magierturm
smithy;de;Schmiede
sawmill;de;Sägewerk
stables;de;Pferdezucht
monument;de;Monument
dam;de;Damm
caravan;de;Karawanserei
tunnel;de;Tunnel
inn;de;Taverne
stonecircle;de;Steinkreis
blessedstonecircle;de;Gesegneter Steinkreis
illusioncastle;de;Traumschlößchen
genericbuilding;de;Struktur
## Testgebäude
temple;de;Tempel
## Testitem
wand;de;Zauberstab
wand_p;de;Zauberstäbe
wand_of_tears;de;Szepter der Tränen
wand_of_tears_p;de;Szepter der Tränen
## Burgausbaustufen
site;de;Grundmauern
tradepost;de;Handelsposten
fortification;de;Befestigung
tower;de;Turm
castle;de;Burg
fortress;de;Festung
citadel;de;Zitadelle
## Items
herb;de;Kraut
herbbag;de;Kräuterbeutel
vial;de;Phiole
vial_p;de;Phiolen
## Resourcen
money;de;Silber
money_p;de;Silber
hp;de;Trefferpunkt
hp_p;de;Trefferpunkte
aura;de;Aura
aura_p;de;Aura
permaura;de;permanente Aura
permaura_p;de;permanente Aura
peasant;de;Bauer
peasant_p;de;Bauern
unit;de;Einheit
unit_p;de;Einheiten
person;de;Person
person_p;de;Personen
## items
runesword;de;Runenschwert
runesword_p;de;Runenschwerter
iron;de;Eisen
iron_p;de;Eisen
log;de;Holz
log_p;de;Holz
stone;de;Stein
stone_p;de;Steine
cart;de;Wagen
cart_p;de;Wagen
catapult;de;Katapult
catapult_p;de;Katapulte
sword;de;Schwert
sword_p;de;Schwerter
spear;de;Speer
spear_p;de;Speere
mallornspear;de;Mallornspeer
mallornspear_p;de;Mallornspeere
crossbow;de;Armbrust
crossbow_p;de;Armbrüste
mallorncrossbow;de;Mallornarmbrust
mallorncrossbow_p;de;Mallornarmbrüste
bow;de;Bogen
bow_p;de;Bögen
mallornbow;de;Mallornbogen
mallornbow_p;de;Mallornbögen
## more items
chainmail;de;Kettenhemd
chainmail_p;de;Kettenhemden
plate;de;Plattenpanzer
plate_p;de;Plattenpanzer
balm;de;Balsam
balm_p;de;Balsam
spice;de;Gewürz
spice_p;de;Gewürze
jewel;de;Juwel
jewel_p;de;Juwelen
myrrh;de;Myrrhe
myrrh_p;de;Myrrhe
oil;de;Öl
oil_p;de;Öl
silk;de;Seide
silk_p;de;Seide
incense;de;Weihrauch
incense_p;de;Weihrauch
firesword;de;Flammenschwert
firesword_p;de;Flammenschwerter
shieldstone;de;Schildstein
shieldstone_p;de;Schildsteine
greatsword;de;Bihänder
greatsword_p;de;Bihänder
axe;de;Kriegsaxt
axe_p;de;Kriegsäxte
greatbow;de;Elfenbogen
greatbow_p;de;Elfenbögen
laensword;de;Laenschwert
laensword_p;de;Laenschwerter
laenshield;de;Laenschild
laenshield_p;de;Laenschilde
laenmail;de;Laenkettenhemd
laenmail_p;de;Laenkettenhemden
laen;de;Laen
laen_p;de;Laen
shield;de;Schild
shield_p;de;Schilde
halberd;de;Hellebarde
halberd_p;de;Hellebarden
lance;de;Lanze
lance_p;de;Lanzen
mallornlance;de;Mallornlanze
mallornlance_p;de;Mallornlanzen
mallorn;de;Mallorn
mallorn_p;de;Mallorn
cookie;de;Keks
cookie_p;de;Kekse
apple;de;Apfel
apple_p;de;Äpfel
nut;de;Nuß
nut_p;de;Nüsse
almond;de;Mandelkern
almond_p;de;Mandelkerne
dragonblood;de;Drachenblut
dragonblood_p;de;Drachenblut
fairyboot;de;Feenstiefel
fairyboot_p;de;Feenstiefel
healingpotion;de;Heiltrank
healingpotion_p;de;Heiltränke
antimagic;de;Antimagiekristall
antimagic_p;de;Antimagiekristalle
toadslime;de;Tiegel mit Krötenschleim
toadslime_p;de;Tiegel mit Krötenschleim
amulet;de;Amulett
amulet_p;de;Amulette
ao_daemon;de;Auge des Dämon
ao_daemon_p;de;Augen des Dämon
griphonwing;de;Schwinge des Greifen
griphonwing_p;de;Schwingen des Greifen
ao_chastity;de;Amulett der Keuschheit
ao_chastity_p;de;Amulette der Keuschheit
aoh;de;Amulett der Heilung
aoh_p;de;Amulette der Heilung
aog;de;Amulett des Treffens
aog_p;de;Amulette des Treffens
aots;de;Amulett des wahren Sehens
aots_p;de;Amulette des wahren Sehens
aoc;de;Katzenamulett
aoc_p;de;Katzenamulette
roi;de;Ring der Unsichtbarkeit
roi_p;de;Ringe der Unsichtbarkeit
rop;de;Ring der Macht
rop_p;de;Ringe der Macht
roqf;de;Ring der flinken Finger
roqf_p;de;Ringe der flinken Finger
horse;de;Pferd
horse_p;de;Pferde
magicherbbag;de;Magischer Kräuterbeutel
magicherbbag_p;de;Magische Kräuterbeutel
moneybag;de;Silberbeutel
moneychest;de;Silberkassette
dragonhoard;de;Drachenhort
dragonhead;de;Drachenkopf
dragonhead_p;de;Drachenköpfe
eyeofdragon;de;Auge des Drachen
eyeofdragon_p;de;Augen des Drachen
rustysword;de;Schartiges Schwert
rustysword_p;de;Schartige Schwerter
rustyshield;de;Rostiges Schild
rustyshield_p;de;Rostige Schilde
rustychainmail;de;Rostiges Kettenhemd
rustychainmail_p;de;Rostige Kettenhemden
soc;de;Magischer Kräuterbeutel
soc_p;de;Magische Kräuterbeutel
ror;de;Ring der Regeneration
ror_p;de;Ringe der Regeneration
aod;de;Amulett der Dunkelheit
aod_p;de;Amulette der Dunkelheit
magicbag;de;Zauberbeutel
magicbag_p;de;Zauberbeutel
dreameye;de;Traumauge
dreameye_p;de;Traumaugen
seaserpenthead;de;Seeschlangenkopf
seaserpenthead_p;de;Seeschlangenköpfe
aurafocus;de;Aurafocus
aurafocus_p;de;Aurafocuse
presspass;de;Akkredition des Xontormia-Expreß
presspass_p;de;Akkreditionen des Xontormia-Expreß
trollbelt;de;Gürtel der Trollstärke
trollbelt_p;de;Gürtel der Trollstärke
elvenhorse;de;Elfenpferd
elvenhorse_p;de;Elfenpferde
pegasus;de;Pegasus
pegasus_p;de;Pegasi
dolphin;de;Delphin
dolphin_p;de;Delphine
museumticket;de;Eintrittskarte des Großen Museum
museumticket_p;de;Eintrittskarten des Großen Museum
museumexitticket;de;Rückkehrticket des Großen Museum
museumexitticket_p;de;Rückkehrtickets des Großen Museum
manacrystal;de;Astralkristall
manacrystal_p;de;Astralkristalle
skillpotion;de;Talenttrunk
skillpotion_p;de;Talenttrünke
seed;de;Same
seed_p;de;Samen
mallornseed;de;Mallornsame
mallornseed_p;de;Mallornsamen
birthday_firework;de;Feuerwerk
birthday_firework_p;de;Feuerwerke
lebkuchenherz;de;Lebkuchenherz mit der Aufschrift 'Erz und Stein, das ist fein'
lebkuchenherz_p;de;Lebkuchenherzen mit der Aufschrift 'Erz und Stein, das ist fein'
## herb singular
h0;de;Flachwurz
h1;de;Würziger Wagemut
h2;de;Eulenauge
h3;de;Grüner Spinnerich
h4;de;Blauer Baumringel
h5;de;Elfenlieb
h6;de;Gurgelkraut
h7;de;Knotiger Saugwurz
h8;de;Blasenmorchel
h9;de;Wasserfinder
h10;de;Kakteenschwitz
h11;de;Sandfäule
h12;de;Windbeutel
h13;de;Fjordwuchs
h14;de;Alraune
h15;de;Steinbeißer
h16;de;Spaltwachs
h17;de;Höhlenglimm
h18;de;Eisblume
h19;de;Weißer Wüterich
h20;de;Schneekristall
## herb plural
h0_p;de;Flachwurz
h1_p;de;Würzige Wagemut
h2_p;de;Eulenaugen
h3_p;de;Grüne Spinneriche
h4_p;de;Blaue Baumringel
h5_p;de;Elfenlieb
h6_p;de;Gurgelkräuter
h7_p;de;Knotige Saugwurze
h8_p;de;Blasenmorcheln
h9_p;de;Wasserfinder
h10_p;de;Kakteenschwitze
h11_p;de;Sandfäulen
h12_p;de;Windbeutel
h13_p;de;Fjordwuchse
h14_p;de;Alraunen
h15_p;de;Steinbeißer
h16_p;de;Spaltwachse
h17_p;de;Höhlenglimme
h18_p;de;Eisblumen
h19_p;de;Weiße Wüteriche
h20_p;de;Schneekristalle
p0;de;Siebenmeilentee
p1;de;Goliathwasser
p2;de;Wasser des Lebens
p3;de;Schaffenstrunk
p4;de;Wundsalbe
p5;de;Bauernblut
p6;de;Gehirnschmalz
p7;de;Dumpfbackenbrot
p8;de;Nestwärme
p9;de;Pferdeglück
p10;de;Berserkerblut
p11;de;Bauernlieb
p12;de;Trank der Wahrheit
p13;de;Elixier der Macht
p14;de;Heiltrank
p0_p;de;Siebenmeilentees
p1_p;de;Goliathwasser
p2_p;de;Wasser des Lebens
p3_p;de;Schaffenstrünke
p4_p;de;Wundsalben
p5_p;de;Bauernblut
p6_p;de;Gehirnschmalz
p7_p;de;Dumpfbackenbrote
p8_p;de;Nestwärme
p9_p;de;Pferdeglück
p10_p;de;Berserkerblut
p11_p;de;Bauernlieb
p12_p;de;Tränke der Wahrheit
p13_p;de;Elixiere der Macht
p14_p;de;Heiltränke
## Spezialitems
lmsreward;de;Gürtel der Heldentaten
lmsreward_p;de;Gürtel der Heldentaten
## Parameter
AGGRESSIV;de;AGGRESSIV
ALLES;de;ALLES
ANZAHL;de;ANZAHL
AURA;de;AURA
BAUERN;de;BAUERN
BEISTAND;de;BEISTAND
BEWACHE;de;BEWACHEN
BURG;de;BURG
DEFENSIV;de;DEFENSIV
EINHEIT;de;EINHEIT
ERESSEA;de;ERESSEA
FLIEHE;de;FLIEHE
FREMDES;de;FREMDES
GEBÄUDE;de;GEBÄUDE
GEGENSTÄNDE;de;GEGENSTÄNDE
GIB;de;GIB
GNADE;de;GNADE
HELFE;de;HELFE
HINTEN;de;HINTEN
HINTER;de;HINTER
KOMMANDO;de;KOMMANDO
KRÄUTER;de;KRÄUTER
KÄMPFE;de;KÄMPFE
NICHT;de;NICHT
NÄCHSTER;de;NÄCHSTER
PARTEI;de;PARTEI
PARTEITARNUNG;de;PARTEITARNUNG
PAUSE;de;PAUSE
PERSONEN;de;PERSONEN
PRIVAT;de;PRIVAT
REGION;de;REGION
SCHIFF;de;SCHIFF
SILBER;de;SILBER
STRAßEN;de;STRAßEN
STUFE;de;STUFE
TEMPORÄRE;de;TEMPORÄRE
TRÄNKE;de;TRÄNKE
UM;de;UM
VOR;de;VOR
VORNE;de;VORNE
ZAUBER;de;ZAUBER
## ;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
KONTAKTIEREN;de;KONTAKTIEREN
LEHREN;de;LEHREN
LERNEN;de;LERNEN
LIEFERE;de;LIEFERE
MACHEN;de;MACHEN
NACH;de;NACH
INFO;de;INFO
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
VERKAUFEN;de;VERKAUFEN
VERLASSEN;de;VERLASSEN
VERGESSEN;de;VERGESSEN
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_unicorn_p;de;Einhörner
rc_wolve_p;de;Warge
rc_dragon_p;de;Drachen
rc_catdragon_p;de;Katzendrachen
rc_ghost_p;de;Geister
rc_cat_p;de;Katzen
rc_human_p;de;Menschen
rc_cat;de;Katze
rc_elf;de;Elf
rc_human;de;Mensch
rc_elve_p;de;Elfen
rc_aquarian;de;Meermensch
rc_dwarve_p;de;Zwerge
rc_lynx_p;de;Luchs
rc_unicorn;de;Einhorn
rc_wolf;de;Warg
rc_dragon;de;Drache
rc_catdragon;de;Katzendrache
rc_dwarf;de;Zwerg
rc_aquarian_p;de;Meermenschen
rc_insect_p;de;Insekten
rc_insect;de;Insekt
rc_ghost;de;Geist
rc_halfling;de;Halbling
rc_halfling_p;de;Halblinge
rc_troll_p;de;Trolle
rc_troll;de;Troll
rc_undead;de;Untote
rc_undead_p;de;Untoter
rc_owl;de;Eule
rc_giantturtle;de;Riesenschildkröte
rc_orc_p;de;Orks
rc_orc;de;Ork
rc_zombie;de;Zombie
rc_zombie_p;de;Zombies
rc_shadowknight;de;Schattenritter
## NR generieren
nr_options;de;Optionen
nr_level;de;Stufe
nr_alliances;de;Aktueller Status
nr_herbsrequired;de;Benötigte Kräuter
nr_undercons;de;im Bau
nr_damaged;de;beschädigt
nr_youaredead;de;Unglücklicherweise wurde deine Partei ausgelöscht. Du kannst gerne an einer anderen Stelle wieder einsteigen. Melde Dich einfach wieder an.
nr_skills;de;Talente
nr_inventory;de;hat
nr_size;de;Größe
nr_spells;de;Zauber
nr_combatspells;de;Kampfzauber
nr_nospells;de;keiner
nr_addresses;de;Liste aller Adressen
anonymous;de;anonym
b_attacke;de;Angriff
b_defense;de;Verteidigung
b_armor;de;Rüstung
b_damage;de;Schaden
## Küsten
Nordwestküste;de;Nordwestküste
Nordostküste;de;Nordostküste
Ostküste;de;Ostküste
Südostküste;de;Südostküste
Südwestküste;de;Südwestküste
Westküste;de;Westküste
## report newbie info
nr_nmr;de;Deine Partei hat letzte Runde keinen Zug abgegeben!

File diff suppressed because it is too large Load diff

View file

@ -1580,7 +1580,7 @@
</type>
<locale name="en">
<nr section="errors">
<text>"$unit($unit) in $region($region): '$command' - Syntax: MAGIC SPHERE <1-5>."</text>
<text>"$unit($unit) in $region($region): '$command' - Syntax: MAGIC SPHERE [1-5]."</text>
</nr>
</locale>
</message>

View file

@ -1,671 +0,0 @@
## OPTION <x>
ADRESSEN;en;ADDRESSES
AUSWERTUNG;en;REPORT
BZIP2;en;BZIP2
COMPUTER;en;COMPUTER
DEBUG;en;DEBUG
MATERIALPOOL;en;ITEMPOOL
PUNKTE;en;SCORE
SILBERPOOL;en;SILVERPOOL
STATISTIK;en;STATISTICS
ZEITUNG;en;EXPRESS
ZIPPED;en;ZIPPED
ZUGVORLAGE;en;TEMPLATE
INFO;en;INFO
## ship types
Karavelle;en;caravel
Boot;en;boat
Langboot;en;longboat
Drachenschiff;en;dragonship
Trireme;en;trireme
## Terraintypen
activevolcano;en;active volcano
corridor1;en;corridor
desert;en;desert
firewall;en;firewall
fog;en;fog
forest;en;forest
glacier;en;glacier
grassland;en;steppe
hall1;en;hallway
hell;en;hell
highland;en;highland
iceberg;en;iceberg
maelstrom;en;maelstrom
mountain;en;mountain
ocean;en;ocean
plain;en;plain
swamp;en;swamp
thickfog;en;thick fog
volcano;en;volcano
magicstorm;en;magical storm
activevolcano_trail;en;an %s
corridor1_trail;en;a %s
desert_trail;en;the deserts of %s
firewall_trail;en;a %s
fog_trail;en;fog_trail %s
forest_trail;en;the forests of %s
glacier_trail;en;the glacier of %s
grassland_trail;en;the steppe of %s
hall1_trail;en;the %s
hell_trail;en;%s
highland_trail;en;the highlands of %s
iceberg_trail;en;an %s
maelstrom_trail;en;a %s
mountain_trail;en;the mountains of %s
ocean_trail;en;the %s
plain_trail;en;the plain of %s
swamp_trail;en;the swamps of %s
thickfog_trail;en;%s
volcano_trail;en;a %s
magicstorm_trail;en;a %s
caldera;en;caldera
xmas_exit;en;portal
temple;en;temple
## directions
dir_nw;en;NW
dir_ne;en;NE
dir_east;en;East
dir_se;en;SE
dir_sw;en;SW
dir_west;en;West
west;en;west
northwest;en;northwest
northeast;en;northeast
east;en;east
southwest;en;southwest
southeast;en;southeast
unknownunit;en;an unknown unit
section_events;en;Messages and Events
section_errors;en;Warnings and Errors
section_economy;en;Economy and Trade
section_production;en;Resources and Production
section_magic;en;Magic and Artefacts
section_movement;en;Movement and Travel
section_study;en;Learning and Teaching
section_battle;en;Battles
section_none;en;Miscellaneous
section_newspells;en;New Spells
## Building Types
academy;en;academy
blessedstonecircle;en;blessed stonecircle
caravan;en;caravanserei
dam;en;dam
genericbuilding;en;structure
harbour;en;harbour
illusioncastle;en;fairy castle
inn;en;inn
lighthouse;en;lighthouse
magictower;en;mage tower
mine;en;mine
monument;en;monument
quarry;en;quarry
sawmill;en;sawmill
smithy;en;smithy
stables;en;stable
stonecircle;en;stonecircle
tunnel;en;tunnel
## Burgausbaustufen
site;en;foundation
tradepost;en;tradepost
fortification;en;fortification
tower;en;tower
castle;en;castle
fortress;en;fortress
citadel;en;citadel
## Items
herb;en;herb
vial;en;vial
vial_p;en;vials
## Resourcen
money;en;silver
money_p;en;silver
hp;en;hp
hp_p;en;hps
aura;en;aura
aura_p;en;auras
permaura;en;permaura
permaura_p;en;permauras
peasant;en;peasant
peasant_p;en;peasants
## items
almond;en;almond
almond_p;en;almonds
amulet;en;amulet
amulet_p;en;amulets
antimagic;en;antimagic cristal
antimagic_p;en;antimagic cristals
ao_chastity;en;amulet of chastity
ao_chastity_p;en;amulets of chastity
ao_daemon;en;eye of the demon
ao_daemon_p;en;eye of the demon
aoc;en;amulet of the kitten
aoc_p;en;amulets of the kitten
aod;en;amulet of darkness
aod_p;en;amulets of darkness
aog;en;amulet of gathering
aog_p;en;amulets of gathering
aoh;en;amulet of healing
aoh_p;en;amulets of healing
aots;en;amulet of true seeing
aots_p;en;amulets of true seeing
apple;en;apple
apple_p;en;apples
aurafocus;en;aurafocus
aurafocus_p;en;aurafocuses
axe;en;axe
axe_p;en;axes
bow;en;bow
bow_p;en;bows
cart;en;cart
cart_p;en;carts
catapult;en;catapult
catapult_p;en;catapults
chainmail;en;chainmail
chainmail_p;en;chainmails
cookie;en;cookie
cookie_p;en;cookies
crossbow;en;crossbow
crossbow_p;en;crossbows
dolphin;en;dolphin
dolphin_p;en;dolphins
dragonblood;en;dragonblood
dragonblood_p;en;dragonblood
dragonhead;en;dragonhead
dragonhead_p;en;dragonheads
dragonhoard;en;dragonhoard
dreameye;en;dreameye
dreameye_p;en;dreameyes
elvenhorse;en;elven horse
elvenhorse_p;en;elven horses
eyeofdragon;en;eye of dragon
eyeofdragon_p;en;eye of dragons
fairyboot;en;fairyboot
fairyboot_p;en;fairyboot
firesword;en;flaming sword
firesword_p;en;flaming swords
greatbow;en;great bow
greatbow_p;en;great bows
greatsword;en;claymore
greatsword_p;en;claymores
griphonwing;en;wing of the gryphon
griphonwing_p;en;wings of the gryphon
halberd;en;halberd
halberd_p;en;halberds
healingpotion;en;healingpotion
healingpotion_p;en;healingpotions
herbbag;en;herbbag
herbbag_p;en;herbbags
horse;en;horse
horse_p;en;horses
iron;en;iron
iron_p;en;irons
laen;en;laen
laen_p;en;laen
laenmail;en;laen chainmail
laenmail_p;en;laen chainmails
laenshield;en;laen shield
laenshield_p;en;laen shields
laensword;en;laen sword
laensword_p;en;laen swords
lance;en;lance
lance_p;en;lances
log;en;wood
log_p;en;wood
magicbag;en;magic bag
magicbag_p;en;magic bags
magicherbbag;en;bag of conservation
magicherbbag_p;en;bags of conservation
mallorn;en;mallorn
mallorn_p;en;mallorn
mallornbow;en;mallorn bow
mallornbow_p;en;mallorn bows
mallorncrossbow;en;mallorn crossbow
mallorncrossbow_p;en;mallorn crossbows
mallornlance;en;mallorn lance
mallornlance_p;en;mallorn lances
mallornspear;en;mallorn spear
mallornspear_p;en;mallorn spear
moneybag;en;silverbag
moneychest;en;silverchest
museumexitticket;en;returnticket for the grand museum
museumexitticket_p;en;returntickets for the grand museum
museumticket;en;ticket to the grand museum
museumticket_p;en;tickets to the grand museum
nut;en;nut
nut_p;en;nuts
pegasus;en;pegasus
pegasus_p;en;pegasi
person;en;man
person_p;en;men
plate;en;plate
plate_p;en;plates
presspass;en;presspass
presspass_p;en;presspasses
roi;en;ring of invisibility
roi_p;en;rings of invisibility
rop;en;ring of power
rop_p;en;rings of power
roqf;en;ring of quick fingers
roqf_p;en;rings of quick fingers
ror;en;ring of regeneration
ror_p;en;rings of regeneration
runesword;en;runesword
runesword_p;en;runeswords
rustychainmail;en;rustychainmail
rustychainmail_p;en;rustychainmails
rustyshield;en;rusty shield
rustyshield_p;en;rusty shields
rustysword;en;rusty sword
rustysword_p;en;rusty swords
seaserpenthead;en;seaserpenthead
seaserpenthead_p;en;seaserpentheads
shield;en;shield
shield_p;en;shields
shieldstone;en;shieldstone
shieldstone_p;en;shieldstones
soc;en;sack of holding
soc_p;en;sacks of holding
spear;en;spear
spear_p;en;spears
stone;en;stone
stone_p;en;stones
sword;en;sword
sword_p;en;swords
toadslime;en;pot of toadslime
toadslime_p;en;pots of toadslime
trollbelt;en;trollbelt
trollbelt_p;en;trollbelts
unit;en;unit
unit_p;en;units
skillpotion;en;potion of skills
skillpotion_p;en;potions of skills
manacrystal;en;astralcrystal
manacrystal_p;en;astralcrystals
seed;en;seed
seed_p;en;seeds
mallornseed;en;mallorn seed
mallornseed_p;en;mallorn seeds
birthday_firework;en;firework
birthday_firework_p;en;fireworks
lebkuchenherz;en;gingerbread heart
lebkuchenherz_p;en;gingerbread hearts
## luxury goods
balm;en;balm
spice;en;spice
jewel;en;gem
jewel_p;en;gems
myrrh;en;myrrh
oil;en;oil
silk;en;silk
incense;en;incense
balm_p;en;balm
spice_p;en;spice
myrrh_p;en;myrrh
oil_p;en;oil
silk_p;en;silk
incense_p;en;incense
## Spezialitems
lmsreward;en;Belt of Heroic Legends
lmsreward_p;en;Belts of Heroic Legends
viele;en;many
sehr viele;en;a great many
## intranslatables:
h0;en;Flachwurz
h0_p;en;Flachwurz
h1;en;Würziger Wagemut
h1_p;en;Würzige Wagemut
h2;en;Eulenauge
h2_p;en;Eulenaugen
h3;en;Grüner Spinnerich
h3_p;en;Grüne Spinneriche
h4;en;Blauer Baumringel
h4_p;en;Blaue Baumringel
h5;en;Elfenlieb
h5_p;en;Elfenlieb
h6;en;Gurgelkraut
h6_p;en;Gurgelkräuter
h7;en;Knotiger Saugwurz
h7_p;en;Knotige Saugwurze
h8;en;Blasenmorchel
h8_p;en;Blasenmorcheln
h9;en;Wasserfinder
h9_p;en;Wasserfinder
h10;en;Kakteenschwitz
h10_p;en;Kakteenschwitze
h11;en;Sandfäule
h11_p;en;Sandfäulen
h12;en;Windbeutel
h12_p;en;Windbeutel
h13;en;Fjordwuchs
h13_p;en;Fjordwuchse
h14;en;Alraune
h14_p;en;Alraunen
h15;en;Steinbeißer
h15_p;en;Steinbeißer
h16;en;Spaltwachs
h16_p;en;Spaltwachse
h17;en;Höhlenglimm
h17_p;en;Höhlenglimme
h18;en;Eisblume
h18_p;en;Eisblumen
h19;en;Weißer Wüterich
h19_p;en;Weiße Wüteriche
h20;en;Snowcrystal petal
h20_p;en;Snowcrystal petals
p0;en;seven mile tea
p0_p;en;seven mile teas
p1;en;goliath water
p1_p;en;goliath waters
p2;en;water of life
p2_p;en;waters of life
p3;en;Schaffenstrunk
p3_p;en;Schaffenstrünke
p4;en;ointment
p4_p;en;ointments
p5;en;peasant bood
p5_p;en;peasant bloods
p6;en;brain wax
p6_p;en;brain waxes
p7;en;Dumpfbackenbrot
p7_p;en;Dumpfbackenbrote
p8;en;potion of nest warmth
p8_p;en;potions of nest warmth
p9;en;horsepower potion
p9_p;en;horsepower potions
p10;en;berserkers blood potion
p10_p;en;berserkers blood potions
p11;en;peasant love potion
p11_p;en;peasant love potion
p12;en;potion of truth
p12_p;en;potions of truth
p13;en;elixir of power
p13_p;en;elixirs of power
p14;en;healing potion
p14_p;en;healing potions
## Parameters
AGGRESSIV;en;AGGRESSIVE
ALLES;en;ALL
ANZAHL;en;NUMBER
AURA;en;AURA
BÄUME;en;TREES
BAUERN;en;PEASANTS
BEISTAND;en;AID
BEWACHE;en;GUARD
BURG;en;CASTLE
DEFENSIV;en;DEFENSIVE
EINHEIT;en;UNIT
ERESSEA;en;ERESSEA
FLIEHE;en;FLEE
FREMDES;en;FOREIGN
GEBÄUDE;en;BUILDING
GEGENSTÄNDE;en;ITEMS
GIB;en;GIVE
GNADE;en;MERCY
HELFE;en;HELP
HINTEN;en;REAR
HINTER;en;AFTER
KOMMANDO;en;CONTROL
KRÄUTER;en;HERBS
KÄMPFE;en;COMBAT
NICHT;en;NOT
NÄCHSTER;en;NEXT
PARTEI;en;PARTEI
PARTEITARNUNG;en;FACTIONSTEALTH
PAUSE;en;PAUSE
PERSONEN;en;MEN
PRIVAT;en;PRIVATE
REGION;en;REGION
SCHIFF;en;SHIP
SILBER;en;SILVER
STRAßEN;en;ROADS
STUFE;en;LEVEL
TEMPORÄRE;en;TEMPORARY
TRÄNKE;en;POTIONS
UM;en;FOR
VOR;en;BEFORE
VORNE;en;FRONT
ZAUBER;en;SPELLS
## Skills
sk_alchemy;en;alchemy
sk_armorer;en;armoursmithing
sk_bow;en;bow
sk_building;en;masonry
sk_cartmaking;en;cartmaking
sk_catapult;en;catapult
sk_crossbow;en;crossbow
sk_entertainment;en;entertainment
sk_espionage;en;espionage
sk_forestry;en;forestry
sk_herbalism;en;herbalism
sk_magic;en;magic
sk_melee;en;melee
sk_mining;en;mining
sk_perception;en;perception
sk_polearm;en;polearm
sk_quarrying;en;quarrying
sk_riding;en;riding
sk_roadwork;en;roadwork
sk_sailing;en;sailing
sk_shipcraft;en;shipcraft
sk_stamina;en;endurance
sk_stealth;en;stealth
sk_tactics;en;tactics
sk_taxation;en;taxation
sk_trade;en;trade
sk_training;en;taming
sk_unarmed;en;unarmed combat
sk_weaponsmithing;en;weaponsmithing
## Keywords
//;en;//
ARBEITEN;en;WORK
ATTACKIEREN;en;ATTACK
BANNER;en;BANNER
BEKLAUEN;en;STEAL
BELAGERE;en;BESIEGE
BENENNEN;en;NAME
BENUTZEN;en;USE
BESCHREIBE;en;DESCRIBE
BETEN;en;PRAY
BETRETEN;en;ENTER
BEWACHEN;en;GUARD
BIETEN;en;BID
BOTSCHAFT;en;MESSAGE
DEFAULT;en;DEFAULT
EMAIL;en;EMAIL
ENDE;en;END
FAHREN;en;RIDE
FOLGEN;en;FOLLOW
FORSCHEN;en;RESEARCH
GM;en;GM
GRUPPE;en;GROUP
HELFEN;en;HELP
JIHAD;en;JIHAD
KAMPFZAUBER;en;COMBATSPELL
KAUFEN;en;BUY
KONTAKTIEREN;en;CONTACT
KÄMPFEN;en;COMBAT
LEHREN;en;TEACH
LERNEN;en;LEARN
LIEFERE;en;SUPPLY
LOCALE;en;LOCALE
MACHEN;en;MAKE
MAGIEGEBIET;en;SCHOOL
MEINUNG;en;OPINION
NACH;en;MOVE
NEUSTART;en;RESTART
NUMMER;en;NUMBER
OPFERE;en;SACRIFICE
OPTION;en;OPTION
PASSWORT;en;PASSWORD
PFLANZEN;en;PLANT
PIRATERIE;en;PIRACY
PRÄFIX;en;PREFIX
REKRUTIEREN;en;RECRUIT
REPORT;en;REPORT
RESERVIEREN;en;RESERVE
ROUTE;en;ROUTE
SABOTIEREN;en;SABOTAGE
SORTIEREN;en;SORT
SPIONIEREN;en;SPY
STIRB;en;QUIT
SYNONYM;en;SYNONYM
TARNEN;en;HIDE
TRANSPORTIEREN;en;CARRY
TREIBEN;en;TAX
UNTERHALTEN;en;ENTERTAIN
URSPRUNG;en;ORIGIN
VERGESSEN;en;FORGET
VERKAUFEN;en;SELL
VERLASSEN;en;LEAVE
ZAUBERE;en;CAST
ZEIGEN;en;SHOW
ZERSTÖREN;en;DESTROY
ZÜCHTEN;en;GROW
Adler;en;eagle
Drache;en;dragon
Drachen;en;dragons
Dämon;en;demon
Dämonen;en;demons
Einhorn;en;unicorn
Einhörner;en;unicorns
Elf;en;elf
# Elfen;en;elves
Eule;en;owl
Eulen;en;owls
Geist;en;ghost
Geister;en;ghosts
Goblin;en;goblin
Goblins;en;goblins
Halbling;en;halfling
Halblinge;en;halflings
Hirntöter;en;braineater
Insekt;en;insect
Insekten;en;insects
Jungdrache;en;young dragon
Jungdrachen;en;young dragons
Katze;en;cat
Katzen;en;cats
Katzendrache;en;catdragon
Katzendrachen;en;catdragons
Luchs;en;lynx
Luchse;en;lynx
Meermensch;en;aquarian
Meermenschen;en;aquarians
Mensch;en;human
Menschen;en;humans
Ork;en;orc
Orks;en;orc
Riesenschildkröte;en;giant turtle
Riesenschildkröten;en;giant turtles
Schablone;en;template
Schablonen;en;templates
Schattenritter;en;shadow knight
Seeschlange;en;sea serpent
Troll;en;troll
Trolle;en;trolls
Untote;en;undead
Untoter;en;undead
Warg;en;wolf
Warge;en;wolves
Zombie;en;zombie
Zombie_p;en;zombies
Zwerg;en;dwarf
Zwerge;en;dwarves
Kröte;en;toad
Kröten;en;toads
Klon;en;clone
Gnom;en;gnome
Museumsgeist;en;museumghost
Ghast;en;ghast
Ghoul;en;ghoul
Juju-Zombie;en;juju-zombie
Skelettherr;en;skeleton lord
Zentaur;en;centaur
Krake;en;kraken
Delphin;en;dolphin
Tiger;en;tiger
Höllenkatze;en;hellcat
Traumkatze;en;dreamcat
Teufelchen;en;imp
Nymphe;en;nymph
Singdrache;en;songdragon
Ratte;en;rat
Tunnelwurm;en;tunnelworm
Wolf;en;wolf
Bauer;en;peasant
Alp;en;alp
Bergwächter;en;mountainguard
Schattenmeister;en;shadowmaster
Schattendämon;en;shadowdemon
Eisengolem;en;irongolem
Zauber;en;spell
Spezial;en;special
Dracoid;en;dracoid
Ent;en;ent
Wyrm;en;wyrm
Illusion;en;illusion
## NR generieren
nr_options;en;Options
nr_level;en;Level
nr_alliances;en;Political Status
nr_herbsrequired;en;Herbs required
nr_undercons;en;under construction
nr_damaged;en;damage
nr_youaredead;en;Your faction has been eliminated. We hope you had a good time anyways, and encourage you to sign up you for another game.
# TODO: calendar ist noch komplexer
nr_skills;en;skills
nr_inventory;en;has
nr_size;en;size
nr_spells;en;spells
nr_combatspells;en;combat spells
nr_nospells;en;none
nr_addresses;en;Addresses
anonymous;en;anonymous
b_attacke;en;attack
b_defense;en;defense
b_armor;en;armour
b_damage;en;damage
## Testitem
wand;en;wand
wand_p;en;wands
wand_of_tears;en;wand of tears
wand_of_tears_p;en;wands of tears
## Küsten
Nordwestküste;en;northwest coast
Nordostküste;en;northeast coast
Ostküste;en;east coast
Südostküste;en;southeast coast
Südwestküste;en;southwest coast
Westküste;en;west coast
## report newbie info
newbie_info_1;en;Remember to send your orders to eressea@eressea.amber.kn-bremen.de with the subject ERESSEA BEFEHLE.
newbie_info_2;en;If you fail to send in orders for one of the first two turns, your faction will be erased from the game to reduce the number of zombie players in Eressea.
newbie_info_3;en;With the first two turns, you will get a computer report (CR). It can be used with many of the tools on http://eressea-pbem.de/download.html. If you want to continue getting it after the second turn, please make one of your units give the order OPTION COMPUTER.
nr_nmr;en;No orders were received for your faction!

File diff suppressed because it is too large Load diff

View file

@ -14,8 +14,8 @@
<comment>Game specific</comment>
<order name="MEINUNG" disable></order>
<order name="MAGIEGEBIET" disable></order>
<include file="eressea/races.xml"></include>
<include file="eressea/items.xml"></include>
<include file="eressea/de/strings.xml"></include>
</game>
<include file="eressea/races.xml"></include>
<include file="eressea/items.xml"></include>
<include file="eressea/de/strings.xml"></include>
</eressea>

View file

@ -14,7 +14,7 @@
<comment>Game specific</comment>
<order name="MEINUNG" disable></order>
<order name="MAGIEGEBIET" disable></order>
<include file="vinyambar/races.xml"></include>
<include file="vinyambar/de/strings-classic.xml"></include>
</game>
<include file="vinyambar/races.xml"></include>
<include file="vinyambar/de/strings-classic.xml"></include>
</eressea>

View file

@ -15,7 +15,7 @@
<order name="ARBEITEN" disable></order>
<order name="MEINUNG" disable></order>
<order name="MAGIEGEBIET" disable></order>
<include file="vinyambar/races.xml"></include>
<include file="vinyambar/de/strings.xml"></include>
</game>
<include file="vinyambar/races.xml"></include>
<include file="vinyambar/de/strings.xml"></include>
</eressea>