From 33d1521bfd5057c59b4ed25d32d0eba3a1e5b622 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Wed, 16 Dec 2015 22:18:44 +0100 Subject: [PATCH] pass the parent of an attribute into a_age and attrib_type::age --- src/alchemy.c | 3 ++- src/attributes/hate.c | 3 ++- src/attributes/moved.c | 3 ++- src/attributes/movement.c | 3 ++- src/attributes/reduceproduction.c | 17 ++++++++++++++--- src/building_action.c | 5 +++-- src/items/artrewards.c | 3 ++- src/kernel/curse.c | 3 ++- src/kernel/curse.h | 2 +- src/kernel/unit.c | 3 ++- src/kernel/unit.test.c | 6 +++--- src/laws.c | 10 +++++----- src/magic.c | 9 ++++++--- src/magic.h | 2 +- src/modules/arena.c | 3 ++- src/move.c | 3 ++- src/move.test.c | 4 ++-- src/spells.test.c | 6 +++--- src/spells/alp.c | 5 +++-- src/util/attrib.c | 4 ++-- src/util/attrib.h | 4 ++-- src/vortex.c | 7 ++++--- src/wormhole.c | 5 +++-- 23 files changed, 70 insertions(+), 43 deletions(-) diff --git a/src/alchemy.c b/src/alchemy.c index 9042fee9b..377f84d61 100644 --- a/src/alchemy.c +++ b/src/alchemy.c @@ -219,9 +219,10 @@ static void free_potiondelay(attrib * a) free(a->data.v); } -static int age_potiondelay(attrib * a) +static int age_potiondelay(attrib * a, void *owner) { potiondelay *pd = (potiondelay *)a->data.v; + unused_arg(owner); pd->amount = do_potion(pd->u, pd->r, pd->ptype, pd->amount); return AT_AGE_REMOVE; } diff --git a/src/attributes/hate.c b/src/attributes/hate.c index dd228b132..84768944a 100644 --- a/src/attributes/hate.c +++ b/src/attributes/hate.c @@ -28,8 +28,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include -static int verify_hate(attrib * a) +static int verify_hate(attrib * a, void *owner) { + unused_arg(owner); if (a->data.v == NULL) { return 0; } diff --git a/src/attributes/moved.c b/src/attributes/moved.c index 781162ea2..b671646c1 100644 --- a/src/attributes/moved.c +++ b/src/attributes/moved.c @@ -24,8 +24,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include -static int age_moved(attrib * a) +static int age_moved(attrib * a, void *owner) { + unused_arg(owner); --a->data.i; return a->data.i > 0; } diff --git a/src/attributes/movement.c b/src/attributes/movement.c index beb3998f0..ca8b6fc2f 100644 --- a/src/attributes/movement.c +++ b/src/attributes/movement.c @@ -65,8 +65,9 @@ void set_movement(attrib ** alist, int type) a->data.i |= type; } -static int age_speedup(attrib * a) +static int age_speedup(attrib * a, void *owner) { + unused_arg(owner); if (a->data.sa[0] > 0) { assert(a->data.sa[0] - a->data.sa[1] >= SHRT_MIN); assert(a->data.sa[0] - a->data.sa[1] <= SHRT_MAX); diff --git a/src/attributes/reduceproduction.c b/src/attributes/reduceproduction.c index 4472a5288..ecf9e4b01 100644 --- a/src/attributes/reduceproduction.c +++ b/src/attributes/reduceproduction.c @@ -20,15 +20,26 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #include #include "reduceproduction.h" #include +#include +#include +#include #include +#include -static int age_reduceproduction(attrib * a) +static int age_reduceproduction(attrib * a, void *owner) { + region * r = (region *)owner; int reduce = 100 - (5 * --a->data.sa[1]); - if (reduce < 10) + assert(r); + if (reduce < 10) { reduce = 10; + } a->data.sa[0] = (short)reduce; - return (a->data.sa[1] > 0) ? AT_AGE_KEEP : AT_AGE_REMOVE; + if (a->data.sa[1] > 0) { + ADDMSG(&r->msgs, msg_message("reduceproduction", "")); + return AT_AGE_KEEP; + } + return AT_AGE_REMOVE; } attrib_type at_reduceproduction = { diff --git a/src/building_action.c b/src/building_action.c index 940edb2f1..f5cc19bf8 100644 --- a/src/building_action.c +++ b/src/building_action.c @@ -28,12 +28,12 @@ without prior permission by the authors of Eressea. #include typedef struct building_action { - struct building *b; + struct building *b; // TODO: remove, use attribute-owner? char *fname; char *param; } building_action; -static int lc_age(struct attrib *a) +static int lc_age(struct attrib *a, void *owner) { building_action *data = (building_action *)a->data.v; const char *fname = data->fname; @@ -42,6 +42,7 @@ static int lc_age(struct attrib *a) int result = -1; assert(b != NULL); + assert(owner == b); if (fname != NULL) { lua_State *L = (lua_State *)global.vm_state; diff --git a/src/items/artrewards.c b/src/items/artrewards.c index a5aeb64c2..8b6288f61 100644 --- a/src/items/artrewards.c +++ b/src/items/artrewards.c @@ -45,8 +45,9 @@ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. #define HORNDURATION 3 #define HORNIMMUNITY 30 -static int age_peaceimmune(attrib * a) +static int age_peaceimmune(attrib * a, void *owner) { + unused_arg(owner); return (--a->data.i > 0) ? AT_AGE_KEEP : AT_AGE_REMOVE; } diff --git a/src/kernel/curse.c b/src/kernel/curse.c index 09fcdb1d1..3cb39ebab 100644 --- a/src/kernel/curse.c +++ b/src/kernel/curse.c @@ -112,11 +112,12 @@ void curse_init(attrib * a) a->data.v = calloc(1, sizeof(curse)); } -int curse_age(attrib * a) +int curse_age(attrib * a, void *owner) { curse *c = (curse *)a->data.v; int result = 0; + unused_arg(owner); c_clearflag(c, CURSE_ISNEW); if (c_flags(c) & CURSE_NOAGE) { diff --git a/src/kernel/curse.h b/src/kernel/curse.h index 143e73d27..263b66125 100644 --- a/src/kernel/curse.h +++ b/src/kernel/curse.h @@ -291,7 +291,7 @@ extern "C" { void curse_init(struct attrib *a); void curse_done(struct attrib *a); - int curse_age(struct attrib *a); + int curse_age(struct attrib *a, void *owner); double destr_curse(struct curse *c, int cast_level, double force); diff --git a/src/kernel/unit.c b/src/kernel/unit.c index 493a3a66f..9f7c6e984 100644 --- a/src/kernel/unit.c +++ b/src/kernel/unit.c @@ -771,10 +771,11 @@ void set_level(unit * u, skill_t sk, int value) sk_set(add_skill(u, sk), value); } -static int leftship_age(struct attrib *a) +static int leftship_age(struct attrib *a, void *owner) { /* must be aged, so it doesn't affect report generation (cansee) */ unused_arg(a); + unused_arg(owner); return AT_AGE_REMOVE; /* remove me */ } diff --git a/src/kernel/unit.test.c b/src/kernel/unit.test.c index 0fd58a55a..010a59d3a 100644 --- a/src/kernel/unit.test.c +++ b/src/kernel/unit.test.c @@ -341,12 +341,12 @@ static void test_age_familiar(CuTest *tc) { CuAssertIntEquals(tc, true, create_newfamiliar(mag, fam)); CuAssertPtrEquals(tc, fam, get_familiar(mag)); CuAssertPtrEquals(tc, mag, get_familiar_mage(fam)); - a_age(&fam->attribs); - a_age(&mag->attribs); + a_age(&fam->attribs, fam); + a_age(&mag->attribs, mag); CuAssertPtrEquals(tc, fam, get_familiar(mag)); CuAssertPtrEquals(tc, mag, get_familiar_mage(fam)); set_number(fam, 0); - a_age(&mag->attribs); + a_age(&mag->attribs, mag); CuAssertPtrEquals(tc, 0, get_familiar(mag)); test_cleanup(); } diff --git a/src/laws.c b/src/laws.c index 3ca95b61f..6912f3b8a 100755 --- a/src/laws.c +++ b/src/laws.c @@ -3096,7 +3096,7 @@ static building *age_building(building * b) } } - a_age(&b->attribs); + a_age(&b->attribs, b); handle_event(b->attribs, "timer", b); if (b->type->age) { @@ -3108,7 +3108,7 @@ static building *age_building(building * b) static void age_region(region * r) { - a_age(&r->attribs); + a_age(&r->attribs, r); handle_event(r->attribs, "timer", r); if (!r->land) @@ -3153,7 +3153,7 @@ static void ageing(void) /* Factions */ for (f = factions; f; f = f->next) { - a_age(&f->attribs); + a_age(&f->attribs, f); handle_event(f->attribs, "timer", f); } @@ -3168,7 +3168,7 @@ static void ageing(void) /* Einheiten */ for (up = &r->units; *up;) { unit *u = *up; - a_age(&u->attribs); + a_age(&u->attribs, u); if (u == *up) handle_event(u->attribs, "timer", u); if (u == *up) @@ -3178,7 +3178,7 @@ static void ageing(void) /* Schiffe */ for (sp = &r->ships; *sp;) { ship *s = *sp; - a_age(&s->attribs); + a_age(&s->attribs, s); if (s == *sp) handle_event(s->attribs, "timer", s); if (s == *sp) diff --git a/src/magic.c b/src/magic.c index 752b0bcd7..814db3a6a 100644 --- a/src/magic.c +++ b/src/magic.c @@ -149,17 +149,19 @@ static void a_writeicastle(const attrib * a, const void *owner, struct storage *store) { icastle_data *data = (icastle_data *)a->data.v; + assert(owner == data->building); WRITE_TOK(store, data->type->_name); WRITE_INT(store, data->building->no); WRITE_INT(store, data->time); } -static int a_ageicastle(struct attrib *a) +static int a_ageicastle(struct attrib *a, void *owner) { icastle_data *data = (icastle_data *)a->data.v; if (data->time <= 0) { - building *b = data->building; + building *b = data->building; // TODO: use owner region *r = b->region; + assert(owner == b); ADDMSG(&r->msgs, msg_message("icastle_dissolve", "building", b)); /* remove_building lets units leave the building */ remove_building(&r->buildings, b); @@ -2388,10 +2390,11 @@ static int read_magician(attrib * a, void *owner, struct storage *store) return AT_READ_OK; } -static int age_unit(attrib * a) +static int age_unit(attrib * a, void *owner) /* if unit is gone or dead, remove the attribute */ { unit *u = (unit *)a->data.v; + unused_arg(owner); return (u != NULL && u->number > 0) ? AT_AGE_KEEP : AT_AGE_REMOVE; } diff --git a/src/magic.h b/src/magic.h index c33d9917e..3a1854cfb 100644 --- a/src/magic.h +++ b/src/magic.h @@ -208,7 +208,7 @@ extern "C" { typedef struct icastle_data { const struct building_type *type; - struct building *building; /* reverse pointer to dissolve the object */ + struct building *building; // TODO: remove, use owner argument int time; } icastle_data; diff --git a/src/modules/arena.c b/src/modules/arena.c index 3b7e7c7f9..6b76a3434 100644 --- a/src/modules/arena.c +++ b/src/modules/arena.c @@ -212,11 +212,12 @@ order * ord) /** * Tempel der Schreie, Demo-Gebäude **/ -static int age_hurting(attrib * a) +static int age_hurting(attrib * a, void *owner) { building *b = (building *)a->data.v; unit *u; int active = 0; + assert(owner == b); if (b == NULL) return AT_AGE_REMOVE; for (u = b->region->units; u; u = u->next) { diff --git a/src/move.c b/src/move.c index 7780329cf..5ec15c913 100644 --- a/src/move.c +++ b/src/move.c @@ -135,9 +135,10 @@ static void shiptrail_finalize(attrib * a) free(a->data.v); } -static int shiptrail_age(attrib * a) +static int shiptrail_age(attrib * a, void *owner) { traveldir *t = (traveldir *)(a->data.v); + unused_arg(owner); t->age--; return (t->age > 0) ? AT_AGE_KEEP : AT_AGE_REMOVE; diff --git a/src/move.test.c b/src/move.test.c index 5c24ca72e..212d94088 100644 --- a/src/move.test.c +++ b/src/move.test.c @@ -287,9 +287,9 @@ static void test_age_trails(CuTest *tc) { move_ship(sh, r1, r2, route); CuAssertPtrNotNull(tc, r1->attribs); - a_age(&r1->attribs); + a_age(&r1->attribs, r1); CuAssertPtrNotNull(tc, r1->attribs); - a_age(&r1->attribs); + a_age(&r1->attribs, r1); CuAssertPtrEquals(tc, 0, r1->attribs); free_regionlist(route); test_cleanup(); diff --git a/src/spells.test.c b/src/spells.test.c index 58886d991..3c773d489 100644 --- a/src/spells.test.c +++ b/src/spells.test.c @@ -42,7 +42,7 @@ static void test_good_dreams(CuTest *tc) { CuAssertTrue(tc, curse && curse->duration > 1); CuAssertTrue(tc, curse->effect == 1); - a_age(&r->attribs); + a_age(&r->attribs, r); CuAssertIntEquals_Msg(tc, "good dreams give +1 to allies", 1, get_modifier(u1, SK_MELEE, 11, r, false)); CuAssertIntEquals_Msg(tc, "good dreams have no effect on non-allies", 0, get_modifier(u2, SK_MELEE, 11, r, false)); free_castorder(&co); @@ -67,7 +67,7 @@ static void test_dreams(CuTest *tc) { sp_gooddreams(&co); sp_baddreams(&co); - a_age(&r->attribs); + a_age(&r->attribs, r); CuAssertIntEquals_Msg(tc, "good dreams in same region as bad dreams", 1, get_modifier(u1, SK_MELEE, 11, r, false)); CuAssertIntEquals_Msg(tc, "bad dreams in same region as good dreams", -1, get_modifier(u2, SK_MELEE, 11, r, false)); @@ -98,7 +98,7 @@ static void test_bad_dreams(CuTest *tc) { CuAssertTrue(tc, curse && curse->duration > 1); CuAssertTrue(tc, curse->effect == -1); - a_age(&r->attribs); + a_age(&r->attribs, r); CuAssertIntEquals_Msg(tc, "bad dreams have no effect on allies", 0, get_modifier(u1, SK_MELEE, 11, r, false)); CuAssertIntEquals_Msg(tc, "bad dreams give -1 to non-allies", -1, get_modifier(u2, SK_MELEE, 11, r, false)); diff --git a/src/spells/alp.c b/src/spells/alp.c index f86695194..d443aa063 100644 --- a/src/spells/alp.c +++ b/src/spells/alp.c @@ -46,7 +46,7 @@ extern const char *directions[]; typedef struct alp_data { unit *mage; - unit *target; + unit *target; // TODO: remove, use attribute-owner? } alp_data; static void alp_init(attrib * a) @@ -59,9 +59,10 @@ static void alp_done(attrib * a) free(a->data.v); } -static int alp_verify(attrib * a) +static int alp_verify(attrib * a, void *owner) { alp_data *ad = (alp_data *)a->data.v; + unused_arg(owner); if (ad->mage && ad->target) return 1; return 0; /* remove the attribute */ diff --git a/src/util/attrib.c b/src/util/attrib.c index 5c92b691e..9db46836a 100644 --- a/src/util/attrib.c +++ b/src/util/attrib.c @@ -252,7 +252,7 @@ attrib *a_new(const attrib_type * at) return a; } -int a_age(attrib ** p) +int a_age(attrib ** p, void *owner) { attrib **ap = p; /* Attribute altern, und die Entfernung (age()==0) eines Attributs @@ -260,7 +260,7 @@ int a_age(attrib ** p) while (*ap) { attrib *a = *ap; if (a->type->age) { - int result = a->type->age(a); + int result = a->type->age(a, owner); assert(result >= 0 || !"age() returned a negative value"); if (result == AT_AGE_REMOVE) { a_remove(p, a); diff --git a/src/util/attrib.h b/src/util/attrib.h index c235fd67a..2703de0cb 100644 --- a/src/util/attrib.h +++ b/src/util/attrib.h @@ -52,7 +52,7 @@ extern "C" { const char *name; void(*initialize) (struct attrib *); void(*finalize) (struct attrib *); - int(*age) (struct attrib *); + int(*age) (struct attrib *, void *owner); /* age returns 0 if the attribute needs to be removed, !=0 otherwise */ void(*write) (const struct attrib *, const void *owner, struct storage *); int(*read) (struct attrib *, void *owner, struct storage *); /* return AT_READ_OK on success, AT_READ_FAIL if attrib needs removal */ @@ -74,7 +74,7 @@ extern "C" { extern void a_removeall(attrib ** a, const attrib_type * at); extern attrib *a_new(const attrib_type * at); - extern int a_age(attrib ** attribs); + extern int a_age(attrib ** attribs, void *owner); extern int a_read(struct storage *store, attrib ** attribs, void *owner); extern void a_write(struct storage *store, const attrib * attribs, const void *owner); diff --git a/src/vortex.c b/src/vortex.c index ab391f012..1d558bb49 100644 --- a/src/vortex.c +++ b/src/vortex.c @@ -66,9 +66,10 @@ static void a_freedirection(attrib * a) free(d); } -static int a_agedirection(attrib * a) +static int a_agedirection(attrib * a, void *owner) { spec_direction *d = (spec_direction *)(a->data.v); + unused_arg(owner); --d->duration; return (d->duration > 0) ? AT_AGE_KEEP : AT_AGE_REMOVE; } @@ -78,7 +79,7 @@ static int a_readdirection(attrib * a, void *owner, struct storage *store) spec_direction *d = (spec_direction *)(a->data.v); char lbuf[32]; - (void)owner; + unused_arg(owner); READ_INT(store, &d->x); READ_INT(store, &d->y); READ_INT(store, &d->duration); @@ -95,7 +96,7 @@ a_writedirection(const attrib * a, const void *owner, struct storage *store) { spec_direction *d = (spec_direction *)(a->data.v); - (void)owner; + unused_arg(owner); WRITE_INT(store, d->x); WRITE_INT(store, d->y); WRITE_INT(store, d->duration); diff --git a/src/wormhole.c b/src/wormhole.c index 421201790..198983344 100644 --- a/src/wormhole.c +++ b/src/wormhole.c @@ -56,7 +56,7 @@ static int cmp_age(const void *v1, const void *v2) } typedef struct wormhole_data { - building *entry; + building *entry; // TODO: remove, use attribute-owner region *exit; } wormhole_data; @@ -70,13 +70,14 @@ static void wormhole_done(struct attrib *a) free(a->data.v); } -static int wormhole_age(struct attrib *a) +static int wormhole_age(struct attrib *a, void *owner) { wormhole_data *data = (wormhole_data *)a->data.v; int maxtransport = data->entry->size; region *r = data->entry->region; unit *u = r->units; + unused_arg(owner); for (; u != NULL && maxtransport != 0; u = u->next) { if (u->building == data->entry) { message *m = NULL;