Scripting mit AngelScript

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
Jonathan
Establishment
Beiträge: 1293
Registriert: 04.08.2004, 20:06

Scripting mit AngelScript

Beitrag von Jonathan » 16.03.2019, 23:52

Moin,

ich möchte gerne eine Scriptsprache einbauen (C++ Game). Momentan ist mein Favorit Angel Script, und zwar aus folgenden Gründen:

- klein und kompakt. Ich will keinen Python-Interpreter mitliefern
- Kompatibilität zu C++ per Design
- Statische Typen. Wer mich kennt, weiß, dass ich da großen wert drauf lege
- wird noch aktiv gepflegt
- wird zumindest in einigen bekannten Spielen offenbar erfolgreich genutzt
- soweit ich das sehen kann: Keine Abhängigkeiten. Man schmeißt einfach den Code in sein Projekt und kann loslegen, kein CMake-Quatsch oder sonstiges.

Ich bin gerade dabei mir die Bibliothek anzuschauen, Meinungen und Warnung sind deshalb willkommen. Speziell würde mich Feedback von Schrompf interessieren, Splatter ist nämlich eines der Spiele auf der offiziellen Liste.
Lieber dumm fragen, als dumm bleiben!

Benutzeravatar
Krishty
Establishment
Beiträge: 6905
Registriert: 26.02.2009, 12:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Scripting mit AngelScript

Beitrag von Krishty » 17.03.2019, 00:13

Bis Schrompf Zeit findet, habe ich was aus dem Archiv herausgesucht:
Allgemeine Diskussion über Skriptsprachen 2012: viewtopic.php?p=32214#p32214
Schrompfs AngelScript-Meinungen 2011: viewtopic.php?p=23242#p23242
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne

Alexander Kornrumpf
Moderator
Beiträge: 1669
Registriert: 25.02.2009, 14:37

Re: Scripting mit AngelScript

Beitrag von Alexander Kornrumpf » 17.03.2019, 10:24

Jonathan hat geschrieben:
16.03.2019, 23:52
Moin,

ich möchte gerne eine Scriptsprache einbauen (C++ Game).
Warum eigentlich?

Benutzeravatar
Jonathan
Establishment
Beiträge: 1293
Registriert: 04.08.2004, 20:06

Re: Scripting mit AngelScript

Beitrag von Jonathan » 17.03.2019, 12:14

Alexander Kornrumpf hat geschrieben:
17.03.2019, 10:24
Warum eigentlich?
Im Wesentlichen um ein Triggersystem umzusetzen. Schalter A öffnet Tür B. Das kann man natürlich auch einfacher haben, aber ich dachte mir, man kommt vermutlich schnell an den Punkt, wo "n Bedingungen logisch Verknüpft lösen m Aktionen aus" nicht mehr unbedingt ausreichen. Und dann kann man es gleich auch richtig machen und beliebige Skripte erlauben.

Letztendlich soll es ein Puzzle-Spiel aus der Egoperspektive werden. Daher auch meine Ego-Controller Posts im [Anti]-Jammer-Thread.
Lieber dumm fragen, als dumm bleiben!

Benutzeravatar
Schrompf
Moderator
Beiträge: 3874
Registriert: 26.02.2009, 00:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Scripting mit AngelScript

Beitrag von Schrompf » 20.03.2019, 16:07

Ich benutze AngelScript auch für mein aktuelles Projekt noch. Aber ich kann nicht wirklich hilfreiches Feedback beitragen, außer: es geht. Ich habe nämlich seit Jahrzehnten keine Alternative mehr ausprobiert. Höchstens Unity und C#, und das ist Meilen besser als Angelscript, aber halt wegen des fertigen Toolings dafür.

Ich mag den pragmatischen Ansatz bei Angelscript: du kannst inzwischen alle Referenzzähler und den ganzen Scheiß abschalten und kriegst eine statisch typisierte Sprache, die komplett unintrusive all Deine C++-Typen abbilden kann. Meine ganzen Mathe-Typen und so kann ich mit allen Operatoren als ALL_FLOATS oder sowas anmelden und kann damit im Script rechnen wie im C++. Alle anderen Typen werden eh vom Spiel erstellt und verwaltet, im Skript sind das alles reine Referenzen. Ich kann damit prima arbeiten. Ich wünsche mir aber natürlich viele Sachen - allen voran ne einfache Code Completion oder Compile Time Validation. Es ist ein bissl nervend, den Skriptcode anzupassen und dann erst beim Starten ne Exception zu fangen und im Log nachgucken zu müssen, was genau denn am Skript jetzt scheitert.

Skripting ist bei mir außerdem noch ein Bereich der hässlichen Hacks. Ich schreibe vor jeder Skriptausführung die Laufzeitdetails wie Spielwelt-Zeiger, Arbeitskontext (Client, Lokaler Client oder Server) und sowas in ne globale SkriptKontext-Struktur, damit alle Funktionen im Skript kontextfrei und bequem arbeiten können. Wenn dann aus dem Skript noch ein Skript getriggert wird, bau ich über ne statische Variable nen schmutzigen Stack des Kontextes auf. Definitiv kein Lehrbeispiel für Architektur, aber es funktioniert.
Häuptling von Dreamworlds. Baut an was Neuem. Hilft nebenbei nur höchst selten an der Open Asset Import Library mit.

Benutzeravatar
Thoran
Establishment
Beiträge: 198
Registriert: 15.05.2009, 12:51
Wohnort: Stuttgart
Kontaktdaten:

Re: Scripting mit AngelScript

Beitrag von Thoran » 21.03.2019, 16:50

Ich hab vor einigen Jahren auch AngelScript für meine Game-Engine auf Ogre3D-Basis verwendet. Mir war das damals wesentlich lieber als Lua, mit dessen Tabellen-Konzept ich nicht klar kam. In meiner Engine konnte man für ein beliebiges Objekt im Spiel ein Skript definieren, dass das Verhalten dieses Objektes steuerte. Das Verhalten wurde dabei über eine State-Machine abgebildet. Damit ich nicht so viel Aufwand mit dem Skripten hatte, habe ich mir dafür einen grafischen Skript-Editor gebaut, mit dem ich die StateMachines zusammen klicken konnte. Danach musste man noch etwas manuell nacharbeiten, um zum Beispiel Logik für die Transitionen zwischen den States zu realisieren (das ging nicht über mein Tool). Damals war ich mit Abgelscript sehr zufrieden, auch wenn die Skripte in meinem Fall recht lang werden konnten. Das wäre aber wahrscheinlich mit anderen Skriptsprachen auch passiert und lag eher in der Natur meiner State-Machine.
Zwischenzeitlich habe ich die Engine jedoch eingestellt und bin bei UE4 gelandet, was mit Blueprints den Weg des Skriptings geht, den ich immer haben wollte.
Wer Rechtschreibfehler findet, darf diese gerne behalten.
Mein Entwicklertagebuch
Aktuelle Projekte: Universum: Domination (ehemalig AlphaOmega),Universum: Sternenjäger
Spieleengine Unreal 4

Benutzeravatar
Jonathan
Establishment
Beiträge: 1293
Registriert: 04.08.2004, 20:06

Re: Scripting mit AngelScript

Beitrag von Jonathan » 23.03.2019, 12:42

Vielen Dank fürs Feedback. Ich habe ein paar Tage mit AS rumgespielt und habe jetzt auch erste Erfahrungen.

Was mir als aller erstes auffiel: Man ist das alt. Keine Namespaces, man muss überall chars* statt strings übergeben (ok, dieser Punkt ist strittig, nicht alle benutzen std::string), und, als ich für ein allererstes Beispiel ein Lambda binden wollte ging das nicht und ich habe auch im Internet keine Lösung dafür gefunden. Ich hätte auf ein Interface vergleichbar mit std::function gehofft, wo man sehr elegant globale Funktionen, Methoden, Lambdas und irgendwelche Ergebnisse von std::bind übergeben kann. Geht scheinbar nicht. Oh und wenn man Parameter an Skripte übergeben will, muss man sie von Hand in der richtigen Reihenfolge auf den Stack leben? Das duftet ja nach Assembler... Aber ich bin mir sicher, wenn ich mich mal 20 Minuten in Ruhe hinsetze kann man sich etwas sehr schönes mit variadic-Templates schreiben und dann ist die Sache erledigt. Hätte nur halt auch so schon drin sein können...

Die Dokumentation ist so mittelgut. Es gibt durchaus längere Texte die Konzepte erklären und nicht nur die standard Interfacekommentare, aber viele davon könnten ein klein wenig ausführlicher sein. Man muss auch öfters mal hin und her springen, um Operatoren zu überladen muss man wissen, wie diese in der Skriptsprache implementiert sind und wie man sie registriert, beides steht an vollkommen unterschiedlichen Stellen. Und als Nischenprodukt gibt es auch nur mäßig viele Treffen bei google&co. Ich glaube eigentlich fehlen mir nur ein paar mehr Beispiele die typische Use-Cases abdecken und das etwas weiter erklären. Bisher habe ich zwar immer noch alles gefunden was ich gesucht habe, es hätte aber auch mit weniger Suchen gehen können.

Nun zum Guten: Die Integration lief erstaunlich reibungslos. Es gibt keine fiesen Abhängigkeiten, man kann einfach so loslegen. Besonders viel Code braucht man auch nicht, ich habe angefangen einen kleinen Scriptmanager zu schreiben der alles verwaltet und der hat bis jetzt 150 Zeilen. Und man kann letztendlich doch überraschend nett eigene Klassen einbinden: Die Unterscheidung zwischen value und reference Typen klingt erst komisch, ist dann aber sinnvoll. Meine Entities müssen beim erzeugen auf komplexe Art mit dem Scene-Manager verbunden werden, das will ich gar nicht dynamisch in einem Skript machen. Aber dank reference-Typ braucht man nur das sichtbar zu machen, was man wirklich benötigt. Auf der anderen Seite habe ich angefangen, glm::vec3 anzubinden, es ist extrem nett in Skripten mit 3d Vectoren rechnen zu können (inklusiv Operator-Überladung).

