diff --git a/schema.sql b/schema.sql new file mode 100644 index 000000000..f2b88d16e --- /dev/null +++ b/schema.sql @@ -0,0 +1,6 @@ +CREATE TABLE email(id INTEGER PRIMARY KEY, md5 VARCHAR(32) UNIQUE NOT NULL, email VARCHAR(32), bounces INT DEFAULT 0, confirmed TIMESTAMP DEFAULT NULL); +CREATE TABLE faction (id INTEGER PRIMARY KEY, user_id INTEGER REFERENCES user(id), no INTEGER, name VARCHAR(64), game_id INTEGER REFERENCES game(id), race VARCHAR(10), lang CHAR(2)); +CREATE TABLE faction_email (faction_id INTEGER REFERENCES faction(id), email_id INTEGER REFERENCES email(id)); +CREATE TABLE game (id INTEGER PRIMARY KEY, name VARCHAR(20), last_turn INTEGER); +CREATE TABLE score (turn INTEGER, faction_id INTEGER REFERENCES faction(id), value INTEGER, UNIQUE(turn, faction_id)); +CREATE TABLE user(id INTEGER PRIMARY KEY, email_id INTEGER REFERENCES email(id), creation TIMESTAMP DEFAULT CURRENT_TIMESTAMP); diff --git a/src/creport.c b/src/creport.c index f558258f8..ab56ea196 100644 --- a/src/creport.c +++ b/src/creport.c @@ -2,8 +2,8 @@ +-------------------+ Enno Rehling | Eressea PBEM host | Christian Schlittchen | (c) 1998 - 2008 | Katja Zedel -+-------------------+ -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. */ @@ -88,10 +88,10 @@ bool opt_cr_absolute_coords = false; #ifdef TAG_LOCALE static const char *crtag(const char *key) { - static const struct locale *lang = NULL; - if (!lang) - lang = get_locale(TAG_LOCALE); - return locale_string(lang, key); + static const struct locale *lang = NULL; + if (!lang) + lang = get_locale(TAG_LOCALE); + return locale_string(lang, key); } #else #define crtag(x) (x) @@ -100,9 +100,9 @@ static const char *crtag(const char *key) * translation table */ typedef struct translation { - struct translation *next; - char *key; - const char *value; + struct translation *next; + char *key; + const char *value; } translation; #define TRANSMAXHASH 257 @@ -111,355 +111,368 @@ static translation *junkyard; static const char *translate(const char *key, const char *value) { - int kk = ((key[0] << 5) + key[0]) % TRANSMAXHASH; - translation *t = translation_table[kk]; - while (t && strcmp(t->key, key) != 0) - t = t->next; - if (!t) { - if (junkyard) { - t = junkyard; - junkyard = junkyard->next; - } else - t = malloc(sizeof(translation)); - t->key = _strdup(key); - t->value = value; - t->next = translation_table[kk]; - translation_table[kk] = t; - } - return crtag(key); + int kk = ((key[0] << 5) + key[0]) % TRANSMAXHASH; + translation *t = translation_table[kk]; + while (t && strcmp(t->key, key) != 0) + t = t->next; + if (!t) { + if (junkyard) { + t = junkyard; + junkyard = junkyard->next; + } + else + t = malloc(sizeof(translation)); + t->key = _strdup(key); + t->value = value; + t->next = translation_table[kk]; + translation_table[kk] = t; + } + return crtag(key); } static void write_translations(FILE * F) { - int i; - fputs("TRANSLATION\n", F); - for (i = 0; i != TRANSMAXHASH; ++i) { - translation *t = translation_table[i]; - while (t) { - fprintf(F, "\"%s\";%s\n", t->value, crtag(t->key)); - t = t->next; + int i; + fputs("TRANSLATION\n", F); + for (i = 0; i != TRANSMAXHASH; ++i) { + translation *t = translation_table[i]; + while (t) { + fprintf(F, "\"%s\";%s\n", t->value, crtag(t->key)); + t = t->next; + } } - } } static void reset_translations(void) { - int i; - for (i = 0; i != TRANSMAXHASH; ++i) { - translation *t = translation_table[i]; - while (t) { - translation *c = t->next; - free(t->key); - t->next = junkyard; - junkyard = t; - t = c; + int i; + for (i = 0; i != TRANSMAXHASH; ++i) { + translation *t = translation_table[i]; + while (t) { + translation *c = t->next; + free(t->key); + t->next = junkyard; + junkyard = t; + t = c; + } + translation_table[i] = 0; } - translation_table[i] = 0; - } } #include static void print_items(FILE * F, item * items, const struct locale *lang) { - item *itm; + item *itm; - for (itm = items; itm; itm = itm->next) { - int in = itm->number; - const char *ic = resourcename(itm->type->rtype, 0); - if (itm == items) - fputs("GEGENSTAENDE\n", F); - fprintf(F, "%d;%s\n", in, translate(ic, LOC(lang, ic))); - } + for (itm = items; itm; itm = itm->next) { + int in = itm->number; + const char *ic = resourcename(itm->type->rtype, 0); + if (itm == items) + fputs("GEGENSTAENDE\n", F); + fprintf(F, "%d;%s\n", in, translate(ic, LOC(lang, ic))); + } } static void cr_output_curses(FILE * F, const faction * viewer, const void *obj, objtype_t typ) { - bool header = false; - attrib *a = NULL; - int self = 0; - region *r; + bool header = false; + attrib *a = NULL; + int self = 0; + region *r; - /* Die Sichtbarkeit eines Zaubers und die Zaubermeldung sind bei - * Gebäuden und Schiffen je nach, ob man Besitzer ist, verschieden. - * Bei Einheiten sieht man Wirkungen auf eigene Einheiten immer. - * Spezialfälle (besonderes Talent, verursachender Magier usw. werde - * bei jedem curse gesondert behandelt. */ - if (typ == TYP_SHIP) { - ship *sh = (ship *) obj; - unit *owner = ship_owner(sh); - a = sh->attribs; - r = sh->region; - if (owner != NULL) { - if (owner->faction == viewer) { - self = 2; - } else { /* steht eine person der Partei auf dem Schiff? */ - unit *u = NULL; - for (u = r->units; u; u = u->next) { - if (u->ship == sh) { - self = 1; - break; - } + /* Die Sichtbarkeit eines Zaubers und die Zaubermeldung sind bei + * Gebäuden und Schiffen je nach, ob man Besitzer ist, verschieden. + * Bei Einheiten sieht man Wirkungen auf eigene Einheiten immer. + * Spezialfälle (besonderes Talent, verursachender Magier usw. werde + * bei jedem curse gesondert behandelt. */ + if (typ == TYP_SHIP) { + ship *sh = (ship *)obj; + unit *owner = ship_owner(sh); + a = sh->attribs; + r = sh->region; + if (owner != NULL) { + if (owner->faction == viewer) { + self = 2; + } + else { /* steht eine person der Partei auf dem Schiff? */ + unit *u = NULL; + for (u = r->units; u; u = u->next) { + if (u->ship == sh) { + self = 1; + break; + } + } + } } - } } - } else if (typ == TYP_BUILDING) { - building *b = (building *) obj; - unit *owner = building_owner(b); - a = b->attribs; - r = b->region; - if (owner != NULL) { - if (owner->faction == viewer) { - self = 2; - } else { /* steht eine Person der Partei in der Burg? */ - unit *u = NULL; - for (u = r->units; u; u = u->next) { - if (u->building == b) { - self = 1; - break; - } + else if (typ == TYP_BUILDING) { + building *b = (building *)obj; + unit *owner = building_owner(b); + a = b->attribs; + r = b->region; + if (owner != NULL) { + if (owner->faction == viewer) { + self = 2; + } + else { /* steht eine Person der Partei in der Burg? */ + unit *u = NULL; + for (u = r->units; u; u = u->next) { + if (u->building == b) { + self = 1; + break; + } + } + } } - } } - } else if (typ == TYP_UNIT) { - unit *u = (unit *) obj; - a = u->attribs; - r = u->region; - if (u->faction == viewer) { - self = 2; + else if (typ == TYP_UNIT) { + unit *u = (unit *)obj; + a = u->attribs; + r = u->region; + if (u->faction == viewer) { + self = 2; + } + } + else if (typ == TYP_REGION) { + r = (region *)obj; + a = r->attribs; + } + else { + /* fehler */ } - } else if (typ == TYP_REGION) { - r = (region *) obj; - a = r->attribs; - } else { - /* fehler */ - } - while (a) { - if (fval(a->type, ATF_CURSE)) { - curse *c = (curse *) a->data.v; - message *msg; + while (a) { + if (fval(a->type, ATF_CURSE)) { + curse *c = (curse *)a->data.v; + message *msg; - if (c->type->cansee) { - self = c->type->cansee(viewer, obj, typ, c, self); - } - msg = msg_curse(c, obj, typ, self); + if (c->type->cansee) { + self = c->type->cansee(viewer, obj, typ, c, self); + } + msg = msg_curse(c, obj, typ, self); - if (msg) { - char buf[BUFFERSIZE]; - if (!header) { - header = 1; - fputs("EFFECTS\n", F); + if (msg) { + char buf[BUFFERSIZE]; + if (!header) { + header = 1; + fputs("EFFECTS\n", F); + } + nr_render(msg, viewer->locale, buf, sizeof(buf), viewer); + fprintf(F, "\"%s\"\n", buf); + msg_release(msg); + } } - nr_render(msg, viewer->locale, buf, sizeof(buf), viewer); - fprintf(F, "\"%s\"\n", buf); - msg_release(msg); - } - } else if (a->type == &at_effect && self) { - effect_data *data = (effect_data *) a->data.v; - if (data->value > 0) { - const char *key = resourcename(data->type->itype->rtype, 0); - if (!header) { - header = 1; - fputs("EFFECTS\n", F); + else if (a->type == &at_effect && self) { + effect_data *data = (effect_data *)a->data.v; + if (data->value > 0) { + const char *key = resourcename(data->type->itype->rtype, 0); + if (!header) { + header = 1; + fputs("EFFECTS\n", F); + } + fprintf(F, "\"%d %s\"\n", data->value, translate(key, + locale_string(default_locale, key))); + } } - fprintf(F, "\"%d %s\"\n", data->value, translate(key, - locale_string(default_locale, key))); - } + a = a->next; } - a = a->next; - } } static int cr_unit(variant var, char *buffer, const void *userdata) { - unit *u = (unit *) var.v; - sprintf(buffer, "%d", u ? u->no : -1); - return 0; + unit *u = (unit *)var.v; + sprintf(buffer, "%d", u ? u->no : -1); + return 0; } static int cr_ship(variant var, char *buffer, const void *userdata) { - ship *u = (ship *) var.v; - sprintf(buffer, "%d", u ? u->no : -1); - return 0; + ship *u = (ship *)var.v; + sprintf(buffer, "%d", u ? u->no : -1); + return 0; } static int cr_building(variant var, char *buffer, const void *userdata) { - building *u = (building *) var.v; - sprintf(buffer, "%d", u ? u->no : -1); - return 0; + building *u = (building *)var.v; + sprintf(buffer, "%d", u ? u->no : -1); + return 0; } static int cr_faction(variant var, char *buffer, const void *userdata) { - faction *f = (faction *) var.v; - sprintf(buffer, "%d", f ? f->no : -1); - return 0; + faction *f = (faction *)var.v; + sprintf(buffer, "%d", f ? f->no : -1); + return 0; } static int cr_region(variant var, char *buffer, const void *userdata) { - const faction *report = (const faction *)userdata; - region *r = (region *) var.v; - if (r) { - plane *pl = rplane(r); - int nx = r->x, ny = r->y; - pnormalize(&nx, &ny, pl); - adjust_coordinates(report, &nx, &ny, pl, r); - sprintf(buffer, "%d %d %d", nx, ny, plane_id(pl)); - return 0; - } - return -1; + const faction *report = (const faction *)userdata; + region *r = (region *)var.v; + if (r) { + plane *pl = rplane(r); + int nx = r->x, ny = r->y; + pnormalize(&nx, &ny, pl); + adjust_coordinates(report, &nx, &ny, pl, r); + sprintf(buffer, "%d %d %d", nx, ny, plane_id(pl)); + return 0; + } + return -1; } static int cr_resource(variant var, char *buffer, const void *userdata) { - const faction *report = (const faction *)userdata; - const resource_type *r = (const resource_type *)var.v; - if (r) { - const char *key = resourcename(r, 0); - sprintf(buffer, "\"%s\"", - translate(key, locale_string(report->locale, key))); - return 0; - } - return -1; + const faction *report = (const faction *)userdata; + const resource_type *r = (const resource_type *)var.v; + if (r) { + const char *key = resourcename(r, 0); + sprintf(buffer, "\"%s\"", + translate(key, locale_string(report->locale, key))); + return 0; + } + return -1; } static int cr_race(variant var, char *buffer, const void *userdata) { - const faction *report = (const faction *)userdata; - const struct race *rc = (const race *)var.v; - const char *key = rc_name(rc, 0); - sprintf(buffer, "\"%s\"", - translate(key, locale_string(report->locale, key))); - return 0; + const faction *report = (const faction *)userdata; + const struct race *rc = (const race *)var.v; + const char *key = rc_name(rc, 0); + sprintf(buffer, "\"%s\"", + translate(key, locale_string(report->locale, key))); + return 0; } static int cr_alliance(variant var, char *buffer, const void *userdata) { - const alliance *al = (const alliance *)var.v; - if (al != NULL) { - sprintf(buffer, "%d", al->id); - } - unused_arg(userdata); - return 0; + const alliance *al = (const alliance *)var.v; + if (al != NULL) { + sprintf(buffer, "%d", al->id); + } + unused_arg(userdata); + return 0; } static int cr_skill(variant var, char *buffer, const void *userdata) { - const faction *report = (const faction *)userdata; - skill_t sk = (skill_t) var.i; - if (sk != NOSKILL) - sprintf(buffer, "\"%s\"", - translate(mkname("skill", skillnames[sk]), skillname(sk, - report->locale))); - else - strcpy(buffer, "\"\""); - return 0; + const faction *report = (const faction *)userdata; + skill_t sk = (skill_t)var.i; + if (sk != NOSKILL) + sprintf(buffer, "\"%s\"", + translate(mkname("skill", skillnames[sk]), skillname(sk, + report->locale))); + else + strcpy(buffer, "\"\""); + return 0; } static int cr_order(variant var, char *buffer, const void *userdata) { - order *ord = (order *) var.v; - if (ord != NULL) { - char *wp = buffer; - char *cmd = getcommand(ord); - const char *rp = cmd; + order *ord = (order *)var.v; + if (ord != NULL) { + char cmd[ORDERSIZE]; + char *wp = buffer; + const char *rp; - *wp++ = '\"'; - while (*rp) { - switch (*rp) { - case '\"': - case '\\': - *wp++ = '\\'; - default: - *wp++ = *rp++; - } + get_command(ord, cmd, sizeof(cmd)); + + *wp++ = '\"'; + for (rp = cmd; *rp;) { + switch (*rp) { + case '\"': + case '\\': + *wp++ = '\\'; + default: + *wp++ = *rp++; + } + } + *wp++ = '\"'; + *wp++ = 0; + + free(cmd); } - *wp++ = '\"'; - *wp++ = 0; - - free(cmd); - } else - strcpy(buffer, "\"\""); - return 0; + else + strcpy(buffer, "\"\""); + return 0; } static int cr_resources(variant var, char *buffer, const void *userdata) { - faction *f = (faction *) userdata; - resource *rlist = (resource *) var.v; - char *wp = buffer; - if (rlist != NULL) { - const char *name = resourcename(rlist->type, rlist->number != 1); - wp += - sprintf(wp, "\"%d %s", rlist->number, translate(name, LOC(f->locale, - name))); - for (;;) { - rlist = rlist->next; - if (rlist == NULL) - break; - name = resourcename(rlist->type, rlist->number != 1); - wp += - sprintf(wp, ", %d %s", rlist->number, translate(name, - LOC(f->locale, name))); + faction *f = (faction *)userdata; + resource *rlist = (resource *)var.v; + char *wp = buffer; + if (rlist != NULL) { + const char *name = resourcename(rlist->type, rlist->number != 1); + wp += + sprintf(wp, "\"%d %s", rlist->number, translate(name, LOC(f->locale, + name))); + for (;;) { + rlist = rlist->next; + if (rlist == NULL) + break; + name = resourcename(rlist->type, rlist->number != 1); + wp += + sprintf(wp, ", %d %s", rlist->number, translate(name, + LOC(f->locale, name))); + } + strcat(wp, "\""); } - strcat(wp, "\""); - } - return 0; + return 0; } static int cr_regions(variant var, char *buffer, const void *userdata) { - faction *f = (faction *) userdata; - const arg_regions *rdata = (const arg_regions *)var.v; + faction *f = (faction *)userdata; + const arg_regions *rdata = (const arg_regions *)var.v; - if (rdata != NULL && rdata->nregions > 0) { - region *r = rdata->regions[0]; - plane *pl = rplane(r); - int i, z = plane_id(pl); - char *wp = buffer; - int nx = r->x, ny = r->y; + if (rdata != NULL && rdata->nregions > 0) { + region *r = rdata->regions[0]; + plane *pl = rplane(r); + int i, z = plane_id(pl); + char *wp = buffer; + int nx = r->x, ny = r->y; - pnormalize(&nx, &ny, pl); - adjust_coordinates(f, &nx, &ny, pl, r); - wp += sprintf(wp, "\"%d %d %d", nx, ny, z); - for (i = 1; i != rdata->nregions; ++i) { - r = rdata->regions[i]; - pl = rplane(r); - z = plane_id(pl); - wp += sprintf(wp, ", %d %d %d", nx, ny, z); + pnormalize(&nx, &ny, pl); + adjust_coordinates(f, &nx, &ny, pl, r); + wp += sprintf(wp, "\"%d %d %d", nx, ny, z); + for (i = 1; i != rdata->nregions; ++i) { + r = rdata->regions[i]; + pl = rplane(r); + z = plane_id(pl); + wp += sprintf(wp, ", %d %d %d", nx, ny, z); + } + strcat(wp, "\""); } - strcat(wp, "\""); - } else { - strcpy(buffer, "\"\""); - } - return 0; + else { + strcpy(buffer, "\"\""); + } + return 0; } static int cr_spell(variant var, char *buffer, const void *userdata) { - const faction *report = (const faction *)userdata; - spell *sp = (spell *) var.v; - if (sp != NULL) - sprintf(buffer, "\"%s\"", spell_name(sp, report->locale)); - else - strcpy(buffer, "\"\""); - return 0; + const faction *report = (const faction *)userdata; + spell *sp = (spell *)var.v; + if (sp != NULL) + sprintf(buffer, "\"%s\"", spell_name(sp, report->locale)); + else + strcpy(buffer, "\"\""); + return 0; } static int cr_curse(variant var, char *buffer, const void *userdata) { - const faction *report = (const faction *)userdata; - const curse_type *ctype = (const curse_type *)var.v; - if (ctype != NULL) { - sprintf(buffer, "\"%s\"", curse_name(ctype, report->locale)); - } else - strcpy(buffer, "\"\""); - return 0; + const faction *report = (const faction *)userdata; + const curse_type *ctype = (const curse_type *)var.v; + if (ctype != NULL) { + sprintf(buffer, "\"%s\"", curse_name(ctype, report->locale)); + } + else + strcpy(buffer, "\"\""); + return 0; } /*static int msgno; */ @@ -467,40 +480,40 @@ static int cr_curse(variant var, char *buffer, const void *userdata) #define MTMAXHASH 1021 static struct known_mtype { - const struct message_type *mtype; - struct known_mtype *nexthash; + const struct message_type *mtype; + struct known_mtype *nexthash; } *mtypehash[MTMAXHASH]; static void report_crtypes(FILE * F, const struct locale *lang) { - int i; - for (i = 0; i != MTMAXHASH; ++i) { - struct known_mtype *kmt; - for (kmt = mtypehash[i]; kmt; kmt = kmt->nexthash) { - const struct nrmessage_type *nrt = nrt_find(lang, kmt->mtype); - if (nrt) { - unsigned int hash = kmt->mtype->key; - assert(hash > 0); - fprintf(F, "MESSAGETYPE %u\n", hash); - fputc('\"', F); - fputs(escape_string(nrt_string(nrt), NULL, 0), F); - fputs("\";text\n", F); - fprintf(F, "\"%s\";section\n", nrt_section(nrt)); - } + int i; + for (i = 0; i != MTMAXHASH; ++i) { + struct known_mtype *kmt; + for (kmt = mtypehash[i]; kmt; kmt = kmt->nexthash) { + const struct nrmessage_type *nrt = nrt_find(lang, kmt->mtype); + if (nrt) { + unsigned int hash = kmt->mtype->key; + assert(hash > 0); + fprintf(F, "MESSAGETYPE %u\n", hash); + fputc('\"', F); + fputs(escape_string(nrt_string(nrt), NULL, 0), F); + fputs("\";text\n", F); + fprintf(F, "\"%s\";section\n", nrt_section(nrt)); + } + } + while (mtypehash[i]) { + kmt = mtypehash[i]; + mtypehash[i] = mtypehash[i]->nexthash; + free(kmt); + } } - while (mtypehash[i]) { - kmt = mtypehash[i]; - mtypehash[i] = mtypehash[i]->nexthash; - free(kmt); - } - } } static unsigned int messagehash(const struct message *msg) { - variant var; - var.v = (void *)msg; - return (unsigned int)var.i; + variant var; + var.v = (void *)msg; + return (unsigned int)var.i; } /** writes a quoted string to the file @@ -508,116 +521,118 @@ static unsigned int messagehash(const struct message *msg) */ static int fwritestr(FILE * F, const char *str) { - int nwrite = 0; - fputc('\"', F); - if (str) - while (*str) { - int c = (int)(unsigned char)*str++; - switch (c) { - case '"': - case '\\': - fputc('\\', F); - fputc(c, F); - nwrite += 2; - break; - case '\n': - fputc('\\', F); - fputc('n', F); - nwrite += 2; - break; - default: - fputc(c, F); - ++nwrite; - } - } - fputc('\"', F); - return nwrite + 2; + int nwrite = 0; + fputc('\"', F); + if (str) + while (*str) { + int c = (int)(unsigned char)*str++; + switch (c) { + case '"': + case '\\': + fputc('\\', F); + fputc(c, F); + nwrite += 2; + break; + case '\n': + fputc('\\', F); + fputc('n', F); + nwrite += 2; + break; + default: + fputc(c, F); + ++nwrite; + } + } + fputc('\"', F); + return nwrite + 2; } static void render_messages(FILE * F, faction * f, message_list * msgs) { - struct mlist *m = msgs->begin; - while (m) { - char crbuffer[BUFFERSIZE]; /* gross, wegen spionage-messages :-( */ - bool printed = false; - const struct message_type *mtype = m->msg->type; - unsigned int hash = mtype->key; + struct mlist *m = msgs->begin; + while (m) { + char crbuffer[BUFFERSIZE]; /* gross, wegen spionage-messages :-( */ + bool printed = false; + const struct message_type *mtype = m->msg->type; + unsigned int hash = mtype->key; #ifdef RENDER_CRMESSAGES - char nrbuffer[1024 * 32]; - nrbuffer[0] = '\0'; - if (nr_render(m->msg, f->locale, nrbuffer, sizeof(nrbuffer), f) > 0) { - fprintf(F, "MESSAGE %u\n", messagehash(m->msg)); - fprintf(F, "%u;type\n", hash); - fwritestr(F, nrbuffer); - fputs(";rendered\n", F); - printed = true; - } -#endif - crbuffer[0] = '\0'; - if (cr_render(m->msg, crbuffer, (const void *)f) == 0) { - if (crbuffer[0]) { - if (!printed) { - fprintf(F, "MESSAGE %u\n", messagehash(m->msg)); + char nrbuffer[1024 * 32]; + nrbuffer[0] = '\0'; + if (nr_render(m->msg, f->locale, nrbuffer, sizeof(nrbuffer), f) > 0) { + fprintf(F, "MESSAGE %u\n", messagehash(m->msg)); + fprintf(F, "%u;type\n", hash); + fwritestr(F, nrbuffer); + fputs(";rendered\n", F); + printed = true; } - fputs(crbuffer, F); - } - } else { - log_error("could not render cr-message %p: %s\n", m->msg, m->msg->type->name); +#endif + crbuffer[0] = '\0'; + if (cr_render(m->msg, crbuffer, (const void *)f) == 0) { + if (crbuffer[0]) { + if (!printed) { + fprintf(F, "MESSAGE %u\n", messagehash(m->msg)); + } + fputs(crbuffer, F); + } + } + else { + log_error("could not render cr-message %p: %s\n", m->msg, m->msg->type->name); + } + if (printed) { + unsigned int ihash = hash % MTMAXHASH; + struct known_mtype *kmt = mtypehash[ihash]; + while (kmt && kmt->mtype != mtype) + kmt = kmt->nexthash; + if (kmt == NULL) { + kmt = (struct known_mtype *)malloc(sizeof(struct known_mtype)); + kmt->nexthash = mtypehash[ihash]; + kmt->mtype = mtype; + mtypehash[ihash] = kmt; + } + } + m = m->next; } - if (printed) { - unsigned int ihash = hash % MTMAXHASH; - struct known_mtype *kmt = mtypehash[ihash]; - while (kmt && kmt->mtype != mtype) - kmt = kmt->nexthash; - if (kmt == NULL) { - kmt = (struct known_mtype *)malloc(sizeof(struct known_mtype)); - kmt->nexthash = mtypehash[ihash]; - kmt->mtype = mtype; - mtypehash[ihash] = kmt; - } - } - m = m->next; - } } static void cr_output_messages(FILE * F, message_list * msgs, faction * f) { - if (msgs) - render_messages(F, f, msgs); + if (msgs) + render_messages(F, f, msgs); } /* prints a building */ static void cr_output_building(FILE * F, building * b, const unit * owner, int fno, - faction * f) +faction * f) { - const char *bname, *billusion; + const char *bname, *billusion; - fprintf(F, "BURG %d\n", b->no); + fprintf(F, "BURG %d\n", b->no); - report_building(b, &bname, &billusion); - if (billusion) { - fprintf(F, "\"%s\";Typ\n", translate(billusion, LOC(f->locale, - billusion))); - if (owner && owner->faction == f) { - fprintf(F, "\"%s\";wahrerTyp\n", translate(bname, LOC(f->locale, - bname))); + report_building(b, &bname, &billusion); + if (billusion) { + fprintf(F, "\"%s\";Typ\n", translate(billusion, LOC(f->locale, + billusion))); + if (owner && owner->faction == f) { + fprintf(F, "\"%s\";wahrerTyp\n", translate(bname, LOC(f->locale, + bname))); + } } - } else { - fprintf(F, "\"%s\";Typ\n", translate(bname, LOC(f->locale, bname))); - } - fprintf(F, "\"%s\";Name\n", b->name); - if (b->display && b->display[0]) - fprintf(F, "\"%s\";Beschr\n", b->display); - if (b->size) - fprintf(F, "%d;Groesse\n", b->size); - if (owner) - fprintf(F, "%d;Besitzer\n", owner ? owner->no : -1); - if (fno >= 0) - fprintf(F, "%d;Partei\n", fno); - if (b->besieged) - fprintf(F, "%d;Belagerer\n", b->besieged); - cr_output_curses(F, f, b, TYP_BUILDING); + else { + fprintf(F, "\"%s\";Typ\n", translate(bname, LOC(f->locale, bname))); + } + fprintf(F, "\"%s\";Name\n", b->name); + if (b->display && b->display[0]) + fprintf(F, "\"%s\";Beschr\n", b->display); + if (b->size) + fprintf(F, "%d;Groesse\n", b->size); + if (owner) + fprintf(F, "%d;Besitzer\n", owner ? owner->no : -1); + if (fno >= 0) + fprintf(F, "%d;Partei\n", fno); + if (b->besieged) + fprintf(F, "%d;Belagerer\n", b->besieged); + cr_output_curses(F, f, b, TYP_BUILDING); } /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ @@ -625,360 +640,366 @@ cr_output_building(FILE * F, building * b, const unit * owner, int fno, /* prints a ship */ static void cr_output_ship(FILE * F, const ship * sh, const unit * u, int fcaptain, - const faction * f, const region * r) +const faction * f, const region * r) { - int w = 0; - assert(sh); - fprintf(F, "SCHIFF %d\n", sh->no); - fprintf(F, "\"%s\";Name\n", sh->name); - if (sh->display && sh->display[0]) - fprintf(F, "\"%s\";Beschr\n", sh->display); - fprintf(F, "\"%s\";Typ\n", translate(sh->type->_name, - locale_string(f->locale, sh->type->_name))); - fprintf(F, "%d;Groesse\n", sh->size); - if (sh->damage) { - int percent = - (sh->damage * 100 + DAMAGE_SCALE - 1) / (sh->size * DAMAGE_SCALE); - fprintf(F, "%d;Schaden\n", percent); - } - if (u) - fprintf(F, "%d;Kapitaen\n", u ? u->no : -1); - if (fcaptain >= 0) - fprintf(F, "%d;Partei\n", fcaptain); + int w = 0; + assert(sh); + fprintf(F, "SCHIFF %d\n", sh->no); + fprintf(F, "\"%s\";Name\n", sh->name); + if (sh->display && sh->display[0]) + fprintf(F, "\"%s\";Beschr\n", sh->display); + fprintf(F, "\"%s\";Typ\n", translate(sh->type->_name, + locale_string(f->locale, sh->type->_name))); + fprintf(F, "%d;Groesse\n", sh->size); + if (sh->damage) { + int percent = + (sh->damage * 100 + DAMAGE_SCALE - 1) / (sh->size * DAMAGE_SCALE); + fprintf(F, "%d;Schaden\n", percent); + } + if (u) + fprintf(F, "%d;Kapitaen\n", u ? u->no : -1); + if (fcaptain >= 0) + fprintf(F, "%d;Partei\n", fcaptain); - /* calculate cargo */ - if (u && (u->faction == f || omniscient(f))) { - int n = 0, p = 0; - int mweight = shipcapacity(sh); - getshipweight(sh, &n, &p); + /* calculate cargo */ + if (u && (u->faction == f || omniscient(f))) { + int n = 0, p = 0; + int mweight = shipcapacity(sh); + getshipweight(sh, &n, &p); - fprintf(F, "%d;capacity\n", mweight); - fprintf(F, "%d;cargo\n", n); - fprintf(F, "%d;speed\n", shipspeed(sh, u)); - } - /* shore */ - w = NODIRECTION; - if (!fval(r->terrain, SEA_REGION)) - w = sh->coast; - if (w != NODIRECTION) - fprintf(F, "%d;Kueste\n", w); + fprintf(F, "%d;capacity\n", mweight); + fprintf(F, "%d;cargo\n", n); + fprintf(F, "%d;speed\n", shipspeed(sh, u)); + } + /* shore */ + w = NODIRECTION; + if (!fval(r->terrain, SEA_REGION)) + w = sh->coast; + if (w != NODIRECTION) + fprintf(F, "%d;Kueste\n", w); - cr_output_curses(F, f, sh, TYP_SHIP); + cr_output_curses(F, f, sh, TYP_SHIP); } static void fwriteorder(FILE * F, const struct order *ord, const struct locale *lang, - bool escape) +bool escape) { - char ebuf[1024]; - char obuf[1024]; - const char *str = obuf; - fputc('"', F); - write_order(ord, obuf, sizeof(obuf)); - if (escape) { - str = escape_string(obuf, ebuf, sizeof(ebuf)); - } - if (str[0]) - fputs(str, F); - fputc('"', F); + char ebuf[1024]; + char obuf[1024]; + const char *str = obuf; + fputc('"', F); + write_order(ord, obuf, sizeof(obuf)); + if (escape) { + str = escape_string(obuf, ebuf, sizeof(ebuf)); + } + if (str[0]) + fputs(str, F); + fputc('"', F); } static void cr_output_spells(FILE * F, const unit * u, int maxlevel) { - spellbook * book = unit_get_spellbook(u); + spellbook * book = unit_get_spellbook(u); - if (book) { - const faction * f = u->faction; - quicklist *ql; - int qi, header = 0; + if (book) { + const faction * f = u->faction; + quicklist *ql; + int qi, header = 0; - for (ql = book->spells, qi = 0; ql; ql_advance(&ql, &qi, 1)) { - spellbook_entry * sbe = (spellbook_entry *)ql_get(ql, qi); - if (sbe->level <= maxlevel) { - spell * sp = sbe->sp; - const char *name = translate(mkname("spell", sp->sname), spell_name(sp, f->locale)); - if (!header) { - fputs("SPRUECHE\n", F); - header = 1; + for (ql = book->spells, qi = 0; ql; ql_advance(&ql, &qi, 1)) { + spellbook_entry * sbe = (spellbook_entry *)ql_get(ql, qi); + if (sbe->level <= maxlevel) { + spell * sp = sbe->sp; + const char *name = translate(mkname("spell", sp->sname), spell_name(sp, f->locale)); + if (!header) { + fputs("SPRUECHE\n", F); + header = 1; + } + fprintf(F, "\"%s\"\n", name); + } } - fprintf(F, "\"%s\"\n", name); - } } - } } /* prints all that belongs to a unit */ static void cr_output_unit(FILE * F, const region * r, const faction * f, /* observers faction */ - const unit * u, int mode) + const unit * u, int mode) { - /* Race attributes are always plural and item attributes always - * singular */ - const char *str; - const item_type *lasttype; - int pr; - item *itm, *show; - building *b; - const char *pzTmp; - skill *sv; - const attrib *a_fshidden = NULL; - bool itemcloak = false; - static const curse_type *itemcloak_ct = 0; - static bool init = false; - item result[MAX_INVENTORY]; + /* Race attributes are always plural and item attributes always + * singular */ + const char *str; + const item_type *lasttype; + int pr; + item *itm, *show; + building *b; + const char *pzTmp; + skill *sv; + const attrib *a_fshidden = NULL; + bool itemcloak = false; + static const curse_type *itemcloak_ct = 0; + static bool init = false; + item result[MAX_INVENTORY]; - if (fval(u_race(u), RCF_INVISIBLE)) - return; + if (fval(u_race(u), RCF_INVISIBLE)) + return; - if (!init) { - init = true; - itemcloak_ct = ct_find("itemcloak"); - } - if (itemcloak_ct != NULL) { - itemcloak = curse_active(get_curse(u->attribs, itemcloak_ct)); - } + if (!init) { + init = true; + itemcloak_ct = ct_find("itemcloak"); + } + if (itemcloak_ct != NULL) { + itemcloak = curse_active(get_curse(u->attribs, itemcloak_ct)); + } - assert(u && u->number); + assert(u && u->number); - fprintf(F, "EINHEIT %d\n", u->no); - fprintf(F, "\"%s\";Name\n", u->name); - str = u_description(u, f->locale); - if (str) { - fprintf(F, "\"%s\";Beschr\n", str); - } + fprintf(F, "EINHEIT %d\n", u->no); + fprintf(F, "\"%s\";Name\n", u->name); + str = u_description(u, f->locale); + if (str) { + fprintf(F, "\"%s\";Beschr\n", str); + } { - /* print faction information */ - const faction *sf = visible_faction(f, u); - const char *prefix = raceprefix(u); - if (u->faction == f || omniscient(f)) { - const attrib *a_otherfaction = a_find(u->attribs, &at_otherfaction); - const faction *otherfaction = - a_otherfaction ? get_otherfaction(a_otherfaction) : NULL; - /* my own faction, full info */ - const attrib *a = NULL; - unit *mage; + /* print faction information */ + const faction *sf = visible_faction(f, u); + const char *prefix = raceprefix(u); + if (u->faction == f || omniscient(f)) { + const attrib *a_otherfaction = a_find(u->attribs, &at_otherfaction); + const faction *otherfaction = + a_otherfaction ? get_otherfaction(a_otherfaction) : NULL; + /* my own faction, full info */ + const attrib *a = NULL; + unit *mage; - if (fval(u, UFL_GROUP)) - a = a_find(u->attribs, &at_group); - if (a != NULL) { - const group *g = (const group *)a->data.v; - fprintf(F, "%d;gruppe\n", g->gid); - } - fprintf(F, "%d;Partei\n", u->faction->no); - if (sf != u->faction) - fprintf(F, "%d;Verkleidung\n", sf->no); - if (fval(u, UFL_ANON_FACTION)) - fprintf(F, "%d;Parteitarnung\n", i2b(fval(u, UFL_ANON_FACTION))); - if (otherfaction) { - if (otherfaction != u->faction) { - fprintf(F, "%d;Anderepartei\n", otherfaction->no); - } - } - mage = get_familiar_mage(u); - if (mage) { - fprintf(F, "%u;familiarmage\n", mage->no); - } - } else { - if (fval(u, UFL_ANON_FACTION)) { - /* faction info is hidden */ - fprintf(F, "%d;Parteitarnung\n", i2b(fval(u, UFL_ANON_FACTION))); - } else { - const attrib *a_otherfaction = a_find(u->attribs, &at_otherfaction); - const faction *otherfaction = - a_otherfaction ? get_otherfaction(a_otherfaction) : NULL; - /* other unit. show visible faction, not u->faction */ - fprintf(F, "%d;Partei\n", sf->no); - if (sf == f) { - fprintf(F, "1;Verraeter\n"); - } - if (a_otherfaction) { - if (otherfaction != u->faction) { - if (alliedunit(u, f, HELP_FSTEALTH)) { - fprintf(F, "%d;Anderepartei\n", otherfaction->no); - } + if (fval(u, UFL_GROUP)) + a = a_find(u->attribs, &at_group); + if (a != NULL) { + const group *g = (const group *)a->data.v; + fprintf(F, "%d;gruppe\n", g->gid); } + fprintf(F, "%d;Partei\n", u->faction->no); + if (sf != u->faction) + fprintf(F, "%d;Verkleidung\n", sf->no); + if (fval(u, UFL_ANON_FACTION)) + fprintf(F, "%d;Parteitarnung\n", i2b(fval(u, UFL_ANON_FACTION))); + if (otherfaction) { + if (otherfaction != u->faction) { + fprintf(F, "%d;Anderepartei\n", otherfaction->no); + } + } + mage = get_familiar_mage(u); + if (mage) { + fprintf(F, "%u;familiarmage\n", mage->no); + } + } + else { + if (fval(u, UFL_ANON_FACTION)) { + /* faction info is hidden */ + fprintf(F, "%d;Parteitarnung\n", i2b(fval(u, UFL_ANON_FACTION))); + } + else { + const attrib *a_otherfaction = a_find(u->attribs, &at_otherfaction); + const faction *otherfaction = + a_otherfaction ? get_otherfaction(a_otherfaction) : NULL; + /* other unit. show visible faction, not u->faction */ + fprintf(F, "%d;Partei\n", sf->no); + if (sf == f) { + fprintf(F, "1;Verraeter\n"); + } + if (a_otherfaction) { + if (otherfaction != u->faction) { + if (alliedunit(u, f, HELP_FSTEALTH)) { + fprintf(F, "%d;Anderepartei\n", otherfaction->no); + } + } + } + } + } + if (prefix) { + prefix = mkname("prefix", prefix); + fprintf(F, "\"%s\";typprefix\n", translate(prefix, LOC(f->locale, + prefix))); + } + } + if (u->faction != f && a_fshidden + && a_fshidden->data.ca[0] == 1 && effskill(u, SK_STEALTH) >= 6) { + fprintf(F, "-1;Anzahl\n"); + } + else { + fprintf(F, "%d;Anzahl\n", u->number); + } + + pzTmp = get_racename(u->attribs); + if (pzTmp) { + fprintf(F, "\"%s\";Typ\n", pzTmp); + if (u->faction == f && fval(u_race(u), RCF_SHAPESHIFTANY)) { + const char *zRace = rc_name(u_race(u), 1); + fprintf(F, "\"%s\";wahrerTyp\n", + translate(zRace, locale_string(f->locale, zRace))); } - } } - if (prefix) { - prefix = mkname("prefix", prefix); - fprintf(F, "\"%s\";typprefix\n", translate(prefix, LOC(f->locale, - prefix))); - } - } - if (u->faction != f && a_fshidden - && a_fshidden->data.ca[0] == 1 && effskill(u, SK_STEALTH) >= 6) { - fprintf(F, "-1;Anzahl\n"); - } else { - fprintf(F, "%d;Anzahl\n", u->number); - } - - pzTmp = get_racename(u->attribs); - if (pzTmp) { - fprintf(F, "\"%s\";Typ\n", pzTmp); - if (u->faction == f && fval(u_race(u), RCF_SHAPESHIFTANY)) { - const char *zRace = rc_name(u_race(u), 1); - fprintf(F, "\"%s\";wahrerTyp\n", - translate(zRace, locale_string(f->locale, zRace))); - } - } else { - const race *irace = u_irace(u); - const char *zRace = rc_name(irace, 1); - fprintf(F, "\"%s\";Typ\n", - translate(zRace, locale_string(f->locale, zRace))); - if (u->faction == f && irace != u_race(u)) { - assert(skill_enabled(SK_STEALTH) - || !"we're resetting this on load, so.. ircase should never be used"); - zRace = rc_name(u_race(u), 1); - fprintf(F, "\"%s\";wahrerTyp\n", - translate(zRace, locale_string(f->locale, zRace))); - } - } - - if (u->building) { - assert(u->building->region); - fprintf(F, "%d;Burg\n", u->building->no); - } - if (u->ship) { - assert(u->ship->region); - fprintf(F, "%d;Schiff\n", u->ship->no); - } - if (is_guard(u, GUARD_ALL) != 0) { - fprintf(F, "%d;bewacht\n", 1); - } - if ((b = usiege(u)) != NULL) { - fprintf(F, "%d;belagert\n", b->no); - } - /* additional information for own units */ - if (u->faction == f || omniscient(f)) { - order *ord; - const char *xc; - const char *c; - int i; - sc_mage *mage; - - i = ualias(u); - if (i > 0) - fprintf(F, "%d;temp\n", i); - else if (i < 0) - fprintf(F, "%d;alias\n", -i); - i = get_money(u); - fprintf(F, "%d;Kampfstatus\n", u->status); - fprintf(F, "%d;weight\n", weight(u)); - if (fval(u, UFL_NOAID)) { - fputs("1;unaided\n", F); - } - if (fval(u, UFL_STEALTH)) { - i = u_geteffstealth(u); - if (i >= 0) { - fprintf(F, "%d;Tarnung\n", i); - } - } - xc = uprivate(u); - if (xc) { - fprintf(F, "\"%s\";privat\n", xc); - } - c = hp_status(u); - if (c && *c && (u->faction == f || omniscient(f))) { - fprintf(F, "\"%s\";hp\n", translate(c, - locale_string(u->faction->locale, c))); - } - if (fval(u, UFL_HERO)) { - fputs("1;hero\n", F); + else { + const race *irace = u_irace(u); + const char *zRace = rc_name(irace, 1); + fprintf(F, "\"%s\";Typ\n", + translate(zRace, locale_string(f->locale, zRace))); + if (u->faction == f && irace != u_race(u)) { + assert(skill_enabled(SK_STEALTH) + || !"we're resetting this on load, so.. ircase should never be used"); + zRace = rc_name(u_race(u), 1); + fprintf(F, "\"%s\";wahrerTyp\n", + translate(zRace, locale_string(f->locale, zRace))); + } } - if (fval(u, UFL_HUNGER) && (u->faction == f)) { - fputs("1;hunger\n", F); + if (u->building) { + assert(u->building->region); + fprintf(F, "%d;Burg\n", u->building->no); } - if (is_mage(u)) { - fprintf(F, "%d;Aura\n", get_spellpoints(u)); - fprintf(F, "%d;Auramax\n", max_spellpoints(u->region, u)); + if (u->ship) { + assert(u->ship->region); + fprintf(F, "%d;Schiff\n", u->ship->no); } - /* default commands */ - fprintf(F, "COMMANDS\n"); - for (ord = u->old_orders; ord; ord = ord->next) { - /* this new order will replace the old defaults */ - if (is_persistent(ord)) { - fwriteorder(F, ord, f->locale, true); - fputc('\n', F); - } + if (is_guard(u, GUARD_ALL) != 0) { + fprintf(F, "%d;bewacht\n", 1); } - for (ord = u->orders; ord; ord = ord->next) { - if (u->old_orders && is_repeated(ord)) - continue; /* unit has defaults */ - if (is_persistent(ord)) { - fwriteorder(F, ord, f->locale, true); - fputc('\n', F); - } + if ((b = usiege(u)) != NULL) { + fprintf(F, "%d;belagert\n", b->no); } + /* additional information for own units */ + if (u->faction == f || omniscient(f)) { + order *ord; + const char *xc; + const char *c; + int i; + sc_mage *mage; - /* talents */ + i = ualias(u); + if (i > 0) + fprintf(F, "%d;temp\n", i); + else if (i < 0) + fprintf(F, "%d;alias\n", -i); + i = get_money(u); + fprintf(F, "%d;Kampfstatus\n", u->status); + fprintf(F, "%d;weight\n", weight(u)); + if (fval(u, UFL_NOAID)) { + fputs("1;unaided\n", F); + } + if (fval(u, UFL_STEALTH)) { + i = u_geteffstealth(u); + if (i >= 0) { + fprintf(F, "%d;Tarnung\n", i); + } + } + xc = uprivate(u); + if (xc) { + fprintf(F, "\"%s\";privat\n", xc); + } + c = hp_status(u); + if (c && *c && (u->faction == f || omniscient(f))) { + fprintf(F, "\"%s\";hp\n", translate(c, + locale_string(u->faction->locale, c))); + } + if (fval(u, UFL_HERO)) { + fputs("1;hero\n", F); + } + + if (fval(u, UFL_HUNGER) && (u->faction == f)) { + fputs("1;hunger\n", F); + } + if (is_mage(u)) { + fprintf(F, "%d;Aura\n", get_spellpoints(u)); + fprintf(F, "%d;Auramax\n", max_spellpoints(u->region, u)); + } + /* default commands */ + fprintf(F, "COMMANDS\n"); + for (ord = u->old_orders; ord; ord = ord->next) { + /* this new order will replace the old defaults */ + if (is_persistent(ord)) { + fwriteorder(F, ord, f->locale, true); + fputc('\n', F); + } + } + for (ord = u->orders; ord; ord = ord->next) { + if (u->old_orders && is_repeated(ord)) + continue; /* unit has defaults */ + if (is_persistent(ord)) { + fwriteorder(F, ord, f->locale, true); + fputc('\n', F); + } + } + + /* talents */ + pr = 0; + for (sv = u->skills; sv != u->skills + u->skill_size; ++sv) { + if (sv->level > 0) { + skill_t sk = sv->id; + int esk = eff_skill(u, sk, r); + if (!pr) { + pr = 1; + fprintf(F, "TALENTE\n"); + } + fprintf(F, "%d %d;%s\n", u->number * level_days(sv->level), esk, + translate(mkname("skill", skillnames[sk]), skillname(sk, + f->locale))); + } + } + + /* spells that this unit can cast */ + mage = get_mage(u); + if (mage) { + int i, maxlevel = effskill(u, SK_MAGIC); + cr_output_spells(F, u, maxlevel); + + for (i = 0; i != MAXCOMBATSPELLS; ++i) { + const spell *sp = mage->combatspells[i].sp; + if (sp) { + const char *name = + translate(mkname("spell", sp->sname), spell_name(sp, + f->locale)); + fprintf(F, "KAMPFZAUBER %d\n", i); + fprintf(F, "\"%s\";name\n", name); + fprintf(F, "%d;level\n", mage->combatspells[i].level); + } + } + } + } + /* items */ pr = 0; - for (sv = u->skills; sv != u->skills + u->skill_size; ++sv) { - if (sv->level > 0) { - skill_t sk = sv->id; - int esk = eff_skill(u, sk, r); + if (f == u->faction || omniscient(f)) { + show = u->items; + } + else if (!itemcloak && mode >= see_unit && !(a_fshidden + && a_fshidden->data.ca[1] == 1 && effskill(u, SK_STEALTH) >= 3)) { + int n = report_items(u->items, result, MAX_INVENTORY, u, f); + assert(n >= 0); + if (n > 0) + show = result; + else + show = NULL; + } + else { + show = NULL; + } + lasttype = NULL; + for (itm = show; itm; itm = itm->next) { + const char *ic; + int in; + assert(itm->type != lasttype + || !"error: list contains two objects of the same item"); + report_item(u, itm, f, NULL, &ic, &in, true); + if (in == 0) + continue; if (!pr) { - pr = 1; - fprintf(F, "TALENTE\n"); + pr = 1; + fputs("GEGENSTAENDE\n", F); } - fprintf(F, "%d %d;%s\n", u->number * level_days(sv->level), esk, - translate(mkname("skill", skillnames[sk]), skillname(sk, - f->locale))); - } + fprintf(F, "%d;%s\n", in, translate(ic, locale_string(f->locale, + ic))); } - /* spells that this unit can cast */ - mage = get_mage(u); - if (mage) { - int i, maxlevel = effskill(u, SK_MAGIC); - cr_output_spells(F, u, maxlevel); - - for (i = 0; i != MAXCOMBATSPELLS; ++i) { - const spell *sp = mage->combatspells[i].sp; - if (sp) { - const char *name = - translate(mkname("spell", sp->sname), spell_name(sp, - f->locale)); - fprintf(F, "KAMPFZAUBER %d\n", i); - fprintf(F, "\"%s\";name\n", name); - fprintf(F, "%d;level\n", mage->combatspells[i].level); - } - } - } - } - /* items */ - pr = 0; - if (f == u->faction || omniscient(f)) { - show = u->items; - } else if (!itemcloak && mode >= see_unit && !(a_fshidden - && a_fshidden->data.ca[1] == 1 && effskill(u, SK_STEALTH) >= 3)) { - int n = report_items(u->items, result, MAX_INVENTORY, u, f); - assert(n >= 0); - if (n > 0) - show = result; - else - show = NULL; - } else { - show = NULL; - } - lasttype = NULL; - for (itm = show; itm; itm = itm->next) { - const char *ic; - int in; - assert(itm->type != lasttype - || !"error: list contains two objects of the same item"); - report_item(u, itm, f, NULL, &ic, &in, true); - if (in == 0) - continue; - if (!pr) { - pr = 1; - fputs("GEGENSTAENDE\n", F); - } - fprintf(F, "%d;%s\n", in, translate(ic, locale_string(f->locale, - ic))); - } - - cr_output_curses(F, f, u, TYP_UNIT); + cr_output_curses(F, f, u, TYP_UNIT); } /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ @@ -986,39 +1007,39 @@ static void cr_output_unit(FILE * F, const region * r, const faction * f, /* prints allies */ static void show_allies_cr(FILE * F, const faction * f, const ally * sf) { - for (; sf; sf = sf->next) - if (sf->faction) { - int mode = alliedgroup(NULL, f, sf->faction, sf, HELP_ALL); - if (mode != 0 && sf->status > 0) { - fprintf(F, "ALLIANZ %d\n", sf->faction->no); - fprintf(F, "\"%s\";Parteiname\n", sf->faction->name); - fprintf(F, "%d;Status\n", sf->status & HELP_ALL); - } - } + for (; sf; sf = sf->next) + if (sf->faction) { + int mode = alliedgroup(NULL, f, sf->faction, sf, HELP_ALL); + if (mode != 0 && sf->status > 0) { + fprintf(F, "ALLIANZ %d\n", sf->faction->no); + fprintf(F, "\"%s\";Parteiname\n", sf->faction->name); + fprintf(F, "%d;Status\n", sf->status & HELP_ALL); + } + } } /* prints allies */ static void show_alliances_cr(FILE * F, const faction * f) { - alliance *al = f_get_alliance(f); - if (al) { - faction *lead = alliance_get_leader(al); - assert(lead); - fprintf(F, "ALLIANCE %d\n", al->id); - fprintf(F, "\"%s\";name\n", al->name); - fprintf(F, "%d;leader\n", lead->no); - } + alliance *al = f_get_alliance(f); + if (al) { + faction *lead = alliance_get_leader(al); + assert(lead); + fprintf(F, "ALLIANCE %d\n", al->id); + fprintf(F, "\"%s\";name\n", al->name); + fprintf(F, "%d;leader\n", lead->no); + } } /* prints all visible spells in a region */ static void show_active_spells(const region * r) { - char fogwall[MAXDIRECTIONS]; + char fogwall[MAXDIRECTIONS]; #ifdef TODO /* alte Regionszauberanzeigen umstellen */ - unit *u; - int env = 0; + unit *u; + int env = 0; #endif - memset(fogwall, 0, sizeof(char) * MAXDIRECTIONS); + memset(fogwall, 0, sizeof(char) * MAXDIRECTIONS); } @@ -1027,692 +1048,700 @@ static void show_active_spells(const region * r) /* this is a copy of laws.c->find_address output changed. */ static void cr_find_address(FILE * F, const faction * uf, quicklist * addresses) { - int i = 0; - quicklist *flist = addresses; - while (flist) { - const faction *f = (const faction *)ql_get(flist, i); - if (uf != f) { - fprintf(F, "PARTEI %d\n", f->no); - fprintf(F, "\"%s\";Parteiname\n", f->name); - if (f->email) - fprintf(F, "\"%s\";email\n", f->email); - if (f->banner) - fprintf(F, "\"%s\";banner\n", f->banner); - fprintf(F, "\"%s\";locale\n", locale_name(f->locale)); - if (f->alliance && f->alliance == uf->alliance) { - fprintf(F, "%d;alliance\n", f->alliance->id); - } + int i = 0; + quicklist *flist = addresses; + while (flist) { + const faction *f = (const faction *)ql_get(flist, i); + if (uf != f) { + fprintf(F, "PARTEI %d\n", f->no); + fprintf(F, "\"%s\";Parteiname\n", f->name); + if (f->email) + fprintf(F, "\"%s\";email\n", f->email); + if (f->banner) + fprintf(F, "\"%s\";banner\n", f->banner); + fprintf(F, "\"%s\";locale\n", locale_name(f->locale)); + if (f->alliance && f->alliance == uf->alliance) { + fprintf(F, "%d;alliance\n", f->alliance->id); + } + } + ql_advance(&flist, &i, 1); } - ql_advance(&flist, &i, 1); - } } /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ static void cr_reportspell(FILE * F, spell * sp, int level, const struct locale *lang) { - int k; - const char *name = - translate(mkname("spell", sp->sname), spell_name(sp, lang)); + int k; + const char *name = + translate(mkname("spell", sp->sname), spell_name(sp, lang)); - fprintf(F, "ZAUBER %d\n", hashstring(sp->sname)); - fprintf(F, "\"%s\";name\n", name); - fprintf(F, "%d;level\n", level); - fprintf(F, "%d;rank\n", sp->rank); - fprintf(F, "\"%s\";info\n", spell_info(sp, lang)); - if (sp->parameter) - fprintf(F, "\"%s\";syntax\n", sp->parameter); - else - fputs("\"\";syntax\n", F); + fprintf(F, "ZAUBER %d\n", hashstring(sp->sname)); + fprintf(F, "\"%s\";name\n", name); + fprintf(F, "%d;level\n", level); + fprintf(F, "%d;rank\n", sp->rank); + fprintf(F, "\"%s\";info\n", spell_info(sp, lang)); + if (sp->parameter) + fprintf(F, "\"%s\";syntax\n", sp->parameter); + else + fputs("\"\";syntax\n", F); - if (sp->sptyp & PRECOMBATSPELL) - fputs("\"precombat\";class\n", F); - else if (sp->sptyp & COMBATSPELL) - fputs("\"combat\";class\n", F); - else if (sp->sptyp & POSTCOMBATSPELL) - fputs("\"postcombat\";class\n", F); - else - fputs("\"normal\";class\n", F); + if (sp->sptyp & PRECOMBATSPELL) + fputs("\"precombat\";class\n", F); + else if (sp->sptyp & COMBATSPELL) + fputs("\"combat\";class\n", F); + else if (sp->sptyp & POSTCOMBATSPELL) + fputs("\"postcombat\";class\n", F); + else + fputs("\"normal\";class\n", F); - if (sp->sptyp & FARCASTING) - fputs("1;far\n", F); - if (sp->sptyp & OCEANCASTABLE) - fputs("1;ocean\n", F); - if (sp->sptyp & ONSHIPCAST) - fputs("1;ship\n", F); - if (!(sp->sptyp & NOTFAMILIARCAST)) - fputs("1;familiar\n", F); - fputs("KOMPONENTEN\n", F); + if (sp->sptyp & FARCASTING) + fputs("1;far\n", F); + if (sp->sptyp & OCEANCASTABLE) + fputs("1;ocean\n", F); + if (sp->sptyp & ONSHIPCAST) + fputs("1;ship\n", F); + if (!(sp->sptyp & NOTFAMILIARCAST)) + fputs("1;familiar\n", F); + fputs("KOMPONENTEN\n", F); - for (k = 0; sp->components[k].type; ++k) { - const resource_type *rtype = sp->components[k].type; - int itemanz = sp->components[k].amount; - int costtyp = sp->components[k].cost; - if (itemanz > 0) { - const char *name = resourcename(rtype, 0); - fprintf(F, "%d %d;%s\n", itemanz, costtyp == SPC_LEVEL - || costtyp == SPC_LINEAR, translate(name, LOC(lang, name))); + for (k = 0; sp->components[k].type; ++k) { + const resource_type *rtype = sp->components[k].type; + int itemanz = sp->components[k].amount; + int costtyp = sp->components[k].cost; + if (itemanz > 0) { + const char *name = resourcename(rtype, 0); + fprintf(F, "%d %d;%s\n", itemanz, costtyp == SPC_LEVEL + || costtyp == SPC_LINEAR, translate(name, LOC(lang, name))); + } } - } } static char *cr_output_resource(char *buf, const char *name, - const struct locale *loc, int amount, int level) + const struct locale *loc, int amount, int level) { - buf += sprintf(buf, "RESOURCE %u\n", hashstring(name)); - buf += sprintf(buf, "\"%s\";type\n", translate(name, LOC(loc, name))); - if (amount >= 0) { - if (level >= 0) - buf += sprintf(buf, "%d;skill\n", level); - buf += sprintf(buf, "%d;number\n", amount); - } - return buf; + buf += sprintf(buf, "RESOURCE %u\n", hashstring(name)); + buf += sprintf(buf, "\"%s\";type\n", translate(name, LOC(loc, name))); + if (amount >= 0) { + if (level >= 0) + buf += sprintf(buf, "%d;skill\n", level); + buf += sprintf(buf, "%d;number\n", amount); + } + return buf; } static void cr_borders(seen_region ** seen, const region * r, const faction * f, - int seemode, FILE * F) +int seemode, FILE * F) { - direction_t d; - int g = 0; - for (d = 0; d != MAXDIRECTIONS; d++) { /* Nachbarregionen, die gesehen werden, ermitteln */ - const region *r2 = rconnect(r, d); - const connection *b; - if (!r2) - continue; - if (seemode == see_neighbour) { - seen_region *sr = find_seen(seen, r2); - if (sr == NULL || sr->mode <= see_neighbour) - continue; - } - b = get_borders(r, r2); - while (b) { - bool cs = b->type->fvisible(b, f, r); + direction_t d; + int g = 0; + for (d = 0; d != MAXDIRECTIONS; d++) { /* Nachbarregionen, die gesehen werden, ermitteln */ + const region *r2 = rconnect(r, d); + const connection *b; + if (!r2) + continue; + if (seemode == see_neighbour) { + seen_region *sr = find_seen(seen, r2); + if (sr == NULL || sr->mode <= see_neighbour) + continue; + } + b = get_borders(r, r2); + while (b) { + bool cs = b->type->fvisible(b, f, r); - if (!cs) { - cs = b->type->rvisible(b, r); - if (!cs) { - unit *us = r->units; - while (us && !cs) { - if (us->faction == f) { - cs = b->type->uvisible(b, us); - if (cs) - break; + if (!cs) { + cs = b->type->rvisible(b, r); + if (!cs) { + unit *us = r->units; + while (us && !cs) { + if (us->faction == f) { + cs = b->type->uvisible(b, us); + if (cs) + break; + } + us = us->next; + } + } } - us = us->next; - } + if (cs) { + const char *bname = mkname("border", b->type->name(b, r, f, GF_PURE)); + fprintf(F, "GRENZE %d\n", ++g); + fprintf(F, "\"%s\";typ\n", LOC(default_locale, bname)); + fprintf(F, "%d;richtung\n", d); + if (!b->type->transparent(b, f)) + fputs("1;opaque\n", F); + /* hack: */ + if (b->type == &bt_road && r->terrain->max_road) { + int p = rroad(r, d) * 100 / r->terrain->max_road; + fprintf(F, "%d;prozent\n", p); + } + } + b = b->next; } - } - if (cs) { - const char *bname = mkname("border", b->type->name(b, r, f, GF_PURE)); - fprintf(F, "GRENZE %d\n", ++g); - fprintf(F, "\"%s\";typ\n", LOC(default_locale, bname)); - fprintf(F, "%d;richtung\n", d); - if (!b->type->transparent(b, f)) - fputs("1;opaque\n", F); - /* hack: */ - if (b->type == &bt_road && r->terrain->max_road) { - int p = rroad(r, d) * 100 / r->terrain->max_road; - fprintf(F, "%d;prozent\n", p); - } - } - b = b->next; } - } } static void cr_output_resources(FILE * F, report_context * ctx, seen_region * sr) { - char cbuf[BUFFERSIZE], *pos = cbuf; - region *r = sr->r; - faction *f = ctx->f; - resource_report result[MAX_RAWMATERIALS]; - int n, size = report_resources(sr, result, MAX_RAWMATERIALS, f); + char cbuf[BUFFERSIZE], *pos = cbuf; + region *r = sr->r; + faction *f = ctx->f; + resource_report result[MAX_RAWMATERIALS]; + int n, size = report_resources(sr, result, MAX_RAWMATERIALS, f); #ifdef RESOURCECOMPAT - int trees = rtrees(r, 2); - int saplings = rtrees(r, 1); + int trees = rtrees(r, 2); + int saplings = rtrees(r, 1); - if (trees > 0) - fprintf(F, "%d;Baeume\n", trees); - if (saplings > 0) - fprintf(F, "%d;Schoesslinge\n", saplings); - if (fval(r, RF_MALLORN) && (trees > 0 || saplings > 0)) - fprintf(F, "1;Mallorn\n"); - for (n = 0; n < size; ++n) { - if (result[n].level >= 0 && result[n].number >= 0) { - fprintf(F, "%d;%s\n", result[n].number, crtag(result[n].name)); + if (trees > 0) + fprintf(F, "%d;Baeume\n", trees); + if (saplings > 0) + fprintf(F, "%d;Schoesslinge\n", saplings); + if (fval(r, RF_MALLORN) && (trees > 0 || saplings > 0)) + fprintf(F, "1;Mallorn\n"); + for (n = 0; n < size; ++n) { + if (result[n].level >= 0 && result[n].number >= 0) { + fprintf(F, "%d;%s\n", result[n].number, crtag(result[n].name)); + } } - } #endif - for (n = 0; n < size; ++n) { - if (result[n].number >= 0) { - pos = - cr_output_resource(pos, result[n].name, f->locale, result[n].number, - result[n].level); + for (n = 0; n < size; ++n) { + if (result[n].number >= 0) { + pos = + cr_output_resource(pos, result[n].name, f->locale, result[n].number, + result[n].level); + } } - } - if (pos != cbuf) - fputs(cbuf, F); + if (pos != cbuf) + fputs(cbuf, F); } static void cr_region_header(FILE * F, int plid, int nx, int ny, unsigned int uid) { - if (plid == 0) { - fprintf(F, "REGION %d %d\n", nx, ny); - } else { - fprintf(F, "REGION %d %d %d\n", nx, ny, plid); - } - if (uid) - fprintf(F, "%d;id\n", uid); + if (plid == 0) { + fprintf(F, "REGION %d %d\n", nx, ny); + } + else { + fprintf(F, "REGION %d %d %d\n", nx, ny, plid); + } + if (uid) + fprintf(F, "%d;id\n", uid); } static void cr_output_region(FILE * F, report_context * ctx, seen_region * sr) { - faction *f = ctx->f; - region *r = sr->r; - plane *pl = rplane(r); - int plid = plane_id(pl), nx, ny; - const char *tname; - int oc[4][2], o = 0; - int uid = r->uid; + faction *f = ctx->f; + region *r = sr->r; + plane *pl = rplane(r); + int plid = plane_id(pl), nx, ny; + const char *tname; + int oc[4][2], o = 0; + int uid = r->uid; #ifdef OCEAN_NEIGHBORS_GET_NO_ID - if (sr->mode <= see_neighbour && !r->land) { - uid = 0; - } + if (sr->mode <= see_neighbour && !r->land) { + uid = 0; + } #endif - if (opt_cr_absolute_coords) { - nx = r->x; - ny = r->y; - } else { - nx = r->x, ny = r->y; - pnormalize(&nx, &ny, pl); - adjust_coordinates(f, &nx, &ny, pl, r); - } - - if (pl) { - if (ny == pl->maxy) { - oc[o][0] = nx; - oc[o++][1] = pl->miny - 1; + if (opt_cr_absolute_coords) { + nx = r->x; + ny = r->y; } - if (nx == pl->maxx) { - oc[o][0] = pl->minx - 1; - oc[o++][1] = ny; + else { + nx = r->x, ny = r->y; + pnormalize(&nx, &ny, pl); + adjust_coordinates(f, &nx, &ny, pl, r); } - if (ny == pl->miny) { - oc[o][0] = nx; - oc[o++][1] = pl->maxy + 1; + + if (pl) { + if (ny == pl->maxy) { + oc[o][0] = nx; + oc[o++][1] = pl->miny - 1; + } + if (nx == pl->maxx) { + oc[o][0] = pl->minx - 1; + oc[o++][1] = ny; + } + if (ny == pl->miny) { + oc[o][0] = nx; + oc[o++][1] = pl->maxy + 1; + } + if (nx == pl->minx) { + oc[o][0] = pl->maxx + 1; + oc[o++][1] = ny; + } } - if (nx == pl->minx) { - oc[o][0] = pl->maxx + 1; - oc[o++][1] = ny; + while (o--) { + cr_region_header(F, plid, oc[o][0], oc[o][1], uid); + fputs("\"wrap\";visibility\n", F); } - } - while (o--) { - cr_region_header(F, plid, oc[o][0], oc[o][1], uid); - fputs("\"wrap\";visibility\n", F); - } - cr_region_header(F, plid, nx, ny, uid); + cr_region_header(F, plid, nx, ny, uid); - if (r->land) { - const char *str = rname(r, f->locale); - if (str && str[0]) { - fprintf(F, "\"%s\";Name\n", str); - } - } - tname = terrain_name(r); - - fprintf(F, "\"%s\";Terrain\n", translate(tname, locale_string(f->locale, - tname))); - if (sr->mode != see_unit) - fprintf(F, "\"%s\";visibility\n", visibility[sr->mode]); - if (sr->mode == see_neighbour) { - cr_borders(ctx->seen, r, f, sr->mode, F); - } else { - building *b; - ship *sh; - unit *u; - int stealthmod = stealth_modifier(sr->mode); - - if (r->display && r->display[0]) - fprintf(F, "\"%s\";Beschr\n", r->display); - if (fval(r->terrain, LAND_REGION)) { - fprintf(F, "%d;Bauern\n", rpeasants(r)); - if (fval(r, RF_ORCIFIED)) { - fprintf(F, "1;Verorkt\n"); - } - fprintf(F, "%d;Pferde\n", rhorses(r)); - - if (sr->mode >= see_unit) { - if (rule_region_owners()) { - faction *owner = region_get_owner(r); - if (owner) { - fprintf(F, "%d;owner\n", owner->no); - } - } - fprintf(F, "%d;Silber\n", rmoney(r)); - if (skill_enabled(SK_ENTERTAINMENT)) { - fprintf(F, "%d;Unterh\n", entertainmoney(r)); - } - if (is_cursed(r->attribs, C_RIOT, 0)) { - fputs("0;Rekruten\n", F); - } else { - fprintf(F, "%d;Rekruten\n", rpeasants(r) / RECRUITFRACTION); - } - if (production(r)) { - int p_wage = wage(r, NULL, NULL, turn + 1); - fprintf(F, "%d;Lohn\n", p_wage); - if (is_mourning(r, turn + 1)) { - fputs("1;mourning\n", F); - } - } - if (r->land->ownership) { - fprintf(F, "%d;morale\n", r->land->morale); - } - } - - /* this writes both some tags (RESOURCECOMPAT) and a block. - * must not write any blocks before it */ - cr_output_resources(F, ctx, sr); - - if (sr->mode >= see_unit) { - /* trade */ - if (markets_module() && r->land) { - const item_type *lux = r_luxury(r); - const item_type *herb = r->land->herbtype; - if (lux || herb) { - fputs("PREISE\n", F); - if (lux) { - const char *ch = resourcename(lux->rtype, 0); - fprintf(F, "%d;%s\n", 1, translate(ch, - locale_string(f->locale, ch))); - } - if (herb) { - const char *ch = resourcename(herb->rtype, 0); - fprintf(F, "%d;%s\n", 1, translate(ch, - locale_string(f->locale, ch))); - } - } - } else if (rpeasants(r) / TRADE_FRACTION > 0) { - struct demand *dmd = r->land->demands; - fputs("PREISE\n", F); - while (dmd) { - const char *ch = resourcename(dmd->type->itype->rtype, 0); - fprintf(F, "%d;%s\n", (dmd->value - ? dmd->value * dmd->type->price - : -dmd->type->price), - translate(ch, locale_string(f->locale, ch))); - dmd = dmd->next; - } - } - } - } if (r->land) { - print_items(F, r->land->items, f->locale); - } - cr_output_curses(F, f, r, TYP_REGION); - cr_borders(ctx->seen, r, f, sr->mode, F); - if (sr->mode == see_unit && is_astral(r) - && !is_cursed(r->attribs, C_ASTRALBLOCK, 0)) { - /* Sonderbehandlung Teleport-Ebene */ - region_list *rl = astralregions(r, inhabitable); - - if (rl) { - region_list *rl2 = rl; - while (rl2) { - region *r = rl2->data; - int nx = r->x, ny = r->y; - plane *plx = rplane(r); - - pnormalize(&nx, &ny, plx); - adjust_coordinates(f, &nx, &ny, plx, r); - fprintf(F, "SCHEMEN %d %d\n", nx, ny); - fprintf(F, "\"%s\";Name\n", rname(r, f->locale)); - rl2 = rl2->next; + const char *str = rname(r, f->locale); + if (str && str[0]) { + fprintf(F, "\"%s\";Name\n", str); } - free_regionlist(rl); - } } + tname = terrain_name(r); - /* describe both passed and inhabited regions */ - show_active_spells(r); - if (fval(r, RF_TRAVELUNIT)) { - bool seeunits = false, seeships = false; - const attrib *ru; - /* show units pulled through region */ - for (ru = a_find(r->attribs, &at_travelunit); - ru && ru->type == &at_travelunit; ru = ru->next) { - unit *u = (unit *) ru->data.v; - if (cansee_durchgezogen(f, r, u, 0) && r != u->region) { - if (u->ship && ship_owner(u->ship)==u) { - if (!seeships) { - fprintf(F, "DURCHSCHIFFUNG\n"); + fprintf(F, "\"%s\";Terrain\n", translate(tname, locale_string(f->locale, + tname))); + if (sr->mode != see_unit) + fprintf(F, "\"%s\";visibility\n", visibility[sr->mode]); + if (sr->mode == see_neighbour) { + cr_borders(ctx->seen, r, f, sr->mode, F); + } + else { + building *b; + ship *sh; + unit *u; + int stealthmod = stealth_modifier(sr->mode); + + if (r->display && r->display[0]) + fprintf(F, "\"%s\";Beschr\n", r->display); + if (fval(r->terrain, LAND_REGION)) { + fprintf(F, "%d;Bauern\n", rpeasants(r)); + if (fval(r, RF_ORCIFIED)) { + fprintf(F, "1;Verorkt\n"); } - seeships = true; - fprintf(F, "\"%s\"\n", shipname(u->ship)); - } - } - } - for (ru = a_find(r->attribs, &at_travelunit); - ru && ru->type == &at_travelunit; ru = ru->next) { - unit *u = (unit *) ru->data.v; - if (cansee_durchgezogen(f, r, u, 0) && r != u->region) { - if (!u->ship) { - if (!seeunits) { - fprintf(F, "DURCHREISE\n"); + fprintf(F, "%d;Pferde\n", rhorses(r)); + + if (sr->mode >= see_unit) { + if (rule_region_owners()) { + faction *owner = region_get_owner(r); + if (owner) { + fprintf(F, "%d;owner\n", owner->no); + } + } + fprintf(F, "%d;Silber\n", rmoney(r)); + if (skill_enabled(SK_ENTERTAINMENT)) { + fprintf(F, "%d;Unterh\n", entertainmoney(r)); + } + if (is_cursed(r->attribs, C_RIOT, 0)) { + fputs("0;Rekruten\n", F); + } + else { + fprintf(F, "%d;Rekruten\n", rpeasants(r) / RECRUITFRACTION); + } + if (production(r)) { + int p_wage = wage(r, NULL, NULL, turn + 1); + fprintf(F, "%d;Lohn\n", p_wage); + if (is_mourning(r, turn + 1)) { + fputs("1;mourning\n", F); + } + } + if (r->land->ownership) { + fprintf(F, "%d;morale\n", r->land->morale); + } + } + + /* this writes both some tags (RESOURCECOMPAT) and a block. + * must not write any blocks before it */ + cr_output_resources(F, ctx, sr); + + if (sr->mode >= see_unit) { + /* trade */ + if (markets_module() && r->land) { + const item_type *lux = r_luxury(r); + const item_type *herb = r->land->herbtype; + if (lux || herb) { + fputs("PREISE\n", F); + if (lux) { + const char *ch = resourcename(lux->rtype, 0); + fprintf(F, "%d;%s\n", 1, translate(ch, + locale_string(f->locale, ch))); + } + if (herb) { + const char *ch = resourcename(herb->rtype, 0); + fprintf(F, "%d;%s\n", 1, translate(ch, + locale_string(f->locale, ch))); + } + } + } + else if (rpeasants(r) / TRADE_FRACTION > 0) { + struct demand *dmd = r->land->demands; + fputs("PREISE\n", F); + while (dmd) { + const char *ch = resourcename(dmd->type->itype->rtype, 0); + fprintf(F, "%d;%s\n", (dmd->value + ? dmd->value * dmd->type->price + : -dmd->type->price), + translate(ch, locale_string(f->locale, ch))); + dmd = dmd->next; + } + } } - seeunits = true; - fprintf(F, "\"%s\"\n", unitname(u)); - } } - } - } - cr_output_messages(F, r->msgs, f); - { - message_list *mlist = r_getmessages(r, f); - if (mlist) - cr_output_messages(F, mlist, f); - } - /* buildings */ - for (b = rbuildings(r); b; b = b->next) { - int fno = -1; - u = building_owner(b); - if (u && !fval(u, UFL_ANON_FACTION)) { - const faction *sf = visible_faction(f, u); - fno = sf->no; - } - cr_output_building(F, b, u, fno, f); - } + if (r->land) { + print_items(F, r->land->items, f->locale); + } + cr_output_curses(F, f, r, TYP_REGION); + cr_borders(ctx->seen, r, f, sr->mode, F); + if (sr->mode == see_unit && is_astral(r) + && !is_cursed(r->attribs, C_ASTRALBLOCK, 0)) { + /* Sonderbehandlung Teleport-Ebene */ + region_list *rl = astralregions(r, inhabitable); - /* ships */ - for (sh = r->ships; sh; sh = sh->next) { - int fno = -1; - u = ship_owner(sh); - if (u && !fval(u, UFL_ANON_FACTION)) { - const faction *sf = visible_faction(f, u); - fno = sf->no; - } + if (rl) { + region_list *rl2 = rl; + while (rl2) { + region *r = rl2->data; + int nx = r->x, ny = r->y; + plane *plx = rplane(r); - cr_output_ship(F, sh, u, fno, f, r); + pnormalize(&nx, &ny, plx); + adjust_coordinates(f, &nx, &ny, plx, r); + fprintf(F, "SCHEMEN %d %d\n", nx, ny); + fprintf(F, "\"%s\";Name\n", rname(r, f->locale)); + rl2 = rl2->next; + } + free_regionlist(rl); + } + } + + /* describe both passed and inhabited regions */ + show_active_spells(r); + if (fval(r, RF_TRAVELUNIT)) { + bool seeunits = false, seeships = false; + const attrib *ru; + /* show units pulled through region */ + for (ru = a_find(r->attribs, &at_travelunit); + ru && ru->type == &at_travelunit; ru = ru->next) { + unit *u = (unit *)ru->data.v; + if (cansee_durchgezogen(f, r, u, 0) && r != u->region) { + if (u->ship && ship_owner(u->ship) == u) { + 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->type == &at_travelunit; ru = ru->next) { + unit *u = (unit *)ru->data.v; + if (cansee_durchgezogen(f, r, u, 0) && r != u->region) { + if (!u->ship) { + if (!seeunits) { + fprintf(F, "DURCHREISE\n"); + } + seeunits = true; + fprintf(F, "\"%s\"\n", unitname(u)); + } + } + } + } + cr_output_messages(F, r->msgs, f); + { + message_list *mlist = r_getmessages(r, f); + if (mlist) + cr_output_messages(F, mlist, f); + } + /* buildings */ + for (b = rbuildings(r); b; b = b->next) { + int fno = -1; + u = building_owner(b); + if (u && !fval(u, UFL_ANON_FACTION)) { + const faction *sf = visible_faction(f, u); + fno = sf->no; + } + cr_output_building(F, b, u, fno, f); + } + + /* ships */ + for (sh = r->ships; sh; sh = sh->next) { + int fno = -1; + u = ship_owner(sh); + if (u && !fval(u, UFL_ANON_FACTION)) { + const faction *sf = visible_faction(f, u); + fno = sf->no; + } + + cr_output_ship(F, sh, u, fno, f, r); + } + + /* visible units */ + for (u = r->units; u; u = u->next) { + + if (u->building || u->ship || (stealthmod > INT_MIN + && cansee(f, r, u, stealthmod))) { + cr_output_unit(F, r, f, u, sr->mode); + } + } } - - /* visible units */ - for (u = r->units; u; u = u->next) { - - if (u->building || u->ship || (stealthmod > INT_MIN - && cansee(f, r, u, stealthmod))) { - cr_output_unit(F, r, f, u, sr->mode); - } - } - } } /* main function of the creport. creates the header and traverses all regions */ static int report_computer(const char *filename, report_context * ctx, const char *charset) { - static int era = -1; - int i; - faction *f = ctx->f; - const char *prefix; - region *r; - const char *mailto = locale_string(f->locale, "mailto"); - const attrib *a; - seen_region *sr = NULL; + static int era = -1; + int i; + faction *f = ctx->f; + const char *prefix; + region *r; + const char *mailto = locale_string(f->locale, "mailto"); + const attrib *a; + seen_region *sr = NULL; #if SCORE_MODULE - int score = 0, avgscore = 0; + int score = 0, avgscore = 0; #endif - FILE *F = fopen(filename, "wt"); + FILE *F = fopen(filename, "wt"); - if (era < 0) { - era = get_param_int(global.parameters, "world.era", 2); - } - if (F == NULL) { - perror(filename); - return -1; - } else if (_strcmpl(charset, "utf-8")==0 || _strcmpl(charset, "utf8")==0) { - const unsigned char utf8_bom[4] = { 0xef, 0xbb, 0xbf, 0 }; - fwrite(utf8_bom, 1, 3, F); - } - - /* must call this to get all the neighbour regions */ - /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ - /* initialisations, header and lists */ - - fprintf(F, "VERSION %d\n", C_REPORT_VERSION); - fprintf(F, "\"%s\";charset\n", charset); - fprintf(F, "\"%s\";locale\n", locale_name(f->locale)); - fprintf(F, "%d;noskillpoints\n", 1); - fprintf(F, "%ld;date\n", ctx->report_time); - fprintf(F, "\"%s\";Spiel\n", game_name()); - fprintf(F, "\"%s\";Konfiguration\n", "Standard"); - fprintf(F, "\"%s\";Koordinaten\n", "Hex"); - fprintf(F, "%d;Basis\n", 36); - fprintf(F, "%d;Runde\n", turn); - fprintf(F, "%d;Zeitalter\n", era); - fprintf(F, "%d;Build\n", VERSION_BUILD); - if (mailto != NULL) { - fprintf(F, "\"%s\";mailto\n", mailto); - fprintf(F, "\"%s\";mailcmd\n", locale_string(f->locale, "mailcmd")); - } - - show_alliances_cr(F, f); - - fprintf(F, "PARTEI %d\n", f->no); - fprintf(F, "\"%s\";locale\n", locale_name(f->locale)); - if (f_get_alliance(f)) { - fprintf(F, "%d;alliance\n", f->alliance->id); - fprintf(F, "%d;joined\n", f->alliance_joindate); - } - fprintf(F, "%d;age\n", f->age); - fprintf(F, "%d;Optionen\n", f->options); -#if SCORE_MODULE - if (f->options & want(O_SCORE) && f->age > DISPLAYSCORE) { - score = f->score; - avgscore = average_score_of_age(f->age, f->age / 24 + 1); - } - fprintf(F, "%d;Punkte\n", score); - fprintf(F, "%d;Punktedurchschnitt\n", avgscore); -#endif - { - const char *zRace = rc_name(f->race, 1); - fprintf(F, "\"%s\";Typ\n", translate(zRace, LOC(f->locale, zRace))); - } - prefix = get_prefix(f->attribs); - if (prefix != NULL) { - prefix = mkname("prefix", prefix); - fprintf(F, "\"%s\";typprefix\n", - translate(prefix, LOC(f->locale, prefix))); - } - fprintf(F, "%d;Rekrutierungskosten\n", f->race->recruitcost); - fprintf(F, "%d;Anzahl Personen\n", count_all(f)); - fprintf(F, "\"%s\";Magiegebiet\n", magic_school[f->magiegebiet]); - - if (f->race == get_race(RC_HUMAN)) { - fprintf(F, "%d;Anzahl Immigranten\n", count_migrants(f)); - fprintf(F, "%d;Max. Immigranten\n", count_maxmigrants(f)); - } - - i = countheroes(f); - if (i > 0) - fprintf(F, "%d;heroes\n", i); - i = maxheroes(f); - if (i > 0) - fprintf(F, "%d;max_heroes\n", i); - - if (f->age > 1 && f->lastorders != turn) { - fprintf(F, "%d;nmr\n", turn - f->lastorders); - } - - fprintf(F, "\"%s\";Parteiname\n", f->name); - fprintf(F, "\"%s\";email\n", f->email); - if (f->banner) - fprintf(F, "\"%s\";banner\n", f->banner); - print_items(F, f->items, f->locale); - fputs("OPTIONEN\n", F); - for (i = 0; i != MAXOPTIONS; ++i) { - int flag = want(i); - if (options[i]) { - fprintf(F, "%d;%s\n", (f->options & flag) ? 1 : 0, options[i]); - } else if (f->options & flag) { - f->options &= (~flag); + if (era < 0) { + era = get_param_int(global.parameters, "world.era", 2); + } + if (F == NULL) { + perror(filename); + return -1; + } + else if (_strcmpl(charset, "utf-8") == 0 || _strcmpl(charset, "utf8") == 0) { + const unsigned char utf8_bom[4] = { 0xef, 0xbb, 0xbf, 0 }; + fwrite(utf8_bom, 1, 3, F); } - } - show_allies_cr(F, f, f->allies); - { - group *g; - for (g = f->groups; g; g = g->next) { - fprintf(F, "GRUPPE %d\n", g->gid); - fprintf(F, "\"%s\";name\n", g->name); - prefix = get_prefix(g->attribs); - if (prefix != NULL) { + /* must call this to get all the neighbour regions */ + /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */ + /* initialisations, header and lists */ + + fprintf(F, "VERSION %d\n", C_REPORT_VERSION); + fprintf(F, "\"%s\";charset\n", charset); + fprintf(F, "\"%s\";locale\n", locale_name(f->locale)); + fprintf(F, "%d;noskillpoints\n", 1); + fprintf(F, "%ld;date\n", ctx->report_time); + fprintf(F, "\"%s\";Spiel\n", game_name()); + fprintf(F, "\"%s\";Konfiguration\n", "Standard"); + fprintf(F, "\"%s\";Koordinaten\n", "Hex"); + fprintf(F, "%d;Basis\n", 36); + fprintf(F, "%d;Runde\n", turn); + fprintf(F, "%d;Zeitalter\n", era); + fprintf(F, "%d;Build\n", VERSION_BUILD); + if (mailto != NULL) { + fprintf(F, "\"%s\";mailto\n", mailto); + fprintf(F, "\"%s\";mailcmd\n", locale_string(f->locale, "mailcmd")); + } + + show_alliances_cr(F, f); + + fprintf(F, "PARTEI %d\n", f->no); + fprintf(F, "\"%s\";locale\n", locale_name(f->locale)); + if (f_get_alliance(f)) { + fprintf(F, "%d;alliance\n", f->alliance->id); + fprintf(F, "%d;joined\n", f->alliance_joindate); + } + fprintf(F, "%d;age\n", f->age); + fprintf(F, "%d;Optionen\n", f->options); +#if SCORE_MODULE + if (f->options & want(O_SCORE) && f->age > DISPLAYSCORE) { + score = f->score; + avgscore = average_score_of_age(f->age, f->age / 24 + 1); + } + fprintf(F, "%d;Punkte\n", score); + fprintf(F, "%d;Punktedurchschnitt\n", avgscore); +#endif + { + const char *zRace = rc_name(f->race, 1); + fprintf(F, "\"%s\";Typ\n", translate(zRace, LOC(f->locale, zRace))); + } + prefix = get_prefix(f->attribs); + if (prefix != NULL) { prefix = mkname("prefix", prefix); fprintf(F, "\"%s\";typprefix\n", - translate(prefix, LOC(f->locale, prefix))); - } - show_allies_cr(F, f, g->allies); + translate(prefix, LOC(f->locale, prefix))); } - } + fprintf(F, "%d;Rekrutierungskosten\n", f->race->recruitcost); + fprintf(F, "%d;Anzahl Personen\n", count_all(f)); + fprintf(F, "\"%s\";Magiegebiet\n", magic_school[f->magiegebiet]); - cr_output_messages(F, f->msgs, f); - { - struct bmsg *bm; - for (bm = f->battles; bm; bm = bm->next) { - plane *pl = rplane(bm->r); - int plid = plane_id(pl); - region *r = bm->r; - int nx = r->x, ny = r->y; - - pnormalize(&nx, &ny, pl); - adjust_coordinates(f, &nx, &ny, pl, r); - if (!plid) - fprintf(F, "BATTLE %d %d\n", nx, ny); - else { - fprintf(F, "BATTLE %d %d %d\n", nx, ny, plid); - } - cr_output_messages(F, bm->msgs, f); - } - } - - cr_find_address(F, f, ctx->addresses); - a = a_find(f->attribs, &at_reportspell); - while (a && a->type == &at_reportspell) { - spellbook_entry *sbe = (spellbook_entry *) a->data.v; - cr_reportspell(F, sbe->sp, sbe->level, f->locale); - a = a->next; - } - for (a = a_find(f->attribs, &at_showitem); a && a->type == &at_showitem; - a = a->next) { - const potion_type *ptype = - resource2potion(((const item_type *)a->data.v)->rtype); - const char *ch; - const char *description = NULL; - - if (ptype == NULL) - continue; - ch = resourcename(ptype->itype->rtype, 0); - fprintf(F, "TRANK %d\n", hashstring(ch)); - fprintf(F, "\"%s\";Name\n", translate(ch, locale_string(f->locale, - ch))); - fprintf(F, "%d;Stufe\n", ptype->level); - - if (description == NULL) { - const char *pname = resourcename(ptype->itype->rtype, 0); - const char *potiontext = mkname("potion", pname); - description = LOC(f->locale, potiontext); + if (f->race == get_race(RC_HUMAN)) { + fprintf(F, "%d;Anzahl Immigranten\n", count_migrants(f)); + fprintf(F, "%d;Max. Immigranten\n", count_maxmigrants(f)); } - fprintf(F, "\"%s\";Beschr\n", description); - if (ptype->itype->construction) { - requirement *m = ptype->itype->construction->materials; + i = countheroes(f); + if (i > 0) + fprintf(F, "%d;heroes\n", i); + i = maxheroes(f); + if (i > 0) + fprintf(F, "%d;max_heroes\n", i); - fprintf(F, "ZUTATEN\n"); - - while (m->number) { - ch = resourcename(m->rtype, 0); - fprintf(F, "\"%s\"\n", translate(ch, locale_string(f->locale, - ch))); - m++; - } + if (f->age > 1 && f->lastorders != turn) { + fprintf(F, "%d;nmr\n", turn - f->lastorders); } - } - /* traverse all regions */ - for (r = ctx->first; sr == NULL && r != ctx->last; r = r->next) { - sr = find_seen(ctx->seen, r); - } - for (; sr != NULL; sr = sr->next) { - cr_output_region(F, ctx, sr); - } - report_crtypes(F, f->locale); - write_translations(F); - reset_translations(); - fclose(F); - return 0; + fprintf(F, "\"%s\";Parteiname\n", f->name); + fprintf(F, "\"%s\";email\n", f->email); + if (f->banner) + fprintf(F, "\"%s\";banner\n", f->banner); + print_items(F, f->items, f->locale); + fputs("OPTIONEN\n", F); + for (i = 0; i != MAXOPTIONS; ++i) { + int flag = want(i); + if (options[i]) { + fprintf(F, "%d;%s\n", (f->options & flag) ? 1 : 0, options[i]); + } + else if (f->options & flag) { + f->options &= (~flag); + } + } + show_allies_cr(F, f, f->allies); + { + group *g; + for (g = f->groups; g; g = g->next) { + + fprintf(F, "GRUPPE %d\n", g->gid); + fprintf(F, "\"%s\";name\n", g->name); + prefix = get_prefix(g->attribs); + if (prefix != NULL) { + prefix = mkname("prefix", prefix); + fprintf(F, "\"%s\";typprefix\n", + translate(prefix, LOC(f->locale, prefix))); + } + show_allies_cr(F, f, g->allies); + } + } + + cr_output_messages(F, f->msgs, f); + { + struct bmsg *bm; + for (bm = f->battles; bm; bm = bm->next) { + plane *pl = rplane(bm->r); + int plid = plane_id(pl); + region *r = bm->r; + int nx = r->x, ny = r->y; + + pnormalize(&nx, &ny, pl); + adjust_coordinates(f, &nx, &ny, pl, r); + if (!plid) + fprintf(F, "BATTLE %d %d\n", nx, ny); + else { + fprintf(F, "BATTLE %d %d %d\n", nx, ny, plid); + } + cr_output_messages(F, bm->msgs, f); + } + } + + cr_find_address(F, f, ctx->addresses); + a = a_find(f->attribs, &at_reportspell); + while (a && a->type == &at_reportspell) { + spellbook_entry *sbe = (spellbook_entry *)a->data.v; + cr_reportspell(F, sbe->sp, sbe->level, f->locale); + a = a->next; + } + for (a = a_find(f->attribs, &at_showitem); a && a->type == &at_showitem; + a = a->next) { + const potion_type *ptype = + resource2potion(((const item_type *)a->data.v)->rtype); + const char *ch; + const char *description = NULL; + + if (ptype == NULL) + continue; + ch = resourcename(ptype->itype->rtype, 0); + fprintf(F, "TRANK %d\n", hashstring(ch)); + fprintf(F, "\"%s\";Name\n", translate(ch, locale_string(f->locale, + ch))); + fprintf(F, "%d;Stufe\n", ptype->level); + + if (description == NULL) { + const char *pname = resourcename(ptype->itype->rtype, 0); + const char *potiontext = mkname("potion", pname); + description = LOC(f->locale, potiontext); + } + + fprintf(F, "\"%s\";Beschr\n", description); + if (ptype->itype->construction) { + requirement *m = ptype->itype->construction->materials; + + fprintf(F, "ZUTATEN\n"); + + while (m->number) { + ch = resourcename(m->rtype, 0); + fprintf(F, "\"%s\"\n", translate(ch, locale_string(f->locale, + ch))); + m++; + } + } + } + + /* traverse all regions */ + for (r = ctx->first; sr == NULL && r != ctx->last; r = r->next) { + sr = find_seen(ctx->seen, r); + } + for (; sr != NULL; sr = sr->next) { + cr_output_region(F, ctx, sr); + } + report_crtypes(F, f->locale); + write_translations(F); + reset_translations(); + fclose(F); + return 0; } int crwritemap(const char *filename) { - FILE *F = fopen(filename, "w"); - region *r; + FILE *F = fopen(filename, "w"); + region *r; - fprintf(F, "VERSION %d\n", C_REPORT_VERSION); - fputs("\"UTF-8\";charset\n", F); + fprintf(F, "VERSION %d\n", C_REPORT_VERSION); + fputs("\"UTF-8\";charset\n", F); - for (r = regions; r; r = r->next) { - plane *pl = rplane(r); - int plid = plane_id(pl); - if (plid) { - fprintf(F, "REGION %d %d %d\n", r->x, r->y, plid); - } else { - fprintf(F, "REGION %d %d\n", r->x, r->y); + for (r = regions; r; r = r->next) { + plane *pl = rplane(r); + int plid = plane_id(pl); + if (plid) { + fprintf(F, "REGION %d %d %d\n", r->x, r->y, plid); + } + else { + fprintf(F, "REGION %d %d\n", r->x, r->y); + } + fprintf(F, "\"%s\";Name\n\"%s\";Terrain\n", rname(r, default_locale), + LOC(default_locale, terrain_name(r))); } - fprintf(F, "\"%s\";Name\n\"%s\";Terrain\n", rname(r, default_locale), - LOC(default_locale, terrain_name(r))); - } - fclose(F); - return 0; + fclose(F); + return 0; } void register_cr(void) { - tsf_register("report", &cr_ignore); - tsf_register("string", &cr_string); - tsf_register("order", &cr_order); - tsf_register("spell", &cr_spell); - tsf_register("curse", &cr_curse); - tsf_register("int", &cr_int); - tsf_register("unit", &cr_unit); - tsf_register("region", &cr_region); - tsf_register("faction", &cr_faction); - tsf_register("ship", &cr_ship); - tsf_register("building", &cr_building); - tsf_register("skill", &cr_skill); - tsf_register("resource", &cr_resource); - tsf_register("race", &cr_race); - tsf_register("direction", &cr_int); - tsf_register("alliance", &cr_alliance); - tsf_register("resources", &cr_resources); - tsf_register("items", &cr_resources); - tsf_register("regions", &cr_regions); + tsf_register("report", &cr_ignore); + tsf_register("string", &cr_string); + tsf_register("order", &cr_order); + tsf_register("spell", &cr_spell); + tsf_register("curse", &cr_curse); + tsf_register("int", &cr_int); + tsf_register("unit", &cr_unit); + tsf_register("region", &cr_region); + tsf_register("faction", &cr_faction); + tsf_register("ship", &cr_ship); + tsf_register("building", &cr_building); + tsf_register("skill", &cr_skill); + tsf_register("resource", &cr_resource); + tsf_register("race", &cr_race); + tsf_register("direction", &cr_int); + tsf_register("alliance", &cr_alliance); + tsf_register("resources", &cr_resources); + tsf_register("items", &cr_resources); + tsf_register("regions", &cr_regions); - if (!nocr) - register_reporttype("cr", &report_computer, 1 << O_COMPUTER); + if (!nocr) + register_reporttype("cr", &report_computer, 1 << O_COMPUTER); } void creport_cleanup(void) { - while (junkyard) { - translation *t = junkyard; - junkyard = junkyard->next; - free(t); - } - junkyard = 0; + while (junkyard) { + translation *t = junkyard; + junkyard = junkyard->next; + free(t); + } + junkyard = 0; } diff --git a/src/kernel/command.c b/src/kernel/command.c index 68d1fb75d..a9e989a72 100644 --- a/src/kernel/command.c +++ b/src/kernel/command.c @@ -6,9 +6,9 @@ | | Ingo Wilken +-------------------+ Stefan Reich - 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. - + */ #include #include @@ -28,74 +28,75 @@ #include typedef struct command { - parser fun; - void *nodes; + parser fun; + void *nodes; } command; void *stree_find(const syntaxtree * stree, const struct locale *lang) { - while (stree) { - if (stree->lang == lang) - return stree->root; - stree = stree->next; - } - return NULL; + while (stree) { + if (stree->lang == lang) + return stree->root; + stree = stree->next; + } + return NULL; } syntaxtree *stree_create(void) { - syntaxtree *sroot = NULL; - const struct locale *lang = locales; - while (lang) { - syntaxtree *stree = (syntaxtree *) malloc(sizeof(syntaxtree)); - stree->lang = lang; - stree->next = sroot; - stree->root = 0; - sroot = stree; - lang = nextlocale(lang); - } - return sroot; + syntaxtree *sroot = NULL; + const struct locale *lang = locales; + while (lang) { + syntaxtree *stree = (syntaxtree *)malloc(sizeof(syntaxtree)); + stree->lang = lang; + stree->next = sroot; + stree->root = 0; + sroot = stree; + lang = nextlocale(lang); + } + return sroot; } void add_command(void **keys, void *tnext, - const char *str, parser fun) +const char *str, parser fun) { - command *cmd = (command *) malloc(sizeof(command)); - variant var; + command *cmd = (command *)malloc(sizeof(command)); + variant var; - cmd->fun = fun; - cmd->nodes = tnext; - var.v = cmd; - addtoken(keys, str, var); + cmd->fun = fun; + cmd->nodes = tnext; + var.v = cmd; + addtoken(keys, str, var); } static int do_command_i(const void *keys, struct unit *u, struct order *ord) { - const char *c; - variant var; + const char *c; + variant var; - c = getstrtoken(); - if (findtoken(keys, c, &var) == E_TOK_SUCCESS) { - command *cmd = (command *) var.v; - if (cmd->nodes && *c) { - assert(!cmd->fun); - return do_command_i(cmd->nodes, u, ord); - } else if (cmd->fun) { - cmd->fun(cmd->nodes, u, ord); - return E_TOK_SUCCESS; + c = getstrtoken(); + if (findtoken(keys, c, &var) == E_TOK_SUCCESS) { + command *cmd = (command *)var.v; + if (cmd->nodes && *c) { + assert(!cmd->fun); + return do_command_i(cmd->nodes, u, ord); + } + else if (cmd->fun) { + cmd->fun(cmd->nodes, u, ord); + return E_TOK_SUCCESS; + } } - } - return E_TOK_NOMATCH; + return E_TOK_NOMATCH; } void do_command(const void *keys, struct unit *u, struct order *ord) { - init_tokens(ord); - skip_token(); - if (do_command_i(keys, u, ord) != E_TOK_SUCCESS) { - char *cmd = getcommand(ord); - log_warning("%s failed command '%s'\n", unitname(u), cmd); - free(cmd); - } + init_tokens(ord); + skip_token(); + if (do_command_i(keys, u, ord) != E_TOK_SUCCESS) { + char cmd[ORDERSIZE]; + get_command(ord, cmd, sizeof(cmd)); + log_warning("%s failed command '%s'\n", unitname(u), cmd); + } } diff --git a/src/kernel/config.h b/src/kernel/config.h index 4a1f23e25..4a2870f81 100644 --- a/src/kernel/config.h +++ b/src/kernel/config.h @@ -88,6 +88,7 @@ extern "C" { #define ENCCHANCE 10 /* %-Chance für einmalige Zufallsbegegnung */ #define DISPLAYSIZE 8192 /* max. Länge einer Beschreibung, incl trailing 0 */ +#define ORDERSIZE (DISPLAYSIZE*2) /* max. length of an order */ #define NAMESIZE 128 /* max. Länge eines Namens, incl trailing 0 */ #define IDSIZE 16 /* max. Länge einer no (als String), incl trailing 0 */ #define KEYWORDSIZE 16 /* max. Länge eines Keyword, incl trailing 0 */ diff --git a/src/kernel/order.c b/src/kernel/order.c index 22baf4af5..4545e6b03 100644 --- a/src/kernel/order.c +++ b/src/kernel/order.c @@ -93,7 +93,7 @@ keyword_t getkeyword(const order * ord) * This is the inverse function to the parse_order command. Note that * keywords are expanded to their full length. */ -static char* get_command(const order *ord, char *sbuffer, size_t size) { +char* get_command(const order *ord, char *sbuffer, size_t size) { char *bufp = sbuffer; const char *text = ORD_STRING(ord); keyword_t kwd = ORD_KEYWORD(ord); @@ -141,12 +141,6 @@ static char* get_command(const order *ord, char *sbuffer, size_t size) { return sbuffer; } -char *getcommand(const order * ord) -{ - char sbuffer[DISPLAYSIZE * 2]; - return _strdup(get_command(ord, sbuffer, sizeof(sbuffer))); -} - void free_order(order * ord) { if (ord != NULL) { @@ -423,6 +417,7 @@ bool is_repeated(const order * ord) s = getstrtoken(); result = !isparam(s, lang, P_TEMP); parser_popstate(); + // TODO: push/popstate is slow, we can do better. break; default: result = 0; @@ -589,6 +584,12 @@ void push_order(order ** ordp, order * ord) *ordp = ord; } +static char *getcommand(const order * ord) +{ + char cmd[ORDERSIZE]; + return _strdup(get_command(ord, cmd, sizeof(cmd))); +} + void init_tokens(const struct order *ord) { char *cmd = getcommand(ord); diff --git a/src/kernel/order.h b/src/kernel/order.h index b90d67e0b..c56e5ca82 100644 --- a/src/kernel/order.h +++ b/src/kernel/order.h @@ -50,13 +50,14 @@ extern "C" { extern void push_order(struct order **olist, struct order *ord); /* access functions for orders */ - extern keyword_t getkeyword(const order * ord); - extern void set_order(order ** destp, order * src); - extern char *getcommand(const order * ord); - extern bool is_persistent(const order * ord); - extern bool is_exclusive(const order * ord); - extern bool is_repeated(const order * ord); - extern bool is_long(const order * ord); + keyword_t getkeyword(const order * ord); + void set_order(order ** destp, order * src); + char *getcommand(const order * ord); + char* get_command(const order *ord, char *buffer, size_t size); + bool is_persistent(const order * ord); + bool is_exclusive(const order * ord); + bool is_repeated(const order * ord); + bool is_long(const order * ord); extern char *write_order(const order * ord, char *buffer, size_t size); extern void init_tokens(const struct order *ord); /* initialize token parsing */ diff --git a/src/kernel/reports.c b/src/kernel/reports.c index 8758e9c97..51e2369ce 100644 --- a/src/kernel/reports.c +++ b/src/kernel/reports.c @@ -1,7 +1,7 @@ /* Copyright (c) 1998-2010, Enno Rehling - Katja Zedel +Katja Zedel Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above @@ -71,190 +71,198 @@ bool nonr = false; bool noreports = false; const char *visibility[] = { - "none", - "neighbour", - "lighthouse", - "travel", - "far", - "unit", - "battle" + "none", + "neighbour", + "lighthouse", + "travel", + "far", + "unit", + "battle" }; const char *coasts[MAXDIRECTIONS] = { - "coast::nw", - "coast::ne", - "coast::e", - "coast::se", - "coast::sw", - "coast::w" + "coast::nw", + "coast::ne", + "coast::e", + "coast::se", + "coast::sw", + "coast::w" }; static char *groupid(const struct group *g, const struct faction *f) { - typedef char name[OBJECTIDSIZE + 1]; - static name idbuf[8]; - static int nextbuf = 0; - char *buf = idbuf[(++nextbuf) % 8]; - sprintf(buf, "%s (%s)", g->name, factionid(f)); - return buf; + typedef char name[OBJECTIDSIZE + 1]; + static name idbuf[8]; + static int nextbuf = 0; + char *buf = idbuf[(++nextbuf) % 8]; + sprintf(buf, "%s (%s)", g->name, factionid(f)); + return buf; } const char *combatstatus[] = { - "status_aggressive", "status_front", - "status_rear", "status_defensive", - "status_avoid", "status_flee" + "status_aggressive", "status_front", + "status_rear", "status_defensive", + "status_avoid", "status_flee" }; const char *report_kampfstatus(const unit * u, const struct locale *lang) { - static char fsbuf[64]; + static char fsbuf[64]; - strlcpy(fsbuf, LOC(lang, combatstatus[u->status]), sizeof(fsbuf)); - if (fval(u, UFL_NOAID)) { - strcat(fsbuf, ", "); - strcat(fsbuf, LOC(lang, "status_noaid")); - } + strlcpy(fsbuf, LOC(lang, combatstatus[u->status]), sizeof(fsbuf)); + if (fval(u, UFL_NOAID)) { + strcat(fsbuf, ", "); + strcat(fsbuf, LOC(lang, "status_noaid")); + } - return fsbuf; + return fsbuf; } const char *hp_status(const unit * u) { - double p = (double)((double)u->hp / (double)(u->number * unit_max_hp(u))); + double p = (double)((double)u->hp / (double)(u->number * unit_max_hp(u))); - if (p > 2.00) - return mkname("damage", "critical"); - if (p > 1.50) - return mkname("damage", "heavily"); - if (p < 0.50) - return mkname("damage", "badly"); - if (p < 0.75) - return mkname("damage", "wounded"); - if (p < 0.99) - return mkname("damage", "exhausted"); + if (p > 2.00) + return mkname("damage", "critical"); + if (p > 1.50) + return mkname("damage", "heavily"); + if (p < 0.50) + return mkname("damage", "badly"); + if (p < 0.75) + return mkname("damage", "wounded"); + if (p < 0.99) + return mkname("damage", "exhausted"); - return NULL; + return NULL; } void report_item(const unit * owner, const item * i, const faction * viewer, - const char **name, const char **basename, int *number, bool singular) +const char **name, const char **basename, int *number, bool singular) { const resource_type *rsilver = get_resourcetype(R_SILVER); assert(!owner || owner->number); - if (owner && owner->faction == viewer) { - if (name) - *name = - locale_string(viewer->locale, resourcename(i->type->rtype, - ((i->number != 1 && !singular) ? GR_PLURAL : 0))); - if (basename) - *basename = resourcename(i->type->rtype, 0); - if (number) - *number = i->number; - } else if (owner && i->type->rtype == rsilver) { - int pp = i->number / owner->number; - if (number) - *number = 1; - if (pp > 50000 && dragonrace(u_race(owner))) { - if (name) - *name = locale_string(viewer->locale, "dragonhoard"); - if (basename) - *basename = "dragonhoard"; - } else if (pp > 5000) { - if (name) - *name = locale_string(viewer->locale, "moneychest"); - if (basename) - *basename = "moneychest"; - } else if (pp > 500) { - if (name) - *name = locale_string(viewer->locale, "moneybag"); - if (basename) - *basename = "moneybag"; - } else { - if (number) - *number = 0; - if (name) - *name = NULL; - if (basename) - *basename = NULL; + if (owner && owner->faction == viewer) { + if (name) + *name = + locale_string(viewer->locale, resourcename(i->type->rtype, + ((i->number != 1 && !singular) ? GR_PLURAL : 0))); + if (basename) + *basename = resourcename(i->type->rtype, 0); + if (number) + *number = i->number; } - } else { - if (name) - *name = - locale_string(viewer->locale, resourcename(i->type->rtype, - NMF_APPEARANCE | ((i->number != 1 && !singular) ? GR_PLURAL : 0))); - if (basename) - *basename = resourcename(i->type->rtype, NMF_APPEARANCE); - if (number) { - if (fval(i->type, ITF_HERB)) - *number = 1; - else - *number = i->number; + else if (owner && i->type->rtype == rsilver) { + int pp = i->number / owner->number; + if (number) + *number = 1; + if (pp > 50000 && dragonrace(u_race(owner))) { + if (name) + *name = locale_string(viewer->locale, "dragonhoard"); + if (basename) + *basename = "dragonhoard"; + } + else if (pp > 5000) { + if (name) + *name = locale_string(viewer->locale, "moneychest"); + if (basename) + *basename = "moneychest"; + } + else if (pp > 500) { + if (name) + *name = locale_string(viewer->locale, "moneybag"); + if (basename) + *basename = "moneybag"; + } + else { + if (number) + *number = 0; + if (name) + *name = NULL; + if (basename) + *basename = NULL; + } + } + else { + if (name) + *name = + locale_string(viewer->locale, resourcename(i->type->rtype, + NMF_APPEARANCE | ((i->number != 1 && !singular) ? GR_PLURAL : 0))); + if (basename) + *basename = resourcename(i->type->rtype, NMF_APPEARANCE); + if (number) { + if (fval(i->type, ITF_HERB)) + *number = 1; + else + *number = i->number; + } } - } } int *nmrs = NULL; int update_nmrs(void) { - int i, newplayers = 0; - faction *f; - int turn = global.data_turn; + int i, newplayers = 0; + faction *f; + int turn = global.data_turn; - if (nmrs == NULL) - nmrs = malloc(sizeof(int) * (NMRTimeout() + 1)); - for (i = 0; i <= NMRTimeout(); ++i) { - nmrs[i] = 0; - } - - for (f = factions; f; f = f->next) { - if (fval(f, FFL_ISNEW)) { - ++newplayers; - } else if (!is_monsters(f) && f->alive) { - int nmr = turn - f->lastorders + 1; - if (nmr < 0 || nmr > NMRTimeout()) { - log_error("faction %s has %d NMRS\n", factionid(f), nmr); - nmr = _max(0, nmr); - nmr = _min(nmr, NMRTimeout()); - } - ++nmrs[nmr]; + if (nmrs == NULL) + nmrs = malloc(sizeof(int) * (NMRTimeout() + 1)); + for (i = 0; i <= NMRTimeout(); ++i) { + nmrs[i] = 0; } - } - return newplayers; + + for (f = factions; f; f = f->next) { + if (fval(f, FFL_ISNEW)) { + ++newplayers; + } + else if (!is_monsters(f) && f->alive) { + int nmr = turn - f->lastorders + 1; + if (nmr < 0 || nmr > NMRTimeout()) { + log_error("faction %s has %d NMRS\n", factionid(f), nmr); + nmr = _max(0, nmr); + nmr = _min(nmr, NMRTimeout()); + } + ++nmrs[nmr]; + } + } + return newplayers; } #define ORDERS_IN_NR 1 static size_t buforder(char *bufp, size_t size, const order * ord, int mode) { - size_t tsize = 0; - int bytes; + size_t tsize = 0; + int bytes; - bytes = (int)strlcpy(bufp, ", \"", size); - tsize += bytes; - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - if (mode < ORDERS_IN_NR) { - char *cmd = getcommand(ord); - bytes = (int)strlcpy(bufp, cmd, size); - free(cmd); - } else { - bytes = (int)strlcpy(bufp, "...", size); - } - tsize += bytes; - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); + bytes = (int)strlcpy(bufp, ", \"", size); + tsize += bytes; + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + if (mode < ORDERS_IN_NR) { + char cmd[ORDERSIZE]; + get_command(ord, cmd, sizeof(cmd)); + bytes = (int)strlcpy(bufp, cmd, size); + } + else { + bytes = (int)strlcpy(bufp, "...", size); + } + tsize += bytes; + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); - if (size > 1) { - *bufp++ = '\"'; - --size; - } else { - WARN_STATIC_BUFFER(); - } - ++tsize; + if (size > 1) { + *bufp++ = '\"'; + --size; + } + else { + WARN_STATIC_BUFFER(); + } + ++tsize; - return tsize; + return tsize; } /** create a report of a list of items to a non-owner. @@ -265,82 +273,83 @@ static size_t buforder(char *bufp, size_t size, const order * ord, int mode) */ int report_items(const item * items, item * result, int size, const unit * owner, - const faction * viewer) +const faction * viewer) { - const item *itm; - int n = 0; /* number of results */ + const item *itm; + int n = 0; /* number of results */ - assert(owner == NULL || viewer != owner->faction - || !"not required for owner=viewer!"); - assert(size); + assert(owner == NULL || viewer != owner->faction + || !"not required for owner=viewer!"); + assert(size); - for (itm = items; itm; itm = itm->next) { - item *ishow; - const char *ic; + for (itm = items; itm; itm = itm->next) { + item *ishow; + const char *ic; - report_item(owner, itm, viewer, NULL, &ic, NULL, false); - if (ic && *ic) { - for (ishow = result; ishow != result + n; ++ishow) { - const char *sc; + report_item(owner, itm, viewer, NULL, &ic, NULL, false); + if (ic && *ic) { + for (ishow = result; ishow != result + n; ++ishow) { + const char *sc; - if (ishow->type == itm->type) - sc = ic; - else - report_item(owner, ishow, viewer, NULL, &sc, NULL, false); - if (sc == ic || strcmp(sc, ic) == 0) { - ishow->number += itm->number; - break; + if (ishow->type == itm->type) + sc = ic; + else + report_item(owner, ishow, viewer, NULL, &sc, NULL, false); + if (sc == ic || strcmp(sc, ic) == 0) { + ishow->number += itm->number; + break; + } + } + if (ishow == result + n) { + if (n == size) { + log_error("too many items to report, increase buffer size.\n"); + return -1; + } + result[n].number = itm->number; + result[n].type = itm->type; + result[n].next = (n + 1 == size) ? NULL : result + n + 1; + ++n; + } } - } - if (ishow == result + n) { - if (n == size) { - log_error("too many items to report, increase buffer size.\n"); - return -1; - } - result[n].number = itm->number; - result[n].type = itm->type; - result[n].next = (n + 1 == size) ? NULL : result + n + 1; - ++n; - } } - } - if (n > 0) - result[n - 1].next = NULL; - return n; + if (n > 0) + result[n - 1].next = NULL; + return n; } static void report_resource(resource_report * result, const char *name, int number, - int level) +int level) { - result->name = name; - result->number = number; - result->level = level; + result->name = name; + result->number = number; + result->level = level; } void report_race(const struct unit *u, const char **name, const char **illusion) { - if (illusion) { - const race *irace = u_irace(u); - if (irace && irace != u_race(u)) { - *illusion = irace->_name[0]; - } else { - *illusion = NULL; + if (illusion) { + const race *irace = u_irace(u); + if (irace && irace != u_race(u)) { + *illusion = irace->_name[0]; + } + else { + *illusion = NULL; + } } - } - if (name) { - *name = u_race(u)->_name[0]; - if (fval(u_race(u), RCF_SHAPESHIFTANY)) { - const char *str = get_racename(u->attribs); - if (str) - *name = str; + if (name) { + *name = u_race(u)->_name[0]; + if (fval(u_race(u), RCF_SHAPESHIFTANY)) { + const char *str = get_racename(u->attribs); + if (str) + *name = str; + } } - } } void report_building(const struct building *b, const char **name, - const char **illusion) +const char **illusion) { const struct building_type *bt_illusion; @@ -349,12 +358,12 @@ report_building(const struct building *b, const char **name, } if (illusion) { *illusion = NULL; - + bt_illusion = bt_find("illusioncastle"); if (bt_illusion && b->type == bt_illusion) { const attrib *a = a_findc(b->attribs, &at_icastle); if (a != NULL) { - icastle_data *icastle = (icastle_data *) a->data.v; + icastle_data *icastle = (icastle_data *)a->data.v; *illusion = buildingtype(icastle->type, b, b->size); } } @@ -363,479 +372,494 @@ report_building(const struct building *b, const char **name, int report_resources(const seen_region * sr, resource_report * result, int size, - const faction * viewer) +const faction * viewer) { - const region *r = sr->r; - int n = 0; + const region *r = sr->r; + int n = 0; - if (r->land) { - int peasants = rpeasants(r); - int money = rmoney(r); - int horses = rhorses(r); - int trees = rtrees(r, 2); - int saplings = rtrees(r, 1); - bool mallorn = fval(r, RF_MALLORN) != 0; + if (r->land) { + int peasants = rpeasants(r); + int money = rmoney(r); + int horses = rhorses(r); + int trees = rtrees(r, 2); + int saplings = rtrees(r, 1); + bool mallorn = fval(r, RF_MALLORN) != 0; - if (money) { - if (n >= size) - return -1; - report_resource(result + n, "rm_money", money, -1); - ++n; - } - if (peasants) { - if (n >= size) - return -1; - report_resource(result + n, "rm_peasant", peasants, -1); - ++n; - } - if (horses) { - if (n >= size) - return -1; - report_resource(result + n, "rm_horse", horses, -1); - ++n; - } - if (saplings) { - if (n >= size) - return -1; - report_resource(result + n, mallorn ? "rm_mallornsapling" : "rm_sapling", - saplings, -1); - ++n; - } - if (trees) { - if (n >= size) - return -1; - report_resource(result + n, mallorn ? "rm_mallorn" : "rm_tree", trees, - -1); - ++n; - } - } - - if (sr->mode >= see_unit) { - rawmaterial *res = r->resources; - while (res) { - int maxskill = 0; - const item_type *itype = resource2item(res->type->rtype); - int level = res->level + itype->construction->minskill - 1; - int visible = -1; - if (res->type->visible == NULL) { - visible = res->amount; - level = res->level + itype->construction->minskill - 1; - } else { - const unit *u; - for (u = r->units; visible != res->amount && u != NULL; u = u->next) { - if (u->faction == viewer) { - int s = eff_skill(u, itype->construction->skill, r); - if (s > maxskill) { - maxskill = s; - visible = res->type->visible(res, maxskill); - } - } + if (money) { + if (n >= size) + return -1; + report_resource(result + n, "rm_money", money, -1); + ++n; + } + if (peasants) { + if (n >= size) + return -1; + report_resource(result + n, "rm_peasant", peasants, -1); + ++n; + } + if (horses) { + if (n >= size) + return -1; + report_resource(result + n, "rm_horse", horses, -1); + ++n; + } + if (saplings) { + if (n >= size) + return -1; + report_resource(result + n, mallorn ? "rm_mallornsapling" : "rm_sapling", + saplings, -1); + ++n; + } + if (trees) { + if (n >= size) + return -1; + report_resource(result + n, mallorn ? "rm_mallorn" : "rm_tree", trees, + -1); + ++n; } - } - if (level >= 0 && visible >= 0) { - if (n >= size) - return -1; - report_resource(result + n, res->type->name, visible, level); - n++; - } - res = res->next; } - } - return n; + + if (sr->mode >= see_unit) { + rawmaterial *res = r->resources; + while (res) { + int maxskill = 0; + const item_type *itype = resource2item(res->type->rtype); + int level = res->level + itype->construction->minskill - 1; + int visible = -1; + if (res->type->visible == NULL) { + visible = res->amount; + level = res->level + itype->construction->minskill - 1; + } + else { + const unit *u; + for (u = r->units; visible != res->amount && u != NULL; u = u->next) { + if (u->faction == viewer) { + int s = eff_skill(u, itype->construction->skill, r); + if (s > maxskill) { + maxskill = s; + visible = res->type->visible(res, maxskill); + } + } + } + } + if (level >= 0 && visible >= 0) { + if (n >= size) + return -1; + report_resource(result + n, res->type->name, visible, level); + n++; + } + res = res->next; + } + } + return n; } int bufunit(const faction * f, const unit * u, int indent, int mode, char *buf, - size_t size) +size_t size) { - int i, dh; - int getarnt = fval(u, UFL_ANON_FACTION); - const char *pzTmp, *str; - building *b; - bool isbattle = (bool) (mode == see_battle); - int telepath_see = 0; - attrib *a_fshidden = NULL; - item *itm; - item *show; - faction *fv = visible_faction(f, u); - char *bufp = buf; - bool itemcloak = false; - const curse_type *itemcloak_ct = 0; - int bytes; - item result[MAX_INVENTORY]; + int i, dh; + int getarnt = fval(u, UFL_ANON_FACTION); + const char *pzTmp, *str; + building *b; + bool isbattle = (bool)(mode == see_battle); + int telepath_see = 0; + attrib *a_fshidden = NULL; + item *itm; + item *show; + faction *fv = visible_faction(f, u); + char *bufp = buf; + bool itemcloak = false; + const curse_type *itemcloak_ct = 0; + int bytes; + item result[MAX_INVENTORY]; - itemcloak_ct = ct_find("itemcloak"); - if (itemcloak_ct) { - itemcloak = curse_active(get_curse(u->attribs, itemcloak_ct)); - } - - bytes = (int)strlcpy(bufp, unitname(u), size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - - if (!isbattle) { - attrib *a_otherfaction = a_find(u->attribs, &at_otherfaction); - if (u->faction == f) { - if (fval(u, UFL_GROUP)) { - attrib *a = a_find(u->attribs, &at_group); - if (a) { - group *g = (group *) a->data.v; - bytes = (int)strlcpy(bufp, ", ", size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - bytes = (int)strlcpy(bufp, groupid(g, f), size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - } - } - if (getarnt) { - bytes = (int)strlcpy(bufp, ", ", size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - bytes = (int)strlcpy(bufp, LOC(f->locale, "anonymous"), size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - } else if (a_otherfaction) { - faction *otherfaction = get_otherfaction(a_otherfaction); - if (otherfaction) { - bytes = (int)strlcpy(bufp, ", ", size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - bytes = (int)strlcpy(bufp, factionname(otherfaction), size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - } - } - } else { - if (getarnt) { - bytes = (int)strlcpy(bufp, ", ", size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - bytes = (int)strlcpy(bufp, LOC(f->locale, "anonymous"), size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - } else { - if (a_otherfaction && alliedunit(u, f, HELP_FSTEALTH)) { - faction *f = get_otherfaction(a_otherfaction); - bytes = - _snprintf(bufp, size, ", %s (%s)", factionname(f), - factionname(u->faction)); - if (bytes < 0 || wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - } else { - bytes = (int)strlcpy(bufp, ", ", size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - bytes = (int)strlcpy(bufp, factionname(fv), size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - } - } + itemcloak_ct = ct_find("itemcloak"); + if (itemcloak_ct) { + itemcloak = curse_active(get_curse(u->attribs, itemcloak_ct)); } - } - bytes = (int)strlcpy(bufp, ", ", size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - - if (u->faction != f && a_fshidden && a_fshidden->data.ca[0] == 1 - && effskill(u, SK_STEALTH) >= 6) { - bytes = (int)strlcpy(bufp, "? ", size); - } else { - bytes = _snprintf(bufp, size, "%d ", u->number); - } - if (bytes < 0 || wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - - pzTmp = get_racename(u->attribs); - if (pzTmp) { - bytes = (int)strlcpy(bufp, pzTmp, size); + bytes = (int)strlcpy(bufp, unitname(u), size); if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - if (u->faction == f && fval(u_race(u), RCF_SHAPESHIFTANY)) { - bytes = (int)strlcpy(bufp, " (", size); - if (wrptr(&bufp, &size, bytes) != 0) WARN_STATIC_BUFFER(); - bytes = (int)strlcpy(bufp, racename(f->locale, u, u_race(u)), size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - if (size > 1) { - strcpy(bufp++, ")"); - --size; - } - } - } else { - const race *irace = u_irace(u); - bytes = (int)strlcpy(bufp, racename(f->locale, u, irace), size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - if (u->faction == f && irace != u_race(u)) { - bytes = (int)strlcpy(bufp, " (", size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - bytes = (int)strlcpy(bufp, racename(f->locale, u, u_race(u)), size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - if (size > 1) { - strcpy(bufp++, ")"); - --size; - } - } - } - if (fval(u, UFL_HERO) && (u->faction == f || omniscient(f))) { + if (!isbattle) { + attrib *a_otherfaction = a_find(u->attribs, &at_otherfaction); + if (u->faction == f) { + if (fval(u, UFL_GROUP)) { + attrib *a = a_find(u->attribs, &at_group); + if (a) { + group *g = (group *)a->data.v; + bytes = (int)strlcpy(bufp, ", ", size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + bytes = (int)strlcpy(bufp, groupid(g, f), size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + } + } + if (getarnt) { + bytes = (int)strlcpy(bufp, ", ", size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + bytes = (int)strlcpy(bufp, LOC(f->locale, "anonymous"), size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + } + else if (a_otherfaction) { + faction *otherfaction = get_otherfaction(a_otherfaction); + if (otherfaction) { + bytes = (int)strlcpy(bufp, ", ", size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + bytes = (int)strlcpy(bufp, factionname(otherfaction), size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + } + } + } + else { + if (getarnt) { + bytes = (int)strlcpy(bufp, ", ", size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + bytes = (int)strlcpy(bufp, LOC(f->locale, "anonymous"), size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + } + else { + if (a_otherfaction && alliedunit(u, f, HELP_FSTEALTH)) { + faction *f = get_otherfaction(a_otherfaction); + bytes = + _snprintf(bufp, size, ", %s (%s)", factionname(f), + factionname(u->faction)); + if (bytes < 0 || wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + } + else { + bytes = (int)strlcpy(bufp, ", ", size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + bytes = (int)strlcpy(bufp, factionname(fv), size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + } + } + } + } + bytes = (int)strlcpy(bufp, ", ", size); if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - bytes = (int)strlcpy(bufp, LOC(f->locale, "hero"), size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - } - /* status */ - - if (u->number && (u->faction == f || telepath_see || isbattle)) { - const char *c = hp_status(u); - c = c ? locale_string(f->locale, c) : 0; - bytes = (int)strlcpy(bufp, ", ", size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - bytes = (int)strlcpy(bufp, report_kampfstatus(u, f->locale), size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - if (c || fval(u, UFL_HUNGER)) { - bytes = (int)strlcpy(bufp, " (", size); - if (wrptr(&bufp, &size, bytes) != 0) WARN_STATIC_BUFFER(); - if (c) { - bytes = (int)strlcpy(bufp, c, size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - } - if (fval(u, UFL_HUNGER)) { - if (c) { - bytes = (int)strlcpy(bufp, ", ", size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - } - bytes = (int)strlcpy(bufp, LOC(f->locale, "unit_hungers"), size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - } - if (size > 1) { - strcpy(bufp++, ")"); - --size; - } + + if (u->faction != f && a_fshidden && a_fshidden->data.ca[0] == 1 + && effskill(u, SK_STEALTH) >= 6) { + bytes = (int)strlcpy(bufp, "? ", size); } - } - if (is_guard(u, GUARD_ALL) != 0) { - bytes = (int)strlcpy(bufp, ", ", size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - bytes = (int)strlcpy(bufp, LOC(f->locale, "unit_guards"), size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - } - - if ((b = usiege(u)) != NULL) { - bytes = (int)strlcpy(bufp, ", belagert ", size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - bytes = (int)strlcpy(bufp, buildingname(b), size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - } - - dh = 0; - if (u->faction == f || telepath_see) { - skill *sv; - for (sv = u->skills; sv != u->skills + u->skill_size; ++sv) { - bytes = (int)spskill(bufp, size, f->locale, u, sv, &dh, 1); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - } - } - - dh = 0; - if (f == u->faction || telepath_see || omniscient(f)) { - show = u->items; - } else if (!itemcloak && mode >= see_unit && !(a_fshidden - && a_fshidden->data.ca[1] == 1 && effskill(u, SK_STEALTH) >= 3)) { - int n = report_items(u->items, result, MAX_INVENTORY, u, f); - assert(n >= 0); - if (n > 0) - show = result; - else - show = NULL; - } else { - show = NULL; - } - for (itm = show; itm; itm = itm->next) { - const char *ic; - int in, bytes; - report_item(u, itm, f, &ic, NULL, &in, false); - if (in == 0 || ic == NULL) - continue; - bytes = (int)strlcpy(bufp, ", ", size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - - if (!dh) { - bytes = _snprintf(bufp, size, "%s: ", LOC(f->locale, "nr_inventory")); - if (bytes < 0 || wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - dh = 1; - } - if (in == 1) { - bytes = (int)strlcpy(bufp, ic, size); - } else { - bytes = _snprintf(bufp, size, "%d %s", in, ic); + else { + bytes = _snprintf(bufp, size, "%d ", u->number); } if (bytes < 0 || wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - } - - if (u->faction == f || telepath_see) { - spellbook *book = unit_get_spellbook(u); - - if (book) { - quicklist *ql = book->spells; - int qi, header, maxlevel = effskill(u, SK_MAGIC); - int bytes = _snprintf(bufp, size, ". Aura %d/%d", get_spellpoints(u), max_spellpoints(u->region, u)); - if (bytes < 0 || wrptr(&bufp, &size, bytes) != 0) { WARN_STATIC_BUFFER(); - } - for (header = 0, qi = 0; ql; ql_advance(&ql, &qi, 1)) { - spellbook_entry * sbe = (spellbook_entry *) ql_get(ql, qi); - if (sbe->level <= maxlevel) { - if (!header) { - bytes = _snprintf(bufp, size, ", %s: ", LOC(f->locale, "nr_spells")); - header = 1; - } else { - bytes = (int)strlcpy(bufp, ", ", size); - } - if (bytes < 0 || wrptr(&bufp, &size, bytes) != 0) { + pzTmp = get_racename(u->attribs); + if (pzTmp) { + bytes = (int)strlcpy(bufp, pzTmp, size); + if (wrptr(&bufp, &size, bytes) != 0) WARN_STATIC_BUFFER(); - } - bytes = (int)strlcpy(bufp, spell_name(sbe->sp, f->locale), size); - if (bytes < 0 || wrptr(&bufp, &size, bytes) != 0) { - WARN_STATIC_BUFFER(); - } - } - } - - for (i = 0; i != MAXCOMBATSPELLS; ++i) { - if (get_combatspell(u, i)) - break; - } - if (i != MAXCOMBATSPELLS) { - bytes = - _snprintf(bufp, size, ", %s: ", LOC(f->locale, "nr_combatspells")); - if (bytes < 0 || wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - - dh = 0; - for (i = 0; i < MAXCOMBATSPELLS; i++) { - const spell *sp; - if (!dh) { - dh = 1; - } else { - bytes = (int)strlcpy(bufp, ", ", size); - if (bytes && wrptr(&bufp, &size, bytes) != 0) { - WARN_STATIC_BUFFER(); - } - } - sp = get_combatspell(u, i); - if (sp) { - int sl = get_combatspelllevel(u, i); - bytes = - (int)strlcpy(bufp, spell_name(sp, u->faction->locale), size); - if (bytes && wrptr(&bufp, &size, bytes) != 0) { - WARN_STATIC_BUFFER(); - } - - if (sl > 0) { - bytes = _snprintf(bufp, size, " (%d)", sl); - if (bytes < 0 || wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - } - } else { - bytes = (int)strlcpy(bufp, LOC(f->locale, "nr_nospells"), size); - if (bytes && wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - } - } - } - } - if (!isbattle) { - bool printed = 0; - order *ord;; - for (ord = u->old_orders; ord; ord = ord->next) { - if (is_repeated(ord)) { - if (printed < ORDERS_IN_NR) { - bytes = (int)buforder(bufp, size, ord, printed++); + if (u->faction == f && fval(u_race(u), RCF_SHAPESHIFTANY)) { + bytes = (int)strlcpy(bufp, " (", size); if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - } else - break; - } - } - if (printed < ORDERS_IN_NR) - for (ord = u->orders; ord; ord = ord->next) { - if (is_repeated(ord)) { - if (printed < ORDERS_IN_NR) { - bytes = (int)buforder(bufp, size, ord, printed++); - if (wrptr(&bufp, &size, bytes) != 0) WARN_STATIC_BUFFER(); - } else - break; - } + bytes = (int)strlcpy(bufp, racename(f->locale, u, u_race(u)), size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + if (size > 1) { + strcpy(bufp++, ")"); + --size; + } } } - } - i = 0; - - str = u_description(u, f->locale); - if (str) { - bytes = (int)strlcpy(bufp, "; ", size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - - bytes = (int)strlcpy(bufp, str, size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - - i = str[strlen(str) - 1]; - } - if (i != '!' && i != '?' && i != '.') { - if (size > 1) { - strcpy(bufp++, "."); - --size; + else { + const race *irace = u_irace(u); + bytes = (int)strlcpy(bufp, racename(f->locale, u, irace), size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + if (u->faction == f && irace != u_race(u)) { + bytes = (int)strlcpy(bufp, " (", size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + bytes = (int)strlcpy(bufp, racename(f->locale, u, u_race(u)), size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + if (size > 1) { + strcpy(bufp++, ")"); + --size; + } + } } - } - pzTmp = uprivate(u); - if (u->faction == f && pzTmp) { - bytes = (int)strlcpy(bufp, " (Bem: ", size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - bytes = (int)strlcpy(bufp, pzTmp, size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - bytes = (int)strlcpy(bufp, ")", size); - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - } - dh = 0; - if (!getarnt && f) { - if (alliedfaction(rplane(u->region), f, fv, HELP_ALL)) { - dh = 1; + if (fval(u, UFL_HERO) && (u->faction == f || omniscient(f))) { + bytes = (int)strlcpy(bufp, ", ", size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + bytes = (int)strlcpy(bufp, LOC(f->locale, "hero"), size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); } - } - if (size <= 1) { - log_warning("bufunit ran out of space after writing %u bytes.\n", (bufp - buf)); - } - return dh; + /* status */ + + if (u->number && (u->faction == f || telepath_see || isbattle)) { + const char *c = hp_status(u); + c = c ? locale_string(f->locale, c) : 0; + bytes = (int)strlcpy(bufp, ", ", size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + bytes = (int)strlcpy(bufp, report_kampfstatus(u, f->locale), size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + if (c || fval(u, UFL_HUNGER)) { + bytes = (int)strlcpy(bufp, " (", size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + if (c) { + bytes = (int)strlcpy(bufp, c, size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + } + if (fval(u, UFL_HUNGER)) { + if (c) { + bytes = (int)strlcpy(bufp, ", ", size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + } + bytes = (int)strlcpy(bufp, LOC(f->locale, "unit_hungers"), size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + } + if (size > 1) { + strcpy(bufp++, ")"); + --size; + } + } + } + if (is_guard(u, GUARD_ALL) != 0) { + bytes = (int)strlcpy(bufp, ", ", size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + bytes = (int)strlcpy(bufp, LOC(f->locale, "unit_guards"), size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + } + + if ((b = usiege(u)) != NULL) { + bytes = (int)strlcpy(bufp, ", belagert ", size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + bytes = (int)strlcpy(bufp, buildingname(b), size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + } + + dh = 0; + if (u->faction == f || telepath_see) { + skill *sv; + for (sv = u->skills; sv != u->skills + u->skill_size; ++sv) { + bytes = (int)spskill(bufp, size, f->locale, u, sv, &dh, 1); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + } + } + + dh = 0; + if (f == u->faction || telepath_see || omniscient(f)) { + show = u->items; + } + else if (!itemcloak && mode >= see_unit && !(a_fshidden + && a_fshidden->data.ca[1] == 1 && effskill(u, SK_STEALTH) >= 3)) { + int n = report_items(u->items, result, MAX_INVENTORY, u, f); + assert(n >= 0); + if (n > 0) + show = result; + else + show = NULL; + } + else { + show = NULL; + } + for (itm = show; itm; itm = itm->next) { + const char *ic; + int in, bytes; + report_item(u, itm, f, &ic, NULL, &in, false); + if (in == 0 || ic == NULL) + continue; + bytes = (int)strlcpy(bufp, ", ", size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + + if (!dh) { + bytes = _snprintf(bufp, size, "%s: ", LOC(f->locale, "nr_inventory")); + if (bytes < 0 || wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + dh = 1; + } + if (in == 1) { + bytes = (int)strlcpy(bufp, ic, size); + } + else { + bytes = _snprintf(bufp, size, "%d %s", in, ic); + } + if (bytes < 0 || wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + } + + if (u->faction == f || telepath_see) { + spellbook *book = unit_get_spellbook(u); + + if (book) { + quicklist *ql = book->spells; + int qi, header, maxlevel = effskill(u, SK_MAGIC); + int bytes = _snprintf(bufp, size, ". Aura %d/%d", get_spellpoints(u), max_spellpoints(u->region, u)); + if (bytes < 0 || wrptr(&bufp, &size, bytes) != 0) { + WARN_STATIC_BUFFER(); + } + + for (header = 0, qi = 0; ql; ql_advance(&ql, &qi, 1)) { + spellbook_entry * sbe = (spellbook_entry *)ql_get(ql, qi); + if (sbe->level <= maxlevel) { + if (!header) { + bytes = _snprintf(bufp, size, ", %s: ", LOC(f->locale, "nr_spells")); + header = 1; + } + else { + bytes = (int)strlcpy(bufp, ", ", size); + } + if (bytes < 0 || wrptr(&bufp, &size, bytes) != 0) { + WARN_STATIC_BUFFER(); + } + bytes = (int)strlcpy(bufp, spell_name(sbe->sp, f->locale), size); + if (bytes < 0 || wrptr(&bufp, &size, bytes) != 0) { + WARN_STATIC_BUFFER(); + } + } + } + + for (i = 0; i != MAXCOMBATSPELLS; ++i) { + if (get_combatspell(u, i)) + break; + } + if (i != MAXCOMBATSPELLS) { + bytes = + _snprintf(bufp, size, ", %s: ", LOC(f->locale, "nr_combatspells")); + if (bytes < 0 || wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + + dh = 0; + for (i = 0; i < MAXCOMBATSPELLS; i++) { + const spell *sp; + if (!dh) { + dh = 1; + } + else { + bytes = (int)strlcpy(bufp, ", ", size); + if (bytes && wrptr(&bufp, &size, bytes) != 0) { + WARN_STATIC_BUFFER(); + } + } + sp = get_combatspell(u, i); + if (sp) { + int sl = get_combatspelllevel(u, i); + bytes = + (int)strlcpy(bufp, spell_name(sp, u->faction->locale), size); + if (bytes && wrptr(&bufp, &size, bytes) != 0) { + WARN_STATIC_BUFFER(); + } + + if (sl > 0) { + bytes = _snprintf(bufp, size, " (%d)", sl); + if (bytes < 0 || wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + } + } + else { + bytes = (int)strlcpy(bufp, LOC(f->locale, "nr_nospells"), size); + if (bytes && wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + } + } + } + } + if (!isbattle) { + bool printed = 0; + order *ord;; + for (ord = u->old_orders; ord; ord = ord->next) { + if (is_repeated(ord)) { + if (printed < ORDERS_IN_NR) { + bytes = (int)buforder(bufp, size, ord, printed++); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + } + else + break; + } + } + if (printed < ORDERS_IN_NR) + for (ord = u->orders; ord; ord = ord->next) { + if (is_repeated(ord)) { + if (printed < ORDERS_IN_NR) { + bytes = (int)buforder(bufp, size, ord, printed++); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + } + else + break; + } + } + } + } + i = 0; + + str = u_description(u, f->locale); + if (str) { + bytes = (int)strlcpy(bufp, "; ", size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + + bytes = (int)strlcpy(bufp, str, size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + + i = str[strlen(str) - 1]; + } + if (i != '!' && i != '?' && i != '.') { + if (size > 1) { + strcpy(bufp++, "."); + --size; + } + } + pzTmp = uprivate(u); + if (u->faction == f && pzTmp) { + bytes = (int)strlcpy(bufp, " (Bem: ", size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + bytes = (int)strlcpy(bufp, pzTmp, size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + bytes = (int)strlcpy(bufp, ")", size); + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + } + + dh = 0; + if (!getarnt && f) { + if (alliedfaction(rplane(u->region), f, fv, HELP_ALL)) { + dh = 1; + } + } + if (size <= 1) { + log_warning("bufunit ran out of space after writing %u bytes.\n", (bufp - buf)); + } + return dh; } /* TODO: telepath_see wird nicht berücksichtigt: Parteien mit @@ -845,271 +869,275 @@ bufunit(const faction * f, const unit * u, int indent, int mode, char *buf, size_t spskill(char *buffer, size_t size, const struct locale * lang, - const struct unit * u, struct skill * sv, int *dh, int days) +const struct unit * u, struct skill * sv, int *dh, int days) { - char *bufp = buffer; - int i, effsk; - int bytes; - size_t tsize = 0; + char *bufp = buffer; + int i, effsk; + int bytes; + size_t tsize = 0; - if (!u->number) - return 0; - if (sv->level <= 0) { - if (sv->old <= 0 || (u->faction->options & want(O_SHOWSKCHANGE)) == 0) { - return 0; + if (!u->number) + return 0; + if (sv->level <= 0) { + if (sv->old <= 0 || (u->faction->options & want(O_SHOWSKCHANGE)) == 0) { + return 0; + } } - } - bytes = (int)strlcpy(bufp, ", ", size); - tsize += bytes; - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - - if (!*dh) { - bytes = (int)strlcpy(bufp, LOC(lang, "nr_skills"), size); + bytes = (int)strlcpy(bufp, ", ", size); tsize += bytes; if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); + WARN_STATIC_BUFFER(); - bytes = (int)strlcpy(bufp, ": ", size); + if (!*dh) { + bytes = (int)strlcpy(bufp, LOC(lang, "nr_skills"), size); + tsize += bytes; + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + + bytes = (int)strlcpy(bufp, ": ", size); + tsize += bytes; + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + + *dh = 1; + } + bytes = (int)strlcpy(bufp, skillname(sv->id, lang), size); tsize += bytes; if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - - *dh = 1; - } - bytes = (int)strlcpy(bufp, skillname(sv->id, lang), size); - tsize += bytes; - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - - bytes = (int)strlcpy(bufp, " ", size); - tsize += bytes; - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - - if (sv->id == SK_MAGIC) { - sc_mage *mage = get_mage(u); - if (mage && mage->magietyp != M_GRAY) { - bytes = - (int)strlcpy(bufp, LOC(lang, mkname("school", - magic_school[mage->magietyp])), size); - tsize += bytes; - if (wrptr(&bufp, &size, bytes) != 0) WARN_STATIC_BUFFER(); - bytes = (int)strlcpy(bufp, " ", size); - tsize += bytes; - if (wrptr(&bufp, &size, bytes) != 0) + bytes = (int)strlcpy(bufp, " ", size); + tsize += bytes; + if (wrptr(&bufp, &size, bytes) != 0) WARN_STATIC_BUFFER(); - } - } - if (sv->id == SK_STEALTH && fval(u, UFL_STEALTH)) { - i = u_geteffstealth(u); - if (i >= 0) { - bytes = slprintf(bufp, size, "%d/", i); - tsize += bytes; - if (wrptr(&bufp, &size, bytes) != 0) + if (sv->id == SK_MAGIC) { + sc_mage *mage = get_mage(u); + if (mage && mage->magietyp != M_GRAY) { + bytes = + (int)strlcpy(bufp, LOC(lang, mkname("school", + magic_school[mage->magietyp])), size); + tsize += bytes; + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + + bytes = (int)strlcpy(bufp, " ", size); + tsize += bytes; + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + } + } + + if (sv->id == SK_STEALTH && fval(u, UFL_STEALTH)) { + i = u_geteffstealth(u); + if (i >= 0) { + bytes = slprintf(bufp, size, "%d/", i); + tsize += bytes; + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + } + } + + effsk = effskill(u, sv->id); + bytes = slprintf(bufp, size, "%d", effsk); + tsize += bytes; + if (wrptr(&bufp, &size, bytes) != 0) WARN_STATIC_BUFFER(); + + if (u->faction->options & want(O_SHOWSKCHANGE)) { + int oldeff = 0; + int diff; + + if (sv->old > 0) { + oldeff = sv->old + get_modifier(u, sv->id, sv->old, u->region, false); + } + + oldeff = _max(0, oldeff); + diff = effsk - oldeff; + + if (diff != 0) { + bytes = slprintf(bufp, size, " (%s%d)", (diff > 0) ? "+" : "", diff); + tsize += bytes; + if (wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + } } - } - - effsk = effskill(u, sv->id); - bytes = slprintf(bufp, size, "%d", effsk); - tsize += bytes; - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - - if (u->faction->options & want(O_SHOWSKCHANGE)) { - int oldeff = 0; - int diff; - - if (sv->old > 0) { - oldeff = sv->old + get_modifier(u, sv->id, sv->old, u->region, false); - } - - oldeff = _max(0, oldeff); - diff = effsk - oldeff; - - if (diff != 0) { - bytes = slprintf(bufp, size, " (%s%d)", (diff > 0) ? "+" : "", diff); - tsize += bytes; - if (wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - } - } - return tsize; + return tsize; } void lparagraph(struct strlist **SP, char *s, int indent, char mark) { - /* Die Liste SP wird mit dem String s aufgefuellt, mit indent und einer - * mark, falls angegeben. SP wurde also auf 0 gesetzt vor dem Aufruf. - * Vgl. spunit (). */ + /* Die Liste SP wird mit dem String s aufgefuellt, mit indent und einer + * mark, falls angegeben. SP wurde also auf 0 gesetzt vor dem Aufruf. + * Vgl. spunit (). */ - char *buflocal = calloc(strlen(s) + indent + 1, sizeof(char)); + char *buflocal = calloc(strlen(s) + indent + 1, sizeof(char)); - if (indent) { - memset(buflocal, ' ', indent); - if (mark) - buflocal[indent - 2] = mark; - } - strcpy(buflocal + indent, s); - addstrlist(SP, buflocal); - free(buflocal); + if (indent) { + memset(buflocal, ' ', indent); + if (mark) + buflocal[indent - 2] = mark; + } + strcpy(buflocal + indent, s); + addstrlist(SP, buflocal); + free(buflocal); } void spunit(struct strlist **SP, const struct faction *f, const unit * u, int indent, - int mode) +int mode) { - char buf[DISPLAYSIZE]; - int dh = bufunit(f, u, indent, mode, buf, sizeof(buf)); - lparagraph(SP, buf, indent, - (char)((u->faction == f) ? '*' : (dh ? '+' : '-'))); + char buf[DISPLAYSIZE]; + int dh = bufunit(f, u, indent, mode, buf, sizeof(buf)); + lparagraph(SP, buf, indent, + (char)((u->faction == f) ? '*' : (dh ? '+' : '-'))); } struct message *msg_curse(const struct curse *c, const void *obj, objtype_t typ, - int self) + int self) { - if (c->type->curseinfo) { - /* if curseinfo returns NULL, then we don't want to tell the viewer anything. */ - return c->type->curseinfo(obj, typ, c, self); - } else { - message *msg = cinfo_simple(obj, typ, c, self); - if (msg == NULL) { - const char *unknown[] = - { "unit_unknown", "region_unknown", "building_unknown", - "ship_unknown" }; - msg = msg_message(mkname("curseinfo", unknown[typ]), "id", c->no); - log_error("no curseinfo function for %s and no fallback either.\n", c->type->cname); - } else { - log_error("no curseinfo function for %s, using cinfo_simple fallback.\n", c->type->cname); + if (c->type->curseinfo) { + /* if curseinfo returns NULL, then we don't want to tell the viewer anything. */ + return c->type->curseinfo(obj, typ, c, self); + } + else { + message *msg = cinfo_simple(obj, typ, c, self); + if (msg == NULL) { + const char *unknown[] = + { "unit_unknown", "region_unknown", "building_unknown", + "ship_unknown" }; + msg = msg_message(mkname("curseinfo", unknown[typ]), "id", c->no); + log_error("no curseinfo function for %s and no fallback either.\n", c->type->cname); + } + else { + log_error("no curseinfo function for %s, using cinfo_simple fallback.\n", c->type->cname); + } + return msg; } - return msg; - } } const struct unit *ucansee(const struct faction *f, const struct unit *u, - const struct unit *x) + const struct unit *x) { - if (cansee(f, u->region, u, 0)) - return u; - return x; + if (cansee(f, u->region, u, 0)) + return u; + return x; } int stealth_modifier(int seen_mode) { - switch (seen_mode) { + switch (seen_mode) { case see_unit: - return 0; + return 0; case see_far: case see_lighthouse: - return -2; + return -2; case see_travel: - return -1; + return -1; default: - return INT_MIN; - } + return INT_MIN; + } } void transfer_seen(quicklist ** dst, quicklist ** src) { - assert(!*dst); - *dst = *src; - *src = NULL; + assert(!*dst); + *dst = *src; + *src = NULL; } static void get_addresses(report_context * ctx) { -/* "TODO: travelthru" */ - seen_region *sr = NULL; - region *r; - const faction *lastf = NULL; - quicklist *flist = 0; + /* "TODO: travelthru" */ + seen_region *sr = NULL; + region *r; + const faction *lastf = NULL; + quicklist *flist = 0; - transfer_seen(&flist, &ctx->f->seen_factions); + transfer_seen(&flist, &ctx->f->seen_factions); - ctx->f->seen_factions = NULL; /* do not delete it twice */ - ql_push(&flist, ctx->f); + ctx->f->seen_factions = NULL; /* do not delete it twice */ + ql_push(&flist, ctx->f); - if (f_get_alliance(ctx->f)) { - quicklist *ql = ctx->f->alliance->members; - int qi; - for (qi = 0; ql; ql_advance(&ql, &qi, 1)) { - ql_set_insert(&flist, ql_get(ql, qi)); - } - } - - /* find the first region that this faction can see */ - for (r = ctx->first; sr == NULL && r != ctx->last; r = r->next) { - sr = find_seen(ctx->seen, r); - } - - for (; sr != NULL; sr = sr->next) { - int stealthmod = stealth_modifier(sr->mode); - r = sr->r; - if (sr->mode == see_lighthouse) { - unit *u = r->units; - for (; u; u = u->next) { - faction *sf = visible_faction(ctx->f, u); - if (lastf != sf) { - if (u->building || u->ship || (stealthmod > INT_MIN - && cansee(ctx->f, r, u, stealthmod))) { - ql_set_insert(&flist, sf); - lastf = sf; - } + if (f_get_alliance(ctx->f)) { + quicklist *ql = ctx->f->alliance->members; + int qi; + for (qi = 0; ql; ql_advance(&ql, &qi, 1)) { + ql_set_insert(&flist, ql_get(ql, qi)); } - } - } else if (sr->mode == see_travel) { - unit *u = r->units; - while (u) { - faction *sf = visible_faction(ctx->f, u); - assert(u->faction != ctx->f); /* if this is see_travel only, then I shouldn't be here. */ - if (lastf != sf) { - attrib *a = a_find(r->attribs, &at_travelunit); - while (a && a->type == &at_travelunit) { - unit *u2 = (unit *) a->data.v; - if (u2->faction == ctx->f) { - if (cansee_unit(u2, u, stealthmod)) { - ql_set_insert(&flist, sf); - lastf = sf; - break; - } + } + + /* find the first region that this faction can see */ + for (r = ctx->first; sr == NULL && r != ctx->last; r = r->next) { + sr = find_seen(ctx->seen, r); + } + + for (; sr != NULL; sr = sr->next) { + int stealthmod = stealth_modifier(sr->mode); + r = sr->r; + if (sr->mode == see_lighthouse) { + unit *u = r->units; + for (; u; u = u->next) { + faction *sf = visible_faction(ctx->f, u); + if (lastf != sf) { + if (u->building || u->ship || (stealthmod > INT_MIN + && cansee(ctx->f, r, u, stealthmod))) { + ql_set_insert(&flist, sf); + lastf = sf; + } + } } - a = a->next; - } } - u = u->next; - } - } else if (sr->mode > see_travel) { - const unit *u = r->units; - while (u != NULL) { - if (u->faction != ctx->f) { - faction *sf = visible_faction(ctx->f, u); - bool ballied = sf && sf != ctx->f && sf != lastf - && !fval(u, UFL_ANON_FACTION) && cansee(ctx->f, r, u, stealthmod); - if (ballied || ALLIED(ctx->f, sf)) { - ql_set_insert(&flist, sf); - lastf = sf; - } + else if (sr->mode == see_travel) { + unit *u = r->units; + while (u) { + faction *sf = visible_faction(ctx->f, u); + assert(u->faction != ctx->f); /* if this is see_travel only, then I shouldn't be here. */ + if (lastf != sf) { + attrib *a = a_find(r->attribs, &at_travelunit); + while (a && a->type == &at_travelunit) { + unit *u2 = (unit *)a->data.v; + if (u2->faction == ctx->f) { + if (cansee_unit(u2, u, stealthmod)) { + ql_set_insert(&flist, sf); + lastf = sf; + break; + } + } + a = a->next; + } + } + u = u->next; + } + } + else if (sr->mode > see_travel) { + const unit *u = r->units; + while (u != NULL) { + if (u->faction != ctx->f) { + faction *sf = visible_faction(ctx->f, u); + bool ballied = sf && sf != ctx->f && sf != lastf + && !fval(u, UFL_ANON_FACTION) && cansee(ctx->f, r, u, stealthmod); + if (ballied || ALLIED(ctx->f, sf)) { + ql_set_insert(&flist, sf); + lastf = sf; + } + } + u = u->next; + } } - u = u->next; - } } - } - if (f_get_alliance(ctx->f)) { - faction *f2; - for (f2 = factions; f2; f2 = f2->next) { - if (f2->alliance == ctx->f->alliance) { - ql_set_insert(&flist, f2); - } + if (f_get_alliance(ctx->f)) { + faction *f2; + for (f2 = factions; f2; f2 = f2->next) { + if (f2->alliance == ctx->f->alliance) { + ql_set_insert(&flist, f2); + } + } } - } - ctx->addresses = flist; + ctx->addresses = flist; } #define MAXSEEHASH 0x1000 @@ -1117,411 +1145,419 @@ seen_region *reuse; seen_region **seen_init(void) { - return (seen_region **) calloc(MAXSEEHASH, sizeof(seen_region *)); + return (seen_region **)calloc(MAXSEEHASH, sizeof(seen_region *)); } void seen_done(seen_region * seehash[]) { - int i; - for (i = 0; i != MAXSEEHASH; ++i) { - seen_region *sd = seehash[i]; - if (sd == NULL) - continue; - while (sd->nextHash != NULL) - sd = sd->nextHash; - sd->nextHash = reuse; - reuse = seehash[i]; - seehash[i] = NULL; - } - /* free(seehash); */ + int i; + for (i = 0; i != MAXSEEHASH; ++i) { + seen_region *sd = seehash[i]; + if (sd == NULL) + continue; + while (sd->nextHash != NULL) + sd = sd->nextHash; + sd->nextHash = reuse; + reuse = seehash[i]; + seehash[i] = NULL; + } + /* free(seehash); */ } void free_seen(void) { - while (reuse) { - seen_region *r = reuse; - reuse = reuse->nextHash; - free(r); - } + while (reuse) { + seen_region *r = reuse; + reuse = reuse->nextHash; + free(r); + } } void link_seen(seen_region * seehash[], const region * first, const region * last) { - const region *r = first; - seen_region *sr = NULL; + const region *r = first; + seen_region *sr = NULL; - if (first == last) - return; + if (first == last) + return; - do { - sr = find_seen(seehash, r); - r = r->next; - } while (sr == NULL && r != last); + do { + sr = find_seen(seehash, r); + r = r->next; + } while (sr == NULL && r != last); - while (r != last) { - seen_region *sn = find_seen(seehash, r); - if (sn != NULL) { - sr->next = sn; - sr = sn; + while (r != last) { + seen_region *sn = find_seen(seehash, r); + if (sn != NULL) { + sr->next = sn; + sr = sn; + } + r = r->next; } - r = r->next; - } - sr->next = 0; + sr->next = 0; } seen_region *find_seen(struct seen_region *seehash[], const region * r) { - unsigned int index = reg_hashkey(r) & (MAXSEEHASH - 1); - seen_region *find = seehash[index]; - while (find) { - if (find->r == r) - return find; - find = find->nextHash; - } - return NULL; + unsigned int index = reg_hashkey(r) & (MAXSEEHASH - 1); + seen_region *find = seehash[index]; + while (find) { + if (find->r == r) + return find; + find = find->nextHash; + } + return NULL; } static void get_seen_interval(report_context * ctx) { - /* this is required to find the neighbour regions of the ones we are in, - * which may well be outside of [firstregion, lastregion) */ - int i; - for (i = 0; i != MAXSEEHASH; ++i) { - seen_region *sr = ctx->seen[i]; - while (sr != NULL) { - if (ctx->first == NULL || sr->r->index < ctx->first->index) { - ctx->first = sr->r; - } - if (ctx->last != NULL && sr->r->index >= ctx->last->index) { - ctx->last = sr->r->next; - } - sr = sr->nextHash; + /* this is required to find the neighbour regions of the ones we are in, + * which may well be outside of [firstregion, lastregion) */ + int i; + for (i = 0; i != MAXSEEHASH; ++i) { + seen_region *sr = ctx->seen[i]; + while (sr != NULL) { + if (ctx->first == NULL || sr->r->index < ctx->first->index) { + ctx->first = sr->r; + } + if (ctx->last != NULL && sr->r->index >= ctx->last->index) { + ctx->last = sr->r->next; + } + sr = sr->nextHash; + } } - } - link_seen(ctx->seen, ctx->first, ctx->last); + link_seen(ctx->seen, ctx->first, ctx->last); } bool add_seen(struct seen_region *seehash[], struct region *r, unsigned char mode, - bool dis) +bool dis) { - seen_region *find = find_seen(seehash, r); - if (find == NULL) { - unsigned int index = reg_hashkey(r) & (MAXSEEHASH - 1); - if (!reuse) - reuse = (seen_region *) calloc(1, sizeof(struct seen_region)); - find = reuse; - reuse = reuse->nextHash; - find->nextHash = seehash[index]; - seehash[index] = find; - find->r = r; - } else if (find->mode >= mode) { - return false; - } - find->mode = mode; - find->disbelieves |= dis; - return true; + seen_region *find = find_seen(seehash, r); + if (find == NULL) { + unsigned int index = reg_hashkey(r) & (MAXSEEHASH - 1); + if (!reuse) + reuse = (seen_region *)calloc(1, sizeof(struct seen_region)); + find = reuse; + reuse = reuse->nextHash; + find->nextHash = seehash[index]; + seehash[index] = find; + find->r = r; + } + else if (find->mode >= mode) { + return false; + } + find->mode = mode; + find->disbelieves |= dis; + return true; } typedef struct report_type { - struct report_type *next; - report_fun write; - const char *extension; - int flag; + struct report_type *next; + report_fun write; + const char *extension; + int flag; } report_type; static report_type *report_types; void register_reporttype(const char *extension, report_fun write, int flag) { - report_type *type = (report_type *)malloc(sizeof(report_type)); - type->extension = extension; - type->write = write; - type->flag = flag; - type->next = report_types; - report_types = type; + report_type *type = (report_type *)malloc(sizeof(report_type)); + type->extension = extension; + type->write = write; + type->flag = flag; + type->next = report_types; + report_types = type; } static quicklist *get_regions_distance(region * root, int radius) { - quicklist *ql, *rlist = NULL; - int qi = 0; + quicklist *ql, *rlist = NULL; + int qi = 0; - ql_push(&rlist, root); - fset(root, RF_MARK); - ql = rlist; + ql_push(&rlist, root); + fset(root, RF_MARK); + ql = rlist; - while (ql) { - region *r = (region *)ql_get(ql, qi); - region * next[MAXDIRECTIONS]; - int d; - get_neighbours(r, next); + while (ql) { + region *r = (region *)ql_get(ql, qi); + region * next[MAXDIRECTIONS]; + int d; + get_neighbours(r, next); - for (d = 0; d != MAXDIRECTIONS; ++d) { - if (next[d] && !fval(next[d], RF_MARK) && distance(next[d], root) <= radius) { - ql_push(&rlist, next[d]); - fset(next[d], RF_MARK); - } + for (d = 0; d != MAXDIRECTIONS; ++d) { + if (next[d] && !fval(next[d], RF_MARK) && distance(next[d], root) <= radius) { + ql_push(&rlist, next[d]); + fset(next[d], RF_MARK); + } + } + ql_advance(&ql, &qi, 1); } - ql_advance(&ql, &qi, 1); - } - for (ql=rlist,qi=0;ql;ql_advance(&ql, &qi, 1)) { - region *r = (region *)ql_get(ql, qi); - freset(r, RF_MARK); - } - return rlist; + for (ql = rlist, qi = 0; ql; ql_advance(&ql, &qi, 1)) { + region *r = (region *)ql_get(ql, qi); + freset(r, RF_MARK); + } + return rlist; } static void view_default(struct seen_region **seen, region * r, faction * f) { - int dir; - for (dir = 0; dir != MAXDIRECTIONS; ++dir) { - region *r2 = rconnect(r, dir); - if (r2) { - connection *b = get_borders(r, r2); - while (b) { - if (!b->type->transparent(b, f)) - break; - b = b->next; - } - if (!b) - add_seen(seen, r2, see_neighbour, false); + int dir; + for (dir = 0; dir != MAXDIRECTIONS; ++dir) { + region *r2 = rconnect(r, dir); + if (r2) { + connection *b = get_borders(r, r2); + while (b) { + if (!b->type->transparent(b, f)) + break; + b = b->next; + } + if (!b) + add_seen(seen, r2, see_neighbour, false); + } } - } } static void view_neighbours(struct seen_region **seen, region * r, faction * f) { - int d; - region * nb[MAXDIRECTIONS]; + int d; + region * nb[MAXDIRECTIONS]; - get_neighbours(r, nb); - for (d = 0; d != MAXDIRECTIONS; ++d) { - region *r2 = nb[d]; - if (r2) { - connection *b = get_borders(r, r2); - while (b) { - if (!b->type->transparent(b, f)) - break; - b = b->next; - } - if (!b) { - if (add_seen(seen, r2, see_far, false)) { - if (!(fval(r2->terrain, FORBIDDEN_REGION))) { - int dir; - for (dir = 0; dir != MAXDIRECTIONS; ++dir) { - region *r3 = rconnect(r2, dir); - if (r3) { - connection *b = get_borders(r2, r3); - while (b) { - if (!b->type->transparent(b, f)) + get_neighbours(r, nb); + for (d = 0; d != MAXDIRECTIONS; ++d) { + region *r2 = nb[d]; + if (r2) { + connection *b = get_borders(r, r2); + while (b) { + if (!b->type->transparent(b, f)) break; - b = b->next; - } - if (!b) - add_seen(seen, r3, see_neighbour, false); - } + b = b->next; + } + if (!b) { + if (add_seen(seen, r2, see_far, false)) { + if (!(fval(r2->terrain, FORBIDDEN_REGION))) { + int dir; + for (dir = 0; dir != MAXDIRECTIONS; ++dir) { + region *r3 = rconnect(r2, dir); + if (r3) { + connection *b = get_borders(r2, r3); + while (b) { + if (!b->type->transparent(b, f)) + break; + b = b->next; + } + if (!b) + add_seen(seen, r3, see_neighbour, false); + } + } + } + } } - } } - } } - } } static void recurse_regatta(struct seen_region **seen, region * center, region * r, - faction * f, int maxdist) +faction * f, int maxdist) { - int d; - int dist = distance(center, r); - region * nb[MAXDIRECTIONS]; + int d; + int dist = distance(center, r); + region * nb[MAXDIRECTIONS]; - get_neighbours(r, nb); - for (d = 0; d != MAXDIRECTIONS; ++d) { - region *r2 = nb[d]; - if (r2) { - int ndist = distance(center, r2); - if (ndist > dist && fval(r2->terrain, SEA_REGION)) { - connection *b = get_borders(r, r2); - while (b) { - if (!b->type->transparent(b, f)) - break; - b = b->next; - } - if (!b) { - if (ndist < maxdist) { - if (add_seen(seen, r2, see_far, false)) { - recurse_regatta(seen, center, r2, f, maxdist); + get_neighbours(r, nb); + for (d = 0; d != MAXDIRECTIONS; ++d) { + region *r2 = nb[d]; + if (r2) { + int ndist = distance(center, r2); + if (ndist > dist && fval(r2->terrain, SEA_REGION)) { + connection *b = get_borders(r, r2); + while (b) { + if (!b->type->transparent(b, f)) + break; + b = b->next; + } + if (!b) { + if (ndist < maxdist) { + if (add_seen(seen, r2, see_far, false)) { + recurse_regatta(seen, center, r2, f, maxdist); + } + } + else + add_seen(seen, r2, see_neighbour, false); + } } - } else - add_seen(seen, r2, see_neighbour, false); } - } } - } } static void view_regatta(struct seen_region **seen, region * r, faction * f) { - unit *u; - int skill = 0; - for (u = r->units; u; u = u->next) { - if (u->faction == f) { - int es = effskill(u, SK_PERCEPTION); - if (es > skill) - skill = es; + unit *u; + int skill = 0; + for (u = r->units; u; u = u->next) { + if (u->faction == f) { + int es = effskill(u, SK_PERCEPTION); + if (es > skill) + skill = es; + } } - } - recurse_regatta(seen, r, r, f, skill / 2); + recurse_regatta(seen, r, r, f, skill / 2); } static void prepare_lighthouse(building * b, faction * f) { - int range = lighthouse_range(b, f); - quicklist *ql, *rlist = get_regions_distance(b->region, range); - int qi; + int range = lighthouse_range(b, f); + quicklist *ql, *rlist = get_regions_distance(b->region, range); + int qi; - for (ql=rlist,qi=0;ql;ql_advance(&ql, &qi,1)) { - region *rl = (region *)ql_get(ql, qi); - if (!fval(rl->terrain, FORBIDDEN_REGION)) { - region * next[MAXDIRECTIONS]; - int d; + for (ql = rlist, qi = 0; ql; ql_advance(&ql, &qi, 1)) { + region *rl = (region *)ql_get(ql, qi); + if (!fval(rl->terrain, FORBIDDEN_REGION)) { + region * next[MAXDIRECTIONS]; + int d; - get_neighbours(rl, next); - add_seen(f->seen, rl, see_lighthouse, false); - for (d = 0; d != MAXDIRECTIONS; ++d) { - if (next[d]) { - add_seen(f->seen, next[d], see_neighbour, false); + get_neighbours(rl, next); + add_seen(f->seen, rl, see_lighthouse, false); + for (d = 0; d != MAXDIRECTIONS; ++d) { + if (next[d]) { + add_seen(f->seen, next[d], see_neighbour, false); + } + } } - } } - } - ql_free(rlist); + ql_free(rlist); } void reorder_units(region * r) { - unit **unext = &r->units; + unit **unext = &r->units; - if (r->buildings) { - building *b = r->buildings; - while (*unext && b) { - unit **ufirst = unext; /* where the first unit in the building should go */ - unit **umove = unext; /* a unit we consider moving */ - unit *owner = building_owner(b); - while (owner && *umove) { - unit *u = *umove; - if (u->building == b) { - unit **uinsert = unext; - if (u==owner) { - uinsert = ufirst; - } - if (umove != uinsert) { - *umove = u->next; - u->next = *uinsert; - *uinsert = u; - } else { - /* no need to move, skip ahead */ - umove = &u->next; - } - if (unext == uinsert) { - /* we have a new well-placed unit. jump over it */ - unext = &u->next; - } - } else { - umove = &u->next; + if (r->buildings) { + building *b = r->buildings; + while (*unext && b) { + unit **ufirst = unext; /* where the first unit in the building should go */ + unit **umove = unext; /* a unit we consider moving */ + unit *owner = building_owner(b); + while (owner && *umove) { + unit *u = *umove; + if (u->building == b) { + unit **uinsert = unext; + if (u == owner) { + uinsert = ufirst; + } + if (umove != uinsert) { + *umove = u->next; + u->next = *uinsert; + *uinsert = u; + } + else { + /* no need to move, skip ahead */ + umove = &u->next; + } + if (unext == uinsert) { + /* we have a new well-placed unit. jump over it */ + unext = &u->next; + } + } + else { + umove = &u->next; + } + } + b = b->next; } - } - b = b->next; - } - } - - if (r->ships) { - ship *sh = r->ships; - /* first, move all units up that are not on ships */ - unit **umove = unext; /* a unit we consider moving */ - while (*umove) { - unit *u = *umove; - if (u->number && !u->ship) { - if (umove != unext) { - *umove = u->next; - u->next = *unext; - *unext = u; - } else { - /* no need to move, skip ahead */ - umove = &u->next; - } - /* we have a new well-placed unit. jump over it */ - unext = &u->next; - } else { - umove = &u->next; - } } - while (*unext && sh) { - unit **ufirst = unext; /* where the first unit in the building should go */ - unit **umove = unext; /* a unit we consider moving */ - unit *owner = ship_owner(sh); - while (owner && *umove) { - unit *u = *umove; - if (u->number && u->ship == sh) { - unit **uinsert = unext; - if (u==owner) { - uinsert = ufirst; - owner = u; - } - if (umove != uinsert) { - *umove = u->next; - u->next = *uinsert; - *uinsert = u; - } else { - /* no need to move, skip ahead */ - umove = &u->next; - } - if (unext == uinsert) { - /* we have a new well-placed unit. jump over it */ - unext = &u->next; - } - } else { - umove = &u->next; + if (r->ships) { + ship *sh = r->ships; + /* first, move all units up that are not on ships */ + unit **umove = unext; /* a unit we consider moving */ + while (*umove) { + unit *u = *umove; + if (u->number && !u->ship) { + if (umove != unext) { + *umove = u->next; + u->next = *unext; + *unext = u; + } + else { + /* no need to move, skip ahead */ + umove = &u->next; + } + /* we have a new well-placed unit. jump over it */ + unext = &u->next; + } + else { + umove = &u->next; + } + } + + while (*unext && sh) { + unit **ufirst = unext; /* where the first unit in the building should go */ + unit **umove = unext; /* a unit we consider moving */ + unit *owner = ship_owner(sh); + while (owner && *umove) { + unit *u = *umove; + if (u->number && u->ship == sh) { + unit **uinsert = unext; + if (u == owner) { + uinsert = ufirst; + owner = u; + } + if (umove != uinsert) { + *umove = u->next; + u->next = *uinsert; + *uinsert = u; + } + else { + /* no need to move, skip ahead */ + umove = &u->next; + } + if (unext == uinsert) { + /* we have a new well-placed unit. jump over it */ + unext = &u->next; + } + } + else { + umove = &u->next; + } + } + sh = sh->next; } - } - sh = sh->next; } - } } static void prepare_reports(void) { - region *r; - faction *f; - building *b; - const struct building_type *bt_lighthouse = bt_find("lighthouse"); + region *r; + faction *f; + building *b; + const struct building_type *bt_lighthouse = bt_find("lighthouse"); - for (f = factions; f; f = f->next) { - if (f->seen) seen_done(f->seen); - f->seen = seen_init(); - } - - for (r = regions; r; r = r->next) { - attrib *ru; - unit *u; - plane *p = rplane(r); - - reorder_units(r); - - if (p) { - watcher *w = p->watchers; - for (; w; w = w->next) { - add_seen(w->faction->seen, r, w->mode, false); -#ifdef SMART_INTERVALS - update_interval(w->faction, r); -#endif - } + for (f = factions; f; f = f->next) { + if (f->seen) seen_done(f->seen); + f->seen = seen_init(); } + for (r = regions; r; r = r->next) { + attrib *ru; + unit *u; + plane *p = rplane(r); + + reorder_units(r); + + if (p) { + watcher *w = p->watchers; + for (; w; w = w->next) { + add_seen(w->faction->seen, r, w->mode, false); +#ifdef SMART_INTERVALS + update_interval(w->faction, r); +#endif + } + } + /* Region owner get always the Lighthouse report */ if (check_param(global.parameters, "rules.region_owner_pay_building", bt_lighthouse->_name)) { for (b = rbuildings(r); b; b = b->next) { @@ -1559,742 +1595,751 @@ static void prepare_reports(void) } - if (fval(r, RF_TRAVELUNIT)) { - for (ru = a_find(r->attribs, &at_travelunit); - ru && ru->type == &at_travelunit; ru = ru->next) { - unit *u = (unit *) ru->data.v; + if (fval(r, RF_TRAVELUNIT)) { + for (ru = a_find(r->attribs, &at_travelunit); + ru && ru->type == &at_travelunit; ru = ru->next) { + unit *u = (unit *)ru->data.v; - /* make sure the faction has not been removed this turn: */ - if (u->faction) { - add_seen(u->faction->seen, r, see_travel, false); + /* make sure the faction has not been removed this turn: */ + if (u->faction) { + add_seen(u->faction->seen, r, see_travel, false); + } + } } - } } - } } static seen_region **prepare_report(faction * f) { - struct seen_region *sr; - region *r = firstregion(f); - region *last = lastregion(f); + struct seen_region *sr; + region *r = firstregion(f); + region *last = lastregion(f); - link_seen(f->seen, r, last); + link_seen(f->seen, r, last); - for (sr = NULL; sr == NULL && r != last; r = r->next) { - sr = find_seen(f->seen, r); - } - - for (; sr != NULL; sr = sr->next) { - if (sr->mode > see_neighbour) { - region *r = sr->r; - plane *p = rplane(r); - void (*view) (struct seen_region **, region *, faction *) = view_default; - - if (p && fval(p, PFL_SEESPECIAL)) { - /* TODO: this is not very customizable */ - view = (strcmp(p->name, "Regatta")==0) ? view_regatta : view_neighbours; - } - view(f->seen, r, f); + for (sr = NULL; sr == NULL && r != last; r = r->next) { + sr = find_seen(f->seen, r); } - } - return f->seen; + + for (; sr != NULL; sr = sr->next) { + if (sr->mode > see_neighbour) { + region *r = sr->r; + plane *p = rplane(r); + void(*view) (struct seen_region **, region *, faction *) = view_default; + + if (p && fval(p, PFL_SEESPECIAL)) { + /* TODO: this is not very customizable */ + view = (strcmp(p->name, "Regatta") == 0) ? view_regatta : view_neighbours; + } + view(f->seen, r, f); + } + } + return f->seen; } int write_reports(faction * f, time_t ltime) { - int backup = 1, maxbackup = 128*1000; - bool gotit = false; - struct report_context ctx; - const char *encoding = "UTF-8"; + int backup = 1, maxbackup = 128 * 1000; + bool gotit = false; + struct report_context ctx; + const char *encoding = "UTF-8"; - if (noreports) { - return false; - } - ctx.f = f; - ctx.report_time = time(NULL); - ctx.seen = prepare_report(f); - ctx.first = firstregion(f); - ctx.last = lastregion(f); - ctx.addresses = NULL; - ctx.userdata = NULL; - get_seen_interval(&ctx); - get_addresses(&ctx); - _mkdir(reportpath()); - do { - report_type *rtype = report_types; - - errno = 0; - if (verbosity >= 2) { - log_printf(stdout, "Reports for %s:", factionname(f)); + if (noreports) { + return false; } - for (; rtype != NULL; rtype = rtype->next) { - if (f->options & rtype->flag) { - char filename[MAX_PATH]; - sprintf(filename, "%s/%d-%s.%s", reportpath(), turn, factionid(f), - rtype->extension); - if (rtype->write(filename, &ctx, encoding) == 0) { - gotit = true; + ctx.f = f; + ctx.report_time = time(NULL); + ctx.seen = prepare_report(f); + ctx.first = firstregion(f); + ctx.last = lastregion(f); + ctx.addresses = NULL; + ctx.userdata = NULL; + get_seen_interval(&ctx); + get_addresses(&ctx); + _mkdir(reportpath()); + do { + report_type *rtype = report_types; + + errno = 0; + if (verbosity >= 2) { + log_printf(stdout, "Reports for %s:", factionname(f)); + } + for (; rtype != NULL; rtype = rtype->next) { + if (f->options & rtype->flag) { + char filename[MAX_PATH]; + sprintf(filename, "%s/%d-%s.%s", reportpath(), turn, factionid(f), + rtype->extension); + if (rtype->write(filename, &ctx, encoding) == 0) { + gotit = true; + } + } } - } - } - if (errno) { - char zText[64]; - log_warning("retrying, error %d during reports for faction %s", errno, factionname(f)); - sprintf(zText, "waiting %u seconds before we retry", backup/1000); - perror(zText); - _sleep(backup); - if (backup < maxbackup) { - backup *= 2; - } + if (errno) { + char zText[64]; + log_warning("retrying, error %d during reports for faction %s", errno, factionname(f)); + sprintf(zText, "waiting %u seconds before we retry", backup / 1000); + perror(zText); + _sleep(backup); + if (backup < maxbackup) { + backup *= 2; + } + } + } while (errno); + if (!gotit) { + log_warning("No report for faction %s!", factionid(f)); } - } while (errno); - if (!gotit) { - log_warning("No report for faction %s!", factionid(f)); - } - ql_free(ctx.addresses); - seen_done(ctx.seen); - return 0; + ql_free(ctx.addresses); + seen_done(ctx.seen); + return 0; } static void nmr_warnings(void) { - faction *f, *fa; + faction *f, *fa; #define FRIEND (HELP_GUARD|HELP_MONEY) - for (f = factions; f; f = f->next) { - if (!is_monsters(f) && (turn - f->lastorders) >= 2) { - message *msg = NULL; - for (fa = factions; fa; fa = fa->next) { - int warn = 0; - if (get_param_int(global.parameters, "rules.alliances", 0) != 0) { - if (f->alliance && f->alliance == fa->alliance) { - warn = 1; - } - } else if (alliedfaction(NULL, f, fa, FRIEND) - && alliedfaction(NULL, fa, f, FRIEND)) { - warn = 1; + for (f = factions; f; f = f->next) { + if (!is_monsters(f) && (turn - f->lastorders) >= 2) { + message *msg = NULL; + for (fa = factions; fa; fa = fa->next) { + int warn = 0; + if (get_param_int(global.parameters, "rules.alliances", 0) != 0) { + if (f->alliance && f->alliance == fa->alliance) { + warn = 1; + } + } + else if (alliedfaction(NULL, f, fa, FRIEND) + && alliedfaction(NULL, fa, f, FRIEND)) { + warn = 1; + } + if (warn) { + if (msg == NULL) { + msg = + msg_message("warn_dropout", "faction turns", f, + turn - f->lastorders); + } + add_message(&fa->msgs, msg); + } + } + if (msg != NULL) + msg_release(msg); } - if (warn) { - if (msg == NULL) { - msg = - msg_message("warn_dropout", "faction turns", f, - turn - f->lastorders); - } - add_message(&fa->msgs, msg); - } - } - if (msg != NULL) - msg_release(msg); } - } } static void report_donations(void) { - region *r; - for (r = regions; r; r = r->next) { - while (r->donations) { - donation *sp = r->donations; - if (sp->amount > 0) { - struct message *msg = msg_message("donation", - "from to amount", sp->f1, sp->f2, sp->amount); - r_addmessage(r, sp->f1, msg); - r_addmessage(r, sp->f2, msg); - msg_release(msg); - } - r->donations = sp->next; - free(sp); + region *r; + for (r = regions; r; r = r->next) { + while (r->donations) { + donation *sp = r->donations; + if (sp->amount > 0) { + struct message *msg = msg_message("donation", + "from to amount", sp->f1, sp->f2, sp->amount); + r_addmessage(r, sp->f1, msg); + r_addmessage(r, sp->f2, msg); + msg_release(msg); + } + r->donations = sp->next; + free(sp); + } } - } } static void write_script(FILE * F, const faction * f) { - report_type *rtype; - char buf[1024]; + report_type *rtype; + char buf[1024]; - fprintf(F, "faction=%s:email=%s:lang=%s", factionid(f), f->email, - locale_name(f->locale)); - if (f->options & (1 << O_BZIP2)) - fputs(":compression=bz2", F); - else - fputs(":compression=zip", F); + fprintf(F, "faction=%s:email=%s:lang=%s", factionid(f), f->email, + locale_name(f->locale)); + if (f->options & (1 << O_BZIP2)) + fputs(":compression=bz2", F); + else + fputs(":compression=zip", F); - fputs(":reports=", F); - buf[0] = 0; - for (rtype = report_types; rtype != NULL; rtype = rtype->next) { - if (f->options & rtype->flag) { - if (buf[0]) - strcat(buf, ","); - strcat(buf, rtype->extension); + fputs(":reports=", F); + buf[0] = 0; + for (rtype = report_types; rtype != NULL; rtype = rtype->next) { + if (f->options & rtype->flag) { + if (buf[0]) + strcat(buf, ","); + strcat(buf, rtype->extension); + } } - } - fputs(buf, F); - fputc('\n', F); + fputs(buf, F); + fputc('\n', F); } int init_reports(void) { - prepare_reports(); - { - if (_access(reportpath(), 0)!=0) { - return 0; + prepare_reports(); + { + if (_access(reportpath(), 0) != 0) { + return 0; + } } - } - if (_mkdir(reportpath()) != 0) { - if (errno != EEXIST) { - perror("could not create reportpath"); - return -1; + if (_mkdir(reportpath()) != 0) { + if (errno != EEXIST) { + perror("could not create reportpath"); + return -1; + } } - } - return 0; + return 0; } int reports(void) { - faction *f; - FILE *mailit; - time_t ltime = time(NULL); - int retval = 0; - char path[MAX_PATH]; + faction *f; + FILE *mailit; + time_t ltime = time(NULL); + int retval = 0; + char path[MAX_PATH]; - if (verbosity >= 1) { - log_printf(stdout, "Writing reports for turn %d:", turn); - } - nmr_warnings(); - report_donations(); - remove_empty_units(); - - _mkdir(reportpath()); - sprintf(path, "%s/reports.txt", reportpath()); - mailit = fopen(path, "w"); - if (mailit == NULL) { - log_error("%s could not be opened!\n", path); - } - - for (f = factions; f; f = f->next) { - int error = write_reports(f, ltime); - if (error) - retval = error; - if (mailit) - write_script(mailit, f); - } - if (mailit) - fclose(mailit); - free_seen(); -#ifdef GLOBAL_REPORT - { - const char *str = get_param(global.parameters, "globalreport"); - if (str != NULL) { - sprintf(path, "%s/%s.%u.cr", reportpath(), str, turn); - global_report(path); + if (verbosity >= 1) { + log_printf(stdout, "Writing reports for turn %d:", turn); + } + nmr_warnings(); + report_donations(); + remove_empty_units(); + + _mkdir(reportpath()); + sprintf(path, "%s/reports.txt", reportpath()); + mailit = fopen(path, "w"); + if (mailit == NULL) { + log_error("%s could not be opened!\n", path); + } + + for (f = factions; f; f = f->next) { + int error = write_reports(f, ltime); + if (error) + retval = error; + if (mailit) + write_script(mailit, f); + } + if (mailit) + fclose(mailit); + free_seen(); +#ifdef GLOBAL_REPORT + { + const char *str = get_param(global.parameters, "globalreport"); + if (str != NULL) { + sprintf(path, "%s/%s.%u.cr", reportpath(), str, turn); + global_report(path); + } } - } #endif - return retval; + return retval; } static variant var_copy_string(variant x) { - x.v = x.v ? _strdup((const char *)x.v) : 0; - return x; + x.v = x.v ? _strdup((const char *)x.v) : 0; + return x; } static void var_free_string(variant x) { - free(x.v); + free(x.v); } static variant var_copy_order(variant x) { - x.v = copy_order((order *) x.v); - return x; + x.v = copy_order((order *)x.v); + return x; } static void var_free_order(variant x) { - free_order(x.v); + free_order(x.v); } static variant var_copy_items(variant x) { - item *isrc; - resource *rdst = NULL, **rptr = &rdst; + item *isrc; + resource *rdst = NULL, **rptr = &rdst; - for (isrc = (item *) x.v; isrc != NULL; isrc = isrc->next) { - resource *res = malloc(sizeof(resource)); - res->number = isrc->number; - res->type = isrc->type->rtype; - *rptr = res; - rptr = &res->next; - } - *rptr = NULL; - x.v = rdst; - return x; + for (isrc = (item *)x.v; isrc != NULL; isrc = isrc->next) { + resource *res = malloc(sizeof(resource)); + res->number = isrc->number; + res->type = isrc->type->rtype; + *rptr = res; + rptr = &res->next; + } + *rptr = NULL; + x.v = rdst; + return x; } static void var_free_resources(variant x) { - resource *rsrc = (resource *) x.v; - while (rsrc) { - resource *res = rsrc->next; - free(rsrc); - rsrc = res; - } - x.v = 0; + resource *rsrc = (resource *)x.v; + while (rsrc) { + resource *res = rsrc->next; + free(rsrc); + rsrc = res; + } + x.v = 0; } static void var_free_regions(variant x) { - free(x.v); + free(x.v); } const char *trailinto(const region * r, const struct locale *lang) { - char ref[32]; - const char *s; - if (r) { - const char *tname = terrain_name(r); - strcat(strcpy(ref, tname), "_trail"); - s = locale_string(lang, ref); - if (s && *s) { - if (strstr(s, "%s")) - return s; + char ref[32]; + const char *s; + if (r) { + const char *tname = terrain_name(r); + strcat(strcpy(ref, tname), "_trail"); + s = locale_string(lang, ref); + if (s && *s) { + if (strstr(s, "%s")) + return s; + } } - } - return "%s"; + return "%s"; } size_t f_regionid(const region * r, const faction * f, char *buffer, size_t size) { - size_t len; - if (!r) { - len = strlcpy(buffer, "(Chaos)", size); - } else { - plane *pl = rplane(r); - const char *name = pl ? pl->name : 0; - int nx = r->x, ny = r->y; - int named = (name && name[0]); - pnormalize(&nx, &ny, pl); - adjust_coordinates(f, &nx, &ny, pl, r); - len = strlcpy(buffer, rname(r, f?f->locale:0), size); - _snprintf(buffer + len, size-len, " (%d,%d%s%s)", nx, ny, named ? "," : "", (named) ? name : ""); - buffer[size-1] = 0; - len=strlen(buffer); - } - return len; + size_t len; + if (!r) { + len = strlcpy(buffer, "(Chaos)", size); + } + else { + plane *pl = rplane(r); + const char *name = pl ? pl->name : 0; + int nx = r->x, ny = r->y; + int named = (name && name[0]); + pnormalize(&nx, &ny, pl); + adjust_coordinates(f, &nx, &ny, pl, r); + len = strlcpy(buffer, rname(r, f ? f->locale : 0), size); + _snprintf(buffer + len, size - len, " (%d,%d%s%s)", nx, ny, named ? "," : "", (named) ? name : ""); + buffer[size - 1] = 0; + len = strlen(buffer); + } + return len; } static char *f_regionid_s(const region * r, const faction * f) { - static int i = 0; - static char bufs[4][NAMESIZE + 20]; - char *buf = bufs[(++i) % 4]; + static int i = 0; + static char bufs[4][NAMESIZE + 20]; + char *buf = bufs[(++i) % 4]; - f_regionid(r, f, buf, NAMESIZE + 20); - return buf; + f_regionid(r, f, buf, NAMESIZE + 20); + return buf; } /*** BEGIN MESSAGE RENDERING ***/ static void eval_localize(struct opstack **stack, const void *userdata) { /* (string, locale) -> string */ - const struct faction *f = (const struct faction *)userdata; - const struct locale *lang = f ? f->locale : default_locale; - const char *c = (const char *)opop_v(stack); - c = locale_string(lang, c); - opush_v(stack, strcpy(balloc(strlen(c) + 1), c)); + const struct faction *f = (const struct faction *)userdata; + const struct locale *lang = f ? f->locale : default_locale; + const char *c = (const char *)opop_v(stack); + c = locale_string(lang, c); + opush_v(stack, strcpy(balloc(strlen(c) + 1), c)); } static void eval_trailto(struct opstack **stack, const void *userdata) { /* (int, int) -> int */ - const struct faction *f = (const struct faction *)userdata; - const struct locale *lang = f ? f->locale : default_locale; - const struct region *r = (const struct region *)opop(stack).v; - const char *trail = trailinto(r, lang); - const char *rn = f_regionid_s(r, f); - variant var; - char *x = var.v = balloc(strlen(trail) + strlen(rn)); - sprintf(x, trail, rn); - opush(stack, var); + const struct faction *f = (const struct faction *)userdata; + const struct locale *lang = f ? f->locale : default_locale; + const struct region *r = (const struct region *)opop(stack).v; + const char *trail = trailinto(r, lang); + const char *rn = f_regionid_s(r, f); + variant var; + char *x = var.v = balloc(strlen(trail) + strlen(rn)); + sprintf(x, trail, rn); + opush(stack, var); } static void eval_unit(struct opstack **stack, const void *userdata) { /* unit -> string */ - const struct faction *f = (const struct faction *)userdata; - const struct unit *u = (const struct unit *)opop(stack).v; - const char *c = u ? unitname(u) : LOC(f->locale, "an_unknown_unit"); - size_t len = strlen(c); - variant var; + const struct faction *f = (const struct faction *)userdata; + const struct unit *u = (const struct unit *)opop(stack).v; + const char *c = u ? unitname(u) : LOC(f->locale, "an_unknown_unit"); + size_t len = strlen(c); + variant var; - var.v = strcpy(balloc(len + 1), c); - opush(stack, var); + var.v = strcpy(balloc(len + 1), c); + opush(stack, var); } static void eval_unit_dative(struct opstack **stack, const void *userdata) { /* unit -> string */ - const struct faction *f = (const struct faction *)userdata; - const struct unit *u = (const struct unit *)opop(stack).v; - const char *c = u ? unitname(u) : LOC(f->locale, "unknown_unit_dative"); - size_t len = strlen(c); - variant var; + const struct faction *f = (const struct faction *)userdata; + const struct unit *u = (const struct unit *)opop(stack).v; + const char *c = u ? unitname(u) : LOC(f->locale, "unknown_unit_dative"); + size_t len = strlen(c); + variant var; - var.v = strcpy(balloc(len + 1), c); - opush(stack, var); + var.v = strcpy(balloc(len + 1), c); + opush(stack, var); } static void eval_spell(struct opstack **stack, const void *userdata) { /* unit -> string */ - const struct faction *f = (const struct faction *)userdata; - const struct spell *sp = (const struct spell *)opop(stack).v; - const char *c = - sp ? spell_name(sp, f->locale) : LOC(f->locale, "an_unknown_spell"); - size_t len = strlen(c); - variant var; + const struct faction *f = (const struct faction *)userdata; + const struct spell *sp = (const struct spell *)opop(stack).v; + const char *c = + sp ? spell_name(sp, f->locale) : LOC(f->locale, "an_unknown_spell"); + size_t len = strlen(c); + variant var; - var.v = strcpy(balloc(len + 1), c); - opush(stack, var); + var.v = strcpy(balloc(len + 1), c); + opush(stack, var); } static void eval_curse(struct opstack **stack, const void *userdata) { /* unit -> string */ - const struct faction *f = (const struct faction *)userdata; - const struct curse_type *sp = (const struct curse_type *)opop(stack).v; - const char *c = - sp ? curse_name(sp, f->locale) : LOC(f->locale, "an_unknown_curse"); - size_t len = strlen(c); - variant var; + const struct faction *f = (const struct faction *)userdata; + const struct curse_type *sp = (const struct curse_type *)opop(stack).v; + const char *c = + sp ? curse_name(sp, f->locale) : LOC(f->locale, "an_unknown_curse"); + size_t len = strlen(c); + variant var; - var.v = strcpy(balloc(len + 1), c); - opush(stack, var); + var.v = strcpy(balloc(len + 1), c); + opush(stack, var); } static void eval_unitname(struct opstack **stack, const void *userdata) { /* unit -> string */ - const struct faction *f = (const struct faction *)userdata; - const struct unit *u = (const struct unit *)opop(stack).v; - const char *c = u ? u->name : LOC(f->locale, "an_unknown_unit"); - size_t len = strlen(c); - variant var; + const struct faction *f = (const struct faction *)userdata; + const struct unit *u = (const struct unit *)opop(stack).v; + const char *c = u ? u->name : LOC(f->locale, "an_unknown_unit"); + size_t len = strlen(c); + variant var; - var.v = strcpy(balloc(len + 1), c); - opush(stack, var); + var.v = strcpy(balloc(len + 1), c); + opush(stack, var); } static void eval_unitid(struct opstack **stack, const void *userdata) { /* unit -> int */ - const struct faction *f = (const struct faction *)userdata; - const struct unit *u = (const struct unit *)opop(stack).v; - const char *c = u ? u->name : LOC(f->locale, "an_unknown_unit"); - size_t len = strlen(c); - variant var; + const struct faction *f = (const struct faction *)userdata; + const struct unit *u = (const struct unit *)opop(stack).v; + const char *c = u ? u->name : LOC(f->locale, "an_unknown_unit"); + size_t len = strlen(c); + variant var; - var.v = strcpy(balloc(len + 1), c); - opush(stack, var); + var.v = strcpy(balloc(len + 1), c); + opush(stack, var); } static void eval_unitsize(struct opstack **stack, const void *userdata) { /* unit -> int */ - const struct unit *u = (const struct unit *)opop(stack).v; - variant var; + const struct unit *u = (const struct unit *)opop(stack).v; + variant var; - var.i = u->number; - opush(stack, var); + var.i = u->number; + opush(stack, var); } static void eval_faction(struct opstack **stack, const void *userdata) { /* faction -> string */ - const struct faction *f = (const struct faction *)opop(stack).v; - const char *c = factionname(f); - size_t len = strlen(c); - variant var; + const struct faction *f = (const struct faction *)opop(stack).v; + const char *c = factionname(f); + size_t len = strlen(c); + variant var; - var.v = strcpy(balloc(len + 1), c); - opush(stack, var); + var.v = strcpy(balloc(len + 1), c); + opush(stack, var); } static void eval_alliance(struct opstack **stack, const void *userdata) { /* faction -> string */ - const struct alliance *al = (const struct alliance *)opop(stack).v; - const char *c = alliancename(al); - variant var; - if (c != NULL) { - size_t len = strlen(c); - var.v = strcpy(balloc(len + 1), c); - } else - var.v = NULL; - opush(stack, var); + const struct alliance *al = (const struct alliance *)opop(stack).v; + const char *c = alliancename(al); + variant var; + if (c != NULL) { + size_t len = strlen(c); + var.v = strcpy(balloc(len + 1), c); + } + else + var.v = NULL; + opush(stack, var); } static void eval_region(struct opstack **stack, const void *userdata) { /* region -> string */ - char name[NAMESIZE + 32]; - const struct faction *f = (const struct faction *)userdata; - const struct region *r = (const struct region *)opop(stack).v; - const char *c = write_regionname(r, f, name, sizeof(name)); - size_t len = strlen(c); - variant var; + char name[NAMESIZE + 32]; + const struct faction *f = (const struct faction *)userdata; + const struct region *r = (const struct region *)opop(stack).v; + const char *c = write_regionname(r, f, name, sizeof(name)); + size_t len = strlen(c); + variant var; - var.v = strcpy(balloc(len + 1), c); - opush(stack, var); + var.v = strcpy(balloc(len + 1), c); + opush(stack, var); } static void eval_terrain(struct opstack **stack, const void *userdata) { /* region -> string */ - const struct faction *f = (const struct faction *)userdata; - const struct region *r = (const struct region *)opop(stack).v; - const char *c = LOC(f->locale, terrain_name(r)); - size_t len = strlen(c); - variant var; + const struct faction *f = (const struct faction *)userdata; + const struct region *r = (const struct region *)opop(stack).v; + const char *c = LOC(f->locale, terrain_name(r)); + size_t len = strlen(c); + variant var; - var.v = strcpy(balloc(len + 1), c); - opush(stack, var); + var.v = strcpy(balloc(len + 1), c); + opush(stack, var); } static void eval_ship(struct opstack **stack, const void *userdata) { /* ship -> string */ - const struct faction *f = (const struct faction *)userdata; - const struct ship *u = (const struct ship *)opop(stack).v; - const char *c = u ? shipname(u) : LOC(f->locale, "an_unknown_ship"); - size_t len = strlen(c); - variant var; + const struct faction *f = (const struct faction *)userdata; + const struct ship *u = (const struct ship *)opop(stack).v; + const char *c = u ? shipname(u) : LOC(f->locale, "an_unknown_ship"); + size_t len = strlen(c); + variant var; - var.v = strcpy(balloc(len + 1), c); - opush(stack, var); + var.v = strcpy(balloc(len + 1), c); + opush(stack, var); } static void eval_building(struct opstack **stack, const void *userdata) { /* building -> string */ - const struct faction *f = (const struct faction *)userdata; - const struct building *u = (const struct building *)opop(stack).v; - const char *c = u ? buildingname(u) : LOC(f->locale, "an_unknown_building"); - size_t len = strlen(c); - variant var; + const struct faction *f = (const struct faction *)userdata; + const struct building *u = (const struct building *)opop(stack).v; + const char *c = u ? buildingname(u) : LOC(f->locale, "an_unknown_building"); + size_t len = strlen(c); + variant var; - var.v = strcpy(balloc(len + 1), c); - opush(stack, var); + var.v = strcpy(balloc(len + 1), c); + opush(stack, var); } static void eval_weight(struct opstack **stack, const void *userdata) { /* region -> string */ - char buffer[32]; - const struct faction *f = (const struct faction *)userdata; - const struct locale *lang = f->locale; - int weight = opop_i(stack); - variant var; + char buffer[32]; + const struct faction *f = (const struct faction *)userdata; + const struct locale *lang = f->locale; + int weight = opop_i(stack); + variant var; - if (weight % SCALEWEIGHT == 0) { - if (weight == SCALEWEIGHT) { - sprintf(buffer, "1 %s", LOC(lang, "weight_unit")); - } else { - sprintf(buffer, "%u %s", weight / SCALEWEIGHT, LOC(lang, - "weight_unit_p")); + if (weight % SCALEWEIGHT == 0) { + if (weight == SCALEWEIGHT) { + sprintf(buffer, "1 %s", LOC(lang, "weight_unit")); + } + else { + sprintf(buffer, "%u %s", weight / SCALEWEIGHT, LOC(lang, + "weight_unit_p")); + } } - } else { - if (weight == 1) { - sprintf(buffer, "1 %s %u", LOC(lang, "weight_per"), SCALEWEIGHT); - } else { - sprintf(buffer, "%u %s %u", weight, LOC(lang, "weight_per_p"), - SCALEWEIGHT); + else { + if (weight == 1) { + sprintf(buffer, "1 %s %u", LOC(lang, "weight_per"), SCALEWEIGHT); + } + else { + sprintf(buffer, "%u %s %u", weight, LOC(lang, "weight_per_p"), + SCALEWEIGHT); + } } - } - var.v = strcpy(balloc(strlen(buffer) + 1), buffer); - opush(stack, var); + var.v = strcpy(balloc(strlen(buffer) + 1), buffer); + opush(stack, var); } static void eval_resource(struct opstack **stack, const void *userdata) { - const faction *report = (const faction *)userdata; - const struct locale *lang = report ? report->locale : default_locale; - int j = opop(stack).i; - const struct resource_type *res = (const struct resource_type *)opop(stack).v; - const char *c = LOC(lang, resourcename(res, j != 1)); - size_t len = strlen(c); - variant var; + const faction *report = (const faction *)userdata; + const struct locale *lang = report ? report->locale : default_locale; + int j = opop(stack).i; + const struct resource_type *res = (const struct resource_type *)opop(stack).v; + const char *c = LOC(lang, resourcename(res, j != 1)); + size_t len = strlen(c); + variant var; - var.v = strcpy(balloc(len + 1), c); - opush(stack, var); + var.v = strcpy(balloc(len + 1), c); + opush(stack, var); } static void eval_race(struct opstack **stack, const void *userdata) { - const faction *report = (const faction *)userdata; - const struct locale *lang = report ? report->locale : default_locale; - int j = opop(stack).i; - const race *r = (const race *)opop(stack).v; - const char *c = LOC(lang, rc_name(r, j != 1)); - size_t len = strlen(c); - variant var; + const faction *report = (const faction *)userdata; + const struct locale *lang = report ? report->locale : default_locale; + int j = opop(stack).i; + const race *r = (const race *)opop(stack).v; + const char *c = LOC(lang, rc_name(r, j != 1)); + size_t len = strlen(c); + variant var; - var.v = strcpy(balloc(len + 1), c); - opush(stack, var); + var.v = strcpy(balloc(len + 1), c); + opush(stack, var); } static void eval_order(struct opstack **stack, const void *userdata) { /* order -> string */ - const struct order *ord = (const struct order *)opop(stack).v; - static char buf[512]; - size_t len; - variant var; + const struct order *ord = (const struct order *)opop(stack).v; + static char buf[512]; + size_t len; + variant var; - unused_arg(userdata); - write_order(ord, buf, sizeof(buf)); - len = strlen(buf); - var.v = strcpy(balloc(len + 1), buf); - opush(stack, var); + unused_arg(userdata); + write_order(ord, buf, sizeof(buf)); + len = strlen(buf); + var.v = strcpy(balloc(len + 1), buf); + opush(stack, var); } static void eval_resources(struct opstack **stack, const void *userdata) { /* order -> string */ - const faction *report = (const faction *)userdata; - const struct locale *lang = report ? report->locale : default_locale; - const struct resource *res = (const struct resource *)opop(stack).v; - static char buf[1024]; /* but we only use about half of this */ - size_t size = sizeof(buf) - 1; - variant var; + const faction *report = (const faction *)userdata; + const struct locale *lang = report ? report->locale : default_locale; + const struct resource *res = (const struct resource *)opop(stack).v; + static char buf[1024]; /* but we only use about half of this */ + size_t size = sizeof(buf) - 1; + variant var; - char *bufp = buf; - while (res != NULL && size > 4) { - const char *rname = - resourcename(res->type, (res->number != 1) ? NMF_PLURAL : 0); - int bytes = _snprintf(bufp, size, "%d %s", res->number, LOC(lang, rname)); - if (bytes < 0 || wrptr(&bufp, &size, bytes) != 0 || size < sizeof(buf) / 2) { - WARN_STATIC_BUFFER(); - break; - } + char *bufp = buf; + while (res != NULL && size > 4) { + const char *rname = + resourcename(res->type, (res->number != 1) ? NMF_PLURAL : 0); + int bytes = _snprintf(bufp, size, "%d %s", res->number, LOC(lang, rname)); + if (bytes < 0 || wrptr(&bufp, &size, bytes) != 0 || size < sizeof(buf) / 2) { + WARN_STATIC_BUFFER(); + break; + } - res = res->next; - if (res != NULL && size > 2) { - strcat(bufp, ", "); - bufp += 2; - size -= 2; + res = res->next; + if (res != NULL && size > 2) { + strcat(bufp, ", "); + bufp += 2; + size -= 2; + } } - } - *bufp = 0; - var.v = strcpy(balloc(bufp - buf + 1), buf); - opush(stack, var); + *bufp = 0; + var.v = strcpy(balloc(bufp - buf + 1), buf); + opush(stack, var); } static void eval_regions(struct opstack **stack, const void *userdata) { /* order -> string */ - const faction *report = (const faction *)userdata; - int i = opop(stack).i; - int end, begin = opop(stack).i; - const arg_regions *regions = (const arg_regions *)opop(stack).v; - static char buf[256]; - size_t size = sizeof(buf) - 1; - variant var; - char *bufp = buf; + const faction *report = (const faction *)userdata; + int i = opop(stack).i; + int end, begin = opop(stack).i; + const arg_regions *regions = (const arg_regions *)opop(stack).v; + static char buf[256]; + size_t size = sizeof(buf) - 1; + variant var; + char *bufp = buf; - if (regions == NULL) { - end = begin; - } else { - if (i >= 0) - end = begin + i; - else - end = regions->nregions + i; - } - for (i = begin; i < end; ++i) { - const char *rname = (const char *)regionname(regions->regions[i], report); - int bytes = (int)strlcpy(bufp, rname, size); - if (bytes && wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); - - if (i + 1 < end && size > 2) { - strcat(bufp, ", "); - bufp += 2; - size -= 2; + if (regions == NULL) { + end = begin; } - } - *bufp = 0; - var.v = strcpy(balloc(bufp - buf + 1), buf); - opush(stack, var); + else { + if (i >= 0) + end = begin + i; + else + end = regions->nregions + i; + } + for (i = begin; i < end; ++i) { + const char *rname = (const char *)regionname(regions->regions[i], report); + int bytes = (int)strlcpy(bufp, rname, size); + if (bytes && wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + + if (i + 1 < end && size > 2) { + strcat(bufp, ", "); + bufp += 2; + size -= 2; + } + } + *bufp = 0; + var.v = strcpy(balloc(bufp - buf + 1), buf); + opush(stack, var); } static void eval_trail(struct opstack **stack, const void *userdata) { /* order -> string */ - const faction *report = (const faction *)userdata; - const struct locale *lang = report ? report->locale : default_locale; - int i, end = 0, begin = 0; - const arg_regions *regions = (const arg_regions *)opop(stack).v; - static char buf[512]; - size_t size = sizeof(buf) - 1; - variant var; - char *bufp = buf; + const faction *report = (const faction *)userdata; + const struct locale *lang = report ? report->locale : default_locale; + int i, end = 0, begin = 0; + const arg_regions *regions = (const arg_regions *)opop(stack).v; + static char buf[512]; + size_t size = sizeof(buf) - 1; + variant var; + char *bufp = buf; #ifdef _SECURECRT_ERRCODE_VALUES_DEFINED - /* stupid MS broke _snprintf */ - int eold = errno; + /* stupid MS broke _snprintf */ + int eold = errno; #endif - if (regions != NULL) { - end = regions->nregions; - for (i = begin; i < end; ++i) { - region *r = regions->regions[i]; - const char *trail = trailinto(r, lang); - const char *rn = f_regionid_s(r, report); - int bytes = _snprintf(bufp, size, trail, rn); - if (bytes < 0 || wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); + if (regions != NULL) { + end = regions->nregions; + for (i = begin; i < end; ++i) { + region *r = regions->regions[i]; + const char *trail = trailinto(r, lang); + const char *rn = f_regionid_s(r, report); + int bytes = _snprintf(bufp, size, trail, rn); + if (bytes < 0 || wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); - if (i + 2 < end) { - bytes = (int)strlcpy(bufp, ", ", size); - } else if (i + 1 < end) { - bytes = (int)strlcpy(bufp, LOC(lang, "list_and"), size); - } else - bytes = 0; + if (i + 2 < end) { + bytes = (int)strlcpy(bufp, ", ", size); + } + else if (i + 1 < end) { + bytes = (int)strlcpy(bufp, LOC(lang, "list_and"), size); + } + else + bytes = 0; - if (bytes && wrptr(&bufp, &size, bytes) != 0) - WARN_STATIC_BUFFER(); + if (bytes && wrptr(&bufp, &size, bytes) != 0) + WARN_STATIC_BUFFER(); + } } - } - *bufp = 0; - var.v = strcpy(balloc(bufp - buf + 1), buf); - opush(stack, var); + *bufp = 0; + var.v = strcpy(balloc(bufp - buf + 1), buf); + opush(stack, var); #ifdef _SECURECRT_ERRCODE_VALUES_DEFINED - if (errno == ERANGE) { - errno = eold; - } + if (errno == ERANGE) { + errno = eold; + } #endif } static void eval_direction(struct opstack **stack, const void *userdata) { - const faction *report = (const faction *)userdata; - const struct locale *lang = report ? report->locale : default_locale; - int i = opop(stack).i; - const char *c = LOC(lang, (i >= 0) ? directions[i] : "unknown_direction"); - size_t len = strlen(c); - variant var; + const faction *report = (const faction *)userdata; + const struct locale *lang = report ? report->locale : default_locale; + int i = opop(stack).i; + const char *c = LOC(lang, (i >= 0) ? directions[i] : "unknown_direction"); + size_t len = strlen(c); + variant var; - var.v = strcpy(balloc(len + 1), c); - opush(stack, var); + var.v = strcpy(balloc(len + 1), c); + opush(stack, var); } static void eval_skill(struct opstack **stack, const void *userdata) { - const faction *report = (const faction *)userdata; - const struct locale *lang = report ? report->locale : default_locale; - skill_t sk = (skill_t) opop(stack).i; - const char *c = skillname(sk, lang); - size_t len = strlen(c); - variant var; + const faction *report = (const faction *)userdata; + const struct locale *lang = report ? report->locale : default_locale; + skill_t sk = (skill_t)opop(stack).i; + const char *c = skillname(sk, lang); + size_t len = strlen(c); + variant var; - var.v = strcpy(balloc(len + 1), c); - opush(stack, var); + var.v = strcpy(balloc(len + 1), c); + opush(stack, var); } static void eval_int36(struct opstack **stack, const void *userdata) { - int i = opop(stack).i; - const char *c = itoa36(i); - size_t len = strlen(c); - variant var; + int i = opop(stack).i; + const char *c = itoa36(i); + size_t len = strlen(c); + variant var; - var.v = strcpy(balloc(len + 1), c); - opush(stack, var); - unused_arg(userdata); + var.v = strcpy(balloc(len + 1), c); + opush(stack, var); + unused_arg(userdata); } /*** END MESSAGE RENDERING ***/ @@ -2303,117 +2348,120 @@ static void eval_int36(struct opstack **stack, const void *userdata) static void log_orders(const struct message *msg) { - faction *f = get_monsters(); - char buffer[4096]; - int i; + faction *f = get_monsters(); + char buffer[4096]; + int i; - for (i = 0; i != msg->type->nparameters; ++i) { - if (msg->type->types[i]->copy == &var_copy_order) { - const char *section = nr_section(msg); - nr_render(msg, f ? f->locale : default_locale, buffer, sizeof(buffer), f); - log_debug("MESSAGE [%s]: %s\n", section, buffer); - break; + for (i = 0; i != msg->type->nparameters; ++i) { + if (msg->type->types[i]->copy == &var_copy_order) { + const char *section = nr_section(msg); + nr_render(msg, f ? f->locale : default_locale, buffer, sizeof(buffer), f); + log_debug("MESSAGE [%s]: %s\n", section, buffer); + break; + } } - } } int report_action(region * r, unit * actor, message * msg, int flags) { - int result = 0; - unit *u; - int view = flags & (ACTION_CANSEE | ACTION_CANNOTSEE); + int result = 0; + unit *u; + int view = flags & (ACTION_CANSEE | ACTION_CANNOTSEE); - /* melden, 1x pro Partei */ - if (flags & ACTION_RESET) { - freset(actor->faction, FFL_SELECT); - for (u = r->units; u; u = u->next) - freset(u->faction, FFL_SELECT); - } - if (view) { - for (u = r->units; u; u = u->next) { - if (!fval(u->faction, FFL_SELECT)) { - bool show = u->faction == actor->faction; - fset(u->faction, FFL_SELECT); - if (view == ACTION_CANSEE) { - /* Bei Fernzaubern sieht nur die eigene Partei den Magier */ - show = show || (r == actor->region - && cansee(u->faction, r, actor, 0)); - } else if (view == ACTION_CANNOTSEE) { - show = !show && !(r == actor->region - && cansee(u->faction, r, actor, 0)); - } else { - /* the unliely (or lazy) case */ - show = true; - } + /* melden, 1x pro Partei */ + if (flags & ACTION_RESET) { + freset(actor->faction, FFL_SELECT); + for (u = r->units; u; u = u->next) + freset(u->faction, FFL_SELECT); + } + if (view) { + for (u = r->units; u; u = u->next) { + if (!fval(u->faction, FFL_SELECT)) { + bool show = u->faction == actor->faction; + fset(u->faction, FFL_SELECT); + if (view == ACTION_CANSEE) { + /* Bei Fernzaubern sieht nur die eigene Partei den Magier */ + show = show || (r == actor->region + && cansee(u->faction, r, actor, 0)); + } + else if (view == ACTION_CANNOTSEE) { + show = !show && !(r == actor->region + && cansee(u->faction, r, actor, 0)); + } + else { + /* the unliely (or lazy) case */ + show = true; + } - if (show) { - r_addmessage(r, u->faction, msg); - } else { /* Partei des Magiers, sieht diesen immer */ - result = 1; + if (show) { + r_addmessage(r, u->faction, msg); + } + else { /* Partei des Magiers, sieht diesen immer */ + result = 1; + } + } + } + /* Ist niemand von der Partei des Magiers in der Region, dem Magier + * nochmal gesondert melden */ + if ((flags & ACTION_CANSEE) && !fval(actor->faction, FFL_SELECT)) { + add_message(&actor->faction->msgs, msg); } - } } - /* Ist niemand von der Partei des Magiers in der Region, dem Magier - * nochmal gesondert melden */ - if ((flags & ACTION_CANSEE) && !fval(actor->faction, FFL_SELECT)) { - add_message(&actor->faction->msgs, msg); - } - } - return result; + return result; } void register_reports(void) { - /* register datatypes for the different message objects */ - register_argtype("alliance", NULL, NULL, VAR_VOIDPTR); - register_argtype("building", NULL, NULL, VAR_VOIDPTR); - register_argtype("direction", NULL, NULL, VAR_INT); - register_argtype("faction", NULL, NULL, VAR_VOIDPTR); - register_argtype("race", NULL, NULL, VAR_VOIDPTR); - register_argtype("region", NULL, NULL, VAR_VOIDPTR); - register_argtype("resource", NULL, NULL, VAR_VOIDPTR); - register_argtype("ship", NULL, NULL, VAR_VOIDPTR); - register_argtype("skill", NULL, NULL, VAR_VOIDPTR); - register_argtype("spell", NULL, NULL, VAR_VOIDPTR); - register_argtype("curse", NULL, NULL, VAR_VOIDPTR); - register_argtype("unit", NULL, NULL, VAR_VOIDPTR); - register_argtype("int", NULL, NULL, VAR_INT); - register_argtype("string", var_free_string, var_copy_string, VAR_VOIDPTR); - register_argtype("order", var_free_order, var_copy_order, VAR_VOIDPTR); - register_argtype("resources", var_free_resources, NULL, VAR_VOIDPTR); - register_argtype("items", var_free_resources, var_copy_items, VAR_VOIDPTR); - register_argtype("regions", var_free_regions, NULL, VAR_VOIDPTR); + /* register datatypes for the different message objects */ + register_argtype("alliance", NULL, NULL, VAR_VOIDPTR); + register_argtype("building", NULL, NULL, VAR_VOIDPTR); + register_argtype("direction", NULL, NULL, VAR_INT); + register_argtype("faction", NULL, NULL, VAR_VOIDPTR); + register_argtype("race", NULL, NULL, VAR_VOIDPTR); + register_argtype("region", NULL, NULL, VAR_VOIDPTR); + register_argtype("resource", NULL, NULL, VAR_VOIDPTR); + register_argtype("ship", NULL, NULL, VAR_VOIDPTR); + register_argtype("skill", NULL, NULL, VAR_VOIDPTR); + register_argtype("spell", NULL, NULL, VAR_VOIDPTR); + register_argtype("curse", NULL, NULL, VAR_VOIDPTR); + register_argtype("unit", NULL, NULL, VAR_VOIDPTR); + register_argtype("int", NULL, NULL, VAR_INT); + register_argtype("string", var_free_string, var_copy_string, VAR_VOIDPTR); + register_argtype("order", var_free_order, var_copy_order, VAR_VOIDPTR); + register_argtype("resources", var_free_resources, NULL, VAR_VOIDPTR); + register_argtype("items", var_free_resources, var_copy_items, VAR_VOIDPTR); + register_argtype("regions", var_free_regions, NULL, VAR_VOIDPTR); - msg_log_create = &log_orders; + msg_log_create = &log_orders; - /* register functions that turn message contents to readable strings */ - add_function("alliance", &eval_alliance); - add_function("region", &eval_region); - add_function("terrain", &eval_terrain); - add_function("weight", &eval_weight); - add_function("resource", &eval_resource); - add_function("race", &eval_race); - add_function("faction", &eval_faction); - add_function("ship", &eval_ship); - add_function("unit", &eval_unit); - add_function("unit.dative", &eval_unit_dative); - add_function("unit.name", &eval_unitname); - add_function("unit.id", &eval_unitid); - add_function("unit.size", &eval_unitsize); - add_function("building", &eval_building); - add_function("skill", &eval_skill); - add_function("order", &eval_order); - add_function("direction", &eval_direction); - add_function("int36", &eval_int36); - add_function("trailto", &eval_trailto); - add_function("localize", &eval_localize); - add_function("spell", &eval_spell); - add_function("curse", &eval_curse); - add_function("resources", &eval_resources); - add_function("regions", &eval_regions); - add_function("trail", &eval_trail); + /* register functions that turn message contents to readable strings */ + add_function("alliance", &eval_alliance); + add_function("region", &eval_region); + add_function("terrain", &eval_terrain); + add_function("weight", &eval_weight); + add_function("resource", &eval_resource); + add_function("race", &eval_race); + add_function("faction", &eval_faction); + add_function("ship", &eval_ship); + add_function("unit", &eval_unit); + add_function("unit.dative", &eval_unit_dative); + add_function("unit.name", &eval_unitname); + add_function("unit.id", &eval_unitid); + add_function("unit.size", &eval_unitsize); + add_function("building", &eval_building); + add_function("skill", &eval_skill); + add_function("order", &eval_order); + add_function("direction", &eval_direction); + add_function("int36", &eval_int36); + add_function("trailto", &eval_trailto); + add_function("localize", &eval_localize); + add_function("spell", &eval_spell); + add_function("curse", &eval_curse); + add_function("resources", &eval_resources); + add_function("regions", &eval_regions); + add_function("trail", &eval_trail); - /* register alternative visibility functions */ - register_function((pf_generic) view_neighbours, "view_neighbours"); - register_function((pf_generic) view_regatta, "view_regatta"); + /* register alternative visibility functions */ + register_function((pf_generic)view_neighbours, "view_neighbours"); + register_function((pf_generic)view_regatta, "view_regatta"); } diff --git a/src/keyword.c b/src/keyword.c index 95e9530ec..a30bbb66d 100644 --- a/src/keyword.c +++ b/src/keyword.c @@ -10,10 +10,19 @@ #include #include -static const char * keyword_key(int i) +const char * keyword(keyword_t kwd) { - assert(i=0); - return mkname("keyword", keywords[i]); + static char result[KEYWORDSIZE]; + if (!result[0]) { + strcpy(result, "keyword::"); + } + strcpy(result+9, keywords[kwd]); + return result; +} + +static const char * keyword_key(int kwd) { + assert(kwd < MAXKEYWORDS && kwd >= 0); + return keyword((keyword_t)kwd); } void init_keyword(const struct locale *lang, keyword_t kwd, const char *str) { @@ -28,8 +37,8 @@ void init_keywords(const struct locale *lang) { keyword_t findkeyword(const char *s) { int i; - for (i=0;i!=MAXKEYWORDS;++i) { - if (strcmp(s, keywords[i])==0) { + for (i = 0; i != MAXKEYWORDS; ++i) { + if (strcmp(s, keywords[i]) == 0) { return (keyword_t)i; } } @@ -65,73 +74,73 @@ keyword_t get_keyword(const char *s, const struct locale *lang) { static bool disabled_kwd[MAXKEYWORDS]; void enable_keyword(keyword_t kwd, bool enabled) { - assert(kwdcurrent_cmd) { + } + else if (states->current_cmd && states->current_cmd!=cmd) { free(states->current_cmd); } states->current_cmd = cmd;