Willkommen in der Transport Fever Community

Wir begrüßen euch in der Fan-Community zu den Spielen Transport Fever und Train Fever, den Wirtschaftssimulatoren von Urban Games. Die Community steht euch kostenlos zur Verfügung damit ihr euch über das Spiel austauschen und informieren könnt. Wir pflegen hier einen freundlichen und sachlichen Umgang untereinander und unser Team steht euch in allen Fragen gerne beiseite.

 

Die Registrierung und Nutzung ist selbstverständlich kostenlos.

 

Wir wünschen euch viel Spaß und hoffen auf rege Beteiligung.

Das Team der Transport-Fever Community


  • Maybe UG opens their API for further improvements by script modders with their "thank you patch". So they could focus their new project while TpF grows from community works further. Or some unmod-able things may become mod-able. :)


    There are a lot of details I'd like to be changed or improved a bit.

  • Warum sollte eine neue API das Spiel instabiler machen?


    Ich arbeite gerade an Mod UI Fenstern, und fange da jetzt LUA Crashes ab ohne das ganze Spiel zu beenden.
    Für UG wäre es sehr einfach an bestimmte stellen mehr Daten auszugeben, ich muss ja erstmal herausfinden wie etwas überhaupt funktioniert



    Why should a new api result in more instability?
    Currently I try to add UI Controls for Mod generated Windows and catch script errors without a quit of TPF.
    For UG it would be much easier to add more Data, I have to find and understand the game first, that's a lot harder.

  • Why should a new api result in more instability?
    Currently I try to add UI Controls for Mod generated Windows and catch script errors without a quit of TPF.
    For UG it would be much easier to add more Data, I have to find and understand the game first, that's a lot harder.

    because of edge cases, internal functions may be called by conventions, which isn't known to mod developers, the game developers will respect these conventions, or the interfaces are maintained upon thier own needs, but not for mod devs. A simple example are functions in game.interface, they are designed for campaign mode, not for usual game play, when you call them in an ordinary scene, some may lead to assertions failures for some unknown reason. As you must know, assertions are conventions, but only known to game devs.


    If they open too much interfaces, it's sure they will have a lot more bugs to fix.


    But I know there will be some new interfaces open in the next patch, tom told me.

    This guy is too lazy to create a signature. 8o

  • The interfaces are a separate code part UG has to bind by hand.
    So they need to write an explicit code path so you can call it. There is explicit code calls into the lua code at certain points. But instead doing a crash, UG could try to use pcall, catch all/many errors, restore the stack position.


    Well yes, but the c++ code in TPF creates edge cases for c++ functions too.
    Certain seeds crashed the world creation without doing any modding...


    My code calls into the lua code in the render thread.
    Then lua function calls then imgui lua bindings.
    After 10 calls with an error you need to reload the savegame or a do a rebind of the render callback.


    TPF should simple more strict when loading stuff. If you need a lua table later in c++ code, why does the code accept a function or number? (Note: The function will never be called to get a table reference)


    Well converting lua stuff in c++ classes to boost variants, passing around and the converting back doesn't bring safety. (Well it helps to obfuscate the code so I can't follow it quite good)


    We will see what we get...

  • Ich hätte mal eine ganz praktische Anfrage: es gibt beim auslesen der Heightmap ein Höhenlimit von 1000 Metern, das später im Spiel mit dem Geländetool relativ leicht überschritten werden kann. Es scheint also eine reine Formalität zu sein.


    Ich hab bereits selbst versucht alle Stellen, an denen E8 03 00 00 auf ein Register geschoben oder direkt verglichen wird abzuändern, aber das hat wie (pessimistisch) erwartet nur zu Access Violations geführt. 1000 ist für HEX-Editor-Hacking auch keine besonders dankbare Konstante.


    Vielleicht hast du ja eine Idee im Hinterkopf, wie man dieses Limit umgehen könnte.

  • Ich hab mir den Heightmap Importer noch nie angesehen, TPF benutzt in der Regel für Koordinaten floats. Sprich das müsste also irgendwo in IEEE-754 codiert sein. Um etwas einzugrenzen, hilft es normalerweise eine Fehlerstring zu finden und von dort weiter zu forschen.


    Gibt es denn viele Nutzer, die so Heightmaps nutzen möchten?

  • Es spricht wohl eigentlich nichts dagegen, dieses immer zu patchen.
    Ich hätte also gerne eine Testpaket (möglichst klein, heightmap, map.lua ) damit ich es unter allen TPF Versionen testen kann....


    PS: Die "Konstante" wird unter anderem zur Gewichtsanzeige und Trackbuilder genutzt, d.h.den Wert per Hex Editor zu ändern ist eher suboptimal...

  • Es spricht wohl eigentlich nichts dagegen, dieses immer zu patchen.
    Ich hätte also gerne eine Testpaket (möglichst klein, heightmap, map.lua ) damit ich es unter allen TPF Versionen testen kann....


    PS: Die "Konstante" wird unter anderem zur Gewichtsanzeige und Trackbuilder genutzt, d.h.den Wert per Hex Editor zu ändern ist eher suboptimal...

    Das is'n proof of concept, da ist alles erlaubt :P


    Hier, Mini-Karte:


    HeightTest.zip

  • Hallo


    Leider dauert die nächste Version noch etwas, in der Zwischenzeit mal ein Screenshot:



    Extreme Höhenkarte
    Ingame Console mit LUA Commandline.
    Zwei UI Fenster via LUA Script, Mod Menü kann durch Mods befüllt werden...


    Mittlerweile läuft alles recht stabil.


    Als Beispiel ein UI Fenster:

    Als Callbacks gibt es bis jetzt ein change Callback, Das Fenster Objekt hat dann eine Parameterliste. Für Buttons kommt noch eine onclick event.
    Ich nehme da aber gerne auch noch Wünsche an.

  • Die UI basiert auf dear imgui:
    https://github.com/ocornut/imgui


    Mit QT wäre es Overkill. Ob ich nochmals Imgui nutzen würde, keine Ahnung. Ein paar Sachen sind recht unschön, anderseits bekommt man recht schnell ein Ergebnis und TPF nimmt es nicht krumm.

  • Nein, ich bin ein netter Mitbewohner und mache das halbwegs sauber über SDL, OpenGL und auch an der richtigen Stelle. (D.h. ich störe zum Beispiel nicht das Steam Overlay)


    Technisch sieht das so aus:


    LUA → Lädt DLL oder SO Datei
    CommonAPI Library sucht sich die richtigen Stellen in Spiel.
    (u.a. Verbindung einer angepassten LUA Runtime zur TPF Lua Runtime)


    Patchen des Spiels im Speicher, SDL Context finden, Render Thread...
    CommonAPI stellt native Funktionen zur Verfügung: Dateisystem und Callback für das Rendern.


    TPF Render Thread
    → Nach dem Rendern von Tooltips
    → CommonAPI Library Render aufrufen
    → Render Menü und native Fenster via Imgui erstellen.
    (Technisch kann die Console zum Beispiel nicht in LUA gebaut werden)
    → TPF LUA Crash Handler ändern, Imgui Crash Handler aktivieren
    → LUA Callback aufrufen (lua_pcall)
    → CommonAPI nativeui.lua ruft Imgui via LUA Bindings auf.
    → Rücksprung in C++ Code (ggf. LUA Crash abfangen), Crash Handler abarbeiten
    → TPF LUA Crash Handler zurücksetzen
    → Rücksprung in TPF Render Thread
    → Ggf. Steam Overlay bzw. SDL Pageflip machen.



    Die LUA UI Callbacks laufen noch im Renderbereich ab,
    dieses möchte ich noch verlegen an den Punkt wo TPF normalerweise Mission ausführt.


    Dieser Code scheint sich subtil zwischen jeder Version zu ändern, d.h. ich hab da noch keinen erfolgreichen Patch für.


    ---


    UI Scale is on my todo list. Technical imgui supports ScaleAllSize and changing the font atlas. However doing this at runtime could be a bit tricky.





    -----edit-----



    Wer mag kann sich die Console und die Native UI API Schnittstelle mal anschauen:


    Wenn die Native DLL geladen ist, ist commonapi.ui verfügbar, es gibt unter res/scripts/commonapi/test/ui.lua Beispiel/Testcode.


    @snowball Floats und Int Eingabe mit min/max und step gibt es auch.
    @Enzojz: UI Scaleing works mostly aswell.


  • Von allen denkbaren Ansätzen ist deiner wahrscheinlich der ambitionierteste. Bei den meisten Dingen weiß ich in etwa welche Arbeitsschritte nötig sind, aber bei dem was du mit diesem Spiel machst wusste ich z.T. nichtmal dass es überhaupt möglich ist.


    BtT: es wäre unheimlich cool einen Bereich für Notifications zu haben.


    Zwei mögliche Szenarien:


    1. Manche Mods sind eher Tools die irgendwas ausgeben, z.B. die Vermessungswerkzeuge von @BR146. Aktuell wird aus den Missionszonen Text erstellt, das ginge eleganter.


    2. Manche Mods haben viele Parameter und es gibt auch bekannterweise ungültige Kombinationen. Da wäre ein Bereich zum ausgeben von Fehlern nett. Oder kann man irgendwie die roten Meldungen am Mauscursor erweitern?

  • Da die Fenster per LUA erstellt werden können, braucht es nur die Programmierung der richtigen API Funktionen zur imgui Bridge


    Aber auch mit der jetzigen unfertigen API:
    Ich hoffe @BR146 nimmt es mir nicht übel wenn ich mal ein Screenshot mache.





    Gerade für solche Tools und Spezialfälle kann die API ihre stärken zeigen...

BlueBrixx