Beiträge: 1.191
Themen: 126
Registriert seit: Sep 2019
Bewertung:
10
28-05-2020, Thursday-21:42:00
Die folgende Zeile führt dazu, das sich Simutrans Kommentarlos beendet.
Code: local way_obj = tile_x(start_field.x, start_field.y, start_field.z).find_object(mo_way)
Beiträge: 7.536
Themen: 249
Registriert seit: Apr 2013
Bewertung:
27
30-05-2020, Saturday-15:49:27
Gibt es das tile denn wirklich?
Beiträge: 1.191
Themen: 126
Registriert seit: Sep 2019
Bewertung:
10
30-05-2020, Saturday-17:47:26
(Dieser Beitrag wurde zuletzt bearbeitet: 30-05-2020, Saturday-17:51:17 von Andarix.)
Ja das Tile gibt es und es ist auch ein Gleis drauf.
Es ist direkt angegeben zum testen des Baus einer Ausweichstelle. Der Bau funktioniert auch.
Allerdings nutze ich aktuell das erste gefundene Gleis. Ich möchte aber das Gleis verwenden, was bereits gebaut ist.
Unter Umständen hängt es mit den Spielern zusammen. Das Script läuft ja für alle Script-KIs. Das Gleis/Feld gehört aber nur einem Spieler.
Ich hab aber noch nicht gefunden, wie man den Besitzer des Feldes abrufen kann.
Ich kann es noch nicht ins Git einstellen, da das Feld für genau diese Karte vorgegeben ist. Der Code also noch nicht fertig ist für das ermitteln des Startfeldes für die Ausweichstelle. Ich weis auch noch nicht, wie ich das auf eben den Streckenbesitzer einschränke. Aktuell würde jeder aktive Script-KI-Spieler den Bauvorgang auslösen. Das führt dann zu unvollständigen Bau der Ausweichstelle, weil ja die Gleise nicht verbunden werden von verschiedenen Spielern.
Die Funktion selber sieht so aus. Die rote Zeile ist der beabsichtigte Aufruf.
Zitat:function build_double_track(start_field, wt) {
gui.add_message_at(our_player, " build_double_track " + coord3d_to_string(start_field), start_field)
local d = start_field.get_way_dirs(wt)
local tiles = []
local tiles_build_l = []
local tiles_build_r = []
local t = 0
local way_len = 8
local signal = []
// check way - 8 fields straight
for ( local i = 0; i < way_len; i++ ) {
if ( d == 5 ) {
// ns
if ( tile_x(start_field.x + 1, start_field.y + i, start_field.z).is_empty() && square_x(start_field.x, start_field.y + i).get_ground_tile().z == start_field.z ) {
tiles_build_r.append(tile_x(start_field.x + 1, start_field.y + i, start_field.z))
}
if ( tile_x(start_field.x - 1, start_field.y + i, start_field.z).is_empty() && square_x(start_field.x, start_field.y + i).get_ground_tile().z == start_field.z ) {
tiles_build_l.append(tile_x(start_field.x - 1, start_field.y + i, start_field.z))
}
tiles.append(tile_x(start_field.x + i, start_field.y, start_field.z))
} else if ( d == 10 ) {
// ew
//gui.add_message_at(our_player, "tile r " + coord3d_to_string(tile_x(start_field.x + i, start_field.y + 1, start_field.z)) + " empty " + tile_x(start_field.x + i, start_field.y + 1, start_field.z).is_empty(), start_field)
//gui.add_message_at(our_player, " -- tile l " + coord3d_to_string(tile_x(start_field.x + i, start_field.y - 1, start_field.z)) + " to empty " + tile_x(start_field.x - i, start_field.y + 1, start_field.z).is_empty(), start_field)
if ( tile_x(start_field.x + i, start_field.y + 1, start_field.z).is_empty() && square_x(start_field.x + i, start_field.y).get_ground_tile().z == start_field.z ) {
tiles_build_r.append(tile_x(start_field.x + i, start_field.y + 1, start_field.z))
}
if ( tile_x(start_field.x + i, start_field.y - 1, start_field.z).is_empty() && square_x(start_field.x + i, start_field.y).get_ground_tile().z == start_field.z ) {
tiles_build_l.append(tile_x(start_field.x + i, start_field.y - 1, start_field.z))
}
tiles.append(tile_x(start_field.x + i, start_field.y, start_field.z))
}
}
//gui.add_message_at(our_player, " tiles_build_r " + tiles_build_r.len(), start_field)
//gui.add_message_at(our_player, " tiles_build_l " + tiles_build_l.len(), start_field)
// 8 field free
local tl = 0
local tr = 0
if ( tiles_build_r.len() == 8 || tiles_build_l.len == 8 ) {
if ( tiles_build_r.len() == 8 ) {
for ( local i = 0; i < way_len; i++ ) {
if ( tiles_build_r[i].get_slope() == 0 ) {
tr++
}
}
}
if ( tiles_build_l.len() == 8 ) {
for ( local i = 0; i < way_len; i++ ) {
if ( tiles_build_l[i].get_slope() == 0 ) {
tl++
}
}
}
//gui.add_message_at(our_player, " tiles r get_slope() = 0 " + tr, start_field)
//gui.add_message_at(our_player, " tiles l get_slope() = 0 " + tl, start_field)
local tiles_build = null
if ( tr == 8 ) {
tiles_build = tiles_build_r
if ( settings.get_drive_on_left() ) {
signal = [{coor=coord3d(tiles_build[6].x, tiles_build[6].y, tiles_build[6].z), ribi=8}, {coor=coord3d(tiles[1].x, tiles[1].y, tiles[1].z), ribi=2}]
} else {
signal = [{coor=coord3d(tiles[1].x, tiles[1].y, tiles[1].z), ribi=8}, {coor=coord3d(tiles_build[6].x, tiles_build[6].y, tiles_build[6].z), ribi=2}]
}
} else if ( tl == 8 ) {
tiles_build = tiles_build_l
if ( settings.get_drive_on_left() ) {
signal = [{coor=coord3d(tiles_build[6].x, tiles_build[6].y, tiles_build[6].z), ribi=4}, {coor=coord3d(tiles[1].x, tiles[1].y, tiles[1].z), ribi=1}]
} else {
signal = [{coor=coord3d(tiles[1].x, tiles[1].y, tiles[1].z), ribi=4}, {coor=coord3d(tiles_build[6].x, tiles_build[6].y, tiles_build[6].z), ribi=1}]
}
} else {
tiles_build = tiles_build_r
if ( settings.get_drive_on_left() ) {
signal = [{coor=coord3d(tiles_build[6].x, tiles_build[6].y, tiles_build[6].z), ribi=8}, {coor=coord3d(tiles[1].x, tiles[1].y, tiles[1].z), ribi=2}]
} else {
signal = [{coor=coord3d(tiles[1].x,tiles[1].y,tiles[1].z), ribi=8}, {coor=coord3d(tiles_build[6].x, tiles_build[6].y, tiles_build[6].z), ribi=2}]
}
// check terrafom
for ( local i = 0; i < way_len; i++ ) {
local r = square_x(tiles_build[i].x, tiles_build[i].y)
local z = r.get_ground_tile()
local f = tile_x(tiles_build[i].x, tiles_build[i].y, z.z)
local ref_hight = start_field.z
if ( f.is_empty() && ( f.get_slope() > 0 || ref_hight != z.z ) ) {
if ( print_message_box == 2 ) {
gui.add_message_at(pl, " ---=> terraform", world.get_time())
gui.add_message_at(pl, " ---=> tile z " + z.z + " start tile z " + ref_hight, world.get_time())
}
if ( z.z < ref_hight && z.z >= (ref_hight - 2) ) {
// terraform up
if ( print_message_box == 2 ) {
gui.add_message_at(pl, " ---=> tile up to flat ", world.get_time())
}
do {
err = command_x.set_slope(pl, tile_x(f.x, f.y, z.z), 82 )
if ( err != null ) { break }
z = r.get_ground_tile()
} while(z.z < ref_hight )
} else if ( z.z >= ref_hight || z.z <= (ref_hight + 1) ) {
// terraform down
if ( print_message_box == 2 ) {
gui.add_message_at(pl, " ---=> tile down to flat ", world.get_time())
}
do {
err = command_x.set_slope(pl, tile_x(f.x, f.y, z.z), 83 )
if ( err != null ) { break }
z = r.get_ground_tile()
} while(z.z > ref_hight )
}
if ( err ) {
return false
}
}
}
}
// build way
local way_list = way_desc_x.get_available_ways(wt, st_flat)
local way_obj = way_list[0] //tiles[0].find_object(mo_way)
gui.add_message_at(our_player, "build tiles[0] " + coord3d_to_string(tiles[0]) + " to tiles_build[0] " + coord3d_to_string(tiles_build[0]), start_field)
command_x.build_way(our_player, tiles[0], tiles_build[0], way_obj, true)
command_x.build_way(our_player, tiles_build[0], tiles_build[way_len - 1], way_obj, true)
command_x.build_way(our_player, tiles_build[way_len - 1], tiles[way_len - 1], way_obj, true)
// build signals
local list = sign_desc_x.get_available_signs(wt)
local obj_sign = null
foreach(o in list) {
gui.add_message_at(our_player, "signals " + o.get_name(), start_field)
if (o.is_signal()) {
obj_sign = o
break
}
}
for(local j=0; j < signal.len(); j++ ){
gui.add_message_at(our_player, "signal to tile " + coord3d_to_string(tile_x(signal[j].coor.x, signal[j].coor.y, signal[j].coor.z)), start_field)
while(true){
local err = command_x.build_sign_at(our_player, tile_x(signal[j].coor.x, signal[j].coor.y, signal[j].coor.z), obj_sign)
local ribi = tile_x(signal[j].coor.x, signal[j].coor.y, signal[j].coor.z).get_way_dirs_masked(wt)
if (ribi == signal[j].ribi)
break
}
}
}
}
Der Aufruf steht in industrie_manager.nut Zeile 321
Code: // no signals and double tracks - limit 1 convoy for rail
if (cnv.get_waytype() == wt_rail && cnv_count == 1) {
local s_field = tile_x(115, 180, 2)
build_double_track(s_field, wt_rail)
//gui.add_message_at(our_player, "####### cnv_count " + cnv_count, world.get_time())
//gui.add_message_at(our_player, "Line: " + line.get_name() + " ==> no add convoy by rail", world.get_time())
return
}
Beiträge: 7.536
Themen: 249
Registriert seit: Apr 2013
Bewertung:
27
31-05-2020, Sunday-15:28:07
Felder haben keine Besitzer, nur die Objekte darauf. Musst also den Besitzer des Gleise abfragen.
Beiträge: 1.191
Themen: 126
Registriert seit: Sep 2019
Bewertung:
10
31-05-2020, Sunday-15:44:59
(31-05-2020, Sunday-15:28:07 )prissi schrieb: Felder haben keine Besitzer, nur die Objekte darauf. Musst also den Besitzer des Gleise abfragen.
Das ist schon klar. Nur geht halt die Abfrage dafür vor den Baum im Moment.
tile_x.find_object(mo_way) beendet Simutrans r9112 zuverlässig.
Beiträge: 7.536
Themen: 249
Registriert seit: Apr 2013
Bewertung:
27
01-06-2020, Monday-14:51:26
Da muss leider Dwachs ran, ich kennen mich damit nicht aus.
Beiträge: 1.191
Themen: 126
Registriert seit: Sep 2019
Bewertung:
10
02-06-2020, Tuesday-09:42:19
(Dieser Beitrag wurde zuletzt bearbeitet: 02-06-2020, Tuesday-09:44:15 von Andarix.)
Hab jetzt erst mal den Bau anders abgefangen, wenn die Strecke einem anderen Spieler gehört.
Der Code ist jetzt hochgeladen ins Git.
Das Startfeld ist in industry_manager.nut Zeile 322 angegeben. Aktuell müssen 8 gerade Felder Richtung Ost oder Süd folgen. Je nach verwendeten Spielstand muss das dann angepasst werden, da eine automatische Ermittlung noch fehlt.
Der Aufruf von tile_x.find_object(mo_way) steht in astar.nut Zeile 1063 ( als Kommentar im Code ).
Beiträge: 543
Themen: 5
Registriert seit: Aug 2015
Bewertung:
19
08-06-2020, Monday-15:39:14
Schau ich mir an. Ein Absturz sollte definitiv nicht passierern.
Beiträge: 543
Themen: 5
Registriert seit: Aug 2015
Bewertung:
19
08-06-2020, Monday-16:03:16
(Dieser Beitrag wurde zuletzt bearbeitet: 08-06-2020, Monday-16:08:52 von Dwachs2.)
Sollte das vielleicht mo_wayobj statt mo_way heissen (wuerde der Variablenname nahelegen)? oder find_object(mo_way).get_desc() ?
find_obj(mo_way) gitb die konkrete Schiene zurueck (oder Strasse, wenn man Pech hat). get_desc() dann das den Weg-Typ, den man zum Bauen nimmt.
Beiträge: 543
Themen: 5
Registriert seit: Aug 2015
Bewertung:
19
08-06-2020, Monday-16:12:53
(Dieser Beitrag wurde zuletzt bearbeitet: 08-06-2020, Monday-16:23:27 von Dwachs2.)
Habe es getestet, aber keine Fehlermeldungen oder Crashes bekommen. Welches Savegame hast du benutzt? Welche/Wieviele KI-Spieler?
Ideal waere ein Savegame (inkl gestarteter KIs), dass sich beim Vorlauf verabschiedet.
|