Beiträge von Jan

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


    GOTTVERDAMMTE Brückenpfeilerkollision! Ich hab gerade eine Stunde lang versucht eine eingleisige Ausfädelung zweigleisig zu machen. Ich hatte eine zweigleisige Strecke mit zweigleisigem Bahnhof. Dort teilen sich zwei Linien, indem das eine Gleis ausgefädelt und über die beiden Geradeausgleise geführt wird, damit die Linie abbiegen kann. Auf der anderen Seite reicht ja eine Weiche. Nun hab ich einen viergleisigen Bahnhof gebaut damit die Linien etwas mehr Luft haben und will nun von vier Gleisen zwei ausfädeln. Aber ich krieg keine zweigleisige Überführungsbrücke über die beiden Geradeausgleise. Am Ende hab ich alles abgerissen und es von vorn versucht, aber selbst dann krieg ich es nicht hin, eine zweite Brücke neben die erste zu setzen, weil ich immer nur Brückenpfeilerkollisionen kriege. Dabei sieht alles gut aus!? Die Pfeiler stehen schön verteilt neben den Schienen und alles sollte gehen, aber er läßt mich nicht die zweite Brücke dranbeppen. Das kann doch nicht so schwer sein? Für mich ist dieses Thema das wichtigste. Die sollen einfach diese Kollisionen in den Griff kriegen, alles andere ist Nebensache - für mich.

    Es gibt ein neues Update: BR 270 / BR 485 (Berliner S-Bahn)


    Ich hab zwei weitere Generationen dem Spiel hinzugefügt:
    - Von 2002 bis 2003 gibt es jetzt Versuchszug mit einteiliger Frontscheibe, der zur Wiedereröffnung der Ringbahn umgebaut und in Traditionsfarben lackiert wurde.
    - Ab 2011 gibt es noch eine weiterentwickelte Variante der Traditionslackierung, die keine Stange mehr vor der Frontscheibe hat, VBB-Aufkleber, Dienstabteilschild und zusätzliches Fahrradlogo auf der Seitenscheibe des Fahrradabteils.


    Ich hab auch die Farben der Traditionslackierung angepaßt. Leider sieht es auf jedem Monitor anders aus, da ja kaum einer einen farbgeeichten Monitor besitzt. Bei mir im Spiel find ich es okay, hier auf dem Notebook sehen die Screenshots schon etwas schräg aus. Ich finde es jetzt besser, als in der Vorgängerversion. Die Farben von @Revyn112s 480 hab ich auch ausprobiert - die haben leider nicht funktioniert. Sagt mir doch, was Ihr davon haltet - ich probiere auch gern andere RGB-Werte aus, wenn Ihr Vorschläge habt.


    Außerdem ist der Musterzug jetzt Teil dieses Mods. Dies verbessert die Performance, wenn beide Züge gleichzeitig eingesetzt werden.


    Ihr solltet unbedingt die beiden alten Mods deinstallieren, bevor Ihr diesen hier drauftut. Eure Savegames müßten weiterhin funktionieren.

    Hmm ja, also ich hab oft so Millimeter-Lücken, nicht nur an Bahnhöfen. Vermutlich weil ich immer 1850 starte und dann ein sehr organisch entwickeltes Netz habe. Durch Umbauten, Abzweigungen und dergleichen bekomme ich sehr sehr oft diese winzigen Gleisfragmente.


    Was wirklich nervt beim Elektrifizieren: wenn ich in einem Bahnhof Oberleitungen oder Betonschwellen installiere, vernichte ich alle wartenden Passagiere.


    Kreuzungsweichen wären schon ein Segen, aber für Ausfädelungen baue ich meistens Brücken, damit kreuzende Züge den Verkehr nicht behindern. Durch Überführungen kann man gut steuern, welche Linien Vorrang haben und man hält den Verkehr im Fluß. Selbstverständlich funktioniert das nicht innerhalb von Städten und schon gar nicht vor Bahnhöfen, da man aufgrund der ständigen Kollisionsfehler bei Brücken und Dämmen viel Platz braucht.

    Ja die kurzen Seiten meinte ich doch :-D Die sind halt um 90 Grad gedreht, von oben gesehen senkrecht.


    Ja also ich stelle gerne den Quellcode zur Verfügung, kein Problem. Ist aber echt keine Raketenwissenschaft. Nur ein paar Schleifen und die Draw-Library von Microsoft. Richtige Muster mit verschiedenen Steinen zu generieren ist definitiv echter Aufwand. Der Rest ist Pipikram dagegen ;-)


    Du kannst Dir aber theoretisch auch einfach drei Texturen generieren: eine mit 5 Reihen normale Steine, eine Reihe "senkrechte" und drei Reihen normal. Die drei Texturen fügst Du dann einfach zusammen. Mir ging es ja vordergründig um das Erzeugen von zufälligen Texturen und das Vermeiden von Mustern. Und das kannst Du ja tun.

    Achso, also ja ich kenne mich da nicht so aus. Ich meinte mit Halbstein die senkrecht verbauten Ziegel, die da in den drei Reihen der ausgangskachel zu sehen sind.


    Wenn ich Dich richtig verstehe, möchtest Du unterschiedlich große Steine verbauen? Also der Algorithmus skaliert alle Steine auf eine einheitliche Größe. Es können Kacheln jeder Form und Größe verwendet werden, aber am Ende sind alle gleich groß. Ein spezielles Muster wäre sehr aufwendig. Ich möchte eigentlich nicht mehr weiter dran arbeiten - ich wollte meine fertige Arbeit nur allen verfügbar machen, daher suche ich eine GUI.

    Ja sehr cool! Wir haben keinen Zeitdruck, also nur nicht hetzen lassen. Ich hab mal die DLL angehängt. Einfach referenzieren.


    Das ist mein Code in der Console-Application:



    Die Config benötigt folgende Werte:


    Property
    Description
    Note
    TilesLocationOrdner in dem all die Ziegelsteine liegen
    OutputFilenameOrdner und Dateiname für die zu generierende Texturimmer PNG
    TileMatrixSizeAnzahl der Ziegelsteine in x- und y-Richtung"width" sind die Spalten, "height" sind die Zeilen
    TileSizeEinheitliche Größe jeder Ziegelstein-Grafik; alle Ziegelsteine werden auf diese Einheitsgröße skaliert width/height in Pixel
    GapSizeDicke der Fugenin Pixel
    BackgroundColorFarbe der FugenSystem.Drawing.Color
    StaggeredRatioVersatz der Zeilen in Prozent0.5 (=50%) entspricht einem Versatz von einer halben Ziegelsteinlänge
    TextureWidth
    Breite auf welche die zu generierende Textur skaliert wird
    Dieses Feature ist im Augenblick deaktiviert


    ITileFactory


    Die 'RandomTileFactory' implementiert IFileFactory und macht nichts weiter als zufällig einen Ziegelstein aus dem Ordner (in 'TilesLocation') zu fischen und auf die Einheitsgröße zu skalieren.


    ILogger


    Den ILogger müßtest Du selbst implementieren.


    Code
    namespace ImageTiler.Domain
    {
     public interface ILogger
     {
     void Log(string message);
     }
    }


    Ich hab auf die Console ausgegeben und mir daher einen ConsoleLogger geschrieben. Das geht ja bei Dir nicht. Also entweder Du implementierst einen eigenen ILogger oder zu verzichtest auf Logging und instanziierst einfach den 'DefaultLogger'.


    EDIT: Du kannst eigentlich komplett auf den Logger verzichten. Ich hab ihn nur geschrieben, um die Zeilennummern auszugeben, damit ich auf der Konsole den Fortschritt sehen kann. Sonst logge ich nichts - ergibt also keinen Sinn, das in ein Logfile zu schreiben.


    TilingProcessor


    Der TilingProcessor macht die eigentliche Arbeit. Er benötigt die Config, die TileFactory und den Logger.


    GUI


    Es sollte nicht viel Arbeit sein. Die denkbar einfachste GUI wäre einfach ein simples Form, in dem man alle Config-Werte eingibt, einen Knopf drückt und die Textur wird dann erzeugt. Das wars.


    Wenn man es etwas luxuriöser haben will, könnte ich mir folgende Features vorstellen:
    - Locations könnte man per FileOpen-Dialog (Browse) einstellen, statt nur ein Textfeld.
    - Man könnte erlauben, die Werte zu speichern/laden, damit man nicht jedesmal alles neu eingeben muß.
    - Man könnte die generierte Textur direkt anzeigen.


    Aber Du bist der UI-Mensch, Du solltest freie hand/Entscheidungsfreiheit haben, wie Du es gern umsetzen möchtest.


    Probleme


    Je nach Größe der Matrix kann das resultierende File extrem groß werden! Für meine Triebwagenhalle hab ich eine Textur erzeugt, die über 20.000 Pixel breit war (360x170 Ziegelsteine). Ich hab erst versucht, das File direkt im Programm runterzuskalieren (daher der Config-Value 'TextureWidth'), aber es gab haufenweise OutOfMemoryExceptions, dahr ist der Code auskommentiert. Ich hab dann die generierte 20.000-Pixel-Datei mit Irfanview runteskaliert auf meine 2048 und das ging auch.


    Wenn Du Fragen hast, jederzeit. :-)


    Hallo zusammen,


    die Texturierung meiner Triebwagenhalle hat mir echte Kopfschmerzen bereitet. Die Seitenflächen sind wahnsinnig groß und ich konnte keine wirklich passenden Texturen finden. Alles was halbwegs meine gewünschten Farben hatte, war nur als Kachel verfügbar und selbst riesige Texturen in anderen Farben waren nicht groß genug, um einen realistischen Maßstab zu erhalten. Ein Ziegelstein sollte nunmal nicht einen Meter lang sein ;-)


    Also mußte ich kacheln. Hier, das ist eine seamless Kachel, die perfekt meine Vorlage imitiert:


    Also hab ich gekachelt. Und es sah furchtbar aus. Wirklich furchtbar:


    Die Kacheln sind zwar seamless, aber Schmutz und Schattierungen wiederholen sich nunmal und da ich besonders große Flächen habe, mußte ich besonders viele Kacheln verwenden. Ich hab es mit Tricks versucht, wie Kacheln spiegeln, drehen und versetzen, um etwas Zufälligkeit reinzubringen, aber das sah noch schlimmer aus. Dann hab ich versucht, es mit zusätzlichem Schmutz zu maskieren, aber auch das brachte nicht den gewünschten Effekt. Es sah so unecht aus, daß ich mein Projekt fast eingestellt hätte.


    Aber dann hatte ich eine Idee: Warum nicht selbst mauern?


    Also nahm ich die Kachel und schnitt Ziegelsteine aus. Alle Ziegelsteine - außer die Halbsteine. Ich bekam insgesamt 52 Steine aus dieser Textur in all den unterschiedlichen Farben.
    Dann schrieb ich eine kleine Console Application in .NET und baute mir die Steine zu einer Mauer zusammen. Dabei wird per Zufallsgenerator einer der 52 Steine ausgewählt, eingesetzt und der nächste Stein per Zufall ausgewählt, eingesetzt usw. Das Resultat sah so aus:


    Besser, oder?


    Nun hab ich das Tool so geschrieben, daß es sehr flexibel ist und für alles mögliche eingesetzt werden kann. Folgende Features sind drin:

    • Kacheln können versetzt werden - so kann man Fliesen machen, wie ein Schachbrett oder um 50% versetzt, wie eine Ziegelmauer, oder jeden beliebigen anderen Versatz (in Prozent)
    • Die Kacheln werden normalisiert - d.h. wenn die einzelnen Ziegelstein-Bilder (oder was auch immer Ihr als Kacheln verwenden wollt) nicht alle die selbe Größe haben, werden sie einzeln auf eine vorher festgelegte einheitliche Größe skaliert
    • Die Dicke der Fugen kann in Pixeln angegeben werden
    • Die Farbe der Fugen kann in RGB mit Alphakanal angegeben werden - ich hab meine Fugen transparent gemacht, so daß ich in Gimp die Fugenfarbe jederzeit per Hintergrundbild ändern kann
    • Die Anahl der "Spalten und Zeilen" muß vorher angegeben werden, also wieviele Kacheln in X- und Y-Richtung erzeugt werden sollen
    • Der Speicherort der einzelnen Kachelgrafiken und der Ausgabeort der fertigen Textur müssen separat angegeben werden

    Was fehlt eigentlich?


    Eine GUI! Für meine Zwecke hat eine Konsolenanwendung gereicht. Alle zu konfigurierenden Werte hab ich in die app.config getan un dann meine Textur auf der Shell generiert. Aber so kann man das natürlich niemandem anbieten.


    Warum mache ich die GUI nicht selbst?


    Ich bin nicht gut im UI-Design, ich mag kein WindowsForms, ich hab wenig Erfahrung mit WPF und eine Webanwendung wäre wünschenswert, aber ich hab keinen Hoster für .NET. Außerdem hat das Tool seinen Zweck erfüllt: ich hab meine Textur und die Triebwagenhalle ist fertig, also warum noch mehr Zeit investieren?


    Aber ich hab alle Logik in einer DLL. Man kann also statt meiner Konsolenanwendung einfach eine Fensteranwendung - oder eine Website - obendraufsetzen.


    Hat jemand Lust und Interesse?


    Wenn ja, kann ich die DLL hier teilen und eine knappe Schnittstellendokumentation reinsetzen. Also wenn jemand von Euch eine GUI machen möchte, laß uns zusammenarbeiten!


    [line][/line]
    Short version in English:


    I made a texture generator, that combines tiles in a matrix. The first image above is my original seamless tile. The second image is a brickwall created by repeating this tile - it shows how bad it looks due to the repeating pattern. The third image shows a generated wall texture composed of 52 single bricks, which I cut out of the seamless tile and which I combined randomly to generate a wall of any arbitrary size. My texture generator is simply taking any random tile from a folder, normalizes it to a specified size and combines it to a matrix of a specified size to get rid of the pattern and make a truly random texture. All I made is a DLL and a console application with app.config which did the job for me.


    Now if someone could create a GUI to replace the console application, everyone could use this tool for their own textures.

    Ja die Scrollerei ist wirklich ätzend jedesmal, vorallem als Triebwagen-Fan, denn die sind immer ganz unten!


    Die Trennung der Fake-Fahrzeuge ist aber vermutlich nicht sinnvoll. Das wäre zwar cool, aber woran will man das festmachen? Fake-Loks sind ja nicht Teil des Spielsystems, sondern ein Workaround der Modder, um etwas Deko ins Spiel zu bringen. Diese Fahrzeuge haben aber kein Flag, das sie als Fake ausweist, sondern nur veränderte Konfigwerte.

    Zitat von Angry_CJ

    Das mit N und M geht schon seit der Beta Leute !!!!


    Ja, aber es ist nirgends dokumentiert! Als ich das Spiel frisch hatte, hab ich mir jedesmal einen abgebrochen um Straßen über Schienen zu legen: zwei Rampen gebaut und dann verbunden. Als ich per Google M und N entdeckt hab, dachte ich, ich werd nicht mehr - warum wurde das nicht im Spiel angezeigt? Ich glaube, inzwischen steht es da.

    Ja, man müßte schon wissen, welche Indices zu Türen gehören und welche zu anderen Meshes. Aber zum Glück sieht man ja alle türen in der Node "open_all_doors". Das kopierst Du einfach, benennst es um in open_doors_left (bzw. _right) und löschst die Zeilen, die Du nicht willst. Das einzige, was Du wirklich nicht weißt ist, welche Tür links ist und welche rechts, aber das hat man ja schnell herausgefunden, indem man es einfach im Spiel testet.


    Beispiel (fiktiv):


    Code
    open_all_doors = {
        [4] = { forward = true, name = "opend1", },
        [5] = { forward = true, name = "opend1", },
        [6] = { forward = true, name = "opend2", },
        [7] = { forward = true, name = "opend2", },
    },


    Jetzt kopierst Du den Block einfach zweimal und benennst die beiden zusätzlichen Blöcke um:



    Und nun mußt Du die Hälfte der Türen "rausschmeißen", so daß im einen Block die ersten beiden sind und im anderen die restlichen beiden:



    Daß Du nun genau die richtigen Türen erwischt hast weißt Du natürlich nicht, aber starte das Spiel einfach und schau, welche Türen sich nun öffnen - vielleicht nur die vorderen auf beiden Seiten und hinten bleiben sie zu. Dann mußt Du einfach die Indices austauschen. Öffnen sich die Türen genau auf der dem Bahnsteig abgewandten Seite, weißt Du, daß es genau falschherum ist, also benennst Du die beiden Nodes einfach um: aus left wird right und aus right wird left. Schon erledigt.

    Ich hab nun auch bahnsteigseitenabhängige Türanimationen eingebaut.


    Das Fahrzielanzeigenproblem ist erstmal vertagt - ich spiele zur Zeit zum ersten Mal ein richtiges Spiel mit der 485 (hab seit Dezember nur gemoddet und nicht gespielt) und bisher find ich es so wie es ist ziemlich geil. Ich weiß nicht, ob ich da wirklich Ziele in die Anzeige reinschreiben will. Ich denke aber noch darüber nach.