def __init__(self, session): self.session = session self.which = None self.cursor = None self.coordinates_tooltip = None self.keylistener = IngameKeyListener(self.session) # used by NavigationTool LastActivePlayerSettlementManager.create_instance(self.session) # Mocks needed to act like the real IngameGui self.show_menu = mock.Mock() self.hide_menu = mock.Mock() # this is necessary for message_widget to work self.logbook = mock.Mock() self.mainhud = load_uh_widget('minimap.xml') self.mainhud.position_technique = "right+0:top+0" icon = self.mainhud.findChild(name="minimap") self.minimap = Minimap( icon, targetrenderer=horizons.globals.fife.targetrenderer, imagemanager=horizons.globals.fife.imagemanager, session=self.session, view=self.session.view) self.mainhud.mapEvents({ 'zoomIn': self.session.view.zoom_in, 'zoomOut': self.session.view.zoom_out, 'rotateRight': Callback.ChainedCallbacks(self.session.view.rotate_right, self.minimap.update_rotation), 'rotateLeft': Callback.ChainedCallbacks(self.session.view.rotate_left, self.minimap.update_rotation), 'gameMenuButton': self.toggle_pause, }) self.mainhud.show() ZoomChanged.subscribe(self._update_zoom) # Hide unnecessary buttons in hud for widget in ("build", "speedUp", "speedDown", "destroy_tool", "diplomacyButton", "logbook"): self.mainhud.findChild(name=widget).hide() self.windows = WindowManager() self.message_widget = MessageWidget(self.session) self.pausemenu = PauseMenu(self.session, self, self.windows, in_editor_mode=True) self.help_dialog = HelpDialog(self.windows)
def _init_gui(self): """ Initial init of gui. widgets : list of route entry widgets slots : dict with slots for each entry """ self._gui = load_uh_widget("configure_route.xml", center_widget=True) self.widgets = [] self.slots = {} icon = self._gui.findChild(name="minimap") self.minimap = Minimap(icon, session=self.session, world=self.session.world, view=self.session.view, targetrenderer=horizons.globals.fife.targetrenderer, imagemanager=horizons.globals.fife.imagemanager, cam_border=False, use_rotation=False, on_click=self.on_map_click) resources = self.session.db.get_res(only_tradeable=True) # map an icon for a resource # map a resource for an icon self.resource_for_icon = {self.dummy_icon_path: 0} self.icon_for_resource = {0: self.dummy_icon_path} for res_id in resources: icon = get_res_icon_path(res_id) self.resource_for_icon[icon] = res_id self.icon_for_resource[res_id] = icon # don't do any actions if the resource menu is shown self.resource_menu_shown = False for entry in self.instance.route.waypoints: self.add_gui_entry(entry['warehouse'], entry['resource_list']) self._check_no_entries_label() wait_at_unload_box = self._gui.findChild(name="wait_at_unload") wait_at_unload_box.marked = self.instance.route.wait_at_unload def toggle_wait_at_unload(): self._route_cmd("set_wait_at_unload", not self.instance.route.wait_at_unload) wait_at_unload_box.capture(toggle_wait_at_unload) wait_at_load_box = self._gui.findChild(name="wait_at_load") wait_at_load_box.marked = self.instance.route.wait_at_load def toggle_wait_at_load(): self._route_cmd("set_wait_at_load", not self.instance.route.wait_at_load) wait_at_load_box.capture(toggle_wait_at_load) self._gui.mapEvents({ OkButton.DEFAULT_NAME: self._windows.close, 'start_route/mouseClicked': self.toggle_route, })
def _poll_preview_process(self): """This will be called regularly to see if the process ended. If the process has not yet finished, schedule a new callback to this function. Otherwise use the data to update the minimap. """ if not self._preview_process: return self._preview_process.poll() if self._preview_process.returncode is None: # not finished ExtScheduler().add_new_object(self._poll_preview_process, self, 0.1) return elif self._preview_process.returncode != 0: self._preview_process = None self._set_map_preview_status( "An unknown error occurred while generating the map preview") return with open(self._preview_output, 'r') as f: data = f.read() # Sometimes the subprocess outputs more then the minimap data, e.g. debug # information. Since we just read from its stdout, parse out the data that # is relevant to us. data = re.findall(r'^DATA (\[\[.*\]\]) ENDDATA$', data, re.MULTILINE)[0] data = json.loads(data) os.unlink(self._preview_output) self._preview_process = None if self._map_preview: self._map_preview.end() self._map_preview = Minimap( self._gui.findChild(name='map_preview_minimap'), session=None, view=None, world=None, targetrenderer=horizons.globals.fife.targetrenderer, imagemanager=horizons.globals.fife.imagemanager, cam_border=False, use_rotation=False, tooltip=T("Click to generate a different random map"), on_click=self._on_preview_click, preview=True) self._map_preview.draw_data(data) self._set_map_preview_status("")
def _poll_preview_process(self): """This will be called regularly to see if the process ended. If the process has not yet finished, schedule a new callback to this function. Otherwise use the data to update the minimap. """ if not self._preview_process: return self._preview_process.poll() if self._preview_process.returncode is None: # not finished ExtScheduler().add_new_object(self._poll_preview_process, self, 0.1) return elif self._preview_process.returncode != 0: self._preview_process = None self._set_map_preview_status( u"An unknown error occurred while generating the map preview") return with open(self._preview_output, 'r') as f: data = f.read() os.unlink(self._preview_output) self._preview_process = None if self._map_preview: self._map_preview.end() self._map_preview = Minimap( self._gui.findChild(name='map_preview_minimap'), session=None, view=None, world=None, targetrenderer=horizons.globals.fife.targetrenderer, imagemanager=horizons.globals.fife.imagemanager, cam_border=False, use_rotation=False, tooltip=_("Click to generate a different random map"), on_click=self._on_preview_click, preview=True) self._map_preview.draw_data(data) self._set_map_preview_status(u"")
def update_map(self, map_file): """Direct map preview update. Only use for existing maps, it's too slow for random maps""" if self.minimap is not None: self.minimap.end() world = self._load_raw_world(map_file) self.minimap = Minimap(self._get_map_preview_icon(), session=None, view=None, world=world, targetrenderer=horizons.globals.fife.targetrenderer, imagemanager=horizons.globals.fife.imagemanager, cam_border=False, use_rotation=False, tooltip=None, on_click=None, preview=True) self.minimap.draw()
def _update_map_preview(self, map_file): if self._map_preview: self._map_preview.end() world = load_raw_world(map_file) self._map_preview = Minimap( self._gui.findChild(name='map_preview_minimap'), session=None, view=None, world=world, targetrenderer=horizons.globals.fife.targetrenderer, imagemanager=horizons.globals.fife.imagemanager, cam_border=False, use_rotation=False, tooltip=None, on_click=None, preview=True) self._map_preview.draw()
def check_calc_process(): # checks up on calc process (see below) if self.calc_proc is not None: state = self.calc_proc.poll() if state is None: # not finished ExtScheduler().add_new_object(check_calc_process, self, 0.1) elif state != 0: self._set_map_preview_status( u"An unknown error occured while generating the map preview" ) else: # done data = open(self.calc_proc.output_filename, "r").read() os.unlink(self.calc_proc.output_filename) self.calc_proc = None icon = self._get_map_preview_icon() if icon is None: return # dialog already gone tooltip = _("Click to generate a different random map") if self.minimap is not None: self.minimap.end() self.minimap = Minimap( icon, session=None, view=None, world=None, targetrenderer=horizons.globals.fife.targetrenderer, imagemanager=horizons.globals.fife.imagemanager, cam_border=False, use_rotation=False, tooltip=tooltip, on_click=on_click, preview=True) self.minimap.draw_data(data) icon.show() self._set_map_preview_status(u"")
def generate_minimap(cls, size, parameters): """Called as subprocess, calculates minimap data and passes it via string via stdout""" # called as standalone basically, so init everything we need from horizons.main import _create_main_db from horizons.entities import Entities from horizons.ext.dummy import Dummy db = _create_main_db() Entities.load_grounds(db, load_now=False) # create all references map_file = SingleplayerMenu._generate_random_map(parameters) world = cls._load_raw_world(map_file) location = Rect.init_from_topleft_and_size_tuples((0, 0), size) minimap = Minimap(location, session=None, view=None, world=world, targetrenderer=Dummy(), imagemanager=Dummy(), cam_border=False, use_rotation=False, preview=True) # communicate via stdout print minimap.dump_data()
def generate_random_minimap(size, parameters): """Called as subprocess, calculates minimap data and passes it via string via stdout""" # called as standalone basically, so init everything we need from horizons.entities import Entities from horizons.ext.dummy import Dummy from horizons.main import _create_main_db if not VERSION.IS_DEV_VERSION: # Hack enable atlases. # Usually the minimap generator uses single tile files, but in release # mode these are not available. Therefor we have to hackenable atlases # for the minimap generation in this case. This forces the game to use # the correct imageloader # In normal dev mode + enabled atlases we ignore this and just continue # to use single tile files instead of atlases for the minimap generation. # These are always available in dev checkouts PATHS.DB_FILES = PATHS.DB_FILES + (PATHS.ATLAS_DB_PATH, ) db = _create_main_db() horizons.globals.db = db horizons.globals.fife.init_animation_loader(not VERSION.IS_DEV_VERSION) Entities.load_grounds(db, load_now=False) # create all references map_file = generate_random_map(*parameters) world = load_raw_world(map_file) location = Rect.init_from_topleft_and_size_tuples((0, 0), size) minimap = Minimap( location, session=None, view=None, world=world, targetrenderer=Dummy(), imagemanager=Dummy(), cam_border=False, use_rotation=False, preview=True) # communicate via stdout print minimap.dump_data()
def __init__(self, session): super(IngameGui, self).__init__() self.session = session assert isinstance(self.session, horizons.session.Session) self.settlement = None self._old_menu = None self.cursor = None self.coordinates_tooltip = None self.keylistener = IngameKeyListener(self.session) self.cityinfo = CityInfo(self) LastActivePlayerSettlementManager.create_instance(self.session) self.message_widget = MessageWidget(self.session) # Windows self.windows = WindowManager() self.show_popup = self.windows.show_popup self.show_error_popup = self.windows.show_error_popup self.logbook = LogBook(self.session, self.windows) self.players_overview = PlayersOverview(self.session) self.players_settlements = PlayersSettlements(self.session) self.players_ships = PlayersShips(self.session) self.chat_dialog = ChatDialog(self.windows, self.session) self.change_name_dialog = ChangeNameDialog(self.windows, self.session) self.pausemenu = PauseMenu(self.session, self, self.windows, in_editor_mode=False) self.help_dialog = HelpDialog(self.windows, session=self.session) # Icon manager self.status_icon_manager = StatusIconManager( renderer=self.session.view.renderer['GenericRenderer'], layer=self.session.view.layers[LAYERS.OBJECTS]) self.production_finished_icon_manager = ProductionFinishedIconManager( renderer=self.session.view.renderer['GenericRenderer'], layer=self.session.view.layers[LAYERS.OBJECTS]) # 'minimap' is the guichan gui around the actual minimap, which is saved # in self.minimap self.mainhud = load_uh_widget('minimap.xml') self.mainhud.position_technique = "right:top" icon = self.mainhud.findChild(name="minimap") self.minimap = Minimap( icon, targetrenderer=horizons.globals.fife.targetrenderer, imagemanager=horizons.globals.fife.imagemanager, session=self.session, view=self.session.view) def speed_up(): SpeedUpCommand().execute(self.session) def speed_down(): SpeedDownCommand().execute(self.session) self.mainhud.mapEvents({ 'zoomIn': self.session.view.zoom_in, 'zoomOut': self.session.view.zoom_out, 'rotateRight': Callback.ChainedCallbacks(self.session.view.rotate_right, self.minimap.rotate_right), 'rotateLeft': Callback.ChainedCallbacks(self.session.view.rotate_left, self.minimap.rotate_left), 'speedUp': speed_up, 'speedDown': speed_down, 'destroy_tool': self.toggle_destroy_tool, 'build': self.show_build_menu, 'diplomacyButton': self.show_diplomacy_menu, 'gameMenuButton': self.toggle_pause, 'logbook': lambda: self.windows.toggle(self.logbook) }) self.mainhud.show() self.resource_overview = ResourceOverviewBar(self.session) # Register for messages SpeedChanged.subscribe(self._on_speed_changed) NewDisaster.subscribe(self._on_new_disaster) NewSettlement.subscribe(self._on_new_settlement) PlayerLevelUpgrade.subscribe(self._on_player_level_upgrade) MineEmpty.subscribe(self._on_mine_empty) self.session.view.add_change_listener(self._update_zoom) self._display_speed(self.session.timer.ticks_per_second)
def __init__(self, session, gui): super(IngameGui, self).__init__() self.session = session self.main_gui = gui self.widgets = {} self.tabwidgets = {} self.settlement = None self.resource_source = None self.resources_needed, self.resources_usable = {}, {} self._old_menu = None self.widgets = LazyWidgetsDict(self.styles, center_widgets=False) cityinfo = self.widgets['city_info'] cityinfo.child_finder = PychanChildFinder(cityinfo) cityinfo.position_technique = "center-10:top+5" self.logbook = LogBook() self.logbook.add_pause_request_listener( Callback(self.session.speed_pause)) self.logbook.add_unpause_request_listener( Callback(self.session.speed_unpause)) self.scenario_chooser = ScenarioChooser(self.session) # self.widgets['minimap'] is the guichan gui around the actual minimap, # which is saved in self.minimap minimap = self.widgets['minimap'] minimap.position_technique = "right-20:top+4" minimap.show() minimap_rect = Rect.init_from_topleft_and_size( minimap.position[0] + 77, 55, 120, 120) self.minimap = Minimap(minimap_rect, self.session, \ self.session.view.renderer['GenericRenderer']) minimap.mapEvents({ 'zoomIn': self.session.view.zoom_in, 'zoomOut': self.session.view.zoom_out, 'rotateRight': Callback.ChainedCallbacks(self.session.view.rotate_right, self.minimap.rotate_right), 'rotateLeft': Callback.ChainedCallbacks(self.session.view.rotate_left, self.minimap.rotate_left), 'speedUp': self.session.speed_up, 'speedDown': self.session.speed_down }) minimap_overlay = minimap.findChild(name='minimap_overlay_image') self.minimap.use_overlay_icon(minimap_overlay) self.widgets['menu_panel'].position_technique = "right+15:top+153" self.widgets['menu_panel'].show() self.widgets['menu_panel'].mapEvents({ 'destroy_tool': self.session.destroy_tool, 'build': self.show_build_menu, 'helpLink': self.main_gui.on_help, 'gameMenuButton': self.main_gui.show_pause, 'logbook': self.logbook.toggle_visibility }) self.widgets['tooltip'].hide() self.widgets['status'].child_finder = PychanChildFinder( self.widgets['status']) self.widgets['status_extra'].child_finder = PychanChildFinder( self.widgets['status_extra']) self.message_widget = MessageWidget(self.session, \ cityinfo.position[0] + cityinfo.size[0], 5) self.widgets['status_gold'].show() self.widgets['status_gold'].child_finder = PychanChildFinder( self.widgets['status_gold']) self.widgets['status_extra_gold'].child_finder = PychanChildFinder( self.widgets['status_extra_gold']) # map button names to build functions calls with the building id callbackWithArguments = pychan.tools.callbackWithArguments self.callbacks_build = {} for id, button_name, settler_level in horizons.main.db.get_building_id_buttonname_settlerlvl( ): if not settler_level in self.callbacks_build: self.callbacks_build[settler_level] = {} self.callbacks_build[settler_level][button_name] = Callback( self._build, id)
def __init__(self, session, gui): super(IngameGui, self).__init__() self.session = session assert isinstance(self.session, horizons.session.Session) self.main_gui = gui self.main_widget = None self.tabwidgets = {} self.settlement = None self.resource_source = None self.resources_needed, self.resources_usable = {}, {} self._old_menu = None self.widgets = LazyWidgetsDict(self.styles, center_widgets=False) self.cityinfo = self.widgets['city_info'] self.cityinfo.child_finder = PychanChildFinder(self.cityinfo) self.logbook = LogBook(self.session) self.message_widget = MessageWidget(self.session) self.players_overview = PlayersOverview(self.session) self.players_settlements = PlayersSettlements(self.session) self.players_ships = PlayersShips(self.session) # self.widgets['minimap'] is the guichan gui around the actual minimap, # which is saved in self.minimap minimap = self.widgets['minimap'] minimap.position_technique = "right+0:top+0" icon = minimap.findChild(name="minimap") self.minimap = Minimap( icon, targetrenderer=horizons.globals.fife.targetrenderer, imagemanager=horizons.globals.fife.imagemanager, session=self.session, view=self.session.view) def speed_up(): SpeedUpCommand().execute(self.session) def speed_down(): SpeedDownCommand().execute(self.session) minimap.mapEvents({ 'zoomIn': self.session.view.zoom_in, 'zoomOut': self.session.view.zoom_out, 'rotateRight': Callback.ChainedCallbacks(self.session.view.rotate_right, self.minimap.rotate_right), 'rotateLeft': Callback.ChainedCallbacks(self.session.view.rotate_left, self.minimap.rotate_left), 'speedUp': speed_up, 'speedDown': speed_down, 'destroy_tool': self.session.toggle_destroy_tool, 'build': self.show_build_menu, 'diplomacyButton': self.show_diplomacy_menu, 'gameMenuButton': self.main_gui.toggle_pause, 'logbook': self.logbook.toggle_visibility }) minimap.show() #minimap.position_technique = "right+15:top+153" self.widgets['tooltip'].hide() self.resource_overview = ResourceOverviewBar(self.session) ResourceBarResize.subscribe(self._on_resourcebar_resize) # Register for messages SettlerUpdate.subscribe(self._on_settler_level_change) SettlerInhabitantsChanged.subscribe(self._on_settler_inhabitant_change) HoverSettlementChanged.subscribe(self._cityinfo_set)
def _init_gui(self): """ Initial init of gui. widgets : list of route entry widgets slots : dict with slots for each entry """ self._gui = load_uh_widget("configure_route.xml") self.widgets = [] self.slots = {} self.slots_per_entry = 3 icon = self._gui.findChild(name="minimap") def on_click(event, drag): if drag: return if event.getButton() == fife.MouseEvent.LEFT: map_coord = event.map_coord tile = self.session.world.get_tile(Point(*map_coord)) if tile is not None and tile.settlement is not None: self.append_warehouse(tile.settlement.warehouse) self.minimap = Minimap( icon, session=self.session, world=self.session.world, view=self.session.view, targetrenderer=horizons.globals.fife.targetrenderer, imagemanager=horizons.globals.fife.imagemanager, cam_border=False, use_rotation=False, on_click=on_click) resources = self.session.db.get_res_id_and_icon(only_tradeable=True) # map an icon for a resource # map a resource for an icon self.resource_for_icon = {} self.icon_for_resource = {} for res_id, icon in list(resources) + [(0, self.dummy_icon_path)]: self.resource_for_icon[icon] = res_id self.icon_for_resource[res_id] = icon # don't do any actions if the resource menu is shown self.resource_menu_shown = False for entry in self.instance.route.waypoints: self.add_gui_entry(entry['warehouse'], entry['resource_list']) self._check_no_entries_label() wait_at_unload_box = self._gui.findChild(name="wait_at_unload") wait_at_unload_box.marked = self.instance.route.wait_at_unload def toggle_wait_at_unload(): self._route_cmd("set_wait_at_unload", not self.instance.route.wait_at_unload) wait_at_unload_box.capture(toggle_wait_at_unload) wait_at_load_box = self._gui.findChild(name="wait_at_load") wait_at_load_box.marked = self.instance.route.wait_at_load def toggle_wait_at_load(): self._route_cmd("set_wait_at_load", not self.instance.route.wait_at_load) wait_at_load_box.capture(toggle_wait_at_load) self._gui.mapEvents({ OkButton.DEFAULT_NAME: self.hide, 'start_route/mouseClicked': self.toggle_route }) self._gui.position_technique = "automatic" # "center:center" """
def __init__(self, session, gui): super(IngameGui, self).__init__() self.session = session self.main_gui = gui self.widgets = {} self.tabwidgets = {} self.settlement = None self.resource_source = None self.resources_needed, self.resources_usable = {}, {} self._old_menu = None self.widgets = LazyWidgetsDict(self.styles, center_widgets=False) screenwidth = horizons.main.fife.engine_settings.getScreenWidth() cityinfo = self.widgets['city_info'] cityinfo.child_finder = PychanChildFinder(cityinfo) cityinfo.position = ( screenwidth/2 - cityinfo.size[0]/2 - 10, 5 ) self.logbook = LogBook(session) # self.widgets['minimap'] is the guichan gui around the actual minimap, # which is saved in self.minimap minimap = self.widgets['minimap'] minimap.position = (screenwidth - minimap.size[0] -20, 4) minimap.show() minimap_rect = Rect.init_from_topleft_and_size(minimap.position[0]+77, 55, 120, 120) self.minimap = Minimap(minimap_rect, self.session, \ self.session.view.renderer['GenericRenderer']) minimap.mapEvents({ 'zoomIn' : self.session.view.zoom_in, 'zoomOut' : self.session.view.zoom_out, 'rotateRight' : Callback.ChainedCallbacks(self.session.view.rotate_right, self.minimap.rotate_right), 'rotateLeft' : Callback.ChainedCallbacks(self.session.view.rotate_left, self.minimap.rotate_left), 'speedUp' : self.session.speed_up, 'speedDown' : self.session.speed_down }) minimap_overlay = minimap.findChild(name='minimap_overlay_image') self.minimap.use_overlay_icon(minimap_overlay) menupanel = self.widgets['menu_panel'] menupanel.position = (screenwidth - menupanel.size[0] +15, 149) menupanel.show() menupanel.mapEvents({ 'destroy_tool' : self.session.destroy_tool, 'build' : self.show_build_menu, 'helpLink' : self.main_gui.on_help, 'gameMenuButton' : self.main_gui.show_pause, 'logbook' : self.logbook.toggle_visibility }) self.widgets['tooltip'].hide() for w in ('status','status_extra','status_gold','status_extra_gold'): self.widgets[w].child_finder = PychanChildFinder(self.widgets[w]) self.widgets['status_gold'].show() self.message_widget = MessageWidget(self.session, \ cityinfo.position[0] + cityinfo.size[0], 5) self.resbar = ResBar(self.session, gui, self.widgets, self.resource_source) # map button names to build functions calls with the building id building_list = horizons.main.db.get_building_id_buttonname_settlerlvl() self.callbacks_build = {} for id,button_name,settler_level in building_list: if not settler_level in self.callbacks_build: self.callbacks_build[settler_level] = {} self.callbacks_build[settler_level][button_name] = Callback(self._build, id)
def __init__(self, session): super(IngameGui, self).__init__() self.session = session assert isinstance(self.session, horizons.session.Session) self.settlement = None self._old_menu = None self.cursor = None self.coordinates_tooltip = None self.keylistener = IngameKeyListener(self.session) self.cityinfo = CityInfo(self) LastActivePlayerSettlementManager.create_instance(self.session) self.message_widget = MessageWidget(self.session) # Windows self.windows = WindowManager() self.open_popup = self.windows.open_popup self.open_error_popup = self.windows.open_error_popup self.logbook = LogBook(self.session, self.windows) self.players_overview = PlayersOverview(self.session) self.players_settlements = PlayersSettlements(self.session) self.players_ships = PlayersShips(self.session) self.chat_dialog = ChatDialog(self.windows, self.session) self.change_name_dialog = ChangeNameDialog(self.windows, self.session) self.pausemenu = PauseMenu(self.session, self, self.windows, in_editor_mode=False) self.help_dialog = HelpDialog(self.windows) # Icon manager self.status_icon_manager = StatusIconManager( renderer=self.session.view.renderer['GenericRenderer'], layer=self.session.view.layers[LAYERS.OBJECTS]) self.production_finished_icon_manager = ProductionFinishedIconManager( renderer=self.session.view.renderer['GenericRenderer'], layer=self.session.view.layers[LAYERS.OBJECTS]) # 'minimap' is the guichan gui around the actual minimap, which is saved # in self.minimap self.mainhud = load_uh_widget('minimap.xml') self.mainhud.position_technique = "right:top" icon = self.mainhud.findChild(name="minimap") self.minimap = Minimap( icon, targetrenderer=horizons.globals.fife.targetrenderer, imagemanager=horizons.globals.fife.imagemanager, session=self.session, view=self.session.view) def speed_up(): SpeedUpCommand().execute(self.session) def speed_down(): SpeedDownCommand().execute(self.session) self.mainhud.mapEvents({ 'zoomIn': self.session.view.zoom_in, 'zoomOut': self.session.view.zoom_out, 'rotateRight': Callback.ChainedCallbacks(self.session.view.rotate_right, self.minimap.rotate_right), 'rotateLeft': Callback.ChainedCallbacks(self.session.view.rotate_left, self.minimap.rotate_left), 'speedUp': speed_up, 'speedDown': speed_down, 'destroy_tool': self.toggle_destroy_tool, 'build': self.show_build_menu, 'diplomacyButton': self.show_diplomacy_menu, 'gameMenuButton': self.toggle_pause, 'logbook': lambda: self.windows.toggle(self.logbook) }) self.mainhud.show() hotkey_replacements = { 'rotateRight': 'ROTATE_RIGHT', 'rotateLeft': 'ROTATE_LEFT', 'speedUp': 'SPEED_UP', 'speedDown': 'SPEED_DOWN', 'destroy_tool': 'DESTROY_TOOL', 'build': 'BUILD_TOOL', 'gameMenuButton': 'ESCAPE', 'logbook': 'LOGBOOK', } for (widgetname, action) in hotkey_replacements.iteritems(): widget = self.mainhud.findChild(name=widgetname) keys = horizons.globals.fife.get_keys_for_action(action) # No `.upper()` here: "Pause" looks better than "PAUSE". keyname = HOTKEYS.DISPLAY_KEY.get(keys[0], keys[0].capitalize()) widget.helptext = widget.helptext.format(key=keyname) self.resource_overview = ResourceOverviewBar(self.session) # Register for messages SpeedChanged.subscribe(self._on_speed_changed) NewDisaster.subscribe(self._on_new_disaster) NewSettlement.subscribe(self._on_new_settlement) PlayerLevelUpgrade.subscribe(self._on_player_level_upgrade) MineEmpty.subscribe(self._on_mine_empty) ZoomChanged.subscribe(self._update_zoom) self._display_speed(self.session.timer.ticks_per_second)