Dieses Forum nutzt Cookies
Dieses Forum nutzt Cookies um Anmeldeinformationen (keine Passwörter) zu speichern. Dabei werden diese Informationen als kleine Textdateien auf deinem Endgerät abgelegt. Sie können nur durch dieses Forum ausgelesen werden und stellen kein Sicherheitsrisiko dar. Neben deinem letzten Login wird auch abgespeichert, welche Themen du bereits gelesen hast.

Zudem wird ein Cookie angelegt, in dem abgespeichert wird, ob du diesen Hinweis gelesen hast. Damit wird er nicht jedes mal angezeigt.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
NML - NewGRF Meta Language
Verfasser Nachricht
planetmaker
Tycoon
*****

Beiträge: 1.309
Registriert seit: Oct 2008
Beitrag #1
NML - NewGRF Meta Language
Moin,

da sich hier auch gelegentlich Leute tummeln, die das eine oder andere NewGRF etwas modden oder schreiben, ein kurzer Hinweis auf ein neues Werkzeug, welches - zumindest meiner Meinung nach - das Schreiben von NewGRFs um einiges vereinfacht: NML

Worum geht's?
NML ist eine NewGRF Hochsprache mit Compiler, welcher nml-Dateien in newgrf - Dateien (und, so gewünscht, nfo) übersetzt.

Der Hauptautor ist Yexo, weitere wichtige Autoren sind Hirundo und Alberth. Inzwischen ist NML so weit gediehen, dass es offiziell bekannt geben werden kann, da es nicht mehr wahrscheinlich ist, dass der Syntax sich ändert.

Wie funktioniert's?
Ein NewGRF in NML zu schreiben funktioniert ähnlich dem Schreiben eines Programms in einer Programmiersprache - mit der Ausnahme, dass keine Sub-Routinen verfügbar sind; man kann die üblichen Zuweisungen und bedingten Anweisungen nutzen. Weiter unten habe ich eine kleine Gegenüberstellung von NFO und NML am Beispiel eines kleine Railtypes NewGRF angehängt. Einer der m.M.n. angenehmen Änderungen ist, dass NML erlaubt beliebige Bilddateien zu lesen (vorausgesetzt sie sind in 8bpp und der korrekten Palette und von der Python Image Library unterstützt). PNG bevorzuge ich persönlich, da Browser sie auch anzeigen können.

Das grf wird mit einem einfachen Kommandozeilen-Aufruf erzeugt:
Code:
nml2nfo --nfo swedishrails.nfo --grf swedishrails.grf swedishrails.nml
Die Erzeugung des NFO kann natürlich ausgelassen werden, da das grf direkt geschrieben wird; der NFO - Output dient eigentlich nur dem Vergleich für die Entwickler Lächeln

Was braucht man? Wo kriegt man's her?
Man braucht Python 2.5 ... < 3.0 und eine Reihe Module, insbes. die Python Image Library und Python lz77 sowie natürlich NML selbst.

Die neueste Version von NML gibt's hier und die Dokumentation findet sich hier welche leider aber noch sehr unvollständig ist.

Viele (die meisten?) wichtigen NewGRF - Features sind bereits implementiert in NML, aber hier und dort gibt's noch ein paar fehlende Punkte. Diese werden jedoch laufend weniger. Und wenn etwas bestimmtes fehlt, so kann man die Entwickler ansprechen, die dann diesen Wunsch ggf. relativ zügig umsetzen. Feedback, Kommentare, Feature-Requests und Fehlerberichte sind immer willkommen. Siehe auch unserenBug tracker.


Schließen möchte ich mit einem kleinen Vergleich zwischen traditioneller NFO - Programmierung mit der NML - Programmierung vorstellen. In den letzten Tagen habe ich am SwedishRails Set gearbeitet, welches ich in NML schreibe. Zuerst zeige ich den NFO - Code, im Anschluß das gleiche in NML. Teile, die nur bereits gesagtes wiederholen werde ich im gezeigten Sourcecode auslassen. Zwei vollständig in NML programmierte NewGRFs sind
OpenGFX+ und SwedishRails, insbes. in OpenGFX+ finden sich auch Beispiele für Fahrzeuge.

NFO
Zuerst definieren wir das NewGRF:
Code:
// Automatically generated by GRFCODEC. Do not modify!
// (Info version 7)
// Escapes: 2+ = 71 = D= = DR 2- = 70 = D+ = DF 2< = 7= = D- = DC 2> = 7! = Du* = DM 2u< = 7< = D* = DnF 2u> = 7> = Du<< = DnC
2/ = 7G = D<< = DO 2% = 7g = D& 2u/ = 7gG = D| 2u% = 7GG = Du/ 2* = 7gg = D/ 2& = 7c = Du% 2| = 7C = D% 2^ 2sto = 2s 2rst = 2r 2+
2ror = 2rot
// Format: spritenum pcxfile xpos ypos compression ysize xsize xrel yrel

