mirror of
https://github.com/ArchipelagoMW/Archipelago.git
synced 2026-03-24 08:33:28 -07:00
Compare commits
8 Commits
NewSoupVi-
...
NewSoupVi-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9a351be44b | ||
|
|
0dade05133 | ||
|
|
fcaba14b62 | ||
|
|
6073d5e37e | ||
|
|
41a7d7eeee | ||
|
|
d3a3c29bc9 | ||
|
|
0ad5b0ade8 | ||
|
|
e6e31a27e6 |
@@ -47,6 +47,17 @@ def get_flag(data, flag):
|
|||||||
bit = int(0x80 / (2 ** (flag % 8)))
|
bit = int(0x80 / (2 ** (flag % 8)))
|
||||||
return (data[byte] & bit) > 0
|
return (data[byte] & bit) > 0
|
||||||
|
|
||||||
|
def validate_read_state(data1, data2):
|
||||||
|
validation_array = bytes([0x01, 0x46, 0x46, 0x4D, 0x51, 0x52])
|
||||||
|
|
||||||
|
if data1 is None or data2 is None:
|
||||||
|
return False
|
||||||
|
for i in range(6):
|
||||||
|
if data1[i] != validation_array[i] or data2[i] != validation_array[i]:
|
||||||
|
return False;
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class FFMQClient(SNIClient):
|
class FFMQClient(SNIClient):
|
||||||
game = "Final Fantasy Mystic Quest"
|
game = "Final Fantasy Mystic Quest"
|
||||||
@@ -67,11 +78,11 @@ class FFMQClient(SNIClient):
|
|||||||
async def game_watcher(self, ctx):
|
async def game_watcher(self, ctx):
|
||||||
from SNIClient import snes_buffered_write, snes_flush_writes, snes_read
|
from SNIClient import snes_buffered_write, snes_flush_writes, snes_read
|
||||||
|
|
||||||
check_1 = await snes_read(ctx, 0xF53749, 1)
|
check_1 = await snes_read(ctx, 0xF53749, 6)
|
||||||
received = await snes_read(ctx, RECEIVED_DATA[0], RECEIVED_DATA[1])
|
received = await snes_read(ctx, RECEIVED_DATA[0], RECEIVED_DATA[1])
|
||||||
data = await snes_read(ctx, READ_DATA_START, READ_DATA_END - READ_DATA_START)
|
data = await snes_read(ctx, READ_DATA_START, READ_DATA_END - READ_DATA_START)
|
||||||
check_2 = await snes_read(ctx, 0xF53749, 1)
|
check_2 = await snes_read(ctx, 0xF53749, 6)
|
||||||
if check_1 != b'\x01' or check_2 != b'\x01':
|
if not validate_read_state(check_1, check_2):
|
||||||
return
|
return
|
||||||
|
|
||||||
def get_range(data_range):
|
def get_range(data_range):
|
||||||
|
|||||||
@@ -231,7 +231,7 @@ class HKWorld(World):
|
|||||||
all_event_names.update(set(godhome_event_names))
|
all_event_names.update(set(godhome_event_names))
|
||||||
|
|
||||||
# Link regions
|
# Link regions
|
||||||
for event_name in all_event_names:
|
for event_name in sorted(all_event_names):
|
||||||
#if event_name in wp_exclusions:
|
#if event_name in wp_exclusions:
|
||||||
# continue
|
# continue
|
||||||
loc = HKLocation(self.player, event_name, None, menu_region)
|
loc = HKLocation(self.player, event_name, None, menu_region)
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ def create_locations(player: int, regions_table: Dict[str, LandstalkerRegion], n
|
|||||||
for data in WORLD_PATHS_JSON:
|
for data in WORLD_PATHS_JSON:
|
||||||
if "requiredNodes" in data:
|
if "requiredNodes" in data:
|
||||||
regions_with_entrance_checks.extend([region_id for region_id in data["requiredNodes"]])
|
regions_with_entrance_checks.extend([region_id for region_id in data["requiredNodes"]])
|
||||||
regions_with_entrance_checks = list(set(regions_with_entrance_checks))
|
regions_with_entrance_checks = sorted(set(regions_with_entrance_checks))
|
||||||
for region_id in regions_with_entrance_checks:
|
for region_id in regions_with_entrance_checks:
|
||||||
region = regions_table[region_id]
|
region = regions_table[region_id]
|
||||||
location = LandstalkerLocation(player, 'event_visited_' + region_id, None, region, "event")
|
location = LandstalkerLocation(player, 'event_visited_' + region_id, None, region, "event")
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ class L2ACWorld(World):
|
|||||||
L2ACItem("Progressive chest access", ItemClassification.progression, None, self.player))
|
L2ACItem("Progressive chest access", ItemClassification.progression, None, self.player))
|
||||||
chest_access.show_in_spoiler = False
|
chest_access.show_in_spoiler = False
|
||||||
ancient_dungeon.locations.append(chest_access)
|
ancient_dungeon.locations.append(chest_access)
|
||||||
for iris in self.item_name_groups["Iris treasures"]:
|
for iris in sorted(self.item_name_groups["Iris treasures"]):
|
||||||
treasure_name: str = f"Iris treasure {self.item_name_to_id[iris] - self.item_name_to_id['Iris sword'] + 1}"
|
treasure_name: str = f"Iris treasure {self.item_name_to_id[iris] - self.item_name_to_id['Iris sword'] + 1}"
|
||||||
iris_treasure: Location = \
|
iris_treasure: Location = \
|
||||||
L2ACLocation(self.player, treasure_name, self.location_name_to_id[treasure_name], ancient_dungeon)
|
L2ACLocation(self.player, treasure_name, self.location_name_to_id[treasure_name], ancient_dungeon)
|
||||||
|
|||||||
@@ -1387,7 +1387,7 @@ def get_locations(world: Optional[World]) -> Tuple[LocationData, ...]:
|
|||||||
lambda state: logic.templars_return_requirement(state)),
|
lambda state: logic.templars_return_requirement(state)),
|
||||||
LocationData("The Host", "The Host: Victory", SC2LOTV_LOC_ID_OFFSET + 2100, LocationType.VICTORY,
|
LocationData("The Host", "The Host: Victory", SC2LOTV_LOC_ID_OFFSET + 2100, LocationType.VICTORY,
|
||||||
lambda state: logic.the_host_requirement(state)),
|
lambda state: logic.the_host_requirement(state)),
|
||||||
LocationData("The Host", "The Host: Southeast Void Shard", SC2LOTV_LOC_ID_OFFSET + 2101, LocationType.VICTORY,
|
LocationData("The Host", "The Host: Southeast Void Shard", SC2LOTV_LOC_ID_OFFSET + 2101, LocationType.EXTRA,
|
||||||
lambda state: logic.the_host_requirement(state)),
|
lambda state: logic.the_host_requirement(state)),
|
||||||
LocationData("The Host", "The Host: South Void Shard", SC2LOTV_LOC_ID_OFFSET + 2102, LocationType.EXTRA,
|
LocationData("The Host", "The Host: South Void Shard", SC2LOTV_LOC_ID_OFFSET + 2102, LocationType.EXTRA,
|
||||||
lambda state: logic.the_host_requirement(state)),
|
lambda state: logic.the_host_requirement(state)),
|
||||||
|
|||||||
@@ -43,6 +43,9 @@ class SC2Campaign(Enum):
|
|||||||
self.goal_priority = goal_priority
|
self.goal_priority = goal_priority
|
||||||
self.race = race
|
self.race = race
|
||||||
|
|
||||||
|
def __lt__(self, other: "SC2Campaign"):
|
||||||
|
return self.id < other.id
|
||||||
|
|
||||||
GLOBAL = 0, "Global", SC2CampaignGoalPriority.NONE, SC2Race.ANY
|
GLOBAL = 0, "Global", SC2CampaignGoalPriority.NONE, SC2Race.ANY
|
||||||
WOL = 1, "Wings of Liberty", SC2CampaignGoalPriority.VERY_HARD, SC2Race.TERRAN
|
WOL = 1, "Wings of Liberty", SC2CampaignGoalPriority.VERY_HARD, SC2Race.TERRAN
|
||||||
PROPHECY = 2, "Prophecy", SC2CampaignGoalPriority.MINI_CAMPAIGN, SC2Race.PROTOSS
|
PROPHECY = 2, "Prophecy", SC2CampaignGoalPriority.MINI_CAMPAIGN, SC2Race.PROTOSS
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ def create_vanilla_regions(
|
|||||||
names: Dict[str, int] = {}
|
names: Dict[str, int] = {}
|
||||||
|
|
||||||
# Generating all regions and locations for each enabled campaign
|
# Generating all regions and locations for each enabled campaign
|
||||||
for campaign in enabled_campaigns:
|
for campaign in sorted(enabled_campaigns):
|
||||||
for region_name in vanilla_mission_req_table[campaign].keys():
|
for region_name in vanilla_mission_req_table[campaign].keys():
|
||||||
regions.append(create_region(world, locations_per_region, location_cache, region_name))
|
regions.append(create_region(world, locations_per_region, location_cache, region_name))
|
||||||
world.multiworld.regions += regions
|
world.multiworld.regions += regions
|
||||||
|
|||||||
@@ -406,7 +406,6 @@ class PuzzleRandomizationSeed(Range):
|
|||||||
Sigma Rando, which is the basis for all puzzle randomization in this randomizer, uses a seed from 1 to 9999999 for the puzzle randomization.
|
Sigma Rando, which is the basis for all puzzle randomization in this randomizer, uses a seed from 1 to 9999999 for the puzzle randomization.
|
||||||
This option lets you set this seed yourself.
|
This option lets you set this seed yourself.
|
||||||
"""
|
"""
|
||||||
display_name = "Puzzle Randomization Seed"
|
|
||||||
range_start = 1
|
range_start = 1
|
||||||
range_end = 9999999
|
range_end = 9999999
|
||||||
default = "random"
|
default = "random"
|
||||||
@@ -457,7 +456,7 @@ witness_option_groups = [
|
|||||||
MountainLasers,
|
MountainLasers,
|
||||||
ChallengeLasers,
|
ChallengeLasers,
|
||||||
]),
|
]),
|
||||||
OptionGroup("Panel Hunt Settings", [
|
OptionGroup("Panel Hunt Options", [
|
||||||
PanelHuntRequiredPercentage,
|
PanelHuntRequiredPercentage,
|
||||||
PanelHuntTotal,
|
PanelHuntTotal,
|
||||||
PanelHuntPostgame,
|
PanelHuntPostgame,
|
||||||
|
|||||||
@@ -233,6 +233,7 @@ class ZillionSkill(Range):
|
|||||||
range_start = 0
|
range_start = 0
|
||||||
range_end = 5
|
range_end = 5
|
||||||
default = 2
|
default = 2
|
||||||
|
display_name = "skill"
|
||||||
|
|
||||||
|
|
||||||
class ZillionStartingCards(NamedRange):
|
class ZillionStartingCards(NamedRange):
|
||||||
|
|||||||
Reference in New Issue
Block a user