59 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			59 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								from ..roomEditor import RoomEditor, ObjectWarp
							 | 
						||
| 
								 | 
							
								from ..worldSetup import ENTRANCE_INFO
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def changeEntrances(rom, mapping):
							 | 
						||
| 
								 | 
							
								    warp_to_indoor = {}
							 | 
						||
| 
								 | 
							
								    warp_to_outdoor = {}
							 | 
						||
| 
								 | 
							
								    for key in mapping.keys():
							 | 
						||
| 
								 | 
							
								        info = ENTRANCE_INFO[key]
							 | 
						||
| 
								 | 
							
								        re = RoomEditor(rom, info.alt_room if info.alt_room is not None else info.room)
							 | 
						||
| 
								 | 
							
								        warp = re.getWarps()[info.index if info.index not in (None, "all") else 0]
							 | 
						||
| 
								 | 
							
								        warp_to_indoor[key] = warp
							 | 
						||
| 
								 | 
							
								        assert info.target == warp.room, "%s != %03x" % (key, warp.room)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        re = RoomEditor(rom, warp.room)
							 | 
						||
| 
								 | 
							
								        for warp in re.getWarps():
							 | 
						||
| 
								 | 
							
								            if warp.room == info.room:
							 | 
						||
| 
								 | 
							
								                warp_to_outdoor[key] = warp
							 | 
						||
| 
								 | 
							
								        assert key in warp_to_outdoor, "Missing warp to outdoor on %s" % (key)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # First collect all the changes we need to do per room
							 | 
						||
| 
								 | 
							
								    changes_per_room = {}
							 | 
						||
| 
								 | 
							
								    def addChange(source_room, target_room, new_warp):
							 | 
						||
| 
								 | 
							
								        if source_room not in changes_per_room:
							 | 
						||
| 
								 | 
							
								            changes_per_room[source_room] = {}
							 | 
						||
| 
								 | 
							
								        changes_per_room[source_room][target_room] = new_warp
							 | 
						||
| 
								 | 
							
								    for key, target in mapping.items():
							 | 
						||
| 
								 | 
							
								        if key == target:
							 | 
						||
| 
								 | 
							
								            continue
							 | 
						||
| 
								 | 
							
								        info = ENTRANCE_INFO[key]
							 | 
						||
| 
								 | 
							
								        # Change the entrance to point to the new indoor room
							 | 
						||
| 
								 | 
							
								        addChange(info.room, warp_to_indoor[key].room, warp_to_indoor[target])
							 | 
						||
| 
								 | 
							
								        if info.alt_room:
							 | 
						||
| 
								 | 
							
								            addChange(info.alt_room, warp_to_indoor[key].room, warp_to_indoor[target])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # Change the exit to point to the right outside
							 | 
						||
| 
								 | 
							
								        addChange(warp_to_indoor[target].room, ENTRANCE_INFO[target].room, warp_to_outdoor[key])
							 | 
						||
| 
								 | 
							
								        if ENTRANCE_INFO[target].instrument_room is not None:
							 | 
						||
| 
								 | 
							
								            addChange(ENTRANCE_INFO[target].instrument_room, ENTRANCE_INFO[target].room, warp_to_outdoor[key])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    # Finally apply the changes, we need to do this once per room to prevent A->B->C issues.
							 | 
						||
| 
								 | 
							
								    for room, changes in changes_per_room.items():
							 | 
						||
| 
								 | 
							
								        re = RoomEditor(rom, room)
							 | 
						||
| 
								 | 
							
								        for idx, obj in enumerate(re.objects):
							 | 
						||
| 
								 | 
							
								            if isinstance(obj, ObjectWarp) and obj.room in changes:
							 | 
						||
| 
								 | 
							
								                re.objects[idx] = changes[obj.room].copy()
							 | 
						||
| 
								 | 
							
								        re.store(rom)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def readEntrances(rom):
							 | 
						||
| 
								 | 
							
								    result = {}
							 | 
						||
| 
								 | 
							
								    for key, info in ENTRANCE_INFO.items():
							 | 
						||
| 
								 | 
							
								        re = RoomEditor(rom, info.alt_room if info.alt_room is not None else info.room)
							 | 
						||
| 
								 | 
							
								        warp = re.getWarps()[info.index if info.index not in (None, "all") else 0]
							 | 
						||
| 
								 | 
							
								        for other_key, other_info in ENTRANCE_INFO.items():
							 | 
						||
| 
								 | 
							
								            if warp.room == other_info.target:
							 | 
						||
| 
								 | 
							
								                result[key] = other_key
							 | 
						||
| 
								 | 
							
								    return result
							 |