11 Commits

Author SHA1 Message Date
MarioSpore
5e71874446 I think this is how archipelago.json works? 2025-10-12 16:52:03 -04:00
MarioSpore
1870dd24ba Sleigh room part locations are now behind Sleigh Room region to prevent confusion when using UT 2025-10-12 16:51:42 -04:00
MarioSpore
f70b6c4c9c Pseudocode for move_rando pt 2 2025-10-04 23:57:22 -04:00
MarioSpore
79d4d5b10b Renamed inital for Seize 2025-10-04 23:50:44 -04:00
MarioSpore
7fea34adc3 Removed gadget_rando for now 2025-10-04 23:50:29 -04:00
MarioSpore
a3f9e6cbc9 Started psuedocode for moverando logic 2025-10-04 23:37:22 -04:00
MarioSpore
bccc83f864 Fixed Exhaust Pipes not being logically required for WV 2025-10-03 23:07:15 -04:00
SomeJakeGuy
6409721841 Fixed an issue where RingLink could disconnect because BizHawk is paused, so moved it to gamewatcher to be started there instead. 2025-10-03 22:23:16 -04:00
MarioSpore
d3a7b014bd Added gadget_rando & some description adjustments 2025-10-03 16:50:06 -04:00
MarioSpore
3ec8631203 Adjustments for move/gadget rando options 2025-10-03 16:44:34 -04:00
MarioSpore
2081912a39 Fixed Exception error 2025-10-03 16:40:20 -04:00
7 changed files with 91 additions and 36 deletions

View File

@@ -41,6 +41,7 @@ class GrinchClient(BizHawkClient):
previous_egg_count: int = 0 previous_egg_count: int = 0
send_ring_link: bool = False send_ring_link: bool = False
unique_client_id: int = 0 unique_client_id: int = 0
ring_link_enabled = False
def __init__(self): def __init__(self):
super().__init__() super().__init__()
@@ -93,12 +94,10 @@ class GrinchClient(BizHawkClient):
logger.info("You are now connected to the client. "+ logger.info("You are now connected to the client. "+
"There may be a slight delay to check you are not in demo mode before locations start to send.") "There may be a slight delay to check you are not in demo mode before locations start to send.")
ring_link_enabled = bool(ctx.slot_data["ring_link"]) self.ring_link_enabled = bool(ctx.slot_data["ring_link"])
tags = copy.deepcopy(ctx.tags) tags = copy.deepcopy(ctx.tags)
if ring_link_enabled: if self.ring_link_enabled:
self.send_ring_link = True
Utils.async_start(self.ring_link_output(ctx), name="EggLink")
ctx.tags.add("RingLink") ctx.tags.add("RingLink")
else: else:
ctx.tags -= { "RingLink" } ctx.tags -= { "RingLink" }
@@ -126,6 +125,11 @@ class GrinchClient(BizHawkClient):
if not await self.ingame_checker(ctx): if not await self.ingame_checker(ctx):
return return
if not any(task.get_name() == "Grinch EggLink" for task in asyncio.all_tasks()):
print("EggLink")
self.send_ring_link = True
Utils.async_start(self.ring_link_output(ctx), name="Grinch EggLink")
await self.location_checker(ctx) await self.location_checker(ctx)
await self.receiving_items_handler(ctx) await self.receiving_items_handler(ctx)
await self.goal_checker(ctx) await self.goal_checker(ctx)

View File

@@ -50,7 +50,7 @@ VT: str = "Progressive Vacuum Tube"
PC: str = "Pancake" PC: str = "Pancake"
SR: str = "Sleigh Room Key" SR: str = "Sleigh Room Key"
BB: str = "Bad Breath" BB: str = "Bad Breath"
SE: str = "Seize" SZ: str = "Seize"
MX: str = "Max" MX: str = "Max"
SN: str = "Sneak" SN: str = "Sneak"
WC: str = "Who Cloak" WC: str = "Who Cloak"