0 * 4 \d416
1 * 92 08 07 "SER0" "ÞSwedish Rails  nightly-r52M" 00 "ÞSwedish rails are a replacement for the default rails" 00

Dann definieren wir die standard Schienen um und definieren sie kompatibel zu elektrifizierten Schienen. Wir weisen diesen Schienen neue Grafiken für Schienen, deren Unterbau, Tunnel und Depots zu. Da nur OpenTTD Railtypes unterstützt, tun wir dies nur, wenn dieses NewGRF unter OpenTTD läuft:
Code:
412 * 9 07 9D 04 \7! \dx00000001 04

413 * 18 00 10 \b2 01 FF \wx000A
08 "RAIL"
0E \b1 "ELRL"

414 * 22 03 10 01 0A \b5
01 \wx00FB
02 \wx00FC
07 \wx00FD
03 \wx00F8
08 \wx00FA
\wx00FE

Wir nutzen var40 um zu unterscheiden, ob wir schneebedeckte Grafiken verwenden oder normale:
Code:
383 * 6 01 10 \b1 FF \wx0004

384 src/gfx/tunnel_track_normal.png 75 0 01 31 64 -31 0
385 src/gfx/tunnel_track_normal.png 0 0 01 31 64 -31 0
386 src/gfx/tunnel_track_normal.png 75 50 01 31 64 -31 0
387 src/gfx/tunnel_track_normal.png 0 50 01 31 64 -31 0

388 * 7 02 10 FA \b1 \b0
\w0

389 * 6 01 10 \b1 FF \wx0004

390 src/gfx/tunnel_track_snow.png 75 0 01 31 64 -31 0
391 src/gfx/tunnel_track_snow.png 0 0 01 31 64 -31 0
392 src/gfx/tunnel_track_snow.png 75 50 01 31 64 -31 0
393 src/gfx/tunnel_track_snow.png 0 50 01 31 64 -31 0

394 * 7 02 10 F9 \b1 \b0
\w0

395 * 23 02 10 F8 89
40 00 \dx000000FF \b1
\wx00F9 \dx00000004 \dx00000004
\wx00FA

Wir liefern neue Grafiken für Tunnelportale im gemäßigten Klima - aber nur wenn TTDPatch läuft oder per NewGRF-Parameter nach gefragt wird:
Code:
2 * 9 0D 40 \D- 9D FF \dx00000000
3 * 5 0D 40 \D/ 40 40
4 * 9 0D 40 \D- FF 40 \dx00000001

5 * 5 0D 0A \D| 40 00
6 * 9 0D 41 \D- 83 FF \dx00000000
7 * 5 0D 41 \D/ 41 41
8 * 9 0D 41 \D- FF 41 \dx00000001
9 * 9 0D 42 \D- 0A FF \dx00000001
10 * 5 0D 42 \D/ 42 42
11 * 9 0D 42 \D- FF 42 \dx00000001
12 * 5 0D 40 \D& 41 42
13 * 9 07 40 04 \7= \dx00000000 11

48 * 5 0A \b1 \b8 \wx093D
49 src/gfx/temperate_rails_TTD.png 4 6 01 33 33 -31 -2
50 src/gfx/temperate_rails_TTD.png 52 6 01 38 40 -7 -38
51 src/gfx/temperate_rails_TTD.png 95 6 01 19 27 -31 2
52 src/gfx/temperate_rails_TTD.png 129 6 01 23 42 -9 -30
53 src/gfx/temperate_rails_TTD.png 177 6 01 18 25 8 3
54 src/gfx/temperate_rails_TTD.png 209 6 01 23 43 -31 -30
55 src/gfx/temperate_rails_TTD.png 258 6 01 33 33 0 -2
56 src/gfx/temperate_rails_TTD.png 295 6 01 38 40 -31 -38

109 * 2 10 11

Und nun das ganze in NML:
Code:
grf {
grfid : "SER0";
name : string(STR_GRF_NAME);
desc : string(STR_GRF_DESCRIPTION);
}
und in der Sprach-Datei, welche der OpenTTD-Konvention für Sprachdateien folgt:
Code:
lang: 7F
STR_GRF_NAME                                                    :Swedish Rails {VERSION}
STR_GRF_DESCRIPTION                                             :Swedish rails are a replacement for the default rails

