diff --git a/res/core/en/strings.xml b/res/core/en/strings.xml
index f91b1d9a7..e21954ebe 100644
--- a/res/core/en/strings.xml
+++ b/res/core/en/strings.xml
@@ -176,6 +176,9 @@
Wall
+
+ a solid wall
+
the %s
diff --git a/res/core/messages.xml b/res/core/messages.xml
index 88a5e4181..1195562e8 100644
--- a/res/core/messages.xml
+++ b/res/core/messages.xml
@@ -3606,7 +3606,7 @@
- "$unit($unit) vergißt durch Dumpfbackenbrot $int($weeks) Wochen des Talentes $skill($skill)."
+ "$unit($unit) vergisst durch Dumpfbackenbrot $int($weeks) Wochen des Talentes $skill($skill)."
"$unit($unit) eats a Dumpfbackenbrot and forgets $int($weeks) weeks worth of $skill($skill)."
"$unit($unit) eats a Dumpfbackenbrot and forgets $int($weeks) weeks worth of $skill($skill)."
@@ -3699,7 +3699,7 @@
- "$unit($unit) vergißt $skill($skill)."
+ "$unit($unit) vergisst $skill($skill)."
"$unit($unit) forgets $skill($skill)."
"$unit($unit) forgets $skill($skill)."
diff --git a/src/kernel/reports.c b/src/kernel/reports.c
index 5abd71394..9d8409c3c 100644
--- a/src/kernel/reports.c
+++ b/src/kernel/reports.c
@@ -1048,6 +1048,23 @@ void transfer_seen(quicklist ** dst, quicklist ** src)
*src = NULL;
}
+int cmp_faction(const void *lhs, const void *rhs) {
+ const faction *lhf = (const faction *)lhs;
+ const faction *rhf = (const faction *)rhs;
+ if (lhf->no == rhf->no) return 0;
+ if (lhf->no > rhf->no) return 1;
+ return -1;
+}
+
+static void add_seen_faction_i(struct quicklist **flist, faction *f) {
+ ql_set_insert_ex(flist, f, cmp_faction);
+}
+
+void add_seen_faction(faction *self, faction *seen) {
+ add_seen_faction_i(&self->seen_factions, seen);
+}
+
+
static void get_addresses(report_context * ctx)
{
/* "TODO: travelthru" */
@@ -1065,7 +1082,7 @@ static void get_addresses(report_context * ctx)
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));
+ add_seen_faction_i(&flist, (faction *)ql_get(ql, qi));
}
}
@@ -1084,7 +1101,7 @@ static void get_addresses(report_context * ctx)
if (lastf != sf) {
if (u->building || u->ship || (stealthmod > INT_MIN
&& cansee(ctx->f, r, u, stealthmod))) {
- ql_set_insert(&flist, sf);
+ add_seen_faction_i(&flist, sf);
lastf = sf;
}
}
@@ -1101,7 +1118,7 @@ static void get_addresses(report_context * ctx)
unit *u2 = (unit *)a->data.v;
if (u2->faction == ctx->f) {
if (cansee_unit(u2, u, stealthmod)) {
- ql_set_insert(&flist, sf);
+ add_seen_faction_i(&flist, sf);
lastf = sf;
break;
}
@@ -1120,7 +1137,7 @@ static void get_addresses(report_context * ctx)
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);
+ add_seen_faction_i(&flist, sf);
lastf = sf;
}
}
@@ -1133,7 +1150,7 @@ static void get_addresses(report_context * ctx)
faction *f2;
for (f2 = factions; f2; f2 = f2->next) {
if (f2->alliance == ctx->f->alliance) {
- ql_set_insert(&flist, f2);
+ add_seen_faction_i(&flist, f2);
}
}
}
diff --git a/src/kernel/reports.h b/src/kernel/reports.h
index b01af4ff8..f6df3ce85 100644
--- a/src/kernel/reports.h
+++ b/src/kernel/reports.h
@@ -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
@@ -26,129 +26,130 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
extern "C" {
#endif
-/* Alter, ab dem der Score angezeigt werden soll: */
+ /* Alter, ab dem der Score angezeigt werden soll: */
#define DISPLAYSCORE 12
-/* Breite einer Reportzeile: */
+ /* Breite einer Reportzeile: */
#define REPORTWIDTH 78
- extern const char *directions[];
- extern const char *coasts[];
- extern bool nonr;
- extern bool nocr;
- extern bool noreports;
+ extern const char *directions[];
+ extern const char *coasts[];
+ extern const char *combatstatus[];
+ extern bool nonr;
+ extern bool nocr;
+ extern bool noreports;
-/* kann_finden speedups */
- extern bool kann_finden(struct faction *f1, struct faction *f2);
- extern struct unit *can_find(struct faction *, struct faction *);
+ /* kann_finden speedups */
+ bool kann_finden(struct faction *f1, struct faction *f2);
+ struct unit *can_find(struct faction *, struct faction *);
-/* funktionen zum schreiben eines reports */
- void sparagraph(struct strlist **SP, const char *s, int indent, char mark);
- void lparagraph(struct strlist **SP, char *s, int indent, char mark);
- const char *hp_status(const struct unit *u);
- extern size_t spskill(char *pbuf, size_t siz, const struct locale *lang, const struct unit *u, struct skill *sv, int *dh, int days); /* mapper */
- extern void spunit(struct strlist **SP, const struct faction *f,
- const struct unit *u, int indent, int mode);
+ /* funktionen zum schreiben eines reports */
+ void sparagraph(struct strlist **SP, const char *s, int indent, char mark);
+ void lparagraph(struct strlist **SP, char *s, int indent, char mark);
+ const char *hp_status(const struct unit *u);
+ size_t spskill(char *pbuf, size_t siz, const struct locale *lang, const struct unit *u, struct skill *sv, int *dh, int days); /* mapper */
+ void spunit(struct strlist **SP, const struct faction *f,
+ const struct unit *u, int indent, int mode);
- extern int reports(void);
- extern int write_reports(struct faction *f, time_t ltime);
- extern int init_reports(void);
- extern void reorder_units(struct region * r);
+ int reports(void);
+ int write_reports(struct faction *f, time_t ltime);
+ int init_reports(void);
+ void reorder_units(struct region * r);
- extern const struct unit *ucansee(const struct faction *f,
- const struct unit *u, const struct unit *x);
+ const struct unit *ucansee(const struct faction *f,
+ const struct unit *u, const struct unit *x);
- enum {
- see_none,
- see_neighbour,
- see_lighthouse,
- see_travel,
- see_far,
- see_unit,
- see_battle
- };
- extern int stealth_modifier(int seen_mode);
+ enum {
+ see_none,
+ see_neighbour,
+ see_lighthouse,
+ see_travel,
+ see_far,
+ see_unit,
+ see_battle
+ };
+ int stealth_modifier(int seen_mode);
- typedef struct seen_region {
- struct seen_region *nextHash;
- struct seen_region *next;
- struct region *r;
- unsigned char mode;
- bool disbelieves;
- } seen_region;
+ typedef struct seen_region {
+ struct seen_region *nextHash;
+ struct seen_region *next;
+ struct region *r;
+ unsigned char mode;
+ bool disbelieves;
+ } seen_region;
- extern struct seen_region *find_seen(struct seen_region *seehash[],
- const struct region *r);
- extern bool add_seen(struct seen_region *seehash[], struct region *r,
- unsigned char mode, bool dis);
- extern struct seen_region **seen_init(void);
- extern void seen_done(struct seen_region *seehash[]);
- extern void free_seen(void);
- extern void link_seen(seen_region * seehash[], const struct region *first,
- const struct region *last);
- extern const char *visibility[];
+ struct seen_region *find_seen(struct seen_region *seehash[],
+ const struct region *r);
+ bool add_seen(struct seen_region *seehash[], struct region *r,
+ unsigned char mode, bool dis);
+ struct seen_region **seen_init(void);
+ void seen_done(struct seen_region *seehash[]);
+ void free_seen(void);
+ void link_seen(seen_region * seehash[], const struct region *first,
+ const struct region *last);
+ const char *visibility[];
- typedef struct report_context {
- struct faction *f;
- struct quicklist *addresses;
- struct seen_region **seen;
- struct region *first, *last;
- void *userdata;
- time_t report_time;
- } report_context;
+ typedef struct report_context {
+ struct faction *f;
+ struct quicklist *addresses;
+ struct seen_region **seen;
+ struct region *first, *last;
+ void *userdata;
+ time_t report_time;
+ } report_context;
- typedef int (*report_fun) (const char *filename, report_context * ctx,
- const char *charset);
- extern void register_reporttype(const char *extension, report_fun write,
- int flag);
+ typedef int(*report_fun) (const char *filename, report_context * ctx,
+ const char *charset);
+ void register_reporttype(const char *extension, report_fun write,
+ int flag);
- extern int bufunit(const struct faction *f, const struct unit *u, int indent,
- int mode, char *buf, size_t size);
+ int bufunit(const struct faction *f, const struct unit *u, int indent,
+ int mode, char *buf, size_t size);
- extern const char *trailinto(const struct region *r,
- const struct locale *lang);
- extern const char *report_kampfstatus(const struct unit *u,
- const struct locale *lang);
+ const char *trailinto(const struct region *r,
+ const struct locale *lang);
+ const char *report_kampfstatus(const struct unit *u,
+ const struct locale *lang);
- extern void register_reports(void);
+ void register_reports(void);
- extern int update_nmrs(void);
- extern int *nmrs;
+ int update_nmrs(void);
+ int *nmrs;
- extern struct message *msg_curse(const struct curse *c, const void *obj,
- objtype_t typ, int slef);
+ struct message *msg_curse(const struct curse *c, const void *obj,
+ objtype_t typ, int slef);
- typedef struct arg_regions {
- int nregions;
- struct region **regions;
- } arg_regions;
+ typedef struct arg_regions {
+ int nregions;
+ struct region **regions;
+ } arg_regions;
- typedef struct resource_report {
- const char *name;
- int number;
- int level;
- } resource_report;
- int report_resources(const struct seen_region *sr,
+ typedef struct resource_report {
+ const char *name;
+ int number;
+ int level;
+ } resource_report;
+ int report_resources(const struct seen_region *sr,
struct resource_report *result, int size, const struct faction *viewer);
- int report_items(const struct item *items, struct item *result, int size,
- const struct unit *owner, const struct faction *viewer);
- void report_item(const struct unit *owner, const struct item *i,
- const struct faction *viewer, const char **name, const char **basename,
- int *number, bool singular);
- void report_building(const struct building *b, const char **btype,
- const char **billusion);
- void report_race(const struct unit *u, const char **rcname,
- const char **rcillusion);
+ int report_items(const struct item *items, struct item *result, int size,
+ const struct unit *owner, const struct faction *viewer);
+ void report_item(const struct unit *owner, const struct item *i,
+ const struct faction *viewer, const char **name, const char **basename,
+ int *number, bool singular);
+ void report_building(const struct building *b, const char **btype,
+ const char **billusion);
+ void report_race(const struct unit *u, const char **rcname,
+ const char **rcillusion);
+ void add_seen_faction(struct faction *self, struct faction *seen);
#define ACTION_RESET 0x01 /* reset the one-time-flag FFL_SELECT (on first pass) */
#define ACTION_CANSEE 0x02 /* to people who can see the actor */
#define ACTION_CANNOTSEE 0x04 /* to people who can not see the actor */
- extern int report_action(struct region *r, struct unit *actor,
+ int report_action(struct region *r, struct unit *actor,
struct message *msg, int flags);
- extern size_t f_regionid(const struct region *r, const struct faction *f,
- char *buffer, size_t size);
+ size_t f_regionid(const struct region *r, const struct faction *f,
+ char *buffer, size_t size);
- extern const char *combatstatus[];
#define GR_PLURAL 0x01 /* grammar: plural */
#define MAX_INVENTORY 128 /* maimum number of different items in an inventory */
#define MAX_RAWMATERIALS 8 /* maximum kinds of raw materials in a regions */
diff --git a/src/kernel/reports.test.c b/src/kernel/reports.test.c
index 2340f32c3..f92e35d04 100644
--- a/src/kernel/reports.test.c
+++ b/src/kernel/reports.test.c
@@ -1,11 +1,15 @@
#include
#include
+#include
+#include
#include
#include
#include
#include
+#include
+
#include
#include
@@ -76,10 +80,28 @@ static void test_regionid(CuTest * tc) {
CuAssertIntEquals(tc, 0x7d, buffer[11]);
}
+static void test_seen_faction(CuTest *tc) {
+ faction *f1, *f2;
+ race *rc = test_create_race("human");
+ f1 = test_create_faction(rc);
+ f2 = test_create_faction(rc);
+ add_seen_faction(f1, f2);
+ CuAssertPtrEquals(tc, f2, ql_get(f1->seen_factions, 0));
+ CuAssertIntEquals(tc, 1, ql_length(f1->seen_factions));
+ add_seen_faction(f1, f2);
+ CuAssertIntEquals(tc, 1, ql_length(f1->seen_factions));
+ add_seen_faction(f1, f1);
+ CuAssertIntEquals(tc, 2, ql_length(f1->seen_factions));
+ f2 = (faction *)ql_get(f1->seen_factions, 1);
+ f1 = (faction *)ql_get(f1->seen_factions, 0);
+ CuAssertTrue(tc, f1->nono);
+}
+
CuSuite *get_reports_suite(void)
{
CuSuite *suite = CuSuiteNew();
SUITE_ADD_TEST(suite, test_reorder_units);
+ SUITE_ADD_TEST(suite, test_seen_faction);
SUITE_ADD_TEST(suite, test_regionid);
return suite;
}
diff --git a/src/spy.c b/src/spy.c
index 35960b1ea..fc2c5895d 100644
--- a/src/spy.c
+++ b/src/spy.c
@@ -76,7 +76,7 @@ void spy_message(int spy, const unit * u, const unit * target)
/* true faction */
ADDMSG(&u->faction->msgs, msg_message("spyreport_faction",
"target faction", target, target->faction));
- ql_set_insert(&u->faction->seen_factions, target->faction);
+ add_seen_faction(u->faction, target->faction);
}
}
if (spy > 0) {