Und die Debug-Ausgaben sind überraschend Hilfreich. Immer wenn ich etwas falsch verwendet habe konnte ich anhand der Meldung den Fehler finden. Man kann durchaus einiges falsch machen (z.B. muss man die Calling-Convention explizit angeben), aber man bekommt diese Fehler gefixt, und das ist auch gut.


Ansich hat es Schrompf schon ziemlich gut zusammen gefasst: "Es geht". Man bekommt ohne viel Aufwand Skripte in sein Projekt, aber alles wirkt etwas rustikal und nicht unbedingt super poliert oder super benutzerfreundlich. Ich bin immer noch am experimentieren, habe aber mittlerweile vermutlich jedes Feature einmal getestet, das ich benutzen möchte. Insgesamt ist meine Meinung bisher ganz positiv, ich glaube AngelScript ist das, wonach ich gesucht habe.
Lieber dumm fragen, als dumm bleiben!

Benutzeravatar
Schrompf
Moderator
Beiträge: 3874
Registriert: 26.02.2009, 00:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: Scripting mit AngelScript

Beitrag von Schrompf » 25.03.2019, 10:19

Und es wird noch gepflegt. Wenn Du mal wirklich nicht weiter kommst (und den Overhead für eine Frage an echte Menschen in Kauf nimmst), kannst Du auf gamedev.net im eigenen Unterforum ne Frage stellen und der orginale AngelScript-Autor antwortet. Sehr hilfreich.
Häuptling von Dreamworlds. Baut an was Neuem. Hilft nebenbei nur höchst selten an der Open Asset Import Library mit.

Benutzeravatar
Jonathan
Establishment
Beiträge: 1293
Registriert: 04.08.2004, 20:06

Re: Scripting mit AngelScript

Beitrag von Jonathan » 20.06.2019, 00:00

Noch eine Frage an die Compiler-Experten. Ich versuche, AngelScript in einer 64bit Anwendung zu verwenden (mit VS2015) und bekomme Compilerfehler. Die Dokumentation sagt dazu:

"The MSVC compiler doesn't support inline assembler for the x86 64bit CPU family. To support this platform a separate assembler file has been created: as_callfunc_x64_msvc_asm.asm. To compile this file it is necessary to configure a custom build command with the following: ml64.exe /c /nologo /Fo$(OutDir)\as_callfunc_x64_msvc_asm.obj /W3 /Zi /Ta $(InputDir)\$(InputFileName)"

Der Befehl hat so direkt bei mir nicht funktioniert (unter anderem weil meine VC Version scheinbar kein InputDir Makro hat? Es steht zumindest nicht in der Liste). Ich habe den Befehl jetzt etwas angepasst, er funktioniert aber immer noch nicht:

ml64.exe /Fo$(OutDir)\as_callfunc_x64_msvc_asm.obj /c /W3 /Zi /Ta ../../Source/AngelScript/as_callfunc_x64_msvc_asm.asm

In der ml64 Dokumentation heißt es unter anderem, dass /c ggf. nach /Fo kommen soll, im Beispiel sieht es so aus, als würde man mit /c Dateinamen angeben, aber hinter /Ta wohl auch. Ich bin ein bisschen verwirrt, was der Befehl eigentlich genau machen soll (außer halt asm->obj zu kompilieren).

Es werden keine Fehler angezeigt, aber auch keine Ausgabedatei erstellt. Zumindest der Eingabedateiname scheint richtig (wenn man ihn ändert gibt es Fehlermeldungen) und der Ausgabepfad scheint in der Makro-Preview auch richtig zu sein. In der Konsole steht nur "Assembling: ../../Source/AngelScript/as_callfunc_x64_msvc_asm.asm", aber es wird keine .obj erstellt (auch nicht in anderen Ordnern). Im späteren Build-Prozess nörgelt der Linker dann, weil er die .obj Datei nicht finden kann. Was jetzt?
Lieber dumm fragen, als dumm bleiben!

Benutzeravatar
Krishty
Establishment
Beiträge: 6905
Registriert: 26.02.2009, 12:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Scripting mit AngelScript

Beitrag von Krishty » 20.06.2019, 00:09

Falls du normalerweise in der IDE arbeitest:

1. Rechtsklick aufs Projekt -> Build Dependencies -> Build Customizations -> Häkchen bei masm
2. as_callfunc_x64_msvc_asm.asm dem Projekt hinzufügen
3. Kompilieren und Linken sollte nun genau wie C++ funktionieren

Die Befehlszeile rühre ich für sowas normalerweise mit der Kneifzange nicht an.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne

Benutzeravatar
Jonathan
Establishment
Beiträge: 1293
Registriert: 04.08.2004, 20:06

Re: Scripting mit AngelScript

Beitrag von Jonathan » 20.06.2019, 10:06

Äh ja. Wäre ich jetzt nicht drauf gekommen, klappt aber und ist viel viel einfacher. Geil, danke!
Lieber dumm fragen, als dumm bleiben!

Antworten