Mod mit GameScript erstellen

Willkommen in der Transport Fever Community

Welcome to the fan community of Transport Fever and Train Fever, the economic simulators of Urban Games. The community is free for you to share and inform yourself about the game. We cultivate a friendly and objective interaction with each other and our team will be happy to answer any questions you may have.

 

Registration and use is of course free for you.

 

We wish you a lot of fun and hope for active participation.

The Team of the Transport-Fever Community

  • Kurze Beschreibung, wie man einen Mod mit Game Script erstellen kann.

    Um eine Mod zu erstellen, die auf Ingame Events reagieren kann, muss man ein Game Script anlegen.


    Dazu erstellt man im Mod-Ordner einen Ordner /res/config/game_script


    Dort legt man dann die Datei modname.lua mit folgendem Grundgerüst an:


    handleEvent und update laufen im Game Thread, guiHandleEvent und guiUpdate laufen im Gui Thread.
    Man kann Daten von der Gui zum Script schicken mit game.interface.sendScriptEvent(id, name, param)

    Dabei drann denken, das dieses Event alle anderen aktiven GameScripte auch erhalten können.


    Die Funktion guiUpdate wird recht regelmäßig getriggert, muss noch herausfinden, ob bei jedem Tick.


    Ich werde mich jetzt erstmal weiter durch die Vanilla Files wühlen, um zu sehen, was man alles anstellen kann.




    GameScript State Handling (Eigenarten):

    save() und load() werden während eines Fames mehrmals (bei mir 3 mal) abwechselnd aufgerufen.

    Dabei wird save() aus dem Game-Threads angestoßen, in denen auch update() und handleEvent() ausgeführen wird.

    load() dagen wird im GUI-Thread aufgerufen, wie guiHandleEvent() und guiUpdate()


    Wenn ein Spieler sein Spiel speichert, wird zusätzlich save() mehrmals aufgerufen.

    Und wenn der Spieler ein Spiel startet, wird load() mehrmals ausgelöst, aber nur für die Game-Threads.


    Anzumerken ist auch, das beim laden eines Spielstandes die load() und save() ebenfalls mehrmals ausgeführt werden. Außerdem überprüft TPF2 dabei, ob save() in jedem Fall den gleichen Zustand zurück liefert aus Game-Thread und GUI-Thread. Das ist natürlich meistens der Fall, wenn aber z.B. Zeitstempel hier mit gespeichert werden, werden diese sich in beiden Threads unterscheiden und TPF2 wird mit einer kryptischen Fehlermeldung abbrechen. Empfehlen kann ich dafür nur, Zeitstempel erst im guiUpdate() Funktion zu erstellen und per sendScriptEvent() an den Game-Thread zu schicken.


    Der Zustand innerhalb eines GameScripts kann nur durch die Wechselaufrufe von save() und load() vom Game-Thread zum GUI-Thread gelangen.

    Anders rum muss game.interface.sendScriptEvent() im GUI-Thread aufgerufen werden und dieser in handleEvent() dann im Game-Thread verarbeitet.



    Es gibt zudem wesentlich mehr Funktionen, die man nun verwenden kann. Hier schon mal ne einfache Liste:


    -- game.gui functions (nur im GUI Thread):

    -- absoluteLayout_addItem

    -- absoluteLayout_deleteAll

    -- absoluteLayout_setPosition

    -- addTask

    -- boxLayout_addItem

    -- boxLayout_create

    -- button_create

    -- calcMinimumSize

    -- component_create

    -- component_setLayout

    -- component_setStyleClassList

    -- component_setToolTip

    -- component_setTransparent

    -- getCamera

    -- getContentRect

    -- getMousePos

    -- getTerrainPos

    -- imageView_create

    -- imageView_setImage

    -- isEditor

    -- isGuideSystemActive

    -- openWindow

    -- playCutscene

    -- playSoundEffect

    -- playTrack

    -- setAutoCamera

    -- setCamera

    -- setConstructionAngle

    -- setEnabled

    -- setHighlighted

    -- setMedalsCompletion

    -- setMissionComplete

    -- setTaskProgress

    -- setVisible

    -- showTask

    -- stopAction

    -- textView_create

    -- textView_setText

    -- window_close

    -- window_create

    -- window_setIcon

    -- window_setPosition

    -- window_setTitle


    -- game.interface functions (größtenteils nur im GameThread):

    -- addPlayer

    -- book

    -- buildConstruction

    -- bulldoze

    -- clearJournal

    -- findPath

    -- getBuildingType

    -- getBuildingTypes

    -- getCargoType

    -- getCargoTypes

    -- getCompanyScore

    -- getConstructionEntity

    -- getDateFromNowPlusOffsetDays

    -- getDepots

    -- getDestinationDataPerson

    -- getEntities

    -- getEntity

    -- getGameDifficulty

    -- getGameSpeed

    -- getGameTime

    -- getHeight

    -- getIndustryProduction

    -- getIndustryProductionLimit

    -- getIndustryShipping

    -- getIndustryTransportRating

    -- getLines

    -- getLog

    -- getMillisPerDay

    -- getName

    -- getPlayer

    -- getPlayerJournal

    -- getStationTransportSamples

    -- getStations

    -- getTownCapacities

    -- getTownCargoSupplyAndLimit

    -- getTownEmission

    -- getTownReachability

    -- getTownTrafficRating

    -- getTownTransportSamples

    -- getTowns

    -- getVehicles

    -- getWorld

    -- replaceVehicle

    -- setBuildInPauseModeAllowed

    -- setBulldozeable

    -- setDate

    -- setGameSpeed

    -- setMarker

    -- setMaximumLoan

    -- setMillisPerDay

    -- setMinimumLoan

    -- setMissionState

    -- setName

    -- setPlayer

    -- setTownCapacities

    -- setTownDevelopmentActive

    -- setZone

    -- spawnAnimal

    -- startEvent

    -- sendScriptEvent(id, name, param) -- nur im GUI Thread verfügbar

    -- upgradeConstruction

Share

Comments 5

  • Ich gehe mal davon aus, dass es init heißen soll. Außerdem habe ich noch guiInit gefunden.

  • Bei save fehlt ein end und die } ist zuviel.

  • Hat jemand startEvent getestet? Wenn ich dieselbe Zeile verwende, die in TpF1 funktioniert, erhalte ich jetzt eine CTD in TpF2.


    Has anyone tested startEvent? When I use the same line that works in TpF1 I now get a CTD in TpF2.

    stdout.txt

    c:\build\tpf2_steam\src\game\scripting\interface.cpp:2320: auto __cdecl scripting::SetupInterface::<lambda_d632bb7827acf6d5147b617fa6d1eaa7>::operator ()(class lua::State &) const: Assertion `false' failed.

    • I have got a quick answer from UG and "startEvent" function is not supported for the moment.

  • War mal so frei und hab ein bischen was ergänzt :)

    Verständlichere Formulierungen und noch mehr Infos wären aber sich wünschenswert, damit kann ich aber leider erst mal nicht dienen.


    MFG PMV