From ccc2a39eeef3d03ca6e0a7f44db52a48825397ba Mon Sep 17 00:00:00 2001 From: Enno Rehling Date: Sun, 11 Feb 2001 10:06:07 +0000 Subject: [PATCH] bugfix reorder, fehlende FL_OWNER --- src/common/gamecode/laws.c | 63 ++++++++++++++++++++++++++++++++++++-- src/common/kernel/save.c | 4 +-- src/doc/coding.txt | 13 ++++++-- 3 files changed, 73 insertions(+), 7 deletions(-) diff --git a/src/common/gamecode/laws.c b/src/common/gamecode/laws.c index 7750da3dd..97c068bff 100644 --- a/src/common/gamecode/laws.c +++ b/src/common/gamecode/laws.c @@ -1,6 +1,6 @@ /* vi: set ts=2: * - * $Id: laws.c,v 1.11 2001/02/10 22:02:10 enno Exp $ + * $Id: laws.c,v 1.12 2001/02/11 10:06:07 enno Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -2110,6 +2110,63 @@ resolve_ship(void * id) { return findship((int)id); } +static void +reorder_owners(region * r) +{ + unit ** up=&r->units; + building * b=NULL; + ship * sh=NULL; + while (*up) { + unit * u = *up; + if (u->building!=b) { + /* if this is a new building */ + b = u->building; + if (b && !fval(u, FL_OWNER)) { + /* if the first unit is not the owner, find the real one */ + unit ** uo = &u->next; + while (*uo && (!fval((*uo), FL_OWNER) || (*uo)->building!=b)) { + uo=&(*uo)->next; + } + + if (*uo && (*uo)->building==b) { + /* if successful, move *uo to the top */ + *up = *uo; + *uo = (*uo)->next; + (*up)->next = u; + } + else { + fprintf(stderr, "WARNING: Gebäude %s hatte keinen Besitzer. Setze %s\n", buildingname(b), unitname(u)); + fset(u, FL_OWNER); + } + } + } + if (u->ship!=sh) { + /* if this is a new ship */ + sh = u->ship; + if (sh && !fval(u, FL_OWNER)) { + /* if the first unit is not the owner, find the real one */ + unit ** uo = &u->next; + while (*uo && (!fval((*uo), FL_OWNER) || (*uo)->ship!=sh)) { + uo=&(*uo)->next; + } + + if (*uo && (*uo)->ship==sh) { + /* if successful, move *uo to the top */ + *up = *uo; + *uo = (*uo)->next; + (*up)->next = u; + } + else { + fprintf(stderr, "WARNING: Das Schiff %s hatte keinen Besitzer. Setze %s\n", shipname(sh), unitname(u)); + fset(u, FL_OWNER); + } + } + } + up = &u->next; + } +} + +#if 0 static void reorder_owners(region * r) { @@ -2159,6 +2216,7 @@ reorder_owners(region * r) } *ui = NULL; } +#endif static attrib_type at_number = { "faction_renum", @@ -2238,7 +2296,6 @@ reorder(void) for (r=regions;r;r=r->next) { unit * u, ** up=&r->units; boolean sorted=false; - for (u=r->units;u;u=u->next) freset(u, FL_DH); while (*up) { u = *up; if (!fval(u, FL_MARK)) { @@ -2285,7 +2342,7 @@ reorder(void) } if (u==*up) up=&u->next; } - if (sorted) for (u=r->units;u;u=u->next) freset(u, FL_OWNER); + if (sorted) for (u=r->units;u;u=u->next) freset(u, FL_MARK); } } diff --git a/src/common/kernel/save.c b/src/common/kernel/save.c index 51a3c6f3d..d3c8c979d 100644 --- a/src/common/kernel/save.c +++ b/src/common/kernel/save.c @@ -1,6 +1,6 @@ /* vi: set ts=2: * - * $Id: save.c,v 1.15 2001/02/10 19:24:05 enno Exp $ + * $Id: save.c,v 1.16 2001/02/11 10:06:07 enno Exp $ * Eressea PB(E)M host Copyright (C) 1998-2000 * Christian Schlittchen (corwin@amber.kn-bremen.de) * Katja Zedel (katze@felidae.kn-bremen.de) @@ -455,7 +455,7 @@ readfaction(void) * muß in "Gänsefüßchen" stehen!! */ /* War vorher in main.c:getgarbage() */ - if (!quiet) { printf(" %s;", factionid(f)); fflush(stdout); } + if (!quiet) { printf(" %.4s;", factionid(f)); fflush(stdout); } freestrlist(f->mistakes); f->mistakes = 0; diff --git a/src/doc/coding.txt b/src/doc/coding.txt index db128aace..95952bc96 100644 --- a/src/doc/coding.txt +++ b/src/doc/coding.txt @@ -69,13 +69,22 @@ mit arbeit zu tun hat, keine boolean-variable die sagt ob man auf der arbeit ist. - faction::units -Die Variable funktioniert und kann benutzt werden. folgendes: +Die Variable funktioniert und kann benutzt werden. folgendes: for (r=regions;r;r=r->next) for (u=r->units;u;u=u->next) if (u->faction==f) {} schreibt sich viel einfacher so: for (u=f->units;u;u=u->nextF) {} -und ja, es wird garantiert, das das funktioiniert, und regionsreihenfolge einhalten tut es auch. weshalb wahlloses erzeugen von einheiten per calloc und ohne createunit() aufruf schon seit längerem ein NoNo ist. +und ja, es wird garantiert, das das funktioiniert, und regionsreihenfolge +einhalten tut es auch. weshalb wahlloses erzeugen von einheiten per calloc und +ohne createunit() aufruf schon seit längerem ein NoNo ist. - buffer length Namen von attributen, hashcodes für items, usw. sollten kurz sein. schliesslich landen sie im Datenfile. Eine Funktion, die sie einlädt, sollte mit 32 byte speicherbedarf rechnen. + +- FL_MARK und FL_DH: +Der unterschied zwischen diesen beiden Flags ist: +FL_DH sollte man vor der Benutzung auf einen Wert setzen, den man coraussetzt +(man kriegt keinen wert garanteirt). +FL_MARK ist immer 0. jede routine die es setzt, muss es am ende wieder auf 0 +zurücksetzen. code-beispiel ist z.b. die SORTIERE-funktion.