GameMaster Tool (Download) (Patreon)
Content
Da ich immer mal wieder kleine Sachen ausprobiere dachte ich mir, dass Patreon der perfekte Ort ist um das zu zeigen.. Immerhin sind wohl die meisten deswegen hier! Da diese Idee jedoch weiter gehen soll, anstatt nur ein Experiment zu sein, habe ich eine Version gemacht, die ihr nutzen könnt! Yay!
Hier das Projekt Downloaden + FCEUX Emulator
Die Grundidee ist simple: Jemand spielt ein Spiel und wer anderes kann ihm helfen oder das Leben erschweren. Also kommen wir zur Technik.
Wir benötigen einen Emulator, mit dem man auf einfache weise den Speicher modifizieren kann. FCEUX kommt zur Rettung! Dieser NES Emulator ist perfekt um den Arbeitsspeicher zu durchforschen UND man kann per LUA Scripte eigene extra Funktionen basteln. Seis nun neue Funktionen in Spiele einbauen wie einen Level Editor oder sonstiges. Aber wir wollen es einfach halten. Wir nutzen LUA nur als Schnittstelle, um mit etwas zu arbeiten, das etwas mehr Kontrolle von außerhalb bittet.
Die Idee ist daher: Per LUA greifen wir eine TXT Datei ab, in der eine Event-Nummer steht und das jeden Frame. Wenn die Event Nummer sich ändert wird das entsprechende Event aufgerufen. Im LUA Script definieren wir auch welche Event-Nummer was machen soll.
Damit dann ein Event abgefeuert wird müssen wir also nur etwas haben, das für uns die TXT Datei modifiziert (wir könnten auch per Hand etwas reinschreiben und speichern drücken, aber wo wäre da der Spaß?).
Das LUA Script heißt RemoteEventsScript.lua und ist gut kommentiert. Daher seht euch das mit einem Text Editor an um mehr zu erfahren!
Ok, wir wollen, dass etwas aus der Ferne bei uns etwas macht. Das simpelste ist es da NodeJS zu nutzen. Mit NodeJS könnt ihr diverse Applicationen mit JavaScript schreiben. Eine sehr mächtige Umgebung, die langsam ein Standard wird, daher ist es gut sich damit mal auseinander zu setzen! Mit NodeJS wollen wir einen Clienten schreiben, der die TXT Datei modifiziert und einen Server, bei dem wir diverse Informationen zum Clienten schicken, wie z.B. das gewünschte Event!
Der Client:
Öffnet NodeClient.js in einem Text Editor. Auch hier habe ich wieder fast jede Zeile kommentiert. Grob nutzen wir die Socket-IO Bibliothek um uns bei einen Server einzuwählen und warten dann auf ein Event. Wir machen hier demnächst mal ein simples NodeJS Tutorial, damit ihr mitbekommt, wie mächtig das ganze ist.
Der Client übernimmt auch die Arbeit die Event ID wieder auf 0 zu setzen, damit wir ein neues Event ausführen können. Ebenso kann man ein Event angeben, das nach dem ersten Event ausgeführt werden soll. Dazu später mehr!
Der Server:
Öffnet NodeMOD.js und bestaunt, wie wenig Code wir brauchen um einen funktionierenden Webserver mit Websocket Funktion zu schreiben! Natürlich ist alles wieder stark kommentiert. Das wichtigste ist, dass wir definieren, was passiert wenn man "/" und "/post" im Browser aufrufen. "/" öffnet die index.html Datei. "/post" ist dabei gedacht für ein POST HTML Event. Das ist das Event, das z.B. aufgerufen wird, wenn ihr ein Formular auf einer Webseite abschickt. Der Server bekommt dann diverse Daten und kann diese verarbeiten.
Die index.html Datei:
Diese HTML Datei ist das was der Moderator sieht! Die Buttons sind umschlossen von einer Form und diese bekommen ein onclick Event zugewiesen. In dem Event sagen wir, was dieser Knopf POSTen soll, dank der SendEvent(id,dur,revertID) Funktion. "id" ist das Event. "Dur" ist die Duration/Dauer des Events. "RevertID" ist ein Event, dass nach der Duration aufgerufen werden soll. Es ist "null" wenn danach nix passieren soll. Das Beispiel hier wäre das "Schwert verlieren" Event. Wenn die Zeit abläuft wird die event.txt auf -3 gesetzt. -3 ist das Event, das Schwert wiederherzustellen.
Mit ganz wenig HTML Verständnis könnt ihr so weitere Buttons hinzufügen!
Ok, wie führe ich den Spaß nun aus??
Dies wird die Frage sein, wenn man NodeJS nicht kennt. Saugt euch NodeJS und installiert es, ggf. startet am besten danach neu.
Startet FCEUX, stellt eure Inputs ein, damit ihr das Spiel steuern könnt. Startet eine Zelda 1 ROM. Geht auf File->Lua->New Lua Script Window und wählt "RemoveEventsScript.lua" aus. Dann klickt ihr auf "Run".
Klickt nun im Hauptordner auf die Adressleiste und gebt "CMD" ein, dann Enter drücken. Die Console öffnet sich, bereits mit dem richtigen Pfad. Gebt "node nodemod" ein um mit NodeJS die Datei nodeMOD.js zu starten.
Wenn ihr jetzt einen Browser öffnet und "localhost:4200" eingebt solltet ihr die 3 Buttons sehen! Dies ist daher das NodeJS Script, das derjenige nutzen würde, der euer Spiel beeinflussen soll. Sprich derjenige muss sich ebenfalls NodeJS runterladen, damit das klappt!
Geht wieder in die Adresszeile, gebt wieder CMD ein und öffnet nun den Clienten mit "node nodeclient". Der Server und der Client sollten dann beide Melden, dass eine Verbindung steht!
Und das wars auch schon! Wenn ihr jetzt im Browser die Buttons drückt, dann sollte der Client das melden und im Emulator passiert auch was! Yeah!!!
Hier noch paar wichtige Infos:
- Wenn wer euer Spiel steuern soll muss er den Port 4200 im Router freigeben. Ändert dann die Adresse in nodeClient.js von localhost zu der IP des Moderators
- Mit etwas Aufwand findet ihr im Netz diverse HEX-Listen für alle möglichen Spiele. Wie z.B. auch Zelda 1 hier. Wie man selbst Adressen raus findet zeige ich euch nächste Woche im Stream!
- Da wir hier ein Server-Client System nutzen können sich natürlich auch mehrere Spieler mit dem Server verbinden. So erhalten alle gleichzeitig das Event!
- Ich habe den so ziemlich simpelsten Aufbau genutzt um das ganze zu realisieren. Wenn ihr das also lernen wollt studiert den Code gut! Er ist absichtlich kurz und übersichtlich gehalten!
Und hier noch mal der DOWNLOAD!
Was wäre nun also noch möglich? Viel zu viel!
WIE das ganze ausgelöst wird, ist dem Server egal. Solange "io.emit("event",DieParameterDesEvents);" aufgerufen wird, bekommt der Client die Daten und feuert es ab. Ihr könnt z.B. dem Server sagen, dass er eine Funktion aufruft die willkürlich eine Zahl zwischen 1 und X auswählt und dann das zum Clienten pusht. Lasst die Funktion dann per "SetInterval" aufrufen und schon wird nach so und so vielen Millisekunden immer ein zufälliges Event ausgewählt.
Nutzt tmi.js um neue Subs auf Twitch abzufangen und spielt dann ein Event ab.
Verbindet es mit der TipeeeStreamAPI und lasst Events abfeuern bei bestimmten Spenden.
Allein deswegen lohnt es sich, NodeJS näher zu betrachten. Es ist das Universal-Tool, das alles verbindet. Und genau deswegen ist es perfekt für solche Projekte!
Files
Previews only