add a HK game completion rule
This commit is contained in:
		
							parent
							
								
									fe17fc6320
								
							
						
					
					
						commit
						a248fd5f94
					
				| 
						 | 
					@ -133,6 +133,7 @@ class MultiWorld():
 | 
				
			||||||
            set_player_attr('plando_texts', {})
 | 
					            set_player_attr('plando_texts', {})
 | 
				
			||||||
            set_player_attr('plando_connections', [])
 | 
					            set_player_attr('plando_connections', [])
 | 
				
			||||||
            set_player_attr('game', "A Link to the Past")
 | 
					            set_player_attr('game', "A Link to the Past")
 | 
				
			||||||
 | 
					            set_player_attr('completion_condition', lambda state: True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        self.worlds = []
 | 
					        self.worlds = []
 | 
				
			||||||
        #for i in range(players):
 | 
					        #for i in range(players):
 | 
				
			||||||
| 
						 | 
					@ -374,7 +375,7 @@ class MultiWorld():
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def has_beaten_game(self, state, player: Optional[int] = None):
 | 
					    def has_beaten_game(self, state, player: Optional[int] = None):
 | 
				
			||||||
        if player:
 | 
					        if player:
 | 
				
			||||||
            return state.has('Triforce', player) or state.world.logic[player] == 'nologic'
 | 
					            return self.completion_condition[player](state)
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            return all((self.has_beaten_game(state, p) for p in range(1, self.players + 1)))
 | 
					            return all((self.has_beaten_game(state, p) for p in range(1, self.players + 1)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										8
									
								
								Main.py
								
								
								
								
							
							
						
						
									
										8
									
								
								Main.py
								
								
								
								
							| 
						 | 
					@ -1,4 +1,3 @@
 | 
				
			||||||
from collections import OrderedDict
 | 
					 | 
				
			||||||
import copy
 | 
					import copy
 | 
				
			||||||
from itertools import zip_longest
 | 
					from itertools import zip_longest
 | 
				
			||||||
import logging
 | 
					import logging
 | 
				
			||||||
| 
						 | 
					@ -23,7 +22,7 @@ from Fill import distribute_items_restrictive, flood_items, balance_multiworld_p
 | 
				
			||||||
from worlds.alttp.Shops import create_shops, ShopSlotFill, SHOP_ID_START, total_shop_slots, FillDisabledShopSlots
 | 
					from worlds.alttp.Shops import create_shops, ShopSlotFill, SHOP_ID_START, total_shop_slots, FillDisabledShopSlots
 | 
				
			||||||
from worlds.alttp.ItemPool import generate_itempool, difficulties, fill_prizes
 | 
					from worlds.alttp.ItemPool import generate_itempool, difficulties, fill_prizes
 | 
				
			||||||
from Utils import output_path, parse_player_names, get_options, __version__, _version_tuple
 | 
					from Utils import output_path, parse_player_names, get_options, __version__, _version_tuple
 | 
				
			||||||
from worlds.hk import *
 | 
					from worlds.hk import gen_hollow, gen_regions, set_rules as set_hk_rules
 | 
				
			||||||
import Patch
 | 
					import Patch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
seeddigits = 20
 | 
					seeddigits = 20
 | 
				
			||||||
| 
						 | 
					@ -466,7 +465,7 @@ def main(args, seed=None):
 | 
				
			||||||
        multidata_task = pool.submit(write_multidata, rom_futures)
 | 
					        multidata_task = pool.submit(write_multidata, rom_futures)
 | 
				
			||||||
    if not check_accessibility_task.result():
 | 
					    if not check_accessibility_task.result():
 | 
				
			||||||
        if not world.can_beat_game():
 | 
					        if not world.can_beat_game():
 | 
				
			||||||
            raise Exception("Game appears is unbeatable. Aborting.")
 | 
					            raise Exception("Game appears as unbeatable. Aborting.")
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            logger.warning("Location Accessibility requirements not fulfilled.")
 | 
					            logger.warning("Location Accessibility requirements not fulfilled.")
 | 
				
			||||||
    if not args.skip_playthrough:
 | 
					    if not args.skip_playthrough:
 | 
				
			||||||
| 
						 | 
					@ -585,6 +584,9 @@ def copy_world(world):
 | 
				
			||||||
    for player in world.alttp_player_ids:
 | 
					    for player in world.alttp_player_ids:
 | 
				
			||||||
        set_rules(ret, player)
 | 
					        set_rules(ret, player)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for player in world.hk_player_ids:
 | 
				
			||||||
 | 
					        set_hk_rules(ret, player)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return ret
 | 
					    return ret
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,6 +13,7 @@ def set_rules(world, player):
 | 
				
			||||||
    if world.logic[player] == 'nologic':
 | 
					    if world.logic[player] == 'nologic':
 | 
				
			||||||
        logging.info(
 | 
					        logging.info(
 | 
				
			||||||
            'WARNING! Seeds generated under this logic often require major glitches and may be impossible!')
 | 
					            'WARNING! Seeds generated under this logic often require major glitches and may be impossible!')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if world.players == 1:
 | 
					        if world.players == 1:
 | 
				
			||||||
            world.get_region('Menu', player).can_reach_private = lambda state: True
 | 
					            world.get_region('Menu', player).can_reach_private = lambda state: True
 | 
				
			||||||
            no_logic_rules(world, player)
 | 
					            no_logic_rules(world, player)
 | 
				
			||||||
| 
						 | 
					@ -25,6 +26,9 @@ def set_rules(world, player):
 | 
				
			||||||
            world.accessibility[player] = 'none'
 | 
					            world.accessibility[player] = 'none'
 | 
				
			||||||
            world.progression_balancing[player] = False
 | 
					            world.progression_balancing[player] = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    else:
 | 
				
			||||||
 | 
					        world.completion_condition[player] = lambda state: state.has('Triforce', player)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    global_rules(world, player)
 | 
					    global_rules(world, player)
 | 
				
			||||||
    dungeon_boss_rules(world, player)
 | 
					    dungeon_boss_rules(world, player)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,6 +15,8 @@ class HKLocation(Location):
 | 
				
			||||||
        super(HKLocation, self).__init__(player, name, address, parent)
 | 
					        super(HKLocation, self).__init__(player, name, address, parent)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class HKItem(Item):
 | 
					class HKItem(Item):
 | 
				
			||||||
 | 
					    game = "Hollow Knight"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def __init__(self, name, advancement, code, player: int = None):
 | 
					    def __init__(self, name, advancement, code, player: int = None):
 | 
				
			||||||
        super(HKItem, self).__init__(name, advancement, code, player)
 | 
					        super(HKItem, self).__init__(name, advancement, code, player)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -23,9 +25,15 @@ def gen_hollow(world: MultiWorld, player: int):
 | 
				
			||||||
    gen_regions(world, player)
 | 
					    gen_regions(world, player)
 | 
				
			||||||
    link_regions(world, player)
 | 
					    link_regions(world, player)
 | 
				
			||||||
    gen_items(world, player)
 | 
					    gen_items(world, player)
 | 
				
			||||||
 | 
					    set_rules(world, player)
 | 
				
			||||||
    world.clear_location_cache()
 | 
					    world.clear_location_cache()
 | 
				
			||||||
    world.clear_entrance_cache()
 | 
					    world.clear_entrance_cache()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					def set_rules(world: MultiWorld, player: int):
 | 
				
			||||||
 | 
					    if world.logic[player] != 'nologic':
 | 
				
			||||||
 | 
					        world.completion_condition[player] = lambda state: state.has('Lurien', player) and \
 | 
				
			||||||
 | 
					                                                           state.has('Monomon', player) and \
 | 
				
			||||||
 | 
					                                                           state.has('Herrah', player)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def gen_regions(world: MultiWorld, player: int):
 | 
					def gen_regions(world: MultiWorld, player: int):
 | 
				
			||||||
    world.regions += [
 | 
					    world.regions += [
 | 
				
			||||||
| 
						 | 
					@ -43,7 +51,6 @@ def gen_items(world: MultiWorld, player: int):
 | 
				
			||||||
    for item_id, item_data in items.items():
 | 
					    for item_id, item_data in items.items():
 | 
				
			||||||
        name = item_data["name"]
 | 
					        name = item_data["name"]
 | 
				
			||||||
        item = HKItem(name, item_data["advancement"], item_id, player=player)
 | 
					        item = HKItem(name, item_data["advancement"], item_id, player=player)
 | 
				
			||||||
        item.game = "Hollow Knight"
 | 
					 | 
				
			||||||
        pool.append(item)
 | 
					        pool.append(item)
 | 
				
			||||||
    world.itempool += pool
 | 
					    world.itempool += pool
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue