forked from github/server
- fixed the summary.c
- implemented unicode_utf8_strcasecmp function - fixed some xml files - code compiles and runs on the console TODO: * switch from xmlChar to char again * eliminate remaining warnings * report.[hc] are still disabled OPTIONAL: * handle latin1 input?
This commit is contained in:
parent
940d236edc
commit
6acb1e22c5
21 changed files with 550 additions and 535 deletions
|
@ -119,9 +119,6 @@
|
||||||
#define DMRISEHAFEN 0.2F /* weekly chance that demand goes up with harbor */
|
#define DMRISEHAFEN 0.2F /* weekly chance that demand goes up with harbor */
|
||||||
|
|
||||||
|
|
||||||
/* - external symbols ------------------------------------------ */
|
|
||||||
extern int dropouts[2];
|
|
||||||
extern int * age;
|
|
||||||
/* - exported global symbols ----------------------------------- */
|
/* - exported global symbols ----------------------------------- */
|
||||||
boolean nobattle = false;
|
boolean nobattle = false;
|
||||||
boolean nomonsters = false;
|
boolean nomonsters = false;
|
||||||
|
@ -1027,6 +1024,9 @@ quit(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int dropouts[2];
|
||||||
|
int * age = NULL;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
parse_restart(void)
|
parse_restart(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -38,6 +38,9 @@ void update_guards(void);
|
||||||
void processorders(void);
|
void processorders(void);
|
||||||
extern struct attrib_type at_germs;
|
extern struct attrib_type at_germs;
|
||||||
|
|
||||||
|
extern int dropouts[2];
|
||||||
|
extern int * age;
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -101,12 +101,6 @@ extern int *storms;
|
||||||
extern int weeks_per_month;
|
extern int weeks_per_month;
|
||||||
extern int months_per_year;
|
extern int months_per_year;
|
||||||
|
|
||||||
boolean nocr = false;
|
|
||||||
boolean nonr = false;
|
|
||||||
boolean nosh = false;
|
|
||||||
boolean nomer = false;
|
|
||||||
boolean noreports = false;
|
|
||||||
|
|
||||||
static size_t
|
static size_t
|
||||||
strxcpy(char * dst, const char * src) {
|
strxcpy(char * dst, const char * src) {
|
||||||
size_t s = 0;
|
size_t s = 0;
|
||||||
|
@ -132,21 +126,6 @@ gamedate_season(const struct locale * lang)
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *
|
|
||||||
gamedate2(const struct locale * lang)
|
|
||||||
{
|
|
||||||
static char buf[256];
|
|
||||||
gamedate gd;
|
|
||||||
|
|
||||||
get_gamedate(turn, &gd);
|
|
||||||
sprintf(buf, "in %s des Monats %s im Jahre %d %s.",
|
|
||||||
LOC(lang, weeknames2[gd.week]),
|
|
||||||
LOC(lang, monthnames[gd.month]),
|
|
||||||
gd.year,
|
|
||||||
LOC(lang, agename));
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
rpc(FILE * F, char c, size_t num)
|
rpc(FILE * F, char c, size_t num)
|
||||||
{
|
{
|
||||||
|
@ -2187,26 +2166,6 @@ struct fsee {
|
||||||
#define REPORT_ZIP (1 << O_COMPRESS)
|
#define REPORT_ZIP (1 << O_COMPRESS)
|
||||||
#define REPORT_BZIP2 (1 << O_BZIP2)
|
#define REPORT_BZIP2 (1 << O_BZIP2)
|
||||||
|
|
||||||
int
|
|
||||||
init_reports(void)
|
|
||||||
{
|
|
||||||
update_intervals();
|
|
||||||
|
|
||||||
#ifdef HAVE_STAT
|
|
||||||
{
|
|
||||||
stat_type st;
|
|
||||||
if (stat(reportpath(), &st)==0) return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (makedir(reportpath(), 0700)!=0) {
|
|
||||||
if (errno!=EEXIST) {
|
|
||||||
perror("could not create reportpath");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
unit *
|
unit *
|
||||||
can_find(faction * f, faction * f2)
|
can_find(faction * f, faction * f2)
|
||||||
|
@ -2284,166 +2243,6 @@ kann_finden(faction * f1, faction * f2)
|
||||||
return (boolean)(can_find(f1, f2)!=NULL);
|
return (boolean)(can_find(f1, f2)!=NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/******* summary *******/
|
|
||||||
int dropouts[2];
|
|
||||||
int * age = NULL;
|
|
||||||
|
|
||||||
typedef struct summary {
|
|
||||||
int waffen;
|
|
||||||
int factions;
|
|
||||||
int ruestungen;
|
|
||||||
int schiffe;
|
|
||||||
int gebaeude;
|
|
||||||
int maxskill;
|
|
||||||
int heroes;
|
|
||||||
int inhabitedregions;
|
|
||||||
int peasants;
|
|
||||||
int nunits;
|
|
||||||
int playerpop;
|
|
||||||
double playermoney;
|
|
||||||
double peasantmoney;
|
|
||||||
int armed_men;
|
|
||||||
int poprace[MAXRACES];
|
|
||||||
int factionrace[MAXRACES];
|
|
||||||
int landregionen;
|
|
||||||
int regionen_mit_spielern;
|
|
||||||
int landregionen_mit_spielern;
|
|
||||||
int orkifizierte_regionen;
|
|
||||||
int inactive_volcanos;
|
|
||||||
int active_volcanos;
|
|
||||||
int spielerpferde;
|
|
||||||
int pferde;
|
|
||||||
struct language {
|
|
||||||
struct language * next;
|
|
||||||
int number;
|
|
||||||
const struct locale * locale;
|
|
||||||
} * languages;
|
|
||||||
} summary;
|
|
||||||
|
|
||||||
summary *
|
|
||||||
make_summary(void)
|
|
||||||
{
|
|
||||||
faction *f;
|
|
||||||
region *r;
|
|
||||||
unit *u;
|
|
||||||
summary * s = calloc(1, sizeof(summary));
|
|
||||||
|
|
||||||
for (f = factions; f; f = f->next) {
|
|
||||||
const struct locale * lang = f->locale;
|
|
||||||
struct language * plang = s->languages;
|
|
||||||
while (plang && plang->locale != lang) plang=plang->next;
|
|
||||||
if (!plang) {
|
|
||||||
plang = calloc(sizeof(struct language), 1);
|
|
||||||
plang->next = s->languages;
|
|
||||||
s->languages = plang;
|
|
||||||
plang->locale = lang;
|
|
||||||
}
|
|
||||||
++plang->number;
|
|
||||||
f->nregions = 0;
|
|
||||||
f->num_total = 0;
|
|
||||||
f->money = 0;
|
|
||||||
if (f->alive && f->units) {
|
|
||||||
s->factions++;
|
|
||||||
/* Problem mit Monsterpartei ... */
|
|
||||||
if (f->no!=MONSTER_FACTION) {
|
|
||||||
s->factionrace[old_race(f->race)]++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Alles zählen */
|
|
||||||
|
|
||||||
for (r = regions; r; r = r->next) {
|
|
||||||
s->pferde += rhorses(r);
|
|
||||||
s->schiffe += listlen(r->ships);
|
|
||||||
s->gebaeude += listlen(r->buildings);
|
|
||||||
if (!fval(r->terrain, SEA_REGION)) {
|
|
||||||
s->landregionen++;
|
|
||||||
if (r->units) {
|
|
||||||
s->landregionen_mit_spielern++;
|
|
||||||
}
|
|
||||||
if (fval(r, RF_ORCIFIED)) {
|
|
||||||
s->orkifizierte_regionen++;
|
|
||||||
}
|
|
||||||
if (rterrain(r) == T_VOLCANO) {
|
|
||||||
s->inactive_volcanos++;
|
|
||||||
} else if(rterrain(r) == T_VOLCANO_SMOKING) {
|
|
||||||
s->active_volcanos++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (r->units) {
|
|
||||||
s->regionen_mit_spielern++;
|
|
||||||
}
|
|
||||||
if (rpeasants(r) || r->units) {
|
|
||||||
s->inhabitedregions++;
|
|
||||||
s->peasants += rpeasants(r);
|
|
||||||
s->peasantmoney += rmoney(r);
|
|
||||||
|
|
||||||
/* Einheiten Info. nregions darf nur einmal pro Partei
|
|
||||||
* incrementiert werden. */
|
|
||||||
|
|
||||||
for (u = r->units; u; u = u->next) freset(u->faction, FFL_SELECT);
|
|
||||||
for (u = r->units; u; u = u->next) {
|
|
||||||
f = u->faction;
|
|
||||||
if (u->faction->no != MONSTER_FACTION) {
|
|
||||||
skill * sv;
|
|
||||||
item * itm;
|
|
||||||
|
|
||||||
s->nunits++;
|
|
||||||
s->playerpop += u->number;
|
|
||||||
if (u->flags & UFL_HERO) {
|
|
||||||
s->heroes += u->number;
|
|
||||||
}
|
|
||||||
s->spielerpferde += get_item(u, I_HORSE);
|
|
||||||
s->playermoney += get_money(u);
|
|
||||||
s->armed_men += armedmen(u);
|
|
||||||
for (itm=u->items;itm;itm=itm->next) {
|
|
||||||
if (itm->type->rtype->wtype) {
|
|
||||||
s->waffen += itm->number;
|
|
||||||
}
|
|
||||||
if (itm->type->rtype->atype) {
|
|
||||||
s->ruestungen += itm->number;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
s->spielerpferde += get_item(u, I_HORSE);
|
|
||||||
|
|
||||||
for (sv = u->skills; sv != u->skills + u->skill_size; ++sv) {
|
|
||||||
skill_t sk = sv->id;
|
|
||||||
int aktskill = eff_skill(u, sk, r);
|
|
||||||
if (aktskill > s->maxskill) s->maxskill = aktskill;
|
|
||||||
}
|
|
||||||
if (!fval(f, FFL_SELECT)) {
|
|
||||||
f->nregions++;
|
|
||||||
fset(f, FFL_SELECT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
f->num_total += u->number;
|
|
||||||
f->money += get_money(u);
|
|
||||||
s->poprace[old_race(u->race)] += u->number;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return s;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *
|
|
||||||
pcomp(double i, double j)
|
|
||||||
{
|
|
||||||
sprintf(buf, "%.0f (%s%.0f)", i, (i>=j)?"+":"", i-j);
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *
|
|
||||||
rcomp(int i, int j)
|
|
||||||
{
|
|
||||||
sprintf(buf, "%d (%s%d,%s%d%%)",
|
|
||||||
i, (i>=j)?"+":"", i-j, (i>=j)?"+":"",j?((i-j)*100)/j:0);
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
writemonument(void)
|
writemonument(void)
|
||||||
{
|
{
|
||||||
|
@ -2525,204 +2324,6 @@ writemonument(void)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
writeturn(void)
|
|
||||||
{
|
|
||||||
char zText[MAX_PATH];
|
|
||||||
FILE *f;
|
|
||||||
|
|
||||||
sprintf(zText, "%s/datum", basepath());
|
|
||||||
f = cfopen(zText, "w");
|
|
||||||
if (!f) return;
|
|
||||||
fputs(gamedate2(default_locale), f);
|
|
||||||
fclose(f);
|
|
||||||
sprintf(zText, "%s/turn", basepath());
|
|
||||||
f = cfopen(zText, "w");
|
|
||||||
if (!f) return;
|
|
||||||
fprintf(f, "%d\n", turn);
|
|
||||||
fclose(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
out_faction(FILE *file, faction *f)
|
|
||||||
{
|
|
||||||
if (alliances!=NULL) {
|
|
||||||
fprintf(file, "%s (%s/%d) (%.3s/%.3s), %d Einh., %d Pers., $%d, %d NMR\n",
|
|
||||||
f->name, itoa36(f->no), f->alliance?f->alliance->id:0,
|
|
||||||
LOC(default_locale, rc_name(f->race, 0)), magietypen[f->magiegebiet],
|
|
||||||
f->no_units, f->num_total, f->money, turn - f->lastorders);
|
|
||||||
} else {
|
|
||||||
fprintf(file, "%s (%.3s/%.3s), %d Einh., %d Pers., $%d, %d NMR\n",
|
|
||||||
factionname(f), LOC(default_locale, rc_name(f->race, 0)),
|
|
||||||
magietypen[f->magiegebiet], f->no_units, f->num_total, f->money,
|
|
||||||
turn - f->lastorders);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
report_summary(summary * s, summary * o, boolean full)
|
|
||||||
{
|
|
||||||
FILE * F = NULL;
|
|
||||||
int i, newplayers = 0;
|
|
||||||
faction * f;
|
|
||||||
char zText[MAX_PATH];
|
|
||||||
|
|
||||||
if (full) {
|
|
||||||
sprintf(zText, "%s/parteien.full", basepath());
|
|
||||||
} else {
|
|
||||||
sprintf(zText, "%s/parteien", basepath());
|
|
||||||
}
|
|
||||||
F = cfopen(zText, "w");
|
|
||||||
if (!F) return;
|
|
||||||
printf("Schreibe Zusammenfassung (parteien)...\n");
|
|
||||||
fprintf(F, "%s\n%s\n\n", global.gamename, gamedate2(default_locale));
|
|
||||||
fprintf(F, "Auswertung Nr: %d\n\n", turn);
|
|
||||||
fprintf(F, "Parteien: %s\n", pcomp(s->factions, o->factions));
|
|
||||||
fprintf(F, "Einheiten: %s\n", pcomp(s->nunits, o->nunits));
|
|
||||||
fprintf(F, "Spielerpopulation: %s\n",
|
|
||||||
pcomp(s->playerpop, o->playerpop));
|
|
||||||
fprintf(F, " davon bewaffnet: %s\n",
|
|
||||||
pcomp(s->armed_men, o->armed_men));
|
|
||||||
#ifdef HEROES
|
|
||||||
fprintf(F, " Helden: %s\n", pcomp(s->heroes, o->heroes));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (full) {
|
|
||||||
fprintf(F, "Regionen: %d\n", listlen(regions));
|
|
||||||
fprintf(F, "Bewohnte Regionen: %d\n", s->inhabitedregions);
|
|
||||||
fprintf(F, "Landregionen: %d\n", s->landregionen);
|
|
||||||
fprintf(F, "Spielerregionen: %d\n", s->regionen_mit_spielern);
|
|
||||||
fprintf(F, "Landspielerregionen: %d\n", s->landregionen_mit_spielern);
|
|
||||||
fprintf(F, "Orkifizierte Regionen: %d\n", s->orkifizierte_regionen);
|
|
||||||
fprintf(F, "Inaktive Vulkane: %d\n", s->inactive_volcanos);
|
|
||||||
fprintf(F, "Aktive Vulkane: %d\n\n", s->active_volcanos);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < MAXRACES; i++) {
|
|
||||||
const race * rc = new_race[i];
|
|
||||||
if (s->factionrace[i] && rc && playerrace(rc)
|
|
||||||
&& i != RC_TEMPLATE && i != RC_CLONE) {
|
|
||||||
fprintf(F, "%14svölker: %s\n", LOC(default_locale, rc_name(rc, 3)),
|
|
||||||
pcomp(s->factionrace[i], o->factionrace[i]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(full) {
|
|
||||||
fprintf(F, "\n");
|
|
||||||
{
|
|
||||||
struct language * plang = s->languages;
|
|
||||||
while (plang!=NULL) {
|
|
||||||
struct language * olang = o->languages;
|
|
||||||
int nold = 0;
|
|
||||||
while (olang && olang->locale!=plang->locale) olang=olang->next;
|
|
||||||
if (olang) nold = olang->number;
|
|
||||||
fprintf(F, "Sprache %12s: %s\n", locale_name(plang->locale),
|
|
||||||
rcomp(plang->number, nold));
|
|
||||||
plang=plang->next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(F, "\n");
|
|
||||||
if (full) {
|
|
||||||
for (i = 0; i < MAXRACES; i++) {
|
|
||||||
const race * rc = new_race[i];
|
|
||||||
if (s->poprace[i]) {
|
|
||||||
fprintf(F, "%20s: %s\n", LOC(default_locale, rc_name(rc, 1)),
|
|
||||||
rcomp(s->poprace[i], o->poprace[i]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (i = 0; i < MAXRACES; i++) {
|
|
||||||
const race * rc = new_race[i];
|
|
||||||
if (s->poprace[i] && playerrace(rc)
|
|
||||||
&& i != RC_TEMPLATE && i != RC_CLONE) {
|
|
||||||
fprintf(F, "%20s: %s\n", LOC(default_locale, rc_name(rc, 1)),
|
|
||||||
rcomp(s->poprace[i], o->poprace[i]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (full) {
|
|
||||||
fprintf(F, "\nWaffen: %s\n", pcomp(s->waffen,o->waffen));
|
|
||||||
fprintf(F, "Rüstungen: %s\n",
|
|
||||||
pcomp(s->ruestungen,o->ruestungen));
|
|
||||||
fprintf(F, "ungezähmte Pferde: %s\n", pcomp(s->pferde, o->pferde));
|
|
||||||
fprintf(F, "gezähmte Pferde: %s\n",
|
|
||||||
pcomp(s->spielerpferde,o->spielerpferde));
|
|
||||||
fprintf(F, "Schiffe: %s\n", pcomp(s->schiffe, o->schiffe));
|
|
||||||
fprintf(F, "Gebäude: %s\n", pcomp(s->gebaeude, o->gebaeude));
|
|
||||||
|
|
||||||
fprintf(F, "\nBauernpopulation: %s\n", pcomp(s->peasants,o->peasants));
|
|
||||||
|
|
||||||
fprintf(F, "Population gesamt: %d\n\n", s->playerpop+s->peasants);
|
|
||||||
|
|
||||||
fprintf(F, "Reichtum Spieler: %s Silber\n",
|
|
||||||
pcomp(s->playermoney,o->playermoney));
|
|
||||||
fprintf(F, "Reichtum Bauern: %s Silber\n",
|
|
||||||
pcomp(s->peasantmoney, o->peasantmoney));
|
|
||||||
fprintf(F, "Reichtum gesamt: %s Silber\n\n",
|
|
||||||
pcomp(s->playermoney+s->peasantmoney, o->playermoney+o->peasantmoney));
|
|
||||||
}
|
|
||||||
|
|
||||||
fprintf(F, "\n\n");
|
|
||||||
|
|
||||||
newplayers = update_nmrs();
|
|
||||||
|
|
||||||
for (i = 0; i <= NMRTimeout(); ++i) {
|
|
||||||
if (i == NMRTimeout()) {
|
|
||||||
fprintf(F, "+ NMR:\t\t %d\n", nmrs[i]);
|
|
||||||
} else {
|
|
||||||
fprintf(F, "%d NMR:\t\t %d\n", i, nmrs[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (age) {
|
|
||||||
if (age[2] != 0) {
|
|
||||||
fprintf(F, "Erstabgaben:\t %d%%\n", 100 - (dropouts[0] * 100 / age[2]));
|
|
||||||
}
|
|
||||||
if (age[3] != 0) {
|
|
||||||
fprintf(F, "Zweitabgaben:\t %d%%\n", 100 - (dropouts[1] * 100 / age[3]));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fprintf(F, "Neue Spieler:\t %d\n", newplayers);
|
|
||||||
|
|
||||||
if (full) {
|
|
||||||
if (factions)
|
|
||||||
fprintf(F, "\nParteien:\n\n");
|
|
||||||
|
|
||||||
for (f = factions; f; f = f->next) {
|
|
||||||
out_faction(F, f);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (NMRTimeout() && full) {
|
|
||||||
fprintf(F, "\n\nFactions with NMRs:\n");
|
|
||||||
for (i = NMRTimeout(); i > 0; --i) {
|
|
||||||
for(f=factions; f; f=f->next) {
|
|
||||||
if(i == NMRTimeout()) {
|
|
||||||
if(turn - f->lastorders >= i) {
|
|
||||||
out_faction(F, f);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if(turn - f->lastorders == i) {
|
|
||||||
out_faction(F, f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fclose(F);
|
|
||||||
|
|
||||||
if (full) {
|
|
||||||
printf("writing date & turn\n");
|
|
||||||
writeturn();
|
|
||||||
|
|
||||||
writemonument();
|
|
||||||
}
|
|
||||||
free(nmrs);
|
|
||||||
nmrs = NULL;
|
|
||||||
}
|
|
||||||
/******* end summary ******/
|
/******* end summary ******/
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -18,10 +18,6 @@ extern "C" {
|
||||||
extern void report_init(void);
|
extern void report_init(void);
|
||||||
extern void report_cleanup(void);
|
extern void report_cleanup(void);
|
||||||
|
|
||||||
struct summary;
|
|
||||||
extern void report_summary(struct summary * n, struct summary * o, boolean full);
|
|
||||||
extern struct summary * make_summary(void);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -2,14 +2,20 @@
|
||||||
* +-------------------+ Christian Schlittchen <corwin@amber.kn-bremen.de>
|
* +-------------------+ Christian Schlittchen <corwin@amber.kn-bremen.de>
|
||||||
* | | Enno Rehling <enno@eressea.de>
|
* | | Enno Rehling <enno@eressea.de>
|
||||||
* | Eressea PBEM host | Katja Zedel <katze@felidae.kn-bremen.de>
|
* | Eressea PBEM host | Katja Zedel <katze@felidae.kn-bremen.de>
|
||||||
* | (c) 1998 - 2005 |
|
* | (c) 1998 - 2007 |
|
||||||
* | | 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.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef GC_SPELLS_H
|
#ifndef GC_SPELLS_H
|
||||||
#define GC_SPELLS_H
|
#define GC_SPELLS_H
|
||||||
|
#ifdef __cplusplus
|
||||||
extern void register_gcspells(void);
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern void register_gcspells(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
407
src/common/gamecode/summary.c
Normal file
407
src/common/gamecode/summary.c
Normal file
|
@ -0,0 +1,407 @@
|
||||||
|
/* vi: set ts=2:
|
||||||
|
* +-------------------+ Christian Schlittchen <corwin@amber.kn-bremen.de>
|
||||||
|
* | | Enno Rehling <enno@eressea.de>
|
||||||
|
* | Eressea PBEM host | Katja Zedel <katze@felidae.kn-bremen.de>
|
||||||
|
* | (c) 1998 - 2007 |
|
||||||
|
* | | This program may not be used, modified or distributed
|
||||||
|
* +-------------------+ without prior permission by the authors of Eressea.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* wenn config.h nicht vor curses included wird, kompiliert es unter windows nicht */
|
||||||
|
#include <config.h>
|
||||||
|
#include <eressea.h>
|
||||||
|
|
||||||
|
#include "summary.h"
|
||||||
|
|
||||||
|
#include "laws.h"
|
||||||
|
|
||||||
|
#include <kernel/alliance.h>
|
||||||
|
#include <kernel/calendar.h>
|
||||||
|
#include <kernel/faction.h>
|
||||||
|
#include <kernel/item.h>
|
||||||
|
#include <kernel/race.h>
|
||||||
|
#include <kernel/region.h>
|
||||||
|
#include <kernel/reports.h>
|
||||||
|
#include <kernel/save.h>
|
||||||
|
#include <kernel/skill.h>
|
||||||
|
#include <kernel/terrain.h>
|
||||||
|
#include <kernel/terrainid.h>
|
||||||
|
#include <kernel/unit.h>
|
||||||
|
|
||||||
|
#include <util/base36.h>
|
||||||
|
#include <util/language.h>
|
||||||
|
#include <util/lists.h>
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
typedef struct summary {
|
||||||
|
int waffen;
|
||||||
|
int factions;
|
||||||
|
int ruestungen;
|
||||||
|
int schiffe;
|
||||||
|
int gebaeude;
|
||||||
|
int maxskill;
|
||||||
|
int heroes;
|
||||||
|
int inhabitedregions;
|
||||||
|
int peasants;
|
||||||
|
int nunits;
|
||||||
|
int playerpop;
|
||||||
|
double playermoney;
|
||||||
|
double peasantmoney;
|
||||||
|
int armed_men;
|
||||||
|
int poprace[MAXRACES];
|
||||||
|
int factionrace[MAXRACES];
|
||||||
|
int landregionen;
|
||||||
|
int regionen_mit_spielern;
|
||||||
|
int landregionen_mit_spielern;
|
||||||
|
int orkifizierte_regionen;
|
||||||
|
int inactive_volcanos;
|
||||||
|
int active_volcanos;
|
||||||
|
int spielerpferde;
|
||||||
|
int pferde;
|
||||||
|
struct language {
|
||||||
|
struct language * next;
|
||||||
|
int number;
|
||||||
|
const struct locale * locale;
|
||||||
|
} * languages;
|
||||||
|
} summary;
|
||||||
|
|
||||||
|
static char *
|
||||||
|
pcomp(double i, double j)
|
||||||
|
{
|
||||||
|
static char buf[32];
|
||||||
|
sprintf(buf, "%.0f (%s%.0f)", i, (i>=j)?"+":"", i-j);
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
rcomp(int i, int j)
|
||||||
|
{
|
||||||
|
static char buf[32];
|
||||||
|
sprintf(buf, "%d (%s%d,%s%d%%)",
|
||||||
|
i, (i>=j)?"+":"", i-j, (i>=j)?"+":"",j?((i-j)*100)/j:0);
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void
|
||||||
|
out_faction(FILE *file, const struct faction *f)
|
||||||
|
{
|
||||||
|
if (alliances!=NULL) {
|
||||||
|
fprintf(file, "%s (%s/%d) (%.3s/%.3s), %d Einh., %d Pers., $%d, %d NMR\n",
|
||||||
|
f->name, itoa36(f->no), f->alliance?f->alliance->id:0,
|
||||||
|
LOC(default_locale, rc_name(f->race, 0)), magietypen[f->magiegebiet],
|
||||||
|
f->no_units, f->num_total, f->money, turn - f->lastorders);
|
||||||
|
} else {
|
||||||
|
fprintf(file, "%s (%.3s/%.3s), %d Einh., %d Pers., $%d, %d NMR\n",
|
||||||
|
factionname(f), LOC(default_locale, rc_name(f->race, 0)),
|
||||||
|
magietypen[f->magiegebiet], f->no_units, f->num_total, f->money,
|
||||||
|
turn - f->lastorders);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
gamedate2(const struct locale * lang)
|
||||||
|
{
|
||||||
|
static char buf[256];
|
||||||
|
gamedate gd;
|
||||||
|
|
||||||
|
get_gamedate(turn, &gd);
|
||||||
|
sprintf(buf, "in %s des Monats %s im Jahre %d %s.",
|
||||||
|
LOC(lang, weeknames2[gd.week]),
|
||||||
|
LOC(lang, monthnames[gd.month]),
|
||||||
|
gd.year,
|
||||||
|
LOC(lang, agename));
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
writeturn(void)
|
||||||
|
{
|
||||||
|
char zText[MAX_PATH];
|
||||||
|
FILE *f;
|
||||||
|
|
||||||
|
sprintf(zText, "%s/datum", basepath());
|
||||||
|
f = cfopen(zText, "w");
|
||||||
|
if (!f) return;
|
||||||
|
fputs(gamedate2(default_locale), f);
|
||||||
|
fclose(f);
|
||||||
|
sprintf(zText, "%s/turn", basepath());
|
||||||
|
f = cfopen(zText, "w");
|
||||||
|
if (!f) return;
|
||||||
|
fprintf(f, "%d\n", turn);
|
||||||
|
fclose(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
report_summary(summary * s, summary * o, boolean full)
|
||||||
|
{
|
||||||
|
FILE * F = NULL;
|
||||||
|
int i, newplayers = 0;
|
||||||
|
faction * f;
|
||||||
|
char zText[MAX_PATH];
|
||||||
|
|
||||||
|
if (full) {
|
||||||
|
sprintf(zText, "%s/parteien.full", basepath());
|
||||||
|
} else {
|
||||||
|
sprintf(zText, "%s/parteien", basepath());
|
||||||
|
}
|
||||||
|
F = cfopen(zText, "w");
|
||||||
|
if (!F) return;
|
||||||
|
printf("Schreibe Zusammenfassung (parteien)...\n");
|
||||||
|
fprintf(F, "%s\n%s\n\n", global.gamename, gamedate2(default_locale));
|
||||||
|
fprintf(F, "Auswertung Nr: %d\n\n", turn);
|
||||||
|
fprintf(F, "Parteien: %s\n", pcomp(s->factions, o->factions));
|
||||||
|
fprintf(F, "Einheiten: %s\n", pcomp(s->nunits, o->nunits));
|
||||||
|
fprintf(F, "Spielerpopulation: %s\n",
|
||||||
|
pcomp(s->playerpop, o->playerpop));
|
||||||
|
fprintf(F, " davon bewaffnet: %s\n",
|
||||||
|
pcomp(s->armed_men, o->armed_men));
|
||||||
|
#ifdef HEROES
|
||||||
|
fprintf(F, " Helden: %s\n", pcomp(s->heroes, o->heroes));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (full) {
|
||||||
|
fprintf(F, "Regionen: %d\n", listlen(regions));
|
||||||
|
fprintf(F, "Bewohnte Regionen: %d\n", s->inhabitedregions);
|
||||||
|
fprintf(F, "Landregionen: %d\n", s->landregionen);
|
||||||
|
fprintf(F, "Spielerregionen: %d\n", s->regionen_mit_spielern);
|
||||||
|
fprintf(F, "Landspielerregionen: %d\n", s->landregionen_mit_spielern);
|
||||||
|
fprintf(F, "Orkifizierte Regionen: %d\n", s->orkifizierte_regionen);
|
||||||
|
fprintf(F, "Inaktive Vulkane: %d\n", s->inactive_volcanos);
|
||||||
|
fprintf(F, "Aktive Vulkane: %d\n\n", s->active_volcanos);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < MAXRACES; i++) {
|
||||||
|
const race * rc = new_race[i];
|
||||||
|
if (s->factionrace[i] && rc && playerrace(rc)
|
||||||
|
&& i != RC_TEMPLATE && i != RC_CLONE) {
|
||||||
|
fprintf(F, "%14svölker: %s\n", LOC(default_locale, rc_name(rc, 3)),
|
||||||
|
pcomp(s->factionrace[i], o->factionrace[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(full) {
|
||||||
|
fprintf(F, "\n");
|
||||||
|
{
|
||||||
|
struct language * plang = s->languages;
|
||||||
|
while (plang!=NULL) {
|
||||||
|
struct language * olang = o->languages;
|
||||||
|
int nold = 0;
|
||||||
|
while (olang && olang->locale!=plang->locale) olang=olang->next;
|
||||||
|
if (olang) nold = olang->number;
|
||||||
|
fprintf(F, "Sprache %12s: %s\n", locale_name(plang->locale),
|
||||||
|
rcomp(plang->number, nold));
|
||||||
|
plang=plang->next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(F, "\n");
|
||||||
|
if (full) {
|
||||||
|
for (i = 0; i < MAXRACES; i++) {
|
||||||
|
const race * rc = new_race[i];
|
||||||
|
if (s->poprace[i]) {
|
||||||
|
fprintf(F, "%20s: %s\n", LOC(default_locale, rc_name(rc, 1)),
|
||||||
|
rcomp(s->poprace[i], o->poprace[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for (i = 0; i < MAXRACES; i++) {
|
||||||
|
const race * rc = new_race[i];
|
||||||
|
if (s->poprace[i] && playerrace(rc)
|
||||||
|
&& i != RC_TEMPLATE && i != RC_CLONE) {
|
||||||
|
fprintf(F, "%20s: %s\n", LOC(default_locale, rc_name(rc, 1)),
|
||||||
|
rcomp(s->poprace[i], o->poprace[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (full) {
|
||||||
|
fprintf(F, "\nWaffen: %s\n", pcomp(s->waffen,o->waffen));
|
||||||
|
fprintf(F, "Rüstungen: %s\n",
|
||||||
|
pcomp(s->ruestungen,o->ruestungen));
|
||||||
|
fprintf(F, "ungezähmte Pferde: %s\n", pcomp(s->pferde, o->pferde));
|
||||||
|
fprintf(F, "gezähmte Pferde: %s\n",
|
||||||
|
pcomp(s->spielerpferde,o->spielerpferde));
|
||||||
|
fprintf(F, "Schiffe: %s\n", pcomp(s->schiffe, o->schiffe));
|
||||||
|
fprintf(F, "Gebäude: %s\n", pcomp(s->gebaeude, o->gebaeude));
|
||||||
|
|
||||||
|
fprintf(F, "\nBauernpopulation: %s\n", pcomp(s->peasants,o->peasants));
|
||||||
|
|
||||||
|
fprintf(F, "Population gesamt: %d\n\n", s->playerpop+s->peasants);
|
||||||
|
|
||||||
|
fprintf(F, "Reichtum Spieler: %s Silber\n",
|
||||||
|
pcomp(s->playermoney,o->playermoney));
|
||||||
|
fprintf(F, "Reichtum Bauern: %s Silber\n",
|
||||||
|
pcomp(s->peasantmoney, o->peasantmoney));
|
||||||
|
fprintf(F, "Reichtum gesamt: %s Silber\n\n",
|
||||||
|
pcomp(s->playermoney+s->peasantmoney, o->playermoney+o->peasantmoney));
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(F, "\n\n");
|
||||||
|
|
||||||
|
newplayers = update_nmrs();
|
||||||
|
|
||||||
|
for (i = 0; i <= NMRTimeout(); ++i) {
|
||||||
|
if (i == NMRTimeout()) {
|
||||||
|
fprintf(F, "+ NMR:\t\t %d\n", nmrs[i]);
|
||||||
|
} else {
|
||||||
|
fprintf(F, "%d NMR:\t\t %d\n", i, nmrs[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (age) {
|
||||||
|
if (age[2] != 0) {
|
||||||
|
fprintf(F, "Erstabgaben:\t %d%%\n", 100 - (dropouts[0] * 100 / age[2]));
|
||||||
|
}
|
||||||
|
if (age[3] != 0) {
|
||||||
|
fprintf(F, "Zweitabgaben:\t %d%%\n", 100 - (dropouts[1] * 100 / age[3]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fprintf(F, "Neue Spieler:\t %d\n", newplayers);
|
||||||
|
|
||||||
|
if (full) {
|
||||||
|
if (factions)
|
||||||
|
fprintf(F, "\nParteien:\n\n");
|
||||||
|
|
||||||
|
for (f = factions; f; f = f->next) {
|
||||||
|
out_faction(F, f);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NMRTimeout() && full) {
|
||||||
|
fprintf(F, "\n\nFactions with NMRs:\n");
|
||||||
|
for (i = NMRTimeout(); i > 0; --i) {
|
||||||
|
for(f=factions; f; f=f->next) {
|
||||||
|
if(i == NMRTimeout()) {
|
||||||
|
if(turn - f->lastorders >= i) {
|
||||||
|
out_faction(F, f);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(turn - f->lastorders == i) {
|
||||||
|
out_faction(F, f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(F);
|
||||||
|
|
||||||
|
if (full) {
|
||||||
|
printf("writing date & turn\n");
|
||||||
|
writeturn();
|
||||||
|
}
|
||||||
|
free(nmrs);
|
||||||
|
nmrs = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
summary *
|
||||||
|
make_summary(void)
|
||||||
|
{
|
||||||
|
faction *f;
|
||||||
|
region *r;
|
||||||
|
unit *u;
|
||||||
|
summary * s = calloc(1, sizeof(summary));
|
||||||
|
|
||||||
|
for (f = factions; f; f = f->next) {
|
||||||
|
const struct locale * lang = f->locale;
|
||||||
|
struct language * plang = s->languages;
|
||||||
|
while (plang && plang->locale != lang) plang=plang->next;
|
||||||
|
if (!plang) {
|
||||||
|
plang = calloc(sizeof(struct language), 1);
|
||||||
|
plang->next = s->languages;
|
||||||
|
s->languages = plang;
|
||||||
|
plang->locale = lang;
|
||||||
|
}
|
||||||
|
++plang->number;
|
||||||
|
f->nregions = 0;
|
||||||
|
f->num_total = 0;
|
||||||
|
f->money = 0;
|
||||||
|
if (f->alive && f->units) {
|
||||||
|
s->factions++;
|
||||||
|
/* Problem mit Monsterpartei ... */
|
||||||
|
if (f->no!=MONSTER_FACTION) {
|
||||||
|
s->factionrace[old_race(f->race)]++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Alles zählen */
|
||||||
|
|
||||||
|
for (r = regions; r; r = r->next) {
|
||||||
|
s->pferde += rhorses(r);
|
||||||
|
s->schiffe += listlen(r->ships);
|
||||||
|
s->gebaeude += listlen(r->buildings);
|
||||||
|
if (!fval(r->terrain, SEA_REGION)) {
|
||||||
|
s->landregionen++;
|
||||||
|
if (r->units) {
|
||||||
|
s->landregionen_mit_spielern++;
|
||||||
|
}
|
||||||
|
if (fval(r, RF_ORCIFIED)) {
|
||||||
|
s->orkifizierte_regionen++;
|
||||||
|
}
|
||||||
|
if (rterrain(r) == T_VOLCANO) {
|
||||||
|
s->inactive_volcanos++;
|
||||||
|
} else if(rterrain(r) == T_VOLCANO_SMOKING) {
|
||||||
|
s->active_volcanos++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (r->units) {
|
||||||
|
s->regionen_mit_spielern++;
|
||||||
|
}
|
||||||
|
if (rpeasants(r) || r->units) {
|
||||||
|
s->inhabitedregions++;
|
||||||
|
s->peasants += rpeasants(r);
|
||||||
|
s->peasantmoney += rmoney(r);
|
||||||
|
|
||||||
|
/* Einheiten Info. nregions darf nur einmal pro Partei
|
||||||
|
* incrementiert werden. */
|
||||||
|
|
||||||
|
for (u = r->units; u; u = u->next) freset(u->faction, FFL_SELECT);
|
||||||
|
for (u = r->units; u; u = u->next) {
|
||||||
|
f = u->faction;
|
||||||
|
if (u->faction->no != MONSTER_FACTION) {
|
||||||
|
skill * sv;
|
||||||
|
item * itm;
|
||||||
|
|
||||||
|
s->nunits++;
|
||||||
|
s->playerpop += u->number;
|
||||||
|
if (u->flags & UFL_HERO) {
|
||||||
|
s->heroes += u->number;
|
||||||
|
}
|
||||||
|
s->spielerpferde += get_item(u, I_HORSE);
|
||||||
|
s->playermoney += get_money(u);
|
||||||
|
s->armed_men += armedmen(u);
|
||||||
|
for (itm=u->items;itm;itm=itm->next) {
|
||||||
|
if (itm->type->rtype->wtype) {
|
||||||
|
s->waffen += itm->number;
|
||||||
|
}
|
||||||
|
if (itm->type->rtype->atype) {
|
||||||
|
s->ruestungen += itm->number;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
s->spielerpferde += get_item(u, I_HORSE);
|
||||||
|
|
||||||
|
for (sv = u->skills; sv != u->skills + u->skill_size; ++sv) {
|
||||||
|
skill_t sk = sv->id;
|
||||||
|
int aktskill = eff_skill(u, sk, r);
|
||||||
|
if (aktskill > s->maxskill) s->maxskill = aktskill;
|
||||||
|
}
|
||||||
|
if (!fval(f, FFL_SELECT)) {
|
||||||
|
f->nregions++;
|
||||||
|
fset(f, FFL_SELECT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
f->num_total += u->number;
|
||||||
|
f->money += get_money(u);
|
||||||
|
s->poprace[old_race(u->race)] += u->number;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
25
src/common/gamecode/summary.h
Normal file
25
src/common/gamecode/summary.h
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
/* vi: set ts=2:
|
||||||
|
* +-------------------+ Christian Schlittchen <corwin@amber.kn-bremen.de>
|
||||||
|
* | | Enno Rehling <enno@eressea.de>
|
||||||
|
* | Eressea PBEM host | Katja Zedel <katze@felidae.kn-bremen.de>
|
||||||
|
* | (c) 1998 - 2007 |
|
||||||
|
* | | This program may not be used, modified or distributed
|
||||||
|
* +-------------------+ without prior permission by the authors of Eressea.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef H_GC_SUMMARY
|
||||||
|
#define H_GC_SUMMARY
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct summary;
|
||||||
|
extern void report_summary(struct summary * n, struct summary * o, boolean full);
|
||||||
|
extern struct summary * make_summary(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
|
@ -29,10 +29,12 @@
|
||||||
#include <util/attrib.h>
|
#include <util/attrib.h>
|
||||||
#include <util/base36.h>
|
#include <util/base36.h>
|
||||||
#include <util/resolve.h>
|
#include <util/resolve.h>
|
||||||
|
#include <util/unicode.h>
|
||||||
|
|
||||||
/* libc includes */
|
/* libc includes */
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <wctype.h>
|
||||||
|
|
||||||
#define GMAXHASH 2039
|
#define GMAXHASH 2039
|
||||||
static group * ghash[GMAXHASH];
|
static group * ghash[GMAXHASH];
|
||||||
|
@ -73,7 +75,7 @@ init_group(faction * f, group * g)
|
||||||
static group *
|
static group *
|
||||||
find_groupbyname(group * g, const xmlChar * name)
|
find_groupbyname(group * g, const xmlChar * name)
|
||||||
{
|
{
|
||||||
while (g && xml_strcasecmp(name, g->name)) g = g->next;
|
while (g && unicode_utf8_strcasecmp(name, g->name)!=0) g = g->next;
|
||||||
return g;
|
return g;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -330,13 +330,13 @@ rt_register(resource_type * rtype)
|
||||||
const resource_type *
|
const resource_type *
|
||||||
item2resource(const item_type * itype)
|
item2resource(const item_type * itype)
|
||||||
{
|
{
|
||||||
return itype->rtype;
|
return itype?itype->rtype:NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
const item_type *
|
const item_type *
|
||||||
resource2item(const resource_type * rtype)
|
resource2item(const resource_type * rtype)
|
||||||
{
|
{
|
||||||
return rtype->itype;
|
return rtype?rtype->itype:NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
const weapon_type *
|
const weapon_type *
|
||||||
|
|
|
@ -63,6 +63,10 @@
|
||||||
#include <attributes/racename.h>
|
#include <attributes/racename.h>
|
||||||
#include <attributes/viewrange.h>
|
#include <attributes/viewrange.h>
|
||||||
|
|
||||||
|
boolean nocr = false;
|
||||||
|
boolean nonr = false;
|
||||||
|
boolean noreports = false;
|
||||||
|
|
||||||
const char * g_reportdir;
|
const char * g_reportdir;
|
||||||
const char * visibility[] = {
|
const char * visibility[] = {
|
||||||
"none",
|
"none",
|
||||||
|
@ -1353,11 +1357,7 @@ nmr_warnings(void)
|
||||||
for (fa=factions;fa;fa=fa->next) {
|
for (fa=factions;fa;fa=fa->next) {
|
||||||
if (alliedfaction(NULL, f, fa, FRIEND) && alliedfaction(NULL, fa, f, FRIEND)) {
|
if (alliedfaction(NULL, f, fa, FRIEND) && alliedfaction(NULL, fa, f, FRIEND)) {
|
||||||
if (msg==NULL) {
|
if (msg==NULL) {
|
||||||
char buf[4096];
|
msg = msg_message("warn_dropout", "faction", f);
|
||||||
sprintf(buf, "Achtung: %s hat einige Zeit keine "
|
|
||||||
"Züge eingeschickt und könnte dadurch in Kürze aus dem "
|
|
||||||
"Spiel ausscheiden.", factionname(f));
|
|
||||||
msg = msg_message("msg_event", "string", buf);
|
|
||||||
}
|
}
|
||||||
add_message(&fa->msgs, msg);
|
add_message(&fa->msgs, msg);
|
||||||
}
|
}
|
||||||
|
@ -1443,22 +1443,24 @@ global_report(const char * filename)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void
|
int
|
||||||
writeaddresses(void)
|
init_reports(void)
|
||||||
{
|
{
|
||||||
faction *f;
|
update_intervals();
|
||||||
FILE *F;
|
|
||||||
char zText[MAX_PATH];
|
|
||||||
sprintf(zText, "%s/addresses", basepath());
|
|
||||||
F = cfopen(zText, "w");
|
|
||||||
if (!F) return;
|
|
||||||
|
|
||||||
for (f = factions; f; f = f->next) {
|
#ifdef HAVE_STAT
|
||||||
if (f->no != MONSTER_FACTION && playerrace(f->race)) {
|
{
|
||||||
fprintf(F, "%s:%s:%s\n", factionname(f), f->email, f->banner);
|
stat_type st;
|
||||||
|
if (stat(reportpath(), &st)==0) return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (makedir(reportpath(), 0700)!=0) {
|
||||||
|
if (errno!=EEXIST) {
|
||||||
|
perror("could not create reportpath");
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fclose(F);
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
@ -1478,7 +1480,7 @@ reports(void)
|
||||||
sprintf(path, "%s/reports.txt", reportpath());
|
sprintf(path, "%s/reports.txt", reportpath());
|
||||||
mailit = fopen(path, "w");
|
mailit = fopen(path, "w");
|
||||||
if (mailit == NULL) {
|
if (mailit == NULL) {
|
||||||
log_error(("%s konnte nicht geöffnet werden!\n", path));
|
log_error(("%s could not be opened!\n", path));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (f = factions; f; f = f->next) {
|
for (f = factions; f; f = f->next) {
|
||||||
|
@ -1557,7 +1559,7 @@ static variant
|
||||||
var_copy_regions(variant x)
|
var_copy_regions(variant x)
|
||||||
{
|
{
|
||||||
region_list * rsrc;
|
region_list * rsrc;
|
||||||
size_t size = 0;
|
int size = 0;
|
||||||
|
|
||||||
for (rsrc = (region_list*)x.v; rsrc!=NULL; rsrc=rsrc->next) {
|
for (rsrc = (region_list*)x.v; rsrc!=NULL; rsrc=rsrc->next) {
|
||||||
++size;
|
++size;
|
||||||
|
|
|
@ -32,6 +32,9 @@ extern "C" {
|
||||||
|
|
||||||
extern const char *directions[];
|
extern const char *directions[];
|
||||||
extern const char *coasts[];
|
extern const char *coasts[];
|
||||||
|
extern boolean nonr;
|
||||||
|
extern boolean nocr;
|
||||||
|
extern boolean noreports;
|
||||||
|
|
||||||
/* kann_finden speedups */
|
/* kann_finden speedups */
|
||||||
extern boolean kann_finden(struct faction * f1, struct faction * f2);
|
extern boolean kann_finden(struct faction * f1, struct faction * f2);
|
||||||
|
@ -100,7 +103,6 @@ extern int bufunit(const struct faction * f, const struct unit * u, int indent,
|
||||||
extern const char * reportpath(void);
|
extern const char * reportpath(void);
|
||||||
extern const xmlChar * trailinto(const struct region * r, const struct locale * lang);
|
extern const xmlChar * trailinto(const struct region * r, const struct locale * lang);
|
||||||
extern const xmlChar * report_kampfstatus(const struct unit * u, const struct locale * lang);
|
extern const xmlChar * report_kampfstatus(const struct unit * u, const struct locale * lang);
|
||||||
extern void writeaddresses(void);
|
|
||||||
|
|
||||||
extern void reports_init(void);
|
extern void reports_init(void);
|
||||||
|
|
||||||
|
|
|
@ -458,11 +458,14 @@ parse_directions(xmlDocPtr doc)
|
||||||
xpathDirections = xmlXPathEvalExpression(BAD_CAST "/eressea/directions/dir", xpath);
|
xpathDirections = xmlXPathEvalExpression(BAD_CAST "/eressea/directions/dir", xpath);
|
||||||
nsetDirections = xpathDirections->nodesetval;
|
nsetDirections = xpathDirections->nodesetval;
|
||||||
if (nsetDirections!=NULL) {
|
if (nsetDirections!=NULL) {
|
||||||
xmlNodePtr dir = nsetDirections->nodeTab[0];
|
int k;
|
||||||
xmlChar * property = xmlGetProp(dir, BAD_CAST "name");
|
for (k=0;k!=nsetDirections->nodeNr;++k) {
|
||||||
|
xmlNodePtr dir = nsetDirections->nodeTab[k];
|
||||||
|
xmlChar * property = xmlGetProp(dir, BAD_CAST "name");
|
||||||
|
|
||||||
register_special_direction((const char *)property);
|
register_special_direction((const char *)property);
|
||||||
xmlFree(property);
|
xmlFree(property);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
xmlXPathFreeObject(xpathDirections);
|
xmlXPathFreeObject(xpathDirections);
|
||||||
xmlXPathFreeContext(xpath);
|
xmlXPathFreeContext(xpath);
|
||||||
|
|
|
@ -109,7 +109,7 @@ default_spoil(const struct race * rc, int size)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Die Funktionen werden über den hier registrierten Namen in races.xml
|
/* Die Funktionen werden über den hier registrierten Namen in races.xml
|
||||||
* in die jeweilige Rassendefiniton eingebunden */
|
* in die jeweilige Rassendefiniton eingebunden */
|
||||||
void
|
void
|
||||||
register_races(void)
|
register_races(void)
|
||||||
{
|
{
|
||||||
|
@ -118,8 +118,11 @@ register_races(void)
|
||||||
|
|
||||||
register_function((pf_generic)allowed_dragon, "movedragon");
|
register_function((pf_generic)allowed_dragon, "movedragon");
|
||||||
|
|
||||||
/* function age
|
register_function((pf_generic)allowed_swim, "moveswimming");
|
||||||
* race->age() */
|
register_function((pf_generic)allowed_fly, "moveflying");
|
||||||
|
register_function((pf_generic)allowed_walk, "movewalking");
|
||||||
|
|
||||||
|
/* function age for race->age() */
|
||||||
register_function((pf_generic)age_undead, "ageundead");
|
register_function((pf_generic)age_undead, "ageundead");
|
||||||
register_function((pf_generic)age_illusion, "ageillusion");
|
register_function((pf_generic)age_illusion, "ageillusion");
|
||||||
register_function((pf_generic)age_skeleton, "ageskeleton");
|
register_function((pf_generic)age_skeleton, "ageskeleton");
|
||||||
|
|
|
@ -28,6 +28,7 @@ extern "C" {
|
||||||
*/
|
*/
|
||||||
extern struct border_type bt_chaosgate;
|
extern struct border_type bt_chaosgate;
|
||||||
extern struct border_type bt_firewall;
|
extern struct border_type bt_firewall;
|
||||||
|
|
||||||
typedef struct wall_data {
|
typedef struct wall_data {
|
||||||
struct unit * mage;
|
struct unit * mage;
|
||||||
int force;
|
int force;
|
||||||
|
|
|
@ -13,6 +13,37 @@
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
unicode_utf8_strcasecmp(const xmlChar * a, const xmlChar * b)
|
||||||
|
{
|
||||||
|
while (*a && *b) {
|
||||||
|
int ret;
|
||||||
|
size_t size;
|
||||||
|
wint_t ucsa = *a, ucsb = *b;
|
||||||
|
|
||||||
|
if (ucsa>0x7F) {
|
||||||
|
ret = unicode_utf8_to_ucs4(&ucsa, a, &size);
|
||||||
|
if (ret!=0) return -1;
|
||||||
|
a += size;
|
||||||
|
} else ++a;
|
||||||
|
if (ucsb>0x7F) {
|
||||||
|
ret = unicode_utf8_to_ucs4(&ucsb, b, &size);
|
||||||
|
if (ret!=0) return -1;
|
||||||
|
b += size;
|
||||||
|
} else ++b;
|
||||||
|
|
||||||
|
if (ucsb!=ucsa) {
|
||||||
|
ucsb = towlower(ucsb);
|
||||||
|
ucsa = towlower(ucsa);
|
||||||
|
if (ucsb<ucsa) return 1;
|
||||||
|
if (ucsb>ucsa) return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (*b) return -1;
|
||||||
|
if (*a) return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Convert a UTF-8 encoded character to UCS-4. */
|
/* Convert a UTF-8 encoded character to UCS-4. */
|
||||||
int
|
int
|
||||||
unicode_utf8_to_ucs4(wint_t *ucs4_character, const xmlChar *utf8_string,
|
unicode_utf8_to_ucs4(wint_t *ucs4_character, const xmlChar *utf8_string,
|
||||||
|
|
|
@ -22,6 +22,7 @@ extern "C" {
|
||||||
#include <wchar.h>
|
#include <wchar.h>
|
||||||
#define USE_UNICODE
|
#define USE_UNICODE
|
||||||
extern int unicode_utf8_to_ucs4(wint_t *ucs4_character, const xmlChar *utf8_string, size_t *length);
|
extern int unicode_utf8_to_ucs4(wint_t *ucs4_character, const xmlChar *utf8_string, size_t *length);
|
||||||
|
extern int unicode_utf8_strcasecmp(const xmlChar * a, const xmlChar * b);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include <gamecode/monster.h>
|
#include <gamecode/monster.h>
|
||||||
#include <gamecode/creport.h>
|
#include <gamecode/creport.h>
|
||||||
#include <gamecode/report.h>
|
#include <gamecode/report.h>
|
||||||
|
#include <gamecode/summary.h>
|
||||||
|
|
||||||
#include <spells/spells.h>
|
#include <spells/spells.h>
|
||||||
|
|
||||||
|
@ -65,26 +66,6 @@ lua_planmonsters(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ISLANDSIZE 20
|
|
||||||
#define TURNS_PER_ISLAND 4
|
|
||||||
static void
|
|
||||||
lua_autoseed(const char * filename, bool new_island)
|
|
||||||
{
|
|
||||||
newfaction * players = read_newfactions(filename);
|
|
||||||
if (players!=NULL) {
|
|
||||||
rng_init(players->subscription);
|
|
||||||
while (players) {
|
|
||||||
int n = listlen(players);
|
|
||||||
int k = (n+ISLANDSIZE-1)/ISLANDSIZE;
|
|
||||||
k = n / k;
|
|
||||||
n = autoseed(&players, k, new_island || (turn % TURNS_PER_ISLAND)==0);
|
|
||||||
if (n==0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef LUABIND_NO_EXCEPTIONS
|
#ifdef LUABIND_NO_EXCEPTIONS
|
||||||
static void
|
static void
|
||||||
error_callback(lua_State * L)
|
error_callback(lua_State * L)
|
||||||
|
@ -92,15 +73,6 @@ error_callback(lua_State * L)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int
|
|
||||||
get_direction(const char * name)
|
|
||||||
{
|
|
||||||
for (int i=0;i!=MAXDIRECTIONS;++i) {
|
|
||||||
if (strcasecmp(directions[i], name)==0) return i;
|
|
||||||
}
|
|
||||||
return NODIRECTION;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
lua_writereport(faction * f)
|
lua_writereport(faction * f)
|
||||||
{
|
{
|
||||||
|
@ -115,46 +87,6 @@ lua_writereports(void)
|
||||||
return reports();
|
return reports();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
lua_equipunit(unit& u, const char * eqname)
|
|
||||||
{
|
|
||||||
equip_unit(&u, get_equipment(eqname));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
update_subscriptions(void)
|
|
||||||
{
|
|
||||||
FILE * F;
|
|
||||||
char zText[MAX_PATH];
|
|
||||||
faction * f;
|
|
||||||
strcat(strcpy(zText, basepath()), "/subscriptions");
|
|
||||||
F = fopen(zText, "r");
|
|
||||||
if (F==NULL) {
|
|
||||||
log_info((0, "could not open %s.\n", zText));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (;;) {
|
|
||||||
char zFaction[5];
|
|
||||||
int subscription, fno;
|
|
||||||
if (fscanf(F, "%d %s", &subscription, zFaction)<=0) break;
|
|
||||||
fno = atoi36(zFaction);
|
|
||||||
f = findfaction(fno);
|
|
||||||
if (f!=NULL) {
|
|
||||||
f->subscription=subscription;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
fclose(F);
|
|
||||||
|
|
||||||
sprintf(zText, "subscriptions.%u", turn);
|
|
||||||
F = fopen(zText, "w");
|
|
||||||
for (f=factions;f!=NULL;f=f->next) {
|
|
||||||
fprintf(F, "%s:%u:%s:%s:%s:%u:\n",
|
|
||||||
itoa36(f->no), f->subscription, f->email, f->override,
|
|
||||||
dbrace(f->race), f->lastorders);
|
|
||||||
}
|
|
||||||
fclose(F);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
message_unit(unit& sender, unit& target, const char * str)
|
message_unit(unit& sender, unit& target, const char * str)
|
||||||
{
|
{
|
||||||
|
@ -173,15 +105,6 @@ message_region(unit& sender, const char * str)
|
||||||
ADDMSG(&sender.region->msgs, msg_message("mail_result", "unit message", &sender, str));
|
ADDMSG(&sender.region->msgs, msg_message("mail_result", "unit message", &sender, str));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
lua_learnskill(unit& u, const char * skname, float chances)
|
|
||||||
{
|
|
||||||
skill_t sk = sk_find(skname);
|
|
||||||
if (sk!=NOSKILL) {
|
|
||||||
learn_skill(&u, sk, chances);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
read_game(const char * filename)
|
read_game(const char * filename)
|
||||||
{
|
{
|
||||||
|
@ -218,7 +141,6 @@ write_summary()
|
||||||
summary * sum_end = make_summary();
|
summary * sum_end = make_summary();
|
||||||
report_summary(sum_end, sum_begin, false);
|
report_summary(sum_end, sum_begin, false);
|
||||||
report_summary(sum_end, sum_begin, true);
|
report_summary(sum_end, sum_begin, true);
|
||||||
writeaddresses();
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -136,11 +136,6 @@ extern "C" {
|
||||||
extern const char * g_basedir;
|
extern const char * g_basedir;
|
||||||
extern const char * g_resourcedir;
|
extern const char * g_resourcedir;
|
||||||
|
|
||||||
extern boolean nonr;
|
|
||||||
extern boolean nosh;
|
|
||||||
extern boolean nocr;
|
|
||||||
extern boolean noreports;
|
|
||||||
extern boolean nomer;
|
|
||||||
extern boolean nobattle;
|
extern boolean nobattle;
|
||||||
extern boolean nomonsters;
|
extern boolean nomonsters;
|
||||||
extern boolean battledebug;
|
extern boolean battledebug;
|
||||||
|
@ -436,7 +431,6 @@ usage(const char * prog, const char * arg)
|
||||||
"--debug : schreibt Debug-Ausgaben in die Datei debug\n"
|
"--debug : schreibt Debug-Ausgaben in die Datei debug\n"
|
||||||
"--nocr : keine CRs\n"
|
"--nocr : keine CRs\n"
|
||||||
"--nonr : keine Reports\n"
|
"--nonr : keine Reports\n"
|
||||||
"--nosh : keine Mail-Skripte\n"
|
|
||||||
"--crabsolute : absolute Koordinaten im CR\n"
|
"--crabsolute : absolute Koordinaten im CR\n"
|
||||||
"--help : help\n", prog);
|
"--help : help\n", prog);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -484,7 +478,6 @@ read_args(int argc, char **argv, lua_State * luaState)
|
||||||
else if (strcmp(argv[i]+2, "ignore-errors")==0) g_ignore_errors = true;
|
else if (strcmp(argv[i]+2, "ignore-errors")==0) g_ignore_errors = true;
|
||||||
else if (strcmp(argv[i]+2, "dirtyload")==0) dirtyload = true;
|
else if (strcmp(argv[i]+2, "dirtyload")==0) dirtyload = true;
|
||||||
else if (strcmp(argv[i]+2, "nonr")==0) nonr = true;
|
else if (strcmp(argv[i]+2, "nonr")==0) nonr = true;
|
||||||
else if (strcmp(argv[i]+2, "nosh")==0) nosh = true;
|
|
||||||
else if (strcmp(argv[i]+2, "lomem")==0) lomem = true;
|
else if (strcmp(argv[i]+2, "lomem")==0) lomem = true;
|
||||||
else if (strcmp(argv[i]+2, "nobattle")==0) nobattle = true;
|
else if (strcmp(argv[i]+2, "nobattle")==0) nobattle = true;
|
||||||
else if (strcmp(argv[i]+2, "nomonsters")==0) nomonsters = true;
|
else if (strcmp(argv[i]+2, "nomonsters")==0) nomonsters = true;
|
||||||
|
|
|
@ -1735,7 +1735,6 @@
|
||||||
<arg name="command" type="order"/>
|
<arg name="command" type="order"/>
|
||||||
</type>
|
</type>
|
||||||
<text locale="de">"$unit($unit) in $region($region): '$order($command)' - Der Elementar ist zu klein, um das Gebäude zu tragen."</text>
|
<text locale="de">"$unit($unit) in $region($region): '$order($command)' - Der Elementar ist zu klein, um das Gebäude zu tragen."</text>
|
||||||
</text>
|
|
||||||
</message>
|
</message>
|
||||||
|
|
||||||
<message name="sp_movecastle_fail_1" section="magic">
|
<message name="sp_movecastle_fail_1" section="magic">
|
||||||
|
@ -1746,9 +1745,7 @@
|
||||||
<arg name="direction" type="direction"/>
|
<arg name="direction" type="direction"/>
|
||||||
</type>
|
</type>
|
||||||
<text locale="de">"$unit($unit) in $region($region): '$order($command)' - Der Elementar weigert sich, nach $direction($direction) zu gehen."</text>
|
<text locale="de">"$unit($unit) in $region($region): '$order($command)' - Der Elementar weigert sich, nach $direction($direction) zu gehen."</text>
|
||||||
</text>
|
|
||||||
<text locale="en">"$unit($unit) in $region($region): '$order($command)' - The elemental refuses to go $direction($direction)."</text>
|
<text locale="en">"$unit($unit) in $region($region): '$order($command)' - The elemental refuses to go $direction($direction)."</text>
|
||||||
</text>
|
|
||||||
</message>
|
</message>
|
||||||
|
|
||||||
<message name="sp_migranten_fail1" section="magic">
|
<message name="sp_migranten_fail1" section="magic">
|
||||||
|
@ -7012,6 +7009,8 @@
|
||||||
<arg name="resource" type="resource"/>
|
<arg name="resource" type="resource"/>
|
||||||
<arg name="target" type="unit"/>
|
<arg name="target" type="unit"/>
|
||||||
</type>
|
</type>
|
||||||
|
</message>
|
||||||
|
|
||||||
<message name="give_peasants" section="economy">
|
<message name="give_peasants" section="economy">
|
||||||
<type>
|
<type>
|
||||||
<arg name="unit" type="unit"/>
|
<arg name="unit" type="unit"/>
|
||||||
|
@ -7021,6 +7020,7 @@
|
||||||
<text locale="de">"$unit($unit) übergibt $int($amount) $resource($resource,$amount) an die Bauern."</text>
|
<text locale="de">"$unit($unit) übergibt $int($amount) $resource($resource,$amount) an die Bauern."</text>
|
||||||
<text locale="en">"$unit($unit) gives $int($amount) $resource($resource,$amount) to the local peasants."</text>
|
<text locale="en">"$unit($unit) gives $int($amount) $resource($resource,$amount) to the local peasants."</text>
|
||||||
</message>
|
</message>
|
||||||
|
|
||||||
<message name="maintenance" section="economy">
|
<message name="maintenance" section="economy">
|
||||||
<type>
|
<type>
|
||||||
<arg name="unit" type="unit"/>
|
<arg name="unit" type="unit"/>
|
||||||
|
@ -7471,7 +7471,6 @@
|
||||||
</type>
|
</type>
|
||||||
<text locale="de">"$unit($mage) erschafft in $region($region) eine verheerende Feuersbrunst. $int($amount) Bäume fallen den Flammen zum Opfer."</text>
|
<text locale="de">"$unit($mage) erschafft in $region($region) eine verheerende Feuersbrunst. $int($amount) Bäume fallen den Flammen zum Opfer."</text>
|
||||||
<text locale="de">"$unit($mage) creates a flaming inferno in $region($region). $int($amount) trees fall vistim to the flames."</text>
|
<text locale="de">"$unit($mage) creates a flaming inferno in $region($region). $int($amount) trees fall vistim to the flames."</text>
|
||||||
</text>
|
|
||||||
</message>
|
</message>
|
||||||
|
|
||||||
<message name="recruit_effect" section="magic">
|
<message name="recruit_effect" section="magic">
|
||||||
|
@ -8315,5 +8314,12 @@
|
||||||
</type>
|
</type>
|
||||||
<text locale="de">"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nciht auf Untote gezaubert werden."</text>
|
<text locale="de">"$unit($unit) in $region($region): '$order($command)' - Dieser Zauber kann nciht auf Untote gezaubert werden."</text>
|
||||||
</message>
|
</message>
|
||||||
|
|
||||||
|
<message name="warn_dropout" section="errors">
|
||||||
|
<type>
|
||||||
|
<arg name="faction" type="faction"/>
|
||||||
|
</type>
|
||||||
|
<text locale="de">"Achtung: $faction($faction) hat einige Zeit keine Züge eingeschickt und könnte dadurch in Kürze aus dem Spiel ausscheiden"</text>
|
||||||
|
</message>
|
||||||
|
|
||||||
</messages>
|
</messages>
|
||||||
|
|
|
@ -661,7 +661,7 @@
|
||||||
</race>
|
</race>
|
||||||
<race name="shadowdemon" cansail="no" cansteal="no" canlearn="no" magres="0.750000" maxaura="1.000000" regaura="1.000000" recruitcost="5000" weight="500" capacity="540" speed="1.000000" hp="50" ac="3" damage="2d4" unarmedattack="0" unarmeddefense="0" attackmodifier="8" defensemodifier="11" scarepeasants="yes" walk="yes" teach="no" desert="yes" recruitethereal="yes" nogive="yes">
|
<race name="shadowdemon" cansail="no" cansteal="no" canlearn="no" magres="0.750000" maxaura="1.000000" regaura="1.000000" recruitcost="5000" weight="500" capacity="540" speed="1.000000" hp="50" ac="3" damage="2d4" unarmedattack="0" unarmeddefense="0" attackmodifier="8" defensemodifier="11" scarepeasants="yes" walk="yes" teach="no" desert="yes" recruitethereal="yes" nogive="yes">
|
||||||
<ai splitsize="1000" killpeasants="yes" moverandom="yes" learn="yes"/>
|
<ai splitsize="1000" killpeasants="yes" moverandom="yes" learn="yes"/>
|
||||||
<function name="name" value="nameshadow"/>
|
<function name="name" value="namegeneric"/>
|
||||||
<attack type="4" damage="2d3"/>
|
<attack type="4" damage="2d3"/>
|
||||||
<attack type="3" damage="1d1"/>
|
<attack type="3" damage="1d1"/>
|
||||||
</race>
|
</race>
|
||||||
|
|
|
@ -18,14 +18,24 @@ function write_emails(locales)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function write_addresses()
|
||||||
|
local file
|
||||||
|
local faction
|
||||||
|
|
||||||
|
file = io.open(basepath .. "/adressen", "w")
|
||||||
|
for faction in factions() do
|
||||||
|
-- print(faction.id .. " - " .. faction.locale)
|
||||||
|
file:write(tostring(faction) .. ":" .. faction.email .. ":" .. faction.banner .. "\n")
|
||||||
|
end
|
||||||
|
|
||||||
|
file:close()
|
||||||
|
end
|
||||||
|
|
||||||
function write_aliases()
|
function write_aliases()
|
||||||
local file
|
local file
|
||||||
local key
|
local faction
|
||||||
local locale
|
|
||||||
|
|
||||||
file = io.open(basepath .. "/aliases." .. locale, "w")
|
file = io.open(basepath .. "/aliases." .. locale, "w")
|
||||||
|
|
||||||
local faction
|
|
||||||
for faction in factions() do
|
for faction in factions() do
|
||||||
local unit
|
local unit
|
||||||
file:write("partei-" .. itoa36(faction.id) .. ": " .. faction.email .. "\n")
|
file:write("partei-" .. itoa36(faction.id) .. ": " .. faction.email .. "\n")
|
||||||
|
@ -43,4 +53,5 @@ function write_files(locales)
|
||||||
write_emails(locales)
|
write_emails(locales)
|
||||||
write_aliases()
|
write_aliases()
|
||||||
write_summary()
|
write_summary()
|
||||||
|
write_addresses()
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue