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)) |