- Schiffe treiben nicht ab. Routine vereinfacht, und evtl. den Bug gefunden
This commit is contained in:
Enno Rehling 2004-05-31 13:52:59 +00:00
parent 7d2ea7b398
commit 95a8068635
1 changed files with 34 additions and 58 deletions

View File

@ -558,16 +558,18 @@ static void
drifting_ships(region * r) drifting_ships(region * r)
{ {
direction_t d; direction_t d;
ship *sh, *sh2;
unit *captain;
if (rterrain(r) == T_OCEAN) { if (rterrain(r) == T_OCEAN) {
for (sh = r->ships; sh;) { ship** shp = &r->ships;
sh2 = sh->next; while (*shp) {
ship * sh = *shp;
region * rnext = NULL;
unit * captain;
int d_offset;
/* Schiff schon abgetrieben oder durch Zauber geschützt? */ /* Schiff schon abgetrieben oder durch Zauber geschützt? */
if (fval(sh, SF_DRIFTED) || is_cursed(sh->attribs, C_SHIP_NODRIFT, 0)) { if (fval(sh, SF_DRIFTED) || is_cursed(sh->attribs, C_SHIP_NODRIFT, 0)) {
sh = sh2; shp = &sh->next;
continue; continue;
} }
@ -581,77 +583,51 @@ drifting_ships(region * r)
assert(sh->type->construction->improvement==NULL); /* sonst ist construction::size nicht ship_type::maxsize */ assert(sh->type->construction->improvement==NULL); /* sonst ist construction::size nicht ship_type::maxsize */
if (captain && sh->size==sh->type->construction->maxsize && enoughsailors(r, sh) && cansail(r, sh)) { if (captain && sh->size==sh->type->construction->maxsize && enoughsailors(r, sh) && cansail(r, sh)) {
sh = sh2; shp = &sh->next;
continue; continue;
} }
/* Leuchtturm: Ok. */ /* Leuchtturm: Ok. */
if (check_leuchtturm(r, NULL)) { if (check_leuchtturm(r, NULL)) {
sh = sh2; shp = &sh->next;
continue; continue;
} }
/* Auswahl einer Richtung: Zuerst auf Land, dann /* Auswahl einer Richtung: Zuerst auf Land, dann
* zufällig. Falls unmögliches Resultat: vergiß es. */ * zufällig. Falls unmögliches Resultat: vergiß es. */
d_offset = rand() % MAXDIRECTIONS;
for (d = 0; d != MAXDIRECTIONS; d++) for (d = 0; d != MAXDIRECTIONS; ++d) {
if (rconnect(r, d) && rterrain(rconnect(r, d)) != T_OCEAN) region * rn = rconnect(r, (direction_t)((d + d_offset) % MAXDIRECTIONS));
break; terrain_t t = rterrain(rn);
if (rn!=NULL && (terrain[t].flags & SAIL_INTO)) {
if (d == MAXDIRECTIONS) rnext = rn;
d = (direction_t)(rand() % MAXDIRECTIONS); if (t!=T_OCEAN) break;
if (!rconnect(r, d)) {
sh = sh2;
continue;
}
{
region * r2 = rconnect(r, d);
int c = 0;
while (sh->type->coast[c]!=NOTERRAIN) {
if (rterrain(r2) == sh->type->coast[c]) break;
++c;
}
if (sh->type->coast[c]==NOTERRAIN) {
sh = sh2;
continue;
} }
} }
if(!(terrain[rterrain(rconnect(r, d))].flags & SAIL_INTO)) {
sh = sh2; if (rnext==NULL) {
shp = &sh->next;
continue; continue;
} }
/* Das Schiff und alle Einheiten darin werden nun von r /* Das Schiff und alle Einheiten darin werden nun von r
* nach rconnect(r, d) verschoben. Danach eine Meldung. */ * nach rnext verschoben. Danach eine Meldung. */
if (fval(sh, SF_DRIFTED)) { sh = move_ship(sh, r, rnext, NULL);
region_list * route = NULL;
region * to = rconnect(r, d); if (sh!=NULL) {
/* wenn schon einmal abgetrieben, dann durchreise eintragen */ fset(sh, SF_DRIFTED);
add_regionlist(&route, r);
add_regionlist(&route, to); if (rterrain(rnext) != T_OCEAN) {
sh = move_ship(sh, r, to, route); sh->coast = dir_invert(d);
free_regionlist(route); }
} else sh = move_ship(sh, r, rconnect(r, d), NULL); damage_ship(sh, 0.02);
if (!sh) {
sh = sh2; if (sh->damage>=sh->size * DAMAGE_SCALE) {
continue; destroy_ship(sh, rnext);
}
} }
fset(sh, SF_DRIFTED); if (*shp != sh) shp = &sh->next;
if (rterrain(rconnect(r, d)) != T_OCEAN) {
/* Alle Attribute
* sicherheitshalber loeschen und
* gegebenenfalls neu setzen. */
sh->coast = dir_invert(d);
}
damage_ship(sh, 0.02);
if (sh->damage>=sh->size * DAMAGE_SCALE)
destroy_ship(sh, rconnect(r, d));
sh = sh2;
} }
} }
} }