Skip to content

Commit

Permalink
Merge pull request SkyTemple#66 from irdkwia/world-map
Browse files Browse the repository at this point in the history
Fix world map component
  • Loading branch information
theCapypara authored Nov 24, 2020
2 parents bd3cc66 + cf91a37 commit bf7d193
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 37 deletions.
74 changes: 42 additions & 32 deletions skytemple/module/lists/controller/world_map.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,11 +47,11 @@ 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 = {}
self._mapbg_id = None
self._level_id = None
self._edited_marker = None
self._edited_pos = None

Expand All @@ -61,13 +61,19 @@ 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()
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
Expand Down Expand Up @@ -103,9 +109,10 @@ 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
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):
Expand All @@ -125,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):
Expand All @@ -137,44 +144,47 @@ 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(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)
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
bma_height = bma.map_height_camera * BPC_TILE_DIM
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
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[level_id].mapid)

def _get_position(self, entry: MapMarkerPlacement):
if entry.map_id < 0:
if entry.level_id < 0:
return '<Not on map>'
if entry.reference_id > -1:
return f'<Uses marker of entry {entry.reference_id}>'
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 -- #
Expand Down Expand Up @@ -211,9 +221,9 @@ def _edit(self):
else:
map_store.clear()
selected_map_iter = map_store.append([-1, "<Don't show on map>"])
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:
if level.id == self._markers[idx].level_id:
selected_map_iter = iiter
cb_map.set_active_iter(selected_map_iter)

Expand Down Expand Up @@ -250,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)
Expand Down Expand Up @@ -286,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])
Expand All @@ -306,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()

Expand Down
10 changes: 5 additions & 5 deletions skytemple/module/lists/world_map_drawer.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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:
Expand All @@ -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:
Expand All @@ -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
Expand Down Expand Up @@ -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,
Expand Down

0 comments on commit bf7d193

Please sign in to comment.