Die Nutzung des SDK

Wir alle wissen, dass C-Skript eine mächtige Programmiersprache ist, ich habe den Code für mehrere Spiele schreiben können, ohne das SDK anzurühren. Jedoch möchten Sie vielleicht doch darauf zurückgreifen, was bedeutet, dass Sie das SDK und entweder Visual C++, C++ Builder oder Delphi erworben haben. Gründe für die Nutzung des SDK sind z.B.:
- Eine bestimmte Funktion, die Sie dringend brauchen, wird von C-Skript nicht bereitgestellt;
- Sie möchten wirklich guten C-Skript Code wie z.B. “my.ambient = 100” verschlüsseln, weil Sie Angst haben, jemand könnte den Code stehlen, wenn Sie ihn nicht packen;
- Sie sind professioneller C++ / Delphi Programmierer und möchten C-Skript nicht verwenden, weil es viel zu simpel für Sie ist;
- Sie haben einige zeitkritische Funktionen, die in C++ / Delphi schneller laufen würden;
- Sie möchten einige beeindruckende, nie dagewesene Effekte programmieren oder ein neues Render Sub-System;

Erstellen Sie zunächst ein neues Verzeichnis namens MyDlls auf Ihrer Festplatte.

Starten Sie Ihren IDE (ich verwende Microsoft Visual C++ 6.0) und wählen Sie aus, ein neues DLL Projekt zu starten.

Drücken Sie auf “OK”. Folgendes Fenster erscheint:

Selektieren Sie “A simple DLL project”.

Drücken Sie auf “Finish” und dann “OK”. Verlassen Sie das IDE und sehen Sie sich das neue Verzeichnis namens \first in \MyDlls an.

Kopieren Sie die Dateien “a5dll.h”, “a5funcs.h” und “a5dll.lib” aus Ihrem SDK Verzeichnis nach \first. Das Ergebnis sollte so aussehen wie im Bild unten:

Doppelklicken Sie “first.dsw”, um das Projekt erneut zu laden. Stellen Sie sicher, dass Sie “FileView” angewählt haben, öffnen Sie “Source Files” und wählen Sie “first.cpp” an.

Binden Sie die beiden Header Dateien ein:

Nun muß die a5dll.lib gelinkt werden; klicken Sie auf “Project” und “Settings”:

Selektieren Sie “Category: Input” und dann “Object / library modules” und drücken Sie die “Ende” Taste auf dem Keyboard, um zum Ende der Zeile zu springen und geben Sie “a5dll.lib” ohne die Anführungszeichen ein.

Drücken Sie “OK” und builden Sie das Projekt:

Gratulation! Ihre erste DLL ist fertig! Sehen Sie sich die \debug oder \release Verzeichnisse in Ihrem \first Verzeichnis an und Sie werden Ihre brandneuen “first.dll” Datei finden!

Ok, wir haben also eine DLL geschrieben, die funktioniert, aber bislang tut sie noch nichts Nützliches. Was wäre wirklich leicht zu programmieren, aber unmöglich mit C-Skript zu programmierne? Hmm... (10 Minuten später) Ich weiß! Wir schreiben eine Funktion, die eine Datei auf der Festplatte löschen kann. C-Skript erlaubt es, jede Datei aus dem “savedir” Verzeichnis zu löschen, aber unsere neue Funktion könnte nützlich für ein Kopierschutzsystem sein oder falls wir temporäre Dateien löschen möchten, die der Installer des Spiels übrigließ, vielleicht auch die scandisk.log Datei, die immer wieder im Hauptverzeichnis der Festplatte erscheint, etc.

Wir werden die C++ Funktion namens “remove” nutzen, die <stdio.h> oder <io.h> verwendet, also müssen wir eine der beiden Header Dateien einbinden. Die Funktion, die Dateien löschen kann besteht aus drei Zeilen Code (Ok, eigentlich nur aus zweien, aber da kommen wir gleich zu). Hier ist die modifizierte first.cpp Datei:

Stellen Sie sicher, dass Ihre first.cpp genau so aussieht und buileden Sie das Projekt; Sie erhalten Ihre first.dll Datei, die in das Verzeichnis für Ihr Spiel kopiert werden muß (z.B: \work).

Die erste Codezeile tut nicht wirklich etwas Nützliches für uns: sie holt die Variable namens “temp” aus C-Skript und stellt sie in unserer Funktion als “temp” bereit. Ich brauche die Variable nicht, also wieso habe ich das getan?

