Themabewertung:
  • 0 Bewertung(en) - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Script-KI - Werte Speichern
#21
start_l, end_l: sollten nicht auf null gesetzt werden.

Routensuche: Aufruf vermutlich falsch, start & end muessen Arrays sein. Wenn start/end nur ein Feld sind, dann in eckige Klammern packen: bla.search_route( [start], [end])

Linienstatistik: Gibt schon was: z.b. line.get_profit() siehe http://dwachs.github.io/simutrans-sqapi-...ne__x.html
Zitieren
#22
(19-09-2020, Saturday-16:19:08 )Dwachs2 schrieb: ....

Linienstatistik: Gibt schon was: z.b. line.get_profit()  siehe http://dwachs.github.io/simutrans-sqapi-...ne__x.html

Das ist die Monatsstatistik. Also selber zusammen rechnen.
Script-KI für Simutrans r10894+ / Simutrans Nightly Builds
Zitieren
#23
Eine andere Statistik gibts nicht. Was haettest du denn gerne?
Zitieren
#24
Ich hab im Moment das Problem, neue Linien nicht gleich wieder zu entfernen.

Hab da noch nicht den richtigen Ansatz gefunden.
Script-KI für Simutrans r10894+ / Simutrans Nightly Builds
Zitieren
#25
(30-08-2020, Sunday-12:44:07 )Dwachs2 schrieb: Zuerst in der Klassendefinition von industry_link_t eine weitere Variable einfuehren, z.b. dingsbums = 0.
Dann in check_link_line  die Variable mit link.dingsbums = 1 setzen.

Problem bei der Geschichte, ein Link kann mehrere Lines haben. Darunter durchaus auch mehrere Eisenbahnen.

Das heist, die Speicherung müsste geschachtelt werden mit Linienname und Wert.

Ich bin mir auch nicht sicher, ob die Linien dann nicht unterschiedlichen Spielern gehören.
Script-KI für Simutrans r10894+ / Simutrans Nightly Builds
Zitieren
#26
Ohne jetzt genau den Code zu kennen: Kann man das nicht mit einem zweiten Zaehler auch bein Linien machen? Wenn dann der x. Monatesreste fuer diesen Link ist, dann wird der Zaehler bei allen Linien um eins reduziert. Nur Linien mit Zaehler Null wuerden dann updateberechtigt sein.
Zitieren
#27
(21-06-2021, Monday-02:54:27 )prissi schrieb: Ohne jetzt genau den Code zu kennen: Kann man das nicht mit einem zweiten Zaehler auch bein Linien machen? Wenn dann der x. Monatesreste fuer diesen Link ist, dann wird der Zaehler bei allen Linien um eins reduziert. Nur Linien mit Zaehler Null wuerden dann updateberechtigt sein.

Die Linien sind die Linienobjekte von Simutrans selber. Da kann ich schwerlich das Objekt einfach so erweitern.

Der Script-Code stammt von Dwachs. So richtig hab ich den auch noch nicht verstanden.

Es scheint aber so zu sein, das es ein Link-Objekt im Script gibt, das als Schlüssel die beiden Industrien beinhaltet die verbunden werden. Und in diesem Link-Objekt gibt es einen Eintrag Lines, der wiederum alle Linien als Array beinhaltet, die irgendwie diese beiden Industrien verbinden. Das können Direktverbindungen sein aber auch kombinierte Strecken.

Auf jeden Fall sind die Linien die Linen-Objekte von Simutrans selber. In wie weit man da was für die Script-KI ändern kann/will liegt nicht bei mir.

Das Management wäre jedenfalls etwas leichter, wenn die Anzahl der Ausweichstellen und ein Zeitstempel direkt bei den Linien abgespeichert werden könnten.

Aktuell sieht die Klassendefinition für link bei mir so aus.
Code:
/**
* A link is a connection between two factories.
* Save its state here.
*/
class industry_link_t
{
    f_src   = null // factory_x
    f_dest  = null // factory_x
    freight = null // good_desc_x

    state = 0
    lines = null   // array<line_x>

    double_ways_count        = 0 // count of double way build
    double_ways_build        = 0 // double way build: 0 = no ; 1 = yes
    optimize_way_line        = 0 // is way line optimize: 0 = no ; 1 = yes
    destroy_line_month    = null // test month save
    line_way_speed            = 0 // save way speed for line
    build_line                    = 0 // create line
    next_vehicle_check  = 0 // save ticks for next vehicle check

    // next check needed if ticks > next_check
    // state == st_missing: check availability again
    // state == st_build: check for possible upgrades
    next_check = 0 // only set for st_missing, next time availability has to be checked

    static st_free    = 0 /// not registered
    static st_planned = 1 /// link is planned
    static st_failed  = 2 /// construction failed, do not try again
    static st_built   = 3 /// connection successfully built
    static st_missing = 4 /// missing infrastructure, try again later

    constructor(s,d,f)
    {
        f_src = s
        f_dest = d
        freight = good_desc_x(f)
        lines = []
    }

    function append_line(l)
    {
        lines.append(l)
    }
    function remove_line(l)
    {
        lines.remove(l)
    }
    function _save()
    {
        return ::saveinstance("industry_link_t", this)
    }
}

Im Prinzip muss ich parallel zu lines[] ein Array speichern mit meinen eigenen Werten als Objekt für die Linie. Dadurch bin ich unabhängig vom Programmcode selber.

line_x

Was auf jeden Fall helfen würde wäre, wenn man beim Spieler-Objekt einen Eintrag abfragen kann der den Spielertyp (Mensch, C-KI, Script-KI) zurückgibt.

Das würde es erleichtern Strecken umzubauen.

Für den Streckenumbau/-abriss wäre es auch nützlich die Fahrzeugzahl abzufragen, die ein Streckenstück benutzt haben.

Dafür sind aber Code-Änderungen an Simutrans selber nötig.
Script-KI für Simutrans r10894+ / Simutrans Nightly Builds
Zitieren
#28
Zitat:Was auf jeden Fall helfen würde wäre, wenn man beim Spieler-Objekt einen Eintrag abfragen kann der den Spielertyp (Mensch, C-KI, Script-KI) zurückgibt.
Die Sciprt-KI weiss doch, dass sie ein Script ist, und kann daher kein Mensch sein. Was die anderen Spieler angeht, wozu soll denn das gut sein?
Zitieren
#29
Die 'Fahrzeuganzahl pro Weg' abzufragen sollte schnell eingebaut sein.

Die remove_line-Methode sieht aus, als wuerde sie nicht das tun, was man denkt. Ich werde mal versuchen, deine industry_link_t Klasse so zu aendern, dass du dann neue Daten pro Linie dazubauen kannst.
Zitieren
#30
(22-06-2021, Tuesday-06:37:41 )prissi schrieb:
Zitat:Was auf jeden Fall helfen würde wäre, wenn man beim Spieler-Objekt einen Eintrag abfragen kann der den Spielertyp (Mensch, C-KI, Script-KI) zurückgibt.
Die Sciprt-KI weiss doch, dass sie ein Script ist, und kann daher kein Mensch sein. Was die anderen Spieler angeht, wozu soll denn das gut sein?

Das Problem was es zu lösen gilt ist der Straßenausbau, wenn schnellere Fahrzeuge verfügbar sind.

Straßen können bekanntlich auch von anderen Spielern genutzt werden. Wurde ein Stück Straße gebaut und die Verbindung eingestellt, die dieses Stück benutzte, dann wird dieses Stück von dem betreffenden Spieler nie ausgebaut auf eine höhere Geschwindigkeit.

Benutzt ein anderer Spieler dieses Stück Straße mit, dann kann er es nie ausbauen. Es gibt nun zwei Möglichkeiten,

a) im Namen des Besitzers die Straße ausbauen (was vermutlich nicht gehen wird, keine Ahnung ob Spielerwechsel innerhalb der Script-KI möglich ist oder Tools mit Spieler-ID aufgerufen werden können)
b) eine Umgehung bauen, wenn es eine KI ist.

Und für Fall a) ist es besser zu wissen, das es sich um eine Script-KI handelt.

Auch beim Erschließen von Industrien ist es Hilfreich zu ermitteln, welche Spieler dort schon Stationen haben.

(22-06-2021, Tuesday-13:08:30 )Dwachs2 schrieb: ...
Die remove_line-Methode sieht aus, als wuerde sie nicht das tun, was man denkt. ...

Deswegen gibt es vermutlich die ungültigen Linien, die ich in check_link(link) dann extra testen muss.

Zeile 185 ff
Code:
        // iterate through all lines
        foreach(index, line in link.lines) {
            if ( line.is_valid() ) {
                //gui.add_message_at(our_player, "####### valid line " + line.get_name(), world.get_time())
                check_link_line(link, line)
            } else {
                gui.add_message_at(our_player, "####### invalid line " + line, world.get_time())
                link.lines.remove(index)
            }
        }

Die remove_line-Methode dürfte aber so von Dir stammen.
Script-KI für Simutrans r10894+ / Simutrans Nightly Builds
Zitieren


Gehe zu:


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