Railtypes nur für OpenTTD definieren:
Code:
if (ttd_platform == PLATFORM_OPENTTD) {

item(FEAT_RAILTYPES, rail, 0x0A) {
  property {
   label: "RAIL";
   compatible_railtype_list: ["ELRL"];
   // We don't want to change rail properties. Just provide new graphics
  }
  graphics {
   TRACKOVERLAY: ground_switch_overlay;
   UNDERLAY: ground_switch_underlay;
   LEVEL_CROSSINGS: level_crossing_group;
   TUNNELS: tunnel_switch;
   DEPOTS: depot_normal_rail_group;
   track_overlay_group; // irrelevant, we just need one set here
  }
}
} // of OpenTTD only
Normale und verschneite Gleise für Tunnel definieren. Wir nutzen die gleichen Alignment-Informationen für beide Grafiken, da wir sie in identischen Dateien gespeichert haben:
Code:
template tmpl_tunnel_tracks() {
[ 75, 0, 64,31, -31, 0]
[ 0, 0, 64,31, -31, 0]
[ 75, 50, 64,31, -31, 0]
[ 0, 50, 64,31, -31, 0]
}

spriteblock(FEAT_RAILTYPES) {
spriteset(tunnel_overlay, "src/gfx/tunnel_track_normal.png") {
  tmpl_tunnel_tracks()
}
spritegroup tunnel_group {
  default: tunnel_overlay;
}
}
spriteblock(FEAT_RAILTYPES) {
spriteset(tunnel_overlay_snow, "src/gfx/tunnel_track_snow.png") {
  tmpl_tunnel_tracks()
}
spritegroup tunnel_snow_group {
  default: tunnel_overlay_snow;
}
}
switch(FEAT_RAILTYPES, SELF, tunnel_switch, terrain_type) {
TILETYPE_SNOW: tunnel_snow_group;
tunnel_group;
}

Ersetzen der Tunnelportale im gemäßigten Klima für TTDPatch oder wenn per Parameter erwünscht. Wiederum nutzen wir die Alignment-Informationen für die Tunnelsprites, um sie auch für andere Klimata zu nutzen - nur verschoben um einen konstanten Offset in vertikaler Richtung:
Code:
template tmpl_tunnel(y) {
[ 4, 6, 33,33, -31, -2]
[ 52, 6, 40,38, -7,-38]

[ 95, 6, 27,19, -31, 2]
[129, 6, 42,23, -9,-30]

[177, 6, 25,18, 8, 3]
[209, 6, 43,23, -31,-30]

[258, 6, 33,33, -0, -2]
[295, 6, 40,38, -31,-38]
}

param[10] = (ttd_platform == PLATFORM_TTDPATCH) | (param[0]); // Use TTD ground sprites

if (((climate == CLIMATE_ARCTIC) | (climate == CLIMATE_TEMPERATE)) & (param[10] == 1)) {

// Standard temperate rail sprites
replace (1037, "src/gfx/snow_rails_TTD.png") {
  tmpl_ttd_ground(358)
}

// Replacement of standard rail tunnels in temperate
replace (2397, "src/gfx/snow_rails_TTD.png") {
  tmpl_tunnel(6)
}
} // snow for arctic + temperate TTD mode

[Bild: 4q27gcl]
Schreib Deine eigenen NewGRFs, KIs oder Skripte. Siehe dazu DevZone, NML und Tutorien
17.06.2010 20:29
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Timmaexx
Schienenklopper
*****

Beiträge: 1.565
Registriert seit: Jan 2008
Beitrag #2
RE: NML - NewGRF Meta Language
Gab es nicht mal einen ähnlichen Versuch von Michael B.?

http://www.tt-ms.de/forum/showthread.php?tid=4327
17.06.2010 21:05
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Eddi
Tycoon
*****

Beiträge: 4.066
Registriert seit: Aug 2008
Beitrag #3
RE: NML - NewGRF Meta Language
Versuche gibts jede Menge...
17.06.2010 21:56
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
pETe!
Forum-Team
*****

Beiträge: 3.910
Registriert seit: Jan 2004
Beitrag #4
RE: NML - NewGRF Meta Language
(17.06.2010 21:05)Timmaexx schrieb:  Gab es nicht mal einen ähnlichen Versuch von Michael B.?

http://www.tt-ms.de/forum/showthread.php?tid=4327
Michael wollte explizit keine Hochsprache für nfo/grf-Programmierung entwerfen, und sein Ansatz erfordert weiterhin Kenntnisse in von der Ur"Sprache". Der Ansatz von Michael ist, in meinen Augen und sofern ich das richtig verstanden habe, eher als eine Arbeitserleichterung für den Programmierer, und nicht als Erleichterung für den Einsteiger gedacht (auch wenn es dafür geeignet sein mag). Wenn ich das falsch ist, bitte ich um Korrektur.
18.06.2010 13:07
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Bernhard
Forum-Team
*****

Beiträge: 9.369
Registriert seit: Jan 2004
Beitrag #5
RE: NML - NewGRF Meta Language
für mich sieht das alles nicht wirklich leichter aus als die gute alte nfo-Programmierung ...

"Das Böse triumphiert alleine dadurch, daß gute Menschen nichts unternehmen!" Edward Burke, 1729-1797

