From 3f44b65c6028264fa0d24b6a942bfe38fb53c6ff Mon Sep 17 00:00:00 2001 From: cidoku Date: Wed, 19 Feb 2025 18:20:03 -0300 Subject: [PATCH] respect scaling in char.ini and default for smooth scaling for big sprites --- gameview.py | 74 +++++++++++++++++++++++++++++++++++------------------ mainmenu.py | 2 +- 2 files changed, 50 insertions(+), 26 deletions(-) diff --git a/gameview.py b/gameview.py index 5bd3c1a..816153b 100644 --- a/gameview.py +++ b/gameview.py @@ -65,6 +65,10 @@ C_GRAY = 8 C_RAINBOW = 9 C_BLACK = 10 +SCALING_AUTO = 0 +SCALING_PIXEL = 1 +SCALING_SMOOTH = 2 + DOWNLOAD_BLACKLIST = [] VIEWPORT_W = 256*2 @@ -83,12 +87,6 @@ def encode_ao_str(text): def get_char_ini(char, section, value, default=""): tempini = ConfigParser() - # with open(AOpath + 'characters/' + char.lower() + '/char.ini', 'r') as file: - # for line in file: - # try: - # tempini.readfp(file) - # except: - # pass return ini.read_ini(AOpath + 'characters/' + char.lower() + '/char.ini', section, value, default) def get_option(section, value, default=""): @@ -237,6 +235,7 @@ class AOCharMovie(QtGui.QLabel): self.time_mod = 62 self.play_once = True self.m_flipped = False + self.scaling = SCALING_AUTO self.m_movie = QtGui.QMovie() @@ -260,7 +259,7 @@ class AOCharMovie(QtGui.QLabel): def set_flipped(self, flip): self.m_flipped = flip - def play(self, p_char, p_emote, emote_prefix): + def play(self, p_char, p_emote, emote_prefix, scaling = SCALING_AUTO): if p_emote[0] == "/" or p_emote[0] == "/": p_emote = p_emote[1:] elif "../../characters" in p_emote: @@ -274,6 +273,8 @@ class AOCharMovie(QtGui.QLabel): self.pillow_frames = [] self.pillow_frame = 0 + self.scaling = scaling + p_char = p_char.lower().decode('utf-8') original_path = AOpath+"characters/"+p_char+"/"+emote_prefix+p_emote+".gif" @@ -347,7 +348,7 @@ class AOCharMovie(QtGui.QLabel): self.show() - def play_pre(self, p_char, p_emote, duration): + def play_pre(self, p_char, p_emote, duration, scaling = SCALING_AUTO): p_char = p_char.lower() gif_path = AOpath+"characters/"+p_char+"/"+p_emote+".gif" apng_path = AOpath+"characters/"+p_char+"/"+p_emote+".apng" @@ -392,9 +393,9 @@ class AOCharMovie(QtGui.QLabel): self.m_movie.setSpeed(int(percentage_modifier)) self.pillow_speed = percentage_modifier / 100. - self.play(p_char, p_emote, "") + self.play(p_char, p_emote, "", scaling) - def play_talking(self, p_char, p_emote): + def play_talking(self, p_char, p_emote, scaling = SCALING_AUTO): p_char = p_char.lower() gif_path = AOpath + 'characters/' + p_char + '/(b)' + p_emote + '.gif' @@ -406,9 +407,9 @@ class AOCharMovie(QtGui.QLabel): self.play_once = False self.m_movie.setSpeed(100) self.pillow_speed = 1 - self.play(p_char, p_emote, '(b)') + self.play(p_char, p_emote, '(b)', scaling) - def play_idle(self, p_char, p_emote): + def play_idle(self, p_char, p_emote, scaling = SCALING_AUTO): p_char = p_char.lower() gif_path = AOpath + 'characters/' + p_char + '/(a)' + p_emote + '.gif' @@ -420,18 +421,28 @@ class AOCharMovie(QtGui.QLabel): self.play_once = False self.m_movie.setSpeed(100) self.pillow_speed = 1 - self.play(p_char, p_emote, '(a)') + self.play(p_char, p_emote, '(a)', scaling) def stop(self): self.m_movie.stop() self.preanim_timer.stop() self.hide() + + def get_transform(self, smooth_condition=True): + if self.scaling == SCALING_PIXEL: + return QtCore.Qt.FastTransformation + elif self.scaling == SCALING_SMOOTH: + return QtCore.Qt.SmoothTransformation + elif smooth_condition: + return QtCore.Qt.SmoothTransformation + else: + return QtCore.Qt.FastTransformation @QtCore.pyqtSlot(int) def frame_change(self, n_frame): f_img = self.m_movie.currentImage().mirrored(self.m_flipped, False) - if not f_img.isNull() and (f_img.size().width() != VIEWPORT_W or f_img.size().height() != VIEWPORT_H): - f_img = f_img.scaled(VIEWPORT_W, VIEWPORT_H, QtCore.Qt.KeepAspectRatioByExpanding, QtCore.Qt.FastTransformation) + if not f_img.isNull(): + f_img = f_img.scaled(VIEWPORT_W, VIEWPORT_H, QtCore.Qt.KeepAspectRatioByExpanding, self.get_transform(f_img.size().height() > VIEWPORT_H)) f_pixmap = QtGui.QPixmap.fromImage(f_img) self.setPixmap(f_pixmap) @@ -457,8 +468,8 @@ class AOCharMovie(QtGui.QLabel): def set_pillow_frame(self): f_img = self.pillow_frames[self.pillow_frame][0].mirrored(self.m_flipped, False) - if not f_img.isNull() and (f_img.size().width() != VIEWPORT_W or f_img.size().height() != VIEWPORT_H): - f_img = f_img.scaled(VIEWPORT_W, VIEWPORT_H, QtCore.Qt.KeepAspectRatioByExpanding, QtCore.Qt.FastTransformation) + if not f_img.isNull(): + f_img = f_img.scaled(VIEWPORT_W, VIEWPORT_H, QtCore.Qt.KeepAspectRatioByExpanding, self.get_transform(f_img.size().height() > VIEWPORT_H)) f_pixmap = QtGui.QPixmap.fromImage(f_img) self.setPixmap(f_pixmap) @@ -689,6 +700,7 @@ class gui(QtGui.QWidget): charid = -1 login = False privateinv = False + scaling = [SCALING_AUTO, SCALING_AUTO] #ICchat = QtCore.pyqtSignal(str, str, str, str, str, str, int, int, int, int, int, int, int, int) #ICchat = QtCore.pyqtSignal(list) @@ -2338,13 +2350,17 @@ class gui(QtGui.QWidget): self.effectview.raise_() self.objectionview.raise_() self.whiteflashlab.raise_() + + self.scaling[1] = self.get_scaling(ini.read_ini(AOpath + 'characters/' + self.m_chatmessage[OTHER_NAME] + '/char.ini', "options", "scaling").lower()) self.sidechar.set_flipped(self.m_chatmessage[OTHER_FLIP] == "1") - self.sidechar.play_idle(self.m_chatmessage[OTHER_NAME], self.m_chatmessage[OTHER_EMOTE]) + self.sidechar.play_idle(self.m_chatmessage[OTHER_NAME], self.m_chatmessage[OTHER_EMOTE], self.scaling[1]) else: self.sidechar.hide() self.sidechar.move(0, 0) + + self.scaling[0] = self.get_scaling(ini.read_ini(AOpath + 'characters/' + self.m_chatmessage[CHARNAME] + '/char.ini', "options", "scaling").lower()) if (emote_mod == 1 or emote_mod == 2 or emote_mod == 6) and self.m_chatmessage[PREANIM] != "-": # sfx_delay = int(self.m_chatmessage[SFX_DELAY]) * 60 @@ -2358,7 +2374,15 @@ class gui(QtGui.QWidget): self.handle_chatmessage_3() else: self.play_preanim(True) - + + def get_scaling(self, scaling_str): + if scaling_str == "pixel" or scaling_str == "fast": + return SCALING_PIXEL + elif scaling_str == "smooth": + return SCALING_SMOOTH + else: + return SCALING_AUTO + def play_preanim(self, noninterrupting): f_char = self.m_chatmessage[CHARNAME] f_preanim = self.m_chatmessage[PREANIM] @@ -2383,7 +2407,7 @@ class gui(QtGui.QWidget): self.anim_state = 1 self.preanim_done() - self.char.play_pre(f_char, f_preanim, preanim_duration) + self.char.play_pre(f_char, f_preanim, preanim_duration, self.scaling[0]) if noninterrupting: self.anim_state = 4 else: @@ -2456,10 +2480,10 @@ class gui(QtGui.QWidget): f_emote = self.m_chatmessage[ANIM] if f_anim_state == 2: - self.char.play_talking(f_char, f_emote) + self.char.play_talking(f_char, f_emote, self.scaling[0]) self.anim_state = 2 else: - self.char.play_idle(f_char, f_emote) + self.char.play_idle(f_char, f_emote, self.scaling[0]) self.anim_state = 3 if exists(AOpath+"callwords.ini"): @@ -2564,7 +2588,7 @@ class gui(QtGui.QWidget): self.text_state = 2 if self.anim_state != 4: self.anim_state = 3 - self.char.play_idle(self.m_chatmessage[CHARNAME], self.m_chatmessage[ANIM]) + self.char.play_idle(self.m_chatmessage[CHARNAME], self.m_chatmessage[ANIM], self.scaling[0]) else: f_character2 = f_message[self.tick_pos] f_character = QtCore.QString(f_character2) @@ -2609,7 +2633,7 @@ class gui(QtGui.QWidget): if not self.entire_message_is_blue and self.anim_state != 4: f_char = self.m_chatmessage[CHARNAME] f_emote = self.m_chatmessage[ANIM] - self.char.play_idle(f_char, f_emote) + self.char.play_idle(f_char, f_emote, self.scaling[0]) elif f_character == ")" and not self.next_character_is_not_special and self.inline_color_stack: if self.inline_color_stack[-1] == INLINE_BLUE: @@ -2625,7 +2649,7 @@ class gui(QtGui.QWidget): if self.inline_blue_depth == 0 and self.anim_state != 4 and not (self.tick_pos+1 >= len(f_message)): f_char = self.m_chatmessage[CHARNAME] f_emote = self.m_chatmessage[ANIM] - self.char.play_talking(f_char, f_emote) + self.char.play_talking(f_char, f_emote, self.scaling[0]) else: self.next_character_is_not_special = True self.tick_pos -= 1 diff --git a/mainmenu.py b/mainmenu.py index 3cb72cd..7a4e44f 100644 --- a/mainmenu.py +++ b/mainmenu.py @@ -626,7 +626,7 @@ class AOServerInfo(QtCore.QThread): type = int(network[0]) areas[type] = [network[i] for i in range(1, len(network))] areas_len = len(areas[type]) - print '[client]', 'the server has %d areas' % areas_len + print '[client]', 'The server has %d areas' % areas_len for i in range(areas_len): areas[4].append(musiclist[0]) del musiclist[0]