Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ALTTP] Add second Power Star to differentiate non-native progression items #2866

Open
wants to merge 15 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified data/basepatch.bsdiff4
Binary file not shown.
3 changes: 2 additions & 1 deletion worlds/alttp/Items.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,9 @@ def as_init_dict(self) -> typing.Dict[str, typing.Any]:
'Green Pendant': ItemData(IC.progression, 'Crystal', (0x04, 0x38, 0x62, 0x00, 0x69, 0x01), None, None, None, None, None, None, "the green pendant"),
'Blue Pendant': ItemData(IC.progression, 'Crystal', (0x02, 0x34, 0x60, 0x00, 0x69, 0x02), None, None, None, None, None, None, "the blue pendant"),
'Red Pendant': ItemData(IC.progression, 'Crystal', (0x01, 0x32, 0x60, 0x00, 0x69, 0x03), None, None, None, None, None, None, "the red pendant"),
'Gold Power Star': ItemData(IC.progression, None, 0x69, 'a small victory', 'and the power star', 'star-struck kid', 'star for sale', 'see stars with shroom', 'mario powers up again', 'a Blue Power Star'),
'Triforce': ItemData(IC.progression, None, 0x6A, '\n YOU WIN!', 'and the triforce', 'victorious kid', 'victory for sale', 'fungus for the win', 'greedy boy wins game again', 'the Triforce'),
'Power Star': ItemData(IC.progression, None, 0x6B, 'a small victory', 'and the power star', 'star-struck kid', 'star for sale', 'see stars with shroom', 'mario powers up again', 'a Power Star'),
'Silver Power Star': ItemData(IC.filler, None, 0x6B, 'a small victory', 'and the power star', 'star-struck kid', 'star for sale', 'see stars with shroom', 'mario powers up again', 'a Power Star'),
'Triforce Piece': ItemData(IC.progression_skip_balancing, None, 0x6C, 'a small victory', 'and the thirdforce', 'triangular kid', 'triangle for sale', 'fungus for triangle', 'wise boy has triangle again', 'a Triforce Piece'),
'Crystal 1': ItemData(IC.progression, 'Crystal', (0x02, 0x34, 0x64, 0x40, 0x7F, 0x06), None, None, None, None, None, None, "a blue crystal"),
'Crystal 2': ItemData(IC.progression, 'Crystal', (0x10, 0x34, 0x64, 0x40, 0x79, 0x06), None, None, None, None, None, None, "a blue crystal"),
Expand Down
6 changes: 6 additions & 0 deletions worlds/alttp/Options.py
Original file line number Diff line number Diff line change
Expand Up @@ -573,6 +573,11 @@ def gives_bottle_merchant_hint(self):
return self.value in {0, 1}


class StarScams(Toggle):
"""If on, Power Stars (used to indicate non-LTTP items) will all appear gold.
If off, only progression items appear gold, while non-progression items appear silver."""
display_name = "Star Scams"

class EnemyShuffle(Toggle):
"""Randomize every enemy spawn.
If mode is Standard, Hyrule Castle is left out (may result in visually wrong enemy sprites in that area.)"""
Expand Down Expand Up @@ -778,6 +783,7 @@ class ALttPPlandoTexts(PlandoTexts):
"retro_caves": RetroCaves,
"hints": Hints,
"scams": Scams,
"star_scams": StarScams,
"boss_shuffle": LTTPBosses,
"pot_shuffle": PotShuffle,
"enemy_shuffle": EnemyShuffle,
Expand Down
18 changes: 13 additions & 5 deletions worlds/alttp/Rom.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import worlds.Files

LTTPJPN10HASH: str = "03a63945398191337e896e5771f77173"
RANDOMIZERBASEHASH: str = "8704fb9b9fa4fad52d4d2f9a95fb5360"
RANDOMIZERBASEHASH: str = "528c9298ff37e6d13cb8c1d5b8bd8f79"
ROM_PLAYER_LIMIT: int = 255

import io
Expand Down Expand Up @@ -774,11 +774,17 @@ def write_to_rom(self, rom: LocalRom):
0x4D504, 0x4D507, 0x4D55E, 0x4D56A]


def get_nonnative_item_sprite(code: int) -> int:
def get_nonnative_item_sprite(code: int, advancement: bool) -> int:
if 84173 >= code >= 84007: # LttP item in SMZ3
return code - 84000
return 0x6B # set all non-native sprites to Power Star as per 13 to 2 vote at
# Set all non-native sprites to Power Star as per 13 to 2 vote at
# https://discord.com/channels/731205301247803413/827141303330406408/852102450822905886
# Use a gold Power Star for advancement items and a silver Power Star
# for non-advancement items, as per more recent discussions.
if advancement:
return 0x69 # Gold Power Star
else:
return 0x6B # Silver Power Star


def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool):
Expand All @@ -800,7 +806,8 @@ def patch_rom(world: MultiWorld, rom: LocalRom, player: int, enemized: bool):
if location.item.trap:
itemid = 0x5A # Nothing, which disguises
else:
itemid = get_nonnative_item_sprite(location.item.code)
itemid = get_nonnative_item_sprite(location.item.code,
world.star_scams[player] or location.item.advancement)
# Keys in their native dungeon should use the orignal item code for keys
elif location.parent_region.dungeon:
if location.parent_region.dungeon.is_dungeon_item(location.item):
Expand Down Expand Up @@ -1776,7 +1783,8 @@ def write_custom_shops(rom, world, player):
replacement_price_data = get_price_data(item['replacement_price'], item['replacement_price_type'])
slot = 0 if shop.type == ShopType.TakeAny else index
if item['player'] and world.game[item['player']] != "A Link to the Past": # item not native to ALTTP
item_code = get_nonnative_item_sprite(world.worlds[item['player']].item_name_to_id[item['item']])
item_code = get_nonnative_item_sprite(world.worlds[item['player']].item_name_to_id[item['item']],
world.star_scams[player] or shop.region.locations[index].item.advancement)
else:
item_code = item_table[item["item"]].item_code
if item['item'] == 'Single Arrow' and item['player'] == 0 and world.retro_bow[player]:
Expand Down
Loading