VSCode Extension Preview für Legacy Clonk

Moin,

ich habe die letzten Wochen an einer VSCode Extension für Legacy Clonk gearbeitet. Diese ist jetzt als Pre-release erhältlich!

Hauptfeatures:

  • Syntax-highlighting
  • (Ent-)packen von C4Group Dateien via File Explorer
  • Starten von Szenarien in Entwickler-Modus via File Explorer
  • Einige weitere kleinere Editor Features

Für die Benutzung kann die Extension im VSCode Marketplace installiert werden. Wählt dafür „Install Pre-release“ in der Extension-Vorschau aus.

Unterstützt ist nur Windows + Linux. Damit alle Features funktionieren, müssen in den Extension Settings entsprechende Pfade zu c4group und clonk binaries gesetzt werden.

2 Likes

Hi. Ich habe jetzt endlich mal deine Extension ausprobiert. Klasse! Ich hab selbst schon länger mit dem Gedanken gespielt sowas mal für Eclipse zu basteln aber umso besser, wenn mir jemand anderes zuvorkommt ;)

Hauptvorteil für mich ist, dass ich endlich unter Linux Clonk scripten kann und nicht immer Windows dafür starten muss. :heartbeat:
Außerdem kann ich so einfacher mit Git arbeiten und Zwischenstände fixieren.

Macht echt Spaß und funktioniert einwandfrei.

Leider kommt Clonk unter Linux nicht so mit meiner Ultra-HD-Auflösung zurecht und die Scrollbalken des ‚freien‘ Ansichtsfensters im Entwicklermodus des Spiels stimmen nicht, so dass ich nicht bis an den rechten Rand scrollen kann. Aber mit der Spieler-Ansicht und dem Verschieben von Clonks geht das schon. Aber das hat ja nichts mit deiner Erweiterung zu tun.

Toll wären natürlich noch weitere hilfreiche Features, z.B. Syntaxprüfung, Autovervollständigung, Anbindung an die Doku und das Outline des Codes. Aber ist ja nur eine Preview.

Für letzteres habe ich mir aber schonmal Abhilfe geschaffen und zwar mit der kostenlosen CodeMap-Extension von VS Code. Wenn man folgende Konfiguration in die settings.json im Projekt oder von der Clonk Extension wirft, bekommt man ein schönes Outline aller Felder und Funktionen.

    "codemap.c": [
        {
          "pattern": "^\\s*#strict\\s*\\w*",
          "clear": "^\\s*#",
          "prefix":"🔧 ",
          "icon": "function"
        },
        {
          "pattern": "^\\s*func\\s*\\w*",
          "clear": "^\\s*func\\s*",
          "prefix":"🟦 ",
          "icon": "function"
        },
        {
          "pattern": "^\\s*private\\s*func\\s*\\w*",
          "prefix":"🟥 ",
          "clear": "^\\s*private\\s*func\\s*",
          "icon": "function"
        },
        {
          "pattern": "^\\s*protected\\s*func\\s*\\w*",
          "clear": "^\\s*protected\\s*func\\s*",
          "prefix":"🟧 ",
          "icon": "function"
        },
        {
          "pattern": "^\\s*public\\s*func\\s*\\w*",
          "clear": "^\\s*public\\s*func\\s*",
          "prefix":"🟩 ",
          "icon": "function"
        },
        {
          "pattern": "^\\s*global\\s*func\\s*\\w*",
          "clear": "^\\s*global\\s*func\\s*",
          "prefix":"🟪 ",
          "icon": "function"
        },
        {
          "pattern": "^\\s*local^\\s\\w*",
          "prefix":"🔹 ",
          "clear": "^\\s*local^\\s\\",
          "icon": "function"
        },
        {
          "pattern": "^\\s*static\\s*.*",
          "prefix":"🔸 ",
          "clear": "^\\s*static\\s*",
          "icon": "function"
        }
      ],

Hey, kann man dann auch mit Copilot Szenarien schreiben lassen? :-)

1 Like

