80 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from BaseClasses import Region, Item, ItemClassification
 | |
| from .Locations import grinch_locations_to_id, grinch_locations, GrinchLocation
 | |
| from .Items import grinch_items_to_id, GrinchItem, ALL_ITEMS_TABLE, MISC_ITEMS_TABLE
 | |
| from .Regions import connect_regions
 | |
| from .Rules import set_location_rules
 | |
| 
 | |
| from .Client import *
 | |
| from typing import ClassVar
 | |
| 
 | |
| from worlds.AutoWorld import World
 | |
| 
 | |
| from . import Options
 | |
| from .Rules import access_rules_dict
 | |
| 
 | |
| 
 | |
| class GrinchWorld(World):
 | |
|     game: ClassVar[str] = "The Grinch"
 | |
|     options_dataclass = Options.GrinchOptions
 | |
|     options: Options.GrinchOptions
 | |
|     topology_present = True #not an open world game, very linear
 | |
|     item_name_to_id: ClassVar[dict[str,int]] = grinch_items_to_id()
 | |
|     location_name_to_id: ClassVar[dict[str,int]] = grinch_locations_to_id()
 | |
|     required_client_version = (0, 6, 3)
 | |
| 
 | |
| 
 | |
|     def __init__(self, *args, **kwargs): #Pulls __init__ function and takes control from there in BaseClasses.py
 | |
|         self.origin_region_name: str = "Mount Crumpit"
 | |
|         super(GrinchWorld, self).__init__(*args, **kwargs)
 | |
| 
 | |
|     def generate_early(self) -> None: #Special conditions changed before generation occurs
 | |
|         pass
 | |
| 
 | |
|     def create_regions(self): #Generates all regions for the multiworld
 | |
|         for region_name in access_rules_dict.keys():
 | |
|             self.multiworld.regions.append(Region(region_name, self.player, self.multiworld))
 | |
|         self.multiworld.regions.append(Region("Mount Crumpit", self.player, self.multiworld))
 | |
|         for location, data in grinch_locations.items():
 | |
|             region = self.get_region(data.region)
 | |
|             entry = GrinchLocation(self.player, location, region, data)
 | |
|             if location == "Neutralizing Santa":
 | |
|                 entry.place_locked_item(Item("Goal", ItemClassification.progression, None, self.player))
 | |
|             region.locations.append(entry)
 | |
|         connect_regions(self)
 | |
| 
 | |
|     def create_item(self, item: str) -> GrinchItem: #Creates specific items on demand
 | |
|         if item in ALL_ITEMS_TABLE.keys():
 | |
|             return GrinchItem(item, self.player, ALL_ITEMS_TABLE[item])
 | |
|         raise Exception(f"Invalid item name: {item}")
 | |
| 
 | |
|     def create_items(self): #Generates all items for the multiworld
 | |
|         self_itempool: list[GrinchItem] = []
 | |
|         for item, data in ALL_ITEMS_TABLE.items():
 | |
|             self_itempool.append(self.create_item(item))
 | |
|             if item == "Heart of Stone":
 | |
|                 for _ in range(3):
 | |
|                     self_itempool.append(self.create_item(item))
 | |
| 
 | |
|         #Get number of current unfilled locations
 | |
|         unfilled_locations: int = len(self.multiworld.get_unfilled_locations(self.player)) - len(ALL_ITEMS_TABLE.keys()) - 3
 | |
| 
 | |
|         for _ in range(unfilled_locations):
 | |
|             self_itempool.append(self.create_item((self.get_other_filler_item(list(MISC_ITEMS_TABLE.keys())))))
 | |
|         self.multiworld.itempool += self_itempool
 | |
| 
 | |
|     def set_rules(self):
 | |
|         self.multiworld.completion_condition[self.player] = lambda state: state.has("Goal", self.player)
 | |
|         set_location_rules(self)
 | |
| 
 | |
|     def get_other_filler_item(self, other_filler: list[str]) -> str:
 | |
|         return self.random.choices(other_filler)[0]
 | |
| 
 | |
|     def fill_slot_data(self):
 | |
|         return {
 | |
|             "give_unlimited_eggs": self.options.unlimited_eggs.value,
 | |
| 
 | |
|         }
 | |
| 
 | |
|     def generate_output(self, output_directory: str) -> None:
 | |
|         # print("")
 | |
|         pass | 
