Nachdem ich mir zweimal den Post durchgelesen hatte und immer noch nicht verstanden hatte, was zum Henker,denn die Problemstellung sein soll, und, da der Begriff "Modding" in seiner Implementation und Vorgehensweise nicht abbegrenzt ist,
schreibe ich einen etwas längeren Post. Gott (wahlweise Buddah) möge mir die folgenden Verbrechen an der deutschen Grammatik verzeihen.
Was ist ein Mod?
Laut Wikipedia ist ein Mod eine Modifikation eine Spiels, welcher von einem sog. Modder erstellt worden ist.
Jedoch gibt es verschieden Möglichkeiten mit denen man ein Spiel
modden kann:
Ressourcen austauschen
Ich war nie professioneller Modder oder sonst etwas in die Richtung, deshalb kenne ich keine Fachbegriffe, jedoch weis ich aus eigenen Projekten was man machen kann.
Die einfachste Variante des 'moddings' wäre das Austauschen von Ressourcen. Ein Beispiel wären die
Texturepacks aus Minecraft.
Dabei werden lediglich die Texturen mit den Originaltexturen des Spiels ausgetauscht.
Hier mal
ein Beispiel, wie man durch das Austauschen der Texturen (und das Fälschen von einigen Hashcodes) das Auftreten eines Spiels verändern kann.
Natürlich ist diese Art des Moddings nicht nur auf Texturen beschränkt. Man kann
JEDE Datei austauschen und es laufen bringen, wenn man einige Sonderfälle des Spiels beachtet, z.B. die Hashcodes der Ressourcenpaket aus Urban Terror.
Sounddateien, 3D-Modelle oder Scripte, Plugins und/oder DLLs können ausgetauscht werden. Dabei wären wir schon beim nächsten Punkt.
Code modding
Ich habe lange Urban Terror früher "gesuchtet" und tatsächlich auch nach Wegen gesucht, jenes Spiel zu modifizieren.
Es ist mir in soweit geklückt, dass ich Begriffen habe, dass das Spielverhalten über eine ".qvm" Datei (alternativ DLL) definiert wird.
Diese ".qvm"-Datei wird von einer virtuellen Maschine der Quake 3 Engine ausgeführt und besitzt auch ein eigenes "Instruction Set" (falls du nicht weis was das ist, google das mal und befasse dich mit etwas Assembler).
Um meinen heisgeliebten Zombiemod zu machen, musste ich die Instruktionen teilweise überschreiben und an anderen Stellen anpassen.
Anekdote: Als ich mich bei FrozenSand beworben habe um an den Projekt mitwirken zu können, bin ich auf dem TS von denen gegangen und habe mit den "Lead Programmers" in Kontakt getreten. Beide wohl einigermaßen bekannt, der eine "TTimo" von idTech und "Fenix". Sie sind ausgetickt, als sie herausfanden, dass ich die QVMs gemoddet habe. War anscheinend nicht legal wegen der EULA oder sonst was *grins*
Wie auch immer. Dieses Verfahren kannst du eigentlich auch auf jede Scriptdatei oder DLLs anwenden. Scripts, welche im Klartext verfügbar sind , sind natürlich einfacher zu bearbeiten als kompilierte DLLs. Bei den Script kannst du meist munter modden wie du willst. Bei DLLs musst du meist mit einem BlackBoxDebugger ran (OllyDbg oder Immunity Debugger
, letzteres mit Pythonscripting), und da wirst du dann auch die Instructionen ändern müssen, jedoch wirst du dazu Assembler verstehen müssen bzw. beherschen.
Man kann damit auch alles ändern. Beispielsweise gefällt es mir nicht, dass das Programm ständig nach einem Key frägt, denn ich zufälliger Weise nicht besitze. Da könnte ich dann einfach ein paar Instruktionen durch '\x90' also NOPs erstzen und es wird garnicht nach dem Key gefragt. Aber das wäre schon Cracking.
Hier mal
ein Beispiel, ist zwar Cracking, natürlich habe ich das Video nur aus rein informativen Zwecken aufgesucht, aber es ist ähnlich.
Wie du merkst bin ich bis jetzt davon ausgegangen, dass du ein Spiel modden willst, das kein Modding SDK hat.
Für den Fall, dass es eine Modding SDK gibt
Gehe auf die Website des SDK, lade es runter, lese die Docu und komme wieder, wenn du ernsthafte Probleme hast.
Z.B.: Weil dein Haus wegen einer NullPointerException brennt oder bei anderen sonst wahrscheinlichen Fällen.
Aber ich will mein eigenes Spiel modden!
Das habe ich bisher aussenvor gelassen.
Falls du deine eigenen Spiele zu modden gedenkst, dann ist wohl der einzigwahre Schritt das Implementieren einer Moddingschnittstelle.
An dieser Stelle möchte ich ein Beispiel von einer kleinen Lua-Schnittstelle stellen:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#include <stdio.h>
#include <string.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
int main (void) {
char buff[256];
int error;
lua_State *L = lua_open(); /* opens Lua */
luaL_openlibs(L); // Lua 5.1 B+tch!
while (fgets(buff, sizeof(buff), stdin) != NULL) {
error = luaL_loadbuffer(L, buff, strlen(buff), "line") ||
lua_pcall(L, 0, 0, 0);
if (error) {
fprintf(stderr, "%s", lua_tostring(L, -1));
lua_pop(L, 1); /* pop error message from the stack */
}
}
lua_close(L);
return 0;
}
|
Dazu gibt es einige Kapitel in Bücher und viele Onlineressourcen, deshalb, sollte dies der Fall sein, dann melde dich bitte wieder wenn einer der oben genannten "wahrscheinlichen (Not-)Fälle" eintreten.
So ich gehe jetzt mal für die W&R Klausur büffeln.
Mit freundlichen Grüßen,
Julien