"Wir leben alle unter dem gleichen Himmel, aber wir haben nicht alle den gleichen Horizont!" Konrad Adenauer, 1876-1976 Zwinkern
21.06.2010 07:47
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Eddi
Tycoon
*****

Beiträge: 4.066
Registriert seit: Aug 2008
Beitrag #6
RE: NML - NewGRF Meta Language
Es geht nicht darum, Dinge "leicht" zu machen. Programmieren wird immer schwer bleiben.

Es geht bei Hochsprachen vor allem um zwei Dinge:
  1. Das lesen von fremdem Code, oder eigenem Code nach mehr als einem halben Jahr, zu vereinfachen, indem die syntaktischen Elemente klare und aussagekräftige Namen bekommen, ohne jedes einzelne NFO-Byte mit einem Kommentar versehen zu müssen. Insbesondere bezieht sich das auf die Action 0, wo man für jede Property der Reihe nach erstens ihren Sinn und zweitens ihre Bitbreite nachschlagen muß, um zu verstehen, welche Werte da nu gerade gesetzt werden.
  2. Das schreiben von Code, bei dem häufig wiederkehrende Muster auftreten, zu vereinfachen, indem man es unterstützt, Konzepte durch Wiederverwendung aufzugreifen, ohne den Code duplizieren zu müssen. (-> Funktionale Abstraktion, Templates, usw.)
21.06.2010 08:58
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Bernhard
Forum-Team
*****

Beiträge: 9.369
Registriert seit: Jan 2004
Beitrag #7
RE: NML - NewGRF Meta Language
wenn ich mir den Code diverser Sets ansehe, stelle ich eher fest, dass die Programmierer eher versucht haben, den Code (gerade für andere) so schwer wie möglich lesbar zu machen...

"Das Böse triumphiert alleine dadurch, daß gute Menschen nichts unternehmen!" Edward Burke, 1729-1797

"Wir leben alle unter dem gleichen Himmel, aber wir haben nicht alle den gleichen Horizont!" Konrad Adenauer, 1876-1976 Zwinkern
21.06.2010 11:27
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
planetmaker
Tycoon
*****

Beiträge: 1.309
Registriert seit: Oct 2008
Beitrag #8
RE: NML - NewGRF Meta Language
(21.06.2010 11:27)Bernhard schrieb:  wenn ich mir den Code diverser Sets ansehe, stelle ich eher fest, dass die Programmierer eher versucht haben, den Code (gerade für andere) so schwer wie möglich lesbar zu machen...

Nö, sicher nicht. Dass man auf den ersten Blick, gerade ohne NewGRF-Programmier-Erfahrung bei fortgeschrittenen Projekten nicht alles auf einmal und sofort erfassen kann ist vollkommen normal; das wird auch schon kein Programmierer machen, weil er sich sonst selbst dauernd ein Bein stellen wird. Weiß ich denn noch, was ich vor 3 oder 6 Monaten mir bei was-auch-immer im Detail gedacht habe? Eher nicht. Ich weiß i.A. nur im Detail die generellen Prinzipien und Coding-Style - Regeln meines Projekts und die Dinge mit denen ich mich in letzter Zeit beschäftigt habe; beim Rest muß auch ich wieder nachgucken und das wird den meisten anderen ebenso gehen.

Der Gebrauch von Templates macht den Einstieg etwas schwieriger - aber für erfahrenere Leute spart es VIEL Arbeit, und damit auch fehlerträchtige Wiederholungen. Solches Arbeiten unterstelle ich in verschiedener Ausprägung einfach 'mal allen Programmierern der größeren NewGRF-Sets.

[Bild: 4q27gcl]
Schreib Deine eigenen NewGRFs, KIs oder Skripte. Siehe dazu DevZone, NML und Tutorien
(Dieser Beitrag wurde zuletzt bearbeitet: 21.06.2010 12:01 von planetmaker.)
21.06.2010 12:00
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
officercrockey
Geschäftsführer
***

Beiträge: 821
Registriert seit: Aug 2010
Beitrag #9
RE: NML - NewGRF Meta Language
Könnte mir vielleicht jemand kurz erklären, was ich mit der property "bitmask_vehicle_info" und der gleichnamigen Variable sowie Callbacks anfangen kann? Alle anderen leuchten mir irgendwie ein. Aber hier weiß ich nicht wie man sie verwendet und für was sie gut ist...
(Dieser Beitrag wurde zuletzt bearbeitet: 23.08.2011 18:59 von officercrockey.)
23.08.2011 18:59
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
planetmaker
Tycoon
*****

Beiträge: 1.309
Registriert seit: Oct 2008
Beitrag #10
RE: NML - NewGRF Meta Language
(23.08.2011 18:59)officercrockey schrieb:  Könnte mir vielleicht jemand kurz erklären, was ich mit der property "bitmask_vehicle_info" und der gleichnamigen Variable sowie Callbacks anfangen kann? Alle anderen leuchten mir irgendwie ein. Aber hier weiß ich nicht wie man sie verwendet und für was sie gut ist...

bitmask_vehicle_info erlaubt es Dir einzelnen Fahrzeugen oder Fahrzeugtypen ein bestimmtes Bit(muster) zuzuweisen. Dann kannst Du bzgl. der Darstellung des gesamten Zuges damit bspw. einfach auf eine bestimmte Eigenschaft testen, indem Du das Bit abfragst, welches von all diesen Fahrzeugen der entsprechenden Klasse gesetzt ist. Häufig braucht man das nicht, sondern nur wenn man fortgeschrittene Magie mit dem Anhängen und Aussehen in Abhängigkeit von der An- bzw. Abwesenheit einiger Fahrzeugtypen im Zug machen will.

Callbacks... erlauben die entsprechenden Werte anzupassen, wenn der entsprechende Callback aufgerufen wird (bspw. in der Verkaufsvorschau oder beim Ändern des Railtypes, beim Refit im Depot, etc - verschiedene Callbacks haben verschiedene Trigger, die sie aufrufen).

[Bild: 4q27gcl]
Schreib Deine eigenen NewGRFs, KIs oder Skripte. Siehe dazu DevZone, NML und Tutorien
24.08.2011 11:33
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
officercrockey
Geschäftsführer
***

Beiträge: 821
Registriert seit: Aug 2010
Beitrag #11
RE: NML - NewGRF Meta Language
Vielen Dank. Dann ist es ja in etwa so, wie ich es gedacht hatte. Jetzt blicke ich nur noch nicht so ganz, wie ich das dann einsetze.

Mal an einem Beispiel:

Nehmen wir mal die BR101, die IC-Waggons und den dazugehörigen Steuerwagen. Im Moment habe ich das so, dass wenn die BR101 den IC-Steuerwagen erkennt, dass sie automatisch auf Wendebetrieb umstellt:

Code:
switch(FEAT_TRAINS,SELF,sw_br101_graphics,count_veh_id(stwic) > 0){
    1: sw_br101_gr_wendezug;
    gr_br101;
    }

Das geht gut, solange jeder den Steuerwagen auch ans Ende setzt. Sollte irgendjemand (Warum auch immer...) den Steuerwagen nicht ans Ende setzen, kommen schräge Dinge dabei raus.

Also ist dieses bitmask_vehicle_info eine Möglichkeit die BR101 nur auf Wendezugbetrieb umzustellen, wenn der IC-Steuerwagen am Ende des Zuges ist? Und wenn ja WIE?
24.08.2011 12:36
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Eddi
Tycoon
*****

Beiträge: 4.066
Registriert seit: Aug 2008
Beitrag #12
RE: NML - NewGRF Meta Language
Ich würde eher versuchen, das "Waggon anhängen" Callback so zu modifizieren, daß du den Steuerwagen nur ans Ende hängen kannst, und dahinter keine weiteren Waggons anhängen kannst.

Ansonsten kannst du mal schauen, ob eine von diesen (experimentellen) Variablen hilfreich wären: http://www.tt-forums.net/viewtopic.php?f=68&t=51697
24.08.2011 13:09
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
officercrockey
Geschäftsführer
***

Beiträge: 821
Registriert seit: Aug 2010
Beitrag #13
RE: NML - NewGRF Meta Language
Für Waggons funktioniert dieser Callback ja nicht, richtig? Da kann ich trotzdem immer alles dranhängen. Also kann ich es ja höchstens so machen, dass sobald ein Steuerwagen angehängt wird, Schluss ist mit anderen Waggons. Ließen sich eben nicht so einfach neue Waggons "dazwischenschieben"

Danke für den Link. Schau ich später mal rein...
24.08.2011 13:40
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
mb
Tycoon
*****

Beiträge: 5.054
Registriert seit: Mar 2005
Beitrag #14
RE: NML - NewGRF Meta Language
officercrockey schrieb:Das geht gut, solange jeder den Steuerwagen auch ans Ende setzt. Sollte irgendjemand (Warum auch immer...) den Steuerwagen nicht ans Ende setzen, kommen schräge Dinge dabei raus.

So ist es.

"Wendezüge" sind ein wenig komplizierter, und "vollständig" mit verantwortbarem Aufwand überhaupt nicht zu implementieren. Dazu müsste nämlich jeder Wagen zB auch auf seine aktuelle Farbgebung (also möglicherweise auf sein Alter) überprüft werden damit die Wagen beim "wenden" nicht "springen". Das müsste irgendwann mal richtig im Spiel implementiert werden, anstatt mit newGRFs herumzuspielen.

officercrockey schrieb:Also ist dieses bitmask_vehicle_info eine Möglichkeit die BR101 nur auf Wendezugbetrieb umzustellen, wenn der IC-Steuerwagen am Ende des Zuges ist? Und wenn ja WIE?

