diff --git a/AO2XP.py b/AO2XP.py index 1cf0fe3..f42b8e9 100644 --- a/AO2XP.py +++ b/AO2XP.py @@ -1,10 +1,15 @@ +import sys, thread, time, ctypes +from os.path import exists + +debugmode = len(sys.argv) > 1 and sys.argv[1] == "debug" +if not debugmode: + if not exists("bass.dll"): + ctypes.windll.user32.MessageBoxA(0, "couldn't find the file 'bass.dll' on the client folder.\nthis program needs this file in order to play sounds and music.\nthe file is included in this client's zip file, make sure it's in the same folder as the AO2XP.exe", "unable to launch game", 0) + sys.exit(1) + from PyQt4 import QtGui, QtCore from pybass import * -import sys, thread, time -from os.path import exists -import ctypes - -import gameview, mainmenu, options +import gameview, mainmenu, options, ini class gamewindow(QtGui.QMainWindow): def __init__(self): @@ -32,7 +37,6 @@ class gamewindow(QtGui.QMainWindow): def showGame(self, tcp, charlist, musiclist, background, evidence, areas, features=[], oocjoin=[], hplist=[]): self.gamewidget.disconnectnow = False self.gamewidget.startGame(tcp, charlist, musiclist, background, evidence, areas, features, oocjoin, hplist) - self.setFixedSize(714, 668) self.stackwidget.setCurrentWidget(self.gamewidget) def returnToMenu(self): @@ -45,21 +49,14 @@ class gamewindow(QtGui.QMainWindow): def showSettings(self): self.settingsgui.showSettings() -debugmode = False -if len(sys.argv) > 1: - if sys.argv[1] == "debug": - debugmode = True - if not debugmode: if not exists("base"): - ctypes.windll.user32.MessageBoxA(0, "i couldn't find the holy mother of all important folders that goes by the name of 'base'.\nto fix this, you can try:\n1. downloading a full vanilla copy of Attorney Online 2, and copy the 'base' folder over to this client's location\n2. making sure you extracted the client in the right location", "unable to launch game", 0) - sys.exit(1) - elif not exists("bass.dll"): - ctypes.windll.user32.MessageBoxA(0, "i couldn't find the file 'bass.dll'\nthis program needs this file in order to play sounds and music\nthe file is included in this client's zip file, make sure it's in the same folder as this EXE", "unable to launch game", 0) + ctypes.windll.user32.MessageBoxA(0, "The 'base' folder appears to be missing.\nDownload the original Attorney Online client below,\nthen extract the 'base' folder from the zip to the AO2XP folder.\n\nhttp://aceattorneyonline.com", "unable to launch game", 0) sys.exit(1) -BASS_Init(-1, 44100, 0, 0, 0) +BASS_Init(ini.read_ini_int("base/AO2XP.ini", "Audio", "device", -1), 44100, 0, 0, 0) +BASS_PluginLoad("bassopus", 0) app = QtGui.QApplication(sys.argv) shit = gamewindow() shit.show() -sys.exit(app.exec_()) \ No newline at end of file +sys.exit(app.exec_()) diff --git a/buttons.py b/buttons.py index f85f290..a924dba 100644 --- a/buttons.py +++ b/buttons.py @@ -1,8 +1,8 @@ from PyQt4 import QtCore, QtGui import os -#AOpath = "base\\" -AOpath = "I:\\aovanilla1.7.5\\client\\base\\" +AOpath = "base\\" +#AOpath = "I:\\aovanilla1.7.5\\client\\base\\" class RealizationButton(QtGui.QLabel): pressed = False @@ -155,6 +155,7 @@ class PenaltyBars(QtGui.QLabel): plusClicked = QtCore.pyqtSignal(int) def __init__(self, parent, type): super(PenaltyBars, self).__init__(parent) + self.parent = parent self.penaltybars = [] self.type = type self.health = 10 @@ -167,6 +168,7 @@ class PenaltyBars(QtGui.QLabel): for i in range(11): self.penaltybars.append(QtGui.QPixmap(AOpath+"themes\\default\\prosecutionbar"+str(i)+".png")) side = "pro" + self.side = side self.minusbtn = PixmapButton(parent, QtGui.QPixmap(AOpath+"themes\\default\\"+side+"minus.png")) self.plusbtn = PixmapButton(parent, QtGui.QPixmap(AOpath+"themes\\default\\"+side+"plus.png")) self.minusbtn.clicked.connect(self.minusClick) @@ -188,8 +190,10 @@ class PenaltyBars(QtGui.QLabel): self.minusClicked.emit(self.type) def setHealth(self, health): + self.minusbtn.setPixmap(QtGui.QPixmap(AOpath+"themes\\default\\"+self.side+"minus.png")) + self.plusbtn.setPixmap(QtGui.QPixmap(AOpath+"themes\\default\\"+self.side+"plus.png")) self.setPixmap(self.penaltybars[health]) self.health = health def getHealth(self): - return self.health \ No newline at end of file + return self.health diff --git a/charselect.py b/charselect.py index 0cdaa47..37ba793 100644 --- a/charselect.py +++ b/charselect.py @@ -4,8 +4,13 @@ from os.path import exists from functools import partial from buttons import PixmapButton -#AOpath = "base\\" -AOpath = "I:\\aovanilla1.7.5\\client\\base\\" +AOpath = "base/" +#AOpath = "I:/aovanilla1.7.5/client/base/" + +def get_option(section, value, default=""): + tempini = ConfigParser() + tempini.read("base/ao2xp.ini") + return ini.read_ini(tempini, section, value, default) class CharIcon(QtGui.QLabel): def __init__(self, parent, ind): @@ -23,7 +28,7 @@ class charselect(QtGui.QWidget): self.parent = parent self.page = 0 self.image = QtGui.QLabel(self) - self.image.setPixmap(QtGui.QPixmap(AOpath+"themes\\default\\charselect_background.png")) + self.image.setPixmap(QtGui.QPixmap(AOpath+"themes/default/charselect_background.png")) self.image.show() self.quittolobby = QtGui.QPushButton(self) @@ -46,7 +51,7 @@ class charselect(QtGui.QWidget): for i in range(self.max_chars_on_page): self.buttons.append(CharIcon(self, i)) self.chartaken.append(QtGui.QLabel(self)) - self.chartaken[i].setPixmap(QtGui.QPixmap(AOpath+"themes\\default\\char_taken.png")) + self.chartaken[i].setPixmap(QtGui.QPixmap(AOpath+"themes/default/char_taken.png")) self.chartaken[i].hide() x_pos = (btn_width + x_spacing) * x_mod_count @@ -60,11 +65,11 @@ class charselect(QtGui.QWidget): y_mod_count += 1 x_mod_count = 0 - self.prevpage = PixmapButton(self, QtGui.QPixmap(AOpath+"themes\\default\\arrow_left.png")) + self.prevpage = PixmapButton(self, QtGui.QPixmap(AOpath+"themes/default/arrow_left.png")) self.prevpage.move(left - self.prevpage.pixmap.size().width(), top + height) self.prevpage.clicked.connect(self.prevPageButton) self.prevpage.show() - self.nextpage = PixmapButton(self, QtGui.QPixmap(AOpath+"themes\\default\\arrow_right.png")) + self.nextpage = PixmapButton(self, QtGui.QPixmap(AOpath+"themes/default/arrow_right.png")) self.nextpage.move(left + width, top + height) self.nextpage.clicked.connect(self.nextPageButton) self.nextpage.show() @@ -106,10 +111,10 @@ class charselect(QtGui.QWidget): else: self.prevpage.hide() - if exists(AOpath+"characters\\"+self.charlist[ind][0]+"\\char_icon.png"): # AO2 - self.setBtnImage.emit(AOpath+"characters\\"+self.charlist[ind][0]+"\\char_icon.png", i) - elif exists(AOpath+"misc\\demothings\\"+self.charlist[ind][0]+"_char_icon.png"): # AO 1.7.5/1.8 - self.setBtnImage.emit(AOpath+"misc\\demothings\\"+self.charlist[ind][0]+"_char_icon.png", i) + if exists(AOpath+"characters/"+self.charlist[ind][0]+"/char_icon.png"): # AO2 + self.setBtnImage.emit(AOpath+"characters/"+self.charlist[ind][0]+"/char_icon.png", i) + elif exists(AOpath+"misc/demothings/"+self.charlist[ind][0]+"_char_icon.png"): # AO 1.7.5/1.8 + self.setBtnImage.emit(AOpath+"misc/demothings/"+self.charlist[ind][0]+"_char_icon.png", i) else: self.setBtnImage.emit("placeholder.png", i) @@ -124,4 +129,8 @@ class charselect(QtGui.QWidget): self.buttons[ind].setPixmap(QtGui.QPixmap(filename)) def onCharClicked(self, ind): - self.parent.tcp.send("CC#0#"+str(ind+(self.page*self.max_chars_on_page))+"#ur mom gay#%") \ No newline at end of file + self.parent.tcp.send("CC#0#"+str(ind+(self.page*self.max_chars_on_page))+"#ur mom gay#%") + + def show(self): + super(charselect, self).show() + self.parent.gamewindow.setFixedSize(714, 668) diff --git a/gameview.py b/gameview.py index 38a752f..82abec3 100644 --- a/gameview.py +++ b/gameview.py @@ -5,8 +5,8 @@ from os.path import exists from functools import partial from ConfigParser import ConfigParser -#AOpath = "base/" -AOpath = 'I:/aovanilla1.7.5/client/base/' +AOpath = "base/" +#AOpath = 'I:/aovanilla1.7.5/client/base/' PREANIM = 2 CHARNAME = 3 @@ -59,7 +59,12 @@ def decode_ao_str(text): def get_char_ini(char, section, value, default=""): tempini = ConfigParser() - tempini.read(AOpath + 'characters\\' + char + '\\char.ini') + tempini.read(AOpath + 'characters/' + char + '/char.ini') + return ini.read_ini(tempini, section, value, default) + +def get_option(section, value, default=""): + tempini = ConfigParser() + tempini.read("base/ao2xp.ini") return ini.read_ini(tempini, section, value, default) def get_text_color(textcolor): @@ -67,7 +72,7 @@ def get_text_color(textcolor): return QtGui.QColor(255, 255, 255) elif textcolor == 1: return QtGui.QColor(0, 255, 0) - elif textcolor == 2: #OH FUCK MOD + elif textcolor == 2: # OH FUCK MOD return QtGui.QColor(255, 0, 0) elif textcolor == 3: return QtGui.QColor(255, 165, 0) @@ -130,6 +135,8 @@ class ChatLogs(QtGui.QTextEdit): self.logfile = open("chatlogs/IC_%d%.2d%.2d_on_%.2d.%.2d.%.2d.txt" % (currtime[0], currtime[1], currtime[2], currtime[3], currtime[4], currtime[5]), "w") else: self.logfile = open("chatlogs/OOC_%d%.2d%.2d_on_%.2d.%.2d.%.2d.txt" % (currtime[0], currtime[1], currtime[2], currtime[3], currtime[4], currtime[5]), "w") + else: + self.logfile = None def __del__(self): if self.savelog: @@ -178,7 +185,7 @@ class AOCharMovie(QtGui.QLabel): self.m_flipped = flip def play(self, p_char, p_emote, emote_prefix): - if p_emote[0] == "/" or p_emote[0] == "\\": + if p_emote[0] == "/" or p_emote[0] == "/": p_emote = p_emote[1:] elif "../../characters" in p_emote: print p_emote @@ -188,9 +195,9 @@ class AOCharMovie(QtGui.QLabel): emote_prefix = "" p_emote = emote - original_path = AOpath+"characters\\"+p_char+"\\"+emote_prefix+p_emote+".gif" - alt_path = AOpath+"characters\\"+p_char+"\\"+p_emote+".png" - placeholder_path = AOpath+"themes\\default\\placeholder.gif" + original_path = AOpath+"characters/"+p_char+"/"+emote_prefix+p_emote+".gif" + alt_path = AOpath+"characters/"+p_char+"/"+p_emote+".png" + placeholder_path = AOpath+"themes/default/placeholder.gif" gif_path = "" if exists(original_path): @@ -199,8 +206,8 @@ class AOCharMovie(QtGui.QLabel): if ini.read_ini_bool(AOpath+"AO2XP.ini", "General", "download characters"): url = "http://s3.wasabisys.com/webao/base/characters/"+p_char.lower()+"/"+emote_prefix+p_emote.lower()+".gif" url = url.replace(" ", "%20") - if not exists(AOpath+"characters\\"+p_char): # gotta make sure the character folder exists, better safe than sorry - os.mkdir(AOpath+"characters\\"+p_char) + if not exists(AOpath+"characters/"+p_char): # gotta make sure the character folder exists, better safe than sorry + os.mkdir(AOpath+"characters/"+p_char) thread.start_new_thread(download_thread, (url, original_path)) if exists(alt_path): @@ -209,14 +216,14 @@ class AOCharMovie(QtGui.QLabel): if ini.read_ini_bool(AOpath+"AO2XP.ini", "General", "download characters"): url = "http://s3.wasabisys.com/webao/base/characters/"+p_char.lower()+"/"+p_emote.lower()+".png" url = url.replace(" ", "%20") - if not exists(AOpath+"characters\\"+p_char): # gotta make sure the character folder exists, better safe than sorry - os.mkdir(AOpath+"characters\\"+p_char) + if not exists(AOpath+"characters/"+p_char): # gotta make sure the character folder exists, better safe than sorry + os.mkdir(AOpath+"characters/"+p_char) thread.start_new_thread(download_thread, (url, alt_path)) - if exists(placeholder_path): - gif_path = placeholder_path - else: - gif_path = "" + if exists(placeholder_path): + gif_path = placeholder_path + else: + gif_path = "" self.m_movie.stop() self.m_movie.setFileName(gif_path) @@ -225,7 +232,7 @@ class AOCharMovie(QtGui.QLabel): self.m_movie.start() def play_pre(self, p_char, p_emote, duration): - gif_path = AOpath+"characters\\"+p_char+"\\"+p_emote+".gif" + gif_path = AOpath+"characters/"+p_char+"/"+p_emote+".gif" self.m_movie.stop() self.clear() @@ -261,7 +268,7 @@ class AOCharMovie(QtGui.QLabel): self.play(p_char, p_emote, "") def play_talking(self, p_char, p_emote): - gif_path = AOpath + 'characters\\' + p_char + '\\(b)' + p_emote + '.gif' + gif_path = AOpath + 'characters/' + p_char + '/(b)' + p_emote + '.gif' self.m_movie.stop() self.clear() @@ -273,7 +280,7 @@ class AOCharMovie(QtGui.QLabel): self.play(p_char, p_emote, '(b)') def play_idle(self, p_char, p_emote): - gif_path = AOpath + 'characters\\' + p_char + '\\(a)' + p_emote + '.gif' + gif_path = AOpath + 'characters/' + p_char + '/(a)' + p_emote + '.gif' self.m_movie.stop() self.clear() @@ -291,7 +298,11 @@ class AOCharMovie(QtGui.QLabel): @QtCore.pyqtSlot(int) def frame_change(self, n_frame): - f_pixmap = QtGui.QPixmap.fromImage(self.m_movie.currentImage().mirrored(self.m_flipped, False)) + f_img = self.m_movie.currentImage().mirrored(self.m_flipped, False) + if f_img.size().width() != 256 or f_img.size().height() != 192: + f_img = f_img.scaled(256, 192, transformMode=QtCore.Qt.SmoothTransformation) + + f_pixmap = QtGui.QPixmap.fromImage(f_img) self.setPixmap(f_pixmap) if self.m_movie.frameCount() - 1 == n_frame and self.play_once: @@ -321,12 +332,12 @@ class AOMovie(QtGui.QLabel): custom_path = "" if p_gif == "custom": - custom_path = AOpath+"characters\\"+p_char+"\\"+p_gif+".gif" + custom_path = AOpath+"characters/"+p_char+"/"+p_gif+".gif" else: - custom_path = AOpath+"characters\\"+p_char+"\\"+p_gif+"_bubble.gif" + custom_path = AOpath+"characters/"+p_char+"/"+p_gif+"_bubble.gif" - theme_path = AOpath+"themes\\default\\"+p_gif+".gif" - placeholder_path = AOpath+"themes\\default\\placeholder.gif" + theme_path = AOpath+"themes/default/"+p_gif+".gif" + placeholder_path = AOpath+"themes/default/placeholder.gif" if exists(custom_path): gif_path = custom_path @@ -370,9 +381,9 @@ class ZoomLines(QtGui.QLabel): return self.show() if dir == 0: - self.movie.setFileName(AOpath + 'themes\\default\\defense_speedlines.gif') + self.movie.setFileName(AOpath + 'themes/default/defense_speedlines.gif') else: - self.movie.setFileName(AOpath + 'themes\\default\\prosecution_speedlines.gif') + self.movie.setFileName(AOpath + 'themes/default/prosecution_speedlines.gif') self.movie.start() @@ -403,14 +414,14 @@ class WTCE_View(QtGui.QLabel): def showWTCE(self, wtce, variant=0): self.finished() if wtce == 'testimony1': - self.movie.setFileName(AOpath + 'themes\\default\\witnesstestimony.gif') + self.movie.setFileName(AOpath + 'themes/default/witnesstestimony.gif') elif wtce == 'testimony2': - self.movie.setFileName(AOpath + 'themes\\default\\crossexamination.gif') + self.movie.setFileName(AOpath + 'themes/default/crossexamination.gif') elif wtce == "judgeruling": if variant == 0: - self.movie.setFileName(AOpath + 'themes\\default\\notguilty.gif') + self.movie.setFileName(AOpath + 'themes/default/notguilty.gif') elif variant == 1: - self.movie.setFileName(AOpath + 'themes\\default\\guilty.gif') + self.movie.setFileName(AOpath + 'themes/default/guilty.gif') else: return self.show() @@ -496,11 +507,11 @@ class gui(QtGui.QWidget): self.sidechar.hide() self.bench = QtGui.QLabel(self.viewport) - bench = QtGui.QPixmap(AOpath + 'background\\default\\defensedesk.png') - self.court.setPixmap(QtGui.QPixmap(AOpath + 'background\\default\\defenseempty.png')) + bench = QtGui.QPixmap(AOpath + 'background/default/defensedesk.png') + self.court.setPixmap(QtGui.QPixmap(AOpath + 'background/default/defenseempty.png')) self.bench.setPixmap(bench) self.chatbox = QtGui.QLabel(self) - chatbox = QtGui.QPixmap(AOpath + 'themes\\default\\chatmed.png') + chatbox = QtGui.QPixmap(AOpath + 'themes/default/chatmed.png') chatboxheight = chatbox.size().height() self.chatbox.setPixmap(chatbox) self.chatbox.move(0, 192 - chatboxheight) @@ -533,7 +544,7 @@ class gui(QtGui.QWidget): self.objectionview.done.connect(self.objection_done) self.whiteflashlab = QtGui.QLabel(self) - self.whiteflashlab.setPixmap(QtGui.QPixmap(AOpath + 'themes\\default\\realizationflash.png')) + self.whiteflashlab.setPixmap(QtGui.QPixmap(AOpath + 'themes/default/realizationflash.png')) self.whiteflashlab.setGeometry(0, 0, 256, 192) self.whiteflashlab.hide() self.whiteflash = QtCore.QTimer() @@ -542,30 +553,22 @@ class gui(QtGui.QWidget): self.ooclog = ChatLogs(self, 1) self.ooclog.setReadOnly(True) - self.ooclog.setGeometry(714 - 288, 0, 288, 256) self.ooclog.setStyleSheet('background-color: rgb(139, 139, 139);') self.ooclog.textChanged.connect(self.ooclog_update) self.oocnameinput = QtGui.QLineEdit(self) self.oocnameinput.setPlaceholderText('Enter a name...') - self.oocnameinput.resize(self.oocnameinput.sizeHint().width() - 32, self.oocnameinput.sizeHint().height()) self.oocnameinput.setStyleSheet('background-color: rgb(139, 139, 139);') - self.oocnameinput.move(714 - 288, 256) self.oocinput = QtGui.QLineEdit(self) self.oocinput.setPlaceholderText('Server chat/OOC chat...') self.oocinput.setStyleSheet('background-color: rgb(139, 139, 139);') - self.oocinput.resize(187, self.oocinput.sizeHint().height()) - self.oocinput.move(714 - 288 + self.oocnameinput.size().width(), 256) self.oocinput.returnPressed.connect(self.onOOCreturn) self.ooclogin = QtGui.QPushButton("Login", self) - self.ooclogin.resize(48, 20) - self.ooclogin.move(714 - (self.ooclogin.size().width()), self.oocinput.y() + self.ooclogin.size().height()) self.ooclogin.clicked.connect(self.onOOCLoginBtn) self.musicitems = QtGui.QListWidget(self) - self.musicitems.setGeometry(714 - 288, 348, 288, 320) self.musicitems.itemDoubleClicked.connect(self.onMusicClick) self.gametabs = QtGui.QTabWidget(self) @@ -579,41 +582,30 @@ class gui(QtGui.QWidget): self.icLog = ChatLogs(self.gametab_log, 0, self.ooclog.logfile) self.icLog.setReadOnly(True) - self.icLog.setGeometry(8, 8, 714 - 304 - 22, 212) self.icLog.textChanged.connect(self.icLogChanged) self.evidencedropdown = QtGui.QComboBox(self.gametab_evidence) - self.evidencedropdown.setGeometry(8, 8, 192, 20) self.evidencedropdown.currentIndexChanged.connect(self.changeEvidence) self.evidencedesc = QtGui.QTextEdit(self.gametab_evidence) self.evidencedesc.setReadOnly(True) - self.evidencedesc.setGeometry(8, 108, 714 - 304 - 22, 112) self.evidenceimage = QtGui.QLabel(self.gametab_evidence) - self.evidenceimage.setPixmap(QtGui.QPixmap(AOpath + 'evidence\\empty.png')) - self.evidenceimage.setGeometry(326, 8, 70, 70) + self.evidenceimage.setPixmap(QtGui.QPixmap(AOpath + 'evidence/empty.png')) self.evidenceimage.show() self.evidenceadd = QtGui.QPushButton(self.gametab_evidence) self.evidenceadd.setText('Add') - self.evidenceadd.move(8, 32) self.evidenceadd.clicked.connect(self.onAddEvidence) self.evidenceedit = QtGui.QPushButton(self.gametab_evidence) self.evidenceedit.setText('Edit') - self.evidenceedit.move(8, 56) self.evidenceedit.clicked.connect(self.onEditEvidence) self.evidencedelete = QtGui.QPushButton(self.gametab_evidence) self.evidencedelete.setText('Delete') - self.evidencedelete.move(8, 80) self.evidencedelete.clicked.connect(self.onDeleteEvidence) self.evidencepresent = PresentButton(self, self.gametab_evidence) - self.evidencepresent.move((714 - 304 - 22) / 2 - self.evidencepresent.button_off.size().width() / 2, self.evidencedesc.y() - self.evidencepresent.button_off.size().height()) self.msgqueueList = QtGui.QListWidget(self.gametab_msgqueue) - self.msgqueueList.setGeometry(8, 8, 714 - 304 - 22, 180) self.msgqueueList.itemClicked.connect(self.onClicked_msgqueue) self.removeQueue = QtGui.QPushButton(self.gametab_msgqueue) self.removeQueue.setText('Delete') - self.removeQueue.resize(self.removeQueue.sizeHint()) - self.removeQueue.move(8, self.msgqueueList.size().height() + 16) self.removeQueue.clicked.connect(self.onClicked_removeQueue) self.unmutedlist = QtGui.QListWidget(self.gametab_mute) @@ -626,54 +618,35 @@ class gui(QtGui.QWidget): self.mutedlabel.setText('Muted') self.mutebtn.setText('>>') self.unmutebtn.setText('<<') - self.notmutedlabel.move(8, 8) - self.unmutedlist.setGeometry(8, 24, 160, 192) - self.mutedlist.setGeometry(238, 24, 160, 192) - self.mutedlabel.move(238 + self.mutedlist.size().width() - self.mutedlist.size().width() - 8, 8) - self.mutebtn.setGeometry((714 - 304) / 2 - 26, 64, 48, 32) - self.unmutebtn.setGeometry((714 - 304) / 2 - 26, 128, 48, 32) self.mutebtn.clicked.connect(self.onMuteClick) self.unmutebtn.clicked.connect(self.onUnmuteClick) self.mutedlist.itemClicked.connect(self.changeMuteIndex) self.unmutedlist.itemClicked.connect(self.changeUnmuteIndex) self.iniswaplist = QtGui.QComboBox(self.gametab_iniswap) - self.iniswaplist.setGeometry(8, 8, 192, self.iniswaplist.sizeHint().height()) self.iniswaplist.currentIndexChanged.connect(self.iniswap_index_change) self.iniswapconfirm = QtGui.QPushButton(self.gametab_iniswap) self.iniswapconfirm.setText('Swap') - self.iniswapconfirm.resize(self.iniswapconfirm.sizeHint()) - self.iniswapconfirm.move(714 - 304 - 22 - self.iniswapconfirm.size().width(), 8) self.iniswapconfirm.clicked.connect(self.iniswap_confirm) self.iniswapreset = QtGui.QPushButton(self.gametab_iniswap) self.iniswapreset.setText('Reset') - self.iniswapreset.resize(self.iniswapconfirm.size()) - self.iniswapreset.move(714 - 304 - 22 - self.iniswapconfirm.size().width(), 16 + self.iniswapconfirm.size().height()) self.iniswapreset.clicked.connect(self.resetIniSwap) self.iniswapinfo = QtGui.QLabel(self.gametab_iniswap) self.iniswapinfo.setText('Not swapped') - self.iniswapinfo.setGeometry(8, 32, 192, 24) self.iniswaprefresh = QtGui.QPushButton(self.gametab_iniswap) self.iniswaprefresh.setText('Refresh characters') - self.iniswaprefresh.resize(self.iniswaprefresh.sizeHint()) - self.iniswaprefresh.move(8, 64) self.iniswaprefresh.clicked.connect(self.loadSwapCharacters) self.paircheckbox = QtGui.QCheckBox(self.gametab_pair) self.paircheckbox.setChecked(False) - self.paircheckbox.setGeometry(16, 16, 128, 24) self.pairdropdown = QtGui.QComboBox(self.gametab_pair) - self.pairdropdown.setGeometry(112, 64, 192, 18) self.pairdropdown_l = QtGui.QLabel("Pair with...", self.gametab_pair) self.pairdropdown_l.move(self.pairdropdown.x() - 64, self.pairdropdown.y()+2) self.pairoffset = QtGui.QSlider(QtCore.Qt.Horizontal, self.gametab_pair) self.pairoffset.setRange(-100, 100) self.pairoffset.setValue(0) - self.pairoffset.setGeometry(114, 128, 192, 24) self.pairoffset_l = QtGui.QLabel("Position offset", self.gametab_pair) - self.pairoffset_l.move(self.pairoffset.x() - 88, self.pairoffset.y()+4) self.pairoffsetreset = QtGui.QPushButton("Reset", self.gametab_pair) - self.pairoffsetreset.move(self.pairoffset.x() + self.pairoffset.size().width() + 8, self.pairoffset.y()) self.pairoffsetreset.clicked.connect(partial(self.pairoffset.setValue, 0)) self.misc_layout = QtGui.QVBoxLayout(self.gametab_misc) @@ -684,17 +657,13 @@ class gui(QtGui.QWidget): self.spacebartext = QtGui.QCheckBox() self.spacebartext.setChecked(False) self.spacebartext.setText("S p a c i n g") - self.spacebartext.move(self.mocktext.x(), self.mocktext.y()+24) self.autocaps = QtGui.QCheckBox() self.autocaps.setChecked(False) self.autocaps.setText("Automatic caps and period") - self.autocaps.move(self.spacebartext.x(), self.spacebartext.y()+24) self.misc_layout.addWidget(self.mocktext) self.misc_layout.addWidget(self.spacebartext) self.misc_layout.addWidget(self.autocaps) - self.gametabs.move(8, 402) - self.gametabs.resize(714 - 304, 256) self.gametabs.addTab(self.gametab_log, 'Game log') self.gametabs.addTab(self.gametab_evidence, 'Evidence') self.gametabs.addTab(self.gametab_msgqueue, 'Message queue') @@ -777,7 +746,7 @@ class gui(QtGui.QWidget): self.nextemotepage = NextEmoteButton(self, 236, 253) self.nextemotepage.show() self.realizationbtn = buttons.RealizationButton(self, 265, 192) - self.realizationsnd = BASS_StreamCreateFile(False, AOpath + 'sounds\\general\\sfx-realization.wav', 0, 0, 0) + self.realizationsnd = BASS_StreamCreateFile(False, AOpath + 'sounds/general/sfx-realization.wav', 0, 0, 0) self.customobject = buttons.CustomObjection(self, 250, 312) self.holditbtn = buttons.Objections(self, 10, 312, 1) self.objectbtn = buttons.Objections(self, 90, 312, 2) @@ -823,21 +792,14 @@ class gui(QtGui.QWidget): self.musicslider.setValue(100) self.soundslider.setValue(100) self.blipslider.setValue(100) - self.musicslider.setGeometry(self.oocnameinput.x(), self.oocnameinput.y()+24, 192, 16) - self.soundslider.setGeometry(self.oocnameinput.x(), self.oocnameinput.y()+48, 192, 16) - self.blipslider.setGeometry(self.oocnameinput.x(), self.oocnameinput.y()+72, 192, 16) self.musicslider.sliderMoved.connect(self.changeMusicVolume) self.soundslider.sliderMoved.connect(self.changeSoundVolume) self.blipslider.valueChanged.connect(self.changeBlipVolume) self.sliderlabel1 = QtGui.QLabel("Music", self) self.sliderlabel2 = QtGui.QLabel("SFX", self) self.sliderlabel3 = QtGui.QLabel("Blips", self) - self.sliderlabel1.move(self.musicslider.x() + self.musicslider.size().width()+8, self.musicslider.y()) - self.sliderlabel2.move(self.soundslider.x() + self.soundslider.size().width()+8, self.soundslider.y()) - self.sliderlabel3.move(self.blipslider.x() + self.blipslider.size().width()+8, self.blipslider.y()) self.pinglabel = QtGui.QLabel(self) - self.pinglabel.setGeometry(self.sliderlabel3.x() + 32, self.sliderlabel3.y(), 96, 14) self.name.show() self.char.show() @@ -928,15 +890,12 @@ class gui(QtGui.QWidget): self.showname = str(text.toUtf8()) def setEvidenceImg(self, guiobj, image): - f_image = str(image) - f_guiobj = str(guiobj) - - if exists(AOpath + 'evidence\\' + f_image): - exec f_guiobj+'.setPixmap(QtGui.QPixmap(AOpath+"evidence/%s"))' % f_image + if exists(AOpath + 'evidence/' + image): + guiobj.setPixmap(QtGui.QPixmap(AOpath + "evidence/%s" % image)) else: - exec f_guiobj+".setPixmap(QtGui.QPixmap(AOpath + 'themes\\default\\evidence_selected.png'))" + guiobj.setPixmap(QtGui.QPixmap(AOpath + 'themes/default/evidence_selected.png')) if ini.read_ini_bool(AOpath+"AO2XP.ini", "General", "download evidence"): - url = "http://s3.wasabisys.com/webao/base/evidence/"+f_image.lower() + url = "http://s3.wasabisys.com/webao/base/evidence/"+image.lower() url = url.replace("evidence/../", "") path = AOpath+"evidence/"+image path = path.replace("evidence/../", "") @@ -1031,6 +990,8 @@ class gui(QtGui.QWidget): self.tcp.send("RT#judgeruling#" +str(variant)+ "#%") def loadCharacter(self, charname): + exec open("base/ao2xp_themes/"+get_option("General", "theme", "default")+"/theme.py") + self.emotedropdown.clear() self.msgqueueList.clear() self.msgqueue = [] @@ -1091,9 +1052,9 @@ class gui(QtGui.QWidget): for n_emote in range(emotes_on_page): n_real_emote = n_emote + self.current_emote_page * self.max_emotes_on_page if n_real_emote == self.selectedemote: - self.emotebuttons[n_emote].setPixmap(QtGui.QPixmap(AOpath + 'characters\\' + self.charname + '\\emotions\\button' + str(n_real_emote + 1) + '_on.png')) + self.emotebuttons[n_emote].setPixmap(QtGui.QPixmap(AOpath + 'characters/' + self.charname + '/emotions/button' + str(n_real_emote + 1) + '_on.png')) else: - self.emotebuttons[n_emote].setPixmap(QtGui.QPixmap(AOpath + 'characters\\' + self.charname + '\\emotions\\button' + str(n_real_emote + 1) + '_off.png')) + self.emotebuttons[n_emote].setPixmap(QtGui.QPixmap(AOpath + 'characters/' + self.charname + '/emotions/button' + str(n_real_emote + 1) + '_off.png')) self.emotebuttons[n_emote].show() def iniswap_index_change(self, ind): @@ -1103,7 +1064,7 @@ class gui(QtGui.QWidget): self.charsfolder = [] self.iniswaplist.clear() for folder in os.listdir(AOpath + 'characters'): - if exists(AOpath + 'characters\\' + folder + '\\char.ini'): + if exists(AOpath + 'characters/' + folder + '/char.ini'): self.charsfolder.append(folder) self.iniswaplist.addItem(folder) @@ -1143,7 +1104,7 @@ class gui(QtGui.QWidget): self.tcp.send("ZZ#%") def onClick_changeChar(self): - self.tcp.send('RD#%') + #self.tcp.send('RD#%') self.charselect.show() def changeFlipCheck(self, on): @@ -1177,10 +1138,7 @@ class gui(QtGui.QWidget): return self.selectedevi = ind self.evidencedesc.setText(self.evidence[ind][1]) - evithread = anythingThread('setEvidenceImg(QString, QString)', "self.evidenceimage", self.evidence[ind][2]) - self.connect(evithread, QtCore.SIGNAL('setEvidenceImg(QString, QString)'), self.setEvidenceImg) - evithread.start() - del evithread + self.setEvidenceImg(self.evidenceimage, self.evidence[ind][2]) def buttonthread(self, ind, img): if ind < self.max_emotes_on_page: @@ -1195,9 +1153,9 @@ class gui(QtGui.QWidget): self.selectedemote = ind for button in self.emotebuttons: if button.emoteid == ind: - button.setPixmap(QtGui.QPixmap(AOpath + 'characters\\' + self.charname + '\\emotions\\button' + str(button.emoteid + self.current_emote_page * self.max_emotes_on_page + 1) + '_on.png')) + button.setPixmap(QtGui.QPixmap(AOpath + 'characters/' + self.charname + '/emotions/button' + str(button.emoteid + self.current_emote_page * self.max_emotes_on_page + 1) + '_on.png')) else: - button.setPixmap(QtGui.QPixmap(AOpath + 'characters\\' + self.charname + '\\emotions\\button' + str(button.emoteid + self.current_emote_page * self.max_emotes_on_page + 1) + '_off.png')) + button.setPixmap(QtGui.QPixmap(AOpath + 'characters/' + self.charname + '/emotions/button' + str(button.emoteid + self.current_emote_page * self.max_emotes_on_page + 1) + '_off.png')) def setChatColor(self, ind): self.mychatcolor = ind @@ -1259,7 +1217,7 @@ class gui(QtGui.QWidget): self.oocinput.clear() def onICreturn(self): - text = str(self.icchatinput.text().toUtf8()).replace('#', '').replace('%', '').replace('&', '').replace('$', '').replace('\\n', '\n') + text = str(self.icchatinput.text().toUtf8()).replace('#', '').replace('%', '').replace('&', '').replace('$', '').replace('/n', '\n') if not text: return @@ -1352,17 +1310,18 @@ class gui(QtGui.QWidget): self.realizationbtn.setPressed(False) def setBackground(self, bg): - if not exists(AOpath + 'background\\' + bg): + if not exists(AOpath + 'background/' + bg): bg = 'default' - self.side_def = QtGui.QPixmap(AOpath + 'background\\' + bg + '\\defenseempty.png') - self.bench_def = QtGui.QPixmap(AOpath + 'background\\' + bg + '\\defensedesk.png') - self.side_pro = QtGui.QPixmap(AOpath + 'background\\' + bg + '\\prosecutorempty.png') - self.bench_pro = QtGui.QPixmap(AOpath + 'background\\' + bg + '\\prosecutiondesk.png') - self.side_wit = QtGui.QPixmap(AOpath + 'background\\' + bg + '\\witnessempty.png') - self.bench_wit = QtGui.QPixmap(AOpath + 'background\\' + bg + '\\stand.png') - self.side_hld = QtGui.QPixmap(AOpath + 'background\\' + bg + '\\helperstand.png') - self.side_hlp = QtGui.QPixmap(AOpath + 'background\\' + bg + '\\prohelperstand.png') - self.side_jud = QtGui.QPixmap(AOpath + 'background\\' + bg + '\\judgestand.png') + self.side_def = QtGui.QPixmap(AOpath + 'background/' + bg + '/defenseempty.png') + self.bench_def = QtGui.QPixmap(AOpath + 'background/' + bg + '/defensedesk.png') + self.side_pro = QtGui.QPixmap(AOpath + 'background/' + bg + '/prosecutorempty.png') + self.bench_pro = QtGui.QPixmap(AOpath + 'background/' + bg + '/prosecutiondesk.png') + self.side_wit = QtGui.QPixmap(AOpath + 'background/' + bg + '/witnessempty.png') + self.bench_wit = QtGui.QPixmap(AOpath + 'background/' + bg + '/stand.png') + self.side_hld = QtGui.QPixmap(AOpath + 'background/' + bg + '/helperstand.png') + self.side_hlp = QtGui.QPixmap(AOpath + 'background/' + bg + '/prohelperstand.png') + self.side_jud = QtGui.QPixmap(AOpath + 'background/' + bg + '/judgestand.png') + self.side_sea = QtGui.QPixmap(AOpath + 'background/' + bg + '/seance.png') def netmsg_hp(self, type, health): if type == 1: @@ -1520,6 +1479,10 @@ class gui(QtGui.QWidget): self.court.setPixmap(self.side_jud) self.bench.hide() self.presentedevi.move(16, 16) + elif side == 'sea': + self.bench.hide() + self.court.setPixmap(self.side_jud if self.side_sea.isNull() else self.side_sea) + self.presentedevi.move(16, 16) def objection_done(self): self.handle_chatmessage_2() @@ -1560,7 +1523,11 @@ class gui(QtGui.QWidget): self.sidechar.move(0,0) self.char.move(0,0) else: - got_other_charid = int(self.m_chatmessage[OTHER_CHARID]) + if "effects" in self.features: + got_other_charid = int(self.m_chatmessage[OTHER_CHARID].split("^")[0]) + else: + got_other_charid = int(self.m_chatmessage[OTHER_CHARID]) + if got_other_charid > -1: self.sidechar.show() @@ -1632,7 +1599,7 @@ class gui(QtGui.QWidget): self.sidechar.move(0, 0) self.char.move(0, 0) - if emote_mod == 1 or emote_mod == 2 or emote_mod == 6: + if (emote_mod == 1 or emote_mod == 6 and self.m_chatmessage[PREANIM] != "-") or emote_mod == 2: self.play_preanim(False) elif emote_mod == 0 or emote_mod == 5: if self.m_chatmessage[NO_INTERRUPT] == "0": @@ -1654,7 +1621,7 @@ class gui(QtGui.QWidget): else: preanim_duration = ao2_duration - anim_to_find = AOpath+"characters\\"+f_char+"\\"+f_preanim+".gif" + anim_to_find = AOpath+"characters/"+f_char+"/"+f_preanim+".gif" if not exists(anim_to_find) or preanim_duration < 0: if noninterrupting: self.anim_state = 4 @@ -1695,7 +1662,7 @@ class gui(QtGui.QWidget): f_image = self.evidence[f_evi_id-1][2] is_left_side = not (f_side == "def" or f_side == "hlp" or f_side == "jud" or f_side == "jur") - self.setEvidenceImg("self.presentedevi", f_image) + self.setEvidenceImg(self.presentedevi, f_image) if not is_left_side: self.presentedevi.move(170, 16) @@ -1777,7 +1744,7 @@ class gui(QtGui.QWidget): charid = int(self.m_chatmessage[CHAR_ID]) self.blip = self.charlist[charid][2] - self.blipsnd = BASS_StreamCreateFile(False, AOpath+"sounds\\general\\sfx-blip"+self.blip+".wav", 0, 0, 0) + self.blipsnd = BASS_StreamCreateFile(False, AOpath+"sounds/general/sfx-blip"+self.blip+".wav", 0, 0, 0) BASS_ChannelSetAttribute(self.blipsnd, BASS_ATTRIB_VOL, self.blipslider.value() / 100.0) self.text_state = 1 @@ -1947,16 +1914,16 @@ class gui(QtGui.QWidget): objecting = 'custom' if objecting: - if exists(AOpath + 'characters\\' + charname + '\\' + objecting + '.wav'): - self.objectsnd = BASS_StreamCreateFile(False, AOpath + 'characters\\' + charname + '\\' + objecting + '.wav', 0, 0, 0) + if exists(AOpath + 'characters/' + charname + '/' + objecting + '.wav'): + self.objectsnd = BASS_StreamCreateFile(False, AOpath + 'characters/' + charname + '/' + objecting + '.wav', 0, 0, 0) else: self.objectsnd = None if ini.read_ini_bool(AOpath+"AO2XP.ini", "General", "download sounds"): - if not exists(AOpath+"characters\\"+charname.lower()): # gotta make sure the character folder exists, better safe than sorry - os.mkdir(AOpath+"characters\\"+charname.lower()) + if not exists(AOpath+"characters/"+charname.lower()): # gotta make sure the character folder exists, better safe than sorry + os.mkdir(AOpath+"characters/"+charname.lower()) thread.start_new_thread(download_thread, ("http://s3.wasabisys.com/webao/base/characters/"+charname.lower()+"/"+objecting.lower()+".wav", AOpath+"characters/"+charname.lower()+"/"+objecting.lower()+".wav")) - self.objectsnd = BASS_StreamCreateFile(False, AOpath + 'sounds\\general\\sfx-objection.wav', 0, 0, 0) + self.objectsnd = BASS_StreamCreateFile(False, AOpath + 'sounds/general/sfx-objection.wav', 0, 0, 0) BASS_ChannelSetAttribute(self.objectsnd, BASS_ATTRIB_VOL, self.soundslider.value() / 100.0) BASS_ChannelPlay(self.objectsnd, True) @@ -1972,8 +1939,8 @@ class gui(QtGui.QWidget): if BASS_ChannelIsActive(self.sound): BASS_ChannelStop(self.sound) BASS_StreamFree(self.sound) - if exists(AOpath + 'sounds\\general\\' + sfx + '.wav'): - self.sound = BASS_StreamCreateFile(False, AOpath + 'sounds\\general\\' + sfx + '.wav', 0, 0, 0) + if exists(AOpath + 'sounds/general/' + sfx + '.wav'): + self.sound = BASS_StreamCreateFile(False, AOpath + 'sounds/general/' + sfx + '.wav', 0, 0, 0) BASS_ChannelSetAttribute(self.sound, BASS_ATTRIB_VOL, self.soundslider.value() / 100.0) BASS_ChannelPlay(self.sound, True) @@ -1985,15 +1952,21 @@ class gui(QtGui.QWidget): if BASS_ChannelIsActive(self.music): BASS_ChannelStop(self.music) BASS_StreamFree(self.music) - if exists(AOpath + 'sounds\\music\\' + mus): - self.music = BASS_StreamCreateFile(False, AOpath + 'sounds\\music\\' + mus, 0, 0, 0) + + if exists(AOpath + 'sounds/music/' + mus): + self.music = BASS_StreamCreateFile(False, AOpath + 'sounds/music/' + mus, 0, 0, 0) BASS_ChannelSetAttribute(self.music, BASS_ATTRIB_VOL, self.musicslider.value() / 100.0) BASS_ChannelPlay(self.music, True) + elif ini.read_ini_bool(AOpath+"AO2XP.ini", "General", "download music"): - self.music = BASS_StreamCreateURL('http://s3.wasabisys.com/webao/base/sounds/music/' + mus.lower(), 0, 0, DOWNLOADPROC(), 0) + self.music = BASS_StreamCreateURL('http://s3.wasabisys.com/webao/base/sounds/music/' + mus.lower() if not mus.lower().startswith("http") else mus, 0, BASS_STREAM_BLOCK, DOWNLOADPROC(), 0) if self.music: BASS_ChannelSetAttribute(self.music, BASS_ATTRIB_VOL, self.musicslider.value() / 100.0) BASS_ChannelPlay(self.music, True) + else: + self.music = BASS_StreamCreateURL('http://s3.wasabisys.com/aov-webao/base/sounds/music/' + mus.lower() if not mus.lower().startswith("http") else mus, 0, BASS_STREAM_BLOCK, DOWNLOADPROC(), 0) + BASS_ChannelSetAttribute(self.music, BASS_ATTRIB_VOL, self.musicslider.value() / 100.0) + BASS_ChannelPlay(self.music, True) def stopMusic(self): if self.music: @@ -2052,7 +2025,7 @@ class gui(QtGui.QWidget): self.healthbars.emit(hp[0], hp[1]) for char in self.charlist: - if not exists(AOpath + 'characters\\' + char[0] + '\\char.ini'): + if not exists(AOpath + 'characters/' + char[0] + '/char.ini'): continue char[2] = get_char_ini(char[0], "options", "gender", "male") @@ -2078,17 +2051,14 @@ class gui(QtGui.QWidget): else: self.icLog.append(logstart) - bgthread = setBackgroundThread(background) - self.connect(bgthread, QtCore.SIGNAL('setBackground(QString)'), self.setBackground) - bgthread.start() - del bgthread + self.setBackground(background) for msg in oocjoin: self.ooclog.append(msg) for song in musiclist: songitem = QtGui.QListWidgetItem() songitem.setText(song) - if exists(AOpath + 'sounds\\music\\' + song): + if exists(AOpath + 'sounds/music/' + song): songitem.setBackgroundColor(QtGui.QColor(128, 255, 128)) else: songitem.setBackgroundColor(QtGui.QColor(255, 128, 128)) @@ -2099,8 +2069,30 @@ class gui(QtGui.QWidget): self.tcpthread = TCP_Thread(self) self.tcpthread.MS_Chat.connect(self.netmsg_ms) self.tcpthread.newChar.connect(self.loadCharacter) + self.tcpthread.newBackground.connect(self.setBackground) + self.tcpthread.OOC_Log.connect(self.ooclog.append) + self.tcpthread.IC_Log.connect(self.icLog.append) + self.tcpthread.charSlots.connect(partial(self.charselect.setCharList, self.charlist)) + self.tcpthread.showCharSelect.connect(self.charselect.show) + self.tcpthread.allEvidence.connect(self.allEvidence) + self.tcpthread.rainbowColor.connect(self.text.setStyleSheet) self.tcpthread.start() + def allEvidence(self, evi): + self.evidence = evi + if self.evidencedropdown.count() > 0: + self.evidencedropdown.clear() + for evi in self.evidence: + evi[0] = evi[0].decode('utf-8') + evi[1] = evi[1].decode('utf-8') + evi[2] = evi[2].decode('utf-8') + self.evidencedropdown.addItem(evi[0]) + + if not self.evidence: + self.evidencedropdown.setCurrentIndex(0) + self.evidencedesc.setText('.') + else: + self.evidencedropdown.setCurrentIndex(self.selectedevi) class ButtonThread(QtCore.QThread): @@ -2154,8 +2146,8 @@ class PresentButton(QtGui.QLabel): def __init__(self, gamegui, parent): super(PresentButton, self).__init__(parent) self.gamegui = gamegui - self.button_off = QtGui.QPixmap(AOpath + 'themes\\default\\present_disabled.png') - self.button_on = QtGui.QPixmap(AOpath + 'themes\\default\\present.png') + self.button_off = QtGui.QPixmap(AOpath + 'themes/default/present_disabled.png') + self.button_on = QtGui.QPixmap(AOpath + 'themes/default/present.png') self.setPixmap(self.button_off) self.show() @@ -2168,19 +2160,20 @@ class PresentButton(QtGui.QLabel): class EditEvidenceDialog(QtGui.QDialog): - def __init__(self, gamegui): super(EditEvidenceDialog, self).__init__() self.gamegui = gamegui self.setWindowTitle('Add evidence') self.resize(512, 384) + self.setModal(True) + self.eviname = QtGui.QLineEdit(self) self.eviname.setGeometry(8, 8, 384, 24) self.evidesc = QtGui.QTextEdit(self) self.evidesc.setGeometry(8, 192, 496, 160) self.evipicture = QtGui.QLabel(self) self.filename = 'empty.png' - evipic = QtGui.QPixmap(AOpath + 'evidence\\empty.png') + evipic = QtGui.QPixmap(AOpath + 'evidence/empty.png') self.evipicture.setPixmap(evipic) self.evipicture.move(434, 8) self.evipicture.show() @@ -2218,10 +2211,10 @@ class EditEvidenceDialog(QtGui.QDialog): def choosePicChange(self, ind): self.filename = self.filenames[ind] - if exists(AOpath + 'evidence\\' + self.filename): - self.evipicture.setPixmap(QtGui.QPixmap(AOpath + 'evidence\\' + self.filename)) + if exists(AOpath + 'evidence/' + self.filename): + self.evipicture.setPixmap(QtGui.QPixmap(AOpath + 'evidence/' + self.filename)) else: - self.evipicture.setPixmap(QtGui.QPixmap(AOpath + 'themes\\default\\evidence_selected.png')) + self.evipicture.setPixmap(QtGui.QPixmap(AOpath + 'themes/default/evidence_selected.png')) def onSave(self): name = self.eviname.text().toUtf8() @@ -2232,7 +2225,7 @@ class EditEvidenceDialog(QtGui.QDialog): self.gamegui.tcp.send('PE#' + name + '#' + desc + '#' + self.filename + '#%') self.eviname.setText('') self.evidesc.setText('') - evipic = QtGui.QPixmap(AOpath + 'evidence\\empty.png') + evipic = QtGui.QPixmap(AOpath + 'evidence/empty.png') self.evipicture.setPixmap(evipic) self.filename = 'empty.png' self.editing = False @@ -2243,7 +2236,7 @@ class EditEvidenceDialog(QtGui.QDialog): def onCancel(self): self.eviname.setText('') self.evidesc.setText('') - evipic = QtGui.QPixmap(AOpath + 'evidence\\empty.png') + evipic = QtGui.QPixmap(AOpath + 'evidence/empty.png') self.evipicture.setPixmap(evipic) self.filename = 'empty.png' self.editing = False @@ -2305,7 +2298,7 @@ class BackEmoteButton(QtGui.QLabel): super(BackEmoteButton, self).__init__(gamewindow) self.gamewindow = gamewindow self.move(x, y) - self.setPixmap(QtGui.QPixmap(AOpath + 'themes\\default\\arrow_left.png')) + self.setPixmap(QtGui.QPixmap(AOpath + 'themes/default/arrow_left.png')) self.show() def mousePressEvent(self, event): @@ -2319,7 +2312,7 @@ class NextEmoteButton(QtGui.QLabel): super(NextEmoteButton, self).__init__(gamewindow) self.gamewindow = gamewindow self.move(x, y) - self.setPixmap(QtGui.QPixmap(AOpath + 'themes\\default\\arrow_right.png')) + self.setPixmap(QtGui.QPixmap(AOpath + 'themes/default/arrow_right.png')) self.show() def mousePressEvent(self, event): @@ -2328,8 +2321,17 @@ class NextEmoteButton(QtGui.QLabel): class TCP_Thread(QtCore.QThread): + connectionError = QtCore.pyqtSignal(str, str, str) MS_Chat = QtCore.pyqtSignal(list) newChar = QtCore.pyqtSignal(str) + newBackground = QtCore.pyqtSignal(str) + IC_Log = QtCore.pyqtSignal(str) + OOC_Log = QtCore.pyqtSignal(str) + charSlots = QtCore.pyqtSignal() + showCharSelect = QtCore.pyqtSignal() + allEvidence = QtCore.pyqtSignal(list) + rainbowColor = QtCore.pyqtSignal(str) + def __init__(self, parent): super(TCP_Thread, self).__init__(parent) self.parent = parent @@ -2358,7 +2360,8 @@ class TCP_Thread(QtCore.QThread): rainbow += 5 if rainbow > 255: rainbow = 0 - self.parent.text.setStyleSheet('color: rgb(' + str(color.red()) + ', ' + str(color.green()) + ', ' + str(color.blue()) + ')') + #self.parent.text.setStyleSheet('color: rgb(' + str(color.red()) + ', ' + str(color.green()) + ', ' + str(color.blue()) + ')') + self.rainbowColor.emit('color: rgb(' + str(color.red()) + ', ' + str(color.green()) + ', ' + str(color.blue()) + ')') if sendtick: sendtick -= 1 @@ -2417,20 +2420,20 @@ class TCP_Thread(QtCore.QThread): if len(network) > 3: name += " ("+network[3].decode("utf-8")+")" - self.parent.icLog.append('[%d:%.2d] %s changed the music to %s' % (t[3], t[4], name, music)) + #self.parent.icLog.append('[%d:%.2d] %s changed the music to %s' % (t[3], t[4], name, music)) + self.IC_Log.emit('[%d:%.2d] %s changed the music to %s' % (t[3], t[4], name, music)) else: - self.parent.icLog.append('[%d:%.2d] the music was changed to %s' % (t[3], t[4], music)) + self.IC_Log.emit('[%d:%.2d] the music was changed to %s' % (t[3], t[4], music)) self.parent.playMusic(music) + elif header == 'BN': - imgthread = setBackgroundThread(network[1]) - self.parent.connect(imgthread, QtCore.SIGNAL('setBackground(QString)'), self.parent.setBackground) - imgthread.start() - del imgthread + self.newBackground.emit(network[1]) elif header == 'CT': name = network[1].decode('utf-8').replace('', '$').replace('', '%').replace('', '&').replace('', '#').replace('', '#') chatmsg = network[2].decode('utf-8').replace('', '$').replace('', '%').replace('', '&').replace('', '#').replace('', '#').replace("\n", "
") - self.parent.ooclog.append('%s: %s' % (name, chatmsg)) + #self.parent.ooclog.append('%s: %s' % (name, chatmsg)) + self.OOC_Log.emit("%s: %s" % (name, chatmsg)) elif header == 'PV': self.parent.mychar = int(network[3]) @@ -2441,34 +2444,22 @@ class TCP_Thread(QtCore.QThread): elif header == 'LE': del network[0] - self.parent.evidence = [ evi.split('&') for evi in network ] - if self.parent.evidencedropdown.count() > 0: - self.parent.evidencedropdown.clear() - for evi in self.parent.evidence: - evi[0] = evi[0].decode('utf-8') - evi[1] = evi[1].decode('utf-8') - evi[2] = evi[2].decode('utf-8') - self.parent.evidencedropdown.addItem(evi[0]) + self.allEvidence.emit([evi.split('&') for evi in network]) - if not self.parent.evidence: - self.parent.evidencedropdown.setCurrentIndex(0) - self.parent.evidencedesc.setText('.') - else: - self.parent.evidencedropdown.setCurrentIndex(self.parent.selectedevi) elif header == 'ZZ': if self.parent.modcall: BASS_ChannelPlay(self.parent.modcall, False) if len(network) > 1: - self.parent.ooclog.append('[MOD CALL] ' + network[1].replace("\n", "
") + '
') + self.OOC_Log.emit('[MOD CALL] ' + network[1].replace("\n", "
") + '
') else: - self.parent.ooclog.append('[MOD CALL] But there was no extra information. (old server?)') + self.OOC_Log.emit('[MOD CALL] But there was no extra information. (old server?)') elif header == 'CharsCheck': del network[0] for i in range(len(network)): self.parent.charlist[i][1] = int(network[i]) - self.parent.charselect.setCharList(self.parent.charlist) + self.charSlots.emit() elif header == 'RT': testimony = network[1] @@ -2501,4 +2492,4 @@ class TCP_Thread(QtCore.QThread): self.parent.gotPing.emit(int((pingafter - pingbefore)*1000)) elif header == 'DONE': - self.parent.charselect.show() \ No newline at end of file + self.showCharSelect.emit() diff --git a/mainmenu.py b/mainmenu.py index 45cdeba..4d9d96a 100644 --- a/mainmenu.py +++ b/mainmenu.py @@ -1,10 +1,10 @@ # -*- coding: utf-8 -*- from PyQt4 import QtGui, QtCore -import socket, thread, time, random +import socket, thread, time, random, traceback, uuid from os.path import exists -#AOpath = "base\\" -AOpath = "I:\\aovanilla1.7.5\\client\\base\\" +AOpath = "base/" +#AOpath = "I:/aovanilla1.7.5/client/base/" class PicButton(QtGui.QAbstractButton): def __init__(self, pixmap, parent=None): @@ -26,6 +26,9 @@ class lobby(QtGui.QWidget): tcp = None tab = 0 msgbox_signal = QtCore.pyqtSignal(int, str, str) + moveToGameSignal = QtCore.pyqtSignal(list) + gotServers = QtCore.pyqtSignal(list) + gotOOCMsg = QtCore.pyqtSignal(str, str) def __init__(self, parent=None): super(lobby, self).__init__(parent) @@ -33,14 +36,17 @@ class lobby(QtGui.QWidget): self.connecting = False self.svclicked = None self.gamewindow = parent - self.pix_lobby = QtGui.QPixmap(AOpath+'themes\\default\\lobbybackground.png') - self.pix_btn_public = QtGui.QPixmap(AOpath+'themes\\default\\publicservers.png') - self.pix_btn_favs = QtGui.QPixmap(AOpath+'themes\\default\\favorites.png') - self.pix_btn_refresh = QtGui.QPixmap(AOpath+'themes\\default\\refresh.png') - self.pix_btn_addfav = QtGui.QPixmap(AOpath+'themes\\default\\addtofav.png') - self.pix_btn_connect = QtGui.QPixmap(AOpath+'themes\\default\\connect.png') - self.pix_connecting = QtGui.QPixmap(AOpath+'themes\\default\\loadingbackground.png') + self.pix_lobby = QtGui.QPixmap(AOpath+'themes/default/lobbybackground.png') + self.pix_btn_public = QtGui.QPixmap(AOpath+'themes/default/publicservers.png') + self.pix_btn_favs = QtGui.QPixmap(AOpath+'themes/default/favorites.png') + self.pix_btn_refresh = QtGui.QPixmap(AOpath+'themes/default/refresh.png') + self.pix_btn_addfav = QtGui.QPixmap(AOpath+'themes/default/addtofav.png') + self.pix_btn_connect = QtGui.QPixmap(AOpath+'themes/default/connect.png') + self.pix_connecting = QtGui.QPixmap(AOpath+'themes/default/loadingbackground.png') self.msgbox_signal.connect(self.showMessageBox) + self.moveToGameSignal.connect(self.moveToGame) + self.gotServers.connect(self.onGetServers) + self.gotOOCMsg.connect(self.newOOCMessage) if exists(AOpath+'serverlist.txt'): with open(AOpath+'serverlist.txt') as file: @@ -57,7 +63,7 @@ class lobby(QtGui.QWidget): self.connectingimg.hide() self.clientver = QtGui.QLabel(self) - self.clientver.setText('AO2XP 1.2 by Headshot') + self.clientver.setText('AO2XP 1.4 by Headshot') self.clientver.resize(self.clientver.sizeHint()) self.clientver.move(self.pix_lobby.size().width() - self.clientver.size().width(), 0) @@ -158,7 +164,34 @@ class lobby(QtGui.QWidget): self.joinooc = [] thread.start_new_thread(self.connect_to_ms, ()) - + + def onGetServers(self, servers): + self.serverlist.clear() + self.actual_serverlist = [] + del servers[0] + del servers[-1] + for svcontent in servers: + server = svcontent.split('&') + del server[-1] + name = server[0].decode('utf-8') + desc = server[1].decode('utf-8') + if len(server) <= 2: + ip = '0.0.0.0' + port = 0 + elif len(server) == 3: + ip = server[2] + port = 27017 + elif len(server) == 4: + ip = server[2] + port = int(server[3]) + serveritem = QtGui.QListWidgetItem(name) + self.serverlist.addItem(serveritem) + self.actual_serverlist.append((ip, port, name, desc)) + + def moveToGame(self, stuff): + tcp, charlist, musiclist, background, evidence, areas, features, joinooc, hplist = stuff + self.move_to_game(tcp, charlist, musiclist, background, evidence, areas, features, joinooc, hplist) + def onSettingsClicked(self): self.gamewindow.showSettings() @@ -275,6 +308,7 @@ class lobby(QtGui.QWidget): hplist = [] areas = [[], [], [], []] features = [] + charlist = None pingtimer = 150 readytick = -1 text = item.text() @@ -307,9 +341,9 @@ class lobby(QtGui.QWidget): if readytick == 0: readytick = -1 try: - self.move_to_game(self.tcp, charlist, musiclist, background, evidence, areas, features, self.joinooc, hplist) + self.moveToGameSignal.emit([self.tcp, charlist, musiclist, background, evidence, areas, features, self.joinooc, hplist]) except Exception as err: - self.msgbox_signal.emit(0, "Error caught while loading", str(err)) + self.msgbox_signal.emit(0, "Error caught while loading", traceback.format_exc(err)) self.onClicked_cancelconnect() return @@ -348,17 +382,17 @@ class lobby(QtGui.QWidget): got_stuff = True elif header == "decryptor": - self.tcp.send("HI#vidya is a fucking shitshow#%") + self.tcp.send("HI#AO2XP %s#%%" % uuid.UUID(int=uuid.getnode())) elif header == "ID": - self.tcp.send("ID#AO2#69.1337.420#%") #need to send this to tsuserver3 servers in order to get feature list (FL) + self.tcp.send("ID#AO2#69.1337.420#%") # need to send this to tsuserver3 servers in order to get feature list (FL) elif header == "FL": features = network[1:] print features elif header == 'BD': - reason = network[1].decode("utf-8") #new in AO2 2.6 + reason = network[1].decode("utf-8") if len(network) > 1 else "Failed to receive ban reason (old server version?)" # new in AO2 2.6 self.onlineplayers.setText('Banned') self.msgbox_signal.emit(0, "Banned", "Reason:\n"+reason) self.tcp.close() @@ -397,7 +431,7 @@ class lobby(QtGui.QWidget): print '[client]', 'received songs (%d)' % len(musiclist) elif header == 'CharsCheck': - if not self.connecting: + if not self.connecting or not charlist: continue network.pop(0) network.pop(len(network)-1) @@ -478,6 +512,9 @@ class lobby(QtGui.QWidget): def lobbychatlog_update(self): self.lobbychatlog.verticalScrollBar().setValue(self.lobbychatlog.verticalScrollBar().maximum()) + def newOOCMessage(self, name, text): + self.lobbychatlog.append('%s: %s' % (name, text)) + def connect_to_ms(self): tempdata = "" self.ms_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM) @@ -506,39 +543,19 @@ class lobby(QtGui.QWidget): header = network[0] if header == "servercheok": - self.ms_tcp.send('HI#haha lol mods are gay#%ID#AO2XP by Headshot#1.2#%') + self.ms_tcp.send('HI#ao 2.8 apng will kill me#%ID#AO2XP by Headshot#1.4#%') self.ms_tcp.send("ALL#%") elif header == 'DOOM': print 'banned from masterserver' - self.msgbox_signal.emit(0, "WHEEZE", "You've been exiled from AO.\nWow, great job, now everyone hates you lmao") + self.msgbox_signal.emit(0, "WHEEZE", "You are exiled from AO") self.ms_tcp.close() thread.exit() elif header == 'ALL': - self.serverlist.clear() - self.actual_serverlist = [] - network.pop(0) - network.pop(len(network) - 1) - for svcontent in network: - server = svcontent.split('&') - del server[len(server)-1] - name = server[0].decode('utf-8') - desc = server[1].decode('utf-8') - if len(server) <= 2: - ip = '0.0.0.0' - port = 0 - elif len(server) == 3: - ip = server[2] - port = 27017 - elif len(server) == 4: - ip = server[2] - port = int(server[3]) - serveritem = QtGui.QListWidgetItem(name) - self.serverlist.addItem(serveritem) - self.actual_serverlist.append((ip, port, name, desc)) + self.gotServers.emit(network) elif header == 'CT': name = network[1].decode("utf-8").replace('', '$').replace('', '%').replace('', '&').replace('', '#').replace('', '#') chatmsg = network[2].decode("utf-8").replace('', '$').replace('', '%').replace('', '&').replace('', '#').replace('', '#') - self.lobbychatlog.append('%s: %s' % (name, chatmsg)) \ No newline at end of file + self.gotOOCMsg.emit(name, chatmsg) diff --git a/options.py b/options.py index 8d62e32..51b4792 100644 --- a/options.py +++ b/options.py @@ -1,18 +1,21 @@ from PyQt4 import QtGui, QtCore +from pybass import * from ConfigParser import ConfigParser from os.path import exists +from os import listdir import ini -#AOpath = "base\\" -AOpath = "I:\\aovanilla1.7.5\\client\\base\\" +AOpath = "base/" +#AOpath = "I:\\aovanilla1.7.5\\client\\base\\" -class Settings(QtGui.QWidget): +class Settings(QtGui.QDialog): def __init__(self): super(Settings, self).__init__() + self.setModal(True) self.inifile = ConfigParser() self.setWindowTitle("Settings") - self.setFixedSize(320, 480) + self.setFixedSize(400, 400) self.hide() main_layout = QtGui.QVBoxLayout(self) @@ -23,9 +26,13 @@ class Settings(QtGui.QWidget): self.tabs.move(8, 8) general_tab = QtGui.QWidget() + audio_tab = QtGui.QWidget() callwords_tab = QtGui.QWidget() general_layout = QtGui.QVBoxLayout(general_tab) general_layout.setAlignment(QtCore.Qt.AlignTop) + audio_layout = QtGui.QFormLayout(audio_tab) + audio_layout.setLabelAlignment(QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) + audio_layout.setFormAlignment(QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop) callwords_layout = QtGui.QVBoxLayout(callwords_tab) callwords_layout.setAlignment(QtCore.Qt.AlignTop) @@ -37,7 +44,7 @@ class Settings(QtGui.QWidget): cancelbtn.clicked.connect(self.onCancelClicked) separators = [] - for i in range(2): + for i in range(4): separator = QtGui.QFrame() separator.setFixedSize(separator.size().width(), 16) separators.append(separator) @@ -67,6 +74,16 @@ class Settings(QtGui.QWidget): allowdownload_layout.addWidget(self.allowdownload_sounds) allowdownload_layout.addWidget(self.allowdownload_music) allowdownload_layout.addWidget(self.allowdownload_evidence) + + currtheme_layout = QtGui.QHBoxLayout() + currtheme_label = QtGui.QLabel("Current theme") + self.currtheme = QtGui.QComboBox() + self.themes = listdir(AOpath+"ao2xp_themes") + for theme in self.themes: + if exists(AOpath+"ao2xp_themes/"+theme+"/theme.py"): + self.currtheme.addItem(theme) + currtheme_layout.addWidget(currtheme_label) + currtheme_layout.addWidget(self.currtheme) savechangeswarn = QtGui.QLabel() savechangeswarn.setText("* Change takes effect upon restarting the client") @@ -78,8 +95,23 @@ class Settings(QtGui.QWidget): general_layout.addWidget(separators[1]) general_layout.addWidget(allowdownload) general_layout.addLayout(allowdownload_layout) + general_layout.addWidget(separators[2]) + general_layout.addLayout(currtheme_layout) general_layout.addWidget(savechangeswarn, 50, QtCore.Qt.AlignBottom) - + + ###### Audio tab ###### + device_label = QtGui.QLabel("Audio device") + self.device_list = QtGui.QComboBox() + audio_layout.setWidget(0, QtGui.QFormLayout.LabelRole, device_label) + audio_layout.setWidget(0, QtGui.QFormLayout.FieldRole, self.device_list) + audio_layout.setWidget(1, QtGui.QFormLayout.FieldRole, separators[3]) + + info = BASS_DEVICEINFO() + ind = 0 + while BASS_GetDeviceInfo(ind, info): + self.device_list.addItem(info.name) + ind += 1 + ###### Callwords tab ###### self.callwords_edit = QtGui.QTextEdit() @@ -95,6 +127,7 @@ class Settings(QtGui.QWidget): callwords_layout.addWidget(callwords_instructions) self.tabs.addTab(general_tab, "General") + self.tabs.addTab(audio_tab, "Audio") self.tabs.addTab(callwords_tab, "Callwords") save_layout.addWidget(savebtn, 100, QtCore.Qt.AlignRight) @@ -115,6 +148,8 @@ class Settings(QtGui.QWidget): self.allowdownload_sounds.setChecked(ini.read_ini_bool(self.inifile, "General", "download sounds")) self.allowdownload_music.setChecked(ini.read_ini_bool(self.inifile, "General", "download music")) self.allowdownload_evidence.setChecked(ini.read_ini_bool(self.inifile, "General", "download evidence")) + self.currtheme.setCurrentIndex(self.themes.index(ini.read_ini(self.inifile, "General", "theme", "default"))) + self.device_list.setCurrentIndex(ini.read_ini_int(self.inifile, "Audio", "device", BASS_GetDevice())) else: self.savetolog.setChecked(False) self.savetolog_combine.setChecked(False) @@ -122,6 +157,8 @@ class Settings(QtGui.QWidget): self.allowdownload_sounds.setChecked(True) self.allowdownload_music.setChecked(True) self.allowdownload_evidence.setChecked(True) + self.currtheme.setCurrentIndex(self.themes.index("default")) + self.device_list.setCurrentIndex(BASS_GetDevice()) self.callwords_edit.clear() if exists(AOpath+"callwords.ini"): @@ -139,8 +176,8 @@ class Settings(QtGui.QWidget): self.callwords_edit.setWordWrapMode(0) def onSaveClicked(self): - if not self.inifile.has_section("General"): - self.inifile.add_section("General") + if not self.inifile.has_section("General"): self.inifile.add_section("General") + if not self.inifile.has_section("Audio"): self.inifile.add_section("Audio") self.inifile.set("General", "save logs", self.savetolog.isChecked()) self.inifile.set("General", "combined logs", self.savetolog_combine.isChecked()) self.inifile.set("General", "OOC name", self.defaultoocname.text().toUtf8()) @@ -148,6 +185,8 @@ class Settings(QtGui.QWidget): self.inifile.set("General", "download sounds", self.allowdownload_sounds.isChecked()) self.inifile.set("General", "download music", self.allowdownload_music.isChecked()) self.inifile.set("General", "download evidence", self.allowdownload_evidence.isChecked()) + self.inifile.set("General", "theme", self.currtheme.currentText()) + self.inifile.set("Audio", "device", self.device_list.currentIndex()) self.inifile.write(open(AOpath+"AO2XP.ini", "w")) with open(AOpath+"callwords.ini", "w") as f: @@ -156,4 +195,4 @@ class Settings(QtGui.QWidget): self.hide() def onCancelClicked(self): - self.hide() \ No newline at end of file + self.hide() diff --git a/quicksetup.py b/quicksetup.py index 3e6c3ff..2bb1c70 100644 --- a/quicksetup.py +++ b/quicksetup.py @@ -7,8 +7,12 @@ import os def pip_install(package): subprocess.call([sys.executable, "-m", "pip", "install", package]) +print "installing requests" +pip_install('requests') +import requests + print "downloading pybass" -filedata = urllib2.urlopen('https://datapacket.dl.sourceforge.net/project/pybass/pybass_055.zip') +filedata = urllib2.urlopen('http://master.dl.sourceforge.net/project/pybass/pybass_055.zip') datatowrite = filedata.read() with open('pybass_055.zip', 'wb') as f: @@ -39,13 +43,14 @@ zip_ref.extract('bass.dll') zip_ref.close() print "downloading pyqt4" -filedata = urllib2.urlopen('https://download.lfd.uci.edu/pythonlibs/u2hcgva4/PyQt4-4.11.4-cp27-cp27m-win32.whl') -datatowrite = filedata.read() +filedata = requests.get('http://raw.githubusercontent.com/dhb52/python-lib/master/PyQt4-4.11.4-cp27-cp27m-win32.whl') +datatowrite = filedata.content with open('PyQt4-4.11.4-cp27-cp27m-win32.whl', 'wb') as f: f.write(datatowrite) f.close() + print "installing pyqt4" pip_install('PyQt4-4.11.4-cp27-cp27m-win32.whl')