Einleitung LocoXML Sprites Farben Bauwerke Bahnkram Fahrzeuge Krimskrams  

Die wundersame Welt der Locomotion Architektur

Die wundersame Welt der Locomotion Architektur

In diesem Kapitel hab ich mal alles zusammengefasst, was mit Gebäuden in Locomotion zu tun hat. Darunter fallen auch Industrien und Häfen, die in manchen Aspekten der XML eine fast identische Struktur besitzen. Bahnhöfe fallen definitiv nicht unter diese Kategorie. Sie werden in einem eigenen Abschnitt behandelt.

Leider kann ich auch (noch) nichts über Gebäudeanimationen schreiben. Darüber hab ich bis jetzt zu wenig in Erfahrung bringen können. Es ist auch so, daß es verschiedene Animationsarten gibt, über die ich erst mehr wissen muss, bevor ich sie weiter analysieren kann. Ich hab zwar schon die Idee eines Ansatzes, aber das kann noch dauern. Hilfe von jeder Seite wird gern angenommen.

Bei der Beschreibung der Elemente werde ich nicht alphabetisch und auch nicht nach Reihenfolge der LocoXML vorgehen sondern nach Komplexität und Themengruppen. Es macht keinen Sinn Elemente, die in der XML weiter auseinander stehen aber doch zusammengehören, getrennt zu behandeln. Dies würde das Verständnis nur unnötig erschweren.

Beachtet aber bitte dies:
Wenn ihr später selbst XMLs zusammenstellt, haltet euch an die Reihenfolge, wie sie LocoTool vorgibt. Es gibt da auch noch einige Elemente, über die bis jetzt zwar nichts bekannt ist, die aber dennoch vorhanden sein müssen, damit auch alles richtig funktioniert.

Häuser

Häuser

Das meiste in diesem Abschnitt bezieht sich auf eins meiner Lieblingshäuser hier links. Elemente, die in ihm nicht vorkommen, aber dennoch von Interesse sind, werd ich ebenso beschreiben. Fangen wir doch gleich mit etwas Einfachem an, dem Zeitraum des Erscheinens im Spiel.
<variable name="earliestyr" size="2">1910</variable>
<variable name="latestyr" size="2">65535</variable>
Unschwer zu erkennen:
  • earliestyr - Erstes Baujahr
    Wenn hier der Wert 0 steht, ist es von Anfang an dabei (Sofern es denn im Szenario-Editor angewählt wird).
  • latestyr - Letztes Baujahr
    Ein Wert von 65535 zeigt an, daß es bis in alle Ewigkeit verfügbar bleibt. Warum so ein krummer Wert? Nun ja, 65535 ist die größte Zahl, die man mit zwei Byte darstellen kann und die Game-Engine nimmt daher diesen Wert für IMMER.
Dies gilt übrigens auch für andere Objekte. Die Variablen heißen dort aber meist anders.

<variable name="costind" size="1">1</variable>
<variable name="clearcostfact" size="2">32</variable>
Hiermit werden die Kosten ermittelt, die entstehen, wenn ihr ein Haus abreißen wollt. Selbst Häuser im Spiel bauen geht ja bekanntlich nicht. Ich hab bis jetzt noch keine Ahnung, wie diese und andere Kosten genau berechnet werden. Hey Jungs, haben wir vielleicht gerade einen arbeitslosen Banker zur Hand, der uns das mal auseinander fieselt??

<unknown name="field_9C[0]" size="1">1</unknown>
<unknown name="field_9C[1]" size="1">1</unknown>
<unknown name="field_9C[2]" size="1">12</unknown>
<unknown name="field_9C[3]" size="1">0</unknown>
Nanu? Was haben denn diese unbekannten Variablen hier zu suchen? Mir sind sie inzwischen bekannt. Zumindest die erste field_9C[0]. Ihr habt doch sicher schon im Spiel beobachtet, was passiert, wenn die KI ein Haus errichtet. Es wird zuerst einmal, wie im richtigen Leben auch, ein Gerüst aufgestellt. Diese Gerüste sind in der Objektdatei SCAFDEF.DAT hinterlegt (Scaffolding (engl. - Gerüst) Definition). Und zwar genau drei [0, 1, 2]. Und exakt dieser Wert beschreibt ob ein Gerüst nach alter Bauweise nur aus Brettern [0], etwas neuer aus Stahlrohren und Holzbohlen [1] oder hypermodern aus HighTech-Materialien besteht [2].
  0
1
2
 
Eine interessante Sache gibt's noch bei der letzten Variante. Mit field_9C[2] kann man dabei die Farbe Gerüsttürme einstellen, glaub ich. Es ist aber schon eine Weile her, als ich das ausprobiert hab.

<description num="0" language="0">Building</description>	<!-- Britisches Englisch -->
<description num="0" language="1">Building</description>	<!-- Amerikanisches Englisch -->
<description num="0" language="2">Bâtiment</description>	<!-- Französisch -->
<description num="0" language="3">Gebäude</description>		<!-- Deutsch -->
<description num="0" language="4">Edificio</description>	<!-- Spanisch -->
<description num="0" language="5">Palazzo</description>		<!-- Italienisch -->
<description num="0" language="9">ÿ°Çÿ¹°</description>		<!-- Chinesisch ??? -->
<description num="0" language="11">ÿ«Øÿ¿vÿª«</description>	<!-- Portugiesisch ??? -->
Hier findet ihr die Objektbeschreibungen in verschiedenen Sprachen. Das Attribut language definiert die Sprache und je nachdem, in welcher ihr Locomotion beim ersten Mal installiert habt, erscheint sie dann auch im Spiel. Und deshalb gleich eine Bitte (auch von anderer Seite): Wenn ihr eigene Sachen baut, übersetzt diese Liste komplett durch. Passende Wörterbücher findet ihr auf www.leo.org. So können auch Spieler in anderen Ländern eure Werke vollends genießen. Allerdings könnt ihr hierbei die letzten beiden Einträge [9 und 11] vernachlässigen. Deren Kodierung ist so kryptisch, daß ein normaler Westeuropäer damit überfordert ist. Das Attribut num werd ich später bei den Industrien auseinander nehmen.

Kommen wir nun zu den Gebäudeflags:
<bitmask name="flags" size="1">
	<bit name="bit_0">1</bit>
	<bit name="bit_1">0</bit>
	<bit name="bit_2">0</bit>
	<bit name="ishq">0</bit>
</bitmask>
  • bit_0 - gesetzt, wenn das Gebäude eine Grundfläche von 2x2 Feldern belegt
  • bit_1 - gesetzt, wenn das Gebäude unter Verschiedenes geführt wird
  • bit_2 - gesetzt, wenn das Gebäude ist nicht abreißbar ist
  • ishq - gesetzt, wenn das Gebäude das Hauptquartier eines Unternehmens sein kann
Es gibt da auch noch ein bit_4. Dieses ist allerdings nur beim Strommast und beim Sender gesetzt. Es hat evtl. damit zu tun, daß diese beiden einen Schatteneffekt besitzen. Ganz sicher bin ich mir dabei allerdings noch nicht.

Als Nächstes nehmen wir uns mal die Frachten vor. Zuerst, was kann in einem Gebäude umgesetzt werden.
<useobject desc="cargo[0]" class="8">PASS    </useobject>
<useobject desc="cargo[1]" class="8">MAIL    </useobject>
<useobject desc="cargo[2]" class="8">BEER    </useobject>
<useobject desc="cargo[3]" class="8">FOOD    </useobject>
Wie hier zu sehen, kann ein Gebäude maximal vier Plätze für Frachten besitzen. Der Wert einer Variablen ist die ObjID der betreffenden Fracht. Das Attribut class enthält die Objektklasse. Hier ist die 8 für Frachten einzusetzen. Andere Werte sind hier sinnlos. Es sei denn ...
<useobject desc="cargo[3]" class="255">        </useobject>
... ein Platz bleibt leer. Dann erhält class den Wert 255 und an Stelle der ObjID sind acht Leerzeichen einzutragen.
Neben dem was interessiert natürlich auch das wie viel ...
<variable name="numaccept[0]" size="1">4</variable>
<variable name="numaccept[1]" size="1">2</variable>
<variable name="numaccept[2]" size="1">2</variable>
<variable name="numaccept[3]" size="1">1</variable>
... ein Gebäude akzeptiert. Die Indizes korrespondieren mit denen der Liste oben. Die Werte sind in achtel Einheiten angegeben. Das heißt: Wenn im Einzugsbereich eines Bahnhofs mehrere Häuser stehen, die gleiche Frachten akzeptieren, und die Gesamtsumme dieser achtel Einheiten für eine Fracht größer als eins wird, kann der Bahnhof eben diese Frachten auch annehmen. Da diese Werte jeweils ein Byte belegen, kann hier ein Maximalwert von 255 stehen.
Und wie viel produziert ein Haus?
<variable name="numproduce[0]" size="1">85</variable>
<variable name="numproduce[1]" size="1">30</variable>
Die Indizes korrespondieren ebenfalls mit denen der Was-Liste. Allerdings gibt es hier nur zwei Plätze und die Werte errechnen sich anders. Ein maximaler Wert von 255 bedeutet etwa 12 Einheiten der entsprechenden Fracht pro Monat. Daraus lässt sich die Formel Monatsproduktion = Wert / 255 * 12 herleiten.
Der erste Wert hat hier auch noch eine Sonderstellung. In den meisten Fällen (Bei Originalgebäuden in allen) stehen an erster Stelle der Was-Liste Passagiere. Daher wird der erste Wert der Produktionsliste zur Berechnung der Einwohnerzahl von Ortschaften hergenommen. In diesem Fall hat das Haus 85 Bewohner.
Zur besseren Darstellung der Zusammenhänge dieses Beispiel noch einmal in Tabellenform:
BLDALP1.dat
Fracht: akzeptiert produziert
pro Monat
Passagiere
Postsäcke
Bier (Hektoliter)
Lebensmittel
1/2
1/4
1/4
1/4
4
1,4
<--- 85 Bewohner
Aber bitte beachten! Wenn bei den Gebäudeflags bit_1 gesetzt ist, fällt das Gebäude aus dem Warenkreislauf heraus und alles, was bei den Frachten eingetragen ist, bleibt ohne Wirkung.

Die Aux-Felder

Die Aux-Felder

So, jetzt ist aber erst mal Zeit Luft zu holen und sich zurück zu lehnen
... vielleicht 'nen Kaffee zu nehmen ,
... oder ein schönes Glas Wein ,
... eventuell noch ein paar Dehnungsübungen ,
denn gleich wird's richtig spannend und anstrengend.
.
.
.
Ahh! Wieder da? dann kann's ja gleich in die Vollen gehen.
Bei den Gebäuden tauchen vier Aux-Felder auf: aux_0, aux_1, aux_2 und manchmal auch aux_3. In der Wiki steht nicht viel darüber, aber inzwischen ist auch einige Zeit vergangen. Werfen wir noch einmal einen Blick auf die Spritegrafiken.
Auffallend ist, daß die Grafiken in Vierergruppen erscheinen und daß jede eine Schicht, oder sagen wir doch gleich Etage, des Gebäudes aus vier verschiedenen Blickwinkeln enthält. Bei 20 Einzelgrafiken [0 - 19] geteilt durch vier Richtungen macht das genau 5. Merken!!! Denn dieser Wert wird hier richtig wichtig (Jedenfalls in diesem Beispiel).

Beginnen wir mal mit aux_0:
<variable name="numaux01" size="1">5</variable>
numaux01:
Diese Variable erscheint gleich zu Beginn der XML. Und? Erkennt ihr den Wert wieder? Genau! Es ist exakt die Anzahl der Stockwerke, die wir eben grad ermittelt haben. Und exakt die Anzahl der Elemente in aux_0 und aux_1 [0 - 4]. Schau'n mer up dat erste Loch, dat annere kriejen mer später noch! (Feuerzangenbowle)
<auxdata name="aux_0" size="1" num="5" type="0">
	<unknown name="field_0[0]" size="1">1</unknown>
	<unknown name="field_0[1]" size="1">16</unknown>
	<unknown name="field_0[2]" size="1">12</unknown>
	<unknown name="field_0[3]" size="1">12</unknown>
	<unknown name="field_0[4]" size="1">26</unknown>
</auxdata>

Was wollen uns diese Werte sagen? Hmm! Das sind doch genau die Stockwerkshöhen in Pixeln. Ich hatte ja früher schon mal ausgeführt, wie Sprites prinzipiell positioniert werden. Wenn man nun Stockwerke übereinander stapelt, braucht auch Informationen über deren Höhen. Das folgende Stockwerk wird immer um den Wert des aktuellen nach oben verschoben. Na das ist doch schon mal was.
Weiter geht's mit aux_1 und hier wird's gleich ein wenig eklig.
<auxdata name="aux_1" size="2" num="5" type="0">
	<unknown name="field_0[0]" size="1">1</unknown>
	<unknown name="field_0[1]" size="1">0</unknown>
	<unknown name="field_0[2]" size="1">1</unknown>
	<unknown name="field_0[3]" size="1">0</unknown>
	<unknown name="field_0[4]" size="1">1</unknown>
	<unknown name="field_0[5]" size="1">0</unknown>
	<unknown name="field_0[6]" size="1">1</unknown>
	<unknown name="field_0[7]" size="1">0</unknown>
	<unknown name="field_0[8]" size="1">1</unknown>
	<unknown name="field_0[9]" size="1">0</unknown>
</auxdata>
Hatte nicht irgendwer vorhin grad behauptet, hier seien fünf Elemente drin? Im Prinzip ja, aber ... LocoTool geht ausgerechnet bei der Behandlung dieses Feldes etwas inkonsequent vor. In der Feldbeschreibung scheint noch alles i.O. zu sein, nur warum hat sich die Anzahl der Einträge verdoppelt? Des Rätsels Lösung ist in den size Attributen zu finden. Im Header steht der Wert 2, in den Einträgen dagegen 1. Korrekt dargestellt würde das Feld so aussehen:
<auxdata name="aux_1" size="2" num="5" type="0">
	<unknown name="field_0[0]" size="2">1</unknown>
	<unknown name="field_0[1]" size="2">1</unknown>
	<unknown name="field_0[2]" size="2">1</unknown>
	<unknown name="field_0[3]" size="2">1</unknown>
	<unknown name="field_0[4]" size="2">1</unknown>
</auxdata>
Und genau so sieht es auch später bei den Industrien aus. Bei den Häfen wiederum nicht. Man muss also zwei Byte zu einem Word zusammenfassen und dabei daran denken, daß die Bytes in INTEL-Notation abgelegt sind. Das heißt, das Low*-Byte steht im Feld vor dem High-Byte.
* Das hat nichts mit unserem Low zu tun.

Die Formel dafür lautet: Word = 256 * High-Byte + Low-Byte.
...

So!! Ich hab mal eben einen kleinen Test gemacht. Bei der Wandlung einer XML in ein DAT-File scheint LocoTool die korrekte Schreibweise auch problemlos zu verarbeiten. Das erleichtert uns die Sache schon einmal erheblich.
Warum machen wir so einen Aufriss um aux_1? Dieses Feld muss zwingend vorhanden sein und hier müssen korrekte Werte drinstehen. Sie haben irgendetwas mit Animationen zu tun. Ich hatte ja schon erwähnt, daß es verschiedene Animationsarten gibt. Und keine Animation ist offenbar eine davon. Hier muss dann in allen Elementen der Wert 1 stehen. Ich hatte mich irgendwann mal in diesem Feld vertan und danach die lustigsten Effekte im Spiel. Gebäudeteile verschwanden oder rasten quer über den Bildschirm. Die Fehlersuche war grausam. Nun gut! Jetzt wissen wir Bescheid.

Gleich ein Vorgriff auf aux_3. Auch dieses Feld hat etwas mit Animationen zu tun. Es ist aber nur bei wenigen Gebäuden vorhanden. Bei allen anderen ist in der XML diese Zeile zu finden:
<variable name="numaux3ent" size="1">0</variable>
Das Feld hat keine Einträge. Und wenn es mal welche hat ...? Das zu erforschen wird noch gruseliger werden. Es handelt sich dabei um eine besondere Animationsart. Ich sage nur eins: Außenaufzüge!

Bleibt uns noch aux_2 übrig.
<variable name="numaux2ent" size="1">1</variable>
Scheint erstmal einfach zu sein. Nur ein Eintrag.

<auxdata name="aux_2[0]" size="1" num="5" type="1">
	<unknown name="field_0[0]" size="1">0</unknown>
	<unknown name="field_0[1]" size="1">1</unknown>
	<unknown name="field_0[2]" size="1">2</unknown>
	<unknown name="field_0[3]" size="1">3</unknown>
	<unknown name="field_0[4]" size="1">4</unknown>
</auxdata>
Ein Eintrag? Richtig! Denn hier handelt es sich um ein Element, das wiederum andere Elemente enthält. Schaut euch noch mal die Headerzeile gut an. Aux_2 hat einen Index und in num ist die Anzahl der Unterelemente zu sehen. Und diese wiederum enthalten schön aufgereiht die Etagennummern. Wie banal!

Aber bauen wir doch gleich noch ein paar Stockwerke dazu ...

<auxdata name="aux_2[0]" size="1" num="7" type="1">
	<unknown name="field_0[0]" size="1">0</unknown>
	<unknown name="field_0[1]" size="1">1</unknown>
	<unknown name="field_0[2]" size="1">2</unknown>
	<unknown name="field_0[3]" size="1">3</unknown>
	<unknown name="field_0[4]" size="1">2</unknown>
	<unknown name="field_0[5]" size="1">3</unknown>
	<unknown name="field_0[6]" size="1">4</unknown>
</auxdata>
... oder würfeln ein wenig.

<auxdata name="aux_2[0]" size="1" num="7" type="1">
	<unknown name="field_0[0]" size="1">0</unknown>
	<unknown name="field_0[1]" size="1">3</unknown>
	<unknown name="field_0[2]" size="1">2</unknown>
	<unknown name="field_0[3]" size="1">1</unknown>
	<unknown name="field_0[4]" size="1">2</unknown>
	<unknown name="field_0[5]" size="1">3</unknown>
	<unknown name="field_0[6]" size="1">4</unknown>
</auxdata>
Nun, hier müsste der Bürgermeister schon mit der Leiter einsteigen. Aber man kann sehr gut erkennen, wie man mit der aux_2-Struktur sehr einfach und elegant das Erscheinungsbild eines Hauses verändern kann.

Die letzten beiden Beispiele hab ich übrigens in fünf Minuten mit dem LocoBrowser2 erstellt.

Dabei haben wir bis jetzt nur einen aux_2-Eintrag. Mit mehreren wird es noch interessanter. Hierin liegt auch das Geheimnis, wie man verschiedene Gebäude in einem Slot stapeln kann. Aber das erklär ich auch lieber an einem anderen Gebäude.

Nächste Station: Hauptquartier!

Nächste Station: Hauptquartier!

Es geht immer noch um aux_2. Aber jetzt mit mehreren Einträgen. Am besten lässt sich dieser Zusammenhang mit dem Hauptquartier darstellen, da es sich im Spiel verändert, je mehr Geld ihr verdient.
<variable name="numaux2ent" size="1">5</variable>
Alles klar! Fünf verschiedene Einträge in aux_2, somit fünf verschiedene Erscheinungsformen. Ein Blick auf die Grafikdatei ergibt 64 Einzelgrafiken, also 16 Etagen. Dann wollen wir doch mal schauen, wie die so verteilt sind.


<auxdata name="aux_2[0]" size="1" num="2" type="1">
	<unknown name="field_0[0]" size="1">0</unknown>
	<unknown name="field_0[1]" size="1">1</unknown>
</auxdata>
Los geht's mit einer Bretterbude.


<auxdata name="aux_2[1]" size="1" num="2" type="1">
	<unknown name="field_0[0]" size="1">2</unknown>
	<unknown name="field_0[1]" size="1">3</unknown>
</auxdata>
Die ersten Scheine bringen die ersten Steine.


<auxdata name="aux_2[2]" size="1" num="5" type="1">
	<unknown name="field_0[0]" size="1">4</unknown>
	<unknown name="field_0[1]" size="1">5</unknown>
	<unknown name="field_0[2]" size="1">6</unknown>
	<unknown name="field_0[3]" size="1">6</unknown>
	<unknown name="field_0[4]" size="1">7</unknown>
</auxdata>
Mit dem Unternehmen wächst dann auch die Zahl der Angestellten und Büros.


<auxdata name="aux_2[3]" size="1" num="7" type="1">
	<unknown name="field_0[0]" size="1">8</unknown>
	<unknown name="field_0[1]" size="1">9</unknown>
	<unknown name="field_0[2]" size="1">10</unknown>
	<unknown name="field_0[3]" size="1">10</unknown>
	<unknown name="field_0[4]" size="1">10</unknown>
	<unknown name="field_0[5]" size="1">10</unknown>
	<unknown name="field_0[6]" size="1">11</unknown>
</auxdata>
Ab jetzt wird nicht mehr gekleckert, sondern geklotzt.


<auxdata name="aux_2[4]" size="1" num="9" type="1">
	<unknown name="field_0[0]" size="1">12</unknown>
	<unknown name="field_0[1]" size="1">13</unknown>
	<unknown name="field_0[2]" size="1">14</unknown>
	<unknown name="field_0[3]" size="1">14</unknown>
	<unknown name="field_0[4]" size="1">14</unknown>
	<unknown name="field_0[5]" size="1">14</unknown>
	<unknown name="field_0[6]" size="1">14</unknown>
	<unknown name="field_0[7]" size="1">14</unknown>
	<unknown name="field_0[8]" size="1">15</unknown>
</auxdata></auxdata>
Und nun Tycoon bist du der König der Welt.

Uff! Das war 'ne lange Strecke . Aber das Wesentliche haben wir schon abgehandelt und müssen es nicht wiederholen. Ab jetzt sollte es schneller gehen.

Industrien

Industrien

Die Industrien möchte ich euch anhand der Eisenerzmine erläutern. Da sie keine Animationen hat, gibt es damit auch keine Komplikationen. Sie besitzt aber eine Reihe anderer Aspekte, die hier gut zu verdeutlichen sind. Auf die beiden Bilder hier links werde ich in diesem Abschnitt noch öfter zurück kommen.

Beginnen wir erst mal wieder mit den einfachen Sachen.
<variable name="firstyear" size="2">0</variable>
<variable name="lastyear" size="2">65535</variable>
Das sollte keiner Erklärung mehr bedürfen.

<variable name="costind" size="1">1</variable>
<variable name="costfactor1" size="2">240</variable>
Hier verstecken sich die Baukosten für eine Industrie, wenn ihr eine bauen wollt (und könnt).

<unknown name="field_D2[2]" size="1">1</unknown>
Der Wert für das Gerüst.

<description num="0" language="3">Eisenerzminen</description>
	...
<description num="1" language="3">„@  Eisenerzminen</description>
	...
<description num="2" language="3">Eisenerzminen </description>
	...
<description num="3" language="3">ƒ wird geschlossen!</description>
	...
<description num="4" language="3">Neue Eisenerzfunde bei ƒ - Produktionssteigerung!</description>
	...
<description num="5" language="3">ƒ mit Produktionsrückgang!</description>
	...
<description num="6" language="3"> Eisenerzmine</description>
	...
<description num="7" language="3"> Eisenerzminen</description>
Die Liste der Beschreibungen bei den Industrien ist etwas länglich, daher hab ich mich auf die deutschen Einträge beschränkt. Aber ich hab euch ja versprochen noch näher auf das Attribut num einzugehen. Und bei dieser Zusammenstellung wird es schnell offensichtlich, daß es sich hier um Textbausteine handelt, mit denen die Pressemeldungen im Spiel generiert werden. Ansonsten gilt das bereits weiter oben gesagte.

Jetzt zu einer Besonderheit der Industrien, den Zäunen. Wenn ihr euch noch mal das Bild der Mine oben anschaut, seht ihr, daß sie von einem Randstreifen (dazu später mehr) umgeben sind, der seinerseits umzäunt ist. Und diese Zäune stehen hier drin.
<useobject desc="fence[0]" class="255">        </useobject>
<useobject desc="fence[1]" class="255">        </useobject>
<useobject desc="fence[2]" class="255">        </useobject>
<useobject desc="fence[3]" class="255">        </useobject>
<useobject desc="fence[4]" class="9">FENCE1  </useobject>
<useobject desc="fence[5]" class="255">        </useobject>
Sieht doch fast so aus wie die Frachtliste der Gebäude außer, daß es sich hier um Zäune handelt, deren Objektklasse die 9 ist. Und es können maximal 6 Zaunarten eingetragen werden.

Auch Industrien haben Flags und zwar einige. Leider sind bis jetzt die wenigsten entschlüsselt.
<bitmask name="flags" size="4">
	<bit name="bit_8">0</bit>
	<bit name="bit_10">0</bit>
	<bit name="needall">0</bit>
	<bit name="canincreaseproduction">1</bit>
	<bit name="candecreaseproduction">1</bit>
</bitmask>
  • bit_8 - Die Industrie kann nur auf dem Wasser gebaut werden (Bohrinsel)
  • bit_10 - Die Industrie kann während eines Spiels vom Spieler gebaut werden
  • needall - Die Industrie benötigt alle anlieferbaren Frachtarten für die Produktion
  • canincreaseproduction - Die Produktion kann steigen
  • candecreaseproduction - Die Produktion kann fallen
needall ist nur bei verarbeitenden Industrien (Fabrik, Sägewerk ...) sinnvoll,
canincreaseproduction und candecreaseproduction nur bei Rohstoffquellen.

Wie sieht es nun mit den Frachten bei den Industrien aus?
<useobject desc="produces[0]" class="8">IRONORE </useobject>
<useobject desc="produces[1]" class="255">        </useobject>
Eine Industrie kann maximal zwei davon produzieren. Unsere Mine produziert nur Eisenerz.

<useobject desc="accepts[0]" class="255">        </useobject>
<useobject desc="accepts[1]" class="255">        </useobject>
<useobject desc="accepts[2]" class="255">        </useobject>
Eine Industrie kann maximal drei Frachten annehmen. Da die Eisenerzmine eine reine Rohstoffquelle ist, sind hier alle Plätze leer.
Wie viel produziert wird und wie viel von den angelieferten Frachten verarbeitet wird ist entweder durch die loco.exe gesteuert oder in anderen hier kryptisierten Werten verborgen. Eventuelle Zusammenhänge sind noch nicht so richtig klar.

Industriegrafiken

Industriegrafiken

Zu den Feldern aux_0 und aux_1 ist bereits alles bei den Gebäuden gesagt.
Einen Unterschied gibt es hier dennoch. Wenn ihr euch oben die Spriteübersicht anschaut, werden ihr hinter den Gebäudesprites noch 18 weitere finden, die nicht in den Aux-Feldern eingetragen sind. Hierbei handelt es sich um die Bodensprites, die die Randstreifen bilden. Diese sind bei fast allen Industrien vorhanden.
Fast! Denn auch hier gibt es Ausnahmen. Und zwar bei den Farmen, der Baumschule und dem Weingut, also den Rohstoffquellen, die von Feldern umgeben sind. Upps! Die Skihütte hätt ich fast vergessen. Damit spiel ich wohl zu wenig. Bei diesen liegen noch wesentlich mehr Sprites am Ende. Es handelt sich hier um eine ganz spezielle Industrieanimation, mit der die Fruchtfolge oder die Bewegung der Kühe bzw. Skifahrer simuliert wird. Die Gesamtstruktur dieser Industrien scheint sehr kritisch zu sein. Als ich bei meinem Bauernhof das erste Mal versuchte hier etwas zu verändern, hat dies dazu geführt, daß Loco schon beim Start crashte. Also besser erst mal Finger davon.

Die Felder aux_2 und aux_3 gibt es ebenfalls bei den Industrien. Sie haben hier aber eine andere Funktion als oben aufgeführt. Auch besitzen sie hier eine feste Struktur und deshalb erscheinen die Variablen numaux2ent und numaux3ent nie in einer Industrie-XML. Oft sind diese beiden Felder leer. Aber wenn etwas darin enthalten ist, ist ganz klar ein Zusammenhang mit Animationen erkennbar. Wenn ich hierzu mehr weiß, werd ich von mir hören lassen.

And now featuring aux_4:
Das Feld aux_4 erfüllt hier fast die gleiche Funktion wie aux_2 bei den Gebäuden. Es definiert die Erscheinungsformen der verschiedenen Industriebaugruppen.
<variable name="numaux4ent" size="1">8</variable>
Aha! Wie gehabt. Acht verschiedene Bauten bei den Eisenerzminen. Nur hier sind sie mehr oder weniger gleichzeitig zu sehen. Schnell mal eine kleine Übersicht.

Ein 2x2 Flag haben wir ja schon bei den Gebäuden kennengelernt. Es ist das bit_0, mit dem die Grundfläche festgelegt wird. Das hat bei den Gebäuden auch zur Folge, daß alle Varianten dieselbe Fläche benötigen.
Dies ist bei den Industrien anders. Hier belegen die verschiedenen Baugruppen auch unterschiedliche Flächen. Und das muss natürlich irgendwo vermerkt sein. Aber wo? Die ersten Verdächtigen sind die Industrieflags. Raufgeschaut und ... passt nicht! Gut. Dann nehmen wir uns doch mal die 2x2 Flags in ihrer Gesamtheit vor. Taschenrechner rausgekramt, daran denken, daß Bits in einem Byte vom höchst- zum niedrigstwertigen gezählt werden, und ein wenig rechnen:
Gebäude Nr.
7654 3210
01 01 01 11 Macht dezimal 87
2x2 Flags
Und dieser Wert versteckt sich genau hier:
<unknown name="field_BE[8]" size="1">87</unknown>
Hmm. Ein Byte = 8 Bit macht zusammmen 8 Gebäude für eine Industrie (Es sei denn, es taucht noch irgendein High-Byte aus der Versenkung auf). Hilfe!!! Schon wieder eine Grenze??? Diesmal nur scheinbar, denn es handelt sich um acht verschiedene Gebäude. Ihr müsst euch das Ganze wie eine Tonleiter vorstellen.

Auch hier gibt es nur 8 Töne (die Halbtöne lassen wir mal weg), aber es soll schon Leute gegeben haben, die nur damit mehrstündige Meisterwerke erschufen.

Schön und gut, und wo ist jetzt das Notenpapier?
Dies versteckt sich im Feld aux_5. Hier sind die Baugruppen, wie sie in aux_4 definiert wurden, aneinander gereiht.
<auxdata name="aux_5" size="1" num="17" type="0">
	<unknown name="field_0[0]" size="1">0</unknown>
	<unknown name="field_0[1]" size="1">1</unknown>
	<unknown name="field_0[2]" size="1">1</unknown>
	<unknown name="field_0[3]" size="1">3</unknown>
	<unknown name="field_0[4]" size="1">2</unknown>
	<unknown name="field_0[5]" size="1">3</unknown>
	<unknown name="field_0[6]" size="1">6</unknown>
	<unknown name="field_0[7]" size="1">5</unknown>
	<unknown name="field_0[8]" size="1">5</unknown>
	<unknown name="field_0[9]" size="1">7</unknown>
	<!-- Minimale Größe -->
	<unknown name="field_0[10]" size="1">7</unknown>
	<unknown name="field_0[11]" size="1">4</unknown>
	<unknown name="field_0[12]" size="1">4</unknown>
	<unknown name="field_0[13]" size="1">3</unknown>
	<unknown name="field_0[14]" size="1">2</unknown>
	<unknown name="field_0[15]" size="1">3</unknown>
	<unknown name="field_0[16]" size="1">1</unknown>
	<!-- Maximale Größe -->
</auxdata>
Nun wird man eine Locomotion Industrie kaum mit einer Oper von Mozart vergleichen, eher mit einen Handy Klingelton. Euch ist im Spiel sicher auch schon aufgefallen, wie unterschiedlich gleiche Industrien aussehen können. Die Verteilung der Baugruppen auf der Fläche ist zufällig. Ebenso deren Anzahl, die sich zwischen zwei Grenzwerten bewegt, nämlich diesen:
<unknown name="field_20[156]" size="1">10</unknown>
<variable name="numaux5" size="1">17</variable>
numaux5, wer hätte es gedacht, entspricht genau der Zahl der Einträge in aux_5.
field_20[156] ist die Untergrenze der Baugruppen für die betreffende Industrie. In unserem Fall wird es nie eine Eisenerzmine mit weniger als 10 Gebäuden geben.

Damit wären wir (vorerst) am Ende der Industrialisierung für Locomotion angelangt. Begeben wir uns jetzt mal in ruhigere Gewässer.

Häfen

Häfen

Und weil in Hamburg gerade Hafengeburtstag ist, nehmen wir als Beispiel doch gleich meine Landungsbrücken. Dieses Kapitel wird eh das kürzeste.
<variable name="designed" size="2">0</variable>
<variable name="obsolete" size="2">65535</variable>
Noch Fragen dazu?
<variable name="buildcostfact" size="2">38</variable>
<variable name="sellcostfact" size="2">-35</variable>
<variable name="costind" size="1">1</variable>
Ja ja, das liebe Geld! Diesmal mit Bau- und Abrisskosten, was hier ja auch durchaus Sinn macht.

Und die Grafik? Die Felder aux_0, aux_1 und aux_2 sind hier ebenfalls vorhanden. Und sie funktionieren exakt so wie bei den Gebäuden.
HALT!!! STOP!!! Eins darf nicht unerwähnt bleiben. In der Grafikdatei ist ganz am Anfang der Sprites noch ein so genanntes UIC-Icon zu sehen. Dieses wird für die Darstellung des Hafens im Auswahlfenster benötigt und ist in den Aux-Feldern nicht eingetragen.
Das Feld aux_3 existiert bei den Häfen nicht.
Der Mechanismus des Gebäudestapelns scheint bei den Häfen nicht zu funktionieren. Ich hab's schon mal versucht. Das Ergebnis war leider unbrauchbar. Aber wenn das ginge (träum ...).

So. Das war's fürs Erste. Ich muss mich jetzt um ein paar andere Wichtigkeiten kümmern. Bis demnächst in diesem Theater.