diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 4e11aa88c5..28d1999486 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -17,9 +17,9 @@ jobs:
python-version: '3.8'
- name: Download run-time dependencies
run: |
- Invoke-WebRequest -Uri https://github.com/alttpo/sni/releases/download/v0.0.79/sni-v0.0.79-windows-amd64.zip -OutFile sni.zip
+ Invoke-WebRequest -Uri https://github.com/alttpo/sni/releases/download/v0.0.81/sni-v0.0.81-windows-amd64.zip -OutFile sni.zip
Expand-Archive -Path sni.zip -DestinationPath SNI -Force
- Invoke-WebRequest -Uri https://github.com/Ijwu/Enemizer/releases/download/6.4/win-x64.zip -OutFile enemizer.zip
+ Invoke-WebRequest -Uri https://github.com/Ijwu/Enemizer/releases/download/7.0/win-x64.zip -OutFile enemizer.zip
Expand-Archive -Path enemizer.zip -DestinationPath EnemizerCLI -Force
- name: Build
run: |
@@ -63,11 +63,11 @@ jobs:
chmod a+rx appimagetool
- name: Download run-time dependencies
run: |
- wget -nv https://github.com/black-sliver/sni/releases/download/v0.0.78-2/sni-v0.0.78-2-manylinux2014-amd64.tar.xz
+ wget -nv https://github.com/alttpo/sni/releases/download/v0.0.81/sni-v0.0.81-manylinux2014-amd64.tar.xz
tar xf sni-*.tar.xz
rm sni-*.tar.xz
mv sni-* SNI
- wget -nv https://github.com/Ijwu/Enemizer/releases/download/6.4/ubuntu.16.04-x64.7z
+ wget -nv https://github.com/Ijwu/Enemizer/releases/download/7.0/ubuntu.16.04-x64.7z
7za x -oEnemizerCLI/ ubuntu.16.04-x64.7z
- name: Build
run: |
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index f9cbc48274..f897bcba62 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -51,11 +51,11 @@ jobs:
chmod a+rx appimagetool
- name: Download run-time dependencies
run: |
- wget -nv https://github.com/black-sliver/sni/releases/download/v0.0.78-2/sni-v0.0.78-2-manylinux2014-amd64.tar.xz
+ wget -nv https://github.com/alttpo/sni/releases/download/v0.0.81/sni-v0.0.81-manylinux2014-amd64.tar.xz
tar xf sni-*.tar.xz
rm sni-*.tar.xz
mv sni-* SNI
- wget -nv https://github.com/Ijwu/Enemizer/releases/download/6.4/ubuntu.16.04-x64.7z
+ wget -nv https://github.com/Ijwu/Enemizer/releases/download/7.0/ubuntu.16.04-x64.7z
7za x -oEnemizerCLI/ ubuntu.16.04-x64.7z
- name: Build
run: |
diff --git a/BaseClasses.py b/BaseClasses.py
index 35970aee17..78919f22c0 100644
--- a/BaseClasses.py
+++ b/BaseClasses.py
@@ -1516,7 +1516,7 @@ class Tutorial(NamedTuple):
language: str
file_name: str
link: str
- author: List[str]
+ authors: List[str]
seeddigits = 20
diff --git a/README.md b/README.md
index 6b6dac410f..2b9cde4093 100644
--- a/README.md
+++ b/README.md
@@ -66,7 +66,10 @@ Contributions are welcome. We have a few asks of any new contributors.
Otherwise, we tend to judge code on a case to case basis. It is a generally good idea to stick to PEP-8 guidelines to ensure consistency with existing code. (And to make the linter happy.)
-For adding a new game to Archipelago please see the docs folder for the relevant information and feel free to ask any questions in the #archipelago-dev channel in our discord.
+For adding a new game to Archipelago and other documentation on how Archipelago functions, please see the docs folder for the relevant information and feel free to ask any questions in the #archipelago-dev channel in our discord.
+
+## FAQ
+For frequently asked questions see the website's [FAQ Page](https://archipelago.gg/faq/en/)
## Code of Conduct
We conduct ourselves openly and inclusively here. Please do not contribute to an environment which makes other people uncomfortable. This means that we expect all contributors or participants here to:
diff --git a/SNIClient.py b/SNIClient.py
index 0563b494ac..e313feff00 100644
--- a/SNIClient.py
+++ b/SNIClient.py
@@ -18,7 +18,7 @@ from json import loads, dumps
import ModuleUpdate
ModuleUpdate.update()
-from Utils import init_logging
+from Utils import init_logging, messagebox
if __name__ == "__main__":
init_logging("SNIClient", exception_logger="Client")
@@ -1303,7 +1303,11 @@ async def main():
if args.diff_file:
import Patch
logging.info("Patch file was supplied. Creating sfc rom..")
- meta, romfile = Patch.create_rom_file(args.diff_file)
+ try:
+ meta, romfile = Patch.create_rom_file(args.diff_file)
+ except Exception as e:
+ messagebox('Error', str(e), True)
+ raise
if "server" in meta:
args.connect = meta["server"]
logging.info(f"Wrote rom file to {romfile}")
@@ -1366,8 +1370,13 @@ def get_alttp_settings(romfile: str):
if gui_enabled:
- from tkinter import Tk, PhotoImage, Label, LabelFrame, Frame, Button
- applyPromptWindow = Tk()
+ try:
+ from tkinter import Tk, PhotoImage, Label, LabelFrame, Frame, Button
+ applyPromptWindow = Tk()
+ except Exception as e:
+ logging.error('Could not load tkinter, which is likely not installed.')
+ return '', False
+
applyPromptWindow.resizable(False, False)
applyPromptWindow.protocol('WM_DELETE_WINDOW', lambda: onButtonClick())
logo = PhotoImage(file=Utils.local_path('data', 'icon.png'))
diff --git a/Utils.py b/Utils.py
index a19f66bf08..e13a5fe773 100644
--- a/Utils.py
+++ b/Utils.py
@@ -568,6 +568,9 @@ def open_filename(title: str, filetypes: typing.Sequence[typing.Tuple[str, typin
def messagebox(title: str, text: str, error: bool = False) -> None:
+ def run(*args: str):
+ return subprocess.run(args, capture_output=True, text=True).stdout.split('\n', 1)[0] or None
+
def is_kivy_running():
if 'kivy' in sys.modules:
from kivy.app import App
@@ -579,6 +582,15 @@ def messagebox(title: str, text: str, error: bool = False) -> None:
MessageBox(title, text, error).open()
return
+ if is_linux and not 'tkinter' in sys.modules:
+ # prefer native dialog
+ kdialog = shutil.which('kdialog')
+ if kdialog:
+ return run(kdialog, f'--title={title}', '--error' if error else '--msgbox', text)
+ zenity = shutil.which('zenity')
+ if zenity:
+ return run(zenity, f'--title={title}', f'--text={text}', '--error' if error else '--info')
+
# fall back to tk
try:
import tkinter
diff --git a/WebHost.py b/WebHost.py
index e415b8ffa3..eb575df3e9 100644
--- a/WebHost.py
+++ b/WebHost.py
@@ -67,7 +67,7 @@ def create_ordered_tutorials_file() -> typing.List[typing.Dict[str, typing.Any]]
'language': tutorial.language,
'filename': game + '/' + tutorial.file_name,
'link': f'{game}/{tutorial.link}',
- 'authors': tutorial.author
+ 'authors': tutorial.authors
}]
}
diff --git a/WebHostLib/static/static/backgrounds/header/stone-header.png b/WebHostLib/static/static/backgrounds/header/stone-header.png
new file mode 100644
index 0000000000..e0c9787e57
Binary files /dev/null and b/WebHostLib/static/static/backgrounds/header/stone-header.png differ
diff --git a/WebHostLib/static/static/backgrounds/stone.png b/WebHostLib/static/static/backgrounds/stone.png
new file mode 100644
index 0000000000..9e15a34375
Binary files /dev/null and b/WebHostLib/static/static/backgrounds/stone.png differ
diff --git a/WebHostLib/static/styles/player-settings.css b/WebHostLib/static/styles/player-settings.css
index 951d762202..f323944653 100644
--- a/WebHostLib/static/styles/player-settings.css
+++ b/WebHostLib/static/styles/player-settings.css
@@ -49,7 +49,6 @@ html{
font-weight: normal;
width: 100%;
margin-bottom: 0.5rem;
- color: #ffffff;
text-shadow: 1px 1px 4px #000000;
}
@@ -58,20 +57,14 @@ html{
font-weight: normal;
width: 100%;
margin-bottom: 0.5rem;
- color: #ffe993;
text-transform: lowercase;
text-shadow: 1px 1px 2px #000000;
}
#player-settings h3, #player-settings h4, #player-settings h5, #player-settings h6{
- color: #ffffff;
text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5);
}
-#player-settings a{
- color: #ffef00;
-}
-
#player-settings input:not([type]){
border: 1px solid #000000;
padding: 3px;
diff --git a/WebHostLib/static/styles/themes/stone.css b/WebHostLib/static/styles/themes/stone.css
new file mode 100644
index 0000000000..0e020c608b
--- /dev/null
+++ b/WebHostLib/static/styles/themes/stone.css
@@ -0,0 +1,65 @@
+html{
+ background-image: url('../../static/backgrounds/stone.png');
+ background-repeat: repeat;
+ background-size: 275px 275px;
+}
+
+body{
+ color: #ffffff;
+}
+
+#base-header {
+ background: url('../../static/backgrounds/header/stone-header.png') repeat-x;
+}
+
+.markdown {
+ background-color: rgba(0, 0, 0, 0.66) !important;
+}
+
+h1{
+ color: #cccbc3;
+}
+
+h2{
+ color: #aad79c;
+}
+
+h3, h4, h5,h6{
+ color: #ffffff;
+ text-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5);
+}
+
+table th{
+
+}
+
+table td{
+
+}
+
+a{
+ color: #96e2ff;
+}
+
+pre{
+ margin-top: 0;
+ padding: 0.5rem 0.25rem;
+ border-radius: 6px;
+ color: #000000;
+}
+
+pre code{
+ border: none;
+}
+
+code{
+ border-radius: 4px;
+ padding-left: 0.25rem;
+ padding-right: 0.25rem;
+ color: #000000;
+}
+
+pre, code{
+ background-color: #e4ffdb;
+ border: 1px solid #2d3435;
+}
diff --git a/WebHostLib/templates/header/stoneHeader.html b/WebHostLib/templates/header/stoneHeader.html
new file mode 100644
index 0000000000..69ea530cea
--- /dev/null
+++ b/WebHostLib/templates/header/stoneHeader.html
@@ -0,0 +1,5 @@
+{% block head %}
+
+{% endblock %}
+
+{% include 'header/baseHeader.html' %}
diff --git a/WebHostLib/tracker.py b/WebHostLib/tracker.py
index 671126d1ec..5e249c19ea 100644
--- a/WebHostLib/tracker.py
+++ b/WebHostLib/tracker.py
@@ -429,7 +429,7 @@ def __renderMinecraftTracker(multisave: Dict[str, Any], room: Room, locations: D
"Diamond Chestplate": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/e/e0/Diamond_Chestplate_JE3_BE2.png",
"Iron Ingot": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/f/fc/Iron_Ingot_JE3_BE2.png",
"Block of Iron": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/7/7e/Block_of_Iron_JE4_BE3.png",
- "Brewing Stand": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/f/fa/Brewing_Stand.png",
+ "Brewing Stand": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/b/b3/Brewing_Stand_%28empty%29_JE10.png",
"Ender Pearl": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/f/f6/Ender_Pearl_JE3_BE2.png",
"Bucket": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/f/fc/Bucket_JE2_BE2.png",
"Bow": "https://static.wikia.nocookie.net/minecraft_gamepedia/images/a/ab/Bow_%28Pull_2%29_JE1_BE1.png",
diff --git a/docs/img/theme_stone.JPG b/docs/img/theme_stone.JPG
new file mode 100644
index 0000000000..2effbb7e0b
Binary files /dev/null and b/docs/img/theme_stone.JPG differ
diff --git a/docs/world api.md b/docs/world api.md
index b6f4478e36..a1138c9e16 100644
--- a/docs/world api.md
+++ b/docs/world api.md
@@ -61,9 +61,9 @@ for your world specifically on the webhost.
`settings_page` which can be changed to a link instead of an AP generated settings page.
`theme` to be used for your game specific AP pages. Available themes:
-| dirt | grass (default) | grassFlowers | ice | jungle | ocean | partyTime |
-|---|---|---|---|---|---|---|
-| | | | | | | |
+| dirt | grass (default) | grassFlowers | ice | jungle | ocean | partyTime | stone |
+|---|---|---|---|---|---|---|---|
+| | | | | | | | |
`bug_report_page` (optional) can be a link to a bug reporting page, most likely a GitHub issue page, that will be placed by the site to help direct users to report bugs.
diff --git a/worlds/AutoWorld.py b/worlds/AutoWorld.py
index 0bce31b424..5cc7d62590 100644
--- a/worlds/AutoWorld.py
+++ b/worlds/AutoWorld.py
@@ -100,7 +100,7 @@ class WebWorld:
tutorials: List[Tutorial]
# Choose a theme for your /game/* pages
- # Available: dirt, grass, grassFlowers, ice, jungle, ocean, partyTime
+ # Available: dirt, grass, grassFlowers, ice, jungle, ocean, partyTime, stone
theme = "grass"
# display a link to a bug report page, most likely a link to a GitHub issue page.
diff --git a/worlds/alttp/__init__.py b/worlds/alttp/__init__.py
index 7b5774210b..8e4ec1c143 100644
--- a/worlds/alttp/__init__.py
+++ b/worlds/alttp/__init__.py
@@ -77,7 +77,7 @@ class ALTTPWeb(WebWorld):
msu.description,
"Español",
"msu1_es.md",
- "msu1/en",
+ "msu1/es",
["Edos"]
)
diff --git a/worlds/alttp/docs/multiworld_en.md b/worlds/alttp/docs/multiworld_en.md
index 64e87bdb8f..1e6b2d1044 100644
--- a/worlds/alttp/docs/multiworld_en.md
+++ b/worlds/alttp/docs/multiworld_en.md
@@ -97,9 +97,9 @@ the lua you are using in your file explorer and copy the `socket.dll` to the bas
3. Click on the Tools menu and click on **Lua Console**
4. Click Script -> Open Script...
5. Select the `Connector.lua` file you downloaded above
- - SuperNintendoClient users should download `sniConnector.lua` from the client download page
- - SNIClient users should look in their Archipelago folder for `/SNI/lua/x64` or `/SNI/lua/x86` depending on if the
- emulator is 64-bit or 32-bit.
+ - Look in the Archipelago folder for `/SNI/lua/x64` or `/SNI/lua/x86` depending on if the
+ emulator is 64-bit or 32-bit. Please note the most recent versions of BizHawk are 64-bit only.
+
##### RetroArch 1.10.1 or newer
diff --git a/worlds/archipidle/__init__.py b/worlds/archipidle/__init__.py
index 5f3d98f2bd..6afcf4aa30 100644
--- a/worlds/archipidle/__init__.py
+++ b/worlds/archipidle/__init__.py
@@ -7,14 +7,16 @@ from datetime import datetime
class ArchipIDLEWebWorld(WebWorld):
theme = 'partyTime'
- tutorials = [Tutorial(
- "Setup Guide",
- "A guide to playing ArchipIDLE",
- "English",
- "guide_en.md",
- "guide/en",
- ["Farrak Kilhn"]
- )]
+ tutorials = [
+ Tutorial(
+ tutorial_name='Setup Guide',
+ description='A guide to playing Archipidle',
+ language='English',
+ file_name='guide_en.md',
+ link='guide/en',
+ authors=['Farrak Kilhn']
+ )
+ ]
class ArchipIDLEWorld(World):
diff --git a/worlds/factorio/docs/setup_en.md b/worlds/factorio/docs/setup_en.md
index fc83c190f1..7ee91fb4f1 100644
--- a/worlds/factorio/docs/setup_en.md
+++ b/worlds/factorio/docs/setup_en.md
@@ -88,8 +88,9 @@ Factorio product code. This will allow you to download the game directly from th
It is recommended to download the standalone version of Factorio for use as a dedicated server. Doing so prevents any
potential conflicts with your currently-installed version of Factorio. Download the file by clicking on the button
-appropriate to your operating system, and extract the folder to a convenient location (we recommend `C:\Factorio` or
-similar).
+appropriate to your operating system, and extract the folder to a convenient location. The best place to do this for
+Archipelago is to place the extracted game folder into the `Archipelago` directory and rename it to just be "Factorio".
+

