Deutsches Simutransforum

Normale Version: Script-KI - Depots
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
(09-04-2020, Thursday-18:11:30 )Dwachs2 schrieb: [ -> ]Das Skript versucht einen neuen Convoi in dem Depot zu erstellen, wo ein anderer der Linie erstellt wurde. Da koennte man noch eine Suche nach einem Depot einbauen...

globale Funktion ( weil auch in *_connection verwendet )
Code:
/**
* search existing depot on range to station
*
*/
function search_depot(field_pos, wt) {
 
 local list_exists_depot = depot_x.get_depot_list(our_player, wt)
 // search range
 local seach_field = 10

 local tile_min = [field_pos.x - seach_field, field_pos.y - seach_field]
 local tile_max = [field_pos.x + seach_field, field_pos.y + seach_field]
 local depot_found = false

 foreach(key in list_exists_depot) {

   if ( key.x >= tile_min[0] && key.y >= tile_min[1] && key.x <= tile_max[0] && key.y <= tile_max[1] ) {
     depot_found = tile_x(key.x, key.y, key.z)
     break
   }
       
 }

 return depot_found

}

weis nicht genau, ob die Zeilennummern noch passen bei sqai/industry_manager.nut
Code:
--- a/ai/sqai/industry_manager.nut
+++ b/ai/sqai/industry_manager.nut
@ -300,7 +300,17 @@ class industry_manager_t extends manager_t
       // directly append
       // TODO put into report
       local proto = cnv_proto_t.from_convoy(cnv, lf)
-       local depot = cnv.get_home_depot()
+       local depot  = null //cnv.get_home_depot()      
+       local stations_list = cnv.get_schedule().entries
+       for (local i=0; i<stations_list.len(); i++) {
+    
+         local c = tile_x(stations_list[i].x, stations_list[i].y, stations_list[i].z)
+         local depot = search_depot(c, wt)
+         if ( depot ) {
+           break
+         }
+      
+       }

       local c = vehicle_constructor_t()

@@ -423,7 +423,19 @@ class industry_manager_t extends manager_t
   dbgprint("Upgrade line "  + line.get_name())
   // build the new one, withdraw the old ones
   // directly append
-   local depot  = cnv.get_home_depot()
+   local depot  = null //cnv.get_home_depot()      
+   local stations_list = cnv.get_schedule().entries
+   for (local i=0; i<stations_list.len(); i++) {
+
+     local c = tile_x(stations_list[i].x, stations_list[i].y, stations_list[i].z)
+     local depot = search_depot(c, wt)
+     if ( depot ) {
+       break
+     }
+      
+   }
Ich versuche gerade das Schiffsdepot zu verlegen.

Allerdings gibt tile_x.is_empty() bei Wasserfeldern false zurück.
zu is_empty: ja, das ist so. In shipconnector.nut ist in route_finder_water_depot::estimate_distance die entsprechende Abfrage drin: Wasser+nix drauf -> kann Depot bauen, sonst pruefen ob dort ein eigenes Depot steht.
ich hab folgendes

ship_connector.nut ab Zeile 178
Code:
...
local depot_tiles = []
local tile_range = 5
depot_tiles.append(tile_x(c_start[0].x-tile_range, c_start[0].y-tile_range, c_start[0].z))
depot_tiles.append(tile_x(c_start[0].x+tile_range, c_start[0].y-tile_range, c_start[0].z))
9560 depot_tiles.append(tile_x(c_start[0].x-tile_range, c_start[0].y+tile_range, c_start[0].z))
depot_tiles.append(tile_x(c_start[0].x+tile_range, c_start[0].y+tile_range, c_start[0].z))
for ( local i = 0; i < depot_tiles.len(); i++ ) {
gui.add_message_at(pl, "depot_tiles[i].is_water() " + coord_to_string(depot_tiles[i]) + " " + depot_tiles[i].is_water(), depot_tiles[i])
gui.add_message_at(pl, "depot_tiles[i].is_empty() " + coord_to_string(depot_tiles[i]) + " " + depot_tiles[i].is_empty(), depot_tiles[i])
...

die Ausgabe depot_tiles[i].is_water()  liefert true
die Ausgabe depot_tiles[i].is_empty() liefert false - selbst dann, wenn es eine freie Wasserkachel ist

Weis nicht ob es damit zu tun hat, das es flache Ufer sind, also nicht die Meereshöhe.

Simutrans r9560
is_empty ist fuer Wasser-felder immer falsch, egal wie leer die sind.
http://dwachs.github.io/simutrans-sqapi-...7c726da383

Ich fasse es so auf, das tile_x.remove_object (player_x pl, map_objects type) das Objekt vom Tile entfernt.

Scheinbar funktioniert das aber bei Wasserdepots nicht.

Code:
...
                home_depot = halt_cnv[0].get_home_depot()
...
                // check depot
                if ( check_home_depot(home_depot, wt) )  {
                    // todo check vehicles in depot
                    local tile = tile_x(home_depot.x, home_depot.y, home_depot.z)
                    switch (wt) {
                        case wt_rail:
                            tile.remove_object(our_player, mo_depot_rail)
                        break
                        case wt_road:
                     tile.remove_object(our_player, mo_depot_road)
                           break
                        case wt_water:
                    gui.add_message_at(our_player, "####### depot: " + home_depot, home_depot)
                            tile.remove_object(our_player, mo_depot_water)
                        break
                    }
                }
...

Laut Objektliste solle es mo_depot_water heisen.

Die Funktion meldet dann aber

Zitat:####### depot remove: Requested object not found.

Code:
                            local err = tile.remove_object(our_player, mo_depot_water)
                            gui.add_message_at(our_player, "####### depot remove: " + err, home_depot)
Also die Warnung die da bei der Beschreibung dazu steht ist wenig hilfreich.

Zitat:Does not work with all object types.
Smile

Zum Entfernen der Depots immer mo_depot_rail uebergeben (die verschiedenen Typen werden intern nicht unterschieden). Kann ich noch aendern. Nicht entfernbar sind damit Wege (ausser Bruecken/Tunnel), Leitungen, Fahrzeuge (ausser Stadtautos, Fussgaenger), ground/moving objects.
Wäre es da nicht besser einfach nur mo_depot zu benutzen?
Ja, das stimmt natuerlich. Habe damals einfach die C++-Klassenstruktur in squirrel nachgebaut. Bei Depots gibts fuer jeden Wegtyp in C++ eine eigene Klasse. Daher die vielen mo_depot_*-Typen. Das geht bestimmt zu vereinfachen.
Seiten: 1 2