Code: Select all
/* Define grf */
grf {
grfid: "CS\06\01";
name: string(STR_GRF_NAME);
desc: string(STR_GRF_DESC);
version: 1;
min_compatible_version: 1;
}
/* Define a rail type table, this allows referring to railtypes irrespective of the grfs loaded. */
railtypetable {
RAIL, ELRL, MONO, MGLV,
}
/* Templates */
template tmpl_vehicle_basic(x, y) {
// arguments x, y: coordinates of top-left corner of first sprite
[x, y, 8, 24, -3, -12] //xpos ypos xsize ysize xrel yrel
[x + 9, y, 22, 20, -14, -12]
[x + 32, y, 32, 16, -16, -12]
[x + 65, y, 22, 20, -6, -12]
}
template tmpl_vehicle_8_views(num, reversed) {
tmpl_vehicle_basic(reversed ? 89 : 1, 1 + 32 * num)
tmpl_vehicle_basic(reversed ? 1 : 89, 1 + 32 * num)
}
template tmpl_vehicle_single(num, xsize, ysize, xoff, yoff) {
[1, 1 + 32 * num, xsize, ysize, xoff, yoff]
}
/* Spritesets
* Abkürzungen:
* -> PO/PU = Pantograph oben/unten
* -> N/R = Normal/Reversed
* -> UL = Unlighted
* -> 5/7 = BR415/BR411
*/
spriteset (set_Front_PO_N, "gfx/icet.png") { tmpl_vehicle_8_views(0, 0) }
spriteset (set_Front_PO_R, "gfx/icet.png") { tmpl_vehicle_8_views(0, 1) }
spriteset (set_Front_PU_N, "gfx/icet.png") { tmpl_vehicle_8_views(1, 0) }
spriteset (set_Front_PU_R, "gfx/icet.png") { tmpl_vehicle_8_views(1, 1) }
spriteset (set_Rear_PO_N, "gfx/icet.png") { tmpl_vehicle_8_views(2, 1) }
spriteset (set_Rear_PO_R, "gfx/icet.png") { tmpl_vehicle_8_views(2, 0) }
spriteset (set_Rear_PU_N, "gfx/icet.png") { tmpl_vehicle_8_views(3, 1) }
spriteset (set_Rear_PU_R, "gfx/icet.png") { tmpl_vehicle_8_views(3, 0) }
spriteset (set_Front_PO_N_UL, "gfx/icet.png") { tmpl_vehicle_8_views(4, 0) }
spriteset (set_Front_PO_R_UL, "gfx/icet.png") { tmpl_vehicle_8_views(4, 1) }
spriteset (set_Front_PU_N_UL, "gfx/icet.png") { tmpl_vehicle_8_views(5, 0) }
spriteset (set_Front_PU_R_UL, "gfx/icet.png") { tmpl_vehicle_8_views(5, 1) }
spriteset (set_Rear_PO_N_UL, "gfx/icet.png") { tmpl_vehicle_8_views(4, 1) }
spriteset (set_Rear_PO_R_UL, "gfx/icet.png") { tmpl_vehicle_8_views(4, 0) }
spriteset (set_Rear_PU_N_UL, "gfx/icet.png") { tmpl_vehicle_8_views(5, 1) }
spriteset (set_Rear_PU_R_UL, "gfx/icet.png") { tmpl_vehicle_8_views(5, 0) }
spriteset (set_Restaurant_7_N,"gfx/icet.png") { tmpl_vehicle_8_views(6, 0) }
spriteset (set_Restaurant_7_R,"gfx/icet.png") { tmpl_vehicle_8_views(6, 1) }
spriteset (set_Restaurant_5_N,"gfx/icet.png") { tmpl_vehicle_8_views(7, 0) }
spriteset (set_Restaurant_5_R,"gfx/icet.png") { tmpl_vehicle_8_views(7, 1) }
spriteset (set_ErsteKlasse_N ,"gfx/icet.png") { tmpl_vehicle_8_views(8, 0) }
spriteset (set_ErsteKlasse_R ,"gfx/icet.png") { tmpl_vehicle_8_views(8, 1) }
spriteset (set_ZweiteKlasse_N,"gfx/icet.png") { tmpl_vehicle_8_views(9, 0) }
spriteset (set_ZweiteKlasse_R,"gfx/icet.png") { tmpl_vehicle_8_views(9, 1) }
spriteset (set_purchase_411, "gfx/icet.png") { tmpl_vehicle_single(10,76, 14, -38, -7) }
spriteset (set_purchase_415, "gfx/icet.png") { tmpl_vehicle_single(11,76, 14, -38, -7) }
spriteset (set_invisible, "gfx/icet.png") { tmpl_vehicle_single(12, 1, 1, 0, 0) }
/* --- Graphic Callback Beginn --- */
/* Überprüfen ob der Steuerwagen innerhalb der Traktion gekuppelt und ist ggf. die UL Grafik verwenden */
switch(FEAT_TRAINS, SELF, sw_Rear_PO_N, ((position_in_consist == 0) | (position_in_consist + 1 == num_vehs_in_consist))){
1: set_Rear_PO_N;
set_Rear_PO_N_UL;
}
switch(FEAT_TRAINS, SELF, sw_Rear_PU_N, ((position_in_consist == 0) | (position_in_consist + 1 == num_vehs_in_consist))){
1: set_Rear_PU_N;
set_Rear_PU_N_UL;
}
switch(FEAT_TRAINS, SELF, sw_Front_PO_N, ((position_in_consist == 0) | (position_in_consist + 1 == num_vehs_in_consist))){
1: set_Front_PO_N;
set_Front_PO_N_UL;
}
switch(FEAT_TRAINS, SELF, sw_Front_PU_N, ((position_in_consist == 0) | (position_in_consist + 1 == num_vehs_in_consist))){
1: set_Front_PU_N;
set_Front_PU_N_UL;
}
/* Switches die für Einzeltriebzüge und den mittleren Triebzug einer Dreifachtraktion den richtigen Stromabnehmer wählen, damit sozusagen immer der selbe oben ist */
switch(FEAT_TRAINS, PARENT, sw_Final_Direction_Rear_N_1, vehicle_is_reversed){
0: sw_Rear_PO_N;
default: sw_Rear_PU_N;
}
switch(FEAT_TRAINS, PARENT, sw_Final_Direction_Rear_N_2, vehicle_is_reversed){
0: sw_Rear_PU_N;
default: sw_Rear_PO_N;
}
switch(FEAT_TRAINS, PARENT, sw_Final_Direction_Front_N_1, vehicle_is_reversed){
0: sw_Front_PO_N;
default: sw_Front_PU_N;
}
switch(FEAT_TRAINS, PARENT, sw_Final_Direction_Front_N_2, vehicle_is_reversed){
0: sw_Front_PU_N;
default: sw_Front_PO_N;
}
/* Hier wird festgelegt welcher Stromabnehmer gewählt werden soll, die Idee ist dabei folgende:
* Bei einzelnen Triebzügen wird bei der Ausfahrt aus dem Depot der Stromabnehmer in Fahrtrichtung gewählt, unabhängig von der gewählten Wagenreihung
* Bei Doppeltraktionen werden immer die Stromabnehmer an des äußeren Ende des Gesamtzuges genutzt
* Bei Dreifachtraktion werden für den vorderen und hinteren Triebzug ebenfalls die Stromabnehmer an den äußeren Enden genutzt, für den mittleren Triebzug der bei der Ausfahrt aus Depot in Fahrtrichtung liegende Stromabnehmer ausgewählt
*
* Sobald der Zug das Depot verlassen hat findet kein Wechsel der Stromabnehmer mehr statt
*/
switch(FEAT_TRAINS, SELF, sw_Rear_N_1, position_in_consist) {
0: sw_Final_Direction_Rear_N_1;
4..6: sw_Final_Direction_Rear_N_2;
sw_Final_Direction_Rear_N_1;
}
switch(FEAT_TRAINS, SELF, sw_Rear_N_2, position_in_consist) {
0: sw_Rear_PO_N;
4..7: sw_Rear_PU_N;
set_Rear_PO_N;
}
switch(FEAT_TRAINS, SELF, sw_Rear_N_3, position_in_consist) {
0: sw_Rear_PO_N;
13: sw_Rear_PO_N;
5: sw_Final_Direction_Rear_N_1;
4: sw_Rear_PU_N;
10: sw_Rear_PU_N;
9: sw_Final_Direction_Rear_N_2;
sw_Rear_PO_N;
}
switch(FEAT_TRAINS, SELF, sw_Front_N_1, position_in_consist) {
0: sw_Final_Direction_Front_N_1;
4..6: sw_Final_Direction_Front_N_2;
sw_Final_Direction_Front_N_1;
}
switch(FEAT_TRAINS, SELF, sw_Front_N_2, position_in_consist) {
0: sw_Front_PO_N;
4..7: sw_Front_PU_N;
sw_Front_PO_N;
}
switch(FEAT_TRAINS, SELF, sw_Front_N_3, position_in_consist) {
0: sw_Front_PO_N;
13: sw_Front_PO_N;
5: sw_Final_Direction_Front_N_1;
4: sw_Front_PU_N;
10: sw_Front_PU_N;
9: sw_Final_Direction_Front_N_2;
sw_Front_PO_N;
}
switch(FEAT_TRAINS, PARENT, sw_Rear_N, num_vehs_in_consist) {
5..7: sw_Rear_N_1; /* 1 Triebzug */
10..14: sw_Rear_N_2; /* 2 Triebzüge */
15: sw_Rear_N_3; /* 3 Triebzüge */
sw_Rear_PO_N;
}
switch(FEAT_TRAINS, PARENT, sw_Front_N, num_vehs_in_consist) {
5..7: sw_Front_N_1; /* 1 Triebzug */
10..14: sw_Front_N_2; /* 2 Triebzüge */
15: sw_Front_N_3; /* 3 Triebzüge */
set_Front_PO_N; /* Verfahren wie für einen Triebzug */
}
/* Basiszuordnung für Einzeltriebzüge und identische Mehrfachtraktionen der Grafiken je Wagen entsprechend der beiden Baureihen */
switch(FEAT_TRAINS, SELF, sw_graphics_N_411, position_in_consist % 7) {
0: sw_Front_N;
1..3: set_ZweiteKlasse_N;
4: set_Restaurant_7_N;
5: set_ErsteKlasse_N;
6: sw_Rear_N;
set_invisible;
}
switch(FEAT_TRAINS, SELF, sw_graphics_R_411, position_in_consist % 7) {
6: sw_Rear_N;
3..5: set_ZweiteKlasse_R;
2: set_Restaurant_7_R;
1: set_ErsteKlasse_R;
0: sw_Front_N;
set_invisible;
}
switch(FEAT_TRAINS, SELF, sw_graphics_N_415, position_in_consist % 5) {
0: sw_Front_N;
1..2: set_ZweiteKlasse_N;
3: set_Restaurant_5_N;
4: sw_Rear_N;
set_invisible;
}
switch(FEAT_TRAINS, SELF, sw_graphics_R_415, position_in_consist % 5) {
4: sw_Rear_N;
2..3: set_ZweiteKlasse_R;
1: set_Restaurant_5_R;
0: sw_Front_N;
set_invisible;
}
switch(FEAT_TRAINS, SELF, sw_graphics_N, vehicle_type_id) {
item_BR411: sw_graphics_N_411;
item_BR415: sw_graphics_N_415;
set_invisible;
}
switch(FEAT_TRAINS, SELF, sw_graphics_R, vehicle_type_id) {
item_BR411: sw_graphics_R_411;
item_BR415: sw_graphics_R_415;
set_invisible;
}
/* Vorfinaler Check für die Steuerwagen und Finaler Check für die Mittelwagen ob der Zug zur Zeit Reversed ist */
switch(FEAT_TRAINS, PARENT, sw_direction_vehicle_W1, vehicle_is_reversed){
0: sw_graphics_N;
default: sw_graphics_R;
}
switch(FEAT_TRAINS, PARENT, sw_direction_vehicle_W2, vehicle_is_reversed){
0: sw_graphics_R;
default: sw_graphics_N;
}
/* Anwendung der verschiedenen möglichen Wagenreihungen bei Einzeltriebzügen oder Mehrfachtraktionen identischer Baureihen
* Bei Doppeltraktion werden -vorne- und -hinten- betrachtet
* Bei Dreifachtraktion der BR415 wird der switch -mitte- zusätzlich genutzt
*/
switch(FEAT_TRAINS, PARENT, sw_direction_base_vorne, cargo_subtype) {
0: sw_direction_vehicle_W1;
1: sw_direction_vehicle_W2;
2: sw_direction_vehicle_W1;
3: sw_direction_vehicle_W2;
4: sw_direction_vehicle_W1;
5: sw_direction_vehicle_W2;
6: sw_direction_vehicle_W1;
7: sw_direction_vehicle_W2;
sw_direction_vehicle_W1;
}
switch(FEAT_TRAINS, PARENT, sw_direction_base_mitte, cargo_subtype) {
0: sw_direction_vehicle_W1;
1: sw_direction_vehicle_W2;
2: sw_direction_vehicle_W2;
3: sw_direction_vehicle_W1;
4: sw_direction_vehicle_W2;
5: sw_direction_vehicle_W1;
6: sw_direction_vehicle_W1;
7: sw_direction_vehicle_W2;
sw_direction_vehicle_W1;
}
switch(FEAT_TRAINS, PARENT, sw_direction_base_hinten, cargo_subtype) {
0: sw_direction_vehicle_W1;
1: sw_direction_vehicle_W2;
2: sw_direction_vehicle_W2;
3: sw_direction_vehicle_W1;
4: sw_direction_vehicle_W1;
5: sw_direction_vehicle_W2;
6: sw_direction_vehicle_W2;
7: sw_direction_vehicle_W1;
sw_direction_vehicle_W1;
}
/* Anwendung der verschiedenen möglichen Wagenreihungen bei Doppeltraktionen von BR411 und BR415 gemeinsam
* Das ist eine Art spezialfall, da die Triebzüge unterschiedlich lang sind
* Hier gibt es 4 Varianten mit BR411 vorne und 4 Varianten mit BR415 vorne, dazu zusätzlich die Reversed Variante, das wären eigentlich 16 Reihungen
* Da es aber jeweils zu Doppelungen einer Reversed und einer Normalen Variante kommt reduziert sich das Ganze auf 8 Varianten
* Die Zusammenfassung und Überleitung der Varianten erfolgt weiter unten
*/
switch(FEAT_TRAINS, SELF, sw_graphics_spezial_1_N, position_in_consist % 12) {
0: sw_Front_PO_N;
1..3: set_ZweiteKlasse_N;
4: set_Restaurant_7_N;
5: set_ErsteKlasse_N;
6: sw_Rear_PU_N;
7: sw_Front_PU_N;
8..9: set_ZweiteKlasse_N;
10: set_Restaurant_5_N;
11: sw_Rear_PO_N;
}
switch(FEAT_TRAINS, SELF, sw_graphics_spezial_1_R, position_in_consist % 12) {
11: sw_Rear_PO_N;
8..10: set_ZweiteKlasse_R;
7: set_Restaurant_7_R;
6: set_ErsteKlasse_R;
5: sw_Front_PU_N;
4: sw_Rear_PU_N;
2..3: set_ZweiteKlasse_R;
1: set_Restaurant_5_R;
0: sw_Front_PO_N;
}
switch(FEAT_TRAINS, SELF, sw_graphics_spezial_2_N, position_in_consist % 12) {
11: sw_Rear_PO_N;
9..10: set_ZweiteKlasse_R;
8: set_Restaurant_5_R;
7: sw_Front_PU_N;
6: sw_Rear_PU_N;
3..5: set_ZweiteKlasse_R;
2: set_Restaurant_7_R;
1: set_ErsteKlasse_R;
0: sw_Front_PO_N;
}
switch(FEAT_TRAINS, SELF, sw_graphics_spezial_2_R, position_in_consist % 12) {
0: sw_Front_PO_N;
1..2: set_ZweiteKlasse_N;
3: set_Restaurant_5_N;
4: sw_Rear_PU_N;
5: sw_Front_PU_N;
6..8: set_ZweiteKlasse_N;
9: set_Restaurant_7_N;
10: set_ErsteKlasse_N;
11: sw_Rear_PO_N;
}
switch(FEAT_TRAINS, SELF, sw_graphics_spezial_3_N, position_in_consist % 12) {
0: sw_Front_PO_N;
1..3: set_ZweiteKlasse_N;
4: set_Restaurant_7_N;
5: set_ErsteKlasse_N;
6: sw_Rear_PU_N;
7: sw_Front_PU_N;
8: set_Restaurant_5_R;
9..10: set_ZweiteKlasse_R;
11: sw_Rear_PO_N;
}
switch(FEAT_TRAINS, SELF, sw_graphics_spezial_3_R, position_in_consist % 12) {
11: sw_Rear_PO_N;
8..10: set_ZweiteKlasse_R;
7: set_Restaurant_7_R;
6: set_ErsteKlasse_R;
5: sw_Front_PU_N;
4: sw_Rear_PU_N;
3: set_Restaurant_5_N;
1..2: set_ZweiteKlasse_N;
0: sw_Front_PO_N;
}
switch(FEAT_TRAINS, SELF, sw_graphics_spezial_4_N, position_in_consist % 12) {
0: sw_Front_PO_N;
1: set_ErsteKlasse_R;
2: set_Restaurant_7_R;
3..5: set_ZweiteKlasse_R;
6: sw_Rear_PU_N;
7: sw_Front_PU_N;
8..9: set_ZweiteKlasse_N;
10: set_Restaurant_5_N;
11: sw_Rear_PO_N;
}
switch(FEAT_TRAINS, SELF, sw_graphics_spezial_4_R, position_in_consist % 12) {
11: sw_Rear_PO_N;
10: set_ErsteKlasse_N;
9: set_Restaurant_7_N;
6..8: set_ZweiteKlasse_N;
5: sw_Front_PU_N;
4: sw_Rear_PU_N;
2..3: set_ZweiteKlasse_R;
1: set_Restaurant_5_R;
0: sw_Front_PO_N;
}
/* Immer noch nur für den Spezialfall: Hier findet die Überleitung aus der möglichen Varianten in die Grafiken statt */
switch(FEAT_TRAINS, PARENT, sw_direction_vehicle_W1_spezial_BR411_preswitch, vehicle_is_reversed){
0: sw_graphics_spezial_1_N;
default: sw_graphics_spezial_1_R;
}
switch(FEAT_TRAINS, PARENT, sw_direction_vehicle_W2_spezial_BR415_preswitch, vehicle_is_reversed){
0: sw_graphics_spezial_1_R;
default: sw_graphics_spezial_1_N;
}
switch(FEAT_TRAINS, PARENT, sw_direction_vehicle_W2_spezial_BR411_preswitch, vehicle_is_reversed){
0: sw_graphics_spezial_2_N;
default: sw_graphics_spezial_2_R;
}
switch(FEAT_TRAINS, PARENT, sw_direction_vehicle_W1_spezial_BR415_preswitch, vehicle_is_reversed){
0: sw_graphics_spezial_2_R;
default: sw_graphics_spezial_2_N;
}
switch(FEAT_TRAINS, PARENT, sw_direction_vehicle_W3_spezial_BR411_preswitch, vehicle_is_reversed){
0: sw_graphics_spezial_3_N;
default: sw_graphics_spezial_3_R;
}
switch(FEAT_TRAINS, PARENT, sw_direction_vehicle_W4_spezial_BR415_preswitch, vehicle_is_reversed){
0: sw_graphics_spezial_3_R;
default: sw_graphics_spezial_3_N;
}
switch(FEAT_TRAINS, PARENT, sw_direction_vehicle_W4_spezial_BR411_preswitch, vehicle_is_reversed){
0: sw_graphics_spezial_4_N;
default: sw_graphics_spezial_4_R;
}
switch(FEAT_TRAINS, PARENT, sw_direction_vehicle_W3_spezial_BR415_preswitch, vehicle_is_reversed){
0: sw_graphics_spezial_4_R;
default: sw_graphics_spezial_4_N;
}
/* Immer noch nur für den Spezialfall: Hier findet die Zusammenfassung der möglichen Varianten aus dem Cargosubtypes statt */
switch(FEAT_TRAINS, PARENT, sw_direction_base_spezial_BR415, cargo_subtype) {
0: sw_direction_vehicle_W1_spezial_BR415_preswitch; /* Zusammenfassen der 8 möglichen Varianten der BR 415 vorne auf 4 mögliche Reihungen */
1: sw_direction_vehicle_W2_spezial_BR415_preswitch;
2: sw_direction_vehicle_W3_spezial_BR415_preswitch;
3: sw_direction_vehicle_W4_spezial_BR415_preswitch;
4: sw_direction_vehicle_W3_spezial_BR415_preswitch;
5: sw_direction_vehicle_W4_spezial_BR415_preswitch;
6: sw_direction_vehicle_W1_spezial_BR415_preswitch;
7: sw_direction_vehicle_W2_spezial_BR415_preswitch;
sw_direction_vehicle_W1_spezial_BR415_preswitch; /* Fehler: Dann hiermit weiter */
}
switch(FEAT_TRAINS, PARENT, sw_direction_base_spezial_BR411, cargo_subtype) {
0: sw_direction_vehicle_W1_spezial_BR411_preswitch; /* 4 Varianten der BR 411 vorne ergeben 4 mögliche Reihungen */
1: sw_direction_vehicle_W2_spezial_BR411_preswitch;
2: sw_direction_vehicle_W3_spezial_BR411_preswitch;
3: sw_direction_vehicle_W4_spezial_BR411_preswitch;
sw_direction_vehicle_W1_spezial_BR411_preswitch; /* Fehler: Dann hiermit weiter */
}
/* Bei Mehrfachtraktionen reicht es nicht aus lediglich die Grafiken von N auf R zu tauschen
* Würde man lediglich dies tun, so würden die Triebzüge in sich zwar nicht springen, jedoch würde der vorderste mit dem hintersten vertauscht werden
* Deshalb vertauscht dieser Switch sozusagen den vordersten mit dem hintersten Triebzug, insofern der Zug Reversed unterwegs ist
*/
switch(FEAT_TRAINS, PARENT, sw_direction_base_vorne_preswitch, vehicle_is_reversed) {
1: sw_direction_base_hinten;
sw_direction_base_vorne;
}
switch(FEAT_TRAINS, PARENT, sw_direction_base_hinten_preswitch, vehicle_is_reversed) {
1: sw_direction_base_vorne;
sw_direction_base_hinten;
}
/* Auf Basis der Position und unter Brücksichtigung der BR wird festgelegt, welche Position der Triebzug in der Mehrfachtraktion hat
* Für den Spezialfall der Doppeltraktion aus BR411 und BR415 wird hier festgelegt welche BR die Doppeltraktion anführt
* Die Triebzugposition -mitte- ist nur in der Mehrtraktion aus Triebzügen der BR415 möglich
*/
switch(FEAT_TRAINS, SELF, sw_position_triebzug_411, position_in_consist) {
0..6: sw_direction_base_vorne_preswitch; /* Vorderer Zug */
7..13: sw_direction_base_hinten_preswitch; /* Hinterer Zug */
sw_direction_base_vorne_preswitch; /* Verfahren wie für vorderen Zug */
}
switch(FEAT_TRAINS, SELF, sw_position_triebzug_415, position_in_consist) {
0..4: sw_direction_base_vorne_preswitch; /* Vorderer Zug */
5..9: sw_direction_base_hinten_preswitch; /* Hinterer Zug */
sw_direction_base_vorne_preswitch; /* Verfahren wie für vorderen Zug */
}
switch(FEAT_TRAINS, PARENT, sw_position_triebzug_spezial, vehicle_type_id) {
item_BR411: sw_direction_base_spezial_BR411; /* BR 411 vorne, BR 415 hinten */
item_BR415: sw_direction_base_spezial_BR415; /* BR 415 vorne, BR 414 hinten */
sw_direction_base_vorne; /* Fehler: Nicht weiter definierbar */
}
switch(FEAT_TRAINS, SELF, sw_position_triebzug_dreifach, position_in_consist) {
0..4: sw_direction_base_vorne_preswitch; /* Vorderer Zug */
5..9: sw_direction_base_mitte; /* Mittlerer Zug */
10..14: sw_direction_base_hinten_preswitch; /* Hinterer Zug */
sw_direction_base_vorne_preswitch; /* Verfahren wie für vorderen Zug */
}
/* Auf Basis der Anzahl der Wagen wird die Anzahl der Triebzüge ermittelt
* Ist nur ein Triebzug vorhanden, so fährt dieser für die weiteren Berechnungen sozusagen vorne
* Die Triebzugposition -mitte- ist nur in der Mehrtraktion aus Triebzügen der BR415 möglich
*/
switch(FEAT_TRAINS, PARENT, sw_anzahl_triebzuege, num_vehs_in_consist) {
5: sw_direction_base_vorne; /* 1 Triebzug */
7: sw_direction_base_vorne; /* 1 Triebzug */
10: sw_position_triebzug_415; /* 2 Triebzüge einheitlich (415) */
14: sw_position_triebzug_411; /* 2 Triebzüge einheitlich (411) */
12: sw_position_triebzug_spezial; /* 2 Triebzüge nicht einheitlich */
15: sw_position_triebzug_dreifach; /* 3 Triebzüge (415) */
default: sw_direction_base_vorne; /* Verfahren wie für einen Triebzug */
}
/* --- Graphic Callback Ende --- */
/* --- Weitere Callbacks --- */
/* --- Cargo Subtype callback --- */
/* Je nach dem wie viele Triebzüge gemeinsam verkehren, gibt es unterschiedliche Subcargotypes die ausgewählt werden können
* Es gibt immer Wagenreihung 1 und Wagenreihung 2 je Triebzug zur auswahl, das entspricht in etwa der -Flip in Depot- option, allerdings nur grafikbasiert
* Für Einzelne Triebzüge ergeben sich so zwei Möglichkeiten
* -> 0: 1
* 1: 2
* Für Doppeltraktionen ergeben sich so vier Möglichkeiten
* -> 0: 1 + 1
* 1: 2 + 2
* 2: 1 + 2
* 3: 2 + 1
* Für Dreifachtraktionen ergeben sich so acht Möglichkeiten
* -> 0: 1 + 1 + 1
* 1: 2 + 2 + 2
* 2: 1 + 2 + 2
* 3: 2 + 1 + 1
* 4: 1 + 2 + 1
* 5: 2 + 1 + 2
* 6: 1 + 1 + 2
* 7: 2 + 2 + 1
*/
switch(FEAT_TRAINS, SELF, sw_cargo_subtype_text_1, cargo_subtype) {
0: return string(STR_SUBTYPE_1_0);
1: return string(STR_SUBTYPE_1_1);
return CB_RESULT_NO_TEXT;
}
switch(FEAT_TRAINS, SELF, sw_cargo_subtype_text_2, cargo_subtype) {
0: return string(STR_SUBTYPE_2_0);
1: return string(STR_SUBTYPE_2_1);
2: return string(STR_SUBTYPE_2_2);
3: return string(STR_SUBTYPE_2_3);
return CB_RESULT_NO_TEXT;
}
switch(FEAT_TRAINS, SELF, sw_cargo_subtype_text_3, cargo_subtype) {
0: return string(STR_SUBTYPE_3_0);
1: return string(STR_SUBTYPE_3_1);
2: return string(STR_SUBTYPE_3_2);
3: return string(STR_SUBTYPE_3_3);
4: return string(STR_SUBTYPE_3_4);
5: return string(STR_SUBTYPE_3_5);
6: return string(STR_SUBTYPE_3_6);
7: return string(STR_SUBTYPE_3_7);
return CB_RESULT_NO_TEXT;
}
switch(FEAT_TRAINS, PARENT, sw_cargo_subtype_text, num_vehs_in_consist) {
5: sw_cargo_subtype_text_1; /* 1 Triebzug */
7: sw_cargo_subtype_text_1; /* 1 Triebzug */
10: sw_cargo_subtype_text_2; /* 2 Triebzüge */
14: sw_cargo_subtype_text_2; /* 2 Triebzüge */
12: sw_cargo_subtype_text_2; /* 2 Triebzüge */
15: sw_cargo_subtype_text_3; /* 3 Triebzüge */
sw_cargo_subtype_text_1; /* Verfahren wie für einen Triebzug */
}
/* --- Running Cost Factor Callback --- */
/* Die Idee ist hier folgende: Wenn Triebzüge in Mehrfachtraktion fahren dann sinken die Betriebskosten, da alle Kosten pro Gesamtzug nur einmal auftreten
* Angenommen wird, dann der Faktor 80 für die BR415 und der Faktor 100 für die BR411 die Grenzkosten je Triebzug darstellen
* Dazu kommen dann Kosten die pro einem gesamten Zug auftreten, repräsentiert durch den Faktor 20
* Die Betriebskosten werden anschließend pro Triebzug so herabgesetzt, dass sich die Gesamtbetriebskosten wie oben beschrieben ergeben.
*/
switch(FEAT_TRAINS, SELF, sw_running_cost_factor_BR, vehicle_type_id) {
item_BR411: 110; // 100 + 10 = 110
item_BR415: 90; // 80 + 10 = 90
100;
}
switch(FEAT_TRAINS, PARENT, sw_running_cost_factor, num_vehs_in_consist) {
5: 100; /* 1 x 415 -> 80 + 20 = 100 */
7: 120; /* 1 x 411 -> 100 + 20 = 120 */
10: 90; /* 2 x 415 -> 80 + 80 + 20 = 180 / 2 */
14: 110; /* 2 x 411 -> 100 + 100 + 20 = 220 / 2 */
12: sw_running_cost_factor_BR; /* 1 x 411 + 1 x 415 -> siehe oben */
15: 87; /* 3 x 415 -> 80 + 80 + 80 + 20 = 260 / 3 */
100;
}
/* --- Articulated part callback --- */
switch(FEAT_TRAINS, SELF, sw_articulated_part_411, extra_callback_info1) {
1 .. 6: return item_BR411;
return CB_RESULT_NO_MORE_ARTICULATED_PARTS;
}
switch(FEAT_TRAINS, SELF, sw_articulated_part_415, extra_callback_info1) {
1 .. 4: return item_BR415;
return CB_RESULT_NO_MORE_ARTICULATED_PARTS;
}
/* --- Start/stop callback --- */
switch(FEAT_TRAINS, SELF, sw_start_stop, num_vehs_in_consist) {
1 .. 15: return CB_RESULT_NO_TEXT;
return string(STR_CANNOT_START);
}
/* --- Wagon attach callback --- */
switch(FEAT_TRAINS, SELF, sw_can_attach_wagon, vehicle_type_id) {
/* SELF refers to the wagon here, check that it's an ICM */
item_BR411: return CB_RESULT_ATTACH_ALLOW;
item_BR415: return CB_RESULT_ATTACH_ALLOW;
return string(STR_CANNOT_ATTACH_OTHER);
}
/* Define BR 411 */
item(FEAT_TRAINS, item_BR411) {
/* Define properties first, make sure to set all of them */
property {
name: string(STR_NAME_411);
climates_available: bitmask(CLIMATE_TEMPERATE, CLIMATE_ARCTIC, CLIMATE_TROPICAL);
introduction_date: date(2000, 1, 1);
model_life: VEHICLE_NEVER_EXPIRES;
vehicle_life: 30;
reliability_decay: 20;
refittable_cargo_classes: bitmask(CC_PASSENGERS);
non_refittable_cargo_classes: bitmask();
loading_speed: 12;
cost_factor: 180;
running_cost_factor: 120; // Changed by callback
sprite_id: SPRITE_ID_NEW_TRAIN;
speed: 230 km/h;
misc_flags: bitmask(TRAIN_FLAG_TILT, TRAIN_FLAG_MU);
refit_cost: 0;
track_type: ELRL; // from rail type table
ai_special_flag: AI_FLAG_PASSENGER;
power: 4000 kW;
running_cost_base: RUNNING_COST_ELECTRIC;
dual_headed: 0;
cargo_capacity: 54;
weight: 368 ton;
ai_engine_rank: 0; // not intended to be used by the ai
engine_class: ENGINE_CLASS_ELECTRIC;
extra_power_per_wagon: 0 kW;
tractive_effort_coefficient: 0.3; // Laut Dokumentation guter Wert
air_drag_coefficient: 0.035; // 8/230
visual_effect_and_powered: visual_effect_and_powered(VISUAL_EFFECT_ELECTRIC, 2, DISABLE_WAGON_POWER);
extra_weight_per_wagon: 0 ton;
bitmask_vehicle_info: 0;
}
/* Define graphics and callbacks
* Setting all callbacks is not needed, only define what is used */
graphics {
default: sw_anzahl_triebzuege;
purchase: set_purchase_411;
start_stop: sw_start_stop;
articulated_part: sw_articulated_part_411;
can_attach_wagon: sw_can_attach_wagon;
cargo_subtype_text: sw_cargo_subtype_text;
additional_text: return string(STR_ADDITIONAL_TEXT_411);
running_cost_factor: sw_running_cost_factor;
}
}
/* Define BR 415 */
item(FEAT_TRAINS, item_BR415) {
/* Define properties first, make sure to set all of them */
property {
name: string(STR_NAME_415);
climates_available: bitmask(CLIMATE_TEMPERATE, CLIMATE_ARCTIC, CLIMATE_TROPICAL);
introduction_date: date(2000, 1, 1);
model_life: VEHICLE_NEVER_EXPIRES;
vehicle_life: 30;
reliability_decay: 20;
refittable_cargo_classes: bitmask(CC_PASSENGERS);
non_refittable_cargo_classes: bitmask();
loading_speed: 12;
cost_factor: 160;
running_cost_factor: 100; // Changed by callback
sprite_id: SPRITE_ID_NEW_TRAIN;
speed: 230 km/h;
misc_flags: bitmask(TRAIN_FLAG_TILT, TRAIN_FLAG_MU);
refit_cost: 0;
track_type: ELRL; // from rail type table
ai_special_flag: AI_FLAG_PASSENGER;
power: 3000 kW;
running_cost_base: RUNNING_COST_ELECTRIC;
dual_headed: 0;
cargo_capacity: 50;
weight: 273 ton;
ai_engine_rank: 0; // not intended to be used by the ai
engine_class: ENGINE_CLASS_ELECTRIC;
extra_power_per_wagon: 0 kW;
tractive_effort_coefficient: 0.3; // Laut Dokumentation guter Wert
air_drag_coefficient: 0.035; // 8/230
visual_effect_and_powered: visual_effect_and_powered(VISUAL_EFFECT_ELECTRIC, 2, DISABLE_WAGON_POWER);
extra_weight_per_wagon: 0 ton;
bitmask_vehicle_info: 0;
}
/* Define graphics and callbacks
* Setting all callbacks is not needed, only define what is used */
graphics {
default: sw_anzahl_triebzuege;
purchase: set_purchase_415;
start_stop: sw_start_stop;
articulated_part: sw_articulated_part_415;
can_attach_wagon: sw_can_attach_wagon;
cargo_subtype_text: sw_cargo_subtype_text;
additional_text: return string(STR_ADDITIONAL_TEXT_415);
running_cost_factor: sw_running_cost_factor;
}
}