new argument-type for messages: items.

not the most efficient, since it takes a deep copy of the list.
This commit is contained in:
Enno Rehling 2006-01-08 12:25:00 +00:00
parent 6ad7a5562e
commit af59e2f09c
3 changed files with 69 additions and 19 deletions

View file

@ -1989,28 +1989,18 @@ report_plaintext(const char * filename, report_context * ctx)
{ {
int maxh = maxheroes(f); int maxh = maxheroes(f);
if (maxh) { if (maxh) {
m = msg_message("nr_heroes", "units maxunits", countheroes(f), maxh); message * msg = msg_message("nr_heroes", "units maxunits", countheroes(f), maxh);
nr_render(m, f->locale, buf, sizeof(buf), f); nr_render(msg, f->locale, buf, sizeof(buf), f);
msg_release(m); msg_release(msg);
centre(F, buf, true); centre(F, buf, true);
} }
} }
#endif #endif
if (f->items!=NULL) { if (f->items!=NULL) {
item * iclaim = f->items; message * msg = msg_message("nr_claims", "items", f->items);
char * edit = buf; nr_render(msg, f->locale, buf, sizeof(buf), f);
strcpy(edit, LOC(f->locale, "claimable")); msg_release(msg);
edit += strlen(edit);
while (iclaim!=NULL) {
sprintf(edit, "%d %s", iclaim->number,
LOC(f->locale, resourcename(iclaim->type->rtype, (iclaim->number!=1)?NMF_PLURAL:0)));
iclaim = iclaim->next;
if (iclaim!=NULL) {
strcat(edit, ", ");
}
edit += strlen(edit);
}
rnl(F); rnl(F);
centre(F, buf, true); centre(F, buf, true);
} }
@ -3169,9 +3159,9 @@ eval_race(struct opstack ** stack, const void * userdata)
static void static void
eval_order(struct opstack ** stack, const void * userdata) /* order -> string */ eval_order(struct opstack ** stack, const void * userdata) /* order -> string */
{ {
const faction * report = (const faction*)userdata; const faction * report = (const faction*)userdata;
const struct order * ord = (const struct order *)opop(stack).v; const struct order * ord = (const struct order *)opop(stack).v;
static char buf[256]; static char buf[256];
size_t len; size_t len;
variant var; variant var;
@ -3181,6 +3171,34 @@ eval_order(struct opstack ** stack, const void * userdata) /* order -> string */
opush(stack, var); opush(stack, var);
} }
static void
eval_items(struct opstack ** stack, const void * userdata) /* order -> string */
{
const faction * report = (const faction*)userdata;
const struct item * itm = (const struct item *)opop(stack).v;
static char buf[256];
size_t len = sizeof(buf);
variant var;
char * edit = buf;
while (itm!=NULL && len > 4) {
const char * rname = resourcename(itm->type->rtype, (itm->number!=1)?NMF_PLURAL:0);
int written = snprintf(edit, len, "%d %s", itm->number, LOC(report->locale, rname));
len -= written;
edit += written;
itm = itm->next;
if (itm!=NULL && len>2) {
strcat(edit, ", ");
edit += 2;
len -= 2;
}
}
*edit = 0;
var.v = strcpy(balloc(edit-buf+1), buf);
opush(stack, var);
}
static void static void
eval_direction(struct opstack ** stack, const void * userdata) eval_direction(struct opstack ** stack, const void * userdata)
{ {
@ -3241,6 +3259,7 @@ report_init(void)
add_function("int36", &eval_int36); add_function("int36", &eval_int36);
add_function("trail", &eval_trail); add_function("trail", &eval_trail);
add_function("spell", &eval_spell); add_function("spell", &eval_spell);
add_function("items", &eval_items);
register_reporttype("nr", &report_plaintext, 1<<O_REPORT); register_reporttype("nr", &report_plaintext, 1<<O_REPORT);
register_reporttype("txt", &report_template, 1<<O_ZUGVORLAGE); register_reporttype("txt", &report_template, 1<<O_ZUGVORLAGE);

View file

@ -1694,6 +1694,29 @@ var_free_order(variant x)
free_order(x.v); free_order(x.v);
} }
static variant
var_copy_items(variant x)
{
item * isrc, * idst = NULL, ** iptr = &idst;
for (isrc = (item*)x.v; isrc!=NULL; isrc=isrc->next) {
item * itm = malloc(sizeof(item));
itm->number = isrc->number;
itm->type = isrc->type;
*iptr = itm;
iptr = &itm->next;
}
*iptr = NULL;
x.v = idst;
return x;
}
static void
var_free_items(variant x)
{
i_freeall((item**)&x.v);
}
void void
reports_init(void) reports_init(void)
{ {
@ -1712,6 +1735,7 @@ reports_init(void)
register_argtype("int", NULL, NULL, VAR_INT); register_argtype("int", NULL, NULL, VAR_INT);
register_argtype("string", var_free_string, var_copy_string, VAR_VOIDPTR); register_argtype("string", var_free_string, var_copy_string, VAR_VOIDPTR);
register_argtype("order", var_free_order, var_copy_order, VAR_VOIDPTR); register_argtype("order", var_free_order, var_copy_order, VAR_VOIDPTR);
register_argtype("items", var_free_items, var_copy_items, VAR_VOIDPTR);
/* register alternative visibility functions */ /* register alternative visibility functions */
register_function((pf_generic)view_neighbours, "view_neighbours"); register_function((pf_generic)view_neighbours, "view_neighbours");

View file

@ -1,5 +1,12 @@
<?xml version="1.0" encoding="ISO-8859-1"?> <?xml version="1.0" encoding="ISO-8859-1"?>
<messages> <messages>
<message name="nr_claims" section="nr">
<type>
<arg name="items" type="items"/>
</type>
<text locale="de">"Einheiten können die folgenden Gegenstände beanspruchen: $items($items)"</text>
<text locale="en">"Units can claim the following items: $items($items)"</text>
</message>
<message name="sighting" section="events"> <message name="sighting" section="events">
<type> <type>
<arg name="region" type="region"/> <arg name="region" type="region"/>