bugfix reorder, fehlende FL_OWNER

This commit is contained in:
Enno Rehling 2001-02-11 10:06:07 +00:00
parent 0047482a8e
commit ccc2a39eee
3 changed files with 73 additions and 7 deletions

View File

@ -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);
}
}

View File

@ -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;

View File

@ -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.