@@ -99,12 +100,13 @@ have logged in, you may close the game.
#### Configure your Archipelago Installation
-You must modify your `host.yaml` file inside your Archipelago installation directory so that it points to your
-standalone Factorio executable. Here is an example of the appropriate setup, note the double `\\` are required:
+If you did not place the Factorio standalone in your Archipelago installation, you must modify your `host.yaml` file
+inside your Archipelago installation directory so that it points to your standalone Factorio executable. Here is an
+example of the appropriate setup, note the double `\\` are required:
```yaml
factorio_options:
- executable: C:\\factorio\\bin\\x64\\factorio"
+ executable: C:\\path\\to\\factorio\\bin\\x64\\factorio"
```
This allows you to host your own Factorio game.
@@ -145,6 +147,13 @@ In case any problems should occur, the Archipelago Client will create a file `Fa
contents of this file may help you troubleshoot an issue on your own and is vital for requesting help from other people
in Archipelago.
+## Commands in game
+
+Once you have connected to the server successfully using the Archipelago Factorio Client you should see a message
+stating you can get help using Archipelago commands by typing `!help`. Commands cannot currently be sent from within
+the Factorio session, but you can send them from the Archipelago Factorio Client. For more information about the commands
+you can use see the [commands guide](/tutorial/Archipelago/commands/en).
+
## Additional Resources
- Alternate Tutorial by
diff --git a/worlds/hk/__init__.py b/worlds/hk/__init__.py
index 3402f81ad3..110010e9c8 100644
--- a/worlds/hk/__init__.py
+++ b/worlds/hk/__init__.py
@@ -165,35 +165,36 @@ class HKWorld(World):
exclusions.update(path_of_pain_locations)
if wp <= WhitePalace.option_kingfragment:
exclusions.update(white_palace_checks)
- if wp == WhitePalace.option_exclude and self.world.RandomizeCharms[self.player]:
- # Ensure KF location is still reachable if charms are non-randomized
- exclusions.update(white_palace_transitions)
- exclusions.update(white_palace_events)
+ if wp == WhitePalace.option_exclude:
exclusions.add("King_Fragment")
+ if self.world.RandomizeCharms[self.player]:
+ # If charms are randomized, this will be junk-filled -- so transitions and events are not progression
+ exclusions.update(white_palace_transitions)
+ exclusions.update(white_palace_events)
return exclusions
def create_regions(self):
menu_region: Region = create_region(self.world, self.player, 'Menu')
self.world.regions.append(menu_region)
- wp_exclusions = self.white_palace_exclusions()
+ # wp_exclusions = self.white_palace_exclusions()
# Link regions
for event_name in event_names:
- if event_name in wp_exclusions:
- continue
+ #if event_name in wp_exclusions:
+ # continue
loc = HKLocation(self.player, event_name, None, menu_region)
loc.place_locked_item(HKItem(event_name,
- event_name not in wp_exclusions,
+ True, #event_name not in wp_exclusions,
None, "Event", self.player))
menu_region.locations.append(loc)
for entry_transition, exit_transition in connectors.items():
- if entry_transition in wp_exclusions:
- continue
+ #if entry_transition in wp_exclusions:
+ # continue
if exit_transition:
# if door logic fulfilled -> award vanilla target as event
loc = HKLocation(self.player, entry_transition, None, menu_region)
loc.place_locked_item(HKItem(exit_transition,
- exit_transition not in wp_exclusions,
+ True, #exit_transition not in wp_exclusions,
None, "Event", self.player))
menu_region.locations.append(loc)
@@ -208,29 +209,30 @@ class HKWorld(World):
wp_exclusions = self.white_palace_exclusions()
for option_key, option in hollow_knight_randomize_options.items():
- if getattr(self.world, option_key)[self.player]:
- for item_name, location_name in zip(option.items, option.locations):
- if location_name in wp_exclusions:
- continue
- if item_name in geo_replace:
- item_name = "Geo_Rock-Default"
- item = self.create_item(item_name)
- # self.create_location(location_name).place_locked_item(item)
- if location_name == "Start":
- self.world.push_precollected(item)
+ randomized = getattr(self.world, option_key)[self.player]
+ for item_name, location_name in zip(option.items, option.locations):
+ vanilla = not randomized
+ excluded = False
+ if item_name in geo_replace:
+ item_name = "Geo_Rock-Default"
+ item = self.create_item(item_name)
+ if location_name == "Start":
+ self.world.push_precollected(item)
+ continue
+
+ location = self.create_location(location_name)
+ if not vanilla and location_name in wp_exclusions:
+ if location_name == 'King_Fragment':
+ excluded = True
else:
- self.create_location(location_name)
- pool.append(item)
- # elif option_key not in logicless_options:
- else:
- for item_name, location_name in zip(option.items, option.locations):
- if location_name in wp_exclusions and location_name != 'King_Fragment':
- continue
- item = self.create_item(item_name)
- if location_name == "Start":
- self.world.push_precollected(item)
- else:
- self.create_location(location_name).place_locked_item(item)
+ vanilla = True
+ if excluded:
+ location.progress_type = LocationProgressType.EXCLUDED
+ if vanilla:
+ location.place_locked_item(item)
+ else:
+ pool.append(item)
+
for i in range(self.world.EggShopSlots[self.player].value):
self.create_location("Egg_Shop")
pool.append(self.create_item("Geo_Rock-Default"))
diff --git a/worlds/hk/docs/setup_en.md b/worlds/hk/docs/setup_en.md
index bc2e4da75e..0584af0f04 100644
--- a/worlds/hk/docs/setup_en.md
+++ b/worlds/hk/docs/setup_en.md
@@ -27,4 +27,11 @@ website to generate a YAML using a graphical interface.
5. Hit **Start** to begin the game. The game will stall for a few seconds while it does all item placements.
6. The game will immediately drop you into the randomized game.
* If you are waiting for a countdown then wait for it to lapse before hitting Start.
- * Or hit Start then pause the game once you're in it.
\ No newline at end of file
+ * Or hit Start then pause the game once you're in it.
+
+## Commands
+While playing the multiworld you can interact with the server using various commands listed in the
+[commands guide](/tutorial/Archipelago/commands/en). As this game does not have an in-game text client at the moment,
+You can optionally connect to the multiworld using the text client, which can be found in the
+[main Archipelago installation](https://github.com/ArchipelagoMW/Archipelago/releases) as Archipelago Text Client to
+enter these commands.
diff --git a/worlds/meritous/docs/setup_en.md b/worlds/meritous/docs/setup_en.md
index c829765e53..bf6af5f657 100644
--- a/worlds/meritous/docs/setup_en.md
+++ b/worlds/meritous/docs/setup_en.md
@@ -52,6 +52,13 @@ Once the goal has been completed, you may press F to send a forfeit, sending out
More in-depth information about the game can be found in the game's help file, accessed by pressing H while playing.
+## Commands
+While playing the multiworld you can interact with the server using various commands listed in the
+[commands guide](/tutorial/Archipelago/commands/en). As this game does not have an in-game text client at the moment,
+You can optionally connect to the multiworld using the text client, which can be found in the
+[main Archipelago installation](https://github.com/ArchipelagoMW/Archipelago/releases) as Archipelago Text Client to
+enter these commands.
+
## Game Troubleshooting
### An error message shows up at the bottom-left
diff --git a/worlds/oot/__init__.py b/worlds/oot/__init__.py
index 01edf7f61e..b640578c16 100644
--- a/worlds/oot/__init__.py
+++ b/worlds/oot/__init__.py
@@ -82,7 +82,7 @@ class OOTWeb(WebWorld):
"Español",
"setup_es.md",
"setup/es",
- setup.author
+ setup.authors
)
tutorials = [setup, setup_es]
@@ -90,8 +90,8 @@ class OOTWeb(WebWorld):
class OOTWorld(World):
"""
- The Legend of Zelda: Ocarina of Time is a 3D action/adventure game. Travel through Hyrule in two time periods,
- learn magical ocarina songs, and explore twelve dungeons on your quest. Use Link's many items and abilities
+ The Legend of Zelda: Ocarina of Time is a 3D action/adventure game. Travel through Hyrule in two time periods,
+ learn magical ocarina songs, and explore twelve dungeons on your quest. Use Link's many items and abilities
to rescue the Seven Sages, and then confront Ganondorf to save Hyrule!
"""
game: str = "Ocarina of Time"
@@ -577,7 +577,7 @@ class OOTWorld(World):
(loc.internal or loc.type == 'Drop') and loc.event and loc.locked and loc not in reachable]
for loc in unreachable:
loc.parent_region.locations.remove(loc)
- # Exception: Sell Big Poe is an event which is only reachable if Bottle with Big Poe is in the item pool.
+ # Exception: Sell Big Poe is an event which is only reachable if Bottle with Big Poe is in the item pool.
# We allow it to be removed only if Bottle with Big Poe is not in the itempool.
bigpoe = self.world.get_location('Sell Big Poe from Market Guard House', self.player)
if not all_state.has('Bottle with Big Poe', self.player) and bigpoe not in reachable:
@@ -632,7 +632,7 @@ class OOTWorld(World):
if shufflebk in itempools:
itempools[shufflebk].extend(dungeon.boss_key)
- # We can't put a dungeon item on the end of a dungeon if a song is supposed to go there. Make sure not to include it.
+ # We can't put a dungeon item on the end of a dungeon if a song is supposed to go there. Make sure not to include it.
dungeon_locations = [loc for region in dungeon.regions for loc in region.locations
if loc.item is None and (
self.shuffle_song_items != 'dungeon' or loc.name not in dungeon_song_locations)]
diff --git a/worlds/rogue-legacy/__init__.py b/worlds/rogue-legacy/__init__.py
index c976d01963..af8fa9a791 100644
--- a/worlds/rogue-legacy/__init__.py
+++ b/worlds/rogue-legacy/__init__.py
@@ -12,6 +12,7 @@ from ..AutoWorld import World, WebWorld
class LegacyWeb(WebWorld):
+ theme = "stone"
tutorials = [Tutorial(
"Multiworld Setup Guide",
"A guide to setting up the Rogue Legacy Randomizer software on your computer. This guide covers single-player, multiworld, and related software.",
@@ -153,7 +154,7 @@ class LegacyWorld(World):
self.world.push_precollected(self.world.create_item(ItemName.architect, self.player))
elif self.world.architect[self.player] != "disabled":
itempool += [self.create_item(ItemName.architect)]
-
+
# Fill item pool with the remaining
for _ in range(len(itempool), total_required_locations):
item = self.world.random.choice(list(misc_items_table.keys()))
diff --git a/worlds/sc2wol/docs/setup_en.md b/worlds/sc2wol/docs/setup_en.md
index af32047be9..6697277d9f 100644
--- a/worlds/sc2wol/docs/setup_en.md
+++ b/worlds/sc2wol/docs/setup_en.md
@@ -15,37 +15,74 @@ Starcraft 2 AP Client launches a custom version of Starcraft 2 running modified
Follow the installation directions at the
[Starcraft 2 AP Maps and Data](https://github.com/TheCondor07/Starcraft2ArchipelagoData) page you can find the .zip
-files on the releases page. After it is installed just run ArchipelagoStarcraftClient.exe to start the client to connect
+files on the releases page. After it is installed, just run ArchipelagoStarcraft2Client.exe to start the client and connect
to a Multiworld Game.
## Joining a MultiWorld Game
-1. Run ArchipelagoStarcraftClient.exe
-2. Type in /connect [sever ip]
-3. Insert slot name and password as prompted
-4. Once connected, use /unfinished to find what missions you can play and '/play [mission id]' to launch a mission. For
-new games under default settings the first mission available will always be Liberation Day[1] playable using the command
-'/play 1'
+1. Run ArchipelagoStarcraft2Client.exe.
+2. Type in `/connect [server ip]`.
+3. Insert slot name and password as prompted.
+4. Once connected, use `/unfinished` to find what missions you can play and `/play [mission id]` to launch a mission.
+ For new games under default settings the first mission available will always be Liberation Day[1] playable using the
+ command `/play 1`.
## Where do I get a config file?
The [Player Settings](/games/Starcraft%202%20Wings%20of%20Liberty/player-settings) page on the website allows you to
-configure your personal settings and export them into a config file
+configure your personal settings and export them into a config file.
## Game isn't launching when I type /play
First check the log file for issues (stored at [Archipelago Directory]/logs/SC2Client.txt. There is sometimes an issue
-where the client can not find Starcraft 2. Usually Documents/Starcraft 2/ExecuteInfo.txt is checked to find where
+where the client can not find Starcraft 2. Usually 'Documents/StarCraft II/ExecuteInfo.txt' is checked to find where
Starcraft 2 is installed. On some computers particularly if you have OneDrive running this may fail. The following
-directions may help you in this case if you are on Windows.
+directions may help you in this case if you are on Windows.
-1. Navigate to '%userprofile%'. Easiest way to do this is to hit Windows key+R type in %userprofile% and hit run or
-type in %userprofile% in the navigation bar of your file explorer.
+1. Navigate to '%userprofile%'. Easiest way to do this is to hit Windows key+R type in `%userprofile%` and hit run or
+type in `%userprofile%` in the navigation bar of your file explorer.
2. If it does not exist create a folder in her named 'Documents'.
-3. Locate your 'My Documents' folder on your pc. If you navigate to 'My PC' on the sidebar of file explorer should be a
+3. Locate your 'My Documents' folder on your PC. If you navigate to 'My PC' on the sidebar of file explorer should be a
link to this folder there labeled 'Documents'.
-4. Find a folder labeled 'Starcraft 2' and copy it.
-5. Paste this Starcraft 2 folder into the folder created or found in step 2.
+4. Find a folder labeled 'StarCraft II' and copy it.
+5. Paste this 'StarCraft II' folder into the folder created or found in step 2.
-These steps have been shown to work for some people for some people having issues with launching the game. If you are
-still having issues check out our [Discord](https://discord.com/invite/8Z65BR2) for help.
\ No newline at end of file
+These steps have been shown to work for some people for some people having issues with launching the game. If you are
+still having issues check out our [Discord](https://discord.com/invite/8Z65BR2) for help.
+
+## Running in Linux
+
+To run StarCraft 2 through Archipelago in Linux, you will need to install the game using Wine then run the Linux build of the Archipelago client.
+
+Make sure you have StarCraft 2 installed using Wine and you have followed the [Installation Procedures](#installation-procedures) to add the Archipelago maps to the correct location. You will not need to copy the .dll files. If you're having trouble installing or running StarCraft 2 on Linux, I recommend using the Lutris installer.
+
+Copy the following into a .sh file, replacing the values of **WINE** and **SC2PATH** variables to the relevant locations, as well as setting **PATH_TO_ARCHIPELAGO** to the directory containing the AppImage if it is not in the same folder as the script.
+
+```sh
+# Let the client know we're running SC2 in Wine
+export SC2PF=WineLinux
+export PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python
+
+# FIXME Replace with path to the version of Wine used to run SC2
+export WINE="/usr/bin/wine"
+
+# FIXME Replace with path to StarCraft II install folder
+export SC2PATH="/home/user/Games/starcraft-ii/drive_c/Program Files (x86)/StarCraft II/"
+
+# FIXME Set to directory which contains Archipelago AppImage file
+PATH_TO_ARCHIPELAGO=
+
+# Gets the latest version of Archipelago AppImage in PATH_TO_ARCHIPELAGO.
+# If PATH_TO_ARCHIPELAGO is not set, this defaults to the directory containing
+# this script file.
+ARCHIPELAGO="$(ls ${PATH_TO_ARCHIPELAGO:-$(dirname $0)}/Archipelago_*.AppImage | sort -r | head -1)"
+
+# Start the Archipelago client
+$ARCHIPELAGO Starcraft2Client
+```
+
+For Lutris installs, you can run `lutris -l` to get the numerical ID of your StarCraft II install, then run the command below, replacing **${ID}** with the numerical ID.
+
+ lutris lutris:rungameid/${ID} --output-script sc2.sh
+
+This will get all of the relevant environment variables Lutris sets to run StarCraft 2 in a script, including the path to the Wine binary that Lutris uses. You can then remove the line that runs the Battle.Net launcher and copy the code above into the existing script.
diff --git a/worlds/sm/docs/multiworld_en.md b/worlds/sm/docs/multiworld_en.md
index 9d5ed715f1..27e1d4a4ad 100644
--- a/worlds/sm/docs/multiworld_en.md
+++ b/worlds/sm/docs/multiworld_en.md
@@ -2,11 +2,9 @@
## Required Software
-- One of the client programs:
- - [SNIClient](https://github.com/ArchipelagoMW/Archipelago/releases), included with the main
- Archipelago install. Make sure to check the box for `SNI Client - Super Metroid Patch Setup`
- - [SuperNintendoClient](https://github.com/ArchipelagoMW/SuperNintendoClient/releases), an alternate standalone
- client for Super Nintendo games
+- [Archipelago](https://github.com/ArchipelagoMW/Archipelago/releases). Make sure to check the box for `SNI Client - Super Metroid Patch Setup`
+
+
- Hardware or software capable of loading and playing SNES ROM files
- An emulator capable of connecting to SNI such as:
- snes9x Multitroid
@@ -71,7 +69,7 @@ validator page: [YAML Validation page](/mysterycheck)
When you join a multiworld game, you will be asked to provide your config file to whoever is hosting. Once that is done,
the host will provide you with either a link to download your patch file, or with a zip file containing everyone's patch
-files. Your patch file should have a `.apm3` extension.
+files. Your patch file should have a `.apsm` extension.
Put your patch file on your desktop or somewhere convenient, and double click it. This should automatically launch the
client, and will also create your ROM in the same place as your patch file.
@@ -90,9 +88,10 @@ first time launching, you may be prompted to allow it to communicate through the
3. Click on **New Lua Script Window...**
4. In the new window, click **Browse...**
5. Select the connector lua file included with your client
- - SuperNintendoClient users should download `sniConnector.lua` from the client download page
- - SNIClient users should look in their Archipelago folder for `/SNI/lua/x64` or `/SNI/lua/x86` depending on if the
+ - Look in the Archipelago folder for `/SNI/lua/x64` or `/SNI/lua/x86` depending on if the
emulator is 64-bit or 32-bit.
+6. If you see an error while loading the script that states `socket.dll missing` or similar, navigate to the folder of
+the lua you are using in your file explorer and copy the `socket.dll` to the base folder of your snes9x install.
##### BizHawk
@@ -104,8 +103,7 @@ first time launching, you may be prompted to allow it to communicate through the
3. Click on the Tools menu and click on **Lua Console**
4. Click the button to open a new Lua script.
5. Select the `Connector.lua` file included with your client
- - SuperNintendoClient users should download `sniConnector.lua` from the client download page
- - SNIClient users should look in their Archipelago folder for `/SNI/lua/x64` or `/SNI/lua/x86` depending on if the
+ - Look in the Archipelago folder for `/SNI/lua/x64` or `/SNI/lua/x86` depending on if the
emulator is 64-bit or 32-bit. Please note the most recent versions of BizHawk are 64-bit only.
##### RetroArch 1.10.1 or newer
diff --git a/worlds/sm64ex/docs/setup_en.md b/worlds/sm64ex/docs/setup_en.md
index 5cc9113430..1b4ae6dfb4 100644
--- a/worlds/sm64ex/docs/setup_en.md
+++ b/worlds/sm64ex/docs/setup_en.md
@@ -57,7 +57,7 @@ If everything worked out, you will see a textbox informing you the connection ha
# Playing offline
To play offline, first generate a seed on the game's settings page.
-Create a room and download the `.apsm64ex` file, and start the game with the `--sm64ap_file FileName` launch argument.
+Create a room and download the `.apsm64ex` file, and start the game with the `--sm64ap_file "path/to/FileName"` launch argument.
## Installation Troubleshooting
@@ -69,6 +69,12 @@ Most likely you forgot to set the launch options. `--sm64ap_name YourName` and `
`--sm64ap_file FileName` is required for (offline) singleplayer.
If your Name or Password have spaces in them, surround them in quotes.
+### Game crashes upon entering Peach's Castle
+
+This happens when the game is missing the relevant randomizer data. If you are trying to connect to a server, verify the
+information entered is correct, and for a local file ensure you are using the full file path to the file in conjunction
+with its name.
+
## Game Troubleshooting
### Known Issues
diff --git a/worlds/smz3/docs/multiworld_en.md b/worlds/smz3/docs/multiworld_en.md
index 6ce031847f..dd516d9980 100644
--- a/worlds/smz3/docs/multiworld_en.md
+++ b/worlds/smz3/docs/multiworld_en.md
@@ -68,7 +68,7 @@ validator page: [YAML Validation page](/mysterycheck)
When you join a multiworld game, you will be asked to provide your config file to whoever is hosting. Once that is done,
the host will provide you with either a link to download your patch file, or with a zip file containing everyone's patch
-files. Your patch file should have a `.apsmz` extension.
+files. Your patch file should have a `.apsmz3` extension.
Put your patch file on your desktop or somewhere convenient, and double click it. This should automatically launch the
client, and will also create your ROM in the same place as your patch file.
@@ -87,9 +87,10 @@ first time launching, you may be prompted to allow it to communicate through the
3. Click on **New Lua Script Window...**
4. In the new window, click **Browse...**
5. Select the connector lua file included with your client
- - SuperNintendoClient users should download `sniConnector.lua` from the client download page
- - SNIClient users should look in their Archipelago folder for `/SNI/lua/x64` or `/SNI/lua/x86` depending on if the
+ - Look in the Archipelago folder for `/SNI/lua/x64` or `/SNI/lua/x86` depending on if the
emulator is 64-bit or 32-bit.
+6. If you see an error while loading the script that states `socket.dll missing` or similar, navigate to the folder of
+the lua you are using in your file explorer and copy the `socket.dll` to the base folder of your snes9x install.
##### BizHawk
@@ -101,8 +102,7 @@ first time launching, you may be prompted to allow it to communicate through the
3. Click on the Tools menu and click on **Lua Console**
4. Click the button to open a new Lua script.
5. Select the `Connector.lua` file included with your client
- - SuperNintendoClient users should download `sniConnector.lua` from the client download page
- - SNIClient users should look in their Archipelago folder for `/SNI/lua/x64` or `/SNI/lua/x86` depending on if the
+ - Look in the Archipelago folder for `/SNI/lua/x64` or `/SNI/lua/x86` depending on if the
emulator is 64-bit or 32-bit. Please note the most recent versions of BizHawk are 64-bit only.
##### RetroArch 1.10.3 or newer
diff --git a/worlds/timespinner/__init__.py b/worlds/timespinner/__init__.py
index 34caca8b90..2997b27636 100644
--- a/worlds/timespinner/__init__.py
+++ b/worlds/timespinner/__init__.py
@@ -27,7 +27,7 @@ class TimespinnerWebWorld(WebWorld):
setup.description,
"Deutsch",
"setup_de.md",
- "setup/en",
+ "setup/de",
["Grrmo", "Fynxes", "Blaze0168"]
)
@@ -72,7 +72,7 @@ class TimespinnerWorld(World):
self.world.StartWithJewelryBox[self.player].value = self.world.StartWithJewelryBox[self.player].option_true
def create_regions(self):
- create_regions(self.world, self.player, get_locations(self.world, self.player),
+ create_regions(self.world, self.player, get_locations(self.world, self.player),
self.location_cache, self.pyramid_keys_unlock)
def create_item(self, name: str) -> Item:
@@ -131,7 +131,7 @@ def get_excluded_items(self: TimespinnerWorld, world: MultiWorld, player: int) -
for item in world.precollected_items[player]:
if item.name not in self.item_name_groups['UseItem']:
excluded_items.add(item.name)
-
+
return excluded_items
@@ -156,7 +156,7 @@ def assign_starter_items(world: MultiWorld, player: int, excluded_items: Set[str
assign_starter_item(world, player, excluded_items, locked_locations, 'Tutorial: Yo Momma 2', local_starter_spells)
-def assign_starter_item(world: MultiWorld, player: int, excluded_items: Set[str], locked_locations: List[str],
+def assign_starter_item(world: MultiWorld, player: int, excluded_items: Set[str], locked_locations: List[str],
location: str, item_list: Tuple[str, ...]):
item_name = world.random.choice(item_list)
@@ -193,7 +193,7 @@ def place_first_progression_item(world: MultiWorld, player: int, excluded_items:
for item in world.precollected_items[player]:
if item.name in starter_progression_items:
return
-
+
local_starter_progression_items = tuple(
item for item in starter_progression_items if item not in world.non_local_items[player].value)
non_excluded_starter_progression_locations = tuple(
@@ -252,5 +252,5 @@ def get_personal_items(player: int, locations: List[Location]) -> Dict[int, int]
for location in locations:
if location.address and location.item and location.item.code and location.item.player == player:
personal_items[location.address] = location.item.code
-
+
return personal_items
diff --git a/worlds/v6/docs/setup_en.md b/worlds/v6/docs/setup_en.md
index b6df575327..7adf5948c7 100644
--- a/worlds/v6/docs/setup_en.md
+++ b/worlds/v6/docs/setup_en.md
@@ -2,42 +2,48 @@
## Required Software
-- VVVVVV (Bought from the [Steam Store](https://store.steampowered.com/app/70300/VVVVVV/) or [GOG Store](https://www.gog.com/game/vvvvvv) Page, NOT Make and Play Edition!)
+- VVVVVV
+ - [Steam Store Page](https://store.steampowered.com/app/70300/VVVVVV/)
+ - [GOG Store Page](https://www.gog.com/game/vvvvvv)
- [V6AP](https://github.com/N00byKing/VVVVVV/releases)
## Installation and Game Start Procedures
-1. Install VVVVVV through either Steam or GOG
-2. Go to the page linked for V6AP, and download the latest release
+1. Install VVVVVV through either Steam or GOG.
+2. Go to the page linked for V6AP, and download the latest release.
3. Unpack the zip file where you have VVVVVV installed.
# Joining a MultiWorld Game
-To join, set the following launch options: `-v6ap_name YourName -v6ap_ip ServerIP:Port`.
-Optionally, add `-v6ap_passwd "YourPassword"` if the room you are using requires a password. All parameters without quotation marks.
-The Name in this case is the one specified in your generated .yaml file.
-In case you are using the Archipelago Website, the IP should be `archipelago.gg`.
+To join an Archipelago MultiWorld game, you must set the game's launch options. The two mandatory launch options are:
+ `-v6ap_name slotName`
+ `-v6ap_ip server:port`
+If the game you are joining requires a password, you should also add the following to your launch options:
+`-v6ap_passwd secretPassword`
+
+If the game is to be played offline in single-player mode, you should include this launch option:
+`-v6ap_file filePath`
+
+Launch options may be found by right-clicking on the game in Steam and clicking "Properties" in the context menu. From there, open the "General" tab. There is a "Launch Options" setting near the bottom wherein you should enter the above options. Note that all launch options are separated by a space, and if there are spaces in your slot name or password, it should be surrounded with quotes.
If everything worked out, you will see a textbox informing you the connection has been established after the story intro.
# Playing offline
To play offline, first generate a seed on the game's settings page.
-Create a room and download the `.apv6` file, and start the game with the `-v6ap_file FileName` launch argument.
+Create a room and download the `.apv6` file, include the offline single-player launch option described above.
## Installation Troubleshooting
-Start the game from the command line to view helpful messages regarding V6AP. These will look something like "V6AP: Message"
+Start the game from the command line to view helpful messages regarding V6AP. These will look something like `V6AP: Message`.
### Game no longer starts after copying the .exe
-Most likely you forgot to set the launch options. `-v6ap_name YourName` and `-v6ap_ip ServerIP:Port` are required for startup for Multiworlds, and
-`-v6ap_file FileName` is required for (offline) singleplayer.
-If your Name or Password have spaces in them, surround them in quotes.
+The most likely cause of a startup failure is invalid launch options. Ensure the launch options are set properly as described above in
+**Joining a MultiWorld Game**.
## Game Troubleshooting
### What happens if I lose connection?
-V6AP tries to reconnect a few times, so be patient.
-Should the problem still be there after about a minute or two, just save and restart the game.
+If a disconnection occurs, wait a moment to see if the game automatically reconnects itself. If the problem presists, save and restart the game.
diff --git a/worlds/witness/Options.py b/worlds/witness/Options.py
index 72e8514501..e8b7e576da 100644
--- a/worlds/witness/Options.py
+++ b/worlds/witness/Options.py
@@ -37,7 +37,7 @@ class ShuffleDoors(Toggle):
class ShuffleDiscardedPanels(Toggle):
"""Discarded Panels will have items on them.
- Solving certain Discarded Panels may still be necessary!"""
+ Solving certain Discarded Panels may still be necessary even if off!"""
display_name = "Shuffle Discarded Panels"
diff --git a/worlds/witness/WitnessItems.txt b/worlds/witness/WitnessItems.txt
index 9700a0e468..9d8831bb10 100644
--- a/worlds/witness/WitnessItems.txt
+++ b/worlds/witness/WitnessItems.txt
@@ -14,8 +14,8 @@ Progression:
72 - Colored Squares
Usefuls:
-101 - Functioning Brain
-510 - Puzzle Skip
+101 - Functioning Brain - False
+510 - Puzzle Skip - True
Boosts:
500 - Speed Boost
diff --git a/worlds/witness/docs/setup_en.md b/worlds/witness/docs/setup_en.md
index ce07451949..df114e1256 100644
--- a/worlds/witness/docs/setup_en.md
+++ b/worlds/witness/docs/setup_en.md
@@ -2,7 +2,7 @@
## Required Software
-- [The Witness (Steam)](https://store.steampowered.com/app/210970/The_Witness/)
+- [The Witness for 64-bit Windows (e.g. Steam version)](https://store.steampowered.com/app/210970/The_Witness/)
- [The Witness Archipelago Randomizer](https://github.com/JarnoWesthof/The-Witness-Randomizer-for-Archipelago/releases)
## Optional Software
@@ -38,4 +38,4 @@ The Witness has a fully functional map tracker that supports auto-tracking.
3. Click on the "AP" symbol at the top.
4. Enter the AP address, slot name and password.
-The rest should take care of itself! Items and checks will be marked automatically, and it even knows your settings - It will hide checks & adjust logic accordingly.
\ No newline at end of file
+The rest should take care of itself! Items and checks will be marked automatically, and it even knows your settings - It will hide checks & adjust logic accordingly. Note that the tracker may be out of date.
\ No newline at end of file
diff --git a/worlds/witness/items.py b/worlds/witness/items.py
index 0b4824e527..0d7530988e 100644
--- a/worlds/witness/items.py
+++ b/worlds/witness/items.py
@@ -66,7 +66,7 @@ class StaticWitnessItems:
item_tab[item[0]] = ItemData(158000 + item[1], False, False)
for item in StaticWitnessLogic.ALL_USEFULS:
- item_tab[item[0]] = ItemData(158000 + item[1], False, False, False, True)
+ item_tab[item[0]] = ItemData(158000 + item[1], False, False, False, item[2])
item_tab = dict(sorted(
item_tab.items(),
diff --git a/worlds/witness/static_logic.py b/worlds/witness/static_logic.py
index 0625c48c6b..5f1d77d314 100644
--- a/worlds/witness/static_logic.py
+++ b/worlds/witness/static_logic.py
@@ -52,7 +52,10 @@ class StaticWitnessLogic:
line_split = line.split(" - ")
- current_set.add((line_split[1], int(line_split[0])))
+ if current_set is not self.ALL_USEFULS:
+ current_set.add((line_split[1], int(line_split[0])))
+ else:
+ current_set.add((line_split[1], int(line_split[0]), line_split[2] == "True"))
path = os.path.join(os.path.dirname(__file__), "Door_Shuffle.txt")
with open(path, "r", encoding="utf-8") as file: