GTA2 (1999) rult übelst im LAN-Multiplayer Modus. Hier soll mit ein paar bösen Hacks ein Mehrspieler-Mod entstehen, bei dem alle Spieler am selben PC sitzen können. Wenn wir schon dabei sind, soll es auch noch ein gescheiter Gamepad-Support (sprich: Xbox360 Gamepad) sein. GTA2 läuft ganz okay mit Wine, also sollte es der Mod nach Möglichkeit auch.

Umsetzung

robotanarchy hat vor einer Ewigkeit mit dem Projekt angefangen und auch schon funktionierenden Code geschrieben. Allerdings ist alles noch nicht so wirklich fertig und der Code eventuell nicht mehr vorhanden. Im Folgenden findet sich also eine Liste von dem, was prinzipiell möglich ist (erstaunlicher Weise geht da echt viel):

Verschiedene Einstellungen für mehrere Instanzen

GTA2 speichert seine Einstellungen in der Registry. Es ist möglich, die gta2.exe zu duplizieren und innerhalb der exe-Datei mittels Search 'n' Replace den Registry-Pfad so zu ändern, dass man für jede Instanz andere Einstellungen (zb. Auflösung) verwenden kann.

Netzwerk Spiel mit mehreren Instanzen auf einem PC

Wenn man den GTA2 Einstellungen-Dialog öffnet, kann man ein Netzwerkspiel hosten oder einem solchen beitreten. Sobald man das gemacht hat, ist man in einem Lobby Dialog und der Hoster kann die Map auswählen und das Spiel starten.

Mit dem Inoffiziellen GTA2 Client von hier kann man das hosten, bzw. joinen direkt per Kommandozeile angeben (mit IP!) und landet direkt in der Lobby.

Wenn man beim Joinen jedes mal 127.0.0.1 angibt, dann crasht das ganze früher oder später. Es ist allerdings möglich, weitere IPs des Rechners anzugeben (zB. LAN). Mit dem TUN-Device von OpenVPN kann man sogar unter Windows beliebig viele IPs zuweisen (über virtuelle Netzwerkadapter), auf die man dann joinen kann.

Mit AutoIt3 könnte man ein eigenes Spielmenü schreiben (mit dem Controller steuerbar), das dann im Vordergrund läuft und im Hintergrund automagisch die Instanzen startet und die Lobbys zusammenklickt.

Splitscreen

Je nach gewünschter Spielerzahl (der Netzwerkmodus von GTA2 unterstützt bis zu 6 auf einmal!) wird die Auflösung für die einzelnen Spieler berechnet und in die Registry eingetragen. Mit AutoIt kann man ein riesiges Fenster erzeugen, zu dem dann die GTA2-Ingame-Fenster als Child-Windows geschoben werden. Windows Fensterrahmen muss man aus dem sichtbaren Bereich schieben oder durch eine große Splitscreenlinie ersetzen.

Überraschender Weise funktioniert der Sound bei allen Spielinstanzen gleichzeitig (wollen wir das? vielleicht Radio in den Autos deaktivieren, Soundeffekte lassen?) - aber nur, wenn man die Fenster einmalig so zusammenschiebt. Wenn man das öfters macht (also den Fokus ändert), dann hat nur noch ein Fenster Sound!

Gamepad Input

Da wie sowieso schon mit schwarzer Magie arbeiten und ganz schlimme Hacks benötigen, um den Splitscreen (mit Sound™) umzusetzen, haben natürlich nicht alle Fenster gleichzeitig Fokus und können deswegen logischer Weise nicht alle mit der Tastatur gesteuert werden.

Für ein fettes Multiplayer Erlebnis am Splitscreen sind sowieso Gamepads nötig - also hacken wir irgendwie den Input um, damit man diese auch verwenden kann.

Genauer hat robotanarchy die Speicheradresse gefunden, in der die Bewebung des Spielers drinnen steht. GTA2.exe greift auf ein paar DLLs im Spielverzeichnis zu. Man kann über eine selbstgeschriebene Proxy DLL, schön Code Injection machen und dadurch zum Beispiel die Spielfigur dauerhaft nach oben laufen lassen. Nachteil ist, dass diese DLL mit Visual Studio generiert werden muss (zumindest mit dem dort verwendeten Tutorial).

Neue Idee: die DLL soll ein TCP-Socket bereitstellen (noch besser: auf stdin hören, falls das geht!), damit AutoIt3 das steuern kann und man nur einmalig die DLL erzeugen muss (und dann Visual Studio wieder deinstallieren kann). Sqozz meint, dass das performt.

Entwicklungsumgebung

  • Nativ installiertes Windows XP, Windows 7 und Linux mit Wine (letzteres vor allem zum testen)
  • Microsoft Visual Studio 2010 (zumindest, bis die DLL fertig ist)
  • AutoIt3 + erweiterter Scite
  • Code::Blocks für selbstgehackten C(++) Code, der zB. suchen und ersetzen in der Exe-Datei macht (evtl. auch teile des Gamepad Codes)
  • GTA2: Freeware und die von gtamp (wir sollten einen Diff erstellen, so dass man am Ende die Freeware Version nutzen kann!)
  • Später soll der Source auf Github, also irgendwie Git für Windows

Beteiligte Leute

Idee und derzeitige Umsetzung ist von robotanarchy.

Sqozz hat Interesse am Mod gezeigt und wird innerhalb dieses Jahrtausends eventuell etwas dazu beisteuern.