Scriptkonzeption
Übersicht

KekskillerBetreff: Scriptkonzeption |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich mache mir schon den ganzen Abend Gedanken darüber, wie ich mir eine
kleine Scriptsprache für meine paar tilesetnutzenden Spiele machen könnte. Ich hatte schon ein paar Ideen, bin nur noch nicht so recht auf die Idee Muse gekommen und wollte daher mal euch ein wenig fragen. Für beispielsweise eine kleine Rollenspielscriptingengine bräuchte man ja nicht nur simple dorthin-lauf und mach-mal-das Anweisungen. Da gehören dann auch zum Beispiel ein paar Variablen-Typen dazu, ein Übersetzer, der Scripte schnell läd und direkt im Programm bearbeitet. Zum Beispiel auch ein paat Zufälle. Stringgeschichten, usw., usw. Wie würdet ihr sowas eigentlich anpacken? Ich würde mit dem mehr oder weniger Elementaren anfangen, Variablen. Managen würde ich das ganze mit Deklarationen am Anfang und Banken. Man kann irgendwo im Script (meist oben im Script) eine Deklarations-Sektion machen, in welcher die reservierten Variable stehen. Nacheinander werden sie gezählt und eingelesen. Eine Bank wird angelegt, und dort werden je nach Speicherbedarf die einzelnen Werte reingeschrieben. Sprich, erst wird die Bezeichnung$, dann der Typ und zuletzt der Wert, der je nach Typ variabel ist. Also bräuchte ich eine zweite Bank, in der ich die Typauflistung reinschiebe. Noch besser, ein Dimfeld, dass in den paar Feldern die Länge an Bytes schreibt, die der Typ braucht. Somit bräuchte man nur typentsprechend den Zeiger weiterbewegen und davor den Wert auslesen. Dann kann man den nächsten Typ nehmen. Eigentlich doch ganz praktisch... Und Funktionen, oder eben Schlüsselwörter müssten eben elementar drin enthalten sein. Oder man könnte mit einem Aktionbefehl einen String an das Programm abgeben, dass dann per Parameter was macht. Das wäre zumindest eine Möglichkeit. Dann wären da auch noch die Rechenoperationen, wie Modulo, Or, And, usw. Die müsste man dann auch als internes Schlüsselwort verwenden, oder selbst Funktionen mit Bitverschiebung, usw bauen. Dann könnte das auch gehen. Naja, es ibt jedenfalls viele Möglichkeiten, sowas zu bauen. Wie würdet ihr es machen? |
||
![]() |
Last Anquav Hero |
![]() Antworten mit Zitat ![]() |
---|---|---|
ich hab mir den tollen stringparser von ähh wie heista noma, ich glaube codemaster genommen und dann ein paar lustige befehle erfunden, und jetzt hab ich auch einfache ifs, nicht sehr spektakulär, aber ich konnte schon einiges machen (variablen waren glaub i au schon drinne)
soooooo einfach ![]() |
||
Kekskiller |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Naja, ich meinte eher direkt das System ^_^" ... | ||
Edlothiol |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich würd es in Bytecode kompilieren (schneller). So ein Bytecode - Interpreter ist sehr schnell geschrieben, schwerer ist der Compiler. Wenn du die Variablen dynamisch willst, also den Namen mitspeichern, würde ich es trotzdem nicht in die gleiche Bank schreiben, am Besten in gar keine. Sonst wird es ein bisschen schwer, die Adresse einer Variable in der Bank zu finden.
Vielleicht kennst du (oder jemand) Clonk, in der alten Version war die Syntax der Scriptsprache noch ziemlich einfach, konnte aber trotzdem viel. Es gab keine Operatoren, sondern nur Funktionen, dann noch Ganzzahlen und Strings. Und man konnte Funktionen ohne Parameter (also eigentlich Labels) definieren. Das sah dann so aus:Code: [AUSKLAPPEN] Funktion1:
(Glaube ich zumindest, ich kenne mich mit der Scriptsprache nicht sonderlich aus)
return(Mul(1,Add(Div(6,9),10),3)) Solche verschachtelten Sachen werden normalerweise mit Hilfe eines Stacks gemacht, also wenn ein Wert kommt, wird er auf den Stack geschoben, wenn ein Operator kommt, bspw. 2 Werte geholt, addiert und das Ergebnis auf den Stack geschoben. Das ist auch nicht sonderlich schwer. Ich hab selber auch in letzter Zeit an einer Scriptsprache gearbeitet, deren Syntax in etwa so aussieht: Code: [AUSKLAPPEN] print "Test"
Funktionen gibts nicht, Variablen nur durchnummeriert, verschachtelte Funktionen auch nicht (Rückgabewerte werden in Variable #0 gespeichert print 1 + 2, 3 * 4 set 1, "Blubb" print #1 ![]() |
||
Kekskiller |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Das mit dem Bytecode ist gar keine so schlechte Idee, nur vergisst du dabei,
dass ich keine großartig-fähige Programmiersprache, sondern nur eine Art Game-Scripting machen will. Aber wenn ich mir so was schon mal zumuten will, kann ich auch sowas draus machen. Clonk ist mir nicht bekannt und glaube, dass es das auch nicht werden wird. Aber egal, die Sache mit der Variablen-Adresse ist eigentlich garnicht so schwer. Beispiel: Eine Bank istmit 3 Variablen gefüllt, 1xByte, 1xFloat und 2xInteger In einem Dimfeld sind die einzelnen Bytegrößen der Datentypen gespeichert. So ungefähr: (1) Byte - 1 (2) Float - 2 (3) Integer - 4 Die Nummern davor stellen die Position im Dimfeld dar. Also sagen wir, ich habe folgende Struktur in der Bank: Nummer Art Wert Dann lese ich die Nummer ein, welche angibt, welche Dimeldposition der Variablenname hat (werde sie in Dims speichern). Darauf folgt die Art, die sagt, wie ich das Ding aus der Bank lesen soll, sprich, je nach Wert von Art wird gesagt, das ist ein Byte, das ist ein Short, etc. Diese Nummer wird dann eben in das Längendimfeld eingegeben und sagt eben (ja nach Länge), wie viel Bytes vorgesprungen werden müssen, um zur Nummer der nächsten Variable zu kommen. Also so komliziert ist das nicht. Das mit Befehlen und Funktionen werde ich wohl ähnlich machen. Sprich, Funktionen werden nach ähnlichem Prinzip gespeichert, nur der Inhalt wird als BankAdresse angegeben, in welcher die Befehle auch mit Nummer angegeben werden. Mir komme die Ideen jetzt so schnell, wie einem Fisch der Tod bei Gobi ^^ . |
||
![]() |
bruZard |
![]() Antworten mit Zitat ![]() |
---|---|---|
Am einfachsten ist es nicht gleich komplette Game Strukturen zu beschreiben, sondern nur States zu setzen die _vor_ Levelbeginn gelesen werden. Beispiel:
Code: [AUSKLAPPEN] PlayerStart = x,y,z Diese einfache Art der Einflussname wende ich bei Timemill an, ein Script um ein Licht zu definieren das Objekte dazu veranlasst einen Realtime Schatten zu werfen sieht dort so aus: Code: [AUSKLAPPEN] /* Schatten werfendes Licht definieren Dieses Licht ist nur ein Punkt im Raum und kein reales DX Licht! */ SHADOWLIGHT { Light = shadowlight1 // Meshchild Range = 30.0 // Lightrange RealLight = True // True = Blitz3D erzeugt ein Pointlight PlayerLight = False // True = Das Licht bewegt sich mit dem Player } Mit diesem kurzen Script wird ein Objekt erzeugt und das alles ohne Einflussnahme des Hauptcodes, dieser wertet die Parameter aus und erzeugt vor Levelbeginn die eigentlichen Strukturen. oder... Code: [AUSKLAPPEN] /* Eine Waffe erzeugen */ NEW_WEAPON { ID = 1 // Nummer der Waffe Name = Tiny Gun // Name der Waffe Model = models\weapon1.b3d // Model der Waffe ShadowReceiver = Box01 // Childname der Waffe } |
||
PIV 2,4GHz - 1GB DDR 333 - ATI Radeon9600 - WinXP - DX9.0c - BMax 1.14 - B3D 1.91 - 1280x1024x32
User posted image |
Kekskiller |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Naja, deine Variante ist eher eine kleine Initialisierung, anstatt ein Script.
Meine Scripte sollen ja eben etwas komplexer sein, da ich schließlich auch (wie der Rpgmaker schön präsentiert) ein Scripting bei Npcs, Türen, Schatztruhen oder ähnlichem machen. Denn wenn ich alles im Spiel so zurechtlege, dann könnte ich das wiebei Tricorn machen, eine Funktion für jede Initialisierung. Das würde mir nicht so ganz gefallen. Und wo bleibt bei Inits auch schon der Spaß? |
||
BIG BUG |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Auch wenn du keine großartige Programmiersprache machen willst, solltest du dein Script in Bytecode übersetzen, da du ansonsten laaahme Stringvergleiche machen müsstest. | ||
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final) |
Kekskiller |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ja, habe mittlerweile auch mit dem Übersetzen zum Byte-Code
angefangen. Im Prinzip müsste man das ganze sowieso immer nur befehlsabschnittmäßig machen. Ich hatte nähmlich die einzelnen Funktionen wie in BB eingeteilt, sprich, ich trenne einzelne Abschnitte mit Doppelpunkten und gehe eben reium um die Datei damit durch. Jeder Abschnitt wird dann analysiert und auf Funktionen überprüft. Falls mehrere Vorhanden sind, dann werden Fehlercodes zurückgegeben. Ansonsten wird geprüft, ob hinter dem Befehl in Klammern, oder auch nicht, passend Parameter stehen. Eigentlich ganz pratikabel. Und entsprechend der gefundenen Funktion wird eine Nummer in den Code geschrieben. Genauso wie mit Variablen, oder eigenen Funktionen. Aber egal. Mir fehlt nur noch eine Rechenfunktion, welche taschenrechner- mäßig Variablenoperationen auswertet. Da kommt mir gerade in den Kopf, wie ich das denn wohl mit Schleifen und Ifs mache ![]() schlecht so schwer sein... |
||
![]() |
Last Anquav Hero |
![]() Antworten mit Zitat ![]() |
---|---|---|
machs doch so wie assembler ![]() soll ich dir vielleicht mal meine scriptsprache emailen (arbeitet nur mit strings :/ ) da hab ich ifs und variablenoperationen |
||
denial |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Fals es noch nicht erwähnt wurde:
Es ist verdammt hilfreich einen Tokenstream zu erstellen. Somit lässt sich die Fehleranalyse des Quelltextes, welcher sich beim allgemeinen Compilerbau wie folgt aufbaut, einfacher realisieren: - Lexikalische Analyse Hier wird analisiert, ob Schlüsselwörter, Variablennamen und Zahlen richtig geschrieben wurden. Dies kann sehr einfach durch sogenannte DEA's (Determinierte, endliche Automaten) realisiert werden. Mehr Infos dazu gibts bei Google, also googel dir mal einen! - Syntaktische Analyse Die eigentliche "Grammatik der Sprache". Hier wird sichergestellt, dass der eigentliche Aufbau des Codes korrekt ist. Beispiele: Nach Befehl folgt Semikolon, Funktionen innerhalb von Befehlen müssen ihre Parameter in Klammern tragen, usw. - Semantische Analyse Und letzlich wird hier "der Sinn" des Codes geprüft. Beispielsweise darf eine Zahlenvariable (z.B. WORD oder int) kein Rückgabeträger einer Stringfunktion sein. Wie gesagt, einfach mal zu dem Thema "Compilerbau" googeln... Das Argument, Scriptsprachen bräuchten keinen Compiler finde ich im Übrigen arm. ![]() Habs hier zwar nicht gelesen, aber in anderen Foren ist man darauf schon oft gestossen. Also viel Glück beim Programmieren. |
||
Kekskiller |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hey, danke für die Analysen, ezwei davon atte ich bis jetzt nur Schemen-
haft im Kopf ![]() Schleifen gefunden. Da ich nähmlich direkt mit dem Bytecode arbeite, kann ich ja schließlich zwischen Bytes in der Datei rumspringen, also ist das im Prinzip garnicht so schwer ![]() zu lösen als per Rechenoperationen, werde ich mal so machen ^^ . Das mit dem Compiler muss ich dann aber wohl nen bißchen anders machen. Denn im Moment mache ich das Grundgerüst mit Blitzbasic, was ja eben nicht zu vergleichen ist mit Asm ![]() etwas mehr Zeit und kann mich damit mehr beschäftigen. @Last Anquav Hero: Wäre echt net von dir, so könnte ich mal etwas lernen in Sachen If-Umgang. Wäre auf jeden Fall sehr praktisch ![]() |
||
![]() |
Last Anquav Hero |
![]() Antworten mit Zitat ![]() |
---|---|---|
habs geschickt, sag wie du es findest
du darfst es aber nciht weiterverwenden, ich möchte sie gerne für meine eigenen projekte noch verwenden ![]() |
||
Kekskiller |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Interessantes System, doch werde ich wohl bei den If's und dem anderem
Zeug was ganz anderes vorhaben ![]() schließlich habe ich mir auch schon solch schöne Konstruktionen ausgedacht, wie ich mein Script aufbaue ^_^ . Aber egal, werde mich morgen früh mal ransetzen und weitermachen. Heute mach eine Diablo-Sassion ^_^ . |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group