From 26b75ca9dfe473d825f668d1bd74fbc746e2c3bf Mon Sep 17 00:00:00 2001 From: Chris Wilson Date: Fri, 25 Sep 2020 23:57:16 -0400 Subject: [PATCH] Add German tutorial by Fischfilet and fix [Object object] bug in Player Settings page --- WebHostLib/static/assets/player-settings.js | 2 +- WebHostLib/static/assets/tutorial.js | 4 +- .../static/assets/tutorial/tutorial_de.md | 160 ++++++++++++++++++ WebHostLib/static/static/playerSettings.json | 15 +- WebHostLib/static/static/playerSettings.yaml | 28 +-- 5 files changed, 187 insertions(+), 22 deletions(-) create mode 100644 WebHostLib/static/assets/tutorial/tutorial_de.md diff --git a/WebHostLib/static/assets/player-settings.js b/WebHostLib/static/assets/player-settings.js index a4a6815e..fe66ae9a 100644 --- a/WebHostLib/static/assets/player-settings.js +++ b/WebHostLib/static/assets/player-settings.js @@ -137,7 +137,7 @@ const getSettingValue = (settings, keyString) => { if(typeof(key) === 'string' && currentVal.hasOwnProperty(key)){ currentVal = currentVal[key]; }else{ - return false; + currentVal = false; } }); return currentVal; diff --git a/WebHostLib/static/assets/tutorial.js b/WebHostLib/static/assets/tutorial.js index b38e9527..b05f16e3 100644 --- a/WebHostLib/static/assets/tutorial.js +++ b/WebHostLib/static/assets/tutorial.js @@ -1,4 +1,5 @@ const availableLanguages = { + de: 'Deutsch', en: 'English', es: 'Español', fr: 'Français', @@ -25,7 +26,8 @@ window.addEventListener('load', () => { ajax.send(); }).then((results) => { // Build the language selector - const currentLanguage = window.location.href.split('/').pop(); + let currentLanguage = window.location.href.split('/').pop(); + if (Object.keys(availableLanguages).indexOf(currentLanguage) === -1) { currentLanguage = 'en' } const languageSelectorWrapper = document.createElement('div'); languageSelectorWrapper.setAttribute('id', 'language-selector-wrapper') const languageSelector = document.createElement('select'); diff --git a/WebHostLib/static/assets/tutorial/tutorial_de.md b/WebHostLib/static/assets/tutorial/tutorial_de.md new file mode 100644 index 00000000..4ba994b8 --- /dev/null +++ b/WebHostLib/static/assets/tutorial/tutorial_de.md @@ -0,0 +1,160 @@ +# A Link to the Past Randomizer Setup Guide + +
+ +
+ +## Benötigte Software +- [MultiWorld Utilities](https://github.com/Berserker66/MultiWorld-Utilities/releases) +- [QUsb2Snes](https://github.com/Skarsnik/QUsb2snes/releases) (Included in the above Utilities) +- Hardware oder Software zum Laden und Abspielen von SNES Rom-Dateien + - Einen Emulator, der lua-scripts abspielen kann + ([snes9x Multitroid](https://drive.google.com/drive/folders/1_ej-pwWtCAHYXIrvs5Hro16A1s9Hi3Jz), + [BizHawk](http://tasvideos.org/BizHawk.html)) + - Ein SD2SNES, [FXPak Pro](https://krikzz.com/store/home/54-fxpak-pro.html), oder andere kompatible Hardware +- Die Japanische Zelda 1.0 ROM-Datei, mit folgendem Namen: `Zelda no Densetsu - Kamigami no Triforce (Japan).sfc` + +## Installation Schritt für Schritt + +### Windows +1. Lade die Multiworld Utilities herunter und führe die Installation aus. Sei sicher, dass du immer die +aktuellste Version installiert hast.**Die Datei befindet sich im "assets"-Kasten unter der jeweiligen Versionsinfo!**. +Für normale Multiworld-Spiele lädst du die `Setup.BerserkerMultiworld.exe` herunter. + - Für den Doorrandomizer muss die alternative doors-Variante geladen werden. + - Während der Installation fragt dich das Programm nach der japanischen 1.0 ROM-Datei. Wenn du die Software + bereits installiert hast und einfach nur updaten willst, wirst du nicht nochmal danach gefragt. + - Es kann auch sein,dass der Installer Microsoft Visual C++ installieren möchte. + Wenn du das bereits installiert hast (durch Steam oder andere Programme), wirst du nicht nochmal danach gefragt. + +2. Wenn du einen Emulator benutzt, so ist es sinnvoll, ihn als Standard zum Abspielen für .sfc-dateien einzustellen. + 1. Entpacke oder Installiere deinen Emulator(-Ordner) an einen Ort, den du auch wiederfindest + 2. Rechtsklicke auf eine .sfc-Datei und wähle **Öffnen mit...** + 3. Mache einen Haken in die Box bei **Immer diese App zum Öffnen von .sfc Dateien benutzen **. + 4. Scrolle zum Ende und wähle **Weitere Apps** und nochmal am Ende **Andere App auf diesem PC suchen** auswählen. + 5. Suche nach der .exe-Datei des Emulators deiner Wahl und wähle **Öffnen**. + Diese Datei befindet sich dort, wo den Emulator in Schritt 1 enpackt/installiert hast. + +### Macintosh +- Es werden freiwillige Helfer gesucht! Meldet euch doch bei **Farrak Kilhn** auf Discord, wenn ihr helfen wollt! + +## Erstellen deiner YAML-Datei + +### Was ist eine YAML-Datei und wofür brauche ich die? +Deine persönliche YAML-Datei beinhaltet eine Reihe von Einstellungen, die der Zufallsgenerator zum erstellen +von deinem Spiel benötigt. Jeder Spieler einer Multiworld stellt seine eigene YAML-Datei zur Verfügung. Dadurch kann +jeder Spieler sein Spiel nach seinem eigenen Geschmack gestalten, während andere Spieler unabhängig davon ihre eigenen +Einstellungen wählen können! + +### Wo bekomme ich so eine YAML-Datei her? +Die [Player Settings](/player-settings) Seite auf der Website ermöglicht das einfache Erstellen und Herunterladen +deiner eigenen `yaml` Datei. Drei verschiedene Voreinstellungen können dort gespeichert werden. + +### Deine YAML-Datei ist gewichtet! +Die **Player Settings** Seite hat eine Menge Optionen, die man per Schieber einstellen kann. Das ermöglicht es, +verschiedene Optionen mit unterschiedlichen Wahrscheinlichkeiten in einer Kategorie ausgewürfelt zu werden + +Als Beispiel kann man sie die Option "Map Shuffle" als einen Eimer mit Zetteln zur Abstimmung Vorstellen. +So kann man beispielsweise für die Option "On" 20 Zettel mit dieser Option einwerfen und 40 Zettel mit "Off". + +Entsprechend in diesem Beispiel liegen dann 60 Zettel im Eimer. 20 für "On" und 40 für "Off". Um die Option +festzulegen, "greift" der Generator in den Eimer und holt sich zufällig einen Zettel heraus. Entsprechend ist die +Wahrscheinlichkeit für "Off" bei einem Map Shuffle höher, als "O" + +Wenn du eine Option nicht gewählt haben möchtest, setze ihren Wert einfach auf Null. +(Es muss aber mindestens eine Option pro Kategorie einen Wert größer Null besitzen, sonst funktioniert es nicht!) + +### Überprüfung deiner YAML-Datei +Wenn man sichergehen will, ob die YAML-Datei funktioniert, kann man dies +bei der [YAML Validator](/mysterycheck) Seite tun. + +## ein Einzelspielerspiel erstellen +1. Navigiere zur [Generator Seite](/generate) und lade dort deine YAML-Datei hoch. +2. Dir wird eine "Seed Info"-Seite angezeigt, wo du deine Patch-Datei herunterladen kannst. +3. Doppelklicke die Patchdatei und der Emulator sollte nach kurzer Verzögerung mit dem gepatchten Rom starten. + Der Client ist soweit unnötig für Einzelspielerspiele, also kannst diesen und das WebUI einfach schließen. + +## Einem MultiWorld-Spiel beitreten + +### Erhalte deine Patch-Datei und erstelle dein ROM +Wenn du an einem MultiWorld-Spiel teilnehmen möchtest, wirst du in der Regel vom Host nach deiner YAML-Datei gefragt. +Sobald du diese weitergegeben hast, wird der Host einen Link bereitstellen, wo du deinen Patch oder eine .zip-Datei +mit allen Patches herunterladen kannst. Die Patch-Datei hat immer die Endung `.bmbp`. + +### Mit dem Client verbinden + +#### Via Emulator +Wenn der client den Emulator automatisch gestartet hat, wird QUsb2Snes ebenfalls im Hintergrund gestartet. +Wenn dies das erste Mal ist, wird möglicherweise ein Fenster angezeigt, wo man bestätigen muss, dass das Programm +durch die Windows Firewall kommunizieren darf. + +##### snes9x Multitroid +1. Lade die Entsprechende ROM-Datei, wenn sie nicht schon automatisch geladen wurde. +2. Klicke auf den Reiter "File" oben im Menü und wähle **Lua Scripting** +3. Klicke auf **New Lua Script Window...** +4. Im sich neu öffnenden Fenster, klicke auf **Browse...** +5. Navigiere zum Ort, wo du snes9x Multitroid installiert hast, öffne den `lua`-Ordner und öffne `multibridge.lua` +6. Schaue im Lua-Fenster nach einem Namen, der dir zugeteilt wird und schaue im Client (WebUI im Browser), ob dort + "Snes Device: Connected" mit demselben Namen dort steht (in der oberen linken Ecke). + +##### BizHawk +1. Stelle sicher, dass der BSNES-Core in Bizhawk geladen wird. Dazu musst du auf das Tools-Menü in Bizhawk klicken + und folgende Optionen wählen: + `Config --> Cores --> SNES --> BSNES` +2. Lade die entsprechende ROM-Datei, wenn sie nicht schon automatisch geladen wurde. +3. Klicke auf das Tools-Menü und klicke auf **Lua Console** +4. Klicke auf den Button um ein neues Lua-Script zu öffnen. +5. Navigiere zum Verzeichnis, wo du die Multiworld Utilities installiert hast und dort in folgende Ordner: + `QUsb2Snes/Qusb2Snes/LuaBridge` +6. Wähle dort die `luabridge.lua` und klicke auf Öffnen. +7. Schaue im Lua-Fenster nach einem Namen, der dir zugeteilt wird und schaue im Client (WebUI im Browser), ob dort + "Snes Device: Connected" mit demselben Namen dort steht (in der oberen linken Ecke) + +#### Mit (Original-)Hardware +Dieser Guide setzt voraus, dass du schon die entsprechende Firmware für dein Gerät heruntergeladen hast! Wenn du +das noch nicht getan hast, so tue dies am besten jetzt! SD2SNES und FXPak Pro Nutzer finden die passende Firmware +[hier](https://github.com/RedGuyyyy/sd2snes/releases). Nutzer ähnlicher Hardware finden Hilfestellung +[auf dieser Seite](http://usb2snes.com/#supported-platforms). + +**UM MIT HARDWARE ZU VERBINDEN WIRD AKTUELL EINE ALTE VERSION VON QUSB2SNES BENÖTIGT +([v0.7.16](https://github.com/Skarsnik/QUsb2snes/releases/tag/v0.7.16)).** +Neuere Versionen funktionieren möglicherweise nur eingeschränkt, fehlerhaft oder gar nicht! + +1. Schließe deinen Emulator, falls er automatisch gestartet haben sollte. +2. Schließe QUsb2Snes, welches automatisch mit dem Client gestartet wurde (in der Taskleiste zu finden). +3. Starte die richtige version von QUsb2Snes (v0.7.16). +4. Starte deine (Original-)Konsole und lade die ROM-Datei. +5. Schaue auf dein Clientfenster, welches nun "Snes Device: Connected" und den namen deiner Konsole + zeigen sollte. + +### Mit dem MultiServer verbinden +Die Patch-Datei, welche auch den Client gestartet hat, sollte dich automatisch mit dem MultiServer verbunden haben. +Manchmal ist dies nicht der Fall, auch wenn das Spiel auf der Webseite gehostet wird, aber woanders erstellt wurde. +Wenn die WebUI vom Client "Server Status: Not Connected" zeigt, frag deinen Host nach der passenden Adresse +und trage sie einfach in das Textfeld neben "Server" ein und drücke Enter. + +Der Client wird versuchen auf die neue Adresse zu verbinden und nach einer Weile "Server Status: Connected" zeigen. +Sollte nach einer Weile der Client sich nicht verbunden haben, lade die Seite neu. + +### Spiele das Spiel! +Wenn der Client anzeigt, dass sowohl das SNES-Gerät (oder Emulator) und der Server verbunden sind, +können du und deine Freunde loslegen! Glückwunsch zum erfolgreichen Beitritt zu einem Multiworld-Spiel ;) + +## Ein Multiworld-Spiel hosten +Die Empfohlene Art, ein Spiel zu hosten, ist, den Service auf +[der website](https://berserkermulti.world/generate) zu nutzen. Das Ganze ist recht einfach: + +1. Lasse dir von deinen Mitspielern die YAML-Datei zuschicken. +2. Erstelle einen Zip-komprimierten Ordner´, in den du alle YAML-Dateien deiner Spieler einfügst. +3. Lade diesen Zip-Ordner auf der oben genannten Website hoch. +4. Warte einen Moment, wenn das Spiel erstellt wird. +5. Wenn das Spiel erstellt wurde, wirst du auf eine "Seed Info"-Seite weitergeleitet. +6. Klicke auf "Create New Room". Du wirst auf die Serverseite gebracht. Gib diesen Link deinen Mitspielern, + sodass sie ihre Patch-Dateien von dort herunterladen können. + **Anmerkung:** Die Patch-Dateien von dieser Seite ermöglichen es den Spielern, + automatisch auf den Server zu verbinden. Die Patch-Dateien von der "Seed Info"-Seite tun dies nicht! +7. Oben auf der Serverseite ist ein Link zum MultiWorld-Tracker zum aktuellen Spiel zu finden. Gib diesen Link + ebenfalls deinen Mitspielern, so dass ihr alle den Fortschritt eures Spiels verfolgen könnt! Ihr könnt ihn + auch an Zuschauer weitergeben. +8. Wenn alle Spieler verbunden sind, könnt ihr mit dem Spiel loslegen! Viel Spaß! diff --git a/WebHostLib/static/static/playerSettings.json b/WebHostLib/static/static/playerSettings.json index fa2d8afb..91a2274c 100644 --- a/WebHostLib/static/static/playerSettings.json +++ b/WebHostLib/static/static/playerSettings.json @@ -205,7 +205,8 @@ "none": { "keyString": "accessibility.none", "friendlyName": "Required Only", - "description": "Guarantees only that the game is beatable. You may not be able to access all locations or acquire all items." + "description": "Guarantees only that the game is beatable. You may not be able to access all locations or acquire all items.", + "defaultValue": 0 } } }, @@ -342,7 +343,8 @@ "local_ganon_triforce_hunt": { "keyString": "goals.local_ganon_triforce_hunt", "friendlyName": "Local Triforce hunt /w Ganon", - "description": "Same as Local Triforce Hunt, but you need to defeat Ganon in his lair instead of talking with Murahadala." + "description": "Same as Local Triforce Hunt, but you need to defeat Ganon in his lair instead of talking with Murahadala.", + "defaultValue": 0 } } }, @@ -723,7 +725,8 @@ "swordless": { "keyString": "weapons.swordless", "friendlyName": "Swordless", - "description": "Your swords are replaced with rupees. Gameplay changes are made to accommodate this change." + "description": "Your swords are replaced with rupees. Gameplay changes are made to accommodate this change.", + "defaultValue": 0 } } }, @@ -1226,19 +1229,19 @@ "1": { "keyString": "intensity.1", "friendlyName": "Level 1", - "description": "Doors and Spiral cases will be shuffled amongst themselves.", + "description": "Doors and spiral staircases will be shuffled amongst themselves.", "defaultValue": 50 }, "2": { "keyString": "intensity.2", "friendlyName": "Level 2", - "description": "Doors, Open Edges, and Straight stair cases shuffled amongst each other. Spiral cases will be shuffled amongst themselves.", + "description": "Doors, open edges, and straight stair cases are shuffled amongst each other. Spiral staircases will be shuffled amongst themselves.", "defaultValue": 0 }, "3": { "keyString": "intensity.3", "friendlyName": "Level 3", - "description": "(Coming soon) Everything in Level 2 plus lobby shuffling, using any non-dead-end super-tiles with a south facing door to become a dungeon entrance. (for example, EP Cannonball chest, TR Pipe Maze, Mire Hub, etc...)", + "description": "Level 2 plus lobby shuffling, which means any non-dead-end supertile with a south-facing door may become a dungeon entrance.", "defaultValue": 0 }, "random": { diff --git a/WebHostLib/static/static/playerSettings.yaml b/WebHostLib/static/static/playerSettings.yaml index ba8e167e..98f7b26d 100644 --- a/WebHostLib/static/static/playerSettings.yaml +++ b/WebHostLib/static/static/playerSettings.yaml @@ -10,7 +10,7 @@ # on: 5 # off: 15 # -# Means you have 5 chances for map shuffle to not occur, and 15 chances for map shuffle to be turned on +# Means you have 5 chances for map shuffle to occur, and 15 chances for map shuffle to be turned off # I've never seen a file like this before. What characters am I allowed to use? # This is a .yaml file. You are allowed to use most characters. @@ -90,14 +90,14 @@ triforce_pieces_mode: #Determine how to calculate the extra available triforce p extra: 0 # available = triforce_pieces_extra + triforce_pieces_required percentage: 0 # available = (triforce_pieces_percentage /100) * triforce_pieces_required available: 50 # available = triforce_pieces_available -triforce_pieces_extra: # Set to how many extra triforces pieces are available to collect in the world. +triforce_pieces_extra: # Set to how many extra triforces pieces are available to collect in the world. # Format "pieces: chance" 0: 0 5: 50 10: 50 15: 0 20: 0 -triforce_pieces_percentage: # Set to how many extra triforces pieces according to a percentage of the required ones, are available to collect in the world. +triforce_pieces_percentage: # Set to how many extra triforces pieces according to a percentage of the required ones, are available to collect in the world. # Format "pieces: chance" 100: 0 #No extra 150: 50 #Half the required will be added as extra @@ -171,16 +171,16 @@ boss_shuffle: full: 0 # 3 bosses can occur twice random: 0 # Any boss can appear any amount of times singularity: 0 # Picks a boss, tries to put it everywhere that works, if there's spaces remaining it picks a boss to fill those -enemy_shuffle: # randomize enemy placement +enemy_shuffle: # Randomize enemy placement on: 0 off: 50 -killable_thieves: # make thieves killable. - on: 0 # usually turned on together with enemy_shuffle to make annoying thief placement more manageable +killable_thieves: # Make thieves killable + on: 0 # Usually turned on together with enemy_shuffle to make annoying thief placement more manageable off: 50 -tile_shuffle: # randomize the tile layouts in flying tile rooms +tile_shuffle: # Randomize the tile layouts in flying tile rooms on: 0 off: 50 -bush_shuffle: # randomize the chance that bushes have enemies and the enemies under said bush +bush_shuffle: # Randomize the chance that bushes have enemies and the enemies under said bush on: 0 off: 50 enemy_damage: @@ -204,12 +204,12 @@ beemizer: # Remove items from the global item pool and replace them with single 4: 0 # 100% of the non-essential item pool is replaced with bee traps shop_shuffle: none: 50 - i: 0 # shuffle the inventories of the shops around - p: 0 # randomize the prices of the items in shop inventories - u: 0 # shuffle capacity upgrades into the item pool (and allow them to traverse the multiworld) - ip: 0 # shuffle inventories and randomize prices - uip: 0 # shuffle inventories, randomize prices and shuffle capacity upgrades into the item pool - # you can add more combos + i: 0 # Shuffle the inventories of the shops around + p: 0 # Randomize the prices of the items in shop inventories + u: 0 # Shuffle capacity upgrades into the item pool (and allow them to traverse the multiworld) + ip: 0 # Shuffle inventories and randomize prices + uip: 0 # Shuffle inventories, randomize prices and shuffle capacity upgrades into the item pool + # You can add more combos shuffle_prizes: # aka drops none: 0 # do not shuffle prize packs g: 50 # shuffle "general" price packs, as in enemy, tree pull, dig etc.