View File

@@ -189,11 +189,11 @@ grinch_locations = {
# "Bike Race - Top 2": GrinchLocationData("Bike Race", ["Supadow Minigames", "Bike Race"], 1510, [GrinchRamData()]), # "Bike Race - Top 2": GrinchLocationData("Bike Race", ["Supadow Minigames", "Bike Race"], 1510, [GrinchRamData()]),
# "Bike Race - Top 3": GrinchLocationData("Bike Race", ["Supadow Minigames", "Bike Race"], 1511, [GrinchRamData()]), # "Bike Race - Top 3": GrinchLocationData("Bike Race", ["Supadow Minigames", "Bike Race"], 1511, [GrinchRamData()]),
# Sleigh Part Locations # Sleigh Part Locations
"WV - Exhaust Pipes": GrinchLocationData("Sleigh Room", ["Sleigh Ride", "Whoville"], 1600, [GrinchRamData(0x0101FB, binary_bit_pos=2)]), "WV - Exhaust Pipes": GrinchLocationData("Whoville", ["Sleigh Ride", "Whoville"], 1600, [GrinchRamData(0x0101FB, binary_bit_pos=2)]),
"WF - Skis": GrinchLocationData("Sleigh Room", ["Sleigh Ride", "Who Forest"], 1601, [GrinchRamData(0x0101FB, binary_bit_pos=3)]), "WF - Skis": GrinchLocationData("Who Forest", ["Sleigh Ride", "Who Forest"], 1601, [GrinchRamData(0x0101FB, binary_bit_pos=3)]),
"WD - Tires": GrinchLocationData("Sleigh Room", ["Sleigh Ride", "Who Dump"], 1602, [GrinchRamData(0x0101FB, binary_bit_pos=4)]), "WD - Tires": GrinchLocationData("Who Dump", ["Sleigh Ride", "Who Dump"], 1602, [GrinchRamData(0x0101FB, binary_bit_pos=4)]),
"WL - Submarine World - Twin-End Tuba": GrinchLocationData("Sleigh Room", ["Sleigh Ride", "Who Lake", "South Shore"], 1603, [GrinchRamData(0x0101FB, binary_bit_pos=6)]), "WL - Submarine World - Twin-End Tuba": GrinchLocationData("Submarine World", ["Sleigh Ride", "Who Lake", "South Shore"], 1603, [GrinchRamData(0x0101FB, binary_bit_pos=6)]),
"WL - South Shore - GPS": GrinchLocationData("Sleigh Room", ["Sleigh Ride", "Who Lake", "Submarine World"], 1604, [GrinchRamData(0x0101FB, binary_bit_pos=5)]), "WL - South Shore - GPS": GrinchLocationData("Who Lake", ["Sleigh Ride", "Who Lake", "Submarine World"], 1604, [GrinchRamData(0x0101FB, binary_bit_pos=5)]),
# Mount Crumpit Locations # Mount Crumpit Locations
"MC - 1st Crate Squashed": GrinchLocationData("Mount Crumpit", ["Mount Crumpit"], 1700, [GrinchRamData(0x095343, value=1)]), "MC - 1st Crate Squashed": GrinchLocationData("Mount Crumpit", ["Mount Crumpit"], 1700, [GrinchRamData(0x095343, value=1)]),
"MC - 2nd Crate Squashed": GrinchLocationData("Mount Crumpit", ["Mount Crumpit"], 1701, [GrinchRamData(0x095343, value=2)]), "MC - 2nd Crate Squashed": GrinchLocationData("Mount Crumpit", ["Mount Crumpit"], 1701, [GrinchRamData(0x095343, value=2)]),

View File

@@ -42,13 +42,14 @@ class Missionsanity(Choice):
class ExcludeEnvironments(OptionSet): class ExcludeEnvironments(OptionSet):
""" """
Allows entire environments to be an excluded location to ensure you are not logically required to enter the environment along Allows entire environments to be an excluded location to ensure you are not logically required to enter the environment along
with any and all checks that are in that environment too. WARNING: Excluding too many environments may cause generation to fail. with any and all checks that are in that environment too.
WARNING: Excluding too many environments may cause generation to fail.
[NOT IMPLEMENTED] [NOT IMPLEMENTED]
Valid keys: "Whoville", "Who Forest", "Who Dump", "Who Lake", "Post Office", "Clock Tower", "City Hall", Valid keys: "Whoville", "Who Forest", "Who Dump", "Who Lake", "Post Office", "Clock Tower", "City Hall",
"Ski Resort", "Civic Center", "Minefield", "Power Plant", "Generator Building", "Scout's Hut", "Ski Resort", "Civic Center", "Minefield", "Power Plant", "Generator Building", "Scout's Hut",
"North Shore", "Mayor's Villa", "Sleigh Ride" "North Shore", "Mayor's Villa", "Sleigh Ride"
""" """
display_name = "Exclude Environments" display_name = "Exclude Environments"
valid_keys = {"Whoville", "Who Forest", "Who Dump", "Who Lake", "Post Office", "Clock Tower", "City Hall", valid_keys = {"Whoville", "Who Forest", "Who Dump", "Who Lake", "Post Office", "Clock Tower", "City Hall",
@@ -68,30 +69,17 @@ class Supadow(Toggle):
class Gifts(Range): class Gifts(Range):
""" """
Considers how many gifts must be squashed per check. Considers how many gifts must be squashed per check.
Enabling this will also enable squashing all gifts in a region mission along side this. [NOT IMPLEMENTED]""" Enabling this will also enable squashing all gifts in a region mission along side this. [NOT IMPLEMENTED]
"""
display_name = "Gifts Squashed per Check" display_name = "Gifts Squashed per Check"
range_start = 0 range_start = 0
range_end = 300 range_end = 300
default = 0 default = 0
class GadgetRando(OptionSet): class Moverando(Toggle):
"""
Randomizes Grinch's gadgets along with randomizing Binoculars into the pool. [NOT IMPLEMENTED]
Valid keys: "Binoculars", "Rotten Egg Launcher", "Rocket Spring", "Slime Shooter", "Octopus Climbing Device",
"Marine Mobile", "Grinch Copter"
"""
display_name = "Gadgets Randomized"
valid_keys = {"Binoculars", "Rotten Egg Launcher", "Rocket Spring", "Slime Shooter", "Octopus Climbing Device",
"Marine Mobile", "Grinch Copter"}
class Moverando(OptionSet):
"""Randomizes Grinch's moveset along with randomizing max into the pool. [NOT IMPLEMENTED] """Randomizes Grinch's moveset along with randomizing max into the pool. [NOT IMPLEMENTED]
Valid keys: "Pancake", "Seize", "Max", "Bad Breath", "Sneak"
""" """
display_name = "Moves Randomized" display_name = "Moves Randomized"
valid_keys = {"Pancake", "Seize", "Max", "Bad Breath", "Sneak"}
class UnlimitedEggs(Toggle): class UnlimitedEggs(Toggle):
"""Determine whether or not you run out of rotten eggs when you utilize your gadgets.""" """Determine whether or not you run out of rotten eggs when you utilize your gadgets."""

View File

@@ -85,6 +85,8 @@ rules_dict: dict[str,list[list[str]]] = {
], ],
"WV - Smashing Snowmen": [ "WV - Smashing Snowmen": [
[] []
# "move_rando"
# [PC]
], ],
"WV - Painting The Mayor's Posters": [ "WV - Painting The Mayor's Posters": [
[PB] [PB]
@@ -94,6 +96,9 @@ rules_dict: dict[str,list[list[str]]] = {
], ],
"WV - City Hall - Modifying The Mayor's Statue": [ "WV - City Hall - Modifying The Mayor's Statue": [
[ST] [ST]
# "move_rando"
# [ST, SN],
# [ST, SS]
], ],
"WV - Clock Tower - Advancing The Countdown-To-Xmas Clock": [ "WV - Clock Tower - Advancing The Countdown-To-Xmas Clock": [
[HMR, RS] [HMR, RS]
@@ -103,6 +108,8 @@ rules_dict: dict[str,list[list[str]]] = {
], ],
"WF - Making Xmas Trees Droop": [ "WF - Making Xmas Trees Droop": [
[REL] [REL]
# "move_rando"
# [REL, BB]
], ],
"WF - Sabotaging Snow Cannon With Glue": [ "WF - Sabotaging Snow Cannon With Glue": [
[GB, RS], [GB, RS],
@@ -118,6 +125,10 @@ rules_dict: dict[str,list[list[str]]] = {
"WF - Civic Center - Replacing The Candles On The Cake With Fireworks": [ "WF - Civic Center - Replacing The Candles On The Cake With Fireworks": [
[REL, GC], [REL, GC],
[REL, OCD, RS] [REL, OCD, RS]
# "move_rando"
# [REL, GC],
# [REL, OCD, RS, SN],
# [REL, OCD, RS, SS]
], ],
"WF - Squashing All Gifts": [ "WF - Squashing All Gifts": [
[GC, CCAC, SS, REL], [GC, CCAC, SS, REL],
@@ -125,20 +136,32 @@ rules_dict: dict[str,list[list[str]]] = {
], ],
"WD - Stealing Food From Birds": [ "WD - Stealing Food From Birds": [
[RS, REL] [RS, REL]
# "move_rando"
# [RS, REL, PC]
], ],
"WD - Feeding The Computer With Robot Parts": [ "WD - Feeding The Computer With Robot Parts": [
[RS, REL] [RS, REL]
# "move_rando"
# [RS, REL, PC]
], ],
"WD - Infesting The Mayor's House With Rats": [ "WD - Infesting The Mayor's House With Rats": [
[REL, RS], [REL, RS],
[REL, GC] [REL, GC]
# "move_rando"
# [REL, RS, PC],
# [REL, GC, PC]
], ],
"WD - Conducting The Stinky Gas To Who-Bris' Shack": [ "WD - Conducting The Stinky Gas To Who-Bris' Shack": [
[RS, REL] [RS, REL]
# "move_rando"
# [RS, REL, PC]
], ],
"WD - Minefield - Shaving Who Dump Guardian": [ "WD - Minefield - Shaving Who Dump Guardian": [
[SC, GC], [SC, GC],
[SC, SS, RS] [SC, SS, RS]
# "move_rando"
# [SC, GC, SN],
# [SC, SS, RS, SN]
], ],
"WD - Generator Building - Short-Circuiting Power-Plant": [ "WD - Generator Building - Short-Circuiting Power-Plant": [
[REL, GC], [REL, GC],
@@ -158,7 +181,6 @@ rules_dict: dict[str,list[list[str]]] = {
], ],
"WL - North Shore - Drilling Holes In Canoes": [ "WL - North Shore - Drilling Holes In Canoes": [
[DRL] [DRL]
# [DRL, MX]
], ],
"WL - Submarine World - Modifying The Marine Mobile": [ "WL - Submarine World - Modifying The Marine Mobile": [
[] []
@@ -190,10 +212,12 @@ rules_dict: dict[str,list[list[str]]] = {
], ],
"WV - Post Office - REL BP inside Silver Room": [ "WV - Post Office - REL BP inside Silver Room": [
[WC] [WC]
# "move_rando"
# [WC, MX] # [WC, MX]
], ],
"WV - Post Office - REL BP at Entrance Door after Mission Completion": [ "WV - Post Office - REL BP at Entrance Door after Mission Completion": [
[WC] [WC]
# "move_rando"
# [WC, MX] # [WC, MX]
], ],
"WF - RS BP behind Vacuum Tube": [ "WF - RS BP behind Vacuum Tube": [
@@ -291,6 +315,7 @@ rules_dict: dict[str,list[list[str]]] = {
], ],
"WD - Minefield - OCD BP on Left Side of House": [ "WD - Minefield - OCD BP on Left Side of House": [
[] []
# "move_rando"
# [REL, GC], # [REL, GC],
# [REL, SS, RS] # [REL, SS, RS]
# [MX] # [MX]
@@ -301,6 +326,7 @@ rules_dict: dict[str,list[list[str]]] = {
], ],
"WD - Minefield - OCD BP inside Guardian's House": [ "WD - Minefield - OCD BP inside Guardian's House": [
[] []
# "move_rando"
# [REL, GC], # [REL, GC],
# [REL, SS, RS] # [REL, SS, RS]
# [MX] # [MX]
@@ -341,10 +367,12 @@ rules_dict: dict[str,list[list[str]]] = {
], ],
"WL - North Shore - MM BP inside Skunk Hut": [ "WL - North Shore - MM BP inside Skunk Hut": [
[] []
# "move_rando"
# [MX] # [MX]
], ],
"WL - North Shore - MM BP inside House's Fence": [ "WL - North Shore - MM BP inside House's Fence": [
[] []
# "move_rando"
# [MX] # [MX]
], ],
"WL - North Shore - MM BP inside Boulder Box near Bridge": [ "WL - North Shore - MM BP inside Boulder Box near Bridge": [
@@ -367,6 +395,7 @@ rules_dict: dict[str,list[list[str]]] = {
], ],
"WV - Clock Tower - GC BP in Bedroom": [ "WV - Clock Tower - GC BP in Bedroom": [
[RS] [RS]
# "move_rando"
# [MX, RS] # [MX, RS]
], ],
"WV - Clock Tower - GC BP in Bell Room": [ "WV - Clock Tower - GC BP in Bell Room": [
@@ -377,6 +406,7 @@ rules_dict: dict[str,list[list[str]]] = {
], ],
"WF - Ski Resort - GC BP in Max Cave": [ "WF - Ski Resort - GC BP in Max Cave": [
[] []
# "move_rando"
# [MX] # [MX]
], ],
"WF - Civic Center - GC BP on Left Side in Bat Cave Wall": [ "WF - Civic Center - GC BP on Left Side in Bat Cave Wall": [
@@ -391,11 +421,13 @@ rules_dict: dict[str,list[list[str]]] = {
], ],
"WD - Power Plant - GC BP in Max Cave": [ "WD - Power Plant - GC BP in Max Cave": [
[] []
# "move_rando"
# [MX] # [MX]
], ],
"WD - Power Plant - GC BP After First Gate": [ "WD - Power Plant - GC BP After First Gate": [
[REL, RS], [REL, RS],
[GC] [GC]
# "move_rando"
# [MX, REL, RS] # [MX, REL, RS]
], ],
"WD - Generator Building - GC BP on the Highest Platform": [ "WD - Generator Building - GC BP on the Highest Platform": [
@@ -440,6 +472,7 @@ rules_dict: dict[str,list[list[str]]] = {
], ],
"WL - North Shore - Heart of Stone": [ "WL - North Shore - Heart of Stone": [
[] []
# "move_rando"
# [MX] # [MX]
], ],
"Spin N' Win - Easy": [ "Spin N' Win - Easy": [
@@ -479,34 +512,44 @@ rules_dict: dict[str,list[list[str]]] = {
[] []
], ],
"WV - Exhaust Pipes": [ "WV - Exhaust Pipes": [
[REL] [WV, REL, SR]
], ],
"WF - Skis": [ "WF - Skis": [
[WF] [WF, SR]
], ],
"WD - Tires": [ "WD - Tires": [
[WD, RS, REL] [WD, RS, REL, SR]
], ],
"WL - Submarine World - Twin-End Tuba": [ "WL - Submarine World - Twin-End Tuba": [
[WL, MM] [WL, MM, SR]
], ],
"WL - South Shore - GPS": [ "WL - South Shore - GPS": [
[WL, REL] [WL, REL, SR]
], ],
"MC - 1st Crate Squashed": [ "MC - 1st Crate Squashed": [
[] []
# "move_rando"
# [PC]
], ],
"MC - 2nd Crate Squashed": [ "MC - 2nd Crate Squashed": [
[] []
# "move_rando"
# [PC]
], ],
"MC - 3rd Crate Squashed": [ "MC - 3rd Crate Squashed": [
[] []
# "move_rando"
# [PC]
], ],
"MC - 4th Crate Squashed": [ "MC - 4th Crate Squashed": [
[] []
# "move_rando"
# [PC]
], ],
"MC - 5th Crate Squashed": [ "MC - 5th Crate Squashed": [
[] []
# "move_rando"
# [PC]
] ]
# "Green Present": [ # "Green Present": [
# [] # []
@@ -516,9 +559,12 @@ rules_dict: dict[str,list[list[str]]] = {
# ], # ],
# "Pink Present": [ # "Pink Present": [
# [REL], # [REL],
# [move_rando]
# [PC] # [PC]
# ], # ],
# "Yellow Present": [ # "Yellow Present": [
# []
# "move_rando"
# [PC] # [PC]
# ] # ]
} }
@@ -537,6 +583,8 @@ access_rules_dict: dict[str,list[list[str]]] = {
], ],
"Clock Tower": [ "Clock Tower": [
[] []
# "move_rando"
# [SN]
], ],
"Who Forest": [ "Who Forest": [
[WF], [WF],
@@ -556,11 +604,18 @@ access_rules_dict: dict[str,list[list[str]]] = {
"Minefield": [ "Minefield": [
[REL, RS], [REL, RS],
[REL, GC] [REL, GC]
# "move_rando"
# [REL, RS, PC],
# [REL, GC, PC]
], ],
"Power Plant": [ "Power Plant": [
[REL, GC], [REL, GC],
[SS, GC], [SS, GC],
[REL, OCD, SS, RS] [REL, OCD, SS, RS]
# "move_rando"
# [REL, GC, PC],
# [SS, GC, PC],
# [REL, OCD, SS, RS, PC]
], ],
"Generator Building": [ "Generator Building": [
[REL, GC], [REL, GC],

View File

@@ -8,7 +8,7 @@ from .Client import *
from typing import ClassVar from typing import ClassVar
from worlds.AutoWorld import World from worlds.AutoWorld import World
import Options from Options import OptionError
from .Options import GrinchOptions from .Options import GrinchOptions
from .Rules import access_rules_dict from .Rules import access_rules_dict
@@ -31,7 +31,7 @@ class GrinchWorld(World):
def generate_early(self) -> None: #Special conditions changed before generation occurs def generate_early(self) -> None: #Special conditions changed before generation occurs
if self.options.ring_link == 1 and self.options.unlimited_eggs == 1: if self.options.ring_link == 1 and self.options.unlimited_eggs == 1:
raise Options.OptionError("Cannot enable both unlimited rotten eggs and ring links. You can only enable one of these at a time."+ raise OptionError("Cannot enable both unlimited rotten eggs and ring links. You can only enable one of these at a time." +
f"The following player's YAML needs to be fixed: {self.player_name}") f"The following player's YAML needs to be fixed: {self.player_name}")

View File

@@ -0,0 +1,8 @@
{
"minimum_ap_version": "0.6.3",
"world_version": "1.3.0",
"authors": ["MarioSpore"],
"version": 7,
"compatible_version": 7,
"game": "The Grinch"
}