From c3b66dbe24dd6554a122891d2739b520d6cdebb4 Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Mon, 31 May 2004 11:50:32 +0000 Subject: [PATCH] =?UTF-8?q?Wichtiger=20bugfix:=20borders.=20Das=20ganze=20?= =?UTF-8?q?ist=20zu=20konfus,=20die=20hash-struktur=20h=C3=A4tte=20nicht?= =?UTF-8?q?=20in=20den=20border-structs=20mit=20drin=20sein=20sollen,=20ab?= =?UTF-8?q?er=20das=20kind=20ist=20in=20den=20Brunnen=20gefallen,=20und=20?= =?UTF-8?q?heute=20fixe=20ich=20das=20nicht.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/items/questkeys.c | 11 +--- src/common/kernel/border.c | 93 ++++++++++++++++------------- src/common/kernel/border.h | 7 ++- src/common/kernel/save.c | 2 +- src/eressea/korrektur.c | 111 ++++++++++++++++++----------------- src/eressea/lua/unit.cpp | 1 + 6 files changed, 120 insertions(+), 105 deletions(-) diff --git a/src/common/items/questkeys.c b/src/common/items/questkeys.c index 1f3727aab..63c0c6c80 100644 --- a/src/common/items/questkeys.c +++ b/src/common/items/questkeys.c @@ -51,18 +51,13 @@ use_questkey(struct unit * u, const struct item_type * itype, int amount, const r1 = findregion(43,-39); r2 = findregion(44,-39); - key1 = region_hashkey(r1); - key2 = region_hashkey(r2); + bo = get_borders(r1, r2); - key = min(key2, key1) % BMAXHASH; - - bo = borders[key]; - - while (bo && !((bo->from==r1 && bo->to==r2) || (bo->from==r2 && bo->to==r1))) { + while (bo!=NULL) { if(bo->type == &bt_questportal) { break; } - bo = bo->nexthash; + bo = bo->next; } assert(bo != NULL); diff --git a/src/common/kernel/border.c b/src/common/kernel/border.c index 63672c3d0..e33f078fd 100644 --- a/src/common/kernel/border.c +++ b/src/common/kernel/border.c @@ -42,14 +42,17 @@ free_borders(void) border * find_border(unsigned int id) { - int key; - for (key=0;key!=BMAXHASH;key++) { - border * b; - for (b=borders[key];b;b=b->next) { - if (b->id==id) return b; - } - } - return NULL; + int key; + for (key=0;key!=BMAXHASH;key++) { + border * bhash; + for (bhash=borders[key];bhash!=NULL;bhash=bhash->nexthash) { + border * b; + for (b=bhash;b;b=b->next) { + if (b->id==id) return b; + } + } + } + return NULL; } void * @@ -195,33 +198,39 @@ attrib_type at_countdown = { void age_borders(void) { - int i; + border_list * deleted = NULL; + int i; - for (i=0;i!=BMAXHASH;++i) { - border ** bp = &borders[i]; - while (*bp) { - border * b = *bp; - attrib ** ap = &b->attribs; - while (*ap) { - attrib * a = *ap; - if (a->type->age && a->type->age(a)==0) { - if (a->type == &at_countdown) { - erase_border(b); - b = NULL; - /* bp bleibt, wie es ist, da der - * nächste border nun hier drin steht. */ - break; - } - a_remove(ap, a); - } - else ap=&a->next; - } - if (b!=NULL) { - /* bei löschung zeigt bp bereits auf den nächsten */ - bp=&b->nexthash; + for (i=0;i!=BMAXHASH;++i) { + border * bhash = borders[i]; + for (;bhash;bhash=bhash->nexthash) { + border * b = bhash; + for (;b;b=b->next) { + attrib ** ap = &b->attribs; + while (*ap) { + attrib * a = *ap; + if (a->type->age && a->type->age(a)==0) { + if (a->type == &at_countdown) { + border_list * bnew = malloc(sizeof(border_list)); + bnew->next = deleted; + bnew->data = b; + deleted = bnew; + break; + } + a_remove(ap, a); + } + else ap=&a->next; + } } - } - } + } + } + while (deleted) { + border_list * blist = deleted; + border * b = blist->data; + erase_border(b); + deleted = blist->next; + free(deleted); + } } /******** @@ -464,16 +473,18 @@ write_borders(FILE * f) { int i; for (i=0;i!=BMAXHASH;++i) { - border * b; - for (b=borders[i];b;b=b->nexthash) { - if (b->type->valid && !b->type->valid(b)) continue; - fprintf(f, "%s %d %d %d %d %d ", b->type->__name, b->id, b->from->x, b->from->y, b->to->x, b->to->y); - if (b->type->write) b->type->write(b, f); - putc('\n', f); + border * bhash; + for (bhash=borders[i];bhash;bhash=bhash->nexthash) { + border * b; + for (b=bhash;b!=NULL;b=b->next) { + if (b->type->valid && !b->type->valid(b)) continue; + fprintf(f, "%s %d %d %d %d %d ", b->type->__name, b->id, b->from->x, b->from->y, b->to->x, b->to->y); + if (b->type->write) b->type->write(b, f); #if RELEASE_VERSION>BORDER_VERSION - a_write(f, b->attribs); - putc('\n', f); + a_write(f, b->attribs); #endif + putc('\n', f); + } } } fputs("end", f); diff --git a/src/common/kernel/border.h b/src/common/kernel/border.h index 0d4b3c5b2..4a7d30293 100644 --- a/src/common/kernel/border.h +++ b/src/common/kernel/border.h @@ -25,13 +25,18 @@ extern "C" { typedef struct border { struct border_type * type; /* the type of this border */ struct border * next; /* next border between these regions */ - struct border * nexthash; /* for internal use only */ + struct border * nexthash; /* next border between these regions */ struct region * from, * to; /* borders can be directed edges */ attrib * attribs; void * data; unsigned int id; /* unique id */ } border; + typedef struct border_list { + struct border_list * next; + struct border * data; + } border_list; + typedef struct border_type { const char* __name; /* internal use only */ boolean (*transparent)(const border *, const struct faction *); diff --git a/src/common/kernel/save.c b/src/common/kernel/save.c index 715d5c534..42d2e1c68 100644 --- a/src/common/kernel/save.c +++ b/src/common/kernel/save.c @@ -199,7 +199,7 @@ convertunique(faction * f) strcat(strcpy(zText, basepath()), "/subscriptions"); F = fopen(zText, "r"); if (F==NULL) { - log_error(("could not open %s.\n", zText)); + log_warning(("could not open %s.\n", zText)); abort(); } for (;;) { diff --git a/src/eressea/korrektur.c b/src/eressea/korrektur.c index d250b6830..5a57da864 100644 --- a/src/eressea/korrektur.c +++ b/src/eressea/korrektur.c @@ -477,32 +477,32 @@ fix_demand_region(region *r) static void fix_firewalls(void) { - region * r = regions; - while (r) { - direction_t d; - for (d=0;d!=MAXDIRECTIONS;++d) { - region * r2 = rconnect(r, d); - if (r2) { - border * b = get_borders(r, r2); - while (b) { - if (b->type==&bt_firewall) { - attrib * a = a_find(b->attribs, &at_countdown); - if (a==NULL || a->data.i <= 0) { - erase_border(b); - log_warning(("firewall between regions %s and %s was bugged. removed.\n", - regionid(r), regionid(r2))); - b = get_borders(r, r2); - } else { - b = b->next; - } - } else { - b = b->next; - } - } - } - } - r = r->next; - } + region * r = regions; + while (r) { + direction_t d; + for (d=0;d!=MAXDIRECTIONS;++d) { + region * r2 = rconnect(r, d); + if (r2) { + border * b = get_borders(r, r2); + while (b) { + if (b->type==&bt_firewall) { + attrib * a = a_find(b->attribs, &at_countdown); + if (a==NULL || a->data.i <= 0) { + erase_border(b); + log_warning(("firewall between regions %s and %s was bugged. removed.\n", + regionid(r), regionid(r2))); + b = get_borders(r, r2); + } else { + b = b->next; + } + } else { + b = b->next; + } + } + } + } + r = r->next; + } } extern attrib * make_atgmcreate(const struct item_type * itype); @@ -1021,39 +1021,42 @@ extern border *borders[]; static void fix_road_borders(void) { - border *delete[10000]; - int hash; - int i = 0; + border *deleted[10000]; + int hash; + int i = 0; - for(hash=0; hashnext) { - if(b->type == &bt_road) { - int x1, x2, y1, y2; - region *r1, *r2; + for(hash=0; hashnexthash) { + border * b; + for (b=bhash;b;b=b->next) { + if (b->type == &bt_road) { + int x1, x2, y1, y2; + region *r1, *r2; - x1 = b->from->x; - y1 = b->from->y; - x2 = b->to->x; - y2 = b->to->y; + x1 = b->from->x; + y1 = b->from->y; + x2 = b->to->x; + y2 = b->to->y; - r1 = findregion(x1, y1); - r2 = findregion(x2, y2); + r1 = findregion(x1, y1); + r2 = findregion(x2, y2); - if(r1->land == NULL || r2->land == NULL - || terrain[r1->terrain].roadreq == 0 - || terrain[r2->terrain].roadreq == 0) { - delete[i] = b; - i++; - } - } - } - } + if (r1->land == NULL || r2->land == NULL + || terrain[r1->terrain].roadreq == 0 + || terrain[r2->terrain].roadreq == 0) + { + deleted[i++] = b; + } + } + } + } + } - while(i>0) { - i--; - erase_border(delete[i]); - } + while (i>0) { + i--; + erase_border(deleted[i]); + } } #ifdef WDW_PHOENIX diff --git a/src/eressea/lua/unit.cpp b/src/eressea/lua/unit.cpp index 67933fb4c..93a37a97d 100644 --- a/src/eressea/lua/unit.cpp +++ b/src/eressea/lua/unit.cpp @@ -271,6 +271,7 @@ static void unit_addorder(unit& u, const char * str) { addstrlist(&u.orders, str); + u.faction->lastorders = turn; } static void