Moin.
Es freut mich, dass dir die Extension gefaellt.
Ich hatte auch ueberlegt, welches feature ich noch einbauen koennte. Fuer mich ist allerdings entscheidend, dass, was immer ich auch einbaue, zu 99% abschliessbar ist und funktioniert. Die meisten features scheitern aber dadurch wie die Skripte miteinander zusammenhaengen.

Wenn ich es richtig in Erinnerung habe, wird erst festgestellt, was der eigentliche Code von einem Objekt ist, wenn ein Szenario gestartet wird. Die Definitions die Reihenfolge der Definitions, Appendtos und und Includes koennen alle einen Einfluss darauf haben, welche Funktionen letzten Endes vorhanden sind.
Darum habe ich von Autovervollstaendigung und Dokumentation abgesehen. Ich weiss nicht mehr, ob man globale Funktionen so ueberladen kann, sodass sich die Signatur aendert. Ansonsten waere es vielleicht noch einmal eine Ueberlegung wert, wenigstens fuer diese eine Hilfe anzubieten.

An eine Outline habe ich gar nicht gedacht, da ich sie selbst nie benutze. Cool, dass du dazu was gemacht hast.

Was die Syntax Pruefung angeht, kann ich anscheinend pruefen, ob Fehler-Knoten im Highlighting vorkommen und diese hervorheben. Gibt es keine Fehler Knoten im Highlighting, heisst es allerdings nicht, dass der Syntax korrekt ist, da das Highlighting nicht zwischen den verschiedenen strict modes unterscheidet und auch einige andere Sachen zulaesst, die nicht korrekt sind.

Screenshot from 2024-05-02 20-02-10
Ich bin mir nicht sicher, wie weit sich der Ansatz sinnvoll tragen laesst, da bei meinem jetzigen versuch einfach nur festgestellt, dass es einen Syntax Fehler gibt, aber keine hilfreiche Message.

Was ich mir am ehesten Vorstellen kann, ist fuer die .txt files Syntax highlighting und Doku + Autovervollstaendigung einzubauen, da diese wohl definiert und in sich geschlossen sind.

Hey Apfelclonk. Ich habe hier große Umbauten an den lcdocs gemacht und die XML Struktur erweitert und einen Changelog für Funktionen eingeführt. Das Ganze ist eingeschlafen, auch weil meine PHPStorm Lizenz dann irgendwann abgelaufen ist und ich mein dev-setup verloren habe. Aber viel wäre nicht zu tun, dann könnte man diese XMLs auch als Funktionsdoku einlesen.

Ich weiss nicht mehr, ob man globale Funktionen so ueberladen kann, sodass sich die Signatur aendert.

Ich glaube nicht in dem Sinne, dass die ursprüngliche Signatur nicht mehr gültig ist. Aber man kann sie mit der selben Signatur überschreiben oder mit anderen Parametern überladen:

Globale Funktionen

Eine Funktion wird global definiert, indem „global“ vor „func“ gestellt wird.

Eine als global definierte Funktion kann aus jedem Script aufgerufen werden. Ihr Gültigkeitsbereich stimmt mit denen der Engine-Funktionen überein. Sie können damit auch verwendet werden, um Engine-Funktionen zu überladen und ihre Funktionsweise zu modifizieren.

https://crdocs.clonkspot.org/de/sdk/script/Funcs.html

Ich wäre schon glücklich, wenn mir fehlende Klammern und Semikolons angezeigt würden. Das sind so 70% der Bugs. Die Fallen zwar sofort beim Start eines Szenarios auf aber schöner wärs natürlich, wenn sie schon beim schreiben auffallen würden.

Falls du einen kleineren Scope als die vollständige Syntax suchst, bietet es sich vll an die „Engine“-Funktionen aus der Doku für die Autovervollständigung anzubieten. Funktionen aus der aktuellen Datei werden ja von der Autovervollständigung jetzt schon angeboten (wenn auch nur als bekannte Wörter). Da kann man dann natürlich kein Syntax-Checking machen, weil man ja nicht weiß, welche anderen gültigen Funktionen es noch gibt.