94 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			94 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								import sys, random, time, utils.log
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from logic.logic import Logic
							 | 
						||
| 
								 | 
							
								from graph.graph_utils import GraphUtils, getAccessPoint
							 | 
						||
| 
								 | 
							
								from rando.Restrictions import Restrictions
							 | 
						||
| 
								 | 
							
								from rando.RandoServices import RandoServices
							 | 
						||
| 
								 | 
							
								from rando.GraphBuilder import GraphBuilder
							 | 
						||
| 
								 | 
							
								from rando.RandoSetup import RandoSetup
							 | 
						||
| 
								 | 
							
								from rando.Items import ItemManager
							 | 
						||
| 
								 | 
							
								from rando.ItemLocContainer import ItemLocation
							 | 
						||
| 
								 | 
							
								from utils.vcr import VCR
							 | 
						||
| 
								 | 
							
								from utils.doorsmanager import DoorsManager
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# entry point for rando execution ("randomize" method)
							 | 
						||
| 
								 | 
							
								class RandoExec(object):
							 | 
						||
| 
								 | 
							
								    def __init__(self, seedName, vcr, randoSettings, graphSettings, player):
							 | 
						||
| 
								 | 
							
								        self.errorMsg = ""
							 | 
						||
| 
								 | 
							
								        self.seedName = seedName
							 | 
						||
| 
								 | 
							
								        self.vcr = vcr
							 | 
						||
| 
								 | 
							
								        self.randoSettings = randoSettings
							 | 
						||
| 
								 | 
							
								        self.graphSettings = graphSettings
							 | 
						||
| 
								 | 
							
								        self.log = utils.log.get('RandoExec')
							 | 
						||
| 
								 | 
							
								        self.player = player
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # processes settings to :
							 | 
						||
| 
								 | 
							
								    # - create Restrictions and GraphBuilder objects
							 | 
						||
| 
								 | 
							
								    # - create graph and item loc container using a RandoSetup instance: in area rando, if it fails, iterate on possible graph layouts
							 | 
						||
| 
								 | 
							
								    # return container
							 | 
						||
| 
								 | 
							
								    def randomize(self):
							 | 
						||
| 
								 | 
							
								        vcr = VCR(self.seedName, 'rando') if self.vcr == True else None
							 | 
						||
| 
								 | 
							
								        self.errorMsg = ""
							 | 
						||
| 
								 | 
							
								        split = self.randoSettings.restrictions['MajorMinor']
							 | 
						||
| 
								 | 
							
								        graphBuilder = GraphBuilder(self.graphSettings)
							 | 
						||
| 
								 | 
							
								        container = None
							 | 
						||
| 
								 | 
							
								        i = 0
							 | 
						||
| 
								 | 
							
								        attempts = 500 if self.graphSettings.areaRando or self.graphSettings.doorsColorsRando or split == 'Scavenger' else 1
							 | 
						||
| 
								 | 
							
								        now = time.process_time()
							 | 
						||
| 
								 | 
							
								        endDate = sys.maxsize
							 | 
						||
| 
								 | 
							
								        if self.randoSettings.runtimeLimit_s < endDate:
							 | 
						||
| 
								 | 
							
								            endDate = now + self.randoSettings.runtimeLimit_s
							 | 
						||
| 
								 | 
							
								        self.updateLocationsClass(split)
							 | 
						||
| 
								 | 
							
								        while container is None and i < attempts and now <= endDate:
							 | 
						||
| 
								 | 
							
								            self.restrictions = Restrictions(self.randoSettings)
							 | 
						||
| 
								 | 
							
								            if self.graphSettings.doorsColorsRando == True:
							 | 
						||
| 
								 | 
							
								                DoorsManager.randomize(self.graphSettings.allowGreyDoors, self.player)
							 | 
						||
| 
								 | 
							
								            self.areaGraph = graphBuilder.createGraph()
							 | 
						||
| 
								 | 
							
								            services = RandoServices(self.areaGraph, self.restrictions)
							 | 
						||
| 
								 | 
							
								            setup = RandoSetup(self.graphSettings, Logic.locations, services, self.player)
							 | 
						||
| 
								 | 
							
								            self.setup = setup
							 | 
						||
| 
								 | 
							
								            container = setup.createItemLocContainer(endDate, vcr)
							 | 
						||
| 
								 | 
							
								            if container is None:
							 | 
						||
| 
								 | 
							
								                sys.stdout.write('*')
							 | 
						||
| 
								 | 
							
								                sys.stdout.flush()
							 | 
						||
| 
								 | 
							
								                i += 1
							 | 
						||
| 
								 | 
							
								            else:
							 | 
						||
| 
								 | 
							
								                self.errorMsg += '\n'.join(setup.errorMsgs)
							 | 
						||
| 
								 | 
							
								            now = time.process_time()
							 | 
						||
| 
								 | 
							
								        if container is None:
							 | 
						||
| 
								 | 
							
								            if self.graphSettings.areaRando:
							 | 
						||
| 
								 | 
							
								                self.errorMsg += "Could not find an area layout with these settings"
							 | 
						||
| 
								 | 
							
								            else:
							 | 
						||
| 
								 | 
							
								                self.errorMsg += "Unable to process settings"
							 | 
						||
| 
								 | 
							
								        self.areaGraph.printGraph()
							 | 
						||
| 
								 | 
							
								        return container
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def updateLocationsClass(self, split):
							 | 
						||
| 
								 | 
							
								        if split != 'Full' and split != 'Scavenger':
							 | 
						||
| 
								 | 
							
								            startAP = getAccessPoint(self.graphSettings.startAP)
							 | 
						||
| 
								 | 
							
								            possibleMajLocs, preserveMajLocs, nMaj, nChozo = Logic.LocationsHelper.getStartMajors(startAP.Name)
							 | 
						||
| 
								 | 
							
								            if split == 'Major':
							 | 
						||
| 
								 | 
							
								                n = nMaj
							 | 
						||
| 
								 | 
							
								            elif split == 'Chozo':
							 | 
						||
| 
								 | 
							
								                n = nChozo
							 | 
						||
| 
								 | 
							
								            GraphUtils.updateLocClassesStart(startAP.GraphArea, split, possibleMajLocs, preserveMajLocs, n)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def postProcessItemLocs(self, itemLocs, hide):
							 | 
						||
| 
								 | 
							
								        # hide some items like in dessy's
							 | 
						||
| 
								 | 
							
								        if hide == True:
							 | 
						||
| 
								 | 
							
								            for itemLoc in itemLocs:
							 | 
						||
| 
								 | 
							
								                item = itemLoc.Item
							 | 
						||
| 
								 | 
							
								                loc = itemLoc.Location
							 | 
						||
| 
								 | 
							
								                if (item.Category != "Nothing"
							 | 
						||
| 
								 | 
							
								                    and loc.CanHidden == True
							 | 
						||
| 
								 | 
							
								                    and loc.Visibility == 'Visible'):
							 | 
						||
| 
								 | 
							
								                    if bool(random.getrandbits(1)) == True:
							 | 
						||
| 
								 | 
							
								                        loc.Visibility = 'Hidden'
							 | 
						||
| 
								 | 
							
								        # put nothing in unfilled locations
							 | 
						||
| 
								 | 
							
								        filledLocNames = [il.Location.Name for il in itemLocs]
							 | 
						||
| 
								 | 
							
								        unfilledLocs = [loc for loc in Logic.locations if loc.Name not in filledLocNames]
							 | 
						||
| 
								 | 
							
								        nothing = ItemManager.getItem('Nothing')
							 | 
						||
| 
								 | 
							
								        for loc in unfilledLocs:
							 | 
						||
| 
								 | 
							
								            loc.restricted = True
							 | 
						||
| 
								 | 
							
								            itemLocs.append(ItemLocation(nothing, loc, False))
							 |