Zuerst einmal brauchen wir eine Rakete. Dafür können wir zum Beispiel das vorgefertigte Stock "Z-Map Satellite Launch Kit" wählen. Bevor wir weiter zum Launchpad gehen müssen wir die Rakete jedoch noch minimal umbauen. Um genau zu sein, brauchen wir ein "Scribtable Control System" (Ich werde es einfach SCS nennen), zu finden in der Kategorie "Control". Dieses Teil bauen wir einfach an die Rakete dran, ich habs direkt unter den Satelliten gesetzt, damit das SCS die Rakete bis zum absprengen der Oberstufe kontrollieren kann. Nachdem das Teil eingebaut ist geht's weiter zum launchpad.
Auf dem Launchpad machen wir einen Rechtsklick auf das SCS und wählen "Open Terminal". Jetzt öffent sich ein Fenster. Dies ist das kOS Fenster, wo wir unsere Befehle eingeben werden.
1.0: Grundlegende Befehle
Um einen neuen Code zu erstellen, gibt man den Befehl edit XYZ. in das Fenster ein (Statt XYZ gebt ihr hier natürlich den Namen eures Programms ein, ich habe KOS1 gewählt). Da das Programm nicht auf Groß-und Kleinschreibung achtet, ist es egal ob ihr Edit, edit, eDit etc eingibt. Wichtig ist, das immer wenn ihr einen Befehl eingegeben habt, ein Punkt folgen muss, in unserem Fall muss der Befehl also heißen:
Sobald wir dies eingegeben haben, öffnet sich ein neues Fenster. Dies ist das eigentliche Programmfenster, hier gibt man den Programmcode ein. Das Fenster, in dem wir eben den Befehl edit KOS1 eingegeben haben, dient nur dazu geschriebene Programme zu laden und auszuführen. Ich schreibe Programme meist allerdings in Notepad, da dies doch sehr viel einfacher und schneller geht als in dem KOS Programmfenster. Um den Code in einem Texteditor öffnen zu können, müssen wir die Datei jedoch zuerst einmal speichern. Dazu gehen wir einfach auf den "Save"-Button und dann auf den "Exit"-Button rechts daneben, woraufhin sich das "Codefenster" schließt.
Zurück im Startfenster geben wir jetzt folgendes ein:
Archive? Wie wo was?
Dateien werden im Archiv gespeichert, welches man unter KSPwin/Ships/Script finden kann. Hier werden alle eure Programmcodes gespeichert und können von hier aus auch wieder abgerufen werden. Mit dem obigen Befehl kann man Programme also permanent im Archiv speichern, wo sie jederzeit abrufbar sind. So, jetzt wollen wir unsere Datei aber öffnen. Doppelklick auf "kos1.ks" und die Datei mit Notepad (oder einem anderen Texteditor) öffnen.
Tippen wir doch mal ein:
Wie ihr seht, stehen am Anfang zwei //. Dies sagt dem Programm, das alles was hinter den beiden Slashes steht ignoriert wird. Diesen Befehl könnt ihr bei langen Codes dazu nutzen, um euch kleine Notizen zu machen, es ist jedoch wichtig das wenn ihr eine neuen Zeile anfangt am Anfang wieder zwei Slashes stehen. Soweit so gut, speichern, fertig.
Zurück im Spiel, laden wir unseren Code mit dem Befehl
Um unser Programm jetzt auszuführen, geben wir ein:
Daraufhin wird die Meldung ausgespuckt:
Warum? Ganz einfach, da das Programm ja nur aus dem Wort Hallo mit zwei // davor besteht, und da alles was nach // kommt ignoriert wird, kann das Programm auch nichts ausführen, und das Programm ist bereits zuenede bevor es überhaupt angenfangen hat.
1.1: Befehle für unseren ersten kleinen Programmablauf
Jetzt da die wichtigsten Befehle geklärt sind, können wir anfangen mit dem richtigen Code.
Zuerst wäre da der PRINT Befehl. Mit dem PRINT Befehl kann man Informationen anzeigen lassen oder vorher eingegebene Texte anzeigen lassen. Öffnen wir also die KOS1 Datei und fügen folgendes ein sodass der Code so aussieht:
- //HalloPRINT "Hello World!".
Anschließend speichern wir das ganze, kopieren wir unser Programm aus dem Archiv (Dies ist wichtig, immer wenn man den Programmcode ändert muss man das Programm neu aus dem Archiv laden!) und führen das ganze aus. Und: TADA!: Im Fenster erscheint folgendes!:
Damit haben wir unser erstes kleines Programm zum laufen gebracht!
Mit dem PRINT Befehl kann man aber nicht nur Texte anzeigen lassen. Man kann zum Beispiel auch das Ergebnis einer Rechenaufgabe anzeigen lassen. Dafür gibt man einfach folgenden Befehl in das Startfenster ein (Hierfür ist kein neues Programm erforderlich, da wir es nicht in unserem Code brauchen werden).
Und als Antwort spuckt kOS 7 aus, denn 4+3 ist sieben. Hier sind die weiteren Rechenbefehle (X/Y sind hierbei die Zahlen die ihr einsetzen könnt, ihr könnt natürlich auch sehr viel längere Rechnungen als die hier schreiben ;)).
- PRINT X+Y. //X Plus YPRINT X-Y. //X Minus YPRINT X*Y. //X mal YPRINT X/Y //X durch Y
Im weiteren kann man mit dem PRINT Befehl noch viele, viele weitere nützliche Sachen machen, zum Beispiel sich die aktuelle Höhe, Geschwindigkeit, verbleibender Treibstoff etc anzeigen lassen. Dazu jedoch später mehr.
Als letzten Befehl stelle ich hier noch den Befehl CLEARSCREEN vor. Mit diesem nützlichen Befehl können wir den Bildschirm leeren, wenn wir bspw. unser Programm starten.
2.0: Unser erstes Start-Programm
Alles schön und gut, jetzt können wir Sachen ausrechnen. Das mag vielleicht später nützlich sein, aber damit kriegen wir eine Rakete ja nicht zum fliegen! Fangen wir also an mit unserem ersten richtigen Programm um eine Rakete zum fliegen zu bringen. Dazu öffnen wir unsere KOS1 Datei und löschen den Inhalt der Datei.
Wenn das Programm startet, wäre es ganz schön, wenn der Bildschirm "gesäubert" wird. Also tippen in die erste Zeile den Befehl CLEARSCREEN. ein. Ich schreibe Befehle übrigens immer groß, aber wie oben bereits gesagt, achtet kOS nicht auf Groß/Kleinschreibung, von daher ist es euch überlassen wie ihr das macht. Als nächstes machen wir uns einen kleinen Countdown. Jetzt gebt ihr folgendes ein, damit der Code anschließend so aussieht:
- CLEARSCREEN.PRINT "3". WAIT 1.PRINT "2". WAIT 1.PRINT "1". WAIT 1.
Den PRINT Befehl kennen wir ja bereits, was hat es jedoch mit dem WAIT 1 auf sich? Ganz einfach, WAIT 1 heißt dass das Programm eine Sekunde warten soll bevor es den nächsten Schritt ausführt. So, mit der Rakete passiert mit diesem 4 Zeilen Code jedoch noch garnichts. Also geben wir als nächstes ein:
Der STAGE Befehl bewirkt genau das selbe wie als wenn ihr auf eurer Tastatur die Leertaste drücken würdet. Dieser Befehl zündet bzw. aktiviert die nächste Stufe. Bei der Z-Map Rakete ist es nun jedoch so, dass wenn man auf das Staging guckt, das man mit einmaligen aktivieren einer Stufe nur das Triebwerk aktiviert, nicht jedoch die Launchclamps und die SRB's. Also geben wir den Stage. Befehl noch einmal ein um auch die SRB's und die Launchclamps zu aktivieren. Dann das ganze speichern, laden, und ausführen, uuund das Triebwerk zündet. Mehr nicht. Jetzt fragt man sich natürlich, warum es nicht zündet. Die Antwort ist einfach:
In KSP kann man die nächste Stufe frühestens 0,5 Sekunden nach aktivierung der vorherigen Stufe zünden, kOS rattert einfach den Code innerhalb weniger Millisekunden durch, dh --> Es wird zwar 2mal gestaged, KSP reagiert auf das 2. staging jedoch nicht, da keine 0,5 Sekunden Zeit zwischen dem Staging waren.
Eine Lösung muss her! Bauen wir doch einfach nochmal den WAIT Befehl in unseren Code ein:
- CLEARSCREEN.PRINT "3". WAIT 1.PRINT "2". WAIT 1.PRINT "1". WAIT 1.STAGE.WAIT 1.0.STAGE.
Uund die Rakete hebt tatsächlich ab!
So, super, sie fliegt zwar, aber nur grade nach oben, die leeren Booster bleiben an der Rakete...um wirklich ein Orbitfähiges Programm zu schreiben, braucht es wohl noch ein wenig.
Zunächst ergänzen wir den Code um folgende Einträge:
- CLEARSCREEN.PRINT "3". WAIT 1. PRINT "2". WAIT 1. PRINT "1". WAIT 1. STAGE. //Aktiviert TriebwerkWAIT 1.0.STAGE. //Aktiviert Booster und LaunchclampsLOCK THROTTLE TO 1.0. // Vollschub!PRINT "Start!".LOCK STEERING TO UP + R(0,0,180).WHEN ALTITUDE > 5000 THEN { LOCK STEERING TO UP + R(0,-25,180). PRINT "Beginne Gravity Turn".}.
Ich gebe zu, das mag am den Anfang vielleicht ein *wenig* verwirrend klingen, ist jedoch, sobald man es verstanden hat, recht einfach. Fangen wir mit folgendem Befehl an:
LOCK THROTTLE TO 1.0.
Dieser Befehl sagt, das der Schub auf 100% gesetzt werden soll. Das Maximum ist 1.0, das Minimum 0.
LOCK STEERING TO UP + R(0,0,180).
Das ist schon ein wenig komplizierter. Der erste Teil LOCK STEERING TO UP sagt, das die Rakete nach oben ausgerichtet wird. Der Kurs wird, sofern er abweicht, korrigiert. Der zweite Teil, + R(0,0,180) gibt an, das ~zu oben noch so und so viel Grad dazu, bzw abgezogen werden~ (Ich weiß, ein furchtbarer Satz).
--> Erste Zahl gibt an, ob die Flugbahn nach Norden oder Süden verändert werden soll. Um nach Süden zu fliegen, setzt man positive Zahlen (45,90, etc) ein, um nach Norden zu fliegen setzt man negative Zahlen (-45,90, etc).
--> Zweite Zahl gibt an, ob die Flugbahn noch Osten oder Westen verändert werden soll. Um nach Westen zu fliegen, setzt man positive Zahlen (45,90, etc) ein, um nach Osten zu fliegen setzt man negative Zahlen ein (-45,-90,etc).
--> Dritte Zahl gibt die Rotation der Rakete an. Standartmäßig liegt die Rotation der Rakete bei 180° wenn man vom Launchpad aus startet und die Rakete im VAB nicht gedreht hat.
--> Beispiel
Demnach heißt der Befehl LOCK STEERING TO UP + R(0,-75,180) soviel wie --> Ziehe von "oben" 0° für Nördliche/Südliche Richtung ab, Ziehe von "oben" 75° für östliche Richtung ab und nehme 180° zu oben dazu für die Rotierung der Rakete.
WHEN ... THEN ...
Dieser Befehl heißt WENN diese Vorraussetzung erfüllt ist DANN mache folgendes.
Unser Befehl
WHEN ALTITUDE > 5000 THEN {
LOCK STEERING TO UP + R(0,-25,180).
PRINT "Beginne Gravity Turn".
}.
heißt also das wenn die Höhe über 5000 Metern ist, dann wird die Rakete auf 25° weiter östlich ausgerichtet und die Meldung "Beginne Gravity Turn" eingeblendet. Recht simpel also. Wenn wir jetzt das Programm laufen lassen, zieht die Rakete tatsächlich in 5000m nach rechts auf 25°. Das ist jedoch nur der Anfang des Gravity Turns. Mithilfe dieser WHEN ... THEN Schleifen können wir jetzt den Gravity Turn noch weiter führen, sodass die Rakete zum ende hin horizontal ausgerichtet ist. Vorher gibt es jedoch noch ein anderes Problem zu beheben...die Booster sind bereits vor Beginn des Gravity Turns ausgebrannt. Was tun?
Der WHEN ... THEN Befehl lässt sich für viele weitere Dinge verwenden, ua auch für unser Treibstoffproblem. Fügen wir dem Script folgendes hinzu:
- WHEN SOLIDFUEL > 0.01 THEN { STAGE. PRINT "Booster abgesprengt!".}.
Dasselbe Prinzip wie eben, nur eben mit anderem Inhalt: Wenn die Anzahl von SolidFuel Einheiten in der Rakete unter 0,01 liegen, dann drücke Stage und gebe die Meldung "Booster abgesprengt!" raus.
Um das ganze in der richtigen Sequenz zu machen, schneiden wir den letzten hinzugekommenen Punkt einfach aus und setzten ihn vor den Befehl "WHEN ALTITUDE > 5000...blablabla. Auch habe ich an einigen Stellen noch ein paar PRINT Befehle eingebaut. Euer Code sollte jetzt so aussehen:
- CLEARSCREEN.PRINT "3". WAIT 1. PRINT "2". WAIT 1. PRINT "1". WAIT 1. STAGE. //Aktiviert TriebwerkWAIT 1.0.STAGE. //Aktiviert Booster und LaunchclampsLOCK THROTTLE TO 1.0. // Vollschub!PRINT "Start!".LOCK STEERING TO UP + R(0,0,180).// Meldet das wenn Solidfuel Treibstoff im Schiff auf unter 75 EInheiten sinkt die Meldung "Erwarte Booster Abschaltung" herausgegeben werden soll.WHEN SHIP:SOLIDFUEL < 75 THEN { PRINT "Erwarte Booster Abschaltung".}.// Sobald Booster leer sind Meldungen rausgeben und Booster mit STAGE absprengenWHEN SHIP:SOLIDFUEL < 0.01 THEN { PRINT "Booster abgeschaltet". STAGE. PRINT "Booster abgesprengt".}.// Beginne hier Gravity TurnWHEN ALTITUDE > 5000 THEN { LOCK STEERING TO UP + R(0,-25,180). PRINT "Beginne Gravity Turn".}.WHEN ALTITUDE > 10000 THEN { LOCK STEERING TO UP + R(0,-50,180).}.WHEN ALTITUDE > 15000 THEN { LOCK STEERING TO UP + R(0,-60,180).}.WHEN ALTITUDE > 25000 THEN { LOCK STEERING TO UP + R(0,-70,180).}.WHEN ALTITUDE > 30000 THEN { LOCK STEERING TO UP + R(0,-85,180).}.// Das selbe wie bei den BoosternWHEN STAGE:LIQUIDFUEL < 20THEN { PRINT "Erwarte Triebwerkabschaltung".}.WHEN STAGE:LIQUIDFUEL < 0.001THEN { STAGE. PRINT "Triebwerk abgeschaltet und Stufe abgesprengt".}.
So, damit kommt man doch schonmal ein bisschen weiter. Jetzt habe ich den Befehl
WHEN SHIP:MAXTHRUST = 0 THEN {
STAGE.
PRESERVE.
}.
eingefügt, damit so lange gestaged wird bis das Triebwerk der folgenden Stufe Schub liefert. Damit sich die Schleife wiederholt, habe ich hier den Befehl PRESERVE benutzt.
Natürlich muss das Triebwerk in einer bestimmten Höhe auch wieder aufhören zu feuern, man möchte ja einen Orbit erreichen und keine Escape Bahn oder ähnliches. Dafür habe ich den folgenden Befehl verwendet:
WHEN APOAPSIS > 100000 THEN {
LOCK THROTTLE TO 0.
PRINT "Ziehlhohe fur Apoapsis erreicht".
SET WARP TO 3.
}.
Dieser Befehl sagt: Wenn die Apoapsis über 100.000m liegt, schalte das Triebwerk ab, gebe die Meldung "Ziehlhöhe für Apoapsis erreicht" aus und setze den Physicwarp auf Stufe 4 (Man ist ja noch in der Atmosphäre, daher Physic warp). Die folgenden Kommandos geben eigentlich nur an das sobald die Höhe höher als 70km ist der Physic warp abgestellt wird (Erst zurück warpen) und der "richtige" Timewarp angeworfen wird:
WHEN ALTITUDE > 69000 THEN {
SET WARP TO 0.
}.
WHEN ALTITUDE > 70000 THEN {
SET WARP TO 3.
}.
Um auch wirklich in eine Umlaufbahn zu kommen muss jedoch noch eine Triebwerkszündung durchgeführt werden. Diese wird mit folgenden Befehl durchfeführt:
WHEN ALTITUDE > 98000 THEN {
SET WARP TO 0.
LOCK STEERING TO UP + R(0,-90,180).
LOCK THROTTLE TO 1.0.
PRINT "Zünde Triebwerk um Periapsis auf 80.000m zu bringen".
}.
-> Wenn Höhe über 98km ist, deaktiviere den Timewarp, richte die Rakete horizontal aus und zünde das Triebwerk.
Der letzte Befehl ist statt dem WHEN ... THEN ... Auslöser mit dem WAIT bzw WAIT UNTIL Auslöser geschrieben. Dies ist wichtig, da sich das Programm wenige Sekunden nach dem Start geschlossen hätte, da die WHEN/THEN Auslöser nur eine Art "falls diese und jene Bedingung herrschen, mache.." sind. Der WAIT Befehl am Ende gibt jedoch an, das am Ende des Programms noch etwas passieren wird, nur deshalb bleibt es aktiv.
WAIT UNTIL PERIAPSIS > 80000.
LOCK THROTTLE TO 0.
PRINT "Orbit erreicht!".
--> Wenn die Periapsis 80km erreicht, deaktiviere den Schub und gebe die Meldung "Orbit erreicht!" aus.
Hier noch einmal der komplette Programmcode:
- CLEARSCREEN.
- PRINT "3". WAIT 1.
- PRINT "2". WAIT 1.
- PRINT "1". WAIT 1.
- STAGE. //Aktiviert Triebwerk
- WAIT 1.0.
- STAGE. //Aktiviert Booster und Launchclamps
- LOCK THROTTLE TO 1.0. // Vollschub!
- PRINT "Start!".
- LOCK STEERING TO UP + R(0,0,180).
- WHEN SHIP:SOLIDFUEL < 75 THEN {
- PRINT "Erwarte Booster Abschaltung".
- }.
- WHEN SHIP:SOLIDFUEL < 0.01 THEN {
- PRINT "Booster abgeschaltet.".
- STAGE.
- PRINT "Booster abgesprengt".
- }.
- WHEN ALTITUDE > 5000 THEN {
- LOCK STEERING TO UP + R(0,-25,180).
- PRINT "Beginne Gravity Turn".
- }.
- WHEN ALTITUDE > 10000 THEN {
- LOCK STEERING TO UP + R(0,-50,180).
- }.
- WHEN ALTITUDE > 15000 THEN {
- LOCK STEERING TO UP + R(0,-60,180).
- }.
- WHEN ALTITUDE > 25000 THEN {
- LOCK STEERING TO UP + R(0,-70,180).
- }.
- WHEN ALTITUDE > 30000 THEN {
- LOCK STEERING TO UP + R(0,-85,180).
- }.
- WHEN STAGE:LIQUIDFUEL < 20THEN {
- PRINT "Erwarte Triebwerkabschaltung".
- }.
- WHEN STAGE:LIQUIDFUEL < 0.001THEN {
- STAGE.
- PRINT "Triebwerk abgeschaltet und Stufe abgesprengt".
- }.
- WHEN SHIP:MAXTHRUST = 0 THEN {
- STAGE.
- PRESERVE.
- }.
- WHEN APOAPSIS > 100000 THEN {
- LOCK THROTTLE TO 0.
- PRINT "Ziehlohe fur Apoapsis erreicht".
- SET WARP TO 3.
- }.
- WHEN ALTITUDE > 69000 THEN {
- SET WARP TO 0.
- }.
- WHEN ALTITUDE > 70000 THEN {
- SET WARP TO 3.
- }.
- WHEN ALTITUDE > 98000 THEN {
- SET WARP TO 0.
- LOCK STEERING TO UP + R(0,-90,180).
- LOCK THROTTLE TO 1.0.
- PRINT "Zünde Triebwerk um Periapsis auf 80.000m zu bringen".
- }.
- WAIT UNTIL PERIAPSIS > 80000.
- LOCK THROTTLE TO 0.
- PRINT "Orbit erreicht!".
Alles anzeigen
Ich hoffe, dieses Tutorial hat euch ein wenig geholfen beim einstieg in den kOS Mod!