def loop(self): pid, ev = ui.ui.poll() self._list.set_index(self._index) self._title.set_text(self._base_text + " - %d/%d" % (self._index + 1, len(self._songitems))) while not (ev == ui.CANCEL and (not self._folders or self._song.isfolder)): # Inactive player. If the event isn't set to ui.PASS, we try to use # the pid later, which will be bad. if pid >= len(self._diff_names): ev = ui.PASS elif ev == ui.UP: self._index -= 1 elif ev == ui.DOWN: self._index += 1 elif ev == ui.PGUP: self._index -= 7 ev = ui.UP elif ev == ui.PGDN: self._index += 7 ev = ui.DOWN elif ev == ui.LEFT: if not self._song.isfolder: namei = self._song.diff_list.index(self._diff_names[pid]) namei = (namei -1) % len(self._song.diff_list) name = self._song.diff_list[namei] self._diff_names[pid] = name self._pref_diff_names[pid] = name self._last_player = pid elif ev == ui.RIGHT: if not self._song.isfolder: namei = self._song.diff_list.index(self._diff_names[pid]) namei = (namei + 1) % len(self._song.diff_list) name = self._song.diff_list[namei] self._diff_names[pid] = name self._pref_diff_names[pid] = name self._last_player = pid elif ev == ui.SELECT: if self._song.isfolder: if len(self._all_valid_songitems) > 0: self._song = random.choice(self._all_valid_songitems) fol = self._song.folder[SORT_NAMES[mainconfig["sortmode"]]] self._create_song_list(fol) self._index = self._songitems.index(self._song) else: error.ErrorMessage(screen, _("You don't have any songs that are marked ") + _("\"valid\" for random selection.")) else: valid_songs = [s for s in self._songitems if s.info["valid"]] if len(valid_songs) > 0: self._song = random.choice(valid_songs) self._index = self._songitems.index(self._song) else: error.ErrorMessage(screen, _("You don't have any songs here that ") + _("are marked \"valid\" for random selection.")) elif ev == ui.START: options.OptionScreen(self._configs, self._config, self._screen) self._screen.blit(self._bg, [0, 0]) self.update() pygame.display.update() elif ev == ui.SORT: s = self._songitems[self._index] mainconfig["sortmode"] = (mainconfig["sortmode"] + 1) % NUM_SORTS sort_name = self._update_songitems() if self._folders: if s.isfolder: self._create_folder_list() else: s = self._find_resorted() self._create_song_list(s.folder[sort_name]) self._index = self._songitems.index(s) else: s = self._find_resorted() self._base_text = _(sort_name).upper() self._songitems.sort(key=SORTS[sort_name]) self._index = self._songitems.index(s) self._list.set_items([s.info["title"] for s in self._songitems]) elif ev == ui.CONFIRM: if self._song.isfolder: self._create_song_list(self._song.name) self._index = 0 else: music.fadeout(500) dance.play(self._screen, [(self._song.filename, self._diff_names)], self._configs, self._config, self._game) music.fadeout(500) # The just-played song self._screen.blit(self._bg, [0, 0]) pygame.display.update() ui.ui.clear() elif ev == ui.CANCEL: # first: get the parent folder of the active song sort_name = SORT_NAMES[mainconfig["sortmode"]] fol = folder_name(self._song.folder[sort_name], sort_name) # next: change folder self._create_folder_list() for d in self._diff_widgets: d.set("None", [127, 127, 127], 0, "?") lst = [s.info["title"] for s in self._songitems] self._index = lst.index(fol) elif ev == ui.FULLSCREEN: mainconfig["fullscreen"] ^= 1 pygame.display.toggle_fullscreen() self._index %= len(self._songitems) self._song = self._songitems[self._index] if self._locked and ev in [ui.LEFT, ui.RIGHT]: for i, sd in enumerate(self._diff_names): self._diff_names[i] = self._diff_names[pid] self._pref_diff_names[i] = self._diff_names[pid] if ev in [ui.CANCEL, ui.UP, ui.DOWN, ui.SELECT, ui.CONFIRM, ui.SORT]: self._preview.preview(self._song) self._banner.set_song(self._song) if ev in [ui.CANCEL, ui.UP, ui.DOWN, ui.SELECT, ui.CONFIRM, ui.SORT]: if ev == ui.UP: self._list.set_index(self._index, -1) elif ev == ui.DOWN: self._list.set_index(self._index, 1) else: self._list.set_index(self._index, 0) # don't animate self._title.set_text(self._base_text + " - %d/%d" % (self._index + 1, len(self._songitems))) if ev in [ui.UP, ui.DOWN, ui.SELECT, ui.SORT, ui.CONFIRM]: if not self._song.isfolder: for pl, dname in enumerate(self._diff_names): name = self._pref_diff_names[pl] if name in self._song.diff_list: self._diff_names[pl] = name elif self._unify_difficulties(name) in self._song.diff_list: self._diff_names[pl] = self._unify_difficulties(name) else: # if both name and the song's difficulty list can be indexed: # find the nearest defined difficulty if (name in util.DIFFICULTY_LIST or self._unify_difficulties(name) in util.DIFFICULTY_LIST) and \ reduce(lambda a,b: a and b in util.DIFFICULTY_LIST, self._song.diff_list , True ): name = self._unify_difficulties(name) namei = util.DIFFICULTY_LIST.index(name) diffi = [util.DIFFICULTY_LIST.index(d) for d in self._song.diff_list] dds = [abs(d - namei) for d in diffi] self._diff_names[pl] = self._song.diff_list\ [dds.index(min(dds))] else: # no sensible way to resolve this: jump to middle of list difflen = len(self._song.diff_list) self._diff_names[pl] = self._song.diff_list[difflen/2] if ev in [ui.UP, ui.DOWN, ui.LEFT, ui.RIGHT, ui.SELECT, ui.CONFIRM]: if not self._song.isfolder: for i, name in enumerate(self._diff_names): rank = records.get(self._song.info["recordkey"], name, self._game)[0] grade = grades.grades[self._config["grade"]].grade_by_rank(rank) self._diff_widgets[i].set(name, DIFF_COLORS.get(name, [127,127,127]), self._song.difficulty[name], grade) self.update() pid, ev = ui.ui.poll()
def __init__(self, songs, courses, screen, game): InterfaceWindow.__init__(self, screen, "newss-bg.png") songs = [s for s in songs if s.difficulty.has_key(game)] if len(songs) == 0: error.ErrorMessage(screen, _("You don't have any songs for the game mode (") + game + _(") that you selected.")) #TODO: format using % for better i18n return # Construct a mapping between songs displays and dance displays. songs_and_dances = [(SongItemDisplay(s, game), [DanceItemDisplay(s, game, diff) for diff in s.diff_list[game]]) for s in songs] for (s,ds) in songs_and_dances: for d in ds: s.danceitems[d.diff]=d d.songitem=s self._songs = [s[0] for s in songs_and_dances] self._dances = reduce(lambda x,y: x+y[1],songs_and_dances,[]) self._index = 0 self._game = game self._config = dict(game_config) self._all_songs = self._songs self._all_dances = self._dances self._all_valid_songs = [s for s in self._songs if s.info["valid"]] self._all_valid_dances = [d for d in self._dances if d.info["valid"]] self._list = ListBox(FontTheme.SongSel_list, [255, 255, 255], 26, 16, 220, [408, 56]) # please use set constructions after python 2.4 is adopted sort_name = self._update_songitems() if len(self._songs) > 60 and mainconfig["folders"]: self._create_folders() self._create_folder_list() else: self._folders = None self._base_text = sort_name.upper() self._songitems.sort(key=SORTS[sort_name]) self._list.set_items([s.info["title"] for s in self._songitems]) self._preview = SongPreview() self._preview.preview(self._songitems[self._index]) self._song = self._songitems[self._index] # Both players must have the same difficulty in locked modes. self._locked = games.GAMES[self._game].couple players = games.GAMES[game].players # self._diffs = [] # Current difficulty setting self._diff_widgets = [] # Difficulty widgets self._configs = [] self._diff_names = [] # Current chosen difficulties self._pref_diff_names = [] # Last manually selected difficulty names self._last_player = 0 # Last player to change a difficulty for i in range(players): self._configs.append(dict(player_config)) d = DifficultyBox([84 + (233 * i), 434]) self._pref_diff_names.append(util.DIFFICULTY_LIST[0]) if not self._song.isfolder: self._diff_names.append(self._song.diff_list[0]) diff_name = self._diff_names[i] rank = records.get(self._song.info["recordkey"], diff_name, self._game)[0] grade = grades.grades[self._config["grade"]].grade_by_rank(rank) d.set(diff_name, DIFF_COLORS.get(diff_name, [127, 127, 127]), self._song.difficulty[diff_name], grade) else: self._diff_names.append(" ") d.set(_("None"), [127, 127, 127], 0, "?") self._diff_widgets.append(d) ActiveIndicator([405, 259], width = 230).add(self._sprites) self._banner = BannerDisplay([205, 230]) self._banner.set_song(self._song) self._sprites.add(HelpText(SS_HELP, [255, 255, 255], [0, 0, 0], FontTheme.help, [206, 20])) self._title = TextDisplay('SongSel_sort_mode', [210, 28], [414, 27]) self._sprites.add(self._diff_widgets + [self._banner, self._list, self._title]) self._screen.blit(self._bg, [0, 0]) pygame.display.update() self.loop() music.fadeout(500) pygame.time.wait(500) # FIXME Does this belong in the menu code? Probably. music.load(os.path.join(sound_path, "menu.ogg")) music.set_volume(1.0) music.play(4, 0.0) player_config.update(self._configs[0]) # Save p1's settings
from constants import * from interface import * from pygame.mixer import music from fonttheme import FontTheme from i18n import * SORTS = { "subtitle": lambda x: x.info["subtitle"].lower(), "title": lambda x: (x.info["title"].lower(), SORTS["subtitle"](x)), "artist": lambda x: (x.info["artist"].lower(), SORTS["title"](x)), "bpm": lambda x: (x.info["bpm"], SORTS["title"](x)), "mix": lambda x: (x.info["mix"], SORTS["title"](x)), "rating": lambda x: (x.difficulty[x.diff_list[0]], SORTS["rank"](x)), "difficulty": lambda x: (util.difficulty_sort_key(x.diff_list[0]), SORTS["rating"](x)), "rank": lambda x: -records.get(x.info["recordkey"],x.diff_list[0],game)[0], } SORT_DANCES = { "mix":False, "title":False, "artist":False, "bpm":False, "rating":True, "difficulty":True } TEXTS = [_("subtitle"),_("title"),_("artist"),_("bpm"),_("mix"), _("rating"),_("difficulty"),_("rank")] # Dance sort names define sorting formats which are tied to dance data in songs;
def loop(self): pid, ev = ui.ui.poll() self._list.set_index(self._index) self._title.set_text(self._base_text + " - %d/%d" % (self._index + 1, len(self._songitems))) while not (ev == ui.CANCEL and (not self._folders or self._song.isfolder)): # Inactive player. If the event isn't set to ui.PASS, we try to use # the pid later, which will be bad. if pid >= len(self._diff_names): ev = ui.PASS elif pid >= 0 and ev in (ui.UP, ui.DOWN): # Only use menuing UP/DOWN ev = ui.PASS elif pid < 0 and ev in ( ui.LEFT, ui.RIGHT): # Need LEFT/RIGHT player-specific ev = ui.PASS elif ev == ui.UP: self._index -= 1 elif ev == ui.DOWN: self._index += 1 elif ev == ui.PGUP: self._index -= 7 ev = ui.UP elif ev == ui.PGDN: self._index += 7 ev = ui.DOWN elif ev == ui.LEFT: if not self._song.isfolder: namei = self._song.diff_list.index(self._diff_names[pid]) namei = (namei - 1) % len(self._song.diff_list) name = self._song.diff_list[namei] self._diff_names[pid] = name self._pref_diff_names[pid] = name self._last_player = pid elif ev == ui.RIGHT: if not self._song.isfolder: namei = self._song.diff_list.index(self._diff_names[pid]) namei = (namei + 1) % len(self._song.diff_list) name = self._song.diff_list[namei] self._diff_names[pid] = name self._pref_diff_names[pid] = name self._last_player = pid elif ev == ui.RANDOM: if self._song.isfolder: if len(self._all_valid_songitems) > 0: self._song = random.choice(self._all_valid_songitems) fol = self._song.folder[SORT_NAMES[ mainconfig["sortmode"]]] self._create_song_list(fol) self._index = self._songitems.index(self._song) else: error.ErrorMessage( screen, _("You don't have any songs that are marked ") + _("\"valid\" for random selection.")) else: valid_songs = [ s for s in self._songitems if s.info["valid"] ] if len(valid_songs) > 0: self._song = random.choice(valid_songs) self._index = self._songitems.index(self._song) else: error.ErrorMessage( screen, _("You don't have any songs here that ") + _("are marked \"valid\" for random selection.")) elif ev == ui.OPTIONS: opts = options.OptionScreen(self._configs, self._config, self._screen) self._screen.blit(self._bg, [0, 0]) self.update() pygame.display.update() if opts.start_dancing: ev = ui.CONFIRM continue elif ev == ui.SORT: s = self._songitems[self._index] mainconfig["sortmode"] = (mainconfig["sortmode"] + 1) % NUM_SORTS sort_name = self._update_songitems() if self._folders: if s.isfolder: self._create_folder_list() else: s = self._find_resorted() self._create_song_list(s.folder[sort_name]) self._index = self._songitems.index(s) else: s = self._find_resorted() self._base_text = _(sort_name).upper() self._songitems.sort(key=SORTS[sort_name]) self._index = self._songitems.index(s) self._list.set_items( [s.info["title"] for s in self._songitems]) elif ev == ui.CONFIRM: if self._song.isfolder: self._create_song_list(self._song.name) self._index = 0 else: music.fadeout(500) dance.play(self._screen, [(self._song.filename, self._diff_names)], self._configs, self._config, self._game) music.fadeout(500) # The just-played song self._screen.blit(self._bg, [0, 0]) pygame.display.update() ui.ui.clear() elif ev == ui.CANCEL: # first: get the parent folder of the active song sort_name = SORT_NAMES[mainconfig["sortmode"]] fol = folder_name(self._song.folder[sort_name], sort_name) # next: change folder self._create_folder_list() for d in self._diff_widgets: d.set("None", [127, 127, 127], 0, "?") lst = [s.info["title"] for s in self._songitems] self._index = lst.index(fol) elif ev == ui.FULLSCREEN: mainconfig["fullscreen"] ^= 1 pygame.display.toggle_fullscreen() self._index %= len(self._songitems) self._song = self._songitems[self._index] if self._locked and ev in [ui.LEFT, ui.RIGHT]: for i, sd in enumerate(self._diff_names): self._diff_names[i] = self._diff_names[pid] self._pref_diff_names[i] = self._diff_names[pid] if ev in [ ui.CANCEL, ui.UP, ui.DOWN, ui.RANDOM, ui.CONFIRM, ui.SORT ]: self._preview.preview(self._song) self._banner.set_song(self._song) if ev in [ ui.CANCEL, ui.UP, ui.DOWN, ui.RANDOM, ui.CONFIRM, ui.SORT ]: if ev == ui.UP: self._list.set_index(self._index, -1) elif ev == ui.DOWN: self._list.set_index(self._index, 1) else: self._list.set_index(self._index, 0) # don't animate self._title.set_text(self._base_text + " - %d/%d" % (self._index + 1, len(self._songitems))) if ev in [ui.UP, ui.DOWN, ui.RANDOM, ui.SORT, ui.CONFIRM]: if not self._song.isfolder: for pl, dname in enumerate(self._diff_names): name = self._pref_diff_names[pl] if name in self._song.diff_list: self._diff_names[pl] = name elif self._unify_difficulties( name) in self._song.diff_list: self._diff_names[pl] = self._unify_difficulties( name) else: # if both name and the song's difficulty list can be indexed: # find the nearest defined difficulty if (name in util.DIFFICULTY_LIST or self._unify_difficulties(name) in util.DIFFICULTY_LIST) and \ reduce(lambda a,b: a and b in util.DIFFICULTY_LIST, self._song.diff_list , True ): name = self._unify_difficulties(name) namei = util.DIFFICULTY_LIST.index(name) diffi = [ util.DIFFICULTY_LIST.index(d) for d in self._song.diff_list ] dds = [abs(d - namei) for d in diffi] self._diff_names[pl] = self._song.diff_list\ [dds.index(min(dds))] else: # no sensible way to resolve this: jump to middle of list difflen = len(self._song.diff_list) self._diff_names[pl] = self._song.diff_list[ difflen / 2] if ev in [ ui.UP, ui.DOWN, ui.LEFT, ui.RIGHT, ui.RANDOM, ui.CONFIRM ]: if not self._song.isfolder: for i, name in enumerate(self._diff_names): rank = records.get(self._song.info["recordkey"], name, self._game)[0] grade = grades.grades[ self._config["grade"]].grade_by_rank(rank) self._diff_widgets[i].set( name, DIFF_COLORS.get(name, [127, 127, 127]), self._song.difficulty[name], grade) self.update() pid, ev = ui.ui.poll()
def __init__(self, songs, courses, screen, game): InterfaceWindow.__init__(self, screen, "newss-bg.png") songs = [s for s in songs if s.difficulty.has_key(game)] if len(songs) == 0: error.ErrorMessage( screen, _("You don't have any songs for the game mode (") + game + _(") that you selected.") ) #TODO: format using % for better i18n return # Construct a mapping between songs displays and dance displays. songs_and_dances = [ (SongItemDisplay(s, game), [DanceItemDisplay(s, game, diff) for diff in s.diff_list[game]]) for s in songs ] for (s, ds) in songs_and_dances: for d in ds: s.danceitems[d.diff] = d d.songitem = s self._songs = [s[0] for s in songs_and_dances] self._dances = reduce(lambda x, y: x + y[1], songs_and_dances, []) self._index = 0 self._game = game self._config = dict(game_config) self._all_songs = self._songs self._all_dances = self._dances self._all_valid_songs = [s for s in self._songs if s.info["valid"]] self._all_valid_dances = [d for d in self._dances if d.info["valid"]] self._list = ListBox(FontTheme.SongSel_list, [255, 255, 255], 26, 16, 220, [408, 56]) # please use set constructions after python 2.4 is adopted sort_name = self._update_songitems() if mainconfig["folders"]: self._create_folders() self._create_folder_list() else: self._folders = None self._base_text = sort_name.upper() self._songitems.sort(key=SORTS[sort_name]) self._list.set_items([s.info["title"] for s in self._songitems]) self._preview = SongPreview() self._preview.preview(self._songitems[self._index]) self._song = self._songitems[self._index] # Both players must have the same difficulty in locked modes. self._locked = games.GAMES[self._game].couple players = games.GAMES[game].players # self._diffs = [] # Current difficulty setting self._diff_widgets = [] # Difficulty widgets self._configs = [] self._diff_names = [] # Current chosen difficulties self._pref_diff_names = [] # Last manually selected difficulty names self._last_player = 0 # Last player to change a difficulty for i in range(players): self._configs.append(dict(player_config)) d = DifficultyBox([84 + (233 * i), 434]) self._pref_diff_names.append(util.DIFFICULTY_LIST[0]) if not self._song.isfolder: self._diff_names.append(self._song.diff_list[0]) diff_name = self._diff_names[i] rank = records.get(self._song.info["recordkey"], diff_name, self._game)[0] grade = grades.grades[self._config["grade"]].grade_by_rank( rank) d.set(diff_name, DIFF_COLORS.get(diff_name, [127, 127, 127]), self._song.difficulty[diff_name], grade) else: self._diff_names.append(" ") d.set(_("None"), [127, 127, 127], 0, "?") self._diff_widgets.append(d) ActiveIndicator([405, 259], width=230).add(self._sprites) self._banner = BannerDisplay([205, 230]) self._banner.set_song(self._song) self._sprites.add( HelpText(SS_HELP, [255, 255, 255], [0, 0, 0], FontTheme.help, [206, 20])) self._title = TextDisplay('SongSel_sort_mode', [210, 28], [414, 27]) self._sprites.add(self._diff_widgets + [self._banner, self._list, self._title]) self._screen.blit(self._bg, [0, 0]) pygame.display.update() self.loop() music.fadeout(500) pygame.time.wait(500) # FIXME Does this belong in the menu code? Probably. music.load(os.path.join(sound_path, "menu.ogg")) music.set_volume(1.0) music.play(4, 0.0) player_config.update(self._configs[0]) # Save p1's settings game_config.update(self._config) # save game settings
"subtitle": lambda x: x.info["subtitle"].lower(), "title": lambda x: (x.info["title"].lower(), SORTS["subtitle"](x)), "artist": lambda x: (x.info["artist"].lower(), SORTS["title"](x)), "bpm": lambda x: (x.info["bpm"], SORTS["title"](x)), "mix": lambda x: (x.info["mix"], SORTS["title"](x)), "rating": lambda x: (x.difficulty[x.diff_list[0]], SORTS["rank"](x)), "difficulty": lambda x: (util.difficulty_sort_key(x.diff_list[0]), SORTS["rating"](x)), "rank": lambda x: -records.get(x.info["recordkey"], x.diff_list[0], game)[0], } SORT_DANCES = { "mix": False, "title": False, "artist": False, "bpm": False, "rating": True, "difficulty": True } TEXTS = [ _("subtitle"), _("title"), _("artist"),