From 7eee06c285ac1b5590e55146bd7c0fe2e008fa37 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Fri, 13 Jan 2006 21:20:19 +0000 Subject: [PATCH] continued: new argument type "items" or "resources" (previous solution didn't allow lists of resources, which come in handy for build-error messages). --- src/common/gamecode/report.c | 16 ++++++++-------- src/common/kernel/build.c | 17 ++++++++--------- src/common/kernel/item.h | 6 ++++++ src/common/kernel/reports.c | 29 ++++++++++++++++++----------- src/res/messages.xml | 4 ++-- 5 files changed, 42 insertions(+), 30 deletions(-) diff --git a/src/common/gamecode/report.c b/src/common/gamecode/report.c index 10caadfff..8846b58f1 100644 --- a/src/common/gamecode/report.c +++ b/src/common/gamecode/report.c @@ -3172,23 +3172,23 @@ eval_order(struct opstack ** stack, const void * userdata) /* order -> string */ } static void -eval_items(struct opstack ** stack, const void * userdata) /* order -> string */ +eval_resources(struct opstack ** stack, const void * userdata) /* order -> string */ { const faction * report = (const faction*)userdata; - const struct item * itm = (const struct item *)opop(stack).v; + const struct resource * res = (const struct resource *)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)); + while (res!=NULL && len > 4) { + const char * rname = resourcename(res->type, (res->number!=1)?NMF_PLURAL:0); + int written = snprintf(edit, len, "%d %s", res->number, LOC(report->locale, rname)); len -= written; edit += written; - itm = itm->next; - if (itm!=NULL && len>2) { + res = res->next; + if (res!=NULL && len>2) { strcat(edit, ", "); edit += 2; len -= 2; @@ -3259,7 +3259,7 @@ report_init(void) add_function("int36", &eval_int36); add_function("trail", &eval_trail); add_function("spell", &eval_spell); - add_function("items", &eval_items); + add_function("resources", &eval_resources); register_reporttype("nr", &report_plaintext, 1<construction; - char * ch = buf; + resource * reslist = NULL; assert(cons); - for (c=0;cons->materials[c].number; c++) { - int n; - if (c!=0) strcat(ch++, ","); - n = cons->materials[c].number / cons->reqsize; - sprintf(ch, " %d %s", n?n:1, - LOC(lang, resourcename(cons->materials[c].rtype, cons->materials[c].number!=1))); - ch = ch+strlen(ch); + for (c=0;cons->materials[c].number; ++c) { + resource * res = malloc(sizeof(resource)); + res->number = cons->materials[c].number / cons->reqsize; + res->type = cons->materials[c].rtype; + res->next = reslist; + reslist = res->next; } ADDMSG(&u->faction->msgs, msg_feedback(u, ord, "build_required", - "required", buf)); + "required", reslist)); return; } case ELOWSKILL: diff --git a/src/common/kernel/item.h b/src/common/kernel/item.h index ea5ebbbf5..02687dc6c 100644 --- a/src/common/kernel/item.h +++ b/src/common/kernel/item.h @@ -31,6 +31,12 @@ typedef struct item { struct item * next; } item; +typedef struct resource { + const struct resource_type * type; + int number; + struct resource * next; +} resource; + /* bitfield values for resource_type::flags */ #define RTF_NONE 0 #define RTF_ITEM (1<<0) /* this resource is an item */ diff --git a/src/common/kernel/reports.c b/src/common/kernel/reports.c index 884d0e349..06ed43c17 100644 --- a/src/common/kernel/reports.c +++ b/src/common/kernel/reports.c @@ -1697,24 +1697,30 @@ var_free_order(variant x) static variant var_copy_items(variant x) { - item * isrc, * idst = NULL, ** iptr = &idst; + item * isrc; + resource * rdst = NULL, ** rptr = &rdst; 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; + resource * res = malloc(sizeof(resource)); + res->number = isrc->number; + res->type = isrc->type->rtype; + *rptr = res; + rptr = &res->next; } - *iptr = NULL; - x.v = idst; + *rptr = NULL; + x.v = rdst; return x; } static void -var_free_items(variant x) +var_free_resources(variant x) { - i_freeall((item**)&x.v); + resource ** rsrc = (resource**)&x.v; + while (*rsrc) { + resource * res = *rsrc; + *rsrc = res->next; + free(res); + } } void @@ -1735,7 +1741,8 @@ reports_init(void) 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("items", var_free_items, var_copy_items, VAR_VOIDPTR); + register_argtype("resources", var_free_resources, NULL, VAR_VOIDPTR); + register_argtype("items", var_free_resources, var_copy_items, VAR_VOIDPTR); /* register alternative visibility functions */ register_function((pf_generic)view_neighbours, "view_neighbours"); diff --git a/src/res/messages.xml b/src/res/messages.xml index 70f72a650..a87cd07a9 100644 --- a/src/res/messages.xml +++ b/src/res/messages.xml @@ -4,8 +4,8 @@ - "Einheiten können die folgenden Gegenstände beanspruchen: $items($items)" - "Units can claim the following items: $items($items)" + "Einheiten können die folgenden Gegenstände beanspruchen: $resources($items)" + "Units can claim the following items: $resources($items)"