Skip to content

Commit

Permalink
Merge branch 'main' into launcher-options
Browse files Browse the repository at this point in the history
  • Loading branch information
nicholassaylor authored Mar 26, 2024
2 parents 1625d85 + f7b415d commit d93649c
Show file tree
Hide file tree
Showing 152 changed files with 7,056 additions and 1,699 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ Currently, the following games are supported:
* Zork Grand Inquisitor
* Castlevania 64
* A Short Hike
* Yoshi's Island

For setup and instructions check out our [tutorials page](https://archipelago.gg/tutorial/).
Downloads can be found at [Releases](https://github.com/ArchipelagoMW/Archipelago/releases), including compiled
Expand Down
11 changes: 6 additions & 5 deletions WebHostLib/templates/tracker__Starcraft2.html
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ <h3>{{ player_name }}&apos;s Starcraft 2 Tracker</h3>
<td>{{ sc2_icon('Neosteel Bunker (Bunker)') }}</td>
<td>{{ sc2_icon('Shrike Turret (Bunker)') }}</td>
<td>{{ sc2_icon('Fortified Bunker (Bunker)') }}</td>
<td colspan="3"></td>
<td></td>
<td>{{ sc2_icon('Missile Turret') }}</td>
<td>{{ sc2_icon('Titanium Housing (Missile Turret)') }}</td>
<td>{{ sc2_icon('Hellstorm Batteries (Missile Turret)') }}</td>
Expand All @@ -121,12 +121,13 @@ <h3>{{ player_name }}&apos;s Starcraft 2 Tracker</h3>
<td>{{ sc2_icon('Planetary Fortress') }}</td>
<td {% if augmented_thrusters_planetary_fortress_level == 1 %}class="tint-terran"{% endif %}>{{ sc2_progressive_icon_with_custom_name('Progressive Augmented Thrusters (Planetary Fortress)', augmented_thrusters_planetary_fortress_url, augmented_thrusters_planetary_fortress_name) }}</td>
<td>{{ sc2_icon('Advanced Targeting (Planetary Fortress)') }}</td>
<td colspan="2"></td>
<td>{{ sc2_icon('Micro-Filtering') }}</td>
<td>{{ sc2_icon('Automated Refinery') }}</td>
<td></td>
<td>{{ sc2_icon('Advanced Construction (SCV)') }}</td>
<td>{{ sc2_icon('Dual-Fusion Welders (SCV)') }}</td>
<td></td>
<td>{{ sc2_icon('Micro-Filtering') }}</td>
<td>{{ sc2_icon('Automated Refinery') }}</td>
<td>{{ sc2_icon('Hostile Environment Adaptation (SCV)') }}</td>
</tr>
<tr>
<td>{{ sc2_icon('Sensor Tower') }}</td>
Expand Down Expand Up @@ -180,7 +181,7 @@ <h3>{{ player_name }}&apos;s Starcraft 2 Tracker</h3>
<td>{{ sc2_icon('Nano Projector (Medic)') }}</td>
<td colspan="6"></td>
<td>{{ sc2_icon('Vulture') }}</td>
<td>{{ sc2_progressive_icon_with_custom_name('Progressive Replenishable Magazine (Vulture)', replenishable_magazine_vulture_url, replenishable_magazine_vulture_name) }}</td>
<td class="{{ sc2_tint_level(replenishable_magazine_vulture_level) }}">{{ sc2_progressive_icon_with_custom_name('Progressive Replenishable Magazine (Vulture)', replenishable_magazine_vulture_url, replenishable_magazine_vulture_name) }}</td>
<td>{{ sc2_icon('Ion Thrusters (Vulture)') }}</td>
<td>{{ sc2_icon('Auto Launchers (Vulture)') }}</td>
<td>{{ sc2_icon('Auto-Repair (Vulture)') }}</td>
Expand Down
13 changes: 7 additions & 6 deletions WebHostLib/tracker.py
Original file line number Diff line number Diff line change
Expand Up @@ -1606,6 +1606,7 @@ def render_Starcraft2_tracker(tracker_data: TrackerData, team: int, player: int)
"Hellstorm Batteries (Missile Turret)": github_icon_base_url + "blizzard/btn-ability-stetmann-corruptormissilebarrage.png",
"Advanced Construction (SCV)": github_icon_base_url + "blizzard/btn-ability-mengsk-trooper-advancedconstruction.png",
"Dual-Fusion Welders (SCV)": github_icon_base_url + "blizzard/btn-upgrade-swann-scvdoublerepair.png",
"Hostile Environment Adaptation (SCV)": github_icon_base_url + "blizzard/btn-upgrade-swann-hellarmor.png",
"Fire-Suppression System Level 1": organics_icon_base_url + "Fire-SuppressionSystem.png",
"Fire-Suppression System Level 2": github_icon_base_url + "blizzard/btn-upgrade-swann-firesuppressionsystem.png",

Expand Down Expand Up @@ -2333,12 +2334,12 @@ def render_Starcraft2_tracker(tracker_data: TrackerData, team: int, player: int)
"Progressive Zerg Armor Upgrade": 106 + SC2HOTS_ITEM_ID_OFFSET,
"Progressive Zerg Ground Upgrade": 107 + SC2HOTS_ITEM_ID_OFFSET,
"Progressive Zerg Flyer Upgrade": 108 + SC2HOTS_ITEM_ID_OFFSET,
"Progressive Zerg Weapon/Armor Upgrade": 109 + SC2WOL_ITEM_ID_OFFSET,
"Progressive Protoss Weapon Upgrade": 105 + SC2HOTS_ITEM_ID_OFFSET,
"Progressive Protoss Armor Upgrade": 106 + SC2HOTS_ITEM_ID_OFFSET,
"Progressive Protoss Ground Upgrade": 107 + SC2HOTS_ITEM_ID_OFFSET,
"Progressive Protoss Air Upgrade": 108 + SC2HOTS_ITEM_ID_OFFSET,
"Progressive Protoss Weapon/Armor Upgrade": 109 + SC2WOL_ITEM_ID_OFFSET,
"Progressive Zerg Weapon/Armor Upgrade": 109 + SC2HOTS_ITEM_ID_OFFSET,
"Progressive Protoss Weapon Upgrade": 105 + SC2LOTV_ITEM_ID_OFFSET,
"Progressive Protoss Armor Upgrade": 106 + SC2LOTV_ITEM_ID_OFFSET,
"Progressive Protoss Ground Upgrade": 107 + SC2LOTV_ITEM_ID_OFFSET,
"Progressive Protoss Air Upgrade": 108 + SC2LOTV_ITEM_ID_OFFSET,
"Progressive Protoss Weapon/Armor Upgrade": 109 + SC2LOTV_ITEM_ID_OFFSET,
}
grouped_item_replacements = {
"Progressive Terran Weapon Upgrade": ["Progressive Terran Infantry Weapon",
Expand Down
5 changes: 4 additions & 1 deletion docs/CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@
/worlds/tloz/ @Rosalie-A @t3hf1gm3nt

# TUNIC
/worlds/tunic/ @silent-destroyer
/worlds/tunic/ @silent-destroyer @ScipioWright

# Undertale
/worlds/undertale/ @jonloveslegos
Expand All @@ -191,6 +191,9 @@
# The Witness
/worlds/witness/ @NewSoupVi @blastron

# Yoshi's Island
/worlds/yoshisisland/ @PinkSwitch

# Zillion
/worlds/zillion/ @beauxq

Expand Down
2 changes: 1 addition & 1 deletion docs/options api.md
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ For example:
```python
range_start = 1
range_end = 99
special_range_names: {
special_range_names = {
"normal": 20,
"extreme": 99,
"unlimited": -1,
Expand Down
5 changes: 5 additions & 0 deletions inno_setup.iss
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,11 @@ Root: HKCR; Subkey: "{#MyAppName}advnpatch"; ValueData: "Arc
Root: HKCR; Subkey: "{#MyAppName}advnpatch\DefaultIcon"; ValueData: "{app}\ArchipelagoAdventureClient.exe,0"; ValueType: string; ValueName: "";
Root: HKCR; Subkey: "{#MyAppName}advnpatch\shell\open\command"; ValueData: """{app}\ArchipelagoAdventureClient.exe"" ""%1"""; ValueType: string; ValueName: "";

Root: HKCR; Subkey: ".apyi"; ValueData: "{#MyAppName}yipatch"; Flags: uninsdeletevalue; ValueType: string; ValueName: "";
Root: HKCR; Subkey: "{#MyAppName}yipatch"; ValueData: "Archipelago Yoshi's Island Patch"; Flags: uninsdeletekey; ValueType: string; ValueName: "";
Root: HKCR; Subkey: "{#MyAppName}yipatch\DefaultIcon"; ValueData: "{app}\ArchipelagoSNIClient.exe,0"; ValueType: string; ValueName: "";
Root: HKCR; Subkey: "{#MyAppName}yipatch\shell\open\command"; ValueData: """{app}\ArchipelagoSNIClient.exe"" ""%1"""; ValueType: string; ValueName: "";

Root: HKCR; Subkey: ".archipelago"; ValueData: "{#MyAppName}multidata"; Flags: uninsdeletevalue; ValueType: string; ValueName: "";
Root: HKCR; Subkey: "{#MyAppName}multidata"; ValueData: "Archipelago Server Data"; Flags: uninsdeletekey; ValueType: string; ValueName: "";
Root: HKCR; Subkey: "{#MyAppName}multidata\DefaultIcon"; ValueData: "{app}\ArchipelagoServer.exe,0"; ValueType: string; ValueName: "";
Expand Down
6 changes: 6 additions & 0 deletions kvui.py
Original file line number Diff line number Diff line change
Expand Up @@ -705,6 +705,12 @@ def refresh_hints(self, hints):
def hint_sorter(element: dict) -> str:
return ""

def fix_heights(self):
"""Workaround fix for divergent texture and layout heights"""
for element in self.children[0].children:
max_height = max(child.texture_size[1] for child in element.children)
element.height = max_height


class E(ExceptionHandler):
logger = logging.getLogger("Client")
Expand Down
2 changes: 1 addition & 1 deletion worlds/Files.py
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,7 @@ def get_token_binary(self) -> bytes:
data.append(args)
elif token_type in [APTokenTypes.COPY, APTokenTypes.RLE]:
assert isinstance(args, tuple), f"Arguments to COPY/RLE must be of type tuple, not {type(args)}"
data.extend(int.to_bytes(4, 4, "little"))
data.extend(int.to_bytes(8, 4, "little"))
data.extend(args[0].to_bytes(4, "little"))
data.extend(args[1].to_bytes(4, "little"))
elif token_type == APTokenTypes.WRITE:
Expand Down
10 changes: 5 additions & 5 deletions worlds/adventure/docs/en_Adventure.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
# Adventure

## Where is the settings page?
The [player settings page for Adventure](../player-settings) contains all the options you need to configure and export a config file.
## Where is the options page?
The [player options page for Adventure](../player-options) contains all the options you need to configure and export a config file.

## What does randomization do to this game?
Adventure items may be distributed into additional locations not possible in the vanilla Adventure randomizer. All
Adventure items are added to the multiworld item pool. Depending on the settings, dragon locations may be randomized,
Adventure items are added to the multiworld item pool. Depending on the `dragon_rando_type` value, dragon locations may be randomized,
slaying dragons may award items, difficulty switches may require items to unlock, and limited use 'freeincarnates'
can allow reincarnation without resurrecting dragons. Dragon speeds may also be randomized, and items may exist
to reduce their speeds.
Expand All @@ -15,7 +15,7 @@ Same as vanilla; Find the Enchanted Chalice and return it to the Yellow Castle

## Which items can be in another player's world?
All three keys, the chalice, the sword, the magnet, and the bridge can be found in another player's world. Depending on
settings, dragon slowdowns, difficulty switch unlocks, and freeincarnates may also be found.
options, dragon slowdowns, difficulty switch unlocks, and freeincarnates may also be found.

## What is considered a location check in Adventure?
Most areas in Adventure have one or more locations which can contain an Adventure item or an Archipelago item.
Expand All @@ -41,7 +41,7 @@ A message is shown in the client log. While empty handed, the player can press
order they were received. Once an item is retrieved this way, it cannot be retrieved again until pressing select to
return to the 'GO' screen or doing a hard reset, either one of which will reset all items to their original positions.

## What are recommended settings to tweak for beginners to the rando?
## What are recommended options to tweak for beginners to the rando?
Setting difficulty_switch_a and lowering the dragons' speeds makes the dragons easier to avoid. Adding Chalice to
local_items guarantees you'll visit at least one of the interesting castles, as it can only be placed in a castle or
the credits room.
Expand Down
2 changes: 1 addition & 1 deletion worlds/adventure/docs/setup_en.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ an experience customized for their taste, and different players in the same mult

### Where do I get a YAML file?

You can generate a yaml or download a template by visiting the [Adventure Settings Page](/games/Adventure/player-settings)
You can generate a yaml or download a template by visiting the [Adventure Options Page](/games/Adventure/player-options)

### What are recommended settings to tweak for beginners to the rando?
Setting difficulty_switch_a and lowering the dragons' speeds makes the dragons easier to avoid. Adding Chalice to
Expand Down
38 changes: 19 additions & 19 deletions worlds/alttp/ItemPool.py
Original file line number Diff line number Diff line change
Expand Up @@ -508,7 +508,7 @@ def cut_item(items, item_to_cut, minimum_items):
multiworld.itempool += items

if multiworld.retro_caves[player]:
set_up_take_anys(multiworld, player) # depends on world.itempool to be set
set_up_take_anys(multiworld, world, player) # depends on world.itempool to be set


take_any_locations = {
Expand All @@ -528,30 +528,30 @@ def cut_item(items, item_to_cut, minimum_items):
take_any_locations.sort()


def set_up_take_anys(world, player):
def set_up_take_anys(multiworld, world, player):
# these are references, do not modify these lists in-place
if world.mode[player] == 'inverted':
if multiworld.mode[player] == 'inverted':
take_any_locs = take_any_locations_inverted
else:
take_any_locs = take_any_locations

regions = world.random.sample(take_any_locs, 5)
regions = multiworld.random.sample(take_any_locs, 5)

old_man_take_any = LTTPRegion("Old Man Sword Cave", LTTPRegionType.Cave, 'the sword cave', player, world)
world.regions.append(old_man_take_any)
old_man_take_any = LTTPRegion("Old Man Sword Cave", LTTPRegionType.Cave, 'the sword cave', player, multiworld)
multiworld.regions.append(old_man_take_any)

reg = regions.pop()
entrance = world.get_region(reg, player).entrances[0]
connect_entrance(world, entrance.name, old_man_take_any.name, player)
entrance = multiworld.get_region(reg, player).entrances[0]
connect_entrance(multiworld, entrance.name, old_man_take_any.name, player)
entrance.target = 0x58
old_man_take_any.shop = TakeAny(old_man_take_any, 0x0112, 0xE2, True, True, total_shop_slots)
world.shops.append(old_man_take_any.shop)
multiworld.shops.append(old_man_take_any.shop)

swords = [item for item in world.itempool if item.player == player and item.type == 'Sword']
swords = [item for item in multiworld.itempool if item.player == player and item.type == 'Sword']
if swords:
sword = world.random.choice(swords)
world.itempool.remove(sword)
world.itempool.append(item_factory('Rupees (20)', world))
sword = multiworld.random.choice(swords)
multiworld.itempool.remove(sword)
multiworld.itempool.append(item_factory('Rupees (20)', world))
old_man_take_any.shop.add_inventory(0, sword.name, 0, 0)
loc_name = "Old Man Sword Cave"
location = ALttPLocation(player, loc_name, shop_table_by_location[loc_name], parent=old_man_take_any)
Expand All @@ -562,16 +562,16 @@ def set_up_take_anys(world, player):
old_man_take_any.shop.add_inventory(0, 'Rupees (300)', 0, 0)

for num in range(4):
take_any = LTTPRegion("Take-Any #{}".format(num+1), LTTPRegionType.Cave, 'a cave of choice', player, world)
world.regions.append(take_any)
take_any = LTTPRegion("Take-Any #{}".format(num+1), LTTPRegionType.Cave, 'a cave of choice', player, multiworld)
multiworld.regions.append(take_any)

target, room_id = world.random.choice([(0x58, 0x0112), (0x60, 0x010F), (0x46, 0x011F)])
target, room_id = multiworld.random.choice([(0x58, 0x0112), (0x60, 0x010F), (0x46, 0x011F)])
reg = regions.pop()
entrance = world.get_region(reg, player).entrances[0]
connect_entrance(world, entrance.name, take_any.name, player)
entrance = multiworld.get_region(reg, player).entrances[0]
connect_entrance(multiworld, entrance.name, take_any.name, player)
entrance.target = target
take_any.shop = TakeAny(take_any, room_id, 0xE3, True, True, total_shop_slots + num + 1)
world.shops.append(take_any.shop)
multiworld.shops.append(take_any.shop)
take_any.shop.add_inventory(0, 'Blue Potion', 0, 0)
take_any.shop.add_inventory(1, 'Boss Heart Container', 0, 0)
location = ALttPLocation(player, take_any.name, shop_table_by_location[take_any.name], parent=take_any)
Expand Down
2 changes: 1 addition & 1 deletion worlds/alttp/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -649,7 +649,7 @@ def stage_fill_hook(cls, multiworld, progitempool, usefulitempool, filleritempoo
if not multiworld.ganonstower_vanilla[player] or \
world.options.glitches_required.current_key in {'overworld_glitches', 'hybrid_major_glitches', "no_logic"}:
pass
elif 'triforce_hunt' in world.options.goal.current_key and ('local' in world.options.goal.current_key or world.players == 1):
elif 'triforce_hunt' in world.options.goal.current_key and ('local' in world.options.goal.current_key or multiworld.players == 1):
trash_counts[player] = multiworld.random.randint(world.options.crystals_needed_for_gt * 2,
world.options.crystals_needed_for_gt * 4)
else:
Expand Down
4 changes: 2 additions & 2 deletions worlds/alttp/docs/en_A Link to the Past.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# A Link to the Past

## Where is the settings page?
## Where is the options page?

The [player settings page for this game](../player-settings) contains all the options you need to configure and export a
The [player options page for this game](../player-options) contains all the options you need to configure and export a
config file.

## What does randomization do to this game?
Expand Down
4 changes: 2 additions & 2 deletions worlds/archipidle/docs/en_ArchipIDLE.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ ArchipIDLE was originally the 2022 Archipelago April Fools' Day joke. It is an i
on regular intervals. Updated annually with more items, gimmicks, and features, the game is visible
only during the month of April.

## Where is the settings page?
## Where is the options page?

The [player settings page for this game](../player-settings) contains all the options you need to configure
The [player options page for this game](../player-options) contains all the options you need to configure
and export a config file.

2 changes: 1 addition & 1 deletion worlds/archipidle/docs/guide_en.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# ArchipIdle Setup Guide

## Joining a MultiWorld Game
1. Generate a `.yaml` file from the [ArchipIDLE Player Settings Page](/games/ArchipIDLE/player-settings)
1. Generate a `.yaml` file from the [ArchipIDLE Player Options Page](/games/ArchipIDLE/player-options)
2. Open the ArchipIDLE Client in your web browser by either:
- Navigate to the [ArchipIDLE Client](http://idle.multiworld.link)
- Download the client and run it locally from the
Expand Down
4 changes: 2 additions & 2 deletions worlds/bk_sudoku/docs/en_Sudoku.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,6 @@ BK Sudoku is not a typical Archipelago game; instead, it is a generic Sudoku cli

After completing a Sudoku puzzle, the game will unlock 1 random hint for an unchecked location in the slot you are connected to.

## Where is the settings page?
## Where is the options page?

There is no settings page; this game cannot be used in your .yamls. Instead, the client can connect to any slot in a multiworld.
There is no options page; this game cannot be used in your .yamls. Instead, the client can connect to any slot in a multiworld.
4 changes: 2 additions & 2 deletions worlds/blasphemous/docs/en_Blasphemous.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
# Blasphemous

## Where is the settings page?
## Where is the options page?

The [player settings page for this game](../player-settings) contains all the options you need to configure and export a config file.
The [player options page for this game](../player-options) contains all the options you need to configure and export a config file.

## What does randomization do to this game?

Expand Down
4 changes: 2 additions & 2 deletions worlds/bumpstik/docs/en_Bumper Stickers.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Bumper Stickers

## Where is the settings page?
The [player settings page for Bumper Stickers](../player-settings) contains all the options you need to configure and export a config file.
## Where is the options page?
The [player options page for Bumper Stickers](../player-options) contains all the options you need to configure and export a config file.

## What does randomization do to this game?
Playing this in Archipelago is a very different experience from Classic mode. You start with a very small board and a set of tasks. Completing those tasks will give you a larger board and more, harder tasks. In addition, special types of bumpers exist that must be cleared in order to progress.
Expand Down
Loading

0 comments on commit d93649c

Please sign in to comment.