From 24d265aafb9d1c3c273be9cc9702904638ef80df Mon Sep 17 00:00:00 2001 From: irdkwia Date: Tue, 24 Nov 2020 01:25:11 +0100 Subject: [PATCH 1/2] Fix world map component. --- .../module/lists/controller/world_map.py | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/skytemple/module/lists/controller/world_map.py b/skytemple/module/lists/controller/world_map.py index 43326f32f..860868b37 100644 --- a/skytemple/module/lists/controller/world_map.py +++ b/skytemple/module/lists/controller/world_map.py @@ -47,7 +47,7 @@ def __init__(self, module: 'ListsModule', *args): self.builder = None self.drawer: Optional[WorldMapDrawer] = None self.dialog_drawer: Optional[WorldMapDrawer] = None - self._dungeon_names: Dict[int, str] = {} + self._location_names: Dict[int, str] = {} self._markers: Optional[List[MapMarkerPlacement]] = [] self._config: Optional[Pmd2Data] = None self._tree_iters_by_idx = {} @@ -61,9 +61,15 @@ def get_view(self) -> Gtk.Widget: self._markers = self.module.get_world_map_markers() self._config = self.module.project.get_rom_module().get_static_data() - for idx in range(0, 192): - name = self.module.project.get_string_provider().get_value(StringType.DUNGEON_NAMES_MAIN, idx) - self._dungeon_names[idx+1] = name + # Build the location names list + self._location_names[0] = self.module.project.get_string_provider().get_value(StringType.GROUND_MAP_NAMES, 0) + for idx in range(0, 180): + name = self.module.project.get_string_provider().get_value(StringType.DUNGEON_NAMES_SELECTION, idx) + self._location_names[idx+1] = name + + for idx in range(0, len(self._markers)-181): + name = self.module.project.get_string_provider().get_value(StringType.GROUND_MAP_NAMES, idx+1) + self._location_names[idx+181] = name self._init_list() self._init_drawer() @@ -103,6 +109,7 @@ def on_tree_selection_changed(self, selection: Gtk.TreeSelection, *args): self.drawer.set_selected(self._markers[int(idx)]) map_name = model[treeiter][1] if map_name != '': + #TODO: Use the list from the game when available ll_by_name = self._config.script_data.level_list__by_name if self._mapbg_id != ll_by_name[map_name].id: self._mapbg_id = ll_by_name[map_name].id @@ -138,10 +145,10 @@ def _init_drawer(self): self.dialog_drawer.start() def _change_map_bg(self, map_id: int, draw, drawer): - bma = self.map_bg_module.get_bma(map_id) - bpl = self.map_bg_module.get_bpl(map_id) - bpc = self.map_bg_module.get_bpc(map_id) - bpas = self.map_bg_module.get_bpas(map_id) + bma = self.map_bg_module.get_bma(self._get_map_id(map_id)) + bpl = self.map_bg_module.get_bpl(self._get_map_id(map_id)) + bpc = self.map_bg_module.get_bpc(self._get_map_id(map_id)) + bpas = self.map_bg_module.get_bpas(self._get_map_id(map_id)) surface = pil_to_cairo_surface( bma.to_pil(bpc, bpl, bpas, False, False, single_frame=True)[0].convert('RGBA') ) @@ -158,10 +165,15 @@ def _change_map_bg(self, map_id: int, draw, drawer): drawer.map_bg = surface draw.queue_draw() + ## TODO: The 2 following methods should use the actual level list from the game when it will be implemented def _get_map_name(self, entry: MapMarkerPlacement): if entry.map_id < 0: return '' return self._config.script_data.level_list__by_id[entry.map_id].name + def _get_map_id(self, map_id: int): + if map_id < 0: + return '' + return int(self._config.script_data.level_list__by_id[map_id].mapid) def _get_position(self, entry: MapMarkerPlacement): if entry.map_id < 0: @@ -171,10 +183,8 @@ def _get_position(self, entry: MapMarkerPlacement): return f'({entry.x}, {entry.y})' def _get_dungeon_name(self, idx): - if idx == 0: - return '(Treasure Town?)' - if idx in self._dungeon_names: - return self._dungeon_names[idx] + if idx in self._location_names: + return self._location_names[idx] return '' # -- Dialog -- # @@ -211,7 +221,7 @@ def _edit(self): else: map_store.clear() selected_map_iter = map_store.append([-1, ""]) - for level in self._config.script_data.level_list: + for level in self._config.script_data.level_list: #TODO: Use the list from the game when available iiter = map_store.append([level.id, level.name]) if level.id == self._markers[idx].map_id: selected_map_iter = iiter From cf91a378ada984038f96b88dcf1525d4fe04a764 Mon Sep 17 00:00:00 2001 From: irdkwia Date: Tue, 24 Nov 2020 01:53:22 +0100 Subject: [PATCH 2/2] Replacing all occurences of map_id by level_id for the world map --- .../module/lists/controller/world_map.py | 52 +++++++++---------- skytemple/module/lists/world_map_drawer.py | 10 ++-- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/skytemple/module/lists/controller/world_map.py b/skytemple/module/lists/controller/world_map.py index 860868b37..b722bd058 100644 --- a/skytemple/module/lists/controller/world_map.py +++ b/skytemple/module/lists/controller/world_map.py @@ -51,7 +51,7 @@ def __init__(self, module: 'ListsModule', *args): self._markers: Optional[List[MapMarkerPlacement]] = [] self._config: Optional[Pmd2Data] = None self._tree_iters_by_idx = {} - self._mapbg_id = None + self._level_id = None self._edited_marker = None self._edited_pos = None @@ -73,7 +73,7 @@ def get_view(self) -> Gtk.Widget: self._init_list() self._init_drawer() - self._mapbg_id = WORLD_MAP_DEFAULT_ID + self._level_id = WORLD_MAP_DEFAULT_ID self._change_map_bg(WORLD_MAP_DEFAULT_ID, self.builder.get_object('draw'), self.drawer) self.builder.connect_signals(self) return lst @@ -111,8 +111,8 @@ def on_tree_selection_changed(self, selection: Gtk.TreeSelection, *args): if map_name != '': #TODO: Use the list from the game when available ll_by_name = self._config.script_data.level_list__by_name - if self._mapbg_id != ll_by_name[map_name].id: - self._mapbg_id = ll_by_name[map_name].id + if self._level_id != ll_by_name[map_name].id: + self._level_id = ll_by_name[map_name].id self._change_map_bg(ll_by_name[map_name].id, self.builder.get_object('draw'), self.drawer) def on_draw_event_button_press_event(self, box, button: Gdk.EventButton): @@ -132,7 +132,7 @@ def on_draw_event_button_press_event(self, box, button: Gdk.EventButton): def on_edit_map_bg_clicked(self, *args): self.module.project.request_open(OpenRequest( - REQUEST_TYPE_MAP_BG, self._mapbg_id + REQUEST_TYPE_MAP_BG, self._level_id )) def _init_drawer(self): @@ -144,16 +144,16 @@ def _init_drawer(self): self.dialog_drawer = WorldMapDrawer(draw, self._markers, self._get_dungeon_name, SCALE) self.dialog_drawer.start() - def _change_map_bg(self, map_id: int, draw, drawer): - bma = self.map_bg_module.get_bma(self._get_map_id(map_id)) - bpl = self.map_bg_module.get_bpl(self._get_map_id(map_id)) - bpc = self.map_bg_module.get_bpc(self._get_map_id(map_id)) - bpas = self.map_bg_module.get_bpas(self._get_map_id(map_id)) + def _change_map_bg(self, level_id: int, draw, drawer): + bma = self.map_bg_module.get_bma(self._get_map_id(level_id)) + bpl = self.map_bg_module.get_bpl(self._get_map_id(level_id)) + bpc = self.map_bg_module.get_bpc(self._get_map_id(level_id)) + bpas = self.map_bg_module.get_bpas(self._get_map_id(level_id)) surface = pil_to_cairo_surface( bma.to_pil(bpc, bpl, bpas, False, False, single_frame=True)[0].convert('RGBA') ) if drawer: - if map_id == WORLD_MAP_DEFAULT_ID: + if level_id == WORLD_MAP_DEFAULT_ID: draw.set_size_request(504 * SCALE, 336 * SCALE) else: bma_width = bma.map_width_camera * BPC_TILE_DIM @@ -161,22 +161,22 @@ def _change_map_bg(self, map_id: int, draw, drawer): draw.set_size_request( bma_width * SCALE, bma_height * SCALE ) - drawer.map_bg_id = map_id + drawer.level_id = level_id drawer.map_bg = surface draw.queue_draw() ## TODO: The 2 following methods should use the actual level list from the game when it will be implemented def _get_map_name(self, entry: MapMarkerPlacement): - if entry.map_id < 0: + if entry.level_id < 0: return '' - return self._config.script_data.level_list__by_id[entry.map_id].name - def _get_map_id(self, map_id: int): - if map_id < 0: + return self._config.script_data.level_list__by_id[entry.level_id].name + def _get_map_id(self, level_id: int): + if level_id < 0: return '' - return int(self._config.script_data.level_list__by_id[map_id].mapid) + return int(self._config.script_data.level_list__by_id[level_id].mapid) def _get_position(self, entry: MapMarkerPlacement): - if entry.map_id < 0: + if entry.level_id < 0: return '' if entry.reference_id > -1: return f'' @@ -223,7 +223,7 @@ def _edit(self): selected_map_iter = map_store.append([-1, ""]) for level in self._config.script_data.level_list: #TODO: Use the list from the game when available iiter = map_store.append([level.id, level.name]) - if level.id == self._markers[idx].map_id: + if level.id == self._markers[idx].level_id: selected_map_iter = iiter cb_map.set_active_iter(selected_map_iter) @@ -260,7 +260,7 @@ def _edit(self): self.builder.get_object('radio_pos').set_active(True) # Drawer - self._change_map_bg(self._markers[idx].map_id, self.builder.get_object('diag_draw'), self.dialog_drawer) + self._change_map_bg(self._markers[idx].level_id, self.builder.get_object('diag_draw'), self.dialog_drawer) self._edited_marker = self._markers[idx] self._edited_pos = (self._edited_marker.x, self._edited_marker.y) @@ -296,17 +296,17 @@ def _edit(self): ) return if map_id_selected == -1: - marker.map_id = -1 + marker.level_id = -1 marker.reference_id = -1 marker.x = -1 marker.y = -1 elif use_reference: - marker.map_id = map_id_selected + marker.level_id = map_id_selected marker.reference_id = reference_id_selected marker.x = 0 marker.y = 0 else: - marker.map_id = map_id_selected + marker.level_id = map_id_selected marker.reference_id = -1 marker.x = int(self._edited_pos[0]) marker.y = int(self._edited_pos[1]) @@ -316,9 +316,9 @@ def _edit(self): str(idx), self._get_map_name(marker), self._get_position(marker), self._get_dungeon_name(idx) ] - if marker.map_id != self._mapbg_id: - self._mapbg_id = marker.map_id - self._change_map_bg(marker.map_id, self.builder.get_object('draw'), self.drawer) + if marker.level_id != self._level_id: + self._level_id = marker.level_id + self._change_map_bg(marker.level_id, self.builder.get_object('draw'), self.drawer) else: self.drawer.draw_area.queue_draw() diff --git a/skytemple/module/lists/world_map_drawer.py b/skytemple/module/lists/world_map_drawer.py index 17d8caa17..7d3d121a0 100644 --- a/skytemple/module/lists/world_map_drawer.py +++ b/skytemple/module/lists/world_map_drawer.py @@ -43,7 +43,7 @@ def __init__( self.markers: List[MapMarkerPlacement] = markers self.markers_at_pos: Dict[Tuple[int, int], List[MapMarkerPlacement]] = {} self.map_bg = None - self.map_bg_id = None + self.level_id = None self.draw_tile_grid = True @@ -77,7 +77,7 @@ def draw(self, wdg, ctx: cairo.Context): ctx.scale(self.scale, self.scale) # Background if self.map_bg is not None: - if self.map_bg_id == WORLD_MAP_DEFAULT_ID: + if self.level_id == WORLD_MAP_DEFAULT_ID: # We display the bottom right of the map. ctx.set_source_surface(self.map_bg, -504, -1008) else: @@ -99,7 +99,7 @@ def draw(self, wdg, ctx: cairo.Context): # RENDER MARKERS self.markers_at_pos = {} for i, marker in enumerate(self.markers): - if marker != self._editing and marker != self._hide and marker.map_id == self.map_bg_id and marker.reference_id <= -1: + if marker != self._editing and marker != self._hide and marker.level_id == self.level_id and marker.reference_id <= -1: self._draw_marker(ctx, marker) if self._editing: @@ -121,7 +121,7 @@ def get_under_mouse(self) -> Optional[MapMarkerPlacement]: Returns the first marker under the mouse position, if any. """ for i, marker in enumerate(self.markers): - if marker.map_id == self.map_bg_id and marker.reference_id <= -1: + if marker.level_id == self.level_id and marker.reference_id <= -1: bb = (marker.x - RAD * 2, marker.y - RAD * 2, RAD * 4, RAD * 4) if self._is_in_bb(*bb, self.mouse_x, self.mouse_y): return marker @@ -169,7 +169,7 @@ def _get_marker_xy(self, marker: MapMarkerPlacement, x=None, y=None): def _handle_selection(self, ctx: cairo.Context): if self._selected is None: return - if self._selected.map_id != self.map_bg_id: + if self._selected.level_id != self.level_id: return x, y = self._get_marker_xy(self._selected) x, y, w, h = (x - RAD * 2, y - RAD * 2,