Scriptkonzeption

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Kekskiller

Betreff: Scriptkonzeption

BeitragMi, Sep 29, 2004 19:49
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Sep 29, 2004 20:17
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Smile
 

Kekskiller

BeitragMi, Sep 29, 2004 20:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, ich meinte eher direkt das System ^_^" ...
 

Edlothiol

BeitragDo, Sep 30, 2004 14:32
Antworten mit Zitat
Benutzer-Profile anzeigen
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:
   return(Mul(1,Add(Div(6,9),10),3))
(Glaube ich zumindest, ich kenne mich mit der Scriptsprache nicht sonderlich aus)
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"
print 1 + 2, 3 * 4
set 1, "Blubb"
print #1
Funktionen gibts nicht, Variablen nur durchnummeriert, verschachtelte Funktionen auch nicht (Rückgabewerte werden in Variable #0 gespeichert Smile). Blocks (eigentlich mehrere Befehle in einen zusammenfassen) gehen mit {}. Allerdings kommt das vielleicht noch. Variablen werden in einer Bank gespeichert, der Stack ist mit Types realisiert. Das ganze wird in Bytecode kompiliert, es gibt etwa 25 Bytecode - Befehle.
 

Kekskiller

BeitragDo, Sep 30, 2004 18:57
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Sep 30, 2004 19:09
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Sep 30, 2004 19:33
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Sep 30, 2004 21:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragFr, Okt 01, 2004 18:38
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Sad . Kann aber
schlecht so schwer sein...

Last Anquav Hero

BeitragSo, Okt 03, 2004 10:07
Antworten mit Zitat
Benutzer-Profile anzeigen
machs doch so wie assembler Very Happy

soll ich dir vielleicht mal meine scriptsprache emailen (arbeitet nur mit strings :/ )

da hab ich ifs und variablenoperationen
 

denial

BeitragSo, Okt 03, 2004 21:39
Antworten mit Zitat
Benutzer-Profile anzeigen
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. Wink
Habs hier zwar nicht gelesen, aber in anderen Foren ist man darauf schon oft gestossen.

Also viel Glück beim Programmieren.
 

Kekskiller

BeitragSo, Okt 03, 2004 22:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey, danke für die Analysen, ezwei davon atte ich bis jetzt nur Schemen-
haft im Kopf Very Happy . Mittlerweile habe ich mir auch ne Möglichkeit für If's und
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 Wink . Das mit Assembler-Stil ist auch einfacher
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 Confused . Habe aber jetzt ja (dank den Ferien, Juchu)
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 Smile .

Last Anquav Hero

BeitragMo, Okt 04, 2004 16:04
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Very Happy
 

Kekskiller

BeitragMo, Okt 04, 2004 18:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Interessantes System, doch werde ich wohl bei den If's und dem anderem
Zeug was ganz anderes vorhaben Wink . Werde es schon nicht kopieren,
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 ^_^ .

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group