74 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			74 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | from .base import LocationBase | ||
|  | from ..tileset import solid_tiles, open_tiles, walkable_tiles | ||
|  | from ...roomEditor import RoomEditor | ||
|  | from ...locations.all import HeartPiece, Chest as ChestLocation | ||
|  | import random | ||
|  | 
 | ||
|  | 
 | ||
|  | class Chest(LocationBase): | ||
|  |     def __init__(self, room, x, y): | ||
|  |         super().__init__(room, x, y) | ||
|  |         room.tiles[x + y * 10] = 0xA0 | ||
|  | 
 | ||
|  |     def connect_logic(self, logic_location): | ||
|  |         logic_location.add(ChestLocation(self.room.x + self.room.y * 16)) | ||
|  | 
 | ||
|  |     def get_item_pool(self): | ||
|  |         return {None: 1} | ||
|  | 
 | ||
|  |     @staticmethod | ||
|  |     def check_possible(room, reachable_map): | ||
|  |         # Check if we can potentially place a chest here, and what the best spot would be. | ||
|  |         options = [] | ||
|  |         for y in range(1, 6): | ||
|  |             for x in range(1, 9): | ||
|  |                 if room.tiles[x + y * 10 - 10] not in solid_tiles: # Chest needs to be against a "wall" at the top | ||
|  |                     continue | ||
|  |                 if room.tiles[x + y * 10] not in walkable_tiles or room.tiles[x + y * 10 + 10] not in walkable_tiles: | ||
|  |                     continue | ||
|  |                 if room.tiles[x - 1 + y * 10] not in solid_tiles and room.tiles[x - 1 + y * 10 + 10] not in open_tiles: | ||
|  |                     continue | ||
|  |                 if room.tiles[x + 1 + y * 10] not in solid_tiles and room.tiles[x + 1 + y * 10 + 10] not in open_tiles: | ||
|  |                     continue | ||
|  |                 idx = room.x * 10 + x + (room.y * 8 + y) * reachable_map.w | ||
|  |                 if reachable_map.area[idx] == -1: | ||
|  |                     continue | ||
|  |                 options.append((reachable_map.distance[idx], x, y)) | ||
|  |         if not options: | ||
|  |             return None | ||
|  |         options.sort(reverse=True) | ||
|  |         options = [(x, y) for d, x, y in options if d > options[0][0] - 4] | ||
|  |         return random.choice(options) | ||
|  | 
 | ||
|  | 
 | ||
|  | class FloorItem(LocationBase): | ||
|  |     def __init__(self, room, x, y): | ||
|  |         super().__init__(room, x, y) | ||
|  | 
 | ||
|  |     def update_room(self, rom, re: RoomEditor): | ||
|  |         re.entities.append((self.x, self.y, 0x35)) | ||
|  | 
 | ||
|  |     def connect_logic(self, logic_location): | ||
|  |         logic_location.add(HeartPiece(self.room.x + self.room.y * 16)) | ||
|  | 
 | ||
|  |     def get_item_pool(self): | ||
|  |         return {None: 1} | ||
|  | 
 | ||
|  |     @staticmethod | ||
|  |     def check_possible(room, reachable_map): | ||
|  |         # Check if we can potentially place a floor item here, and what the best spot would be. | ||
|  |         options = [] | ||
|  |         for y in range(1, 7): | ||
|  |             for x in range(1, 9): | ||
|  |                 if room.tiles[x + y * 10] not in walkable_tiles: | ||
|  |                     continue | ||
|  |                 idx = room.x * 10 + x + (room.y * 8 + y) * reachable_map.w | ||
|  |                 if reachable_map.area[idx] == -1: | ||
|  |                     continue | ||
|  |                 options.append((reachable_map.distance[idx], x, y)) | ||
|  |         if not options: | ||
|  |             return None | ||
|  |         options.sort(reverse=True) | ||
|  |         options = [(x, y) for d, x, y in options if d > options[0][0] - 4] | ||
|  |         return random.choice(options) |