Indem man die jeweils gesetzten bits von Lok und letztem Wagen abfragt und entsprechend handelt (zB sprites von Lok und Wagen vertauscht, Effekte umschaltet, etc). Dazu bräuchtest du aber erst einmal ein Konzept, was du überhaupt machen möchtest (also welche Wagen zB in Wendezügen überhaupt erlaubt sind, etc).

Ich habe zB für Steuerwagen ein bestimmtes bit vorgesehen, sodass ich leicht überprüfen kann ob der letzte Wagen ein STW ist (UB_STW, s.u.), und dann entsprechende Massnahmen ergreifen kann, s. Eddis Beitrag bzgl CB 1D http://www.ttdpatch.de/grfspecs/Callback...d+%281D%29 (bzw CB_ATAC).

Also so:

Code:
// ------------- DBXL user bits ------------
define(UB_F,0x01) // Fernverkehrswagen
define(UB_N,0x02) // Nahverkehrswagen
define(UB_STW,0x04) // aktiver Steuerwagen
define(UB_FPP,0x08) // Fernverkehrswagen wendezugtauglich
define(UB_NPP,0x10) // Nahverkehrswagen wendezugtauglich
define(UB_MU,0x20) // multiple unit
define(UB_DBXL,0x40) // DBXL vehicle
define(UB_FSWITCH,0x80) // toggle fern: je nachdem (zB IC | LHE)
define(UB_NSWITCH,0x80) // toggle nah: je nachdem (zB <generic> | S-Bahn)
define(UB_ALL,0xFF) // alle bits gesetzt

Ich hab´ das hier vor Jahren mal anhand eines Beispiels in nfo gezeigt (SuFu?), und könnte dir auch ein code-Schnipsel in m4nfo zeigen, aber das wird dir vermutlich nicht wirklich helfen.

Gruß
Michael

Zitat:EU-Wirtschaft- und Währungskommissar Joaquin Almunia hat alle Besorgnisse über den Schuldnerstatus Griechenlands als unbegründet zurückgewiesen.
24.08.2011 15:53
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
planetmaker
Tycoon
*****

Beiträge: 1.309
Registriert seit: Oct 2008
Beitrag #15
RE: NML - NewGRF Meta Language
(24.08.2011 12:36)officercrockey schrieb:  Vielen Dank. Dann ist es ja in etwa so, wie ich es gedacht hatte. Jetzt blicke ich nur noch nicht so ganz, wie ich das dann einsetze.

Mal an einem Beispiel:

Nehmen wir mal die BR101, die IC-Waggons und den dazugehörigen Steuerwagen. Im Moment habe ich das so, dass wenn die BR101 den IC-Steuerwagen erkennt, dass sie automatisch auf Wendebetrieb umstellt:

Code:
switch(FEAT_TRAINS,SELF,sw_br101_graphics,count_veh_id(stwic) > 0){
    1: sw_br101_gr_wendezug;
    gr_br101;
    }

Das geht gut, solange jeder den Steuerwagen auch ans Ende setzt. Sollte irgendjemand (Warum auch immer...) den Steuerwagen nicht ans Ende setzen, kommen schräge Dinge dabei raus.

Also ist dieses bitmask_vehicle_info eine Möglichkeit die BR101 nur auf Wendezugbetrieb umzustellen, wenn der IC-Steuerwagen am Ende des Zuges ist? Und wenn ja WIE?

Wie Eddi schon andeutete ist der can_attach_wagon - Callback hier sicher sehr hilfreich mit dem Du dann das Anhängen weiterer Fahrzeuge verhindern kannst, wenn ein Steuerwagen angehängt wurde. Ggf. kann auch die Variable position_in_consist_from_end hilfreich sein.

[Bild: 4q27gcl]
Schreib Deine eigenen NewGRFs, KIs oder Skripte. Siehe dazu DevZone, NML und Tutorien
24.08.2011 18:05
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
officercrockey
Geschäftsführer
***

Beiträge: 821
Registriert seit: Aug 2010
Beitrag #16
RE: NML - NewGRF Meta Language
Also bei mir sieht das jetzt so aus:

Code:
switch(FEAT_TRAINS,SELF,sw_br146_wa_all,count_veh_id(stw) == 1){
    1: string(STR_146_ATTACH_WAGON);
    CB_RESULT_ATTACH_ALLOW;
    }
switch(FEAT_TRAINS,SELF,sw_br146_wa_stw,count_veh_id(stw) == 2){
    1: string(STR_146_ATTACH_WAGON);
    CB_RESULT_ATTACH_ALLOW;
    }
switch(FEAT_TRAINS,SELF,sw_br146_wagon_attach,vehicle_type_id){
    stw: sw_br146_wa_stw;
    sw_br146_wa_all;
        }

Also gedacht ist das so, dass es beim Anhängen überprüft, ob es der Doppelstocksteuerwagen ist oder etwas anderes. Ist es der DoStostw, geht das nur, wenn nicht schon einer vorhanden ist. Dasselbe im Prinzip bei den anderen Waggons.

Trotzdem kann ich aber munter alles anhängen. Wo mache ich den Fehler?

Zu den bits: Da wäre es in der Tat gut, wenn ich mal ein kleines Beispiel hätte, wie sowas aussieht. Das Beispiel von mb habe ich zwar gesucht, aber nur einen weiteren Verweis darauf (~2006) gefunden. Dein Beitrag an sich aber nicht...
25.08.2011 10:05
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
mb
Tycoon
*****

Beiträge: 5.054
Registriert seit: Mar 2005
Beitrag #17
RE: NML - NewGRF Meta Language
officercrockey schrieb:Zu den bits: Da wäre es in der Tat gut, wenn ich mal ein kleines Beispiel hätte, wie sowas aussieht. Das Beispiel von mb habe ich zwar gesucht, aber nur einen weiteren Verweis darauf (~2006) gefunden. Dein Beitrag an sich aber nicht...

Tja, die Sufu ...


Also, ich stelle gerade fest dass ich CB 1D (can wagon be attached) dafür überhaupt nicht nutze, warum nicht fällt mir gerade nicht ein, aber es gab dafür bestimmt Gründe ...

Stattdessen überprüfe ich die Konfiguration des Zugs auf "Wendezugkompatibilität" anhand der gesetzten bits und benutze dann CB 31 (start/stop check). Damit verhindere ich das Ausfahren falsch zusammengestellter Züge aus dem Depot, bzw verhindere zumindest dass sie als Wendezüge benutzt werden können (stattdessen fahren sie dann "normal")..

Der Kern des Problems ist aber in jedem Fall (egal welcher CB nun genutzt wird) die Evaluierung der in der "user bit mask" gesetzten bits:

Code:
//------------------------------------------------------------------
// prop25 bit flags:
//
//      val     type
//      01      Fernverkehr
//      02      Nahverkehr
//      04      StW aktiv
//      08      Fernverkehr wendezugfähig
//      10      Nahverkehr wendezugfähig
//      20      n/a
//      40      n/a
//      80      S-Bahn flag
//
//      00 .. 03   = n/a
//      04       = StW aktiv
//      05 .. 07   = F: keine wendezugfähigen Wagen
//      08 .. 0B   = n/a
//      0C      = StW + 08
//      0D .. 0F   = F: enthält (auch) nicht-wendezugfähige Wagen
//      10 .. 13   = n/a
//      14      = StW + 10
//      15 .. 17   = F: enthält (auch) nicht-wendezugfähige Wagen
//      18 .. 1B   = n/a
//      1C .. 1F   = F: StW + 08 + 10 (+08) -> nicht erlaubte Mischung
//
//------------------------------------------------------------------

Diese bit-Muster werden dann geprüft und bei Vorliegen falscher Muster werden entsprechende Fehlermeldungen ausgegeben. Ich denke dass dies leicht zu verstehen ist, m4nfo verzichtet lediglich auf die redundanten Schlüsselwörter (feature, self, switch, ..) und beschränkt sich auf den Aufruf der Funktion "ubitsetrel()" die die user bit Masken aller im Zug enthaltenen Fz abfragt und die entsprechenden Fehlermeldungen ausgibt:

Code:
// start-stop check: allow only if correct types of coaches
def(21) ubitsetrel(UB_ALL-UB_NSWITCH,   // S-Bahn ausgeblendet
         attach(PP_OK) if(0 .. 3)       // normal, allow
         attach(PP_REQPPCAR) if(5 .. 7) // "Wendezugfähige Wagen erforderlich"
         attach(PP_OK) if(8 .. 11)      // normal, allow
         attach(PP_BADSET) if(12 .. 15) // "enthält nicht-wendezugfähige Wagen"
         attach(PP_OK) if(16 .. 19)     // normal, allow
         attach(PP_BADSET) if(21 .. 23) // D029
         attach(PP_OK) if(24 .. 27)     // normal, allow
         attach(PP_LDSDSET) if(28)      // "enthält N und F Wagen"
         attach(PP_BADSET) if(29 .. 31) // D029
         ref(20) else            // möglicher Wendezug: all passenger?
)

[...]

// CBs
def(22) callback(
         ref(21) if(CB_STOP) // start/stop check
         ref(23) if(CB_ARTI) // articulated    
         ref(3) else         // Grafik
)

makevehicle(_BR141,
    link(ref(10), MENU)
    default(ref(22))
    override(_PLOCALLONG, ref(X_SBAHN)) // switch S-Bahn | generic
    override(_STWDOSTO, ref(19))        // StW Dosto, bzw ..
    override(_STWLOCAL, ref(19))        // .. StW normal, je nachdem
)

Also, vielleicht auch mal mit CB31 versuchen?

HTH
Gruß
Michael

Zitat:EU-Wirtschaft- und Währungskommissar Joaquin Almunia hat alle Besorgnisse über den Schuldnerstatus Griechenlands als unbegründet zurückgewiesen.
25.08.2011 10:59
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
planetmaker
Tycoon
*****

Beiträge: 1.309
Registriert seit: Oct 2008
Beitrag #18
RE: NML - NewGRF Meta Language
(25.08.2011 10:05)officercrockey schrieb:  Also bei mir sieht das jetzt so aus:
(...)
Ich empfehle, 'mal einen Blick auf das Zug-Beispiel zu werfen, welches neueren NML-Versionen seit einigen Wochen beiliegt; das führt u.A. die Benutzung des Callbacks für 'articulated vehicles' vor - und nutzt die elegantere Variante, die Callbacks via graphics block zu definieren. Ich habe 'mal was zusammengeschrieben, was nur einen Steuerwagen pro Zug erlauben sollte in der Annahme, dass Bit 2 von bitmask_vehicle_info vom Steuerwagen ausschließlich gesetzt wird (siehe Property unten):

Code:
/* Überprüfen, ob Dosto angehängt werden kann */
switch (FEAT_TRAINS, PARENT, check_vehicle, vehicle_type_id) {
    steuerwagen: CB_RESULT_ATTACH_ALLOW; // we already have one of these
    dosto_w:     CB_RESULT_ATTACH_ALLOW; // können wir immer anhängen (alternativ: hier zu 'nem Switch verlinken,
                                         // der Bedingungen für diesen prüft
    CB_RESULT_ATTACH_DISALLOW;           // alle anderen Wagen können nicht angehängt werden
}

/* Überprüfen, ob Steuerwagen angehängt werden kann - nur einer möglich pro Zug */
switch (FEAT_TRAINS, PARENT, pruefe_steuerwagen, bitmask_vehicle_info & bitmask(2)) {
    0: vehicle_type_switch; // bit is not set. We can allow attachment
    CB_RESULT_ATTACH_DISALLOW; // bit is set, we already have one of these
}


item (FEAT_TRAINS, dosto_w) {
    property {
        bitmask_vehicle_info: bitmask(1);
    }
    graphics {
        can_attach_wagon: pruefe_steuerwagen;
    }
}

item (FEAT_TRAINS, my_engine) {
    property {
    }
    graphics {
        can_attach_wagon: pruefe_steuerwagen;
    }
}

item (FEAT_TRAINS, steuerwagen) {
    property {
        bitmask_vehicle_info: bitmask(2);
    }
    graphics {
        can_attach_wagon: pruefe_steuerwagen;
    }
}
Ich habe das Beispiel jetzt nicht geprüft im Sinne von "funkioniert kompiliert so", aber die Idee wie man eine Überprüfung auf bestimmte Wagon in NML implementieren kann, sollte hierdurch ersichtlich werden können.

Das Vorhandensein des n-ten Bits in bitmask_vehicle_info kann man mittels "(bitmask_vehicle_info & bitmask(n)) > 0" im Argument des Switch-Blocks überprüfen, bzw. man testet, ob das 0 ist wie im obigen Beispiel

Zitat:Das Beispiel von mb...
... hat leider mit NML ausgesprochen wenig zu tun und hier im NML-Thread ist es "ganz leicht" fehl am Platz.

[Bild: 4q27gcl]
Schreib Deine eigenen NewGRFs, KIs oder Skripte. Siehe dazu DevZone, NML und Tutorien
25.08.2011 16:02
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
mb
Tycoon
*****

Beiträge: 5.054
Registriert seit: Mar 2005
Beitrag #19
RE: NML - NewGRF Meta Language
planetmaker schrieb:
officercrockey schrieb:Das Beispiel von mb...
... hat leider mit NML ausgesprochen wenig zu tun und hier im NML-Thread ist es "ganz leicht" fehl am Platz.

Es wird ja wohl noch erlaubt sein auch die allgemeineren Fragen zu beantworten, besonders wenn sich herausstellt dass ihre Beantwortung sehr wohl mit der ursprünglichen Frage zu tun hat.

Gruß
Michael

Zitat:EU-Wirtschaft- und Währungskommissar Joaquin Almunia hat alle Besorgnisse über den Schuldnerstatus Griechenlands als unbegründet zurückgewiesen.
25.08.2011 16:23
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
officercrockey
Geschäftsführer
***

Beiträge: 821
Registriert seit: Aug 2010
Beitrag #20
RE: NML - NewGRF Meta Language
Vielen Dank euch beiden. Werde mir das am Wochenende mal vertiefter anschauen.
25.08.2011 19:42
Alle Beiträge dieses Benutzers finden Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


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