diff --git a/src/economy.c b/src/economy.c index f98d0f8e1..f0a693eca 100644 --- a/src/economy.c +++ b/src/economy.c @@ -915,8 +915,7 @@ struct message * get_modifiers(unit *u, const resource_mod *mod, variant *savep, } static resource_limit *get_resourcelimit(const resource_type *rtype) { - attrib *a = a_find(rtype->attribs, &at_resourcelimit); - return a ? (resource_limit *)a->data.v : NULL; + return rtype->limit; } static void allocate_resource(unit * u, const resource_type * rtype, int want) diff --git a/src/economy.test.c b/src/economy.test.c index 766fb4302..c67237c40 100644 --- a/src/economy.test.c +++ b/src/economy.test.c @@ -348,7 +348,7 @@ static void test_make_item(CuTest *tc) { struct item_type *itype; const struct resource_type *rt_silver; resource_type *rtype; - attrib *a; + rawmaterial_type *rmt; resource_limit *rdata; double d = 0.6; @@ -382,10 +382,9 @@ static void test_make_item(CuTest *tc) { free(itype->construction->materials); itype->construction->materials = 0; rtype->flags |= RTF_LIMITED; - a = a_add(&rtype->attribs, a_new(&at_resourcelimit)); - rdata = (resource_limit *)a->data.v; + rmt = rmt_create(rtype, "rm_stone"); + rdata = rtype->limit = calloc(1, sizeof(resource_limit)); rdata->value = 0; - rmt_create(rtype, "stone"); add_resource(u->region, 1, 300, 150, rtype); u->region->resources->amount = 300; /* there are 300 stones at level 1 */ set_level(u, SK_ALCHEMY, 10); diff --git a/src/items/seed.c b/src/items/seed.c index f17e8ed29..334c6a05d 100644 --- a/src/items/seed.c +++ b/src/items/seed.c @@ -24,6 +24,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include #include +#include /* util includes */ #include @@ -31,6 +32,7 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. /* libc includes */ #include +#include static void produce_seeds(region * r, const resource_type * rtype, int norders) { @@ -48,14 +50,11 @@ static int limit_seeds(const region * r, const resource_type * rtype) void init_seed(void) { - attrib *a; - resource_limit *rdata; resource_type *rtype; rtype = rt_find("seed"); if (rtype != NULL) { - a = a_add(&rtype->attribs, a_new(&at_resourcelimit)); - rdata = (resource_limit *)a->data.v; + resource_limit *rdata = rtype->limit = calloc(1, sizeof(resource_limit)); rdata->limit = limit_seeds; rdata->produce = produce_seeds; } @@ -80,17 +79,14 @@ static int limit_mallornseeds(const region * r, const resource_type * rtype) void init_mallornseed(void) { - attrib *a; - resource_limit *rdata; resource_type *rtype; rtype = rt_find("mallornseed"); if (rtype != NULL) { + resource_limit *rdata = rtype->limit = calloc(1, sizeof(resource_limit)); rtype->flags |= RTF_LIMITED; rtype->flags |= RTF_POOLED; - a = a_add(&rtype->attribs, a_new(&at_resourcelimit)); - rdata = (resource_limit *)a->data.v; rdata->limit = limit_mallornseeds; rdata->produce = produce_mallornseeds; } diff --git a/src/kernel/item.c b/src/kernel/item.c index c37e3d40c..5beac7189 100644 --- a/src/kernel/item.c +++ b/src/kernel/item.c @@ -1159,22 +1159,6 @@ const item_type *finditemtype(const char *name, const struct locale *lang) return 0; } -static void init_resourcelimit(attrib * a) -{ - a->data.v = calloc(sizeof(resource_limit), 1); -} - -static void finalize_resourcelimit(attrib * a) -{ - free(a->data.v); -} - -attrib_type at_resourcelimit = { - "resourcelimit", - init_resourcelimit, - finalize_resourcelimit, -}; - item *item_spoil(const struct race *rc, int size) { item *itm = NULL; diff --git a/src/kernel/item.h b/src/kernel/item.h index 79e6f103d..1d3e5ff29 100644 --- a/src/kernel/item.h +++ b/src/kernel/item.h @@ -29,6 +29,7 @@ extern "C" { struct unit; struct attrib; struct attrib_type; + struct race; struct region; struct resource_type; struct locale; @@ -37,6 +38,8 @@ extern "C" { struct order; struct storage; struct gamedata; + struct rawmaterial_type; + struct resource_limit; typedef struct item { struct item *next; @@ -76,6 +79,8 @@ extern "C" { rtype_uchange uchange; rtype_uget uget; rtype_name name; + struct rawmaterial_type *raw; + struct resource_limit *limit; /* --- pointers --- */ struct attrib *attribs; struct item_type *itype; @@ -94,25 +99,6 @@ extern "C" { #define RMF_SAVEMATERIAL 0x02 /* fraction (sa[0]/sa[1]), multiplier on resource usage */ #define RMF_REQUIREDBUILDING 0x04 /* building, required to build */ - typedef struct resource_mod { - variant value; - const struct building_type *btype; - const struct race *race; - unsigned int flags; - } resource_mod; - - extern struct attrib_type at_resourcelimit; - typedef int(*rlimit_limit) (const struct region * r, - const struct resource_type * rtype); - typedef void(*rlimit_produce) (struct region * r, - const struct resource_type * rtype, int n); - typedef struct resource_limit { - rlimit_limit limit; - rlimit_produce produce; - int value; - resource_mod *modifiers; - } resource_limit; - /* bitfield values for item_type::flags */ #define ITF_NONE 0x0000 #define ITF_HERB 0x0001 /* this item is a herb */ diff --git a/src/kernel/resources.c b/src/kernel/resources.c index e32c7ad55..d02153e8f 100644 --- a/src/kernel/resources.c +++ b/src/kernel/resources.c @@ -195,16 +195,16 @@ struct rawmaterial_type *rmt_find(const char *str) struct rawmaterial_type *rmt_get(const struct resource_type *rtype) { - rawmaterial_type *rmt = rawmaterialtypes; - while (rmt && rmt->rtype != rtype) - rmt = rmt->next; - return rmt; + return rtype->raw; } -struct rawmaterial_type *rmt_create(const struct resource_type *rtype, +struct rawmaterial_type *rmt_create(struct resource_type *rtype, const char *name) { - rawmaterial_type *rmtype = malloc(sizeof(rawmaterial_type)); + rawmaterial_type *rmtype; + + assert(!rtype->raw); + rmtype = rtype->raw = malloc(sizeof(rawmaterial_type)); rmtype->name = strdup(name); rmtype->rtype = rtype; rmtype->terraform = terraform_default; diff --git a/src/kernel/resources.h b/src/kernel/resources.h index a1a7abd40..dd4cfd664 100644 --- a/src/kernel/resources.h +++ b/src/kernel/resources.h @@ -15,6 +15,9 @@ extern "C" { #endif + struct building_type; + struct race; + enum { RM_USED = 1 << 0, /* resource has been used */ RM_MALLORN = 1 << 1 /* this is not wood. it's mallorn */ @@ -40,6 +43,25 @@ extern "C" { struct rawmaterial *next; } rawmaterial; + typedef int(*rlimit_limit) (const struct region * r, + const struct resource_type * rtype); + typedef void(*rlimit_produce) (struct region * r, + const struct resource_type * rtype, int n); + + typedef struct resource_mod { + variant value; + const struct building_type *btype; + const struct race *race; + unsigned int flags; + } resource_mod; + + typedef struct resource_limit { + rlimit_limit limit; + rlimit_produce produce; + int value; + resource_mod *modifiers; + } resource_limit; + typedef struct rawmaterial_type { char *name; const struct resource_type *rtype; @@ -64,7 +86,7 @@ extern "C" { void add_resource(struct region *r, int level, int base, int divisor, const struct resource_type *rtype); - struct rawmaterial_type *rmt_create(const struct resource_type *rtype, + struct rawmaterial_type *rmt_create(struct resource_type *rtype, const char *name); #ifdef __cplusplus diff --git a/src/kernel/xmlreader.c b/src/kernel/xmlreader.c index 555c0f679..2d08f40a4 100644 --- a/src/kernel/xmlreader.c +++ b/src/kernel/xmlreader.c @@ -949,12 +949,6 @@ static int parse_resources(xmlDocPtr doc) rtype->flags |= flags; xmlFree(name); - name = xmlGetProp(node, BAD_CAST "material"); - if (name) { - rmt_create(rtype, (const char *)name); - xmlFree(name); - } - /* reading eressea/resources/resource/function */ xpath->node = node; result = xmlXPathEvalExpression(BAD_CAST "function", xpath); @@ -987,18 +981,20 @@ static int parse_resources(xmlDocPtr doc) } xmlXPathFreeObject(result); + name = xmlGetProp(node, BAD_CAST "material"); + if (name) { + rmt_create(rtype, (const char *)name); + xmlFree(name); + } + /* reading eressea/resources/resource/resourcelimit */ xpath->node = node; result = xmlXPathEvalExpression(BAD_CAST "resourcelimit", xpath); assert(result->nodesetval->nodeNr <= 1); if (result->nodesetval->nodeNr != 0) { - resource_limit *rdata; - attrib *a = a_find(rtype->attribs, &at_resourcelimit); + resource_limit *rdata = rtype->limit = calloc(1, sizeof(resource_limit)); xmlNodePtr limit = result->nodesetval->nodeTab[0]; - if (a == NULL) - a = a_add(&rtype->attribs, a_new(&at_resourcelimit)); - rdata = (resource_limit *)a->data.v; rtype->flags |= RTF_LIMITED; xpath->node = limit; xmlXPathFreeObject(result); @@ -1095,7 +1091,6 @@ static int parse_resources(xmlDocPtr doc) } } xmlXPathFreeObject(result); - /* reading eressea/resources/resource/resourcelimit/function */ xpath->node = node; result = xmlXPathEvalExpression(BAD_CAST "resourcelimit/function", xpath);