Beiträge: 1.191
Themen: 126
Registriert seit: Sep 2019
Bewertung:
10
21-04-2020, Tuesday-23:08:35
(Dieser Beitrag wurde zuletzt bearbeitet: 22-04-2020, Wednesday-00:25:56 von Andarix.)
(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
+ }
+
+ }
Beiträge: 1.191
Themen: 126
Registriert seit: Sep 2019
Bewertung:
10
16-01-2021, Saturday-00:28:19
Ich versuche gerade das Schiffsdepot zu verlegen.
Allerdings gibt tile_x.is_empty() bei Wasserfeldern false zurück.
Beiträge: 543
Themen: 5
Registriert seit: Aug 2015
Bewertung:
19
16-01-2021, Saturday-13:32:47
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.
Beiträge: 1.191
Themen: 126
Registriert seit: Sep 2019
Bewertung:
10
16-01-2021, Saturday-15:12:48
(Dieser Beitrag wurde zuletzt bearbeitet: 16-01-2021, Saturday-15:13:01 von Andarix.)
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
Beiträge: 543
Themen: 5
Registriert seit: Aug 2015
Bewertung:
19
16-01-2021, Saturday-15:25:15
is_empty ist fuer Wasser-felder immer falsch, egal wie leer die sind.
Beiträge: 1.191
Themen: 126
Registriert seit: Sep 2019
Bewertung:
10
09-07-2021, Friday-21:25:19
(Dieser Beitrag wurde zuletzt bearbeitet: 09-07-2021, Friday-21:38:46 von Andarix.)
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)
Beiträge: 1.191
Themen: 126
Registriert seit: Sep 2019
Bewertung:
10
10-07-2021, Saturday-13:59:48
Also die Warnung die da bei der Beschreibung dazu steht ist wenig hilfreich.
Zitat:Does not work with all object types.
Beiträge: 543
Themen: 5
Registriert seit: Aug 2015
Bewertung:
19
12-07-2021, Monday-09:37:44
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.
Beiträge: 1.191
Themen: 126
Registriert seit: Sep 2019
Bewertung:
10
12-07-2021, Monday-11:05:38
Wäre es da nicht besser einfach nur mo_depot zu benutzen?
Beiträge: 543
Themen: 5
Registriert seit: Aug 2015
Bewertung:
19
12-07-2021, Monday-16:35:41
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.
|