Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Script-KI - Hafen auf flachem Ufer
#1
ship_connector.nut
Code:
   if (tile.get_slope()) {
     local slope = dir.to_slope(coord_to_dir(dif))
     // terraform ??
     if (tile.get_slope() != slope  &&  tile.get_slope() != 2*slope) {
       err = command_x.set_slope(our_player, tile, slope )
       if (err) {
         return err;
       }
     }
     err = command_x.build_station(our_player, tile, planned_station)
     if (err) gui.add_message_at(our_player, "Failed to harbour at " + coord_to_string(tile) +"\n" + err, tile)

     local size = planned_station.get_size(0)
     len = size.x*size.y
   }
   else {
     err = command_x.build_station(our_player, tile, planned_harbour_flat)
     if (err) gui.add_message_at(our_player, "Failed to flat harbour at " + coord_to_string(tile) +"\n" + err, tile)

     local size = planned_harbour_flat.get_size(0)
     len = size.x*size.y
   }

Da im ersten if keine Auswertung der Slopezahl stattfindet, wird nie der else-Zweig für flache Häfen aufgerufen.

Die folgende Änderung sollte das Problem beheben.

Code:
--- "a/ai/sqai/ship_connector.nut"
+++ "b/ai/sqai/ship_connector.nut"
@@ -269,7 +269,7 @@ class ship_connector_t extends manager_t
   local dif = { x=tile.x-water.x, y=tile.y-water.y}
   print("Place harbour at " + coord3d_to_string(tile) + " to access " + coord3d_to_string(water) )

-   if (tile.get_slope()) {
+   if (tile.get_slope() > 0) {

     local slope = dir.to_slope(coord_to_dir(dif))
     // terraform ??

Wobei ein Test auf flache Häfen noch angebracht ist, um doch ins if zu gehen und dort dann eine Aufschüttung zu machen und einen normalen Hafen bauen.
Wobei der Code zum Aufschütten nicht zu funktionieren scheint.


Angehängte Dateien
.txt   sqai_flat_harbour_fix.patch.txt (Größe: 519 Bytes / Downloads: 9)
Script-KI für Simutrans r9112+
Zitieren
#2
Flach wäre Null. Null ist False. Warum also sollte bei "If (False)" nicht das Else aufgerufen werden?
Zitieren
#3
(20-04-2020, Monday-09:54:20 )Leartin schrieb: Flach wäre Null. Null ist False. Warum also sollte bei "If (False)" nicht das Else aufgerufen werden?

flach = 0

0 ist aber nicht unbedingt null

Aber da Du es ja scheinbar so genau weist, kannst Du bestimmt auch sagen warum an flachen Ufern keine Häfen gebaut werden.
Script-KI für Simutrans r9112+
Zitieren
#4
Zitat:Squirrel has a boolean type(bool) however like C++ it considers null, 0(integer) and 0.0(float) as false, any other value is considered true.

Aber vielleicht gilt das ja nicht. Steht schließlich nicht im Wiki Angel
Zitieren
#5
(20-04-2020, Monday-11:39:35 )Leartin schrieb:
Zitat:Squirrel has a boolean type(bool) however like C++ it considers null, 0(integer) and 0.0(float) as false, any other value is considered true.

Aber vielleicht gilt das ja nicht. Steht schließlich nicht im Wiki  Angel

im deutschem nicht

Aber Entschuldigung das ich versucht habe zu helfen.
Script-KI für Simutrans r9112+
Zitieren
#6
Dafür brauchst dich doch nicht entschuldigen, ist doch super. Und jetzt, wo du weißt, dass es eigentlich nicht daran liegen kann, findest vielleicht das tatsächliche Problem. Win-Win?
Zitieren
#7
Danke, muss ich mir anschauen. In welchem pakset gibts solche Haefen die auf eine flache Kachel gebaut werden koennen?
Zitieren
#8
(20-04-2020, Monday-12:58:17 )Dwachs2 schrieb: Danke, muss ich mir anschauen. In welchem pakset gibts solche Haefen die auf eine flache Kachel gebaut werden koennen?

pak64.german ab Version 0.120.4.1.1, glaube pak128 auch

Wenn beide Industrien am Wasser liegen dann werden Docks gebaut.
Wenn es keine Docks im Set gibt, dann wird nichts gebaut, weil die Verzweigung das nicht berücksichtigt. Flaches Feld geht es in die Docks und da wird dann nichts gefunden.

Wenn es in die Kombination geht, dann geht es auch nicht. Da fehlt der Code dazu noch komplett.

Das testen dauert halt immer eine ganze Weile, weil erst mal eine passende Karte generieren. Und dann warten bis die KI sich die Verbindung raus sucht.
Treten Fehler auf oder ändert man was, wieder Karte neu laden und warten.
Script-KI für Simutrans r9112+
Zitieren
#9
Die Slope-Prüfung in combined_connections Funktion process_node verhindert Häfen auf flachen Ufern. Beides auskommentiert und es geht.

Zitat:else if (from_water) {
  // water -> land
  if (!from.is_water()  ||  !to.is_empty()  ||  dir.to_slope(d) != to.get_slope()
    ||  !finder.check_harbour_place(from, planned_harbour_len, dir.backward(d)))

Zitat:else {
// land -> water
  if (!to.is_water()  ||  !from.is_empty()  ||  dir.to_slope(dir.backward(d)) != from.get_slope()
    ||  (cnode.flag & 0x60)
    ||  !finder.check_harbour_place(to, planned_harbour_len, d))

Da Eckfelder keine klare Richtung für den automatischen Bau haben muss das Dock mit einer Orientierung gebaut werden.
Script-KI für Simutrans r9112+
Zitieren
#10
Kann es sein, das es keine Error-Rückgabe gibt, wenn ein Dock auf einem Eckfeld nicht gebaut werden kann?
Script-KI für Simutrans r9112+
Zitieren


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste