Kingdoms of Amalur: Reckoning – Crash unter Windows 8/10

Da ich Kingdoms of Amalur: Reckoning in der Origin Game Time ausprobiert und es mir gefallen hat und dann vor kurzem auch noch im Angebot war habe ich es mir gekauft. Mittlerweile habe ich aber als Betriebssystem Windows 10 Insider Preview, doch unter Windows 8/8.1 ist dies genauso möglich. Beim Start crasht das Spiel ohne Grund, dachte ich.

Bei mir hat es geholfen sobald man das Spiel gestartet hat nicht die Maus zu bewegen. Durch das Hauptmenü muss man nur mit Tastatur steuern, lädt man seinen Spielstand oder fängt einen neuen an und ist dann im Spiel selber, dann ist es möglich wieder die Maus zu benutzen ohne, dass das Spiel crasht.

[SpaceEngineers/C#] Blocks working? | Damaged Blocks? (English)

Dieser Artikel ist auch in Deutsch verfügbar. Um ihn in Deutsch zu lesen klicke hier.


Finally, I wanted to have a look now at in-game programming in Space Engineers, not only because I’m writing C# programs since a couple of years. Until now I wrote a little kind of tutorial and published it on this blog and surprisingly I saw that my script (below) has 12 followers now, although it’s just a simple script. Apart from that I will publish all scripts on this blog here and explain them a bit. You will find a link to the Steam Workshop-Site if available below the code.

Note for English readers:
I can not promise to translate every article into English but I will try to do so. It is possible that it can take some time until I publish it in English.

Steam Workshop


First of all, I initialise the List blocks which we need to cache all our blocks within the Grid. With GridTerminalSystem we gain access to all block within that current grid.. In this case I want to get all blocks, therefore I use the type IMyTerminalBlock that is used by all blocks inside the game.

Next I use the for-loop to iterate through each block. By the way: I’m just using the for-loop because the game has some problems with foreach-loops, mostly on 64-bit systems.

Then I check with !blocks[i].IsFunctional if this block is functional. This means, in Space Engineers, that the block is below the red line. If this is the case, the block shall be visible on our HUD. I do that with blocks[i].RequestShowOnHUD(true). I can’t do it with ShowOnHUD because this is an readonly property.

 

[SpaceEngineers/C#] Blocks working? | Beschädigte Blöcke?

This article is also available in English. Click here to view it in English.


Ich wollte mich nun auch endlich mal mit der In-Game Programmierung beschäftigen, zumal ich schon seit einigen Jahren C# Programme schreibe. Mittlerweile habe ich einen ersten Teil als eine Art Tutorial veröffentlicht und durch Zufall gesehen, dass mein Skript (unten), welches ich gestern als erstes Skript veröffentlicht habe, bereits 12 Abonnenten gewonnen hat und das obwohl es nur ein simples Skript ist. Zudem veröffentliche ich alle Skripte auf meinem Blog hier, erkläre sie etwas und verlinke jeweils auf die Steam Workshop-Seite, falls vorhanden.

Steam Workshop


Zuerst initialisiere ich die Liste blocks welche man benötigt um die Blöcke die wir benötigen zwischenzuspeichern. Mit dem GridTerminalSystem erhalten wir Zugriff auf alle Blöcke des Grids. In diesem Fall möchte ich alle Blöcke erhalten, weswegen ich auch den Typ IMyTerminalBlock verwende, denn jeder Block besitzt diesen Typen.

Anschließend benutze ich die for-Schleife um durch jeden Block zu iterieren. for-Schleife übrigens nur, weil die foreach-Schleife aktuell auf einigen Systemen, gerade bei 64-bit Systemen Probleme macht.

Nun prüfe ich mit !blocks[i].IsFunctional ob dieser beschädigt und damit nicht funktionsfähig ist. Dies bedeutet in Space Engineers, dass der Block unterhalb der roten Linie ist. Falls dies der Fall ist, soll der Block auf dem HUD angezeigt werden, was ich dann mit blocks[i].RequestShowOnHUD(true) bzw false realisiere. RequestShowOnHUD() übrigens deswegen, weil ShowOnHUD eine schreibgeschützte Eigenschaft ist.

[Space Engineers/C#] In-Game Programming – Teil 1

Mit dieser Serie möchte ich gerne hin und wieder ein paar Dinge bezüglich der In-Game Programmierung in Space Engineers behandeln um Leuten die In-Game Programmierung, welche in C# erfolgen muss, nahe zu bringen. Zuerst einmal lautet die Frage warum überhaupt C#? Die Entwickler von Space Engineers entwickelten im Laufe der Zeit ihre eigene Engine, genannt VRAGE. Space Engineers und auch Medieval Engineers verwenden VRAGE 2.0, die älteren MinerWars Teile hingegen die VRAGE 1.0. Die VRAGE Engine wiederum basierte ursprünglich auf XNA, Microsoft Framework für Spieleentwicklung in C#. Marek Rosa, CEO und Founder der Keen Software House Firma, welche diese Spiele entwickeln kommentierte auf Facebook einen Eintrag zum Thema XNA:

Marek Rosa FireFox Bancroft: we abandoned XNA more than year ago. Now it’s DirectX only

C# ist eine Programmiersprache die generell nur auf dem Windows Betriebssystem läuft obwohl es das sogenannte Mono-Projekt gibt, welches C# ebenso auf Linux und Mac lauffähig macht, zumindest rudimentär. Die Unity Engine verwendet Mono um C# Skripts zu kompilieren. Aber das nur als kleinen Einstieg und background information, zurück zum eigentlichen Thema: Programmierung in Space Engineers.

In Space Engineers (von nun an abgekürzt durch SE) gibt es einen Block namens: Programmierbarer Block (orig.: Probammable Block). Hat man diesen Block auf einem kleinen- oder großen Schiff oder auf einer Station platziert kann man diesen mit K öffnen und dann den Code bearbeiten oder ausführen lassen. Ich schreibe den Code vorher aber ganz gerne in einem Editor, weil man dann die offizielle Dokumentation zur In-Game Programmierung geöffnet lassen und nachschauen kann. Danach ein einfaches Copy & Paste, wo dann im Spiel der Code überprüft und ggf. korrigiert werden kann. Hier der link zur offiziellen Dokumentation, zur Zeit nur auf Englisch verfügbar:

Official Guide: Programmable Block

 Anmerken sollte ich noch, dass nicht alles aus C# auch automatisch in SE nutzbar ist. Zum Zeitpunkt wo ich diesen Artikel schreibe sind noch Probleme bekannt, welche auch im offiziellen Guide erwähnt werden. Unter anderem gibt es bei manchen Systemkonfigurationen, hauptsächlich 64-bit Systeme, Probleme bei foreach-Loops. for-Loops sind aber möglich und müssen stattdessen verwendet werden.

Jedes Programm benötigt einen Einstiegspunkt, einen Punkt der dem Programm bekannt sein muss. Und in dem C# Fall und ebenso auch in SE ist dies eine Methode namens Main. Unser komplett leeres Grundgerüst sieht also wie folgt aus:

Innerhalb der geschweiften Klammern müssen wir unseren Code, die Logik reinschreiben. // markiert die gesamte Zeile als Kommentar und wird vom Compiler nicht berücksichtigt. Zudem können Kommentare auch so aussehen:

Der nächste wichtige Aspekt ist zu wissen wie wir Zugriff auf die Blöcke bekommen. Im übrigen ist es aktuell nur möglich Zugriff auf die Blöcke zu bekommen, welche auf demselben Grid sind wie der programmierbare Block. In einem früheren Blogeintrag von Marek Rosa (hier, Inspiration: hier), konnte ich ihn zu einigen Dingen inspirieren die hoffentlich, bald ins Spiel aufgenommen werden. Auf das Grid bekommen wir über GridTerminalSystem Zugriff. Dabei gibt es drei Möglichkeiten Blöcke zu bekommen.

  • GetBlocksOfType<T>: Bei dieser Methode können wir alle Blöcke eines bestimmten Typs abrufen. Die Typen sind unterschiedlich. Jeder Block hat seinen eigenen Typ (Antenne, Leuchtfeuer, Bohrer, etc.). Zudem haben alle Blöcke aber zwei gemeinsame Typen die vererbt werden. Diese sind IMyCubeBlock und IMyTerminalBlock.
  • SearchBlocksOfName: Bei dieser Methode können wir alle Blöcke die einen bestimmten Namen haben abrufen. Zum Beispiel nennen wir die Blöcke alle Light, dann würden wir all diese Blöcke bekommen. Komplet typenunabhängig.
  • GetBlockWithName: Wie SearchBlocksOfName, nur rufen wir bei dieser Methode nur einen einzigen Block und keine Liste von Blöcken ab.

Die Blöcke dir wir dann von der Methode erhalten müssen aber zwischengespeichert werden. Dieses machen wir mit Listen. Nun folgen drei Beispiele, jeweils ein Beispiel zu jeder Methode die oben beschrieben ist.

Im letzten Code-Beispiel verwende ich keine Liste, da wir ja nur einen Block abrufen. Zu erwähnen ist hier, dass wir aber lieber unsere Variablen „leeren“, bevor wir das GridTerminalSystem verwenden. Dies würden wir bei Listen wie folgt tun:


In der kommenden Zeit werde ich des Öfteren Skripte posten und diese erklären und auch im Steam Workshop zur Verfügung stellen.