Die Engine wird nicht mit “Standard” DLLs funktionieren, Sie benötigen das SDK, wenn Sie DLLs schreiben wollen. Die a5dll.lib muß in Ihr Pojekt gelinkt sein, auch wenn Ihre Funktionen keine C-Skript Objekte verwenden; deshalb habe ich mich entschlossen, “temp” zu importieren, auch wenn ich die Variable nicht brauche. Sie sollten eine Dummy Funktion oder eine solche Zeile immer einfügen, wenn Sie eine neue DLL schreiben, die nicht anderweitig auf C-Skript zugreift, oder Sie erhalten eine solche Fehlermeldung, wenn Sie versuchen, die DLL einzubinden:

Sehen wir uns die anderen beiden Codezeilen in der KillFile Funktion an: wir definieren einen Zeiger auf den String, der an die Funktion übergeben wurde und versuchen dann, die Datei zu löschen, wobei wir das Ergebnis der Operation als INT2FIX zurückliefern.

Das war der ganze C++ Teil! Sehen wir uns nun das C-Skript an:

var success = 0;
var_nsave dll_handle;

font std_font = <ackfont.pcx>, 6, 9;

text deletion_txt
{
     pos_x = 200;
     pos_y = 200;
     font = std_font;
     flags = visible;
}
 
Ich habe zwei Variablen definiert: eine namens “success” und eine, die als Handle für die “first.dll” benutzt wird; diesmal habe ich eine var_nsave genutzt, weil dadurch der Wert nicht gespeichert wird, wenn das Spiel gespeichert wird und daher auch von einer “game_load” Anweisung nicht verändert wird. Außerdem habe ich eine simple “Font” Datei definiert und einen Text, der sie benutzt.

dllfunction KillFile(x);

Jede DLL Funktion muß innerhalb der C-Skript Datei definiert sein; die Zeile oben tut genau dies.

starter terminate_file
{
     dll_handle = dll_open ("first.dll");
     while (key_t == 0) {wait (1);}
     success = KillFile ("c:\\somefile.txt");
     if (success == 0)
     {
          deletion_txt.string = "The file was deleted successfully";
     }
     else // success = -1 here
     {
          deletion_txt.string = "Error while trying to delete the file!";
     }
     sleep (3);
     deletion_txt.visible = off;
     dll_close (dll_handle);
}

Ich habe eine “starter” Funktion benutzt, das ist eine spezielle Funktion, die von selbst beim Spielstart läuft; diese öffnet die DLL und wartet, bis der Spieler die “T” Taste auf dem Keyboard drückt. Sobald dies geschieht, läuft die Funktion KillFile aus der DLL und das Ergebnis wird in der “success” Variable gesichert.

Wenn die Datei gelöscht wurde, wird success auf 0 gesetzt, ansonsten auf –1. Wo kommen die Werte her? Lesen Sie die Information über die “remove” Anweisung in der Hilfe zu MS Visual C++. Wenn die Datei gelöscht wurde, wird eine Bestätigung in deletion_txt geschrieben, andernfalls wird eine Fehlermeldung ausgegeben. Der Text wird 3 Sekunden angezeigt und verschwindet dann. Die letzte Codezeile schließt die DLL; das muß getan werden, wann immer wir aufhören, mit ihr zu arbeiten.

Das ist alles! Kopieren Sie “somefile.txt” in das Hauptverzeichnis Ihrer C:\ Festplate, starten Sie das Projekt, drücken Sie “T”; Sie sollten folgendes Bild sehen:

Verlassen Sie die Engine und laden Sie das Level erneut. Drücken Sie “T” und Sie werden dieses Bild sehen:

Die Funktion hat versucht, somefile.txt zu löschen, aber das hat nicht funktioniert, weil die Datei nicht mehr existiert! Natürlich können Sie mit KillFile jede Datei löschen, egal wie sie heißt. Vergessen Sie nicht, jeweils zwei Backslash-Zeichen anzugeben, wenn Sie den Pfad angeben.

Verwenden Sie eine Codezeile wie diese unten, wenn Sie eine Datei aus Ihrem Haupt Spielverzeichnis löschen wollen; das ist das Verzeichnis, welches die first.dll enthält und muß nicht das “savedir” sein.

success = KillFile ("somefile.txt");